diff --git a/Mage.Client/src/main/java/mage/client/util/comparators/CardViewEDHPowerLevelComparator.java b/Mage.Client/src/main/java/mage/client/util/comparators/CardViewEDHPowerLevelComparator.java index 9f70be139de..4e456b2155c 100644 --- a/Mage.Client/src/main/java/mage/client/util/comparators/CardViewEDHPowerLevelComparator.java +++ b/Mage.Client/src/main/java/mage/client/util/comparators/CardViewEDHPowerLevelComparator.java @@ -322,7 +322,6 @@ public class CardViewEDHPowerLevelComparator implements CardViewComparator { if (cn.equals("acid rain") || cn.equals("agent of treachery") || cn.equals("anafenza, the foremost") - || cn.equals("ancient tomb") || cn.equals("animar, soul of element") || cn.equals("animate artifact") || cn.equals("apocalypse") @@ -352,7 +351,6 @@ public class CardViewEDHPowerLevelComparator implements CardViewComparator { || cn.equals("cabal coffers") || cn.equals("candelabra of tawnos") || cn.equals("captain sisay") - || cn.equals("card view") || cn.equals("cataclysm") || cn.equals("catastrophe") || cn.equals("celestial dawn") @@ -368,7 +366,6 @@ public class CardViewEDHPowerLevelComparator implements CardViewComparator { || cn.equals("contamination") || cn.equals("craterhoof behemoth") || cn.equals("cryptic gateway") - || cn.equals("cyclonic rift") || cn.equals("deadeye navigator") || cn.equals("death cloud") || cn.equals("decree of annihilation") @@ -377,6 +374,7 @@ public class CardViewEDHPowerLevelComparator implements CardViewComparator { || cn.equals("demonic consultation") || cn.equals("derevi, empyrial tactician") || cn.equals("devastation") + || cn.equals("dictate of erebos") || cn.equals("dig through time") || cn.equals("divine intervention") || cn.equals("dockside extortionist") @@ -385,34 +383,35 @@ public class CardViewEDHPowerLevelComparator implements CardViewComparator { || cn.equals("drannith magistrate") || cn.equals("dross scorpion") || cn.equals("earthcraft") + || cn.equals("edgar markov") || cn.equals("edric, spymaster of trest") || cn.equals("elesh norn, grand cenobite") + || cn.equals("elesh norn, mother of machines") || cn.equals("embargo") || cn.equals("emrakul, the promised end") || cn.equals("enter the infinite") || cn.equals("entomb") || cn.equals("epicenter") || cn.equals("erratic portal") - || cn.equals("expropriate") || cn.equals("exquisite blood") || cn.equals("fall of the thran") - || cn.equals("fierce guardianship") + || cn.equals("farewell") + || cn.equals("flashfires") || cn.equals("food chain") || cn.equals("force of negation") - || cn.equals("force of will") || cn.equals("future sight") || cn.equals("gaddock teeg") - || cn.equals("gaea's cradle") || cn.equals("genesis chamber") || cn.equals("ghave, guru of spores") || cn.equals("gilded drake") || cn.equals("glenn, the voice of calm") || cn.equals("global ruin") || cn.equals("golos, tireless pilgrim") - || cn.equals("grand arbiter augustin iv") || cn.equals("grave pact") || cn.equals("grave titan") || cn.equals("great whale") + || cn.equals("gregor, shrewd magistrate") + || cn.equals("greymond, avacyn's stalwart") || cn.equals("grim monolith") || cn.equals("grip of chaos") || cn.equals("gush") @@ -421,21 +420,23 @@ public class CardViewEDHPowerLevelComparator implements CardViewComparator { || cn.equals("hokori, dust drinker") || cn.equals("humility") || cn.equals("impending disaster") - || cn.equals("imperial seal") || cn.equals("intruder alarm") || cn.equals("invoke prejudice") || cn.equals("iona, shield of emeria") - || cn.equals("jin-gitaxias, core augur") + || cn.equals("jeweled lotus") + || cn.equals("jin-gitaxias, progress tyrant") || cn.equals("jokulhaups") || cn.equals("kaalia of the vast") || cn.equals("karador, ghost chieftain") || cn.equals("karakas") || cn.equals("karn, silver golem") + || cn.equals("karn, the great creator") || cn.equals("kataki, war's wage") || cn.equals("keldon firebombers") || cn.equals("kiki-jiki, mirror breaker") - || cn.equals("kinnan, bonder prodigy") || cn.equals("knowledge pool") + || cn.equals("koma, cosmos serpent") + || cn.equals("korvold, fae-cursed king") || cn.equals("kozilek, butcher of truth") || cn.equals("krark-clan ironworks") || cn.equals("krenko, mob boss") @@ -452,10 +453,10 @@ public class CardViewEDHPowerLevelComparator implements CardViewComparator { || cn.equals("maelstrom wanderer") || cn.equals("magister sphinx") || cn.equals("malfegor") + || cn.equals("malik, grim manipulator") || cn.equals("mana breach") || cn.equals("mana crypt") || cn.equals("mana drain") - || cn.equals("mana vault") || cn.equals("mana vortex") || cn.equals("master of cruelties") || cn.equals("memnarch") @@ -468,6 +469,7 @@ public class CardViewEDHPowerLevelComparator implements CardViewComparator { || cn.equals("minion reflector") || cn.equals("mycosynth lattice") || cn.equals("myr turbine") + || cn.equals("nadu, winged wisdom") || cn.equals("narset, enlightened master") || cn.equals("narset, parter of veils") || cn.equals("nath of the gilt-leaf") @@ -487,8 +489,8 @@ public class CardViewEDHPowerLevelComparator implements CardViewComparator { || cn.equals("oloro, ageless ascetic") || cn.equals("omniscience") || cn.equals("opalescence") - || cn.equals("opposition agent") || cn.equals("oppression") + || cn.equals("orcish bowmasters") || cn.equals("ornithopter") || cn.equals("overwhelming splendor") || cn.equals("palinchron") @@ -504,7 +506,6 @@ public class CardViewEDHPowerLevelComparator implements CardViewComparator { || cn.equals("purphoros, god of the forge") || cn.equals("ravages of war") || cn.equals("reclamation sage") - || cn.equals("rhystic study") || cn.equals("rick, steadfast leader") || cn.equals("rings of brighthearth") || cn.equals("rising waters") @@ -515,12 +516,11 @@ public class CardViewEDHPowerLevelComparator implements CardViewComparator { || cn.equals("seedborn muse") || cn.equals("sen triplets") || cn.equals("sensei's divining top") - || cn.equals("serra's sanctum") + || cn.equals("sheoldred, the apocalypse") || cn.equals("sheoldred, whispering one") || cn.equals("sire of insanity") || cn.equals("skithiryx, the blight dragon") || cn.equals("smokestack") - || cn.equals("smothering tithe") || cn.equals("sol ring") || cn.equals("sorin markov") || cn.equals("splinter twin") @@ -532,8 +532,6 @@ public class CardViewEDHPowerLevelComparator implements CardViewComparator { || cn.equals("storm cauldron") || cn.equals("strip mine") || cn.equals("sunder") - || cn.equals("survival of the fittest") - || cn.equals("table view") || cn.equals("tainted aether") || cn.equals("tangle wire") || cn.equals("tectonic break") @@ -543,21 +541,19 @@ public class CardViewEDHPowerLevelComparator implements CardViewComparator { || cn.equals("teferi, master of time") || cn.equals("teferi, time raveler") || cn.equals("temporal manipulation") - || cn.equals("tergrid, god of fright") - || cn.equals("text view") || cn.equals("tezzeret the seeker") - || cn.equals("thassa's oracle") || cn.equals("the chain veil") - || cn.equals("the tabernacle at pendrell vale") || cn.equals("thieves' auction") || cn.equals("thoughts of ruin") || cn.equals("thrasios, triton hero") + || cn.equals("time sieve") || cn.equals("time stretch") || cn.equals("time warp") || cn.equals("tinker") || cn.equals("tooth and nail") || cn.equals("torment of hailfire") || cn.equals("torpor orb") + || cn.equals("toxrill, the corrosive") || cn.equals("training grounds") || cn.equals("treasure cruise") || cn.equals("triskelavus") @@ -566,18 +562,20 @@ public class CardViewEDHPowerLevelComparator implements CardViewComparator { || cn.equals("turnabout") || cn.equals("ugin, the spirit dragon") || cn.equals("ulamog, the ceaseless hunger") + || cn.equals("ulamog, the defiler") || cn.equals("ulamog, the infinite gyre") || cn.equals("umbral mantle") || cn.equals("urabrask the hidden") - || cn.equals("urza, lord high artificer") || cn.equals("uyo, silent prophet") || cn.equals("void winnower") || cn.equals("voltaic key") - || cn.equals("vorinclex, voice of hunger") + || cn.equals("vorinclex, monstrous raider") || cn.equals("wake of destruction") || cn.equals("warp world") + || cn.equals("winter moon") || cn.equals("winter orb") || cn.equals("workhorse") + || cn.equals("worldfire") || cn.equals("worldgorger dragon") || cn.equals("worthy cause") || cn.equals("xanathar, guild kingpin") @@ -586,6 +584,111 @@ public class CardViewEDHPowerLevelComparator implements CardViewComparator { || cn.equals("zur the enchanter")) { thisMaxPower = Math.max(thisMaxPower, 12); } + + // Parts of infinite combos + if (cn.equals("animate artifact") || cn.equals("animar, soul of element") + || cn.equals("archaeomancer") + || cn.equals("ashnod's altar") || cn.equals("azami, lady of scrolls") + || cn.equals("aura flux") + || cn.equals("basalt monolith") || cn.equals("brago, king eternal") + || cn.equals("candelabra of tawnos") || cn.equals("cephalid aristocrat") + || cn.equals("cephalid illusionist") || cn.equals("changeling berserker") + || cn.equals("consecrated sphinx") + || cn.equals("cyclonic rift") + || cn.equals("the chain veil") + || cn.equals("cinderhaze wretch") || cn.equals("cryptic gateway") + || cn.equals("deadeye navigator") || cn.equals("derevi, empyrial tactician") + || cn.equals("doubling season") || cn.equals("dross scorpion") + || cn.equals("earthcraft") || cn.equals("erratic portal") + || cn.equals("enter the infinite") || cn.equals("omniscience") + || cn.equals("exquisite blood") || cn.equals("future sight") + || cn.equals("genesis chamber") + || cn.equals("ghave, guru of spores") + || cn.equals("grave pact") + || cn.equals("grave titan") || cn.equals("great whale") + || cn.equals("grim monolith") || cn.equals("gush") + || cn.equals("hellkite charger") || cn.equals("intruder alarm") + || cn.equals("helm of obedience") + || cn.equals("hermit druid") + || cn.equals("humility") + || cn.equals("iona, shield of emeria") + || cn.equals("karn, silver golem") || cn.equals("kiki-jiki, mirror breaker") + || cn.equals("krark-clan ironworks") || cn.equals("krenko, mob boss") + || cn.equals("krosan restorer") || cn.equals("laboratory maniac") + || cn.equals("leonin relic-warder") || cn.equals("leyline of the void") + || cn.equals("memnarch") + || cn.equals("meren of clan nel toth") || cn.equals("mikaeus, the unhallowed") + || cn.equals("mindcrank") || cn.equals("mindslaver") + || cn.equals("minion reflector") || cn.equals("mycosynth lattice") + || cn.equals("myr turbine") || cn.equals("narset, enlightened master") + || cn.equals("nekusar, the mindrazer") || cn.equals("norin the wary") + || cn.equals("notion thief") + || cn.equals("opalescence") || cn.equals("ornithopter") + || cn.equals("paradox engine") + || cn.equals("purphoros, god of the forge") + || cn.equals("peregrine drake") || cn.equals("palinchron") + || cn.equals("planar portal") || cn.equals("power artifact") + || cn.equals("rings of brighthearth") || cn.equals("rite of replication") + || cn.equals("sanguine bond") || cn.equals("sensei's divining top") + || cn.equals("splinter twin") || cn.equals("stony silence") + || cn.equals("sunder") + || cn.equals("storm cauldron") || cn.equals("teferi's puzzle box") + || cn.equals("tangle wire") + || cn.equals("teferi, mage of zhalfir") + || cn.equals("tezzeret the seeker") || cn.equals("time stretch") + || cn.equals("time warp") || cn.equals("training grounds") + || cn.equals("triskelavus") || cn.equals("triskelion") + || cn.equals("turnabout") || cn.equals("umbral mantle") + || cn.equals("uyo, silent prophet") || cn.equals("voltaic key") + || cn.equals("workhorse") || cn.equals("worldgorger dragon") + || cn.equals("worthy cause") || cn.equals("yawgmoth's will") + || cn.equals("zealous conscripts")) { + thisMaxPower = Math.max(thisMaxPower, 15); + } + + // Game changers + if (cn.equals("ad nauseam") + || cn.equals("ancient tomb") + || cn.equals("bolas's citadel") + || cn.equals("chrome mox") + || cn.equals("cyclonic rift") + || cn.equals("demonic tutor") + || cn.equals("drannith magistrate") + || cn.equals("enlightened tutor") + || cn.equals("expropriate") + || cn.equals("fierce guardianship") + || cn.equals("force of will") + || cn.equals("gaea's cradle") + || cn.equals("glacial chasm") + || cn.equals("grand arbiter augustin iv") + || cn.equals("grim monolith") + || cn.equals("imperial seal") + || cn.equals("jeska's will") + || cn.equals("jin-gitaxias, core augur") + || cn.equals("kinnan, bonder prodigy") + || cn.equals("lion's eye diamond") + || cn.equals("mana vault") + || cn.equals("mox diamond") + || cn.equals("mystical tutor") + || cn.equals("opposition agent") + || cn.equals("rhystic study") + || cn.equals("serra's sanctum") + || cn.equals("smothering tithe") + || cn.equals("survival of the fittest") + || cn.equals("tergrid, god of fright") + || cn.equals("thassa's oracle") + || cn.equals("the one ring") + || cn.equals("the tabernacle at pendrell vale") + || cn.equals("trinisphere") + || cn.equals("trouble in pairs") + || cn.equals("underworld breach") + || cn.equals("urza, lord high artificer") + || cn.equals("vampiric tutor") + || cn.equals("vorinclex, voice of hunger") + || cn.equals("winota, joiner of forces") + || cn.equals("yuriko, the tiger's shadow")) { + thisMaxPower = Math.max(thisMaxPower, 20); + } return thisMaxPower; } diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallApiCard.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallApiCard.java index 9c527825a78..b864f74a21d 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallApiCard.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallApiCard.java @@ -41,6 +41,7 @@ public class ScryfallApiCard { //public String watermark; // background watermark image for some cards public void prepareCompatibleData() { + // take images from main card if (this.image_uris != null) { this.imageSmall = this.image_uris.getOrDefault("small", ""); this.imageNormal = this.image_uris.getOrDefault("normal", ""); @@ -48,6 +49,7 @@ public class ScryfallApiCard { this.image_uris = null; } + // take first available images from one of the faces if (this.card_faces != null) { this.card_faces.forEach(ScryfallApiCardFace::prepareCompatibleData); } @@ -88,11 +90,33 @@ public class ScryfallApiCard { // - scryfall: Command Tower // Command Tower // - xmage: Command Tower (second side as diff card and direct link image), example: https://scryfall.com/card/rex/26/command-tower-command-tower if (this.layout.equals("reversible_card")) { - if (!this.card_faces.get(0).name.equals(this.card_faces.get(1).name)) { - throw new IllegalArgumentException("Scryfall: unsupported data type, reversible_card has diff faces " - + this.set + " - " + this.collector_number + " - " + this.name); + if (this.card_faces.get(0).layout == null || this.card_faces.get(0).layout.equals("normal")) { + // simple card + // Command Tower // Command Tower + // https://scryfall.com/card/rex/26/command-tower-command-tower + if (!this.card_faces.get(0).name.equals(this.card_faces.get(1).name)) { + throw new IllegalArgumentException("Scryfall: unsupported data type, normal reversible_card must have same name in faces" + + this.set + " - " + this.collector_number + " - " + this.name); + } + this.name = this.card_faces.get(0).name; + } else if (this.card_faces.get(0).layout.equals("adventure")) { + // adventure card + // Bloomvine Regent // Claim Territory + // https://scryfall.com/card/tdm/381/bloomvine-regent-claim-territory-bloomvine-regent + this.name = this.card_faces.get(0).name; + if (this.card_faces.get(0).name.equals(this.card_faces.get(1).name)) { + throw new IllegalArgumentException("Scryfall: unsupported data type, adventure's reversible_card must have diff names in faces " + + this.set + " - " + this.collector_number + " - " + this.name); + } + } else if (this.card_faces.get(0).layout.equals("token")) { + // token (it's not used for xmage's tokens, but must pass checks here anyway) + // Mechtitan // Mechtitan + // https://scryfall.com/card/sld/1969/mechtitan-mechtitan + this.name = this.card_faces.get(0).name; + } else { + throw new IllegalArgumentException("Scryfall: unsupported layout type in reversible_card - " + + this.card_faces.get(0).layout + " - " + this.set + " - " + this.collector_number + " - " + this.name); } - this.name = this.card_faces.get(0).name; } // workaround for non ascii names @@ -104,7 +128,6 @@ public class ScryfallApiCard { // - scryfall uses unicode numbers for reprints like Chandra Nalaar - dd2 - 34★ https://scryfall.com/card/dd2/34%E2%98%85/ // - xmage uses ascii alternative Chandra Nalaar - dd2 - 34* this.collector_number = transformCardNumberFromScryfallToXmage(this.collector_number); - } public static String transformCardNumberFromXmageToScryfall(String cardNumber) { diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallApiCardFace.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallApiCardFace.java index 44fe09a7766..c369b6380f8 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallApiCardFace.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallApiCardFace.java @@ -12,6 +12,7 @@ import java.util.Map; */ public class ScryfallApiCardFace { public String name; + public String layout; public Map image_uris; // fast access fields, fills on loading diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSource.java index f7038c9a96c..80e650feee5 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSource.java @@ -511,8 +511,7 @@ public class ScryfallImageSource implements CardImageSource { jsonReader.close(); return bulkCardsDatabaseAll.size() > 0; } catch (Exception e) { - logger.error("Can't read bulk file (possible reason: broken format)"); - logger.error(e.toString()); + logger.error("Can't read bulk file (possible reason: broken scryfall format), details: " + e); try { // clean up if (!SCRYFALL_BULK_FILES_DEBUG_READ_ONLY_MODE) { diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportTokens.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportTokens.java index 22248d13b6c..d8dc2cd18c2 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportTokens.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportTokens.java @@ -2601,7 +2601,7 @@ public class ScryfallImageSupportTokens { put("DFT/Vehicle", "https://api.scryfall.com/cards/tdft/12/en?format=image"); put("DFT/Zombie", "https://api.scryfall.com/cards/tdft/3/en?format=image"); - // DTC + // DRC put("DRC/Beast/1", "https://api.scryfall.com/cards/tdrc/10/en?format=image"); put("DRC/Beast/2", "https://api.scryfall.com/cards/tdrc/11/en?format=image"); put("DRC/Construct", "https://api.scryfall.com/cards/tdrc/12/en?format=image"); @@ -2615,6 +2615,30 @@ public class ScryfallImageSupportTokens { put("DRC/Zombie Army", "https://api.scryfall.com/cards/tdrc/8/en?format=image"); put("DRC/Zombie Warrior", "https://api.scryfall.com/cards/tdrc/9/en?format=image"); + // TDC + put("TDC/Angel", "https://api.scryfall.com/cards/ttdc/2/en?format=image"); + put("TDC/Citizen", "https://api.scryfall.com/cards/ttdc/26/en?format=image"); + put("TDC/Dog", "https://api.scryfall.com/cards/ttdc/3/en?format=image"); + put("TDC/Dragon Illusion", "https://api.scryfall.com/cards/ttdc/15/en?format=image"); + put("TDC/Eldrazi", "https://api.scryfall.com/cards/ttdc/1/en?format=image"); + put("TDC/Elemental/1", "https://api.scryfall.com/cards/ttdc/16/en?format=image"); + put("TDC/Elemental/2", "https://api.scryfall.com/cards/ttdc/17/en?format=image"); + put("TDC/Elemental/3", "https://api.scryfall.com/cards/ttdc/27/en?format=image"); + put("TDC/First Mate Ragavan", "https://api.scryfall.com/cards/ttdc/18/en?format=image"); + put("TDC/Goat", "https://api.scryfall.com/cards/ttdc/4/en?format=image"); + put("TDC/Gold", "https://api.scryfall.com/cards/ttdc/29/en?format=image"); + put("TDC/Human", "https://api.scryfall.com/cards/ttdc/5/en?format=image"); + put("TDC/Insect", "https://api.scryfall.com/cards/ttdc/22/en?format=image"); + put("TDC/Myr", "https://api.scryfall.com/cards/ttdc/30/en?format=image"); + put("TDC/Plant", "https://api.scryfall.com/cards/ttdc/24/en?format=image"); + put("TDC/Rat", "https://api.scryfall.com/cards/ttdc/9/en?format=image"); + put("TDC/Salamander Warrior", "https://api.scryfall.com/cards/ttdc/8/en?format=image"); + put("TDC/Servo", "https://api.scryfall.com/cards/ttdc/31/en?format=image"); + put("TDC/Snake", "https://api.scryfall.com/cards/ttdc/10/en?format=image"); + put("TDC/Soldier", "https://api.scryfall.com/cards/ttdc/32/en?format=image"); + put("TDC/Spirit", "https://api.scryfall.com/cards/ttdc/6/en?format=image"); + put("TDC/Thopter", "https://api.scryfall.com/cards/ttdc/33/en?format=image"); + // generate supported sets supportedSets.clear(); for (String cardName : this.keySet()) { diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/AbstractCommander.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/AbstractCommander.java index 0b6165ae087..fa47ac8d512 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/AbstractCommander.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/AbstractCommander.java @@ -581,82 +581,268 @@ public abstract class AbstractCommander extends Constructed { } String cn = card.getName().toLowerCase(Locale.ENGLISH); - if (cn.equals("ancient tomb") + // Saltiest cards (edhrec) + if (cn.equals("acid rain") + || cn.equals("agent of treachery") || cn.equals("anafenza, the foremost") + || cn.equals("animar, soul of element") + || cn.equals("animate artifact") + || cn.equals("apocalypse") + || cn.equals("archaeomancer") || cn.equals("arcum dagsson") || cn.equals("armageddon") + || cn.equals("ashnod's altar") + || cn.equals("atraxa, praetors' voice") + || cn.equals("aura flux") || cn.equals("aura shards") + || cn.equals("avacyn, angel of hope") || cn.equals("azami, lady of scrolls") || cn.equals("azusa, lost but seeking") || cn.equals("back to basics") || cn.equals("bane of progress") || cn.equals("basalt monolith") + || cn.equals("bend or break") || cn.equals("blightsteel collossus") + || cn.equals("blightsteel colossus") || cn.equals("blood moon") + || cn.equals("boil") + || cn.equals("boiling seas") + || cn.equals("brago, king eternal") || cn.equals("braids, cabal minion") + || cn.equals("bribery") + || cn.equals("burning sands") || cn.equals("cabal coffers") + || cn.equals("candelabra of tawnos") || cn.equals("captain sisay") + || cn.equals("cataclysm") + || cn.equals("catastrophe") || cn.equals("celestial dawn") + || cn.equals("cephalid aristocrat") + || cn.equals("cephalid illusionist") + || cn.equals("changeling berserker") || cn.equals("child of alara") + || cn.equals("chulane, teller of tales") + || cn.equals("cinderhaze wretch") || cn.equals("coalition relic") + || cn.equals("confusion in the ranks") + || cn.equals("consecrated sphinx") + || cn.equals("contamination") || cn.equals("craterhoof behemoth") + || cn.equals("cryptic gateway") + || cn.equals("deadeye navigator") + || cn.equals("death cloud") + || cn.equals("decree of annihilation") + || cn.equals("decree of silence") || cn.equals("deepglow skate") + || cn.equals("demonic consultation") || cn.equals("derevi, empyrial tactician") + || cn.equals("devastation") + || cn.equals("dictate of erebos") || cn.equals("dig through time") + || cn.equals("divine intervention") + || cn.equals("dockside extortionist") + || cn.equals("doomsday") + || cn.equals("doubling season") + || cn.equals("drannith magistrate") + || cn.equals("dross scorpion") + || cn.equals("earthcraft") + || cn.equals("edgar markov") || cn.equals("edric, spymaster of trest") || cn.equals("elesh norn, grand cenobite") + || cn.equals("elesh norn, mother of machines") + || cn.equals("embargo") + || cn.equals("emrakul, the promised end") + || cn.equals("enter the infinite") || cn.equals("entomb") - || cn.equals("force of will") + || cn.equals("epicenter") + || cn.equals("erratic portal") + || cn.equals("exquisite blood") + || cn.equals("fall of the thran") + || cn.equals("farewell") + || cn.equals("flashfires") || cn.equals("food chain") + || cn.equals("force of negation") + || cn.equals("future sight") || cn.equals("gaddock teeg") - || cn.equals("gaea's cradle") - || cn.equals("grand arbiter augustin iv") - || cn.equals("grim monolith") + || cn.equals("genesis chamber") + || cn.equals("ghave, guru of spores") + || cn.equals("gilded drake") + || cn.equals("glenn, the voice of calm") + || cn.equals("global ruin") + || cn.equals("golos, tireless pilgrim") + || cn.equals("grave pact") + || cn.equals("grave titan") + || cn.equals("great whale") + || cn.equals("gregor, shrewd magistrate") + || cn.equals("greymond, avacyn's stalwart") + || cn.equals("grip of chaos") + || cn.equals("gush") + || cn.equals("hellkite charger") || cn.equals("hermit druid") || cn.equals("hokori, dust drinker") || cn.equals("humility") - || cn.equals("imperial seal") + || cn.equals("impending disaster") + || cn.equals("intruder alarm") + || cn.equals("invoke prejudice") || cn.equals("iona, shield of emeria") - || cn.equals("jin-gitaxias, core augur") + || cn.equals("jeweled lotus") + || cn.equals("jin-gitaxias, progress tyrant") + || cn.equals("jokulhaups") + || cn.equals("kaalia of the vast") || cn.equals("karador, ghost chieftain") || cn.equals("karakas") + || cn.equals("karn, silver golem") + || cn.equals("karn, the great creator") || cn.equals("kataki, war's wage") + || cn.equals("keldon firebombers") + || cn.equals("kiki-jiki, mirror breaker") || cn.equals("knowledge pool") + || cn.equals("koma, cosmos serpent") + || cn.equals("korvold, fae-cursed king") + || cn.equals("kozilek, butcher of truth") + || cn.equals("krark-clan ironworks") + || cn.equals("krenko, mob boss") + || cn.equals("krosan restorer") + || cn.equals("laboratory maniac") + || cn.equals("land equilibrium") + || cn.equals("leonin relic-warder") + || cn.equals("leovold, emissary of trest") + || cn.equals("leyline of the void") || cn.equals("linvala, keeper of silence") || cn.equals("living death") || cn.equals("llawan, cephalid empress") || cn.equals("loyal retainers") || cn.equals("maelstrom wanderer") + || cn.equals("magister sphinx") || cn.equals("malfegor") - || cn.equals("master of cruelties") + || cn.equals("malik, grim manipulator") + || cn.equals("mana breach") || cn.equals("mana crypt") || cn.equals("mana drain") - || cn.equals("mana vault") + || cn.equals("mana vortex") + || cn.equals("master of cruelties") + || cn.equals("memnarch") + || cn.equals("meren of clan nel toth") || cn.equals("michiko konda, truth seeker") + || cn.equals("mikaeus the unhallowed") + || cn.equals("mikaeus, the unhallowed") + || cn.equals("mindcrank") + || cn.equals("mindslaver") + || cn.equals("minion reflector") + || cn.equals("mycosynth lattice") + || cn.equals("myr turbine") + || cn.equals("nadu, winged wisdom") + || cn.equals("narset, enlightened master") + || cn.equals("narset, parter of veils") || cn.equals("nath of the gilt-leaf") || cn.equals("natural order") || cn.equals("necrotic ooze") + || cn.equals("negan, the cold-blooded") + || cn.equals("nekusar, the mindrazer") + || cn.equals("nether void") + || cn.equals("nexus of fate") || cn.equals("nicol bolas") + || cn.equals("norin the wary") + || cn.equals("notion thief") || cn.equals("numot, the devastator") || cn.equals("oath of druids") + || cn.equals("obliterate") + || cn.equals("oko, thief of crowns") + || cn.equals("oloro, ageless ascetic") + || cn.equals("omniscience") + || cn.equals("opalescence") + || cn.equals("oppression") + || cn.equals("orcish bowmasters") + || cn.equals("ornithopter") + || cn.equals("overwhelming splendor") + || cn.equals("palinchron") + || cn.equals("paradox engine") || cn.equals("pattern of rebirth") + || cn.equals("peregrine drake") + || cn.equals("planar portal") + || cn.equals("possessed portal") + || cn.equals("power artifact") + || cn.equals("price of glory") + || cn.equals("prossh, skyraider of kher") || cn.equals("protean hulk") || cn.equals("purphoros, god of the forge") || cn.equals("ravages of war") || cn.equals("reclamation sage") + || cn.equals("rick, steadfast leader") + || cn.equals("rings of brighthearth") + || cn.equals("rising waters") + || cn.equals("rite of replication") + || cn.equals("ruination") + || cn.equals("sanguine bond") + || cn.equals("scrambleverse") + || cn.equals("seedborn muse") || cn.equals("sen triplets") - || cn.equals("serra's sanctum") + || cn.equals("sensei's divining top") + || cn.equals("sheoldred, the apocalypse") || cn.equals("sheoldred, whispering one") + || cn.equals("sire of insanity") + || cn.equals("skithiryx, the blight dragon") + || cn.equals("smokestack") || cn.equals("sol ring") + || cn.equals("sorin markov") + || cn.equals("splinter twin") || cn.equals("spore frog") || cn.equals("stasis") + || cn.equals("static orb") + || cn.equals("stony silence") + || cn.equals("storage matrix") + || cn.equals("storm cauldron") || cn.equals("strip mine") - || cn.equals("the tabernacle at pendrell vale") + || cn.equals("sunder") + || cn.equals("tainted aether") + || cn.equals("tangle wire") + || cn.equals("tectonic break") + || cn.equals("teferi's protection") + || cn.equals("teferi's puzzle box") + || cn.equals("teferi, mage of zhalfir") + || cn.equals("teferi, master of time") + || cn.equals("teferi, time raveler") + || cn.equals("temporal manipulation") + || cn.equals("tezzeret the seeker") + || cn.equals("the chain veil") + || cn.equals("thieves' auction") + || cn.equals("thoughts of ruin") + || cn.equals("thrasios, triton hero") + || cn.equals("time sieve") + || cn.equals("time stretch") + || cn.equals("time warp") || cn.equals("tinker") + || cn.equals("tooth and nail") + || cn.equals("torment of hailfire") + || cn.equals("torpor orb") + || cn.equals("toxrill, the corrosive") + || cn.equals("training grounds") || cn.equals("treasure cruise") + || cn.equals("triskelavus") + || cn.equals("triskelion") + || cn.equals("triumph of the hordes") + || cn.equals("turnabout") + || cn.equals("ugin, the spirit dragon") + || cn.equals("ulamog, the ceaseless hunger") + || cn.equals("ulamog, the defiler") + || cn.equals("ulamog, the infinite gyre") + || cn.equals("umbral mantle") || cn.equals("urabrask the hidden") - || cn.equals("vorinclex, voice of hunger") + || cn.equals("uyo, silent prophet") + || cn.equals("void winnower") + || cn.equals("voltaic key") + || cn.equals("vorinclex, monstrous raider") + || cn.equals("wake of destruction") + || cn.equals("warp world") + || cn.equals("winter moon") || cn.equals("winter orb") + || cn.equals("workhorse") + || cn.equals("worldfire") + || cn.equals("worldgorger dragon") + || cn.equals("worthy cause") + || cn.equals("xanathar, guild kingpin") + || cn.equals("yawgmoth's will") + || cn.equals("zealous conscripts") || cn.equals("zur the enchanter")) { thisMaxPower = Math.max(thisMaxPower, 12); } @@ -723,148 +909,49 @@ public abstract class AbstractCommander extends Constructed { numberInfinitePieces++; } - // Saltiest cards (edhrec) - if (cn.equals("acid rain") - || cn.equals("agent of treachery") - || cn.equals("apocalypse") - || cn.equals("armageddon") - || cn.equals("atraxa, praetors' voice") - || cn.equals("aura shards") - || cn.equals("avacyn, angel of hope") - || cn.equals("back to basics") - || cn.equals("bend or break") - || cn.equals("blightsteel colossus") - || cn.equals("blood moon") - || cn.equals("boil") - || cn.equals("boiling seas") - || cn.equals("bribery") - || cn.equals("burning sands") - || cn.equals("card view") - || cn.equals("cataclysm") - || cn.equals("catastrophe") - || cn.equals("chulane, teller of tales") - || cn.equals("confusion in the ranks") - || cn.equals("consecrated sphinx") - || cn.equals("contamination") - || cn.equals("craterhoof behemoth") + // Game changers + if (cn.equals("ad nauseam") + || cn.equals("ancient tomb") + || cn.equals("bolas's citadel") + || cn.equals("chrome mox") || cn.equals("cyclonic rift") - || cn.equals("death cloud") - || cn.equals("decree of annihilation") - || cn.equals("decree of silence") - || cn.equals("demonic consultation") - || cn.equals("derevi, empyrial tactician") - || cn.equals("devastation") - || cn.equals("divine intervention") - || cn.equals("dockside extortionist") - || cn.equals("doomsday") - || cn.equals("doubling season") + || cn.equals("demonic tutor") || cn.equals("drannith magistrate") - || cn.equals("elesh norn, grand cenobite") - || cn.equals("embargo") - || cn.equals("emrakul, the promised end") - || cn.equals("epicenter") + || cn.equals("enlightened tutor") || cn.equals("expropriate") - || cn.equals("fall of the thran") || cn.equals("fierce guardianship") - || cn.equals("food chain") - || cn.equals("force of negation") || cn.equals("force of will") - || cn.equals("gaddock teeg") || cn.equals("gaea's cradle") - || cn.equals("gilded drake") - || cn.equals("glenn, the voice of calm") - || cn.equals("global ruin") - || cn.equals("golos, tireless pilgrim") + || cn.equals("glacial chasm") || cn.equals("grand arbiter augustin iv") - || cn.equals("grip of chaos") - || cn.equals("hokori, dust drinker") - || cn.equals("humility") - || cn.equals("impending disaster") - || cn.equals("invoke prejudice") - || cn.equals("iona, shield of emeria") + || cn.equals("grim monolith") + || cn.equals("imperial seal") + || cn.equals("jeska's will") || cn.equals("jin-gitaxias, core augur") - || cn.equals("jokulhaups") - || cn.equals("keldon firebombers") || cn.equals("kinnan, bonder prodigy") - || cn.equals("kozilek, butcher of truth") - || cn.equals("land equilibrium") - || cn.equals("linvala, keeper of silence") - || cn.equals("magister sphinx") - || cn.equals("mana breach") - || cn.equals("mana crypt") - || cn.equals("mana drain") - || cn.equals("mana vortex") - || cn.equals("mindslaver") - || cn.equals("narset, enlightened master") - || cn.equals("narset, parter of veils") - || cn.equals("negan, the cold-blooded") - || cn.equals("nether void") - || cn.equals("nexus of fate") - || cn.equals("notion thief") - || cn.equals("obliterate") - || cn.equals("oko, thief of crowns") - || cn.equals("oloro, ageless ascetic") - || cn.equals("omniscience") + || cn.equals("lion's eye diamond") + || cn.equals("mana vault") + || cn.equals("mox diamond") + || cn.equals("mystical tutor") || cn.equals("opposition agent") - || cn.equals("oppression") - || cn.equals("overwhelming splendor") - || cn.equals("palinchron") - || cn.equals("paradox engine") - || cn.equals("possessed portal") - || cn.equals("price of glory") - || cn.equals("protean hulk") - || cn.equals("ravages of war") || cn.equals("rhystic study") - || cn.equals("rick, steadfast leader") - || cn.equals("rising waters") - || cn.equals("ruination") - || cn.equals("scrambleverse") - || cn.equals("seedborn muse") - || cn.equals("sen triplets") - || cn.equals("sire of insanity") - || cn.equals("skithiryx, the blight dragon") - || cn.equals("smokestack") + || cn.equals("serra's sanctum") || cn.equals("smothering tithe") - || cn.equals("sorin markov") - || cn.equals("stasis") - || cn.equals("static orb") - || cn.equals("storage matrix") - || cn.equals("sunder") || cn.equals("survival of the fittest") - || cn.equals("table view") - || cn.equals("tainted aether") - || cn.equals("tectonic break") - || cn.equals("teferi's protection") - || cn.equals("teferi, master of time") - || cn.equals("teferi, time raveler") - || cn.equals("temporal manipulation") || cn.equals("tergrid, god of fright") - || cn.equals("text view") || cn.equals("thassa's oracle") + || cn.equals("the one ring") || cn.equals("the tabernacle at pendrell vale") - || cn.equals("thieves' auction") - || cn.equals("thoughts of ruin") - || cn.equals("thrasios, triton hero") - || cn.equals("time stretch") - || cn.equals("time warp") - || cn.equals("tooth and nail") - || cn.equals("torment of hailfire") - || cn.equals("torpor orb") - || cn.equals("triumph of the hordes") - || cn.equals("ugin, the spirit dragon") - || cn.equals("ulamog, the ceaseless hunger") - || cn.equals("ulamog, the infinite gyre") + || cn.equals("trinisphere") + || cn.equals("trouble in pairs") + || cn.equals("underworld breach") || cn.equals("urza, lord high artificer") - || cn.equals("void winnower") + || cn.equals("vampiric tutor") || cn.equals("vorinclex, voice of hunger") - || cn.equals("wake of destruction") - || cn.equals("warp world") - || cn.equals("winter orb") - || cn.equals("xanathar, guild kingpin") - || cn.equals("zur the enchanter")) { - thisMaxPower = Math.max(thisMaxPower, 15); + || cn.equals("winota, joiner of forces") + || cn.equals("yuriko, the tiger's shadow")) { + thisMaxPower = Math.max(thisMaxPower, 20); } - edhPowerLevel += thisMaxPower; } ObjectColor color = null; diff --git a/Mage.Sets/src/mage/cards/a/AbzanDevotee.java b/Mage.Sets/src/mage/cards/a/AbzanDevotee.java new file mode 100644 index 00000000000..f6b3e921465 --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AbzanDevotee.java @@ -0,0 +1,51 @@ +package mage.cards.a; + +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.ReturnSourceFromGraveyardToHandEffect; +import mage.abilities.effects.mana.AddManaFromColorChoicesEffect; +import mage.abilities.mana.LimitedTimesPerTurnActivatedManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.ManaType; +import mage.constants.SubType; +import mage.constants.Zone; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class AbzanDevotee extends CardImpl { + + public AbzanDevotee(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}"); + + this.subtype.add(SubType.DOG); + this.subtype.add(SubType.CLERIC); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // {1}: Add {W}, {B}, or {G}. Activate only once each turn. + this.addAbility(new LimitedTimesPerTurnActivatedManaAbility( + new AddManaFromColorChoicesEffect(ManaType.WHITE, ManaType.BLACK, ManaType.GREEN), new GenericManaCost(1) + )); + + // {2}{B}: Return this card from your graveyard to your hand. + this.addAbility(new SimpleActivatedAbility( + Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(), new ManaCostsImpl<>("{2}{B}") + )); + } + + private AbzanDevotee(final AbzanDevotee card) { + super(card); + } + + @Override + public AbzanDevotee copy() { + return new AbzanDevotee(this); + } +} diff --git a/Mage.Sets/src/mage/cards/a/AbzanMonument.java b/Mage.Sets/src/mage/cards/a/AbzanMonument.java new file mode 100644 index 00000000000..fc1899a2030 --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AbzanMonument.java @@ -0,0 +1,101 @@ +package mage.cards.a; + +import mage.abilities.Ability; +import mage.abilities.common.ActivateAsSorceryActivatedAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.common.GreatestToughnessAmongControlledCreaturesValue; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; +import mage.abilities.hint.Hint; +import mage.abilities.hint.ValueHint; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; +import mage.game.Game; +import mage.game.permanent.token.SpiritXXToken; +import mage.target.common.TargetCardInLibrary; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class AbzanMonument extends CardImpl { + + private static final FilterCard filter = new FilterCard("a basic Plains, Swamp, or Forest card"); + + static { + filter.add(SuperType.BASIC.getPredicate()); + filter.add(Predicates.or( + SubType.PLAINS.getPredicate(), + SubType.SWAMP.getPredicate(), + SubType.FOREST.getPredicate() + )); + } + + private static final Hint hint = new ValueHint( + "Greatest toughness among creatures you control", + GreatestToughnessAmongControlledCreaturesValue.instance + ); + + public AbzanMonument(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}"); + + // When this artifact enters, search your library for a basic Plains, Swamp, or Forest card, reveal it, put it into your hand, then shuffle. + this.addAbility(new EntersBattlefieldTriggeredAbility( + new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true) + )); + + // {1}{W}{B}{G}, {T}, Sacrifice this artifact: Create an X/X white Spirit creature token, where X is the greatest toughness among creatures you control. Activate only as a sorcery. + Ability ability = new ActivateAsSorceryActivatedAbility( + new AbzanMonumentEffect(), new ManaCostsImpl<>("{1}{W}{B}{G}") + ); + ability.addCost(new TapSourceCost()); + ability.addCost(new SacrificeSourceCost()); + this.addAbility(ability.addHint(hint)); + } + + private AbzanMonument(final AbzanMonument card) { + super(card); + } + + @Override + public AbzanMonument copy() { + return new AbzanMonument(this); + } +} + +class AbzanMonumentEffect extends OneShotEffect { + + AbzanMonumentEffect() { + super(Outcome.Benefit); + staticText = "create an X/X white Spirit creature token, " + + "where X is the greatest toughness among creatures you control"; + } + + private AbzanMonumentEffect(final AbzanMonumentEffect effect) { + super(effect); + } + + @Override + public AbzanMonumentEffect copy() { + return new AbzanMonumentEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + return new SpiritXXToken( + GreatestToughnessAmongControlledCreaturesValue + .instance + .calculate(game, source, this) + ).putOntoBattlefield(1, game, source); + } +} diff --git a/Mage.Sets/src/mage/cards/a/AleshasLegacy.java b/Mage.Sets/src/mage/cards/a/AleshasLegacy.java new file mode 100644 index 00000000000..a3c09217770 --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AleshasLegacy.java @@ -0,0 +1,37 @@ +package mage.cards.a; + +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.DeathtouchAbility; +import mage.abilities.keyword.IndestructibleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetControlledCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class AleshasLegacy extends CardImpl { + + public AleshasLegacy(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{B}"); + + // Target creature you control gains deathtouch and indestructible until end of turn. + this.getSpellAbility().addEffect(new GainAbilityTargetEffect(DeathtouchAbility.getInstance()) + .setText("target creature you control gains deathtouch")); + this.getSpellAbility().addEffect(new GainAbilityTargetEffect(IndestructibleAbility.getInstance()) + .setText("and indestructible until end of turn")); + this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent()); + } + + private AleshasLegacy(final AleshasLegacy card) { + super(card); + } + + @Override + public AleshasLegacy copy() { + return new AleshasLegacy(this); + } +} diff --git a/Mage.Sets/src/mage/cards/a/AmblingStormshell.java b/Mage.Sets/src/mage/cards/a/AmblingStormshell.java new file mode 100644 index 00000000000..1daf35e71bf --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AmblingStormshell.java @@ -0,0 +1,62 @@ +package mage.cards.a; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.UntapSourceEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.WardAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.counters.CounterType; +import mage.filter.FilterSpell; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class AmblingStormshell extends CardImpl { + + private static final FilterSpell filter = new FilterSpell("a Turtle spell"); + + static { + filter.add(SubType.TURTLE.getPredicate()); + } + + public AmblingStormshell(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}{U}"); + + this.subtype.add(SubType.TURTLE); + this.power = new MageInt(5); + this.toughness = new MageInt(9); + + // Ward {2} + this.addAbility(new WardAbility(new ManaCostsImpl<>("{2}"))); + + // Whenever this creature attacks, put three stun counters on it and draw three cards. + Ability ability = new AttacksTriggeredAbility( + new AddCountersSourceEffect(CounterType.STUN.createInstance(3)) + .setText("put three stun counters on it") + ); + ability.addEffect(new DrawCardSourceControllerEffect(3).concatBy("and")); + this.addAbility(ability); + + // Whenever you cast a Turtle spell, untap this creature. + this.addAbility(new SpellCastControllerTriggeredAbility(new UntapSourceEffect(), filter, false)); + } + + private AmblingStormshell(final AmblingStormshell card) { + super(card); + } + + @Override + public AmblingStormshell copy() { + return new AmblingStormshell(this); + } +} diff --git a/Mage.Sets/src/mage/cards/a/AngelicAberration.java b/Mage.Sets/src/mage/cards/a/AngelicAberration.java index 465c3af5888..fdd11ac5842 100644 --- a/Mage.Sets/src/mage/cards/a/AngelicAberration.java +++ b/Mage.Sets/src/mage/cards/a/AngelicAberration.java @@ -17,8 +17,8 @@ import mage.constants.SubType; import mage.filter.FilterPermanent; import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.PowerPredicate; -import mage.filter.predicate.mageobject.ToughnessPredicate; +import mage.filter.predicate.mageobject.BasePowerPredicate; +import mage.filter.predicate.mageobject.BaseToughnessPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.token.EldraziAngelToken; @@ -70,8 +70,8 @@ class AngelicAberrationEffect extends OneShotEffect { static { filter.add(Predicates.or( - new PowerPredicate(ComparisonType.OR_LESS, 1), - new ToughnessPredicate(ComparisonType.OR_LESS, 1) + new BasePowerPredicate(ComparisonType.OR_LESS, 1), + new BaseToughnessPredicate(ComparisonType.OR_LESS, 1) )); } diff --git a/Mage.Sets/src/mage/cards/a/ArmamentDragon.java b/Mage.Sets/src/mage/cards/a/ArmamentDragon.java new file mode 100644 index 00000000000..db243795b2e --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/ArmamentDragon.java @@ -0,0 +1,46 @@ +package mage.cards.a; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.counter.DistributeCountersEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.counters.CounterType; +import mage.target.common.TargetCreaturePermanentAmount; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class ArmamentDragon extends CardImpl { + + public ArmamentDragon(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}{B}{G}"); + + this.subtype.add(SubType.DRAGON); + this.power = new MageInt(3); + this.toughness = new MageInt(4); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // When this creature enters, distribute three +1/+1 counters among one, two, or three target creatures you control. + Ability ability = new EntersBattlefieldTriggeredAbility(new DistributeCountersEffect(CounterType.P1P1)); + ability.addTarget(new TargetCreaturePermanentAmount(3)); + this.addAbility(ability); + } + + private ArmamentDragon(final ArmamentDragon card) { + super(card); + } + + @Override + public ArmamentDragon copy() { + return new ArmamentDragon(this); + } +} diff --git a/Mage.Sets/src/mage/cards/a/AttunedHunter.java b/Mage.Sets/src/mage/cards/a/AttunedHunter.java new file mode 100644 index 00000000000..1f891f599c6 --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AttunedHunter.java @@ -0,0 +1,47 @@ +package mage.cards.a; + +import mage.MageInt; +import mage.abilities.common.CardsLeaveGraveyardTriggeredAbility; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.counters.CounterType; +import mage.filter.StaticFilters; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class AttunedHunter extends CardImpl { + + public AttunedHunter(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.RANGER); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + + // Whenever one or more cards leave your graveyard during your turn, put a +1/+1 counter on this creature. + this.addAbility(new CardsLeaveGraveyardTriggeredAbility( + new AddCountersSourceEffect(CounterType.P1P1.createInstance()), + StaticFilters.FILTER_CARD_CARDS, true + )); + } + + private AttunedHunter(final AttunedHunter card) { + super(card); + } + + @Override + public AttunedHunter copy() { + return new AttunedHunter(this); + } +} diff --git a/Mage.Sets/src/mage/cards/a/AvengerOfTheFallen.java b/Mage.Sets/src/mage/cards/a/AvengerOfTheFallen.java new file mode 100644 index 00000000000..ee5ed57d7f7 --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AvengerOfTheFallen.java @@ -0,0 +1,49 @@ +package mage.cards.a; + +import mage.MageInt; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount; +import mage.abilities.hint.Hint; +import mage.abilities.hint.ValueHint; +import mage.abilities.keyword.DeathtouchAbility; +import mage.abilities.keyword.MobilizeAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.StaticFilters; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class AvengerOfTheFallen extends CardImpl { + + private static final DynamicValue xValue = new CardsInControllerGraveyardCount(StaticFilters.FILTER_CARD_CREATURES, null); + private static final Hint hint = new ValueHint("Creature cards in your graveyard", xValue); + + public AvengerOfTheFallen(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(2); + this.toughness = new MageInt(4); + + // Deathtouch + this.addAbility(DeathtouchAbility.getInstance()); + + // Mobilize X where X is the number of creature cards in your graveyard. + this.addAbility(new MobilizeAbility(xValue).addHint(hint)); + } + + private AvengerOfTheFallen(final AvengerOfTheFallen card) { + super(card); + } + + @Override + public AvengerOfTheFallen copy() { + return new AvengerOfTheFallen(this); + } +} diff --git a/Mage.Sets/src/mage/cards/a/AwakenTheHonoredDead.java b/Mage.Sets/src/mage/cards/a/AwakenTheHonoredDead.java new file mode 100644 index 00000000000..7a5afb6befb --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AwakenTheHonoredDead.java @@ -0,0 +1,64 @@ +package mage.cards.a; + +import mage.abilities.common.SagaAbility; +import mage.abilities.common.delayed.ReflexiveTriggeredAbility; +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.effects.common.DoWhenCostPaid; +import mage.abilities.effects.common.MillCardsControllerEffect; +import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SagaChapter; +import mage.constants.SubType; +import mage.filter.StaticFilters; +import mage.target.common.TargetCardInYourGraveyard; +import mage.target.common.TargetNonlandPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class AwakenTheHonoredDead extends CardImpl { + + public AwakenTheHonoredDead(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{B}{G}{U}"); + + this.subtype.add(SubType.SAGA); + + // (As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.) + SagaAbility sagaAbility = new SagaAbility(this); + + // I -- Destroy target nonland permanent. + sagaAbility.addChapterEffect( + this, SagaChapter.CHAPTER_I, + new DestroyTargetEffect(), new TargetNonlandPermanent() + ); + + // II -- Mill three cards. + sagaAbility.addChapterEffect( + this, SagaChapter.CHAPTER_II, + new MillCardsControllerEffect(3) + ); + + // III -- You may discard a card. When you do, return target creature or land card from your graveyard to your hand. + ReflexiveTriggeredAbility ability = new ReflexiveTriggeredAbility(new ReturnFromGraveyardToHandTargetEffect(), false); + ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_OR_LAND)); + sagaAbility.addChapterEffect( + this, SagaChapter.CHAPTER_III, + new DoWhenCostPaid(ability, new DiscardCardCost(), "Discard a card?") + ); + this.addAbility(sagaAbility); + } + + private AwakenTheHonoredDead(final AwakenTheHonoredDead card) { + super(card); + } + + @Override + public AwakenTheHonoredDead copy() { + return new AwakenTheHonoredDead(this); + } +} diff --git a/Mage.Sets/src/mage/cards/b/BewilderingBlizzard.java b/Mage.Sets/src/mage/cards/b/BewilderingBlizzard.java new file mode 100644 index 00000000000..58dd51824ec --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BewilderingBlizzard.java @@ -0,0 +1,37 @@ +package mage.cards.b; + +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.continuous.BoostAllEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.filter.StaticFilters; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class BewilderingBlizzard extends CardImpl { + + public BewilderingBlizzard(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{4}{U}{U}"); + + // Draw three cards. Creatures your opponents control get -3/-0 until end of turn. + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(3)); + this.getSpellAbility().addEffect(new BoostAllEffect( + -3, 0, Duration.EndOfTurn, + StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURES, false + )); + } + + private BewilderingBlizzard(final BewilderingBlizzard card) { + super(card); + } + + @Override + public BewilderingBlizzard copy() { + return new BewilderingBlizzard(this); + } +} diff --git a/Mage.Sets/src/mage/cards/b/BreachingDragonstorm.java b/Mage.Sets/src/mage/cards/b/BreachingDragonstorm.java new file mode 100644 index 00000000000..ae85be401fe --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BreachingDragonstorm.java @@ -0,0 +1,100 @@ +package mage.cards.b; + +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ReturnToHandSourceEffect; +import mage.cards.*; +import mage.constants.*; +import mage.filter.FilterCard; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.ManaValuePredicate; +import mage.game.Game; +import mage.players.Player; +import mage.util.CardUtil; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class BreachingDragonstorm extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent(SubType.DRAGON, "a Dragon"); + + public BreachingDragonstorm(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{R}"); + + // When this enchantment enters, exile cards from the top of your library until you exile a nonland card. You may cast it without paying its mana cost if that spell's mana value is 8 or less. If you don't, put that card into your hand. + this.addAbility(new EntersBattlefieldTriggeredAbility(new BreachingDragonstormEffect())); + + // When a Dragon you control enters, return this enchantment to its owner's hand. + this.addAbility(new EntersBattlefieldControlledTriggeredAbility(new ReturnToHandSourceEffect(), filter)); + } + + private BreachingDragonstorm(final BreachingDragonstorm card) { + super(card); + } + + @Override + public BreachingDragonstorm copy() { + return new BreachingDragonstorm(this); + } +} + +class BreachingDragonstormEffect extends OneShotEffect { + + private static final FilterCard filter = new FilterCard(); + + static { + filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, 9)); + } + + BreachingDragonstormEffect() { + super(Outcome.Benefit); + staticText = "exile cards from the top of your library until you exile a nonland card. " + + "You may cast it without paying its mana cost if that spell's mana value is 8 or less. " + + "If you don't, put that card into your hand"; + } + + private BreachingDragonstormEffect(final BreachingDragonstormEffect effect) { + super(effect); + } + + @Override + public BreachingDragonstormEffect copy() { + return new BreachingDragonstormEffect(this); + } + + private static Card getCard(Player player, Cards cards, Game game, Ability source) { + for (Card card : player.getLibrary().getCards(game)) { + cards.add(card); + player.moveCards(card, Zone.EXILED, source, game); + game.processAction(); + if (!card.isLand(game)) { + return card; + } + } + return null; + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player == null) { + return false; + } + Cards cards = new CardsImpl(); + Card card = getCard(player, cards, game, source); + if (card != null) { + CardUtil.castSpellWithAttributesForFree(player, source, game, card, filter); + if (game.getState().getZone(card.getId()) == Zone.EXILED) { + player.moveCards(card, Zone.HAND, source, game); + } + } + cards.retainZone(Zone.EXILED, game); + player.putCardsOnBottomOfLibrary(cards, game, source, false); + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/c/CallTheSpiritDragons.java b/Mage.Sets/src/mage/cards/c/CallTheSpiritDragons.java new file mode 100644 index 00000000000..6860194ee64 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CallTheSpiritDragons.java @@ -0,0 +1,108 @@ +package mage.cards.c; + +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.IndestructibleAbility; +import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.counters.CounterType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.TargetPermanent; + +import java.util.*; + +/** + * @author TheElk801 + */ +public final class CallTheSpiritDragons extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent(SubType.DRAGON, "Dragons"); + + public CallTheSpiritDragons(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{W}{U}{B}{R}{G}"); + + // Dragons you control have indestructible. + this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect( + IndestructibleAbility.getInstance(), Duration.WhileOnBattlefield, filter + ))); + + // At the beginning of your upkeep, for each color, put a +1/+1 counter on a Dragon you control of that color. If you put +1/+1 counters on five Dragons this way, you win the game. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new CallTheSpiritDragonsEffect())); + } + + private CallTheSpiritDragons(final CallTheSpiritDragons card) { + super(card); + } + + @Override + public CallTheSpiritDragons copy() { + return new CallTheSpiritDragons(this); + } +} + +class CallTheSpiritDragonsEffect extends OneShotEffect { + + private static final List filters = new ArrayList<>(); + + static { + for (ObjectColor color : ObjectColor.getAllColors()) { + FilterPermanent filter = new FilterControlledPermanent( + SubType.DRAGON, color.getDescription() + " Dragon you control" + ); + filter.add(new ColorPredicate(color)); + } + } + + CallTheSpiritDragonsEffect() { + super(Outcome.Benefit); + staticText = "for each color, put a +1/+1 counter on a Dragon you control of that color. " + + "If you put +1/+1 counters on five Dragons this way, you win the game"; + } + + private CallTheSpiritDragonsEffect(final CallTheSpiritDragonsEffect effect) { + super(effect); + } + + @Override + public CallTheSpiritDragonsEffect copy() { + return new CallTheSpiritDragonsEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player == null) { + return false; + } + Set dragons = new HashSet<>(); + for (FilterPermanent filter : filters) { + if (!game.getBattlefield().contains(filter, source, game, 1)) { + continue; + } + TargetPermanent target = new TargetPermanent(filter); + target.withNotTarget(true); + player.choose(Outcome.BoostCreature, target, source, game); + Permanent permanent = game.getPermanent(target.getFirstTarget()); + if (permanent != null && permanent.addCounters(CounterType.P1P1.createInstance(), source, game)) { + dragons.add(permanent.getId()); + } + } + if (dragons.size() >= 5) { + player.won(game); + } + return !dragons.isEmpty(); + } +} diff --git a/Mage.Sets/src/mage/cards/c/CallToArms.java b/Mage.Sets/src/mage/cards/c/CallToArms.java index a2c4ccb20e9..2b0bd85b998 100644 --- a/Mage.Sets/src/mage/cards/c/CallToArms.java +++ b/Mage.Sets/src/mage/cards/c/CallToArms.java @@ -1,6 +1,5 @@ package mage.cards.c; -import java.util.UUID; import mage.ObjectColor; import mage.abilities.Ability; import mage.abilities.StateTriggeredAbility; @@ -8,8 +7,7 @@ import mage.abilities.common.AsEntersBattlefieldAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.Condition; import mage.abilities.condition.common.MostCommonColorCondition; -import mage.abilities.effects.ContinuousEffectImpl; -import mage.abilities.effects.Effect; +import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.effects.common.ChooseColorEffect; import mage.abilities.effects.common.ChooseOpponentEffect; import mage.abilities.effects.common.SacrificeSourceEffect; @@ -18,40 +16,45 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.constants.Layer; import mage.constants.Outcome; -import mage.constants.SubLayer; import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.ColorPredicate; import mage.filter.predicate.permanent.ControllerIdPredicate; +import mage.filter.predicate.permanent.TokenPredicate; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.players.Player; +import java.util.UUID; + /** - * * @author TheElk801 */ public final class CallToArms extends CardImpl { + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(); + + static { + filter.add(new ColorPredicate(ObjectColor.WHITE)); + } + public CallToArms(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}"); // As Call to Arms enters the battlefield, choose a color and an opponent. - Ability ability = new AsEntersBattlefieldAbility( - new ChooseColorEffect(Outcome.Detriment) - ); - ability.addEffect(new ChooseOpponentEffect( - Outcome.Benefit - ).setText("and an opponent")); + Ability ability = new AsEntersBattlefieldAbility(new ChooseColorEffect(Outcome.Detriment)); + ability.addEffect(new ChooseOpponentEffect(Outcome.Benefit).setText("and an opponent")); this.addAbility(ability); // 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. - this.addAbility(new SimpleStaticAbility( - new CallToArmsEffect() - )); + this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect( + new BoostAllEffect(1, 1, Duration.WhileOnBattlefield, filter, false), + CallToArmsCondition.instance, "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" + ))); // When 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. this.addAbility(new CallToArmsStateTriggeredAbility()); @@ -67,46 +70,17 @@ public final class CallToArms extends CardImpl { } } -class CallToArmsEffect extends ContinuousEffectImpl { - - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("White creatures"); - - static { - filter.add(new ColorPredicate(ObjectColor.WHITE)); - } - - public CallToArmsEffect() { - super(Duration.WhileOnBattlefield, Layer.PTChangingEffects_7, SubLayer.ModifyPT_7c, Outcome.Benefit); - staticText = "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."; - } - - private CallToArmsEffect(final CallToArmsEffect effect) { - super(effect); - } - - @Override - public CallToArmsEffect copy() { - return new CallToArmsEffect(this); - } +enum CallToArmsCondition implements Condition { + instance; @Override public boolean apply(Game game, Ability source) { Permanent permanent = game.getPermanent(source.getSourceId()); - UUID playerId = (UUID) game.getState().getValue(source.getSourceId() + ChooseOpponentEffect.VALUE_KEY); - if (permanent != null) { - Player opponent = game.getPlayer(playerId); - if (opponent != null) { - ObjectColor color = (ObjectColor) game.getState().getValue(permanent.getId() + "_color"); - Condition condition = new MostCommonColorCondition(color, true, new ControllerIdPredicate(playerId)); - if (condition.apply(game, source)) { - Effect effect = new BoostAllEffect(1, 1, Duration.WhileOnBattlefield, filter, false); - return effect.apply(game, source); - } - } - } - return false; + Player opponent = game.getPlayer((UUID) game.getState().getValue(source.getSourceId() + ChooseOpponentEffect.VALUE_KEY)); + return permanent != null && opponent != null && new MostCommonColorCondition( + (ObjectColor) game.getState().getValue(permanent.getId() + "_color"), true, + Predicates.and(TokenPredicate.FALSE, new ControllerIdPredicate(opponent.getId())) + ).apply(game, source); } } @@ -129,17 +103,6 @@ class CallToArmsStateTriggeredAbility extends StateTriggeredAbility { @Override public boolean checkTrigger(GameEvent event, Game game) { - Permanent permanent = game.getPermanent(getSourceId()); - UUID playerId = (UUID) game.getState().getValue(getSourceId() + ChooseOpponentEffect.VALUE_KEY); - if (permanent != null) { - Player opponent = game.getPlayer(playerId); - if (opponent != null) { - ObjectColor color = (ObjectColor) game.getState().getValue(permanent.getId() + "_color"); - Condition condition = new MostCommonColorCondition(color, true, new ControllerIdPredicate(playerId)); - return !condition.apply(game, this); - } - } - return false; + return !CallToArmsCondition.instance.apply(game, this); } - } diff --git a/Mage.Sets/src/mage/cards/c/ChanneledDragonfire.java b/Mage.Sets/src/mage/cards/c/ChanneledDragonfire.java new file mode 100644 index 00000000000..adc69cb80f5 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/ChanneledDragonfire.java @@ -0,0 +1,36 @@ +package mage.cards.c; + +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.keyword.HarmonizeAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetAnyTarget; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class ChanneledDragonfire extends CardImpl { + + public ChanneledDragonfire(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{R}"); + + // Channeled Dragonfire deals 2 damage to any target. + this.getSpellAbility().addEffect(new DamageTargetEffect(2)); + this.getSpellAbility().addTarget(new TargetAnyTarget()); + + // Harmonize {5}{R}{R} + this.addAbility(new HarmonizeAbility(this, "{5}{R}{R}")); + } + + private ChanneledDragonfire(final ChanneledDragonfire card) { + super(card); + } + + @Override + public ChanneledDragonfire copy() { + return new ChanneledDragonfire(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/CoordinatedManeuver.java b/Mage.Sets/src/mage/cards/c/CoordinatedManeuver.java new file mode 100644 index 00000000000..afd5cb71f31 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CoordinatedManeuver.java @@ -0,0 +1,43 @@ +package mage.cards.c; + +import mage.abilities.Mode; +import mage.abilities.dynamicvalue.common.CreaturesYouControlCount; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.hint.common.CreaturesYouControlHint; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetCreatureOrPlaneswalker; +import mage.target.common.TargetEnchantmentPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class CoordinatedManeuver extends CardImpl { + + public CoordinatedManeuver(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{W}"); + + // Choose one -- + // * Coordinated Maneuver deals damage equal to the number of creatures you control to target creature or planeswalker. + this.getSpellAbility().addEffect(new DamageTargetEffect(CreaturesYouControlCount.instance) + .setText("{this} deals damage equal to the number of creatures you control to target creature or planeswalker")); + this.getSpellAbility().addTarget(new TargetCreatureOrPlaneswalker()); + this.getSpellAbility().addHint(CreaturesYouControlHint.instance); + + // * Destroy target enchantment. + this.getSpellAbility().addMode(new Mode(new DestroyTargetEffect()).addTarget(new TargetEnchantmentPermanent())); + } + + private CoordinatedManeuver(final CoordinatedManeuver card) { + super(card); + } + + @Override + public CoordinatedManeuver copy() { + return new CoordinatedManeuver(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/CoriMountainMonastery.java b/Mage.Sets/src/mage/cards/c/CoriMountainMonastery.java new file mode 100644 index 00000000000..02ddcd919bd --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CoriMountainMonastery.java @@ -0,0 +1,62 @@ +package mage.cards.c; + +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.ExileTopXMayPlayUntilEffect; +import mage.abilities.mana.RedManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.filter.predicate.Predicates; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class CoriMountainMonastery extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("a Plains or an Island"); + + static { + filter.add(Predicates.or( + SubType.PLAINS.getPredicate(), + SubType.ISLAND.getPredicate() + )); + } + + private static final YouControlPermanentCondition condition = new YouControlPermanentCondition(filter); + + public CoriMountainMonastery(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); + + // This land enters tapped unless you control a Plains or an Island. + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); + + // {T}: Add {R}. + this.addAbility(new RedManaAbility()); + + // {3}{R}, {T}: Exile the top card of your library. Until the end of your next turn, you may play that card. + Ability ability = new SimpleActivatedAbility( + new ExileTopXMayPlayUntilEffect(1, Duration.UntilEndOfYourNextTurn), new ManaCostsImpl<>("{3}{R}") + ); + ability.addCost(new TapSourceCost()); + this.addAbility(ability); + } + + private CoriMountainMonastery(final CoriMountainMonastery card) { + super(card); + } + + @Override + public CoriMountainMonastery copy() { + return new CoriMountainMonastery(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/CoriSteelCutter.java b/Mage.Sets/src/mage/cards/c/CoriSteelCutter.java new file mode 100644 index 00000000000..52211d053ac --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CoriSteelCutter.java @@ -0,0 +1,60 @@ +package mage.cards.c; + +import mage.abilities.Ability; +import mage.abilities.common.FlurryAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.CreateTokenAttachSourceEffect; +import mage.abilities.effects.common.continuous.BoostEquippedEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EquipAbility; +import mage.abilities.keyword.HasteAbility; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.game.permanent.token.MonasteryMentorToken; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class CoriSteelCutter extends CardImpl { + + public CoriSteelCutter(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}{R}"); + + this.subtype.add(SubType.EQUIPMENT); + + // Equipped creature gets +1/+1 and has trample and haste. + Ability ability = new SimpleStaticAbility(new BoostEquippedEffect(1, 1)); + ability.addEffect(new GainAbilityAttachedEffect( + TrampleAbility.getInstance(), AttachmentType.EQUIPMENT + ).setText("and has trample")); + ability.addEffect(new GainAbilityAttachedEffect( + HasteAbility.getInstance(), AttachmentType.EQUIPMENT + ).setText("and haste")); + this.addAbility(ability); + + // Flurry -- Whenever you cast your second spell each turn, create a 1/1 white Monk creature token with prowess. You may attach this Equipment to it. + this.addAbility(new FlurryAbility(new CreateTokenAttachSourceEffect( + new MonasteryMentorToken(), "", true + ))); + + // Equip {1}{R} + this.addAbility(new EquipAbility(Outcome.BoostCreature, new ManaCostsImpl<>("{1}{R}"))); + } + + private CoriSteelCutter(final CoriSteelCutter card) { + super(card); + } + + @Override + public CoriSteelCutter copy() { + return new CoriSteelCutter(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/CorrodingDragonstorm.java b/Mage.Sets/src/mage/cards/c/CorrodingDragonstorm.java new file mode 100644 index 00000000000..689fc3f98b2 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CorrodingDragonstorm.java @@ -0,0 +1,46 @@ +package mage.cards.c; + +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.effects.common.LoseLifeOpponentsEffect; +import mage.abilities.effects.common.ReturnToHandSourceEffect; +import mage.abilities.effects.keyword.SurveilEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class CorrodingDragonstorm extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent(SubType.DRAGON, "a Dragon"); + + public CorrodingDragonstorm(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}"); + + // When this enchantment enters, each opponent loses 2 life and you gain 2 life. Surveil 2. + Ability ability = new EntersBattlefieldTriggeredAbility(new LoseLifeOpponentsEffect(2)); + ability.addEffect(new GainLifeEffect(2).concatBy("and")); + ability.addEffect(new SurveilEffect(2)); + this.addAbility(ability); + + // When a Dragon you control enters, return this enchantment to its owner's hand. + this.addAbility(new EntersBattlefieldControlledTriggeredAbility(new ReturnToHandSourceEffect(), filter)); + } + + private CorrodingDragonstorm(final CorrodingDragonstorm card) { + super(card); + } + + @Override + public CorrodingDragonstorm copy() { + return new CorrodingDragonstorm(this); + } +} diff --git a/Mage.Sets/src/mage/cards/d/DefibrillatingCurrent.java b/Mage.Sets/src/mage/cards/d/DefibrillatingCurrent.java new file mode 100644 index 00000000000..756814c16f1 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DefibrillatingCurrent.java @@ -0,0 +1,34 @@ +package mage.cards.d; + +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetCreatureOrPlaneswalker; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class DefibrillatingCurrent extends CardImpl { + + public DefibrillatingCurrent(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2/R}{2/W}{2/B}"); + + // Defibrillating Current deals 4 damage to target creature or planeswalker and you gain 2 life. + this.getSpellAbility().addEffect(new DamageTargetEffect(4)); + this.getSpellAbility().addEffect(new GainLifeEffect(2).concatBy("and")); + this.getSpellAbility().addTarget(new TargetCreatureOrPlaneswalker()); + } + + private DefibrillatingCurrent(final DefibrillatingCurrent card) { + super(card); + } + + @Override + public DefibrillatingCurrent copy() { + return new DefibrillatingCurrent(this); + } +} diff --git a/Mage.Sets/src/mage/cards/d/DeltaBloodflies.java b/Mage.Sets/src/mage/cards/d/DeltaBloodflies.java new file mode 100644 index 00000000000..cb428174811 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DeltaBloodflies.java @@ -0,0 +1,57 @@ +package mage.cards.d; + +import mage.MageInt; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.effects.common.LoseLifeOpponentsEffect; +import mage.abilities.hint.ConditionHint; +import mage.abilities.hint.Hint; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.permanent.CounterAnyPredicate; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class DeltaBloodflies extends CardImpl { + + private static final FilterPermanent filter = new FilterControlledCreaturePermanent("you control a creature with a counter on it"); + + static { + filter.add(CounterAnyPredicate.instance); + } + + private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter); + private static final Hint hint = new ConditionHint(condition, "You control a creture with a counter on it"); + + public DeltaBloodflies(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}"); + + this.subtype.add(SubType.INSECT); + this.power = new MageInt(1); + this.toughness = new MageInt(2); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Whenever this creature attacks, if you control a creature with a counter on it, each opponent loses 1 life. + this.addAbility(new AttacksTriggeredAbility(new LoseLifeOpponentsEffect(1)).withInterveningIf(condition).addHint(hint)); + } + + private DeltaBloodflies(final DeltaBloodflies card) { + super(card); + } + + @Override + public DeltaBloodflies copy() { + return new DeltaBloodflies(this); + } +} diff --git a/Mage.Sets/src/mage/cards/d/DescendantOfStorms.java b/Mage.Sets/src/mage/cards/d/DescendantOfStorms.java new file mode 100644 index 00000000000..2cb42b4e077 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DescendantOfStorms.java @@ -0,0 +1,42 @@ +package mage.cards.d; + +import mage.MageInt; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DoIfCostPaid; +import mage.abilities.effects.keyword.EndureSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class DescendantOfStorms extends CardImpl { + + public DescendantOfStorms(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.SOLDIER); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Whenever this creature attacks, you may pay {1}{W}. If you do, it endures 1. + this.addAbility(new AttacksTriggeredAbility(new DoIfCostPaid( + new EndureSourceEffect(1), new ManaCostsImpl<>("{1}{W}") + ))); + } + + private DescendantOfStorms(final DescendantOfStorms card) { + super(card); + } + + @Override + public DescendantOfStorms copy() { + return new DescendantOfStorms(this); + } +} diff --git a/Mage.Sets/src/mage/cards/d/DispellingExhale.java b/Mage.Sets/src/mage/cards/d/DispellingExhale.java new file mode 100644 index 00000000000..5125df363e4 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DispellingExhale.java @@ -0,0 +1,42 @@ +package mage.cards.d; + +import mage.abilities.condition.common.BeheldDragonCondition; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.common.CounterUnlessPaysEffect; +import mage.abilities.keyword.BeholdDragonAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class DispellingExhale extends CardImpl { + + public DispellingExhale(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{U}"); + + // As an additional cost to cast this spell, you may behold a Dragon. + this.addAbility(new BeholdDragonAbility()); + + // Counter target spell unless its controller pays {2}. If a Dragon was beheld, counter that spell unless its controller pays {4} instead. + this.getSpellAbility().addEffect(new ConditionalOneShotEffect( + new CounterUnlessPaysEffect(new GenericManaCost(4)), + new CounterUnlessPaysEffect(new GenericManaCost(2)), + BeheldDragonCondition.instance, "counter target spell unless its controller pays {2}. " + + "If a Dragon was beheld, counter that spell unless its controller pays {4} instead" + )); + } + + private DispellingExhale(final DispellingExhale card) { + super(card); + } + + @Override + public DispellingExhale copy() { + return new DispellingExhale(this); + } +} diff --git a/Mage.Sets/src/mage/cards/d/DragonbroodsRelic.java b/Mage.Sets/src/mage/cards/d/DragonbroodsRelic.java new file mode 100644 index 00000000000..9ec52a0f847 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DragonbroodsRelic.java @@ -0,0 +1,48 @@ +package mage.cards.d; + +import mage.abilities.Ability; +import mage.abilities.common.ActivateAsSorceryActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapTargetCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.mana.AnyColorManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.StaticFilters; +import mage.game.permanent.token.ReliquaryDragonToken; +import mage.target.common.TargetControlledPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class DragonbroodsRelic extends CardImpl { + + public DragonbroodsRelic(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}{G}"); + + // {T}, Tap an untapped creature you control: Add one mana of any color. + Ability ability = new AnyColorManaAbility(); + ability.addCost(new TapTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_UNTAPPED_CREATURE))); + this.addAbility(ability); + + // {3}{W}{U}{B}{R}{G}, Sacrifice this artifact: Create a 4/4 Dragon creature token named Reliquary Dragon that's all colors. It has flying, lifelink, and "When this token enters, it deals 3 damage to any target." Activate only as a sorcery. + ability = new ActivateAsSorceryActivatedAbility( + new CreateTokenEffect(new ReliquaryDragonToken()), new ManaCostsImpl<>("{3}{W}{U}{B}{R}{G}") + ); + ability.addCost(new SacrificeSourceCost()); + this.addAbility(ability); + } + + private DragonbroodsRelic(final DragonbroodsRelic card) { + super(card); + } + + @Override + public DragonbroodsRelic copy() { + return new DragonbroodsRelic(this); + } +} diff --git a/Mage.Sets/src/mage/cards/d/Dragonologist.java b/Mage.Sets/src/mage/cards/d/Dragonologist.java new file mode 100644 index 00000000000..6df095d5813 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/Dragonologist.java @@ -0,0 +1,66 @@ +package mage.cards.d; + +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.HexproofAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.PutCards; +import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.filter.FilterPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.permanent.TappedPredicate; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class Dragonologist extends CardImpl { + + private static final FilterCard filter = new FilterCard("an instant, sorcery, or Dragon card"); + private static final FilterPermanent filter2 = new FilterPermanent(SubType.DRAGON, "untapped Dragons"); + + static { + filter.add(Predicates.or( + CardType.INSTANT.getPredicate(), + CardType.SORCERY.getPredicate(), + SubType.DRAGON.getPredicate() + )); + filter2.add(TappedPredicate.UNTAPPED); + } + + public Dragonologist(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.WIZARD); + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // When this creature enters, look at the top six cards of your library. You may reveal an instant, sorcery, or Dragon card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. + this.addAbility(new EntersBattlefieldTriggeredAbility(new LookLibraryAndPickControllerEffect( + 6, 1, filter, PutCards.HAND, PutCards.BOTTOM_RANDOM + ))); + + // Untapped Dragons you control have hexproof. + this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect( + HexproofAbility.getInstance(), Duration.WhileOnBattlefield, filter2 + ))); + } + + private Dragonologist(final Dragonologist card) { + super(card); + } + + @Override + public Dragonologist copy() { + return new Dragonologist(this); + } +} diff --git a/Mage.Sets/src/mage/cards/d/DragonsPrey.java b/Mage.Sets/src/mage/cards/d/DragonsPrey.java new file mode 100644 index 00000000000..621a8d05da0 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DragonsPrey.java @@ -0,0 +1,48 @@ +package mage.cards.d; + +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.SourceTargetsPermanentCondition; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.effects.common.cost.SpellCostIncreaseSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class DragonsPrey extends CardImpl { + + private static final Condition condition = new SourceTargetsPermanentCondition( + new FilterPermanent(SubType.DRAGON, "a Dragon") + ); + + public DragonsPrey(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{B}"); + + // This spell costs {2} more to cast if it targets a Dragon. + this.addAbility(new SimpleStaticAbility( + Zone.ALL, new SpellCostIncreaseSourceEffect(2, condition).setCanWorksOnStackOnly(true) + ).setRuleAtTheTop(true)); + + // Destroy target creature. + this.getSpellAbility().addEffect(new DestroyTargetEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + private DragonsPrey(final DragonsPrey card) { + super(card); + } + + @Override + public DragonsPrey copy() { + return new DragonsPrey(this); + } +} diff --git a/Mage.Sets/src/mage/cards/d/DragonstormForecaster.java b/Mage.Sets/src/mage/cards/d/DragonstormForecaster.java new file mode 100644 index 00000000000..74ec8074a34 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DragonstormForecaster.java @@ -0,0 +1,59 @@ +package mage.cards.d; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.NamePredicate; +import mage.target.common.TargetCardInLibrary; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class DragonstormForecaster extends CardImpl { + + private static final FilterCard filter + = new FilterCard("a card named Dragonstorm Globe or Boulderborn Dragon"); + + static { + filter.add(Predicates.or( + new NamePredicate("Dragonstorm Globe"), + new NamePredicate("Boulderborn Dragon") + )); + } + + public DragonstormForecaster(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{U}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.SCOUT); + this.power = new MageInt(0); + this.toughness = new MageInt(3); + + // {2}, {T}: Search your library for a card named Dragonstorm Globe or Boulderborn Dragon, reveal it, put it into your hand, then shuffle. + Ability ability = new SimpleActivatedAbility( + new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true), new GenericManaCost(2) + ); + ability.addCost(new TapSourceCost()); + this.addAbility(ability); + } + + private DragonstormForecaster(final DragonstormForecaster card) { + super(card); + } + + @Override + public DragonstormForecaster copy() { + return new DragonstormForecaster(this); + } +} diff --git a/Mage.Sets/src/mage/cards/d/DragonstormGlobe.java b/Mage.Sets/src/mage/cards/d/DragonstormGlobe.java new file mode 100644 index 00000000000..4656501b33c --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DragonstormGlobe.java @@ -0,0 +1,42 @@ +package mage.cards.d; + +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.EntersWithCountersControlledEffect; +import mage.abilities.mana.AnyColorManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.counters.CounterType; +import mage.filter.FilterPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class DragonstormGlobe extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent(SubType.DRAGON, "Dragon"); + + public DragonstormGlobe(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); + + // Each Dragon you control enters with an additional +1/+1 counter on it. + this.addAbility(new SimpleStaticAbility(new EntersWithCountersControlledEffect( + filter, CounterType.P1P1.createInstance(), false + ))); + + // {T}: Add one mana of any color. + this.addAbility(new AnyColorManaAbility()); + } + + private DragonstormGlobe(final DragonstormGlobe card) { + super(card); + } + + @Override + public DragonstormGlobe copy() { + return new DragonstormGlobe(this); + } +} diff --git a/Mage.Sets/src/mage/cards/d/DutyBeyondDeath.java b/Mage.Sets/src/mage/cards/d/DutyBeyondDeath.java new file mode 100644 index 00000000000..28e01a2b34c --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DutyBeyondDeath.java @@ -0,0 +1,45 @@ +package mage.cards.d; + +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.effects.common.counter.AddCountersAllEffect; +import mage.abilities.keyword.IndestructibleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.counters.CounterType; +import mage.filter.StaticFilters; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class DutyBeyondDeath extends CardImpl { + + public DutyBeyondDeath(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{W}"); + + // As an additional cost to cast this spell, sacrifice a creature. + this.getSpellAbility().addCost(new SacrificeTargetCost(StaticFilters.FILTER_PERMANENT_A_CREATURE)); + + // Creatures you control gain indestructible until end of turn. Put a +1/+1 counter on each creature you control. + this.getSpellAbility().addEffect(new GainAbilityControlledEffect( + IndestructibleAbility.getInstance(), Duration.EndOfTurn, + StaticFilters.FILTER_PERMANENT_CREATURES + )); + this.getSpellAbility().addEffect(new AddCountersAllEffect( + CounterType.P1P1.createInstance(), StaticFilters.FILTER_CONTROLLED_CREATURE + )); + } + + private DutyBeyondDeath(final DutyBeyondDeath card) { + super(card); + } + + @Override + public DutyBeyondDeath copy() { + return new DutyBeyondDeath(this); + } +} diff --git a/Mage.Sets/src/mage/cards/e/EmbermouthSentinel.java b/Mage.Sets/src/mage/cards/e/EmbermouthSentinel.java new file mode 100644 index 00000000000..df2aa14f804 --- /dev/null +++ b/Mage.Sets/src/mage/cards/e/EmbermouthSentinel.java @@ -0,0 +1,93 @@ +package mage.cards.e; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.CardsImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.StaticFilters; +import mage.filter.common.FilterControlledPermanent; +import mage.game.Game; +import mage.players.Player; +import mage.target.common.TargetCardInLibrary; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class EmbermouthSentinel extends CardImpl { + + public EmbermouthSentinel(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{2}"); + + this.subtype.add(SubType.CHIMERA); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // When this creature enters, you may search your library for a basic land card, reveal it, then shuffle and put that card on top. If you control a Dragon, put that card onto the battlefield tapped instead. + this.addAbility(new EntersBattlefieldTriggeredAbility(new EmbermouthSentinelEffect(), true)); + } + + private EmbermouthSentinel(final EmbermouthSentinel card) { + super(card); + } + + @Override + public EmbermouthSentinel copy() { + return new EmbermouthSentinel(this); + } +} + +class EmbermouthSentinelEffect extends OneShotEffect { + + private static final FilterPermanent filter = new FilterControlledPermanent(SubType.DRAGON); + + EmbermouthSentinelEffect() { + super(Outcome.Benefit); + staticText = "search your library for a basic land card, reveal it, then shuffle and put that card on top. " + + "If you control a Dragon, put that card onto the battlefield tapped instead"; + } + + private EmbermouthSentinelEffect(final EmbermouthSentinelEffect effect) { + super(effect); + } + + @Override + public EmbermouthSentinelEffect copy() { + return new EmbermouthSentinelEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player == null) { + return false; + } + TargetCardInLibrary target = new TargetCardInLibrary(StaticFilters.FILTER_CARD_BASIC_LAND); + player.searchLibrary(target, source, game); + Card card = player.getLibrary().getCard(target.getFirstTarget(), game); + player.shuffleLibrary(source, game); + if (card == null) { + return true; + } + player.revealCards(source, new CardsImpl(card), game); + if (game.getBattlefield().contains(filter, source, game, 1)) { + player.moveCards( + card, Zone.BATTLEFIELD, source, game, true, + false, false, null + ); + } else { + player.putCardsOnTopOfLibrary(card, game, source, false); + } + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/e/EncroachingDragonstorm.java b/Mage.Sets/src/mage/cards/e/EncroachingDragonstorm.java new file mode 100644 index 00000000000..0c9e3ae58a9 --- /dev/null +++ b/Mage.Sets/src/mage/cards/e/EncroachingDragonstorm.java @@ -0,0 +1,44 @@ +package mage.cards.e; + +import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.ReturnToHandSourceEffect; +import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.filter.StaticFilters; +import mage.target.common.TargetCardInLibrary; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class EncroachingDragonstorm extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent(SubType.DRAGON, "a Dragon"); + + public EncroachingDragonstorm(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{G}"); + + // When this enchantment enters, search your library for up to two basic land cards, put them onto the battlefield tapped, then shuffle. + this.addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInPlayEffect( + new TargetCardInLibrary(0, 2, StaticFilters.FILTER_CARD_BASIC_LANDS), true + ))); + + // When a Dragon you control enters, return this enchantment to its owner's hand. + this.addAbility(new EntersBattlefieldControlledTriggeredAbility(new ReturnToHandSourceEffect(), filter)); + } + + private EncroachingDragonstorm(final EncroachingDragonstorm card) { + super(card); + } + + @Override + public EncroachingDragonstorm copy() { + return new EncroachingDragonstorm(this); + } +} diff --git a/Mage.Sets/src/mage/cards/f/FelotharDawnOfTheAbzan.java b/Mage.Sets/src/mage/cards/f/FelotharDawnOfTheAbzan.java new file mode 100644 index 00000000000..cc4a8f8a44a --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FelotharDawnOfTheAbzan.java @@ -0,0 +1,56 @@ +package mage.cards.f; + +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility; +import mage.abilities.common.delayed.ReflexiveTriggeredAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.common.DoWhenCostPaid; +import mage.abilities.effects.common.counter.AddCountersAllEffect; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.counters.CounterType; +import mage.filter.StaticFilters; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class FelotharDawnOfTheAbzan extends CardImpl { + + public FelotharDawnOfTheAbzan(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}{B}{G}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + + // Whenever Felothar enters or attacks, you may sacrifice a nonland permanent. When you do, put a +1/+1 counter on each creature you control. + this.addAbility(new EntersBattlefieldOrAttacksSourceTriggeredAbility(new DoWhenCostPaid( + new ReflexiveTriggeredAbility(new AddCountersAllEffect( + CounterType.P1P1.createInstance(), + StaticFilters.FILTER_CONTROLLED_CREATURE + ), false), + new SacrificeTargetCost(StaticFilters.FILTER_PERMANENT_NON_LAND), + "Sacrifice a nonland permanent?" + ))); + } + + private FelotharDawnOfTheAbzan(final FelotharDawnOfTheAbzan card) { + super(card); + } + + @Override + public FelotharDawnOfTheAbzan copy() { + return new FelotharDawnOfTheAbzan(this); + } +} diff --git a/Mage.Sets/src/mage/cards/g/GlacialDragonhunt.java b/Mage.Sets/src/mage/cards/g/GlacialDragonhunt.java new file mode 100644 index 00000000000..44400ac5cc3 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GlacialDragonhunt.java @@ -0,0 +1,77 @@ +package mage.cards.g; + +import mage.abilities.Ability; +import mage.abilities.common.delayed.ReflexiveTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.keyword.HarmonizeAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.players.Player; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class GlacialDragonhunt extends CardImpl { + + public GlacialDragonhunt(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{U}{R}"); + + // Draw a card, then you may discard a card. When you discard a nonland card this way, Glacial Dragonhunt deals 3 damage to target creature. + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); + this.getSpellAbility().addEffect(new GlacialDragonhuntEffect()); + + // Harmonize {4}{U}{R} + this.addAbility(new HarmonizeAbility(this, "{4}{U}{R}")); + } + + private GlacialDragonhunt(final GlacialDragonhunt card) { + super(card); + } + + @Override + public GlacialDragonhunt copy() { + return new GlacialDragonhunt(this); + } +} + +class GlacialDragonhuntEffect extends OneShotEffect { + + GlacialDragonhuntEffect() { + super(Outcome.Benefit); + staticText = ", then you may discard a card. When you discard a nonland card this way, " + + "{this} deals 3 damage to target creature"; + } + + private GlacialDragonhuntEffect(final GlacialDragonhuntEffect effect) { + super(effect); + } + + @Override + public GlacialDragonhuntEffect copy() { + return new GlacialDragonhuntEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player == null || player.getHand().isEmpty() + || player + .discard(0, 1, true, source, game) + .count(StaticFilters.FILTER_CARD_NON_LAND, game) < 1) { + return false; + } + ReflexiveTriggeredAbility ability = new ReflexiveTriggeredAbility(new DamageTargetEffect(3), false); + ability.addTarget(new TargetCreaturePermanent()); + game.fireReflexiveTriggeredAbility(ability, source); + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/g/GreatArashinCity.java b/Mage.Sets/src/mage/cards/g/GreatArashinCity.java new file mode 100644 index 00000000000..9166e95fedc --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GreatArashinCity.java @@ -0,0 +1,64 @@ +package mage.cards.g; + +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; +import mage.abilities.costs.common.ExileFromGraveCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.mana.BlackManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.filter.StaticFilters; +import mage.filter.predicate.Predicates; +import mage.game.permanent.token.SpiritWhiteToken; +import mage.target.common.TargetCardInYourGraveyard; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class GreatArashinCity extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("a Forest or a Plains"); + + static { + filter.add(Predicates.or( + SubType.FOREST.getPredicate(), + SubType.PLAINS.getPredicate() + )); + } + + private static final YouControlPermanentCondition condition = new YouControlPermanentCondition(filter); + + public GreatArashinCity(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); + + // This land enters tapped unless you control a Forest or a Plains. + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); + + // {T}: Add {B}. + this.addAbility(new BlackManaAbility()); + + // {1}{B}, {T}, Exile a creature card from your graveyard: Create a 1/1 white Spirit creature token. + Ability ability = new SimpleActivatedAbility(new CreateTokenEffect(new SpiritWhiteToken()), new ManaCostsImpl<>("{1}{B}")); + ability.addCost(new TapSourceCost()); + ability.addCost(new ExileFromGraveCost(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE))); + this.addAbility(ability); + } + + private GreatArashinCity(final GreatArashinCity card) { + super(card); + } + + @Override + public GreatArashinCity copy() { + return new GreatArashinCity(this); + } +} diff --git a/Mage.Sets/src/mage/cards/g/GurmagNightwatch.java b/Mage.Sets/src/mage/cards/g/GurmagNightwatch.java new file mode 100644 index 00000000000..490c1403dd7 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GurmagNightwatch.java @@ -0,0 +1,41 @@ +package mage.cards.g; + +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.PutCards; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class GurmagNightwatch extends CardImpl { + + public GurmagNightwatch(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2/B}{2/G}{2/U}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.RANGER); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // When this creature enters, look at the top three cards of your library. You may put one of those cards back on top of your library. Put the rest into your graveyard. + this.addAbility(new EntersBattlefieldTriggeredAbility(new LookLibraryAndPickControllerEffect( + 3, 1, PutCards.TOP_ANY, PutCards.GRAVEYARD, true + ))); + } + + private GurmagNightwatch(final GurmagNightwatch card) { + super(card); + } + + @Override + public GurmagNightwatch copy() { + return new GurmagNightwatch(this); + } +} diff --git a/Mage.Sets/src/mage/cards/h/HardenedTactician.java b/Mage.Sets/src/mage/cards/h/HardenedTactician.java new file mode 100644 index 00000000000..7a62c12a7c4 --- /dev/null +++ b/Mage.Sets/src/mage/cards/h/HardenedTactician.java @@ -0,0 +1,51 @@ +package mage.cards.h; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.filter.predicate.permanent.TokenPredicate; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class HardenedTactician extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("a token"); + + static { + filter.add(TokenPredicate.TRUE); + } + + public HardenedTactician(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}{B}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(2); + this.toughness = new MageInt(4); + + // {1}, Sacrifice a token: Draw a card. + Ability ability = new SimpleActivatedAbility(new DrawCardSourceControllerEffect(1), new GenericManaCost(1)); + ability.addCost(new SacrificeTargetCost(filter)); + this.addAbility(ability); + } + + private HardenedTactician(final HardenedTactician card) { + super(card); + } + + @Override + public HardenedTactician copy() { + return new HardenedTactician(this); + } +} diff --git a/Mage.Sets/src/mage/cards/j/JeskaiBrushmaster.java b/Mage.Sets/src/mage/cards/j/JeskaiBrushmaster.java new file mode 100644 index 00000000000..300162d69f8 --- /dev/null +++ b/Mage.Sets/src/mage/cards/j/JeskaiBrushmaster.java @@ -0,0 +1,41 @@ +package mage.cards.j; + +import mage.MageInt; +import mage.abilities.keyword.DoubleStrikeAbility; +import mage.abilities.keyword.ProwessAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class JeskaiBrushmaster extends CardImpl { + + public JeskaiBrushmaster(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}{R}{W}"); + + this.subtype.add(SubType.ORC); + this.subtype.add(SubType.MONK); + this.power = new MageInt(2); + this.toughness = new MageInt(4); + + // Double strike + this.addAbility(DoubleStrikeAbility.getInstance()); + + // Prowess + this.addAbility(new ProwessAbility()); + } + + private JeskaiBrushmaster(final JeskaiBrushmaster card) { + super(card); + } + + @Override + public JeskaiBrushmaster copy() { + return new JeskaiBrushmaster(this); + } +} diff --git a/Mage.Sets/src/mage/cards/j/JeskaiDevotee.java b/Mage.Sets/src/mage/cards/j/JeskaiDevotee.java new file mode 100644 index 00000000000..d15fd4e173b --- /dev/null +++ b/Mage.Sets/src/mage/cards/j/JeskaiDevotee.java @@ -0,0 +1,48 @@ +package mage.cards.j; + +import mage.MageInt; +import mage.abilities.common.FlurryAbility; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.effects.mana.AddManaFromColorChoicesEffect; +import mage.abilities.mana.LimitedTimesPerTurnActivatedManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.ManaType; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class JeskaiDevotee extends CardImpl { + + public JeskaiDevotee(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}"); + + this.subtype.add(SubType.ORC); + this.subtype.add(SubType.MONK); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Flurry -- Whenever you cast your second spell each turn, this creature gets +1/+1 until end of turn. + this.addAbility(new FlurryAbility(new BoostSourceEffect(1, 1, Duration.EndOfTurn))); + + // {1}: Add {U}, {R}, or {W}. Activate only once each turn. + this.addAbility(new LimitedTimesPerTurnActivatedManaAbility( + new AddManaFromColorChoicesEffect(ManaType.BLUE, ManaType.RED, ManaType.WHITE), new GenericManaCost(1) + )); + } + + private JeskaiDevotee(final JeskaiDevotee card) { + super(card); + } + + @Override + public JeskaiDevotee copy() { + return new JeskaiDevotee(this); + } +} diff --git a/Mage.Sets/src/mage/cards/j/JeskaiMonument.java b/Mage.Sets/src/mage/cards/j/JeskaiMonument.java new file mode 100644 index 00000000000..4396379548e --- /dev/null +++ b/Mage.Sets/src/mage/cards/j/JeskaiMonument.java @@ -0,0 +1,64 @@ +package mage.cards.j; + +import mage.abilities.Ability; +import mage.abilities.common.ActivateAsSorceryActivatedAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; +import mage.game.permanent.token.BirdToken; +import mage.target.common.TargetCardInLibrary; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class JeskaiMonument extends CardImpl { + + private static final FilterCard filter = new FilterCard("basic Island, Mountain, or Plains card"); + + static { + filter.add(SuperType.BASIC.getPredicate()); + filter.add(Predicates.or( + SubType.ISLAND.getPredicate(), + SubType.MOUNTAIN.getPredicate(), + SubType.PLAINS.getPredicate() + )); + } + + public JeskaiMonument(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}"); + + // When this artifact enters, search your library for a basic Island, Mountain, or Plains card, reveal it, put it into your hand, then shuffle. + this.addAbility(new EntersBattlefieldTriggeredAbility( + new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true) + )); + + // {1}{U}{R}{W}, {T}, Sacrifice this artifact: Create two 1/1 white Bird creature tokens with flying. Activate only as a sorcery. + Ability ability = new ActivateAsSorceryActivatedAbility( + new CreateTokenEffect(new BirdToken(), 2), new ManaCostsImpl<>("{1}{U}{R}{W}") + ); + ability.addCost(new TapSourceCost()); + ability.addCost(new SacrificeSourceCost()); + this.addAbility(ability); + } + + private JeskaiMonument(final JeskaiMonument card) { + super(card); + } + + @Override + public JeskaiMonument copy() { + return new JeskaiMonument(this); + } +} diff --git a/Mage.Sets/src/mage/cards/j/JeskaiShrinekeeper.java b/Mage.Sets/src/mage/cards/j/JeskaiShrinekeeper.java new file mode 100644 index 00000000000..dc400accf57 --- /dev/null +++ b/Mage.Sets/src/mage/cards/j/JeskaiShrinekeeper.java @@ -0,0 +1,49 @@ +package mage.cards.j; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class JeskaiShrinekeeper extends CardImpl { + + public JeskaiShrinekeeper(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}{R}{W}"); + + this.subtype.add(SubType.DRAGON); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Haste + this.addAbility(HasteAbility.getInstance()); + + // Whenever this creature deals combat damage to a player, you gain 1 life and draw a card. + Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new GainLifeEffect(1)); + ability.addEffect(new DrawCardSourceControllerEffect(1).concatBy("and")); + this.addAbility(ability); + } + + private JeskaiShrinekeeper(final JeskaiShrinekeeper card) { + super(card); + } + + @Override + public JeskaiShrinekeeper copy() { + return new JeskaiShrinekeeper(this); + } +} diff --git a/Mage.Sets/src/mage/cards/k/KheruGoldkeeper.java b/Mage.Sets/src/mage/cards/k/KheruGoldkeeper.java new file mode 100644 index 00000000000..e82ca09547e --- /dev/null +++ b/Mage.Sets/src/mage/cards/k/KheruGoldkeeper.java @@ -0,0 +1,55 @@ +package mage.cards.k; + +import mage.MageInt; +import mage.abilities.common.CardsLeaveGraveyardTriggeredAbility; +import mage.abilities.common.RenewAbility; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.counters.CounterType; +import mage.filter.StaticFilters; +import mage.game.permanent.token.TreasureToken; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class KheruGoldkeeper extends CardImpl { + + public KheruGoldkeeper(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}{G}{U}"); + + this.subtype.add(SubType.DRAGON); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Whenever one or more cards leave your graveyard during your turn, create a Treasure token. + this.addAbility(new CardsLeaveGraveyardTriggeredAbility( + new CreateTokenEffect(new TreasureToken()), + StaticFilters.FILTER_CARD_CARDS, true + )); + + // Renew -- {2}{B}{G}{U}, Exile this card from your graveyard: Put two +1/+1 counters and a flying counter on target creature. Activate only as a sorcery. + this.addAbility(new RenewAbility( + "{2}{B}{G}{U}", + CounterType.P1P1.createInstance(2), + CounterType.FLYING.createInstance() + )); + } + + private KheruGoldkeeper(final KheruGoldkeeper card) { + super(card); + } + + @Override + public KheruGoldkeeper copy() { + return new KheruGoldkeeper(this); + } +} diff --git a/Mage.Sets/src/mage/cards/k/KinTreeSeverance.java b/Mage.Sets/src/mage/cards/k/KinTreeSeverance.java new file mode 100644 index 00000000000..570dd1c941d --- /dev/null +++ b/Mage.Sets/src/mage/cards/k/KinTreeSeverance.java @@ -0,0 +1,41 @@ +package mage.cards.k; + +import mage.abilities.effects.common.ExileTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.ComparisonType; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.ManaValuePredicate; +import mage.target.TargetPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class KinTreeSeverance extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("permanent with mana value 3 or greater"); + + static { + filter.add(new ManaValuePredicate(ComparisonType.MORE_THAN, 2)); + } + + public KinTreeSeverance(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2/W}{2/B}{2/G}"); + + // Exile target permanent with mana value 3 or greater. + this.getSpellAbility().addEffect(new ExileTargetEffect()); + this.getSpellAbility().addTarget(new TargetPermanent(filter)); + } + + private KinTreeSeverance(final KinTreeSeverance card) { + super(card); + } + + @Override + public KinTreeSeverance copy() { + return new KinTreeSeverance(this); + } +} diff --git a/Mage.Sets/src/mage/cards/k/KishlaSkimmer.java b/Mage.Sets/src/mage/cards/k/KishlaSkimmer.java new file mode 100644 index 00000000000..761e43f42cf --- /dev/null +++ b/Mage.Sets/src/mage/cards/k/KishlaSkimmer.java @@ -0,0 +1,45 @@ +package mage.cards.k; + +import mage.MageInt; +import mage.abilities.common.CardsLeaveGraveyardTriggeredAbility; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.StaticFilters; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class KishlaSkimmer extends CardImpl { + + public KishlaSkimmer(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}{U}"); + + this.subtype.add(SubType.BIRD); + this.subtype.add(SubType.SCOUT); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Whenever a card leaves your graveyard during your turn, draw a card. This ability triggers only once each turn. + this.addAbility(new CardsLeaveGraveyardTriggeredAbility( + new DrawCardSourceControllerEffect(1), StaticFilters.FILTER_CARD, true + ).setTriggerPhrase("Whenever a card leaves your graveyard during your turn, ").setTriggersLimitEachTurn(1)); + } + + private KishlaSkimmer(final KishlaSkimmer card) { + super(card); + } + + @Override + public KishlaSkimmer copy() { + return new KishlaSkimmer(this); + } +} diff --git a/Mage.Sets/src/mage/cards/k/KishlaTrawlers.java b/Mage.Sets/src/mage/cards/k/KishlaTrawlers.java new file mode 100644 index 00000000000..0393d61cc01 --- /dev/null +++ b/Mage.Sets/src/mage/cards/k/KishlaTrawlers.java @@ -0,0 +1,49 @@ +package mage.cards.k; + +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.delayed.ReflexiveTriggeredAbility; +import mage.abilities.costs.common.ExileFromGraveCost; +import mage.abilities.effects.common.DoWhenCostPaid; +import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.StaticFilters; +import mage.target.common.TargetCardInYourGraveyard; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class KishlaTrawlers extends CardImpl { + + public KishlaTrawlers(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.CITIZEN); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // When this creature enters, you may exile a creature card from your graveyard. When you do, return target instant or sorcery card from your graveyard to your hand. + ReflexiveTriggeredAbility ability = new ReflexiveTriggeredAbility(new ReturnFromGraveyardToHandTargetEffect(), false); + ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_INSTANT_OR_SORCERY_FROM_YOUR_GRAVEYARD)); + this.addAbility(new EntersBattlefieldTriggeredAbility(new DoWhenCostPaid( + ability, + new ExileFromGraveCost(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD)), + "Exile a creature card from your graveyard?" + ))); + } + + private KishlaTrawlers(final KishlaTrawlers card) { + super(card); + } + + @Override + public KishlaTrawlers copy() { + return new KishlaTrawlers(this); + } +} diff --git a/Mage.Sets/src/mage/cards/k/KishlaVillage.java b/Mage.Sets/src/mage/cards/k/KishlaVillage.java new file mode 100644 index 00000000000..7c70a9fa55d --- /dev/null +++ b/Mage.Sets/src/mage/cards/k/KishlaVillage.java @@ -0,0 +1,59 @@ +package mage.cards.k; + +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTappedUnlessAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.condition.common.YouControlPermanentCondition; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.keyword.SurveilEffect; +import mage.abilities.mana.GreenManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.filter.predicate.Predicates; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class KishlaVillage extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("an Island or a Swamp"); + + static { + filter.add(Predicates.or( + SubType.ISLAND.getPredicate(), + SubType.SWAMP.getPredicate() + )); + } + + private static final YouControlPermanentCondition condition = new YouControlPermanentCondition(filter); + + public KishlaVillage(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); + + // This land enters tapped unless you control an Island or a Swamp. + this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition).addHint(condition.getHint())); + + // {T}: Add {G}. + this.addAbility(new GreenManaAbility()); + + // {3}{G}, {T}: Surveil 2. + Ability ability = new SimpleActivatedAbility(new SurveilEffect(2), new ManaCostsImpl<>("{3}{G}")); + ability.addCost(new TapSourceCost()); + this.addAbility(ability); + } + + private KishlaVillage(final KishlaVillage card) { + super(card); + } + + @Override + public KishlaVillage copy() { + return new KishlaVillage(this); + } +} diff --git a/Mage.Sets/src/mage/cards/k/KrotiqNestguard.java b/Mage.Sets/src/mage/cards/k/KrotiqNestguard.java new file mode 100644 index 00000000000..c1af4abfc9f --- /dev/null +++ b/Mage.Sets/src/mage/cards/k/KrotiqNestguard.java @@ -0,0 +1,45 @@ +package mage.cards.k; + +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.combat.CanAttackAsThoughItDidntHaveDefenderSourceEffect; +import mage.abilities.keyword.DefenderAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class KrotiqNestguard extends CardImpl { + + public KrotiqNestguard(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); + + this.subtype.add(SubType.INSECT); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Defender + this.addAbility(DefenderAbility.getInstance()); + + // {2}{G}: This creature can attack this turn as though it didn't have defender. + this.addAbility(new SimpleActivatedAbility( + new CanAttackAsThoughItDidntHaveDefenderSourceEffect(Duration.EndOfTurn), new ManaCostsImpl<>("{2}{G}") + )); + } + + private KrotiqNestguard(final KrotiqNestguard card) { + super(card); + } + + @Override + public KrotiqNestguard copy() { + return new KrotiqNestguard(this); + } +} diff --git a/Mage.Sets/src/mage/cards/l/LightfootTechnique.java b/Mage.Sets/src/mage/cards/l/LightfootTechnique.java new file mode 100644 index 00000000000..4d9cb4069e2 --- /dev/null +++ b/Mage.Sets/src/mage/cards/l/LightfootTechnique.java @@ -0,0 +1,38 @@ +package mage.cards.l; + +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.IndestructibleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.counters.CounterType; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class LightfootTechnique extends CardImpl { + + public LightfootTechnique(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{W}"); + + // Put a +1/+1 counter on target creature. It gains flying and indestructible until end of turn. + this.getSpellAbility().addEffect(new AddCountersTargetEffect(CounterType.P1P1.createInstance())); + this.getSpellAbility().addEffect(new GainAbilityTargetEffect(FlyingAbility.getInstance()).setText("it gains flying")); + this.getSpellAbility().addEffect(new GainAbilityTargetEffect(IndestructibleAbility.getInstance()).setText("and indestructible until end of turn")); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + private LightfootTechnique(final LightfootTechnique card) { + super(card); + } + + @Override + public LightfootTechnique copy() { + return new LightfootTechnique(this); + } +} diff --git a/Mage.Sets/src/mage/cards/l/LoxodonBattlePriest.java b/Mage.Sets/src/mage/cards/l/LoxodonBattlePriest.java new file mode 100644 index 00000000000..e0dc9089708 --- /dev/null +++ b/Mage.Sets/src/mage/cards/l/LoxodonBattlePriest.java @@ -0,0 +1,44 @@ +package mage.cards.l; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.counters.CounterType; +import mage.filter.StaticFilters; +import mage.target.TargetPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class LoxodonBattlePriest extends CardImpl { + + public LoxodonBattlePriest(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{W}"); + + this.subtype.add(SubType.ELEPHANT); + this.subtype.add(SubType.CLERIC); + this.power = new MageInt(3); + this.toughness = new MageInt(5); + + // At the beginning of combat on your turn, put a +1/+1 counter on another target creature you control. + Ability ability = new BeginningOfCombatTriggeredAbility(new AddCountersTargetEffect(CounterType.P1P1.createInstance())); + ability.addTarget(new TargetPermanent(StaticFilters.FILTER_ANOTHER_TARGET_CREATURE_YOU_CONTROL)); + this.addAbility(ability); + } + + private LoxodonBattlePriest(final LoxodonBattlePriest card) { + super(card); + } + + @Override + public LoxodonBattlePriest copy() { + return new LoxodonBattlePriest(this); + } +} diff --git a/Mage.Sets/src/mage/cards/m/MammothBellow.java b/Mage.Sets/src/mage/cards/m/MammothBellow.java new file mode 100644 index 00000000000..565f408d61b --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MammothBellow.java @@ -0,0 +1,35 @@ +package mage.cards.m; + +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.keyword.HarmonizeAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.game.permanent.token.Elephant55Token; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class MammothBellow extends CardImpl { + + public MammothBellow(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{G}{U}{R}"); + + // Create a 5/5 green Elephant creature token. + this.getSpellAbility().addEffect(new CreateTokenEffect(new Elephant55Token())); + + // Harmonize {5}{G}{U}{R} + this.addAbility(new HarmonizeAbility(this, "{5}{G}{U}{R}")); + } + + private MammothBellow(final MammothBellow card) { + super(card); + } + + @Override + public MammothBellow copy() { + return new MammothBellow(this); + } +} diff --git a/Mage.Sets/src/mage/cards/m/ManaforgeCinder.java b/Mage.Sets/src/mage/cards/m/ManaforgeCinder.java index 7edcfbd9c12..146db9800e2 100644 --- a/Mage.Sets/src/mage/cards/m/ManaforgeCinder.java +++ b/Mage.Sets/src/mage/cards/m/ManaforgeCinder.java @@ -1,25 +1,15 @@ - package mage.cards.m; import mage.MageInt; -import mage.Mana; -import mage.abilities.Ability; -import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.mana.ManaEffect; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.mana.AddManaFromColorChoicesEffect; import mage.abilities.mana.LimitedTimesPerTurnActivatedManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.choices.Choice; -import mage.choices.ChoiceColor; import mage.constants.CardType; -import mage.constants.ColoredManaSymbol; +import mage.constants.ManaType; import mage.constants.SubType; -import mage.constants.Zone; -import mage.game.Game; -import mage.players.Player; -import java.util.ArrayList; -import java.util.List; import java.util.UUID; /** @@ -36,11 +26,9 @@ public final class ManaforgeCinder extends CardImpl { // {1}: Add {B} or {R}. Activate this ability no more than three times each turn. this.addAbility(new LimitedTimesPerTurnActivatedManaAbility( - Zone.BATTLEFIELD, new ManaforgeCinderManaEffect(), - new ManaCostsImpl<>("{1}"), 3, - ManaforgeCinderManaEffect.netMana + new AddManaFromColorChoicesEffect(ManaType.BLACK, ManaType.RED), + new GenericManaCost(1), 3 )); - } private ManaforgeCinder(final ManaforgeCinder card) { @@ -52,62 +40,3 @@ public final class ManaforgeCinder extends CardImpl { return new ManaforgeCinder(this); } } - -class ManaforgeCinderManaEffect extends ManaEffect { - - static final List netMana = new ArrayList<>(); - - static { - netMana.add(new Mana(ColoredManaSymbol.R)); - netMana.add(new Mana(ColoredManaSymbol.B)); - } - - - public ManaforgeCinderManaEffect() { - super(); - this.staticText = "Add {B} or {R}"; - } - - private ManaforgeCinderManaEffect(final ManaforgeCinderManaEffect effect) { - super(effect); - } - - @Override - public ManaforgeCinderManaEffect copy() { - return new ManaforgeCinderManaEffect(this); - } - - @Override - public List getNetMana(Game game, Ability source) { - return netMana; - } - - @Override - public Mana produceMana(Game game, Ability source) { - Mana mana = new Mana(); - if (game == null) { - return mana; - } - Choice choice = new ChoiceColor(true); - choice.getChoices().clear(); - choice.setMessage("Pick a mana color"); - choice.getChoices().add("Red"); - choice.getChoices().add("Black"); - - Player player = game.getPlayer(source.getControllerId()); - if (player != null) { - if (!player.choose(outcome, choice, game)) { - return mana; - } - switch (choice.getChoice()) { - case "Black": - mana.setBlack(1); - break; - case "Red": - mana.setRed(1); - break; - } - } - return mana; - } -} diff --git a/Mage.Sets/src/mage/cards/m/MarduDevotee.java b/Mage.Sets/src/mage/cards/m/MarduDevotee.java new file mode 100644 index 00000000000..7d860a15126 --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MarduDevotee.java @@ -0,0 +1,47 @@ +package mage.cards.m; + +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.keyword.ScryEffect; +import mage.abilities.effects.mana.AddManaFromColorChoicesEffect; +import mage.abilities.mana.LimitedTimesPerTurnActivatedManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.ManaType; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class MarduDevotee extends CardImpl { + + public MarduDevotee(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.SCOUT); + this.power = new MageInt(1); + this.toughness = new MageInt(2); + + // When this creature enters, scry 2. + this.addAbility(new EntersBattlefieldTriggeredAbility(new ScryEffect(2))); + + // {1}: Add {R}, {W}, or {B}. Activate only once each turn. + this.addAbility(new LimitedTimesPerTurnActivatedManaAbility( + new AddManaFromColorChoicesEffect(ManaType.RED, ManaType.WHITE, ManaType.BLACK), new GenericManaCost(1) + )); + } + + private MarduDevotee(final MarduDevotee card) { + super(card); + } + + @Override + public MarduDevotee copy() { + return new MarduDevotee(this); + } +} diff --git a/Mage.Sets/src/mage/cards/m/MarduMonument.java b/Mage.Sets/src/mage/cards/m/MarduMonument.java new file mode 100644 index 00000000000..72b0c766583 --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MarduMonument.java @@ -0,0 +1,98 @@ +package mage.cards.m; + +import mage.abilities.Ability; +import mage.abilities.common.ActivateAsSorceryActivatedAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; +import mage.abilities.keyword.HasteAbility; +import mage.abilities.keyword.MenaceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; +import mage.game.Game; +import mage.game.permanent.token.RedWarriorToken; +import mage.game.permanent.token.Token; +import mage.target.common.TargetCardInLibrary; +import mage.target.targetpointer.FixedTargets; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class MarduMonument extends CardImpl { + + private static final FilterCard filter = new FilterCard("a basic Mountain, Plains, or Swamp card"); + + static { + filter.add(SuperType.BASIC.getPredicate()); + filter.add(Predicates.or( + SubType.MOUNTAIN.getPredicate(), + SubType.PLAINS.getPredicate(), + SubType.SWAMP.getPredicate() + )); + } + + public MarduMonument(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}"); + + // When this artifact enters, search your library for a basic Mountain, Plains, or Swamp card, reveal it, put it into your hand, then shuffle. + this.addAbility(new EntersBattlefieldTriggeredAbility( + new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true) + )); + + // {2}{R}{W}{B}, {T}, Sacrifice this artifact: Create three 1/1 red Warrior creature tokens. They gain menace and haste until end of turn. Activate only as a sorcery. + Ability ability = new ActivateAsSorceryActivatedAbility( + new MarduMonumentEffect(), new ManaCostsImpl<>("{2}{R}{W}{B}") + ); + ability.addCost(new TapSourceCost()); + ability.addCost(new SacrificeSourceCost()); + this.addAbility(ability); + } + + private MarduMonument(final MarduMonument card) { + super(card); + } + + @Override + public MarduMonument copy() { + return new MarduMonument(this); + } +} + +class MarduMonumentEffect extends OneShotEffect { + + MarduMonumentEffect() { + super(Outcome.Benefit); + staticText = "create three 1/1 red Warrior creature tokens. They gain menace and haste until end of turn"; + } + + private MarduMonumentEffect(final MarduMonumentEffect effect) { + super(effect); + } + + @Override + public MarduMonumentEffect copy() { + return new MarduMonumentEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Token token = new RedWarriorToken(); + token.putOntoBattlefield(3, game, source); + game.addEffect(new GainAbilityTargetEffect( + new MenaceAbility(false), Duration.EndOfTurn + ).setTargetPointer(new FixedTargets(token, game)), source); + game.addEffect(new GainAbilityTargetEffect( + HasteAbility.getInstance(), Duration.EndOfTurn + ).setTargetPointer(new FixedTargets(token, game)), source); + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/m/MeticulousArtisan.java b/Mage.Sets/src/mage/cards/m/MeticulousArtisan.java new file mode 100644 index 00000000000..be0c47019f1 --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MeticulousArtisan.java @@ -0,0 +1,43 @@ +package mage.cards.m; + +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.keyword.ProwessAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.game.permanent.token.TreasureToken; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class MeticulousArtisan extends CardImpl { + + public MeticulousArtisan(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}"); + + this.subtype.add(SubType.DJINN); + this.subtype.add(SubType.ARTIFICER); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Prowess + this.addAbility(new ProwessAbility()); + + // When this creature enters, create a Treasure token. + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new TreasureToken()))); + } + + private MeticulousArtisan(final MeticulousArtisan card) { + super(card); + } + + @Override + public MeticulousArtisan copy() { + return new MeticulousArtisan(this); + } +} diff --git a/Mage.Sets/src/mage/cards/m/MonasteryMessenger.java b/Mage.Sets/src/mage/cards/m/MonasteryMessenger.java new file mode 100644 index 00000000000..cf0872e16b9 --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MonasteryMessenger.java @@ -0,0 +1,59 @@ +package mage.cards.m; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.PutOnLibraryTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.VigilanceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.filter.common.FilterNoncreatureCard; +import mage.filter.predicate.Predicates; +import mage.target.common.TargetCardInYourGraveyard; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class MonasteryMessenger extends CardImpl { + + private static final FilterCard filter = new FilterNoncreatureCard("noncreature, nonland card from your graveyard"); + + static { + filter.add(Predicates.not(CardType.LAND.getPredicate())); + } + + public MonasteryMessenger(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2/U}{2/R}{2/W}"); + + this.subtype.add(SubType.BIRD); + this.subtype.add(SubType.SCOUT); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Vigilance + this.addAbility(VigilanceAbility.getInstance()); + + // When this creature enters, put up to one target noncreature, nonland card from your graveyard on top of your library. + Ability ability = new EntersBattlefieldTriggeredAbility(new PutOnLibraryTargetEffect(true)); + ability.addTarget(new TargetCardInYourGraveyard(0, 1, filter)); + this.addAbility(ability); + } + + private MonasteryMessenger(final MonasteryMessenger card) { + super(card); + } + + @Override + public MonasteryMessenger copy() { + return new MonasteryMessenger(this); + } +} diff --git a/Mage.Sets/src/mage/cards/n/NarsetsRebuke.java b/Mage.Sets/src/mage/cards/n/NarsetsRebuke.java new file mode 100644 index 00000000000..4aaad825bdb --- /dev/null +++ b/Mage.Sets/src/mage/cards/n/NarsetsRebuke.java @@ -0,0 +1,39 @@ +package mage.cards.n; + +import mage.Mana; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.ExileTargetIfDiesEffect; +import mage.abilities.effects.mana.BasicManaEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class NarsetsRebuke extends CardImpl { + + public NarsetsRebuke(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{4}{R}"); + + // Narset's Rebuke deals 5 damage to target creature. Add {U}{R}{W}. If that creature would die this turn, exile it instead. + this.getSpellAbility().addEffect(new DamageTargetEffect(5)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + this.getSpellAbility().addEffect(new BasicManaEffect(new Mana( + 1, 1, 0, 1, 0, 0, 0, 0 + ))); + this.getSpellAbility().addEffect(new ExileTargetIfDiesEffect()); + } + + private NarsetsRebuke(final NarsetsRebuke card) { + super(card); + } + + @Override + public NarsetsRebuke copy() { + return new NarsetsRebuke(this); + } +} diff --git a/Mage.Sets/src/mage/cards/n/NaturesRhythm.java b/Mage.Sets/src/mage/cards/n/NaturesRhythm.java new file mode 100644 index 00000000000..d86db87f2c1 --- /dev/null +++ b/Mage.Sets/src/mage/cards/n/NaturesRhythm.java @@ -0,0 +1,57 @@ +package mage.cards.n; + +import mage.abilities.dynamicvalue.common.GetXValue; +import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; +import mage.abilities.keyword.HarmonizeAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.FilterCard; +import mage.filter.common.FilterCreatureCard; +import mage.filter.predicate.ObjectSourcePlayer; +import mage.filter.predicate.ObjectSourcePlayerPredicate; +import mage.game.Game; +import mage.target.common.TargetCardInLibrary; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class NaturesRhythm extends CardImpl { + + private static final FilterCard filter = new FilterCreatureCard("a creature card with mana value X or less"); + + static { + filter.add(NaturesRhythmPredicate.instance); + } + + public NaturesRhythm(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{G}{G}"); + + // Search your library for a creature card with mana value X or less, put it onto the battlefield, then shuffle. + this.getSpellAbility().addEffect(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter))); + + // Harmonize {X}{G}{G}{G}{G} + this.addAbility(new HarmonizeAbility(this, "{X}{G}{G}{G}{G}")); + } + + private NaturesRhythm(final NaturesRhythm card) { + super(card); + } + + @Override + public NaturesRhythm copy() { + return new NaturesRhythm(this); + } +} + +enum NaturesRhythmPredicate implements ObjectSourcePlayerPredicate { + instance; + + @Override + public boolean apply(ObjectSourcePlayer input, Game game) { + return input.getObject().getManaValue() <= GetXValue.instance.calculate(game, input.getSource(), null); + } +} diff --git a/Mage.Sets/src/mage/cards/n/NerivHeartOfTheStorm.java b/Mage.Sets/src/mage/cards/n/NerivHeartOfTheStorm.java new file mode 100644 index 00000000000..d4cb8150530 --- /dev/null +++ b/Mage.Sets/src/mage/cards/n/NerivHeartOfTheStorm.java @@ -0,0 +1,87 @@ +package mage.cards.n; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.util.CardUtil; + +import java.util.Optional; +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class NerivHeartOfTheStorm extends CardImpl { + + public NerivHeartOfTheStorm(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{W}{B}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.SPIRIT); + this.subtype.add(SubType.DRAGON); + this.power = new MageInt(4); + this.toughness = new MageInt(5); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // If a creature you control that entered this turn would deal damage, it deals twice that much damage instead. + this.addAbility(new SimpleStaticAbility(new NerivHeartOfTheStormEffect())); + } + + private NerivHeartOfTheStorm(final NerivHeartOfTheStorm card) { + super(card); + } + + @Override + public NerivHeartOfTheStorm copy() { + return new NerivHeartOfTheStorm(this); + } +} + +class NerivHeartOfTheStormEffect extends ReplacementEffectImpl { + + NerivHeartOfTheStormEffect() { + super(Duration.WhileOnBattlefield, Outcome.Damage); + staticText = "if a creature you control that entered this turn would deal damage, it deals twice that much damage instead"; + } + + private NerivHeartOfTheStormEffect(final NerivHeartOfTheStormEffect effect) { + super(effect); + } + + @Override + public NerivHeartOfTheStormEffect copy() { + return new NerivHeartOfTheStormEffect(this); + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.DAMAGE_PERMANENT || + event.getType() == GameEvent.EventType.DAMAGE_PLAYER; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + return Optional + .ofNullable(game.getPermanentOrLKIBattlefield(event.getSourceId())) + .map(permanent -> permanent.isCreature(game) + && permanent.getTurnsOnBattlefield() == 0 + && permanent.isControlledBy(source.getControllerId())) + .orElse(false); + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + event.setAmount(CardUtil.overflowMultiply(event.getAmount(), 2)); + return false; + } + +} diff --git a/Mage.Sets/src/mage/cards/o/OsseousExhale.java b/Mage.Sets/src/mage/cards/o/OsseousExhale.java new file mode 100644 index 00000000000..5323451fb8a --- /dev/null +++ b/Mage.Sets/src/mage/cards/o/OsseousExhale.java @@ -0,0 +1,43 @@ +package mage.cards.o; + +import mage.abilities.condition.common.BeheldDragonCondition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.keyword.BeholdDragonAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetAttackingOrBlockingCreature; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class OsseousExhale extends CardImpl { + + public OsseousExhale(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{W}"); + + // As an additional cost to cast this spell, you may behold a Dragon. + this.addAbility(new BeholdDragonAbility()); + + // Osseous Exhale deals 5 damage to target attacking or blocking creature. If a Dragon was beheld, you gain 2 life. + this.getSpellAbility().addEffect(new DamageTargetEffect(5)); + this.getSpellAbility().addTarget(new TargetAttackingOrBlockingCreature()); + this.getSpellAbility().addEffect(new ConditionalOneShotEffect( + new GainLifeEffect(2), BeheldDragonCondition.instance, + "if a Dragon was beheld, you gain 2 life" + )); + } + + private OsseousExhale(final OsseousExhale card) { + super(card); + } + + @Override + public OsseousExhale copy() { + return new OsseousExhale(this); + } +} diff --git a/Mage.Sets/src/mage/cards/p/PiercingExhale.java b/Mage.Sets/src/mage/cards/p/PiercingExhale.java new file mode 100644 index 00000000000..b9a1ef912a0 --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/PiercingExhale.java @@ -0,0 +1,45 @@ +package mage.cards.p; + +import mage.abilities.condition.common.BeheldDragonCondition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.common.DamageWithPowerFromOneToAnotherTargetEffect; +import mage.abilities.effects.keyword.SurveilEffect; +import mage.abilities.keyword.BeholdDragonAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetControlledCreaturePermanent; +import mage.target.common.TargetCreatureOrPlaneswalker; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class PiercingExhale extends CardImpl { + + public PiercingExhale(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{G}"); + + // As an additional cost to cast this spell, you may behold a Dragon. + this.addAbility(new BeholdDragonAbility()); + + // Target creature you control deals damage equal to its power to target creature or planeswalker. If a Dragon was beheld, surveil 2. + this.getSpellAbility().addEffect(new DamageWithPowerFromOneToAnotherTargetEffect()); + this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent()); + this.getSpellAbility().addTarget(new TargetCreatureOrPlaneswalker()); + this.getSpellAbility().addEffect(new ConditionalOneShotEffect( + new SurveilEffect(2), BeheldDragonCondition.instance, + "if a Dragon was beheld, surveil 2" + )); + } + + private PiercingExhale(final PiercingExhale card) { + super(card); + } + + @Override + public PiercingExhale copy() { + return new PiercingExhale(this); + } +} diff --git a/Mage.Sets/src/mage/cards/r/RebelliousStrike.java b/Mage.Sets/src/mage/cards/r/RebelliousStrike.java new file mode 100644 index 00000000000..eb8f9dc6c2e --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RebelliousStrike.java @@ -0,0 +1,36 @@ +package mage.cards.r; + +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class RebelliousStrike extends CardImpl { + + public RebelliousStrike(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{W}"); + + // Target creature gets +3/+0 until end of turn. + this.getSpellAbility().addEffect(new BoostTargetEffect(3, 0)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + + // Draw a card. + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1).concatBy("
")); + } + + private RebelliousStrike(final RebelliousStrike card) { + super(card); + } + + @Override + public RebelliousStrike copy() { + return new RebelliousStrike(this); + } +} diff --git a/Mage.Sets/src/mage/cards/r/RoamersRoutine.java b/Mage.Sets/src/mage/cards/r/RoamersRoutine.java new file mode 100644 index 00000000000..b27028f0054 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RoamersRoutine.java @@ -0,0 +1,36 @@ +package mage.cards.r; + +import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; +import mage.abilities.keyword.HarmonizeAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.StaticFilters; +import mage.target.common.TargetCardInLibrary; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class RoamersRoutine extends CardImpl { + + public RoamersRoutine(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{G}"); + + // Search your library for a basic land card, put it onto the battlefield tapped, then shuffle. + this.getSpellAbility().addEffect(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(StaticFilters.FILTER_CARD_BASIC_LAND), true)); + + // Harmonize {4}{G} + this.addAbility(new HarmonizeAbility(this, "{4}{G}")); + } + + private RoamersRoutine(final RoamersRoutine card) { + super(card); + } + + @Override + public RoamersRoutine copy() { + return new RoamersRoutine(this); + } +} diff --git a/Mage.Sets/src/mage/cards/r/RoarOfEndlessSong.java b/Mage.Sets/src/mage/cards/r/RoarOfEndlessSong.java new file mode 100644 index 00000000000..bc52ca9988f --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RoarOfEndlessSong.java @@ -0,0 +1,84 @@ +package mage.cards.r; + +import mage.abilities.Ability; +import mage.abilities.common.SagaAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SagaChapter; +import mage.constants.SubType; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.permanent.token.Elephant55Token; +import mage.target.targetpointer.FixedTarget; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class RoarOfEndlessSong extends CardImpl { + + public RoarOfEndlessSong(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}{U}{R}"); + + this.subtype.add(SubType.SAGA); + + // (As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.) + SagaAbility sagaAbility = new SagaAbility(this); + + // I, II -- Create a 5/5 green Elephant creature token. + sagaAbility.addChapterEffect( + this, SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_II, + new CreateTokenEffect(new Elephant55Token())); + + // III -- Double the power and toughness of each creature you control until end of turn. + sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III, new RoarOfEndlessSongEffect()); + this.addAbility(sagaAbility); + } + + private RoarOfEndlessSong(final RoarOfEndlessSong card) { + super(card); + } + + @Override + public RoarOfEndlessSong copy() { + return new RoarOfEndlessSong(this); + } +} + +class RoarOfEndlessSongEffect extends OneShotEffect { + + RoarOfEndlessSongEffect() { + super(Outcome.Benefit); + staticText = "double the power and toughness of each creature you control until end of turn"; + } + + private RoarOfEndlessSongEffect(final RoarOfEndlessSongEffect effect) { + super(effect); + } + + @Override + public RoarOfEndlessSongEffect copy() { + return new RoarOfEndlessSongEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + for (Permanent permanent : game.getBattlefield().getActivePermanents( + StaticFilters.FILTER_CONTROLLED_CREATURE, + source.getControllerId(), source, game + )) { + game.addEffect(new BoostTargetEffect( + permanent.getPower().getValue(), + permanent.getToughness().getValue() + ).setTargetPointer(new FixedTarget(permanent, game)), source); + } + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/s/SaltRoadPackbeast.java b/Mage.Sets/src/mage/cards/s/SaltRoadPackbeast.java new file mode 100644 index 00000000000..31c7d247038 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SaltRoadPackbeast.java @@ -0,0 +1,47 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.dynamicvalue.common.CreaturesYouControlCount; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.cost.SpellCostReductionForEachSourceEffect; +import mage.abilities.hint.common.CreaturesYouControlHint; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class SaltRoadPackbeast extends CardImpl { + + public SaltRoadPackbeast(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{W}"); + + this.subtype.add(SubType.BEAST); + this.power = new MageInt(4); + this.toughness = new MageInt(3); + + // This spell costs {1} less to cast for each creature you control. + this.addAbility(new SimpleStaticAbility( + Zone.ALL, new SpellCostReductionForEachSourceEffect(1, CreaturesYouControlCount.instance) + ).addHint(CreaturesYouControlHint.instance)); + + // When this creature enters, draw a card. + this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1))); + } + + private SaltRoadPackbeast(final SaltRoadPackbeast card) { + super(card); + } + + @Override + public SaltRoadPackbeast copy() { + return new SaltRoadPackbeast(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SeizeOpportunity.java b/Mage.Sets/src/mage/cards/s/SeizeOpportunity.java new file mode 100644 index 00000000000..604d887a89a --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SeizeOpportunity.java @@ -0,0 +1,38 @@ +package mage.cards.s; + +import mage.abilities.Mode; +import mage.abilities.effects.common.ExileTopXMayPlayUntilEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class SeizeOpportunity extends CardImpl { + + public SeizeOpportunity(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{R}"); + + // Choose one -- + // * Exile the top two cards of your library. Until the end of your next turn, you may play those cards. + this.getSpellAbility().addEffect(new ExileTopXMayPlayUntilEffect(2, Duration.UntilEndOfYourNextTurn)); + + // * Up to two target creatures each get +2/+1 until end of turn. + this.getSpellAbility().addMode(new Mode(new BoostTargetEffect(2, 1)).addTarget(new TargetCreaturePermanent(0, 2))); + } + + private SeizeOpportunity(final SeizeOpportunity card) { + super(card); + } + + @Override + public SeizeOpportunity copy() { + return new SeizeOpportunity(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/ShockingSharpshooter.java b/Mage.Sets/src/mage/cards/s/ShockingSharpshooter.java new file mode 100644 index 00000000000..4a11ebfb60e --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/ShockingSharpshooter.java @@ -0,0 +1,49 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.keyword.ReachAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.StaticFilters; +import mage.target.common.TargetOpponent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class ShockingSharpshooter extends CardImpl { + + public ShockingSharpshooter(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.ARCHER); + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // Reach + this.addAbility(ReachAbility.getInstance()); + + // Whenever another creature you control enters, this creature deals 1 damage to target opponent. + Ability ability = new EntersBattlefieldAllTriggeredAbility( + new DamageTargetEffect(1), StaticFilters.FILTER_ANOTHER_CREATURE_YOU_CONTROL + ); + ability.addTarget(new TargetOpponent()); + this.addAbility(ability); + } + + private ShockingSharpshooter(final ShockingSharpshooter card) { + super(card); + } + + @Override + public ShockingSharpshooter copy() { + return new ShockingSharpshooter(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SinkholeSurveyor.java b/Mage.Sets/src/mage/cards/s/SinkholeSurveyor.java new file mode 100644 index 00000000000..f6fe5ad7989 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SinkholeSurveyor.java @@ -0,0 +1,46 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.effects.common.LoseLifeSourceControllerEffect; +import mage.abilities.effects.keyword.EndureSourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class SinkholeSurveyor extends CardImpl { + + public SinkholeSurveyor(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}"); + + this.subtype.add(SubType.BIRD); + this.subtype.add(SubType.SCOUT); + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Whenever this creature attacks, you lose 1 life and this creature endures 1. + Ability ability = new AttacksTriggeredAbility(new LoseLifeSourceControllerEffect(1)); + ability.addEffect(new EndureSourceEffect(1, "{this}").concatBy("and")); + this.addAbility(ability); + } + + private SinkholeSurveyor(final SinkholeSurveyor card) { + super(card); + } + + @Override + public SinkholeSurveyor copy() { + return new SinkholeSurveyor(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SpectralDenial.java b/Mage.Sets/src/mage/cards/s/SpectralDenial.java new file mode 100644 index 00000000000..78487a657cb --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SpectralDenial.java @@ -0,0 +1,56 @@ +package mage.cards.s; + +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.GetXValue; +import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; +import mage.abilities.effects.common.CounterUnlessPaysEffect; +import mage.abilities.effects.common.cost.SpellCostReductionForEachSourceEffect; +import mage.abilities.hint.Hint; +import mage.abilities.hint.ValueHint; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.ComparisonType; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.mageobject.PowerPredicate; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class SpectralDenial extends CardImpl { + + private static final FilterPermanent filter = new FilterControlledCreaturePermanent("creature you control with power 4 or greater"); + + static { + filter.add(new PowerPredicate(ComparisonType.MORE_THAN, 3)); + } + + private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(filter, 1); + private static final Hint hint = new ValueHint("Creatures you control with power 4 or greater", xValue); + + public SpectralDenial(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{U}"); + + // This spell costs {1} less to cast for each creature you control with power 4 or greater. + this.addAbility(new SimpleStaticAbility( + Zone.ALL, new SpellCostReductionForEachSourceEffect(1, xValue) + ).addHint(hint)); + + // Counter target spell unless its controller pays {X}. + this.getSpellAbility().addEffect(new CounterUnlessPaysEffect(GetXValue.instance)); + } + + private SpectralDenial(final SpectralDenial card) { + super(card); + } + + @Override + public SpectralDenial copy() { + return new SpectralDenial(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SultaiDevotee.java b/Mage.Sets/src/mage/cards/s/SultaiDevotee.java new file mode 100644 index 00000000000..b158e7e20c4 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SultaiDevotee.java @@ -0,0 +1,47 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.mana.AddManaFromColorChoicesEffect; +import mage.abilities.keyword.DeathtouchAbility; +import mage.abilities.mana.LimitedTimesPerTurnActivatedManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.ManaType; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class SultaiDevotee extends CardImpl { + + public SultaiDevotee(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}"); + + this.subtype.add(SubType.ZOMBIE); + this.subtype.add(SubType.SNAKE); + this.subtype.add(SubType.DRUID); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Deathtouch + this.addAbility(DeathtouchAbility.getInstance()); + + // {1}: Add {B}, {G}, or {U}. Activate only once each turn. + this.addAbility(new LimitedTimesPerTurnActivatedManaAbility( + new AddManaFromColorChoicesEffect(ManaType.BLACK, ManaType.GREEN, ManaType.BLUE), new GenericManaCost(1) + )); + } + + private SultaiDevotee(final SultaiDevotee card) { + super(card); + } + + @Override + public SultaiDevotee copy() { + return new SultaiDevotee(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SultaiMonument.java b/Mage.Sets/src/mage/cards/s/SultaiMonument.java new file mode 100644 index 00000000000..78d508fdeb0 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SultaiMonument.java @@ -0,0 +1,64 @@ +package mage.cards.s; + +import mage.abilities.Ability; +import mage.abilities.common.ActivateAsSorceryActivatedAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; +import mage.game.permanent.token.ZombieDruidToken; +import mage.target.common.TargetCardInLibrary; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class SultaiMonument extends CardImpl { + + private static final FilterCard filter = new FilterCard("a basic Swamp, Forest, or Island card"); + + static { + filter.add(SuperType.BASIC.getPredicate()); + filter.add(Predicates.or( + SubType.SWAMP.getPredicate(), + SubType.FOREST.getPredicate(), + SubType.ISLAND.getPredicate() + )); + } + + public SultaiMonument(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}"); + + // When this artifact enters, search your library for a basic Swamp, Forest, or Island card, reveal it, put it into your hand, then shuffle. + this.addAbility(new EntersBattlefieldTriggeredAbility( + new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true) + )); + + // {2}{B}{G}{U}, {T}, Sacrifice this artifact: Create two 2/2 black Zombie Druid creature tokens. Activate only as a sorcery. + Ability ability = new ActivateAsSorceryActivatedAbility( + new CreateTokenEffect(new ZombieDruidToken(), 2), new ManaCostsImpl<>("{2}{B}{G}{U}") + ); + ability.addCost(new TapSourceCost()); + ability.addCost(new SacrificeSourceCost()); + this.addAbility(ability); + } + + private SultaiMonument(final SultaiMonument card) { + super(card); + } + + @Override + public SultaiMonument copy() { + return new SultaiMonument(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SunsetStrikemaster.java b/Mage.Sets/src/mage/cards/s/SunsetStrikemaster.java new file mode 100644 index 00000000000..e1c674adb5e --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SunsetStrikemaster.java @@ -0,0 +1,63 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.mana.RedManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.AbilityPredicate; +import mage.target.TargetPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class SunsetStrikemaster extends CardImpl { + + private static final FilterPermanent filter = new FilterCreaturePermanent("creature with flying"); + + static { + filter.add(new AbilityPredicate(FlyingAbility.class)); + } + + public SunsetStrikemaster(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.MONK); + this.power = new MageInt(3); + this.toughness = new MageInt(1); + + // {T}: Add {R}. + this.addAbility(new RedManaAbility()); + + // {2}{R}, {T}, Sacrifice this creature: It deals 6 damage to target creature with flying. + Ability ability = new SimpleActivatedAbility( + new DamageTargetEffect(6, "it"), new ManaCostsImpl<>("{2}{R}") + ); + ability.addCost(new TapSourceCost()); + ability.addCost(new SacrificeSourceCost()); + ability.addTarget(new TargetPermanent(filter)); + this.addAbility(ability); + } + + private SunsetStrikemaster(final SunsetStrikemaster card) { + super(card); + } + + @Override + public SunsetStrikemaster copy() { + return new SunsetStrikemaster(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SwordOfDungeonsAndDragons.java b/Mage.Sets/src/mage/cards/s/SwordOfDungeonsAndDragons.java index 52ceb304a95..076482c618c 100644 --- a/Mage.Sets/src/mage/cards/s/SwordOfDungeonsAndDragons.java +++ b/Mage.Sets/src/mage/cards/s/SwordOfDungeonsAndDragons.java @@ -1,15 +1,9 @@ - - package mage.cards.s; -import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.DealsDamageToAPlayerAttachedTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.continuous.BoostEquippedEffect; import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; import mage.abilities.keyword.EquipAbility; @@ -18,50 +12,51 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.AttachmentType; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Outcome; -import mage.constants.Zone; +import mage.constants.SubType; import mage.filter.FilterCard; import mage.filter.predicate.Predicates; import mage.game.Game; -import mage.game.events.DamagedPlayerEvent; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; -import mage.game.permanent.Permanent; import mage.game.permanent.token.DragonTokenGold; import mage.players.Player; -import mage.target.common.TargetControlledCreaturePermanent; -import mage.target.targetpointer.FixedTarget; + +import java.util.UUID; /** + * This creates a "gold" token which is represented as a creature with all colors + * as the color gold is not supported in the black-bordered game rules * * @author Saga */ public final class SwordOfDungeonsAndDragons extends CardImpl { - + private static final FilterCard filter = new FilterCard("Rogues and from Clerics"); - static {filter.add(Predicates.or( - SubType.ROGUE.getPredicate(), - SubType.CLERIC.getPredicate() - )); + + static { + filter.add(Predicates.or( + SubType.ROGUE.getPredicate(), + SubType.CLERIC.getPredicate() + )); } public SwordOfDungeonsAndDragons(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); this.subtype.add(SubType.EQUIPMENT); // Equipped creature gets +2/+2 and has protection from Rogues and from Clerics. Ability ability = new SimpleStaticAbility(new BoostEquippedEffect(2, 2)); - Effect effect = new GainAbilityAttachedEffect(new ProtectionAbility(filter), AttachmentType.EQUIPMENT); - effect.setText("and has protection from Rogues and from Clerics"); - ability.addEffect(effect); + ability.addEffect(new GainAbilityAttachedEffect( + new ProtectionAbility(filter), AttachmentType.EQUIPMENT + ).setText("and has protection from Rogues and from Clerics")); this.addAbility(ability); // Whenever equipped creature deals combat damage to a player, you create a 4/4 gold Dragon creature token with flying and roll a d20. If you roll a 20, repeat this process. - this.addAbility(new SwordOfDungeonsAndDragonsAbility()); + this.addAbility(new DealsDamageToAPlayerAttachedTriggeredAbility( + new SwordOfDungeonsAndDragonsEffect(), "equipped creature", false + )); // Equip {2} - this.addAbility(new EquipAbility(Outcome.BoostCreature, new GenericManaCost(2), new TargetControlledCreaturePermanent(), false)); + this.addAbility(new EquipAbility(2)); } private SwordOfDungeonsAndDragons(final SwordOfDungeonsAndDragons card) { @@ -74,49 +69,12 @@ public final class SwordOfDungeonsAndDragons extends CardImpl { } } -class SwordOfDungeonsAndDragonsAbility extends TriggeredAbilityImpl { - - public SwordOfDungeonsAndDragonsAbility() { - super(Zone.BATTLEFIELD, new SwordOfDungeonsAndDragonsEffect(),false); - } - - private SwordOfDungeonsAndDragonsAbility(final SwordOfDungeonsAndDragonsAbility ability) { - super(ability); - } - - @Override - public SwordOfDungeonsAndDragonsAbility copy() { - return new SwordOfDungeonsAndDragonsAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.DAMAGED_PLAYER; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - DamagedPlayerEvent damageEvent = (DamagedPlayerEvent)event; - Permanent p = game.getPermanent(event.getSourceId()); - if (damageEvent.isCombatDamage() && p != null && p.getAttachments().contains(this.getSourceId())) { - for (Effect effect : this.getEffects()) { - effect.setTargetPointer(new FixedTarget(event.getPlayerId())); - } - return true; - } - return false; - } - - @Override - public String getRule() { - return "Whenever equipped creature deals combat damage to a player, you create a 4/4 gold Dragon creature token with flying and roll a d20. If you roll a 20, repeat this process."; - } -} - class SwordOfDungeonsAndDragonsEffect extends OneShotEffect { - - public SwordOfDungeonsAndDragonsEffect() { + + SwordOfDungeonsAndDragonsEffect() { super(Outcome.Benefit); + staticText = "you create a 4/4 gold Dragon creature token with flying " + + "and roll a d20. If you roll a 20, repeat this process"; } private SwordOfDungeonsAndDragonsEffect(final SwordOfDungeonsAndDragonsEffect effect) { @@ -131,16 +89,15 @@ class SwordOfDungeonsAndDragonsEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - int count = 1; - int amount = controller.rollDice(outcome, source, game, 20); - - while (amount == 20) { - count += 1; - amount = controller.rollDice(outcome, source, game, 20); - } - return new CreateTokenEffect(new DragonTokenGold(), count).apply(game, source); + if (controller == null) { + return false; } - return false; + for (int i = 0; i < 1000; i++) { // just in case loop goes too long + new DragonTokenGold().putOntoBattlefield(1, game, source); + if (controller.rollDice(outcome, source, game, 20) != 20) { + break; + } + } + return true; } } diff --git a/Mage.Sets/src/mage/cards/t/TemurDevotee.java b/Mage.Sets/src/mage/cards/t/TemurDevotee.java new file mode 100644 index 00000000000..75181dbab27 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TemurDevotee.java @@ -0,0 +1,46 @@ +package mage.cards.t; + +import mage.MageInt; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.mana.AddManaFromColorChoicesEffect; +import mage.abilities.keyword.DefenderAbility; +import mage.abilities.mana.LimitedTimesPerTurnActivatedManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.ManaType; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class TemurDevotee extends CardImpl { + + public TemurDevotee(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.DRUID); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Defender + this.addAbility(DefenderAbility.getInstance()); + + // {1}: Add {G}, {U}, or {R}. Activate only once each turn. + this.addAbility(new LimitedTimesPerTurnActivatedManaAbility( + new AddManaFromColorChoicesEffect(ManaType.GREEN, ManaType.BLUE, ManaType.RED), new GenericManaCost(1) + )); + } + + private TemurDevotee(final TemurDevotee card) { + super(card); + } + + @Override + public TemurDevotee copy() { + return new TemurDevotee(this); + } +} diff --git a/Mage.Sets/src/mage/cards/t/TemurMonument.java b/Mage.Sets/src/mage/cards/t/TemurMonument.java new file mode 100644 index 00000000000..90e414f7fd1 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TemurMonument.java @@ -0,0 +1,64 @@ +package mage.cards.t; + +import mage.abilities.Ability; +import mage.abilities.common.ActivateAsSorceryActivatedAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; +import mage.game.permanent.token.Elephant55Token; +import mage.target.common.TargetCardInLibrary; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class TemurMonument extends CardImpl { + + private static final FilterCard filter = new FilterCard("a basic Forest, Island, or Mountain card"); + + static { + filter.add(SuperType.BASIC.getPredicate()); + filter.add(Predicates.or( + SubType.FOREST.getPredicate(), + SubType.ISLAND.getPredicate(), + SubType.MOUNTAIN.getPredicate() + )); + } + + public TemurMonument(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}"); + + // When this artifact enters, search your library for a basic Forest, Island, or Mountain card, reveal it, put it into your hand, then shuffle. + this.addAbility(new EntersBattlefieldTriggeredAbility( + new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true) + )); + + // {3}{G}{U}{R}, {T}, Sacrifice this artifact: Create a 5/5 green Elephant creature token. Activate only as a sorcery. + Ability ability = new ActivateAsSorceryActivatedAbility( + new CreateTokenEffect(new Elephant55Token(), 2), new ManaCostsImpl<>("{3}{G}{U}{R}") + ); + ability.addCost(new TapSourceCost()); + ability.addCost(new SacrificeSourceCost()); + this.addAbility(ability); + } + + private TemurMonument(final TemurMonument card) { + super(card); + } + + @Override + public TemurMonument copy() { + return new TemurMonument(this); + } +} diff --git a/Mage.Sets/src/mage/cards/t/TemurTawnyback.java b/Mage.Sets/src/mage/cards/t/TemurTawnyback.java new file mode 100644 index 00000000000..17dc5f52f07 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TemurTawnyback.java @@ -0,0 +1,37 @@ +package mage.cards.t; + +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.DrawDiscardControllerEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class TemurTawnyback extends CardImpl { + + public TemurTawnyback(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2/G}{2/U}{2/R}"); + + this.subtype.add(SubType.BEAST); + this.power = new MageInt(4); + this.toughness = new MageInt(3); + + // When this creature enters, draw a card, then discard a card. + this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawDiscardControllerEffect(1, 1))); + } + + private TemurTawnyback(final TemurTawnyback card) { + super(card); + } + + @Override + public TemurTawnyback copy() { + return new TemurTawnyback(this); + } +} diff --git a/Mage.Sets/src/mage/cards/t/ThranVigil.java b/Mage.Sets/src/mage/cards/t/ThranVigil.java index 8d4a2cad490..8638188717c 100644 --- a/Mage.Sets/src/mage/cards/t/ThranVigil.java +++ b/Mage.Sets/src/mage/cards/t/ThranVigil.java @@ -2,14 +2,13 @@ package mage.cards.t; import mage.abilities.Ability; import mage.abilities.common.CardsLeaveGraveyardTriggeredAbility; -import mage.abilities.condition.common.MyTurnCondition; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.counter.AddCountersTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.counters.CounterType; -import mage.filter.StaticFilters; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; import mage.target.common.TargetControlledCreaturePermanent; import java.util.UUID; @@ -19,16 +18,21 @@ import java.util.UUID; */ public final class ThranVigil extends CardImpl { + private static final FilterCard filter = new FilterCard("artifact and/or creature cards"); + + static { + filter.add(Predicates.or( + CardType.ARTIFACT.getPredicate(), + CardType.CREATURE.getPredicate() + )); + } + public ThranVigil(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}"); // Whenever one or more artifact and/or creature cards leave your graveyard during your turn, put a +1/+1 counter on target creature you control. - Ability ability = new ConditionalInterveningIfTriggeredAbility( - new CardsLeaveGraveyardTriggeredAbility( - new AddCountersTargetEffect(CounterType.P1P1.createInstance()), - StaticFilters.FILTER_CARD_ARTIFACT_OR_CREATURE - ), MyTurnCondition.instance, "Whenever one or more artifact and/or creature cards " + - "leave your graveyard during your turn, put a +1/+1 counter on target creature you control." + Ability ability = new CardsLeaveGraveyardTriggeredAbility( + new AddCountersTargetEffect(CounterType.P1P1.createInstance()), filter, true ); ability.addTarget(new TargetControlledCreaturePermanent()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/u/UginEyeOfTheStorms.java b/Mage.Sets/src/mage/cards/u/UginEyeOfTheStorms.java new file mode 100644 index 00000000000..2b10993f2b2 --- /dev/null +++ b/Mage.Sets/src/mage/cards/u/UginEyeOfTheStorms.java @@ -0,0 +1,126 @@ +package mage.cards.u; + +import mage.Mana; +import mage.abilities.Ability; +import mage.abilities.LoyaltyAbility; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CastSourceTriggeredAbility; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.effects.common.asthought.PlayFromNotOwnHandZoneTargetEffect; +import mage.abilities.effects.mana.BasicManaEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.cards.CardsImpl; +import mage.constants.*; +import mage.filter.FilterCard; +import mage.filter.FilterPermanent; +import mage.filter.FilterSpell; +import mage.filter.common.FilterNonlandCard; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.ColorlessPredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetPermanent; +import mage.target.common.TargetCardInLibrary; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class UginEyeOfTheStorms extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("permanent that's one or more colors"); + private static final FilterSpell filter2 = new FilterSpell("a colorless spell"); + + static { + filter.add(Predicates.not(ColorlessPredicate.instance)); + filter2.add(ColorlessPredicate.instance); + } + + public UginEyeOfTheStorms(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{7}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.UGIN); + this.setStartingLoyalty(7); + + // When you cast this spell, exile up to one target permanent that's one or more colors. + Ability ability = new CastSourceTriggeredAbility(new ExileTargetEffect()); + ability.addTarget(new TargetPermanent(0, 1, filter)); + this.addAbility(ability); + + // Whenever you cast a colorless spell, exile up to one target permanent that's one or more colors. + ability = new SpellCastControllerTriggeredAbility(new ExileTargetEffect(), filter2, false); + ability.addTarget(new TargetPermanent(0, 1, filter)); + this.addAbility(ability); + + // +2: You gain 3 life and draw a card. + ability = new LoyaltyAbility(new GainLifeEffect(3), 2); + ability.addEffect(new DrawCardSourceControllerEffect(1).concatBy("and")); + this.addAbility(ability); + + // 0: Add {C}{C}{C}. + this.addAbility(new LoyaltyAbility(new BasicManaEffect(Mana.ColorlessMana(3)), 0)); + + // -11: Search your library for any number of colorless nonland cards, exile them, then shuffle. Until end of turn, you may cast those cards without paying their mana costs. + this.addAbility(new LoyaltyAbility(new UginEyeOfTheStormsEffect(), -11)); + } + + private UginEyeOfTheStorms(final UginEyeOfTheStorms card) { + super(card); + } + + @Override + public UginEyeOfTheStorms copy() { + return new UginEyeOfTheStorms(this); + } +} + +class UginEyeOfTheStormsEffect extends OneShotEffect { + + private static final FilterCard filter = new FilterNonlandCard("colorless nonland cards"); + + static { + filter.add(ColorlessPredicate.instance); + } + + UginEyeOfTheStormsEffect() { + super(Outcome.Benefit); + staticText = "search your library for any number of colorless nonland cards, exile them, then shuffle. " + + "Until end of turn, you may cast those cards without paying their mana costs"; + } + + private UginEyeOfTheStormsEffect(final UginEyeOfTheStormsEffect effect) { + super(effect); + } + + @Override + public UginEyeOfTheStormsEffect copy() { + return new UginEyeOfTheStormsEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player == null) { + return false; + } + TargetCardInLibrary target = new TargetCardInLibrary(0, Integer.MAX_VALUE, filter); + player.searchLibrary(target, source, game); + Cards cards = new CardsImpl(target.getTargets()); + cards.retainZone(Zone.LIBRARY, game); + if (!cards.isEmpty()) { + PlayFromNotOwnHandZoneTargetEffect.exileAndPlayFromExile( + game, source, cards.getCards(game), TargetController.YOU, + Duration.EndOfTurn, true, false, true + ); + } + player.shuffleLibrary(source, game); + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/u/UnderfootUnderdogs.java b/Mage.Sets/src/mage/cards/u/UnderfootUnderdogs.java new file mode 100644 index 00000000000..6c57550fe6b --- /dev/null +++ b/Mage.Sets/src/mage/cards/u/UnderfootUnderdogs.java @@ -0,0 +1,60 @@ +package mage.cards.u; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.combat.CantBeBlockedTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.ComparisonType; +import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.mageobject.PowerPredicate; +import mage.game.permanent.token.GoblinToken; +import mage.target.TargetPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class UnderfootUnderdogs extends CardImpl { + + private static final FilterPermanent filter + = new FilterControlledCreaturePermanent("creature you control with power 2 or less"); + + static { + filter.add(new PowerPredicate(ComparisonType.FEWER_THAN, 3)); + } + + public UnderfootUnderdogs(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}"); + + this.subtype.add(SubType.GOBLIN); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(1); + this.toughness = new MageInt(2); + + // When this creature enters, create a 1/1 red Goblin creature token. + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new GoblinToken()))); + + // {1}, {T}: Target creature you control with power 2 or less can't be blocked this turn. + Ability ability = new SimpleActivatedAbility(new CantBeBlockedTargetEffect(), new GenericManaCost(1)); + ability.addTarget(new TargetPermanent(filter)); + this.addAbility(ability); + } + + private UnderfootUnderdogs(final UnderfootUnderdogs card) { + super(card); + } + + @Override + public UnderfootUnderdogs copy() { + return new UnderfootUnderdogs(this); + } +} diff --git a/Mage.Sets/src/mage/cards/u/UnendingWhisper.java b/Mage.Sets/src/mage/cards/u/UnendingWhisper.java new file mode 100644 index 00000000000..80f8f4beeb5 --- /dev/null +++ b/Mage.Sets/src/mage/cards/u/UnendingWhisper.java @@ -0,0 +1,34 @@ +package mage.cards.u; + +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.keyword.HarmonizeAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class UnendingWhisper extends CardImpl { + + public UnendingWhisper(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{U}"); + + // Draw a card. + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); + + // Harmonize {5}{U} + this.addAbility(new HarmonizeAbility(this, "{5}{U}")); + } + + private UnendingWhisper(final UnendingWhisper card) { + super(card); + } + + @Override + public UnendingWhisper copy() { + return new UnendingWhisper(this); + } +} diff --git a/Mage.Sets/src/mage/cards/u/UnitedBattlefront.java b/Mage.Sets/src/mage/cards/u/UnitedBattlefront.java new file mode 100644 index 00000000000..6822ee42687 --- /dev/null +++ b/Mage.Sets/src/mage/cards/u/UnitedBattlefront.java @@ -0,0 +1,47 @@ +package mage.cards.u; + +import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.ComparisonType; +import mage.constants.PutCards; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.ManaValuePredicate; +import mage.filter.predicate.mageobject.PermanentPredicate; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class UnitedBattlefront extends CardImpl { + + private static final FilterCard filter = new FilterCard("noncreature, nonland permanent cards with mana value 3 or less"); + + static { + filter.add(Predicates.not(CardType.CREATURE.getPredicate())); + filter.add(Predicates.not(CardType.LAND.getPredicate())); + filter.add(PermanentPredicate.instance); + filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, 4)); + } + + public UnitedBattlefront(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{W}"); + + // Look at the top seven cards of your library. Put up to two noncreature, nonland permanent cards with mana value 3 or less from among them onto the battlefield. Put the rest on the bottom of your library in a random order. + this.getSpellAbility().addEffect(new LookLibraryAndPickControllerEffect( + 7, 1, filter, PutCards.BATTLEFIELD, PutCards.BOTTOM_RANDOM + )); + } + + private UnitedBattlefront(final UnitedBattlefront card) { + super(card); + } + + @Override + public UnitedBattlefront copy() { + return new UnitedBattlefront(this); + } +} diff --git a/Mage.Sets/src/mage/cards/u/UnsparingBoltcaster.java b/Mage.Sets/src/mage/cards/u/UnsparingBoltcaster.java new file mode 100644 index 00000000000..b9bfc685171 --- /dev/null +++ b/Mage.Sets/src/mage/cards/u/UnsparingBoltcaster.java @@ -0,0 +1,52 @@ +package mage.cards.u; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterOpponentsCreaturePermanent; +import mage.filter.predicate.permanent.WasDealtDamageThisTurnPredicate; +import mage.target.TargetPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class UnsparingBoltcaster extends CardImpl { + + private static final FilterPermanent filter + = new FilterOpponentsCreaturePermanent("creature an opponent controls that was dealt damage this turn"); + + static { + filter.add(WasDealtDamageThisTurnPredicate.instance); + } + + public UnsparingBoltcaster(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}"); + + this.subtype.add(SubType.OGRE); + this.subtype.add(SubType.WIZARD); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // When this creature enters, it deals 5 damage to target creature an opponent controls that was dealt damage this turn. + Ability ability = new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(5)); + ability.addTarget(new TargetPermanent(filter)); + this.addAbility(ability); + } + + private UnsparingBoltcaster(final UnsparingBoltcaster card) { + super(card); + } + + @Override + public UnsparingBoltcaster copy() { + return new UnsparingBoltcaster(this); + } +} diff --git a/Mage.Sets/src/mage/cards/u/UrenisRebuff.java b/Mage.Sets/src/mage/cards/u/UrenisRebuff.java new file mode 100644 index 00000000000..b426d4f7ff3 --- /dev/null +++ b/Mage.Sets/src/mage/cards/u/UrenisRebuff.java @@ -0,0 +1,36 @@ +package mage.cards.u; + +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.abilities.keyword.HarmonizeAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class UrenisRebuff extends CardImpl { + + public UrenisRebuff(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{U}"); + + // Return target creature to its owner's hand. + this.getSpellAbility().addEffect(new ReturnToHandTargetEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + + // Harmonize {5}{U} + this.addAbility(new HarmonizeAbility(this, "{5}{U}")); + } + + private UrenisRebuff(final UrenisRebuff card) { + super(card); + } + + @Override + public UrenisRebuff copy() { + return new UrenisRebuff(this); + } +} diff --git a/Mage.Sets/src/mage/cards/w/WingspanStride.java b/Mage.Sets/src/mage/cards/w/WingspanStride.java new file mode 100644 index 00000000000..41c42f11c7e --- /dev/null +++ b/Mage.Sets/src/mage/cards/w/WingspanStride.java @@ -0,0 +1,59 @@ +package mage.cards.w; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.ReturnToHandSourceEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class WingspanStride extends CardImpl { + + public WingspanStride(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{U}"); + + this.subtype.add(SubType.AURA); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + this.addAbility(new EnchantAbility(auraTarget)); + + // Enchanted creature gets +1/+1 and has flying. + Ability ability = new SimpleStaticAbility(new BoostEnchantedEffect(1, 1)); + ability.addEffect(new GainAbilityAttachedEffect( + FlyingAbility.getInstance(), AttachmentType.AURA + ).setText("and has flying")); + this.addAbility(ability); + + // {2}{U}: Return this Aura to its owner's hand. + this.addAbility(new SimpleActivatedAbility(new ReturnToHandSourceEffect(), new ManaCostsImpl<>("{2}{U}"))); + } + + private WingspanStride(final WingspanStride card) { + super(card); + } + + @Override + public WingspanStride copy() { + return new WingspanStride(this); + } +} diff --git a/Mage.Sets/src/mage/cards/w/WinternightStories.java b/Mage.Sets/src/mage/cards/w/WinternightStories.java new file mode 100644 index 00000000000..cacbd2bd07a --- /dev/null +++ b/Mage.Sets/src/mage/cards/w/WinternightStories.java @@ -0,0 +1,43 @@ +package mage.cards.w; + +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.effects.common.DoIfCostPaid; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.discard.DiscardControllerEffect; +import mage.abilities.keyword.HarmonizeAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.StaticFilters; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class WinternightStories extends CardImpl { + + public WinternightStories(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{U}"); + + // Draw three cards. Then discard two cards unless you discard a creature card. + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(3)); + this.getSpellAbility().addEffect(new DoIfCostPaid( + null, new DiscardControllerEffect(2), + new DiscardCardCost(StaticFilters.FILTER_CARD_CREATURE) + .setText("discard a creature card instead of discarding two cards") + ).setText("Then discard two cards unless you discard a creature card")); + + // Harmonize {4}{U} + this.addAbility(new HarmonizeAbility(this, "{4}{U}")); + } + + private WinternightStories(final WinternightStories card) { + super(card); + } + + @Override + public WinternightStories copy() { + return new WinternightStories(this); + } +} diff --git a/Mage.Sets/src/mage/cards/w/WorthyCost.java b/Mage.Sets/src/mage/cards/w/WorthyCost.java new file mode 100644 index 00000000000..f7520ee460b --- /dev/null +++ b/Mage.Sets/src/mage/cards/w/WorthyCost.java @@ -0,0 +1,37 @@ +package mage.cards.w; + +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.StaticFilters; +import mage.target.common.TargetCreatureOrPlaneswalker; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class WorthyCost extends CardImpl { + + public WorthyCost(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{B}"); + + // As an additional cost to cast this spell, sacrifice a creature. + this.getSpellAbility().addCost(new SacrificeTargetCost(StaticFilters.FILTER_PERMANENT_CREATURE)); + + // Exile target creature or planeswalker. + this.getSpellAbility().addEffect(new ExileTargetEffect()); + this.getSpellAbility().addTarget(new TargetCreatureOrPlaneswalker()); + } + + private WorthyCost(final WorthyCost card) { + super(card); + } + + @Override + public WorthyCost copy() { + return new WorthyCost(this); + } +} diff --git a/Mage.Sets/src/mage/cards/y/YathanTombguard.java b/Mage.Sets/src/mage/cards/y/YathanTombguard.java new file mode 100644 index 00000000000..7a86dbcaaa0 --- /dev/null +++ b/Mage.Sets/src/mage/cards/y/YathanTombguard.java @@ -0,0 +1,60 @@ +package mage.cards.y; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.DealsDamageToAPlayerAllTriggeredAbility; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.LoseLifeSourceControllerEffect; +import mage.abilities.keyword.MenaceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SetTargetPointer; +import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.permanent.CounterAnyPredicate; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class YathanTombguard extends CardImpl { + + private static final FilterPermanent filter + = new FilterControlledCreaturePermanent("a creature you control with a counter on it"); + + static { + filter.add(CounterAnyPredicate.instance); + } + + public YathanTombguard(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // Menace + this.addAbility(new MenaceAbility()); + + // Whenever a creature you control with a counter on it deals combat damage to a player, you draw a card and you lose 1 life. + Ability ability = new DealsDamageToAPlayerAllTriggeredAbility( + new DrawCardSourceControllerEffect(1, true), + filter, false, SetTargetPointer.NONE, true + ); + ability.addEffect(new LoseLifeSourceControllerEffect(1).concatBy("and")); + this.addAbility(ability); + } + + private YathanTombguard(final YathanTombguard card) { + super(card); + } + + @Override + public YathanTombguard copy() { + return new YathanTombguard(this); + } +} diff --git a/Mage.Sets/src/mage/cards/z/ZurgosVanguard.java b/Mage.Sets/src/mage/cards/z/ZurgosVanguard.java new file mode 100644 index 00000000000..e9eef44b566 --- /dev/null +++ b/Mage.Sets/src/mage/cards/z/ZurgosVanguard.java @@ -0,0 +1,44 @@ +package mage.cards.z; + +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.dynamicvalue.common.CreaturesYouControlCount; +import mage.abilities.effects.common.continuous.SetBasePowerSourceEffect; +import mage.abilities.keyword.MobilizeAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class ZurgosVanguard extends CardImpl { + + public ZurgosVanguard(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}"); + + this.subtype.add(SubType.DOG); + this.subtype.add(SubType.SOLDIER); + this.power = new MageInt(0); + this.toughness = new MageInt(3); + + // Mobilize 1 + this.addAbility(new MobilizeAbility(1)); + + // This creature's power is equal to the number of creatures you control. + this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetBasePowerSourceEffect(CreaturesYouControlCount.instance))); + } + + private ZurgosVanguard(final ZurgosVanguard card) { + super(card); + } + + @Override + public ZurgosVanguard copy() { + return new ZurgosVanguard(this); + } +} diff --git a/Mage.Sets/src/mage/sets/TarkirDragonstorm.java b/Mage.Sets/src/mage/sets/TarkirDragonstorm.java index 8ea4ca645cc..0afdfafe8bc 100644 --- a/Mage.Sets/src/mage/sets/TarkirDragonstorm.java +++ b/Mage.Sets/src/mage/sets/TarkirDragonstorm.java @@ -4,11 +4,15 @@ import mage.cards.ExpansionSet; import mage.constants.Rarity; import mage.constants.SetType; +import java.util.Arrays; +import java.util.List; + /** * @author TheElk801 */ public final class TarkirDragonstorm extends ExpansionSet { + private static final List unfinished = Arrays.asList("Channeled Dragonfire", "Glacial Dragonhunt", "Mammoth Bellow", "Nature's Rhythm", "Roamer's Routine", "Songcrafter Mage", "Synchronized Charge", "Unending Whisper", "Ureni's Rebuff", "Winternight Stories"); private static final TarkirDragonstorm instance = new TarkirDragonstorm(); public static TarkirDragonstorm getInstance() { @@ -20,74 +24,156 @@ public final class TarkirDragonstorm extends ExpansionSet { this.blockName = "Tarkir: Dragonstorm"; // for sorting in GUI this.hasBasicLands = true; + cards.add(new SetCardInfo("Abzan Devotee", 68, Rarity.COMMON, mage.cards.a.AbzanDevotee.class)); + cards.add(new SetCardInfo("Abzan Monument", 238, Rarity.UNCOMMON, mage.cards.a.AbzanMonument.class)); cards.add(new SetCardInfo("Aegis Sculptor", 35, Rarity.UNCOMMON, mage.cards.a.AegisSculptor.class)); cards.add(new SetCardInfo("Agent of Kotis", 36, Rarity.COMMON, mage.cards.a.AgentOfKotis.class)); + cards.add(new SetCardInfo("Alesha's Legacy", 72, Rarity.COMMON, mage.cards.a.AleshasLegacy.class)); + cards.add(new SetCardInfo("Ambling Stormshell", 37, Rarity.RARE, mage.cards.a.AmblingStormshell.class)); cards.add(new SetCardInfo("Anafenza, Unyielding Lineage", 2, Rarity.RARE, mage.cards.a.AnafenzaUnyieldingLineage.class)); + cards.add(new SetCardInfo("Armament Dragon", 168, Rarity.UNCOMMON, mage.cards.a.ArmamentDragon.class)); + cards.add(new SetCardInfo("Attuned Hunter", 135, Rarity.UNCOMMON, mage.cards.a.AttunedHunter.class)); cards.add(new SetCardInfo("Auroral Procession", 169, Rarity.UNCOMMON, mage.cards.a.AuroralProcession.class)); + cards.add(new SetCardInfo("Avenger of the Fallen", 73, Rarity.RARE, mage.cards.a.AvengerOfTheFallen.class)); + cards.add(new SetCardInfo("Awaken the Honored Dead", 170, Rarity.RARE, mage.cards.a.AwakenTheHonoredDead.class)); cards.add(new SetCardInfo("Barrensteppe Siege", 171, Rarity.RARE, mage.cards.b.BarrensteppeSiege.class)); cards.add(new SetCardInfo("Bearer of Glory", 4, Rarity.COMMON, mage.cards.b.BearerOfGlory.class)); + cards.add(new SetCardInfo("Bewildering Blizzard", 38, Rarity.UNCOMMON, mage.cards.b.BewilderingBlizzard.class)); cards.add(new SetCardInfo("Bloodfell Caves", 250, Rarity.COMMON, mage.cards.b.BloodfellCaves.class)); cards.add(new SetCardInfo("Blossoming Sands", 251, Rarity.COMMON, mage.cards.b.BlossomingSands.class)); cards.add(new SetCardInfo("Bone-Cairn Butcher", 173, Rarity.UNCOMMON, mage.cards.b.BoneCairnButcher.class)); cards.add(new SetCardInfo("Boulderborn Dragon", 239, Rarity.COMMON, mage.cards.b.BoulderbornDragon.class)); + cards.add(new SetCardInfo("Breaching Dragonstorm", 101, Rarity.UNCOMMON, mage.cards.b.BreachingDragonstorm.class)); + cards.add(new SetCardInfo("Call the Spirit Dragons", 174, Rarity.MYTHIC, mage.cards.c.CallTheSpiritDragons.class)); cards.add(new SetCardInfo("Caustic Exhale", 74, Rarity.COMMON, mage.cards.c.CausticExhale.class)); + cards.add(new SetCardInfo("Channeled Dragonfire", 102, Rarity.UNCOMMON, mage.cards.c.ChanneledDragonfire.class)); + cards.add(new SetCardInfo("Coordinated Maneuver", 6, Rarity.COMMON, mage.cards.c.CoordinatedManeuver.class)); + cards.add(new SetCardInfo("Cori Mountain Monastery", 252, Rarity.RARE, mage.cards.c.CoriMountainMonastery.class)); cards.add(new SetCardInfo("Cori Mountain Stalwart", 175, Rarity.UNCOMMON, mage.cards.c.CoriMountainStalwart.class)); + cards.add(new SetCardInfo("Cori-Steel Cutter", 103, Rarity.RARE, mage.cards.c.CoriSteelCutter.class)); + cards.add(new SetCardInfo("Corroding Dragonstorm", 75, Rarity.UNCOMMON, mage.cards.c.CorrodingDragonstorm.class)); cards.add(new SetCardInfo("Craterhoof Behemoth", 138, Rarity.MYTHIC, mage.cards.c.CraterhoofBehemoth.class)); cards.add(new SetCardInfo("Cruel Truths", 76, Rarity.COMMON, mage.cards.c.CruelTruths.class)); cards.add(new SetCardInfo("Dalkovan Packbeasts", 7, Rarity.UNCOMMON, mage.cards.d.DalkovanPackbeasts.class)); + cards.add(new SetCardInfo("Defibrillating Current", 177, Rarity.UNCOMMON, mage.cards.d.DefibrillatingCurrent.class)); + cards.add(new SetCardInfo("Delta Bloodflies", 77, Rarity.COMMON, mage.cards.d.DeltaBloodflies.class)); + cards.add(new SetCardInfo("Descendant of Storms", 8, Rarity.UNCOMMON, mage.cards.d.DescendantOfStorms.class)); cards.add(new SetCardInfo("Devoted Duelist", 104, Rarity.COMMON, mage.cards.d.DevotedDuelist.class)); cards.add(new SetCardInfo("Dismal Backwater", 254, Rarity.COMMON, mage.cards.d.DismalBackwater.class)); + cards.add(new SetCardInfo("Dispelling Exhale", 41, Rarity.COMMON, mage.cards.d.DispellingExhale.class)); cards.add(new SetCardInfo("Dracogenesis", 105, Rarity.MYTHIC, mage.cards.d.Dracogenesis.class)); + cards.add(new SetCardInfo("Dragon's Prey", 79, Rarity.COMMON, mage.cards.d.DragonsPrey.class)); cards.add(new SetCardInfo("Dragonback Assault", 179, Rarity.MYTHIC, mage.cards.d.DragonbackAssault.class)); cards.add(new SetCardInfo("Dragonback Lancer", 9, Rarity.COMMON, mage.cards.d.DragonbackLancer.class)); + cards.add(new SetCardInfo("Dragonbroods' Relic", 140, Rarity.UNCOMMON, mage.cards.d.DragonbroodsRelic.class)); + cards.add(new SetCardInfo("Dragonologist", 42, Rarity.RARE, mage.cards.d.Dragonologist.class)); + cards.add(new SetCardInfo("Dragonstorm Forecaster", 43, Rarity.UNCOMMON, mage.cards.d.DragonstormForecaster.class)); + cards.add(new SetCardInfo("Dragonstorm Globe", 241, Rarity.COMMON, mage.cards.d.DragonstormGlobe.class)); cards.add(new SetCardInfo("Dusyut Earthcarver", 141, Rarity.COMMON, mage.cards.d.DusyutEarthcarver.class)); + cards.add(new SetCardInfo("Duty Beyond Death", 10, Rarity.UNCOMMON, mage.cards.d.DutyBeyondDeath.class)); + cards.add(new SetCardInfo("Embermouth Sentinel", 242, Rarity.COMMON, mage.cards.e.EmbermouthSentinel.class)); + cards.add(new SetCardInfo("Encroaching Dragonstorm", 142, Rarity.UNCOMMON, mage.cards.e.EncroachingDragonstorm.class)); cards.add(new SetCardInfo("Equilibrium Adept", 106, Rarity.UNCOMMON, mage.cards.e.EquilibriumAdept.class)); cards.add(new SetCardInfo("Evolving Wilds", 255, Rarity.COMMON, mage.cards.e.EvolvingWilds.class)); cards.add(new SetCardInfo("Fangkeeper's Familiar", 183, Rarity.RARE, mage.cards.f.FangkeepersFamiliar.class)); + cards.add(new SetCardInfo("Felothar, Dawn of the Abzan", 184, Rarity.RARE, mage.cards.f.FelotharDawnOfTheAbzan.class)); cards.add(new SetCardInfo("Forest", 285, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Fortress Kin-Guard", 12, Rarity.COMMON, mage.cards.f.FortressKinGuard.class)); cards.add(new SetCardInfo("Fresh Start", 46, Rarity.UNCOMMON, mage.cards.f.FreshStart.class)); cards.add(new SetCardInfo("Frontier Bivouac", 256, Rarity.UNCOMMON, mage.cards.f.FrontierBivouac.class)); + cards.add(new SetCardInfo("Glacial Dragonhunt", 188, Rarity.UNCOMMON, mage.cards.g.GlacialDragonhunt.class)); + cards.add(new SetCardInfo("Great Arashin City", 257, Rarity.RARE, mage.cards.g.GreatArashinCity.class)); + cards.add(new SetCardInfo("Gurmag Nightwatch", 190, Rarity.COMMON, mage.cards.g.GurmagNightwatch.class)); + cards.add(new SetCardInfo("Hardened Tactician", 191, Rarity.UNCOMMON, mage.cards.h.HardenedTactician.class)); cards.add(new SetCardInfo("Heritage Reclamation", 145, Rarity.COMMON, mage.cards.h.HeritageReclamation.class)); cards.add(new SetCardInfo("Inevitable Defeat", 194, Rarity.RARE, mage.cards.i.InevitableDefeat.class)); cards.add(new SetCardInfo("Island", 279, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Jade-Cast Sentinel", 243, Rarity.COMMON, mage.cards.j.JadeCastSentinel.class)); + cards.add(new SetCardInfo("Jeskai Brushmaster", 195, Rarity.UNCOMMON, mage.cards.j.JeskaiBrushmaster.class)); + cards.add(new SetCardInfo("Jeskai Devotee", 110, Rarity.COMMON, mage.cards.j.JeskaiDevotee.class)); + cards.add(new SetCardInfo("Jeskai Monument", 244, Rarity.UNCOMMON, mage.cards.j.JeskaiMonument.class)); + cards.add(new SetCardInfo("Jeskai Shrinekeeper", 197, Rarity.UNCOMMON, mage.cards.j.JeskaiShrinekeeper.class)); cards.add(new SetCardInfo("Jungle Hollow", 258, Rarity.COMMON, mage.cards.j.JungleHollow.class)); + cards.add(new SetCardInfo("Kheru Goldkeeper", 199, Rarity.UNCOMMON, mage.cards.k.KheruGoldkeeper.class)); + cards.add(new SetCardInfo("Kin-Tree Severance", 200, Rarity.UNCOMMON, mage.cards.k.KinTreeSeverance.class)); + cards.add(new SetCardInfo("Kishla Skimmer", 201, Rarity.UNCOMMON, mage.cards.k.KishlaSkimmer.class)); + cards.add(new SetCardInfo("Kishla Trawlers", 50, Rarity.UNCOMMON, mage.cards.k.KishlaTrawlers.class)); + cards.add(new SetCardInfo("Kishla Village", 259, Rarity.RARE, mage.cards.k.KishlaVillage.class)); + cards.add(new SetCardInfo("Krotiq Nestguard", 148, Rarity.COMMON, mage.cards.k.KrotiqNestguard.class)); + cards.add(new SetCardInfo("Lightfoot Technique", 14, Rarity.COMMON, mage.cards.l.LightfootTechnique.class)); + cards.add(new SetCardInfo("Loxodon Battle Priest", 15, Rarity.UNCOMMON, mage.cards.l.LoxodonBattlePriest.class)); + cards.add(new SetCardInfo("Mammoth Bellow", 205, Rarity.UNCOMMON, mage.cards.m.MammothBellow.class)); + cards.add(new SetCardInfo("Mardu Devotee", 16, Rarity.COMMON, mage.cards.m.MarduDevotee.class)); + cards.add(new SetCardInfo("Mardu Monument", 245, Rarity.UNCOMMON, mage.cards.m.MarduMonument.class)); + cards.add(new SetCardInfo("Meticulous Artisan", 112, Rarity.COMMON, mage.cards.m.MeticulousArtisan.class)); + cards.add(new SetCardInfo("Monastery Messenger", 208, Rarity.COMMON, mage.cards.m.MonasteryMessenger.class)); cards.add(new SetCardInfo("Mountain", 283, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mox Jasper", 246, Rarity.MYTHIC, mage.cards.m.MoxJasper.class)); cards.add(new SetCardInfo("Mystic Monastery", 262, Rarity.UNCOMMON, mage.cards.m.MysticMonastery.class)); + cards.add(new SetCardInfo("Narset's Rebuke", 114, Rarity.COMMON, mage.cards.n.NarsetsRebuke.class)); cards.add(new SetCardInfo("Narset, Jeskai Waymaster", 209, Rarity.RARE, mage.cards.n.NarsetJeskaiWaymaster.class)); + cards.add(new SetCardInfo("Nature's Rhythm", 150, Rarity.RARE, mage.cards.n.NaturesRhythm.class)); + cards.add(new SetCardInfo("Neriv, Heart of the Storm", 210, Rarity.MYTHIC, mage.cards.n.NerivHeartOfTheStorm.class)); cards.add(new SetCardInfo("Nomad Outpost", 263, Rarity.UNCOMMON, mage.cards.n.NomadOutpost.class)); cards.add(new SetCardInfo("Opulent Palace", 264, Rarity.UNCOMMON, mage.cards.o.OpulentPalace.class)); + cards.add(new SetCardInfo("Osseous Exhale", 17, Rarity.COMMON, mage.cards.o.OsseousExhale.class)); + cards.add(new SetCardInfo("Piercing Exhale", 151, Rarity.COMMON, mage.cards.p.PiercingExhale.class)); cards.add(new SetCardInfo("Plains", 277, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Qarsi Revenant", 86, Rarity.RARE, mage.cards.q.QarsiRevenant.class)); cards.add(new SetCardInfo("Rakshasa's Bargain", 214, Rarity.UNCOMMON, mage.cards.r.RakshasasBargain.class)); cards.add(new SetCardInfo("Rally the Monastery", 19, Rarity.UNCOMMON, mage.cards.r.RallyTheMonastery.class)); + cards.add(new SetCardInfo("Rebellious Strike", 20, Rarity.COMMON, mage.cards.r.RebelliousStrike.class)); cards.add(new SetCardInfo("Reigning Victor", 216, Rarity.COMMON, mage.cards.r.ReigningVictor.class)); cards.add(new SetCardInfo("Ringing Strike Mastery", 53, Rarity.COMMON, mage.cards.r.RingingStrikeMastery.class)); + cards.add(new SetCardInfo("Roamer's Routine", 154, Rarity.COMMON, mage.cards.r.RoamersRoutine.class)); + cards.add(new SetCardInfo("Roar of Endless Song", 220, Rarity.RARE, mage.cards.r.RoarOfEndlessSong.class)); cards.add(new SetCardInfo("Roiling Dragonstorm", 55, Rarity.UNCOMMON, mage.cards.r.RoilingDragonstorm.class)); cards.add(new SetCardInfo("Rugged Highlands", 265, Rarity.COMMON, mage.cards.r.RuggedHighlands.class)); + cards.add(new SetCardInfo("Salt Road Packbeast", 23, Rarity.COMMON, mage.cards.s.SaltRoadPackbeast.class)); cards.add(new SetCardInfo("Sandsteppe Citadel", 266, Rarity.UNCOMMON, mage.cards.s.SandsteppeCitadel.class)); cards.add(new SetCardInfo("Sarkhan's Resolve", 158, Rarity.COMMON, mage.cards.s.SarkhansResolve.class)); cards.add(new SetCardInfo("Scoured Barrens", 267, Rarity.COMMON, mage.cards.s.ScouredBarrens.class)); + cards.add(new SetCardInfo("Seize Opportunity", 119, Rarity.COMMON, mage.cards.s.SeizeOpportunity.class)); cards.add(new SetCardInfo("Shiko, Paragon of the Way", 223, Rarity.MYTHIC, mage.cards.s.ShikoParagonOfTheWay.class)); cards.add(new SetCardInfo("Shock Brigade", 120, Rarity.COMMON, mage.cards.s.ShockBrigade.class)); + cards.add(new SetCardInfo("Shocking Sharpshooter", 121, Rarity.UNCOMMON, mage.cards.s.ShockingSharpshooter.class)); + cards.add(new SetCardInfo("Sinkhole Surveyor", 93, Rarity.RARE, mage.cards.s.SinkholeSurveyor.class)); cards.add(new SetCardInfo("Skirmish Rhino", 224, Rarity.UNCOMMON, mage.cards.s.SkirmishRhino.class)); cards.add(new SetCardInfo("Smile at Death", 24, Rarity.MYTHIC, mage.cards.s.SmileAtDeath.class)); cards.add(new SetCardInfo("Snakeskin Veil", 159, Rarity.COMMON, mage.cards.s.SnakeskinVeil.class)); + cards.add(new SetCardInfo("Spectral Denial", 58, Rarity.UNCOMMON, mage.cards.s.SpectralDenial.class)); cards.add(new SetCardInfo("Stormplain Detainment", 28, Rarity.COMMON, mage.cards.s.StormplainDetainment.class)); cards.add(new SetCardInfo("Stormscale Scion", 123, Rarity.MYTHIC, mage.cards.s.StormscaleScion.class)); + cards.add(new SetCardInfo("Sultai Devotee", 160, Rarity.COMMON, mage.cards.s.SultaiDevotee.class)); + cards.add(new SetCardInfo("Sultai Monument", 247, Rarity.UNCOMMON, mage.cards.s.SultaiMonument.class)); cards.add(new SetCardInfo("Summit Intimidator", 125, Rarity.COMMON, mage.cards.s.SummitIntimidator.class)); + cards.add(new SetCardInfo("Sunset Strikemaster", 126, Rarity.UNCOMMON, mage.cards.s.SunsetStrikemaster.class)); cards.add(new SetCardInfo("Swamp", 281, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Swiftwater Cliffs", 268, Rarity.COMMON, mage.cards.s.SwiftwaterCliffs.class)); cards.add(new SetCardInfo("Tempest Hawk", 31, Rarity.COMMON, mage.cards.t.TempestHawk.class)); + cards.add(new SetCardInfo("Temur Devotee", 61, Rarity.COMMON, mage.cards.t.TemurDevotee.class)); + cards.add(new SetCardInfo("Temur Monument", 248, Rarity.UNCOMMON, mage.cards.t.TemurMonument.class)); + cards.add(new SetCardInfo("Temur Tawnyback", 229, Rarity.COMMON, mage.cards.t.TemurTawnyback.class)); cards.add(new SetCardInfo("Thornwood Falls", 269, Rarity.COMMON, mage.cards.t.ThornwoodFalls.class)); cards.add(new SetCardInfo("Tranquil Cove", 270, Rarity.COMMON, mage.cards.t.TranquilCove.class)); + cards.add(new SetCardInfo("Ugin, Eye of the Storms", 1, Rarity.MYTHIC, mage.cards.u.UginEyeOfTheStorms.class)); + cards.add(new SetCardInfo("Underfoot Underdogs", 129, Rarity.COMMON, mage.cards.u.UnderfootUnderdogs.class)); cards.add(new SetCardInfo("Undergrowth Leopard", 165, Rarity.COMMON, mage.cards.u.UndergrowthLeopard.class)); + cards.add(new SetCardInfo("Unending Whisper", 62, Rarity.COMMON, mage.cards.u.UnendingWhisper.class)); + cards.add(new SetCardInfo("United Battlefront", 32, Rarity.RARE, mage.cards.u.UnitedBattlefront.class)); cards.add(new SetCardInfo("Unrooted Ancestor", 96, Rarity.UNCOMMON, mage.cards.u.UnrootedAncestor.class)); + cards.add(new SetCardInfo("Unsparing Boltcaster", 130, Rarity.UNCOMMON, mage.cards.u.UnsparingBoltcaster.class)); + cards.add(new SetCardInfo("Ureni's Rebuff", 63, Rarity.UNCOMMON, mage.cards.u.UrenisRebuff.class)); cards.add(new SetCardInfo("Venerated Stormsinger", 97, Rarity.UNCOMMON, mage.cards.v.VeneratedStormsinger.class)); cards.add(new SetCardInfo("Voice of Victory", 33, Rarity.RARE, mage.cards.v.VoiceOfVictory.class)); cards.add(new SetCardInfo("Watcher of the Wayside", 249, Rarity.COMMON, mage.cards.w.WatcherOfTheWayside.class)); cards.add(new SetCardInfo("Wind-Scarred Crag", 271, Rarity.COMMON, mage.cards.w.WindScarredCrag.class)); + cards.add(new SetCardInfo("Wingspan Stride", 66, Rarity.COMMON, mage.cards.w.WingspanStride.class)); + cards.add(new SetCardInfo("Winternight Stories", 67, Rarity.RARE, mage.cards.w.WinternightStories.class)); + cards.add(new SetCardInfo("Worthy Cost", 99, Rarity.COMMON, mage.cards.w.WorthyCost.class)); + cards.add(new SetCardInfo("Yathan Tombguard", 100, Rarity.UNCOMMON, mage.cards.y.YathanTombguard.class)); + cards.add(new SetCardInfo("Zurgo's Vanguard", 133, Rarity.UNCOMMON, mage.cards.z.ZurgosVanguard.class)); + + cards.removeIf(setCardInfo -> unfinished.contains(setCardInfo.getName())); } } diff --git a/Mage.Sets/src/mage/sets/TarkirDragonstormCommander.java b/Mage.Sets/src/mage/sets/TarkirDragonstormCommander.java index bbfd6596519..f87dc17574a 100644 --- a/Mage.Sets/src/mage/sets/TarkirDragonstormCommander.java +++ b/Mage.Sets/src/mage/sets/TarkirDragonstormCommander.java @@ -20,38 +20,57 @@ public final class TarkirDragonstormCommander extends ExpansionSet { this.hasBasicLands = false; cards.add(new SetCardInfo("Abrade", 203, Rarity.UNCOMMON, mage.cards.a.Abrade.class)); + cards.add(new SetCardInfo("Access Tunnel", 337, Rarity.UNCOMMON, mage.cards.a.AccessTunnel.class)); cards.add(new SetCardInfo("Adarkar Wastes", 338, Rarity.RARE, mage.cards.a.AdarkarWastes.class)); cards.add(new SetCardInfo("Adeline, Resplendent Cathar", 108, Rarity.RARE, mage.cards.a.AdelineResplendentCathar.class)); cards.add(new SetCardInfo("Amphin Mutineer", 143, Rarity.RARE, mage.cards.a.AmphinMutineer.class)); cards.add(new SetCardInfo("Ancestral Vision", 144, Rarity.RARE, mage.cards.a.AncestralVision.class)); cards.add(new SetCardInfo("Angel of Invention", 109, Rarity.MYTHIC, mage.cards.a.AngelOfInvention.class)); + cards.add(new SetCardInfo("Anguished Unmaking", 279, Rarity.RARE, mage.cards.a.AnguishedUnmaking.class)); + cards.add(new SetCardInfo("Arasta of the Endless Web", 244, Rarity.RARE, mage.cards.a.ArastaOfTheEndlessWeb.class)); + cards.add(new SetCardInfo("Arboreal Grazer", 245, Rarity.COMMON, mage.cards.a.ArborealGrazer.class)); cards.add(new SetCardInfo("Arcane Signet", 105, Rarity.UNCOMMON, mage.cards.a.ArcaneSignet.class)); cards.add(new SetCardInfo("Archmage Emeritus", 145, Rarity.RARE, mage.cards.a.ArchmageEmeritus.class)); cards.add(new SetCardInfo("Aron, Benalia's Ruin", 280, Rarity.UNCOMMON, mage.cards.a.AronBenaliasRuin.class)); cards.add(new SetCardInfo("Ash Barrens", 339, Rarity.COMMON, mage.cards.a.AshBarrens.class)); + cards.add(new SetCardInfo("Assault Formation", 246, Rarity.RARE, mage.cards.a.AssaultFormation.class)); + cards.add(new SetCardInfo("Atarka, World Render", 281, Rarity.RARE, mage.cards.a.AtarkaWorldRender.class)); + cards.add(new SetCardInfo("Atsushi, the Blazing Sky", 204, Rarity.MYTHIC, mage.cards.a.AtsushiTheBlazingSky.class)); cards.add(new SetCardInfo("Avenger of Zendikar", 247, Rarity.MYTHIC, mage.cards.a.AvengerOfZendikar.class)); + cards.add(new SetCardInfo("Axebane Guardian", 248, Rarity.COMMON, mage.cards.a.AxebaneGuardian.class)); cards.add(new SetCardInfo("Azorius Signet", 312, Rarity.UNCOMMON, mage.cards.a.AzoriusSignet.class)); + cards.add(new SetCardInfo("Baldin, Century Herdmaster", 110, Rarity.RARE, mage.cards.b.BaldinCenturyHerdmaster.class)); cards.add(new SetCardInfo("Baral and Kari Zev", 282, Rarity.RARE, mage.cards.b.BaralAndKariZev.class)); cards.add(new SetCardInfo("Baral's Expertise", 146, Rarity.RARE, mage.cards.b.BaralsExpertise.class)); cards.add(new SetCardInfo("Bastion of Remembrance", 171, Rarity.UNCOMMON, mage.cards.b.BastionOfRemembrance.class)); cards.add(new SetCardInfo("Battlefield Forge", 340, Rarity.RARE, mage.cards.b.BattlefieldForge.class)); + cards.add(new SetCardInfo("Beast Within", 249, Rarity.UNCOMMON, mage.cards.b.BeastWithin.class)); cards.add(new SetCardInfo("Beetleback Chief", 205, Rarity.UNCOMMON, mage.cards.b.BeetlebackChief.class)); + cards.add(new SetCardInfo("Behind the Scenes", 172, Rarity.UNCOMMON, mage.cards.b.BehindTheScenes.class)); cards.add(new SetCardInfo("Betor, Ancestor's Voice", 1, Rarity.MYTHIC, mage.cards.b.BetorAncestorsVoice.class)); cards.add(new SetCardInfo("Big Score", 206, Rarity.COMMON, mage.cards.b.BigScore.class)); cards.add(new SetCardInfo("Bitter Triumph", 173, Rarity.UNCOMMON, mage.cards.b.BitterTriumph.class)); cards.add(new SetCardInfo("Blade of Selves", 313, Rarity.RARE, mage.cards.b.BladeOfSelves.class)); + cards.add(new SetCardInfo("Blasphemous Act", 207, Rarity.RARE, mage.cards.b.BlasphemousAct.class)); + cards.add(new SetCardInfo("Blight Pile", 174, Rarity.UNCOMMON, mage.cards.b.BlightPile.class)); cards.add(new SetCardInfo("Bojuka Bog", 341, Rarity.COMMON, mage.cards.b.BojukaBog.class)); cards.add(new SetCardInfo("Boros Signet", 314, Rarity.UNCOMMON, mage.cards.b.BorosSignet.class)); + cards.add(new SetCardInfo("Bountiful Landscape", 342, Rarity.COMMON, mage.cards.b.BountifulLandscape.class)); cards.add(new SetCardInfo("Caldera Pyremaw", 33, Rarity.RARE, mage.cards.c.CalderaPyremaw.class)); + cards.add(new SetCardInfo("Canopy Vista", 343, Rarity.RARE, mage.cards.c.CanopyVista.class)); cards.add(new SetCardInfo("Canyon Slough", 344, Rarity.RARE, mage.cards.c.CanyonSlough.class)); + cards.add(new SetCardInfo("Carven Caryatid", 250, Rarity.UNCOMMON, mage.cards.c.CarvenCaryatid.class)); cards.add(new SetCardInfo("Cascade Bluffs", 345, Rarity.RARE, mage.cards.c.CascadeBluffs.class)); cards.add(new SetCardInfo("Castle Ardenvale", 346, Rarity.RARE, mage.cards.c.CastleArdenvale.class)); cards.add(new SetCardInfo("Castle Embereth", 347, Rarity.RARE, mage.cards.c.CastleEmbereth.class)); - cards.add(new SetCardInfo("Casualties of War", 98, Rarity.COMMON, mage.cards.c.CasualtiesOfWar.class)); + cards.add(new SetCardInfo("Casualties of War", 98, Rarity.RARE, mage.cards.c.CasualtiesOfWar.class)); cards.add(new SetCardInfo("Caves of Koilos", 348, Rarity.RARE, mage.cards.c.CavesOfKoilos.class)); cards.add(new SetCardInfo("Cephalid Coliseum", 349, Rarity.UNCOMMON, mage.cards.c.CephalidColiseum.class)); + cards.add(new SetCardInfo("Chaos Warp", 208, Rarity.RARE, mage.cards.c.ChaosWarp.class)); cards.add(new SetCardInfo("Chittering Witch", 175, Rarity.RARE, mage.cards.c.ChitteringWitch.class)); + cards.add(new SetCardInfo("Cinder Glade", 350, Rarity.RARE, mage.cards.c.CinderGlade.class)); cards.add(new SetCardInfo("Clifftop Retreat", 351, Rarity.RARE, mage.cards.c.ClifftopRetreat.class)); + cards.add(new SetCardInfo("Colfenor's Urn", 315, Rarity.RARE, mage.cards.c.ColfenorsUrn.class)); cards.add(new SetCardInfo("Command Beacon", 352, Rarity.RARE, mage.cards.c.CommandBeacon.class)); cards.add(new SetCardInfo("Command Tower", 107, Rarity.COMMON, mage.cards.c.CommandTower.class)); cards.add(new SetCardInfo("Commander's Insignia", 111, Rarity.RARE, mage.cards.c.CommandersInsignia.class)); @@ -60,6 +79,7 @@ public final class TarkirDragonstormCommander extends ExpansionSet { cards.add(new SetCardInfo("Consider", 148, Rarity.COMMON, mage.cards.c.Consider.class)); cards.add(new SetCardInfo("Consuming Aberration", 283, Rarity.RARE, mage.cards.c.ConsumingAberration.class)); cards.add(new SetCardInfo("Contaminated Aquifer", 353, Rarity.COMMON, mage.cards.c.ContaminatedAquifer.class)); + cards.add(new SetCardInfo("Crashing Drawbridge", 316, Rarity.COMMON, mage.cards.c.CrashingDrawbridge.class)); cards.add(new SetCardInfo("Crawling Sensation", 252, Rarity.UNCOMMON, mage.cards.c.CrawlingSensation.class)); cards.add(new SetCardInfo("Crypt of Agadeem", 354, Rarity.RARE, mage.cards.c.CryptOfAgadeem.class)); cards.add(new SetCardInfo("Cultivate", 253, Rarity.COMMON, mage.cards.c.Cultivate.class)); @@ -68,57 +88,90 @@ public final class TarkirDragonstormCommander extends ExpansionSet { cards.add(new SetCardInfo("Darkwater Catacombs", 355, Rarity.RARE, mage.cards.d.DarkwaterCatacombs.class)); cards.add(new SetCardInfo("Dauthi Voidwalker", 176, Rarity.RARE, mage.cards.d.DauthiVoidwalker.class)); cards.add(new SetCardInfo("Deadly Dispute", 177, Rarity.COMMON, mage.cards.d.DeadlyDispute.class)); + cards.add(new SetCardInfo("Deceptive Landscape", 356, Rarity.COMMON, mage.cards.d.DeceptiveLandscape.class)); cards.add(new SetCardInfo("Deep Analysis", 150, Rarity.COMMON, mage.cards.d.DeepAnalysis.class)); + cards.add(new SetCardInfo("Despark", 284, Rarity.UNCOMMON, mage.cards.d.Despark.class)); cards.add(new SetCardInfo("Disciple of Bolas", 178, Rarity.RARE, mage.cards.d.DiscipleOfBolas.class)); cards.add(new SetCardInfo("Dismantling Wave", 112, Rarity.RARE, mage.cards.d.DismantlingWave.class)); cards.add(new SetCardInfo("Divine Visitation", 113, Rarity.MYTHIC, mage.cards.d.DivineVisitation.class)); + cards.add(new SetCardInfo("Draconic Lore", 151, Rarity.COMMON, mage.cards.d.DraconicLore.class)); + cards.add(new SetCardInfo("Dragon Tempest", 94, Rarity.UNCOMMON, mage.cards.d.DragonTempest.class)); + cards.add(new SetCardInfo("Dragon's Hoard", 317, Rarity.RARE, mage.cards.d.DragonsHoard.class)); + cards.add(new SetCardInfo("Dragonlord Atarka", 285, Rarity.MYTHIC, mage.cards.d.DragonlordAtarka.class)); + cards.add(new SetCardInfo("Dragonlord Dromoka", 286, Rarity.MYTHIC, mage.cards.d.DragonlordDromoka.class)); + cards.add(new SetCardInfo("Dragonlord's Servant", 210, Rarity.UNCOMMON, mage.cards.d.DragonlordsServant.class)); + cards.add(new SetCardInfo("Dragonmaster Outcast", 211, Rarity.MYTHIC, mage.cards.d.DragonmasterOutcast.class)); cards.add(new SetCardInfo("Dragonskull Summit", 357, Rarity.RARE, mage.cards.d.DragonskullSummit.class)); cards.add(new SetCardInfo("Dreamroot Cascade", 358, Rarity.RARE, mage.cards.d.DreamrootCascade.class)); cards.add(new SetCardInfo("Drownyard Temple", 359, Rarity.RARE, mage.cards.d.DrownyardTemple.class)); cards.add(new SetCardInfo("Electrodominance", 212, Rarity.RARE, mage.cards.e.Electrodominance.class)); + cards.add(new SetCardInfo("Elemental Bond", 254, Rarity.UNCOMMON, mage.cards.e.ElementalBond.class)); cards.add(new SetCardInfo("Eliminate the Competition", 179, Rarity.RARE, mage.cards.e.EliminateTheCompetition.class)); cards.add(new SetCardInfo("Emeria Angel", 114, Rarity.RARE, mage.cards.e.EmeriaAngel.class)); cards.add(new SetCardInfo("Exotic Orchard", 360, Rarity.RARE, mage.cards.e.ExoticOrchard.class)); cards.add(new SetCardInfo("Expansion // Explosion", 287, Rarity.RARE, mage.cards.e.ExpansionExplosion.class)); + cards.add(new SetCardInfo("Expel the Interlopers", 115, Rarity.RARE, mage.cards.e.ExpelTheInterlopers.class)); cards.add(new SetCardInfo("Expressive Iteration", 288, Rarity.UNCOMMON, mage.cards.e.ExpressiveIteration.class)); + cards.add(new SetCardInfo("Faeburrow Elder", 289, Rarity.RARE, mage.cards.f.FaeburrowElder.class)); cards.add(new SetCardInfo("Faithless Looting", 213, Rarity.COMMON, mage.cards.f.FaithlessLooting.class)); - cards.add(new SetCardInfo("Farseek", 255, Rarity.UNCOMMON, mage.cards.f.Farseek.class)); + cards.add(new SetCardInfo("Farseek", 255, Rarity.COMMON, mage.cards.f.Farseek.class)); + cards.add(new SetCardInfo("Feed the Swarm", 180, Rarity.COMMON, mage.cards.f.FeedTheSwarm.class)); cards.add(new SetCardInfo("Fellwar Stone", 318, Rarity.UNCOMMON, mage.cards.f.FellwarStone.class)); cards.add(new SetCardInfo("Ferrous Lake", 361, Rarity.RARE, mage.cards.f.FerrousLake.class)); cards.add(new SetCardInfo("Fetid Heath", 362, Rarity.RARE, mage.cards.f.FetidHeath.class)); cards.add(new SetCardInfo("Fetid Pools", 363, Rarity.RARE, mage.cards.f.FetidPools.class)); + cards.add(new SetCardInfo("Flooded Grove", 364, Rarity.RARE, mage.cards.f.FloodedGrove.class)); cards.add(new SetCardInfo("Forbidden Alchemy", 152, Rarity.COMMON, mage.cards.f.ForbiddenAlchemy.class)); cards.add(new SetCardInfo("Foreboding Landscape", 365, Rarity.COMMON, mage.cards.f.ForebodingLandscape.class)); + cards.add(new SetCardInfo("Fortified Village", 366, Rarity.RARE, mage.cards.f.FortifiedVillage.class)); cards.add(new SetCardInfo("Frantic Search", 153, Rarity.COMMON, mage.cards.f.FranticSearch.class)); + cards.add(new SetCardInfo("Frontier Siege", 256, Rarity.RARE, mage.cards.f.FrontierSiege.class)); + cards.add(new SetCardInfo("Gadrak, the Crown-Scourge", 214, Rarity.RARE, mage.cards.g.GadrakTheCrownScourge.class)); cards.add(new SetCardInfo("Ghostly Prison", 116, Rarity.UNCOMMON, mage.cards.g.GhostlyPrison.class)); cards.add(new SetCardInfo("Gix, Yawgmoth Praetor", 181, Rarity.MYTHIC, mage.cards.g.GixYawgmothPraetor.class)); cards.add(new SetCardInfo("Glacial Fortress", 367, Rarity.RARE, mage.cards.g.GlacialFortress.class)); + cards.add(new SetCardInfo("Glorybringer", 215, Rarity.RARE, mage.cards.g.Glorybringer.class)); cards.add(new SetCardInfo("Goblin Electromancer", 99, Rarity.COMMON, mage.cards.g.GoblinElectromancer.class)); cards.add(new SetCardInfo("Goldnight Commander", 117, Rarity.UNCOMMON, mage.cards.g.GoldnightCommander.class)); cards.add(new SetCardInfo("Golgari Rot Farm", 368, Rarity.UNCOMMON, mage.cards.g.GolgariRotFarm.class)); cards.add(new SetCardInfo("Grand Crescendo", 118, Rarity.RARE, mage.cards.g.GrandCrescendo.class)); cards.add(new SetCardInfo("Grapple with the Past", 257, Rarity.COMMON, mage.cards.g.GrappleWithThePast.class)); - cards.add(new SetCardInfo("Gravecrawler", 93, Rarity.COMMON, mage.cards.g.Gravecrawler.class)); + cards.add(new SetCardInfo("Gravecrawler", 93, Rarity.RARE, mage.cards.g.Gravecrawler.class)); cards.add(new SetCardInfo("Grenzo, Havoc Raiser", 216, Rarity.RARE, mage.cards.g.GrenzoHavocRaiser.class)); cards.add(new SetCardInfo("Grisly Salvage", 290, Rarity.COMMON, mage.cards.g.GrislySalvage.class)); cards.add(new SetCardInfo("Guttersnipe", 217, Rarity.UNCOMMON, mage.cards.g.Guttersnipe.class)); + cards.add(new SetCardInfo("Harbinger of the Hunt", 291, Rarity.RARE, mage.cards.h.HarbingerOfTheHunt.class)); cards.add(new SetCardInfo("Harrow", 258, Rarity.COMMON, mage.cards.h.Harrow.class)); cards.add(new SetCardInfo("Haughty Djinn", 154, Rarity.RARE, mage.cards.h.HaughtyDjinn.class)); cards.add(new SetCardInfo("Haunted Mire", 369, Rarity.COMMON, mage.cards.h.HauntedMire.class)); + cards.add(new SetCardInfo("Haven of the Spirit Dragon", 370, Rarity.RARE, mage.cards.h.HavenOfTheSpiritDragon.class)); cards.add(new SetCardInfo("Hedron Crab", 155, Rarity.UNCOMMON, mage.cards.h.HedronCrab.class)); + cards.add(new SetCardInfo("Hellkite Courser", 218, Rarity.MYTHIC, mage.cards.h.HellkiteCourser.class)); cards.add(new SetCardInfo("Hero of Bladehold", 119, Rarity.MYTHIC, mage.cards.h.HeroOfBladehold.class)); cards.add(new SetCardInfo("Hinterland Harbor", 371, Rarity.RARE, mage.cards.h.HinterlandHarbor.class)); + cards.add(new SetCardInfo("Hornet Nest", 259, Rarity.RARE, mage.cards.h.HornetNest.class)); cards.add(new SetCardInfo("Hour of Reckoning", 120, Rarity.RARE, mage.cards.h.HourOfReckoning.class)); cards.add(new SetCardInfo("Idol of Oblivion", 319, Rarity.RARE, mage.cards.i.IdolOfOblivion.class)); + cards.add(new SetCardInfo("Ikra Shidiqi, the Usurper", 100, Rarity.MYTHIC, mage.cards.i.IkraShidiqiTheUsurper.class)); + cards.add(new SetCardInfo("Indomitable Ancients", 121, Rarity.RARE, mage.cards.i.IndomitableAncients.class)); + cards.add(new SetCardInfo("Indulging Patrician", 292, Rarity.UNCOMMON, mage.cards.i.IndulgingPatrician.class)); + cards.add(new SetCardInfo("Infernal Grasp", 182, Rarity.UNCOMMON, mage.cards.i.InfernalGrasp.class)); cards.add(new SetCardInfo("Irrigated Farmland", 372, Rarity.RARE, mage.cards.i.IrrigatedFarmland.class)); cards.add(new SetCardInfo("Isolated Chapel", 373, Rarity.RARE, mage.cards.i.IsolatedChapel.class)); cards.add(new SetCardInfo("Izzet Signet", 320, Rarity.COMMON, mage.cards.i.IzzetSignet.class)); + cards.add(new SetCardInfo("Jaddi Offshoot", 260, Rarity.UNCOMMON, mage.cards.j.JaddiOffshoot.class)); cards.add(new SetCardInfo("Jarad, Golgari Lich Lord", 293, Rarity.MYTHIC, mage.cards.j.JaradGolgariLichLord.class)); cards.add(new SetCardInfo("Junji, the Midnight Sky", 183, Rarity.MYTHIC, mage.cards.j.JunjiTheMidnightSky.class)); + cards.add(new SetCardInfo("Karplusan Forest", 374, Rarity.RARE, mage.cards.k.KarplusanForest.class)); cards.add(new SetCardInfo("Kaya, Geist Hunter", 294, Rarity.MYTHIC, mage.cards.k.KayaGeistHunter.class)); + cards.add(new SetCardInfo("Keiga, the Tide Star", 156, Rarity.RARE, mage.cards.k.KeigaTheTideStar.class)); + cards.add(new SetCardInfo("Kessig Wolf Run", 375, Rarity.RARE, mage.cards.k.KessigWolfRun.class)); + cards.add(new SetCardInfo("Kodama's Reach", 261, Rarity.COMMON, mage.cards.k.KodamasReach.class)); + cards.add(new SetCardInfo("Lathliss, Dragon Queen", 219, Rarity.RARE, mage.cards.l.LathlissDragonQueen.class)); cards.add(new SetCardInfo("Legion Loyalty", 122, Rarity.MYTHIC, mage.cards.l.LegionLoyalty.class)); cards.add(new SetCardInfo("Legion Warboss", 220, Rarity.RARE, mage.cards.l.LegionWarboss.class)); cards.add(new SetCardInfo("Lethal Scheme", 184, Rarity.RARE, mage.cards.l.LethalScheme.class)); + cards.add(new SetCardInfo("Leyline Tyrant", 221, Rarity.MYTHIC, mage.cards.l.LeylineTyrant.class)); cards.add(new SetCardInfo("Lier, Disciple of the Drowned", 157, Rarity.MYTHIC, mage.cards.l.LierDiscipleOfTheDrowned.class)); cards.add(new SetCardInfo("Life from the Loam", 96, Rarity.RARE, mage.cards.l.LifeFromTheLoam.class)); cards.add(new SetCardInfo("Lightning Greaves", 102, Rarity.UNCOMMON, mage.cards.l.LightningGreaves.class)); @@ -133,23 +186,33 @@ public final class TarkirDragonstormCommander extends ExpansionSet { cards.add(new SetCardInfo("Manaform Hellkite", 224, Rarity.MYTHIC, mage.cards.m.ManaformHellkite.class)); cards.add(new SetCardInfo("Mangara, the Diplomat", 124, Rarity.RARE, mage.cards.m.MangaraTheDiplomat.class)); cards.add(new SetCardInfo("Memorial to Folly", 377, Rarity.UNCOMMON, mage.cards.m.MemorialToFolly.class)); - cards.add(new SetCardInfo("Meren of Clan Nel Toth", 297, Rarity.RARE, mage.cards.m.MerenOfClanNelToth.class)); + cards.add(new SetCardInfo("Meren of Clan Nel Toth", 297, Rarity.MYTHIC, mage.cards.m.MerenOfClanNelToth.class)); + cards.add(new SetCardInfo("Migration Path", 262, Rarity.UNCOMMON, mage.cards.m.MigrationPath.class)); cards.add(new SetCardInfo("Millikin", 321, Rarity.UNCOMMON, mage.cards.m.Millikin.class)); cards.add(new SetCardInfo("Mindblade Render", 187, Rarity.RARE, mage.cards.m.MindbladeRender.class)); cards.add(new SetCardInfo("Monastery Mentor", 125, Rarity.MYTHIC, mage.cards.m.MonasteryMentor.class)); cards.add(new SetCardInfo("Morbid Opportunist", 188, Rarity.UNCOMMON, mage.cards.m.MorbidOpportunist.class)); + cards.add(new SetCardInfo("Mossfire Valley", 378, Rarity.RARE, mage.cards.m.MossfireValley.class)); + cards.add(new SetCardInfo("Mosswort Bridge", 379, Rarity.RARE, mage.cards.m.MosswortBridge.class)); cards.add(new SetCardInfo("Multani, Yavimaya's Avatar", 263, Rarity.MYTHIC, mage.cards.m.MultaniYavimayasAvatar.class)); cards.add(new SetCardInfo("Myr Battlesphere", 322, Rarity.RARE, mage.cards.m.MyrBattlesphere.class)); cards.add(new SetCardInfo("Myriad Landscape", 380, Rarity.UNCOMMON, mage.cards.m.MyriadLandscape.class)); cards.add(new SetCardInfo("Narset's Reversal", 92, Rarity.RARE, mage.cards.n.NarsetsReversal.class)); cards.add(new SetCardInfo("Necromantic Selection", 189, Rarity.RARE, mage.cards.n.NecromanticSelection.class)); cards.add(new SetCardInfo("Necropolis Fiend", 190, Rarity.RARE, mage.cards.n.NecropolisFiend.class)); + cards.add(new SetCardInfo("Nesting Dragon", 225, Rarity.RARE, mage.cards.n.NestingDragon.class)); + cards.add(new SetCardInfo("Nogi, Draco-Zealot", 226, Rarity.MYTHIC, mage.cards.n.NogiDracoZealot.class)); cards.add(new SetCardInfo("Noxious Gearhulk", 191, Rarity.MYTHIC, mage.cards.n.NoxiousGearhulk.class)); cards.add(new SetCardInfo("Nyx Weaver", 298, Rarity.UNCOMMON, mage.cards.n.NyxWeaver.class)); + cards.add(new SetCardInfo("Nyx-Fleece Ram", 126, Rarity.UNCOMMON, mage.cards.n.NyxFleeceRam.class)); cards.add(new SetCardInfo("Ob Nixilis, the Fallen", 192, Rarity.MYTHIC, mage.cards.o.ObNixilisTheFallen.class)); cards.add(new SetCardInfo("Ogre Battledriver", 227, Rarity.RARE, mage.cards.o.OgreBattledriver.class)); cards.add(new SetCardInfo("Ophiomancer", 193, Rarity.RARE, mage.cards.o.Ophiomancer.class)); + cards.add(new SetCardInfo("Opportunistic Dragon", 228, Rarity.RARE, mage.cards.o.OpportunisticDragon.class)); cards.add(new SetCardInfo("Opt", 158, Rarity.COMMON, mage.cards.o.Opt.class)); + cards.add(new SetCardInfo("Orzhov Signet", 323, Rarity.COMMON, mage.cards.o.OrzhovSignet.class)); + cards.add(new SetCardInfo("Overgrown Battlement", 264, Rarity.UNCOMMON, mage.cards.o.OvergrownBattlement.class)); + cards.add(new SetCardInfo("Overgrown Farmland", 381, Rarity.RARE, mage.cards.o.OvergrownFarmland.class)); cards.add(new SetCardInfo("Path of Ancestry", 382, Rarity.COMMON, mage.cards.p.PathOfAncestry.class)); cards.add(new SetCardInfo("Perilous Landscape", 383, Rarity.COMMON, mage.cards.p.PerilousLandscape.class)); cards.add(new SetCardInfo("Phyrexian Reclamation", 194, Rarity.UNCOMMON, mage.cards.p.PhyrexianReclamation.class)); @@ -159,73 +222,129 @@ public final class TarkirDragonstormCommander extends ExpansionSet { cards.add(new SetCardInfo("Preordain", 161, Rarity.COMMON, mage.cards.p.Preordain.class)); cards.add(new SetCardInfo("Prismari Command", 299, Rarity.RARE, mage.cards.p.PrismariCommand.class)); cards.add(new SetCardInfo("Putrefy", 300, Rarity.UNCOMMON, mage.cards.p.Putrefy.class)); + cards.add(new SetCardInfo("Radiant Grove", 385, Rarity.COMMON, mage.cards.r.RadiantGrove.class)); cards.add(new SetCardInfo("Rampant Growth", 265, Rarity.COMMON, mage.cards.r.RampantGrowth.class)); + cards.add(new SetCardInfo("Rapacious Dragon", 229, Rarity.UNCOMMON, mage.cards.r.RapaciousDragon.class)); + cards.add(new SetCardInfo("Rapid Hybridization", 162, Rarity.UNCOMMON, mage.cards.r.RapidHybridization.class)); + cards.add(new SetCardInfo("Reality Shift", 163, Rarity.UNCOMMON, mage.cards.r.RealityShift.class)); cards.add(new SetCardInfo("Reassembling Skeleton", 195, Rarity.UNCOMMON, mage.cards.r.ReassemblingSkeleton.class)); + cards.add(new SetCardInfo("Reflections of Littjara", 164, Rarity.RARE, mage.cards.r.ReflectionsOfLittjara.class)); cards.add(new SetCardInfo("Release the Dogs", 127, Rarity.UNCOMMON, mage.cards.r.ReleaseTheDogs.class)); cards.add(new SetCardInfo("Reliquary Tower", 386, Rarity.UNCOMMON, mage.cards.r.ReliquaryTower.class)); + cards.add(new SetCardInfo("Rhox Faithmender", 128, Rarity.RARE, mage.cards.r.RhoxFaithmender.class)); cards.add(new SetCardInfo("Rite of Replication", 165, Rarity.RARE, mage.cards.r.RiteOfReplication.class)); cards.add(new SetCardInfo("River Kelpie", 166, Rarity.RARE, mage.cards.r.RiverKelpie.class)); + cards.add(new SetCardInfo("Rockfall Vale", 387, Rarity.RARE, mage.cards.r.RockfallVale.class)); + cards.add(new SetCardInfo("Rootbound Crag", 388, Rarity.RARE, mage.cards.r.RootboundCrag.class)); cards.add(new SetCardInfo("Rugged Prairie", 389, Rarity.RARE, mage.cards.r.RuggedPrairie.class)); cards.add(new SetCardInfo("Sakura-Tribe Elder", 266, Rarity.COMMON, mage.cards.s.SakuraTribeElder.class)); + cards.add(new SetCardInfo("Sarkhan, Soul Aflame", 301, Rarity.MYTHIC, mage.cards.s.SarkhanSoulAflame.class)); cards.add(new SetCardInfo("Satyr Wayfinder", 267, Rarity.COMMON, mage.cards.s.SatyrWayfinder.class)); + cards.add(new SetCardInfo("Scourge of the Throne", 230, Rarity.RARE, mage.cards.s.ScourgeOfTheThrone.class)); + cards.add(new SetCardInfo("Seedborn Muse", 268, Rarity.RARE, mage.cards.s.SeedbornMuse.class)); + cards.add(new SetCardInfo("Selesnya Signet", 324, Rarity.COMMON, mage.cards.s.SelesnyaSignet.class)); cards.add(new SetCardInfo("Selfless Spirit", 129, Rarity.RARE, mage.cards.s.SelflessSpirit.class)); + cards.add(new SetCardInfo("Selvala's Stampede", 269, Rarity.RARE, mage.cards.s.SelvalasStampede.class)); cards.add(new SetCardInfo("Shadow Summoning", 101, Rarity.UNCOMMON, mage.cards.s.ShadowSummoning.class)); + cards.add(new SetCardInfo("Shadrix Silverquill", 302, Rarity.MYTHIC, mage.cards.s.ShadrixSilverquill.class)); + cards.add(new SetCardInfo("Shalai, Voice of Plenty", 130, Rarity.RARE, mage.cards.s.ShalaiVoiceOfPlenty.class)); cards.add(new SetCardInfo("Shattered Landscape", 390, Rarity.COMMON, mage.cards.s.ShatteredLandscape.class)); cards.add(new SetCardInfo("Shattered Sanctum", 391, Rarity.RARE, mage.cards.s.ShatteredSanctum.class)); + cards.add(new SetCardInfo("Sheltered Thicket", 392, Rarity.RARE, mage.cards.s.ShelteredThicket.class)); cards.add(new SetCardInfo("Shigeki, Jukai Visionary", 270, Rarity.RARE, mage.cards.s.ShigekiJukaiVisionary.class)); cards.add(new SetCardInfo("Shiny Impetus", 231, Rarity.COMMON, mage.cards.s.ShinyImpetus.class)); cards.add(new SetCardInfo("Shivan Reef", 393, Rarity.RARE, mage.cards.s.ShivanReef.class)); + cards.add(new SetCardInfo("Sidar Kondo of Jamuraa", 303, Rarity.MYTHIC, mage.cards.s.SidarKondoOfJamuraa.class)); cards.add(new SetCardInfo("Siege-Gang Commander", 232, Rarity.RARE, mage.cards.s.SiegeGangCommander.class)); + cards.add(new SetCardInfo("Skarrgan Hellkite", 233, Rarity.MYTHIC, mage.cards.s.SkarrganHellkite.class)); cards.add(new SetCardInfo("Skull Prophet", 304, Rarity.UNCOMMON, mage.cards.s.SkullProphet.class)); cards.add(new SetCardInfo("Skullclamp", 103, Rarity.UNCOMMON, mage.cards.s.Skullclamp.class)); cards.add(new SetCardInfo("Skycloud Expanse", 394, Rarity.RARE, mage.cards.s.SkycloudExpanse.class)); + cards.add(new SetCardInfo("Slaughter the Strong", 131, Rarity.UNCOMMON, mage.cards.s.SlaughterTheStrong.class)); cards.add(new SetCardInfo("Smoldering Marsh", 395, Rarity.RARE, mage.cards.s.SmolderingMarsh.class)); cards.add(new SetCardInfo("Sol Ring", 106, Rarity.UNCOMMON, mage.cards.s.SolRing.class)); cards.add(new SetCardInfo("Solemn Simulacrum", 325, Rarity.RARE, mage.cards.s.SolemnSimulacrum.class)); + cards.add(new SetCardInfo("Spit Flame", 234, Rarity.RARE, mage.cards.s.SpitFlame.class)); cards.add(new SetCardInfo("Springbloom Druid", 271, Rarity.COMMON, mage.cards.s.SpringbloomDruid.class)); + cards.add(new SetCardInfo("Staff of Compleation", 326, Rarity.MYTHIC, mage.cards.s.StaffOfCompleation.class)); + cards.add(new SetCardInfo("Steel Hellkite", 327, Rarity.RARE, mage.cards.s.SteelHellkite.class)); cards.add(new SetCardInfo("Stitcher's Supplier", 196, Rarity.UNCOMMON, mage.cards.s.StitchersSupplier.class)); + cards.add(new SetCardInfo("Storm's Wrath", 236, Rarity.RARE, mage.cards.s.StormsWrath.class)); cards.add(new SetCardInfo("Storm-Kiln Artist", 235, Rarity.UNCOMMON, mage.cards.s.StormKilnArtist.class)); + cards.add(new SetCardInfo("Stormbreath Dragon", 237, Rarity.MYTHIC, mage.cards.s.StormbreathDragon.class)); cards.add(new SetCardInfo("Stroke of Midnight", 132, Rarity.UNCOMMON, mage.cards.s.StrokeOfMidnight.class)); cards.add(new SetCardInfo("Sublime Epiphany", 167, Rarity.RARE, mage.cards.s.SublimeEpiphany.class)); cards.add(new SetCardInfo("Sulfur Falls", 396, Rarity.RARE, mage.cards.s.SulfurFalls.class)); cards.add(new SetCardInfo("Sun Titan", 133, Rarity.MYTHIC, mage.cards.s.SunTitan.class)); + cards.add(new SetCardInfo("Sungrass Prairie", 397, Rarity.RARE, mage.cards.s.SungrassPrairie.class)); cards.add(new SetCardInfo("Sunken Hollow", 398, Rarity.RARE, mage.cards.s.SunkenHollow.class)); + cards.add(new SetCardInfo("Sunpetal Grove", 399, Rarity.RARE, mage.cards.s.SunpetalGrove.class)); + cards.add(new SetCardInfo("Swiftfoot Boots", 328, Rarity.UNCOMMON, mage.cards.s.SwiftfootBoots.class)); cards.add(new SetCardInfo("Swords to Plowshares", 134, Rarity.UNCOMMON, mage.cards.s.SwordsToPlowshares.class)); + cards.add(new SetCardInfo("Sylvan Caryatid", 272, Rarity.RARE, mage.cards.s.SylvanCaryatid.class)); cards.add(new SetCardInfo("Talisman of Conviction", 329, Rarity.UNCOMMON, mage.cards.t.TalismanOfConviction.class)); + cards.add(new SetCardInfo("Talisman of Creativity", 330, Rarity.UNCOMMON, mage.cards.t.TalismanOfCreativity.class)); cards.add(new SetCardInfo("Talisman of Hierarchy", 331, Rarity.UNCOMMON, mage.cards.t.TalismanOfHierarchy.class)); + cards.add(new SetCardInfo("Talisman of Impulse", 332, Rarity.UNCOMMON, mage.cards.t.TalismanOfImpulse.class)); cards.add(new SetCardInfo("Talisman of Progress", 333, Rarity.UNCOMMON, mage.cards.t.TalismanOfProgress.class)); cards.add(new SetCardInfo("Tasigur, the Golden Fang", 197, Rarity.RARE, mage.cards.t.TasigurTheGoldenFang.class)); + cards.add(new SetCardInfo("Taurean Mauler", 238, Rarity.RARE, mage.cards.t.TaureanMauler.class)); cards.add(new SetCardInfo("Tear Asunder", 273, Rarity.UNCOMMON, mage.cards.t.TearAsunder.class)); cards.add(new SetCardInfo("Tempest Technique", 16, Rarity.RARE, mage.cards.t.TempestTechnique.class)); + cards.add(new SetCardInfo("Temple of Abandon", 400, Rarity.RARE, mage.cards.t.TempleOfAbandon.class)); cards.add(new SetCardInfo("Temple of Enlightenment", 401, Rarity.RARE, mage.cards.t.TempleOfEnlightenment.class)); cards.add(new SetCardInfo("Temple of Epiphany", 402, Rarity.RARE, mage.cards.t.TempleOfEpiphany.class)); cards.add(new SetCardInfo("Temple of Malady", 403, Rarity.RARE, mage.cards.t.TempleOfMalady.class)); + cards.add(new SetCardInfo("Temple of Mystery", 404, Rarity.RARE, mage.cards.t.TempleOfMystery.class)); + cards.add(new SetCardInfo("Temple of Plenty", 405, Rarity.RARE, mage.cards.t.TempleOfPlenty.class)); cards.add(new SetCardInfo("Temple of Silence", 406, Rarity.RARE, mage.cards.t.TempleOfSilence.class)); cards.add(new SetCardInfo("Temple of Triumph", 407, Rarity.RARE, mage.cards.t.TempleOfTriumph.class)); + cards.add(new SetCardInfo("Temple of the Dragon Queen", 104, Rarity.UNCOMMON, mage.cards.t.TempleOfTheDragonQueen.class)); cards.add(new SetCardInfo("Tempt with Vengeance", 239, Rarity.RARE, mage.cards.t.TemptWithVengeance.class)); + cards.add(new SetCardInfo("Temur Ascendancy", 305, Rarity.RARE, mage.cards.t.TemurAscendancy.class)); cards.add(new SetCardInfo("Terramorphic Expanse", 408, Rarity.COMMON, mage.cards.t.TerramorphicExpanse.class)); + cards.add(new SetCardInfo("Territorial Hellkite", 240, Rarity.RARE, mage.cards.t.TerritorialHellkite.class)); cards.add(new SetCardInfo("Teval, the Balanced Scale", 8, Rarity.MYTHIC, mage.cards.t.TevalTheBalancedScale.class)); cards.add(new SetCardInfo("Thalisse, Reverent Medium", 306, Rarity.UNCOMMON, mage.cards.t.ThalisseReverentMedium.class)); cards.add(new SetCardInfo("Think Twice", 168, Rarity.COMMON, mage.cards.t.ThinkTwice.class)); cards.add(new SetCardInfo("Third Path Iconoclast", 307, Rarity.UNCOMMON, mage.cards.t.ThirdPathIconoclast.class)); + cards.add(new SetCardInfo("Thunderbreak Regent", 241, Rarity.RARE, mage.cards.t.ThunderbreakRegent.class)); cards.add(new SetCardInfo("Time Wipe", 308, Rarity.RARE, mage.cards.t.TimeWipe.class)); cards.add(new SetCardInfo("Timeless Witness", 274, Rarity.UNCOMMON, mage.cards.t.TimelessWitness.class)); cards.add(new SetCardInfo("Tocasia's Welcome", 135, Rarity.RARE, mage.cards.t.TocasiasWelcome.class)); + cards.add(new SetCardInfo("Tower Defense", 275, Rarity.UNCOMMON, mage.cards.t.TowerDefense.class)); + cards.add(new SetCardInfo("Towering Titan", 276, Rarity.MYTHIC, mage.cards.t.ToweringTitan.class)); cards.add(new SetCardInfo("Treasure Cruise", 169, Rarity.COMMON, mage.cards.t.TreasureCruise.class)); + cards.add(new SetCardInfo("Tree of Redemption", 97, Rarity.MYTHIC, mage.cards.t.TreeOfRedemption.class)); cards.add(new SetCardInfo("Twilight Drover", 136, Rarity.RARE, mage.cards.t.TwilightDrover.class)); + cards.add(new SetCardInfo("Twilight Mire", 409, Rarity.RARE, mage.cards.t.TwilightMire.class)); cards.add(new SetCardInfo("Vanquish the Horde", 91, Rarity.RARE, mage.cards.v.VanquishTheHorde.class)); cards.add(new SetCardInfo("Vault of the Archangel", 410, Rarity.RARE, mage.cards.v.VaultOfTheArchangel.class)); cards.add(new SetCardInfo("Velomachus Lorehold", 309, Rarity.MYTHIC, mage.cards.v.VelomachusLorehold.class)); + cards.add(new SetCardInfo("Vengeful Ancestor", 242, Rarity.RARE, mage.cards.v.VengefulAncestor.class)); + cards.add(new SetCardInfo("Verix Bladewing", 243, Rarity.MYTHIC, mage.cards.v.VerixBladewing.class)); cards.add(new SetCardInfo("Veyran, Voice of Duality", 310, Rarity.MYTHIC, mage.cards.v.VeyranVoiceOfDuality.class)); cards.add(new SetCardInfo("Victimize", 198, Rarity.UNCOMMON, mage.cards.v.Victimize.class)); cards.add(new SetCardInfo("Viscera Seer", 199, Rarity.COMMON, mage.cards.v.VisceraSeer.class)); + cards.add(new SetCardInfo("Wakestone Gargoyle", 137, Rarity.RARE, mage.cards.w.WakestoneGargoyle.class)); + cards.add(new SetCardInfo("Walking Bulwark", 334, Rarity.UNCOMMON, mage.cards.w.WalkingBulwark.class)); + cards.add(new SetCardInfo("Wall of Blossoms", 277, Rarity.UNCOMMON, mage.cards.w.WallOfBlossoms.class)); + cards.add(new SetCardInfo("Wall of Limbs", 200, Rarity.UNCOMMON, mage.cards.w.WallOfLimbs.class)); + cards.add(new SetCardInfo("Wall of Omens", 138, Rarity.UNCOMMON, mage.cards.w.WallOfOmens.class)); + cards.add(new SetCardInfo("Wall of Reverence", 139, Rarity.RARE, mage.cards.w.WallOfReverence.class)); + cards.add(new SetCardInfo("Wall of Roots", 278, Rarity.COMMON, mage.cards.w.WallOfRoots.class)); cards.add(new SetCardInfo("Wayfarer's Bauble", 335, Rarity.COMMON, mage.cards.w.WayfarersBauble.class)); + cards.add(new SetCardInfo("Weathered Sentinels", 336, Rarity.RARE, mage.cards.w.WeatheredSentinels.class)); + cards.add(new SetCardInfo("Welcoming Vampire", 140, Rarity.RARE, mage.cards.w.WelcomingVampire.class)); cards.add(new SetCardInfo("Whirlwind of Thought", 311, Rarity.RARE, mage.cards.w.WhirlwindOfThought.class)); cards.add(new SetCardInfo("Windbrisk Heights", 411, Rarity.RARE, mage.cards.w.WindbriskHeights.class)); + cards.add(new SetCardInfo("Wingmantle Chaplain", 141, Rarity.UNCOMMON, mage.cards.w.WingmantleChaplain.class)); cards.add(new SetCardInfo("Woe Strider", 201, Rarity.RARE, mage.cards.w.WoeStrider.class)); cards.add(new SetCardInfo("Wonder", 170, Rarity.UNCOMMON, mage.cards.w.Wonder.class)); cards.add(new SetCardInfo("Woodland Cemetery", 412, Rarity.RARE, mage.cards.w.WoodlandCemetery.class)); cards.add(new SetCardInfo("Yahenni, Undying Partisan", 202, Rarity.RARE, mage.cards.y.YahenniUndyingPartisan.class)); + cards.add(new SetCardInfo("Yavimaya Coast", 413, Rarity.RARE, mage.cards.y.YavimayaCoast.class)); cards.add(new SetCardInfo("Young Pyromancer", 95, Rarity.UNCOMMON, mage.cards.y.YoungPyromancer.class)); + cards.add(new SetCardInfo("Zetalpa, Primal Dawn", 142, Rarity.RARE, mage.cards.z.ZetalpaPrimalDawn.class)); } } diff --git a/Mage/src/main/java/mage/ObjectColor.java b/Mage/src/main/java/mage/ObjectColor.java index 4bc3f7b587f..b4caa2d6a13 100644 --- a/Mage/src/main/java/mage/ObjectColor.java +++ b/Mage/src/main/java/mage/ObjectColor.java @@ -5,10 +5,7 @@ import mage.constants.ColoredManaSymbol; import mage.util.Copyable; import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Objects; +import java.util.*; public class ObjectColor implements Serializable, Copyable, Comparable { @@ -19,17 +16,13 @@ public class ObjectColor implements Serializable, Copyable, Compara public static final ObjectColor GREEN = new ObjectColor("G"); public static final ObjectColor COLORLESS = new ObjectColor(); - - public static final ObjectColor GOLD = new ObjectColor("O"); // Not multicolored - Sword of Dungeons & Dragons - +private static final ListallColors= Arrays.asList(WHITE,BLUE,BLACK,RED,GREEN); private boolean white; private boolean blue; private boolean black; private boolean red; private boolean green; - private boolean gold; - public ObjectColor() { } @@ -51,10 +44,6 @@ public class ObjectColor implements Serializable, Copyable, Compara case 'G': green = true; break; - - case 'O': - gold = true; - break; } } } @@ -65,8 +54,6 @@ public class ObjectColor implements Serializable, Copyable, Compara black = color.black; red = color.red; green = color.green; - - gold = color.gold; } /** @@ -83,8 +70,6 @@ public class ObjectColor implements Serializable, Copyable, Compara newColor.black = black || other.black; newColor.red = red || other.red; newColor.green = green || other.green; - - newColor.gold = gold || other.gold; return newColor; } @@ -102,8 +87,6 @@ public class ObjectColor implements Serializable, Copyable, Compara newColor.black = black && other.black; newColor.red = red && other.red; newColor.green = green && other.green; - - newColor.gold = gold && other.gold; return newColor; } @@ -124,10 +107,6 @@ public class ObjectColor implements Serializable, Copyable, Compara if (red) { count++; } - - if (gold) { - count++; - } return count; } @@ -176,10 +155,6 @@ public class ObjectColor implements Serializable, Copyable, Compara if (colors.size() >= 2 && secondColor - firstColor >= 3) { Collections.swap(colors, 0, 1); } - - if (this.isGold()) { - colors.add(ObjectColor.GOLD); - } return colors; } @@ -189,8 +164,6 @@ public class ObjectColor implements Serializable, Copyable, Compara this.setGreen(color != null && color.isGreen()); this.setRed(color != null && color.isRed()); this.setWhite(color != null && color.isWhite()); - - this.setGold(color != null && color.isGold()); } public void addColor(ObjectColor color) { @@ -209,10 +182,6 @@ public class ObjectColor implements Serializable, Copyable, Compara if (color.isGreen()) { setGreen(true); } - - if (color.isGold()) { - setGold(true); - } } public boolean isColorless() { @@ -220,32 +189,26 @@ public class ObjectColor implements Serializable, Copyable, Compara } public boolean hasColor() { - return white || blue || black || red || green - || gold; + return white || blue || black || red || green; } public boolean isMulticolored() { if (isColorless()) { return false; } - if (white && (blue || black || red || green - || gold)) { - return true; + if (white) { + return blue || black || red || green; } - if (blue && (black || red || green - || gold)) { - return true; + if (blue) { + return black || red || green; } - if (black && (red || green - || gold)) { - return true; + if (black) { + return red || green; } - if (red && (green - || gold)) { - return true; + if (red) { + return green; } - return green - && gold; + return false; } public boolean isWhite() { @@ -288,14 +251,6 @@ public class ObjectColor implements Serializable, Copyable, Compara this.green = green; } - public boolean isGold() { - return gold; - } - - public void setGold(boolean gold) { - this.gold = gold; - } - @Override public String toString() { StringBuilder sb = new StringBuilder(5); @@ -314,36 +269,27 @@ public class ObjectColor implements Serializable, Copyable, Compara if (green) { sb.append('G'); } - - if (gold) { - sb.append('O'); - } return sb.toString(); } public String getDescription() { - if (getColorCount() > 1) { + if (isMulticolored()) { return "multicolored"; - } else { - if (white) { - return "white"; - } - if (blue) { - return "blue"; - } - if (black) { - return "black"; - } - if (red) { - return "red"; - } - if (green) { - return "green"; - } - - if (gold) { - return "gold"; - } + } + if (white) { + return "white"; + } + if (blue) { + return "blue"; + } + if (black) { + return "black"; + } + if (red) { + return "red"; + } + if (green) { + return "green"; } return "colorless"; } @@ -372,10 +318,6 @@ public class ObjectColor implements Serializable, Copyable, Compara if (test.green != this.green) { return false; } - if (test.gold != this.gold) { - return false; - } - return true; } @@ -387,8 +329,6 @@ public class ObjectColor implements Serializable, Copyable, Compara hash = 23 * hash + (this.black ? 1 : 0); hash = 23 * hash + (this.red ? 1 : 0); hash = 23 * hash + (this.green ? 1 : 0); - - hash = 23 * hash + (this.gold ? 1 : 0); return hash; } @@ -411,10 +351,6 @@ public class ObjectColor implements Serializable, Copyable, Compara if (color.green && this.green) { return true; } - - if (color.gold && this.gold) { - return true; - } return false; } @@ -422,8 +358,7 @@ public class ObjectColor implements Serializable, Copyable, Compara // 105.4. [...] “Multicolored” is not a color. Neither is “colorless.” return !color.isColorless() && (color.white && white || color.blue && blue || color.black && black - || color.red && red || color.green && green - || color.gold && gold); + || color.red && red || color.green && green); } @Override @@ -450,8 +385,6 @@ public class ObjectColor implements Serializable, Copyable, Compara o1 = 4; } else if (this.isWhite()) { o1 = 5; - } else if (this.isGold()) { - o1 = 6; } if (o.isMulticolored()) { @@ -468,8 +401,6 @@ public class ObjectColor implements Serializable, Copyable, Compara o2 = 4; } else if (o.isWhite()) { o2 = 5; - } else if (o.isGold()) { - o2 = 6; } return o1 - o2; @@ -482,7 +413,6 @@ public class ObjectColor implements Serializable, Copyable, Compara * @return null or */ public ColoredManaSymbol getOneColoredManaSymbol() { - if (isMulticolored()) { throw new IllegalStateException("Found multicolor object, but was waiting for simple color."); } @@ -503,21 +433,10 @@ public class ObjectColor implements Serializable, Copyable, Compara return ColoredManaSymbol.W; } - if (isGold()) { - return ColoredManaSymbol.O; - } return null; } public static List getAllColors() { - List colors = new ArrayList<>(); - colors.add(ObjectColor.WHITE); - colors.add(ObjectColor.BLUE); - colors.add(ObjectColor.BLACK); - colors.add(ObjectColor.RED); - colors.add(ObjectColor.GREEN); - - colors.add(ObjectColor.GOLD); - return colors; + return allColors; } } diff --git a/Mage/src/main/java/mage/abilities/common/CardsLeaveGraveyardTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/CardsLeaveGraveyardTriggeredAbility.java index 9c82a0e589b..3e7e2ea1c9c 100644 --- a/Mage/src/main/java/mage/abilities/common/CardsLeaveGraveyardTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/CardsLeaveGraveyardTriggeredAbility.java @@ -18,20 +18,27 @@ import java.util.Objects; public class CardsLeaveGraveyardTriggeredAbility extends TriggeredAbilityImpl { private final FilterCard filter; + private final boolean yourTurn; public CardsLeaveGraveyardTriggeredAbility(Effect effect) { this(effect, StaticFilters.FILTER_CARD_CARDS); } public CardsLeaveGraveyardTriggeredAbility(Effect effect, FilterCard filter) { + this(effect, filter, false); + } + + public CardsLeaveGraveyardTriggeredAbility(Effect effect, FilterCard filter, boolean yourTurn) { super(Zone.BATTLEFIELD, effect, false); this.filter = filter; - setTriggerPhrase("Whenever one or more " + filter + " leave your graveyard, "); + this.yourTurn = yourTurn; + setTriggerPhrase("Whenever one or more " + filter + " leave your graveyard" + (yourTurn ? " during your turn" : "") + ", "); } private CardsLeaveGraveyardTriggeredAbility(final CardsLeaveGraveyardTriggeredAbility ability) { super(ability); this.filter = ability.filter; + this.yourTurn = ability.yourTurn; } @Override @@ -41,6 +48,9 @@ public class CardsLeaveGraveyardTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { + if (yourTurn && !isControlledBy(game.getActivePlayerId())) { + return false; + } ZoneChangeGroupEvent zEvent = (ZoneChangeGroupEvent) event; return zEvent != null && Zone.GRAVEYARD == zEvent.getFromZone() diff --git a/Mage/src/main/java/mage/abilities/condition/common/BeheldDragonCondition.java b/Mage/src/main/java/mage/abilities/condition/common/BeheldDragonCondition.java new file mode 100644 index 00000000000..ca7e543bbe2 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/condition/common/BeheldDragonCondition.java @@ -0,0 +1,26 @@ +package mage.abilities.condition.common; + +import mage.abilities.Ability; +import mage.abilities.condition.Condition; +import mage.abilities.keyword.BeholdDragonAbility; +import mage.game.Game; +import mage.util.CardUtil; + +/** + * Checks if the spell was cast with the alternate behold a Dragon cost + * + * @author TheElk801 + */ +public enum BeheldDragonCondition implements Condition { + instance; + + @Override + public boolean apply(Game game, Ability source) { + return CardUtil.checkSourceCostsTagExists(game, source, BeholdDragonAbility.BEHOLD_DRAGON_ACTIVATION_VALUE_KEY); + } + + @Override + public String toString() { + return "Dragon was beheld"; + } +} diff --git a/Mage/src/main/java/mage/abilities/condition/common/MostCommonColorCondition.java b/Mage/src/main/java/mage/abilities/condition/common/MostCommonColorCondition.java index 3992edf70d1..98eb08a6c12 100644 --- a/Mage/src/main/java/mage/abilities/condition/common/MostCommonColorCondition.java +++ b/Mage/src/main/java/mage/abilities/condition/common/MostCommonColorCondition.java @@ -4,72 +4,65 @@ import mage.ObjectColor; import mage.abilities.Ability; import mage.abilities.condition.Condition; import mage.filter.FilterPermanent; +import mage.filter.StaticFilters; import mage.filter.predicate.Predicate; -import mage.filter.predicate.mageobject.ColorPredicate; import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.util.CardUtil; + +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; /** - * * @author TheElk801 */ public class MostCommonColorCondition implements Condition { protected final ObjectColor compareColor; protected final boolean isMono; - protected final Predicate predicate; + protected final FilterPermanent filter; public MostCommonColorCondition(ObjectColor color) { this(color, false, null); } - //Use this one if you don't want a tie for most common and want to restrict to a player (literally only Call to Arms) + // Use this one if you don't want a tie for most common and want to restrict to a player (literally only Call to Arms) public MostCommonColorCondition(ObjectColor color, boolean isMono, Predicate predicate) { this.compareColor = color; this.isMono = isMono; - this.predicate = predicate; + if (predicate == null) { + this.filter = StaticFilters.FILTER_PERMANENT; + } else { + this.filter = new FilterPermanent(); + this.filter.add(predicate); + } } @Override public boolean apply(Game game, Ability source) { - FilterPermanent[] colorFilters = new FilterPermanent[6]; - int i = 0; - for (ObjectColor color : ObjectColor.getAllColors()) { - colorFilters[i] = new FilterPermanent(); - colorFilters[i].add(new ColorPredicate(color)); - if (predicate != null) { - colorFilters[i].add(predicate); - } - i++; - } - int[] colorCounts = new int[6]; - i = 0; - for (ObjectColor color : ObjectColor.getAllColors()) { - colorFilters[i].add(new ColorPredicate(color)); - colorCounts[i] = game.getBattlefield().count(colorFilters[i], source.getControllerId(), source, game); - i++; - } - int max = 0; - for (i = 0; i < 5; i++) { - if (colorCounts[i] > max) { - max = colorCounts[i] * 1; + Map colorMap = new HashMap<>(); + for (Permanent permanent : game + .getBattlefield() + .getActivePermanents(filter, source.getControllerId(), source, game)) { + for (char c : permanent.getColor(game).toString().toCharArray()) { + colorMap.compute("" + c, CardUtil::setOrIncrementValue); } } - i = 0; - ObjectColor commonest = new ObjectColor(); - for (ObjectColor color : ObjectColor.getAllColors()) { - if (colorCounts[i] == max) { - commonest.addColor(color); - } - i++; - } - if (compareColor.shares(commonest)) { - if (isMono) { - return !commonest.isMulticolored(); - } else { - return true; - } - } - return false; + int most = colorMap + .values() + .stream() + .mapToInt(x -> x) + .max() + .orElse(0); + ObjectColor common = new ObjectColor( + colorMap.entrySet() + .stream() + .filter(e -> e.getValue() == most) + .map(Map.Entry::getKey) + .collect(Collectors.joining()) + ); + return common.shares(compareColor) && (!isMono || common.getColorCount() == 1); } @Override diff --git a/Mage/src/main/java/mage/abilities/effects/common/CreateTokenAttachSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/CreateTokenAttachSourceEffect.java index 618419c52ee..0d9c34e9c5b 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/CreateTokenAttachSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/CreateTokenAttachSourceEffect.java @@ -1,27 +1,37 @@ package mage.abilities.effects.common; import mage.abilities.Ability; +import mage.constants.Outcome; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.token.Token; +import java.util.Optional; + /** * @author weirddan455 */ public class CreateTokenAttachSourceEffect extends CreateTokenEffect { + private final boolean optional; public CreateTokenAttachSourceEffect(Token token) { this(token, ", then"); } public CreateTokenAttachSourceEffect(Token token, String innerConcat) { + this(token, innerConcat, false); + } + + public CreateTokenAttachSourceEffect(Token token, String innerConcat, boolean optional) { super(token); - staticText = staticText.concat(innerConcat + " attach {this} to it"); + this.optional = optional; + staticText = staticText.concat(innerConcat + (optional ? " you may" : "") + " attach {this} to it"); } private CreateTokenAttachSourceEffect(final CreateTokenAttachSourceEffect effect) { super(effect); + this.optional = effect.optional; } @Override @@ -32,11 +42,22 @@ public class CreateTokenAttachSourceEffect extends CreateTokenEffect { @Override public boolean apply(Game game, Ability source) { super.apply(game, source); - Permanent token = game.getPermanent(this.getLastAddedTokenIds().stream().findFirst().orElse(null)); - if (token != null) { - token.addAttachment(source.getSourceId(), source, game); - return true; + Permanent token = this + .getLastAddedTokenIds() + .stream() + .findFirst() + .map(game::getPermanent) + .orElse(null); + if (token == null || optional + && !Optional + .ofNullable(game.getPlayer(source.getControllerId())) + .map(player -> player.chooseUse( + Outcome.BoostCreature, "Attach the equipment to the token?", source, game + )) + .orElse(false)) { + return false; } - return false; + token.addAttachment(source.getSourceId(), source, game); + return true; } } diff --git a/Mage/src/main/java/mage/abilities/effects/mana/AddManaFromColorChoicesEffect.java b/Mage/src/main/java/mage/abilities/effects/mana/AddManaFromColorChoicesEffect.java new file mode 100644 index 00000000000..709bf7f0d6d --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/mana/AddManaFromColorChoicesEffect.java @@ -0,0 +1,75 @@ +package mage.abilities.effects.mana; + +import mage.Mana; +import mage.abilities.Ability; +import mage.choices.Choice; +import mage.constants.ManaType; +import mage.constants.Outcome; +import mage.game.Game; +import mage.players.Player; +import mage.util.CardUtil; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author TheElk801 + */ +public class AddManaFromColorChoicesEffect extends ManaEffect { + + private final List manaTypes = new ArrayList<>(); + private final List netMana = new ArrayList<>(); + + public AddManaFromColorChoicesEffect(ManaType... manaTypes) { + super(); + for (ManaType manaType : manaTypes) { + this.manaTypes.add(manaType); + } + this.manaTypes + .stream() + .map(CardUtil::manaTypeToColoredManaSymbol) + .map(Mana::new) + .forEach(netMana::add); + staticText = "add " + CardUtil + .concatWithOr(this.netMana.stream().map(s -> "{" + s + '}').collect(Collectors.toList())); + } + + private AddManaFromColorChoicesEffect(final AddManaFromColorChoicesEffect effect) { + super(effect); + this.manaTypes.addAll(effect.manaTypes); + effect.netMana.stream().map(Mana::copy).forEach(this.netMana::add); + } + + @Override + public AddManaFromColorChoicesEffect copy() { + return new AddManaFromColorChoicesEffect(this); + } + + @Override + public List getNetMana(Game game, Ability source) { + return netMana; + } + + public List getNetMana() { + return netMana; + } + + @Override + public Mana produceMana(Game game, Ability source) { + if (game == null || manaTypes.isEmpty()) { + return null; + } + Choice choice = ManaType.getChoiceOfManaTypes(manaTypes, false); + if (choice.getChoices().size() <= 1) { + choice.setChoice(choice.getChoices().iterator().next()); + } else { + Player player = game.getPlayer(source.getControllerId()); + if (player == null || !player.choose(Outcome.PutManaInPool, choice, game)) { + return null; + } + } + ManaType chosenType = ManaType.findByName(choice.getChoice()); + return chosenType == null ? null : new Mana(chosenType); + } +} diff --git a/Mage/src/main/java/mage/abilities/keyword/BeholdDragonAbility.java b/Mage/src/main/java/mage/abilities/keyword/BeholdDragonAbility.java new file mode 100644 index 00000000000..9c9d6fd5bbc --- /dev/null +++ b/Mage/src/main/java/mage/abilities/keyword/BeholdDragonAbility.java @@ -0,0 +1,91 @@ +package mage.abilities.keyword; + +import mage.abilities.Ability; +import mage.abilities.SpellAbility; +import mage.abilities.StaticAbility; +import mage.abilities.costs.*; +import mage.abilities.costs.common.BeholdDragonCost; +import mage.abilities.costs.common.CollectEvidenceCost; +import mage.abilities.hint.common.EvidenceHint; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.game.Game; +import mage.players.Player; + +/** + * @author TheElk801 + */ +public class BeholdDragonAbility extends StaticAbility implements OptionalAdditionalSourceCosts { + + private static final String promptString = "Behold a Dragon"; + private static final String keywordText = "As an additional cost to cast this spell, you may behold a Dragon"; + private static final String reminderText = "Choose a Dragon you control or reveal a Dragon card from your hand."; + private final String rule; + + public static final String BEHOLD_DRAGON_ACTIVATION_VALUE_KEY = "beholdDragonActivation"; + + protected OptionalAdditionalCost additionalCost; + + public static OptionalAdditionalCost makeCost() { + OptionalAdditionalCost cost = new OptionalAdditionalCostImpl(keywordText , reminderText, new BeholdDragonCost()); + cost.setRepeatable(false); + return cost; + } + public BeholdDragonAbility( ) { + super(Zone.STACK, null); + this.additionalCost = makeCost(); + this.rule = additionalCost.getName() + ". " + additionalCost.getReminderText(); + this.setRuleAtTheTop(true); + } + + private BeholdDragonAbility(final BeholdDragonAbility ability) { + super(ability); + this.rule = ability.rule; + this.additionalCost = ability.additionalCost.copy(); + } + + @Override + public BeholdDragonAbility copy() { + return new BeholdDragonAbility(this); + } + + public void resetCost() { + if (additionalCost != null) { + additionalCost.reset(); + } + } + + @Override + public void addOptionalAdditionalCosts(Ability ability, Game game) { + if (!(ability instanceof SpellAbility)) { + return; + } + + Player player = game.getPlayer(ability.getControllerId()); + if (player == null) { + return; + } + + this.resetCost(); + boolean canPay = additionalCost.canPay(ability, this, ability.getControllerId(), game); + if (!canPay || !player.chooseUse(Outcome.Exile, promptString + '?', ability, game)) { + return; + } + + additionalCost.activate(); + for (Cost cost : ((Costs) additionalCost)) { + ability.getCosts().add(cost.copy()); + } + ability.setCostsTag(BEHOLD_DRAGON_ACTIVATION_VALUE_KEY, null); + } + + @Override + public String getCastMessageSuffix() { + return additionalCost.getCastSuffixMessage(0); + } + + @Override + public String getRule() { + return rule; + } +} diff --git a/Mage/src/main/java/mage/abilities/keyword/HarmonizeAbility.java b/Mage/src/main/java/mage/abilities/keyword/HarmonizeAbility.java new file mode 100644 index 00000000000..92f6310401c --- /dev/null +++ b/Mage/src/main/java/mage/abilities/keyword/HarmonizeAbility.java @@ -0,0 +1,27 @@ +package mage.abilities.keyword; + +import mage.abilities.SpellAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.cards.Card; +import mage.constants.Zone; + +/** + * TODO: Implement this + * + * @author TheElk801 + */ +public class HarmonizeAbility extends SpellAbility { + + public HarmonizeAbility(Card card, String manaString) { + super(new ManaCostsImpl<>(manaString), card.getName(), Zone.GRAVEYARD); + } + + private HarmonizeAbility(final HarmonizeAbility ability) { + super(ability); + } + + @Override + public HarmonizeAbility copy() { + return new HarmonizeAbility(this); + } +} diff --git a/Mage/src/main/java/mage/abilities/keyword/MobilizeAbility.java b/Mage/src/main/java/mage/abilities/keyword/MobilizeAbility.java index 9c412ee595e..41878053fd8 100644 --- a/Mage/src/main/java/mage/abilities/keyword/MobilizeAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/MobilizeAbility.java @@ -2,12 +2,13 @@ package mage.abilities.keyword; import mage.abilities.Ability; import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; import mage.constants.Outcome; import mage.game.Game; import mage.game.permanent.token.RedWarriorToken; -import mage.players.Player; import mage.util.CardUtil; /** @@ -16,10 +17,11 @@ import mage.util.CardUtil; public class MobilizeAbility extends AttacksTriggeredAbility { public MobilizeAbility(int count) { - super(new MobilizeEffect(count), false, "Mobilize " + count + " (Whenever this creature attacks, create " - + (count == 1 ? "a" : CardUtil.numberToText(count)) + " tapped and attacking 1/1 red Warrior creature " - + (count == 1 ? "token" : "tokens") + ". Sacrifice " + (count == 1 ? "it" : "them") - + " at the beginning of the next end step.)"); + this(StaticValue.get(count)); + } + + public MobilizeAbility(DynamicValue count) { + super(new MobilizeEffect(count), false, makeText(count)); } protected MobilizeAbility(final MobilizeAbility ability) { @@ -30,13 +32,33 @@ public class MobilizeAbility extends AttacksTriggeredAbility { public MobilizeAbility copy() { return new MobilizeAbility(this); } + + private static String makeText(DynamicValue amount) { + StringBuilder sb = new StringBuilder(); + String message; + String numToText; + boolean plural; + if (amount instanceof StaticValue) { + int count = ((StaticValue) amount).getValue(); + message = "" + count; + numToText = CardUtil.numberToText(count, "a"); + plural = count > 1; + } else { + message = "X, where X is " + amount.getMessage() + '.'; + numToText = "X"; + plural = true; + } + return "Mobilize " + message + " (Whenever this creature attacks, create " + + numToText + " tapped and attacking 1/1 red Warrior creature token" + (plural ? "s" : "") + + ". Sacrifice " + (plural ? "them" : "it") + " at the beginning of the next end step.)"; + } } class MobilizeEffect extends OneShotEffect { - private final int count; + private final DynamicValue count; - MobilizeEffect(int count) { + MobilizeEffect(DynamicValue count) { super(Outcome.Benefit); this.count = count; } @@ -53,13 +75,9 @@ class MobilizeEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player == null) { - return false; - } CreateTokenEffect effect = new CreateTokenEffect(new RedWarriorToken(), this.count, true, true); effect.apply(game, source); effect.sacrificeTokensCreatedAtNextEndStep(game, source); return true; } -} \ No newline at end of file +} diff --git a/Mage/src/main/java/mage/abilities/mana/LimitedTimesPerTurnActivatedManaAbility.java b/Mage/src/main/java/mage/abilities/mana/LimitedTimesPerTurnActivatedManaAbility.java index 84f3c753328..f5e79185ea2 100644 --- a/Mage/src/main/java/mage/abilities/mana/LimitedTimesPerTurnActivatedManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/LimitedTimesPerTurnActivatedManaAbility.java @@ -4,6 +4,7 @@ package mage.abilities.mana; import mage.MageIdentifier; import mage.Mana; import mage.abilities.costs.Cost; +import mage.abilities.effects.mana.AddManaFromColorChoicesEffect; import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.effects.mana.ManaEffect; @@ -37,6 +38,14 @@ public class LimitedTimesPerTurnActivatedManaAbility extends ActivatedManaAbilit new Mana(0, 0, 0, 0, 0, 0, effect.getAmount(), 0)); } + public LimitedTimesPerTurnActivatedManaAbility(AddManaFromColorChoicesEffect effect, Cost cost) { + this(effect, cost, 1); + } + + public LimitedTimesPerTurnActivatedManaAbility(AddManaFromColorChoicesEffect effect, Cost cost, int maxActivationPerTurn) { + this(Zone.BATTLEFIELD, effect, cost, maxActivationPerTurn, effect.getNetMana()); + } + public LimitedTimesPerTurnActivatedManaAbility(Zone zone, ManaEffect effect, Cost cost, int maxActivationPerTurn, Mana mana) { this(zone, effect, cost, maxActivationPerTurn, Arrays.asList(mana)); } diff --git a/Mage/src/main/java/mage/constants/ManaType.java b/Mage/src/main/java/mage/constants/ManaType.java index c71e389b33e..5ae77674ae1 100644 --- a/Mage/src/main/java/mage/constants/ManaType.java +++ b/Mage/src/main/java/mage/constants/ManaType.java @@ -1,16 +1,12 @@ package mage.constants; -import java.util.ArrayList; -import java.util.EnumSet; -import java.util.HashSet; -import java.util.List; -import java.util.Set; import mage.Mana; import mage.choices.Choice; import mage.choices.ChoiceColor; +import java.util.*; + /** - * * @author North */ public enum ManaType { @@ -34,7 +30,7 @@ public enum ManaType { return text; } - public static Choice getChoiceOfManaTypes(Set types, boolean onlyColors) { + public static Choice getChoiceOfManaTypes(Collection types, boolean onlyColors) { Choice choice = new ChoiceColor(true); choice.getChoices().clear(); choice.setMessage("Pick a mana " + (onlyColors ? "color" : "type")); @@ -124,8 +120,8 @@ public enum ManaType { *

* Used for things like mapping back to a ManaType after the user chose from several of them. * - * @param name The name of the mana to find - * @return The ManaType representing that mana (or null) + * @param name The name of the mana to find + * @return The ManaType representing that mana (or null) */ public static ManaType findByName(String name) { switch (name) { @@ -153,6 +149,7 @@ public enum ManaType { } return manaTypes; } + public static Set getTrueManaTypes() { return EnumSet.of(BLACK, BLUE, GREEN, RED, WHITE, COLORLESS); } diff --git a/Mage/src/main/java/mage/game/permanent/token/DragonTokenGold.java b/Mage/src/main/java/mage/game/permanent/token/DragonTokenGold.java index dce23cdf7d5..fbc243bebb6 100644 --- a/Mage/src/main/java/mage/game/permanent/token/DragonTokenGold.java +++ b/Mage/src/main/java/mage/game/permanent/token/DragonTokenGold.java @@ -6,6 +6,8 @@ import mage.constants.CardType; import mage.constants.SubType; /** + * This token is supposed to be "gold" but the game rules don't support gold as a color in black border + * * @author Saga */ public final class DragonTokenGold extends TokenImpl { @@ -13,7 +15,11 @@ public final class DragonTokenGold extends TokenImpl { public DragonTokenGold() { super("Dragon Token", "4/4 gold Dragon creature token with flying"); cardType.add(CardType.CREATURE); - color.setGold(true); + color.setWhite(true); + color.setBlue(true); + color.setBlack(true); + color.setRed(true); + color.setGreen(true); subtype.add(SubType.DRAGON); power = new MageInt(4); toughness = new MageInt(4); @@ -27,4 +33,4 @@ public final class DragonTokenGold extends TokenImpl { public DragonTokenGold copy() { return new DragonTokenGold(this); } -} \ No newline at end of file +} diff --git a/Mage/src/main/java/mage/game/permanent/token/Elephant55Token.java b/Mage/src/main/java/mage/game/permanent/token/Elephant55Token.java new file mode 100644 index 00000000000..4b923485a6c --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/Elephant55Token.java @@ -0,0 +1,28 @@ +package mage.game.permanent.token; + +import mage.MageInt; +import mage.constants.CardType; +import mage.constants.SubType; + +/** + * @author TheElk801 + */ +public final class Elephant55Token extends TokenImpl { + + public Elephant55Token() { + super("Elephant Token", "5/5 green Elephant creature token"); + cardType.add(CardType.CREATURE); + color.setGreen(true); + subtype.add(SubType.ELEPHANT); + power = new MageInt(5); + toughness = new MageInt(5); + } + + private Elephant55Token(final Elephant55Token token) { + super(token); + } + + public Elephant55Token copy() { + return new Elephant55Token(this); + } +} diff --git a/Mage/src/main/java/mage/game/permanent/token/ReliquaryDragonToken.java b/Mage/src/main/java/mage/game/permanent/token/ReliquaryDragonToken.java new file mode 100644 index 00000000000..887042547df --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/ReliquaryDragonToken.java @@ -0,0 +1,44 @@ +package mage.game.permanent.token; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.LifelinkAbility; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.target.common.TargetAnyTarget; + +/** + * @author TheElk801 + */ +public final class ReliquaryDragonToken extends TokenImpl { + + public ReliquaryDragonToken() { + super("Reliquary Dragon", "4/4 Dragon creature token named Reliquary Dragon that's all colors. It has flying, lifelink, and \"When this token enters, it deals 3 damage to any target.\""); + cardType.add(CardType.CREATURE); + color.setWhite(true); + color.setBlue(true); + color.setBlack(true); + color.setRed(true); + color.setGreen(true); + subtype.add(SubType.DRAGON); + power = new MageInt(4); + toughness = new MageInt(4); + addAbility(FlyingAbility.getInstance()); + addAbility(LifelinkAbility.getInstance()); + + Ability ability = new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(3, "it")); + ability.addTarget(new TargetAnyTarget()); + addAbility(ability); + } + + private ReliquaryDragonToken(final ReliquaryDragonToken token) { + super(token); + } + + public ReliquaryDragonToken copy() { + return new ReliquaryDragonToken(this); + } +} diff --git a/Mage/src/main/resources/tokens-database.txt b/Mage/src/main/resources/tokens-database.txt index 8e8bbdbd04a..2064f6cd4ef 100644 --- a/Mage/src/main/resources/tokens-database.txt +++ b/Mage/src/main/resources/tokens-database.txt @@ -2480,4 +2480,28 @@ |Generate|TOK:DRC|Zombie|1||ZombieWhiteToken| |Generate|TOK:DRC|Zombie|2||ZombieDecayedToken| |Generate|TOK:DRC|Zombie Army|||ZombieArmyToken| -|Generate|TOK:DRC|Zombie Warrior|||GodEternalOketraToken| \ No newline at end of file +|Generate|TOK:DRC|Zombie Warrior|||GodEternalOketraToken| + +# TDC +|Generate|TOK:TDC|Angel|||AngelVigilanceToken| +|Generate|TOK:TDC|Citizen|||CitizenGreenWhiteToken| +|Generate|TOK:TDC|Dog|||WhiteDogToken| +|Generate|TOK:TDC|Dragon Illusion|||DragonIllusionToken| +|Generate|TOK:TDC|Eldrazi|||EldraziToken| +|Generate|TOK:TDC|Elemental|1||RedElementalToken| +|Generate|TOK:TDC|Elemental|2||Elemental11HasteToken| +|Generate|TOK:TDC|Elemental|3||Elemental44Token| +|Generate|TOK:TDC|First Mate Ragavan|||FirstMateRagavanToken| +|Generate|TOK:TDC|Goat|||GoatToken| +|Generate|TOK:TDC|Gold|||GoldToken| +|Generate|TOK:TDC|Human|||HumanToken| +|Generate|TOK:TDC|Insect|||InsectToken| +|Generate|TOK:TDC|Myr|||MyrToken| +|Generate|TOK:TDC|Plant|||PlantToken| +|Generate|TOK:TDC|Rat|||RatToken| +|Generate|TOK:TDC|Salamander Warrior|||SalamanderWarriorToken| +|Generate|TOK:TDC|Servo|||ServoToken| +|Generate|TOK:TDC|Snake|||OphiomancerSnakeToken| +|Generate|TOK:TDC|Soldier|||SoldierArtifactToken| +|Generate|TOK:TDC|Spirit|||SpiritWhiteToken| +|Generate|TOK:TDC|Thopter|||ThopterColorlessToken| diff --git a/Utils/keywords.txt b/Utils/keywords.txt index a55b9e603d9..a3eea683be2 100644 --- a/Utils/keywords.txt +++ b/Utils/keywords.txt @@ -63,6 +63,7 @@ For Mirrodin!|new| Freerunning|manaString| Friends forever|instance| Gift|card| +Harmonize|card, manaString| Haste|instance| Hexproof|instance| Hideaway|number| diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index b4f80d3d634..92dc2faa708 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -57201,6 +57201,7 @@ Sephiroth, Planet's Heir|Final Fantasy|553|M|{4}{U}{B}|Legendary Creature - Huma Ugin, Eye of the Storms|Tarkir: Dragonstorm|1|M|{7}|Legendary Planeswalker - Ugin|7|When you cast this spell, exile up to one target permanent that's one or more colors.$Whenever you cast a colorless spell, exile up to one target permanent that's one or more colors.$+2: You gain 3 life and draw a card.$0: Add {C}{C}{C}.$-11: Search your library for any number of colorless nonland cards, exile them, then shuffle. Until end of turn, you may cast those cards without paying their mana costs.| Anafenza, Unyielding Lineage|Tarkir: Dragonstorm|2|R|{2}{W}|Legendary Creature - Spirit Soldier|2|2|Flash$First strike$Whenever another nontoken creature you control dies, Anafenza endures 2.| Bearer of Glory|Tarkir: Dragonstorm|4|C|{1}{W}|Creature - Human Soldier|2|1|During your turn, this creature has first strike.${4}{W}: Creatures you control get +1/+1 until end of turn.| +Clarion Conqueror|Tarkir: Dragonstorm|5|R|{2}{W}|Creature - Dragon|3|3|Flying$Activated abilities of artifacts, creatures, and planeswalkers can't be activated.| Coordinated Maneuver|Tarkir: Dragonstorm|6|C|{1}{W}|Instant|||Choose one --$* Coordinated Maneuver deals damage equal to the number of creatures you control to target creature or planeswalker.$* Destroy target enchantment.| Dalkovan Packbeasts|Tarkir: Dragonstorm|7|U|{2}{W}|Creature - Ox|0|4|Vigilance$Mobilize 3| Descendant of Storms|Tarkir: Dragonstorm|8|U|{W}|Creature - Human Soldier|2|1|Whenever this creature attacks, you may pay {1}{W}. If you do, it endures 1.| @@ -57208,33 +57209,53 @@ Dragonback Lancer|Tarkir: Dragonstorm|9|C|{3}{W}|Creature - Human Soldier|3|3|Fl Duty Beyond Death|Tarkir: Dragonstorm|10|U|{1}{W}|Instant|||As an additional cost to cast this spell, sacrifice a creature.$Creatures you control gain indestructible until end of turn. Put a +1/+1 counter on each creature you control.| Elspeth, Storm Slayer|Tarkir: Dragonstorm|11|M|{3}{W}{W}|Legendary Planeswalker - Elspeth|5|If one or more tokens would be created under your control, twice that many of those tokens are created instead.$+1: Create a 1/1 white Soldier creature token.$0: Put a +1/+1 counter on each creature you control. Those creatures gain flying until your next turn.$-3: Destroy target creature an opponent controls with mana value 3 or greater.| Fortress Kin-Guard|Tarkir: Dragonstorm|12|C|{1}{W}|Creature - Dog Soldier|1|2|When this creature enters, it endures 1.| +Lightfoot Technique|Tarkir: Dragonstorm|14|C|{1}{W}|Instant|||Put a +1/+1 counter on target creature. It gains flying and indestructible until end of turn.| +Loxodon Battle Priest|Tarkir: Dragonstorm|15|U|{4}{W}|Creature - Elephant Cleric|3|5|At the beginning of combat on your turn, put a +1/+1 counter on another target creature you control.| Mardu Devotee|Tarkir: Dragonstorm|16|C|{W}|Creature - Human Scout|1|2|When this creature enters, scry 2.${1}: Add {R}, {W}, or {B}. Activate only once each turn.| +Osseous Exhale|Tarkir: Dragonstorm|17|C|{1}{W}|Instant|||As an additional cost to cast this spell, you may behold a Dragon.$Osseous Exhale deals 5 damage to target attacking or blocking creature. If a Dragon was beheld, you gain 2 life.| Rally the Monastery|Tarkir: Dragonstorm|19|U|{3}{W}|Instant|||This spell costs {2} less to cast if you've cast another spell this turn.$Choose one --$* Create two 1/1 white Monk creature tokens with prowess.$* Up to two target creatures you control each get +2/+2 until end of turn.$* Destroy target creature with power 4 or greater.| +Rebellious Strike|Tarkir: Dragonstorm|20|C|{1}{W}|Instant|||Target creature gets +3/+0 until end of turn.$Draw a card.| Riling Dawnbreaker|Tarkir: Dragonstorm|21|C|{4}{W}|Creature - Dragon|3|4|Flying, vigilance$At the beginning of combat on your turn, another target creature you control gets +1/+0 until end of turn.| Signaling Roar|Tarkir: Dragonstorm|21|C|{1}{W}|Sorcery - Omen|3|4|Create a 2/2 white Soldier creature token.| +Sage of the Skies|Tarkir: Dragonstorm|22|R|{2}{W}|Creature - Human Monk|2|3|When you cast this spell, if you've cast another spell this turn, copy this spell.$Flying, lifelink| Salt Road Packbeast|Tarkir: Dragonstorm|23|C|{5}{W}|Creature - Beast|4|3|This spell costs {1} less to cast for each creature you control.$When this creature enters, draw a card.| Smile at Death|Tarkir: Dragonstorm|24|M|{3}{W}{W}|Enchantment|||At the beginning of your upkeep, return up to two target creature cards with power 2 or less from your graveyard to the battlefield. Put a +1/+1 counter on each of those creatures.| +Starry-Eyed Skyrider|Tarkir: Dragonstorm|25|U|{2}{W}|Creature - Human Scout|1|3|Flying$Whenever this creature attacks, another target creature you control gains flying until end of turn.$Attacking tokens you control have flying.| Static Snare|Tarkir: Dragonstorm|26|U|{4}{W}|Enchantment|||Flash$This spell costs {1} less to cast for each attacking creature.$When this enchantment enters, exile target artifact or creature an opponent controls until this enchantment leaves the battlefield.| Stormplain Detainment|Tarkir: Dragonstorm|28|C|{2}{W}|Enchantment|||When this enchantment enters, exile target nonland permanent an opponent controls until this enchantment leaves the battlefield.| +Sunpearl Kirin|Tarkir: Dragonstorm|29|U|{1}{W}|Creature - Kirin|2|1|Flash$Flying$When this creature enters, return up to one other target nonland permanent you control to its owner's hand. If it was a token, draw a card.| +Teeming Dragonstorm|Tarkir: Dragonstorm|30|U|{3}{W}|Enchantment|||When this enchantment enters, create two 2/2 white Soldier creature tokens.$When a Dragon you control enters, return this enchantment to its owner's hand.| Tempest Hawk|Tarkir: Dragonstorm|31|C|{2}{W}|Creature - Bird|2|2|Flying$Whenever this creature deals combat damage to a player, you may search your library for a card named Tempest Hawk, reveal it, put it into your hand, then shuffle.$A deck can have any number of cards named Tempest Hawk.| United Battlefront|Tarkir: Dragonstorm|32|R|{3}{W}|Sorcery|||Look at the top seven cards of your library. Put up to two noncreature, nonland permanent cards with mana value 3 or less from among them onto the battlefield. Put the rest on the bottom of your library in a random order.| Voice of Victory|Tarkir: Dragonstorm|33|R|{1}{W}|Creature - Human Bard|1|3|Mobilize 2$Your opponents can't cast spells during your turn.| +Wayspeaker Bodyguard|Tarkir: Dragonstorm|34|U|{3}{W}|Creature - Orc Monk|3|4|When this creature enters, return target nonland permanent card with mana value 2 or less from your graveyard to your hand.$Flurry -- Whenever you cast your second spell each turn, tap target creature an opponent controls.| Aegis Sculptor|Tarkir: Dragonstorm|35|U|{3}{U}|Creature - Bird Wizard|2|3|Flying$Ward {2}$At the beginning of your upkeep, you may exile two cards from your graveyard. If you do, put a +1/+1 counter on this creature.| Agent of Kotis|Tarkir: Dragonstorm|36|C|{1}{U}|Creature - Human Rogue|2|1|Renew -- {3}{U}, Exile this card from your graveyard: Put two +1/+1 counters on target creature. Activate only as a sorcery.| +Ambling Stormshell|Tarkir: Dragonstorm|37|R|{3}{U}{U}|Creature - Turtle|5|9|Ward {2}$Whenever this creature attacks, put three stun counters on it and draw three cards.$Whenever you cast a Turtle spell, untap this creature.| +Bewildering Blizzard|Tarkir: Dragonstorm|38|U|{4}{U}{U}|Instant|||Draw three cards. Creatures your opponents control get -3/-0 until end of turn.| Dirgur Island Dragon|Tarkir: Dragonstorm|40|C|{5}{U}|Creature - Dragon|4|4|Flying$Ward {2}| Skimming Strike|Tarkir: Dragonstorm|40|C|{1}{U}|Instant - Omen|4|4|Tap up to one target creature. Draw a card.| +Dispelling Exhale|Tarkir: Dragonstorm|41|C|{1}{U}|Instant|||As an additional cost to cast this spell, you may behold a Dragon.$Counter target spell unless its controller pays {2}. If a Dragon was beheld, counter that spell unless its controller pays {4} instead.| Dragonologist|Tarkir: Dragonstorm|42|R|{2}{U}|Creature - Human Wizard|1|3|When this creature enters, look at the top six cards of your library. You may reveal an instant, sorcery, or Dragon card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.$Untapped Dragons you control have hexproof.| +Dragonstorm Forecaster|Tarkir: Dragonstorm|43|U|{U}|Creature - Human Scout|0|3|{2}, {T}: Search your library for a card named Dragonstorm Globe or Boulderborn Dragon, reveal it, put it into your hand, then shuffle.| Essence Anchor|Tarkir: Dragonstorm|44|U|{2}{U}|Artifact|||At the beginning of your upkeep, surveil 1.${T}: Create a 2/2 black Zombie Druid creature token. Activate only during your turn and only if a card left your graveyard this turn.| Fresh Start|Tarkir: Dragonstorm|46|U|{1}{U}|Enchantment - Aura|||Flash$Enchant creature$Enchanted creature gets -5/-0 and loses all abilities.| +Highspire Bell-Ringer|Tarkir: Dragonstorm|47|C|{2}{U}|Creature - Djinn Monk|1|4|Flying$The second spell you cast each turn costs {1} less to cast.| +Humbling Elder|Tarkir: Dragonstorm|48|C|{U}|Creature - Human Monk|1|2|Flash$When this creature enters, target creature an opponent controls gets -2/-0 until end of turn.| +Kishla Trawlers|Tarkir: Dragonstorm|50|U|{2}{U}|Creature - Human Citizen|3|2|When this creature enters, you may exile a creature card from your graveyard. When you do, return target instant or sorcery card from your graveyard to your hand.| Marang River Regent|Tarkir: Dragonstorm|51|R|{4}{U}{U}|Creature - Dragon|6|7|Flying$When this creature enters, return up to two other target nonland permanents to their owners' hands.| Coil and Catch|Tarkir: Dragonstorm|51|R|{3}{U}|Instant - Omen|6|7|Draw three cards, then discard a card.| +Naga Fleshcrafter|Tarkir: Dragonstorm|52|R|{3}{U}|Creature - Snake Shapeshifter|0|0|You may have this creature enter as a copy of any creature on the battlefield.$Renew -- {2}{U}, Exile this card from your graveyard: Put a +1/+1 counter on target nonlegendary creature you control. Each other creature you control becomes a copy of that creature until end of turn. Activate only as a sorcery.| Ringing Strike Mastery|Tarkir: Dragonstorm|53|C|{U}|Enchantment - Aura|||Enchant creature$When this Aura enters, tap enchanted creature.$Enchanted creature doesn't untap during its controller's untap step.$Enchanted creature has "{5}: Untap this creature."| Roiling Dragonstorm|Tarkir: Dragonstorm|55|U|{1}{U}|Enchantment|||When this enchantment enters, draw two cards, then discard a card.$When a Dragon you control enters, return this enchantment to its owner's hand.| Snowmelt Stag|Tarkir: Dragonstorm|57|C|{3}{U}|Creature - Elemental Elk|2|5|Vigilance$During your turn, this creature has base power and toughness 5/2.${5}{U}{U}: This creature can't be blocked this turn.| Spectral Denial|Tarkir: Dragonstorm|58|U|{X}{U}|Instant|||This spell costs {1} less to cast for each creature you control with power 4 or greater.$Counter target spell unless its controller pays {X}.| +Stillness in Motion|Tarkir: Dragonstorm|59|R|{1}{U}|Enchantment|||At the beginning of your upkeep, mill three cards. Then if you have no cards in your library, exile this enchantment and put five cards from your graveyard on top of your library in any order.| Taigam, Master Opportunist|Tarkir: Dragonstorm|60|M|{1}{U}|Legendary Creature - Human Monk|2|2|Flurry -- Whenever you cast your second spell each turn, copy it, then exile the spell you cast with four time counters on it. If it doesn't have suspend, it gains suspend.| Temur Devotee|Tarkir: Dragonstorm|61|C|{1}{U}|Creature - Human Druid|3|3|Defender${1}: Add {G}, {U}, or {R}. Activate only once each turn.| +Unending Whisper|Tarkir: Dragonstorm|62|C|{U}|Sorcery|||Draw a card.$Harmonize {5}{U}| Ureni's Rebuff|Tarkir: Dragonstorm|63|U|{1}{U}|Sorcery|||Return target creature to its owner's hand.$Harmonize {5}{U}| +Wingspan Stride|Tarkir: Dragonstorm|66|C|{U}|Enchantment - Aura|||Enchant creature$Enchanted creature gets +1/+1 and has flying.${2}{U}: Return this Aura to its owner's hand.| Winternight Stories|Tarkir: Dragonstorm|67|R|{2}{U}|Sorcery|||Draw three cards. Then discard two cards unless you discard a creature card.$Harmonize {4}{U}| Abzan Devotee|Tarkir: Dragonstorm|68|C|{1}{B}|Creature - Dog Cleric|2|1|{1}: Add {W}, {B}, or {G}. Activate only once each turn.${2}{B}: Return this card from your graveyard to your hand.| Alesha's Legacy|Tarkir: Dragonstorm|72|C|{1}{B}|Instant|||Target creature you control gains deathtouch and indestructible until end of turn.| @@ -57242,35 +57263,64 @@ Avenger of the Fallen|Tarkir: Dragonstorm|73|R|{2}{B}|Creature - Human Warrior|2 Caustic Exhale|Tarkir: Dragonstorm|74|C|{B}|Instant|||As an additional cost to cast this spell, behold a Dragon or pay {1}.$Target creature gets -3/-3 until end of turn.| Corroding Dragonstorm|Tarkir: Dragonstorm|75|U|{1}{B}|Enchantment|||When this enchantment enters, each opponent loses 2 life and you gain 2 life. Surveil 2.$When a Dragon you control enters, return this enchantment to its owner's hand.| Cruel Truths|Tarkir: Dragonstorm|76|C|{3}{B}|Instant|||Surveil 2, then draw two cards. You lose 2 life.| +Delta Bloodflies|Tarkir: Dragonstorm|77|C|{1}{B}|Creature - Insect|1|2|Flying$Whenever this creature attacks, if you control a creature with a counter on it, each opponent loses 1 life.| Desperate Measures|Tarkir: Dragonstorm|78|U|{B}|Instant|||Target creature gets +1/-1 until end of turn. When it dies under your control this turn, draw two cards.| +Dragon's Prey|Tarkir: Dragonstorm|79|C|{2}{B}|Instant|||This spell costs {2} more to cast if it targets a Dragon.$Destroy target creature.| +Feral Deathgorger|Tarkir: Dragonstorm|80|C|{5}{B}|Creature - Dragon|3|5|Flying, deathtouch$When this creature enters, exile up to two target cards from a single graveyard.| +Dusk Sight|Tarkir: Dragonstorm|80|C|{1}{B}|Sorcery - Omen|3|5|Put a +1/+1 counter on up to one target creature. Draw a card.| Krumar Initiate|Tarkir: Dragonstorm|84|U|{1}{B}|Creature - Human Cleric|2|2|{X}{B}, {T}, Pay X life: This creature endures X. Activate only as a sorcery.| Qarsi Revenant|Tarkir: Dragonstorm|86|R|{1}{B}{B}|Creature - Vampire|3|3|Flying, deathtouch, lifelink$Renew -- {2}{B}, Exile this card from your graveyard: Put a flying counter, a deathtouch counter, and a lifelink counter on target creature. Activate only as a sorcery.| +Rot-Curse Rakshasa|Tarkir: Dragonstorm|87|M|{1}{B}|Creature - Demon|5|5|Trample$Decayed$Renew -- {X}{B}{B}, Exile this card from your graveyard: Put a decayed counter on each of X target creatures. Activate only as a sorcery.| +Scavenger Regent|Tarkir: Dragonstorm|90|R|{3}{B}|Creature - Dragon|4|4|Flying$Ward--Discard a card.| +Exude Toxin|Tarkir: Dragonstorm|90|R|{X}{B}{B}|Sorcery - Omen|4|4|Each non-Dragon creature gets -X/-X until end of turn.| The Sibsig Ceremony|Tarkir: Dragonstorm|91|R|{B}{B}{B}|Legendary Enchantment|||Creature spells you cast cost {2} less to cast.$Whenever a creature you control enters, if you cast it, destroy that creature, then create a 2/2 black Zombie Druid creature token.| Sidisi, Regent of the Mire|Tarkir: Dragonstorm|92|R|{1}{B}|Legendary Creature - Zombie Snake Warlock|1|3|{T}, Sacrifice a creature you control with mana value X other than Sidisi: Return target creature card with mana value X plus 1 from your graveyard to the battlefield. Activate only as a sorcery.| +Sinkhole Surveyor|Tarkir: Dragonstorm|93|R|{1}{B}|Creature - Bird Scout|1|3|Flying$Whenever this creature attacks, you lose 1 life and this creature endures 1.| Unrooted Ancestor|Tarkir: Dragonstorm|96|U|{2}{B}|Creature - Spirit Cleric|3|2|Flash${1}, Sacrifice another creature: This creature gains indestructible until end of turn. Tap it.| Venerated Stormsinger|Tarkir: Dragonstorm|97|U|{3}{B}|Creature - Orc Cleric|3|3|Mobilize 1$Whenever this creature or another creature you control dies, each opponent loses 1 life and you gain 1 life.| +Wail of War|Tarkir: Dragonstorm|98|U|{2}{B}|Instant|||Choose one --$* Creatures target opponent controls get -1/-1 until end of turn.$* Return up to two target creature cards from your graveyard to your hand.| +Worthy Cost|Tarkir: Dragonstorm|99|C|{B}|Sorcery|||As an additional cost to cast this spell, sacrifice a creature.$Exile target creature or planeswalker.| Yathan Tombguard|Tarkir: Dragonstorm|100|U|{2}{B}|Creature - Human Warrior|2|3|Menace$Whenever a creature you control with a counter on it deals combat damage to a player, you draw a card and you lose 1 life.| +Breaching Dragonstorm|Tarkir: Dragonstorm|101|U|{4}{R}|Enchantment|||When this enchantment enters, exile cards from the top of your library until you exile a nonland card. You may cast it without paying its mana cost if that spell's mana value is 8 or less. If you don't, put that card into your hand.$When a Dragon you control enters, return this enchantment to its owner's hand.| +Channeled Dragonfire|Tarkir: Dragonstorm|102|U|{R}|Sorcery|||Channeled Dragonfire deals 2 damage to any target.$Harmonize {5}{R}{R}| +Cori-Steel Cutter|Tarkir: Dragonstorm|103|R|{1}{R}|Artifact - Equipment|||Equipped creature gets +1/+1 and has trample and haste.$Flurry -- Whenever you cast your second spell each turn, create a 1/1 white Monk creature token with prowess. You may attach this Equipment to it.$Equip {1}{R}| Devoted Duelist|Tarkir: Dragonstorm|104|C|{1}{R}|Creature - Goblin Monk|2|1|Haste$Flurry -- Whenever you cast your second spell each turn, this creature deals 1 damage to each opponent.| Dracogenesis|Tarkir: Dragonstorm|105|M|{6}{R}{R}|Enchantment|||You may cast Dragon spells without paying their mana costs.| Equilibrium Adept|Tarkir: Dragonstorm|106|U|{3}{R}|Creature - Dog Monk|2|4|When this creature enters, exile the top card of your library. Until the end of your next turn, you may play that card.$Flurry -- Whenever you cast your second spell each turn, this creature gains double strike until end of turn.| +Fire-Rim Form|Tarkir: Dragonstorm|107|C|{1}{R}|Enchantment - Aura|||Flash$Enchant creature$When this Aura enters, enchanted creature gains first strike until end of turn.$Enchanted creature gets +2/+0.| Jeskai Devotee|Tarkir: Dragonstorm|110|C|{1}{R}|Creature - Orc Monk|2|2|Flurry -- Whenever you cast your second spell each turn, this creature gets +1/+1 until end of turn.${1}: Add {U}, {R}, or {W}. Activate only once each turn.| Magmatic Hellkite|Tarkir: Dragonstorm|111|R|{2}{R}{R}|Creature - Dragon|4|5|Flying$When this creature enters, destroy target nonbasic land an opponent controls. Its controller searches their library for a basic land card, puts it onto the battlefield tapped with a stun counter on it, then shuffles.| +Meticulous Artisan|Tarkir: Dragonstorm|112|C|{3}{R}|Creature - Djinn Artificer|3|3|Prowess$When this creature enters, create a Treasure token.| +Molten Exhale|Tarkir: Dragonstorm|113|C|{1}{R}|Sorcery|||You may cast this spell as though it had flash if you behold a Dragon as an additional cost to cast it.$Molten Exhale deals 4 damage to target creature or planeswalker.| +Narset's Rebuke|Tarkir: Dragonstorm|114|C|{4}{R}|Instant|||Narset's Rebuke deals 5 damage to target creature. Add {U}{R}{W}. If that creature would die this turn, exile it instead.| +Reverberating Summons|Tarkir: Dragonstorm|117|U|{1}{R}|Enchantment|||At the beginning of each combat, if you've cast two or more spells this turn, this enchantment becomes a 3/3 Monk creature with haste in addition to its other types until end of turn.${1}{R}, Discard your hand, Sacrifice this enchantment: Draw two cards.| Sarkhan, Dragon Ascendant|Tarkir: Dragonstorm|118|R|{1}{R}|Legendary Creature - Human Druid|2|2|When Sarkhan enters, you may behold a Dragon. If you do, create a Treasure token.$Whenever a Dragon you control enters, put a +1/+1 counter on Sarkhan. Until end of turn, Sarkhan becomes a Dragon in addition to its other types and gains flying.| Seize Opportunity|Tarkir: Dragonstorm|119|C|{2}{R}|Instant|||Choose one --$* Exile the top two cards of your library. Until the end of your next turn, you may play those cards.$* Up to two target creatures each get +2/+1 until end of turn.| Shock Brigade|Tarkir: Dragonstorm|120|C|{1}{R}|Creature - Goblin Soldier|1|3|Menace$Mobilize 1| +Shocking Sharpshooter|Tarkir: Dragonstorm|121|U|{1}{R}|Creature - Human Archer|1|3|Reach$Whenever another creature you control enters, this creature deals 1 damage to target opponent.| Stormscale Scion|Tarkir: Dragonstorm|123|M|{4}{R}{R}|Creature - Dragon|4|4|Flying$Other Dragons you control get +1/+1.$Storm| +Stormshriek Feral|Tarkir: Dragonstorm|124|C|{4}{R}|Creature - Dragon|3|3|Flying, haste${1}{R}: This creature gets +1/+0 until end of turn.| +Flush Out|Tarkir: Dragonstorm|124|C|{1}{R}|Sorcery - Omen|3|3|Discard a card. If you do, draw two cards.| Summit Intimidator|Tarkir: Dragonstorm|125|C|{3}{R}|Creature - Yeti|4|3|Reach$When this creature enters, target creature can't block this turn.| Sunset Strikemaster|Tarkir: Dragonstorm|126|U|{1}{R}|Creature - Human Monk|3|1|{T}: Add {R}.${2}{R}, {T}, Sacrifice this creature: It deals 6 damage to target creature with flying.| Tersa Lightshatter|Tarkir: Dragonstorm|127|R|{2}{R}|Legendary Creature - Orc Wizard|3|3|Haste$When Tersa Lightshatter enters, discard up to two cards, then draw that many cards.$Whenever Tersa Lightshatter attacks, if there are seven or more cards in your graveyard, exile a card at random from your graveyard. You may play that card this turn.| Underfoot Underdogs|Tarkir: Dragonstorm|129|C|{2}{R}|Creature - Goblin Warrior|1|2|When this creature enters, create a 1/1 red Goblin creature token.${1}, {T}: Target creature you control with power 2 or less can't be blocked this turn.| +Unsparing Boltcaster|Tarkir: Dragonstorm|130|U|{2}{R}|Creature - Ogre Wizard|3|3|When this creature enters, it deals 5 damage to target creature an opponent controls that was dealt damage this turn.| War Effort|Tarkir: Dragonstorm|131|U|{3}{R}|Enchantment|||Creatures you control get +1/+0.$Whenever you attack, create a 1/1 red Warrior creature token that's tapped and attacking. Sacrifice it at the beginning of the next end step.| +Zurgo's Vanguard|Tarkir: Dragonstorm|133|U|{2}{R}|Creature - Dog Soldier|*|3|Mobilize 1$This creature's power is equal to the number of creatures you control.| Attuned Hunter|Tarkir: Dragonstorm|135|U|{2}{G}|Creature - Human Ranger|3|3|Trample$Whenever one or more cards leave your graveyard during your turn, put a +1/+1 counter on this creature.| Bloomvine Regent|Tarkir: Dragonstorm|136|R|{3}{G}{G}|Creature - Dragon|4|5|Flying$Whenever this creature or another Dragon you control enters, you gain 3 life.| -Claim Territory|Tarkir: Dragonstorm|136|R|{2}{G}|Sorcery - Omen|4|5|Search your library for up to two basic Forest cards, reveal them, put one onto the batatlefield tapped and the other into your hand, then shuffle.| +Claim Territory|Tarkir: Dragonstorm|136|R|{2}{G}|Sorcery - Omen|4|5|Search your library for up to two basic Forest cards, reveal them, put one onto the battlefield tapped and the other into your hand, then shuffle.| Craterhoof Behemoth|Tarkir: Dragonstorm|138|M|{5}{G}{G}{G}|Creature - Beast|5|5|Haste$When this creature enters, creatures you control gain trample and get +X/+X until end of turn, where X is the number of creatures you control.| Dragonbroods' Relic|Tarkir: Dragonstorm|140|U|{1}{G}|Artifact|||{T}, Tap an untapped creature you control: Add one mana of any color.${3}{W}{U}{B}{R}{G}, Sacrifice this artifact: Create a 4/4 Dragon creature token named Reliquary Dragon that's all colors. It has flying, lifelink, and "When this token enters, it deals 3 damage to any target." Activate only as a sorcery.| Dusyut Earthcarver|Tarkir: Dragonstorm|141|C|{5}{G}|Creature - Elephant Druid|4|4|Reach$When this creature enters, it endures 3.| +Encroaching Dragonstorm|Tarkir: Dragonstorm|142|U|{3}{G}|Enchantment|||When this enchantment enters, search your library for up to two basic land cards, put them onto the battlefield tapped, then shuffle.$When a Dragon you control enters, return this enchantment to its owner's hand.| +Herd Heirloom|Tarkir: Dragonstorm|144|R|{1}{G}|Artifact|||{T}: Add one mana of any color. Spend this mana only to cast a creature spell.${T}: Until end of turn, target creature you control with power 4 or greater gains trample and "Whenever this creature deals combat damage to a player, draw a card."| Heritage Reclamation|Tarkir: Dragonstorm|145|C|{1}{G}|Instant|||Choose one --$* Destroy target artifact.$* Destroy target enchantment.$* Exile up to one target card from a graveyard. Draw a card.| +Krotiq Nestguard|Tarkir: Dragonstorm|148|C|{2}{G}|Creature - Insect|4|4|Defender${2}{G}: This creature can attack this turn as though it didn't have defender.| +Lasyd Prowler|Tarkir: Dragonstorm|149|R|{2}{G}{G}|Creature - Snake Ranger|5|5|When this creature enters, you may mill cards equal to the number of lands you control.$Renew -- {1}{G}, Exile this card from your graveyard: Put X +1/+1 counters on target creature, where X is the number of land cards in your graveyard. Activate only as a sorcery.| +Nature's Rhythm|Tarkir: Dragonstorm|150|R|{X}{G}{G}|Sorcery|||Search your library for a creature card with mana value X or less, put it onto the battlefield, then shuffle.$Harmonize {X}{G}{G}{G}{G}| +Piercing Exhale|Tarkir: Dragonstorm|151|C|{1}{G}|Instant|||As an additional cost to cast this spell, you may behold a Dragon.$Target creature you control deals damage equal to its power to target creature or planeswalker. If a Dragon was beheld, surveil 2.| Rite of Renewal|Tarkir: Dragonstorm|153|U|{3}{G}|Sorcery|||Return up to two target permanent cards from your graveyard to your hand. Target player shuffles up to four target cards from their graveyard into their library. Exile Rite of Renewal.| Roamer's Routine|Tarkir: Dragonstorm|154|C|{2}{G}|Sorcery|||Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.$Harmonize {4}{G}| Sagu Wildling|Tarkir: Dragonstorm|157|C|{4}{G}|Creature - Dragon|3|3|Flying$When this creature enters, you gain 3 life.| @@ -57279,29 +57329,50 @@ Sarkhan's Resolve|Tarkir: Dragonstorm|158|C|{1}{G}|Instant|||Choose one --$* Tar Snakeskin Veil|Tarkir: Dragonstorm|159|C|{G}|Instant|||Put a +1/+1 counter on target creature you control. It gains hexproof until end of turn.| Sultai Devotee|Tarkir: Dragonstorm|160|C|{1}{G}|Creature - Zombie Snake Druid|2|1|Deathtouch${1}: Add {B}, {G}, or {U}. Activate only once each turn.| Surrak, Elusive Hunter|Tarkir: Dragonstorm|161|R|{2}{G}|Legendary Creature - Human Warrior|4|3|This spell can't be countered.$Trample$Whenever a creature you control or a creature spell you control becomes the target of a spell or ability an opponent controls, draw a card.| +Synchronized Charge|Tarkir: Dragonstorm|162|U|{1}{G}|Sorcery|||Distribute two +1/+1 counters among one or two target creatures you control. Creatures you control with counters on them gain vigilance and trample until end of turn.$Harmonize {4}{G}| +Traveling Botanist|Tarkir: Dragonstorm|164|U|{1}{G}|Creature - Dog Scout|2|3|Whenever this creature becomes tapped, look at the top card of your library. If it's a land card, you may reveal it and put it into your hand. If you don't put the card into your hand, you may put it into your graveyard.| Undergrowth Leopard|Tarkir: Dragonstorm|165|C|{1}{G}|Creature - Cat|2|2|Vigilance${1}, Sacrifice this creature: Destroy target artifact or enchantment.| +Warden of the Grove|Tarkir: Dragonstorm|166|R|{2}{G}|Creature - Hydra|2|2|At the beginning of your end step, put a +1/+1 counter on this creature.$Whenever another nontoken creature you control enters, it endures X, where X is the number of counters on this creature.| All-Out Assault|Tarkir: Dragonstorm|167|M|{2}{R}{W}{B}|Enchantment|||Creatures you control get +1/+1 and have deathtouch.$When this enchantment enters, if it's your main phase, there is an additional combat phase after this phase followed by an additional main phase. When you next attack this turn, untap each creature you control.| +Armament Dragon|Tarkir: Dragonstorm|168|U|{3}{W}{B}{G}|Creature -- Dragon|3|4|Flying$When this creature enters, distribute three +1/+1 counters among one, two, or three target creatures you control.| Auroral Procession|Tarkir: Dragonstorm|169|U|{G}{U}|Instant|||Return target card from your graveyard to your hand.| Awaken the Honored Dead|Tarkir: Dragonstorm|170|R|{B}{G}{U}|Enchantment - Saga|||(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)$I -- Destroy target nonland permanent.$II -- Mill three cards.$III -- You may discard a card. When you do, return target creature or land card from your graveyard to your hand.| Barrensteppe Siege|Tarkir: Dragonstorm|171|R|{2}{W}{B}|Enchantment|||As this enchantment enters, choose Abzan or Mardu.$* Abzan -- At the beginning of your end step, put a +1/+1 counter on each creature you control.$* Mardu -- At the beginning of your end step, if a creature died under your control this turn, each opponent sacrifices a creature of their choice.| Betor, Kin to All|Tarkir: Dragonstorm|172|M|{2}{W}{B}{G}|Legendary Creature - Spirit Dragon|5|7|Flying$At the beginning of your end step, if creatures you control have total toughness 10 or greater, draw a card. Then if creatures you control have total toughness 20 or greater, untap each creature you control. Then if creatures you control have total toughness 40 or greater, each opponent loses half their life, rounded up.| Bone-Cairn Butcher|Tarkir: Dragonstorm|173|U|{1}{R}{W}{B}|Creature - Demon|4|4|Mobilize 2$Attacking tokens you control have deathtouch.| +Call the Spirit Dragons|Tarkir: Dragonstorm|174|M|{W}{U}{B}{R}{G}|Enchantment|||Dragons you control have indestructible.$At the beginning of your upkeep, for each color, put a +1/+1 counter on a Dragon you control of that color. If you put +1/+1 counters on five Dragons this way, you win the game.| Cori Mountain Stalwart|Tarkir: Dragonstorm|175|U|{1}{R}{W}|Creature - Human Monk|3|3|Flurry -- Whenever you cast your second spell each turn, this creature deals 2 damage to each opponent and you gain 2 life.| Death Begets Life|Tarkir: Dragonstorm|176|M|{5}{B}{G}{U}|Sorcery|||Destroy all creatures and enchantments. Draw a card for each permanent destroyed this way.| +Defibrillating Current|Tarkir: Dragonstorm|177|U|{2/R}{2/W}{2/B}|Sorcery|||Defibrillating Current deals 4 damage to target creature or planeswalker and you gain 2 life.| Disruptive Stormbrood|Tarkir: Dragonstorm|178|U|{4}{G}|Creature - Dragon|3|3|Flying$When this creature enters, destroy up to one target artifact or enchantment.| Petty Revenge|Tarkir: Dragonstorm|178|U|{1}{B}|Sorcery - Omen|3|3|Destroy target creature with power 3 or less.| Dragonback Assault|Tarkir: Dragonstorm|179|M|{3}{G}{U}{R}|Enchantment|||When this enchantment enters, it deals 3 damage to each creature and each planeswalker.$Landfall -- Whenever a land you control enters, create a 4/4 red Dragon creature token with flying.| Effortless Master|Tarkir: Dragonstorm|181|U|{2}{U}{R}|Creature - Orc Monk|4|3|Vigilance$Menace$This creature enters with two +1/+1 counters on it if you've cast two or more spells this turn.| Eshki Dragonclaw|Tarkir: Dragonstorm|182|R|{1}{G}{U}{R}|Legendary Creature - Human Warrior|4|4|Vigilance, trample, ward {1}$At the beginning of combat on your turn, if you've cast both a creature spell and a noncreature spell this turn, draw a card and put two +1/+1 counters on Eshki Dragonclaw.| Fangkeeper's Familiar|Tarkir: Dragonstorm|183|R|{1}{B}{G}{U}|Creature - Snake|3|3|Flash$When this creature enters, choose one --$* You gain 3 life and surveil 3.$* Destroy target enchantment.$* Counter target creature spell.| +Felothar, Dawn of the Abzan|Tarkir: Dragonstorm|184|R|{W}{B}{G}|Legendary Creature - Human Warrior|3|3|Trample$Whenever Felothar enters or attacks, you may sacrifice a nonland permanent. When you do, put a +1/+1 counter on each creature you control.| +Flamehold Grappler|Tarkir: Dragonstorm|185|R|{U}{R}{W}|Creature - Human Monk|3|3|First strike$When this creature enters, copy the next spell you cast this turn when you cast it. You may choose new targets for the copy.| +Frontline Rush|Tarkir: Dragonstorm|186|U|{R}{W}|Instant|||Choose one --$* Create two 1/1 red Goblin creature tokens.$* Target creature gets +X/+X until end of turn, where X is the number of creatures you control.| Frostcliff Siege|Tarkir: Dragonstorm|187|R|{1}{U}{R}|Enchantment|||As this enchantment enters, choose Jeskai or Temur.$* Jeskai -- Whenever one or more creatures you control deal combat damage to a player, draw a card.$* Temur -- Creatures you control get +1/+0 and have trample and haste.| +Glacial Dragonhunt|Tarkir: Dragonstorm|188|U|{U}{R}|Sorcery|||Draw a card, then you may discard a card. When you discard a nonland card this way, Glacial Dragonhunt deals 3 damage to target creature.$Harmonize {4}{U}{R}| Glacierwood Siege|Tarkir: Dragonstorm|189|R|{1}{G}{U}|Enchantment|||As this enchantment enters, choose Temur or Sultai.$* Temur -- Whenever you cast an instant or sorcery spell, target player mills four cards.$* Sultai -- You may play lands from your graveyard.| Gurmag Nightwatch|Tarkir: Dragonstorm|190|C|{2/B}{2/G}{2/U}|Creature - Human Ranger|3|3|When this creature enters, look at the top three cards of your library. You may put one of those cards back on top of your library. Put the rest into your graveyard.| +Hardened Tactician|Tarkir: Dragonstorm|191|U|{1}{W}{B}|Creature - Human Warrior|2|4|{1}, Sacrifice a token: Draw a card.| +Hollowmurk Siege|Tarkir: Dragonstorm|192|R|{B}{G}|Enchantment|||As this enchantment enters, choose Sultai or Abzan.$* Sultai -- Whenever a counter is put on a creature you control, draw a card. This ability triggers only once each turn.$* Abzan -- Whenever you attack, put a +1/+1 counter on target attacking creature. It gains menace until end of turn.| Host of the Hereafter|Tarkir: Dragonstorm|193|U|{2}{B}{G}|Creature - Zombie Warlock|2|2|This creature enters with two +1/+1 counters on it.$Whenever this creature or another creature you control dies, if it had counters on it, put its counters on up to one target creature you control.| Inevitable Defeat|Tarkir: Dragonstorm|194|R|{1}{R}{W}{B}|Instant|||This spell can't be countered.$Exile target nonland permanent. Its controller loses 3 life and you gain 3 life.| +Jeskai Brushmaster|Tarkir: Dragonstorm|195|U|{1}{U}{R}{W}|Creature - Orc Monk|2|4|Double strike$Prowess| +Jeskai Revelation|Tarkir: Dragonstorm|196|M|{4}{U}{R}{W}|Instant|||Return target spell or permanent to its owner's hand. Jeskai Revelation deals 4 damage to any target. Create two 1/1 white Monk creature tokens with prowess. Draw two cards. You gain 4 life.| +Jeskai Shrinekeeper|Tarkir: Dragonstorm|197|U|{2}{U}{R}{W}|Creature - Dragon|3|3|Flying, haste$Whenever this creature deals combat damage to a player, you gain 1 life and draw a card.| +Karakyk Guardian|Tarkir: Dragonstorm|198|U|{3}{G}{U}{R}|Creature -- Dragon|6|5|Flying, vigilance, trample$This creature has hexproof if it hasn't dealt damage yet.| +Kheru Goldkeeper|Tarkir: Dragonstorm|199|U|{1}{B}{G}{U}|Creature - Dragon|3|3|Flying$Whenever one or more cards leave your graveyard during your turn, create a Treasure token.$Renew -- {2}{B}{G}{U}, Exile this card from your graveyard: Put two +1/+1 counters and a flying counter on target creature. Activate only as a sorcery.| +Kin-Tree Severance|Tarkir: Dragonstorm|200|U|{2/W}{2/B}{2/G}|Instant|||Exile target permanent with mana value 3 or greater.| Kishla Skimmer|Tarkir: Dragonstorm|201|U|{G}{U}|Creature - Bird Scout|2|2|Flying$Whenever a card leaves your graveyard during your turn, draw a card. This ability triggers only once each turn.| Kotis, the Fangkeeper|Tarkir: Dragonstorm|202|R|{1}{B}{G}{U}|Legendary Creature - Zombie Warrior|2|1|Indestructible$Whenever Kotis deals combat damage to a player, exile the top X cards of their library, where X is the amount of damage dealt. You may cast any number of spells with mana value X or less from among them without paying their mana costs.| Lie in Wait|Tarkir: Dragonstorm|203|U|{B}{G}{U}|Sorcery|||Return target creature card from your graveyard to your hand. Lie in Wait deals damage equal to that card's power to target creature.| +Lotuslight Dancers|Tarkir: Dragonstorm|204|R|{2}{B}{G}{U}|Creature - Zombie Bard|3|6|Lifelink$When this creature enters, search your library for a black card, a green card, and a blue card. Put those cards into your graveyard, then shuffle.| +Mammoth Bellow|Tarkir: Dragonstorm|205|U|{2}{G}{U}{R}|Sorcery|||Create a 5/5 green Elephant creature token.$Harmonize {5}{G}{U}{R}| +Mardu Siegebreaker|Tarkir: Dragonstorm|206|R|{1}{R}{W}{B}|Creature - Human Warrior|4|4|Deathtouch, haste$When this creature enters, exile up to one other target creature you control until this creature leaves the battlefield.$Whenever this creature attacks, for each opponent, create a tapped token that's a copy of the exiled card attacking that opponent. At the beginning of your end step, sacrifice those tokens.| Marshal of the Lost|Tarkir: Dragonstorm|207|U|{2}{W}{B}|Creature - Orc Warrior|3|3|Deathtouch$Whenever you attack, target creature gets +X/+X until end of turn, where X is the number of attacking creatures.| Monastery Messenger|Tarkir: Dragonstorm|208|C|{2/U}{2/R}{2/W}|Creature - Bird Scout|2|3|Flying, vigilance$When this creature enters, put up to one target noncreature, nonland card from your graveyard on top of your library.| Narset, Jeskai Waymaster|Tarkir: Dragonstorm|209|R|{U}{R}{W}|Legendary Creature - Human Monk|3|4|At the beginning of your end step, you may discard your hand. If you do, draw cards equal to the number of spells you've cast this turn.| @@ -57313,25 +57384,33 @@ Absorb Essence|Tarkir: Dragonstorm|213|U|{1}{W}|Instant - Omen|4|4|Target creatu Rakshasa's Bargain|Tarkir: Dragonstorm|214|U|{2/B}{2/G}{2/U}|Instant|||Look at the top four cards of your library. Put two of them into your hand and the rest into your graveyard.| Rediscover the Way|Tarkir: Dragonstorm|215|R|{U}{R}{W}|Enchantment - Saga|||(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)$I, II -- 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.$III -- Whenever you cast a noncreature spell this turn, target creature you control gains double strike until end of turn.| Reigning Victor|Tarkir: Dragonstorm|216|C|{2/R}{2/W}{2/B}|Creature - Orc Warrior|3|3|Mobilize 1$When this creature enters, target creature gets +1/+0 and gains indestructible until end of turn.| +Revival of the Ancestors|Tarkir: Dragonstorm|218|R|{1}{W}{B}{G}|Enchantment - Saga|||(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)$I -- Create three 1/1 white Spirit creature tokens.$II -- Distribute three +1/+1 counters among one, two, or three target creatures you control.$III -- Creatures you control gain trample and lifelink until end of turn.| Riverwheel Sweep|Tarkir: Dragonstorm|219|U|{2/U}{2/R}{2/W}|Sorcery|||Tap target creature. Put three stun counters on it.$Exile the top two cards of your library. Choose one of them. Until the end of your next turn, you may play that card.| +Roar of Endless Song|Tarkir: Dragonstorm|220|R|{2}{G}{U}{R}|Enchantment - Saga|||(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)$I, II -- Create a 5/5 green Elephant creature token.$III -- Double the power and toughness of each creature you control until end of turn.| Runescale Stormbrood|Tarkir: Dragonstorm|221|U|{3}{R}|Creature - Dragon|2|4|Flying$Whenever you cast a noncreature spell or a Dragon spell, this creature gets +2/+0 until end of turn.| Chilling Screech|Tarkir: Dragonstorm|221|U|{1}{U}|Instant - Omen|2|4|Counter target spell with mana value 2 or less.| Severance Priest|Tarkir: Dragonstorm|222|R|{W}{B}{G}|Creature - Djinn Cleric|3|3|Deathtouch$When this creature enters, target opponent reveals their hand. You may choose a nonland card from it. If you do, exile that card.$When this creature leaves the battlefield, the exiled card's owner creates an X/X white Spirit creature token, where X is the mana value of the exiled card.| Shiko, Paragon of the Way|Tarkir: Dragonstorm|223|M|{2}{U}{R}{W}|Legendary Creature - Spirit Dragon|4|5|Flying, vigilance$When Shiko enters, exile target nonland card with mana value 3 or less from your graveyard. Copy it, then you may cast the copy without paying its mana cost.| Skirmish Rhino|Tarkir: Dragonstorm|224|U|{W}{B}{G}|Creature - Rhino|3|4|Trample$When this creature enters, each opponent loses 2 life and you gain 2 life.| +Songcrafter Mage|Tarkir: Dragonstorm|225|R|{G}{U}{R}|Creature - Human Bard|3|2|Flash$When this creature enters, target instant or sorcery card in your graveyard gains harmonize until end of turn. Its harmonize cost is equal to its mana cost.| Sonic Shrieker|Tarkir: Dragonstorm|226|U|{2}{R}{W}{B}|Creature - Dragon|4|4|Flying$When this creature enters, it deals 2 damage to any target and you gain 2 life. If a player is dealt damage this way, they discard a card.| Stalwart Successor|Tarkir: Dragonstorm|227|U|{1}{B}{G}|Creature - Human Warrior|3|2|Menace$Whenever one or more counters are put on a creature you control, if it's the first time counters have been put on that creature this turn, put a +1/+1 counter on that creature.| Temur Battlecrier|Tarkir: Dragonstorm|228|R|{G}{U}{R}|Creature - Orc Ranger|4|3|During your turn, spells you cast cost {1} less to cast for each creature you control with power 4 or greater.| +Temur Tawnyback|Tarkir: Dragonstorm|229|C|{2/G}{2/U}{2/R}|Creature - Beast|4|3|When this creature enters, draw a card, then discard a card.| Teval, Arbiter of Virtue|Tarkir: Dragonstorm|230|M|{2}{B}{G}{U}|Legendary Creature - Spirit Dragon|6|6|Flying, lifelink$Spells you cast have delve.$Whenever you cast a spell, you lose life equal to its mana value.| +Thunder of Unity|Tarkir: Dragonstorm|231|R|{R}{W}{B}|Enchantment - Saga|||(As this Saga enters step, add a lore counter. Sacrifice after III.)$I -- You draw two cards and you lose 2 life.$II, III -- Whenever a creature you control enters this turn, each opponent loses 1 life and you gain 1 life.| Twinmaw Stormbrood|Tarkir: Dragonstorm|232|U|{5}{W}|Creature - Dragon|5|4|Flying$When this creature enters, you gain 5 life.| Charring Bite|Tarkir: Dragonstorm|232|U|{1}{R}|Sorcery - Omen|5|4|Charring Bite deals 5 damage to target creature without flying.| Ureni, the Song Unending|Tarkir: Dragonstorm|233|M|{5}{G}{U}{R}|Legendary Creature - Spirit Dragon|10|10|Flying, protection from white and from black$When Ureni enters, it deals X damage divided as you choose among any number of target creatures and/or planeswalkers your opponents control, where X is the number of lands you control.| Whirlwing Stormbrood|Tarkir: Dragonstorm|234|U|{4}{U}|Creature - Dragon|4|3|Flash$Flying$You may cast sorcery spells and Dragon spells as though they had flash.| Dynamic Soar|Tarkir: Dragonstorm|234|U|{2}{G}|Sorcery - Omen|4|3|Put three +1/+1 counters on target creature you control.| +Windcrag Siege|Tarkir: Dragonstorm|235|R|{1}{R}{W}|Enchantment|||As this enchantment enters, choose Mardu or Jeskai.$* Mardu -- If a creature attacking causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time.$* Jeskai -- At the beginning of your upkeep, create a 1/1 red Goblin creature token. It gains lifelink and haste until end of turn.| Yathan Roadwatcher|Tarkir: Dragonstorm|236|R|{1}{W}{B}{G}|Creature - Human Scout|3|3|When this creature enters, if you cast it, mill four cards. When you do, return target creature card with mana value 3 or less from your graveyard to the battlefield.| Zurgo, Thunder's Decree|Tarkir: Dragonstorm|237|R|{R}{W}{B}|Legendary Creature - Orc Warrior|2|4|Mobilize 2$During your end step, Warrior tokens you control have "This token can't be sacrificed."| Abzan Monument|Tarkir: Dragonstorm|238|U|{2}|Artifact|||When this artifact enters, search your library for a basic Plains, Swamp, or Forest card, reveal it, put it into your hand, then shuffle.${1}{W}{B}{G}, {T}, Sacrifice this artifact: Create an X/X white Spirit creature token, where X is the greatest toughness among creatures you control. Activate only as a sorcery.| Boulderborn Dragon|Tarkir: Dragonstorm|239|C|{5}|Artifact Creature - Dragon|3|3|Flying, vigilance$Whenever this creature attacks, surveil 1.| +Dragonfire Blade|Tarkir: Dragonstorm|240|R|{1}|Artifact - Equipment|||Equipped creature gets +2/+2 and has hexproof from monocolored.$Equip {4}. This ability costs {1} less to activate for each color of the creature it targets.| +Dragonstorm Globe|Tarkir: Dragonstorm|241|C|{3}|Artifact|||Each Dragon you control enters with an additional +1/+1 counter on it.${T}: Add one mana of any color.| Embermouth Sentinel|Tarkir: Dragonstorm|242|C|{2}|Artifact Creature - Chimera|2|1|When this creature enters, you may search your library for a basic land card, reveal it, then shuffle and put that card on top. If you control a Dragon, put that card onto the battlefield tapped instead.| Jade-Cast Sentinel|Tarkir: Dragonstorm|243|C|{4}|Artifact Creature - Ape Snake|1|5|Reach${2}, {T}: Put target card from a graveyard on the bottom of its owner's library.| Jeskai Monument|Tarkir: Dragonstorm|244|U|{2}|Artifact|||When this artifact enters, search your library for a basic Island, Mountain, or Plains card, reveal it, put it into your hand, then shuffle.${1}{U}{R}{W}, {T}, Sacrifice this artifact: Create two 1/1 white Bird creature tokens with flying. Activate only as a sorcery.| @@ -57368,8 +57447,6 @@ Swamp|Tarkir: Dragonstorm|281|C||Basic Land - Swamp|||({T}: Add {B}.)| Mountain|Tarkir: Dragonstorm|283|C||Basic Land - Mountain|||({T}: Add {R}.)| Forest|Tarkir: Dragonstorm|285|C||Basic Land - Forest|||({T}: Add {G}.)| Strategic Betrayal|Tarkir: Dragonstorm|422|U|{1}{B}|Sorcery|||Target opponent exiles a creature they control and their graveyard.| -Channeled Dragonfire|Tarkir: Dragonstorm|423|U|{R}|Sorcery|||Channeled Dragonfire deals 2 damage to any target.$Harmonize {5}{R}{R}| -Encroaching Dragonstorm|Tarkir: Dragonstorm|424|U|{3}{G}|Enchantment|||When this enchantment enters, search your library for up to two basic land cards, put them onto the battlefield tapped, then shuffle.$When a Dragon you control enters, return this enchantment to its owner's hand.| Betor, Ancestor's Voice|Tarkir: Dragonstorm Commander|1|M|{2}{W}{B}{G}|Legendary Creature - Spirit Dragon|3|5|Flying, lifelink$At the beginning of your end step, put a number of +1/+1 counters on up to one other target creature you control equal to the amount of life you gained this turn. Return up to one target creature card with mana value less than or equal to the amount of life you lost this turn from your graveyard to the battlefield.| Elsha, Threefold Master|Tarkir: Dragonstorm Commander|2|M|{U}{R}{W}|Legendary Creature - Djinn Monk|1|1|Trample$Prowess$Whenever Elsha deals combat damage to a player, create that many 1/1 white Monk creature tokens with prowess.| Eshki, Temur's Roar|Tarkir: Dragonstorm Commander|3|M|{G}{U}{R}|Legendary Creature - Human Warrior|2|2|Whenever you cast a creature spell, put a +1/+1 counter on Eshki. If that spell's power is 4 or greater, draw a card. If that spell's power is 6 or greater, Eshki deals damage equal to Eshki's power to each opponent.| @@ -57383,62 +57460,95 @@ Zurgo Stormrender|Tarkir: Dragonstorm Commander|10|M|{R}{W}{B}|Legendary Creatur Ainok Strike Leader|Tarkir: Dragonstorm Commander|11|R|{1}{W}|Creature - Dog Warrior|2|2|Whenever you attack with this creature and/or your commander, for each opponent, create a 1/1 red Goblin creature token that's tapped and attacking that player.$Sacrifice this creature: Creature tokens you control gain indestructible until end of turn.| Aligned Heart|Tarkir: Dragonstorm Commander|12|R|{2}{W}|Enchantment|||Flurry -- Whenever you cast your second spell each turn, put a rally counter on this enchantment. Then create a 1/1 white Monk creature token with prowess for each rally counter on it.| Ironwill Forger|Tarkir: Dragonstorm Commander|13|R|{3}{W}|Creature - Orc Artificer|3|3|Lieutenant -- At the beginning of combat on your turn, if you control your commander, target nonlegendary creature you control gains myriad until end of turn.| +Protector of the Wastes|Tarkir: Dragonstorm Commander|14|R|{4}{W}{W}|Creature - Dragon|5|5|Flying$When this creature enters or becomes monstrous, exile up to two target artifacts and/or enchantments controlled by different players.${4}{W}: Monstrosity 3.| +Reunion of the House|Tarkir: Dragonstorm Commander|15|R|{5}{W}{W}|Sorcery|||Return any number of target creature cards with total power 10 or less from your graveyard to the battlefield. Exile Reunion of the House.| Tempest Technique|Tarkir: Dragonstorm Commander|16|R|{3}{W}|Enchantment - Aura|||Storm$Enchant creature you control$Enchanted creature gets +1/+1 for each enchantment you control.| Will of the Mardu|Tarkir: Dragonstorm Commander|17|R|{2}{W}|Instant|||Choose one. If you control a commander as you cast this spell, you may choose both instead.$* Create a number of 1/1 red Warrior creature tokens equal to the number of creatures target player controls.$* Will of the Mardu deals damage to target creature equal to the number of creatures you control.| Adaptive Training Post|Tarkir: Dragonstorm Commander|18|R|{2}{U}|Artifact|||Whenever you cast an instant or sorcery spell, if this artifact has fewer than three charge counters on it, put a charge counter on it.$Remove three charge counters from this artifact: When you next cast an instant or sorcery spell this turn, copy it and you may choose new targets for the copy.| +Deceptive Frostkite|Tarkir: Dragonstorm Commander|19|R|{U}{U}|Creature - Dragon|1|1|Flying$You may have this creature enter as a copy of a creature you control with power 4 or greater, except it's a Dragon in addition to its other types and it has flying.| Diviner of Mist|Tarkir: Dragonstorm Commander|20|R|{4}{U}|Creature - Dragon|4|5|Flying$Whenever this creature attacks, mill four cards. You may cast an instant or sorcery spell from your graveyard with mana value 4 or less without paying its mana cost. If that spell would be put into your graveyard, exile it instead.| +Hammerhead Tyrant|Tarkir: Dragonstorm Commander|21|R|{4}{U}{U}|Creature - Dragon|6|6|Flying$Whenever you cast a spell, return up to one target nonland permanent an opponent controls with mana value less than or equal to that spell's mana value to its owner's hand.| Transcendent Dragon|Tarkir: Dragonstorm Commander|22|R|{4}{U}{U}|Creature - Dragon|4|3|Flash$Flying$When this creature enters, if you cast it, counter target spell. If that spell is countered this way, exile it instead of putting it into its owner's graveyard, then you may cast it without paying its mana cost.| Voracious Bibliophile|Tarkir: Dragonstorm Commander|23|R|{3}{U}|Creature - Dragon|3|3|Flying, vigilance$Whenever you cast a spell with one or more targets, draw that many cards.| +Will of the Temur|Tarkir: Dragonstorm Commander|24|R|{5}{U}|Sorcery|||Choose one. If you control a commander as you cast this spell, you may choose both instead.$* Create a token that's a copy of target permanent, except it's a 4/4 Dragon creature with flying in addition to its other types.$* Target player draws cards equal to the greatest mana value among permanents you control.| Afterlife from the Loam|Tarkir: Dragonstorm Commander|25|R|{5}{B}{B}{B}|Sorcery|||Delve$For each player, choose up to one target creature card in that player's graveyard. Put those cards onto the battlefield under your control. They're Zombies in addition to their other types.| Bone Devourer|Tarkir: Dragonstorm Commander|26|R|{3}{B}|Creature - Dragon|2|2|Flash$Flying$This creature enters with a number of +1/+1 counters on it equal to the number of creatures that died this turn.$When this creature dies, you draw X cards and you lose X life, where X is the number of +1/+1 counters on it.| +Jaws of Defeat|Tarkir: Dragonstorm Commander|27|R|{3}{B}|Enchantment|||Whenever a creature you control enters, target opponent loses life equal to the difference between that creature's power and its toughness.| Teval's Judgment|Tarkir: Dragonstorm Commander|28|R|{2}{B}|Enchantment|||Whenever one or more cards leave your graveyard, choose one that hasn't been chosen this turn --$* Draw a card.$* Create a Treasure token.$* Create a 2/2 black Zombie Druid creature token.| +Tip the Scales|Tarkir: Dragonstorm Commander|29|R|{2}{B}|Sorcery|||Sacrifice a creature. When you do, all creatures get -X/-X until end of turn, where X is the sacrificed creature's toughness.| Welcome the Dead|Tarkir: Dragonstorm Commander|30|R|{3}{B}|Sorcery|||Draw two cards, then discard a card and you lose 2 life. Create X tapped 2/2 black Zombie Druid creature tokens, where X is the number of cards that were put into your graveyard from your hand or library this turn.$Flashback {5}{B}| +Will of the Abzan|Tarkir: Dragonstorm Commander|31|R|{3}{B}|Sorcery|||Choose one. If you control a commander as you cast this spell, you may choose both instead.$* Any number of target opponents each sacrifice a creature with the greatest power among creatures that player controls and lose 3 life.$* Return target creature card from your graveyard to the battlefield.| Within Range|Tarkir: Dragonstorm Commander|32|R|{3}{B}|Enchantment|||When this enchantment enters, create two 1/1 red Warrior creature tokens.$Whenever you attack, each opponent loses life equal to the number of creatures attacking them.| Caldera Pyremaw|Tarkir: Dragonstorm Commander|33|R|{3}{R}{R}|Creature - Dragon|3|3|Flying$Whenever you cast an instant or sorcery spell, put a +1/+1 counter on this creature. Then this creature deals damage equal to its power to target opponent.| Goldlust Triad|Tarkir: Dragonstorm Commander|34|R|{4}{R}|Creature - Dragon|4|3|Flying$Myriad$Whenever this creature deals combat damage to a player, create a Treasure token.| Infantry Shield|Tarkir: Dragonstorm Commander|35|R|{2}{R}|Artifact - Equipment|||Equipped creature has menace and mobilize X, where X is its power.$Equip {2}| +Parapet Thrasher|Tarkir: Dragonstorm Commander|36|R|{2}{R}{R}|Creature - Dragon|4|3|Flying$Whenever one or more Dragons you control deal combat damage to an opponent, choose one that hasn't been chosen this turn --$* Destroy target artifact that opponent controls.$* This creature deals 4 damage to each other opponent.$* Exile the top card of your library. You may play it this turn.| Redoubled Stormsinger|Tarkir: Dragonstorm Commander|37|R|{2}{R}|Creature - Orc Wizard|3|3|First strike$Whenever this creature attacks, for each creature token you control that entered this turn, create a tapped and attacking token that's a copy of that token. At the beginning of the next end step, sacrifice those tokens.| +Thundermane Dragon|Tarkir: Dragonstorm Commander|38|R|{3}{R}|Creature - Dragon|4|4|Flying$You may look at the top card of your library any time.$You may cast creature spells with power 4 or greater from the top of your library. If you cast a creature spell this way, it gains haste until end of turn.| Transforming Flourish|Tarkir: Dragonstorm Commander|39|R|{2}{R}|Instant|||Demonstrate$Destroy target artifact or creature you don't control. If that permanent is destroyed this way, its controller exiles cards from the top of their library until they exile a nonland card, then they may cast that card without paying its mana cost.| Will of the Jeskai|Tarkir: Dragonstorm Commander|40|R|{3}{R}|Sorcery|||Choose one. If you control a commander as you cast this spell, you may choose both instead.$* Each player may discard their hand and draw five cards.$* Each instant and sorcery card in your graveyard gains flashback until end of turn. The flashback cost is equal to its mana cost.| +Zenith Festival|Tarkir: Dragonstorm Commander|41|R|{X}{R}{R}|Sorcery|||Exile the top X cards of your library. You may play them until the end of your next turn.$Harmonize {X}{R}{R}| +Arbor Adherent|Tarkir: Dragonstorm Commander|42|R|{3}{G}|Creature - Dog Druid|2|4|{T}: Add one mana of any color.${T}: Add X mana of any one color, where X is the greatest toughness among other creatures you control.| +Become the Avalanche|Tarkir: Dragonstorm Commander|43|R|{4}{G}{G}|Sorcery|||Draw a card for each creature you control with power 4 or greater. Then creatures you control get +X/+X until end of turn, where X is the number of cards in your hand.| +Broodcaller Scourge|Tarkir: Dragonstorm Commander|44|R|{5}{G}{G}|Creature - Dragon|5|7|Flying$Whenever one or more Dragons you control deal combat damage to a player, you may put a permanent card with mana value less than or equal to that damage from your hand onto the battlefield.| +Canopy Gargantuan|Tarkir: Dragonstorm Commander|45|R|{5}{G}{G}|Creature - Dragon|7|7|Flying, ward {2}$At the beginning of your upkeep, put a number of +1/+1 counters on each other creature you control equal to that creature's toughness.| Floral Evoker|Tarkir: Dragonstorm Commander|46|R|{2}{G}|Creature - Snake Druid|2|3|Landfall -- Whenever a land you control enters, put a+1/+1 counter on this creature.${G}, Discard a creature card: Return target land card from your graveyard to the battlefield tapped.| +Rampart Architect|Tarkir: Dragonstorm Commander|47|R|{3}{G}|Creature - Elephant Advisor|3|4|Whenever this creature enters or attacks, create a 1/3 white Wall creature token with defender.$Whenever a creature you control with defender dies, you may search your library for a basic land card, put that card onto the battlefield tapped, then shuffle.| Steward of the Harvest|Tarkir: Dragonstorm Commander|48|R|{3}{G}|Creature - Human Druid|3|3|When this creature enters, exile up to three target land cards from your graveyard.$Creatures you control have all activated abilities of all land cards exiled with this creature.| Will of the Sultai|Tarkir: Dragonstorm Commander|49|R|{4}{G}|Sorcery|||Choose one. If you control a commander as you cast this spell, you may choose both instead.$* Target player mills three cards. Return all land cards from your graveyard to the battlefield tapped.$* Put X+1/+1 counters on target creature, where X is the number of lands you control. It gains trample until end of turn.| Colossal Grave-Reaver|Tarkir: Dragonstorm Commander|50|R|{6}{B}{G}|Creature - Dragon|7|6|Flying$Whenever this creature enters or attacks, mill three cards.$Whenever one or more creature cards are put into your graveyard from your library, put one of them onto the battlefield.| Vanquish the Horde|Tarkir: Dragonstorm Commander|91|R|{6}{W}{W}|Sorcery|||This spell costs {1} less to cast for each creature on the battlefield.$Destroy all creatures.| Narset's Reversal|Tarkir: Dragonstorm Commander|92|R|{U}{U}|Instant|||Copy target instant or sorcery spell, then return it to its owner's hand. You may choose new targets for the copy.| -Gravecrawler|Tarkir: Dragonstorm Commander|93|C|{B}|Creature - Zombie|2|1|This creature can't block.$You may cast this card from your graveyard as long as you control a Zombie.| +Gravecrawler|Tarkir: Dragonstorm Commander|93|R|{B}|Creature - Zombie|2|1|This creature can't block.$You may cast this card from your graveyard as long as you control a Zombie.| +Dragon Tempest|Tarkir: Dragonstorm Commander|94|U|{1}{R}|Enchantment|||Whenever a creature you control with flying enters, it gains haste until end of turn.$Whenever a Dragon you control enters, it deals X damage to any target, where X is the number of Dragons you control.| Young Pyromancer|Tarkir: Dragonstorm Commander|95|U|{1}{R}|Creature - Human Shaman|2|1|Whenever you cast an instant or sorcery spell, create a 1/1 red Elemental creature token.| Life from the Loam|Tarkir: Dragonstorm Commander|96|R|{1}{G}|Sorcery|||Return up to three target land cards from your graveyard to your hand.$Dredge 3| -Casualties of War|Tarkir: Dragonstorm Commander|98|C|{2}{B}{B}{G}{G}|Sorcery|||Choose one or more --$* Destroy target artifact.$* Destroy target creature.$* Destroy target enchantment.$* Destroy target land.$* Destroy target planeswalker.| +Tree of Redemption|Tarkir: Dragonstorm Commander|97|M|{3}{G}|Creature - Plant|0|13|Defender${T}: Exchange your life total with this creature's toughness.| +Casualties of War|Tarkir: Dragonstorm Commander|98|R|{2}{B}{B}{G}{G}|Sorcery|||Choose one or more --$* Destroy target artifact.$* Destroy target creature.$* Destroy target enchantment.$* Destroy target land.$* Destroy target planeswalker.| Goblin Electromancer|Tarkir: Dragonstorm Commander|99|C|{U}{R}|Creature - Goblin Wizard|2|2|Instant and sorcery spells you cast cost {1} less to cast.| +Ikra Shidiqi, the Usurper|Tarkir: Dragonstorm Commander|100|M|{3}{B}{G}|Legendary Creature - Snake Wizard|3|7|Menace$Whenever a creature you control deals combat damage to a player, you gain life equal to that creature's toughness.$Partner| Shadow Summoning|Tarkir: Dragonstorm Commander|101|U|{W}{B}|Sorcery|||Create two tapped 1/1 white Spirit creature tokens with flying.| Lightning Greaves|Tarkir: Dragonstorm Commander|102|U|{2}|Artifact - Equipment|||Equipped creature has haste and shroud.$Equip {0}| Skullclamp|Tarkir: Dragonstorm Commander|103|U|{1}|Artifact - Equipment|||Equipped creature gets +1/-1.$Whenever equipped creature dies, draw two cards.$Equip {1}| +Temple of the Dragon Queen|Tarkir: Dragonstorm Commander|104|U||Land|||As this land enters, you may reveal a Dragon card from your hand. This land enters tapped unless you revealed a Dragon card this way or you control a Dragon.$As this land enters, choose a color.${T}: Add one mana of the chosen color.| Arcane Signet|Tarkir: Dragonstorm Commander|105|U|{2}|Artifact|||{T}: Add one mana of any color in your commander's color identity.| Sol Ring|Tarkir: Dragonstorm Commander|106|U|{1}|Artifact|||{T}: Add {C}{C}.| Command Tower|Tarkir: Dragonstorm Commander|107|C||Land|||{T}: Add one mana of any color in your commander's color identity.| Adeline, Resplendent Cathar|Tarkir: Dragonstorm Commander|108|R|{1}{W}{W}|Legendary Creature - Human Knight|*|4|Vigilance$Adeline's power is equal to the number of creatures you control.$Whenever you attack, for each opponent, create a 1/1 white Human creature token that's tapped and attacking that player or a planeswalker they control.| Angel of Invention|Tarkir: Dragonstorm Commander|109|M|{3}{W}{W}|Creature - Angel|2|1|Flying, vigilance, lifelink$Fabricate 2$Other creatures you control get +1/+1.| +Baldin, Century Herdmaster|Tarkir: Dragonstorm Commander|110|R|{4}{W}{W}|Legendary Creature - Human Warrior|0|7|As long as it's your turn, each creature assigns combat damage equal to its toughness rather than its power.$Whenever Baldin, Century Herdmaster attacks, up to one hundred target creatures each get +0/+X until end of turn, where X is the number of cards in your hand.| Commander's Insignia|Tarkir: Dragonstorm Commander|111|R|{2}{W}{W}|Enchantment|||Creatures you control get +1/+1 for each time you've cast your commander from the command zone this game.| Dismantling Wave|Tarkir: Dragonstorm Commander|112|R|{2}{W}|Sorcery|||For each opponent, destroy up to one target artifact or enchantment that player controls.$Cycling {6}{W}{W}$When you cycle this card, destroy all artifacts and enchantments.| Divine Visitation|Tarkir: Dragonstorm Commander|113|M|{3}{W}{W}|Enchantment|||If one or more creature tokens would be created under your control, that many 4/4 white Angel creature tokens with flying and vigilance are created instead.| Emeria Angel|Tarkir: Dragonstorm Commander|114|R|{2}{W}{W}|Creature - Angel|3|3|Flying$Landfall -- Whenever a land you control enters, you may create a 1/1 white Bird creature token with flying.| +Expel the Interlopers|Tarkir: Dragonstorm Commander|115|R|{3}{W}{W}|Sorcery|||Choose a number between 0 and 10. Destroy all creatures with power greater than or equal to the chosen number.| Ghostly Prison|Tarkir: Dragonstorm Commander|116|U|{2}{W}|Enchantment|||Creatures can't attack you unless their controller pays {2} for each creature they control that's attacking you.| Goldnight Commander|Tarkir: Dragonstorm Commander|117|U|{3}{W}|Creature - Human Cleric Soldier|2|2|Whenever another creature you control enters, creatures you control get +1/+1 until end of turn.| Grand Crescendo|Tarkir: Dragonstorm Commander|118|R|{X}{W}{W}|Instant|||Create X 1/1 green and white Citizen creature tokens. Creatures you control gain indestructible until end of turn.| Hero of Bladehold|Tarkir: Dragonstorm Commander|119|M|{2}{W}{W}|Creature - Human Knight|3|4|Battle cry$Whenever this creature attacks, create two 1/1 white Soldier creature tokens that are tapped and attacking.| Hour of Reckoning|Tarkir: Dragonstorm Commander|120|R|{4}{W}{W}{W}|Sorcery|||Convoke$Destroy all nontoken creatures.| +Indomitable Ancients|Tarkir: Dragonstorm Commander|121|R|{2}{W}{W}|Creature - Treefolk Warrior|2|10|| Legion Loyalty|Tarkir: Dragonstorm Commander|122|M|{6}{W}{W}|Enchantment|||Creatures you control have myriad.| Lingering Souls|Tarkir: Dragonstorm Commander|123|U|{2}{W}|Sorcery|||Create two 1/1 white Spirit creature tokens with flying.$Flashback {1}{B}| Mangara, the Diplomat|Tarkir: Dragonstorm Commander|124|R|{3}{W}|Legendary Creature - Human Cleric|2|4|Lifelink$Whenever an opponent attacks with creatures, if two or more of those creatures are attacking you and/or planeswalkers you control, draw a card.$Whenever an opponent casts their second spell each turn, draw a card.| Monastery Mentor|Tarkir: Dragonstorm Commander|125|M|{2}{W}|Creature - Human Monk|2|2|Prowess$Whenever you cast a noncreature spell, create a 1/1 white Monk creature token with prowess.| +Nyx-Fleece Ram|Tarkir: Dragonstorm Commander|126|U|{1}{W}|Enchantment Creature - Sheep|0|5|At the beginning of your upkeep, you gain 1 life.| Release the Dogs|Tarkir: Dragonstorm Commander|127|U|{3}{W}|Sorcery|||Create four 1/1 white Dog creature tokens.| +Rhox Faithmender|Tarkir: Dragonstorm Commander|128|R|{3}{W}|Creature - Rhino Monk|1|5|Lifelink$If you would gain life, you gain twice that much life instead.| Selfless Spirit|Tarkir: Dragonstorm Commander|129|R|{1}{W}|Creature - Spirit Cleric|2|1|Flying$Sacrifice this creature: Creatures you control gain indestructible until end of turn.| +Shalai, Voice of Plenty|Tarkir: Dragonstorm Commander|130|R|{3}{W}|Legendary Creature - Angel|3|4|Flying$You, planeswalkers you control, and other creatures you control have hexproof.${4}{G}{G}: Put a +1/+1 counter on each creature you control.| +Slaughter the Strong|Tarkir: Dragonstorm Commander|131|U|{1}{W}{W}|Sorcery|||Each player chooses any number of creatures they control with total power 4 or less, then sacrifices all other creatures they control.| Stroke of Midnight|Tarkir: Dragonstorm Commander|132|U|{2}{W}|Instant|||Destroy target nonland permanent. Its controller creates a 1/1 white Human creature token.| Sun Titan|Tarkir: Dragonstorm Commander|133|M|{4}{W}{W}|Creature - Giant|6|6|Vigilance$Whenever this creature enters or attacks, you may return target permanent card with mana value 3 or less from your graveyard to the battlefield.| Swords to Plowshares|Tarkir: Dragonstorm Commander|134|U|{W}|Instant|||Exile target creature. Its controller gains life equal to its power.| Tocasia's Welcome|Tarkir: Dragonstorm Commander|135|R|{2}{W}|Enchantment|||Whenever one or more creatures you control with mana value 3 or less enter, draw a card. This ability triggers only once each turn.| Twilight Drover|Tarkir: Dragonstorm Commander|136|R|{2}{W}|Creature - Spirit|1|1|Whenever a creature token leaves the battlefield, put a +1/+1 counter on this creature.${2}{W}, Remove a +1/+1 counter from this creature: Create two 1/1 white Spirit creature tokens with flying.| +Wakestone Gargoyle|Tarkir: Dragonstorm Commander|137|R|{3}{W}|Creature - Gargoyle|3|4|Defender, flying${1}{W}: Creatures you control with defender can attack this turn as though they didn't have defender.| +Wall of Omens|Tarkir: Dragonstorm Commander|138|U|{1}{W}|Creature - Wall|0|4|Defender$When this creature enters, draw a card.| +Wall of Reverence|Tarkir: Dragonstorm Commander|139|R|{3}{W}|Creature - Spirit Wall|1|6|Defender, flying$At the beginning of your end step, you may gain life equal to the power of target creature you control.| +Welcoming Vampire|Tarkir: Dragonstorm Commander|140|R|{2}{W}|Creature - Vampire|2|3|Flying$Whenever one or more other creatures you control with power 2 or less enter, draw a card. This ability triggers only once each turn.| +Wingmantle Chaplain|Tarkir: Dragonstorm Commander|141|U|{3}{W}|Creature - Human Cleric|0|3|Defender$When this creature enters, create a 1/1 white Bird creature token with flying for each creature with defender you control.$Whenever another creature you control with defender enters, create a 1/1 white Bird creature token with flying.| +Zetalpa, Primal Dawn|Tarkir: Dragonstorm Commander|142|R|{6}{W}{W}|Legendary Creature - Elder Dinosaur|4|8|Flying, double strike, vigilance, trample, indestructible| Amphin Mutineer|Tarkir: Dragonstorm Commander|143|R|{3}{U}|Creature - Salamander Pirate|3|3|When this creature enters, exile up to one target non-Salamander creature. That creature's controller creates a 4/3 blue Salamander Warrior creature token.$Encore {4}{U}{U}| Ancestral Vision|Tarkir: Dragonstorm Commander|144|R||Sorcery|||Suspend 4--{U}$Target player draws three cards.| Archmage Emeritus|Tarkir: Dragonstorm Commander|145|R|{2}{U}{U}|Creature - Human Wizard|2|2|Magecraft -- Whenever you cast or copy an instant or sorcery spell, draw a card.| @@ -57447,15 +57557,20 @@ Compulsive Research|Tarkir: Dragonstorm Commander|147|C|{2}{U}|Sorcery|||Target Consider|Tarkir: Dragonstorm Commander|148|C|{U}|Instant|||Surveil 1.$Draw a card.| Curse of the Swine|Tarkir: Dragonstorm Commander|149|R|{X}{U}{U}|Sorcery|||Exile X target creatures. For each creature exiled this way, its controller creates a 2/2 green Boar creature token.| Deep Analysis|Tarkir: Dragonstorm Commander|150|C|{3}{U}|Sorcery|||Target player draws two cards.$Flashback--{1}{U}, Pay 3 life.| +Draconic Lore|Tarkir: Dragonstorm Commander|151|C|{5}{U}|Instant|||This spell costs {2} less to cast if you control a Dragon.$Draw three cards.| Forbidden Alchemy|Tarkir: Dragonstorm Commander|152|C|{2}{U}|Instant|||Look at the top four cards of your library. Put one of them into your hand and the rest into your graveyard.$Flashback {6}{B}| Frantic Search|Tarkir: Dragonstorm Commander|153|C|{2}{U}|Instant|||Draw two cards, then discard two cards. Untap up to three lands.| Haughty Djinn|Tarkir: Dragonstorm Commander|154|R|{1}{U}{U}|Creature - Djinn|*|4|Flying$Haughty Djinn's power is equal to the number of instant and sorcery cards in your graveyard.$Instant and sorcery spells you cast cost {1} less to cast.| Hedron Crab|Tarkir: Dragonstorm Commander|155|U|{U}|Creature - Crab|0|2|Landfall -- Whenever a land you control enters, target player mills three cards.| +Keiga, the Tide Star|Tarkir: Dragonstorm Commander|156|R|{5}{U}|Legendary Creature - Dragon Spirit|5|5|Flying$When Keiga dies, gain control of target creature.| Lier, Disciple of the Drowned|Tarkir: Dragonstorm Commander|157|M|{3}{U}{U}|Legendary Creature - Human Wizard|3|4|Spells can't be countered.$Each instant and sorcery card in your graveyard has flashback. The flashback cost is equal to that card's mana cost.| Opt|Tarkir: Dragonstorm Commander|158|C|{U}|Instant|||Scry 1.$Draw a card.| Ponder|Tarkir: Dragonstorm Commander|159|C|{U}|Sorcery|||Look at the top three cards of your library, then put them back in any order. You may shuffle.$Draw a card.| Pongify|Tarkir: Dragonstorm Commander|160|U|{U}|Instant|||Destroy target creature. It can't be regenerated. Its controller creates a 3/3 green Ape creature token.| Preordain|Tarkir: Dragonstorm Commander|161|C|{U}|Sorcery|||Scry 2, then draw a card.| +Rapid Hybridization|Tarkir: Dragonstorm Commander|162|U|{U}|Instant|||Destroy target creature. It can't be regenerated. That creature's controller creates a 3/3 green Frog Lizard creature token.| +Reality Shift|Tarkir: Dragonstorm Commander|163|U|{1}{U}|Instant|||Exile target creature. Its controller manifests the top card of their library.| +Reflections of Littjara|Tarkir: Dragonstorm Commander|164|R|{4}{U}|Enchantment|||As this enchantment enters, choose a creature type.$Whenever you cast a spell of the chosen type, copy that spell.| Rite of Replication|Tarkir: Dragonstorm Commander|165|R|{2}{U}{U}|Sorcery|||Kicker {5}$Create a token that's a copy of target creature. If this spell was kicked, create five of those tokens instead.| River Kelpie|Tarkir: Dragonstorm Commander|166|R|{3}{U}{U}|Creature - Beast|3|3|Whenever this creature or another permanent enters from a graveyard, draw a card.$Whenever a player casts a spell from a graveyard, draw a card.$Persist| Sublime Epiphany|Tarkir: Dragonstorm Commander|167|R|{4}{U}{U}|Instant|||Choose one or more --$* Counter target spell.$* Counter target activated or triggered ability.$* Return target nonland permanent to its owner's hand.$* Create a token that's a copy of target creature you control.$* Target player draws a card.| @@ -57463,13 +57578,17 @@ Think Twice|Tarkir: Dragonstorm Commander|168|C|{1}{U}|Instant|||Draw a card.$Fl Treasure Cruise|Tarkir: Dragonstorm Commander|169|C|{7}{U}|Sorcery|||Delve$Draw three cards.| Wonder|Tarkir: Dragonstorm Commander|170|U|{3}{U}|Creature - Incarnation|2|2|Flying$As long as this card is in your graveyard and you control an Island, creatures you control have flying.| Bastion of Remembrance|Tarkir: Dragonstorm Commander|171|U|{2}{B}|Enchantment|||When this enchantment enters, create a 1/1 white Human Soldier creature token.$Whenever a creature you control dies, each opponent loses 1 life and you gain 1 life.| +Behind the Scenes|Tarkir: Dragonstorm Commander|172|U|{2}{B}|Enchantment|||Creatures you control have skulk.${4}{W}: Creatures you control get +1/+1 until end of turn.| Bitter Triumph|Tarkir: Dragonstorm Commander|173|U|{1}{B}|Instant|||As an additional cost to cast this spell, discard a card or pay 3 life.$Destroy target creature or planeswalker.| +Blight Pile|Tarkir: Dragonstorm Commander|174|U|{1}{B}|Creature - Phyrexian|3|3|Defender${2}{B}, {T}: Each opponent loses X life, where X is the number of creatures with defender you control.| Chittering Witch|Tarkir: Dragonstorm Commander|175|R|{3}{B}|Creature - Human Warlock|2|2|When this creature enters, create a number of 1/1 black Rat creature tokens equal to the number of opponents you have.${1}{B}, Sacrifice a creature: Target creature gets -2/-2 until end of turn.| Dauthi Voidwalker|Tarkir: Dragonstorm Commander|176|R|{B}{B}|Creature - Dauthi Rogue|3|2|Shadow$If a card would be put into an opponent's graveyard from anywhere, instead exile it with a void counter on it.${T}, Sacrifice this creature: Choose an exiled card an opponent owns with a void counter on it. You may play it this turn without paying its mana cost.| Deadly Dispute|Tarkir: Dragonstorm Commander|177|C|{1}{B}|Instant|||As an additional cost to cast this spell, sacrifice an artifact or creature.$Draw two cards and create a Treasure token.| Disciple of Bolas|Tarkir: Dragonstorm Commander|178|R|{3}{B}|Creature - Human Wizard|2|1|When this creature enters, sacrifice another creature. You gain X life and draw X cards, where X is that creature's power.| Eliminate the Competition|Tarkir: Dragonstorm Commander|179|R|{4}{B}|Sorcery|||As an additional cost to cast this spell, sacrifice X creatures.$Destroy X target creatures.| +Feed the Swarm|Tarkir: Dragonstorm Commander|180|C|{1}{B}|Sorcery|||Destroy target creature or enchantment an opponent controls. You lose life equal to that permanent's mana value.| Gix, Yawgmoth Praetor|Tarkir: Dragonstorm Commander|181|M|{1}{B}{B}|Legendary Creature - Phyrexian Praetor|3|3|Whenever a creature deals combat damage to one of your opponents, its controller may pay 1 life. If they do, they draw a card.${4}{B}{B}{B}, Discard X cards: Exile the top X cards of target opponent's library. You may play lands and cast spells from among cards exiled this way without paying their mana costs.| +Infernal Grasp|Tarkir: Dragonstorm Commander|182|U|{1}{B}|Instant|||Destroy target creature. You lose 2 life.| Junji, the Midnight Sky|Tarkir: Dragonstorm Commander|183|M|{3}{B}{B}|Legendary Creature - Dragon Spirit|5|5|Flying, menace$When Junji dies, choose one --$* Each opponent discards two cards and loses 2 life.$* Put target non-Dragon creature card from a graveyard onto the battlefield under your control. You lose 2 life.| Lethal Scheme|Tarkir: Dragonstorm Commander|184|R|{2}{B}{B}|Instant|||Convoke$Destroy target creature or planeswalker. Each creature that convoked Lethal Scheme connives.| Living Death|Tarkir: Dragonstorm Commander|185|R|{3}{B}{B}|Sorcery|||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.| @@ -57486,55 +57605,112 @@ Reassembling Skeleton|Tarkir: Dragonstorm Commander|195|U|{1}{B}|Creature - Skel Stitcher's Supplier|Tarkir: Dragonstorm Commander|196|U|{B}|Creature - Zombie|1|1|When this creature enters or dies, mill three cards.| Tasigur, the Golden Fang|Tarkir: Dragonstorm Commander|197|R|{5}{B}|Legendary Creature - Human Shaman|4|5|Delve${2}{G/U}{G/U}: Mill two cards, then return a nonland card of an opponent's choice from your graveyard to your hand.| Victimize|Tarkir: Dragonstorm Commander|198|U|{2}{B}|Sorcery|||Choose two target creature cards in your graveyard. Sacrifice a creature. If you do, return the chosen cards to the battlefield tapped.| +Wall of Limbs|Tarkir: Dragonstorm Commander|200|U|{2}{B}|Creature - Zombie Wall|0|3|Defender$Whenever you gain life, put a +1/+1 counter on this creature.${5}{B}{B}, Sacrifice this creature: Target player loses X life, where X is this creature's power.| Woe Strider|Tarkir: Dragonstorm Commander|201|R|{2}{B}|Creature - Horror|3|2|When this creature enters, create a 0/1 white Goat creature token.$Sacrifice another creature: Scry 1.$Escape--{3}{B}{B}, Exile four other cards from your graveyard.$This creature escapes with two +1/+1 counters on it.| Yahenni, Undying Partisan|Tarkir: Dragonstorm Commander|202|R|{2}{B}|Legendary Creature - Aetherborn Vampire|2|2|Haste$Whenever a creature an opponent controls dies, put a +1/+1 counter on Yahenni.$Sacrifice another creature: Yahenni gains indestructible until end of turn.| Abrade|Tarkir: Dragonstorm Commander|203|U|{1}{R}|Instant|||Choose one --$* Abrade deals 3 damage to target creature.$* Destroy target artifact.| +Atsushi, the Blazing Sky|Tarkir: Dragonstorm Commander|204|M|{2}{R}{R}|Legendary Creature - Dragon Spirit|4|4|Flying, trample$When Atsushi dies, choose one --$* Exile the top two cards of your library. Until the end of your next turn, you may play those cards.$* Create three Treasure tokens.| Beetleback Chief|Tarkir: Dragonstorm Commander|205|U|{2}{R}{R}|Creature - Goblin Warrior|2|2|When this creature enters, create two 1/1 red Goblin creature tokens.| Big Score|Tarkir: Dragonstorm Commander|206|C|{3}{R}|Instant|||As an additional cost to cast this spell, discard a card.$Draw two cards and create two Treasure tokens.| +Blasphemous Act|Tarkir: Dragonstorm Commander|207|R|{8}{R}|Sorcery|||This spell costs {1} less to cast for each creature on the battlefield.$Blasphemous Act deals 13 damage to each creature.| +Chaos Warp|Tarkir: Dragonstorm Commander|208|R|{2}{R}|Instant|||The owner of target permanent shuffles it into their library, then reveals the top card of their library. If it's a permanent card, they put it onto the battlefield.| Curse of Opulence|Tarkir: Dragonstorm Commander|209|U|{R}|Enchantment - Aura Curse|||Enchant player$Whenever enchanted player is attacked, create a Gold token. Each opponent attacking that player does the same.| +Dragonlord's Servant|Tarkir: Dragonstorm Commander|210|U|{1}{R}|Creature - Goblin Shaman|1|3|Dragon spells you cast cost {1} less to cast.| +Dragonmaster Outcast|Tarkir: Dragonstorm Commander|211|M|{R}|Creature - Human Shaman|1|1|At the beginning of your upkeep, if you control six or more lands, create a 5/5 red Dragon creature token with flying.| Electrodominance|Tarkir: Dragonstorm Commander|212|R|{X}{R}{R}|Instant|||Electrodominance deals X damage to any target. You may cast a spell with mana value X or less from your hand without paying its mana cost.| Faithless Looting|Tarkir: Dragonstorm Commander|213|C|{R}|Sorcery|||Draw two cards, then discard two cards.$Flashback {2}{R}| +Gadrak, the Crown-Scourge|Tarkir: Dragonstorm Commander|214|R|{2}{R}|Legendary Creature - Dragon|5|4|Flying$Gadrak can't attack unless you control four or more artifacts.$At the beginning of your end step, create a Treasure token for each nontoken creature that died this turn.| +Glorybringer|Tarkir: Dragonstorm Commander|215|R|{3}{R}{R}|Creature - Dragon|4|4|Flying, haste$You may exert this creature as it attacks. When you do, it deals 4 damage to target non-Dragon creature an opponent controls.| Grenzo, Havoc Raiser|Tarkir: Dragonstorm Commander|216|R|{R}{R}|Legendary Creature - Goblin Rogue|2|2|Whenever a creature you control deals combat damage to a player, choose one --$* Goad target creature that player controls.$* Exile the top card of that player's library. Until end of turn, you may cast that card and you may spend mana as though it were mana of any color to cast that spell.| Guttersnipe|Tarkir: Dragonstorm Commander|217|U|{2}{R}|Creature - Goblin Shaman|2|2|Whenever you cast an instant or sorcery spell, this creature deals 2 damage to each opponent.| +Hellkite Courser|Tarkir: Dragonstorm Commander|218|M|{4}{R}{R}|Creature - Dragon|6|5|Flying$When this creature enters, you may put a commander you own from the command zone onto the battlefield. It gains haste. Return it to the command zone at the beginning of the next end step.| +Lathliss, Dragon Queen|Tarkir: Dragonstorm Commander|219|R|{4}{R}{R}|Legendary Creature - Dragon|6|6|Flying$Whenever another nontoken Dragon you control enters, create a 5/5 red Dragon creature token with flying.${1}{R}: Dragons you control get +1/+0 until end of turn.| Legion Warboss|Tarkir: Dragonstorm Commander|220|R|{2}{R}|Creature - Goblin Soldier|2|2|Mentor$At the beginning of combat on your turn, create a 1/1 red Goblin creature token. That token gains haste until end of turn and attacks this combat if able.| +Leyline Tyrant|Tarkir: Dragonstorm Commander|221|M|{2}{R}{R}|Creature - Dragon|4|4|Flying$You don't lose unspent red mana as steps and phases end.$When this creature dies, you may pay any amount of {R}. When you do, it deals that much damage to any target.| Loyal Apprentice|Tarkir: Dragonstorm Commander|222|U|{1}{R}|Creature - Human Artificer|2|1|Haste$Lieutenant -- At the beginning of combat on your turn, if you control your commander, create a 1/1 colorless Thopter artifact creature token with flying. That token gains haste until end of turn.| Mana Geyser|Tarkir: Dragonstorm Commander|223|C|{3}{R}{R}|Sorcery|||Add {R} for each tapped land your opponents control.| Manaform Hellkite|Tarkir: Dragonstorm Commander|224|M|{2}{R}{R}|Creature - Dragon|4|4|Flying$Whenever you cast a noncreature spell, create an X/X red Dragon Illusion creature token with flying and haste, where X is the amount of mana spent to cast that spell. Exile that token at the beginning of the next end step.| +Nesting Dragon|Tarkir: Dragonstorm Commander|225|R|{3}{R}{R}|Creature - Dragon|5|4|Flying$Landfall -- Whenever a land you control enters, create a 0/2 red Dragon Egg creature token with defender and "When this token dies, create a 2/2 red Dragon creature token with flying and '{R}: This token gets +1/+0 until end of turn.'"| +Nogi, Draco-Zealot|Tarkir: Dragonstorm Commander|226|M|{1}{R}{R}|Legendary Creature - Kobold Shaman|3|3|Dragon spells you cast cost {1} less to cast.$Whenever Nogi attacks, if you control three or more Dragons, until end of turn, Nogi becomes a Dragon with base power and toughness 5/5 and gains flying.| Ogre Battledriver|Tarkir: Dragonstorm Commander|227|R|{2}{R}{R}|Creature - Ogre Warrior|3|3|Whenever another creature you control enters, that creature gets +2/+0 and gains haste until end of turn.| +Opportunistic Dragon|Tarkir: Dragonstorm Commander|228|R|{2}{R}{R}|Creature - Dragon|4|3|Flying$When this creature enters, choose target Human or artifact an opponent controls. For as long as this creature remains on the battlefield, gain control of that permanent, it loses all abilities, and it can't attack or block.| +Rapacious Dragon|Tarkir: Dragonstorm Commander|229|U|{4}{R}|Creature - Dragon|3|3|Flying$When this creature enters, create two Treasure tokens.| +Scourge of the Throne|Tarkir: Dragonstorm Commander|230|R|{4}{R}{R}|Creature - Dragon|5|5|Flying$Dethrone$Whenever this creature attacks for the first time each turn, if it's attacking the player with the most life or tied for most life, untap all attacking creatures. After this phase, there is an additional combat phase.| Shiny Impetus|Tarkir: Dragonstorm Commander|231|C|{2}{R}|Enchantment - Aura|||Enchant creature$Enchanted creature gets +2/+2 and is goaded.$Whenever enchanted creature attacks, you create a Treasure token.| Siege-Gang Commander|Tarkir: Dragonstorm Commander|232|R|{3}{R}{R}|Creature - Goblin|2|2|When this creature enters, create three 1/1 red Goblin creature tokens.${1}{R}, Sacrifice a Goblin: This creature deals 2 damage to any target.| +Skarrgan Hellkite|Tarkir: Dragonstorm Commander|233|M|{3}{R}{R}|Creature - Dragon|4|4|Riot$Flying${3}{R}: This creature deals 2 damage divided as you choose among one or two targets. Activate only if this creature has a +1/+1 counter on it.| +Spit Flame|Tarkir: Dragonstorm Commander|234|R|{2}{R}|Instant|||Spit Flame deals 4 damage to target creature.$Whenever a Dragon you control enters, you may pay {R}. If you do, return this card from your graveyard to your hand.| Storm-Kiln Artist|Tarkir: Dragonstorm Commander|235|U|{3}{R}|Creature - Dwarf Shaman|2|2|This creature gets +1/+0 for each artifact you control.$Magecraft -- Whenever you cast or copy an instant or sorcery spell, create a Treasure token.| +Storm's Wrath|Tarkir: Dragonstorm Commander|236|R|{2}{R}{R}|Sorcery|||Storm's Wrath deals 4 damage to each creature and each planeswalker.| +Stormbreath Dragon|Tarkir: Dragonstorm Commander|237|M|{3}{R}{R}|Creature - Dragon|4|4|Flying, haste, protection from white${5}{R}{R}: Monstrosity 3.$When this creature becomes monstrous, it deals damage to each opponent equal to the number of cards in that player's hand.| +Taurean Mauler|Tarkir: Dragonstorm Commander|238|R|{2}{R}|Creature - Shapeshifter|2|2|Changeling$Whenever an opponent casts a spell, you may put a +1/+1 counter on this creature.| Tempt with Vengeance|Tarkir: Dragonstorm Commander|239|R|{X}{R}|Sorcery|||Tempting offer -- Create X 1/1 red Elemental creature tokens with haste. Each opponent may create X 1/1 red Elemental creature tokens with haste. For each opponent who does, create X 1/1 red Elemental creature tokens with haste.| +Territorial Hellkite|Tarkir: Dragonstorm Commander|240|R|{2}{R}{R}|Creature - Dragon|6|5|Flying, haste$At the beginning of combat on your turn, choose an opponent at random that this creature didn't attack during your last combat. This creature attacks that player this combat if able. If you can't choose an opponent this way, tap this creature.| +Thunderbreak Regent|Tarkir: Dragonstorm Commander|241|R|{2}{R}{R}|Creature - Dragon|4|4|Flying$Whenever a Dragon you control becomes the target of a spell or ability an opponent controls, this creature deals 3 damage to that player.| +Vengeful Ancestor|Tarkir: Dragonstorm Commander|242|R|{2}{R}{R}|Creature - Spirit Dragon|3|4|Flying$Whenever this creature enters or attacks, goad target creature.$Whenever a goaded creature attacks, it deals 1 damage to its controller.| +Verix Bladewing|Tarkir: Dragonstorm Commander|243|M|{2}{R}{R}|Legendary Creature - Dragon|4|4|Kicker {3}$Flying$When Verix enters, if it was kicked, create Karox Bladewing, a legendary 4/4 red Dragon creature token with flying.| +Arasta of the Endless Web|Tarkir: Dragonstorm Commander|244|R|{2}{G}{G}|Legendary Enchantment Creature - Spider|3|5|Reach$Whenever an opponent casts an instant or sorcery spell, create a 1/2 green Spider creature token with reach.| +Arboreal Grazer|Tarkir: Dragonstorm Commander|245|C|{G}|Creature - Sloth Beast|0|3|Reach$When this creature enters, you may put a land card from your hand onto the battlefield tapped.| +Assault Formation|Tarkir: Dragonstorm Commander|246|R|{1}{G}|Enchantment|||Each creature you control assigns combat damage equal to its toughness rather than its power.${G}: Target creature with defender can attack this turn as though it didn't have defender.${2}{G}: Creatures you control get +0/+1 until end of turn.| Avenger of Zendikar|Tarkir: Dragonstorm Commander|247|M|{5}{G}{G}|Creature - Elemental|5|5|When this creature enters, create a 0/1 green Plant creature token for each land you control.$Landfall -- Whenever a land you control enters, you may put a +1/+1 counter on each Plant creature you control.| +Axebane Guardian|Tarkir: Dragonstorm Commander|248|C|{2}{G}|Creature - Human Druid|0|3|Defender${T}: Add X mana in any combination of colors, where X is the number of creatures you control with defender.| +Beast Within|Tarkir: Dragonstorm Commander|249|U|{2}{G}|Instant|||Destroy target permanent. Its controller creates a 3/3 green Beast creature token.| +Carven Caryatid|Tarkir: Dragonstorm Commander|250|U|{1}{G}{G}|Creature - Spirit|2|5|Defender$When this creature enters, draw a card.| Conduit of Worlds|Tarkir: Dragonstorm Commander|251|R|{2}{G}{G}|Artifact|||You may play lands from your graveyard.${T}: Choose target nonland permanent card in your graveyard. If you haven't cast a spell this turn, you may cast that card. If you do, you can't cast additional spells this turn. Activate only as a sorcery.| Crawling Sensation|Tarkir: Dragonstorm Commander|252|U|{2}{G}|Enchantment|||At the beginning of your upkeep, you may mill two cards.$Whenever one or more land cards are put into your graveyard from anywhere for the first time each turn, create a 1/1 green Insect creature token.| Cultivate|Tarkir: Dragonstorm Commander|253|C|{2}{G}|Sorcery|||Search your library for up to two basic land cards, reveal those cards, put one onto the battlefield tapped and the other into your hand, then shuffle.| -Farseek|Tarkir: Dragonstorm Commander|255|U|{1}{G}|Sorcery|||Search your library for a Plains, Island, Swamp, or Mountain card, put it onto the battlefield tapped, then shuffle.| +Elemental Bond|Tarkir: Dragonstorm Commander|254|U|{2}{G}|Enchantment|||Whenever a creature you control with power 3 or greater enters, draw a card.| +Farseek|Tarkir: Dragonstorm Commander|255|C|{1}{G}|Sorcery|||Search your library for a Plains, Island, Swamp, or Mountain card, put it onto the battlefield tapped, then shuffle.| +Frontier Siege|Tarkir: Dragonstorm Commander|256|R|{3}{G}|Enchantment|||As this enchantment enters, choose Khans or Dragons.$* Khans -- At the beginning of each of your main phases, add {G}{G}.$* Dragons -- Whenever a creature you control with flying enters, you may have it fight target creature you don't control.| Grapple with the Past|Tarkir: Dragonstorm Commander|257|C|{1}{G}|Instant|||Mill three cards, then you may return a creature or land card from your graveyard to your hand.| Harrow|Tarkir: Dragonstorm Commander|258|C|{2}{G}|Instant|||As an additional cost to cast this spell, sacrifice a land.$Search your library for up to two basic land cards, put them onto the battlefield, then shuffle.| +Hornet Nest|Tarkir: Dragonstorm Commander|259|R|{2}{G}|Creature - Insect|0|2|Defender$Whenever this creature is dealt damage, create that many 1/1 green Insect creature tokens with flying and deathtouch.| +Jaddi Offshoot|Tarkir: Dragonstorm Commander|260|U|{G}|Creature - Plant|0|3|Defender$Landfall -- Whenever a land you control enters, you gain 1 life.| +Kodama's Reach|Tarkir: Dragonstorm Commander|261|C|{2}{G}|Sorcery - Arcane|||Search your library for up to two basic land cards, reveal those cards, put one onto the battlefield tapped and the other into your hand, then shuffle.| +Migration Path|Tarkir: Dragonstorm Commander|262|U|{3}{G}|Sorcery|||Search your library for up to two basic land cards, put them onto the battlefield tapped, then shuffle.$Cycling {2}| Multani, Yavimaya's Avatar|Tarkir: Dragonstorm Commander|263|M|{4}{G}{G}|Legendary Creature - Elemental Avatar|0|0|Reach, trample$Multani gets +1/+1 for each land you control and each land card in your graveyard.${1}{G}, Return two lands you control to their owner's hand: Return Multani from your graveyard to your hand.| +Overgrown Battlement|Tarkir: Dragonstorm Commander|264|U|{1}{G}|Creature - Wall|0|4|Defender${T}: Add {G} for each creature you control with defender.| Rampant Growth|Tarkir: Dragonstorm Commander|265|C|{1}{G}|Sorcery|||Search your library for a basic land card, put that card onto the battlefield tapped, then shuffle.| Sakura-Tribe Elder|Tarkir: Dragonstorm Commander|266|C|{1}{G}|Creature - Snake Shaman|1|1|Sacrifice this creature: Search your library for a basic land card, put that card onto the battlefield tapped, then shuffle.| Satyr Wayfinder|Tarkir: Dragonstorm Commander|267|C|{1}{G}|Creature - Satyr|1|1|When this creature enters, reveal the top four cards of your library. You may put a land card from among them into your hand. Put the rest into your graveyard.| +Seedborn Muse|Tarkir: Dragonstorm Commander|268|R|{3}{G}{G}|Creature - Spirit|2|4|Untap all permanents you control during each other player's untap step.| +Selvala's Stampede|Tarkir: Dragonstorm Commander|269|R|{4}{G}{G}|Sorcery|||Council's dilemma -- Starting with you, each player votes for wild or free. Reveal cards from the top of your library until you reveal a creature card for each wild vote. Put those creature cards onto the battlefield, then shuffle the rest into your library. You may put a permanent card from your hand onto the battlefield for each free vote.| Shigeki, Jukai Visionary|Tarkir: Dragonstorm Commander|270|R|{1}{G}|Legendary Enchantment Creature - Snake Druid|1|3|{1}{G}, {T}, Return Shigeki to its owner's hand: Reveal the top four cards of your library. You may put a land card from among them onto the battlefield tapped. Put the rest into your graveyard.$Channel -- {X}{X}{G}{G}, Discard this card: Return X target nonlegendary cards from your graveyard to your hand.| Springbloom Druid|Tarkir: Dragonstorm Commander|271|C|{2}{G}|Creature - Elf Druid|1|1|When this creature enters, you may sacrifice a land. If you do, search your library for up to two basic land cards, put them onto the battlefield tapped, then shuffle.| +Sylvan Caryatid|Tarkir: Dragonstorm Commander|272|R|{1}{G}|Creature - Plant|0|3|Defender, hexproof${T}: Add one mana of any color.| Tear Asunder|Tarkir: Dragonstorm Commander|273|U|{1}{G}|Instant|||Kicker {1}{B}$Exile target artifact or enchantment. If this spell was kicked, exile target nonland permanent instead.| Timeless Witness|Tarkir: Dragonstorm Commander|274|U|{2}{G}{G}|Creature - Human Shaman|2|1|When this creature enters, return target card from your graveyard to your hand.$Eternalize {5}{G}{G}| +Tower Defense|Tarkir: Dragonstorm Commander|275|U|{1}{G}|Instant|||Creatures you control get +0/+5 and gain reach until end of turn.| +Towering Titan|Tarkir: Dragonstorm Commander|276|M|{4}{G}{G}|Creature - Giant|0|0|This creature enters with X +1/+1 counters on it, where X is the total toughness of other creatures you control.$Sacrifice a creature with defender: All creatures gain trample until end of turn.| +Wall of Blossoms|Tarkir: Dragonstorm Commander|277|U|{1}{G}|Creature - Plant Wall|0|4|Defender$When this creature enters, draw a card.| +Wall of Roots|Tarkir: Dragonstorm Commander|278|C|{1}{G}|Creature - Plant Wall|0|5|Defender$Put a -0/-1 counter on this creature: Add {G}. Activate only once each turn.| +Anguished Unmaking|Tarkir: Dragonstorm Commander|279|R|{1}{W}{B}|Instant|||Exile target nonland permanent. You lose 3 life.| Aron, Benalia's Ruin|Tarkir: Dragonstorm Commander|280|U|{W}{W}{B}|Legendary Creature - Phyrexian Human|3|3|Menace${W}{B}, {T}, Sacrifice another creature: Put a +1/+1 counter on each creature you control.| +Atarka, World Render|Tarkir: Dragonstorm Commander|281|R|{5}{R}{G}|Legendary Creature - Dragon|6|4|Flying, trample$Whenever a Dragon you control attacks, it gains double strike until end of turn.| Baral and Kari Zev|Tarkir: Dragonstorm Commander|282|R|{1}{U}{R}|Legendary Creature - Human|2|4|First strike, menace$Whenever you cast your first instant or sorcery spell each turn, you may cast a spell with lesser mana value that shares a card type with it from your hand without paying its mana cost. If you don't, create First Mate Ragavan, a legendary 2/1 red Monkey Pirate creature token. It gains haste until end of turn.| Consuming Aberration|Tarkir: Dragonstorm Commander|283|R|{3}{U}{B}|Creature - Horror|*|*|Consuming Aberration's power and toughness are each equal to the number of cards in your opponents' graveyards.$Whenever you cast a spell, each opponent reveals cards from the top of their library until they reveal a land card, then puts those cards into their graveyard.| +Despark|Tarkir: Dragonstorm Commander|284|U|{W}{B}|Instant|||Exile target permanent with mana value 4 or greater.| +Dragonlord Atarka|Tarkir: Dragonstorm Commander|285|M|{5}{R}{G}|Legendary Creature - Elder Dragon|8|8|Flying, trample$When Dragonlord Atarka enters, it deals 5 damage divided as you choose among any number of target creatures and/or planeswalkers your opponents control.| +Dragonlord Dromoka|Tarkir: Dragonstorm Commander|286|M|{4}{G}{W}|Legendary Creature - Elder Dragon|5|7|This spell can't be countered.$Flying, lifelink$Your opponents can't cast spells during your turn.| Expansion // Explosion|Tarkir: Dragonstorm Commander|287|R|{U/R}{U/R}|Instant|||Copy target instant or sorcery spell with mana value 4 or less. You may choose new targets for the copy.$Explosion${X}{U}{U}{R}{R}$Instant$Explosion deals X damage to any target. Target player draws X cards.| Expressive Iteration|Tarkir: Dragonstorm Commander|288|U|{U}{R}|Sorcery|||Look at the top three cards of your library. Put one of them into your hand, put one of them on the bottom of your library, and exile one of them. You may play the exiled card this turn.| +Faeburrow Elder|Tarkir: Dragonstorm Commander|289|R|{1}{G}{W}|Creature - Treefolk Druid|0|0|Vigilance$This creature gets +1/+1 for each color among permanents you control.${T}: For each color among permanents you control, add one mana of that color.| Grisly Salvage|Tarkir: Dragonstorm Commander|290|C|{B}{G}|Instant|||Reveal the top five cards of your library. You may put a creature or land card from among them into your hand. Put the rest into your graveyard.| +Harbinger of the Hunt|Tarkir: Dragonstorm Commander|291|R|{3}{R}{G}|Creature - Dragon|5|3|Flying${2}{R}: This creature deals 1 damage to each creature without flying.${2}{G}: This creature deals 1 damage to each other creature with flying.| +Indulging Patrician|Tarkir: Dragonstorm Commander|292|U|{1}{W}{B}|Creature - Vampire Noble|1|4|Flying$Lifelink$At the beginning of your end step, if you gained 3 or more life this turn, each opponent loses 3 life.| Jarad, Golgari Lich Lord|Tarkir: Dragonstorm Commander|293|M|{B}{B}{G}{G}|Legendary Creature - Zombie Elf|2|2|Jarad gets +1/+1 for each creature card in your graveyard.${1}{B}{G}, Sacrifice another creature: Each opponent loses life equal to the sacrificed creature's power.$Sacrifice a Swamp and a Forest: Return this card from your graveyard to your hand.| Kaya, Geist Hunter|Tarkir: Dragonstorm Commander|294|M|{1}{W}{B}|Legendary Planeswalker - Kaya|3|+1: Creatures you control gain deathtouch until end of turn. Put a +1/+1 counter on up to one target creature token you control.$-2: Until end of turn, if one or more tokens would be created under your control, twice that many of those tokens are created instead.$-6: Exile all cards from all graveyards, then create a 1/1 white Spirit creature token with flying for each card exiled this way.| Lord of Extinction|Tarkir: Dragonstorm Commander|295|M|{3}{B}{G}|Creature - Elemental|*|*|Lord of Extinction's power and toughness are each equal to the number of cards in all graveyards.| Magma Opus|Tarkir: Dragonstorm Commander|296|M|{6}{U}{R}|Instant|||Magma Opus deals 4 damage divided as you choose among any number of targets. Tap two target permanents. Create a 4/4 blue and red Elemental creature token. Draw two cards.${U/R}{U/R}, Discard this card: Create a Treasure token.| -Meren of Clan Nel Toth|Tarkir: Dragonstorm Commander|297|R|{2}{B}{G}|Legendary Creature - Human Shaman|3|4|Whenever another creature you control dies, you get an experience counter.$At the beginning of your end step, choose target creature card in your graveyard. If that card's mana value is less than or equal to the number of experience counters you have, return it to the battlefield. Otherwise, put it into your hand.| +Meren of Clan Nel Toth|Tarkir: Dragonstorm Commander|297|M|{2}{B}{G}|Legendary Creature - Human Shaman|3|4|Whenever another creature you control dies, you get an experience counter.$At the beginning of your end step, choose target creature card in your graveyard. If that card's mana value is less than or equal to the number of experience counters you have, return it to the battlefield. Otherwise, put it into your hand.| Nyx Weaver|Tarkir: Dragonstorm Commander|298|U|{1}{B}{G}|Enchantment Creature - Spider|2|3|Reach$At the beginning of your upkeep, mill two cards.${1}{B}{G}, Exile this creature: Return target card from your graveyard to your hand.| Prismari Command|Tarkir: Dragonstorm Commander|299|R|{1}{U}{R}|Instant|||Choose two --$* Prismari Command deals 2 damage to any target.$* Target player draws two cards, then discards two cards.$* Target player creates a Treasure token.$* Destroy target artifact.| Putrefy|Tarkir: Dragonstorm Commander|300|U|{1}{B}{G}|Instant|||Destroy target artifact or creature. It can't be regenerated.| +Sarkhan, Soul Aflame|Tarkir: Dragonstorm Commander|301|M|{1}{U}{R}|Legendary Creature - Human Shaman|2|4|Dragon spells you cast cost {1} less to cast.$Whenever a Dragon you control enters, you may have Sarkhan become a copy of it until end of turn, except its name is Sarkhan, Soul Aflame and it's legendary in addition to its other types.| +Shadrix Silverquill|Tarkir: Dragonstorm Commander|302|M|{3}{W}{B}|Legendary Creature - Elder Dragon|2|5|Flying, double strike$At the beginning of combat on your turn, you may choose two. Each mode must target a different player.$* Target player creates a 2/1 white and black Inkling creature token with flying.$* Target player draws a card and loses 1 life.$* Target player puts a +1/+1 counter on each creature they control.| +Sidar Kondo of Jamuraa|Tarkir: Dragonstorm Commander|303|M|{2}{G}{W}|Legendary Creature - Human Knight|2|5|Flanking$Creatures your opponents control without flying or reach can't block creatures with power 2 or less.$Partner| Skull Prophet|Tarkir: Dragonstorm Commander|304|U|{B}{G}|Creature - Human Druid|3|1|{T}: Add {B} or {G}.${T}: Mill two cards.| +Temur Ascendancy|Tarkir: Dragonstorm Commander|305|R|{G}{U}{R}|Enchantment|||Creatures you control have haste.$Whenever a creature you control with power 4 or greater enters, you may draw a card.| Thalisse, Reverent Medium|Tarkir: Dragonstorm Commander|306|U|{3}{W}{B}|Legendary Creature - Human Cleric|3|4|At the beginning of each end step, create X 1/1 white Spirit creature tokens with flying, where X is the number of tokens you created this turn.| Third Path Iconoclast|Tarkir: Dragonstorm Commander|307|U|{U}{R}|Creature - Human Monk|2|1|Whenever you cast a noncreature spell, create a 1/1 colorless Soldier artifact creature token.| Time Wipe|Tarkir: Dragonstorm Commander|308|R|{2}{W}{W}{U}|Sorcery|||Return a creature you control to its owner's hand, then destroy all creatures.| @@ -57544,31 +57720,48 @@ Whirlwind of Thought|Tarkir: Dragonstorm Commander|311|R|{1}{U}{R}{W}|Enchantmen Azorius Signet|Tarkir: Dragonstorm Commander|312|U|{2}|Artifact|||{1}, {T}: Add {W}{U}.| Blade of Selves|Tarkir: Dragonstorm Commander|313|R|{2}|Artifact - Equipment|||Equipped creature has myriad.$Equip {4}| Boros Signet|Tarkir: Dragonstorm Commander|314|U|{2}|Artifact|||{1}, {T}: Add {R}{W}.| +Colfenor's Urn|Tarkir: Dragonstorm Commander|315|R|{3}|Artifact|||Whenever a creature with toughness 4 or greater is put into your graveyard from the battlefield, you may exile it.$At the beginning of the end step, if three or more cards have been exiled with this artifact, sacrifice it. If you do, return those cards to the battlefield under their owner's control.| +Crashing Drawbridge|Tarkir: Dragonstorm Commander|316|C|{2}|Artifact Creature - Wall|0|4|Defender${T}: Creatures you control gain haste until end of turn.| +Dragon's Hoard|Tarkir: Dragonstorm Commander|317|R|{3}|Artifact|||Whenever a Dragon you control enters, put a gold counter on this artifact.${T}, Remove a gold counter from this artifact: Draw a card.${T}: Add one mana of any color.| Fellwar Stone|Tarkir: Dragonstorm Commander|318|U|{2}|Artifact|||{T}: Add one mana of any color that a land an opponent controls could produce.| Idol of Oblivion|Tarkir: Dragonstorm Commander|319|R|{2}|Artifact|||{T}: Draw a card. Activate only if you created a token this turn.${8}, {T}, Sacrifice this artifact: Create a 10/10 colorless Eldrazi creature token.| Izzet Signet|Tarkir: Dragonstorm Commander|320|C|{2}|Artifact|||{1}, {T}: Add {U}{R}.| Millikin|Tarkir: Dragonstorm Commander|321|U|{2}|Artifact Creature - Construct|0|1|{T}, Mill a card: Add {C}.| Myr Battlesphere|Tarkir: Dragonstorm Commander|322|R|{7}|Artifact Creature - Myr Construct|4|7|When this creature enters, create four 1/1 colorless Myr artifact creature tokens.$Whenever this creature attacks, you may tap X untapped Myr you control. If you do, this creature gets +X/+0 until end of turn and deals X damage to the player or planeswalker it's attacking.| +Orzhov Signet|Tarkir: Dragonstorm Commander|323|C|{2}|Artifact|||{1}, {T}: Add {W}{B}.| +Selesnya Signet|Tarkir: Dragonstorm Commander|324|C|{2}|Artifact|||{1}, {T}: Add {G}{W}.| Solemn Simulacrum|Tarkir: Dragonstorm Commander|325|R|{4}|Artifact Creature - Golem|2|2|When this creature enters, you may search your library for a basic land card, put that card onto the battlefield tapped, then shuffle.$When this creature dies, you may draw a card.| +Staff of Compleation|Tarkir: Dragonstorm Commander|326|M|{3}|Artifact|||{T}, Pay 1 life: Destroy target permanent you own.${T}, Pay 2 life: Add one mana of any color.${T}, Pay 3 life: Proliferate.${T}, Pay 4 life: Draw a card.${5}: Untap this artifact.| +Steel Hellkite|Tarkir: Dragonstorm Commander|327|R|{6}|Artifact Creature - Dragon|5|5|Flying${2}: This creature gets +1/+0 until end of turn.${X}: Destroy each nonland permanent with mana value X whose controller was dealt combat damage by this creature this turn. Activate only once each turn.| +Swiftfoot Boots|Tarkir: Dragonstorm Commander|328|U|{2}|Artifact - Equipment|||Equipped creature has hexproof and haste.$Equip {1}| Talisman of Conviction|Tarkir: Dragonstorm Commander|329|U|{2}|Artifact|||{T}: Add {C}.${T}: Add {R} or {W}. This artifact deals 1 damage to you.| +Talisman of Creativity|Tarkir: Dragonstorm Commander|330|U|{2}|Artifact|||{T}: Add {C}.${T}: Add {U} or {R}. This artifact deals 1 damage to you.| Talisman of Hierarchy|Tarkir: Dragonstorm Commander|331|U|{2}|Artifact|||{T}: Add {C}.${T}: Add {W} or {B}. This artifact deals 1 damage to you.| +Talisman of Impulse|Tarkir: Dragonstorm Commander|332|U|{2}|Artifact|||{T}: Add {C}.${T}: Add {R} or {G}. This artifact deals 1 damage to you.| Talisman of Progress|Tarkir: Dragonstorm Commander|333|U|{2}|Artifact|||{T}: Add {C}.${T}: Add {W} or {U}. This artifact deals 1 damage to you.| +Walking Bulwark|Tarkir: Dragonstorm Commander|334|U|{1}|Artifact Creature - Golem|0|3|Defender${2}: Until end of turn, target creature with defender gains haste, can attack as though it didn't have defender, and assigns combat damage equal to its toughness rather than its power. Activate only as a sorcery.| Wayfarer's Bauble|Tarkir: Dragonstorm Commander|335|C|{1}|Artifact|||{2}, {T}, Sacrifice this artifact: Search your library for a basic land card, put that card onto the battlefield tapped, then shuffle.| +Weathered Sentinels|Tarkir: Dragonstorm Commander|336|R|{3}|Artifact Creature - Wall|2|5|Defender, vigilance, reach, trample$This creature can attack players who attacked you during their last turn as though it didn't have defender.$Whenever this creature attacks, it gets +3/+3 and gains indestructible until end of turn.| +Access Tunnel|Tarkir: Dragonstorm Commander|337|U||Land|||{T}: Add {C}.${3}, {T}: Target creature with power 3 or less can't be blocked this turn.| Adarkar Wastes|Tarkir: Dragonstorm Commander|338|R||Land|||{T}: Add {C}.${T}: Add {W} or {U}. This land deals 1 damage to you.| Ash Barrens|Tarkir: Dragonstorm Commander|339|C||Land|||{T}: Add {C}.$Basic landcycling {1}| Battlefield Forge|Tarkir: Dragonstorm Commander|340|R||Land|||{T}: Add {C}.${T}: Add {R} or {W}. This land deals 1 damage to you.| Bojuka Bog|Tarkir: Dragonstorm Commander|341|C||Land|||This land enters tapped.$When this land enters, exile target player's graveyard.${T}: Add {B}.| +Bountiful Landscape|Tarkir: Dragonstorm Commander|342|C||Land|||{T}: Add {C}.${T}, Sacrifice this land: Search your library for a basic Forest, Island, or Mountain card, put it onto the battlefield tapped, then shuffle.$Cycling {G}{U}{R}| +Canopy Vista|Tarkir: Dragonstorm Commander|343|R||Land - Forest Plains|||({T}: Add {G} or {W}.)$This land enters tapped unless you control two or more basic lands.| Canyon Slough|Tarkir: Dragonstorm Commander|344|R||Land - Swamp Mountain|||({T}: Add {B} or {R}.)$This land enters tapped.$Cycling {2}| Cascade Bluffs|Tarkir: Dragonstorm Commander|345|R||Land|||{T}: Add {C}.${U/R}, {T}: Add {U}{U}, {U}{R}, or {R}{R}.| Castle Ardenvale|Tarkir: Dragonstorm Commander|346|R||Land|||This land enters tapped unless you control a Plains.${T}: Add {W}.${2}{W}{W}, {T}: Create a 1/1 white Human creature token.| Castle Embereth|Tarkir: Dragonstorm Commander|347|R||Land|||This land enters tapped unless you control a Mountain.${T}: Add {R}.${1}{R}{R}, {T}: Creatures you control get +1/+0 until end of turn.| Caves of Koilos|Tarkir: Dragonstorm Commander|348|R||Land|||{T}: Add {C}.${T}: Add {W} or {B}. This land deals 1 damage to you.| Cephalid Coliseum|Tarkir: Dragonstorm Commander|349|U||Land|||{T}: Add {U}. This land deals 1 damage to you.$Threshold -- {U}, {T}, Sacrifice this land: Target player draws three cards, then discards three cards. Activate only if seven or more cards are in your graveyard.| +Cinder Glade|Tarkir: Dragonstorm Commander|350|R||Land - Mountain Forest|||({T}: Add {R} or {G}.)$This land enters tapped unless you control two or more basic lands.| Clifftop Retreat|Tarkir: Dragonstorm Commander|351|R||Land|||This land enters tapped unless you control a Mountain or a Plains.${T}: Add {R} or {W}.| Command Beacon|Tarkir: Dragonstorm Commander|352|R||Land|||{T}: Add {C}.${T}, Sacrifice this land: Put your commander into your hand from the command zone.| Contaminated Aquifer|Tarkir: Dragonstorm Commander|353|C||Land - Island Swamp|||({T}: Add {U} or {B}.)$This land enters tapped.| Crypt of Agadeem|Tarkir: Dragonstorm Commander|354|R||Land|||This land enters tapped.${T}: Add {B}.${2}, {T}: Add {B} for each black creature card in your graveyard.| Darkwater Catacombs|Tarkir: Dragonstorm Commander|355|R||Land|||{1}, {T}: Add {U}{B}.| +Deceptive Landscape|Tarkir: Dragonstorm Commander|356|C||Land|||{T}: Add {C}.${T}, Sacrifice this land: Search your library for a basic Plains, Swamp, or Forest card, put it onto the battlefield tapped, then shuffle.$Cycling {W}{B}{G}| Dragonskull Summit|Tarkir: Dragonstorm Commander|357|R||Land|||This land enters tapped unless you control a Swamp or a Mountain.${T}: Add {B} or {R}.| Dreamroot Cascade|Tarkir: Dragonstorm Commander|358|R||Land|||This land enters tapped unless you control two or more other lands.${T}: Add {G} or {U}.| Drownyard Temple|Tarkir: Dragonstorm Commander|359|R||Land|||{T}: Add {C}.${3}: Return this card from your graveyard to the battlefield tapped.| @@ -57576,34 +57769,53 @@ Exotic Orchard|Tarkir: Dragonstorm Commander|360|R||Land|||{T}: Add one mana of Ferrous Lake|Tarkir: Dragonstorm Commander|361|R||Land|||{1}, {T}: Add {U}{R}.| Fetid Heath|Tarkir: Dragonstorm Commander|362|R||Land|||{T}: Add {C}.${W/B}, {T}: Add {W}{W}, {W}{B}, or {B}{B}.| Fetid Pools|Tarkir: Dragonstorm Commander|363|R||Land - Island Swamp|||({T}: Add {U} or {B}.)$This land enters tapped.$Cycling {2}| +Flooded Grove|Tarkir: Dragonstorm Commander|364|R||Land|||{T}: Add {C}.${G/U}, {T}: Add {G}{G}, {G}{U}, or {U}{U}.| Foreboding Landscape|Tarkir: Dragonstorm Commander|365|C||Land|||{T}: Add {C}.${T}, Sacrifice this land: Search your library for a basic Swamp, Forest, or Island card, put it onto the battlefield tapped, then shuffle.$Cycling {B}{G}{U}| +Fortified Village|Tarkir: Dragonstorm Commander|366|R||Land|||As this land enters, you may reveal a Forest or Plains card from your hand. If you don't, this land enters tapped.${T}: Add {G} or {W}.| Glacial Fortress|Tarkir: Dragonstorm Commander|367|R||Land|||This land enters tapped unless you control a Plains or an Island.${T}: Add {W} or {U}.| Golgari Rot Farm|Tarkir: Dragonstorm Commander|368|U||Land|||This land enters tapped.$When this land enters, return a land you control to its owner's hand.${T}: Add {B}{G}.| Haunted Mire|Tarkir: Dragonstorm Commander|369|C||Land - Swamp Forest|||({T}: Add {B} or {G}.)$This land enters tapped.| +Haven of the Spirit Dragon|Tarkir: Dragonstorm Commander|370|R||Land|||{T}: Add {C}.${T}: Add one mana of any color. Spend this mana only to cast a Dragon creature spell.${2}, {T}, Sacrifice this land: Return target Dragon creature card or Ugin planeswalker card from your graveyard to your hand.| Hinterland Harbor|Tarkir: Dragonstorm Commander|371|R||Land|||This land enters tapped unless you control a Forest or an Island.${T}: Add {G} or {U}.| Irrigated Farmland|Tarkir: Dragonstorm Commander|372|R||Land - Plains Island|||({T}: Add {W} or {U}.)$This land enters tapped.$Cycling {2}| Isolated Chapel|Tarkir: Dragonstorm Commander|373|R||Land|||This land enters tapped unless you control a Plains or a Swamp.${T}: Add {W} or {B}.| +Karplusan Forest|Tarkir: Dragonstorm Commander|374|R||Land|||{T}: Add {C}.${T}: Add {R} or {G}. This land deals 1 damage to you.| +Kessig Wolf Run|Tarkir: Dragonstorm Commander|375|R||Land|||{T}: Add {C}.${X}{R}{G}, {T}: Target creature gets +X/+0 and gains trample until end of turn.| Llanowar Wastes|Tarkir: Dragonstorm Commander|376|R||Land|||{T}: Add {C}.${T}: Add {B} or {G}. This land deals 1 damage to you.| Memorial to Folly|Tarkir: Dragonstorm Commander|377|U||Land|||This land enters tapped.${T}: Add {B}.${2}{B}, {T}, Sacrifice this land: Return target creature card from your graveyard to your hand.| +Mossfire Valley|Tarkir: Dragonstorm Commander|378|R||Land|||{1}, {T}: Add {R}{G}.| +Mosswort Bridge|Tarkir: Dragonstorm Commander|379|R||Land|||Hideaway 4$This land enters tapped.${T}: Add {G}.${G}, {T}: You may play the exiled card without paying its mana cost if creatures you control have total power 10 or greater.| Myriad Landscape|Tarkir: Dragonstorm Commander|380|U||Land|||This land enters tapped.${T}: Add {C}.${2}, {T}, Sacrifice this land: Search your library for up to two basic land cards that share a land type, put them onto the battlefield tapped, then shuffle.| +Overgrown Farmland|Tarkir: Dragonstorm Commander|381|R||Land|||This land enters tapped unless you control two or more other lands.${T}: Add {G} or {W}.| Path of Ancestry|Tarkir: Dragonstorm Commander|382|C||Land|||This land enters tapped.${T}: Add one mana of any color in your commander's color identity. When that mana is spent to cast a creature spell that shares a creature type with your commander, scry 1.| Perilous Landscape|Tarkir: Dragonstorm Commander|383|C||Land|||{T}: Add {C}.${T}, Sacrifice this land: Search your library for a basic Island, Mountain, or Plains card, put it onto the battlefield tapped, then shuffle.$Cycling {U}{R}{W}| Prairie Stream|Tarkir: Dragonstorm Commander|384|R||Land - Plains Island|||({T}: Add {W} or {U}.)$This land enters tapped unless you control two or more basic lands.| +Radiant Grove|Tarkir: Dragonstorm Commander|385|C||Land - Forest Plains|||({T}: Add {G} or {W}.)$This land enters tapped.| Reliquary Tower|Tarkir: Dragonstorm Commander|386|U||Land|||You have no maximum hand size.${T}: Add {C}.| +Rockfall Vale|Tarkir: Dragonstorm Commander|387|R||Land|||This land enters tapped unless you control two or more other lands.${T}: Add {R} or {G}.| +Rootbound Crag|Tarkir: Dragonstorm Commander|388|R||Land|||This land enters tapped unless you control a Mountain or a Forest.${T}: Add {R} or {G}.| Rugged Prairie|Tarkir: Dragonstorm Commander|389|R||Land|||{T}: Add {C}.${R/W}, {T}: Add {R}{R}, {R}{W}, or {W}{W}.| Shattered Landscape|Tarkir: Dragonstorm Commander|390|C||Land|||{T}: Add {C}.${T}, Sacrifice this land: Search your library for a basic Mountain, Plains, or Swamp card, put it onto the battlefield tapped, then shuffle.$Cycling {R}{W}{B}| Shattered Sanctum|Tarkir: Dragonstorm Commander|391|R||Land|||This land enters tapped unless you control two or more other lands.${T}: Add {W} or {B}.| +Sheltered Thicket|Tarkir: Dragonstorm Commander|392|R||Land - Mountain Forest|||({T}: Add {R} or {G}.)$This land enters tapped.$Cycling {2}| Shivan Reef|Tarkir: Dragonstorm Commander|393|R||Land|||{T}: Add {C}.${T}: Add {U} or {R}. This land deals 1 damage to you.| Skycloud Expanse|Tarkir: Dragonstorm Commander|394|R||Land|||{1}, {T}: Add {W}{U}.| Smoldering Marsh|Tarkir: Dragonstorm Commander|395|R||Land - Swamp Mountain|||({T}: Add {B} or {R}.)$This land enters tapped unless you control two or more basic lands.| Sulfur Falls|Tarkir: Dragonstorm Commander|396|R||Land|||This land enters tapped unless you control an Island or a Mountain.${T}: Add {U} or {R}.| +Sungrass Prairie|Tarkir: Dragonstorm Commander|397|R||Land|||{1}, {T}: Add {G}{W}.| Sunken Hollow|Tarkir: Dragonstorm Commander|398|R||Land - Island Swamp|||({T}: Add {U} or {B}.)$This land enters tapped unless you control two or more basic lands.| +Sunpetal Grove|Tarkir: Dragonstorm Commander|399|R||Land|||This land enters tapped unless you control a Forest or a Plains.${T}: Add {G} or {W}.| +Temple of Abandon|Tarkir: Dragonstorm Commander|400|R||Land|||This land enters tapped.$When this land enters, scry 1.${T}: Add {R} or {G}.| Temple of Enlightenment|Tarkir: Dragonstorm Commander|401|R||Land|||This land enters tapped.$When this land enters, scry 1.${T}: Add {W} or {U}.| Temple of Epiphany|Tarkir: Dragonstorm Commander|402|R||Land|||This land enters tapped.$When this land enters, scry 1.${T}: Add {U} or {R}.| Temple of Malady|Tarkir: Dragonstorm Commander|403|R||Land|||This land enters tapped.$When this land enters, scry 1.${T}: Add {B} or {G}.| +Temple of Mystery|Tarkir: Dragonstorm Commander|404|R||Land|||This land enters tapped.$When this land enters, scry 1.${T}: Add {G} or {U}.| +Temple of Plenty|Tarkir: Dragonstorm Commander|405|R||Land|||This land enters tapped.$When this land enters, scry 1.${T}: Add {G} or {W}.| Temple of Silence|Tarkir: Dragonstorm Commander|406|R||Land|||This land enters tapped.$When this land enters, scry 1.${T}: Add {W} or {B}.| Temple of Triumph|Tarkir: Dragonstorm Commander|407|R||Land|||This land enters tapped.$When this land enters, scry 1.${T}: Add {R} or {W}.| Terramorphic Expanse|Tarkir: Dragonstorm Commander|408|C||Land|||{T}, Sacrifice this land: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.| +Twilight Mire|Tarkir: Dragonstorm Commander|409|R||Land|||{T}: Add {C}.${B/G}, {T}: Add {B}{B}, {B}{G}, or {G}{G}.| Vault of the Archangel|Tarkir: Dragonstorm Commander|410|R||Land|||{T}: Add {C}.${2}{W}{B}, {T}: Creatures you control gain deathtouch and lifelink until end of turn.| Windbrisk Heights|Tarkir: Dragonstorm Commander|411|R||Land|||Hideaway 4$This land enters tapped.${T}: Add {W}.${W}, {T}: You may play the exiled card without paying its mana cost if you attacked with three or more creatures this turn.| Woodland Cemetery|Tarkir: Dragonstorm Commander|412|R||Land|||This land enters tapped unless you control a Swamp or a Forest.${T}: Add {B} or {G}.| +Yavimaya Coast|Tarkir: Dragonstorm Commander|413|R||Land|||{T}: Add {C}.${T}: Add {G} or {U}. This land deals 1 damage to you.|