From 62bb720ea707765e2a33a03ee5dfa91b753123e8 Mon Sep 17 00:00:00 2001 From: Eduardo Pedroni Date: Fri, 5 Jun 2015 21:50:36 +0200 Subject: Tidied up README and help, sorted out a neater Ant build script --- .classpath | 7 +- .gitignore | 1 + M15.json | 1 - README.md | 60 +++- SetList.json | 1 - build.xml | 56 ++++ ext/jackson-annotations-2.5.0.jar | Bin 39815 -> 0 bytes ext/jackson-core-2.5.3-sources.jar | Bin 241161 -> 0 bytes ext/jackson-core-2.5.3.jar | Bin 229998 -> 0 bytes ext/jackson-databind-2.5.3-sources.jar | Bin 824134 -> 0 bytes ext/jackson-databind-2.5.3.jar | Bin 1143162 -> 0 bytes help | 45 --- lib/jackson-annotations-2.5.0.jar | Bin 0 -> 39815 bytes lib/jackson-core-2.5.3-sources.jar | Bin 0 -> 241161 bytes lib/jackson-core-2.5.3.jar | Bin 0 -> 229998 bytes lib/jackson-databind-2.5.3-sources.jar | Bin 0 -> 824134 bytes lib/jackson-databind-2.5.3.jar | Bin 0 -> 1143162 bytes res/help | 51 +++ shivandragon.json | 1 - src/eu/equalparts/cardbase/data/CardBase.java | 24 -- .../equalparts/cardbase/data/CardBaseManager.java | 4 +- src/eu/equalparts/cardbase/data/Cardbase.java | 24 ++ src/eu/equalparts/cardbase/query/IO.java | 8 +- src/eu/equalparts/cardbase/query/Test.java | 70 ----- .../cardbase/standalone/CardBaseCLI.java | 275 ----------------- .../cardbase/standalone/CardbaseCLI.java | 341 +++++++++++++++++++++ testbase | 1 - todo | 1 + 28 files changed, 543 insertions(+), 428 deletions(-) delete mode 100644 M15.json delete mode 100644 SetList.json create mode 100644 build.xml delete mode 100644 ext/jackson-annotations-2.5.0.jar delete mode 100644 ext/jackson-core-2.5.3-sources.jar delete mode 100644 ext/jackson-core-2.5.3.jar delete mode 100644 ext/jackson-databind-2.5.3-sources.jar delete mode 100644 ext/jackson-databind-2.5.3.jar delete mode 100644 help create mode 100644 lib/jackson-annotations-2.5.0.jar create mode 100644 lib/jackson-core-2.5.3-sources.jar create mode 100644 lib/jackson-core-2.5.3.jar create mode 100644 lib/jackson-databind-2.5.3-sources.jar create mode 100644 lib/jackson-databind-2.5.3.jar create mode 100644 res/help delete mode 100644 shivandragon.json delete mode 100644 src/eu/equalparts/cardbase/data/CardBase.java create mode 100644 src/eu/equalparts/cardbase/data/Cardbase.java delete mode 100644 src/eu/equalparts/cardbase/query/Test.java delete mode 100644 src/eu/equalparts/cardbase/standalone/CardBaseCLI.java create mode 100644 src/eu/equalparts/cardbase/standalone/CardbaseCLI.java delete mode 100644 testbase create mode 100644 todo diff --git a/.classpath b/.classpath index e113c09..1aad000 100644 --- a/.classpath +++ b/.classpath @@ -1,9 +1,10 @@ + - - - + + + diff --git a/.gitignore b/.gitignore index 0a37b21..a54d722 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ __pycache__/ bin/ +dist/ diff --git a/M15.json b/M15.json deleted file mode 100644 index bab3bc6..0000000 --- a/M15.json +++ /dev/null @@ -1 +0,0 @@ -{"name":"Magic 2015 Core Set","code":"M15","magicCardsInfoCode":"m15","releaseDate":"2014-07-18","border":"black","type":"core","booster":[["rare","mythic rare"],"uncommon","uncommon","uncommon","common","common","common","common","common","common","common","common","common","common","land","marketing"],"cards":[{"layout":"normal","type":"Creature — Spirit","types":["Creature"],"colors":["Black"],"multiverseid":383175,"name":"Accursed Spirit","subtypes":["Spirit"],"cmc":4,"rarity":"Common","artist":"Kev Walker","power":"3","toughness":"2","manaCost":"{3}{B}","text":"Intimidate (This creature can't be blocked except by artifact creatures and/or creatures that share a color with it.)","flavor":"Many have heard the slither of dragging armor and the soft squelch of its voice. But only its victims ever meet its icy gaze.","number":"85","imageName":"accursed spirit"},{"layout":"normal","type":"Sorcery","types":["Sorcery"],"colors":["Red"],"multiverseid":383176,"name":"Act on Impulse","cmc":3,"rarity":"Uncommon","artist":"Brad Rigney","manaCost":"{2}{R}","text":"Exile the top three cards of your library. Until end of turn, you may play cards exiled this way. (If you cast a spell this way, you still pay its costs. You can play a land this way only if you have an available land play remaining.)","flavor":"\"You don't want to know what happens after I put on the goggles.\"","number":"126","imageName":"act on impulse"},{"layout":"normal","type":"Creature — Angel","types":["Creature"],"colors":["White"],"multiverseid":383160,"name":"Aegis Angel","subtypes":["Angel"],"cmc":6,"rarity":"Rare","artist":"Aleksi Briclot","power":"5","toughness":"5","manaCost":"{4}{W}{W}","text":"Flying (This creature can't be blocked except by creatures with flying or reach.)\nWhen Aegis Angel enters the battlefield, another target permanent gains indestructible for as long as you control Aegis Angel. (Effects that say \"destroy\" don't destroy it. A creature with indestructible can't be destroyed by damage.)","number":"270","imageName":"aegis angel","starter":true},{"layout":"normal","type":"Creature — Human Artificer","types":["Creature"],"colors":["Blue"],"multiverseid":383177,"name":"Aeronaut Tinkerer","subtypes":["Human","Artificer"],"cmc":3,"rarity":"Common","artist":"Willian Murai","power":"2","toughness":"3","manaCost":"{2}{U}","text":"Aeronaut Tinkerer has flying as long as you control an artifact. (It can't be blocked except by creatures with flying or reach.)","flavor":"\"All tinkerers have their heads in the clouds. I don't intend to stop there.\"","number":"43","imageName":"aeronaut tinkerer"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["Blue"],"multiverseid":383178,"name":"Ætherspouts","cmc":5,"rarity":"Rare","artist":"Dan Scott","manaCost":"{3}{U}{U}","text":"For each attacking creature, its owner puts it on the top or bottom of his or her library.","flavor":"\"Don't worry, there's plenty for everyone.\"\n—Vickon, Eleventh Company battlemage","number":"44","imageName":"aetherspouts"},{"layout":"normal","type":"Enchantment","types":["Enchantment"],"colors":["Red"],"multiverseid":383179,"name":"Aggressive Mining","cmc":4,"rarity":"Rare","artist":"Franz Vohwinkel","manaCost":"{3}{R}","text":"You can't play lands.\nSacrifice a land: Draw two cards. Activate this ability only once each turn.","flavor":"Designed by Markus Persson","number":"127","imageName":"aggressive mining"},{"layout":"normal","type":"Planeswalker — Ajani","types":["Planeswalker"],"colors":["White"],"multiverseid":383180,"name":"Ajani Steadfast","subtypes":["Ajani"],"cmc":4,"rarity":"Mythic Rare","artist":"Chris Rahn","loyalty":4,"manaCost":"{3}{W}","text":"+1: Until end of turn, up to one target creature gets +1/+1 and gains first strike, vigilance, and lifelink.\n−2: Put a +1/+1 counter on each creature you control and a loyalty counter on each other planeswalker you control.\n−7: You get an emblem with \"If a source would deal damage to you or a planeswalker you control, prevent all but 1 of that damage.\"","number":"1","imageName":"ajani steadfast"},{"layout":"normal","type":"Creature — Cat Soldier","types":["Creature"],"colors":["White"],"multiverseid":383181,"name":"Ajani's Pridemate","subtypes":["Cat","Soldier"],"cmc":2,"rarity":"Uncommon","artist":"Svetlin Velinov","power":"2","toughness":"2","manaCost":"{1}{W}","text":"Whenever you gain life, you may put a +1/+1 counter on Ajani's Pridemate.","flavor":"\"When one of us prospers, the pride prospers.\"\n—Jazal Goldmane","number":"2","imageName":"ajani's pridemate"},{"layout":"normal","type":"Creature — Human Berserker","types":["Creature"],"colors":["Red"],"multiverseid":383182,"name":"Altac Bloodseeker","subtypes":["Human","Berserker"],"cmc":2,"rarity":"Uncommon","artist":"Cynthia Sheppard","power":"2","toughness":"1","manaCost":"{1}{R}","text":"Whenever a creature an opponent controls dies, Altac Bloodseeker gets +2/+0 and gains first strike and haste until end of turn. (It deals combat damage before creatures without first strike, and it can attack and {T} as soon as it comes under your control.)","number":"128","imageName":"altac bloodseeker"},{"layout":"normal","type":"Creature — Salamander Wizard","types":["Creature"],"colors":["Blue"],"multiverseid":383183,"name":"Amphin Pathmage","subtypes":["Salamander","Wizard"],"cmc":4,"rarity":"Common","artist":"Mark Winters","power":"3","toughness":"2","manaCost":"{3}{U}","text":"{2}{U}: Target creature can't be blocked this turn.","flavor":"\"There are those who do not believe in the existence of the amphin. This seems somehow to be of their own design.\"\n—Gor Muldrak, Cryptohistories","number":"45","imageName":"amphin pathmage"},{"layout":"normal","type":"Creature — Ape","types":["Creature"],"colors":["Green"],"multiverseid":383184,"name":"Ancient Silverback","subtypes":["Ape"],"cmc":6,"rarity":"Uncommon","artist":"Scott M. Fischer","power":"6","toughness":"5","manaCost":"{4}{G}{G}","text":"{G}: Regenerate Ancient Silverback. (The next time this creature would be destroyed this turn, it isn't. Instead tap it, remove all damage from it, and remove it from combat.)","number":"168","imageName":"ancient silverback"},{"layout":"normal","supertypes":["Legendary"],"type":"Legendary Creature — Angel","types":["Creature"],"colors":["White"],"multiverseid":383185,"name":"Avacyn, Guardian Angel","subtypes":["Angel"],"cmc":5,"rarity":"Rare","artist":"Winona Nelson","power":"5","toughness":"4","manaCost":"{2}{W}{W}{W}","text":"Flying, vigilance\n{1}{W}: Prevent all damage that would be dealt to another target creature this turn by sources of the color of your choice.\n{5}{W}{W}: Prevent all damage that would be dealt to target player this turn by sources of the color of your choice.","number":"3","imageName":"avacyn, guardian angel"},{"layout":"normal","type":"Artifact — Equipment","types":["Artifact"],"multiverseid":383186,"name":"Avarice Amulet","subtypes":["Equipment"],"cmc":4,"rarity":"Rare","artist":"Steven Belledin","manaCost":"{4}","text":"Equipped creature gets +2/+0 and has vigilance and \"At the beginning of your upkeep, draw a card.\"\nWhen equipped creature dies, target opponent gains control of Avarice Amulet.\nEquip {2} ({2}: Attach to target creature you control. Equip only as a sorcery.)","flavor":"Designed by Penny Arcade","number":"212","imageName":"avarice amulet"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["Green"],"multiverseid":383187,"name":"Back to Nature","cmc":2,"rarity":"Uncommon","artist":"Howard Lyon","manaCost":"{1}{G}","text":"Destroy all enchantments.","flavor":"There will always be those who presume to improve nature, or dare to befoul it. And nature will always have a response.","number":"169","imageName":"back to nature"},{"layout":"normal","type":"Enchantment — Aura","types":["Enchantment"],"colors":["White"],"multiverseid":383188,"name":"Battle Mastery","subtypes":["Aura"],"cmc":3,"rarity":"Uncommon","artist":"Zoltan Boros & Gabor Szikszai","manaCost":"{2}{W}","text":"Enchant creature\nEnchanted creature has double strike. (It deals both first-strike and regular combat damage.)","flavor":"\"Boom! Boom! Boots the size of oxcarts, then an axe like a falling sun. Elves scattered. Trees scattered. Even the hills ran for the hills!\"\n—Clachan Tales","number":"4","imageName":"battle mastery"},{"layout":"normal","type":"Land","types":["Land"],"multiverseid":383189,"name":"Battlefield Forge","rarity":"Rare","artist":"Darrell Riche","text":"{T}: Add {1} to your mana pool.\n{T}: Add {R} or {W} to your mana pool. Battlefield Forge deals 1 damage to you.","number":"240","imageName":"battlefield forge"},{"layout":"normal","type":"Creature — Sliver","types":["Creature"],"colors":["Red"],"multiverseid":383190,"name":"Belligerent Sliver","subtypes":["Sliver"],"cmc":3,"rarity":"Uncommon","artist":"Raymond Swanland","power":"2","toughness":"2","manaCost":"{2}{R}","text":"Sliver creatures you control have \"This creature can't be blocked except by two or more creatures.\"","flavor":"\"The slivers became adept at provoking a fear response in other species.\"\n—Hastric, Thunian scout","number":"129","imageName":"belligerent sliver"},{"layout":"normal","type":"Creature — Zombie Cat","types":["Creature"],"colors":["Black"],"multiverseid":383191,"name":"Black Cat","subtypes":["Zombie","Cat"],"cmc":2,"rarity":"Common","artist":"David Palumbo","power":"1","toughness":"1","manaCost":"{1}{B}","text":"When Black Cat dies, target opponent discards a card at random.","flavor":"Its last life is spent tormenting your dreams.","number":"86","imageName":"black cat"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["Red"],"multiverseid":383192,"name":"Blastfire Bolt","cmc":6,"rarity":"Common","artist":"Phill Simmer","manaCost":"{5}{R}","text":"Blastfire Bolt deals 5 damage to target creature. Destroy all Equipment attached to that creature.","flavor":"\"Encase yourself in the most elaborate armor, and cower behind the heaviest shield. I would hate for you to feel helpless.\"\n—Korig the Ruiner","number":"130","imageName":"blastfire bolt"},{"layout":"normal","type":"Creature — Vampire","types":["Creature"],"colors":["Black"],"multiverseid":383193,"name":"Blood Host","subtypes":["Vampire"],"cmc":5,"rarity":"Uncommon","artist":"Cynthia Sheppard","power":"3","toughness":"3","manaCost":"{3}{B}{B}","text":"{1}{B}, Sacrifice another creature: Put a +1/+1 counter on Blood Host and you gain 2 life.","flavor":"It would be ill-mannered to decline his invitation. It would be ill-advised to accept it.","number":"87","imageName":"blood host"},{"layout":"normal","type":"Creature — Giant Monk","types":["Creature"],"colors":["White"],"multiverseid":383194,"name":"Boonweaver Giant","subtypes":["Giant","Monk"],"cmc":7,"rarity":"Uncommon","artist":"Adam Paquette","power":"4","toughness":"4","manaCost":"{6}{W}","text":"When Boonweaver Giant enters the battlefield, you may search your graveyard, hand, and/or library for an Aura card and put it onto the battlefield attached to Boonweaver Giant. If you search your library this way, shuffle it.","number":"5","imageName":"boonweaver giant"},{"layout":"normal","type":"Creature — Human Warrior","types":["Creature"],"colors":["Red"],"multiverseid":383195,"name":"Borderland Marauder","subtypes":["Human","Warrior"],"cmc":2,"rarity":"Common","artist":"Scott M. Fischer","power":"1","toughness":"2","manaCost":"{1}{R}","text":"Whenever Borderland Marauder attacks, it gets +2/+0 until end of turn.","flavor":"Though she is rightly feared, there are relatively few tales of her deeds in battle, for few survive her raids.","number":"131","imageName":"borderland marauder"},{"layout":"normal","type":"Artifact — Equipment","types":["Artifact"],"multiverseid":383196,"name":"Brawler's Plate","subtypes":["Equipment"],"cmc":3,"rarity":"Uncommon","artist":"Jung Park","manaCost":"{3}","text":"Equipped creature gets +2/+2 and has trample. (If it would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.)\nEquip {4} ({4}: Attach to target creature you control. Equip only as a sorcery.)","number":"213","imageName":"brawler's plate"},{"layout":"normal","type":"Artifact Creature — Sable","types":["Artifact","Creature"],"multiverseid":383197,"name":"Bronze Sable","subtypes":["Sable"],"cmc":2,"rarity":"Common","artist":"Jasper Sandner","power":"2","toughness":"1","manaCost":"{2}","flavor":"The Champion stood alone between the horde of the Returned and the shrine to Karametra, cutting down scores among hundreds. She would have been overcome if not for the aid of the temple guardians whom Karametra awakened.\n—The Theriad","number":"214","imageName":"bronze sable"},{"layout":"normal","type":"Creature — Human Shaman","types":["Creature"],"colors":["Red"],"multiverseid":383198,"name":"Brood Keeper","subtypes":["Human","Shaman"],"cmc":4,"rarity":"Uncommon","artist":"Scott Murphy","power":"2","toughness":"3","manaCost":"{3}{R}","text":"Whenever an Aura becomes attached to Brood Keeper, put a 2/2 red Dragon creature token with flying onto the battlefield. It has \"{R}: This creature gets +1/+0 until end of turn.\"","flavor":"\"Come, little one. Unfurl your wings, fill your lungs, and release your first fiery breath.\"","number":"132","imageName":"brood keeper"},{"layout":"normal","type":"Enchantment — Aura","types":["Enchantment"],"colors":["Red"],"multiverseid":383199,"name":"Burning Anger","subtypes":["Aura"],"cmc":5,"rarity":"Rare","artist":"Anthony Palumbo","manaCost":"{4}{R}","text":"Enchant creature\nEnchanted creature has \"{T}: This creature deals damage equal to its power to target creature or player.\"","flavor":"\"With rage as your forge, your hammer can smite anything.\"","number":"133","imageName":"burning anger"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["Blue"],"multiverseid":383161,"name":"Cancel","cmc":3,"rarity":"Common","artist":"David Palumbo","manaCost":"{1}{U}{U}","text":"Counter target spell.","flavor":"\"What you are attempting is not against the law. It is, however, extremely foolish.\"","number":"274","imageName":"cancel","starter":true},{"layout":"normal","type":"Creature — Plant Elemental Beast","types":["Creature"],"colors":["Green"],"multiverseid":383200,"name":"Carnivorous Moss-Beast","subtypes":["Plant","Elemental","Beast"],"cmc":6,"rarity":"Common","artist":"Filip Burburan","power":"4","toughness":"5","manaCost":"{4}{G}{G}","text":"{5}{G}{G}: Put a +1/+1 counter on Carnivorous Moss-Beast.","flavor":"Ranger wisdom dictates that when fleeing from a moss-beast, you must stay calm, find your bearings, and run south.","number":"170","imageName":"carnivorous moss-beast"},{"layout":"normal","type":"Creature — Zombie Bird","types":["Creature"],"colors":["Black"],"multiverseid":383201,"name":"Carrion Crow","subtypes":["Zombie","Bird"],"cmc":3,"rarity":"Common","artist":"Aaron Miller","power":"2","toughness":"2","manaCost":"{2}{B}","text":"Flying (This creature can't be blocked except by creatures with flying or reach.)\nCarrion Crow enters the battlefield tapped.","flavor":"When carrion feeds on carrion, dark days approach.","number":"88","imageName":"carrion crow"},{"layout":"normal","type":"Enchantment — Aura","types":["Enchantment"],"colors":["Black"],"multiverseid":383202,"name":"Caustic Tar","subtypes":["Aura"],"cmc":6,"rarity":"Uncommon","artist":"Jung Park","manaCost":"{4}{B}{B}","text":"Enchant land\nEnchanted land has \"{T}: Target player loses 3 life.\"","flavor":"A forest fire can rejuvenate the land, but the tar's vile consumption leaves the land forever ruined.","number":"89","imageName":"caustic tar"},{"layout":"normal","type":"Land","types":["Land"],"multiverseid":383203,"name":"Caves of Koilos","rarity":"Rare","artist":"Jim Nelson","text":"{T}: Add {1} to your mana pool.\n{T}: Add {W} or {B} to your mana pool. Caves of Koilos deals 1 damage to you.","number":"241","imageName":"caves of koilos"},{"layout":"normal","type":"Creature — Centaur Warrior","types":["Creature"],"colors":["Green"],"multiverseid":383162,"name":"Centaur Courser","subtypes":["Centaur","Warrior"],"cmc":3,"rarity":"Common","artist":"Vance Kovacs","power":"3","toughness":"3","manaCost":"{2}{G}","flavor":"\"The centaurs are truly free. Never will they be tamed by temptation or controlled by fear. They live in total harmony, a feat not yet achieved by our kind.\"\n—Ramal, sage of Westgate","number":"282","imageName":"centaur courser","starter":true},{"layout":"normal","type":"Planeswalker — Chandra","types":["Planeswalker"],"colors":["Red"],"multiverseid":383204,"name":"Chandra, Pyromaster","subtypes":["Chandra"],"cmc":4,"rarity":"Mythic Rare","artist":"Winona Nelson","loyalty":4,"manaCost":"{2}{R}{R}","text":"+1: Chandra, Pyromaster deals 1 damage to target player and 1 damage to up to one target creature that player controls. That creature can't block this turn.\n0: Exile the top card of your library. You may play it this turn.\n−7: Exile the top ten cards of your library. Choose an instant or sorcery card exiled this way and copy it three times. You may cast the copies without paying their mana costs.","number":"134","imageName":"chandra, pyromaster"},{"layout":"normal","type":"Creature — Rhino","types":["Creature"],"colors":["Green"],"multiverseid":383205,"name":"Charging Rhino","subtypes":["Rhino"],"cmc":5,"rarity":"Common","artist":"Daren Bader","power":"4","toughness":"4","manaCost":"{3}{G}{G}","text":"Charging Rhino can't be blocked by more than one creature.","flavor":"The knights of Troinir Keep took the rhino as their emblem due to its intense focus when charging down a perceived threat—a trait they discovered on a hunting excursion.","number":"171","imageName":"charging rhino"},{"layout":"normal","type":"Creature — Squid Horror","types":["Creature"],"colors":["Blue"],"multiverseid":383206,"name":"Chasm Skulker","subtypes":["Squid","Horror"],"cmc":3,"rarity":"Rare","artist":"Jack Wang","power":"1","toughness":"1","manaCost":"{2}{U}","text":"Whenever you draw a card, put a +1/+1 counter on Chasm Skulker.\nWhen Chasm Skulker dies, put X 1/1 blue Squid creature tokens with islandwalk onto the battlefield, where X is the number of +1/+1 counters on Chasm Skulker. (They can't be blocked as long as defending player controls an Island.)","flavor":"Designed by Mike Neumann","number":"46","imageName":"chasm skulker"},{"layout":"normal","type":"Creature — Vedalken Artificer","types":["Creature"],"colors":["Blue"],"multiverseid":383207,"name":"Chief Engineer","subtypes":["Vedalken","Artificer"],"cmc":2,"rarity":"Rare","artist":"Steven Belledin","power":"1","toughness":"3","manaCost":"{1}{U}","text":"Artifact spells you cast have convoke. (Your creatures can help cast those spells. Each creature you tap while casting an artifact spell pays for {1} or one mana of that creature's color.)","flavor":"An eye for detail, a mind for numbers, a soul of clockwork.","number":"47","imageName":"chief engineer"},{"layout":"normal","type":"Creature — Vampire","types":["Creature"],"colors":["Black"],"multiverseid":383208,"name":"Child of Night","subtypes":["Vampire"],"cmc":2,"rarity":"Common","artist":"Ash Wood","power":"2","toughness":"1","manaCost":"{1}{B}","text":"Lifelink (Damage dealt by this creature also causes you to gain that much life.)","flavor":"Sins that would be too gruesome in the light of day are made more pleasing in the dark of night.","number":"90","imageName":"child of night"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["Green"],"multiverseid":383209,"name":"Chord of Calling","cmc":3,"rarity":"Rare","artist":"Karl Kopinski","manaCost":"{X}{G}{G}{G}","text":"Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nSearch your library for a creature card with converted mana cost X or less and put it onto the battlefield. Then shuffle your library.","number":"172","imageName":"chord of calling"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["Blue"],"multiverseid":383210,"name":"Chronostutter","cmc":6,"rarity":"Common","artist":"Seb McKinnon","manaCost":"{5}{U}","text":"Put target creature into its owner's library second from the top.","flavor":"Timing is everything.","number":"48","imageName":"chronostutter"},{"layout":"normal","type":"Enchantment","types":["Enchantment"],"colors":["Red"],"multiverseid":383211,"name":"Circle of Flame","cmc":2,"rarity":"Uncommon","artist":"Jaime Jones","manaCost":"{1}{R}","text":"Whenever a creature without flying attacks you or a planeswalker you control, Circle of Flame deals 1 damage to that creature.","flavor":"\"Which do you think is a better deterrent: a moat of water or one of fire?\"\n—Chandra Nalaar","number":"135","imageName":"circle of flame"},{"layout":"normal","type":"Sorcery","types":["Sorcery"],"colors":["Red"],"multiverseid":383212,"name":"Clear a Path","cmc":1,"rarity":"Common","artist":"Karl Kopinski","manaCost":"{R}","text":"Destroy target creature with defender.","flavor":"\"Why do guards always look surprised when we bash them?\" asked Ruric.\n\"I think they expect a bribe,\" said Thar.","number":"136","imageName":"clear a path"},{"layout":"normal","type":"Sorcery","types":["Sorcery"],"colors":["Red"],"multiverseid":383213,"name":"Cone of Flame","cmc":5,"rarity":"Uncommon","artist":"Chippy","manaCost":"{3}{R}{R}","text":"Cone of Flame deals 1 damage to target creature or player, 2 damage to another target creature or player, and 3 damage to a third target creature or player.","number":"137","imageName":"cone of flame"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["White"],"multiverseid":383214,"name":"Congregate","cmc":4,"rarity":"Uncommon","artist":"Mark Zug","manaCost":"{3}{W}","text":"Target player gains 2 life for each creature on the battlefield.","flavor":"\"In the gathering there is strength for all who founder, renewal for all who languish, love for all who sing.\"\n—Song of All, canto 642","number":"6","imageName":"congregate"},{"layout":"normal","type":"Creature — Sliver","types":["Creature"],"colors":["White"],"multiverseid":383215,"name":"Constricting Sliver","subtypes":["Sliver"],"cmc":6,"rarity":"Uncommon","artist":"Karl Kopinski","power":"3","toughness":"3","manaCost":"{5}{W}","text":"Sliver creatures you control have \"When this creature enters the battlefield, you may exile target creature an opponent controls until this creature leaves the battlefield.\"","flavor":"Slivers are often seen toying with enemies they capture, not out of cruelty, but to fully learn their physical capabilities.","number":"7","imageName":"constricting sliver"},{"layout":"normal","type":"Creature — Wall","types":["Creature"],"colors":["Blue"],"multiverseid":383216,"name":"Coral Barrier","subtypes":["Wall"],"cmc":3,"rarity":"Common","artist":"Florian de Gesincourt","power":"1","toughness":"3","manaCost":"{2}{U}","text":"Defender (This creature can't attack.)\nWhen Coral Barrier enters the battlefield, put a 1/1 blue Squid creature token with islandwalk onto the battlefield. (It can't be blocked as long as defending player controls an Island.)","number":"49","imageName":"coral barrier"},{"layout":"normal","type":"Sorcery","types":["Sorcery"],"colors":["Black"],"multiverseid":383217,"name":"Covenant of Blood","cmc":7,"rarity":"Common","artist":"Seb McKinnon","manaCost":"{6}{B}","text":"Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nCovenant of Blood deals 4 damage to target creature or player and you gain 4 life.","number":"91","imageName":"covenant of blood"},{"layout":"normal","type":"Enchantment — Aura","types":["Enchantment"],"colors":["Black"],"multiverseid":383218,"name":"Crippling Blight","subtypes":["Aura"],"cmc":1,"rarity":"Common","artist":"Lucas Graciano","manaCost":"{B}","text":"Enchant creature\nEnchanted creature gets -1/-1 and can't block.","flavor":"\"Still alive? No matter. I'll leave you as a warning to others who would oppose me.\"\n—Vish Kal, Blood Arbiter","number":"92","imageName":"crippling blight"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["Red"],"multiverseid":383219,"name":"Crowd's Favor","cmc":1,"rarity":"Common","artist":"Slawomir Maniak","manaCost":"{R}","text":"Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nTarget creature gets +1/+0 and gains first strike until end of turn. (It deals combat damage before creatures without first strike.)","number":"138","imageName":"crowd's favor"},{"layout":"normal","type":"Enchantment","types":["Enchantment"],"colors":["Red"],"multiverseid":383220,"name":"Crucible of Fire","cmc":4,"rarity":"Rare","artist":"Dominick Domingo","manaCost":"{3}{R}","text":"Dragon creatures you control get +3/+3.","flavor":"\"The dragon is a perfect marriage of power and the will to use it.\"\n—Sarkhan Vol","number":"139","imageName":"crucible of fire"},{"layout":"normal","type":"Creature — Human Assassin","types":["Creature"],"colors":["Black"],"multiverseid":383221,"name":"Cruel Sadist","subtypes":["Human","Assassin"],"cmc":1,"rarity":"Rare","artist":"Min Yum","power":"1","toughness":"1","manaCost":"{B}","text":"{B}, {T}, Pay 1 life: Put a +1/+1 counter on Cruel Sadist.\n{2}{B}, {T}, Remove X +1/+1 counters from Cruel Sadist: Cruel Sadist deals X damage to target creature.","flavor":"Face of innocence. Hand of death.\nDesigned by Edmund McMillen","number":"93","imageName":"cruel sadist"},{"layout":"normal","type":"Artifact Land","types":["Artifact","Land"],"multiverseid":383222,"name":"Darksteel Citadel","rarity":"Uncommon","artist":"John Avon","text":"Indestructible (Effects that say \"destroy\" don't destroy this land.)\n{T}: Add {1} to your mana pool.","flavor":"Structures built from darksteel yield to neither assault nor age.","number":"242","imageName":"darksteel citadel"},{"layout":"normal","type":"Creature — Human Soldier","types":["Creature"],"colors":["White"],"multiverseid":383223,"name":"Dauntless River Marshal","subtypes":["Human","Soldier"],"cmc":2,"rarity":"Uncommon","artist":"Mark Winters","power":"2","toughness":"1","manaCost":"{1}{W}","text":"Dauntless River Marshal gets +1/+1 as long as you control an Island.\n{3}{U}: Tap target creature.","flavor":"\"Thieves and squid squirm the same way when you capture them.\"","number":"8","imageName":"dauntless river marshal"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["White"],"multiverseid":383224,"name":"Devouring Light","cmc":3,"rarity":"Uncommon","artist":"Slawomir Maniak","manaCost":"{1}{W}{W}","text":"Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nExile target attacking or blocking creature.","flavor":"\"Even your shadow is too foul to tolerate.\"","number":"9","imageName":"devouring light"},{"layout":"normal","type":"Creature — Sliver","types":["Creature"],"colors":["Blue"],"multiverseid":383225,"name":"Diffusion Sliver","subtypes":["Sliver"],"cmc":2,"rarity":"Uncommon","artist":"Trevor Claxton","power":"1","toughness":"1","manaCost":"{1}{U}","text":"Whenever a Sliver creature you control becomes the target of a spell or ability an opponent controls, counter that spell or ability unless its controller pays {2}.","flavor":"\"The hive shimmered, and its walls seemed a living mirror.\"\n—Hastric, Thunian scout","number":"50","imageName":"diffusion sliver"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["Blue"],"multiverseid":383226,"name":"Dissipate","cmc":3,"rarity":"Uncommon","artist":"Tomasz Jedruszek","manaCost":"{1}{U}{U}","text":"Counter target spell. If that spell is countered this way, exile it instead of putting it into its owner's graveyard.","flavor":"\"This abomination never belonged in our world. I'm merely setting it free.\"\n—Dierk, geistmage","number":"51","imageName":"dissipate"},{"layout":"normal","type":"Sorcery","types":["Sorcery"],"colors":["Blue"],"multiverseid":383227,"name":"Divination","cmc":3,"rarity":"Common","artist":"Howard Lyon","manaCost":"{2}{U}","text":"Draw two cards.","flavor":"\"The key to unlocking this puzzle is within you.\"\n—Doriel, mentor of Mistral Isle","number":"52","imageName":"divination"},{"layout":"normal","type":"Enchantment — Aura","types":["Enchantment"],"colors":["White"],"multiverseid":383228,"name":"Divine Favor","subtypes":["Aura"],"cmc":2,"rarity":"Common","artist":"Allen Williams","manaCost":"{1}{W}","text":"Enchant creature\nWhen Divine Favor enters the battlefield, you gain 3 life.\nEnchanted creature gets +1/+3.","flavor":"With an armory of light, even the squire may champion her people.","number":"10","imageName":"divine favor"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["White"],"multiverseid":383163,"name":"Divine Verdict","cmc":4,"rarity":"Common","artist":"Kev Walker","manaCost":"{3}{W}","text":"Destroy target attacking or blocking creature.","flavor":"\"Guilty.\"","number":"271","imageName":"divine verdict","starter":true},{"layout":"normal","type":"Creature — Elf Druid","types":["Creature"],"colors":["Green"],"multiverseid":383229,"name":"Elvish Mystic","subtypes":["Elf","Druid"],"cmc":1,"rarity":"Common","artist":"Wesley Burt","power":"1","toughness":"1","manaCost":"{G}","text":"{T}: Add {G} to your mana pool.","flavor":"\"Life grows everywhere. My kin merely find those places where it grows strongest.\"\n—Nissa Revane","number":"173","imageName":"elvish mystic"},{"layout":"normal","type":"Enchantment — Aura","types":["Enchantment"],"colors":["Blue"],"multiverseid":383230,"name":"Encrust","subtypes":["Aura"],"cmc":3,"rarity":"Common","artist":"Jason Felix","manaCost":"{1}{U}{U}","text":"Enchant artifact or creature\nEnchanted permanent doesn't untap during its controller's untap step and its activated abilities can't be activated.","flavor":"\"The sea blesses the tiny with the power to fell the mighty.\"\n—Talrand, sky summoner","number":"53","imageName":"encrust"},{"layout":"normal","type":"Sorcery","types":["Sorcery"],"colors":["Black"],"multiverseid":383231,"name":"Endless Obedience","cmc":6,"rarity":"Uncommon","artist":"Karl Kopinski","manaCost":"{4}{B}{B}","text":"Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nPut target creature card from a graveyard onto the battlefield under your control.","number":"94","imageName":"endless obedience"},{"layout":"normal","type":"Enchantment — Aura","types":["Enchantment"],"colors":["Blue"],"multiverseid":383232,"name":"Ensoul Artifact","subtypes":["Aura"],"cmc":2,"rarity":"Uncommon","artist":"Jasper Sandner","manaCost":"{1}{U}","text":"Enchant artifact\nEnchanted artifact is a creature with base power and toughness 5/5 in addition to its other types.","flavor":"Too often, some self-described genius comes up with a \"labor-saving device\" that ends up creating far more work.","number":"54","imageName":"ensoul artifact"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["White"],"multiverseid":383233,"name":"Ephemeral Shields","cmc":2,"rarity":"Common","artist":"Yohann Schepacz","manaCost":"{1}{W}","text":"Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nTarget creature gains indestructible until end of turn. (Damage and effects that say \"destroy\" don't destroy it.)","number":"11","imageName":"ephemeral shields"},{"layout":"normal","type":"Enchantment — Aura","types":["Enchantment"],"colors":["Black"],"multiverseid":383234,"name":"Eternal Thirst","subtypes":["Aura"],"cmc":2,"rarity":"Common","artist":"Clint Cearley","manaCost":"{1}{B}","text":"Enchant creature\nEnchanted creature has lifelink and \"Whenever a creature an opponent controls dies, put a +1/+1 counter on this creature.\" (Damage dealt by a creature with lifelink also causes its controller to gain that much life.)","number":"95","imageName":"eternal thirst"},{"layout":"normal","type":"Land","types":["Land"],"multiverseid":383235,"name":"Evolving Wilds","rarity":"Common","artist":"Steven Belledin","text":"{T}, Sacrifice Evolving Wilds: Search your library for a basic land card and put it onto the battlefield tapped. Then shuffle your library.","flavor":"Without the interfering hands of civilization, nature will always shape itself to its own needs.","number":"243","imageName":"evolving wilds"},{"layout":"normal","type":"Enchantment","types":["Enchantment"],"colors":["Black"],"multiverseid":383236,"name":"Feast on the Fallen","cmc":3,"rarity":"Uncommon","artist":"Dave Kendall","manaCost":"{2}{B}","text":"At the beginning of each upkeep, if an opponent lost life last turn, put a +1/+1 counter on target creature you control.","flavor":"\"As our numbers dwindle, the ranks of the dead grow ever stronger.\"\n—Thalia, Knight-Cathar","number":"96","imageName":"feast on the fallen"},{"layout":"normal","type":"Sorcery","types":["Sorcery"],"colors":["Green"],"multiverseid":383237,"name":"Feral Incarnation","cmc":9,"rarity":"Uncommon","artist":"Eytan Zana","manaCost":"{8}{G}","text":"Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nPut three 3/3 green Beast creature tokens onto the battlefield.","flavor":"Nature is itself wild—in all its forms.","number":"174","imageName":"feral incarnation"},{"layout":"normal","type":"Sorcery","types":["Sorcery"],"colors":["Black"],"multiverseid":383238,"name":"Festergloom","cmc":3,"rarity":"Common","artist":"Mathias Kollros","manaCost":"{2}{B}","text":"Nonblack creatures get -1/-1 until end of turn.","flavor":"The death of a scout can be as informative as a safe return.","number":"97","imageName":"festergloom"},{"layout":"normal","type":"Enchantment","types":["Enchantment"],"colors":["White"],"multiverseid":383239,"name":"First Response","cmc":4,"rarity":"Uncommon","artist":"Slawomir Maniak","manaCost":"{3}{W}","text":"At the beginning of each upkeep, if you lost life last turn, put a 1/1 white Soldier creature token onto the battlefield.","flavor":"\"There's never a good time for a disaster or an attack. That's why we're here.\"\n—Oren, militia captain","number":"12","imageName":"first response"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["Black"],"multiverseid":383240,"name":"Flesh to Dust","cmc":5,"rarity":"Common","artist":"Julie Dillon","manaCost":"{3}{B}{B}","text":"Destroy target creature. It can't be regenerated.","flavor":"\"Pain is temporary. So is life.\"\n—Liliana Vess","number":"98","imageName":"flesh to dust"},{"layout":"normal","supertypes":["Basic"],"type":"Basic Land — Forest","types":["Land"],"multiverseid":383244,"name":"Forest","subtypes":["Forest"],"rarity":"Basic Land","artist":"John Avon","number":"266","variations":[383241,383242,383243],"imageName":"forest1"},{"layout":"normal","supertypes":["Basic"],"type":"Basic Land — Forest","types":["Land"],"multiverseid":383242,"name":"Forest","subtypes":["Forest"],"rarity":"Basic Land","artist":"Steven Belledin","number":"267","variations":[383241,383243,383244],"imageName":"forest2"},{"layout":"normal","supertypes":["Basic"],"type":"Basic Land — Forest","types":["Land"],"multiverseid":383243,"name":"Forest","subtypes":["Forest"],"rarity":"Basic Land","artist":"Noah Bradley","number":"268","variations":[383241,383242,383244],"imageName":"forest3"},{"layout":"normal","supertypes":["Basic"],"type":"Basic Land — Forest","types":["Land"],"multiverseid":383241,"name":"Forest","subtypes":["Forest"],"rarity":"Basic Land","artist":"Jonas De Ro","number":"269","variations":[383242,383243,383244],"imageName":"forest4"},{"layout":"normal","type":"Creature — Devil","types":["Creature"],"colors":["Red"],"multiverseid":383245,"name":"Forge Devil","subtypes":["Devil"],"cmc":1,"rarity":"Common","artist":"Austin Hsu","power":"1","toughness":"1","manaCost":"{R}","text":"When Forge Devil enters the battlefield, it deals 1 damage to target creature and 1 damage to you.","flavor":"A bit of pain never hurts.","number":"140","imageName":"forge devil"},{"layout":"normal","type":"Creature — Goblin Warrior","types":["Creature"],"colors":["Red"],"multiverseid":383246,"name":"Foundry Street Denizen","subtypes":["Goblin","Warrior"],"cmc":1,"rarity":"Common","artist":"Raoul Vitale","power":"1","toughness":"1","manaCost":"{R}","text":"Whenever another red creature enters the battlefield under your control, Foundry Street Denizen gets +1/+0 until end of turn.","flavor":"After the Foundry Street riot, Arrester Hulbein tried to ban bludgeons. Which, inevitably, resulted in another riot.","number":"141","imageName":"foundry street denizen"},{"layout":"normal","type":"Creature — Goblin Berserker","types":["Creature"],"colors":["Red"],"multiverseid":383247,"name":"Frenzied Goblin","subtypes":["Goblin","Berserker"],"cmc":1,"rarity":"Uncommon","artist":"Carl Critchlow","power":"1","toughness":"1","manaCost":"{R}","text":"Whenever Frenzied Goblin attacks, you may pay {R}. If you do, target creature can't block this turn.","flavor":"What he lacks in stature, he makes up for with enthusiasm.","number":"142","imageName":"frenzied goblin"},{"layout":"normal","type":"Creature — Elemental Cat","types":["Creature"],"colors":["Blue"],"multiverseid":383248,"name":"Frost Lynx","subtypes":["Elemental","Cat"],"cmc":3,"rarity":"Common","artist":"Izzy","power":"2","toughness":"2","manaCost":"{2}{U}","text":"When Frost Lynx enters the battlefield, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step.","flavor":"It readily attacks much larger prey, knowing retaliation is impossible.","number":"55","imageName":"frost lynx"},{"layout":"normal","type":"Creature — Human Wizard","types":["Creature"],"colors":["Blue"],"multiverseid":383249,"name":"Fugitive Wizard","subtypes":["Human","Wizard"],"cmc":1,"rarity":"Common","artist":"Mark Zug","power":"1","toughness":"1","manaCost":"{U}","flavor":"\"The law has its place—as a footnote in my spellbook.\"\n—Siyani, fugitive mage","number":"56","imageName":"fugitive wizard"},{"layout":"normal","type":"Creature — Dragon","types":["Creature"],"colors":["Red"],"multiverseid":383164,"name":"Furnace Whelp","subtypes":["Dragon"],"cmc":4,"rarity":"Uncommon","artist":"Matt Cavotta","power":"2","toughness":"2","manaCost":"{2}{R}{R}","text":"Flying (This creature can't be blocked except by creatures with flying or reach.)\n{R}: Furnace Whelp gets +1/+0 until end of turn.","flavor":"Baby dragons can't figure out humans—if they didn't want to be killed, why were they made of meat and treasure?","number":"279","imageName":"furnace whelp","starter":true},{"layout":"normal","type":"Artifact Creature — Gargoyle","types":["Artifact","Creature"],"multiverseid":383250,"name":"Gargoyle Sentinel","subtypes":["Gargoyle"],"cmc":3,"rarity":"Uncommon","artist":"Drew Baker","power":"3","toughness":"3","manaCost":"{3}","text":"Defender (This creature can't attack.)\n{3}: Until end of turn, Gargoyle Sentinel loses defender and gains flying.","flavor":"The beating of a gargoyle's wings on the air is like the cracking of stones. Intruders who rouse a gargoyle are certain to hear the cracking of bones.","number":"216","imageName":"gargoyle sentinel"},{"layout":"normal","type":"Creature — Beast","types":["Creature"],"colors":["Green"],"multiverseid":383165,"name":"Garruk's Packleader","subtypes":["Beast"],"cmc":5,"rarity":"Uncommon","artist":"Nils Hamm","power":"4","toughness":"4","manaCost":"{4}{G}","text":"Whenever another creature with power 3 or greater enters the battlefield under your control, you may draw a card.","flavor":"\"He has learned much in his long years. And unlike selfish humans, he's willing to share.\"\n—Garruk Wildspeaker","number":"283","imageName":"garruk's packleader","starter":true},{"layout":"normal","type":"Planeswalker — Garruk","types":["Planeswalker"],"colors":["Black","Green"],"multiverseid":383251,"name":"Garruk, Apex Predator","subtypes":["Garruk"],"cmc":7,"rarity":"Mythic Rare","artist":"Tyler Jacobson","loyalty":5,"manaCost":"{5}{B}{G}","text":"+1: Destroy another target planeswalker.\n+1: Put a 3/3 black Beast creature token with deathtouch onto the battlefield.\n−3: Destroy target creature. You gain life equal to its toughness.\n−8: Target opponent gets an emblem with \"Whenever a creature attacks you, it gets +5/+5 and gains trample until end of turn.\"","number":"210","imageName":"garruk, apex predator"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["Green"],"multiverseid":383252,"name":"Gather Courage","cmc":1,"rarity":"Uncommon","artist":"Brian Despain","manaCost":"{G}","text":"Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nTarget creature gets +2/+2 until end of turn.","number":"175","imageName":"gather courage"},{"layout":"normal","type":"Creature — Spirit","types":["Creature"],"colors":["White"],"multiverseid":383253,"name":"Geist of the Moors","subtypes":["Spirit"],"cmc":3,"rarity":"Uncommon","artist":"Aaron Miller","power":"3","toughness":"1","manaCost":"{1}{W}{W}","text":"Flying","flavor":"\"The battle is won. There's work to be done. / The Blessed Sleep must wait. / A fiend is about. It stalks the devout. / I'll save them from my fate.\"\n—\"The Good Geist's Vow\"","number":"13","imageName":"geist of the moors"},{"layout":"normal","type":"Creature — Elemental","types":["Creature"],"colors":["Red"],"multiverseid":383254,"name":"Generator Servant","subtypes":["Elemental"],"cmc":2,"rarity":"Common","artist":"Mathias Kollros","power":"2","toughness":"1","manaCost":"{1}{R}","text":"{T}, Sacrifice Generator Servant: Add {2} to your mana pool. If that mana is spent on a creature spell, it gains haste until end of turn. (That creature can attack and {T} as soon as it comes under your control.)","number":"143","imageName":"generator servant"},{"layout":"normal","type":"Creature — Plant Hydra","types":["Creature"],"colors":["Green"],"multiverseid":383255,"name":"Genesis Hydra","subtypes":["Plant","Hydra"],"cmc":2,"rarity":"Rare","artist":"Peter Mohrbacher","power":"0","toughness":"0","manaCost":"{X}{G}{G}","text":"When you cast Genesis Hydra, reveal the top X cards of your library. You may put a nonland permanent card with converted mana cost X or less from among them onto the battlefield. Then shuffle the rest into your library.\nGenesis Hydra enters the battlefield with X +1/+1 counters on it.","flavor":"Designed by George Fan","number":"176","imageName":"genesis hydra"},{"layout":"normal","type":"Creature — Elemental","types":["Creature"],"colors":["Blue"],"multiverseid":383256,"name":"Glacial Crasher","subtypes":["Elemental"],"cmc":6,"rarity":"Common","artist":"Mark Winters","power":"5","toughness":"5","manaCost":"{4}{U}{U}","text":"Trample (If this creature would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.)\nGlacial Crasher can't attack unless there is a Mountain on the battlefield.","number":"57","imageName":"glacial crasher"},{"layout":"normal","type":"Creature — Goblin Warrior","types":["Creature"],"colors":["Red"],"multiverseid":383257,"name":"Goblin Kaboomist","subtypes":["Goblin","Warrior"],"cmc":2,"rarity":"Rare","artist":"Kev Walker","power":"1","toughness":"2","manaCost":"{1}{R}","text":"At the beginning of your upkeep, put a colorless artifact token named Land Mine onto the battlefield with \"{R}, Sacrifice this artifact: This artifact deals 2 damage to target attacking creature without flying.\" Then flip a coin. If you lose the flip, Goblin Kaboomist deals 2 damage to itself.","flavor":"Designed by Stone Librande","number":"144","imageName":"goblin kaboomist"},{"layout":"normal","type":"Creature — Goblin Warrior","types":["Creature"],"colors":["Red"],"multiverseid":383258,"name":"Goblin Rabblemaster","subtypes":["Goblin","Warrior"],"cmc":3,"rarity":"Rare","artist":"Svetlin Velinov","power":"2","toughness":"2","manaCost":"{2}{R}","text":"Other Goblin creatures you control attack each turn if able.\nAt the beginning of combat on your turn, put a 1/1 red Goblin creature token with haste onto the battlefield.\nWhenever Goblin Rabblemaster attacks, it gets +1/+0 until end of turn for each other attacking Goblin.","number":"145","imageName":"goblin rabblemaster"},{"layout":"normal","type":"Creature — Goblin Knight","types":["Creature"],"colors":["Red"],"multiverseid":383259,"name":"Goblin Roughrider","subtypes":["Goblin","Knight"],"cmc":3,"rarity":"Common","artist":"Jesper Ejsing","power":"3","toughness":"2","manaCost":"{2}{R}","flavor":"Astride the bucking creature, Gribble hurtled down the mountainside while his Grotag brethren cheered. It was at that moment that the legend of the Skrill Tamer was born.","number":"146","imageName":"goblin roughrider"},{"layout":"normal","type":"Creature — Zombie","types":["Creature"],"colors":["Black"],"multiverseid":383260,"name":"Gravedigger","subtypes":["Zombie"],"cmc":4,"rarity":"Uncommon","artist":"Dermot Power","power":"2","toughness":"2","manaCost":"{3}{B}","text":"When Gravedigger enters the battlefield, you may return target creature card from your graveyard to your hand.","flavor":"A grave is not always for burial.","number":"99","imageName":"gravedigger"},{"layout":"normal","type":"Artifact","types":["Artifact"],"multiverseid":383261,"name":"Grindclock","cmc":2,"rarity":"Rare","artist":"Nils Hamm","manaCost":"{2}","text":"{T}: Put a charge counter on Grindclock.\n{T}: Target player puts the top X cards of his or her library into his or her graveyard, where X is the number of charge counters on Grindclock.","flavor":"Pray you never hear it chime.","number":"217","imageName":"grindclock"},{"layout":"normal","type":"Enchantment — Aura","types":["Enchantment"],"colors":["Red"],"multiverseid":383262,"name":"Hammerhand","subtypes":["Aura"],"cmc":1,"rarity":"Common","artist":"Tomasz Jedruszek","manaCost":"{R}","text":"Enchant creature\nWhen Hammerhand enters the battlefield, target creature can't block this turn.\nEnchanted creature gets +1/+1 and has haste. (It can attack and {T} no matter when it came under your control.)","number":"147","imageName":"hammerhand"},{"layout":"normal","type":"Artifact — Equipment","types":["Artifact"],"multiverseid":383263,"name":"Haunted Plate Mail","subtypes":["Equipment"],"cmc":4,"rarity":"Rare","artist":"Izzy","manaCost":"{4}","text":"Equipped creature gets +4/+4.\n{0}: Until end of turn, Haunted Plate Mail becomes a 4/4 Spirit artifact creature that's no longer an Equipment. Activate this ability only if you control no creatures.\nEquip {4} ({4}: Attach to target creature you control. Equip only as a sorcery.)","number":"218","imageName":"haunted plate mail"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["Red"],"multiverseid":383264,"name":"Heat Ray","cmc":1,"rarity":"Uncommon","artist":"Austin Hsu","manaCost":"{X}{R}","text":"Heat Ray deals X damage to target creature.","flavor":"\"There was clearly a scream. I'm not sure if there was a mouth.\"\n—Sachir, Akoum Expeditionary House","number":"148","imageName":"heat ray"},{"layout":"normal","type":"Creature — Human Cleric","types":["Creature"],"colors":["White"],"multiverseid":383265,"name":"Heliod's Pilgrim","subtypes":["Human","Cleric"],"cmc":3,"rarity":"Common","artist":"Izzy","power":"1","toughness":"2","manaCost":"{2}{W}","text":"When Heliod's Pilgrim enters the battlefield, you may search your library for an Aura card, reveal it, put it into your hand, then shuffle your library.","flavor":"The blessings of Heliod are apparent for all to see.","number":"14","imageName":"heliod's pilgrim"},{"layout":"normal","type":"Creature — Dragon","types":["Creature"],"colors":["Red"],"multiverseid":383266,"name":"Hoarding Dragon","subtypes":["Dragon"],"cmc":5,"rarity":"Rare","artist":"Matt Cavotta","power":"4","toughness":"4","manaCost":"{3}{R}{R}","text":"Flying\nWhen Hoarding Dragon enters the battlefield, you may search your library for an artifact card, exile it, then shuffle your library.\nWhen Hoarding Dragon dies, you may put the exiled card into its owner's hand.","number":"149","imageName":"hoarding dragon"},{"layout":"normal","type":"Creature — Insect","types":["Creature"],"colors":["Green"],"multiverseid":383267,"name":"Hornet Nest","subtypes":["Insect"],"cmc":3,"rarity":"Rare","artist":"Adam Paquette","power":"0","toughness":"2","manaCost":"{2}{G}","text":"Defender (This creature can't attack.)\nWhenever Hornet Nest is dealt damage, put that many 1/1 green Insect creature tokens with flying and deathtouch onto the battlefield. (Any amount of damage a creature with deathtouch deals to a creature is enough to destroy it.)","number":"177","imageName":"hornet nest"},{"layout":"normal","type":"Creature — Insect","types":["Creature"],"colors":["Green"],"multiverseid":383268,"name":"Hornet Queen","subtypes":["Insect"],"cmc":7,"rarity":"Rare","artist":"Martina Pilcerova","power":"2","toughness":"2","manaCost":"{4}{G}{G}{G}","text":"Flying\nDeathtouch (Any amount of damage this deals to a creature is enough to destroy it.)\nWhen Hornet Queen enters the battlefield, put four 1/1 green Insect creature tokens with flying and deathtouch onto the battlefield.","number":"178","imageName":"hornet queen"},{"layout":"normal","type":"Artifact — Equipment","types":["Artifact"],"multiverseid":383269,"name":"Hot Soup","subtypes":["Equipment"],"cmc":1,"rarity":"Uncommon","artist":"David Palumbo","manaCost":"{1}","text":"Equipped creature can't be blocked.\nWhenever equipped creature is dealt damage, destroy it.\nEquip {3} ({3}: Attach to target creature you control. Equip only as a sorcery.)","flavor":"\"Comin' through!\"\nDesigned by James Ernest","number":"219","imageName":"hot soup"},{"layout":"normal","type":"Sorcery","types":["Sorcery"],"colors":["Green"],"multiverseid":383270,"name":"Hunt the Weak","cmc":4,"rarity":"Common","artist":"Raoul Vitale","manaCost":"{3}{G}","text":"Put a +1/+1 counter on target creature you control. Then that creature fights target creature you don't control. (Each deals damage equal to its power to the other.)","flavor":"He who hesitates is lunch.","number":"179","imageName":"hunt the weak"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["Green"],"multiverseid":383271,"name":"Hunter's Ambush","cmc":3,"rarity":"Common","artist":"David Palumbo","manaCost":"{2}{G}","text":"Prevent all combat damage that would be dealt by nongreen creatures this turn.","flavor":"First you lose your enemy's trail. Then you lose all sense of direction. Then you hear the growls . . .","number":"180","imageName":"hunter's ambush"},{"layout":"normal","type":"Creature — Hippogriff","types":["Creature"],"colors":["White"],"multiverseid":383272,"name":"Hushwing Gryff","subtypes":["Hippogriff"],"cmc":3,"rarity":"Rare","artist":"John Severin Brassell","power":"2","toughness":"1","manaCost":"{2}{W}","text":"Flash (You may cast this spell any time you could cast an instant.)\nFlying\nCreatures entering the battlefield don't cause abilities to trigger.","flavor":"An overwhelming sense of calm accompanies the gryffs that wheel above the roofs of Gavony.","number":"15","imageName":"hushwing gryff"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["Blue"],"multiverseid":383273,"name":"Hydrosurge","cmc":1,"rarity":"Common","artist":"Steve Prescott","manaCost":"{U}","text":"Target creature gets -5/-0 until end of turn.","flavor":"\"Thirsty?\"\n—Drunvalus, hydromancer","number":"58","imageName":"hydrosurge"},{"layout":"normal","type":"Creature — Angel Illusion","types":["Creature"],"colors":["Blue"],"multiverseid":383274,"name":"Illusory Angel","subtypes":["Angel","Illusion"],"cmc":3,"rarity":"Uncommon","artist":"Allen Williams","power":"4","toughness":"4","manaCost":"{2}{U}","text":"Flying\nCast Illusory Angel only if you've cast another spell this turn.","flavor":"\"In a daze, I woke and looked upon the battlefield, where I could swear my dreams were laying waste to the enemy.\"\n—Letter from a soldier","number":"59","imageName":"illusory angel"},{"layout":"normal","type":"Sorcery","types":["Sorcery"],"colors":["Black"],"multiverseid":383275,"name":"In Garruk's Wake","cmc":9,"rarity":"Rare","artist":"Chase Stone","manaCost":"{7}{B}{B}","text":"Destroy all creatures you don't control and all planeswalkers you don't control.","flavor":"Beyond pain, beyond obsession and wild despair, there lies a place of twisted power only the most tormented souls can reach.","number":"100","imageName":"in garruk's wake"},{"layout":"normal","type":"Creature — Demon","types":["Creature"],"colors":["Black"],"multiverseid":383276,"name":"Indulgent Tormentor","subtypes":["Demon"],"cmc":5,"rarity":"Rare","artist":"Wesley Burt","power":"5","toughness":"3","manaCost":"{3}{B}{B}","text":"Flying\nAt the beginning of your upkeep, draw a card unless target opponent sacrifices a creature or pays 3 life.","flavor":"The promise of anguish is payment enough for services rendered.","number":"101","imageName":"indulgent tormentor"},{"layout":"normal","type":"Enchantment — Aura","types":["Enchantment"],"colors":["Red"],"multiverseid":383277,"name":"Inferno Fist","subtypes":["Aura"],"cmc":2,"rarity":"Common","artist":"James Ryman","manaCost":"{1}{R}","text":"Enchant creature you control\nEnchanted creature gets +2/+0.\n{R}, Sacrifice Inferno Fist: Inferno Fist deals 2 damage to target creature or player.","flavor":"\"I've never been above throwing the first punch.\"","number":"150","imageName":"inferno fist"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["White"],"multiverseid":383166,"name":"Inspired Charge","cmc":4,"rarity":"Common","artist":"Wayne Reynolds","manaCost":"{2}{W}{W}","text":"Creatures you control get +2/+1 until end of turn.","flavor":"\"Impossible! How could they overwhelm us? We had barricades, war elephants, . . . and they were barely a tenth of our number!\"\n—General Avitora","number":"272","imageName":"inspired charge","starter":true},{"layout":"normal","type":"Sorcery","types":["Sorcery"],"colors":["Blue"],"multiverseid":383278,"name":"Into the Void","cmc":4,"rarity":"Uncommon","artist":"Daarken","manaCost":"{3}{U}","text":"Return up to two target creatures to their owners' hands.","flavor":"\"The cathars have their swords, the inquisitors their axes. I prefer the ‘diplomatic' approach.\"\n—Terhold, archmage of Drunau","number":"60","imageName":"into the void"},{"layout":"normal","type":"Creature — Insect","types":["Creature"],"colors":["Green"],"multiverseid":383279,"name":"Invasive Species","subtypes":["Insect"],"cmc":3,"rarity":"Common","artist":"Christopher Moeller","power":"3","toughness":"3","manaCost":"{2}{G}","text":"When Invasive Species enters the battlefield, return another permanent you control to its owner's hand.","flavor":"It's easier to relocate a village that lies in their path than to turn the bugs aside.","number":"181","imageName":"invasive species"},{"layout":"normal","type":"Enchantment — Aura","types":["Enchantment"],"colors":["Blue"],"multiverseid":383280,"name":"Invisibility","subtypes":["Aura"],"cmc":2,"rarity":"Common","artist":"Pete Venters","manaCost":"{U}{U}","text":"Enchant creature\nEnchanted creature can't be blocked except by Walls.","flavor":"Verick held his breath. Breathing wouldn't reveal his position, but it would force him to smell the goblins.","number":"61","imageName":"invisibility"},{"layout":"normal","supertypes":["Basic"],"type":"Basic Land — Island","types":["Land"],"multiverseid":383284,"name":"Island","subtypes":["Island"],"rarity":"Basic Land","artist":"Cliff Childs","number":"254","variations":[383281,383282,383283],"imageName":"island1"},{"layout":"normal","supertypes":["Basic"],"type":"Basic Land — Island","types":["Land"],"multiverseid":383281,"name":"Island","subtypes":["Island"],"rarity":"Basic Land","artist":"Florian de Gesincourt","number":"255","variations":[383282,383283,383284],"imageName":"island2"},{"layout":"normal","supertypes":["Basic"],"type":"Basic Land — Island","types":["Land"],"multiverseid":383283,"name":"Island","subtypes":["Island"],"rarity":"Basic Land","artist":"Peter Mohrbacher","number":"256","variations":[383281,383282,383284],"imageName":"island3"},{"layout":"normal","supertypes":["Basic"],"type":"Basic Land — Island","types":["Land"],"multiverseid":383282,"name":"Island","subtypes":["Island"],"rarity":"Basic Land","artist":"Andreas Rocha","number":"257","variations":[383281,383283,383284],"imageName":"island4"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["Blue"],"multiverseid":383286,"name":"Jace's Ingenuity","cmc":5,"rarity":"Uncommon","artist":"Igor Kieryluk","manaCost":"{3}{U}{U}","text":"Draw three cards.","flavor":"\"Brute force can sometimes kick down a locked door, but knowledge is a skeleton key.\"","number":"63","imageName":"jace's ingenuity"},{"layout":"normal","type":"Planeswalker — Jace","types":["Planeswalker"],"colors":["Blue"],"multiverseid":383285,"name":"Jace, the Living Guildpact","subtypes":["Jace"],"cmc":4,"rarity":"Mythic Rare","artist":"Chase Stone","loyalty":5,"manaCost":"{2}{U}{U}","text":"+1: Look at the top two cards of your library. Put one of them into your graveyard.\n−3: Return another target nonland permanent to its owner's hand.\n−8: Each player shuffles his or her hand and graveyard into his or her library. You draw seven cards.","number":"62","imageName":"jace, the living guildpact"},{"layout":"normal","supertypes":["Legendary"],"type":"Legendary Creature — Human Wizard","types":["Creature"],"colors":["Blue"],"multiverseid":383287,"name":"Jalira, Master Polymorphist","subtypes":["Human","Wizard"],"cmc":4,"rarity":"Rare","artist":"Steve Prescott","power":"2","toughness":"2","manaCost":"{3}{U}","text":"{2}{U}, {T}, Sacrifice another creature: Reveal cards from the top of your library until you reveal a nonlegendary creature card. Put that card onto the battlefield and the rest on the bottom of your library in a random order.","flavor":"\"You can become anything if I just put my mind to it.\"","number":"64","imageName":"jalira, master polymorphist"},{"layout":"normal","type":"Creature — Leech","types":["Creature"],"colors":["Blue"],"multiverseid":383288,"name":"Jorubai Murk Lurker","subtypes":["Leech"],"cmc":3,"rarity":"Uncommon","artist":"Clint Cearley","power":"1","toughness":"3","manaCost":"{2}{U}","text":"Jorubai Murk Lurker gets +1/+1 as long as you control a Swamp.\n{1}{B}: Target creature gains lifelink until end of turn. (Damage dealt by the creature also causes its controller to gain that much life.)","number":"65","imageName":"jorubai murk lurker"},{"layout":"normal","type":"Artifact Creature — Juggernaut","types":["Artifact","Creature"],"multiverseid":383289,"name":"Juggernaut","subtypes":["Juggernaut"],"cmc":4,"rarity":"Uncommon","artist":"Kev Walker","power":"5","toughness":"3","manaCost":"{4}","text":"Juggernaut attacks each turn if able.\nJuggernaut can't be blocked by Walls.","flavor":"Many a besieged city has surrendered upon hearing the distinctive rumble of the juggernaut.","number":"220","imageName":"juggernaut"},{"layout":"normal","type":"Creature — Treefolk Warrior","types":["Creature"],"colors":["Green"],"multiverseid":383290,"name":"Kalonian Twingrove","subtypes":["Treefolk","Warrior"],"cmc":6,"rarity":"Rare","artist":"Todd Lockwood","power":"*","toughness":"*","manaCost":"{5}{G}","text":"Kalonian Twingrove's power and toughness are each equal to the number of Forests you control.\nWhen Kalonian Twingrove enters the battlefield, put a green Treefolk Warrior creature token onto the battlefield with \"This creature's power and toughness are each equal to the number of Forests you control.\"","number":"182","imageName":"kalonian twingrove"},{"layout":"normal","type":"Creature — Fish","types":["Creature"],"colors":["Blue"],"multiverseid":383291,"name":"Kapsho Kitefins","subtypes":["Fish"],"cmc":6,"rarity":"Uncommon","artist":"Ryan Yee","power":"3","toughness":"3","manaCost":"{4}{U}{U}","text":"Flying\nWhenever Kapsho Kitefins or another creature enters the battlefield under your control, tap target creature an opponent controls.","flavor":"\"It's a truly disconcerting sight to see their shadows cast upon the deck.\"\n—Captain Triff","number":"66","imageName":"kapsho kitefins"},{"layout":"normal","type":"Creature — Kithkin Soldier","types":["Creature"],"colors":["White"],"multiverseid":383292,"name":"Kinsbaile Skirmisher","subtypes":["Kithkin","Soldier"],"cmc":2,"rarity":"Common","artist":"Thomas Denmark","power":"2","toughness":"2","manaCost":"{1}{W}","text":"When Kinsbaile Skirmisher enters the battlefield, target creature gets +1/+1 until end of turn.","flavor":"\"If a boggart even dares breathe near one of my kin, I'll know. And I'll not be happy.\"","number":"16","imageName":"kinsbaile skirmisher"},{"layout":"normal","type":"Creature — Ape","types":["Creature"],"colors":["Red"],"multiverseid":383293,"name":"Kird Chieftain","subtypes":["Ape"],"cmc":4,"rarity":"Uncommon","artist":"Lars Grant-West","power":"3","toughness":"3","manaCost":"{3}{R}","text":"Kird Chieftain gets +1/+1 as long as you control a Forest.\n{4}{G}: Target creature gets +2/+2 and gains trample until end of turn. (If it would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.)","number":"151","imageName":"kird chieftain"},{"layout":"normal","type":"Creature — Goblin Warrior","types":["Creature"],"colors":["Red"],"multiverseid":383294,"name":"Krenko's Enforcer","subtypes":["Goblin","Warrior"],"cmc":3,"rarity":"Common","artist":"Karl Kopinski","power":"2","toughness":"2","manaCost":"{1}{R}{R}","text":"Intimidate (This creature can't be blocked except by artifact creatures and/or creatures that share a color with it.)","flavor":"He just likes to break legs. Collecting the debt is a bonus.","number":"152","imageName":"krenko's enforcer"},{"layout":"normal","supertypes":["Legendary"],"type":"Legendary Creature — Ogre Spirit","types":["Creature"],"colors":["Red"],"multiverseid":383295,"name":"Kurkesh, Onakke Ancient","subtypes":["Ogre","Spirit"],"cmc":4,"rarity":"Rare","artist":"Slawomir Maniak","power":"4","toughness":"3","manaCost":"{2}{R}{R}","text":"Whenever you activate an ability of an artifact, if it isn't a mana ability, you may pay {R}. If you do, copy that ability. You may choose new targets for the copy.","flavor":"The Onakke were masters of dark arts and artifice. Their creations continue to spread foul magic, paving the way for their return.","number":"153","imageName":"kurkesh, onakke ancient"},{"layout":"normal","type":"Sorcery","types":["Sorcery"],"colors":["Red"],"multiverseid":383296,"name":"Lava Axe","cmc":5,"rarity":"Common","artist":"Brian Snõddy","manaCost":"{4}{R}","text":"Lava Axe deals 5 damage to target player.","flavor":"A strict upgrade over the cinder hatchet.","number":"154","imageName":"lava axe"},{"layout":"normal","type":"Creature — Sliver","types":["Creature"],"colors":["Black"],"multiverseid":383297,"name":"Leeching Sliver","subtypes":["Sliver"],"cmc":2,"rarity":"Uncommon","artist":"Svetlin Velinov","power":"1","toughness":"1","manaCost":"{1}{B}","text":"Whenever a Sliver you control attacks, defending player loses 1 life.","flavor":"\"Seeing one slowly devour one of my party begged the question—do they know what cruelty is?\"\n—Hastric, Thunian scout","number":"102","imageName":"leeching sliver"},{"layout":"normal","type":"Sorcery","types":["Sorcery"],"colors":["Green"],"multiverseid":383298,"name":"Life's Legacy","cmc":2,"rarity":"Rare","artist":"Howard Lyon","manaCost":"{1}{G}","text":"As an additional cost to cast Life's Legacy, sacrifice a creature.\nDraw cards equal to the sacrificed creature's power.","flavor":"At the instant of death, the mystery of life.","number":"183","imageName":"life's legacy"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["Red"],"multiverseid":383299,"name":"Lightning Strike","cmc":2,"rarity":"Common","artist":"Adam Paquette","manaCost":"{1}{R}","text":"Lightning Strike deals 3 damage to target creature or player.","flavor":"To wield lightning is to tame chaos.","number":"155","imageName":"lightning strike"},{"layout":"normal","type":"Planeswalker — Liliana","types":["Planeswalker"],"colors":["Black"],"multiverseid":383300,"name":"Liliana Vess","subtypes":["Liliana"],"cmc":5,"rarity":"Mythic Rare","artist":"Aleksi Briclot","loyalty":5,"manaCost":"{3}{B}{B}","text":"+1: Target player discards a card.\n−2: Search your library for a card, then shuffle your library and put that card on top of it.\n−8: Put all creature cards from all graveyards onto the battlefield under your control.","number":"103","imageName":"liliana vess"},{"layout":"normal","type":"Creature — Plant Elemental","types":["Creature"],"colors":["Green"],"multiverseid":383301,"name":"Living Totem","subtypes":["Plant","Elemental"],"cmc":4,"rarity":"Common","artist":"Svetlin Velinov","power":"2","toughness":"3","manaCost":"{3}{G}","text":"Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nWhen Living Totem enters the battlefield, you may put a +1/+1 counter on another target creature.","number":"184","imageName":"living totem"},{"layout":"normal","type":"Land","types":["Land"],"multiverseid":383302,"name":"Llanowar Wastes","rarity":"Rare","artist":"Rob Alexander","text":"{T}: Add {1} to your mana pool.\n{T}: Add {B} or {G} to your mana pool. Llanowar Wastes deals 1 damage to you.","number":"244","imageName":"llanowar wastes"},{"layout":"normal","type":"Creature — Djinn","types":["Creature"],"colors":["Blue"],"multiverseid":383167,"name":"Mahamoti Djinn","subtypes":["Djinn"],"cmc":6,"rarity":"Rare","artist":"Greg Staples","power":"5","toughness":"6","manaCost":"{4}{U}{U}","text":"Flying (This creature can't be blocked except by creatures with flying or reach.)","flavor":"Of royal blood among the spirits of the air, the Mahamoti djinn rides on the wings of the winds. As dangerous in the gambling hall as he is in battle, he is a master of trickery and misdirection.","number":"275","imageName":"mahamoti djinn","starter":true},{"layout":"normal","type":"Enchantment — Aura","types":["Enchantment"],"colors":["White"],"multiverseid":383303,"name":"Marked by Honor","subtypes":["Aura"],"cmc":4,"rarity":"Common","artist":"David Palumbo","manaCost":"{3}{W}","text":"Enchant creature\nEnchanted creature gets +2/+2 and has vigilance. (Attacking doesn't cause it to tap.)","flavor":"Stand your post for duty. Stand your ground for honor.","number":"17","imageName":"marked by honor"},{"layout":"normal","type":"Sorcery","types":["Sorcery"],"colors":["White"],"multiverseid":383304,"name":"Mass Calcify","cmc":7,"rarity":"Rare","artist":"Brandon Kitkouski","manaCost":"{5}{W}{W}","text":"Destroy all nonwhite creatures.","flavor":"The dead serve as their own tombstones.","number":"18","imageName":"mass calcify"},{"layout":"normal","type":"Creature — Sphinx","types":["Creature"],"colors":["Blue"],"multiverseid":383305,"name":"Master of Predicaments","subtypes":["Sphinx"],"cmc":5,"rarity":"Rare","artist":"Matt Stewart","power":"4","toughness":"4","manaCost":"{3}{U}{U}","text":"Flying\nWhenever Master of Predicaments deals combat damage to a player, choose a card in your hand. That player guesses whether the card's converted mana cost is greater than 4. If the player guessed wrong, you may cast the card without paying its mana cost.","flavor":"Designed by David Sirlin","number":"67","imageName":"master of predicaments"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["White"],"multiverseid":383306,"name":"Meditation Puzzle","cmc":5,"rarity":"Common","artist":"Mark Winters","manaCost":"{3}{W}{W}","text":"Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nYou gain 8 life.","flavor":"Find your center, and you will find your way.","number":"19","imageName":"meditation puzzle"},{"layout":"normal","type":"Creature — Shapeshifter","types":["Creature"],"colors":["Blue"],"multiverseid":383307,"name":"Mercurial Pretender","subtypes":["Shapeshifter"],"cmc":5,"rarity":"Rare","artist":"Izzy","power":"0","toughness":"0","manaCost":"{4}{U}","text":"You may have Mercurial Pretender enter the battlefield as a copy of any creature you control except it gains \"{2}{U}{U}: Return this creature to its owner's hand.\"","flavor":"The king went off to find himself. Imagine his terror when he succeeded.","number":"68","imageName":"mercurial pretender"},{"layout":"normal","type":"Artifact","types":["Artifact"],"multiverseid":383308,"name":"Meteorite","cmc":5,"rarity":"Uncommon","artist":"Scott Murphy","manaCost":"{5}","text":"When Meteorite enters the battlefield, it deals 2 damage to target creature or player.\n{T}: Add one mana of any color to your mana pool.","flavor":"\"And if I'm lying,\" he began . . .","number":"221","imageName":"meteorite"},{"layout":"normal","type":"Creature — Human Soldier","types":["Creature"],"colors":["White"],"multiverseid":383309,"name":"Midnight Guard","subtypes":["Human","Soldier"],"cmc":3,"rarity":"Common","artist":"Jason A. Engle","power":"2","toughness":"3","manaCost":"{2}{W}","text":"Whenever another creature enters the battlefield, untap Midnight Guard.","flavor":"\"When you're on watch, no noise is harmless and no shadow can be ignored.\"\n—Olgard of the Skiltfolk","number":"20","imageName":"midnight guard"},{"layout":"normal","type":"Enchantment","types":["Enchantment"],"colors":["Red"],"multiverseid":383310,"name":"Might Makes Right","cmc":6,"rarity":"Uncommon","artist":"Mark Winters","manaCost":"{5}{R}","text":"At the beginning of combat on your turn, if you control each creature on the battlefield with the greatest power, gain control of target creature an opponent controls until end of turn. Untap that creature. It gains haste until end of turn. (It can attack and {T} this turn.)","flavor":"An oath of fealty sworn with a handshake.","number":"156","imageName":"might makes right"},{"layout":"normal","type":"Enchantment","types":["Enchantment"],"colors":["Blue"],"multiverseid":383311,"name":"Military Intelligence","cmc":2,"rarity":"Uncommon","artist":"Craig J Spearing","manaCost":"{1}{U}","text":"Whenever you attack with two or more creatures, draw a card.","flavor":"To know the battlefield is to anticipate the enemy. To know the enemy is to anticipate victory.","number":"69","imageName":"military intelligence"},{"layout":"normal","type":"Sorcery","types":["Sorcery"],"colors":["Black"],"multiverseid":383312,"name":"Mind Rot","cmc":3,"rarity":"Common","artist":"Steve Luke","manaCost":"{2}{B}","text":"Target player discards two cards.","flavor":"\"It saddens me to lose a source of inspiration. This one seemed especially promising.\"\n—Ashiok","number":"104","imageName":"mind rot"},{"layout":"normal","type":"Sorcery","types":["Sorcery"],"colors":["Blue"],"multiverseid":383313,"name":"Mind Sculpt","cmc":2,"rarity":"Common","artist":"Michael C. Hayes","manaCost":"{1}{U}","text":"Target opponent puts the top seven cards of his or her library into his or her graveyard.","flavor":"\"Your mind was a curious mix of madness and genius. I just took away the genius.\"\n—Jace Beleren","number":"70","imageName":"mind sculpt"},{"layout":"normal","type":"Creature — Elemental","types":["Creature"],"colors":["Red"],"multiverseid":383314,"name":"Miner's Bane","subtypes":["Elemental"],"cmc":6,"rarity":"Common","artist":"Adam Paquette","power":"6","toughness":"3","manaCost":"{4}{R}{R}","text":"{2}{R}: Miner's Bane gets +1/+0 and gains trample until end of turn. (If it would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.)","flavor":"There are certain stones even dwarves know to leave in the earth.","number":"157","imageName":"miner's bane"},{"layout":"normal","supertypes":["Basic"],"type":"Basic Land — Mountain","types":["Land"],"multiverseid":383315,"name":"Mountain","subtypes":["Mountain"],"rarity":"Basic Land","artist":"Cliff Childs","number":"262","variations":[383316,383317,383318],"imageName":"mountain1"},{"layout":"normal","supertypes":["Basic"],"type":"Basic Land — Mountain","types":["Land"],"multiverseid":383317,"name":"Mountain","subtypes":["Mountain"],"rarity":"Basic Land","artist":"Florian de Gesincourt","number":"263","variations":[383315,383316,383318],"imageName":"mountain2"},{"layout":"normal","supertypes":["Basic"],"type":"Basic Land — Mountain","types":["Land"],"multiverseid":383318,"name":"Mountain","subtypes":["Mountain"],"rarity":"Basic Land","artist":"Nils Hamm","number":"264","variations":[383315,383316,383317],"imageName":"mountain3"},{"layout":"normal","supertypes":["Basic"],"type":"Basic Land — Mountain","types":["Land"],"multiverseid":383316,"name":"Mountain","subtypes":["Mountain"],"rarity":"Basic Land","artist":"Karl Kopinski","number":"265","variations":[383315,383317,383318],"imageName":"mountain4"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["Green"],"multiverseid":383319,"name":"Naturalize","cmc":2,"rarity":"Common","artist":"Tim Hildebrandt","manaCost":"{1}{G}","text":"Destroy target artifact or enchantment.","flavor":"\"When your cities and trinkets crumble, only nature will remain.\"\n—Garruk Wildspeaker","number":"185","imageName":"naturalize"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["Black"],"multiverseid":383320,"name":"Necrobite","cmc":3,"rarity":"Common","artist":"Nils Hamm","manaCost":"{2}{B}","text":"Target creature gains deathtouch until end of turn. Regenerate it. (The next time that creature would be destroyed this turn, it isn't. Instead tap it, remove all damage from it, and remove it from combat. Any amount of damage a creature with deathtouch deals to a creature is enough to destroy it.)","number":"105","imageName":"necrobite"},{"layout":"normal","type":"Creature — Horror","types":["Creature"],"colors":["Black"],"multiverseid":383321,"name":"Necrogen Scudder","subtypes":["Horror"],"cmc":3,"rarity":"Uncommon","artist":"Raymond Swanland","power":"3","toughness":"3","manaCost":"{2}{B}","text":"Flying\nWhen Necrogen Scudder enters the battlefield, you lose 3 life.","flavor":"Contrary to popular belief, it's kept aloft by necrogen gas, not the screaming agony of a thousand murdered souls.","number":"106","imageName":"necrogen scudder"},{"layout":"normal","type":"Creature — Zombie","types":["Creature"],"colors":["Black"],"multiverseid":383322,"name":"Necromancer's Assistant","subtypes":["Zombie"],"cmc":3,"rarity":"Common","artist":"Svetlin Velinov","power":"3","toughness":"1","manaCost":"{2}{B}","text":"When Necromancer's Assistant enters the battlefield, put the top three cards of your library into your graveyard.","flavor":"Zombies and necromancers agree: easy access to brains is preferred.","number":"107","imageName":"necromancer's assistant"},{"layout":"normal","type":"Enchantment","types":["Enchantment"],"colors":["Black"],"multiverseid":383323,"name":"Necromancer's Stockpile","cmc":2,"rarity":"Rare","artist":"Seb McKinnon","manaCost":"{1}{B}","text":"{1}{B}, Discard a creature card: Draw a card. If the discarded card was a Zombie card, put a 2/2 black Zombie creature token onto the battlefield tapped.","flavor":"The experiments decided to perform some research of their own.","number":"108","imageName":"necromancer's stockpile"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["Blue"],"multiverseid":383324,"name":"Negate","cmc":2,"rarity":"Common","artist":"Jeremy Jarvis","manaCost":"{1}{U}","text":"Counter target noncreature spell.","flavor":"Masters of the arcane savor a delicious irony. Their study of deep and complex arcana leads to such a simple end: the ability to say merely yes or no.","number":"71","imageName":"negate"},{"layout":"normal","type":"Creature — Spider","types":["Creature"],"colors":["Green"],"multiverseid":383325,"name":"Netcaster Spider","subtypes":["Spider"],"cmc":3,"rarity":"Common","artist":"Yohann Schepacz","power":"2","toughness":"3","manaCost":"{2}{G}","text":"Reach (This creature can block creatures with flying.)\nWhenever Netcaster Spider blocks a creature with flying, Netcaster Spider gets +2/+0 until end of turn.","flavor":"It is an expert at culling individuals who stray too far from the herd.","number":"186","imageName":"netcaster spider"},{"layout":"normal","type":"Creature — Zombie Giant","types":["Creature"],"colors":["Black"],"multiverseid":383326,"name":"Nightfire Giant","subtypes":["Zombie","Giant"],"cmc":5,"rarity":"Uncommon","artist":"Dave Kendall","power":"4","toughness":"3","manaCost":"{4}{B}","text":"Nightfire Giant gets +1/+1 as long as you control a Mountain.\n{4}{R}: Nightfire Giant deals 2 damage to target creature or player.","flavor":"Nightfire turns the greatest weakness of the undead into formidable strength.","number":"109","imageName":"nightfire giant"},{"layout":"normal","type":"Creature — Nightmare Horse","types":["Creature"],"colors":["Black"],"multiverseid":383168,"name":"Nightmare","subtypes":["Nightmare","Horse"],"cmc":6,"rarity":"Rare","artist":"Vance Kovacs","power":"*","toughness":"*","manaCost":"{5}{B}","text":"Flying (This creature can't be blocked except by creatures with flying or reach.)\nNightmare's power and toughness are each equal to the number of Swamps you control.","flavor":"The thunder of its hooves beats dreams into despair.","number":"276","imageName":"nightmare","starter":true},{"layout":"normal","type":"Creature — Elemental","types":["Creature"],"colors":["Blue"],"multiverseid":383327,"name":"Nimbus of the Isles","subtypes":["Elemental"],"cmc":5,"rarity":"Common","artist":"Cliff Childs","power":"3","toughness":"3","manaCost":"{4}{U}","text":"Flying (This creature can't be blocked except by creatures with flying or reach.)","flavor":"The people of the Sevick Isles have a unique understanding of the term \"ominous clouds.\"","number":"72","imageName":"nimbus of the isles"},{"layout":"normal","type":"Sorcery","types":["Sorcery"],"colors":["Green"],"multiverseid":383329,"name":"Nissa's Expedition","cmc":5,"rarity":"Uncommon","artist":"Dan Scott","manaCost":"{4}{G}","text":"Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nSearch your library for up to two basic land cards, put them onto the battlefield tapped, then shuffle your library.","number":"188","imageName":"nissa's expedition"},{"layout":"normal","type":"Planeswalker — Nissa","types":["Planeswalker"],"colors":["Green"],"multiverseid":383328,"name":"Nissa, Worldwaker","subtypes":["Nissa"],"cmc":5,"rarity":"Mythic Rare","artist":"Peter Mohrbacher","loyalty":3,"manaCost":"{3}{G}{G}","text":"+1: Target land you control becomes a 4/4 Elemental creature with trample. It's still a land.\n+1: Untap up to four target Forests.\n−7: Search your library for any number of basic land cards, put them onto the battlefield, then shuffle your library. Those lands become 4/4 Elemental creatures with trample. They're still lands.","number":"187","imageName":"nissa, worldwaker"},{"layout":"normal","supertypes":["Legendary"],"type":"Legendary Creature — Demon","types":["Creature"],"colors":["Black"],"multiverseid":383330,"name":"Ob Nixilis, Unshackled","subtypes":["Demon"],"cmc":6,"rarity":"Rare","artist":"Karl Kopinski","power":"4","toughness":"4","manaCost":"{4}{B}{B}","text":"Flying, trample\nWhenever an opponent searches his or her library, that player sacrifices a creature and loses 10 life.\nWhenever another creature dies, put a +1/+1 counter on Ob Nixilis, Unshackled.","flavor":"Designed by Brad Muir","number":"110","imageName":"ob nixilis, unshackled"},{"layout":"normal","type":"Artifact","types":["Artifact"],"multiverseid":383331,"name":"Obelisk of Urd","cmc":6,"rarity":"Rare","artist":"John Severin Brassell","manaCost":"{6}","text":"Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nAs Obelisk of Urd enters the battlefield, choose a creature type.\nCreatures you control of the chosen type get +2/+2.","number":"222","imageName":"obelisk of urd"},{"layout":"normal","type":"Enchantment — Aura","types":["Enchantment"],"colors":["White"],"multiverseid":383332,"name":"Oppressive Rays","subtypes":["Aura"],"cmc":1,"rarity":"Common","artist":"Mark Zug","manaCost":"{W}","text":"Enchant creature\nEnchanted creature can't attack or block unless its controller pays {3}.\nActivated abilities of enchanted creature cost {3} more to activate.","number":"21","imageName":"oppressive rays"},{"layout":"normal","type":"Creature — Cat Warrior","types":["Creature"],"colors":["White"],"multiverseid":383333,"name":"Oreskos Swiftclaw","subtypes":["Cat","Warrior"],"cmc":2,"rarity":"Common","artist":"James Ryman","power":"3","toughness":"1","manaCost":"{1}{W}","flavor":"After the Battle of Pharagax Bridge, the Champion spent many months among the leonin of Oreskos. She found that they were quick to take offense, not because they were thin-skinned, but because they were always eager for a fight.\n—The Theriad","number":"22","imageName":"oreskos swiftclaw"},{"layout":"normal","type":"Artifact Creature — Thopter","types":["Artifact","Creature"],"multiverseid":383334,"name":"Ornithopter","subtypes":["Thopter"],"cmc":0,"rarity":"Common","artist":"Franz Vohwinkel","power":"0","toughness":"2","manaCost":"{0}","text":"Flying (This creature can't be blocked except by creatures with flying or reach.)","flavor":"Once a year, the skies over Paliano fill with the flying machines of those who hope to be taken on as pupils by the artificer Muzzio.","number":"223","imageName":"ornithopter"},{"layout":"normal","type":"Sorcery","types":["Sorcery"],"colors":["Green"],"multiverseid":383335,"name":"Overwhelm","cmc":7,"rarity":"Uncommon","artist":"Wayne Reynolds","manaCost":"{5}{G}{G}","text":"Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nCreatures you control get +3/+3 until end of turn.","flavor":"The Conclave acts with a single will, expressed by countless warriors.","number":"189","imageName":"overwhelm"},{"layout":"normal","type":"Creature — Human Druid","types":["Creature"],"colors":["Green"],"multiverseid":383336,"name":"Paragon of Eternal Wilds","subtypes":["Human","Druid"],"cmc":4,"rarity":"Uncommon","artist":"Winona Nelson","power":"2","toughness":"2","manaCost":"{3}{G}","text":"Other green creatures you control get +1/+1.\n{G}, {T}: Another target green creature you control gains trample until end of turn. (If it would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.)","number":"190","imageName":"paragon of eternal wilds"},{"layout":"normal","type":"Creature — Human Warrior","types":["Creature"],"colors":["Red"],"multiverseid":383337,"name":"Paragon of Fierce Defiance","subtypes":["Human","Warrior"],"cmc":4,"rarity":"Uncommon","artist":"Slawomir Maniak","power":"2","toughness":"2","manaCost":"{3}{R}","text":"Other red creatures you control get +1/+1.\n{R}, {T}: Another target red creature you control gains haste until end of turn. (It can attack and {T} this turn.)","number":"158","imageName":"paragon of fierce defiance"},{"layout":"normal","type":"Creature — Human Wizard","types":["Creature"],"colors":["Blue"],"multiverseid":383338,"name":"Paragon of Gathering Mists","subtypes":["Human","Wizard"],"cmc":4,"rarity":"Uncommon","artist":"Michael C. Hayes","power":"2","toughness":"2","manaCost":"{3}{U}","text":"Other blue creatures you control get +1/+1.\n{U}, {T}: Another target blue creature you control gains flying until end of turn.","number":"73","imageName":"paragon of gathering mists"},{"layout":"normal","type":"Creature — Human Soldier","types":["Creature"],"colors":["White"],"multiverseid":383339,"name":"Paragon of New Dawns","subtypes":["Human","Soldier"],"cmc":4,"rarity":"Uncommon","artist":"John Stanko","power":"2","toughness":"2","manaCost":"{3}{W}","text":"Other white creatures you control get +1/+1.\n{W}, {T}: Another target white creature you control gains vigilance until end of turn. (Attacking doesn't cause it to tap.)","number":"23","imageName":"paragon of new dawns"},{"layout":"normal","type":"Creature — Skeleton Warrior","types":["Creature"],"colors":["Black"],"multiverseid":383340,"name":"Paragon of Open Graves","subtypes":["Skeleton","Warrior"],"cmc":4,"rarity":"Uncommon","artist":"Min Yum","power":"2","toughness":"2","manaCost":"{3}{B}","text":"Other black creatures you control get +1/+1.\n{2}{B}, {T}: Another target black creature you control gains deathtouch until end of turn. (Any amount of damage it deals to a creature is enough to destroy it.)","number":"111","imageName":"paragon of open graves"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["Blue"],"multiverseid":383341,"name":"Peel from Reality","cmc":2,"rarity":"Common","artist":"Jason Felix","manaCost":"{1}{U}","text":"Return target creature you control and target creature you don't control to their owners' hands.","flavor":"\"Soulless demon, you are bound to me. Now we will both dwell in oblivion.\"","number":"74","imageName":"peel from reality"},{"layout":"normal","type":"Artifact","types":["Artifact"],"multiverseid":383342,"name":"Perilous Vault","cmc":4,"rarity":"Mythic Rare","artist":"Sam Burley","manaCost":"{4}","text":"{5}, {T}, Exile Perilous Vault: Exile all nonland permanents.","flavor":"The spirit dragon Ugin arranged the hedrons of Zendikar to direct leylines of energy. To disrupt one is to unleash devastation and chaos.","number":"224","imageName":"perilous vault"},{"layout":"normal","type":"Artifact Creature — Horror","types":["Artifact","Creature"],"multiverseid":383343,"name":"Phyrexian Revoker","subtypes":["Horror"],"cmc":2,"rarity":"Rare","artist":"Kev Walker","power":"2","toughness":"1","manaCost":"{2}","text":"As Phyrexian Revoker enters the battlefield, name a nonland card.\nActivated abilities of sources with the chosen name can't be activated.","flavor":"\"To be in the presence of a revoker is to be truly alone.\"\n—Kara Vrist, Neurok agent","number":"225","imageName":"phyrexian revoker"},{"layout":"normal","type":"Creature — Plant Elemental","types":["Creature"],"colors":["Green"],"multiverseid":383344,"name":"Phytotitan","subtypes":["Plant","Elemental"],"cmc":6,"rarity":"Rare","artist":"Marco Nelor","power":"7","toughness":"2","manaCost":"{4}{G}{G}","text":"When Phytotitan dies, return it to the battlefield tapped under its owner's control at the beginning of his or her next upkeep.","flavor":"Its root system spans the entire floor of the jungle, making eradication impossible.","number":"191","imageName":"phytotitan"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["White"],"multiverseid":383345,"name":"Pillar of Light","cmc":3,"rarity":"Common","artist":"Erica Yang","manaCost":"{2}{W}","text":"Exile target creature with toughness 4 or greater.","flavor":"\"The vaulted ceiling of our faith rests upon such pillars.\"\n—Darugand, banisher priest","number":"24","imageName":"pillar of light"},{"layout":"normal","supertypes":["Basic"],"type":"Basic Land — Plains","types":["Land"],"multiverseid":383347,"name":"Plains","subtypes":["Plains"],"rarity":"Basic Land","artist":"John Avon","number":"250","variations":[383346,383348,383349],"imageName":"plains1"},{"layout":"normal","supertypes":["Basic"],"type":"Basic Land — Plains","types":["Land"],"multiverseid":383346,"name":"Plains","subtypes":["Plains"],"rarity":"Basic Land","artist":"Nils Hamm","number":"251","variations":[383347,383348,383349],"imageName":"plains2"},{"layout":"normal","supertypes":["Basic"],"type":"Basic Land — Plains","types":["Land"],"multiverseid":383348,"name":"Plains","subtypes":["Plains"],"rarity":"Basic Land","artist":"Howard Lyon","number":"252","variations":[383346,383347,383349],"imageName":"plains3"},{"layout":"normal","supertypes":["Basic"],"type":"Basic Land — Plains","types":["Land"],"multiverseid":383349,"name":"Plains","subtypes":["Plains"],"rarity":"Basic Land","artist":"Andreas Rocha","number":"253","variations":[383346,383347,383348],"imageName":"plains4"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["Green"],"multiverseid":383350,"name":"Plummet","cmc":2,"rarity":"Common","artist":"Pete Venters","manaCost":"{1}{G}","text":"Destroy target creature with flying.","flavor":"\"Let nothing own the skies but the wind.\"\n—Dejara, Giltwood druid","number":"192","imageName":"plummet"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["Blue"],"multiverseid":383351,"name":"Polymorphist's Jest","cmc":3,"rarity":"Rare","artist":"Craig J Spearing","manaCost":"{1}{U}{U}","text":"Until end of turn, each creature target player controls loses all abilities and becomes a blue Frog with base power and toughness 1/1.","flavor":"\"The flies were bothering me.\"\n—Jalira, master polymorphist","number":"75","imageName":"polymorphist's jest"},{"layout":"normal","type":"Creature — Kithkin Soldier","types":["Creature"],"colors":["White"],"multiverseid":383352,"name":"Preeminent Captain","subtypes":["Kithkin","Soldier"],"cmc":3,"rarity":"Rare","artist":"Greg Staples","power":"2","toughness":"2","manaCost":"{2}{W}","text":"First strike (This creature deals combat damage before creatures without first strike.)\nWhenever Preeminent Captain attacks, you may put a Soldier creature card from your hand onto the battlefield tapped and attacking.","number":"25","imageName":"preeminent captain"},{"layout":"normal","type":"Artifact","types":["Artifact"],"multiverseid":383353,"name":"Profane Memento","cmc":1,"rarity":"Uncommon","artist":"Franz Vohwinkel","manaCost":"{1}","text":"Whenever a creature card is put into an opponent's graveyard from anywhere, you gain 1 life.","flavor":"\"An angel's skull is left too plain by death. I made a few aesthetic modifications.\"\n—Dommique, blood artist","number":"226","imageName":"profane memento"},{"layout":"normal","type":"Creature — Faerie Rogue","types":["Creature"],"colors":["Blue"],"multiverseid":383354,"name":"Quickling","subtypes":["Faerie","Rogue"],"cmc":2,"rarity":"Uncommon","artist":"Clint Cearley","power":"2","toughness":"2","manaCost":"{1}{U}","text":"Flash (You may cast this spell any time you could cast an instant.)\nFlying\nWhen Quickling enters the battlefield, sacrifice it unless you return another creature you control to its owner's hand.","number":"76","imageName":"quickling"},{"layout":"normal","type":"Land","types":["Land"],"multiverseid":383355,"name":"Radiant Fountain","rarity":"Common","artist":"Adam Paquette","text":"When Radiant Fountain enters the battlefield, you gain 2 life.\n{T}: Add {1} to your mana pool.","flavor":"\"All peoples treasure a place where the weary traveler may drink in peace.\"\n—Ajani Goldmane","number":"245","imageName":"radiant fountain"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["White"],"multiverseid":383356,"name":"Raise the Alarm","cmc":2,"rarity":"Common","artist":"Zoltan Boros","manaCost":"{1}{W}","text":"Put two 1/1 white Soldier creature tokens onto the battlefield.","flavor":"Like blinking or breathing, responding to an alarm is an involuntary reflex.","number":"26","imageName":"raise the alarm"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["Green"],"multiverseid":383357,"name":"Ranger's Guile","cmc":1,"rarity":"Common","artist":"Steve Prescott","manaCost":"{G}","text":"Target creature you control gets +1/+1 and gains hexproof until end of turn. (It can't be the target of spells or abilities your opponents control.)","flavor":"\"You don't survive in the wild by standing in plain sight.\"\n—Garruk Wildspeaker","number":"193","imageName":"ranger's guile"},{"layout":"normal","type":"Creature — Griffin","types":["Creature"],"colors":["White"],"multiverseid":383358,"name":"Razorfoot Griffin","subtypes":["Griffin"],"cmc":4,"rarity":"Common","artist":"Ben Thompson","power":"2","toughness":"2","manaCost":"{3}{W}","text":"Flying (This creature can't be blocked except by creatures with flying or reach.)\nFirst strike (This creature deals combat damage before creatures without first strike.)","flavor":"Like a meteor, it strikes from above without warning. Unlike a meteor, it then carries you off and eats you.","number":"27","imageName":"razorfoot griffin"},{"layout":"normal","type":"Creature — Elf Shaman","types":["Creature"],"colors":["Green"],"multiverseid":383359,"name":"Reclamation Sage","subtypes":["Elf","Shaman"],"cmc":3,"rarity":"Uncommon","artist":"Christopher Moeller","power":"2","toughness":"1","manaCost":"{2}{G}","text":"When Reclamation Sage enters the battlefield, you may destroy target artifact or enchantment.","flavor":"\"What was once formed by masons, shaped by smiths, or given life by mages, I will return to the embrace of the earth.\"","number":"194","imageName":"reclamation sage"},{"layout":"normal","type":"Creature — Human Wizard","types":["Creature"],"colors":["Blue"],"multiverseid":383360,"name":"Research Assistant","subtypes":["Human","Wizard"],"cmc":2,"rarity":"Common","artist":"Svetlin Velinov","power":"1","toughness":"3","manaCost":"{1}{U}","text":"{3}{U}, {T}: Draw a card, then discard a card.","flavor":"There are many words and phrases that can cause an experienced wizard to tremble in fear. Chief among them is \"oops.\"","number":"77","imageName":"research assistant"},{"layout":"normal","type":"Creature — Angel","types":["Creature"],"colors":["White"],"multiverseid":383361,"name":"Resolute Archangel","subtypes":["Angel"],"cmc":7,"rarity":"Rare","artist":"Anthony Palumbo","power":"4","toughness":"4","manaCost":"{5}{W}{W}","text":"Flying\nWhen Resolute Archangel enters the battlefield, if your life total is less than your starting life total, it becomes equal to your starting life total.","flavor":"Cut it down, bury it in snow, put it to the torch. The rose will still bloom again.","number":"28","imageName":"resolute archangel"},{"layout":"normal","type":"Sorcery","types":["Sorcery"],"colors":["Green"],"multiverseid":383362,"name":"Restock","cmc":5,"rarity":"Uncommon","artist":"Daren Bader","manaCost":"{3}{G}{G}","text":"Return two target cards from your graveyard to your hand. Exile Restock.","flavor":"What looked like a retreat was actually a replenishing.","number":"195","imageName":"restock"},{"layout":"normal","type":"Sorcery","types":["Sorcery"],"colors":["White"],"multiverseid":383363,"name":"Return to the Ranks","cmc":2,"rarity":"Rare","artist":"Michael Komarck","manaCost":"{X}{W}{W}","text":"Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nReturn X target creature cards with converted mana cost 2 or less from your graveyard to the battlefield.","number":"29","imageName":"return to the ranks"},{"layout":"normal","type":"Creature — Beast","types":["Creature"],"colors":["Green"],"multiverseid":383364,"name":"Roaring Primadox","subtypes":["Beast"],"cmc":4,"rarity":"Uncommon","artist":"James Ryman","power":"4","toughness":"4","manaCost":"{3}{G}","text":"At the beginning of your upkeep, return a creature you control to its owner's hand.","flavor":"\"They're easy enough to find. Question is, are you sure you want to find one?\"\n—Juruk, Kalonian tracker","number":"196","imageName":"roaring primadox"},{"layout":"normal","type":"Artifact — Equipment","types":["Artifact"],"multiverseid":383365,"name":"Rogue's Gloves","subtypes":["Equipment"],"cmc":2,"rarity":"Uncommon","artist":"Cyril Van Der Haegen","manaCost":"{2}","text":"Whenever equipped creature deals combat damage to a player, you may draw a card.\nEquip {2} ({2}: Attach to target creature you control. Equip only as a sorcery.)","flavor":"Professional pilferers prefer proper preparation.","number":"227","imageName":"rogue's gloves"},{"layout":"normal","type":"Creature — Insect","types":["Creature"],"colors":["Black"],"multiverseid":383366,"name":"Rotfeaster Maggot","subtypes":["Insect"],"cmc":5,"rarity":"Common","artist":"Yeong-Hao Han","power":"3","toughness":"5","manaCost":"{4}{B}","text":"When Rotfeaster Maggot enters the battlefield, exile target creature card from a graveyard. You gain life equal to that card's toughness.","flavor":"Is it at the top of the food chain or the bottom?","number":"112","imageName":"rotfeaster maggot"},{"layout":"normal","type":"Creature — Goblin Rogue","types":["Creature"],"colors":["Red"],"multiverseid":383367,"name":"Rummaging Goblin","subtypes":["Goblin","Rogue"],"cmc":3,"rarity":"Common","artist":"Karl Kopinski","power":"1","toughness":"1","manaCost":"{2}{R}","text":"{T}, Discard a card: Draw a card.","flavor":"To a goblin, value is based on the four S's: shiny, stabby, smelly, and super smelly.","number":"159","imageName":"rummaging goblin"},{"layout":"normal","type":"Creature — Bear","types":["Creature"],"colors":["Green"],"multiverseid":383368,"name":"Runeclaw Bear","subtypes":["Bear"],"cmc":2,"rarity":"Common","artist":"Jesper Ejsing","power":"2","toughness":"2","manaCost":"{1}{G}","flavor":"The magic of the elves leaves its mark on the forest. The magic of the forest leaves its mark on the animals who live there. The animals of the forest leave their mark on all who trespass.","number":"197","imageName":"runeclaw bear"},{"layout":"normal","type":"Artifact","types":["Artifact"],"multiverseid":383369,"name":"Sacred Armory","cmc":2,"rarity":"Uncommon","artist":"Yeong-Hao Han","manaCost":"{2}","text":"{2}: Target creature gets +1/+0 until end of turn.","flavor":"Arrive for worship. Leave for war.","number":"228","imageName":"sacred armory"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["White"],"multiverseid":383370,"name":"Sanctified Charge","cmc":5,"rarity":"Common","artist":"Dave Kendall","manaCost":"{4}{W}","text":"Creatures you control get +2/+1 until end of turn. White creatures you control also gain first strike until end of turn. (They deal combat damage before creatures without first strike.)","flavor":"You need only raise your spear to receive this blessing.","number":"30","imageName":"sanctified charge"},{"layout":"normal","type":"Creature — Satyr","types":["Creature"],"colors":["Green"],"multiverseid":383371,"name":"Satyr Wayfinder","subtypes":["Satyr"],"cmc":2,"rarity":"Common","artist":"Steve Prescott","power":"1","toughness":"1","manaCost":"{1}{G}","text":"When Satyr Wayfinder enters the battlefield, 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.","flavor":"The first satyr to wake after a revel must search for the site of the next one.","number":"198","imageName":"satyr wayfinder"},{"layout":"normal","type":"Creature — Hound","types":["Creature"],"colors":["Red"],"multiverseid":383372,"name":"Scrapyard Mongrel","subtypes":["Hound"],"cmc":4,"rarity":"Common","artist":"Svetlin Velinov","power":"3","toughness":"3","manaCost":"{3}{R}","text":"As long as you control an artifact, Scrapyard Mongrel gets +2/+0 and has trample. (If it would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.)","flavor":"Trespassers are welcome to try.","number":"160","imageName":"scrapyard mongrel"},{"layout":"normal","type":"Artifact Creature — Construct","types":["Artifact","Creature"],"multiverseid":383373,"name":"Scuttling Doom Engine","subtypes":["Construct"],"cmc":6,"rarity":"Rare","artist":"Filip Burburan","power":"6","toughness":"6","manaCost":"{6}","text":"Scuttling Doom Engine can't be blocked by creatures with power 2 or less.\nWhen Scuttling Doom Engine dies, it deals 6 damage to target opponent.","flavor":"A masterwork of spite, inspired by madness.","number":"229","imageName":"scuttling doom engine"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["Red"],"multiverseid":383169,"name":"Seismic Strike","cmc":3,"rarity":"Common","artist":"Christopher Moeller","manaCost":"{2}{R}","text":"Seismic Strike deals damage to target creature equal to the number of Mountains you control.","flavor":"\"Life up here is simple. Adapt to the ways of the mountains and they will reward you. Fight them and they will end you.\"\n—Kezim, prodigal pyromancer","number":"280","imageName":"seismic strike","starter":true},{"layout":"normal","type":"Creature — Human Cleric","types":["Creature"],"colors":["White"],"multiverseid":383374,"name":"Selfless Cathar","subtypes":["Human","Cleric"],"cmc":1,"rarity":"Common","artist":"Slawomir Maniak","power":"1","toughness":"1","manaCost":"{W}","text":"{1}{W}, Sacrifice Selfless Cathar: Creatures you control get +1/+1 until end of turn.","flavor":"\"If I fail to offer myself, we will surely be overrun. My fate would be the same.\"","number":"31","imageName":"selfless cathar"},{"layout":"normal","type":"Creature — Vampire","types":["Creature"],"colors":["Black"],"multiverseid":383170,"name":"Sengir Vampire","subtypes":["Vampire"],"cmc":5,"rarity":"Uncommon","artist":"Kev Walker","power":"4","toughness":"4","manaCost":"{3}{B}{B}","text":"Flying (This creature can't be blocked except by creatures with flying or reach.)\nWhenever a creature dealt damage by Sengir Vampire this turn dies, put a +1/+1 counter on Sengir Vampire.","flavor":"Empires rise and fall, but evil is eternal.","number":"277","imageName":"sengir vampire","starter":true},{"layout":"normal","type":"Creature — Angel","types":["Creature"],"colors":["White"],"multiverseid":383375,"name":"Seraph of the Masses","subtypes":["Angel"],"cmc":7,"rarity":"Uncommon","artist":"Zoltan Boros","power":"*","toughness":"*","manaCost":"{5}{W}{W}","text":"Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nFlying\nSeraph of the Masses's power and toughness are each equal to the number of creatures you control.","number":"32","imageName":"seraph of the masses"},{"layout":"normal","type":"Creature — Angel","types":["Creature"],"colors":["White"],"multiverseid":383171,"name":"Serra Angel","subtypes":["Angel"],"cmc":5,"rarity":"Uncommon","artist":"Greg Staples","power":"4","toughness":"4","manaCost":"{3}{W}{W}","text":"Flying (This creature can't be blocked except by creatures with flying or reach.)\nVigilance (Attacking doesn't cause this creature to tap.)","flavor":"Follow the light. In its absence, follow her.","number":"273","imageName":"serra angel","starter":true},{"layout":"normal","type":"Creature — Vampire","types":["Creature"],"colors":["Black"],"multiverseid":383376,"name":"Shadowcloak Vampire","subtypes":["Vampire"],"cmc":5,"rarity":"Common","artist":"Cynthia Sheppard","power":"4","toughness":"3","manaCost":"{4}{B}","text":"Pay 2 life: Shadowcloak Vampire gains flying until end of turn. (It can't be blocked except by creatures with flying or reach.)","flavor":"\"My favorite guilty pleasure? Are there innocent ones?\"","number":"113","imageName":"shadowcloak vampire"},{"layout":"normal","type":"Creature — Elf Shaman","types":["Creature"],"colors":["Green"],"multiverseid":383377,"name":"Shaman of Spring","subtypes":["Elf","Shaman"],"cmc":4,"rarity":"Common","artist":"Johannes Voss","power":"2","toughness":"2","manaCost":"{3}{G}","text":"When Shaman of Spring enters the battlefield, draw a card.","flavor":"Some shamanic sects advocate the different seasons, each working to preserve nature's cycles.","number":"199","imageName":"shaman of spring"},{"layout":"normal","type":"Artifact — Equipment","types":["Artifact"],"multiverseid":383378,"name":"Shield of the Avatar","subtypes":["Equipment"],"cmc":1,"rarity":"Rare","artist":"Volkan Baga","manaCost":"{1}","text":"If a source would deal damage to equipped creature, prevent X of that damage, where X is the number of creatures you control.\nEquip {2} ({2}: Attach to target creature you control. Equip only as a sorcery.)","flavor":"We are made stronger by those we fight for.\nDesigned by Richard Garriott","number":"230","imageName":"shield of the avatar"},{"layout":"normal","type":"Creature — Dragon","types":["Creature"],"colors":["Red"],"multiverseid":383172,"name":"Shivan Dragon","subtypes":["Dragon"],"cmc":6,"rarity":"Rare","artist":"Donato Giancola","power":"5","toughness":"5","manaCost":"{4}{R}{R}","text":"Flying (This creature can't be blocked except by creatures with flying or reach.)\n{R}: Shivan Dragon gets +1/+0 until end of turn.","flavor":"The undisputed master of the mountains of Shiv.","number":"281","imageName":"shivan dragon","starter":true},{"layout":"normal","type":"Land","types":["Land"],"multiverseid":383379,"name":"Shivan Reef","rarity":"Rare","artist":"Rob Alexander","text":"{T}: Add {1} to your mana pool.\n{T}: Add {U} or {R} to your mana pool. Shivan Reef deals 1 damage to you.","number":"246","imageName":"shivan reef"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["Red"],"multiverseid":383380,"name":"Shrapnel Blast","cmc":2,"rarity":"Uncommon","artist":"Hideaki Takamura","manaCost":"{1}{R}","text":"As an additional cost to cast Shrapnel Blast, sacrifice an artifact.\nShrapnel Blast deals 5 damage to target creature or player.","flavor":"It requires immense pressure to imbue an item with magic. If the spell is broken . . .","number":"161","imageName":"shrapnel blast"},{"layout":"normal","type":"Creature — Dragon","types":["Creature"],"colors":["Red"],"multiverseid":383381,"name":"Siege Dragon","subtypes":["Dragon"],"cmc":7,"rarity":"Rare","artist":"Karl Kopinski","power":"5","toughness":"5","manaCost":"{5}{R}{R}","text":"Flying\nWhen Siege Dragon enters the battlefield, destroy all Walls your opponents control.\nWhenever Siege Dragon attacks, if defending player controls no Walls, it deals 2 damage to each creature without flying that player controls.","number":"162","imageName":"siege dragon"},{"layout":"normal","type":"Creature — Wurm","types":["Creature"],"colors":["Green"],"multiverseid":383382,"name":"Siege Wurm","subtypes":["Wurm"],"cmc":7,"rarity":"Common","artist":"Carl Critchlow","power":"5","toughness":"5","manaCost":"{5}{G}{G}","text":"Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nTrample (If this creature would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.)","number":"200","imageName":"siege wurm"},{"layout":"normal","type":"Sorcery","types":["Sorcery"],"colors":["Black"],"multiverseid":383383,"name":"Sign in Blood","cmc":2,"rarity":"Common","artist":"Howard Lyon","manaCost":"{B}{B}","text":"Target player draws two cards and loses 2 life.","flavor":"Little agonies pave the way to greater power.","number":"114","imageName":"sign in blood"},{"layout":"normal","type":"Land","types":["Land"],"multiverseid":383384,"name":"Sliver Hive","rarity":"Rare","artist":"Igor Kieryluk","text":"{T}: Add {1} to your mana pool.\n{T}: Add one mana of any color to your mana pool. Spend this mana only to cast a Sliver spell.\n{5}, {T}: Put a 1/1 colorless Sliver creature token onto the battlefield. Activate this ability only if you control a Sliver.","number":"247","imageName":"sliver hive"},{"layout":"normal","supertypes":["Legendary"],"type":"Legendary Creature — Sliver","types":["Creature"],"colors":["White","Blue","Black","Red","Green"],"multiverseid":383385,"name":"Sliver Hivelord","subtypes":["Sliver"],"cmc":5,"rarity":"Mythic Rare","artist":"Aleksi Briclot","power":"5","toughness":"5","manaCost":"{W}{U}{B}{R}{G}","text":"Sliver creatures you control have indestructible. (Damage and effects that say \"destroy\" don't destroy them.)","flavor":"\"This is the source, the line unbroken since the calamity that brought such monsters to our shores.\"\n—Hastric, Thunian scout","number":"211","imageName":"sliver hivelord"},{"layout":"normal","type":"Sorcery","types":["Sorcery"],"colors":["White"],"multiverseid":383386,"name":"Solemn Offering","cmc":3,"rarity":"Common","artist":"Sam Wood","manaCost":"{2}{W}","text":"Destroy target artifact or enchantment. You gain 4 life.","flavor":"\"You will be reimbursed for your donation.\"\n\"The reimbursement is spiritual.\"\n—Temple signs","number":"33","imageName":"solemn offering"},{"layout":"normal","type":"Creature — Avatar","types":["Creature"],"colors":["Black"],"multiverseid":383387,"name":"Soul of Innistrad","subtypes":["Avatar"],"cmc":6,"rarity":"Mythic Rare","artist":"Adam Paquette","power":"6","toughness":"6","manaCost":"{4}{B}{B}","text":"Deathtouch\n{3}{B}{B}: Return up to three target creature cards from your graveyard to your hand.\n{3}{B}{B}, Exile Soul of Innistrad from your graveyard: Return up to three target creature cards from your graveyard to your hand.","number":"115","imageName":"soul of innistrad"},{"layout":"normal","type":"Artifact Creature — Avatar","types":["Artifact","Creature"],"multiverseid":383388,"name":"Soul of New Phyrexia","subtypes":["Avatar"],"cmc":6,"rarity":"Mythic Rare","artist":"Daarken","power":"6","toughness":"6","manaCost":"{6}","text":"Trample\n{5}: Permanents you control gain indestructible until end of turn.\n{5}, Exile Soul of New Phyrexia from your graveyard: Permanents you control gain indestructible until end of turn.","number":"231","imageName":"soul of new phyrexia"},{"layout":"normal","type":"Creature — Avatar","types":["Creature"],"colors":["Blue"],"multiverseid":383389,"name":"Soul of Ravnica","subtypes":["Avatar"],"cmc":6,"rarity":"Mythic Rare","artist":"Stephan Martiniere","power":"6","toughness":"6","manaCost":"{4}{U}{U}","text":"Flying\n{5}{U}{U}: Draw a card for each color among permanents you control.\n{5}{U}{U}, Exile Soul of Ravnica from your graveyard: Draw a card for each color among permanents you control.","number":"78","imageName":"soul of ravnica"},{"layout":"normal","type":"Creature — Avatar","types":["Creature"],"colors":["Red"],"multiverseid":383390,"name":"Soul of Shandalar","subtypes":["Avatar"],"cmc":6,"rarity":"Mythic Rare","artist":"Raymond Swanland","power":"6","toughness":"6","manaCost":"{4}{R}{R}","text":"First strike\n{3}{R}{R}: Soul of Shandalar deals 3 damage to target player and 3 damage to up to one target creature that player controls.\n{3}{R}{R}, Exile Soul of Shandalar from your graveyard: Soul of Shandalar deals 3 damage to target player and 3 damage to up to one target creature that player controls.","number":"163","imageName":"soul of shandalar"},{"layout":"normal","type":"Creature — Avatar","types":["Creature"],"colors":["White"],"multiverseid":383391,"name":"Soul of Theros","subtypes":["Avatar"],"cmc":6,"rarity":"Mythic Rare","artist":"Zack Stella","power":"6","toughness":"6","manaCost":"{4}{W}{W}","text":"Vigilance\n{4}{W}{W}: Creatures you control get +2/+2 and gain first strike and lifelink until end of turn.\n{4}{W}{W}, Exile Soul of Theros from your graveyard: Creatures you control get +2/+2 and gain first strike and lifelink until end of turn.","number":"34","imageName":"soul of theros"},{"layout":"normal","type":"Creature — Avatar","types":["Creature"],"colors":["Green"],"multiverseid":383392,"name":"Soul of Zendikar","subtypes":["Avatar"],"cmc":6,"rarity":"Mythic Rare","artist":"Vincent Proce","power":"6","toughness":"6","manaCost":"{4}{G}{G}","text":"Reach\n{3}{G}{G}: Put a 3/3 green Beast creature token onto the battlefield.\n{3}{G}{G}, Exile Soul of Zendikar from your graveyard: Put a 3/3 green Beast creature token onto the battlefield.","number":"201","imageName":"soul of zendikar"},{"layout":"normal","type":"Creature — Human Cleric","types":["Creature"],"colors":["White"],"multiverseid":383393,"name":"Soulmender","subtypes":["Human","Cleric"],"cmc":1,"rarity":"Common","artist":"James Ryman","power":"1","toughness":"1","manaCost":"{W}","text":"{T}: You gain 1 life.","flavor":"\"Healing is more art than magic. Well, there is still quite a bit of magic.\"","number":"35","imageName":"soulmender"},{"layout":"normal","type":"Enchantment — Aura","types":["Enchantment"],"colors":["White"],"multiverseid":383394,"name":"Spectra Ward","subtypes":["Aura"],"cmc":5,"rarity":"Rare","artist":"Ryan Alexander Lee","manaCost":"{3}{W}{W}","text":"Enchant creature\nEnchanted creature gets +2/+2 and has protection from all colors. This effect doesn't remove Auras. (It can't be blocked, targeted, or dealt damage by anything that's white, blue, black, red, or green.)","number":"36","imageName":"spectra ward"},{"layout":"normal","type":"Enchantment","types":["Enchantment"],"colors":["White"],"multiverseid":383395,"name":"Spirit Bonds","cmc":2,"rarity":"Rare","artist":"Willian Murai","manaCost":"{1}{W}","text":"Whenever a nontoken creature enters the battlefield under your control, you may pay {W}. If you do, put a 1/1 white Spirit creature token with flying onto the battlefield.\n{1}{W}, Sacrifice a Spirit: Target non-Spirit creature gains indestructible until end of turn. (Damage and effects that say \"destroy\" don't destroy it.)","flavor":"Designed by Justin Gary","number":"37","imageName":"spirit bonds"},{"layout":"normal","type":"Enchantment — Aura","types":["Enchantment"],"colors":["Black"],"multiverseid":383396,"name":"Stab Wound","subtypes":["Aura"],"cmc":3,"rarity":"Uncommon","artist":"Scott Chou","manaCost":"{2}{B}","text":"Enchant creature\nEnchanted creature gets -2/-2.\nAt the beginning of the upkeep of enchanted creature's controller, that player loses 2 life.","number":"116","imageName":"stab wound"},{"layout":"normal","type":"Artifact","types":["Artifact"],"multiverseid":383397,"name":"Staff of the Death Magus","cmc":3,"rarity":"Uncommon","artist":"Daniel Ljunggren","manaCost":"{3}","text":"Whenever you cast a black spell or a Swamp enters the battlefield under your control, you gain 1 life.","flavor":"A symbol of ambition in ruthless times.","number":"232","imageName":"staff of the death magus"},{"layout":"normal","type":"Artifact","types":["Artifact"],"multiverseid":383398,"name":"Staff of the Flame Magus","cmc":3,"rarity":"Uncommon","artist":"Daniel Ljunggren","manaCost":"{3}","text":"Whenever you cast a red spell or a Mountain enters the battlefield under your control, you gain 1 life.","flavor":"A symbol of passion in indifferent times.","number":"233","imageName":"staff of the flame magus"},{"layout":"normal","type":"Artifact","types":["Artifact"],"multiverseid":383399,"name":"Staff of the Mind Magus","cmc":3,"rarity":"Uncommon","artist":"Daniel Ljunggren","manaCost":"{3}","text":"Whenever you cast a blue spell or an Island enters the battlefield under your control, you gain 1 life.","flavor":"A symbol of sagacity in bewildering times.","number":"234","imageName":"staff of the mind magus"},{"layout":"normal","type":"Artifact","types":["Artifact"],"multiverseid":383400,"name":"Staff of the Sun Magus","cmc":3,"rarity":"Uncommon","artist":"Daniel Ljunggren","manaCost":"{3}","text":"Whenever you cast a white spell or a Plains enters the battlefield under your control, you gain 1 life.","flavor":"A symbol of conviction in uncertain times.","number":"235","imageName":"staff of the sun magus"},{"layout":"normal","type":"Artifact","types":["Artifact"],"multiverseid":383401,"name":"Staff of the Wild Magus","cmc":3,"rarity":"Uncommon","artist":"Daniel Ljunggren","manaCost":"{3}","text":"Whenever you cast a green spell or a Forest enters the battlefield under your control, you gain 1 life.","flavor":"A symbol of ferocity in oppressive times.","number":"236","imageName":"staff of the wild magus"},{"layout":"normal","type":"Sorcery","types":["Sorcery"],"colors":["Black"],"multiverseid":383402,"name":"Stain the Mind","cmc":5,"rarity":"Rare","artist":"Jason Rainville","manaCost":"{4}{B}","text":"Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nName a nonland card. Search target player's graveyard, hand, and library for any number of cards with that name and exile them. Then that player shuffles his or her library.","number":"117","imageName":"stain the mind"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["Blue"],"multiverseid":383403,"name":"Statute of Denial","cmc":4,"rarity":"Common","artist":"Zoltan Boros","manaCost":"{2}{U}{U}","text":"Counter target spell. If you control a blue creature, draw a card, then discard a card.","flavor":"\"Pyrotechnic activity of any sort is strictly prohibited. It is irrelevant that today is a holiday.\"","number":"79","imageName":"statute of denial"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["Red"],"multiverseid":383404,"name":"Stoke the Flames","cmc":4,"rarity":"Uncommon","artist":"Ryan Barger","manaCost":"{2}{R}{R}","text":"Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nStoke the Flames deals 4 damage to target creature or player.","number":"164","imageName":"stoke the flames"},{"layout":"normal","type":"Creature — Leviathan","types":["Creature"],"colors":["Blue"],"multiverseid":383405,"name":"Stormtide Leviathan","subtypes":["Leviathan"],"cmc":8,"rarity":"Rare","artist":"Karl Kopinski","power":"8","toughness":"8","manaCost":"{5}{U}{U}{U}","text":"Islandwalk (This creature can't be blocked as long as defending player controls an Island.)\nAll lands are Islands in addition to their other types.\nCreatures without flying or islandwalk can't attack.","number":"80","imageName":"stormtide leviathan"},{"layout":"normal","type":"Creature — Elf Warrior","types":["Creature"],"colors":["Green"],"multiverseid":383406,"name":"Sunblade Elf","subtypes":["Elf","Warrior"],"cmc":1,"rarity":"Uncommon","artist":"Lucas Graciano","power":"1","toughness":"1","manaCost":"{G}","text":"Sunblade Elf gets +1/+1 as long as you control a Plains.\n{4}{W}: Creatures you control get +1/+1 until end of turn.","flavor":"\"We patrol the steppes to keep enemies from the forest verge.\"","number":"202","imageName":"sunblade elf"},{"layout":"normal","type":"Creature — Pegasus","types":["Creature"],"colors":["White"],"multiverseid":383407,"name":"Sungrace Pegasus","subtypes":["Pegasus"],"cmc":2,"rarity":"Common","artist":"Phill Simmer","power":"1","toughness":"2","manaCost":"{1}{W}","text":"Flying (This creature can't be blocked except by creatures with flying or reach.)\nLifelink (Damage dealt by this creature also causes you to gain that much life.)","flavor":"The sacred feathers of the pegasus are said to have healing powers.","number":"38","imageName":"sungrace pegasus"},{"layout":"normal","supertypes":["Basic"],"type":"Basic Land — Swamp","types":["Land"],"multiverseid":383409,"name":"Swamp","subtypes":["Swamp"],"rarity":"Basic Land","artist":"John Avon","number":"258","variations":[383408,383410,383411],"imageName":"swamp1"},{"layout":"normal","supertypes":["Basic"],"type":"Basic Land — Swamp","types":["Land"],"multiverseid":383410,"name":"Swamp","subtypes":["Swamp"],"rarity":"Basic Land","artist":"Cliff Childs","number":"259","variations":[383408,383409,383411],"imageName":"swamp2"},{"layout":"normal","supertypes":["Basic"],"type":"Basic Land — Swamp","types":["Land"],"multiverseid":383411,"name":"Swamp","subtypes":["Swamp"],"rarity":"Basic Land","artist":"Jonas De Ro","number":"260","variations":[383408,383409,383410],"imageName":"swamp3"},{"layout":"normal","supertypes":["Basic"],"type":"Basic Land — Swamp","types":["Land"],"multiverseid":383408,"name":"Swamp","subtypes":["Swamp"],"rarity":"Basic Land","artist":"Jung Park","number":"261","variations":[383409,383410,383411],"imageName":"swamp4"},{"layout":"normal","type":"Creature — Beast","types":["Creature"],"colors":["Green"],"multiverseid":383173,"name":"Terra Stomper","subtypes":["Beast"],"cmc":6,"rarity":"Rare","artist":"Goran Josic","power":"8","toughness":"8","manaCost":"{3}{G}{G}{G}","text":"Terra Stomper can't be countered.\nTrample (If this creature would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.)","flavor":"Its footfalls cause violent earthquakes, hurtling boulders, and unseasonable dust storms.","number":"284","imageName":"terra stomper","starter":true},{"layout":"normal","supertypes":["Legendary"],"type":"Legendary Artifact","types":["Artifact"],"multiverseid":383412,"name":"The Chain Veil","cmc":4,"rarity":"Mythic Rare","artist":"Volkan Baga","manaCost":"{4}","text":"At the beginning of your end step, if you didn't activate a loyalty ability of a planeswalker this turn, you lose 2 life.\n{4}, {T}: For each planeswalker you control, you may activate one of its loyalty abilities once this turn as though none of its loyalty abilities have been activated this turn.","number":"215","imageName":"the chain veil"},{"layout":"normal","type":"Creature — Giant","types":["Creature"],"colors":["Red"],"multiverseid":383413,"name":"Thundering Giant","subtypes":["Giant"],"cmc":5,"rarity":"Common","artist":"Mark Zug","power":"4","toughness":"3","manaCost":"{3}{R}{R}","text":"Haste (This creature can attack and {T} as soon as it comes under your control.)","flavor":"The giant was felt a few seconds before he was seen.","number":"165","imageName":"thundering giant"},{"layout":"normal","type":"Creature — Human Cleric","types":["Creature"],"colors":["White"],"multiverseid":383414,"name":"Tireless Missionaries","subtypes":["Human","Cleric"],"cmc":5,"rarity":"Common","artist":"Dave Kendall","power":"2","toughness":"3","manaCost":"{4}{W}","text":"When Tireless Missionaries enters the battlefield, you gain 3 life.","flavor":"If they succeed in their holy work, their order will vanish into welcome obscurity, for there will be no more souls to redeem.","number":"39","imageName":"tireless missionaries"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["Green"],"multiverseid":383415,"name":"Titanic Growth","cmc":2,"rarity":"Common","artist":"Ryan Pancoast","manaCost":"{1}{G}","text":"Target creature gets +4/+4 until end of turn.","flavor":"The massive dominate through might. The tiny survive with guile. Beware the tiny who become massive.","number":"203","imageName":"titanic growth"},{"layout":"normal","type":"Creature — Devil","types":["Creature"],"colors":["Red"],"multiverseid":383416,"name":"Torch Fiend","subtypes":["Devil"],"cmc":2,"rarity":"Common","artist":"Winona Nelson","power":"2","toughness":"1","manaCost":"{1}{R}","text":"{R}, Sacrifice Torch Fiend: Destroy target artifact.","flavor":"Devils redecorate every room with fire.","number":"166","imageName":"torch fiend"},{"layout":"normal","type":"Artifact","types":["Artifact"],"multiverseid":383417,"name":"Tormod's Crypt","cmc":0,"rarity":"Uncommon","artist":"Lars Grant-West","manaCost":"{0}","text":"{T}, Sacrifice Tormod's Crypt: Exile all cards from target player's graveyard.","flavor":"Dominaria's most extravagant crypt nevertheless holds an empty grave.","number":"237","imageName":"tormod's crypt"},{"layout":"normal","type":"Sorcery","types":["Sorcery"],"colors":["White"],"multiverseid":383418,"name":"Triplicate Spirits","cmc":6,"rarity":"Common","artist":"Izzy","manaCost":"{4}{W}{W}","text":"Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nPut three 1/1 white Spirit creature tokens with flying onto the battlefield. (They can't be blocked except by creatures with flying or reach.)","number":"40","imageName":"triplicate spirits"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["Blue"],"multiverseid":383419,"name":"Turn to Frog","cmc":2,"rarity":"Uncommon","artist":"Warren Mahy","manaCost":"{1}{U}","text":"Until end of turn, target creature loses all abilities and becomes a blue Frog with base power and toughness 1/1.","flavor":"\"Ribbit.\"","number":"81","imageName":"turn to frog"},{"layout":"normal","type":"Creature — Rat","types":["Creature"],"colors":["Black"],"multiverseid":383420,"name":"Typhoid Rats","subtypes":["Rat"],"cmc":1,"rarity":"Common","artist":"Kev Walker","power":"1","toughness":"1","manaCost":"{B}","text":"Deathtouch (Any amount of damage this deals to a creature is enough to destroy it.)","flavor":"Kidnappers caught in Havengul are given two choices: languish in prison or become rat catchers. The smart ones go to prison.","number":"118","imageName":"typhoid rats"},{"layout":"normal","type":"Artifact","types":["Artifact"],"multiverseid":383421,"name":"Tyrant's Machine","cmc":2,"rarity":"Common","artist":"Yeong-Hao Han","manaCost":"{2}","text":"{4}, {T}: Tap target creature.","flavor":"\"Though tempered differently, all wills can be broken.\"\n—Inquisitor Kyrik","number":"238","imageName":"tyrant's machine"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["Black"],"multiverseid":383422,"name":"Ulcerate","cmc":1,"rarity":"Uncommon","artist":"Johann Bodin","manaCost":"{B}","text":"Target creature gets -3/-3 until end of turn. You lose 3 life.","flavor":"\"If it were merely lethal, that would be sufficient. The art, however, is in maximizing the suffering it causes.\"\n—Liliana Vess","number":"119","imageName":"ulcerate"},{"layout":"normal","type":"Creature — Fungus Horror","types":["Creature"],"colors":["Green"],"multiverseid":383423,"name":"Undergrowth Scavenger","subtypes":["Fungus","Horror"],"cmc":4,"rarity":"Common","artist":"Nils Hamm","power":"0","toughness":"0","manaCost":"{3}{G}","text":"Undergrowth Scavenger enters the battlefield with a number of +1/+1 counters on it equal to the number of creature cards in all graveyards.","flavor":"It sees a rotting carcass as a good wine which has been aged properly.","number":"204","imageName":"undergrowth scavenger"},{"layout":"normal","type":"Instant","types":["Instant"],"colors":["Black"],"multiverseid":383424,"name":"Unmake the Graves","cmc":5,"rarity":"Common","artist":"Aaron Miller","manaCost":"{4}{B}","text":"Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nReturn up to two target creature cards from your graveyard to your hand.","flavor":"\"I'm raising an army. Any volunteers?\"","number":"120","imageName":"unmake the graves"},{"layout":"normal","supertypes":["Legendary"],"type":"Legendary Land","types":["Land"],"multiverseid":383425,"name":"Urborg, Tomb of Yawgmoth","rarity":"Rare","artist":"John Avon","text":"Each land is a Swamp in addition to its other land types.","flavor":"\"Yawgmoth's corpse is a wound in the universe. His foul blood seeps out, infecting the land with his final curse.\"\n—Lord Windgrace","number":"248","imageName":"urborg, tomb of yawgmoth"},{"layout":"normal","type":"Creature — Sliver","types":["Creature"],"colors":["Green"],"multiverseid":383426,"name":"Venom Sliver","subtypes":["Sliver"],"cmc":2,"rarity":"Uncommon","artist":"Dave Kendall","power":"1","toughness":"1","manaCost":"{1}{G}","text":"Sliver creatures you control have deathtouch. (Any amount of damage a creature with deathtouch deals to a creature is enough to destroy it.)","flavor":"\"We attacked with arrows dipped in poison. The slivers that did not die began to change.\"\n—Hastric, Thunian scout","number":"205","imageName":"venom sliver"},{"layout":"normal","type":"Enchantment — Aura","types":["Enchantment"],"colors":["Green"],"multiverseid":383427,"name":"Verdant Haven","subtypes":["Aura"],"cmc":3,"rarity":"Common","artist":"Daniel Ljunggren","manaCost":"{2}{G}","text":"Enchant land\nWhen Verdant Haven enters the battlefield, you gain 2 life.\nWhenever enchanted land is tapped for mana, its controller adds one mana of any color to his or her mana pool (in addition to the mana the land produces).","number":"206","imageName":"verdant haven"},{"layout":"normal","type":"Enchantment — Aura","types":["Enchantment"],"colors":["Green"],"multiverseid":383428,"name":"Vineweft","subtypes":["Aura"],"cmc":1,"rarity":"Common","artist":"Lucas Graciano","manaCost":"{G}","text":"Enchant creature\nEnchanted creature gets +1/+1.\n{4}{G}: Return Vineweft from your graveyard to your hand.","flavor":"Fortified by the wilds.","number":"207","imageName":"vineweft"},{"layout":"normal","type":"Sorcery","types":["Sorcery"],"colors":["Blue"],"multiverseid":383429,"name":"Void Snare","cmc":1,"rarity":"Common","artist":"Zack Stella","manaCost":"{U}","text":"Return target nonland permanent to its owner's hand.","flavor":"\"I've tried so many variations on how to get rid of annoying things that it's hard to decide which one I like best.\"\n—Ashurel, voidmage","number":"82","imageName":"void snare"},{"layout":"normal","type":"Creature — Zombie","types":["Creature"],"colors":["Black"],"multiverseid":383174,"name":"Walking Corpse","subtypes":["Zombie"],"cmc":2,"rarity":"Common","artist":"Igor Kieryluk","power":"2","toughness":"2","manaCost":"{1}{B}","flavor":"\"Feeding a normal army is a problem of logistics. With zombies, it is an asset. Feeding is why they fight. Feeding is why they are feared.\"\n—Jadar, ghoulcaller of Nephalia","number":"278","imageName":"walking corpse","starter":true},{"layout":"normal","type":"Creature — Wall","types":["Creature"],"colors":["White"],"multiverseid":383430,"name":"Wall of Essence","subtypes":["Wall"],"cmc":2,"rarity":"Uncommon","artist":"Adam Rex","power":"0","toughness":"4","manaCost":"{1}{W}","text":"Defender (This creature can't attack.)\nWhenever Wall of Essence is dealt combat damage, you gain that much life.","flavor":"\"If you cannot turn your enemy's strength to weakness, then make that strength your own.\"\n—Gresha, warrior sage","number":"41","imageName":"wall of essence"},{"layout":"normal","type":"Creature — Wall","types":["Creature"],"colors":["Red"],"multiverseid":383431,"name":"Wall of Fire","subtypes":["Wall"],"cmc":3,"rarity":"Common","artist":"Dan Dos Santos","power":"0","toughness":"5","manaCost":"{1}{R}{R}","text":"Defender (This creature can't attack.)\n{R}: Wall of Fire gets +1/+0 until end of turn.","flavor":"Mercy is for those who keep their distance.","number":"167","imageName":"wall of fire"},{"layout":"normal","type":"Creature — Wall","types":["Creature"],"colors":["Blue"],"multiverseid":383432,"name":"Wall of Frost","subtypes":["Wall"],"cmc":3,"rarity":"Uncommon","artist":"Mike Bierek","power":"0","toughness":"7","manaCost":"{1}{U}{U}","text":"Defender (This creature can't attack.)\nWhenever Wall of Frost blocks a creature, that creature doesn't untap during its controller's next untap step.","flavor":"\"I have seen countless petty warmongers gaze on it for a time before turning away.\"\n—Sarlena, paladin of the Northern Verge","number":"83","imageName":"wall of frost"},{"layout":"normal","type":"Creature — Zombie Wall","types":["Creature"],"colors":["Black"],"multiverseid":383433,"name":"Wall of Limbs","subtypes":["Zombie","Wall"],"cmc":3,"rarity":"Uncommon","artist":"Yeong-Hao Han","power":"0","toughness":"3","manaCost":"{2}{B}","text":"Defender (This creature can't attack.)\nWhenever you gain life, put a +1/+1 counter on Wall of Limbs.\n{5}{B}{B}, Sacrifice Wall of Limbs: Target player loses X life, where X is Wall of Limbs's power.","number":"121","imageName":"wall of limbs"},{"layout":"normal","type":"Creature — Wall","types":["Creature"],"colors":["Green"],"multiverseid":383434,"name":"Wall of Mulch","subtypes":["Wall"],"cmc":2,"rarity":"Uncommon","artist":"Anthony S. Waters","power":"0","toughness":"4","manaCost":"{1}{G}","text":"Defender (This creature can't attack.)\n{G}, Sacrifice a Wall: Draw a card.","flavor":"Mulch is the fabric of life in the forest. Plants live in it, they die in it, and then they become part of it, feeding countless generations to come.","number":"208","imageName":"wall of mulch"},{"layout":"normal","type":"Creature — Human Wizard","types":["Creature"],"colors":["White"],"multiverseid":383435,"name":"Warden of the Beyond","subtypes":["Human","Wizard"],"cmc":3,"rarity":"Uncommon","artist":"Raymond Swanland","power":"2","toughness":"2","manaCost":"{2}{W}","text":"Vigilance (Attacking doesn't cause this creature to tap.)\nWarden of the Beyond gets +2/+2 as long as an opponent owns a card in exile.","flavor":"He draws strength from a vast source few mortals can fathom.\nDesigned by Isaiah Cartwright","number":"42","imageName":"warden of the beyond"},{"layout":"normal","type":"Enchantment","types":["Enchantment"],"colors":["Black"],"multiverseid":383436,"name":"Waste Not","cmc":2,"rarity":"Rare","artist":"Matt Stewart","manaCost":"{1}{B}","text":"Whenever an opponent discards a creature card, put a 2/2 black Zombie creature token onto the battlefield.\nWhenever an opponent discards a land card, add {B}{B} to your mana pool.\nWhenever an opponent discards a noncreature, nonland card, draw a card.","flavor":"Designed by the Magic community","number":"122","imageName":"waste not"},{"layout":"normal","type":"Creature — Bird","types":["Creature"],"colors":["Blue"],"multiverseid":383437,"name":"Welkin Tern","subtypes":["Bird"],"cmc":2,"rarity":"Common","artist":"Austin Hsu","power":"2","toughness":"1","manaCost":"{1}{U}","text":"Flying (This creature can't be blocked except by creatures with flying or reach.)\nWelkin Tern can block only creatures with flying.","flavor":"Sailors have come to regard them as bad luck, for they falsely bring hope of land.","number":"84","imageName":"welkin tern"},{"layout":"normal","type":"Artifact Creature — Golem","types":["Artifact","Creature"],"multiverseid":383438,"name":"Will-Forged Golem","subtypes":["Golem"],"cmc":6,"rarity":"Common","artist":"Jason Felix","power":"4","toughness":"4","manaCost":"{6}","text":"Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)","flavor":"The modular nature of the automaton's design makes assembly perfectly intuitive.","number":"239","imageName":"will-forged golem"},{"layout":"normal","type":"Creature — Frog","types":["Creature"],"colors":["Black"],"multiverseid":383439,"name":"Witch's Familiar","subtypes":["Frog"],"cmc":3,"rarity":"Common","artist":"Jack Wang","power":"2","toughness":"3","manaCost":"{2}{B}","flavor":"Some bog witches practice the strange art of batrachomancy, reading portents in the number, size, and color of warts on a toad's hide.","number":"123","imageName":"witch's familiar"},{"layout":"normal","type":"Creature — Human Assassin","types":["Creature"],"colors":["Black"],"multiverseid":383440,"name":"Xathrid Slyblade","subtypes":["Human","Assassin"],"cmc":3,"rarity":"Uncommon","artist":"Steve Prescott","power":"2","toughness":"1","manaCost":"{2}{B}","text":"Hexproof (This creature can't be the target of spells or abilities your opponents control.)\n{3}{B}: Until end of turn, Xathrid Slyblade loses hexproof and gains first strike and deathtouch. (It deals combat damage before creatures without first strike. Any amount of damage it deals to a creature is enough to destroy it.)","flavor":"Designed by Rob Pardo","number":"124","imageName":"xathrid slyblade"},{"layout":"normal","type":"Land","types":["Land"],"multiverseid":383441,"name":"Yavimaya Coast","rarity":"Rare","artist":"Anthony S. Waters","text":"{T}: Add {1} to your mana pool.\n{T}: Add {G} or {U} to your mana pool. Yavimaya Coast deals 1 damage to you.","number":"249","imageName":"yavimaya coast"},{"layout":"normal","supertypes":["Legendary"],"type":"Legendary Creature — Human Rogue","types":["Creature"],"colors":["Green"],"multiverseid":383442,"name":"Yisan, the Wanderer Bard","subtypes":["Human","Rogue"],"cmc":3,"rarity":"Rare","artist":"Chase Stone","power":"2","toughness":"3","manaCost":"{2}{G}","text":"{2}{G}, {T}, Put a verse counter on Yisan, the Wanderer Bard: Search your library for a creature card with converted mana cost equal to the number of verse counters on Yisan, put it onto the battlefield, then shuffle your library.","flavor":"Designed by Brian Fargo","number":"209","imageName":"yisan, the wanderer bard"},{"layout":"normal","type":"Creature — Shade","types":["Creature"],"colors":["Black"],"multiverseid":383443,"name":"Zof Shade","subtypes":["Shade"],"cmc":4,"rarity":"Common","artist":"Jason A. Engle","power":"2","toughness":"2","manaCost":"{3}{B}","text":"{2}{B}: Zof Shade gets +2/+2 until end of turn.","flavor":"Shades are drawn to places of power, often rooting themselves in a single area to feed.","number":"125","imageName":"zof shade"}],"languagesPrinted":["Chinese Simplified","Chinese Traditional","French","German","Italian","Japanese","Korean","Portuguese (Brazil)","Russian","Spanish"]} \ No newline at end of file diff --git a/README.md b/README.md index a457e8f..b4f673b 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,61 @@ # cardbase -Cardbase is a (for now) simple tool for managing MTG cards. My collection was getting out of hand, so I decided to catalogue in a way that makes it easy to determine how many of each card I have, for putting decks together. +The primary purpose of cardbase is to create a digital representation of your own MTG collection. A cardbase file (.cb) is simply a JSON file containing an array of card objects. The card data structure used is a superset of that used in [MTG JSON](http://mtgjson.com/), and in fact that is where most of the data comes from. + +To-do list: +* Build basic GUI to visualise the cards +* Allow sorting by field +* Basic deck building - decks can be built and stored +* Statistical deck analysis - cost distribution, etc + + +## Command Line Interface (CLI) - cardbasecli + +### Loading a Cardbase + +To use, first make sure to load the cardbase by passing it as the first argument to the program, e.g. cardbasecli ~/mycardbase.cb. To start a new clean cardbase, run cardbasecli without arguments. + + +### Adding Cards + +To add cards, first use "set" to enter the code of the set to which the card belongs, e.g. to add 2015 Core Set cards, enter "set M15". To see a list of all valid set codes, type "sets". +Once a set is selected, simply type the card's set number and it will be added to the collection. You may add more of the same card one at a time, or by specifying the quantity following the set number. + +For example, to add 3 M15 edition Shivan Dragons, do: + +> set m15 +> 281 3 + +Alternatively, pressing return immediately after adding a card repeats that action. If return was pressed one more time after the example above, three more Shivan Dragons would be added. This can be repeated indefinitely, but only works with card additions. + + +### Removing Cards + +To remove cards, first choose a set and then type "remove" followed by the card's set number. To remove more of the same card, add the desired count after the card number. + +For example, to remove 2 of your 3 M15 Shivan Dragons, do: + +> set m15 +> remove 281 2 + +Note that it is only necessary to choose the set if it wasn't already selected. + + +### Undo + +You may take back your last action by typing "undo". This only works for add and remove actions, and only if the set has not been changed since. Only the most recent action can be undone. + + +### Viewing the Cardbase + +Cardbasecli also offers some very basic commands to view the current state of the cardbase: glance and peruse. + +glance: prints a list showing the amount of each card in the cardbase, by name. +peruse: prints the same list as glance, but with more information about each card. + +Peruse optionally accepts a card number as an argument. If present, only that card's information is printed. + + +### Committing Changes and Exiting + +Any changes made on this tool must be manually written to the file. If you make a mistake, simply exit and your cardbase will not be modified. To write changes, use the "write" command. To save to a new file, type "write" followed by the file name (no spaces allowed). To exit, simply type "exit". diff --git a/SetList.json b/SetList.json deleted file mode 100644 index bb5f4d6..0000000 --- a/SetList.json +++ /dev/null @@ -1 +0,0 @@ -[{"name":"Limited Edition Alpha","code":"LEA","releaseDate":"1993-08-05"},{"name":"Limited Edition Beta","code":"LEB","releaseDate":"1993-10-01"},{"name":"Arabian Nights","code":"ARN","releaseDate":"1993-12-01"},{"name":"Unlimited Edition","code":"2ED","releaseDate":"1993-12-01"},{"name":"Dragon Con","code":"pDRC","releaseDate":"1994-01-01"},{"name":"Antiquities","code":"ATQ","releaseDate":"1994-03-01"},{"name":"Revised Edition","code":"3ED","releaseDate":"1994-04-01"},{"name":"Legends","code":"LEG","releaseDate":"1994-06-01"},{"name":"The Dark","code":"DRK","releaseDate":"1994-08-01"},{"name":"Media Inserts","code":"pMEI","releaseDate":"1995-01-01"},{"name":"Fallen Empires","code":"FEM","releaseDate":"1994-11-01"},{"name":"Legend Membership","code":"pLGM","releaseDate":"1995-01-01"},{"name":"Fourth Edition","code":"4ED","releaseDate":"1995-04-01"},{"name":"Ice Age","code":"ICE","releaseDate":"1995-06-01"},{"name":"Chronicles","code":"CHR","releaseDate":"1995-07-01"},{"name":"Homelands","code":"HML","releaseDate":"1995-10-01"},{"name":"Alliances","code":"ALL","releaseDate":"1996-06-10"},{"name":"Rivals Quick Start Set","code":"RQS","releaseDate":"1996-07-01"},{"name":"Arena League","code":"pARL","releaseDate":"1996-08-02"},{"name":"Celebration","code":"pCEL","releaseDate":"1996-08-14"},{"name":"Mirage","code":"MIR","releaseDate":"1996-10-08"},{"name":"Multiverse Gift Box","code":"MGB","releaseDate":"1996-11-01"},{"name":"Introductory Two-Player Set","code":"ITP","releaseDate":"1996-12-31"},{"name":"Visions","code":"VIS","releaseDate":"1997-02-03"},{"name":"Fifth Edition","code":"5ED","releaseDate":"1997-03-24"},{"name":"Portal Demo Game","code":"pPOD","releaseDate":"1997-05-01"},{"name":"Portal","code":"POR","releaseDate":"1997-05-01"},{"name":"Vanguard","code":"VAN","releaseDate":"1997-05-01"},{"name":"Weatherlight","code":"WTH","releaseDate":"1997-06-09"},{"name":"Prerelease Events","code":"pPRE","releaseDate":"1997-10-04"},{"name":"Tempest","code":"TMP","releaseDate":"1997-10-14"},{"name":"Stronghold","code":"STH","releaseDate":"1998-03-02"},{"name":"Portal Second Age","code":"PO2","releaseDate":"1998-06-01"},{"name":"Judge Gift Program","code":"pJGP","releaseDate":"1998-06-01"},{"name":"Exodus","code":"EXO","releaseDate":"1998-06-15"},{"name":"Unglued","code":"UGL","releaseDate":"1998-08-11"},{"name":"Asia Pacific Land Program","code":"pALP","releaseDate":"1998-09-01"},{"name":"Urza's Saga","code":"USG","releaseDate":"1998-10-12"},{"name":"Anthologies","code":"ATH","releaseDate":"1998-11-01"},{"name":"Urza's Legacy","code":"ULG","releaseDate":"1999-02-15"},{"name":"Classic Sixth Edition","code":"6ED","releaseDate":"1999-04-21"},{"name":"Portal Three Kingdoms","code":"PTK","releaseDate":"1999-05-01"},{"name":"Urza's Destiny","code":"UDS","releaseDate":"1999-06-07"},{"name":"Starter 1999","code":"S99","releaseDate":"1999-07-01"},{"name":"Guru","code":"pGRU","releaseDate":"1999-07-12"},{"name":"Worlds","code":"pWOR","releaseDate":"1999-08-04"},{"name":"Wizards of the Coast Online Store","code":"pWOS","releaseDate":"1999-09-04"},{"name":"Mercadian Masques","code":"MMQ","releaseDate":"1999-10-04"},{"name":"Battle Royale Box Set","code":"BRB","releaseDate":"1999-11-12"},{"name":"Super Series","code":"pSUS","releaseDate":"1999-12-01"},{"name":"Friday Night Magic","code":"pFNM","releaseDate":"2000-02-01"},{"name":"European Land Program","code":"pELP","releaseDate":"2000-02-05"},{"name":"Nemesis","code":"NMS","releaseDate":"2000-02-14"},{"name":"Starter 2000","code":"S00","releaseDate":"2000-04-01"},{"name":"Prophecy","code":"PCY","releaseDate":"2000-06-05"},{"name":"Beatdown Box Set","code":"BTD","releaseDate":"2000-10-01"},{"name":"Invasion","code":"INV","releaseDate":"2000-10-02"},{"name":"Planeshift","code":"PLS","releaseDate":"2001-02-05"},{"name":"Seventh Edition","code":"7ED","releaseDate":"2001-04-11"},{"name":"Magic Player Rewards","code":"pMPR","releaseDate":"2001-05-01"},{"name":"Apocalypse","code":"APC","releaseDate":"2001-06-04"},{"name":"Odyssey","code":"ODY","releaseDate":"2001-10-01"},{"name":"Deckmasters","code":"DKM","releaseDate":"2001-12-01"},{"name":"Torment","code":"TOR","releaseDate":"2002-02-04"},{"name":"Judgment","code":"JUD","releaseDate":"2002-05-27"},{"name":"Onslaught","code":"ONS","releaseDate":"2002-10-07"},{"name":"Legions","code":"LGN","releaseDate":"2003-02-03"},{"name":"Scourge","code":"SCG","releaseDate":"2003-05-26"},{"name":"Release Events","code":"pREL","releaseDate":"2003-07-26"},{"name":"Eighth Edition","code":"8ED","releaseDate":"2003-07-28"},{"name":"Mirrodin","code":"MRD","releaseDate":"2003-10-02"},{"name":"Darksteel","code":"DST","releaseDate":"2004-02-06"},{"name":"Fifth Dawn","code":"5DN","releaseDate":"2004-06-04"},{"name":"Champions of Kamigawa","code":"CHK","releaseDate":"2004-10-01"},{"name":"Unhinged","code":"UNH","releaseDate":"2004-11-20"},{"name":"Betrayers of Kamigawa","code":"BOK","releaseDate":"2005-02-04"},{"name":"Saviors of Kamigawa","code":"SOK","releaseDate":"2005-06-03"},{"name":"Ninth Edition","code":"9ED","releaseDate":"2005-07-29"},{"name":"Ravnica: City of Guilds","code":"RAV","releaseDate":"2005-10-07"},{"name":"Two-Headed Giant Tournament","code":"p2HG","releaseDate":"2005-12-09"},{"name":"WPN and Gateway","code":"pWPN","releaseDate":"2006-01-01"},{"name":"Guildpact","code":"GPT","releaseDate":"2006-02-03"},{"name":"Champs and States","code":"pCMP","releaseDate":"2006-03-18"},{"name":"Dissension","code":"DIS","releaseDate":"2006-05-05"},{"name":"Coldsnap","code":"CSP","releaseDate":"2006-07-21"},{"name":"Coldsnap Theme Decks","code":"CST","releaseDate":"2006-07-21"},{"name":"Time Spiral","code":"TSP","releaseDate":"2006-10-06"},{"name":"Time Spiral \"Timeshifted\"","code":"TSB","releaseDate":"2006-10-06"},{"name":"Happy Holidays","code":"pHHO","releaseDate":"2006-12-31"},{"name":"Planar Chaos","code":"PLC","releaseDate":"2007-02-02"},{"name":"Pro Tour","code":"pPRO","releaseDate":"2007-02-09"},{"name":"Grand Prix","code":"pGPX","releaseDate":"2007-02-24"},{"name":"Future Sight","code":"FUT","releaseDate":"2007-05-04"},{"name":"Tenth Edition","code":"10E","releaseDate":"2007-07-13"},{"name":"Magic Game Day","code":"pMGD","releaseDate":"2007-07-14"},{"name":"Masters Edition","code":"MED","releaseDate":"2007-09-10"},{"name":"Lorwyn","code":"LRW","releaseDate":"2007-10-12"},{"name":"Duel Decks: Elves vs. Goblins","code":"EVG","releaseDate":"2007-11-16"},{"name":"Launch Parties","code":"pLPA","releaseDate":"2008-02-01"},{"name":"Morningtide","code":"MOR","releaseDate":"2008-02-01"},{"name":"15th Anniversary","code":"p15A","releaseDate":"2008-04-01"},{"name":"Shadowmoor","code":"SHM","releaseDate":"2008-05-02"},{"name":"Summer of Magic","code":"pSUM","releaseDate":"2007-07-21"},{"name":"Eventide","code":"EVE","releaseDate":"2008-07-25"},{"name":"From the Vault: Dragons","code":"DRB","releaseDate":"2008-08-29"},{"name":"Masters Edition II","code":"ME2","releaseDate":"2008-09-22"},{"name":"Shards of Alara","code":"ALA","releaseDate":"2008-10-03"},{"name":"Duel Decks: Jace vs. Chandra","code":"DD2","releaseDate":"2008-11-07"},{"name":"Conflux","code":"CON","releaseDate":"2009-02-06"},{"name":"Duel Decks: Divine vs. Demonic","code":"DDC","releaseDate":"2009-04-10"},{"name":"Alara Reborn","code":"ARB","releaseDate":"2009-04-30"},{"name":"Magic 2010","code":"M10","releaseDate":"2009-07-17"},{"name":"From the Vault: Exiled","code":"V09","releaseDate":"2009-08-28"},{"name":"Planechase","code":"HOP","releaseDate":"2009-09-04"},{"name":"Masters Edition III","code":"ME3","releaseDate":"2009-09-07"},{"name":"Zendikar","code":"ZEN","releaseDate":"2009-10-02"},{"name":"Duel Decks: Garruk vs. Liliana","code":"DDD","releaseDate":"2009-10-30"},{"name":"Premium Deck Series: Slivers","code":"H09","releaseDate":"2009-11-20"},{"name":"Worldwake","code":"WWK","releaseDate":"2010-02-05"},{"name":"Duel Decks: Phyrexia vs. the Coalition","code":"DDE","releaseDate":"2010-03-19"},{"name":"Rise of the Eldrazi","code":"ROE","releaseDate":"2010-04-23"},{"name":"Duels of the Planeswalkers","code":"DPA","releaseDate":"2010-06-04"},{"name":"Archenemy","code":"ARC","releaseDate":"2010-06-18"},{"name":"Magic 2011","code":"M11","releaseDate":"2010-07-16"},{"name":"From the Vault: Relics","code":"V10","releaseDate":"2010-08-27"},{"name":"Duel Decks: Elspeth vs. Tezzeret","code":"DDF","releaseDate":"2010-09-03"},{"name":"Scars of Mirrodin","code":"SOM","releaseDate":"2010-10-01"},{"name":"Premium Deck Series: Fire and Lightning","code":"PD2","releaseDate":"2010-11-19"},{"name":"Masters Edition IV","code":"ME4","releaseDate":"2011-01-10"},{"name":"Mirrodin Besieged","code":"MBS","releaseDate":"2011-02-04"},{"name":"Duel Decks: Knights vs. Dragons","code":"DDG","releaseDate":"2011-04-01"},{"name":"New Phyrexia","code":"NPH","releaseDate":"2011-05-13"},{"name":"Magic: The Gathering-Commander","code":"CMD","releaseDate":"2011-06-17"},{"name":"Magic 2012","code":"M12","releaseDate":"2011-07-15"},{"name":"From the Vault: Legends","code":"V11","releaseDate":"2011-08-26"},{"name":"Duel Decks: Ajani vs. Nicol Bolas","code":"DDH","releaseDate":"2011-09-02"},{"name":"Innistrad","code":"ISD","releaseDate":"2011-09-30"},{"name":"Premium Deck Series: Graveborn","code":"PD3","releaseDate":"2011-11-18"},{"name":"Dark Ascension","code":"DKA","releaseDate":"2012-02-03"},{"name":"Duel Decks: Venser vs. Koth","code":"DDI","releaseDate":"2012-03-30"},{"name":"Avacyn Restored","code":"AVR","releaseDate":"2012-05-04"},{"name":"Planechase 2012 Edition","code":"PC2","releaseDate":"2012-06-01"},{"name":"Magic 2013","code":"M13","releaseDate":"2012-07-13"},{"name":"From the Vault: Realms","code":"V12","releaseDate":"2012-08-31"},{"name":"Duel Decks: Izzet vs. Golgari","code":"DDJ","releaseDate":"2012-09-07"},{"name":"Return to Ravnica","code":"RTR","releaseDate":"2012-10-05"},{"name":"Commander's Arsenal","code":"CM1","releaseDate":"2012-11-02"},{"name":"Gatecrash","code":"GTC","releaseDate":"2013-02-01"},{"name":"Duel Decks: Sorin vs. Tibalt","code":"DDK","releaseDate":"2013-03-15"},{"name":"World Magic Cup Qualifiers","code":"pWCQ","releaseDate":"2013-04-06"},{"name":"Dragon's Maze","code":"DGM","releaseDate":"2013-05-03"},{"name":"Modern Masters","code":"MMA","releaseDate":"2013-06-07"},{"name":"Magic 2014 Core Set","code":"M14","releaseDate":"2013-07-19"},{"name":"From the Vault: Twenty","code":"V13","releaseDate":"2013-08-23"},{"name":"Duel Decks: Heroes vs. Monsters","code":"DDL","releaseDate":"2013-09-06"},{"name":"Theros","code":"THS","releaseDate":"2013-09-27"},{"name":"Commander 2013 Edition","code":"C13","releaseDate":"2013-11-01"},{"name":"Born of the Gods","code":"BNG","releaseDate":"2014-02-07"},{"name":"Duel Decks: Jace vs. Vraska","code":"DDM","releaseDate":"2014-03-14"},{"name":"Journey into Nyx","code":"JOU","releaseDate":"2014-05-02"},{"name":"Modern Event Deck 2014","code":"MD1","releaseDate":"2014-05-30"},{"name":"Magic: The Gathering—Conspiracy","code":"CNS","releaseDate":"2014-06-06"},{"name":"Vintage Masters","code":"VMA","releaseDate":"2014-06-16"},{"name":"Magic 2015 Core Set","code":"M15","releaseDate":"2014-07-18"},{"name":"From the Vault: Annihilation (2014)","code":"V14","releaseDate":"2014-08-22"},{"name":"Duel Decks: Speed vs. Cunning","code":"DDN","releaseDate":"2014-09-05"},{"name":"Khans of Tarkir","code":"KTK","releaseDate":"2014-09-26"},{"name":"Commander 2014","code":"C14","releaseDate":"2014-11-07"},{"name":"Duel Decks Anthology, Divine vs. Demonic","code":"DD3_DVD","releaseDate":"2014-12-05"},{"name":"Duel Decks Anthology, Elves vs. Goblins","code":"DD3_EVG","releaseDate":"2014-12-05"},{"name":"Duel Decks Anthology, Garruk vs. Liliana","code":"DD3_GVL","releaseDate":"2014-12-05"},{"name":"Duel Decks Anthology, Jace vs. Chandra","code":"DD3_JVC","releaseDate":"2014-12-05"},{"name":"Ugin's Fate promos","code":"FRF_UGIN","releaseDate":"2015-01-17"},{"name":"Fate Reforged","code":"FRF","releaseDate":"2015-01-23"},{"name":"Duel Decks: Elspeth vs. Kiora","code":"DDO","releaseDate":"2015-02-27"},{"name":"Dragons of Tarkir","code":"DTK","releaseDate":"2015-03-27"},{"name":"Tempest Remastered","code":"TPR","releaseDate":"2015-05-06"},{"name":"Modern Masters 2015 Edition","code":"MM2","releaseDate":"2015-05-22"}] \ No newline at end of file diff --git a/build.xml b/build.xml new file mode 100644 index 0000000..9d581a4 --- /dev/null +++ b/build.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ext/jackson-annotations-2.5.0.jar b/ext/jackson-annotations-2.5.0.jar deleted file mode 100644 index 6252131..0000000 Binary files a/ext/jackson-annotations-2.5.0.jar and /dev/null differ diff --git a/ext/jackson-core-2.5.3-sources.jar b/ext/jackson-core-2.5.3-sources.jar deleted file mode 100644 index 0e9ba46..0000000 Binary files a/ext/jackson-core-2.5.3-sources.jar and /dev/null differ diff --git a/ext/jackson-core-2.5.3.jar b/ext/jackson-core-2.5.3.jar deleted file mode 100644 index f3ae1ae..0000000 Binary files a/ext/jackson-core-2.5.3.jar and /dev/null differ diff --git a/ext/jackson-databind-2.5.3-sources.jar b/ext/jackson-databind-2.5.3-sources.jar deleted file mode 100644 index 06bd734..0000000 Binary files a/ext/jackson-databind-2.5.3-sources.jar and /dev/null differ diff --git a/ext/jackson-databind-2.5.3.jar b/ext/jackson-databind-2.5.3.jar deleted file mode 100644 index e217187..0000000 Binary files a/ext/jackson-databind-2.5.3.jar and /dev/null differ diff --git a/help b/help deleted file mode 100644 index 8fc3f8d..0000000 --- a/help +++ /dev/null @@ -1,45 +0,0 @@ -You are using Cardbasecli (Cardbase command line interface). -This tool is designed to facilitate adding and removing new cards as they are added to or removed from the physical collection. - - -Load a Cardbase - -To use, first make sure to load the cardbase by passing it as the first argument to the program, e.g. cardbasecli ~/mycardbase.cb. To start a new clean cardbase, simply run cardbasecli. - - -Adding Cards - -To add cards, first use "set" to enter the code of the set to which the card belongs, e.g. to add 2015 Core Set cards, enter "set M15". To see a list of all valid set codes, type "sets". -Once a set is selected, simply type the card's set number and it will be added to the collection. You may add more of the same card by typing in the same set number multiple times, or by specifying the quantity following the set number. - -For example, to add 3 M15 edition Shivan Dragons, do: - -> set m15 -> 281 3 - - -Removing Cards - -To remove cards, first choose a set and then type "remove" followed by the card's set number. To remove two "copies" of the same card, add the desired count after the card number. - -For example, to remove 2 of your 3 M15 Shivan Dragons, do: - -> set m15 -> remove 281 2 - - -Viewing the Cardbase - -Cardbasecli also offers some very basic commands to view the current state of the cardbase: glance, peruse and diff. - -glance: prints a list showing the amount of each card in the cardbase, by name. -peruse: prints the same list as glance, but with more information about each card. -diff: prints a concise list of added and remove cards and amounts, *since the last write*. - -Peruse optionally accepts a card number as an argument. If present, the card's entire information set is printed. - - -Committing Changes and Exiting - -Any changes made on this tool must be manually written to the file. If you make a mistake, simply exit and your cardbase will not be modified. To write changes, simply type "write". -To exit, simply type "exit". \ No newline at end of file diff --git a/lib/jackson-annotations-2.5.0.jar b/lib/jackson-annotations-2.5.0.jar new file mode 100644 index 0000000..6252131 Binary files /dev/null and b/lib/jackson-annotations-2.5.0.jar differ diff --git a/lib/jackson-core-2.5.3-sources.jar b/lib/jackson-core-2.5.3-sources.jar new file mode 100644 index 0000000..0e9ba46 Binary files /dev/null and b/lib/jackson-core-2.5.3-sources.jar differ diff --git a/lib/jackson-core-2.5.3.jar b/lib/jackson-core-2.5.3.jar new file mode 100644 index 0000000..f3ae1ae Binary files /dev/null and b/lib/jackson-core-2.5.3.jar differ diff --git a/lib/jackson-databind-2.5.3-sources.jar b/lib/jackson-databind-2.5.3-sources.jar new file mode 100644 index 0000000..06bd734 Binary files /dev/null and b/lib/jackson-databind-2.5.3-sources.jar differ diff --git a/lib/jackson-databind-2.5.3.jar b/lib/jackson-databind-2.5.3.jar new file mode 100644 index 0000000..e217187 Binary files /dev/null and b/lib/jackson-databind-2.5.3.jar differ diff --git a/res/help b/res/help new file mode 100644 index 0000000..2f41932 --- /dev/null +++ b/res/help @@ -0,0 +1,51 @@ +You are using Cardbasecli (Cardbase command line interface). +This tool is designed to facilitate adding and removing new cards as they are added to or removed from the physical collection. + +Loading a Cardbase + +To use, first make sure to load the cardbase by passing it as the first argument to the program, e.g. cardbasecli ~/mycardbase.cb. To start a new clean cardbase, run cardbasecli without arguments. + + +Adding Cards + +To add cards, first use "set" to enter the code of the set to which the card belongs, e.g. to add 2015 Core Set cards, enter "set M15". To see a list of all valid set codes, type "sets". +Once a set is selected, simply type the card's set number and it will be added to the collection. You may add more of the same card one at a time, or by specifying the quantity following the set number. + +For example, to add 3 M15 edition Shivan Dragons, do: + +> set m15 +> 281 3 + +Alternatively, pressing return immediately after adding a card repeats that action. If return was pressed one more time after the example above, three more Shivan Dragons would be added. This can be repeated indefinitely, but only works with card additions. + + +Removing Cards + +To remove cards, first choose a set and then type "remove" followed by the card's set number. To remove more of the same card, add the desired count after the card number. + +For example, to remove 2 of your 3 M15 Shivan Dragons, do: + +> set m15 +> remove 281 2 + +Note that it is only necessary to choose the set if it wasn't already selected. + + +Undo + +You may take back your last action by typing "undo". This only works for add and remove actions, and only if the set has not been changed since. Only the most recent action can be undone. + + +Viewing the Cardbase + +Cardbasecli also offers some very basic commands to view the current state of the cardbase: glance and peruse. + +glance: prints a list showing the amount of each card in the cardbase, by name. +peruse: prints the same list as glance, but with more information about each card. + +Peruse optionally accepts a card number as an argument. If present, only that card's information is printed. + + +Committing Changes and Exiting + +Any changes made on this tool must be manually written to the file. If you make a mistake, simply exit and your cardbase will not be modified. To write changes, use the "write" command. To save to a new file, type "write" followed by the file name (no spaces allowed). To exit, simply type "exit". diff --git a/shivandragon.json b/shivandragon.json deleted file mode 100644 index 231dde4..0000000 --- a/shivandragon.json +++ /dev/null @@ -1 +0,0 @@ -{"layout":"normal","type":"Creature — Dragon","types":["Creature"],"colors":["Red"],"multiverseid":383172,"name":"Shivan Dragon","subtypes":["Dragon"],"cmc":6,"rarity":"Rare","artist":"Donato Giancola","power":"5","toughness":"5","manaCost":"{4}{R}{R}","text":"Flying (This creature can't be blocked except by creatures with flying or reach.)\n{R}: Shivan Dragon gets +1/+0 until end of turn.","flavor":"The undisputed master of the mountains of Shiv.","number":"281","imageName":"shivan dragon","starter":true} diff --git a/src/eu/equalparts/cardbase/data/CardBase.java b/src/eu/equalparts/cardbase/data/CardBase.java deleted file mode 100644 index abdd423..0000000 --- a/src/eu/equalparts/cardbase/data/CardBase.java +++ /dev/null @@ -1,24 +0,0 @@ -package eu.equalparts.cardbase.data; - -import java.util.ArrayList; - -public class CardBase { - - public ArrayList cards = new ArrayList<>(); - public ArrayList decks = new ArrayList<>(); - - /** - * @param setCode - * @param number - * @return the card if found, else null. - */ - public Card getCardByNumber(String setCode, String number) { - for (Card card : cards) { - if (card.setCode.equals(setCode) && card.number.equals(number)) - return card; - } - - return null; - } - -} diff --git a/src/eu/equalparts/cardbase/data/CardBaseManager.java b/src/eu/equalparts/cardbase/data/CardBaseManager.java index 0baf9d7..d6a63dc 100644 --- a/src/eu/equalparts/cardbase/data/CardBaseManager.java +++ b/src/eu/equalparts/cardbase/data/CardBaseManager.java @@ -12,7 +12,7 @@ import eu.equalparts.cardbase.query.IO; public class CardBaseManager { private ArrayList metaSets; - public CardBase cardBase; + public Cardbase cardBase; /** * Parse a cardbase file and create an associated CardBase object. @@ -33,7 +33,7 @@ public class CardBaseManager { */ public CardBaseManager() throws JsonParseException, JsonMappingException, IOException { metaSets = IO.getAllMetaSets(); - cardBase = new CardBase(); + cardBase = new Cardbase(); } public ArrayList getAllMetaSets() { diff --git a/src/eu/equalparts/cardbase/data/Cardbase.java b/src/eu/equalparts/cardbase/data/Cardbase.java new file mode 100644 index 0000000..1c2aa12 --- /dev/null +++ b/src/eu/equalparts/cardbase/data/Cardbase.java @@ -0,0 +1,24 @@ +package eu.equalparts.cardbase.data; + +import java.util.ArrayList; + +public class Cardbase { + + public ArrayList cards = new ArrayList<>(); + public ArrayList decks = new ArrayList<>(); + + /** + * @param setCode + * @param number + * @return the card if found, else null. + */ + public Card getCardByNumber(String setCode, String number) { + for (Card card : cards) { + if (card.setCode.equals(setCode) && card.number.equals(number)) + return card; + } + + return null; + } + +} diff --git a/src/eu/equalparts/cardbase/query/IO.java b/src/eu/equalparts/cardbase/query/IO.java index 9b81b20..e913966 100644 --- a/src/eu/equalparts/cardbase/query/IO.java +++ b/src/eu/equalparts/cardbase/query/IO.java @@ -13,7 +13,7 @@ import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; -import eu.equalparts.cardbase.data.CardBase; +import eu.equalparts.cardbase.data.Cardbase; import eu.equalparts.cardbase.data.CardSet; import eu.equalparts.cardbase.data.MetaCardSet; @@ -59,8 +59,8 @@ public class IO { * @throws JsonMappingException * @throws IOException */ - public static CardBase readCardBase(File file) throws JsonParseException, JsonMappingException, IOException { - return mapper.readValue(file, CardBase.class); + public static Cardbase readCardBase(File file) throws JsonParseException, JsonMappingException, IOException { + return mapper.readValue(file, Cardbase.class); } /** @@ -72,7 +72,7 @@ public class IO { * @throws JsonMappingException * @throws IOException */ - public static void writeCardBase(File file, CardBase cardBase) throws JsonGenerationException, JsonMappingException, IOException { + public static void writeCardBase(File file, Cardbase cardBase) throws JsonGenerationException, JsonMappingException, IOException { mapper.writeValue(file, cardBase); } diff --git a/src/eu/equalparts/cardbase/query/Test.java b/src/eu/equalparts/cardbase/query/Test.java deleted file mode 100644 index e466c55..0000000 --- a/src/eu/equalparts/cardbase/query/Test.java +++ /dev/null @@ -1,70 +0,0 @@ -package eu.equalparts.cardbase.query; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.ObjectMapper; - -import eu.equalparts.cardbase.data.Card; -import eu.equalparts.cardbase.data.CardSet; - -public class Test { - -// public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException { -// ObjectMapper mapper = new ObjectMapper(); -// mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); -// -// @SuppressWarnings("unchecked") -// List allCards = getAllCards((Map) mapper -// .readValue(new File("AllSets.json"), new TypeReference>() {})); -// -// System.out.println("Number of cards: " + allCards.size()); -// } -// -// public static List getAllCards(Map sets) { -// List allCards = new ArrayList(); -// -// for (CardSet set : sets.values()) { -// for (Card card : set.getCards()) { -// card.setSetCode(set.getCode()); -// card.setSetName(set.getName()); -// // System.out.println(set.getName() + ": " + card.getName()); -// -// allCards.add(card); -// } -// } -// -// return allCards; -// } - - public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException { - ObjectMapper mapper = new ObjectMapper(); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - -// @SuppressWarnings("unchecked") - CardSet set = mapper.readValue(new File("M15.json"), CardSet.class); - System.out.println(set.getCardByNumber("281").name); - - } - - public static List getAllCards(Map sets) { - List allCards = new ArrayList(); - - for (CardSet set : sets.values()) { - for (Card card : set.cards) { - card.setCode = set.code; - // System.out.println(set.getName() + ": " + card.getName()); - - allCards.add(card); - } - } - - return allCards; - } -} diff --git a/src/eu/equalparts/cardbase/standalone/CardBaseCLI.java b/src/eu/equalparts/cardbase/standalone/CardBaseCLI.java deleted file mode 100644 index d0503ac..0000000 --- a/src/eu/equalparts/cardbase/standalone/CardBaseCLI.java +++ /dev/null @@ -1,275 +0,0 @@ -package eu.equalparts.cardbase.standalone; - -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.MalformedURLException; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Scanner; - -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.databind.JsonMappingException; - -import eu.equalparts.cardbase.data.Card; -import eu.equalparts.cardbase.data.CardBaseManager; -import eu.equalparts.cardbase.data.CardSet; -import eu.equalparts.cardbase.data.MetaCardSet; -import eu.equalparts.cardbase.query.IO; - -/** - * This provides a lightweight CLI for interacting with cardbase files. - * - */ -public class CardBaseCLI { - - private static CardSet selectedSet = null; - private static HashMap setCache = new HashMap(); - private static CardBaseManager cbm; - private static boolean exit = false; - private static String help = "No help file was found"; - private static File cardBaseFile; - - /** - * Execute the interface. - * - * @param args the first argument is the cardbase file. Further arguments are ignored. - */ - public static void main(String... args) { - - System.out.println("Welcome to cardbase"); - - try { - // construct the cardbase - if (args.length > 0) { - cardBaseFile = new File(args[0]); - if (cardBaseFile.exists() && cardBaseFile.isFile() && cardBaseFile.canRead()) { - System.out.println("Loading cardbase from " + args[0]); - cbm = new CardBaseManager(cardBaseFile); - } else { - System.out.println(args[0] + " appears to be invalid"); - System.exit(0); - } - } else { - //System.out.println("No cardbase file was provided, initialising a clean cardbase"); - System.out.println("Loading testbase for debugging purposes"); - cardBaseFile = new File("testbase"); - cbm = new CardBaseManager(cardBaseFile); - } - - // initialise necessary components - System.out.println("Fetching card sets from upstream"); - BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - - System.out.println("Loading externals"); - File helpFile = new File("help"); - if (helpFile.exists() && helpFile.canRead()) { - help = new Scanner(helpFile).useDelimiter("\\Z").next(); - } else { - System.out.println("Help file is not available, I hope you know how to use the program!"); - } - - while (!exit) { - System.out.print(selectedSet == null ? "> " : selectedSet.code + " > "); - String rawInput = br.readLine().trim().toLowerCase(); - String[] commands = rawInput.split("[ \t]+"); - - parse(commands); - } - - } catch (JsonParseException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (JsonMappingException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - } - - private static void parse(String[] commands) throws JsonParseException, JsonMappingException, MalformedURLException, IOException { - if (commands.length > 0) { - switch (commands[0]) { - /* - * Show help - */ - case "help": - System.out.println(help); - break; - - /* - * Write current CardBase to file - */ - case "write": - if (commands.length > 1) { - File output = new File(commands[1]); - if (output.exists()) { - if(output.isFile()) { - if (output.canWrite()) { - IO.writeCardBase(output, cbm.cardBase); - cardBaseFile = output; - System.out.println("Cardbase saved to " + output.getAbsolutePath()); - } else { - System.out.println(commands[1] + " cannot be written to, nothing was written"); - } - } else { - System.out.println(commands[1] + " is not a file, nothing was written"); - } - } else { - System.out.println(commands[1] + " does not exist, nothing was written"); - } - } else if (cardBaseFile != null) { - System.out.println("Writing to " + cardBaseFile.getAbsolutePath()); - } else { - System.out.println("Please provide a file name"); - } - break; - - /* - * Exit procedures - */ - case "exit": - exit = true; - break; - - /* - * Print a list of valid set codes - */ - case "sets": - for (MetaCardSet mcs : cbm.getAllMetaSets()) { - System.out.println(mcs); - } - break; - - /* - * Select a set, any card numbers provided will be fetched from that set - */ - case "set": - for (MetaCardSet mcs : cbm.getAllMetaSets()) { - if (mcs.code.equalsIgnoreCase(commands[1])) { - // if the set is cached, use that - if (setCache.containsKey(mcs.code)) { - selectedSet = setCache.get(mcs.code); - } else { - selectedSet = IO.getCardSet(mcs.code); - setCache.put(mcs.code, selectedSet); - } - System.out.println("Selected set: " + mcs.name); - return; - } - } - System.out.println(commands[1] + " does not correspond to any set (use \"sets\" to see all valid set codes)"); - break; - - /* - * Print a brief list of the complete cardbase. - */ - case "glance": - for (Iterator i = cbm.cardIterator(); i.hasNext();) { - printGlance(i.next()); - } - break; - - /* - * Print a detailed information of a single card or the whole cardbase. - */ - case "peruse": - if (commands.length > 1) { - if (selectedSet != null) { - Card card = cbm.getCard(selectedSet.code, commands[1]); - if (card != null) { - printPerusal(card); - } else { - System.out.println("Card not in cardbase"); - } - } else { - System.out.println("Please select a set before perusing a specific card"); - } - } else { - for (Iterator i = cbm.cardIterator(); i.hasNext();) { - printPerusal(i.next()); - } - } - break; - - /* - * Remove one or more cards - */ - case "remove": - if (selectedSet != null) { - if (commands.length > 1) { - Card remove = selectedSet.getCardByNumber(commands[1]); - if (remove != null) { - Integer count = 1; - if (commands.length > 2 && commands[2].matches("[0-9]+")) { - count = Integer.valueOf(commands[2]); - if (count <= 0) { - System.out.println("Can't remove " + count + " cards"); - return; - } - } - cbm.removeCard(remove, count); - System.out.println("Removed " + count + "x " + remove.name); - } else { - System.out.println(commands[1] + " does not correspond to a card in " + selectedSet.name); - } - } else { - System.out.println("Please specify a card number to remove"); - } - } else { - System.out.println("Select a set before removing cards."); - } - break; - - /* - * Add one or more cards - */ - default: - if (selectedSet != null) { - Card newCard = selectedSet.getCardByNumber(commands[0]); - if (newCard != null) { - Integer count = 1; - if (commands.length > 1 && commands[1].matches("[0-9]+")) { - count = Integer.valueOf(commands[1]); - if (count <= 0) { - System.out.println("Can't add " + count + " cards"); - return; - } - } - newCard.setCode = selectedSet.code; - cbm.addCard(newCard, count); - System.out.println("Added " + count + "x " + newCard.name); - } else { - System.out.println(commands[0] + " does not correspond to a card in " + selectedSet.name); - } - } else { - System.out.println("Select a set before adding cards."); - } - break; - } - } - } - - private static void printPerusal(Card card) { - printGlance(card); - if (card.type != null) System.out.println("\t" + card.type); - if (card.manaCost != null) System.out.println("\tCost: " + card.manaCost); - if (card.power != null && card.toughness != null) System.out.println("\t" + card.power + "/" + card.toughness); - if (card.loyalty != null) System.out.println("\tLoyalty: " + card.loyalty); - - if (card.text != null) System.out.println("\t" + card.text.replaceAll("\n", "\n\t")); - if (card.flavor != null) System.out.println("\t" + card.flavor.replaceAll("\n", "\n\t")); - - if (card.rarity != null) System.out.println("\t" + card.rarity); - if (card.multiverseid != null) System.out.println("\tMID: " + card.multiverseid); - if (card.artist != null) System.out.println("\tIllus. " + card.artist); - } - - private static void printGlance(Card card) { - System.out.println(String.format("%1$-4d %2$s (%3$s, %4$s)", card.count, card.name, card.setCode, card.number)); - } -} diff --git a/src/eu/equalparts/cardbase/standalone/CardbaseCLI.java b/src/eu/equalparts/cardbase/standalone/CardbaseCLI.java new file mode 100644 index 0000000..c19bc08 --- /dev/null +++ b/src/eu/equalparts/cardbase/standalone/CardbaseCLI.java @@ -0,0 +1,341 @@ +package eu.equalparts.cardbase.standalone; + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.MalformedURLException; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Scanner; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; + +import eu.equalparts.cardbase.data.Card; +import eu.equalparts.cardbase.data.CardBaseManager; +import eu.equalparts.cardbase.data.CardSet; +import eu.equalparts.cardbase.data.MetaCardSet; +import eu.equalparts.cardbase.query.IO; + +/** + * This provides a lightweight CLI for interacting with cardbase files. + * + */ +public class CardbaseCLI { + + private enum LastAction { + ADD, REMOVE; + public Integer count; + public Card card; + + public void set(Card card, Integer count) { + this.card = card; + this.count = count; + } + + } + private static LastAction lastAction = null; + + private static CardSet selectedSet = null; + private static HashMap setCache = new HashMap(); + private static CardBaseManager cbm; + private static boolean exit = false; + private static String help = "No help file was found"; + private static File cardBaseFile = null; + private static boolean savePrompt = false; + + /** + * Execute the interface. + * + * @param args the first argument is the cardbase file. Further arguments are ignored. + */ + public static void main(String... args) { + + System.out.println("Welcome to cardbase"); + + try { + // construct the cardbase + if (args.length > 0) { + cardBaseFile = new File(args[0]); + if (cardBaseFile.exists() && cardBaseFile.isFile() && cardBaseFile.canRead()) { + System.out.println("Loading cardbase from " + args[0]); + cbm = new CardBaseManager(cardBaseFile); + } else { + System.out.println(args[0] + " appears to be invalid"); + System.exit(0); + } + } else { + System.out.println("No cardbase file was provided, initialising a clean cardbase"); + cbm = new CardBaseManager(); + } + + // initialise necessary components + System.out.println("Fetching card sets from upstream"); + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + System.out.println("Loading externals"); + InputStream is = CardbaseCLI.class.getResourceAsStream("/help"); + if (is != null) { + help = new Scanner(is).useDelimiter("\\Z").next(); + } else { + System.out.println("Help file is not available, I hope you know how to use the program!"); + } + + while (!exit) { + System.out.print(selectedSet == null ? "> " : selectedSet.code + " > "); + String rawInput = br.readLine().trim().toLowerCase(); + String[] commands = rawInput.split("[ \t]+"); + + parse(commands); + } + + } catch (JsonParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (JsonMappingException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + + private static void parse(String[] commands) throws JsonParseException, JsonMappingException, MalformedURLException, IOException { + if (commands.length > 0) { + switch (commands[0]) { + /* + * Show help + */ + case "help": + System.out.println(help); + break; + + /* + * Write current CardBase to file + */ + case "write": + File output; + + if (commands.length > 1) { + output = new File(sanitiseFileName(commands[1])); + } else { + output = cardBaseFile; + } + + if (output != null) { + if (output.exists() && (!output.isFile() || !output.canWrite())) { + System.out.println("Could not write to " + output.getAbsolutePath()); + return; + } + + IO.writeCardBase(output, cbm.cardBase); + cardBaseFile = output; + System.out.println("Cardbase was saved to " + output.getAbsolutePath()); + savePrompt = false; + } else { + System.out.println("Please provide a file name"); + } + break; + + /* + * Exit procedures + */ + case "exit": + if (savePrompt) { + System.out.println("Don't forget to save. If you really wish to quit without saving, type exit again."); + savePrompt = false; + } else { + exit = true; + } + break; + + /* + * Print a list of valid set codes + */ + case "sets": + for (MetaCardSet mcs : cbm.getAllMetaSets()) { + System.out.println(mcs); + } + break; + + /* + * Select a set, any card numbers provided will be fetched from that set + */ + case "set": + for (MetaCardSet mcs : cbm.getAllMetaSets()) { + if (mcs.code.equalsIgnoreCase(commands[1])) { + // if the set is cached, use that + if (setCache.containsKey(mcs.code)) { + selectedSet = setCache.get(mcs.code); + } else { + selectedSet = IO.getCardSet(mcs.code); + setCache.put(mcs.code, selectedSet); + } + System.out.println("Selected set: " + mcs.name); + lastAction = null; + return; + } + } + System.out.println(commands[1] + " does not correspond to any set (use \"sets\" to see all valid set codes)"); + break; + + /* + * Print a brief list of the complete cardbase. + */ + case "glance": + Card current; + int total = 0; + for (Iterator i = cbm.cardIterator(); i.hasNext();) { + current = i.next(); + printGlance(current); + total += current.count; + } + System.out.println("Total: " + total); + break; + + /* + * Print a detailed information of a single card or the whole cardbase. + */ + case "peruse": + if (commands.length > 1) { + if (selectedSet != null) { + Card card = cbm.getCard(selectedSet.code, commands[1]); + if (card != null) { + printPerusal(card); + } else { + System.out.println("Card not in cardbase"); + } + } else { + System.out.println("Please select a set before perusing a specific card"); + } + } else { + for (Iterator i = cbm.cardIterator(); i.hasNext();) { + printPerusal(i.next()); + } + } + break; + + /* + * Undo previous action. + */ + case "undo": + if (lastAction != null) { + if (lastAction == LastAction.ADD) { + remove(lastAction.card, lastAction.count); + } else if (lastAction == LastAction.REMOVE) { + add(lastAction.card, lastAction.count); + } + lastAction = null; + } else { + System.out.println("Nothing to undo"); + } + break; + + /* + * Remove one or more cards + */ + case "remove": + if (selectedSet != null) { + if (commands.length > 1) { + Card remove = selectedSet.getCardByNumber(commands[1]); + if (remove != null) { + Integer count = 1; + if (commands.length > 2 && commands[2].matches("[0-9]+")) { + count = Integer.valueOf(commands[2]); + if (count <= 0) { + System.out.println("Can't remove " + count + " cards"); + return; + } + } + remove(remove, count); + } else { + System.out.println(commands[1] + " does not correspond to a card in " + selectedSet.name); + } + } else { + System.out.println("Please specify a card number to remove"); + } + } else { + System.out.println("Select a set before removing cards."); + } + break; + + /* + * Add one or more cards + */ + default: + if (selectedSet != null) { + if (commands.length == 1 && commands[0].isEmpty()) { + if (lastAction == LastAction.ADD) + add(lastAction.card, lastAction.count); + } else { + Card newCard = selectedSet.getCardByNumber(commands[0]); + if (newCard != null) { + Integer count = 1; + if (commands.length > 1 && commands[1].matches("[0-9]+")) { + count = Integer.valueOf(commands[1]); + if (count <= 0) { + System.out.println("Can't add " + count + " cards"); + return; + } + } + add(newCard, count); + } else { + System.out.println(commands[0] + " does not correspond to a card in " + selectedSet.name); + } + } + } else { + System.out.println("Select a set before adding cards."); + } + break; + } + } + } + + private static void add(Card card, Integer count) { + card.setCode = selectedSet.code; + cbm.addCard(card, count); + System.out.println("Added " + count + "x " + card.name); + savePrompt = true; + lastAction = LastAction.ADD; + lastAction.set(card, count); + } + + private static void remove(Card card, Integer count) { + cbm.removeCard(card, count); + System.out.println("Removed " + count + "x " + card.name); + savePrompt = true; + lastAction = LastAction.REMOVE; + lastAction.set(card, count); + } + + private static String sanitiseFileName(String name) { + name = name.replaceAll("[^-_.A-Za-z0-9]", ""); + if (!name.endsWith(".cb")) { + name = name.concat(".cb"); + } + return name; + } + + private static void printPerusal(Card card) { + printGlance(card); + if (card.type != null) System.out.println("\t" + card.type); + if (card.manaCost != null) System.out.println("\tCost: " + card.manaCost); + if (card.power != null && card.toughness != null) System.out.println("\t" + card.power + "/" + card.toughness); + if (card.loyalty != null) System.out.println("\tLoyalty: " + card.loyalty); + + if (card.text != null) System.out.println("\t" + card.text.replaceAll("\n", "\n\t")); + if (card.flavor != null) System.out.println("\t" + card.flavor.replaceAll("\n", "\n\t")); + + if (card.rarity != null) System.out.println("\t" + card.rarity); + if (card.multiverseid != null) System.out.println("\tMID: " + card.multiverseid); + if (card.artist != null) System.out.println("\tIllus. " + card.artist); + } + + private static void printGlance(Card card) { + System.out.println(String.format("%1$-4d %2$s (%3$s, %4$s)", card.count, card.name, card.setCode, card.number)); + } +} diff --git a/testbase b/testbase deleted file mode 100644 index 4e1e6f4..0000000 --- a/testbase +++ /dev/null @@ -1 +0,0 @@ -{"cards":[{"layout":"normal","name":"Divination","names":null,"manaCost":"{2}{U}","cmc":3,"colors":["Blue"],"type":"Sorcery","supertypes":null,"types":["Sorcery"],"subtypes":null,"rarity":"Common","text":"Draw two cards.","flavor":"\"The key to unlocking this puzzle is within you.\"\n—Doriel, mentor of Mistral Isle","artist":"Howard Lyon","number":"52","power":null,"toughness":null,"loyalty":null,"multiverseid":383227,"variations":null,"imageName":"divination","border":null,"watermark":null,"setCode":"M15","count":1},{"layout":"normal","name":"Soulmender","names":null,"manaCost":"{W}","cmc":1,"colors":["White"],"type":"Creature — Human Cleric","supertypes":null,"types":["Creature"],"subtypes":["Human","Cleric"],"rarity":"Common","text":"{T}: You gain 1 life.","flavor":"\"Healing is more art than magic. Well, there is still quite a bit of magic.\"","artist":"James Ryman","number":"35","power":"1","toughness":"1","loyalty":null,"multiverseid":383393,"variations":null,"imageName":"soulmender","border":null,"watermark":null,"setCode":"M15","count":1},{"layout":"normal","name":"Amphin Pathmage","names":null,"manaCost":"{3}{U}","cmc":4,"colors":["Blue"],"type":"Creature — Salamander Wizard","supertypes":null,"types":["Creature"],"subtypes":["Salamander","Wizard"],"rarity":"Common","text":"{2}{U}: Target creature can't be blocked this turn.","flavor":"\"There are those who do not believe in the existence of the amphin. This seems somehow to be of their own design.\"\n—Gor Muldrak, Cryptohistories","artist":"Mark Winters","number":"45","power":"3","toughness":"2","loyalty":null,"multiverseid":383183,"variations":null,"imageName":"amphin pathmage","border":null,"watermark":null,"setCode":"M15","count":1},{"layout":"normal","name":"Seek the Horizon","names":null,"manaCost":"{3}{G}","cmc":4,"colors":["Green"],"type":"Sorcery","supertypes":null,"types":["Sorcery"],"subtypes":null,"rarity":"Uncommon","text":"Search your library for up to three basic land cards, reveal them, and put them into your hand. Then shuffle your library.","flavor":"The Temur call the flickering lights the Path of Whispers, believing that they lead the way to ancestral knowledge.","artist":"Min Yum","number":"150","power":null,"toughness":null,"loyalty":null,"multiverseid":386659,"variations":null,"imageName":"seek the horizon","border":null,"watermark":null,"setCode":"KTK","count":3},{"layout":"normal","name":"Bitter Revelation","names":null,"manaCost":"{3}{B}","cmc":4,"colors":["Black"],"type":"Sorcery","supertypes":null,"types":["Sorcery"],"subtypes":null,"rarity":"Common","text":"Look at the top four cards of your library. Put two of them into your hand and the rest into your graveyard. You lose 2 life.","flavor":"\"Here you lie then, Ugin. The corpses of worlds will join you in the tomb.\"\n—Sorin Markov","artist":"Viktor Titov","number":"65","power":null,"toughness":null,"loyalty":null,"multiverseid":386489,"variations":null,"imageName":"bitter revelation","border":null,"watermark":null,"setCode":"KTK","count":2}],"decks":[]} \ No newline at end of file diff --git a/todo b/todo new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/todo @@ -0,0 +1 @@ + -- cgit v1.2.3