diff --git a/Mage.Client/src/main/resources/image.url.properties b/Mage.Client/src/main/resources/image.url.properties index ef7b0ec9ff..031ea1e416 100644 --- a/Mage.Client/src/main/resources/image.url.properties +++ b/Mage.Client/src/main/resources/image.url.properties @@ -74,6 +74,6 @@ dd3evg=ddaevg dd3gvl=ddagvl dd3jvc=ddajvc # Remove setname as soon as the images can be downloaded -ignore.urls=TOK,PCA,ANB,HOU,C17 +ignore.urls=TOK,PCA,ANB,HOU,C17,IMA # sets ordered by release time (newest goes first) -token.lookup.order=C17,ANB,HOU,MM3,DDS,AKH,DD3DVD,DD3EVG,DD3GVL,DD3JVC,H09,AER,PCA,C16,V16,MPS,KLD,DDR,CN2,EMN,EMA,SOI,DDQ,CP,CMA,ARENA,SUS,APAC,EURO,UGIN,C15,OGW,EXP,DDP,BFZ,DRB,V09,V10,V11,V12,V13,V14,V15,TPR,MPRP,DD3,DDO,ORI,MM2,PTC,DTK,FRF,KTK,M15,VMA,CNS,JOU,BNG,THS,DDL,M14,MMA,DGM,GTC,RTR,M13,AVR,DDI,DKA,ISD,M12,NPH,MBS,SOM,M11,ROE,DDE,WWK,ZEN,M10,GVL,ARB,DVD,CFX,JVC,ALA,EVE,SHM,EVG,MOR,LRW,10E,CLS,CHK,GRC \ No newline at end of file +token.lookup.order=IMA,C17,ANB,HOU,MM3,DDS,AKH,DD3DVD,DD3EVG,DD3GVL,DD3JVC,H09,AER,PCA,C16,V16,MPS,KLD,DDR,CN2,EMN,EMA,SOI,DDQ,CP,CMA,ARENA,SUS,APAC,EURO,UGIN,C15,OGW,EXP,DDP,BFZ,DRB,V09,V10,V11,V12,V13,V14,V15,TPR,MPRP,DD3,DDO,ORI,MM2,PTC,DTK,FRF,KTK,M15,VMA,CNS,JOU,BNG,THS,DDL,M14,MMA,DGM,GTC,RTR,M13,AVR,DDI,DKA,ISD,M12,NPH,MBS,SOM,M11,ROE,DDE,WWK,ZEN,M10,GVL,ARB,DVD,CFX,JVC,ALA,EVE,SHM,EVG,MOR,LRW,10E,CLS,CHK,GRC \ No newline at end of file diff --git a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/SamBlacksCube.java b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/SamBlacksCube.java new file mode 100644 index 0000000000..6b5ddf0ae8 --- /dev/null +++ b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/SamBlacksCube.java @@ -0,0 +1,627 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.tournament.cubes; + +import mage.game.draft.DraftCube; + +/** + * + * @author fireshoes + */ +public class SamBlacksCube extends DraftCube { + +public SamBlacksCube() { + super("Sam Black's No Search Cube"); // http://www.cubetutor.com/viewcube/69564 + + cubeCards.add(new DraftCube.CardIdentity("Abbot of Keral Keep", "")); + cubeCards.add(new DraftCube.CardIdentity("Abrupt Decay", "")); + cubeCards.add(new DraftCube.CardIdentity("Acidic Slime", "")); + cubeCards.add(new DraftCube.CardIdentity("Aether Vial", "")); + cubeCards.add(new DraftCube.CardIdentity("Aetherling", "")); + cubeCards.add(new DraftCube.CardIdentity("Ajani Vengeant", "")); + cubeCards.add(new DraftCube.CardIdentity("Ajani, Caller of the Pride", "")); + cubeCards.add(new DraftCube.CardIdentity("Always Watching", "")); + cubeCards.add(new DraftCube.CardIdentity("Anafenza, Kin-Tree Spirit", "")); + cubeCards.add(new DraftCube.CardIdentity("Ancestral Recall", "")); + cubeCards.add(new DraftCube.CardIdentity("Ancestral Vision", "")); + cubeCards.add(new DraftCube.CardIdentity("Ancient Grudge", "")); + cubeCards.add(new DraftCube.CardIdentity("Ancient Tomb", "")); + cubeCards.add(new DraftCube.CardIdentity("Angel of Serenity", "")); + cubeCards.add(new DraftCube.CardIdentity("Anger of the Gods", "")); + cubeCards.add(new DraftCube.CardIdentity("Animate Dead", "")); + cubeCards.add(new DraftCube.CardIdentity("Arbor Elf", "")); + cubeCards.add(new DraftCube.CardIdentity("Arcane Sanctum", "")); + cubeCards.add(new DraftCube.CardIdentity("Archangel Avacyn", "")); + cubeCards.add(new DraftCube.CardIdentity("Armageddon", "")); + cubeCards.add(new DraftCube.CardIdentity("Artisan of Kozilek", "")); + cubeCards.add(new DraftCube.CardIdentity("Ashiok, Nightmare Weaver", "")); + cubeCards.add(new DraftCube.CardIdentity("Atarka's Command", "")); + cubeCards.add(new DraftCube.CardIdentity("Avenger of Zendikar", "")); + cubeCards.add(new DraftCube.CardIdentity("Ayli, Eternal Pilgrim", "")); + cubeCards.add(new DraftCube.CardIdentity("Azorius Chancery", "")); + cubeCards.add(new DraftCube.CardIdentity("Badlands", "")); + cubeCards.add(new DraftCube.CardIdentity("Balance", "")); + cubeCards.add(new DraftCube.CardIdentity("Baleful Strix", "")); + cubeCards.add(new DraftCube.CardIdentity("Baneslayer Angel", "")); + cubeCards.add(new DraftCube.CardIdentity("Banisher Priest", "")); + cubeCards.add(new DraftCube.CardIdentity("Banishing Light", "")); + cubeCards.add(new DraftCube.CardIdentity("Barbarian Ring", "")); + cubeCards.add(new DraftCube.CardIdentity("Basalt Monolith", "")); + cubeCards.add(new DraftCube.CardIdentity("Batterskull", "")); + cubeCards.add(new DraftCube.CardIdentity("Bayou", "")); + cubeCards.add(new DraftCube.CardIdentity("Bazaar of Baghdad", "")); + cubeCards.add(new DraftCube.CardIdentity("Beast Within", "")); + cubeCards.add(new DraftCube.CardIdentity("Become Immense", "")); + cubeCards.add(new DraftCube.CardIdentity("Bedlam Reveler", "")); + cubeCards.add(new DraftCube.CardIdentity("Benevolent Bodyguard", "")); + cubeCards.add(new DraftCube.CardIdentity("Birds of Paradise", "")); + cubeCards.add(new DraftCube.CardIdentity("Bitterblossom", "")); + cubeCards.add(new DraftCube.CardIdentity("Black Lotus", "")); + cubeCards.add(new DraftCube.CardIdentity("Black Sun's Zenith", "")); + cubeCards.add(new DraftCube.CardIdentity("Blackcleave Cliffs", "")); + cubeCards.add(new DraftCube.CardIdentity("Blade Splicer", "")); + cubeCards.add(new DraftCube.CardIdentity("Blood Artist", "")); + cubeCards.add(new DraftCube.CardIdentity("Bloodbraid Elf", "")); + cubeCards.add(new DraftCube.CardIdentity("Bloodghast", "")); + cubeCards.add(new DraftCube.CardIdentity("Bloodthrone Vampire", "")); + cubeCards.add(new DraftCube.CardIdentity("Blossoming Defense", "")); + cubeCards.add(new DraftCube.CardIdentity("Bomat Courier", "")); + cubeCards.add(new DraftCube.CardIdentity("Bone Shredder", "")); + cubeCards.add(new DraftCube.CardIdentity("Bonfire of the Damned", "")); + cubeCards.add(new DraftCube.CardIdentity("Boros Charm", "")); + cubeCards.add(new DraftCube.CardIdentity("Boros Garrison", "")); + cubeCards.add(new DraftCube.CardIdentity("Braids, Cabal Minion", "")); + cubeCards.add(new DraftCube.CardIdentity("Brimaz, King of Oreskos", "")); + cubeCards.add(new DraftCube.CardIdentity("Brimstone Volley", "")); + cubeCards.add(new DraftCube.CardIdentity("Broodmate Dragon", "")); + cubeCards.add(new DraftCube.CardIdentity("Burst Lightning", "")); + cubeCards.add(new DraftCube.CardIdentity("Capsize", "")); + cubeCards.add(new DraftCube.CardIdentity("Carrion Feeder", "")); + cubeCards.add(new DraftCube.CardIdentity("Cartel Aristocrat", "")); + cubeCards.add(new DraftCube.CardIdentity("Catastrophe", "")); + cubeCards.add(new DraftCube.CardIdentity("Celestial Colonnade", "")); + cubeCards.add(new DraftCube.CardIdentity("Chain Lightning", "")); + cubeCards.add(new DraftCube.CardIdentity("Champion of the Parish", "")); + cubeCards.add(new DraftCube.CardIdentity("Chandra's Phoenix", "")); + cubeCards.add(new DraftCube.CardIdentity("Chandra, Flamecaller", "")); + cubeCards.add(new DraftCube.CardIdentity("Chandra, Pyromaster", "")); + cubeCards.add(new DraftCube.CardIdentity("Chandra, Torch of Defiance", "")); + cubeCards.add(new DraftCube.CardIdentity("Channel", "")); + cubeCards.add(new DraftCube.CardIdentity("Chaos Orb", "")); + cubeCards.add(new DraftCube.CardIdentity("Chromatic Star", "")); + cubeCards.add(new DraftCube.CardIdentity("Chrome Mox", "")); + cubeCards.add(new DraftCube.CardIdentity("City of Traitors", "")); + cubeCards.add(new DraftCube.CardIdentity("Coalition Relic", "")); + cubeCards.add(new DraftCube.CardIdentity("Coercive Portal", "")); + cubeCards.add(new DraftCube.CardIdentity("Coldsteel Heart", "")); + cubeCards.add(new DraftCube.CardIdentity("Compulsive Research", "")); + cubeCards.add(new DraftCube.CardIdentity("Condemn", "")); + cubeCards.add(new DraftCube.CardIdentity("Condescend", "")); + cubeCards.add(new DraftCube.CardIdentity("Consecrated Sphinx", "")); + cubeCards.add(new DraftCube.CardIdentity("Contraband Kingpin", "")); + cubeCards.add(new DraftCube.CardIdentity("Control Magic", "")); + cubeCards.add(new DraftCube.CardIdentity("Corpse Dance", "")); + cubeCards.add(new DraftCube.CardIdentity("Council's Judgment", "")); + cubeCards.add(new DraftCube.CardIdentity("Counterspell", "")); + cubeCards.add(new DraftCube.CardIdentity("Courser of Kruphix", "")); + cubeCards.add(new DraftCube.CardIdentity("Crackling Doom", "")); + cubeCards.add(new DraftCube.CardIdentity("Craterhoof Behemoth", "")); + cubeCards.add(new DraftCube.CardIdentity("Creeping Tar Pit", "")); + cubeCards.add(new DraftCube.CardIdentity("Crumbling Necropolis", "")); + cubeCards.add(new DraftCube.CardIdentity("Cryptbreaker", "")); + cubeCards.add(new DraftCube.CardIdentity("Cryptic Command", "")); + cubeCards.add(new DraftCube.CardIdentity("Crystal Shard", "")); + cubeCards.add(new DraftCube.CardIdentity("Cultivator's Caravan", "")); + cubeCards.add(new DraftCube.CardIdentity("Dack Fayden", "")); + cubeCards.add(new DraftCube.CardIdentity("Dack's Duplicate", "")); + cubeCards.add(new DraftCube.CardIdentity("Damnation", "")); + cubeCards.add(new DraftCube.CardIdentity("Dark Confidant", "")); + cubeCards.add(new DraftCube.CardIdentity("Dark Ritual", "")); + cubeCards.add(new DraftCube.CardIdentity("Daze", "")); + cubeCards.add(new DraftCube.CardIdentity("Deceiver Exarch", "")); + cubeCards.add(new DraftCube.CardIdentity("Delver of Secrets", "")); + cubeCards.add(new DraftCube.CardIdentity("Den Protector", "")); + cubeCards.add(new DraftCube.CardIdentity("Desecration Demon", "")); + cubeCards.add(new DraftCube.CardIdentity("Desolate Lighthouse", "")); + cubeCards.add(new DraftCube.CardIdentity("Dig Through Time", "")); + cubeCards.add(new DraftCube.CardIdentity("Dimir Aqueduct", "")); + cubeCards.add(new DraftCube.CardIdentity("Disciple of Bolas", "")); + cubeCards.add(new DraftCube.CardIdentity("Disenchant", "")); + cubeCards.add(new DraftCube.CardIdentity("Dismember", "")); + cubeCards.add(new DraftCube.CardIdentity("Distended Mindbender", "")); + cubeCards.add(new DraftCube.CardIdentity("Domri Rade", "")); + cubeCards.add(new DraftCube.CardIdentity("Doom Blade", "")); + cubeCards.add(new DraftCube.CardIdentity("Dragonlord Atarka", "")); + cubeCards.add(new DraftCube.CardIdentity("Dragonlord Dromoka", "")); + cubeCards.add(new DraftCube.CardIdentity("Dragonlord Ojutai", "")); + cubeCards.add(new DraftCube.CardIdentity("Dragonlord Silumgar", "")); + cubeCards.add(new DraftCube.CardIdentity("Dread Return", "")); + cubeCards.add(new DraftCube.CardIdentity("Dromoka's Command", "")); + cubeCards.add(new DraftCube.CardIdentity("Druidic Satchel", "")); + cubeCards.add(new DraftCube.CardIdentity("Duplicant", "")); + cubeCards.add(new DraftCube.CardIdentity("Duskwatch Recruiter", "")); + cubeCards.add(new DraftCube.CardIdentity("Edric, Spymaster of Trest", "")); + cubeCards.add(new DraftCube.CardIdentity("Eidolon of the Great Revel", "")); + cubeCards.add(new DraftCube.CardIdentity("Elder Deep-Fiend", "")); + cubeCards.add(new DraftCube.CardIdentity("Eldrazi Displacer", "")); + cubeCards.add(new DraftCube.CardIdentity("Eldrazi Skyspawner", "")); + cubeCards.add(new DraftCube.CardIdentity("Eldrazi Temple", "")); + cubeCards.add(new DraftCube.CardIdentity("Electrolyze", "")); + cubeCards.add(new DraftCube.CardIdentity("Elesh Norn, Grand Cenobite", "")); + cubeCards.add(new DraftCube.CardIdentity("Elixir of Immortality", "")); + cubeCards.add(new DraftCube.CardIdentity("Elspeth, Sun's Champion", "")); + cubeCards.add(new DraftCube.CardIdentity("Elvish Visionary", "")); + cubeCards.add(new DraftCube.CardIdentity("Emrakul, the Aeons Torn", "")); + cubeCards.add(new DraftCube.CardIdentity("Emrakul, the Promised End", "")); + cubeCards.add(new DraftCube.CardIdentity("Enclave Cryptologist", "")); + cubeCards.add(new DraftCube.CardIdentity("Engineered Explosives", "")); + cubeCards.add(new DraftCube.CardIdentity("Ensnaring Bridge", "")); + cubeCards.add(new DraftCube.CardIdentity("Entomber Exarch", "")); + cubeCards.add(new DraftCube.CardIdentity("Eternal Witness", "")); + cubeCards.add(new DraftCube.CardIdentity("Everflowing Chalice", "")); + cubeCards.add(new DraftCube.CardIdentity("Evolutionary Leap", "")); + cubeCards.add(new DraftCube.CardIdentity("Exhume", "")); + cubeCards.add(new DraftCube.CardIdentity("Explore", "")); + cubeCards.add(new DraftCube.CardIdentity("Fact or Fiction", "")); + cubeCards.add(new DraftCube.CardIdentity("Faith's Fetters", "")); + cubeCards.add(new DraftCube.CardIdentity("Faithless Looting", "")); + cubeCards.add(new DraftCube.CardIdentity("Falkenrath Aristocrat", "")); + cubeCards.add(new DraftCube.CardIdentity("Fastbond", "")); + cubeCards.add(new DraftCube.CardIdentity("Feldon of the Third Path", "")); + cubeCards.add(new DraftCube.CardIdentity("Fellwar Stone", "")); + cubeCards.add(new DraftCube.CardIdentity("Fiend Hunter", "")); + cubeCards.add(new DraftCube.CardIdentity("Fiery Justice", "")); + cubeCards.add(new DraftCube.CardIdentity("Figure of Destiny", "")); + cubeCards.add(new DraftCube.CardIdentity("Fire // Ice", "")); + cubeCards.add(new DraftCube.CardIdentity("Fireblast", "")); + cubeCards.add(new DraftCube.CardIdentity("Firebolt", "")); + cubeCards.add(new DraftCube.CardIdentity("Firedrinker Satyr", "")); + cubeCards.add(new DraftCube.CardIdentity("Flame Slash", "")); + cubeCards.add(new DraftCube.CardIdentity("Flametongue Kavu", "")); + cubeCards.add(new DraftCube.CardIdentity("Fleecemane Lion", "")); + cubeCards.add(new DraftCube.CardIdentity("Fleetwheel Cruiser", "")); + cubeCards.add(new DraftCube.CardIdentity("Flickerwisp", "")); + cubeCards.add(new DraftCube.CardIdentity("Flooded Grove", "")); + cubeCards.add(new DraftCube.CardIdentity("Force of Will", "")); + cubeCards.add(new DraftCube.CardIdentity("Forked Bolt", "")); + cubeCards.add(new DraftCube.CardIdentity("Frantic Search", "")); + cubeCards.add(new DraftCube.CardIdentity("Frontier Bivouac", "")); + cubeCards.add(new DraftCube.CardIdentity("Frost Titan", "")); + cubeCards.add(new DraftCube.CardIdentity("Gaea's Cradle", "")); + cubeCards.add(new DraftCube.CardIdentity("Garruk Wildspeaker", "")); + cubeCards.add(new DraftCube.CardIdentity("Garza's Assassin", "")); + cubeCards.add(new DraftCube.CardIdentity("Gavony Township", "")); + cubeCards.add(new DraftCube.CardIdentity("Geist of Saint Traft", "")); + cubeCards.add(new DraftCube.CardIdentity("Genesis Hydra", "")); + cubeCards.add(new DraftCube.CardIdentity("Genesis Wave", "")); + cubeCards.add(new DraftCube.CardIdentity("Ghor-Clan Rampager", "")); + cubeCards.add(new DraftCube.CardIdentity("Gideon Jura", "")); + cubeCards.add(new DraftCube.CardIdentity("Gideon, Ally of Zendikar", "")); + cubeCards.add(new DraftCube.CardIdentity("Gilded Lotus", "")); + cubeCards.add(new DraftCube.CardIdentity("Gitaxian Probe", "")); + cubeCards.add(new DraftCube.CardIdentity("Glen Elendra Archmage", "")); + cubeCards.add(new DraftCube.CardIdentity("Glint-Nest Crane", "")); + cubeCards.add(new DraftCube.CardIdentity("Go for the Throat", "")); + cubeCards.add(new DraftCube.CardIdentity("Goblin Bombardment", "")); + cubeCards.add(new DraftCube.CardIdentity("Goblin Bushwhacker", "")); + cubeCards.add(new DraftCube.CardIdentity("Goblin Dark-Dwellers", "")); + cubeCards.add(new DraftCube.CardIdentity("Goblin Guide", "")); + cubeCards.add(new DraftCube.CardIdentity("Goblin Rabblemaster", "")); + cubeCards.add(new DraftCube.CardIdentity("Goblin Welder", "")); + cubeCards.add(new DraftCube.CardIdentity("Golgari Rot Farm", "")); + cubeCards.add(new DraftCube.CardIdentity("Gonti, Lord of Luxury", "")); + cubeCards.add(new DraftCube.CardIdentity("Grave Titan", "")); + cubeCards.add(new DraftCube.CardIdentity("Gray Merchant of Asphodel", "")); + cubeCards.add(new DraftCube.CardIdentity("Greater Gargadon", "")); + cubeCards.add(new DraftCube.CardIdentity("Grenzo, Dungeon Warden", "")); + cubeCards.add(new DraftCube.CardIdentity("Grim Lavamancer", "")); + cubeCards.add(new DraftCube.CardIdentity("Grim Monolith", "")); + cubeCards.add(new DraftCube.CardIdentity("Griselbrand", "")); + cubeCards.add(new DraftCube.CardIdentity("Gruul Turf", "")); + cubeCards.add(new DraftCube.CardIdentity("Hangarback Walker", "")); + cubeCards.add(new DraftCube.CardIdentity("Hanweir Militia Captain", "")); + cubeCards.add(new DraftCube.CardIdentity("Harbinger of the Tides", "")); + cubeCards.add(new DraftCube.CardIdentity("Harmonize", "")); + cubeCards.add(new DraftCube.CardIdentity("Hedron Archive", "")); + cubeCards.add(new DraftCube.CardIdentity("Hellrider", "")); + cubeCards.add(new DraftCube.CardIdentity("Hermit Druid", "")); + cubeCards.add(new DraftCube.CardIdentity("Hero of Bladehold", "")); + cubeCards.add(new DraftCube.CardIdentity("Hero's Downfall", "")); + cubeCards.add(new DraftCube.CardIdentity("Hissing Quagmire", "")); + cubeCards.add(new DraftCube.CardIdentity("Honor of the Pure", "")); + cubeCards.add(new DraftCube.CardIdentity("Hooting Mandrills", "")); + cubeCards.add(new DraftCube.CardIdentity("Hordeling Outburst", "")); + cubeCards.add(new DraftCube.CardIdentity("Hornet Queen", "")); + cubeCards.add(new DraftCube.CardIdentity("Huntmaster of the Fells", "")); + cubeCards.add(new DraftCube.CardIdentity("Hymn to Tourach", "")); + cubeCards.add(new DraftCube.CardIdentity("Incinerate", "")); + cubeCards.add(new DraftCube.CardIdentity("Inferno Titan", "")); + cubeCards.add(new DraftCube.CardIdentity("Inquisition of Kozilek", "")); + cubeCards.add(new DraftCube.CardIdentity("Insolent Neonate", "")); + cubeCards.add(new DraftCube.CardIdentity("Ishkanah, Grafwidow", "")); + cubeCards.add(new DraftCube.CardIdentity("Ivory Tower", "")); + cubeCards.add(new DraftCube.CardIdentity("Izzet Boilerworks", "")); + cubeCards.add(new DraftCube.CardIdentity("Izzet Signet", "")); + cubeCards.add(new DraftCube.CardIdentity("Jace Beleren", "")); + cubeCards.add(new DraftCube.CardIdentity("Jace, Vryn's Prodigy", "")); + cubeCards.add(new DraftCube.CardIdentity("Jace, the Mind Sculptor", "")); + cubeCards.add(new DraftCube.CardIdentity("Joraga Treespeaker", "")); + cubeCards.add(new DraftCube.CardIdentity("Journey to Nowhere", "")); + cubeCards.add(new DraftCube.CardIdentity("Jungle Shrine", "")); + cubeCards.add(new DraftCube.CardIdentity("Kalitas, Traitor of Ghet", "")); + cubeCards.add(new DraftCube.CardIdentity("Karakas", "")); + cubeCards.add(new DraftCube.CardIdentity("Kargan Dragonlord", "")); + cubeCards.add(new DraftCube.CardIdentity("Karn Liberated", "")); + cubeCards.add(new DraftCube.CardIdentity("Keranos, God of Storms", "")); + cubeCards.add(new DraftCube.CardIdentity("Kessig Wolf Run", "")); + cubeCards.add(new DraftCube.CardIdentity("Key to the City", "")); + cubeCards.add(new DraftCube.CardIdentity("Kher Keep", "")); + cubeCards.add(new DraftCube.CardIdentity("Kiki-Jiki, Mirror Breaker", "")); + cubeCards.add(new DraftCube.CardIdentity("Kiora's Follower", "")); + cubeCards.add(new DraftCube.CardIdentity("Kiora, the Crashing Wave", "")); + cubeCards.add(new DraftCube.CardIdentity("Kira, Great Glass-Spinner", "")); + cubeCards.add(new DraftCube.CardIdentity("Kitchen Finks", "")); + cubeCards.add(new DraftCube.CardIdentity("Knight of Glory", "")); + cubeCards.add(new DraftCube.CardIdentity("Kokusho, the Evening Star", "")); + cubeCards.add(new DraftCube.CardIdentity("Kolaghan's Command", "")); + cubeCards.add(new DraftCube.CardIdentity("Kozilek's Return", "")); + cubeCards.add(new DraftCube.CardIdentity("Kozilek, Butcher of Truth", "")); + cubeCards.add(new DraftCube.CardIdentity("Krosan Grip", "")); + cubeCards.add(new DraftCube.CardIdentity("Kytheon, Hero of Akros", "")); + cubeCards.add(new DraftCube.CardIdentity("Lavaclaw Reaches", "")); + cubeCards.add(new DraftCube.CardIdentity("Legacy's Allure", "")); + cubeCards.add(new DraftCube.CardIdentity("Legion Loyalist", "")); + cubeCards.add(new DraftCube.CardIdentity("Leovold, Emissary of Trest", "")); + cubeCards.add(new DraftCube.CardIdentity("Library of Alexandria", "")); + cubeCards.add(new DraftCube.CardIdentity("Lifebane Zombie", "")); + cubeCards.add(new DraftCube.CardIdentity("Lightning Berserker", "")); + cubeCards.add(new DraftCube.CardIdentity("Lightning Bolt", "")); + cubeCards.add(new DraftCube.CardIdentity("Lightning Helix", "")); + cubeCards.add(new DraftCube.CardIdentity("Lightning Mauler", "")); + cubeCards.add(new DraftCube.CardIdentity("Liliana of the Veil", "")); + cubeCards.add(new DraftCube.CardIdentity("Liliana, Heretical Healer", "")); + cubeCards.add(new DraftCube.CardIdentity("Liliana, the Last Hope", "")); + cubeCards.add(new DraftCube.CardIdentity("Lingering Souls", "")); + cubeCards.add(new DraftCube.CardIdentity("Linvala, the Preserver", "")); + cubeCards.add(new DraftCube.CardIdentity("Living Death", "")); + cubeCards.add(new DraftCube.CardIdentity("Llanowar Elves", "")); + cubeCards.add(new DraftCube.CardIdentity("Lodestone Golem", "")); + cubeCards.add(new DraftCube.CardIdentity("Looter il-Kor", "")); + cubeCards.add(new DraftCube.CardIdentity("Lotleth Troll", "")); + cubeCards.add(new DraftCube.CardIdentity("Lotus Bloom", "")); + cubeCards.add(new DraftCube.CardIdentity("Lumbering Falls", "")); + cubeCards.add(new DraftCube.CardIdentity("Maelstrom Pulse", "")); + cubeCards.add(new DraftCube.CardIdentity("Maelstrom Wanderer", "")); + cubeCards.add(new DraftCube.CardIdentity("Magma Jet", "")); + cubeCards.add(new DraftCube.CardIdentity("Malicious Affliction", "")); + cubeCards.add(new DraftCube.CardIdentity("Man-o'-War", "")); + cubeCards.add(new DraftCube.CardIdentity("Mana Crypt", "")); + cubeCards.add(new DraftCube.CardIdentity("Mana Drain", "")); + cubeCards.add(new DraftCube.CardIdentity("Mana Leak", "")); + cubeCards.add(new DraftCube.CardIdentity("Mana Tithe", "")); + cubeCards.add(new DraftCube.CardIdentity("Mana Vault", "")); + cubeCards.add(new DraftCube.CardIdentity("Managorger Hydra", "")); + cubeCards.add(new DraftCube.CardIdentity("Mantis Rider", "")); + cubeCards.add(new DraftCube.CardIdentity("Marsh Flitter", "")); + cubeCards.add(new DraftCube.CardIdentity("Martial Coup", "")); + cubeCards.add(new DraftCube.CardIdentity("Master of Waves", "")); + cubeCards.add(new DraftCube.CardIdentity("Master of the Wild Hunt", "")); + cubeCards.add(new DraftCube.CardIdentity("Mastery of the Unseen", "")); + cubeCards.add(new DraftCube.CardIdentity("Masticore", "")); + cubeCards.add(new DraftCube.CardIdentity("Maze of Ith", "")); + cubeCards.add(new DraftCube.CardIdentity("Memory Jar", "")); + cubeCards.add(new DraftCube.CardIdentity("Metalworker", "")); + cubeCards.add(new DraftCube.CardIdentity("Mind Stone", "")); + cubeCards.add(new DraftCube.CardIdentity("Mind Twist", "")); + cubeCards.add(new DraftCube.CardIdentity("Mindslaver", "")); + cubeCards.add(new DraftCube.CardIdentity("Mindwrack Demon", "")); + cubeCards.add(new DraftCube.CardIdentity("Mirari's Wake", "")); + cubeCards.add(new DraftCube.CardIdentity("Mirran Crusader", "")); + cubeCards.add(new DraftCube.CardIdentity("Mirror Entity", "")); + cubeCards.add(new DraftCube.CardIdentity("Mishra's Factory", "")); + cubeCards.add(new DraftCube.CardIdentity("Mishra's Workshop", "")); + cubeCards.add(new DraftCube.CardIdentity("Mogg War Marshal", "")); + cubeCards.add(new DraftCube.CardIdentity("Molten Rain", "")); + cubeCards.add(new DraftCube.CardIdentity("Monastery Mentor", "")); + cubeCards.add(new DraftCube.CardIdentity("Monastery Swiftspear", "")); + cubeCards.add(new DraftCube.CardIdentity("Moorland Haunt", "")); + cubeCards.add(new DraftCube.CardIdentity("Mother of Runes", "")); + cubeCards.add(new DraftCube.CardIdentity("Mox Diamond", "")); + cubeCards.add(new DraftCube.CardIdentity("Mox Emerald", "")); + cubeCards.add(new DraftCube.CardIdentity("Mox Jet", "")); + cubeCards.add(new DraftCube.CardIdentity("Mox Pearl", "")); + cubeCards.add(new DraftCube.CardIdentity("Mox Ruby", "")); + cubeCards.add(new DraftCube.CardIdentity("Mox Sapphire", "")); + cubeCards.add(new DraftCube.CardIdentity("Mulldrifter", "")); + cubeCards.add(new DraftCube.CardIdentity("Murderous Redcap", "")); + cubeCards.add(new DraftCube.CardIdentity("Mutavault", "")); + cubeCards.add(new DraftCube.CardIdentity("Myr Battlesphere", "")); + cubeCards.add(new DraftCube.CardIdentity("Mystic Monastery", "")); + cubeCards.add(new DraftCube.CardIdentity("Nahiri, the Harbinger", "")); + cubeCards.add(new DraftCube.CardIdentity("Nature's Claim", "")); + cubeCards.add(new DraftCube.CardIdentity("Necromancy", "")); + cubeCards.add(new DraftCube.CardIdentity("Necropotence", "")); + cubeCards.add(new DraftCube.CardIdentity("Needle Spires", "")); + cubeCards.add(new DraftCube.CardIdentity("Nephalia Drownyard", "")); + cubeCards.add(new DraftCube.CardIdentity("Nest Invader", "")); + cubeCards.add(new DraftCube.CardIdentity("Nicol Bolas, Planeswalker", "")); + cubeCards.add(new DraftCube.CardIdentity("Night's Whisper", "")); + cubeCards.add(new DraftCube.CardIdentity("Nightveil Specter", "")); + cubeCards.add(new DraftCube.CardIdentity("Nissa, Vital Force", "")); + cubeCards.add(new DraftCube.CardIdentity("Nissa, Voice of Zendikar", "")); + cubeCards.add(new DraftCube.CardIdentity("Noble Hierarch", "")); + cubeCards.add(new DraftCube.CardIdentity("Nomad Outpost", "")); + cubeCards.add(new DraftCube.CardIdentity("Noose Constrictor", "")); + cubeCards.add(new DraftCube.CardIdentity("Noxious Gearhulk", "")); + cubeCards.add(new DraftCube.CardIdentity("Nyx-Fleece Ram", "")); + cubeCards.add(new DraftCube.CardIdentity("Oath of Druids", "")); + cubeCards.add(new DraftCube.CardIdentity("Oath of Nissa", "")); + cubeCards.add(new DraftCube.CardIdentity("Oblivion Ring", "")); + cubeCards.add(new DraftCube.CardIdentity("Oblivion Sower", "")); + cubeCards.add(new DraftCube.CardIdentity("Oblivion Stone", "")); + cubeCards.add(new DraftCube.CardIdentity("Obstinate Baloth", "")); + cubeCards.add(new DraftCube.CardIdentity("Obzedat, Ghost Council", "")); + cubeCards.add(new DraftCube.CardIdentity("Ohran Viper", "")); + cubeCards.add(new DraftCube.CardIdentity("Ophiomancer", "")); + cubeCards.add(new DraftCube.CardIdentity("Opposition", "")); + cubeCards.add(new DraftCube.CardIdentity("Opulent Palace", "")); + cubeCards.add(new DraftCube.CardIdentity("Oracle of Mul Daya", "")); + cubeCards.add(new DraftCube.CardIdentity("Orzhov Basilica", "")); + cubeCards.add(new DraftCube.CardIdentity("Outpost Siege", "")); + cubeCards.add(new DraftCube.CardIdentity("Pack Rat", "")); + cubeCards.add(new DraftCube.CardIdentity("Pact of Negation", "")); + cubeCards.add(new DraftCube.CardIdentity("Painful Truths", "")); + cubeCards.add(new DraftCube.CardIdentity("Paliano, the High City", "")); + cubeCards.add(new DraftCube.CardIdentity("Palinchron", "")); + cubeCards.add(new DraftCube.CardIdentity("Palladium Myr", "")); + cubeCards.add(new DraftCube.CardIdentity("Pelakka Wurm", "")); + cubeCards.add(new DraftCube.CardIdentity("Pentavus", "")); + cubeCards.add(new DraftCube.CardIdentity("Pernicious Deed", "")); + cubeCards.add(new DraftCube.CardIdentity("Pestermite", "")); + cubeCards.add(new DraftCube.CardIdentity("Phantasmal Image", "")); + cubeCards.add(new DraftCube.CardIdentity("Phyrexian Metamorph", "")); + cubeCards.add(new DraftCube.CardIdentity("Phyrexian Revoker", "")); + cubeCards.add(new DraftCube.CardIdentity("Phyrexian Tower", "")); + cubeCards.add(new DraftCube.CardIdentity("Pia Nalaar", "")); + cubeCards.add(new DraftCube.CardIdentity("Pia and Kiran Nalaar", "")); + cubeCards.add(new DraftCube.CardIdentity("Plateau", "")); + cubeCards.add(new DraftCube.CardIdentity("Polukranos, World Eater", "")); + cubeCards.add(new DraftCube.CardIdentity("Ponder", "")); + cubeCards.add(new DraftCube.CardIdentity("Porcelain Legionnaire", "")); + cubeCards.add(new DraftCube.CardIdentity("Precinct Captain", "")); + cubeCards.add(new DraftCube.CardIdentity("Preordain", "")); + cubeCards.add(new DraftCube.CardIdentity("Price of Progress", "")); + cubeCards.add(new DraftCube.CardIdentity("Prime Speaker Zegana", "")); + cubeCards.add(new DraftCube.CardIdentity("Pristine Talisman", "")); + cubeCards.add(new DraftCube.CardIdentity("Prophet of Kruphix", "")); + cubeCards.add(new DraftCube.CardIdentity("Puppeteer Clique", "")); + cubeCards.add(new DraftCube.CardIdentity("Quarantine Field", "")); + cubeCards.add(new DraftCube.CardIdentity("Radiant Flames", "")); + cubeCards.add(new DraftCube.CardIdentity("Raging Ravine", "")); + cubeCards.add(new DraftCube.CardIdentity("Rakdos Carnarium", "")); + cubeCards.add(new DraftCube.CardIdentity("Rakdos's Return", "")); + cubeCards.add(new DraftCube.CardIdentity("Rancor", "")); + cubeCards.add(new DraftCube.CardIdentity("Ratchet Bomb", "")); + cubeCards.add(new DraftCube.CardIdentity("Reality Smasher", "")); + cubeCards.add(new DraftCube.CardIdentity("Reanimate", "")); + cubeCards.add(new DraftCube.CardIdentity("Reassembling Skeleton", "")); + cubeCards.add(new DraftCube.CardIdentity("Reclamation Sage", "")); + cubeCards.add(new DraftCube.CardIdentity("Recurring Nightmare", "")); + cubeCards.add(new DraftCube.CardIdentity("Reflector Mage", "")); + cubeCards.add(new DraftCube.CardIdentity("Regrowth", "")); + cubeCards.add(new DraftCube.CardIdentity("Relic of Progenitus", "")); + cubeCards.add(new DraftCube.CardIdentity("Remand", "")); + cubeCards.add(new DraftCube.CardIdentity("Restoration Angel", "")); + cubeCards.add(new DraftCube.CardIdentity("Reveillark", "")); + cubeCards.add(new DraftCube.CardIdentity("Ribbons of Night", "")); + cubeCards.add(new DraftCube.CardIdentity("Rift Bolt", "")); + cubeCards.add(new DraftCube.CardIdentity("Riftwing Cloudskate", "")); + cubeCards.add(new DraftCube.CardIdentity("Rishadan Port", "")); + cubeCards.add(new DraftCube.CardIdentity("Rofellos, Llanowar Emissary", "")); + cubeCards.add(new DraftCube.CardIdentity("Sandsteppe Citadel", "")); + cubeCards.add(new DraftCube.CardIdentity("Satyr Wayfinder", "")); + cubeCards.add(new DraftCube.CardIdentity("Savage Lands", "")); + cubeCards.add(new DraftCube.CardIdentity("Savannah", "")); + cubeCards.add(new DraftCube.CardIdentity("Scavenging Ooze", "")); + cubeCards.add(new DraftCube.CardIdentity("Scrapheap Scrounger", "")); + cubeCards.add(new DraftCube.CardIdentity("Scrubland", "")); + cubeCards.add(new DraftCube.CardIdentity("Sea Gate Oracle", "")); + cubeCards.add(new DraftCube.CardIdentity("Sea Gate Wreckage", "")); + cubeCards.add(new DraftCube.CardIdentity("Seal of Primordium", "")); + cubeCards.add(new DraftCube.CardIdentity("Searing Blaze", "")); + cubeCards.add(new DraftCube.CardIdentity("Searing Blood", "")); + cubeCards.add(new DraftCube.CardIdentity("Seaside Citadel", "")); + cubeCards.add(new DraftCube.CardIdentity("Seasons Past", "")); + cubeCards.add(new DraftCube.CardIdentity("Secure the Wastes", "")); + cubeCards.add(new DraftCube.CardIdentity("Seeker of the Way", "")); + cubeCards.add(new DraftCube.CardIdentity("Selesnya Sanctuary", "")); + cubeCards.add(new DraftCube.CardIdentity("Selfless Spirit", "")); + cubeCards.add(new DraftCube.CardIdentity("Setessan Tactics", "")); + cubeCards.add(new DraftCube.CardIdentity("Shambling Vent", "")); + cubeCards.add(new DraftCube.CardIdentity("Shardless Agent", "")); + cubeCards.add(new DraftCube.CardIdentity("Shelldock Isle", "")); + cubeCards.add(new DraftCube.CardIdentity("Show and Tell", "")); + cubeCards.add(new DraftCube.CardIdentity("Shriekmaw", "")); + cubeCards.add(new DraftCube.CardIdentity("Shrine of Burning Rage", "")); + cubeCards.add(new DraftCube.CardIdentity("Siege Rhino", "")); + cubeCards.add(new DraftCube.CardIdentity("Siege-Gang Commander", "")); + cubeCards.add(new DraftCube.CardIdentity("Simic Growth Chamber", "")); + cubeCards.add(new DraftCube.CardIdentity("Sinkhole", "")); + cubeCards.add(new DraftCube.CardIdentity("Skirsdag High Priest", "")); + cubeCards.add(new DraftCube.CardIdentity("Skullclamp", "")); + cubeCards.add(new DraftCube.CardIdentity("Skysovereign, Consul Flagship", "")); + cubeCards.add(new DraftCube.CardIdentity("Slaughter Pact", "")); + cubeCards.add(new DraftCube.CardIdentity("Slayers' Stronghold", "")); + cubeCards.add(new DraftCube.CardIdentity("Smash to Smithereens", "")); + cubeCards.add(new DraftCube.CardIdentity("Smokestack", "")); + cubeCards.add(new DraftCube.CardIdentity("Smuggler's Copter", "")); + cubeCards.add(new DraftCube.CardIdentity("Snapcaster Mage", "")); + cubeCards.add(new DraftCube.CardIdentity("Sneak Attack", "")); + cubeCards.add(new DraftCube.CardIdentity("Sol Ring", "")); + cubeCards.add(new DraftCube.CardIdentity("Soldier of the Pantheon", "")); + cubeCards.add(new DraftCube.CardIdentity("Sorin, Grim Nemesis", "")); + cubeCards.add(new DraftCube.CardIdentity("Sorin, Solemn Visitor", "")); + cubeCards.add(new DraftCube.CardIdentity("Soulfire Grand Master", "")); + cubeCards.add(new DraftCube.CardIdentity("Sower of Temptation", "")); + cubeCards.add(new DraftCube.CardIdentity("Spear of Heliod", "")); + cubeCards.add(new DraftCube.CardIdentity("Spectral Procession", "")); + cubeCards.add(new DraftCube.CardIdentity("Spell Pierce", "")); + cubeCards.add(new DraftCube.CardIdentity("Spell Queller", "")); + cubeCards.add(new DraftCube.CardIdentity("Spellskite", "")); + cubeCards.add(new DraftCube.CardIdentity("Sphere of the Suns", "")); + cubeCards.add(new DraftCube.CardIdentity("Sphinx of the Steel Wind", "")); + cubeCards.add(new DraftCube.CardIdentity("Sphinx's Revelation", "")); + cubeCards.add(new DraftCube.CardIdentity("Splinter Twin", "")); + cubeCards.add(new DraftCube.CardIdentity("Stirring Wildwood", "")); + cubeCards.add(new DraftCube.CardIdentity("Stoke the Flames", "")); + cubeCards.add(new DraftCube.CardIdentity("Stormbreath Dragon", "")); + cubeCards.add(new DraftCube.CardIdentity("Stratus Dancer", "")); + cubeCards.add(new DraftCube.CardIdentity("Strip Mine", "")); + cubeCards.add(new DraftCube.CardIdentity("Student of Warfare", "")); + cubeCards.add(new DraftCube.CardIdentity("Sublime Archangel", "")); + cubeCards.add(new DraftCube.CardIdentity("Sulfuric Vortex", "")); + cubeCards.add(new DraftCube.CardIdentity("Sun Titan", "")); + cubeCards.add(new DraftCube.CardIdentity("Sundering Titan", "")); + cubeCards.add(new DraftCube.CardIdentity("Supreme Verdict", "")); + cubeCards.add(new DraftCube.CardIdentity("Sword of Feast and Famine", "")); + cubeCards.add(new DraftCube.CardIdentity("Sword of Fire and Ice", "")); + cubeCards.add(new DraftCube.CardIdentity("Swords to Plowshares", "")); + cubeCards.add(new DraftCube.CardIdentity("Sylvan Advocate", "")); + cubeCards.add(new DraftCube.CardIdentity("Sylvan Caryatid", "")); + cubeCards.add(new DraftCube.CardIdentity("Taiga", "")); + cubeCards.add(new DraftCube.CardIdentity("Tamiyo, Field Researcher", "")); + cubeCards.add(new DraftCube.CardIdentity("Tamiyo, the Moon Sage", "")); + cubeCards.add(new DraftCube.CardIdentity("Tarmogoyf", "")); + cubeCards.add(new DraftCube.CardIdentity("Tasigur, the Golden Fang", "")); + cubeCards.add(new DraftCube.CardIdentity("Temple of Abandon", "")); + cubeCards.add(new DraftCube.CardIdentity("Temple of Deceit", "")); + cubeCards.add(new DraftCube.CardIdentity("Temple of Epiphany", "")); + cubeCards.add(new DraftCube.CardIdentity("Temple of Malady", "")); + cubeCards.add(new DraftCube.CardIdentity("Temple of Malice", "")); + cubeCards.add(new DraftCube.CardIdentity("Temple of Mystery", "")); + cubeCards.add(new DraftCube.CardIdentity("Temple of Mystery", "")); + cubeCards.add(new DraftCube.CardIdentity("Temple of Plenty", "")); + cubeCards.add(new DraftCube.CardIdentity("Temple of Silence", "")); + cubeCards.add(new DraftCube.CardIdentity("Temple of Triumph", "")); + cubeCards.add(new DraftCube.CardIdentity("Tendrils of Corruption", "")); + cubeCards.add(new DraftCube.CardIdentity("Terastodon", "")); + cubeCards.add(new DraftCube.CardIdentity("Terminus", "")); + cubeCards.add(new DraftCube.CardIdentity("Tezzeret, Agent of Bolas", "")); + cubeCards.add(new DraftCube.CardIdentity("Thalia's Lieutenant", "")); + cubeCards.add(new DraftCube.CardIdentity("Thalia, Guardian of Thraben", "")); + cubeCards.add(new DraftCube.CardIdentity("Thalia, Heretic Cathar", "")); + cubeCards.add(new DraftCube.CardIdentity("Thassa, God of the Sea", "")); + cubeCards.add(new DraftCube.CardIdentity("Thing in the Ice", "")); + cubeCards.add(new DraftCube.CardIdentity("Thirst for Knowledge", "")); + cubeCards.add(new DraftCube.CardIdentity("Thopter Engineer", "")); + cubeCards.add(new DraftCube.CardIdentity("Thought-Knot Seer", "")); + cubeCards.add(new DraftCube.CardIdentity("Thoughtseize", "")); + cubeCards.add(new DraftCube.CardIdentity("Thraben Inspector", "")); + cubeCards.add(new DraftCube.CardIdentity("Thragtusk", "")); + cubeCards.add(new DraftCube.CardIdentity("Thran Dynamo", "")); + cubeCards.add(new DraftCube.CardIdentity("Thrun, the Last Troll", "")); + cubeCards.add(new DraftCube.CardIdentity("Thunderbreak Regent", "")); + cubeCards.add(new DraftCube.CardIdentity("Thundermaw Hellkite", "")); + cubeCards.add(new DraftCube.CardIdentity("Tidebinder Mage", "")); + cubeCards.add(new DraftCube.CardIdentity("Time Spiral", "")); + cubeCards.add(new DraftCube.CardIdentity("Time Walk", "")); + cubeCards.add(new DraftCube.CardIdentity("Timely Reinforcements", "")); + cubeCards.add(new DraftCube.CardIdentity("Timetwister", "")); + cubeCards.add(new DraftCube.CardIdentity("Tin Street Hooligan", "")); + cubeCards.add(new DraftCube.CardIdentity("Tireless Tracker", "")); + cubeCards.add(new DraftCube.CardIdentity("Tolarian Academy", "")); + cubeCards.add(new DraftCube.CardIdentity("Tormenting Voice", "")); + cubeCards.add(new DraftCube.CardIdentity("Torrential Gearhulk", "")); + cubeCards.add(new DraftCube.CardIdentity("Toxic Deluge", "")); + cubeCards.add(new DraftCube.CardIdentity("Tradewind Rider", "")); + cubeCards.add(new DraftCube.CardIdentity("Trading Post", "")); + cubeCards.add(new DraftCube.CardIdentity("Treachery", "")); + cubeCards.add(new DraftCube.CardIdentity("Treasure Cruise", "")); + cubeCards.add(new DraftCube.CardIdentity("Treetop Village", "")); + cubeCards.add(new DraftCube.CardIdentity("Triskelion", "")); + cubeCards.add(new DraftCube.CardIdentity("Tropical Island", "")); + cubeCards.add(new DraftCube.CardIdentity("True-Name Nemesis", "")); + cubeCards.add(new DraftCube.CardIdentity("Tundra", "")); + cubeCards.add(new DraftCube.CardIdentity("Twilight Mire", "")); + cubeCards.add(new DraftCube.CardIdentity("Ugin, the Spirit Dragon", "")); + cubeCards.add(new DraftCube.CardIdentity("Ulamog, the Ceaseless Hunger", "")); + cubeCards.add(new DraftCube.CardIdentity("Umezawa's Jitte", "")); + cubeCards.add(new DraftCube.CardIdentity("Unburial Rites", "")); + cubeCards.add(new DraftCube.CardIdentity("Underground Sea", "")); + cubeCards.add(new DraftCube.CardIdentity("Unexpectedly Absent", "")); + cubeCards.add(new DraftCube.CardIdentity("Unlicensed Disintegration", "")); + cubeCards.add(new DraftCube.CardIdentity("Upheaval", "")); + cubeCards.add(new DraftCube.CardIdentity("Utopia Sprawl", "")); + cubeCards.add(new DraftCube.CardIdentity("Valorous Stance", "")); + cubeCards.add(new DraftCube.CardIdentity("Vampire Nighthawk", "")); + cubeCards.add(new DraftCube.CardIdentity("Varolz, the Scar-Striped", "")); + cubeCards.add(new DraftCube.CardIdentity("Vault of the Archangel", "")); + cubeCards.add(new DraftCube.CardIdentity("Vedalken Shackles", "")); + cubeCards.add(new DraftCube.CardIdentity("Vendilion Clique", "")); + cubeCards.add(new DraftCube.CardIdentity("Venser, Shaper Savant", "")); + cubeCards.add(new DraftCube.CardIdentity("Verdurous Gearhulk", "")); + cubeCards.add(new DraftCube.CardIdentity("Vesuvan Shapeshifter", "")); + cubeCards.add(new DraftCube.CardIdentity("Veteran Motorist", "")); + cubeCards.add(new DraftCube.CardIdentity("Vindicate", "")); + cubeCards.add(new DraftCube.CardIdentity("Viscera Seer", "")); + cubeCards.add(new DraftCube.CardIdentity("Voice of Resurgence", "")); + cubeCards.add(new DraftCube.CardIdentity("Volcanic Island", "")); + cubeCards.add(new DraftCube.CardIdentity("Volrath's Stronghold", "")); + cubeCards.add(new DraftCube.CardIdentity("Vraska the Unseen", "")); + cubeCards.add(new DraftCube.CardIdentity("Wall of Blossoms", "")); + cubeCards.add(new DraftCube.CardIdentity("Wall of Omens", "")); + cubeCards.add(new DraftCube.CardIdentity("Wall of Roots", "")); + cubeCards.add(new DraftCube.CardIdentity("Wandering Fumarole", "")); + cubeCards.add(new DraftCube.CardIdentity("Warden of the First Tree", "")); + cubeCards.add(new DraftCube.CardIdentity("Wasteland", "")); + cubeCards.add(new DraftCube.CardIdentity("Westvale Abbey", "")); + cubeCards.add(new DraftCube.CardIdentity("Wheel of Fortune", "")); + cubeCards.add(new DraftCube.CardIdentity("Whip of Erebos", "")); + cubeCards.add(new DraftCube.CardIdentity("Whirler Rogue", "")); + cubeCards.add(new DraftCube.CardIdentity("Whisperwood Elemental", "")); + cubeCards.add(new DraftCube.CardIdentity("Wickerbough Elder", "")); + cubeCards.add(new DraftCube.CardIdentity("Wild Growth", "")); + cubeCards.add(new DraftCube.CardIdentity("Wildest Dreams", "")); + cubeCards.add(new DraftCube.CardIdentity("Wildfire", "")); + cubeCards.add(new DraftCube.CardIdentity("Windbrisk Heights", "")); + cubeCards.add(new DraftCube.CardIdentity("Wingmate Roc", "")); + cubeCards.add(new DraftCube.CardIdentity("Winter Orb", "")); + cubeCards.add(new DraftCube.CardIdentity("Wolfir Silverheart", "")); + cubeCards.add(new DraftCube.CardIdentity("Woodland Wanderer", "")); + cubeCards.add(new DraftCube.CardIdentity("Worn Powerstone", "")); + cubeCards.add(new DraftCube.CardIdentity("Wrath of God", "")); + cubeCards.add(new DraftCube.CardIdentity("Wurmcoil Engine", "")); + cubeCards.add(new DraftCube.CardIdentity("Xathrid Necromancer", "")); + cubeCards.add(new DraftCube.CardIdentity("Yawgmoth's Bargain", "")); + cubeCards.add(new DraftCube.CardIdentity("Yawgmoth's Will", "")); + cubeCards.add(new DraftCube.CardIdentity("Young Pyromancer", "")); + cubeCards.add(new DraftCube.CardIdentity("Zealous Conscripts", "")); + cubeCards.add(new DraftCube.CardIdentity("Zulaport Cutthroat", "")); + cubeCards.add(new DraftCube.CardIdentity("Zurgo Bellstriker", "")); + } +} \ No newline at end of file diff --git a/Mage.Server/config/config.xml b/Mage.Server/config/config.xml index 88b18aa216..0584d76866 100644 --- a/Mage.Server/config/config.xml +++ b/Mage.Server/config/config.xml @@ -103,6 +103,7 @@ + diff --git a/Mage.Server/release/config/config.xml b/Mage.Server/release/config/config.xml index 03b66244b0..90442aa45f 100644 --- a/Mage.Server/release/config/config.xml +++ b/Mage.Server/release/config/config.xml @@ -100,6 +100,7 @@ + diff --git a/Mage.Sets/src/mage/cards/c/CruelReality.java b/Mage.Sets/src/mage/cards/c/CruelReality.java index 66be70bbb4..1a323fc699 100644 --- a/Mage.Sets/src/mage/cards/c/CruelReality.java +++ b/Mage.Sets/src/mage/cards/c/CruelReality.java @@ -161,6 +161,7 @@ class CruelRealityEffect extends OneShotEffect { } } cursedPlayer.loseLife(5, game, false); + return true; } return false; } diff --git a/Mage.Sets/src/mage/cards/g/GlyphKeeper.java b/Mage.Sets/src/mage/cards/g/GlyphKeeper.java index 2d5d1a3bf7..fff800de40 100644 --- a/Mage.Sets/src/mage/cards/g/GlyphKeeper.java +++ b/Mage.Sets/src/mage/cards/g/GlyphKeeper.java @@ -32,6 +32,7 @@ import mage.MageInt; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.keyword.FlyingAbility; import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; import mage.abilities.effects.common.CounterTargetEffect; import mage.abilities.keyword.EmbalmAbility; import mage.cards.CardImpl; @@ -40,7 +41,9 @@ import mage.constants.CardType; import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; -import mage.target.TargetStackObject; +import mage.game.permanent.Permanent; +import mage.target.targetpointer.FixedTarget; +import mage.watchers.common.NumberOfTimesPermanentTargetedATurnWatcher; /** * @@ -59,7 +62,7 @@ public class GlyphKeeper extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Whenever Glyph Keeper becomes the target of a spell or ability for the first time in a turn, counter that spell or ability. - this.addAbility(new GlyphKeeperAbility()); + this.addAbility(new GlyphKeeperAbility(), new NumberOfTimesPermanentTargetedATurnWatcher()); // Embalm {5}{U}{U} this.addAbility(new EmbalmAbility(new ManaCostsImpl("{5}{U}{U}"), this)); @@ -78,15 +81,12 @@ public class GlyphKeeper extends CardImpl { class GlyphKeeperAbility extends TriggeredAbilityImpl { - protected int turnUsed; - public GlyphKeeperAbility() { super(Zone.BATTLEFIELD, new CounterTargetEffect(), false); } public GlyphKeeperAbility(final GlyphKeeperAbility ability) { super(ability); - turnUsed = ability.turnUsed; } @Override @@ -101,13 +101,18 @@ class GlyphKeeperAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { - if (event.getTargetId().equals(this.getSourceId()) && game.getTurnNum() > turnUsed) { - this.getTargets().clear(); - TargetStackObject target = new TargetStackObject(); - target.add(event.getSourceId(), game); - this.addTarget(target); - turnUsed = game.getTurnNum(); - return true; + if (event.getTargetId().equals(this.getSourceId())) { + Permanent permanent = game.getPermanent(event.getTargetId()); + if (permanent != null && permanent.isCreature()) { + NumberOfTimesPermanentTargetedATurnWatcher watcher = (NumberOfTimesPermanentTargetedATurnWatcher) game.getState().getWatchers().get(NumberOfTimesPermanentTargetedATurnWatcher.class.getName()); + if (watcher != null + && watcher.notMoreThanOnceTargetedThisTurn(permanent, game)) { + for (Effect effect : getEffects()) { + effect.setTargetPointer(new FixedTarget(event.getSourceId())); + } + return true; + } + } } return false; } @@ -117,4 +122,4 @@ class GlyphKeeperAbility extends TriggeredAbilityImpl { return "Whenever {this} becomes the target of a spell or ability for the first time in a turn, counter that spell or ability."; } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/k/KiraGreatGlassSpinner.java b/Mage.Sets/src/mage/cards/k/KiraGreatGlassSpinner.java index 1ac7af667b..0c1bf2bdb8 100644 --- a/Mage.Sets/src/mage/cards/k/KiraGreatGlassSpinner.java +++ b/Mage.Sets/src/mage/cards/k/KiraGreatGlassSpinner.java @@ -27,11 +27,8 @@ */ package mage.cards.k; -import java.util.HashMap; -import java.util.Map; import java.util.UUID; import mage.MageInt; -import mage.MageObjectReference; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.Effect; @@ -47,7 +44,7 @@ import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; import mage.game.permanent.Permanent; import mage.target.targetpointer.FixedTarget; -import mage.watchers.Watcher; +import mage.watchers.common.NumberOfTimesPermanentTargetedATurnWatcher; /** * @@ -72,7 +69,7 @@ public class KiraGreatGlassSpinner extends CardImpl { this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(new KiraGreatGlassSpinnerAbility(effect), Duration.WhileOnBattlefield, new FilterCreaturePermanent("creatures"))), - new KiraGreatGlassSpinnerWatcher()); + new NumberOfTimesPermanentTargetedATurnWatcher()); } @@ -111,7 +108,7 @@ class KiraGreatGlassSpinnerAbility extends TriggeredAbilityImpl { if (event.getTargetId().equals(this.getSourceId())) { Permanent permanent = game.getPermanent(event.getTargetId()); if (permanent != null && permanent.isCreature()) { - KiraGreatGlassSpinnerWatcher watcher = (KiraGreatGlassSpinnerWatcher) game.getState().getWatchers().get(KiraGreatGlassSpinnerWatcher.class.getName()); + NumberOfTimesPermanentTargetedATurnWatcher watcher = (NumberOfTimesPermanentTargetedATurnWatcher) game.getState().getWatchers().get(NumberOfTimesPermanentTargetedATurnWatcher.class.getName()); if (watcher != null && watcher.notMoreThanOnceTargetedThisTurn(permanent, game)) { for (Effect effect : getEffects()) { effect.setTargetPointer(new FixedTarget(event.getSourceId())); @@ -128,51 +125,4 @@ class KiraGreatGlassSpinnerAbility extends TriggeredAbilityImpl { return "Whenever this creature becomes the target of a spell or ability for the first time in a turn, counter that spell or ability."; } -} - -class KiraGreatGlassSpinnerWatcher extends Watcher { - - private final Map creaturesTargeted = new HashMap<>(); - - public KiraGreatGlassSpinnerWatcher() { - super(KiraGreatGlassSpinnerWatcher.class.getName(), WatcherScope.GAME); - } - - public KiraGreatGlassSpinnerWatcher(final KiraGreatGlassSpinnerWatcher watcher) { - super(watcher); - this.creaturesTargeted.putAll(creaturesTargeted); - } - - @Override - public void watch(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.TARGETED) { - Permanent permanent = game.getPermanent(event.getTargetId()); - if (permanent != null) { - MageObjectReference mor = new MageObjectReference(permanent, game); - int amount = 0; - if (creaturesTargeted.containsKey(mor)) { - amount = creaturesTargeted.get(mor); - } - creaturesTargeted.put(mor, ++amount); - } - } - } - - public boolean notMoreThanOnceTargetedThisTurn(Permanent creature, Game game) { - if (creaturesTargeted.containsKey(new MageObjectReference(creature, game))) { - return creaturesTargeted.get(new MageObjectReference(creature, game)) < 2; - } - return true; - } - - @Override - public void reset() { - super.reset(); - creaturesTargeted.clear(); - } - - @Override - public KiraGreatGlassSpinnerWatcher copy() { - return new KiraGreatGlassSpinnerWatcher(this); - } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/s/SigardaHostOfHerons.java b/Mage.Sets/src/mage/cards/s/SigardaHostOfHerons.java index 441e6cec3e..0acbbc4a77 100644 --- a/Mage.Sets/src/mage/cards/s/SigardaHostOfHerons.java +++ b/Mage.Sets/src/mage/cards/s/SigardaHostOfHerons.java @@ -44,6 +44,7 @@ import mage.game.permanent.PermanentCard; import mage.game.stack.Spell; import java.util.UUID; +import mage.game.stack.StackAbility; /** * @author noxx @@ -51,7 +52,7 @@ import java.util.UUID; public class SigardaHostOfHerons extends CardImpl { public SigardaHostOfHerons(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}{W}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{W}{W}"); addSuperType(SuperType.LEGENDARY); this.subtype.add("Angel"); @@ -115,6 +116,11 @@ class SigardaHostOfHeronsEffect extends ContinuousRuleModifyingEffectImpl { return true; } } + if (object instanceof StackAbility) { + if (game.getOpponents(source.getControllerId()).contains(((StackAbility) object).getControllerId())) { + return true; + } + } } return false; } diff --git a/Mage.Sets/src/mage/sets/IconicMasters.java b/Mage.Sets/src/mage/sets/IconicMasters.java new file mode 100644 index 0000000000..ec12aaa6fe --- /dev/null +++ b/Mage.Sets/src/mage/sets/IconicMasters.java @@ -0,0 +1,58 @@ +/* +* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. +* +* Redistribution and use in source and binary forms, with or without modification, are +* permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, this list of +* conditions and the following disclaimer. +* +* 2. Redistributions in binary form must reproduce the above copyright notice, this list +* of conditions and the following disclaimer in the documentation and/or other materials +* provided with the distribution. +* +* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED +* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR +* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* The views and conclusions contained in the software and documentation are those of the +* authors and should not be interpreted as representing official policies, either expressed +* or implied, of BetaSteward_at_googlemail.com. +*/ + +package mage.sets; + +import mage.cards.ExpansionSet; +import mage.constants.SetType; + +/** + * + * @author fireshoes + */ +public class IconicMasters extends ExpansionSet { + + private static final IconicMasters instance = new IconicMasters(); + + public static IconicMasters getInstance() { + return instance; + } + + private IconicMasters() { + super("Iconic Masters", "IMA", ExpansionSet.buildDate(2017, 11, 17), SetType.SUPPLEMENTAL); + this.blockName = "Reprint"; + this.hasBasicLands = false; + this.hasBoosters = true; + this.numBoosterLands = 0; + this.numBoosterCommon = 11; + this.numBoosterUncommon = 3; + this.numBoosterRare = 1; + this.ratioBoosterMythic = 8; + + } +} \ No newline at end of file diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/curses/CursesTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/curses/CursesTest.java index 48e4bbd1d9..99407f099b 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/curses/CursesTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/curses/CursesTest.java @@ -289,6 +289,197 @@ public class CursesTest extends CardTestPlayerBase { assertGraveyardCount(playerA, 2); assertPowerToughness(playerB, "Silvercoat Lion", 1, 1); - } - + } + + + + @Test + public void cruelRealityHasBothCreatureAndPwChoosePw() { + + /* + Cruel Reality {5}{B}{B} + Enchantment - Aura Curse + Enchant player + At the beginning of enchanted player's upkeep, that player sacrifices a creature or planeswalker. If the player can't, he or she loses 5 life. + */ + String cReality = "Cruel Reality"; + + /* + Ugin, the Spirit Dragon {8} + Planeswalker — Ugin + +2: Ugin, the Spirit Dragon deals 3 damage to target creature or player. + −X: Exile each permanent with converted mana cost X or less that's one or more colors. + −10: You gain 7 life, draw seven cards, then put up to seven permanent cards from your hand onto the battlefield. + */ + String ugin = "Ugin, the Spirit Dragon"; + String memnite = "Memnite"; // {0} 1/1 + + addCard(Zone.HAND, playerA, cReality); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 7); + addCard(Zone.BATTLEFIELD, playerB, ugin); + addCard(Zone.BATTLEFIELD, playerB, memnite); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, cReality, playerB); + setChoice(playerB, ugin); + + setStopAt(2, PhaseStep.PRECOMBAT_MAIN); + execute(); + + assertGraveyardCount(playerB, ugin, 1); + assertPermanentCount(playerB, memnite, 1); + assertPermanentCount(playerA, cReality, 1); + assertLife(playerB, 20); + } + + @Test + public void cruelRealityHasBothCreatureAndPwChooseCreature() { + + /* + Cruel Reality {5}{B}{B} + Enchantment - Aura Curse + Enchant player + At the beginning of enchanted player's upkeep, that player sacrifices a creature or planeswalker. If the player can't, he or she loses 5 life. + */ + String cReality = "Cruel Reality"; + + /* + Ugin, the Spirit Dragon {8} + Planeswalker — Ugin + +2: Ugin, the Spirit Dragon deals 3 damage to target creature or player. + −X: Exile each permanent with converted mana cost X or less that's one or more colors. + −10: You gain 7 life, draw seven cards, then put up to seven permanent cards from your hand onto the battlefield. + */ + String ugin = "Ugin, the Spirit Dragon"; + String memnite = "Memnite"; // {0} 1/1 + + addCard(Zone.HAND, playerA, cReality); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 7); + addCard(Zone.BATTLEFIELD, playerB, ugin); + addCard(Zone.BATTLEFIELD, playerB, memnite); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, cReality, playerB); + setChoice(playerB, memnite); + + setStopAt(2, PhaseStep.PRECOMBAT_MAIN); + execute(); + + assertGraveyardCount(playerB, memnite, 1); + assertPermanentCount(playerB, ugin, 1); + assertPermanentCount(playerA, cReality, 1); + assertLife(playerB, 20); + } + + @Test + public void cruelRealityOnlyHasCreatureNoChoiceMade() { + + /* + Cruel Reality {5}{B}{B} + Enchantment - Aura Curse + Enchant player + At the beginning of enchanted player's upkeep, that player sacrifices a creature or planeswalker. If the player can't, he or she loses 5 life. + */ + String cReality = "Cruel Reality"; + String memnite = "Memnite"; // {0} 1/1 + + addCard(Zone.HAND, playerA, cReality); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 7); + addCard(Zone.BATTLEFIELD, playerB, memnite); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, cReality, playerB); + + setStopAt(2, PhaseStep.PRECOMBAT_MAIN); + execute(); + + assertGraveyardCount(playerB, memnite, 1); + assertPermanentCount(playerA, cReality, 1); + assertLife(playerB, 20); + } + + @Test + public void cruelRealityOnlyHasPwNoChoiceMade() { + + /* + Cruel Reality {5}{B}{B} + Enchantment - Aura Curse + Enchant player + At the beginning of enchanted player's upkeep, that player sacrifices a creature or planeswalker. If the player can't, he or she loses 5 life. + */ + String cReality = "Cruel Reality"; + + /* + Ugin, the Spirit Dragon {8} + Planeswalker — Ugin + +2: Ugin, the Spirit Dragon deals 3 damage to target creature or player. + −X: Exile each permanent with converted mana cost X or less that's one or more colors. + −10: You gain 7 life, draw seven cards, then put up to seven permanent cards from your hand onto the battlefield. + */ + String ugin = "Ugin, the Spirit Dragon"; + + addCard(Zone.HAND, playerA, cReality); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 7); + addCard(Zone.BATTLEFIELD, playerB, ugin); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, cReality, playerB); + + setStopAt(2, PhaseStep.PRECOMBAT_MAIN); + execute(); + + assertGraveyardCount(playerB, ugin, 1); + assertPermanentCount(playerA, cReality, 1); + assertLife(playerB, 20); + } + + @Test + public void cruelRealityOnlyHasCreatureTryToChooseNotToSac() { + + /* + Cruel Reality {5}{B}{B} + Enchantment - Aura Curse + Enchant player + At the beginning of enchanted player's upkeep, that player sacrifices a creature or planeswalker. If the player can't, he or she loses 5 life. + */ + String cReality = "Cruel Reality"; + String memnite = "Memnite"; // {0} 1/1 + + addCard(Zone.HAND, playerA, cReality); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 7); + addCard(Zone.BATTLEFIELD, playerB, memnite); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, cReality, playerB); + setChoice(playerB, "No"); + + setStopAt(2, PhaseStep.PRECOMBAT_MAIN); + execute(); + + assertGraveyardCount(playerB, memnite, 1); + assertPermanentCount(playerA, cReality, 1); + assertLife(playerB, 20); + } + + @Test + public void cruelRealityNoCreatureOrPwForcesLifeLoss() { + + /* + Cruel Reality {5}{B}{B} + Enchantment - Aura Curse + Enchant player + At the beginning of enchanted player's upkeep, that player sacrifices a creature or planeswalker. If the player can't, he or she loses 5 life. + */ + String cReality = "Cruel Reality"; + String gPrison = "Ghostly Prison"; // {2}{W} enchantment - doesnt matter text for this + + addCard(Zone.HAND, playerA, cReality); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 7); + addCard(Zone.BATTLEFIELD, playerB, gPrison); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, cReality, playerB); + setChoice(playerB, gPrison); // try to set choice to enchantment + + setStopAt(2, PhaseStep.PRECOMBAT_MAIN); + execute(); + + assertPermanentCount(playerB, gPrison, 1); + assertPermanentCount(playerA, cReality, 1); + assertLife(playerB, 15); + } } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/continuous/TwoHeadedSliverTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/continuous/TwoHeadedSliverTest.java index ba4a71c7e5..0d56a0d4b4 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/continuous/TwoHeadedSliverTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/continuous/TwoHeadedSliverTest.java @@ -6,6 +6,7 @@ import org.junit.Test; import org.mage.test.serverside.base.CardTestPlayerBase; import static junit.framework.TestCase.assertEquals; +import static org.junit.Assert.fail; /** * @author LevelX2 @@ -31,9 +32,44 @@ public class TwoHeadedSliverTest extends CardTestPlayerBase { try { execute(); + fail("Expected exception not thrown"); } catch (UnsupportedOperationException e) { assertEquals("Two-Headed Sliver is blocked by 1 creature(s). It has to be blocked by 2 or more.", e.getMessage()); } } -} + + @Test + public void testCanBeBlockedByTwoEffectAbility() { + + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 2); + // Two-Headed Sliver {1}{R} 1/1 + // All Sliver creatures have "This creature can't be blocked except by two or more creatures." + addCard(Zone.HAND, playerA, "Two-Headed Sliver"); + + // Silvercoat Lion {1}{W} 2/2 + addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion"); + // Coral Barrier {2}{U} 1/3 + addCard(Zone.BATTLEFIELD, playerB, "Coral Barrier"); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Two-Headed Sliver"); + + attack(3, playerA, "Two-Headed Sliver"); + // Two blocks will succeed + block(3, playerB, "Silvercoat Lion", "Two-Headed Sliver"); + block(3, playerB, "Coral Barrier", "Two-Headed Sliver"); + + setStopAt(3, PhaseStep.END_TURN); + + execute(); + + assertLife(playerA, 20); + assertLife(playerB, 20); + + // Two-Headed Sliver died from the block + assertPermanentCount(playerA, "Two-Headed Sliver", 0); + assertPermanentCount(playerB, "Silvercoat Lion", 1); + assertPermanentCount(playerB, "Coral Barrier", 1); + assertGraveyardCount(playerA, "Two-Headed Sliver", 1); + } +} \ No newline at end of file diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/requirement/BlockRequirementTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/requirement/BlockRequirementTest.java index 27f1108e07..e15a8bc72e 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/requirement/BlockRequirementTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/requirement/BlockRequirementTest.java @@ -33,6 +33,7 @@ import org.junit.Test; import org.mage.test.serverside.base.CardTestPlayerBase; import static junit.framework.TestCase.assertEquals; +import static org.junit.Assert.fail; /** * @@ -217,6 +218,7 @@ public class BlockRequirementTest extends CardTestPlayerBase { try { execute(); + fail("Expected exception not thrown"); } catch (UnsupportedOperationException e) { assertEquals("Breaker of Armies is blocked by 1 creature(s). It has to be blocked by 2 or more.", e.getMessage()); } @@ -232,17 +234,17 @@ public class BlockRequirementTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerA, "Slayer's Cleaver"); addCard(Zone.BATTLEFIELD, playerA, "Mountain", 4); addCard(Zone.BATTLEFIELD, playerA, "Memnite"); // {1} 1/1 - + addCard(Zone.BATTLEFIELD, playerB, "Dimensional Infiltrator"); // 2/1 - Eldrazi addCard(Zone.BATTLEFIELD, playerB, "Llanowar Elves"); // 1/1 - + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Equip", "Memnite"); // pumps to 4/2 attack(1, playerA, "Memnite"); // must be blocked by Dimensional Infiltrator block(1, playerB, "Llanowar Elves", "Memnite"); // should not be allowed as only blocker - + setStopAt(1, PhaseStep.END_COMBAT); execute(); - + assertPermanentCount(playerA, "Slayer's Cleaver", 1); assertLife(playerB, 20); assertGraveyardCount(playerA, "Memnite", 1); diff --git a/Mage.Tests/src/test/java/org/mage/test/combat/AttackBlockRestrictionsTest.java b/Mage.Tests/src/test/java/org/mage/test/combat/AttackBlockRestrictionsTest.java index 530a9cbb14..363c68c6a2 100644 --- a/Mage.Tests/src/test/java/org/mage/test/combat/AttackBlockRestrictionsTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/combat/AttackBlockRestrictionsTest.java @@ -8,6 +8,9 @@ import org.junit.Assert; import org.junit.Test; import org.mage.test.serverside.base.CardTestPlayerBase; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + /** * Test restrictions for choosing attackers and blockers. * @@ -38,7 +41,7 @@ public class AttackBlockRestrictionsTest extends CardTestPlayerBase { * Frost */ @Test - public void testWallofWrost() { + public void testWallofFrost() { // Whenever Wall of Frost blocks a creature, that creature doesn't untap during its controller's next untap step. addCard(Zone.BATTLEFIELD, playerA, "Wall of Frost"); // 0/7 addCard(Zone.BATTLEFIELD, playerB, "Craw Wurm"); @@ -338,36 +341,36 @@ public class AttackBlockRestrictionsTest extends CardTestPlayerBase { */ @Test public void testMustAttackButCannotAttackAlone() - { + { /* Mogg Flunkies {1}{R} 3/3 Creature — Goblin Mogg Flunkies can't attack or block alone. */ String flunkies = "Mogg Flunkies"; - + /* Goblin Assault {2}{R} - * Enchantment + * Enchantment At the beginning of your upkeep, create a 1/1 red Goblin creature token with haste. Goblin creatures attack each turn if able. */ String gAssault = "Goblin Assault"; - + addCard(Zone.BATTLEFIELD, playerA, flunkies); addCard(Zone.BATTLEFIELD, playerB, gAssault); - + setStopAt(3, PhaseStep.POSTCOMBAT_MAIN); execute(); - + assertTapped(flunkies, false); assertLife(playerB, 20); } - + /* Reported bug: Tromokratis is unable to be blocked. */ @Test public void tromokratisBlockedByAll() { - /* + /* Tromokratis {5}{U}{U} Legendary Creature — Kraken 8/8 Tromokratis has hexproof unless it's attacking or blocking. @@ -376,30 +379,30 @@ public class AttackBlockRestrictionsTest extends CardTestPlayerBase { String tromokratis = "Tromokratis"; String gBears = "Grizzly Bears"; // {1}{G} 2/2 String memnite = "Memnite"; // {0} 1/1 - + addCard(Zone.BATTLEFIELD, playerA, tromokratis); addCard(Zone.BATTLEFIELD, playerB, gBears); addCard(Zone.BATTLEFIELD, playerB, memnite); - + attack(1, playerA, tromokratis); block(1, playerB, gBears, tromokratis); block(1, playerB, memnite, tromokratis); - + setStopAt(1, PhaseStep.POSTCOMBAT_MAIN); execute(); - + assertLife(playerB, 20); assertGraveyardCount(playerB, gBears, 1); assertGraveyardCount(playerB, memnite, 1); assertTapped(tromokratis, true); } - + /* Reported bug: Tromokratis is unable to be blocked. */ @Test public void tromokratisNotBlockedByAll() { - /* + /* Tromokratis {5}{U}{U} Legendary Creature — Kraken 8/8 Tromokratis has hexproof unless it's attacking or blocking. @@ -409,24 +412,138 @@ public class AttackBlockRestrictionsTest extends CardTestPlayerBase { String gBears = "Grizzly Bears"; // {1}{G} 2/2 String memnite = "Memnite"; // {0} 1/1 String hGiant = "Hill Giant"; // {3}{R} 3/3 - + addCard(Zone.BATTLEFIELD, playerA, tromokratis); addCard(Zone.BATTLEFIELD, playerB, gBears); addCard(Zone.BATTLEFIELD, playerB, memnite); addCard(Zone.BATTLEFIELD, playerB, hGiant); - + attack(2, playerB, hGiant); // forces a creature to be tapped so unable to block Tromokratis, which means it cannot be blocked at all attack(3, playerA, tromokratis); block(3, playerB, gBears, tromokratis); block(3, playerB, memnite, tromokratis); - + setStopAt(3, PhaseStep.POSTCOMBAT_MAIN); execute(); - + assertLife(playerB, 12); // Hill Giant could not block it, so no other creature could block Tromokratis either assertPermanentCount(playerB, gBears, 1); assertPermanentCount(playerB, memnite, 1); assertTapped(tromokratis, true); assertTapped(hGiant, true); } + + @Test + public void underworldCerberusBlockedByOneTest() { + /* Underworld Cerberus {3}{B}{3} 6/6 + * Underworld Cerberus can't be blocked except by three or more creatures. + * Cards in graveyards can't be the targets of spells or abilities. + * When Underworld Cerberus dies, exile it and each player returns all creature cards from his or her graveyard to his or her hand. + */ + addCard(Zone.BATTLEFIELD, playerA, "Underworld Cerberus"); + addCard(Zone.BATTLEFIELD, playerB, "Memnite"); // 1/1 + + attack(3, playerA, "Underworld Cerberus"); + block(3, playerB, "Memnite", "Underworld Cerberus"); + + setStopAt(3, PhaseStep.POSTCOMBAT_MAIN); + + try { + execute(); + fail("Expected exception not thrown"); + } catch(UnsupportedOperationException e) { + assertEquals("Underworld Cerberus is blocked by 1 creature(s). It has to be blocked by 3 or more.", e.getMessage()); + } + + } + + @Test + public void underworldCerberusBlockedByTwoTest() { + /* Underworld Cerberus {3}{B}{3} 6/6 + * Underworld Cerberus can't be blocked except by three or more creatures. + * Cards in graveyards can't be the targets of spells or abilities. + * When Underworld Cerberus dies, exile it and each player returns all creature cards from his or her graveyard to his or her hand. + */ + addCard(Zone.BATTLEFIELD, playerA, "Underworld Cerberus"); + addCard(Zone.BATTLEFIELD, playerB, "Memnite", 2); // 1/1 + + attack(3, playerA, "Underworld Cerberus"); + block(3, playerB, "Memnite", "Underworld Cerberus"); + block(3, playerB, "Memnite", "Underworld Cerberus"); + + setStopAt(3, PhaseStep.POSTCOMBAT_MAIN); + + try { + execute(); + fail("Expected exception not thrown"); + } catch(UnsupportedOperationException e) { + assertEquals("Underworld Cerberus is blocked by 2 creature(s). It has to be blocked by 3 or more.", e.getMessage()); + } + } + + @Test + public void underworldCerberusBlockedByThreeTest() { + + /* Underworld Cerberus {3}{B}{3} 6/6 + * Underworld Cerberus can't be blocked except by three or more creatures. + * Cards in graveyards can't be the targets of spells or abilities. + * When Underworld Cerberus dies, exile it and each player returns all creature cards from his or her graveyard to his or her hand. + */ + addCard(Zone.BATTLEFIELD, playerA, "Underworld Cerberus"); + addCard(Zone.BATTLEFIELD, playerB, "Memnite", 3); // 1/1 + + + // Blocked by 3 creatures - this is acceptable + attack(3, playerA, "Underworld Cerberus"); + block(3, playerB, "Memnite", "Underworld Cerberus"); + block(3, playerB, "Memnite", "Underworld Cerberus"); + block(3, playerB, "Memnite", "Underworld Cerberus"); + + setStopAt(3, PhaseStep.POSTCOMBAT_MAIN); + + execute(); + + assertPermanentCount(playerA, "Underworld Cerberus", 1); + assertPermanentCount(playerB, "Memnite", 0); + assertGraveyardCount(playerB, "Memnite", 3); + + assertLife(playerA, 20); + assertLife(playerB, 20); + } + + @Test + public void underworldCerberusBlockedByTenTest() { + /* Underworld Cerberus {3}{B}{3} 6/6 + * Underworld Cerberus can't be blocked except by three or more creatures. + * Cards in graveyards can't be the targets of spells or abilities. + * When Underworld Cerberus dies, exile it and each player returns all creature cards from his or her graveyard to his or her hand. + */ + addCard(Zone.BATTLEFIELD, playerA, "Underworld Cerberus"); + addCard(Zone.BATTLEFIELD, playerB, "Memnite", 10); // 1/1 + + // Blocked by 10 creatures - this is acceptable as it's >3 + attack(3, playerA, "Underworld Cerberus"); + for(int i = 0; i < 10; i++) { + block(3, playerB, "Memnite", "Underworld Cerberus"); + } + + setStopAt(3, PhaseStep.POSTCOMBAT_MAIN); + + execute(); + + assertPermanentCount(playerA, "Underworld Cerberus", 0); + assertPermanentCount(playerB, "Memnite", 4); + // Actually exiled when it dies + assertGraveyardCount(playerA, "Underworld Cerberus", 0); + assertExileCount(playerA, "Underworld Cerberus", 1); + // Cards are returned to their owner's hand when Underworld Cerberus dies + assertGraveyardCount(playerB, "Memnite", 0); + assertHandCount(playerB, "Memnite", 6); + + assertLife(playerA, 20); + assertLife(playerB, 20); + } + + + } diff --git a/Mage.Tests/src/test/java/org/mage/test/combat/CanBlockMultipleCreaturesTest.java b/Mage.Tests/src/test/java/org/mage/test/combat/CanBlockMultipleCreaturesTest.java index c488cb35f3..d74ac7ad27 100644 --- a/Mage.Tests/src/test/java/org/mage/test/combat/CanBlockMultipleCreaturesTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/combat/CanBlockMultipleCreaturesTest.java @@ -34,6 +34,7 @@ import org.junit.Test; import org.mage.test.serverside.base.CardTestPlayerBase; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; /** * @@ -136,6 +137,7 @@ public class CanBlockMultipleCreaturesTest extends CardTestPlayerBase { // Will fail on purpose - we are trying to block too many creatures! try { execute(); + fail("Expected exception not thrown"); } catch(UnsupportedOperationException e) { assertEquals("Hundred-Handed One cannot block Fabled Hero", e.getMessage()); } @@ -215,6 +217,7 @@ public class CanBlockMultipleCreaturesTest extends CardTestPlayerBase { // Catch the illegal block try { execute(); + fail("Expected exception not thrown"); } catch(UnsupportedOperationException e) { assertEquals("Embraal Bruiser is blocked by 1 creature(s). It has to be blocked by 2 or more.", e.getMessage()); } diff --git a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java index 7bf5099618..da10ded0a5 100644 --- a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java +++ b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java @@ -588,8 +588,8 @@ public class TestPlayer implements Player { } } } - checkMultipleBlockers(game, blockedCreaturesByCreature); } + checkMultipleBlockers(game, blockedCreaturesByCreature); } // Checks if a creature can block at least one more creature diff --git a/Mage/src/main/java/mage/watchers/common/NumberOfTimesPermanentTargetedATurnWatcher.java b/Mage/src/main/java/mage/watchers/common/NumberOfTimesPermanentTargetedATurnWatcher.java new file mode 100644 index 0000000000..b2ba609b06 --- /dev/null +++ b/Mage/src/main/java/mage/watchers/common/NumberOfTimesPermanentTargetedATurnWatcher.java @@ -0,0 +1,89 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ + +package mage.watchers.common; + +import java.util.HashMap; +import java.util.Map; +import mage.MageObjectReference; +import mage.constants.WatcherScope; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.watchers.Watcher; + +/** + * + * @author LevelX2 + */ +public class NumberOfTimesPermanentTargetedATurnWatcher extends Watcher { + + private final Map permanentsTargeted = new HashMap<>(); + + public NumberOfTimesPermanentTargetedATurnWatcher() { + super(NumberOfTimesPermanentTargetedATurnWatcher.class.getName(), WatcherScope.GAME); + } + + public NumberOfTimesPermanentTargetedATurnWatcher(final NumberOfTimesPermanentTargetedATurnWatcher watcher) { + super(watcher); + this.permanentsTargeted.putAll(permanentsTargeted); + } + + @Override + public void watch(GameEvent event, Game game) { + if (event.getType() == GameEvent.EventType.TARGETED) { + Permanent permanent = game.getPermanent(event.getTargetId()); + if (permanent != null) { + MageObjectReference mor = new MageObjectReference(permanent, game); + int amount = 0; + if (permanentsTargeted.containsKey(mor)) { + amount = permanentsTargeted.get(mor); + } + permanentsTargeted.put(mor, ++amount); + } + } + } + + public boolean notMoreThanOnceTargetedThisTurn(Permanent creature, Game game) { + if (permanentsTargeted.containsKey(new MageObjectReference(creature, game))) { + return permanentsTargeted.get(new MageObjectReference(creature, game)) < 2; + } + return true; + } + + @Override + public void reset() { + super.reset(); + permanentsTargeted.clear(); + } + + @Override + public NumberOfTimesPermanentTargetedATurnWatcher copy() { + return new NumberOfTimesPermanentTargetedATurnWatcher(this); + } +} diff --git a/Utils/known-sets.txt b/Utils/known-sets.txt index 3732a92345..9838560168 100644 --- a/Utils/known-sets.txt +++ b/Utils/known-sets.txt @@ -87,6 +87,7 @@ Guru|Guru| Homelands|Homelands| Hour of Devastation|HourOfDevastation| Ice Age|IceAge| +IconicMasters|IconicMasters| Innistrad|Innistrad| Invasion|Invasion| Ixalan|Ixalan| diff --git a/Utils/mtg-sets-data.txt b/Utils/mtg-sets-data.txt index e7e2d3ee2d..0285f451dd 100644 --- a/Utils/mtg-sets-data.txt +++ b/Utils/mtg-sets-data.txt @@ -93,6 +93,7 @@ Homelands|HML| Planechase|HOP| Hour of Devastation|HOU| Ice Age|ICE| +Iconic Masters|IMA| Invasion|INV| Innistrad|ISD| Journey into Nyx|JOU|