From 4635563f4447d95840c67d0800bb65475dfe9ed5 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Thu, 6 Jun 2024 22:10:46 +0400 Subject: [PATCH] images: deleted outdated/closed images sources (closes #5767) --- .../sources/AltMtgOnlTokensImageSource.java | 172 ---- .../card/dl/sources/MagidexImageSource.java | 304 ------- .../dl/sources/MtgOnlTokensImageSource.java | 379 --------- .../dl/sources/MythicspoilerComSource.java | 466 ----------- .../card/dl/sources/ScryfallImageSource.java | 2 +- .../dl/sources/ScryfallImageSourceSmall.java | 5 + .../card/dl/sources/TokensMtgImageSource.java | 317 -------- .../card/images/DownloadPicturesService.java | 17 +- .../main/resources/tokens-mtg-onl-list.csv | 764 ------------------ .../client/game/TokensMtgImageSourceTest.java | 33 - 10 files changed, 12 insertions(+), 2447 deletions(-) delete mode 100644 Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/AltMtgOnlTokensImageSource.java delete mode 100644 Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MagidexImageSource.java delete mode 100644 Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MtgOnlTokensImageSource.java delete mode 100644 Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MythicspoilerComSource.java delete mode 100644 Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/TokensMtgImageSource.java delete mode 100644 Mage.Client/src/main/resources/tokens-mtg-onl-list.csv delete mode 100644 Mage.Client/src/test/java/mage/client/game/TokensMtgImageSourceTest.java diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/AltMtgOnlTokensImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/AltMtgOnlTokensImageSource.java deleted file mode 100644 index b001e9818aec..000000000000 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/AltMtgOnlTokensImageSource.java +++ /dev/null @@ -1,172 +0,0 @@ -package org.mage.plugins.card.dl.sources; - -import org.apache.log4j.Logger; -import org.mage.plugins.card.dl.DownloadServiceInfo; -import org.mage.plugins.card.images.CardDownloadData; - -import java.io.IOException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * * TODO: web site reworked and tokens doesn't work anymore, - * * but it can be used to download a proxy tokens (tokens that was miss by wizards), - * * see https://www.mtg.onl/mtg-missing-tokens/ - * - * @author spjspj - */ -public enum AltMtgOnlTokensImageSource implements CardImageSource { - - instance; - private static final Logger logger = Logger.getLogger(AltMtgOnlTokensImageSource.class); - private static int maxTimes = 0; - - @Override - public String getSourceName() { - return "http://alternative.mtg.onl/tokens/"; - } - - @Override - public float getAverageSize() { - return 26.7f; - } - - @Override - public String getNextHttpImageUrl() { - if (copyUrlToImage == null) { - setupLinks(); - } - - for (String key : copyUrlToImageDone.keySet()) { - if (copyUrlToImageDone.get(key) < maxTimes) { - copyUrlToImageDone.put(key, maxTimes); - return key; - } - } - if (maxTimes < 2) { - maxTimes++; - } - for (String key : copyUrlToImageDone.keySet()) { - if (copyUrlToImageDone.get(key) < maxTimes) { - copyUrlToImageDone.put(key, maxTimes); - return key; - } - } - return null; - } - - @Override - public String getFileForHttpImage(String httpImageUrl) { - if (httpImageUrl != null) { - return copyUrlToImage.get(httpImageUrl); - } - return null; - } - - @Override - public boolean prepareDownloadList(DownloadServiceInfo downloadServiceInfo, List downloadList) { - return true; - } - - @Override - public CardImageUrls generateCardUrl(CardDownloadData card) throws Exception { - return null; - } - - Map copyUrlToImage = null; - Map copyImageToUrl = null; - Map copyUrlToImageDone = null; - - private void setupLinks() { - if (copyUrlToImage != null) { - return; - } - copyUrlToImage = new HashMap<>(); - copyImageToUrl = new HashMap<>(); - copyUrlToImageDone = new HashMap<>(); - - copyUrlToImage.put("SCG_CC_002-Penguin.jpg", "BIRD.WU.BIRD.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("SCG_CC_005-Vampire.jpg", "VAMPIRE.B.VAMPIRE.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("SCG_CC_006-Panda.jpg", "BEAR.G.BEAR.CREATURE.2.2.full.jpg"); - copyUrlToImage.put("SCG_CC_008-Force-of-Squirrel.jpg", "SQUIRREL.G.SQUIRREL.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("SCG_CC_013-Zombie.jpg", "ZOMBIE.B.ZOMBIE.CREATURE.2.2.full.jpg"); - copyUrlToImage.put("SCG_GN_003-Ooze.jpg", "OOZE.G.OOZE.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("SCG_GN_005-Mammoth.jpg", "ELEPHANT.G.ELEPHANT.CREATURE.3.3.full.jpg"); - copyUrlToImage.put("SCG_GN_006-Wurm.jpg", "WURM.G.WURM.CREATURE.5.5.full.jpg"); - copyUrlToImage.put("SCG_GN_007-Rat.jpg", "RAT.B.RAT.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("SCG_GN_010-Wolf.jpg", "WOLF.G.WOLF.CREATURE.2.2.full.jpg"); - copyUrlToImage.put("SCG_GN_011-Bee.jpg", "INSECT.G.INSECT.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("SCG_GN_012-Bunny.jpg", "RABBIT.G.RABBIT.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("SCG_GN_013-Piglet.jpg", "BOAR.G.BOAR.CREATURE.2.2.full.jpg"); - copyUrlToImage.put("SCG_GN_014-Monkey.jpg", "APE.G.APE.CREATURE.3.3.full.jpg"); - copyUrlToImage.put("SCG_GN_015-Kraken.jpg", "KRAKEN.U.KRAKEN.CREATURE.9.9.full.jpg"); - copyUrlToImage.put("SCG_GN_016-Hippo.jpg", "HIPPO.G.HIPPO.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("SCG_GN_019-Reindeer.jpg", "CARIBOU.W.CARIBOU.CREATURE.0.1.full.jpg"); - copyUrlToImage.put("SCG_GN_020-Grizzlybrand.jpg", "DEMON.B.DEMON.CREATURE.5.5.full.jpg"); - copyUrlToImage.put("SCG_IP_002-Elemental.jpg", "ELEMENTAL.BR.ELEMENTAL.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("SCG_IP_003-Soldier.jpg", "SOLDIER.W.SOLDIER.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("SCG_IP_005-Spirit.jpg ", "SPIRIT.W.SPIRIT.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("SCG_IP_010-Golem.jpg", "GOLEM..GOLEM.ARTIFACTCREATURE.3.3.full.jpg"); - copyUrlToImage.put("SCG_IP_011-Pegasus.jpg", "PEGASUS.W.PEGASUS.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("SCG_IP_012-Soldier.jpg", "SOLDIER.WR.SOLDIER.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("SCG_IP_016-Rhino.jpg", "RHINO.G.RHINO.CREATURE.4.4.full.jpg"); - copyUrlToImage.put("SCG_IP_017-Spider.jpg", "SPIDER.B.SPIDER.CREATURE.1.2.full.jpg"); - copyUrlToImage.put("SCG_PO_003-Spirit.jpg", "SPIRIT..SPIRIT.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("SCG_PO_007-Dragon.jpg", "DRAGON.R.DRAGON.CREATURE.2.2.full.jpg"); - copyUrlToImage.put("SCG_PO_009-Faerie.jpg", "FAERIE.U.FAERIE.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("SCG_PO_010-Goblin.jpg", "GOBLIN.R.GOBLIN.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("SCG_P_001-Angel.jpg", "ANGEL.W.ANGEL.CREATURE.4.4.full.jpg"); - copyUrlToImage.put("SCG_P_002-Penguin.jpg", "BIRD.W.BIRD.CREATURE.3.4.full.jpg"); - copyUrlToImage.put("SCG_RC_001-Kitten.jpg", "CAT.B.CAT.CREATURE.2.1.full.jpg"); - copyUrlToImage.put("SCG_RC_002-Penguin.jpg", "BIRD.U.BIRD.CREATURE.2.2.full.jpg"); - copyUrlToImage.put("SCG_RC_009-Aia,-Ascended.jpg", "AVATAR.W.AVATAR.CREATURE.S.S.full.jpg"); - copyUrlToImage.put("SCG_SC_001-Cyclops.jpg", "BEAST.G.BEAST.CREATURE.3.3.full.jpg"); - copyUrlToImage.put("SCG_SC_002-Soldier.jpg", "SOLDIER.R.SOLDIER.CREATURE.1.1.full.jpg"); - - - for (String key : copyUrlToImage.keySet()) { - copyUrlToImageDone.put(key, maxTimes); - copyImageToUrl.put(copyUrlToImage.get(key), key); - } - } - - @Override - public CardImageUrls generateTokenUrl(CardDownloadData card) throws IOException { - if (copyUrlToImage == null) { - setupLinks(); - } - return null; - } - - @Override - public int getTotalImages() { - if (copyUrlToImage == null) { - setupLinks(); - } - if (copyUrlToImage != null) { - return copyImageToUrl.size(); - } - return -1; - } - - @Override - public boolean isTokenSource() { - return true; - } - - @Override - public boolean isCardSource() { - return false; - } - - @Override - public void doPause(String httpImageUrl) { - } - - @Override - public boolean isCardImageProvided(String setCode, String cardName) { - // no cards support, only tokens - return false; - } -} diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MagidexImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MagidexImageSource.java deleted file mode 100644 index 52254cfc41e9..000000000000 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MagidexImageSource.java +++ /dev/null @@ -1,304 +0,0 @@ -package org.mage.plugins.card.dl.sources; - -import org.mage.plugins.card.dl.DownloadServiceInfo; -import org.mage.plugins.card.images.CardDownloadData; - -import java.net.URI; -import java.util.*; - -/** - * @author Pete Rossi - */ -public enum MagidexImageSource implements CardImageSource { - instance; - - private final Set supportedSets; - - MagidexImageSource() { - supportedSets = new LinkedHashSet<>(); - // supportedSets.add("JR"); // TODO: Set was split into the individual sets as listed on Scryfall - supportedSets.add("LEA"); - supportedSets.add("LEB"); - supportedSets.add("2ED"); - supportedSets.add("ARN"); - supportedSets.add("ATQ"); - supportedSets.add("3ED"); - supportedSets.add("LEG"); - supportedSets.add("DRK"); - supportedSets.add("FEM"); - supportedSets.add("4ED"); - supportedSets.add("ICE"); - supportedSets.add("CHR"); - supportedSets.add("HML"); - supportedSets.add("ALL"); - supportedSets.add("MIR"); - supportedSets.add("VIS"); - supportedSets.add("5ED"); - supportedSets.add("POR"); - supportedSets.add("WTH"); - supportedSets.add("TMP"); - supportedSets.add("STH"); - supportedSets.add("EXO"); - supportedSets.add("P02"); - supportedSets.add("UGL"); - supportedSets.add("USG"); - supportedSets.add("DD3DVD"); - supportedSets.add("DD3EVG"); - supportedSets.add("DD3GVL"); - supportedSets.add("DD3JVC"); - - supportedSets.add("ULG"); - supportedSets.add("6ED"); - supportedSets.add("UDS"); - supportedSets.add("PTK"); - supportedSets.add("S99"); - supportedSets.add("MMQ"); - // supportedSets.add("BRB");Battle Royale Box Set - supportedSets.add("NEM"); - supportedSets.add("S00"); - supportedSets.add("PCY"); - supportedSets.add("INV"); - // supportedSets.add("BTD"); // Beatdown Boxset - supportedSets.add("PLS"); - supportedSets.add("7ED"); - supportedSets.add("APC"); - supportedSets.add("ODY"); - // supportedSets.add("DKM"); // Deckmasters 2001 - supportedSets.add("TOR"); - supportedSets.add("JUD"); - supportedSets.add("ONS"); - supportedSets.add("LGN"); - supportedSets.add("SCG"); - supportedSets.add("8ED"); - supportedSets.add("MRD"); - supportedSets.add("DST"); - supportedSets.add("5DN"); - supportedSets.add("CHK"); - supportedSets.add("UNH"); - supportedSets.add("BOK"); - supportedSets.add("SOK"); - supportedSets.add("9ED"); - supportedSets.add("RAV"); - supportedSets.add("GPT"); - supportedSets.add("DIS"); - supportedSets.add("CSP"); - supportedSets.add("TSP"); - supportedSets.add("TSB"); - supportedSets.add("PLC"); - supportedSets.add("FUT"); - supportedSets.add("10E"); - supportedSets.add("MED"); - supportedSets.add("LRW"); - supportedSets.add("EVG"); - supportedSets.add("MOR"); - supportedSets.add("SHM"); - supportedSets.add("EVE"); - supportedSets.add("DRB"); - supportedSets.add("ME2"); - supportedSets.add("ALA"); - supportedSets.add("DD2"); - supportedSets.add("CON"); - supportedSets.add("DDC"); - supportedSets.add("ARB"); - supportedSets.add("M10"); - // supportedSets.add("TD0"); // Magic Online Deck Series - supportedSets.add("V09"); - supportedSets.add("HOP"); - supportedSets.add("ME3"); - supportedSets.add("ZEN"); - supportedSets.add("DDD"); - supportedSets.add("H09"); - supportedSets.add("WWK"); - supportedSets.add("DDE"); - supportedSets.add("ROE"); - supportedSets.add("DPA"); - supportedSets.add("ARC"); - supportedSets.add("M11"); - supportedSets.add("V10"); - supportedSets.add("DDF"); - supportedSets.add("SOM"); - // supportedSets.add("TD0"); // Commander Theme Decks - supportedSets.add("PD2"); - supportedSets.add("ME4"); - supportedSets.add("MBS"); - supportedSets.add("DDG"); - supportedSets.add("NPH"); - supportedSets.add("CMD"); - supportedSets.add("M12"); - supportedSets.add("V11"); - supportedSets.add("DDH"); - supportedSets.add("ISD"); - supportedSets.add("PD3"); - supportedSets.add("DKA"); - supportedSets.add("DDI"); - supportedSets.add("AVR"); - supportedSets.add("PC2"); - supportedSets.add("M13"); - supportedSets.add("V12"); - supportedSets.add("DDJ"); - supportedSets.add("RTR"); - supportedSets.add("CM1"); - // supportedSets.add("TD2"); // Duel Decks: Mirrodin Pure vs. New Phyrexia - supportedSets.add("GTC"); - supportedSets.add("DDK"); - supportedSets.add("DGM"); - supportedSets.add("MMA"); - supportedSets.add("M14"); - supportedSets.add("V13"); - supportedSets.add("DDL"); - supportedSets.add("THS"); - supportedSets.add("C13"); - supportedSets.add("BNG"); - supportedSets.add("DDM"); - supportedSets.add("JOU"); - // supportedSets.add("MD1"); // Modern Event Deck - supportedSets.add("CNS"); - supportedSets.add("VMA"); - supportedSets.add("M15"); - supportedSets.add("V14"); - supportedSets.add("DDN"); - supportedSets.add("KTK"); - supportedSets.add("C14"); - // supportedSets.add("DD3"); // Duel Decks Anthology - supportedSets.add("FRF"); - supportedSets.add("DDO"); - supportedSets.add("DTK"); - supportedSets.add("TPR"); - supportedSets.add("MM2"); - supportedSets.add("ORI"); - supportedSets.add("V15"); - supportedSets.add("DDP"); - supportedSets.add("BFZ"); - supportedSets.add("EXP"); - supportedSets.add("C15"); - // supportedSets.add("PZ1"); // Legendary Cube - supportedSets.add("OGW"); - supportedSets.add("DDQ"); - supportedSets.add("W16"); - supportedSets.add("SOI"); - supportedSets.add("EMA"); - supportedSets.add("EMN"); - supportedSets.add("V16"); - supportedSets.add("CN2"); - supportedSets.add("DDR"); - supportedSets.add("KLD"); - // supportedSets.add("PZ2"); // Treasure Chests - supportedSets.add("C16"); - supportedSets.add("PCA"); - supportedSets.add("AER"); - supportedSets.add("MM3"); - supportedSets.add("DDS"); - supportedSets.add("W17"); - supportedSets.add("AKH"); - supportedSets.add("MPS"); - supportedSets.add("CMA"); - supportedSets.add("E01"); - supportedSets.add("HOU"); - supportedSets.add("C17"); - supportedSets.add("XLN"); - supportedSets.add("DDT"); - supportedSets.add("IMA"); - supportedSets.add("E02"); - supportedSets.add("V17"); - supportedSets.add("UST"); - supportedSets.add("DDU"); - supportedSets.add("RIX"); - supportedSets.add("A25"); - supportedSets.add("DOM"); - supportedSets.add("CM2"); - supportedSets.add("M19"); - //supportedSets.add("BBD"); - //supportedSets.add("C18"); - } - - @Override - public String getSourceName() { - return "magidex.com"; - } - - @Override - public String getNextHttpImageUrl() { - return null; - } - - @Override - public String getFileForHttpImage(String httpImageUrl) { - return null; - } - - @Override - public boolean prepareDownloadList(DownloadServiceInfo downloadServiceInfo, List downloadList) { - return true; - } - - @Override - public CardImageUrls generateCardUrl(CardDownloadData card) throws Exception { - String cardDownloadName = card.getDownloadName().toLowerCase(Locale.ENGLISH); - String cardSet = card.getSet(); - - if (cardSet == null || cardSet.isEmpty() || cardDownloadName.isEmpty()) { - throw new Exception("Wrong parameters for image: cardDownloadName: " + cardDownloadName + ", card set: " + cardSet); - } - - if (card.isSplitCard()) { - cardDownloadName = cardDownloadName.replaceAll(" // ", ""); - } - - // This will properly escape the url - URI uri = new URI("http", "magidex.com", "/extstatic/card/" + formatSetName(cardSet) + '/' + cardDownloadName + ".jpg", null, null); - return new CardImageUrls(uri.toASCIIString()); - } - - private String formatSetName(String setName) { - if (setNameReplacement.containsKey(setName)) { - setName = setNameReplacement.get(setName); - } - return setName; - } - - - private static final Map setNameReplacement = new HashMap() { - { - // put("JR", "pJGP"); // TODO: Set was split into the individual sets as listed on Scryfall - } - }; - - @Override - public CardImageUrls generateTokenUrl(CardDownloadData card) { - return null; - } - - @Override - public float getAverageSize() { - return 62.0f; - } - - @Override - public int getTotalImages() { - return -1; - } - - @Override - public boolean isTokenSource() { - return false; - } - - @Override - public boolean isCardSource() { - return true; - } - - @Override - public void doPause(String httpImageUrl) { - } - - @Override - public List getSupportedSets() { - return new ArrayList<>(supportedSets); - } - - @Override - public boolean isCardImageProvided(String setCode, String cardName) { - return supportedSets.contains(setCode); - } -} diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MtgOnlTokensImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MtgOnlTokensImageSource.java deleted file mode 100644 index 5de7a70e06b0..000000000000 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MtgOnlTokensImageSource.java +++ /dev/null @@ -1,379 +0,0 @@ -package org.mage.plugins.card.dl.sources; - -import org.apache.log4j.Logger; -import org.mage.plugins.card.dl.DownloadServiceInfo; -import org.mage.plugins.card.images.CardDownloadData; - -import java.io.IOException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * TODO: web site reworked and tokens doesn't work anymore, - * but it can be used to download a proxy tokens (tokens that was miss by wizards), - * see https://www.mtg.onl/mtg-missing-tokens/ - * - * @author spjspj - */ -public enum MtgOnlTokensImageSource implements CardImageSource { - - instance; - private static final Logger logger = Logger.getLogger(MtgOnlTokensImageSource.class); - private static int maxTimes = 0; - - @Override - public String getSourceName() { - return "http://mtg.onl/token-list/tokens/"; - } - - @Override - public float getAverageSize() { - return 26.7f; - } - - @Override - public String getNextHttpImageUrl() { - if (copyUrlToImage == null) { - setupLinks(); - } - - for (String key : copyUrlToImageDone.keySet()) { - if (copyUrlToImageDone.get(key) < maxTimes) { - copyUrlToImageDone.put(key, maxTimes); - return key; - } - } - if (maxTimes < 2) { - maxTimes++; - } - for (String key : copyUrlToImageDone.keySet()) { - if (copyUrlToImageDone.get(key) < maxTimes) { - copyUrlToImageDone.put(key, maxTimes); - return key; - } - } - return null; - } - - @Override - public String getFileForHttpImage(String httpImageUrl) { - if (httpImageUrl != null) { - return copyUrlToImage.get(httpImageUrl); - } - return null; - } - - @Override - public boolean prepareDownloadList(DownloadServiceInfo downloadServiceInfo, List downloadList) { - return true; - } - - @Override - public CardImageUrls generateCardUrl(CardDownloadData card) throws Exception { - return null; - } - - Map copyUrlToImage = null; - Map copyImageToUrl = null; - Map copyUrlToImageDone = null; - - private void setupLinks() { - if (copyUrlToImage != null) { - return; - } - copyUrlToImage = new HashMap<>(); - copyImageToUrl = new HashMap<>(); - copyUrlToImageDone = new HashMap<>(); - copyUrlToImage.put("Angel_B_3_3.jpg", "ANGEL.B.ANGEL.CREATURE.3.3.full.jpg"); - copyUrlToImage.put("Angel_W_3_3.jpg", "ANGEL.W.ANGEL.CREATURE.3.3.full.jpg"); - copyUrlToImage.put("Angel_W_4_4.jpg", "ANGEL.W.ANGEL.CREATURE.4.4.full.jpg"); - copyUrlToImage.put("Ape_G_2_2.jpg", "APE.G.APE.CREATURE.2.2.full.jpg"); - copyUrlToImage.put("Ape_G_3_3.jpg", "APE.G.APE.CREATURE.3.3.full.jpg"); - copyUrlToImage.put("Ashaya_the_Awoken_World_G_4_4.jpg", "ASHAYATHEAWOKENWORLD.G.ELEMENTAL.CREATURE.4.4.full.jpg"); - copyUrlToImage.put("Assassin_B_1_1.jpg", "ASSASSIN.B.ASSASSIN.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Assembly-Worker_2_2.jpg", "ASSEMBLYWORKER..ASSEMBLYWORKER.ARTIFACTCREATURE.2.2.full.jpg"); - copyUrlToImage.put("Avatar_W_y_y.jpg", "AVATAR.W.AVATAR.CREATURE.S.S.full.jpg"); - copyUrlToImage.put("Bat_B_1_1.jpg", "BAT.B.BAT.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Bat_B_1_2.jpg", "BAT.B.BAT.CREATURE.1.2.full.jpg"); - copyUrlToImage.put("Bear_G_2_2.jpg", "BEAR.G.BEAR.CREATURE.2.2.full.jpg"); - copyUrlToImage.put("Bear_G_4_4.jpg", "BEAR.G.BEAR.CREATURE.4.4.full.jpg"); - copyUrlToImage.put("Beast_B_3_3.jpg", "BEAST.B.BEAST.CREATURE.3.3.full.jpg"); - copyUrlToImage.put("Beast_G_3_3.jpg", "BEAST.G.BEAST.CREATURE.3.3.full.jpg"); - copyUrlToImage.put("Beast_G_2_2.jpg", "BEAST.G.BEAST.CREATURE.2.2.full.jpg"); - copyUrlToImage.put("Beast_G_4_4.jpg", "BEAST.G.BEAST.CREATURE.4.4.full.jpg"); - copyUrlToImage.put("Beast_G_5_5.jpg", "BEAST.G.BEAST.CREATURE.5.5.full.jpg"); - copyUrlToImage.put("Beast_RGW_8_8.jpg", "BEAST.WRG.BEAST.CREATURE.8.8.full.jpg"); - copyUrlToImage.put("Bird_Soldier_W_1_1.jpg", "BIRDSOLDIER.W.BIRD.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Bird_U_1_1.jpg", "BIRD.U.BIRD.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Bird_U_2_2.jpg", "BIRD.U.BIRD.CREATURE.2.2.full.jpg"); - copyUrlToImage.put("Bird_U_2_2_Enchantment.jpg", "BIRD.U.BIRD.ENCHANTMENTCREATURE.2.2.full.jpg"); - copyUrlToImage.put("Bird_WU_1_1.jpg", "BIRD.WU.BIRD.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Bird_W_1_1.jpg", "BIRD.W.BIRD.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Bird_W_3_3.jpg", "BIRD.W.BIRD.CREATURE.3.3.full.jpg"); - copyUrlToImage.put("Bird_W_3_4.jpg", "BIRD.W.BIRD.CREATURE.3.4.full.jpg"); - copyUrlToImage.put("Boar_G_2_2.jpg", "BOAR.G.BOAR.CREATURE.2.2.full.jpg"); - copyUrlToImage.put("Boar_G_3_3.jpg", "BOAR.G.BOAR.CREATURE.3.3.full.jpg"); - copyUrlToImage.put("Butterfly_G_1_1.jpg", "BUTTERFLY.G.INSECT.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Camarid_U_1_1.jpg", "CAMARID.U.CAMARID.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Caribou_W_0_1.jpg", "CARIBOU.W.CARIBOU.CREATURE.0.1.full.jpg"); - copyUrlToImage.put("Carnivore_R_3_1.jpg", "CARNIVORE.R.BEAST.CREATURE.3.1.full.jpg"); - copyUrlToImage.put("Cat_B_2_1.jpg", "CAT.B.CAT.CREATURE.2.1.full.jpg"); - copyUrlToImage.put("Cat_G_1_1.jpg", "CAT.G.CAT.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Cat_R_1_1.jpg", "CAT.R.CAT.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Cat_Soldier_W_1_1.jpg", "CATSOLDIER.W.CATSOLDIER.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Cat_W_2_2.jpg", "CAT.W.CAT.CREATURE.2.2.full.jpg"); - copyUrlToImage.put("Cat_Warrior_G_2_2.jpg", "CATWARRIOR.G.CATWARRIOR.CREATURE.2.2.full.jpg"); - copyUrlToImage.put("Centaur_G_3_3.jpg", "CENTAUR.G.CENTAUR.CREATURE.3.3.full.jpg"); - copyUrlToImage.put("Centaur_G_3_3_Enchantment.jpg", "CENTAUR.G.CENTAUR.ENCHANTMENTCREATURE.3.3.full.jpg"); - copyUrlToImage.put("Centaur_G_3_3_protection.jpg", "CENTAUR.G.CENTAUR.CREATURE.3.3a.full.jpg"); - copyUrlToImage.put("Citizen_W_1_1.jpg", "CITIZEN.W.CITIZEN.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Cleric_WB_1_1.jpg", "CLERIC.WB.CLERIC.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Cleric_W_2_1.jpg", "CLERIC.W.CLERIC.CREATUREENCHANTMENT.2.1.full.jpg"); - copyUrlToImage.put("Cloud_Sprite_U_1_1.jpg", "CLOUDSPRITE.U.FAERIE.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Clue.jpg", "CLUE..CLUE.ARTIFACT.0.0.full.jpg"); - copyUrlToImage.put("Construct_1_1.jpg", "CONSTRUCT..CONSTRUCT.ARTIFACTCREATURE.1.1.full.jpg"); - copyUrlToImage.put("Construct_6_12.jpg", "CONSTRUCT..CONSTRUCT.CREATUREARTIFACT.6.12.full.jpg"); - copyUrlToImage.put("Demon_B_5_5.jpg", "DEMON.B.DEMON.CREATURE.5.5.full.jpg"); - copyUrlToImage.put("Demon_B_y_y.jpg", "DEMON.B.DEMON.CREATURE.S.S.full.jpg"); - copyUrlToImage.put("Devil_R_1_1.jpg", "DEVIL.R.DEVIL.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Djinn_5_5.jpg", "DJINN..DJINN.ARTIFACTCREATURE.5.5.full.jpg"); - copyUrlToImage.put("Djinn_Monk_U_2_2.jpg", "DJINNMONK.U.DJINNMONK.CREATURE.2.2.full.jpg"); - copyUrlToImage.put("Dragon_RG_1_1.jpg", "DRAGON.RG.DRAGON.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Dragon_R_2_2.jpg", "DRAGON.R.DRAGON.CREATURE.2.2.full.jpg"); - copyUrlToImage.put("Dragon_R_4_4.jpg", "DRAGON.R.DRAGON.CREATURE.4.4.full.jpg"); - copyUrlToImage.put("Dragon_R_5_5.jpg", "DRAGON.R.DRAGON.CREATURE.5.5.full.jpg"); - copyUrlToImage.put("Dragon_R_6_6.jpg", "DRAGON.R.DRAGON.CREATURE.6.6.full.jpg"); - copyUrlToImage.put("Dragon_Spirit_U_5_5.jpg", "DRAGONSPIRIT.U.DRAGONSPIRIT.CREATURE.5.5.full.jpg"); - copyUrlToImage.put("Drake_UG_2_2.jpg", "DRAKE.UG.DRAKE.CREATURE.2.2.full.jpg"); - copyUrlToImage.put("Drake_U_2_2.jpg", "DRAKE.U.DRAKE.CREATURE.2.2.full.jpg"); - copyUrlToImage.put("Eldrazi_10_10.jpg", "ELDRAZI..ELDRAZI.CREATURE.10.10.full.jpg"); - copyUrlToImage.put("Eldrazi_Scion_1_1.jpg", "ELDRAZISCION..ELDRAZISCION.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Eldrazi_Spawn_0_1.jpg", "ELDRAZISPAWN..ELDRAZISPAWN.CREATURE.0.1.full.jpg"); - copyUrlToImage.put("Elemental_BR_5_5.jpg", "ELEMENTAL.BR.ELEMENTAL.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Elemental_GW_y_y.jpg", "ELEMENTAL.WG.ELEMENTAL.CREATURE.S.S.full.jpg"); - copyUrlToImage.put("Elemental_G_2_2.jpg", "ELEMENTAL.G.ELEMENTAL.CREATURE.2.2.full.jpg"); - copyUrlToImage.put("Elemental_R_3_1.jpg", "ELEMENTAL.R.ELEMENTAL.CREATURE.3.1.full.jpg"); - copyUrlToImage.put("Elemental_G_4_4.jpg", "ELEMENTAL.G.ELEMENTAL.CREATURE.4.4.full.jpg"); - copyUrlToImage.put("Elemental_G_5_3.jpg", "ELEMENTAL.G.ELEMENTAL.CREATURE.5.3.full.jpg"); - copyUrlToImage.put("Elemental_G_7_7.jpg", "ELEMENTAL.G.ELEMENTAL.CREATURE.7.7.full.jpg"); - copyUrlToImage.put("Elemental_R_7_1.jpg", "ELEMENTAL.R.ELEMENTAL.CREATURE.7.1.full.jpg"); - copyUrlToImage.put("Elemental_Shaman_R_3_1.jpg", "ELEMENTALSHAMAN.R.ELEMENTALSHAMAN.CREATURE.3.1.full.jpg"); - copyUrlToImage.put("Elephant_G_3_3.jpg", "ELEPHANT.G.ELEPHANT.CREATURE.3.3.full.jpg"); - copyUrlToImage.put("Elf_Druid_G_1_1.jpg", "ELFDRUID.G.ELFDRUID.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Elf_G_1_1.jpg", "ELFWARRIOR.G.ELFWARRIOR.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Elf_Warrior_GW_1_1.jpg", "ELFWARRIOR.WG.ELFWARRIOR.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Elf_Warrior_G_1_1.jpg", "ELFWARRIOR.G.ELFWARRIOR.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Faerie_Rogue_B_1_1.jpg", "FAERIEROGUE.B.FAERIEROGUE.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Faerie_Rogue_UB_1_1.jpg", "FAERIEROGUE.UB.FAERIEROGUE.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Faerie_U_1_1.jpg", "FAERIE.U.FAERIE.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Festering_Goblin_B_1_1.jpg", "FESTERINGGOBLIN.B.ZOMBIEGOBLIN.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Fish_U_3_3.jpg", "FISH.U.FISH.CREATURE.3.3.full.jpg"); - copyUrlToImage.put("Frog_Lizard_G_3_3.jpg", "FROGLIZARD.G.FROGLIZARD.CREATURE.3.3.full.jpg"); - copyUrlToImage.put("Gargoyle_3_4.jpg", "GARGOYLE..GARGOYLE.CREATUREARTIFACT.3.4.full.jpg"); - copyUrlToImage.put("Germ_B_0_0.jpg", "GERM.B.GERM.CREATURE.0.0.full.jpg"); - copyUrlToImage.put("Giant_R_4_4.jpg", "GIANT.R.GIANT.CREATURE.4.4.full.jpg"); - copyUrlToImage.put("Giant_Warrior_RG_4_4.jpg", "GIANTWARRIOR.RG.GIANTWARRIOR.CREATURE.4.4.full.jpg"); - copyUrlToImage.put("Giant_Warrior_W_5_5.jpg", "GIANTWARRIOR.W.GIANTWARRIOR.CREATURE.5.5.full.jpg"); - copyUrlToImage.put("Gnome_1_1.jpg", "GNOME..GNOME.ARTIFACTCREATURE.1.1.full.jpg"); - copyUrlToImage.put("Goat_W_0_1.jpg", "GOAT.W.GOAT.CREATURE.0.1.full.jpg"); - copyUrlToImage.put("Goblin_R_1_1.jpg", "GOBLIN.R.GOBLIN.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Goblin_R_2_1.jpg", "GOBLIN.R.GOBLIN.CREATURE.2.1.full.jpg"); - copyUrlToImage.put("Goblin_Rogue_B_1_1.jpg", "GOBLINROGUE.B.GOBLINROGUE.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Goblin_Scout_R_1_1.jpg", "GOBLINSCOUT.R.GOBLINSCOUT.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Goblin_Soldier_RW_1_1.jpg", "GOBLINSOLDIER.WR.GOBLINSOLDIER.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Goblin_Warrior_RG_1_1.jpg", "GOBLINWARRIOR.RG.GOBLINWARRIOR.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Gold_.jpg", "GOLD...ARTIFACT.0.0.full.jpg"); - copyUrlToImage.put("Goldmeadow_Harrier_W_1_1.jpg", "GOLDMEADOWHARRIER.W.KITHKINSOLDIER.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Golem_3_3.jpg", "GOLEM..GOLEM.ARTIFACTCREATURE.3.3.full.jpg"); - copyUrlToImage.put("Golem_3_3_Enchantment.jpg", "GOLEM..GOLEM.ENCHANTMENTARTIFACTCREATURE.3.3.full.jpg"); - copyUrlToImage.put("Golem_9_9.jpg", "GOLEM..GOLEM.ARTIFACTCREATURE.9.9.full.jpg"); - copyUrlToImage.put("Graveborn_BR_3_1.jpg", "GRAVEBORN.BR.GRAVEBORN.CREATURE.3.1.full.jpg"); - copyUrlToImage.put("Griffin_W_2_2.jpg", "GRIFFIN.W.GRIFFIN.CREATURE.2.2.full.jpg"); - copyUrlToImage.put("Harpy_B_1_1.jpg", "HARPY.B.HARPY.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Hellion_R_4_4.jpg", "HELLION.R.HELLION.CREATURE.4.4.full.jpg"); - copyUrlToImage.put("Hippo_G_1_1.jpg", "HIPPO.G.HIPPO.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Homunculus_U_0_1.jpg", "HOMUNCULUS.U.HOMUNCULUS.CREATUREARTIFACT.0.1.full.jpg"); - copyUrlToImage.put("Homunculus_U_2_2.jpg", "HOMUNCULUS.U.HOMUNCULUS.CREATURE.2.2.full.jpg"); - copyUrlToImage.put("Hornet_1_1.jpg", "HORNET..INSECT.ARTIFACTCREATURE.1.1.full.jpg"); - copyUrlToImage.put("Horror_B_4_4.jpg", "HORROR.B.HORROR.CREATURE.4.4.full.jpg"); - copyUrlToImage.put("Horror_B_X_X.jpg", "HORROR.B.HORROR.CREATURE.X.X.full.jpg"); - copyUrlToImage.put("Horror_UB_1_1.jpg", "HORROR.UB.HORROR.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Horror_X_X.jpg", "HORROR..HORROR.ARTIFACTCREATURE.X.X.full.jpg"); - copyUrlToImage.put("Hound_G_1_1.jpg", "HOUND.G.HOUND.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Human_Cleric_WB_1_1.jpg", "HUMANCLERIC.WB.HUMANCLERIC.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Human_R_1_1.jpg", "HUMAN.R.HUMAN.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Human_Soldier_W_1_1.jpg", "HUMANSOLDIER.W.HUMANSOLDIER.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Human_W_1_1.jpg", "HUMAN.W.HUMAN.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Hydra_G_X_X.jpg", "HYDRA.G.HYDRA.CREATURE.X.X.full.jpg"); - copyUrlToImage.put("Illusion_U_1_1.jpg", "ILLUSION.U.ILLUSION.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Illusion_U_2_2.jpg", "ILLUSION.U.ILLUSION.CREATURE.2.2.full.jpg"); - copyUrlToImage.put("Insect_G_1_1.jpg", "INSECT.G.INSECT.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Insect_G_6_1.jpg", "INSECT.G.INSECT.CREATURE.6.1.full.jpg"); - copyUrlToImage.put("Kaldra_4_4.jpg", "KALDRA..AVATAR.CREATURE.4.4.full.jpg"); - copyUrlToImage.put("Kavu_B_3_3.jpg", "KAVU.B.KAVU.CREATURE.3.3.full.jpg"); - copyUrlToImage.put("Kelp_U_0_1.jpg", "KELP.U.PLANTWALL.CREATURE.0.1.full.jpg"); - copyUrlToImage.put("Kithkin_Soldier_W_1_1.jpg", "KITHKINSOLDIER.W.KITHKINSOLDIER.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Knight_Ally_W_2_2.jpg", "KNIGHTALLY.W.KNIGHTALLY.CREATURE.2.2.full.jpg"); - copyUrlToImage.put("Knight_B_2_2.jpg", "KNIGHT.B.KNIGHT.CREATURE.2.2.full.jpg"); - copyUrlToImage.put("Knight_W_1_1.jpg", "KNIGHT.W.KNIGHT.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Knight_W_2_2.jpg", "KNIGHT.W.KNIGHT.CREATURE.2.2.full.jpg"); - copyUrlToImage.put("Kobolds_of_Kher_Keep_R_0_1.jpg", "KOBOLDSOFKHERKEEP.R.KOBOLD.CREATURE.0.1.full.jpg"); - copyUrlToImage.put("Kor_Ally_W_1_1.jpg", "KORALLY.W.KORALLY.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Kor_Soldier_W_1_1.jpg", "KORSOLDIER.W.KORSOLDIER.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Kraken_U_9_9.jpg", "KRAKEN.U.KRAKEN.CREATURE.9.9.full.jpg"); - copyUrlToImage.put("Landmine_.jpg", "LANDMINE...ARTIFACT.0.0.full.jpg"); - copyUrlToImage.put("Lightning_Ranger_R_5_1.jpg", "LIGHTNINGRAGER.R.ELEMENTAL.CREATURE.5.1.full.jpg"); - copyUrlToImage.put("Lizard_G_2_2.jpg", "LIZARD.G.LIZARD.CREATURE.2.2.full.jpg"); - copyUrlToImage.put("Llanowar_Elves_G_1_1.jpg", "LLANOWARELVES.G.ELFDRUID.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Manifest_2_2.jpg", "MANIFEST.....full.jpg"); - copyUrlToImage.put("Marit_Lage_B_20_20.jpg", "MARITLAGE.B.AVATAR.CREATURE.20.20.full.jpg"); - copyUrlToImage.put("Merfolk_U_1_1.jpg", "MERFOLK.U.MERFOLK.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Merfolk_Wizard_U_1_1.jpg", "MERFOLKWIZARD.U.MERFOLKWIZARD.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Metallic_Sliver_1_1.jpg", "METALLICSLIVER..SLIVER.CREATUREARTIFACT.1.1.full.jpg"); - copyUrlToImage.put("Minion_B_1_1.jpg", "MINION.B.MINION.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Minion_B_X_X.jpg", "MINION.B.MINION.CREATURE.X.X.full.jpg"); - copyUrlToImage.put("Minor_Demon_BR_1_1.jpg", "MINORDEMON.BR.DEMON.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Minotaur_R_2_3.jpg", "MINOTAUR.R.MINOTAUR.CREATURE.2.3.full.jpg"); - copyUrlToImage.put("Monk_W_1_1.jpg", "MONK.W.MONK.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Morph_2_2.jpg", "MORPH.....full.jpg"); - copyUrlToImage.put("Myr_1_1.jpg", "MYR..MYR.CREATUREARTIFACT.1.1.full.jpg"); - copyUrlToImage.put("Octopus_U_8_8.jpg", "OCTOPUS.U.OCTOPUS.CREATURE.8.8.full.jpg"); - copyUrlToImage.put("Ogre_R_3_3.jpg", "OGRE.R.OGRE.CREATURE.3.3.full.jpg"); - copyUrlToImage.put("Ogre_R_4_4.jpg", "OGRE.R.OGRE.CREATURE.4.4.full.jpg"); - copyUrlToImage.put("Ooze_G_1_1.jpg", "OOZE.G.OOZE.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Ooze_G_2_2.jpg", "OOZE.G.OOZE.CREATURE.2.2.full.jpg"); - copyUrlToImage.put("Ooze_G_3_3.jpg", "OOZE.G.OOZE.CREATURE.3.3.full.jpg"); - copyUrlToImage.put("Orb_U_X_X.jpg", "ORB.U.ORB.CREATURE.X.X.jpg.full.jpg"); - copyUrlToImage.put("Pegasus_W_1_1.jpg", "PEGASUS.W.PEGASUS.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Pentavite_1_1.jpg", "PENTAVITE..PENTAVITE.ARTIFACTCREATURE.1.1.full.jpg"); - copyUrlToImage.put("Pest_0_1.jpg", "PEST..PEST.ARTIFACTCREATURE.0.1.full.jpg"); - copyUrlToImage.put("Pincher_2_2.jpg", "PINCHER..PINCHER.CREATURE.2.2.full.jpg"); - copyUrlToImage.put("Plant_G_0_1.jpg", "PLANT.G.PLANT.CREATURE.0.1.full.jpg"); - copyUrlToImage.put("Plant_G_1_1.jpg", "PLANT.G.PLANT.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Rat_B_1_1.jpg", "RAT.B.RAT.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Reflection_W_2_2.jpg", "REFLECTION.W.REFLECTION.CREATURE.2.2.full.jpg"); - copyUrlToImage.put("Rhino_G_4_4.jpg", "RHINO.G.RHINO.CREATURE.4.4.full.jpg"); - copyUrlToImage.put("Rukh_R_4_4.jpg", "BIRD.R.BIRD.CREATURE.4.4.full.jpg"); - copyUrlToImage.put("Sand_1_1.jpg", "SAND..SAND.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Sand_Warrior_RGW_1_1.jpg", "SANDWARRIOR.WRG.SANDWARRIOR.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Saporling_G_1_1.jpg", "SAPROLING.G.SAPROLING.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Satyr_RG_2_2.jpg", "SATYR.RG.SATYR.CREATURE.2.2.full.jpg"); - copyUrlToImage.put("Serf_B_0_1.jpg", "SERF.B.SERF.CREATURE.0.1.full.jpg"); - copyUrlToImage.put("Shapeshifter_1_1.jpg", "SHAPESHIFTER..SHAPESHIFTER.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Skeleton_B_1_1.jpg", "SKELETON.B.SKELETON.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Sliver_1_1.jpg", "SLIVER..SLIVER.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Snake_1_1.jpg", "SNAKE..SNAKE.ARTIFACTCREATURE.1.1.full.jpg"); - copyUrlToImage.put("Snake_B_1_1.jpg", "SNAKE.B.SNAKE.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Snake_GB_1_1.jpg", "SNAKE.BG.SNAKE.ENCHANTMENTCREATURE.1.1.full.jpg"); - copyUrlToImage.put("Snake_GU_1_1.jpg", "SNAKE.UG.SNAKE.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Snake_G_1_1.jpg", "SNAKE.G.SNAKE.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Soldier_Ally_W_1_1.jpg", "SOLDIERALLY.W.SOLDIERALLY.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Soldier_RW_1_1.jpg", "SOLDIER.WR.SOLDIER.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Soldier_R_1_1.jpg", "SOLDIER.R.SOLDIER.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Soldier_W_1_1.jpg", "SOLDIER.W.SOLDIER.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Soldier_W_1_1_Enchantment.jpg", "SOLDIER.W.SOLDIER.ENCHANTMENTCREATURE.1.1.full.jpg"); - copyUrlToImage.put("Spark_Elemental_R_3_1.jpg", "SPARKELEMENTAL.R.ELEMENTAL.CREATURE.3.1.full.jpg"); - copyUrlToImage.put("Spawn_2_2.jpg", "SPAWN..SPAWN.ARTIFACTCREATURE.2.2.full.jpg"); - copyUrlToImage.put("Sphinx_U_4_4.jpg", "SPHINX.U.SPHINX.CREATURE.4.4.full.jpg"); - copyUrlToImage.put("Spider_B_2_4.jpg", "SPIDER.B.SPIDER.CREATURE.2.4.full.jpg"); - copyUrlToImage.put("Spider_G_1_2.jpg", "SPIDER.G.SPIDER.CREATURE.1.2.full.jpg"); - copyUrlToImage.put("Spider_G_1_3.jpg", "SPIDER.G.SPIDER.ENCHANTMENTCREATURE.1.3.full.jpg"); - copyUrlToImage.put("Spike_G_1_1.jpg", "SPIKE.G.SPIKE.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Spirit_1_1.jpg", "SPIRIT..SPIRIT.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Spirit_U_1_1.jpg", "SPIRIT.U.SPIRIT.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Spirit_WB_1_1.jpg", "SPIRIT.WB.SPIRIT.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Spirit_WB_y_y.jpg", "SPIRIT.WB.SPIRIT.ENCHANTMENTCREATURE.S.S.full.jpg"); - copyUrlToImage.put("Spirit_W_1_1.jpg", "SPIRIT.W.SPIRIT.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Spirit_W_3_3.jpg", "SPIRIT.W.SPIRIT.CREATURE.3.3.full.jpg"); - copyUrlToImage.put("Spirit_Warror_BG_y_y.jpg", "SPIRITWARRIOR.BG.SPIRITWARRIOR.CREATURE.S.S.full.jpg"); - copyUrlToImage.put("Squid_U_1_1.jpg", "SQUID.U.SQUID.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Squirrel_G_1_1.jpg", "SQUIRREL.G.SQUIRREL.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Stoneforged_Blade_.jpg", "STONEFORGEDBLADE..EQUIPMENT.ARTIFACT.0.0.full.jpg"); - copyUrlToImage.put("Tetravite_1_1.jpg", "TETRAVITE..TETRAVITE.CREATUREARTIFACT.1.1.full.jpg"); - copyUrlToImage.put("Thopter_1_1.jpg", "THOPTER..THOPTER.ARTIFACTCREATURE.1.1.full.jpg"); - copyUrlToImage.put("Thopter_U_1_1.jpg", "THOPTER.U.THOPTER.CREATUREARTIFACT.1.1.full.jpg"); - copyUrlToImage.put("Thrull_B_0_1.jpg", "THRULL.B.THRULL.CREATURE.0.1.full.jpg"); - copyUrlToImage.put("Thrull_B_1_1.jpg", "THRULL.B.THRULL.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Treefolk_G_X_X.jpg", "TREEFOLK.G.TREEFOLK.CREATURE.X.X.full.jpg"); - copyUrlToImage.put("Treefolk_Shaman_G_2_5.jpg", "TREEFOLKSHAMAN.G.TREEFOLKSHAMAN.CREATURE.2.5.full.jpg"); - copyUrlToImage.put("Treefolk_Warrior_G_y_y.jpg", "TREEFOLKWARRIOR.G.TREEFOLKWARRIOR.CREATURE.S.S.full.jpg"); - copyUrlToImage.put("Triskelavite_1_1.jpg", "TRISKELAVITE..TRISKELAVITE.ARTIFACTCREATURE.1.1.full.jpg"); - copyUrlToImage.put("Tuktuk_the_Returned_5_5.jpg", "TUKTUKTHERETURNED..GOBLIN.ARTIFACTCREATURE.5.5.full.jpg"); - copyUrlToImage.put("Urami_B_5_5.jpg", "URAMI.B.DEMONSPIRIT.CREATURE.5.5.full.jpg"); - copyUrlToImage.put("Vampire_B_1_1.jpg", "VAMPIRE.B.VAMPIRE.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Vampire_B_2_2.jpg", "VAMPIRE.B.VAMPIRE.CREATURE.2.2.full.jpg"); - copyUrlToImage.put("Vampire_B_X_X.jpg", "VAMPIRE.B.VAMPIRE.CREATURE.X.X.full.jpg"); - copyUrlToImage.put("Vampire_Knight_B_1_1.jpg", "VAMPIREKNIGHT.B.VAMPIREKNIGHT.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Voja_GW_2_2.jpg", "VOJA.WG.WOLF.CREATURE.2.2.full.jpg"); - copyUrlToImage.put("Wall_U_5_5.jpg", "WALL.U.WALL.CREATURE.5.5.full.jpg"); - copyUrlToImage.put("Warrior_B_2_1.jpg", "WARRIOR.B.WARRIOR.CREATURE.2.1.full.jpg"); - copyUrlToImage.put("Warrior_R_1_1.jpg", "WARRIOR.R.WARRIOR.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Warrior_W_1_1.jpg", "WARRIOR.W.WARRIOR.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Wasp_1_1.jpg", "WASP..INSECT.ARTIFACTCREATURE.1.1.full.jpg"); - copyUrlToImage.put("Weird_U_3_3.jpg", "WEIRD.U.WEIRD.CREATURE.3.3.full.jpg"); - copyUrlToImage.put("Whale_U_6_6.jpg", "WHALE.U.WHALE.CREATURE.6.6.full.jpg"); - copyUrlToImage.put("Wirefly_2_2.jpg", "WIREFLY..INSECT.ARTIFACTCREATURE.2.2.full.jpg"); - copyUrlToImage.put("Wolf_G_2_2.jpg", "WOLF.G.WOLF.CREATURE.2.2.full.jpg"); - copyUrlToImage.put("Wood_G_0_1.jpg", "WOOD.G.WALL.CREATURE.0.1.full.jpg"); - copyUrlToImage.put("Worm_BG_1_1.jpg", "WORM.BG.WORM.CREATURE.1.1.full.jpg"); - copyUrlToImage.put("Wurm_3_3.jpg", "WURM..WURM.ARTIFACTCREATURE.3.3.full.jpg"); - copyUrlToImage.put("Wurm_B_6_6.jpg", "WURM.B.WURM.CREATURE.6.6.full.jpg"); - copyUrlToImage.put("Wurm_G_6_6.jpg", "WURM.G.WURM.CREATURE.6.6.full.jpg"); - copyUrlToImage.put("Zombie_B_2_2.jpg", "ZOMBIE.B.ZOMBIE.CREATURE.2.2.full.jpg"); - copyUrlToImage.put("Zombie_B_2_2_Enchantment.jpg", "ZOMBIE.B.ZOMBIE.ENCHANTMENTCREATURE.2.2.full.jpg"); - copyUrlToImage.put("Zombie_B_5_5.jpg", "ZOMBIEGIANT.B.ZOMBIEGIANT.CREATURE.5.5.full.jpg"); - copyUrlToImage.put("Zombie_B_X_X.jpg", "ZOMBIE.B.ZOMBIE.CREATURE.X.X.full.jpg"); - copyUrlToImage.put("Zombie_Horror_B_X_X.jpg", "ZOMBIEHORROR.B.ZOMBIEHORROR.CREATURE.X.X.full.jpg"); - copyUrlToImage.put("Zombie_U_X_X.jpg", "ZOMBIE.U.ZOMBIE.CREATURE.X.X.full.jpg"); - copyUrlToImage.put("Zombie_Wizard_UB_1_1.jpg", "ZOMBIEWIZARD.UB.ZOMBIEWIZARD.CREATURE.1.1.full.jpg"); - - for (String key : copyUrlToImage.keySet()) { - copyUrlToImageDone.put(key, maxTimes); - copyImageToUrl.put(copyUrlToImage.get(key), key); - } - } - - @Override - public CardImageUrls generateTokenUrl(CardDownloadData card) throws IOException { - if (copyUrlToImage == null) { - setupLinks(); - } - return null; - } - - @Override - public int getTotalImages() { - if (copyUrlToImage == null) { - setupLinks(); - } - if (copyUrlToImage != null) { - return copyImageToUrl.size(); - } - return -1; - } - - @Override - public boolean isTokenSource() { - return true; - } - - @Override - public boolean isCardSource() { - return false; - } - - @Override - public void doPause(String httpImageUrl) { - } - - @Override - public boolean isCardImageProvided(String setCode, String cardName) { - return false; - } - - @Override - public boolean isTokenImageProvided(String setCode, String cardName, Integer tokenNumber) { - return true; - } -} diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MythicspoilerComSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MythicspoilerComSource.java deleted file mode 100644 index b14760ac2198..000000000000 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MythicspoilerComSource.java +++ /dev/null @@ -1,466 +0,0 @@ -package org.mage.plugins.card.dl.sources; - -import mage.client.MageFrame; -import mage.remote.Connection; -import mage.remote.Connection.ProxyType; -import mage.util.CardUtil; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; -import org.mage.plugins.card.dl.DownloadServiceInfo; -import org.mage.plugins.card.images.CardDownloadData; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.InetSocketAddress; -import java.net.Proxy; -import java.net.URL; -import java.util.*; -import java.util.prefs.Preferences; - -/** - * @author LevelX2 - */ -public enum MythicspoilerComSource implements CardImageSource { - - instance; - private final Map setsAliases; - private final Map cardNameAliases; - private final Map> cardNameAliasesStart; - private final Map> sets; - private final Set supportedSets; - private final Map> manualLinks; - - @Override - public String getSourceName() { - return "mythicspoiler.com"; - } - - MythicspoilerComSource() { - supportedSets = new LinkedHashSet<>(); -// supportedSets.add("LEA"); - supportedSets.add("LEB"); -// supportedSets.add("2ED"); - supportedSets.add("ARN"); - supportedSets.add("ATQ"); - supportedSets.add("3ED"); - supportedSets.add("LEG"); - supportedSets.add("DRK"); - supportedSets.add("FEM"); -// supportedSets.add("4ED"); - supportedSets.add("ICE"); - supportedSets.add("CHR"); - supportedSets.add("HML"); - supportedSets.add("ALL"); - supportedSets.add("MIR"); - supportedSets.add("VIS"); -// supportedSets.add("5ED"); -// supportedSets.add("POR"); - supportedSets.add("WTH"); - supportedSets.add("TMP"); - supportedSets.add("STH"); - supportedSets.add("EXO"); -// supportedSets.add("P02"); -// supportedSets.add("UGL"); - supportedSets.add("USG"); -// supportedSets.add("DD3DVD"); -// supportedSets.add("DD3EVG"); -// supportedSets.add("DD3GVL"); -// supportedSets.add("DD3JVC"); - -// supportedSets.add("ULG"); -// supportedSets.add("6ED"); - supportedSets.add("UDS"); - supportedSets.add("PTK"); -// supportedSets.add("S99"); - supportedSets.add("MMQ"); - // supportedSets.add("BRB");Battle Royale Box Set - supportedSets.add("NEM"); -// supportedSets.add("S00"); - supportedSets.add("PCY"); - supportedSets.add("INV"); - // supportedSets.add("BTD"); // Beatdown Boxset - supportedSets.add("PLS"); - supportedSets.add("7ED"); - supportedSets.add("APC"); - supportedSets.add("ODY"); - // supportedSets.add("DKM"); // Deckmasters 2001 - supportedSets.add("TOR"); - supportedSets.add("JUD"); - supportedSets.add("ONS"); - supportedSets.add("LGN"); - supportedSets.add("SCG"); - supportedSets.add("8ED"); - supportedSets.add("MRD"); - supportedSets.add("DST"); - supportedSets.add("5DN"); - supportedSets.add("CHK"); - supportedSets.add("UNH"); - supportedSets.add("BOK"); - supportedSets.add("SOK"); - supportedSets.add("9ED"); - supportedSets.add("RAV"); - supportedSets.add("GPT"); - supportedSets.add("DIS"); - supportedSets.add("CSP"); - supportedSets.add("TSP"); - supportedSets.add("TSB"); - supportedSets.add("PLC"); - supportedSets.add("FUT"); - supportedSets.add("10E"); - supportedSets.add("MED"); - supportedSets.add("LRW"); - supportedSets.add("EVG"); - supportedSets.add("MOR"); - supportedSets.add("SHM"); - supportedSets.add("EVE"); - supportedSets.add("DRB"); -// supportedSets.add("ME2"); - supportedSets.add("ALA"); -// supportedSets.add("DD2"); - supportedSets.add("CON"); -// supportedSets.add("DDC"); - supportedSets.add("ARB"); - supportedSets.add("M10"); - // supportedSets.add("TD0"); // Magic Online Deck Series -// supportedSets.add("V09"); - supportedSets.add("HOP"); -// supportedSets.add("ME3"); - supportedSets.add("ZEN"); -// supportedSets.add("DDD"); - supportedSets.add("H09"); - supportedSets.add("WWK"); -// supportedSets.add("DDE"); - supportedSets.add("ROE"); - supportedSets.add("DPA"); - supportedSets.add("ARC"); - supportedSets.add("M11"); -// supportedSets.add("V10"); -// supportedSets.add("DDF"); - supportedSets.add("SOM"); -// supportedSets.add("TD0"); // Commander Theme Decks -// supportedSets.add("PD2"); -// supportedSets.add("ME4"); - supportedSets.add("MBS"); -// supportedSets.add("DDG"); - supportedSets.add("NPH"); - supportedSets.add("CMD"); - supportedSets.add("M12"); - supportedSets.add("V11"); -// supportedSets.add("DDH"); - supportedSets.add("ISD"); - supportedSets.add("PD3"); - supportedSets.add("DKA"); -// supportedSets.add("DDI"); - supportedSets.add("AVR"); -// supportedSets.add("PC2"); - supportedSets.add("M13"); -// supportedSets.add("V12"); -// supportedSets.add("DDJ"); - supportedSets.add("RTR"); -// supportedSets.add("CM1"); - // supportedSets.add("TD2"); // Duel Decks: Mirrodin Pure vs. New Phyrexia - supportedSets.add("GTC"); -// supportedSets.add("DDK"); - supportedSets.add("DGM"); -// supportedSets.add("MMA"); - supportedSets.add("M14"); - supportedSets.add("V13"); -// supportedSets.add("DDL"); - supportedSets.add("THS"); - supportedSets.add("C13"); - supportedSets.add("BNG"); -// supportedSets.add("DDM"); - supportedSets.add("JOU"); - // supportedSets.add("MD1"); // Modern Event Deck -// supportedSets.add("CNS"); -// supportedSets.add("VMA"); - supportedSets.add("M15"); - supportedSets.add("V14"); - supportedSets.add("DDN"); - supportedSets.add("KTK"); - supportedSets.add("C14"); - // supportedSets.add("DD3"); // Duel Decks Anthology - supportedSets.add("FRF"); -// supportedSets.add("DDO"); -// supportedSets.add("DTK"); -// supportedSets.add("TPR"); - supportedSets.add("MM2"); - supportedSets.add("ORI"); -// supportedSets.add("V15"); -// supportedSets.add("DDP"); - supportedSets.add("BFZ"); -// supportedSets.add("EXP"); - supportedSets.add("C15"); - // supportedSets.add("PZ1"); // Legendary Cube - supportedSets.add("OGW"); -// supportedSets.add("DDQ"); -// supportedSets.add("W16"); - supportedSets.add("SOI"); - supportedSets.add("EMA"); - supportedSets.add("EMN"); -// supportedSets.add("V16"); - supportedSets.add("CN2"); -// supportedSets.add("DDR"); - supportedSets.add("KLD"); -// supportedSets.add("MPS"); - // supportedSets.add("PZ2"); - supportedSets.add("C16"); -// supportedSets.add("PCA"); - supportedSets.add("AER"); - supportedSets.add("MM3"); -// supportedSets.add("W17"); - supportedSets.add("AKH"); - supportedSets.add("MPS"); - supportedSets.add("CMA"); - supportedSets.add("E01"); - supportedSets.add("HOU"); - supportedSets.add("C17"); - supportedSets.add("IMA"); - supportedSets.add("XLN"); - supportedSets.add("UST"); - supportedSets.add("RIX"); - supportedSets.add("DOM"); - supportedSets.add("BBD"); - supportedSets.add("M19"); - supportedSets.add("C18"); - supportedSets.add("CM2"); - supportedSets.add("GRN"); - - sets = new LinkedHashMap<>(); - setsAliases = new HashMap<>(); - setsAliases.put("exp", "bfz"); - setsAliases.put("xln", "ixa"); - setsAliases.put("nem", "nms"); - cardNameAliases = new HashMap<>(); - // set+wrong name from web side => correct card name - cardNameAliases.put("MM2-otherwordlyjourney", "otherworldlyjourney"); - cardNameAliases.put("THS-fellhideminotaur", "felhideminotaur"); - cardNameAliases.put("THS-purphorosemissary", "purphorossemissary"); - cardNameAliases.put("THS-soldierofpantheon", "soldierofthepantheon"); - cardNameAliases.put("THS-vulpinegolaith", "vulpinegoliath"); - cardNameAliases.put("ORI-kothopedhoarderofsouls", "kothophedsoulhoarder"); - cardNameAliases.put("BFZ-kozliekschanneler", "kozilekschanneler"); - cardNameAliases.put("OGW-wastes", "wastes1"); - cardNameAliases.put("OGW-wastes2", "wastes2"); - cardNameAliases.put("AER-aegisautomation", "aegisautomaton"); - cardNameAliases.put("AKH-illusorywrappins", "illusorywrappings"); - cardNameAliases.put("AKH-reducerumble", "reducerubble"); - cardNameAliases.put("AKH-forsakethewordly", "forsaketheworldly"); - cardNameAliases.put("AKH-kefnatsmonument", "kefnetsmonument"); - cardNameAliases.put("XLN-kinjaliscaller", "kinjalliscaller"); - cardNameAliases.put("XLN-lookoutsdecision", "lookoutsdispersal"); - cardNameAliases.put("XLN-infuriatedgladiodon", "ragingswordtooth"); - cardNameAliases.put("XLN-redoubledvolley", "repeatingbarrage"); - cardNameAliases.put("UST-captialoffense", "capitaloffense"); - cardNameAliases.put("RIX-tetzimocdeathprimordial", "tetzimocprimaldeath"); - // - manualLinks = new HashMap<>(); - Map links = new HashMap<>(); - links.put("templeofaclazotz", "templeofaclazotz"); - links.put("conquerorsfoothold", "conquerorsfoothold"); - links.put("primalwellspring", "primalwellspring"); - links.put("azcantathesunkenruin", "azcantathesunkenruin"); - links.put("spiresoforazca", "spiresoforazca"); - links.put("treasurecove", "treasurecove"); - links.put("itlimoccradleofthesun", "itlimoccradleofthesun"); - links.put("lostvale", "lostvale"); - links.put("adantothefirstfort", "adantothefirstport"); - links.put("spitfirebastion", "spitfirebastion"); - manualLinks.put("XLN", links); - - Map linksRix = new HashMap<>(); - linksRix.put("vaultofcatlacan", "vaultofcatlacan"); - linksRix.put("atzalcaveofeternity", "atzalcaveofeternity"); - linksRix.put("wingedtempleoforazca", "wingedtempleoforazca"); - linksRix.put("metzalitoweroftriumph", "metzalitoweroftriumph"); - linksRix.put("tomboftheduskrose", "tomboftheduskrose"); - linksRix.put("sanctumofthesun", "sanctumofthesun"); - linksRix.put("goldforgegarrison", "goldforgegarrison"); - manualLinks.put("RIX", linksRix); - - cardNameAliasesStart = new HashMap<>(); - Set names = new HashSet<>(); - names.add("eldrazidevastator.jpg"); - cardNameAliasesStart.put("BFZ", names); - } - - private Map getSetLinks(String cardSet) { - Map setLinks = new HashMap<>(); - try { - String setNames = setsAliases.get(cardSet.toLowerCase(Locale.ENGLISH)); - Set aliasesStart = new HashSet<>(); - if (cardNameAliasesStart.containsKey(cardSet)) { - aliasesStart.addAll(cardNameAliasesStart.get(cardSet)); - } - if (setNames == null) { - setNames = cardSet.toLowerCase(Locale.ENGLISH); - } - Preferences prefs = MageFrame.getPreferences(); - Connection.ProxyType proxyType = Connection.ProxyType.valueByText(prefs.get("proxyType", "None")); - for (String setName : setNames.split("\\^")) { - String URLSetName = CardUtil.urlEncode(setName); - String baseUrl = "http://mythicspoiler.com/" + URLSetName + '/'; - - Map pageLinks = getSetLinksFromPage(cardSet, aliasesStart, prefs, proxyType, baseUrl, baseUrl); - setLinks.putAll(pageLinks); - - // try to download images for double-faced cards - try { - String doubleFacedUrl = baseUrl + "dfc.html"; - pageLinks = getSetLinksFromPage(cardSet, aliasesStart, prefs, proxyType, baseUrl, doubleFacedUrl); - setLinks.putAll(pageLinks); - } catch (Exception ex) { - // that's ok if we cannot download double-faced cards for some sets - } - } - - } catch (IOException ex) { - System.out.println("Exception when parsing the mythicspoiler page: " + ex.getMessage()); - } - return setLinks; - } - - private Map getSetLinksFromPage(String cardSet, Set aliasesStart, Preferences prefs, - ProxyType proxyType, String baseUrl, String pageUrl) throws IOException { - Map pageLinks = new HashMap<>(); - - String urlDocument; - Document doc; - if (proxyType == ProxyType.NONE) { - urlDocument = pageUrl; - doc = Jsoup.connect(urlDocument).get(); - } else { - String proxyServer = prefs.get("proxyAddress", ""); - int proxyPort = Integer.parseInt(prefs.get("proxyPort", "0")); - URL url = new URL(pageUrl); - Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyServer, proxyPort)); - HttpURLConnection uc = (HttpURLConnection) url.openConnection(proxy); - - uc.connect(); - - String line; - StringBuffer tmp = new StringBuffer(); - BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream())); - while ((line = in.readLine()) != null) { - tmp.append(line); - } - doc = Jsoup.parse(String.valueOf(tmp)); - } - - Elements cardsImages = doc.select("img[src^=cards/]"); // starts with cards/ - if (!aliasesStart.isEmpty()) { - for (String text : aliasesStart) { - cardsImages.addAll(doc.select("img[src^=" + text + ']')); - } - } - - for (Element cardsImage : cardsImages) { - String cardLink = cardsImage.attr("src"); - String cardName = null; - if (cardLink.startsWith("cards/") && cardLink.endsWith(".jpg")) { - cardName = cardLink.substring(6, cardLink.length() - 4); - } else if (aliasesStart.contains(cardLink)) { - cardName = cardLink.substring(0, cardLink.length() - 4); - } - if (cardName != null && !cardName.isEmpty()) { - if (cardNameAliases.containsKey(cardSet + '-' + cardName)) { - cardName = cardNameAliases.get(cardSet + '-' + cardName); - } else if (cardName.endsWith("1") || cardName.endsWith("2") || cardName.endsWith("3") || cardName.endsWith("4") || cardName.endsWith("5")) { - cardName = cardName.substring(0, cardName.length() - 1); - } else if (cardName.endsWith("promo")) { - cardName = cardName.substring(0, cardName.length() - 5); - } - pageLinks.put(cardName, baseUrl + cardLink); - } - } - Map linksToAdd = manualLinks.get(cardSet); - if (linksToAdd != null) { - for (Map.Entry link : linksToAdd.entrySet()) { - pageLinks.put(link.getKey(), baseUrl + "cards/" + link.getValue() + ".jpg"); - } - } - return pageLinks; - } - - @Override - public boolean prepareDownloadList(DownloadServiceInfo downloadServiceInfo, List downloadList) { - return true; - } - - @Override - public CardImageUrls generateCardUrl(CardDownloadData card) throws Exception { - String collectorId = card.getCollectorId(); - String cardSet = card.getSet(); - if (collectorId == null || cardSet == null) { - throw new Exception("Wrong parameters for image: collector id: " + collectorId + ", card set: " + cardSet); - } - if (card.isFlippedSide()) { //doesn't support rotated images - return null; - } - Map setLinks = sets.computeIfAbsent(cardSet, k -> getSetLinks(cardSet)); - String searchName = card.getDownloadName().toLowerCase(Locale.ENGLISH) - .replaceAll(" ", "") - .replaceAll("\\.", "") - .replaceAll("&", "and") - .replaceAll("-", "") - .replaceAll("'", "") - .replaceAll(",", "") - .replaceAll("/", ""); - String link = setLinks.get(searchName); - return new CardImageUrls(link); - } - - @Override - public CardImageUrls generateTokenUrl(CardDownloadData card - ) { - return null; - } - - @Override - public float getAverageSize() { - return 50.0f; - } - - @Override - public String getNextHttpImageUrl() { - return null; - } - - @Override - public String getFileForHttpImage(String httpImageUrl) { - return null; - } - - @Override - public int getTotalImages() { - return -1; - } - - @Override - public boolean isTokenSource() { - return false; - } - - @Override - public boolean isCardSource() { - return true; - } - - @Override - public void doPause(String httpImageUrl) { - } - - @Override - public List getSupportedSets() { - return new ArrayList<>(supportedSets); - } - - @Override - public boolean isCardImageProvided(String setCode, String cardName) { - return supportedSets.contains(setCode); - } -} diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSource.java index e1e5ced5b91e..1e61663be00f 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSource.java @@ -295,7 +295,7 @@ public String getFileForHttpImage(String httpImageUrl) { @Override public String getSourceName() { - return "scryfall.com"; + return "scryfall.com - big"; } @Override diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSourceSmall.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSourceSmall.java index 7e6b21b2e881..c246c5073520 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSourceSmall.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSourceSmall.java @@ -27,6 +27,11 @@ private static CardImageUrls innerModifyUrl(CardImageUrls cardUrls) { return new CardImageUrls(downloadUrls); } + @Override + public String getSourceName() { + return "scryfall.com - small"; + } + @Override public CardImageUrls generateCardUrl(CardDownloadData card) throws Exception { return innerModifyUrl(super.generateCardUrl(card)); diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/TokensMtgImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/TokensMtgImageSource.java deleted file mode 100644 index 1020503263b8..000000000000 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/TokensMtgImageSource.java +++ /dev/null @@ -1,317 +0,0 @@ -package org.mage.plugins.card.dl.sources; - -import mage.constants.SubType; -import org.apache.log4j.Logger; -import org.mage.plugins.card.dl.DownloadServiceInfo; -import org.mage.plugins.card.images.CardDownloadData; -import org.mage.plugins.card.images.DownloadPicturesService; -import org.mage.plugins.card.utils.CardImageUtils; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.Proxy; -import java.net.URL; -import java.net.URLConnection; -import java.util.*; - -/** - * @author Quercitron - */ -public enum TokensMtgImageSource implements CardImageSource { - - instance; - private static final Logger LOGGER = Logger.getLogger(TokensMtgImageSource.class); - - // [[EXP/Name, TokenData> - private HashMap> tokensData; - private static final Set supportedSets = new LinkedHashSet<>(); - - private final Object tokensDataSync = new Object(); - - @Override - public String getSourceName() { - return "tokens.mtg.onl"; - } - - @Override - public float getAverageSize() { - return 26.7f; - } - - @Override - public String getNextHttpImageUrl() { - return null; - } - - @Override - public String getFileForHttpImage(String httpImageUrl) { - return null; - } - - @Override - public boolean prepareDownloadList(DownloadServiceInfo downloadServiceInfo, List downloadList) { - return true; - } - - @Override - public CardImageUrls generateCardUrl(CardDownloadData card) throws Exception { - return null; - } - - private static final Map SET_NAMES_REPLACEMENT = new HashMap() { - { - put("con", "CFX"); - put("fnmp", "FNM"); - } - }; - - private String getEmblemName(String originalName) { - - for (SubType subType : SubType.getPlaneswalkerTypes()) { - if (originalName.toLowerCase(Locale.ENGLISH).contains(subType.toString().toLowerCase(Locale.ENGLISH))) { - return subType.getDescription() + " Emblem"; - } - } - return null; - } - - @Override - public CardImageUrls generateTokenUrl(CardDownloadData card) throws IOException { - String name = card.getName(); - String set = card.getSet(); - int imageNumber = card.getImageNumber(); - - // handle emblems - if (name.toLowerCase(Locale.ENGLISH).contains("emblem")) { - name = getEmblemName(name); - } - - // we should replace some set names - if (SET_NAMES_REPLACEMENT.containsKey(set.toLowerCase(Locale.ENGLISH))) { - set = SET_NAMES_REPLACEMENT.get(set.toLowerCase(Locale.ENGLISH)); - } - - // Image URL contains token number - // e.g. https://tokens.mtg.onl/tokens/ORI_010-Thopter.jpg -- token number 010 - // We don't know these numbers, but we can take them from a file - // with tokens information that can be downloaded from the site. - if (tokensData.isEmpty()) { - LOGGER.info("Source " + getSourceName() + " provides no token data."); - return null; - } - - String key = set + "/" + name; - List list = tokensData.get(key); - if (list == null) { - LOGGER.warn("Could not find data for token " + name + ", set " + set + "."); - return null; - } - - TokenData tokenData; - if (imageNumber == 0) { - tokenData = list.get(0); - } else { - if (imageNumber > list.size()) { - LOGGER.warn("Not enough images variants for token with type number " + imageNumber + ", name " + name + ", set " + set + '.'); - return null; - } - tokenData = list.get(card.getImageNumber() - 1); - } - - String url = "https://tokens.mtg.onl/tokens/" + tokenData.getExpansionSetCode().trim() + '_' - + tokenData.getNumber().trim() + '-' + tokenData.getName().trim() + ".jpg"; - url = url.replace(' ', '-'); - return new CardImageUrls(url); - } - - @Override - public int getTotalImages() { - return getTokenImages(); - } - - @Override - public int getTokenImages() { - try { - getTokensData(); - } catch (IOException ex) { - LOGGER.error(getSourceName() + ": Loading available data failed. " + ex.getMessage()); - } - return tokensData.size(); - } - - @Override - public boolean isTokenSource() { - return true; - } - - @Override - public boolean isCardSource() { - return false; - } - - @Override - public void doPause(String httpImageUrl) { - } - - @Override - public List getSupportedSets() { - return new ArrayList<>(supportedSets); - } - - @Override - public boolean isCardImageProvided(String setCode, String cardName) { - // no cards support, only tokens - return false; - } - - @Override - public boolean isTokenImageProvided(String setCode, String cardName, Integer tokenNumber) { - String searchName = cardName; - if (cardName.toLowerCase(Locale.ENGLISH).contains("emblem")) { - searchName = getEmblemName(cardName); - } - try { - getTokensData(); - } catch (IOException ex) { - LOGGER.error(ex.getMessage(), ex); - } - String key = setCode + "/" + searchName; - return (tokensData.containsKey(key)); - } - - private HashMap> getTokensData() throws IOException { - synchronized (tokensDataSync) { - if (tokensData == null) { - DownloadPicturesService.getInstance().updateGlobalMessage("Find tokens data..."); - tokensData = new HashMap<>(); - - // get tokens data from resource file - try (InputStream inputStream = this.getClass().getResourceAsStream("/tokens-mtg-onl-list.csv")) { - List fileTokensData = parseTokensData(inputStream); - for (TokenData tokenData : fileTokensData) { - String key = tokenData.getExpansionSetCode() + "/" + tokenData.getName(); - List list = tokensData.get(key); - if (list == null) { - list = new ArrayList<>(); - tokensData.put(key, list); - supportedSets.add(tokenData.getExpansionSetCode()); - LOGGER.debug("Added key: " + key); - } - list.add(tokenData); - } - } catch (Exception exception) { - LOGGER.warn("Failed to get tokens description from resource file tokens-mtg-onl-list.csv", exception); - } - - String urlString = "http://tokens.mtg.onl/data/SetsWithTokens.csv"; - Proxy proxy = CardImageUtils.getProxyFromPreferences(); - URLConnection conn = proxy == null ? new URL(urlString).openConnection() : new URL(urlString).openConnection(proxy); - - // description on site may contain new information - // try to add it - try (InputStream inputStream = conn.getURL().openStream()) { - List siteTokensData = parseTokensData(inputStream); - for (TokenData siteData : siteTokensData) { - // logger.info("TOK: " + siteData.getExpansionSetCode() + "/" + siteData.getName()); - String key = siteData.getExpansionSetCode() + "/" + siteData.getName(); - supportedSets.add(siteData.getExpansionSetCode()); - List list = tokensData.get(key); - if (list == null) { - list = new ArrayList<>(); - tokensData.put(key, list); - list.add(siteData); - } else { - boolean newToken = true; - for (TokenData tokenData : list) { - if (siteData.getNumber().equals(tokenData.number)) { - newToken = false; - break; - } - } - if (newToken) { - list.add(siteData); - } - } - } - DownloadPicturesService.getInstance().updateGlobalMessage(""); - DownloadPicturesService.getInstance().showDownloadControls(true); - } catch (Exception ex) { - LOGGER.warn("Failed to get tokens description from tokens.mtg.onl", ex); - DownloadPicturesService.getInstance().updateGlobalMessage(ex.getMessage()); - } - } - } - - return tokensData; - } - - private List parseTokensData(InputStream inputStream) throws IOException { - List newTokensData = new ArrayList<>(); - - try (InputStreamReader inputReader = new InputStreamReader(inputStream, "Cp1252"); - BufferedReader reader = new BufferedReader(inputReader)) { - // we have to specify encoding to read special comma - - String header = reader.readLine(); // skip header - String line = reader.readLine(); - // states - // 0 - wait set name - // 1 - wait cards - // 2 - process cards - int state = 0; - String set = null; - while (line != null) { - if (line.trim().isEmpty()) { - if (state == 2) { - state = 0; - } - } else if (state == 0) { - set = line.substring(0, 3); - state = 1; - } else { - if (state == 1) { - state = 2; - } - String[] split = line.split(","); - // replace special comma for cards like 'Ashaya‚ the Awoken World' - String name = split[0].replace('‚', ',').replace("‚", ","); - String number = split[1]; - TokenData token = new TokenData(name, number, set); - newTokensData.add(token); - } - - line = reader.readLine(); - } - } - - return newTokensData; - } - - static final class TokenData { - - final private String name; - final private String number; - final private String expansionSetCode; - - public TokenData(String name, String number, String expansionSetCode) { - this.name = name; - this.number = number; - this.expansionSetCode = expansionSetCode; - } - - public String getName() { - return name; - } - - public String getNumber() { - return number; - } - - public String getExpansionSetCode() { - return expansionSetCode; - } - } - -} diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPicturesService.java b/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPicturesService.java index 089e7dda22f1..829f751180fd 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPicturesService.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPicturesService.java @@ -74,16 +74,11 @@ public class DownloadPicturesService extends DefaultBoundedRangeModel implements private Proxy proxy = Proxy.NO_PROXY; enum DownloadSources { - WIZARDS("1. wizards.com - low quality CARDS, multi-language, slow download", WizardCardsImageSource.instance), - TOKENS("2. tokens.mtg.onl - high quality TOKENS", TokensMtgImageSource.instance), - SCRYFALL("3. scryfall.com - high quality CARDS and TOKENS, multi-language", ScryfallImageSource.getInstance()), - SCRYFALL_SMALL("3a. scryfall.com small images - low quality CARDS and TOKENS, multi-language", ScryfallImageSourceSmall.getInstance()), - MAGIDEX("4. magidex.com - high quality CARDS", MagidexImageSource.instance), - GRAB_BAG("5. GrabBag - STAR WARS cards and tokens", GrabbagImageSource.instance), - MYTHICSPOILER("6. mythicspoiler.com", MythicspoilerComSource.instance), - ALTERNATIVE("7. alternative.mtg.onl", AltMtgOnlTokensImageSource.instance), - COPYPASTE("8. Copy and Paste Image URLs", CopyPasteImageSource.instance); - // MTG_ONL("mtg.onl", MtgOnlTokensImageSource.instance), Not working correctly yet + WIZARDS("1. wizards.com - low quality, cards only, multi-language", WizardCardsImageSource.instance), + SCRYFALL_BIG("2a. scryfall.com - BIG: high quality, multi-language", ScryfallImageSource.getInstance()), + SCRYFALL_SMALL("2b. scryfall.com - small: low quality, multi-language", ScryfallImageSourceSmall.getInstance()), + GRAB_BAG("3. GrabBag - unofficial STAR WARS cards and tokens", GrabbagImageSource.instance), + COPYPASTE("4. Experimental - copy and paste image URLs", CopyPasteImageSource.instance); // TODO: need rework for user friendly GUI private final String text; private final CardImageSource source; @@ -164,7 +159,7 @@ public DownloadPicturesService(JFrame frame) { // SOURCES - scryfall is default source uiDialog.getSourcesCombo().setModel(new DefaultComboBoxModel(DownloadSources.values())); - uiDialog.getSourcesCombo().setSelectedItem(DownloadSources.SCRYFALL); + uiDialog.getSourcesCombo().setSelectedItem(DownloadSources.SCRYFALL_BIG); selectedSource = ScryfallImageSource.getInstance(); uiDialog.getSourcesCombo().addItemListener((ItemEvent event) -> { if (event.getStateChange() == ItemEvent.SELECTED) { diff --git a/Mage.Client/src/main/resources/tokens-mtg-onl-list.csv b/Mage.Client/src/main/resources/tokens-mtg-onl-list.csv deleted file mode 100644 index 6c22071ee7b1..000000000000 --- a/Mage.Client/src/main/resources/tokens-mtg-onl-list.csv +++ /dev/null @@ -1,764 +0,0 @@ -Token name, Number, Color, P/T, Promo, Type, Artist, Text - -UGL - Unglued (1998-08-11) - -Pegasus, 89, W, 1|1, -, Creature - Pegasus, Mark Zug, Flying -Soldier, 90, W, 1|1, -, Creature - Soldier, Daren Bader, - -Zombie, 91, B, 2|2, -, Creature - Zombie, Christopher Rush, - -Goblin, 92, R, 1|1, -, Creature - Goblin, Pete Venters, - -Sheep, 93, G, 1|1, -, Creature - Sheep, Kev Walker, - -Squirrel, 94, G, 1|1, -, Creature - Squirrel, Ron Spencer, - - -ATH - Anthologies (1998-11-01) - -Pegasus, 89, W, 1|1, -, Creature - Pegasus, Mark Zug, Flying -Goblin, 92, R, 1|1, -, Creature - Goblin, Pete Venters, - - -INV - Invasion (2000-10-02) - -Bird, T1, U, 1|1, Player Rewards, Creature - Bird, Michael Sutfin, Flying -Elephant, T2, G, 3|3, Player Rewards, Creature - Elephant, Terese Nielsen, - -Saproling, T3, G, 1|1, Player Rewards, Creature - Saproling, Jeff Laubenstein, - - -PLS - Planeshift (2001-02-05) - -Spirit, T1, W, 1|1, Player Rewards, Creature - Spirit, John Matson, Flying - -APC - Apocalypse (2001-06-04) - -Goblin Soldier, T1, R W, 1|1, Player Rewards, Creature - Goblin Soldier, Ron Spears, - - -ODY - Odyssey (2001-10-01) - -Bear, T1, G, 2|2, Player Rewards, Creature - Bear, Heather Hudson, - -Beast, T2, G, 4|4, Player Rewards, Creature - Beast, Larry Elmore, - -Elephant, T3, G, 3|3, Player Rewards, Creature - Elephant, Arnie Swekel, - -Squirrel, T4, G, 1|1, Player Rewards, Creature - Squirrel, Ron Spencer, - -Wurm, T5, G, 6|6, Player Rewards, Creature - Wurm, Alan Pollack, - -Zombie, T6, B, 2|2, Player Rewards, Creature - Zombie, Dana Knutson, - - -ONS - Onslaught (2002-10-07) - -Bear, T1, G, 2|2, Player Rewards, Creature - Bear, Glen Angus, - -Dragon, T2, R, 5|5, Player Rewards, Creature - Dragon, Glen Angus, Flying -Insect, T3, G, 1|1, Player Rewards, Creature - Insect, Anthony S. Waters, - -Soldier, T4, W, 1|1, Player Rewards, Creature - Soldier, Ron Spencer, - - -LGN - Legions (2003-02-03) - -Goblin, T1, R, 1|1, Player Rewards, Creature - Goblin, Darrell Riche, - -Sliver, T2, -, 1|1, Player Rewards, Creature - Sliver, Tony Szczudlo, - - -SCG - Scourge (2003-05-26) - -Angel, T1, W, 4|4, Player Rewards, Creature - Angel, Scott M. Fischer, Flying - -8ED - Eighth Edition (2003-07-28) - -Rukh, T1, R, 4|4, Player Rewards, Creature - Rukh, Edward P. Beard� Jr., Flying - -MRD - Mirrodin (2003-10-02) - -Demon, T1, B, *|*, Player Rewards, Creature - Demon, Pete Venters, - -Myr, T2, -, 1|1, Player Rewards, Creature - Myr, Wayne England, - -Pentavite, T3, -, 1|1, Player Rewards, Artifact Creature - Pentavite, Greg Staples, - - -DST - Darksteel (2004-02-06) - -Beast, T1, G, 3|3, Player Rewards, Creature - Beast, Edward P. Beard� Jr., - - -CHK - Champions of Kamigawa (2004-10-01) - -Spirit, T1, -, 1|1, Player Rewards, Creature - Spirit, Hugh Jamieson, - - -CSP - Coldsnap (2006-07-21) - -Marit Lage, T1, B, 20|20, Pre-Release, Creature - Avatar, Stephan Martiniere, Flying� indestructible - -10E - Tenth Edition (2007-07-13) - -Soldier, 1, W, 1|1, -, Creature - Soldier, Parente, - -Zombie, 2, B, 2|2, -, Creature - Zombie, Carl Critchlow, - -Dragon, 3, R, 5|5, -, Creature - Dragon, Jim Pavelec, Flying -Goblin, 4, R, 1|1, -, Creature - Goblin, Dave Kendall, - -Saproling, 5, G, 1|1, -, Creature - Saproling, Cyril Van Der Haegen, - -Wasp, 6, -, 1|1, -, Artifact Creature - Insect, Ron Spencer, Flying - -LRW - Lorwyn (2007-10-12) - -Avatar, 1, W, *|*, -, Creature - Avatar, Vance Kovacs, This creature's power and toughness are each equal to your life total. -Elemental, 2, W, 4|4, -, Creature - Elemental, Anthony S. Waters, Flying -Kithkin Soldier, 3, W, 1|1, -, Creature - Kithkin Soldier, Greg Hildebrandt, - -Merfolk Wizard, 4, U, 1|1, -, Creature - Merfolk Wizard, Mark Poole, - -Goblin Rogue, 5, B, 1|1, -, Creature - Goblin Rogue, Richard Sardinha, - -Elemental Shaman, 6, R, 3|1, -, Creature - Elemental Shaman, Jim Pavelec, - -Beast, 7, G, 3|3, -, Creature - Beast, John Donahue, - -Elemental, 8, G, 4|4, -, Creature - Elemental, Brandon Kitkouski, - -Elf Warrior, 9, G, 1|1, -, Creature - Elf Warrior, Dominick Domingo, - -Wolf, 10, G, 2|2, -, Creature - Wolf, Pete Venters, - -Shapeshifter, 11, -, 1|1, -, Creature - Shapeshifter, Franz Vohwinkel, Changeling - -EVG - Duel Decks: Elves vs. Goblins (2007-11-16) - -Elemental, T1, G, 7|7, -, Creature - Elemental, Anthony S. Waters, Trample -Elf Warrior, T2, G, 1|1, -, Creature - Elf Warrior, Dominick Domingo, - -Goblin, T3, R, 1|1, -, Creature - Goblin, Dave Kendall, - - -MOR - Morningtide (2008-02-01) - -Giant Warrior, 1, W, 5|5, -, Creature - Giant Warrior, Steve Ellis, - -Faerie Rogue, 2, B, 1|1, -, Creature - Faerie Rogue, Jim Nelson, Flying -Treefolk Shaman, 3, G, 2|5, -, Creature - Treefolk Shaman, Richard Sardinha, - - -SHM - Shadowmoor (2008-05-02) - -Kithkin Soldier, 1, W, 1|1, -, Creature - Kithkin Soldier, Randy Gallegos, - -Spirit, 2, W, 1|1, -, Creature - Spirit, Jeremy Enecio, Flying -Rat, 3, B, 1|1, -, Creature - Rat, Carl Critchlow, - -Elemental, 4, R, 1|1, -, Creature - Elemental, Cyril Van Der Haegen, Haste -Elf Warrior, 5, G, 1|1, -, Creature - Elf Warrior, William O'Connor, - -Spider, 6, G, 1|2, -, Creature - Spider, Thomas M. Baxa, Reach -Wolf, 7, G, 2|2, -, Creature - Wolf, Lars Grant-West, - -Faerie Rogue, 8, U B, 1|1, -, Creature - Faerie Rogue, E. M. Gist, Flying -Elemental, 9, B R, 5|5, -, Creature - Elemental, Dave Dorman, - -Giant Warrior, 10, R G, 4|4, -, Creature - Giant Warrior, Trevor Hairsine, Haste -Goblin Warrior, 11, R G, 1|1, -, Creature - Goblin Warrior, Dave Allsop, - -Elf Warrior, 12, G W, 1|1, -, Creature - Elf Warrior, Carl Frank, - - -EVE - Eventide (2008-07-25) - -Goat, 1, W, -, -, Creature - Goat, Terese Nielsen, - -Bird, 2, U, 1|1, -, Creature - Bird, Heather Hudson, Flying -Beast, 3, G, 3|3, -, Creature - Beast, William O'Connor, - -Spirit, 4, W B, 1|1, -, Creature - Spirit, Larry MacDougall, Flying -Elemental, 5, U R, 5|5, -, Creature - Elemental, Randy Gallegos, Flying -Worm, 6, B G, 1|1, -, Creature - Worm, Chuck Lukacs, - -Goblin Soldier, 7, R W, 1|1, -, Creature - Goblin Soldier, Jeff Miracola, - - -ALA - Shards of Alara (2008-10-03) - -Soldier, 1, W, 1|1, -, Creature - Soldier, Alan Pollack, - -Homunculus, 2, U, -, -, Artifact Creature - Homunculus, Howard Lyon, - -Thopter, 3, U, 1|1, -, Artifact Creature - Thopter, Andrew Murray, Flying -Skeleton, 4, B, 1|1, -, Creature - Skeleton, Thomas M. Baxa, {B}: Regenerate this creature. -Zombie, 5, B, 2|2, -, Creature - Zombie, Dave Kendall, - -Dragon, 6, R, 4|4, -, Creature - Dragon, Vance Kovacs, Flying -Goblin, 7, R, 1|1, -, Creature - Goblin, Brandon Kitkouski, - -Ooze, 8, G, *|*, -, Creature - Ooze, Anthony S. Waters, - -Saproling, 9, G, 1|1, -, Creature - Saproling, Trevor Claxton, - -Beast, 10, R G W, 8|8, -, Creature - Beast, Parente, - - -DD2 - Duel Decks: Jace vs. Chandra (2008-11-07) - -Elemental Shaman, T1, R, 3|1, -, Creature - Elemental Shaman, Jim Pavelec, - - -CFX - Conflux (2009-02-06) - -Angel, 1, W, 4|4, -, Creature - Angel, Cyril Van Der Haegen, Flying -Elemental, 2, R, 3|1, -, Creature - Elemental, Vance Kovacs, - - -DDC - Duel Decks: Divine vs. Demonic (2009-04-10) - -Spirit, T1, W, 1|1, -, Creature - Spirit, Luca Zontini, Flying -Demon, T2, B, *|*, -, Creature - Demon, Pete Venters, Flying -Thrull, T3, B, -, -, Creature - Thrull, Veronique Meignaud, - - -ARB - Alara Reborn (2009-04-30) - -Bird Soldier, 1, W, 1|1, -, Creature - Bird Soldier, Matt Cavotta, Flying -Lizard, 2, G, 2|2, -, Creature - Lizard, Anthony S. Waters, - -Dragon, 3, R G, 1|1, -, Creature - Dragon, Jaime Jones, Flying� devour 2 -Zombie Wizard, 4, U B, 1|1, -, Creature - Zombie Wizard, Dave Allsop, - - -M10 - Magic 2010 (2009-07-17) - -Avatar, 1, W, *|*, -, Creature - Avatar, Vance Kovacs, This creature's power and toughness are each equal to your life total. -Soldier, 2, W, 1|1, -, Creature - Soldier, Parente, - -Zombie, 3, B, 2|2, -, Creature - Zombie, Bud Cook, - -Goblin, 4, R, 1|1, -, Creature - Goblin, Dave Kendall, - -Beast, 5, G, 3|3, -, Creature - Beast, John Donahue, - -Insect, 6, G, 1|1, -, Creature - Insect, Ron Spencer, - -Wolf, 7, G, 2|2, -, Creature - Wolf, Lars Grant-West, - -Gargoyle, 8, -, 3|4, -, Artifact Creature - Gargoyle, Paul Bonner, Flying - -ZEN - Zendikar (2009-10-02) - -Angel, 1, W, 4|4, -, Creature - Angel, Adi Granov, Flying -Bird, 2, W, 1|1, -, Creature - Bird, Howard Lyon, Flying -Kor Soldier, 3, W, 1|1, -, Creature - Kor Soldier, Daren Bader, - -Illusion, 4, U, 2|2, -, Creature - Illusion, Cyril Van Der Haegen, - -Merfolk, 5, U, 1|1, -, Creature - Merfolk, Warren Mahy, - -Vampire, 6, B, *|*, -, Creature - Vampire, Kekai Kotaki, - -Zombie Giant, 7, B, 5|5, -, Creature - Zombie Giant, Igor Kieryluk, - -Elemental, 8, R, 7|1, -, Creature - Elemental, Anthony Francisco, Trample� haste -Beast, 9, G, 4|4, -, Creature - Beast, Steve Prescott, - -Snake, 10, G, 1|1, -, Creature - Snake, Austin Hsu, - -Wolf, 11, G, 2|2, -, Creature - Wolf, Daren Bader, - - -DDD - Duel Decks: Garruk vs. Liliana (2009-10-30) - -Beast, T1, G, 3|3, -, Creature - Beast, John Donahue, - -Beast, T2, G, 4|4, -, Creature - Beast, Steve Prescott, - -Elephant, T3, G, 3|3, -, Creature - Elephant, Arnie Swekel, - - -WWK - Worldwake (2010-02-05) - -Soldier Ally, 1, W, 1|1, -, Creature - Soldier Ally, Kekai Kotaki, - -Dragon, 2, R, 5|5, -, Creature - Dragon, Raymond Swanland, Flying -Ogre, 3, R, 3|3, -, Creature - Ogre, Paul Bonner, - -Elephant, 4, G, 3|3, -, Creature - Elephant, Lars Grant-West, - -Plant, 5, G, -, -, Creature - Plant, Daren Bader, - -Construct, 6, -, 6|12, -, Artifact Creature - Construct, Jung Park, Trample - -DDE - Duel Decks: Phyrexia vs. the Coalition (2010-03-19) - -Hornet, T1, -, 1|1, -, Artifact Creature - Insect, Ron Spencer, Flying� haste -Minion, T2, B, *|*, -, Creature - Minion, Dave Kendall, - -Saproling, T3, G, 1|1, -, Creature - Saproling, Warren Mahy, - - -ROE - Rise of the Eldrazi (2010-04-23) - -Eldrazi Spawn, 1a, -, -, -, Creature - Eldrazi Spawn, Aleksi Briclot, Sacrifice this creature: Add {1}. -Eldrazi Spawn, 1b, -, -, -, Creature - Eldrazi Spawn, Mark Tedin, Sacrifice this creature: Add {1}. -Eldrazi Spawn, 1c, -, -, -, Creature - Eldrazi Spawn, Veronique Meignaud, Sacrifice this creature: Add {1}. -Elemental, 2, R, *|*, -, Creature - Elemental, Jung Park, - -Hellion, 1, R, 4|4, -, Creature - Hellion, Anthony Francisco, - -Ooze, 4, G, *|*, -, Creature - Ooze, Daniel Ljunggren, - -Tuktuk The Returned, 5, -, 5|5, -, Legendary Artifact Creature - Goblin Golem, Franz Vohwinkel, - - -M11 - Magic 2011 (2010-07-16) - -Avatar, 1, W, *|*, -, Creature - Avatar, Vance Kovacs, This creature's power and toughness are each equal to your life total. -Bird, 2, W, 3|3, -, Creature - Bird, Paul Bonner, Flying -Zombie, 3, B, 2|2, -, Creature - Zombie, Bud Cook, - -Beast, 4, G, 3|3, -, Creature - Beast, John Donahue, - -Ooze, 5, G, 2|2, -, Creature - Ooze, Raymond Swanland, When this creature dies� put two 1/1 green Ooze creature tokens onto the battlefield. -Ooze, 6, G, 1|1, -, Creature - Ooze, Raymond Swanland, - - -DDF - Duel Decks: Elspeth vs. Tezzeret (2010-09-03) - -Soldier, T1, W, 1|1, -, Creature - Soldier, Parente, - - -SOM - Scars of Mirrodin (2010-10-01) - -Cat, 1, W, 2|2, -, Creature - Cat, Scott Chou, - -Soldier, 2, W, 1|1, -, Creature - Soldier, Goran Josic, - -Goblin, 3, R, 1|1, -, Creature - Goblin, Goran Josic, - -Insect, 4, G, 1|1, -, Creature - Insect, Adrian Smith, Infect -Wolf, 5, G, 2|2, -, Creature - Wolf, Chris Rahn, - -Golem, 6, -, 3|3, -, Artifact Creature - Golem, Nic Klein, - -Myr, 7, -, 1|1, -, Artifact Creature - Myr, Ryan Pancoast, - -Wurm, 8, -, 3|3, -, Artifact Creature - Wurm, Raymond Swanland, Deathtouch -Wurm, 9, -, 3|3, -, Artifact Creature - Wurm, Raymond Swanland, Lifelink -Poison Counter, -, -, -, -, Emblem, -, - - -MBS - Mirrodin Besieged (2011-02-04) - -Germ, 1, B, -, -, Creature - Germ, Igor Kieryluk, - -Zombie, 2, B, 2|2, -, Creature - Zombie, Dave Kendall, - -Golem, 3, -, 9|9, -, Artifact Creature - Golem, Svetlin Velinov, - -Horror, 4, -, *|*, -, Artifact Creature - Horror, Scott Chou, - -Thopter, 5, -, 1|1, -, Artifact Creature - Thopter, Volkan Baga, Flying -Poison Counter, -, -, -, -, Emblem, -, - - -DDG - Duel Decks: Knights vs. Dragons (2011-04-01) - -Goblin, T1, R, 1|1, -, Creature - Goblin, Brandon Kitkouski, - - -NPH - New Phyrexia (2011-05-13) - -Beast, 1, G, 3|3, -, Creature - Beast, Dave Allsop, - -Goblin, 2, R, 1|1, -, Creature - Goblin, Jaime Jones, - -Golem, 3, -, 3|3, -, Artifact Creature - Golem, Volkan Baga, - -Myr, 4, -, 1|1, -, Artifact Creature - Myr, Matt Stewart, - -Poison Counter, -, -, -, -, Emblem, -, - - -M12 - Magic 2012 (2011-07-15) - -Bird, 1, W, 3|3, -, Creature - Bird, Paul Bonner, Flying -Soldier, 2, W, 1|1, -, Creature - Soldier, Parente, - -Zombie, 3, B, 2|2, -, Creature - Zombie, Carl Critchlow, - -Beast, 4, G, 3|3, -, Creature - Beast, John Donahue, - -Saproling, 5, G, 1|1, -, Creature - Saproling, Cyril Van Der Haegen, - -Wurm, 6, G, 6|6, -, Creature - Wurm, Anthony Francisco, - -Pentavite, 7, -, 1|1, -, Artifact Creature - Pentavite, Greg Staples, Flying - -DDH - Duel Decks: Ajani vs. Nicol Bolas (2011-09-02) - -Griffin, T1, W, 2|2, -, Creature - Griffin, Jim Nelson, Flying -Saproling, T2, G, 1|1, -, Creature - Saproling, Cyril Van Der Haegen, - - -ISD - Innistrad (2011-09-30) - -Angel, 1, W, 4|4, -, Creature - Angel, Winona Nelson, Flying -Spirit, 2, W, 1|1, -, Creature - Spirit, Kev Walker, Flying -Homunculus, 3, U, 2|2, -, Creature - Homunculus, Johann Bodin, - -Demon, 4, B, 5|5, -, Creature - Demon, Kev Walker, Flying -Vampire, 5, B, 2|2, -, Creature - Vampire, Svetlin Velinov, Flying -Wolf, 6, B, 1|1, -, Creature - Wolf, Daniel Ljunggren, Deathtouch -Zombie, 7, B, 2|2, -, Creature - Zombie, Lucas Graciano, - -Zombie, 8, B, 2|2, -, Creature - Zombie, Christopher Moeller, - -Zombie, 9, B, 2|2, -, Creature - Zombie, Cynthia Sheppard, - -Ooze, 10, G, *|*, -, Creature - Ooze, Erica Yang, This creature's power and toughness are each equal to the number of slime counters on Gutter Grime. -Spider, 11, G, 1|2, -, Creature - Spider, Daniel Ljunggren, Reach -Wolf, 12, G, 2|2, -, Creature - Wolf, David Palumbo, - -Wolf, T12, G, 2|2, Judge, Creature - Wolf, David Palumbo, - - -DKA - Dark Ascension (2012-02-03) - -Human, 1, W, 1|1, -, Creature - Human, John Stanko, - -Vampire, 2, B, 1|1, -, Creature - Vampire, Peter Mohrbacher, Lifelink -Sorin Emblem, 3, -, -, -, Emblem - Sorin, Michael Komrack, Creatures you control get +1/+0. - -DDI - Duel Decks: Venser vs. Koth (2012-03-30) - -Koth Emblem, E1, -, -, -, Emblem - Koth, Eric Deschamps, Mountains you control have Tap: This land deals 1 damage to any target.' -Venser Emblem, E2, -, -, -, Emblem - Venser, Eric Deschamps, Whenever you cast a spell� exile target permanent. - -FNM - Friday Night Magic (2012-04-01) - -Human, T1a, W, 1|1, Full Moon, Creature - Human, Lars Grant-West, - -Wolf, T1b, G, 2|2, Full Moon, Creature - Wolf, Lars Grant-West, - - -AVR - Avacyn Restored (2012-05-04) - -Angel, 1, W, 4|4, -, Creature - Angel, Anthony Palumbo, Flying -Human, 2, W, 1|1, -, Creature - Human, Michael C. Hayes, - -Spirit, 3, W, 1|1, -, Creature - Spirit, Ryan Yee, Flying -Spirit, 4, U, 1|1, -, Creature - Spirit, Dan Scott, Flying -Demon, 5, B, 5|5, -, Creature - Demon, Kev Walker, Flying -Zombie, 6, B, 2|2, -, Creature - Zombie, Lucas Graciano, - -Human, 7, R, 1|1, -, Creature - Human, Ryan Pancoast, Haste -Tamiyo Emblem, 8, -, -, -, Emblem - Tamiyo, Eric Deschamps, You have no maximum hand size. Whenever a card is put into your graveyard from anywhere� you may return it to your hand. -Angel, T1, W, 4|4, Pre-Release, Creature - Angel, James Ryman, Flying -Angel, T1F, W, 4|4, Pre-Release, Creature - Angel, James Ryman, Flying -Demon, T5, B, 5|5, Pre-Release, Creature - Demon, Karl Kopinski, Flying -Demon, T5F, B, 5|5, Pre-Release, Creature - Demon, Karl Kopinski, Flying - -M13 - Magic 2013 (2012-07-13) - -Goblin, 1, R, 1|1, League, Creature - Goblin, Jim Nelson, - -Cat, 1, W, 2|2, -, Creature - Cat, Jesper Ejsing, - -Goat, 2, W, -, -, Creature - Goat, Adam Paquette, - -Soldier, 3, W, 1|1, -, Creature - Soldier, Greg Staples, - -Drake, 4, U, 2|2, -, Creature - Drake, Svetlin Velinov, Flying -Zombie, 5, B, 2|2, -, Creature - Zombie, Lucas Graciano, - -Goblin, 6, R, 1|1, -, Creature - Goblin, Karl Kopinski, - -Hellion, 1, R, 4|4, -, Creature - Hellion, Anthony Francisco, - -Beast, 8, G, 3|3, -, Creature - Beast, John Donahue, - -Saproling, 9, G, 1|1, -, Creature - Saproling, Brad Rigney, - -Wurm, 10, G, 6|6, -, Creature - Wurm, Anthony Francisco, - -Liliana Emblem, 11, -, -, -, Emblem - Liliana, D. Alexander Gregory, Swamps you control have Tap: Add {B}{B}{B}{B}.' - -DDJ - Duel Decks: Izzet vs. Golgari (2012-09-07) - -Saproling, T1, G, 1|1, -, Creature - Saproling, Brad Rigney, - - -RTR - Return to Ravnica (2012-10-05) - -Centaur, 1, G, 3|3, Judge, Creature - Centaur, James Ryman, - -Knight, 1, W, 2|2, League, Creature - Knight, Lucas Graciano, Vigilance -Bird, 1, W, 1|1, -, Creature - Bird, James Ryman, Flying -Knight, 2, W, 2|2, -, Creature - Knight, Matt Stewart, Vigilance -Soldier, 3, W, 1|1, -, Creature - Soldier, Steve Prescott, - -Assassin, 4, B, 1|1, -, Creature - Assassin, Svetlin Velinov, Whenever this creature deals combat damage to a player� that player loses the game. -Dragon, 5, R, 6|6, -, Creature - Dragon, Mark Zug, Flying -Goblin, 6, R, 1|1, -, Creature - Goblin, Christopher Moeller, - -Centaur, 7, G, 3|3, -, Creature - Centaur, Slawomir Maniak, - -Ooze, 8, G, *|*, -, Creature - Ooze, Marco Nelor, - -Rhino, 9, G, 4|4, -, Creature - Rhino, Tomasz Jedruszek, Trample -Saproling, 10, G, 1|1, -, Creature - Saproling, Raoul Vitale, - -Wurm, 11, G, 5|5, -, Creature - Wurm, Anthony Palumbo, Trample -Elemental, 12, G W, 8|8, -, Creature - Elemental, Yeong-Hao Han, Vigilance - -GTC - Gatecrash (2013-02-01) - -Soldier, 1, R W, 1|1, League, Creature - Soldier, Zoltan Boros, Haste -Angel, 1, W, 4|4, -, Creature - Angel, Steve Argyle, Flying -Rat, 2, B, 1|1, -, Creature - Rat, Nils Hamm, - -Frog Lizard, 3, G, 3|3, -, Creature - Frog Lizard, Jack Wang, - -Cleric, 4, W B, 1|1, -, Creature - Cleric, Jason Chan, {3}{W}{B}{B}� {T}� Sacrifice this creature: Return a card named Deathpact Angel from your graveyard to the battlefield. -Horror, 5, U B, 1|1, -, Creature - Horror, Adam Paquette, Flying -Soldier, 6, R W, 1|1, -, Creature - Soldier, David Palumbo, Haste -Spirit, 7, W B, 1|1, -, Creature - Spirit, Cliff Childs, Flying -Domri Emblem, 8, -, -, -, Emblem - Domri, Tyler Jacobson, Creatures you control have double strike� trample� hexproof� and haste. - -DDK - Duel Decks: Sorin vs. Tibalt (2013-03-15) - -Spirit, T1, W, 1|1, -, Creature - Spirit, Ryan Yee, Flying - -DGM - Dragon's Maze (2013-05-03) - -Bird, 1, W, 1|1, League, Creature - Bird, Martina Pilcerova, Flying -Elemental, 1, G W, *|*, -, Creature - Elemental, Mark Winters, This creature's power and toughness are each equal to the number of creatures you control. - -MMA - Modern Masters (2013-06-07) - -Giant Warrior, 1, W, 5|5, -, Creature - Giant Warrior, Svetlin Velinov, - -Kithkin Soldier, 2, W, 1|1, -, Creature - Kithkin Soldier, Randy Gallegos, - -Soldier, 3, W, 1|1, -, Creature - Soldier, Goran Josic, - -Illusion, 4, U, 1|1, -, Creature - Illusion, Veronique Meignaud, - -Bat, 5, B, 1|1, -, Creature - Bat, Wayne Reynolds, Flying -Goblin Rogue, 6, B, 1|1, -, Creature - Goblin Rogue, Dave Kendall, - -Spider, 7, B, 2|4, -, Creature - Spider, Lars Grant-West, Reach -Zombie, 8, B, 2|2, -, Creature - Zombie, Bud Cook, - -Dragon, 9, R, 4|4, -, Creature - Dragon, Vance Kovacs, Flying -Goblin, 10, R, 1|1, -, Creature - Goblin, Dave Kendall, - -Elemental, 11, G, 4|4, -, Creature - Elemental, Brandon Kitkouski, - -Saproling, 12, G, 1|1, -, Creature - Saproling, Warren Mahy, - -Treefolk Shaman, 13, G, 2|5, -, Creature - Treefolk Shaman, Zack Stella, - -Faerie Rogue, 14, U B, 1|1, -, Creature - Faerie Rogue, E. M. Gist, Flying -Worm, 15, B G, 1|1, -, Creature - Worm, Chuck Lukacs, - -Elspeth Emblem, 16, -, -, -, Emblem - Elspeth, Volkan Baga, Artifacts� creatures� enchantments� and lands you control have indestructible. - -M14 - Magic 2014 Core Set (2013-07-19) - -Sliver, 1, -, 1|1, -, Creature - Sliver, Igor Kieryluk, - -Angel, 1, W, 4|4, -, Creature - Angel, James Ryman, Flying -Cat, 3, W, 2|2, -, Creature - Cat, Jesper Ejsing, - -Goat, 4, W, -, -, Creature - Goat, Adam Paquette, - -Zombie, 5, B, 2|2, -, Creature - Zombie, Lucas Graciano, - -Dragon, 6, R, 2|2, -, Creature - Dragon, Jack Wang, Flying {R}: This creature gets +1/+0 until end of turn. -Elemental, 7, R, 1|1, -, Creature - Elemental, Jaime Jones, - -Elemental, 8, R, 1|1, -, Creature - Elemental, Winona Nelson, - -Beast, 9, G, 3|3, -, Creature - Beast, John Donahue, - -Saproling, 10, G, 1|1, -, Creature - Saproling, Brad Rigney, - -Wolf, 11, G, 2|2, -, Creature - Wolf, Lars Grant-West, - -Liliana Emblem, 12, -, -, -, Emblem - Liliana, D. Alexander Gregory, Swamps you control have Tap: Add {B}{B}{B}{B}.' -Garruk Emblem, 13, -, -, -, Emblem - Garruk, Karl Kopinski, Whenever you cast a creature spell� you may search your library for a creature card� put it onto the battlefield� then shuffle your library. -Sliver, T1, -, 1|1, League, Creature - Sliver, Vincent Proce, - - -DDL - Duel Decks: Heroes vs. Monsters (2013-09-06) - -Griffin, T1, W, 2|2, -, Creature - Griffin, Johann Bodin, Flying -Beast, T2, G, 3|3, -, Creature - Beast, Jesper Ejsing, - - -THS - Theros (2013-09-27) - -Golem, 1, -, 3|3, Judge, Enchantment Artifact Creature - Golem, Yeong-Hao Han, - -Soldier, 1, W, 1|1, League, Creature - Soldier, Johann Bodin, - -Cleric, 1, W, 2|1, -, Enchantment Creature - Cleric, Johann Bodin, - -Soldier, 2, W, 1|1, -, Creature - Soldier, Seb McKinnon, - -Soldier, 3, W, 1|1, -, Creature - Soldier, Svetlin Velinov, - -Bird, 4, U, 2|2, -, Creature - Bird, Peter Mohrbacher, Flying -Elemental, 5, U, 1|0, -, Creature - Elemental, Karl Kopinski, - -Harpy, 6, B, 1|1, -, Creature - Harpy, Nils Hamm, Flying -Soldier, 7, R, 1|1, -, Creature - Soldier, Johann Bodin, - -Boar, 8, G, 2|2, -, Creature - Boar, James Ryman, - -Satyr, 9, R G, 2|2, -, Creature - Satyr, Johann Bodin, - -Golem, 10, -, 3|3, -, Enchantment Artifact Creature - Golem, Yeong-Hao Han, - -Elspeth Emblem, 11, -, -, -, Emblem - Elspeth, Eric Deschamps, Creatures you control get +2/+2 and have flying. - -BNG - Born of the Gods (2014-02-07) - -Soldier, 1, W, 1|1, League, Enchantment Creature - Soldier, Ryan Barger, - -Bird, 1, W, 1|1, -, Creature - Bird, Clint Cearly, Flying -Cat Soldier, 2, W, 1|1, -, Creature - Cat Soldier, Scott Chou, Vigilance -Soldier, 3, W, 1|1, -, Enchantment Creature - Soldier, David Palumbo, - -Bird, 4, U, 2|2, -, Enchantment Creature - Bird, Mike Sass, Flying -Kraken, 5, U, 9|9, -, Creature - Kraken, Dan Scott, - -Zombie, 6, B, 2|2, -, Enchantment Creature - Zombie, Winona Nelson, - -Elemental, 7, R, 3|1, -, Enchantment Creature - Elemental, Greg Staples, - -Centaur, 8, G, 3|3, -, Enchantment Creature - Centaur, Ryan Barger, - -Wolf, 9, G, 2|2, -, Creature - Wolf, Raoul Vitale, - -Gold, 10, -, -, -, Artifact, Richard Wright, Sacrifice this artifact: Add one mana of any color. -Kiora Emblem, 11, -, -, -, Emblem - Kiora, Scott M. Fischer, At the beginning of your end step� put a 9/9 blue Kraken creature token onto the battlefield. - -DDM - Duel Decks: Jace vs. Vraska (2014-03-14) - -Assassin, T1, B, 1|1, -, Creature - Assassin, Svetlin Velinov, Whenever this creature deals combat damage to a player� that player loses the game. - -JOU - Journey into Nyx (2014-05-02) - -Minotaur, 1, R, 2|3, League, Creature - Minotaur, Scott Murphy, - -Sphinx, 1, U, 4|4, -, Creature - Sphinx, Jesper Ejsing, Flying -Zombie, 2, B, *|*, -, Creature - Zombie, Zack Stella, - -Minotaur, 3, R, 2|3, -, Creature - Minotaur, Craig J Spearing, - -Hydra, 4, G, *|*, -, Creature - Hydra, Steve Prescott, - -Spider, 5, G, 1|3, -, Enchantment Creature - Spider, Yohann Schepacz, Reach -Snake, 6, G B, 1|1, -, Enchantment Creature - Snake, Greg Staples, Deathtouch - -MD1 - Modern Event Deck 2014 (2014-05-30) - -Soldier, 1, W, 1|1, -, Creature - Soldier, Goran Josic, - -Spirit, 2, W, 1|1, -, Creature - Spirit, Kev Walker, Flying -Myr, 3, -, 1|1, -, Artifact Creature - Myr, Matt Stewart, - -Elspeth Emblem, 4, -, -, -, Emblem - Elspeth, Volkan Baga, Artifacts� creatures� enchantments� and lands you control have indestructible. - -CNS - Conspiracy (2014-06-06) - -Spirit, 1, W, 1|1, -, Creature - Spirit, Jeff Simpson, Flying -Demon, 2, B, *|*, -, Creature - Demon, Evan Shipard, Flying -Zombie, 3, B, 2|2, -, Creature - Zombie, Lucas Graciano, - -Ogre, 4, R, 4|4, -, Creature - Ogre, Dave Kendall, - -Elephant, 5, G, 3|3, -, Creature - Elephant, Lars Grant-West, - -Squirrel, 6, G, 1|1, -, Creature - Squirrel, Daniel Ljunggren, - -Wolf, 7, G, 2|2, -, Creature - Wolf, Raoul Vitale, - -Construct, 8, -, 1|1, -, Artifact Creature - Construct, Adam Paquette, Defender -Dack Emblem, 9, -, -, -, Emblem - Dack, Eric Deschamps, Whenever you cast a spell that targets one or more permanents� gain control of those permanents. - -M15 - Magic 2015 Core Set (2014-07-18) - -Wolf, 001, G, 1|1, Pre-Release, Creature - Wolf, David Palumbo, - -Sliver, 001, -, 1|1, -, Creature - Sliver, Igor Kieryluk, - -Squid, 001, U, 1|1, League, Creature - Squid, Richard Wright, Islandwalk -Soldier, 002, W, 1|1, -, Creature - Soldier, Greg Staples, - -Spirit, 003, W, 1|1, -, Creature - Spirit, Mike Sass, Flying -Squid, 004, U, 1|1, -, Creature - Squid, Jack Wang, Islandwalk -Beast, 005, B, 3|3, -, Creature - Beast, John Donahue, Deathtouch -Zombie, 006, B, 2|2, -, Creature - Zombie, Lucas Graciano, - -Dragon, 007, R, 2|2, -, Creature - Dragon, Jack Wang, Flying {R}: This creature gets +1/+0 until end of turn. -Goblin, 008, R, 1|1, -, Creature - Goblin, Karl Kopinski, - -Beast, 009, G, 3|3, -, Creature - Beast, Dave Kendall, - -Insect, 010, G, 1|1, -, Creature - Insect, Martina Pilcerova, Flying� deathtouch -Treefolk Warrior, 011, G, *|*, -, Creature - Treefolk Warrior, Todd Lockwood, This creature's power and toughness are each equal to the number of Forests you control. -Land Mine, 012, -, -, -, Artifact, Kev Walker, {R}� Sacrifice this artifact: This artifact deals 2 damage to target attacking creature without flying. -Ajani Emblem, 013, -, -, -, Emblem - Ajani, Chris Rahn, If a source would deal damage to you or a planeswalker you control� prevent all but 1 of that damage. -Garruk Emblem, 014, -, -, -, Emblem - Garruk, Tyler Jacobson, Whenever a creature attacks you� it gets +5/+5 and gains trample until end of turn. - -DDN - Duel Decks: Speed vs. Cunning (2014-09-05) - -Goblin, 082, R, 1|1, -, Creature - Goblin, Karl Kopinski, - - -KTK - Khans of Tarkir (2014-09-26) - -Warrior, 001, W, 1|1, League, Creature - Warrior, Winona Nelson, - -Bird, 001, W, 3|4, -, Creature - Bird, Mark Zug, Flying -Spirit, 002, W, 1|1, -, Creature - Spirit, Mike Sass, Flying -Warrior, 003, W, 1|1, -, Creature - Warrior, Ryan Barger, - -Warrior, 004, W, 1|1, -, Creature - Warrior, Yefim Kligerman, - -Vampire, 005, B, 2|2, -, Creature - Vampire, Cynthia Sheppard, Flying -Zombie, 006, B, 2|2, -, Creature - Zombie, Wayne Reynolds, - -Goblin, 007, R, 1|1, -, Creature - Goblin, Kev Walker, - -Bear, 008, G, 4|4, -, Creature - Bear, Kev Walker, - -Snake, 009, G, 1|1, -, Creature - Snake, Lars Grant-West, - -Spirit Warrior, 010, B G, *|*, -, Creature - Spirit Warrior, Ryan Alexander Lee, - -Morph, 011, -, 2|2, -, Creature, Raymond Swanland, (You can cover a face-down creature with this reminder card. A card with morph can be turned face up any time for its morph cost.) -Sarkhan Emblem, 012, -, -, -, Emblem - Sarkhan, Daarken, At the beginning of your draw step� draw two additional cards. At the beginning of your end step� discard your hand. -Sorin Emblem, 013, -, -, -, Emblem - Sorin, Cynthia Sheppard, At the beginning of each opponent's upkeep� that player sacrifices a creature. - -C14 - Commander 2014 (2014-11-07) - -Angel, 001, W, 4|4, -, Creature - Angel, Anthony Palumbo, Flying -Cat, 002, W, 2|2, -, Creature - Cat, Scott Chou, - -Goat, 003, W, -, -, Creature - Goat, Adam Paquette, - -Kor Soldier, 004, W, 1|1, -, Creature - Kor Soldier, Daren Bader, - -Pegasus, 005, W, 1|1, -, Creature - Pegasus, Greg Hildebrandt, Flying -Soldier, 006, W, 1|1, -, Creature - Soldier, Goran Josic, - -Spirit, 007, W, 1|1, -, Creature - Spirit, Ryan Yee, Flying -Fish, 008, U, 3|3, -, Creature - Fish, Dan Scott, When this creature dies� put a 6/6 blue Whale creature token onto the battlefield with "When this creature dies� put a 9/9 blue Kraken creature token onto the battlefield." -Kraken, 009, U, 9|9, -, Creature - Kraken, Dan Scott, - -Whale, 010, U, 6|6, -, Creature - Whale, Dan Scott, When this creature dies� put a 9/9 blue Kraken creature token onto the battlefield. -Zombie, 011, U, *|*, -, Creature - Zombie, Dave Kendall, - -Demon, 012, B, *|*, -, Creature - Demon, Pete Venters, Flying -Demon, 013, B, 5|5, -, Creature - Demon, Kev Walker, Flying -Germ, 014, B, -, -, Creature - Germ, Igor Kieryluk, - -Horror, 015, B, *|*, -, Creature - Horror, Jason Felix, - -Zombie, 016, B, 2|2, -, Creature - Zombie, Lucas Graciano, - -Goblin, 017, R, 1|1, -, Creature - Goblin, Dave Kendall, - -Ape, 018, G, 3|3, -, Creature - Ape, Lars Grant-West, - -Beast, 019, G, 3|3, -, Creature - Beast, Dave Allsop, - -Beast, 020, G, 4|4, -, Creature - Beast, Steve Prescott, - -Elemental, 021, G, 5|3, -, Creature - Elemental, Nils Hamm, - -Elephant, 022, G, 3|3, -, Creature - Elephant, Lars Grant-West, - -Elf Druid, 023, G, 1|1, -, Creature - Elf Druid, Raymond Swanland, {T}: Add {G}. -Elf Warrior, 024, G, 1|1, -, Creature - Elf Warrior, William O'Connor, - -Treefolk, 025, G, *|*, -, Creature - Treefolk, Filip Burburan, - -Wolf, 026, G, 2|2, -, Creature - Wolf, Daren Bader, - -Gargoyle, 027, -, 3|4, -, Artifact Creature - Gargoyle, Paul Bonner, Flying -Myr, 028, -, 1|1, -, Artifact Creature - Myr, Ryan Pancoast, - -Pentavite, 029, -, 1|1, -, Artifact Creature - Pentavite, Greg Staples, Flying -Stoneforged Blade, 030, -, -, -, Artifact - Equipment, Eric Deschamps, Indestructible Equipped creature gets +5/+5 and has double strike. Equip {0} -Tuktuk The Returned, 031, -, 5|5, -, Legendary Artifact Creature - Goblin Golem, Franz Vohwinkel, - -Wurm, 032, -, 3|3, -, Artifact Creature - Wurm, Raymond Swanland, Deathtouch -Wurm, 033, -, 3|3, -, Artifact Creature - Wurm, Raymond Swanland, Lifelink -Teferi Emblem, 034, -, -, -, Emblem - Teferi, Tyler Jacobson, You may activate loyalty abilities of planeswalkers you control on any player's turn any time you could cast an instant. -Nixilis Emblem, 035, -, -, -, Emblem - Nixilis, Daarken, {1}{B}� Sacrifice a creature: You gain X life and draw X cards� where X is the sacrificed creature's power. -Daretti Emblem, 036, -, -, -, Emblem - Daretti, Dan Scott, Whenever an artifact is put into your graveyard from the battlefield� return that card to the battlefield at the beginning of the next end step. - -DD3_EVG - Duel Decks Anthology� Elves vs. Goblins (2014-12-05) - -Elemental, 001, G, 7|7, -, Creature - Elemental, Anthony S. Waters, Trample -Elf Warrior, 002, G, 1|1, -, Creature - Elf Warrior, Dominick Domingo, - -Goblin, 003, R, 1|1, -, Creature - Goblin, Dave Kendall, - - -DD3_JVC - Duel Decks Anthology� Jace vs. Chandra (2014-12-05) - -Elemental Shaman, 004, R, 3|1, -, Creature - Elemental Shaman, Jim Pavelec, - - -DD3_DVD - Duel Decks Anthology� Divine vs. Demonic (2014-12-05) - -Spirit, 005, W, 1|1, -, Creature - Spirit, Luca Zontini, Flying -Demon, 006, B, *|*, -, Creature - Demon, Pete Venters, Flying -Thrull, 007, B, -, -, Creature - Thrull, Veronique Meignaud, - - -DD3_GVL - Duel Decks Anthology� Garruk vs. Liliana (2014-12-05) - -Beast, 008, G, 3|3, -, Creature - Beast, John Donahue, - -Beast, 009, G, 4|4, -, Creature - Beast, Steve Prescott, - -Elephant, 010, G, 3|3, -, Creature - Elephant, Arnie Swekel, - -Bat, 011, B, 1|1, -, Creature - Bat, Wayne Reynolds, Flying - -FRF - Fate Reforged (2015-01-23) - -Monk, 001, W, 1|1, -, Creature - Monk, Steven Belledin, Prowess -Monk, 001T, W, 1|1, League, Creature - Monk, Magali Villeneuve, Prowess -Spirit, 002, W, 1|1, -, Creature - Spirit, Aaron Miller, Flying -Warrior, 003, B, 2|1, -, Creature - Warrior, Zoltan Boros, - -Manifest, 004, -, 2|2, -, Creature, Raymond Swanland, (You can cover a face-down manifested creature with this reminder card. A manifested creature card can be turned face up any time for its mana cost. A face-down card can also be turned face up for its morph cost.) - -DDO - Duel Decks: Elspeth vs. Kiora (2015-02-27) - -Soldier, 066, W, 1|1, -, Creature - Soldier, Svetlin Velinov, - -Kraken, 067, U, 9|9, -, Creature - Kraken, Dan Scott, - - -DTK - Dragons of Tarkir (2015-03-27) - -Warrior, 001, W, 1|1, -, Creature - Warrior, Aaron Miller, - -Djinn Monk, 002, U, 2|2, -, Creature - Djinn Monk, Izzy, Flying -Zombie, 003, B, 2|2, -, Creature - Zombie, Vincent Proce, - -Zombie Horror, 004, B, *|*, -, Creature - Zombie Horror, Nils Hamm, - -Dragon, 005, R, 4|4, -, Creature - Dragon, Gabor Szikszai, Flying -Goblin, 006, R, 1|1, -, Creature - Goblin, Mike Bierek, - -Morph, 007, -, 2|2, -, Creature, Raymond Swanland, (You can cover a face-down creature with this reminder card. A card with morph can be turned face up any time for its morph cost.) -Narset Emblem, 008, -, -, -, Emblem - Narset, Magali Villeneuve, Your opponents can't cast noncreature spells. - -MM2 - Modern Masters 2015 Edition (2015-05-22) - -Eldrazi Spawn, 001, -, -, -, Creature - Eldrazi Spawn, Aleksi Briclot, Sacrifice this creature: Add {1}. -Eldrazi Spawn, 002, -, -, -, Creature - Eldrazi Spawn, Mark Tedin, Sacrifice this creature: Add {1}. -Eldrazi Spawn, 003, -, -, -, Creature - Eldrazi Spawn, Veronique Meignaud, Sacrifice this creature: Add {1}. -Soldier, 004, W, 1|1, -, Creature - Soldier, Greg Staples, - -Spirit, 005, W, 1|1, -, Creature - Spirit, Mike Sass, Flying -Faerie Rogue, 006, B, 1|1, -, Creature - Faerie Rogue, Dave Allsop, Flying -Germ, 007, B, -, -, Creature - Germ, Igor Kieryluk, - -Thrull, 008, B, 1|1, -, Creature - Thrull, Mark Tedin, - -Elephant, 009, G, 3|3, -, Creature - Elephant, Lars Grant-West, - -Insect, 010, G, 1|1, -, Creature - Insect, Ron Spencer, - -Saproling, 011, G, 1|1, -, Creature - Saproling, Warren Mahy, - -Snake, 012, G, 1|1, -, Creature - Snake, Austin Hsu, - -Wolf, 013, G, 2|2, -, Creature - Wolf, Daren Bader, - -Worm, 014, B G, 1|1, -, Creature - Worm, Chuck Lukacs, - -Golem, 015, -, 3|3, -, Artifact Creature - Golem, Nic Klein, - -Myr, 016, -, 1|1, -, Artifact Creature - Myr, Ryan Pancoast, - - -ORI - Magic Origins (2015-07-17) - -Angel, 001, W, 4|4, -, Creature - Angel, Cyril Van Der Haegen, Flying -Knight, 002, W, 2|2, -, Creature - Knight, Matt Stewart, Vigilance -Soldier, 003, W, 1|1, -, Creature - Soldier, Steve Prescott, - -Demon, 004, B, 5|5, -, Creature - Demon, Kev Walker, Flying -Zombie, 005, B, 2|2, -, Creature - Zombie, Lucas Graciano, - -Goblin, 006, R, 1|1, -, Creature - Goblin, Brandon Kitkouski, - -Ashaya� the Awoken World, 007, G, 4|4, -, Legendary Creature - Elemental, Raymond Swanland, - -Elemental, 008, G, 2|2, -, Creature - Elemental, Marco Nelor, - -Elf Warrior, 009, G, 1|1, -, Creature - Elf Warrior, William O'Connor, - -Thopter, 010, -, 1|1, -, Artifact Creature - Thopter, Adam Paquette, Flying -Thopter, 011, -, 1|1, -, Artifact Creature - Thopter, Svetlin Velinov, Flying -Jace Emblem, 012, -, -, -, Emblem - Jace, Jaime Jones, Whenever you cast a spell� target opponent puts the top five cards of their library into their graveyard. -Liliana Emblem, 013, -, -, -, Emblem - Liliana, Karla Ortiz, Whenever a creature dies� return it to the battlefield under your control at the beginning of the next end step. -Chandra Emblem, 014, -, -, -, Emblem - Chandra, Eric Deschamps, At the beginning of your upkeep� this emblem deals 3 damage to you. - -DDP - Duel Decks: Zendikar vs. Eldrazi (2015-08-28) - -Eldrazi Spawn, 076, -, -, -, Creature - Eldrazi Spawn, Aleksi Briclot, Sacrifice this creature: Add {1}. -Eldrazi Spawn, 077, -, -, -, Creature - Eldrazi Spawn, Veronique Meignaud, Sacrifice this creature: Add {1}. -Eldrazi Spawn, 078, -, -, -, Creature - Eldrazi Spawn, Mark Tedin, Sacrifice this creature: Add {1}. -Hellion, 1, R, 4|4, -, Creature - Hellion, Anthony Francisco, - -Plant, 080, G, -, -, Creature - Plant, Daren Bader, - - -BFZ - Battle for Zendikar (2015-10-09) - -Eldrazi, 001, -, 10|10, -, Creature - Eldrazi, Jack Wang, - -Eldrazi Scion, 002, -, 1|1, -, Creature - Eldrazi Scion, Izzy, Sacrifice this creature: Add {1}. -Eldrazi Scion, 003, -, 1|1, -, Creature - Eldrazi Scion, Winona Nelson, Sacrifice this creature: Add {1}. -Eldrazi Scion, 004, -, 1|1, -, Creature - Eldrazi Scion, Svetlin Velinov, Sacrifice this creature: Add {1}. -Knight Ally, 005, W, 2|2, -, Creature - Knight Ally, Josu Hernaiz, - -Kor Ally, 006, W, 1|1, -, Creature - Kor Ally, Jeremy Wilson, - -Octopus, 007, U, 8|8, -, Creature - Octopus, Craig J Spearing, - -Dragon, 008, R, 5|5, -, Creature - Dragon, Raymond Swanland, Flying -Plant, 009, G, 1|1, -, Creature - Plant, Sam Burley, - -Elemental, 009, R, 3|1, -, Creature - Elemental, Victor Adame Minguez, Trample� Haste -Elemental, 011, G R, 5|5, -, Creature - Elemental, Brad Rigney, - -Gideon Emblem, 012, -, -, -, Emblem - Gideon, Eric Deschamps, - -Nixilis Emblem, 013, -, -, -, Emblem - Nixilis, Chris Rahn, - -Kiora Emblem, 014, -, -, -, Emblem - Kiora, Jason Chan, - - -C15 - Commander 2015 (2015-11-13) - -Shapeshifter, 001, -, 1|1, -, Creature - Shapeshifter, Franz Vohwinkel, Changeling -Angel, 002, W, 4|4, -, Creature - Angel, Cyril Van Der Haegen, Flying -Cat, 003, W, 2|2, -, Creature - Cat, Jesper Ejsing, - -Knight, 004, W, 2|2, -, Creature - Knight, Hideaki Takamura, First strike -Knight, 005, W, 2|2, -, Creature - Knight, Matt Stewart, Vigilance -Drake, 006, U, 2|2, -, Creature - Drake, Svetlin Velinov, Flying -Germ, 007, B, -, -, Creature - Germ, Igor Kieryluk, - -Zombie, 008, B, 2|2, -, Creature - Zombie, Lucas Graciano, - -Dragon, 009, R, 5|5, -, Creature - Dragon, Jim Pavelec, Flying -Elemental Shaman, 010, R, 3|1, -, Creature - Elemental Shaman, Jim Pavelec, - -Lightning Ranger, 011, R, 5|1, -, Creature - Elemental, Svetlin Velinov, Trample� Haste At the beginning of your end step� sacrifice this creature. -Bear, 012, G, 2|2, -, Creature - Bear, Heather Hudson, - -Beast, 013, G, 4|4, -, Creature - Beast, Svetlin Velinov, - -Elephant, 014, G, 3|3, -, Creature - Elephant, Lars Grant-West, - -Frog Lizard, 015, G, 3|3, -, Creature - Frog Lizard, Jack Wang, - -Saproling, 016, G, 1|1, -, Creature - Saproling, Brad Rigney, - -Snake, 017, G, 1|1, -, Creature - Snake, Dan Scott, - -Spider, 018, G, 1|2, -, Creature - Spider, Daniel Ljunggren, Reach -Wolf, 019, G, 2|2, -, Creature - Wolf, David Palumbo, - -Elemental, 020, U R, 5|5, -, Creature - Elemental, Randy Gallegos, Flying -Snake, 021, G U, 1|1, -, Creature - Snake, Christopher Moeller, - -Spirit, 022, W B, 1|1, -, Creature - Spirit, Cliff Childs, Flying -Spirit, 023, W B, *|*, -, Enchantment Creature - Spirit, Adam Paquette, This creature's power and toughness are each equal to the number of experience counters you have. -Gold, 024, -, -, -, Artifact, Richard Wright, Sacrifice this artifact: Add one mana of any color. - -OGW - Oath of the Gatewatch (2016-01-22) - -Eldrazi Scion, 001, -, 1|1, -, Creature - Eldrazi Scion, Izzy, Sacrifice this creature: Add {1}. -Eldrazi Scion, 002, -, 1|1, -, Creature - Eldrazi Scion, Craig J Spearing, Sacrifice this creature: Add {1}. -Eldrazi Scion, 003, -, 1|1, -, Creature - Eldrazi Scion, Svetlin Velinov, Sacrifice this creature: Add {1}. -Eldrazi Scion, 004, -, 1|1, -, Creature - Eldrazi Scion, Izzy, Sacrifice this creature: Add {1}. -Eldrazi Scion, 005, -, 1|1, -, Creature - Eldrazi Scion, Winona Nelson, Sacrifice this creature: Add {1}. -Eldrazi Scion, 006, -, 1|1, -, Creature - Eldrazi Scion, Svetlin Velinov, Sacrifice this creature: Add {1}. -Angel, 007, W, 3|3, -, Creature - Angel, Anastasia Ovchinnikova, Flying -Zombie, 008, B, 2|2, -, Creature - Zombie, Kev Walker, - -Elemental, 009, R, 3|1, -, Creature - Elemental, Raymond Swanland, - -Elemental, 010, G, *|*, -, Creature - Elemental, Vincent Proce, - -Plant, 011, G, -, -, Creature - Plant, Daren Bader, - - -SOI - Shadows over Innistrad (2016-04-08) - -Angel, 001, W, 4|4, -, Creature - Angel, Magali Villeneuve, Flying -Human Soldier, 002, W, 1|1, -, Creature - Human Soldier, Deruchenko Alexander, - -Spirit, 003, W, 1|1, -, Creature - Spirit, Jason A. Engle, Flying -Vampire Knight, 004, B, 1|1, -, Creature - Vampire Knight, Deruchenko Alexander, Lifelink -Zombie, 005, B, 2|2, -, Creature - Zombie, Craig J Spearing, - -Devil, 006, R, 1|1, -, Creature - Devil, Wayne England, When this creature dies� it deals 1 damage to any target. -Insect, 007, G, 1|1, -, Creature - Insect, Christopher Moeller, - -Ooze, 008, G, 3|3, -, Creature - Ooze, Nils Hamm, - -Wolf, 009, G, 2|2, -, Creature - Wolf, Aaron Miller, - -Human Cleric, 010, W B, 1|1, -, Creature - Human Cleric, Min Yum, - -Clue, 011, -, -, -, Artifact - Clue, John Avon, {2}‚ Sacrifice this Artifact: Draw a card. -Clue, 012, -, -, -, Artifact - Clue, Noah Bradley, {2}‚ Sacrifice this Artifact: Draw a card. -Clue, 013, -, -, -, Artifact - Clue, Zezhou Chen, {2}‚ Sacrifice this Artifact: Draw a card. -Clue, 014, -, -, -, Artifact - Clue, Cliff Childs, {2}‚ Sacrifice this Artifact: Draw a card. -Clue, 015, -, -, -, Artifact - Clue, James Paick, {2}‚ Sacrifice this Artifact: Draw a card. -Clue, 016, -, -, -, Artifact - Clue, Franz Vohwinkel, {2}‚ Sacrifice this Artifact: Draw a card. -Jace Emblem, 017, -, -, -, Emblem - Jace, Tyler Jacobson, Whenever an opponent casts their first spell each turn� counter that spell. -Arlinn Emblem, 018, -, -, -, Emblem - Arlinn, Winona Nelson, Creatures you control have haste and '{T}: This creature deals damage equal to its power to any target.' - - -SWS - Star Wars Custom set - -Rebel, 001, W, 1|1, -, Creature - Rebel, Alex Konstad, - -Trooper, 002, W, 1|1, -, Creature - Trooper, Darren Tan, - -Tusken Raider, 003, W, 1|1, -, Creature - Tusken Raider, William O'Connor, - -Ewok, 004, G, 1|1, -, Creature - Ewok, Chris NG, - -Hunter, 005, R, 4|4, -, Creature - Hunter, Steve Argyle, - -Royal Guard, 006, R, 2|2, -, Creature - Soldier, Aldo Katayanagi, First Strike -AT-AT, 007, -, 5|5, -, Artifact Creature - AT-AT, Prokhoda, When this creature dies� create two 1/1 white Trooper creature tokens. -B-Wing, 008, -, 1|1, -, Artifact Creature - Rebel Starship, Anthony Devine, Spaceflight -Droid, 009, -, 1|1, -, Artifact Creature - Droid, PeetuGee, - -TIE Fighter, 010, -, 1|1, -, Artifact Creature - Starship, Darren Tan, Spaceflight -Yoda Emblem, 011, -, -, -, Emblem - Yoda, Jerry Vanderstelt, Hexproof� you and your creatures have. -Obi-Wan Kenobi Emblem, 012, -, -, -, Emblem - Obi-Wan Kenobi, Jerry Vanderstelt, Creatures you control get +1/+1 and have vigilance� first strike� and lifelink. -Aurra Sing Emblem, 013, -, -, -, Emblem - Aurra Sing, Willman1701, Whenever a nontoken creature you control leaves the battlefield� discard a card. diff --git a/Mage.Client/src/test/java/mage/client/game/TokensMtgImageSourceTest.java b/Mage.Client/src/test/java/mage/client/game/TokensMtgImageSourceTest.java deleted file mode 100644 index e1e6c209a2bb..000000000000 --- a/Mage.Client/src/test/java/mage/client/game/TokensMtgImageSourceTest.java +++ /dev/null @@ -1,33 +0,0 @@ -package mage.client.game; - -import org.junit.Assert; -import org.junit.Ignore; -import org.junit.Test; -import org.mage.plugins.card.dl.sources.CardImageSource; -import org.mage.plugins.card.dl.sources.CardImageUrls; -import org.mage.plugins.card.dl.sources.TokensMtgImageSource; -import org.mage.plugins.card.images.CardDownloadData; - -/** - * @author Quercitron - */ -@Ignore -public class TokensMtgImageSourceTest { - - @Test - public void generateTokenUrlTest() throws Exception { - CardImageSource imageSource = TokensMtgImageSource.instance; - - CardImageUrls url = imageSource.generateTokenUrl(new CardDownloadData("Thopter", "ORI", "0", false, 1)); - Assert.assertEquals("https://tokens.mtg.onl/tokens/ORI_010-Thopter.jpg", url.getBaseUrl()); - - url = imageSource.generateTokenUrl(new CardDownloadData("Thopter", "ORI", "0", false, 2)); - Assert.assertEquals("https://tokens.mtg.onl/tokens/ORI_011-Thopter.jpg", url.getBaseUrl()); - - url = imageSource.generateTokenUrl(new CardDownloadData("Ashaya, the Awoken World", "ORI", "0", false, 0)); - Assert.assertEquals("https://tokens.mtg.onl/tokens/ORI_007-Ashaya,-the-Awoken-World.jpg", url.getBaseUrl()); - - url = imageSource.generateTokenUrl(new CardDownloadData("Emblem Gideon, Ally of Zendikar", "BFZ", "0", false, 0)); - Assert.assertEquals("https://tokens.mtg.onl/tokens/BFZ_012-Gideon-Emblem.jpg", url.getBaseUrl()); - } -}