diff --git a/Mage.Client/release/sample-decks/AI/FastRedHaste.dck b/Mage.Client/release/sample-decks/AI/FastRedHaste.dck new file mode 100644 index 00000000000..971dbf13e31 --- /dev/null +++ b/Mage.Client/release/sample-decks/AI/FastRedHaste.dck @@ -0,0 +1,77 @@ +NAME:FastRedHaste +16 [DOM:262] Mountain +1 [8ED:200] Lightning Blast +1 [M15:35] Soulmender +1 [M11:149] Lightning Bolt +1 [ZEN:142] Punishing Fire +1 [C16:16] Charging Cinderhorn +1 [M13:200] Akroma's Memorial +1 [RAV:193] Boros Swiftblade +1 [3ED:296] Plateau +1 [EMN:149] Weaver of Lightning +1 [BNG:108] Satyr Firedancer +1 [WTH:93] Cinder Giant +1 [DGM:56] Blaze Commando +1 [TSP:180] Sulfurous Blast +1 [BFZ:150] Outnumber +1 [M14:139] Flames of the Firebrand +1 [INV:11] Crimson Acolyte +1 [LEG:247] Hammerheim +1 [KLD:246] Inspiring Vantage +1 [DGM:107] Tajic, Blade of the Legion +1 [GTC:97] Legion Loyalist +1 [USG:11] Disciple of Law +1 [ORI:143] Exquisite Firecraft +1 [KLD:130] Skyship Stalker +1 [XLN:145] Firecannon Blast +1 [AKH:21] Oketra the True +1 [OGW:175] Needle Spires +1 [ISD:23] Mikaeus, the Lunarch +1 [WWK:90] Searing Blaze +1 [ZEN:119] Burst Lightning +1 [ISD:4] Avacynian Priest +1 [ODY:200] Lava Blister +1 [EVE:139] Figure of Destiny +1 [LEG:175] Clergy of the Holy Nimbus +1 [LEG:133] Beasts of Bogardan +1 [DTK:151] Roast +1 [ME4:113] Fire Imp +1 [RAV:255] Boros Signet +1 [RAV:213] Lightning Helix +1 [M11:129] Chandra's Spitfire +1 [SOI:28] Nahiri's Machinations +1 [GTC:215] Boros Reckoner +1 [OGW:105] Cinder Hellion +1 [M13:148] Slumbering Dragon +1 [M12:133] Flameblast Dragon +1 [CHK:40] Reciprocate +2 [ODY:193] Firebolt +1 [DKA:93] Hellrider +1 [ZEN:127] Goblin Ruinblaster +1 [FUT:115] Ghostfire +1 [M10:34] Soul Warden +1 [HOU:104] Neheb, the Eternal +1 [HOU:103] Manticore Eternal +1 [HOU:92] Firebrand Archer +1 [AVR:141] Hound of Griselbrand +1 [ONS:189] Blistering Firecat +1 [VIS:125] Zhalfirin Crusader +1 [RAV:243] Boros Recruit +1 [ROE:15] Caravan Escort +1 [C14:40] Volcanic Offering +1 [SOI:190] Village Messenger +1 [KTK:118] Monastery Swiftspear +1 [C15:28] Meteor Blast +1 [KTK:11] Firehoof Cavalry +12 [DOM:250] Plains +1 [DIS:10] Guardian of the Guildpact +1 [MMQ:53] Thermal Glider +1 [HOU:20] Sandblast +1 [DKA:84] Burning Oil +1 [TSB:72] Wildfire Emissary +1 [KLD:236] Snare Thopter +1 [DTK:134] Draconic Roar +1 [2ED:245] Gauntlet of Might +1 [ONS:199] Dwarven Blastminer +LAYOUT MAIN:(1,8)(CARD_TYPE,false,50)|([KLD:236])([M13:200],[RAV:255],[2ED:245])([BNG:108])([M15:35],[C16:16],[EMN:149],[KLD:130],[TSB:72],[ISD:23],[ISD:4],[LEG:133],[ZEN:127],[HOU:104],[HOU:103],[AVR:141],[ONS:189],[RAV:243],[ROE:15],[SOI:190],[KTK:118],[MMQ:53],[ONS:199],[DKA:93],[WTH:93],[DGM:56],[INV:11],[DGM:107],[GTC:97],[USG:11],[AKH:21],[M12:133],[LEG:175],[ME4:113],[M11:129],[OGW:105],[M13:148],[M10:34],[HOU:92],[VIS:125],[EVE:139],[KTK:11],[DIS:10],[RAV:193],[GTC:215])([SOI:28])([ZEN:119],[CHK:40],[C14:40],[M11:149],[DTK:134],[8ED:200],[ZEN:142],[WWK:90],[TSP:180],[BFZ:150],[HOU:20],[FUT:115],[RAV:213],[DKA:84])([DOM:262],[DOM:250],[DOM:250],[DOM:250],[DOM:250],[KLD:246],[OGW:175],[DOM:262],[DOM:262],[DOM:262],[DOM:262],[DOM:250],[LEG:247],[DOM:262],[DOM:262],[DOM:262],[DOM:262],[DOM:250],[DOM:250],[DOM:262],[DOM:262],[3ED:296],[DOM:250],[DOM:262],[DOM:262],[DOM:262],[DOM:262],[DOM:250],[DOM:250],[DOM:250],[DOM:250],[DOM:262])([ODY:193],[XLN:145],[DTK:151],[ODY:193],[ORI:143],[ODY:200],[C15:28],[M14:139]) +LAYOUT SIDEBOARD:(0,0)(CMC,true,50)| diff --git a/Mage.Client/release/sample-decks/AI/Poison.dck b/Mage.Client/release/sample-decks/AI/Poison.dck new file mode 100644 index 00000000000..ef2dcb38b8e --- /dev/null +++ b/Mage.Client/release/sample-decks/AI/Poison.dck @@ -0,0 +1,98 @@ +1 [RAV:231] Sisters of Stone Death +1 [THS:201] Reaper of the Wilds +1 [FUT:171] Llanowar Reborn +1 [KLD:243] Blooming Marsh +1 [ALA:225] Jund Panorama +1 [MIR:12] Crypt Cobra +1 [ZEN:221] Oran-Rief, the Vastwood +1 [STH:132] Mox Diamond +1 [M15:194] Reclamation Sage +NAME:Poison +1 [M13:168] Elvish Archdruid +1 [STH:137] Volrath's Stronghold +1 [FUT:174] Dryad Arbor +1 [M15:101] Indulgent Tormentor +1 [DKA:125] Scorned Villager +9 [DOM:266] Forest +1 [USG:321] Gaea's Cradle +1 [ORI:101] Graveblade Marauder +1 [MOR:140] Wolf-Skull Shaman +1 [RTR:229] Golgari Keyrune +1 [GTC:123] Gyre Sage +1 [CON:144] Rupture Spire +1 [LRW:268] Gilt-Leaf Palace +1 [ORI:100] Gnarlroot Trapper +1 [CHK:236] Orochi Sustainer +1 [THS:153] Bow of Nylea +1 [SOM:79] Skithiryx, the Blight Dragon +1 [MBS:94] Viridian Corrupter +1 [SOM:170] Leaden Myr +1 [C13:84] Ophiomancer +1 [M13:118] Xathrid Gorgon +1 [JOU:154] Pharika, God of Affliction +1 [MBS:96] Glissa, the Traitor +1 [NPH:111] Glistener Elf +1 [MBS:90] Rot Wolf +1 [M15:183] Life's Legacy +1 [RAV:262] Golgari Signet +1 [EMN:159] Gnarlwood Dryad +1 [M12:195] Skinshifter +1 [NPH:119] Phyrexian Swarmlord +1 [DGM:26] Maze Abomination +1 [OGW:172] Holdout Settlement +1 [M14:168] Deadly Recluse +1 [OGW:171] Hissing Quagmire +1 [AER:70] Resourceful Return +1 [SOI:203] Duskwatch Recruiter +1 [M14:207] Darksteel Ingot +1 [SOI:202] Deathcap Cultivator +1 [MBS:125] Plague Myr +1 [BNG:68] Fate Unraveler +1 [BFZ:225] Pathway Arrows +1 [ODY:282] Werebear +1 [VMA:250] Deathreap Ritual +1 [MBS:121] Phyrexian Juggernaut +1 [SOM:166] Ichorclaw Myr +1 [CHK:238] Sachi, Daughter of Seshiro +1 [LRW:250] Nath of the Gilt-Leaf +1 [WWK:140] Quicksand +1 [SOM:185] Necropede +1 [SOM:140] Bladed Pinions +1 [SOM:66] Hand of the Praetors +1 [CMA:186] Meren of Clan Nel Toth +1 [SHM:273] Leechridden Swamp +1 [NPH:72] Reaper of Sheoldred +1 [MIR:136] Sabertooth Cobra +1 [RTR:243] Overgrown Tomb +1 [AER:106] Druid of the Cowl +1 [AKH:237] Throne of the God-Pharaoh +1 [AVR:107] Harvester of Souls +1 [DTK:204] Shaman of Forgotten Ways +1 [BFZ:170] Beastcaller Savant +1 [BNG:122] Graverobber Spider +1 [DTK:123] Ukud Cobra +1 [MBS:57] Virulent Wound +1 [EVE:79] Twinblade Slasher +1 [MBS:77] Blightwidow +1 [MRD:270] Viridian Longbow +1 [EVE:124] Noxious Hatchling +1 [MOR:145] Thornbite Staff +1 [ALA:71] Deathgreeter +1 [FRF:169] Jungle Hollow +1 [BOK:136] Matsu-Tribe Sniper +1 [RAV:283] Svogthos, the Restless Tomb +1 [KTK:152] Sultai Flayer +1 [RTR:198] Sluiceway Scorpion +1 [M12:81] Blood Seeker +1 [AER:117] Narnam Renegade +6 [DOM:258] Swamp +1 [LRW:219] Immaculate Magistrate +1 [EMN:175] Ulvenwald Captive +1 [THS:91] Hythonia the Cruel +1 [APC:109] Llanowar Dead +1 [MBS:145] Inkmoth Nexus +1 [BFZ:240] Mortuary Mire +1 [SOM:223] Wurmcoil Engine +1 [AKH:187] Sixth Sense +LAYOUT MAIN:(1,11)(CARD_TYPE,false,50)|([SOM:170],[MBS:121],[MBS:125],[SOM:166],[SOM:185],[SOM:223])([THS:153])([MOR:145])([RTR:229],[BFZ:225],[SOM:140],[M14:207],[STH:132],[RAV:262],[AKH:237],[MRD:270])([JOU:154],[BNG:68])([FUT:174])([RAV:231],[M15:194],[M14:168],[M15:101],[DKA:125],[ORI:101],[ORI:100],[EMN:159],[M12:195],[NPH:119],[DGM:26],[SOI:203],[SOI:202],[LRW:250],[SOM:66],[NPH:72],[NPH:111],[AER:106],[DTK:123],[EVE:79],[EVE:124],[RTR:198],[AER:117],[EMN:175],[THS:91],[AVR:107],[THS:201],[ALA:71],[MIR:12],[MOR:140],[GTC:123],[CHK:236],[SOM:79],[MBS:94],[C13:84],[M13:118],[MBS:96],[MBS:90],[CMA:186],[M13:168],[CHK:238],[ODY:282],[MIR:136],[DTK:204],[BFZ:170],[BNG:122],[MBS:77],[BOK:136],[KTK:152],[M12:81],[LRW:219],[APC:109])([VMA:250],[AKH:187])([MBS:57])([KLD:243],[ZEN:221],[DOM:266],[DOM:266],[DOM:258],[DOM:258],[USG:321],[LRW:268],[RTR:243],[OGW:172],[OGW:171],[FUT:171],[DOM:266],[DOM:266],[DOM:266],[DOM:266],[DOM:266],[DOM:258],[WWK:140],[FRF:169],[MBS:145],[BFZ:240],[ALA:225],[DOM:258],[DOM:266],[STH:137],[SHM:273],[DOM:258],[DOM:258],[CON:144],[DOM:266],[RAV:283])([M15:183],[AER:70]) +LAYOUT SIDEBOARD:(0,0)(CMC,true,50)| diff --git a/Mage.Client/release/sample-decks/AI/Zombi & Skeleton.dck b/Mage.Client/release/sample-decks/AI/Zombi & Skeleton.dck new file mode 100644 index 00000000000..a5c0c8c1e15 --- /dev/null +++ b/Mage.Client/release/sample-decks/AI/Zombi & Skeleton.dck @@ -0,0 +1,118 @@ +NAME:Zombi & Skeleton +1 [FUT:171] Llanowar Reborn +1 [LGN:77] Noxious Ghoul +1 [M12:116] Vengeful Pharaoh +1 [E01:36] Overseer of the Damned +1 [TSP:135] Sudden Spoiling +1 [DKA:70] Mikaeus, the Unhallowed +1 [ZEN:108] Quest for the Gravelord +1 [KTK:73] Grim Haruspex +1 [MRD:285] Tree of Tales +1 [RAV:238] Vulturous Zombie +1 [LRW:265] Wanderer's Twig +1 [7ED:166] Stronghold Assassin +1 [BFZ:234] Canopy Vista +1 [C16:21] Benefactor's Draught +1 [MMQ:129] Dark Ritual +1 [MBS:50] Phyrexian Crusader +1 [6ED:162] Zombie Master +1 [CMD:227] Skullbriar, the Walking Grave +1 [EVE:180] Twilight Mire +1 [ISD:26] Paraselene +1 [DKA:63] Geralf's Messenger +1 [RTR:213] Deathrite Shaman +1 [DKA:64] Gravecrawler +1 [AKH:247] Scattered Groves +1 [LGN:80] Skinthinner +1 [SHM:279] Sapseep Forest +1 [AKH:91] Festering Mummy +1 [SCG:62] Consumptive Goo +1 [TSB:52] Undead Warchief +1 [AKH:99] Lord of the Accursed +1 [KTK:248] Windswept Heath +1 [SHM:273] Leechridden Swamp +1 [APC:86] Strength of Night +1 [DOM:241] Isolated Chapel +1 [AER:109] Heroic Intervention +2 [DOM:248] Woodland Cemetery +1 [MIR:296] Grasslands +1 [SOI:216] Loam Dryad +1 [SOM:63] Fume Spitter +1 [SOI:212] Inexorable Blob +1 [AKH:81] Bone Picker +1 [THS:89] Gray Merchant of Asphodel +1 [JUD:141] Krosan Verge +1 [TSP:206] Molder +1 [CSP:71] Stromgald Crusader +1 [CMD:98] Sewer Nemesis +1 [DOM:250] Plains +1 [M15:121] Wall of Limbs +1 [M15:111] Paragon of Open Graves +1 [ISD:170] Avacyn's Pilgrim +7 [DOM:258] Swamp +1 [SOI:107] Diregraf Colossus +1 [ROE:207] Snake Umbra +1 [ALA:70] Death Baron +1 [NPH:68] Phyrexian Obliterator +1 [OGW:26] Make a Stand +1 [EVE:117] Creakwood Liege +1 [EVE:119] Desecrator Hag +1 [ONS:312] Barren Moor +1 [HOU:171] Desert of the Glorified +1 [M11:229] Terramorphic Expanse +1 [AER:173] Renegade Map +1 [ALA:221] Bant Panorama +1 [CHK:122] Kokusho, the Evening Star +1 [AKH:6] Binding Mummy +1 [MIR:11] Choking Sands +1 [3ED:298] Scrubland +1 [WTH:152] Mana Web +4 [DOM:266] Forest +1 [PLC:145] Essence Warden +1 [ONS:164] Rotlung Reanimator +1 [TOR:78] Rancid Earth +1 [GTC:242] Godless Shrine +1 [ONS:324] Secluded Steppe +1 [ONS:326] Tranquil Thicket +1 [SOM:78] Skinrender +1 [ONS:327] Unholy Grotto +1 [MBS:96] Glissa, the Traitor +1 [3ED:283] Bayou +1 [10E:155] Lord of the Undead +1 [SHM:281] Wooded Bastion +1 [AKH:208] Wayward Servant +1 [4ED:299] Black Vise +1 [DTK:116] Risen Executioner +1 [JOU:120] Desecration Plague +1 [ODY:282] Werebear +1 [ROE:131] Virulent Swipe +1 [CMA:66] Scourge of Nel Toth +1 [SOK:69] Ghost-Lit Stalker +1 [RTR:174] Jarad, Golgari Lich Lord +1 [EMN:90] Graf Harvest +1 [JUD:72] Stitch Together +1 [3ED:274] Sol Ring +1 [GTC:182] Obzedat, Ghost Council +1 [TOR:51] Cabal Ritual +1 [EMN:89] Gavony Unhallowed +1 [BFZ:210] Drana's Emissary +1 [ISD:124] Victim of Night +1 [M13:92] Duty-Bound Dead +1 [SHM:229] Kitchen Finks +1 [TOR:57] Chainer's Edict +1 [PLC:127] Evolution Charm +1 [M14:195] Scavenging Ooze +1 [DKA:158] Vault of the Archangel +1 [M12:81] Blood Seeker +1 [DKA:80] Zombie Apocalypse +1 [DGM:132] Ready // Willing +1 [M14:103] Liliana's Reaver +1 [RTR:158] Dreg Mangler +1 [APC:109] Llanowar Dead +1 [M12:86] Cemetery Reaper +1 [NPH:25] Suture Priest +1 [AKH:104] Plague Belcher +1 [MRD:278] Ancient Den +1 [DTK:172] Ainok Survivalist +LAYOUT MAIN:(1,7)(CARD_TYPE,false,50)|([MRD:278],[MRD:285])([LRW:265],[4ED:299],[AER:173],[WTH:152],[3ED:274])([EVE:119],[LGN:77],[M12:116],[SHM:229],[M14:103],[THS:89],[DKA:70],[RTR:174],[RAV:238],[10E:155],[MBS:50],[CMD:227],[RTR:158],[DKA:63],[RTR:213],[DKA:64],[LGN:80],[7ED:166],[AKH:91],[SCG:62],[KTK:73],[TSB:52],[AKH:99],[SOI:216],[SOM:63],[SOI:212],[AKH:81],[M14:195],[CSP:71],[CMD:98],[M15:121],[M15:111],[6ED:162],[ISD:170],[SOI:107],[ALA:70],[NPH:68],[SOM:78],[SOK:69],[CHK:122],[AKH:6],[EVE:117],[ONS:164],[MBS:96],[E01:36],[M12:81],[AKH:208],[DTK:116],[PLC:145],[ODY:282],[EMN:89],[BFZ:210],[M13:92],[CMA:66],[GTC:182],[APC:109],[M12:86],[NPH:25],[AKH:104],[DTK:172])([ZEN:108],[ROE:207],[EMN:90])([C16:21],[MMQ:129],[TSP:135],[APC:86],[TOR:51],[AER:109],[TSP:206],[OGW:26],[ROE:131],[ISD:124],[PLC:127],[DGM:132])([M11:229],[DOM:258],[DOM:258],[DOM:258],[BFZ:234],[DOM:266],[AKH:247],[SHM:279],[DOM:266],[KTK:248],[FUT:171],[DOM:258],[MIR:296],[DOM:266],[JUD:141],[ONS:312],[HOU:171],[DOM:250],[DOM:258],[GTC:242],[ONS:324],[ONS:326],[ONS:327],[3ED:283],[SHM:273],[DOM:258],[ALA:221],[DOM:241],[DOM:258],[DOM:248],[DOM:248],[3ED:298],[EVE:180],[DOM:266],[SHM:281],[DKA:158])([JUD:72],[ISD:26],[TOR:57],[MIR:11],[TOR:78],[JOU:120],[DKA:80]) +LAYOUT SIDEBOARD:(0,0)(CMC,true,50)| diff --git a/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java b/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java index d428ad1f658..4d69a16ce86 100644 --- a/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java +++ b/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java @@ -6,12 +6,7 @@ import java.awt.Point; import java.awt.event.MouseEvent; import java.awt.event.MouseWheelEvent; import java.awt.image.BufferedImage; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.UUID; +import java.util.*; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; @@ -400,10 +395,10 @@ public class MageActionCallback implements ActionCallback { private void handlePopup(TransferData transferData) { MageCard mageCard = (MageCard) transferData.component; if (!popupTextWindowOpen - || mageCard.getOriginal().getId() != bigCard.getCardId()) { + || !Objects.equals(mageCard.getOriginal().getId(), bigCard.getCardId())) { if (bigCard.getWidth() > 0) { synchronized (MageActionCallback.class) { - if (!popupTextWindowOpen || mageCard.getOriginal().getId() != bigCard.getCardId()) { + if (!popupTextWindowOpen || !Objects.equals(mageCard.getOriginal().getId(), bigCard.getCardId())) { if (!popupTextWindowOpen) { bigCard.resetCardId(); } diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GrabbagImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GrabbagImageSource.java index ef5fa334df9..f089ae111cb 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GrabbagImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GrabbagImageSource.java @@ -50,22 +50,6 @@ public enum GrabbagImageSource implements CardImageSource { { add("PTC"); add("SWS"); -// add("EXP"); -// add("APAC"); -// add("ARENA"); -// add("FNMP"); -// add("GPX"); -// add("GRC"); -// add("JR"); -// add("MBP"); -// add("MGDC"); -// add("MLP"); -// add("MPRP"); -// add("MPS"); -// add("SUS"); -// add("UGIN"); -// add("WMCQ"); - } }; @@ -82,36 +66,10 @@ public enum GrabbagImageSource implements CardImageSource { @Override public String getNextHttpImageUrl() { return null; -// if (singleLinks == null) { -// setupLinks(); -// } -// -// for (String key : singleLinksDone.keySet()) { -// if (singleLinksDone.get(key) < maxTimes) { -// singleLinksDone.put(key, maxTimes); -// return getSourceName(key) + key; -// } -// } -// if (maxTimes < 2) { -// maxTimes++; -// } -// for (String key : singleLinksDone.keySet()) { -// if (singleLinksDone.get(key) < maxTimes) { -// singleLinksDone.put(key, maxTimes); -// return getSourceName(key) + key; -// } -// } -// return null; } @Override public String getFileForHttpImage(String httpImageUrl) { -// String copy = httpImageUrl; -// if (copy != null) { -// copy = copy.replaceFirst("http:\\/\\/static.starcitygames.com\\/sales\\/cardscans\\/", ""); -// copy = copy.replaceFirst("http:\\/\\/magiccards.info\\/scans\\/en\\/", ""); -// return singleLinks.get(copy); -// } return null; } @@ -120,7 +78,16 @@ public enum GrabbagImageSource implements CardImageSource { if (singleLinks == null) { setupLinks(); } - String url = singleLinks.get(card.getSet() + "/" + card.getName()); + + // multiple images card use special a,b,c,d versions + String url; + String postfix = card.getCollectorIdPostfix(); + if (postfix.isEmpty()) { + url = singleLinks.get(card.getSet() + "/" + card.getName()); + } else { + url = singleLinks.get(card.getSet() + "/" + card.getName() + "-" + postfix); + } + if (url != null) { return getSourceName(card, url) + url; } @@ -219,10 +186,10 @@ public enum GrabbagImageSource implements CardImageSource { singleLinks.put("SWS/Force Reflex", "RIlvXTz.jpg"); singleLinks.put("SWS/Force Scream", "EsagOnR.jpg"); singleLinks.put("SWS/Force Spark", "14MOM1y.jpg"); - singleLinks.put("SWS/Forest", "LIpeeP9.jpg"); - singleLinks.put("SWS/Forest", "jKwDwH7.jpg"); - singleLinks.put("SWS/Forest", "CVb3582.jpg"); - singleLinks.put("SWS/Forest", "q09fMW0.jpg"); + singleLinks.put("SWS/Forest-a", "LIpeeP9.jpg"); + singleLinks.put("SWS/Forest-b", "jKwDwH7.jpg"); + singleLinks.put("SWS/Forest-c", "CVb3582.jpg"); + singleLinks.put("SWS/Forest-d", "q09fMW0.jpg"); singleLinks.put("SWS/Fulfill Contract", "FtLMpHK.jpg"); singleLinks.put("SWS/Gamorrean Prison Guard", "4dgOMPA.jpg"); singleLinks.put("SWS/General Grievous", "tRLM8Hz.jpg"); @@ -249,10 +216,10 @@ public enum GrabbagImageSource implements CardImageSource { singleLinks.put("SWS/Interrogation", "kI2bIbo.jpg"); singleLinks.put("SWS/Ion Cannon", "Tb546IK.jpg"); singleLinks.put("SWS/Iron Fist of the Empire", "9Ui7NRn.jpg"); - singleLinks.put("SWS/Island", "GxITXBO.jpg"); - singleLinks.put("SWS/Island", "vKdg4fG.jpg"); - singleLinks.put("SWS/Island", "NPMxIew.jpg"); - singleLinks.put("SWS/Island", "cnqFMa6.jpg"); + singleLinks.put("SWS/Island-a", "GxITXBO.jpg"); + singleLinks.put("SWS/Island-b", "vKdg4fG.jpg"); + singleLinks.put("SWS/Island-c", "NPMxIew.jpg"); + singleLinks.put("SWS/Island-d", "cnqFMa6.jpg"); singleLinks.put("SWS/Ithorian Initiate", "2RYpp5o.jpg"); singleLinks.put("SWS/Jabba the Hutt", "QMz0sKa.jpg"); singleLinks.put("SWS/Jango Fett", "nEnspQP.jpg"); @@ -294,10 +261,10 @@ public enum GrabbagImageSource implements CardImageSource { singleLinks.put("SWS/Moisture Farm", "S6kJHtL.jpg"); singleLinks.put("SWS/Mon Calamari Cruiser", "ZHdTV7p.jpg"); singleLinks.put("SWS/Mon Calamari Initiate", "GBuXdGP.jpg"); - singleLinks.put("SWS/Mountain", "MCii4g1.jpg"); - singleLinks.put("SWS/Mountain", "Tb0ic31.jpg"); - singleLinks.put("SWS/Mountain", "wqXTdsC.jpg"); - singleLinks.put("SWS/Mountain", "9oBNCHk.jpg"); + singleLinks.put("SWS/Mountain-a", "MCii4g1.jpg"); + singleLinks.put("SWS/Mountain-b", "Tb0ic31.jpg"); + singleLinks.put("SWS/Mountain-c", "wqXTdsC.jpg"); + singleLinks.put("SWS/Mountain-d", "9oBNCHk.jpg"); singleLinks.put("SWS/N-1 Starfighter", "UH3qd7x.jpg"); singleLinks.put("SWS/Nebulon-B Frigate", "IwEpVkz.jpg"); singleLinks.put("SWS/Neophyte Hateflayer", "Has2AIW.jpg"); @@ -315,10 +282,10 @@ public enum GrabbagImageSource implements CardImageSource { singleLinks.put("SWS/Outer Rim Slaver", "xq8ozqq.jpg"); singleLinks.put("SWS/Outlaw Holocron", "mWbyX78.jpg"); singleLinks.put("SWS/Personal Energy Shield", "v6TGLne.jpg"); - singleLinks.put("SWS/Plains", "HgXaAKh.jpg"); - singleLinks.put("SWS/Plains", "Y0i7MBh.jpg"); - singleLinks.put("SWS/Plains", "4grXQVd.jpg"); - singleLinks.put("SWS/Plains", "kTmN8MM.jpg"); + singleLinks.put("SWS/Plains-a", "HgXaAKh.jpg"); + singleLinks.put("SWS/Plains-b", "Y0i7MBh.jpg"); + singleLinks.put("SWS/Plains-c", "4grXQVd.jpg"); + singleLinks.put("SWS/Plains-d", "kTmN8MM.jpg"); singleLinks.put("SWS/Plo Koon", "dDNi8CV.jpg"); singleLinks.put("SWS/Precipice of Mortis", "TRAPT86.jpg"); singleLinks.put("SWS/Predator's Strike", "pcBoUny.jpg"); @@ -378,10 +345,10 @@ public enum GrabbagImageSource implements CardImageSource { singleLinks.put("SWS/Strike Team Commando", "783ZFsF.jpg"); singleLinks.put("SWS/Super Battle Droid", "T8IjrKD.jpg"); singleLinks.put("SWS/Surprise Maneuver", "uaAmzz8.jpg"); - singleLinks.put("SWS/Swamp", "kBGj6vk.jpg"); - singleLinks.put("SWS/Swamp", "BLJl2lf.jpg"); - singleLinks.put("SWS/Swamp", "MLH5o2u.jpg"); - singleLinks.put("SWS/Swamp", "Rmrv9tC.jpg"); + singleLinks.put("SWS/Swamp-a", "kBGj6vk.jpg"); + singleLinks.put("SWS/Swamp-b", "BLJl2lf.jpg"); + singleLinks.put("SWS/Swamp-c", "MLH5o2u.jpg"); + singleLinks.put("SWS/Swamp-d", "Rmrv9tC.jpg"); singleLinks.put("SWS/Swarm the Skies", "Ti1McaV.jpg"); singleLinks.put("SWS/Syndicate Enforcer", "xZ0g2Sx.jpg"); singleLinks.put("SWS/Tank Droid", "N4YyMje.jpg"); @@ -417,7 +384,7 @@ public enum GrabbagImageSource implements CardImageSource { singleLinks.put("SWS/Y-Wing", "aQQ5zwA.jpg"); singleLinks.put("SWS/Zam Wesell", "ToG0C1r.jpg"); // Emblems - singleLinks.put("SWS/Obi-Wan Kenobi", "Qyc10aT.png"); + singleLinks.put("SWS/Emblem Obi-Wan Kenobi", "Qyc10aT.png"); singleLinks.put("SWS/Aurra Sing", "BLWbVJC.png"); singleLinks.put("SWS/Yoda", "zH0sYxg.png"); // Tokens @@ -431,1540 +398,6 @@ public enum GrabbagImageSource implements CardImageSource { singleLinks.put("SWS/Royal Guard", "9tqE8vL.png"); singleLinks.put("SWS/Tusken Raider", "gPMiSmP.png"); singleLinks.put("SWS/Droid", "4PRrWFF.png"); - -// singleLinks.put("MTG/FRF/en/promo/prerelease/AleshaWhoSmilesAtDeath.jpg", "PTC.zip/PTC/Alesha, Who Smiles at Death.full.jpg"); -// singleLinks.put("MTG/FRF/en/promo/prerelease/Arcbond.jpg", "PTC.zip/PTC/Arcbond.full.jpg"); -// singleLinks.put("MTG/FRF/en/promo/prerelease/ArchfiendOfDepravity.jpg", "PTC.zip/PTC/Archfiend of Depravity.full.jpg"); -// singleLinks.put("MTG/FRF/en/promo/prerelease/AtarkaWorldRender.jpg", "PTC.zip/PTC/Atarka, World Render.full.jpg"); -// singleLinks.put("MTG/FRF/en/promo/prerelease/BrutalHordechief.jpg", "PTC.zip/PTC/Brutal Hordechief.full.jpg"); -// singleLinks.put("MTG/FRF/en/promo/prerelease/DaghatarTheAdamant.jpg", "PTC.zip/PTC/Daghatar the Adamant.full.jpg"); -// singleLinks.put("MTG/FRF/en/promo/prerelease/DragonscaleGeneral.jpg", "PTC.zip/PTC/Dragonscale General.full.jpg"); -// singleLinks.put("MTG/FRF/en/promo/prerelease/DromokaTheEternal.jpg", "PTC.zip/PTC/Dromoka, the Eternal.full.jpg"); -// singleLinks.put("MTG/FRF/en/promo/prerelease/FlamerushRider.jpg", "PTC.zip/PTC/Flamerush Rider.full.jpg"); -// singleLinks.put("MTG/FRF/en/promo/prerelease/FlamewakePhoenix.jpg", "PTC.zip/PTC/Flamewake Phoenix.full.jpg"); -// singleLinks.put("MTG/FRF/en/promo/prerelease/JeskaiInfiltrator.jpg", "PTC.zip/PTC/Jeskai Infiltrator.full.jpg"); -// singleLinks.put("MTG/FRF/en/promo/prerelease/KolaghanTheStormsFury.jpg", "PTC.zip/PTC/Kolaghan, the Storm's Fury.full.jpg"); -// singleLinks.put("MTG/FRF/en/promo/prerelease/MarduStrikeLeader.jpg", "PTC.zip/PTC/Mardu Strike leader.full.jpg"); -// singleLinks.put("MTG/FRF/en/promo/prerelease/MasteryOfTheUnseen.jpg", "PTC.zip/PTC/Mastery of the Unseen.full.jpg"); -// singleLinks.put("MTG/FRF/en/promo/prerelease/OjutaiSoulOfWinter.jpg", "PTC.zip/PTC/Ojutai, Soul of Winter.full.jpg"); -// singleLinks.put("MTG/FRF/en/promo/prerelease/RallyTheAncestors.jpg", "PTC.zip/PTC/Rally the Ancestors.full.jpg"); -// singleLinks.put("MTG/FRF/en/promo/prerelease/SageEyeAvengers.jpg", "PTC.zip/PTC/Sage-Eye Avengers.full.jpg"); -// singleLinks.put("MTG/FRF/en/promo/prerelease/SandsteppeMastodon.jpg", "PTC.zip/PTC/Sandsteppe Mastodon.full.jpg"); -// singleLinks.put("MTG/FRF/en/promo/prerelease/ShamanOfTheGreatHunt.jpg", "PTC.zip/PTC/Shaman of the Great Hunt.full.jpg"); -// singleLinks.put("MTG/FRF/en/promo/prerelease/ShamanicRevelation.jpg", "PTC.zip/PTC/Shamanic Revelation.full.jpg"); -// singleLinks.put("MTG/FRF/en/promo/prerelease/ShuYunTheSilentTempest.jpg", "PTC.zip/PTC/Shu Yun, the Silent Tempest.full.jpg"); -// singleLinks.put("MTG/FRF/en/promo/prerelease/SilumgarTheDriftingDeath.jpg", "PTC.zip/PTC/Silumgar, the Drifting Death.full.jpg"); -// singleLinks.put("MTG/FRF/en/promo/prerelease/SoulfireGrandMaster.jpg", "PTC.zip/PTC/Soulfire Grand Master.full.jpg"); -// singleLinks.put("MTG/FRF/en/promo/prerelease/Soulflayer.jpg", "PTC.zip/PTC/Soulflayer.full.jpg"); -// singleLinks.put("MTG/FRF/en/promo/prerelease/SupplantForm.jpg", "PTC.zip/PTC/Supplant Form.full.jpg"); -// singleLinks.put("MTG/FRF/en/promo/prerelease/TasigurTheGoldenFang.jpg", "PTC.zip/PTC/Tasigur, the Golden Fang.full.jpg"); -// singleLinks.put("MTG/FRF/en/promo/prerelease/TorrentElemental.jpg", "PTC.zip/PTC/Torrent Elemental.full.jpg"); -// singleLinks.put("MTG/FRF/en/promo/prerelease/WardenOfTheFirstTree.jpg", "PTC.zip/PTC/Warden of the First Tree.full.jpg"); -// singleLinks.put("MTG/FRF/en/promo/prerelease/Wildcall.jpg", "PTC.zip/PTC/Wildcall.full.jpg"); -// singleLinks.put("MTG/FRF/en/promo/prerelease/YasovaDragonclaw.jpg", "PTC.zip/PTC/Yasova Dragonclaw.full.jpg"); -// singleLinks.put("MTG/JOU/en/promo/DawnbringerCharioteers.jpg", "PTC.zip/PTC/Dawnbringer Charioteers.full.jpg"); -// singleLinks.put("MTG/JOU/en/promo/DictateOfKruphix.jpg", "PTC.zip/PTC/Dictate of Kruphix.full.jpg"); -// singleLinks.put("MTG/JOU/en/promo/DictateOfTheTwinGods.jpg", "PTC.zip/PTC/Dictate of the Twin Gods.full.jpg"); -// singleLinks.put("MTG/JOU/en/promo/DoomwakeGiant.jpg", "PTC.zip/PTC/Doomwake Giant.full.jpg"); -// singleLinks.put("MTG/JOU/en/promo/EidolonOfBlossoms.jpg", "PTC.zip/PTC/Eidolon of Blossoms.full.jpg"); -// singleLinks.put("MTG/JOU/en/promo/ScourgeOfSkolaVale.jpg", "PTC.zip/PTC/Scourge of Skola Vale.full.jpg"); -// singleLinks.put("MTG/JOU/en/promo/SpawnOfThraxes.jpg", "PTC.zip/PTC/Spawn of Thraxes.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/AbzanAscendancy.jpg", "PTC.zip/PTC/Abzan Ascendancy.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/AnafenzaTheForemost.jpg", "PTC.zip/PTC/Anafenza, the Foremost.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/AnkleShanker.jpg", "PTC.zip/PTC/Ankle Shanker.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/AvalancheTusker.jpg", "PTC.zip/PTC/Avalanche Tusker.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/BloodsoakedChampion.jpg", "PTC.zip/PTC/Bloodsoaked Champion.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/ButcherOfTheHorde.jpg", "PTC.zip/PTC/Butcher of the Horde.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/CracklingDoom.jpg", "PTC.zip/PTC/Crackling Doom.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/CratersClaws.jpg", "PTC.zip/PTC/Crater's Claws.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/DeflectingPalm.jpg", "PTC.zip/PTC/Deflecting Palm.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/DigThroughTime.jpg", "PTC.zip/PTC/Dig Through Time.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/DragonStyleTwins.jpg", "PTC.zip/PTC/Dragon-Style Twins.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/DragonThroneOfTarkir.jpg", "PTC.zip/PTC/Dragon Throne of Tarkir.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/Duneblast.jpg", "PTC.zip/PTC/Duneblast.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/FlyingCraneTechnique.jpg", "PTC.zip/PTC/Flying Crane Technique.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/GrimHaruspex.jpg", "PTC.zip/PTC/Grim Haruspex.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/HardenedScales.jpg", "PTC.zip/PTC/Hardened Scales.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/HeraldOfTorment.jpg", "PTC.zip/PTC/Herald of Torment.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/HighSentinelsOfArashin.jpg", "PTC.zip/PTC/High Sentinels of Arashin.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/IcyBlast.jpg", "PTC.zip/PTC/Icy Blast.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/IvorytuskFortress.jpg", "PTC.zip/PTC/Ivorytusk Fortress.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/JeeringInstigator.jpg", "PTC.zip/PTC/Jeering Instigator.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/JeskaiAscendancy.jpg", "PTC.zip/PTC/Jeskai Ascendancy.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/KheruSpellsnatcher.jpg", "PTC.zip/PTC/Kheru Spellsnatcher.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/MarduAscendancy.jpg", "PTC.zip/PTC/Mardu Ascendancy.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/MasterOfPearls.jpg", "PTC.zip/PTC/Master of Pearls.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/NarsetEnlightenedMaster.jpg", "PTC.zip/PTC/Narset, Enlightened Master.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/NecropolisFiend.jpg", "PTC.zip/PTC/Necropolis Fiend.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/RakshasaVizier.jpg", "PTC.zip/PTC/Rakshasa Vizier.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/RattleclawMystic.jpg", "PTC.zip/PTC/Rattleclaw Mystic.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/SageOfTheInwardEye.jpg", "PTC.zip/PTC/Sage of the Inward Eye.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/SidisiBroodTyrant.jpg", "PTC.zip/PTC/Sidisi, Brood Tyrant.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/SiegeRhino.jpg", "PTC.zip/PTC/Siege Rhino.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/SultaiAscendancy.jpg", "PTC.zip/PTC/Sultai Ascendancy.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/SurrakDragonclaw.jpg", "PTC.zip/PTC/Surrak Dragonclaw.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/TemurAscendancy.jpg", "PTC.zip/PTC/Temur Ascendancy.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/ThousandWinds.jpg", "PTC.zip/PTC/Thousand Winds.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/TrailOfMystery.jpg", "PTC.zip/PTC/Trail of Mystery.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/TrapEssence.jpg", "PTC.zip/PTC/Trap Essence.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/UtterEnd.jpg", "PTC.zip/PTC/Utter End.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/VillainousWealth.jpg", "PTC.zip/PTC/Villainous Wealth.full.jpg"); -// singleLinks.put("MTG/KTK/en/promo/ZurgoHelmsmasher.jpg", "PTC.zip/PTC/Zurgo Helmsmasher.full.jpg"); -// singleLinks.put("MTG/M15/en/promo/ChiefEngineer.jpg", "PTC.zip/PTC/Chief Engineer.full.jpg"); -// singleLinks.put("MTG/M15/en/promo/InGarruksWake.jpg", "PTC.zip/PTC/In Garruk's Wake.full.jpg"); -// singleLinks.put("MTG/M15/en/promo/IndulgentTormentor.jpg", "PTC.zip/PTC/Indulgent Tormentor.full.jpg"); -// singleLinks.put("MTG/M15/en/promo/MercurialPretender.jpg", "PTC.zip/PTC/Mercurial Pretender.full.jpg"); -// singleLinks.put("MTG/M15/en/promo/PhyrexianRevoker.jpg", "PTC.zip/PTC/Phyrexian Revoker.full.jpg"); -// singleLinks.put("MTG/M15/en/promo/Phytotitan.jpg", "PTC.zip/PTC/Phytotitan.full.jpg"); -// singleLinks.put("MTG/M15/en/promo/ResoluteArchangel.jpg", "PTC.zip/PTC/Resolute Archangel.full.jpg"); -// singleLinks.put("MTG/M15/en/promo/SiegeDragon.jpg", "PTC.zip/PTC/Siege Dragon.full.jpg"); -// singleLinks.put("MTG/M15/en/promo/SoulOfRavnica.jpg", "PTC.zip/PTC/Soul of Ravnica.full.jpg"); -// singleLinks.put("MTG/M15/en/promo/SoulOfZendikar.jpg", "PTC.zip/PTC/Soul of Zendikar.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Judge/AzusaLostButSeeking.jpg", "JR.zip/JR/Azusa, Lost but Seeking.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Judge/Bitterblossom.jpg", "JR.zip/JR/Bitterblossom.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Judge/BloodstainedMire.jpg", "JR.zip/JR/Bloodstained Mire.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Judge/CommandBeacon.jpg", "JR.zip/JR/Command Beacon.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Judge/DarkRitual.jpg", "JR.zip/JR/Dark Ritual.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Judge/DecreeOfJustice.jpg", "JR.zip/JR/Decree of Justice.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Judge/DefenseOfTheHeart.jpg", "JR.zip/JR/Defense of the Heart.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Judge/ExaltedAngel.jpg", "JR.zip/JR/Exalted Angel.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Judge/FeldonOfTheThirdPath.jpg", "JR.zip/JR/Feldon of the Third Path.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Judge/ForceOfWill.jpg", "JR.zip/JR/Force of Will.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Judge/GaeasCradle.jpg", "JR.zip/JR/Gaea's Cradle.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Judge/ImperialRecruiter.jpg", "JR.zip/JR/Imperial Recruiter.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Judge/LandTax.jpg", "JR.zip/JR/Land Tax.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Judge/MindsDesire.jpg", "JR.zip/JR/Mind's Desire.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Judge/MishrasFactory.jpg", "JR.zip/JR/Mishra's Factory.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Judge/RishadanPort.jpg", "JR.zip/JR/Rishadan Port.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Judge/ShardlessAgent.jpg", "JR.zip/JR/Shardless Agent.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Judge/ThawingGlaciers.jpg", "JR.zip/JR/Thawing Glaciers.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Judge/Vindicate2007.jpg", "JR.zip/JR/Vindicate.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Judge/Vindicate2013.jpg", "JR.zip/JR/Vindicate 1.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Judge/Wasteland2010.jpg", "JR.zip/JR/Wasteland 1.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Judge/Wasteland2015.jpg", "JR.zip/JR/Wasteland.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Judge/WindsweptHeath.jpg", "JR.zip/JR/Windswept Heath.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Judge/XiahouDunTheOneEyed.jpg", "JR.zip/JR/Xiahou Dun, the One-Eyed.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Judge/YawgmothsWill.jpg", "JR.zip/JR/Yawgmoth's Will.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Judge/ZurtheEnchanter.jpg", "JR.zip/JR/Zur the Enchanter.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/AkoumFirebird.jpg", "PTC.zip/PTC/Akoum Firebird.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/AkoumHellkite.jpg", "PTC.zip/PTC/Akoum Hellkite.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/AlignedHedronNetwork.jpg", "PTC.zip/PTC/Aligned Hedron Network.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/AllyEncampment.jpg", "PTC.zip/PTC/Ally Encampment.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/AngelicCaptain.jpg", "PTC.zip/PTC/Angelic Captain.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/BarrageTyrant.jpg", "PTC.zip/PTC/Barrage Tyrant.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/BeastcallerSavant.jpg", "PTC.zip/PTC/Beastcaller Savant.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/BlightHerder.jpg", "PTC.zip/PTC/Blight Herder.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/BringToLight.jpg", "PTC.zip/PTC/Bring to Light.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/BroodButcher.jpg", "PTC.zip/PTC/Brood Butcher.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/BrutalExpulsion.jpg", "PTC.zip/PTC/Brutal Expulsion.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/CanopyVista.jpg", "PTC.zip/PTC/Canopy Vista.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/CinderGlade.jpg", "PTC.zip/PTC/Cinder Glade.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/ConduitOfRuin.jpg", "PTC.zip/PTC/Conduit of Ruin.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/DefiantBloodlord.jpg", "PTC.zip/PTC/Defiant Bloodlord.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/DesolationTwin.jpg", "PTC.zip/PTC/Desolation Twin.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/DragonmasterOutcast.jpg", "PTC.zip/PTC/Dragonmaster Outcast.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/DranasChosen.jpg", "PTC.zip/PTC/Drana's Chosen.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/DrownerOfHope.jpg", "PTC.zip/PTC/Drowner of Hope.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/DustStalker.jpg", "PTC.zip/PTC/Dust Stalker.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/EmeriaShepherd.jpg", "PTC.zip/PTC/Emeria Shepherd.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/EndlessOne.jpg", "PTC.zip/PTC/Endless One.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/ExertInfluence.jpg", "PTC.zip/PTC/Exert Influence.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/FathomFeeder.jpg", "PTC.zip/PTC/Fathom Feeder.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/FelidarSovereign.jpg", "PTC.zip/PTC/Felidar Sovereign.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/FromBeyond.jpg", "PTC.zip/PTC/From Beyond.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/GideonAllyOfZendikar.jpg", "PTC.zip/PTC/Gideon, Ally of Zendikar.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/GreenwardenOfMurasa.jpg", "PTC.zip/PTC/Greenwarden of Murasa.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/GruesomeSlaughter.jpg", "PTC.zip/PTC/Gruesome Slaughter.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/GuardianOfTazeem.jpg", "PTC.zip/PTC/Guardian of Tazeem.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/GuulDrazOverseer.jpg", "PTC.zip/PTC/Guul Draz Overseer.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/HeroOfGomaFada.jpg", "PTC.zip/PTC/Hero of Goma Fada.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/HerosDownfall.jpg", "PTC.zip/PTC/Hero's Downfall.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/KioraMasterOfTheDepths.jpg", "PTC.zip/PTC/Kiora, Master of the Depths.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/KioraTheCrashingWave.jpg", "PTC.zip/PTC/Kiora, the Crashing Wave.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/LanternScout.jpg", "PTC.zip/PTC/Lantern Scout.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/LumberingFalls.jpg", "PTC.zip/PTC/Lumbering Falls.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/MarchFromTheTomb.jpg", "PTC.zip/PTC/March from the Tomb.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/MundaAmbushLeader.jpg", "PTC.zip/PTC/Munda, Ambush Leader.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/NissasRenewal.jpg", "PTC.zip/PTC/Nissa's Renewal.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/NoyanDarRoilShaper.jpg", "PTC.zip/PTC/Noyan Dar, Roil Shaper.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/ObNixilisReignited.jpg", "PTC.zip/PTC/Ob Nixilis Reignited.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/ObNixilisUnshackled.jpg", "PTC.zip/PTC/Ob Nixilis, Unshackled.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/OblivionSower.jpg", "PTC.zip/PTC/Oblivion Sower.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/OmnathLocusOfRage.jpg", "PTC.zip/PTC/Omnath, Locus of Rage.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/OranRiefHydra.jpg", "PTC.zip/PTC/Oran-Rief Hydra.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/PainfulTruths.jpg", "PTC.zip/PTC/Painful Truths.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/PartTheWaterveil.jpg", "PTC.zip/PTC/Part the Waterveil.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/PlanarOutburst.jpg", "PTC.zip/PTC/Planar Outburst.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/PrairieStream.jpg", "PTC.zip/PTC/Prairie Stream.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/PrismArray.jpg", "PTC.zip/PTC/Prism Array.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/QuarantineField.jpg", "PTC.zip/PTC/Quarantine Field.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/RadiantFlames.jpg", "PTC.zip/PTC/Radiant Flames.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/RuinousPath.jpg", "PTC.zip/PTC/Ruinous Path.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/SanctumOfUgin.jpg", "PTC.zip/PTC/Sanctum of Ugin.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/ScatterToTheWinds.jpg", "PTC.zip/PTC/Scatter to the Winds.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/SerpentineSpike.jpg", "PTC.zip/PTC/Serpentine Spike.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/ShamblingVent.jpg", "PTC.zip/PTC/Shambling Vent.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/ShrineOfTheForsakenGods.jpg", "PTC.zip/PTC/Shrine of the Forsaken Gods.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/SireOfStagnation.jpg", "PTC.zip/PTC/Sire of Stagnation.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/SmolderingMarsh.jpg", "PTC.zip/PTC/Smoldering Marsh.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/SmotheringAbomination.jpg", "PTC.zip/PTC/Smothering Abomination.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/SunkenHollow.jpg", "PTC.zip/PTC/Sunken Hollow.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/UginsInsight.jpg", "PTC.zip/PTC/Ugin's Insight.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/UginsNexus.jpg", "PTC.zip/PTC/Ugin's Nexus.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/UlamogTheCeaselessHunger.jpg", "PTC.zip/PTC/Ulamog, the Ceaseless Hunger.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/UndergrowthChampion.jpg", "PTC.zip/PTC/Undergrowth Champion.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/VeteranWarleader.jpg", "PTC.zip/PTC/Veteran Warleader.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/VoidWinnower.jpg", "PTC.zip/PTC/Void Winnower.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/WastelandStrangler.jpg", "PTC.zip/PTC/Wasteland Strangler.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/WoodlandWanderer.jpg", "PTC.zip/PTC/Woodland Wanderer.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/ZadaHedronGrinder.jpg", "PTC.zip/PTC/Zada, Hedron Grinder.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/AetherfluxReservoir.jpg", "PTC.zip/PTC/Aetherflux Reservoir.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/AethersquallAncient.jpg", "PTC.zip/PTC/Aethersquall Ancient.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/AetherstormRoc.jpg", "PTC.zip/PTC/Aetherstorm Roc.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/AetherworksMarvel.jpg", "PTC.zip/PTC/Aetherworks Marvel.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/AngelOfInvention.jpg", "PTC.zip/PTC/Angel of Invention.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/AnimationModule.jpg", "PTC.zip/PTC/Animation Module.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/ArchitectOfTheUntamed.jpg", "PTC.zip/PTC/Architect of the Untamed.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/AuthorityOfTheConsuls.jpg", "PTC.zip/PTC/Authority of the Consuls.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/BloomingMarsh.jpg", "PTC.zip/PTC/Blooming Marsh.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/BomatCourier.jpg", "PTC.zip/PTC/Bomat Courier.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/BotanicalSanctum.jpg", "PTC.zip/PTC/Botanical Sanctum.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/BristlingHydra.jpg", "PTC.zip/PTC/Bristling Hydra.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/CapturedByTheConsulate.jpg", "PTC.zip/PTC/Captured by the Consulate.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/CataclysmicGearhulk.jpg", "PTC.zip/PTC/Cataclysmic Gearhulk.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/ChandraTorchOfDefiance.jpg", "PTC.zip/PTC/Chandra, Torch of Defiance.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/CombustibleGearhulk.jpg", "PTC.zip/PTC/Combustible Gearhulk.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/ConcealedCourtyard.jpg", "PTC.zip/PTC/Concealed Courtyard.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/ConfiscationCoup.jpg", "PTC.zip/PTC/Confiscation Coup.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/CultivatorOfBlades.jpg", "PTC.zip/PTC/Cultivator of Blades.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/CultivatorsCaravan.jpg", "PTC.zip/PTC/Cultivator's Caravan.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/DeadlockTrap.jpg", "PTC.zip/PTC/Deadlock Trap.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/DemonOfDarkSchemes.jpg", "PTC.zip/PTC/Demon of Dark Schemes.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/DepalaPilotExemplar.jpg", "PTC.zip/PTC/Depala, Pilot Exemplar.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/DovinBaan.jpg", "PTC.zip/PTC/Dovin Baan.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/DubiousChallenge.jpg", "PTC.zip/PTC/Dubious Challenge.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/DynavoltTower.jpg", "PTC.zip/PTC/Dynavolt Tower.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/ElectrostaticPummeler.jpg", "PTC.zip/PTC/Electrostatic Pummeler.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/EliminateTheCompetition.jpg", "PTC.zip/PTC/Eliminate the Competition.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/FatefulShowdown.jpg", "PTC.zip/PTC/Fateful Showdown.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/FleetwheelCruiser.jpg", "PTC.zip/PTC/Fleetwheel Cruiser.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/Fumigate.jpg", "PTC.zip/PTC/Fumigate.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/GhirapurOrrery.jpg", "PTC.zip/PTC/Ghirapur Orrery.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/GontiLordOfLuxury.jpg", "PTC.zip/PTC/Gonti, Lord of Luxury.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/InsidiousWill.jpg", "PTC.zip/PTC/Insidious Will.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/InspiringVantage.jpg", "PTC.zip/PTC/Inspiring Vantage.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/InventorsFair.jpg", "PTC.zip/PTC/Inventors' Fair.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/KambalConsulOfAllocation.jpg", "PTC.zip/PTC/Kambal, Consul of Allocation.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/KeyToTheCity.jpg", "PTC.zip/PTC/Key to the City.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/LathnuHellion.jpg", "PTC.zip/PTC/Lathnu Hellion.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/LostLegacy.jpg", "PTC.zip/PTC/Lost Legacy.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/MadcapExperiment.jpg", "PTC.zip/PTC/Madcap Experiment.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/MarionetteMaster.jpg", "PTC.zip/PTC/Marionette Master.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/MasterTrinketeer.jpg", "PTC.zip/PTC/Master Trinketeer.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/MetallurgicSummonings.jpg", "PTC.zip/PTC/Metallurgic Summonings.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/MetalworkColossus.jpg", "PTC.zip/PTC/Metalwork Colossus.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/MidnightOil.jpg", "PTC.zip/PTC/Midnight Oil.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/MultiformWonder.jpg", "PTC.zip/PTC/Multiform Wonder.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/NissaVitalForce.jpg", "PTC.zip/PTC/Nissa, Vital Force.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/NoxiousGearhulk.jpg", "PTC.zip/PTC/Noxious Gearhulk.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/OviyaPashiriSageLifecrafter.jpg", "PTC.zip/PTC/Oviya Pashiri, Sage Lifecrafter.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/PadeemConsulOfInnovation.jpg", "PTC.zip/PTC/Padeem, Consul of Innovation.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/Panharmonicon.jpg", "PTC.zip/PTC/Panharmonicon.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/ParadoxicalOutcome.jpg", "PTC.zip/PTC/Paradoxical Outcome.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/PiaNalaar.jpg", "PTC.zip/PTC/Pia Nalaar.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/RashmiEternitiesCrafter.jpg", "PTC.zip/PTC/Rashmi, Eternities Crafter.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/SaheeliRai.jpg", "PTC.zip/PTC/Saheeli Rai.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/SaheelisArtistry.jpg", "PTC.zip/PTC/Saheeli's Artistry.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/ScrapheapScrounger.jpg", "PTC.zip/PTC/Scrapheap Scrounger.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/SkyshipStalker.jpg", "PTC.zip/PTC/Skyship Stalker.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/SkysovereignConsulFlagship.jpg", "PTC.zip/PTC/Skysovereign, Consul Flagship.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/SmugglersCopter.jpg", "PTC.zip/PTC/Smuggler's Copter.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/SpirebluffCanal.jpg", "PTC.zip/PTC/Spirebluff Canal.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/SyndicateTrafficker.jpg", "PTC.zip/PTC/Syndicate Trafficker.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/TerritorialGorger.jpg", "PTC.zip/PTC/Territorial Gorger.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/ToolcraftExemplar.jpg", "PTC.zip/PTC/Toolcraft Exemplar.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/TorrentialGearhulk.jpg", "PTC.zip/PTC/Torrential Gearhulk.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/VerdurousGearhulk.jpg", "PTC.zip/PTC/Verdurous Gearhulk.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/WildestDreams.jpg", "PTC.zip/PTC/Wildest Dreams.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/AyliEternalPilgrim.jpg", "PTC.zip/PTC/Ayli, Eternal Pilgrim.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/BearerOfSilence.jpg", "PTC.zip/PTC/Bearer of Silence.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/BearerOfTheHeavens.jpg", "PTC.zip/PTC/Bearer of the Heavens.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/CallTheGatewatch.jpg", "PTC.zip/PTC/Call the Gatewatch.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/CaptainsClaws.jpg", "PTC.zip/PTC/Captain's Claws.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/ChandraFlamecaller.jpg", "PTC.zip/PTC/Chandra, Flamecaller.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/ChandraPyromaster.jpg", "PTC.zip/PTC/Chandra, Pyromaster.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/CorruptedCrossroads.jpg", "PTC.zip/PTC/Corrupted Crossroads.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/CrushOfTentacles.jpg", "PTC.zip/PTC/Crush of Tentacles.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/DeceiverOfForm.jpg", "PTC.zip/PTC/Deceiver of Form.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/DeepfathomSkulker.jpg", "PTC.zip/PTC/Deepfathom Skulker.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/DimensionalInfiltrator.jpg", "PTC.zip/PTC/Dimensional Infiltrator.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/DranaLiberatorOfMalakir.jpg", "PTC.zip/PTC/Drana, Liberator of Malakir.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/DreadDefiler.jpg", "PTC.zip/PTC/Dread Defiler.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/EldraziDisplacer.jpg", "PTC.zip/PTC/Eldrazi Displacer.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/EldraziMimic.jpg", "PTC.zip/PTC/Eldrazi Mimic.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/EldraziObligator.jpg", "PTC.zip/PTC/Eldrazi Obligator.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/EndHostilities.jpg", "PTC.zip/PTC/End Hostilities.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/Endbringer.jpg", "PTC.zip/PTC/Endbringer.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/FallOfTheTitans.jpg", "PTC.zip/PTC/Fall of the Titans.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/GeneralTazri.jpg", "PTC.zip/PTC/General Tazri.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/GladehartCavalry.jpg", "PTC.zip/PTC/Gladehart Cavalry.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/GoblinDarkDwellers.jpg", "PTC.zip/PTC/Goblin Dark-Dwellers.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/GoblinRabblemaster.jpg", "PTC.zip/PTC/Goblin Rabblemaster.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/HedronAlignment.jpg", "PTC.zip/PTC/Hedron Alignment.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/HissingQuagmire.jpg", "PTC.zip/PTC/Hissing Quagmire.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/InverterOfTruth.jpg", "PTC.zip/PTC/Inverter of Truth.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/JoriEnRuinDiver.jpg", "PTC.zip/PTC/Jori En, Ruin Diver.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/KalitasTraitorOfGhet.jpg", "PTC.zip/PTC/Kalitas, Traitor of Ghet.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/KozilekTheGreatDistortion.jpg", "PTC.zip/PTC/Kozilek, the Great Distortion.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/KozileksReturn.jpg", "PTC.zip/PTC/Kozilek's Return.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/LinvalaThePreserver.jpg", "PTC.zip/PTC/Linvala, the Preserver.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/MatterReshaper.jpg", "PTC.zip/PTC/Matter Reshaper.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/MinaAndDennWildborn.jpg", "PTC.zip/PTC/Mina and Denn, Wildborn.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/Mirrorpool.jpg", "PTC.zip/PTC/Mirrorpool.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/MundasVanguard.jpg", "PTC.zip/PTC/Munda's Vanguard.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/NeedleSpires.jpg", "PTC.zip/PTC/Needle Spires.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/NissaVoiceOfZendikar.jpg", "PTC.zip/PTC/Nissa, Voice of Zendikar.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/OathOfChandra.jpg", "PTC.zip/PTC/Oath of Chandra.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/OathOfGideon.jpg", "PTC.zip/PTC/Oath of Gideon.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/OathOfJace.jpg", "PTC.zip/PTC/Oath of Jace.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/OathOfNissa.jpg", "PTC.zip/PTC/Oath of Nissa.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/OverwhelmingDenial.jpg", "PTC.zip/PTC/Overwhelming Denial.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/RealitySmasher.jpg", "PTC.zip/PTC/Reality Smasher.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/RemorselessPunishment.jpg", "PTC.zip/PTC/Remorseless Punishment.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/RuinsOfOranRief.jpg", "PTC.zip/PTC/Ruins of Oran-Rief.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/SeaGateWreckage.jpg", "PTC.zip/PTC/Sea Gate Wreckage.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/SifterOfSkulls.jpg", "PTC.zip/PTC/Sifter of Skulls.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/SphinxOfTheFinalWord.jpg", "PTC.zip/PTC/Sphinx of the Final Word.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/StoneHavenOutfitter.jpg", "PTC.zip/PTC/Stone Haven Outfitter.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/StoneforgeMasterwork.jpg", "PTC.zip/PTC/Stoneforge Masterwork.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/SylvanAdvocate.jpg", "PTC.zip/PTC/Sylvan Advocate.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/SylvanCaryatid.jpg", "PTC.zip/PTC/Sylvan Caryatid.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/ThoughtKnotSeer.jpg", "PTC.zip/PTC/Thought-Knot Seer.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/TyrantOfValakut.jpg", "PTC.zip/PTC/Tyrant of Valakut.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/VileRedeemer.jpg", "PTC.zip/PTC/Vile Redeemer.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/WanderingFumarole.jpg", "PTC.zip/PTC/Wandering Fumarole.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/WorldBreaker.jpg", "PTC.zip/PTC/World Breaker.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/ZendikarResurgent.jpg", "PTC.zip/PTC/Zendikar Resurgent.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/AlteredEgo.jpg", "PTC.zip/PTC/Altered Ego.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/AlwaysWatching.jpg", "PTC.zip/PTC/Always Watching.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/AngelOfDeliverance.jpg", "PTC.zip/PTC/Angel of Deliverance.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/AnguishedUnmaking.jpg", "PTC.zip/PTC/Anguished Unmaking.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/ArchangelAvacyn.jpg", "PTC.zip/PTC/Archangel Avacyn.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/ArlinnKord.jpg", "PTC.zip/PTC/Arlinn Kord.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/AsylumVisitor.jpg", "PTC.zip/PTC/Asylum Visitor.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/AvacynGuardianAngel.jpg", "PTC.zip/PTC/Avacyn, Guardian Angel.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/AvacynsJudgment.jpg", "PTC.zip/PTC/Avacyn's Judgement.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/BeholdTheBeyond.jpg", "PTC.zip/PTC/Behold the Beyond.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/BrainInAJar.jpg", "PTC.zip/PTC/Brain in a Jar.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/BurnFromWithin.jpg", "PTC.zip/PTC/Burn from Within.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/BygoneBishop.jpg", "PTC.zip/PTC/Bygone Bishop.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/ChokedEstuary.jpg", "PTC.zip/PTC/Choked Estuary.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/ConfirmSuspicions.jpg", "PTC.zip/PTC/Confirm Suspicions.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/CorruptedGrafstone.jpg", "PTC.zip/PTC/Corrupted Grafstone.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/CryptolithRite.jpg", "PTC.zip/PTC/Cryptolith Rite.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/DeathcapCultivator.jpg", "PTC.zip/PTC/Deathcap Cultivator.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/DeclarationInStone.jpg", "PTC.zip/PTC/Declaration in Stone.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/DescendUponTheSinful.jpg", "PTC.zip/PTC/Descend upon the Sinful.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/DevilsPlayground.jpg", "PTC.zip/PTC/Devils' Playground.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/DiregrafColossus.jpg", "PTC.zip/PTC/Diregraf Colossus.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/DrogskolCavalry.jpg", "PTC.zip/PTC/Drogskol Cavalry.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/DrownyardTemple.jpg", "PTC.zip/PTC/Drownyard Temple.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/EerieInterlude.jpg", "PTC.zip/PTC/Eerie Interlude.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/EngulfTheShore.jpg", "PTC.zip/PTC/Engulf the Shore.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/EpiphanyAtTheDrownyard.jpg", "PTC.zip/PTC/Epiphany at the Drownyard.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/EverAfter.jpg", "PTC.zip/PTC/Ever After.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/FalkenrathGorger.jpg", "PTC.zip/PTC/Falkenrath Gorger.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/FeveredVisions.jpg", "PTC.zip/PTC/Fevered Visions.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/FlamebladeAngel.jpg", "PTC.zip/PTC/Flameblade Angel.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/ForebodingRuins.jpg", "PTC.zip/PTC/Foreboding Ruins.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/ForgottenCreation.jpg", "PTC.zip/PTC/Forgotten Creation.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/FortifiedVillage.jpg", "PTC.zip/PTC/Fortified Village.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/FromUnderTheFloorboards.jpg", "PTC.zip/PTC/From Under the Floorboards.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/GameTrail.jpg", "PTC.zip/PTC/Game Trail.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/GeierReachBandit.jpg", "PTC.zip/PTC/Geier Reach Bandit.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/GeierReachSanitarium.jpg", "PTC.zip/PTC/Geier Reach Sanitarium.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/GeralfsMasterpiece.jpg", "PTC.zip/PTC/Geralf's Masterpiece.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/GoldnightCastigator.jpg", "PTC.zip/PTC/Goldnight Castigator.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/HanweirMilitiaCaptain.jpg", "PTC.zip/PTC/Hanweir Militia Captain.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/HarnessTheStorm.jpg", "PTC.zip/PTC/Harness the Storm.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/InexorableBlob.jpg", "PTC.zip/PTC/Inexorable Blob.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/InvocationOfSaintTraft.jpg", "PTC.zip/PTC/Invocation of Saint Traft.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/JaceTheLivingGuildpact.jpg", "PTC.zip/PTC/Jace, the Living Guildpact.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/JaceUnravelerOfSecrets.jpg", "PTC.zip/PTC/Jace, Unraveler of Secrets.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/MarkovDreadknight.jpg", "PTC.zip/PTC/Markov Dreadknight.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/MindwrackDemon.jpg", "PTC.zip/PTC/Mindwrack Demon.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/NahiriTheHarbinger.jpg", "PTC.zip/PTC/Nahiri, the Harbinger.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/NephaliaMoondrakes.jpg", "PTC.zip/PTC/Nephalia Moondrakes.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/OdricLunarchMarshal.jpg", "PTC.zip/PTC/Odric, Lunarch Marshal.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/OliviaMobilizedForWar.jpg", "PTC.zip/PTC/Olivia, Mobilized for War.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/OrmendahlProfanePrince.jpg", "PTC.zip/PTC/Ormendahl, Profane Prince.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/PortTown.jpg", "PTC.zip/PTC/Port Town.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/PrizedAmalgam.jpg", "PTC.zip/PTC/Prized Amalgam.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/Rattlechains.jpg", "PTC.zip/PTC/Rattlechains.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/RelentlessDead.jpg", "PTC.zip/PTC/Relentless Dead.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/SageOfAncientLore.jpg", "PTC.zip/PTC/Sage of Ancient Lore.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/ScourgeWolf.jpg", "PTC.zip/PTC/Scourge Wolf.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/SeasonsPast.jpg", "PTC.zip/PTC/Seasons Past.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/SecondHarvest.jpg", "PTC.zip/PTC/Second Harvest.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/SigardaHeronsGrace.jpg", "PTC.zip/PTC/Sigarda, Heron's Grace.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/SilverfurPartisan.jpg", "PTC.zip/PTC/Silverfur Partisan.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/SinProdder.jpg", "PTC.zip/PTC/Sin Prodder.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/SlayersPlate.jpg", "PTC.zip/PTC/Slayer's Plate.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/SorinGrimNemesis.jpg", "PTC.zip/PTC/Sorin, Grim Nemesis.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/SorinSolemnVisitor.jpg", "PTC.zip/PTC/Sorin, Solemn Visitor.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/SoulSwallower.jpg", "PTC.zip/PTC/Soul Swallower.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/StartledAwake.jpg", "PTC.zip/PTC/Startled Awake.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/TamiyoFieldResearcher.jpg", "PTC.zip/PTC/Tamiyo, Field Researcher.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/TamiyosJournal.jpg", "PTC.zip/PTC/Tamiyo's Journal.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/ThaliaHereticCathar.jpg", "PTC.zip/PTC/Thalia, Heretic Cathar.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/ThaliasLieutenant.jpg", "PTC.zip/PTC/Thalia's Lieutenant.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/TheGitrogMonster.jpg", "PTC.zip/PTC/The Gitrog Monster.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/ThingInTheIce.jpg", "PTC.zip/PTC/Thing in the Ice.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/TirelessTracker.jpg", "PTC.zip/PTC/Tireless Tracker.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/ToTheSlaughter.jpg", "PTC.zip/PTC/To the Slaughter.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/TraverseTheUlvenwald.jpg", "PTC.zip/PTC/Traverse the Ulvenwald.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/Triskaidekaphobia.jpg", "PTC.zip/PTC/Triskaidekaphobia.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/UlvenwaldObserver.jpg", "PTC.zip/PTC/Ulvenwald Observer.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/WelcomeToTheFold.jpg", "PTC.zip/PTC/Welcome to the Fold.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/WestvaleAbbey.jpg", "PTC.zip/PTC/Westvale Abbey.full.jpg"); -// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/WolfOfDevilsBreach.jpg", "PTC.zip/PTC/Wolf of Devil's Breach.full.jpg"); -// singleLinks.put("MTG/THS/en/promo/HerosDownfall.jpg", "PTC.zip/PTC/Hero's Downfall.full.jpg"); -// singleLinks.put("MTG/THS/en/promo/ReaperOfTheWilds.jpg", "PTC.zip/PTC/Reaper of the Wilds.full.jpg"); -// singleLinks.put("MTG/THS/en/promo/WhipOfErebos.jpg", "PTC.zip/PTC/Whip of Erebos.full.jpg"); -// singleLinks.put("MTG/EXP/en/foil/AncientTomb.jpg", "EXP.zip/EXP/Ancient Tomb .full.jpg"); -// singleLinks.put("MTG/EXP/en/foil/CascadeBluffs.jpg", "EXP.zip/EXP/Cascade Bluffs .full.jpg"); -// singleLinks.put("MTG/EXP/en/foil/DustBowl.jpg", "EXP.zip/EXP/Dust Bowl .full.jpg"); -// singleLinks.put("MTG/EXP/en/foil/EyeOfUgin.jpg", "EXP.zip/EXP/Eye of Ugin .full.jpg"); -// singleLinks.put("MTG/EXP/en/foil/FetidHeath.jpg", "EXP.zip/EXP/Fetid Heath .full.jpg"); -// singleLinks.put("MTG/EXP/en/foil/FireLitThicket.jpg", "EXP.zip/EXP/Fire-Lit Thicket .full.jpg"); -// singleLinks.put("MTG/EXP/en/foil/FloodedGrove.jpg", "EXP.zip/EXP/Flooded Grove .full.jpg"); -// singleLinks.put("MTG/EXP/en/foil/ForbiddenOrchard.jpg", "EXP.zip/EXP/Forbidden Orchard .full.jpg"); -// singleLinks.put("MTG/EXP/en/foil/GravenCairns.jpg", "EXP.zip/EXP/Graven Cairns .full.jpg"); -// singleLinks.put("MTG/EXP/en/foil/HorizonCanopy.jpg", "EXP.zip/EXP/Horizon Canopy.full.jpg"); -// singleLinks.put("MTG/EXP/en/foil/KorHaven.jpg", "EXP.zip/EXP/Kor Haven.full.jpg"); -// singleLinks.put("MTG/EXP/en/foil/ManaConfluence.jpg", "EXP.zip/EXP/Mana Confluence.full.jpg"); -// singleLinks.put("MTG/EXP/en/foil/MysticGate.jpg", "EXP.zip/EXP/Mystic Gate.full.jpg"); -// singleLinks.put("MTG/EXP/en/foil/RuggedPrairie.jpg", "EXP.zip/EXP/Rugged Prairie.full.jpg"); -// singleLinks.put("MTG/EXP/en/foil/StripMine.jpg", "EXP.zip/EXP/Strip Mine.full.jpg"); -// singleLinks.put("MTG/EXP/en/foil/SunkenRuins.jpg", "EXP.zip/EXP/Sunken Ruins.full.jpg"); -// singleLinks.put("MTG/EXP/en/foil/TectonicEdge.jpg", "EXP.zip/EXP/Tectonic Edge.full.jpg"); -// singleLinks.put("MTG/EXP/en/foil/TwilightMire.jpg", "EXP.zip/EXP/Twilight Mire.full.jpg"); -// singleLinks.put("MTG/EXP/en/foil/Wasteland.jpg", "EXP.zip/EXP/Wasteland.full.jpg"); -// singleLinks.put("MTG/EXP/en/foil/WoodedBastion.jpg", "EXP.zip/EXP/Wooded Bastion.full.jpg"); -// singleLinks.put("apac/1.jpg", "APAC.zip/APAC/Forest.1.full.jpg"); -// singleLinks.put("apac/10.jpg", "APAC.zip/APAC/Swamp.10.full.jpg"); -// singleLinks.put("apac/11.jpg", "APAC.zip/APAC/Forest.11.full.jpg"); -// singleLinks.put("apac/12.jpg", "APAC.zip/APAC/Island.7.full.jpg"); -// singleLinks.put("apac/13.jpg", "APAC.zip/APAC/Mountain.13.full.jpg"); -// singleLinks.put("apac/14.jpg", "APAC.zip/APAC/Plains.14.full.jpg"); -// singleLinks.put("apac/15.jpg", "APAC.zip/APAC/Swamp.15.full.jpg"); -// singleLinks.put("apac/2.jpg", "APAC.zip/APAC/Island.2.full.jpg"); -// singleLinks.put("apac/3.jpg", "APAC.zip/APAC/Mountain.3.full.jpg"); -// singleLinks.put("apac/4.jpg", "APAC.zip/APAC/Plains.4.full.jpg"); -// singleLinks.put("apac/5.jpg", "APAC.zip/APAC/Swamp.5.full.jpg"); -// singleLinks.put("apac/6.jpg", "APAC.zip/APAC/Forest.6.full.jpg"); -// singleLinks.put("apac/7.jpg", "APAC.zip/APAC/Island.12.full.jpg"); -// singleLinks.put("apac/8.jpg", "APAC.zip/APAC/Mountain.8.full.jpg"); -// singleLinks.put("apac/9.jpg", "APAC.zip/APAC/Plains.9.full.jpg"); -// singleLinks.put("arena/1.jpg", "ARENA.zip/ARENA/Plains.1.full.jpg"); -// singleLinks.put("arena/10.jpg", "ARENA.zip/ARENA/Swamp.10.full.jpg"); -// singleLinks.put("arena/11.jpg", "ARENA.zip/ARENA/Mountain.11.full.jpg"); -// singleLinks.put("arena/12.jpg", "ARENA.zip/ARENA/Forest.12.full.jpg"); -// singleLinks.put("arena/13.jpg", "ARENA.zip/ARENA/Pouncing Jaguar.full.jpg"); -// singleLinks.put("arena/14.jpg", "ARENA.zip/ARENA/Skittering Skirge.full.jpg"); -// singleLinks.put("arena/15.jpg", "ARENA.zip/ARENA/Rewind.full.jpg"); -// singleLinks.put("arena/16.jpg", "ARENA.zip/ARENA/Karn, Silver Golem.full.jpg"); -// singleLinks.put("arena/17.jpg", "ARENA.zip/ARENA/Duress.full.jpg"); -// singleLinks.put("arena/18.jpg", "ARENA.zip/ARENA/Uktabi Orangutan.full.jpg"); -// singleLinks.put("arena/19.jpg", "ARENA.zip/ARENA/Chill.full.jpg"); -// singleLinks.put("arena/2.jpg", "ARENA.zip/ARENA/Island.2.full.jpg"); -// singleLinks.put("arena/20.jpg", "ARENA.zip/ARENA/Pillage.full.jpg"); -// singleLinks.put("arena/21.jpg", "ARENA.zip/ARENA/Enlightened Tutor.full.jpg"); -// singleLinks.put("arena/22.jpg", "ARENA.zip/ARENA/Stupor.full.jpg"); -// singleLinks.put("arena/23.jpg", "ARENA.zip/ARENA/Plains.23.full.jpg"); -// singleLinks.put("arena/24.jpg", "ARENA.zip/ARENA/Island.24.full.jpg"); -// singleLinks.put("arena/25.jpg", "ARENA.zip/ARENA/Swamp.25.full.jpg"); -// singleLinks.put("arena/26.jpg", "ARENA.zip/ARENA/Mountain.26.full.jpg"); -// singleLinks.put("arena/27.jpg", "ARENA.zip/ARENA/Forest.27.full.jpg"); -// singleLinks.put("arena/28.jpg", "ARENA.zip/ARENA/Creeping Mold.full.jpg"); -// singleLinks.put("arena/29.jpg", "ARENA.zip/ARENA/Dismiss.full.jpg"); -// singleLinks.put("arena/3.jpg", "ARENA.zip/ARENA/Swamp.3.full.jpg"); -// singleLinks.put("arena/30.jpg", "ARENA.zip/ARENA/Fling.full.jpg"); -// singleLinks.put("arena/31.jpg", "ARENA.zip/ARENA/Empyrial Armor.full.jpg"); -// singleLinks.put("arena/32.jpg", "ARENA.zip/ARENA/Plains.32.full.jpg"); -// singleLinks.put("arena/33.jpg", "ARENA.zip/ARENA/Island.33.full.jpg"); -// singleLinks.put("arena/34.jpg", "ARENA.zip/ARENA/Swamp.34.full.jpg"); -// singleLinks.put("arena/35.jpg", "ARENA.zip/ARENA/Mountain.35.full.jpg"); -// singleLinks.put("arena/36.jpg", "ARENA.zip/ARENA/Forest.36.full.jpg"); -// singleLinks.put("arena/37.jpg", "ARENA.zip/ARENA/Diabolic Edict.full.jpg"); -// singleLinks.put("arena/38.jpg", "ARENA.zip/ARENA/Gaea's Blessing.full.jpg"); -// singleLinks.put("arena/39.jpg", "ARENA.zip/ARENA/Island.39.full.jpg"); -// singleLinks.put("arena/4.jpg", "ARENA.zip/ARENA/Mountain.4.full.jpg"); -// singleLinks.put("arena/40.jpg", "ARENA.zip/ARENA/Forest.40.full.jpg"); -// singleLinks.put("arena/41.jpg", "ARENA.zip/ARENA/Man-o'-War.full.jpg"); -// singleLinks.put("arena/42.jpg", "ARENA.zip/ARENA/Arc Lightning.full.jpg"); -// singleLinks.put("arena/43.jpg", "ARENA.zip/ARENA/Dauthi Slayer.full.jpg"); -// singleLinks.put("arena/44.jpg", "ARENA.zip/ARENA/Mana Leak.full.jpg"); -// singleLinks.put("arena/45.jpg", "ARENA.zip/ARENA/Plains.45.full.jpg"); -// singleLinks.put("arena/46.jpg", "ARENA.zip/ARENA/Island.46.full.jpg"); -// singleLinks.put("arena/47.jpg", "ARENA.zip/ARENA/Swamp.47.full.jpg"); -// singleLinks.put("arena/48.jpg", "ARENA.zip/ARENA/Mountain.48.full.jpg"); -// singleLinks.put("arena/5.jpg", "ARENA.zip/ARENA/Forest.5.full.jpg"); -// singleLinks.put("arena/50.jpg", "ARENA.zip/ARENA/Skirk Marauder.full.jpg"); -// singleLinks.put("arena/51.jpg", "ARENA.zip/ARENA/Elvish Aberration.full.jpg"); -// singleLinks.put("arena/52.jpg", "ARENA.zip/ARENA/Bonesplitter.full.jpg"); -// singleLinks.put("arena/53.jpg", "ARENA.zip/ARENA/Plains.53.full.jpg"); -// singleLinks.put("arena/54.jpg", "ARENA.zip/ARENA/Island.54.full.jpg"); -// singleLinks.put("arena/55.jpg", "ARENA.zip/ARENA/Swamp.55.full.jpg"); -// singleLinks.put("arena/56.jpg", "ARENA.zip/ARENA/Mountain.56.full.jpg"); -// singleLinks.put("arena/57.jpg", "ARENA.zip/ARENA/Forest.57.full.jpg"); -// singleLinks.put("arena/58.jpg", "ARENA.zip/ARENA/Darksteel Ingot.full.jpg"); -// singleLinks.put("arena/59.jpg", "ARENA.zip/ARENA/Serum Visions.full.jpg"); -// singleLinks.put("arena/6.jpg", "ARENA.zip/ARENA/Disenchant.full.jpg"); -// singleLinks.put("arena/60.jpg", "ARENA.zip/ARENA/Glacial Ray.full.jpg"); -// singleLinks.put("arena/61.jpg", "ARENA.zip/ARENA/Circle of Protection Art.full.jpg"); -// singleLinks.put("arena/62.jpg", "ARENA.zip/ARENA/Mise.full.jpg"); -// singleLinks.put("arena/63.jpg", "ARENA.zip/ARENA/Booster Tutor.full.jpg"); -// singleLinks.put("arena/64.jpg", "ARENA.zip/ARENA/Goblin Mime.full.jpg"); -// singleLinks.put("arena/65.jpg", "ARENA.zip/ARENA/Granny's Payback.full.jpg"); -// singleLinks.put("arena/66.jpg", "ARENA.zip/ARENA/Ashnod's Coupon.full.jpg"); -// singleLinks.put("arena/67.jpg", "ARENA.zip/ARENA/Plains.67.full.jpg"); -// singleLinks.put("arena/68.jpg", "ARENA.zip/ARENA/Island.68.full.jpg"); -// singleLinks.put("arena/69.jpg", "ARENA.zip/ARENA/Swamp.69.full.jpg"); -// singleLinks.put("arena/7.jpg", "ARENA.zip/ARENA/Fireball.full.jpg"); -// singleLinks.put("arena/70.jpg", "ARENA.zip/ARENA/Mountain.70.full.jpg"); -// singleLinks.put("arena/71.jpg", "ARENA.zip/ARENA/Forest.71.full.jpg"); -// singleLinks.put("arena/72.jpg", "ARENA.zip/ARENA/Genju of the Spires.full.jpg"); -// singleLinks.put("arena/73.jpg", "ARENA.zip/ARENA/Okina Nightwatch.full.jpg"); -// singleLinks.put("arena/74.jpg", "ARENA.zip/ARENA/Skyknight Legionnaire.full.jpg"); -// singleLinks.put("arena/75.jpg", "ARENA.zip/ARENA/Plains.75.full.jpg"); -// singleLinks.put("arena/76.jpg", "ARENA.zip/ARENA/Island.76.full.jpg"); -// singleLinks.put("arena/77.jpg", "ARENA.zip/ARENA/Swamp.77.full.jpg"); -// singleLinks.put("arena/78.jpg", "ARENA.zip/ARENA/Mountain.78.full.jpg"); -// singleLinks.put("arena/8.jpg", "ARENA.zip/ARENA/Plains.8.full.jpg"); -// singleLinks.put("arena/80.jpg", "ARENA.zip/ARENA/Castigate.full.jpg"); -// singleLinks.put("arena/81.jpg", "ARENA.zip/ARENA/Wee Dragonauts.full.jpg"); -// singleLinks.put("arena/82.jpg", "ARENA.zip/ARENA/Coiling Oracle.full.jpg"); -// singleLinks.put("arena/83.jpg", "ARENA.zip/ARENA/Surging Flame.full.jpg"); -// singleLinks.put("arena/9.jpg", "ARENA.zip/ARENA/Island.9.full.jpg"); -// singleLinks.put("euro/1.jpg", "EURO.zip/EURO/Forest.1.full.jpg"); -// singleLinks.put("euro/10.jpg", "EURO.zip/EURO/Swamp.10.full.jpg"); -// singleLinks.put("euro/11.jpg", "EURO.zip/EURO/Forest.11.full.jpg"); -// singleLinks.put("euro/12.jpg", "EURO.zip/EURO/Island.12.full.jpg"); -// singleLinks.put("euro/13.jpg", "EURO.zip/EURO/Mountain.13.full.jpg"); -// singleLinks.put("euro/14.jpg", "EURO.zip/EURO/Plains.14.full.jpg"); -// singleLinks.put("euro/15.jpg", "EURO.zip/EURO/Swamp.15.full.jpg"); -// singleLinks.put("euro/2.jpg", "EURO.zip/EURO/Island.2.full.jpg"); -// singleLinks.put("euro/3.jpg", "EURO.zip/EURO/Mountain.3.full.jpg"); -// singleLinks.put("euro/4.jpg", "EURO.zip/EURO/Plains.4.full.jpg"); -// singleLinks.put("euro/5.jpg", "EURO.zip/EURO/Swamp.5.full.jpg"); -// singleLinks.put("euro/6.jpg", "EURO.zip/EURO/Forest.6.full.jpg"); -// singleLinks.put("euro/7.jpg", "EURO.zip/EURO/Island.7.full.jpg"); -// singleLinks.put("euro/8.jpg", "EURO.zip/EURO/Mountain.8.full.jpg"); -// singleLinks.put("euro/9.jpg", "EURO.zip/EURO/Plains.9.full.jpg"); -// singleLinks.put("exp/1.jpg", "EXP.zip/EXP/Prairie Stream.full.jpg"); -// singleLinks.put("exp/10.jpg", "EXP.zip/EXP/Temple Garden.full.jpg"); -// singleLinks.put("exp/11.jpg", "EXP.zip/EXP/Godless Shrine.full.jpg"); -// singleLinks.put("exp/12.jpg", "EXP.zip/EXP/Steam Vents.full.jpg"); -// singleLinks.put("exp/13.jpg", "EXP.zip/EXP/Overgrown Tomb.full.jpg"); -// singleLinks.put("exp/14.jpg", "EXP.zip/EXP/Sacred Foundry.full.jpg"); -// singleLinks.put("exp/15.jpg", "EXP.zip/EXP/Breeding Pool.full.jpg"); -// singleLinks.put("exp/16.jpg", "EXP.zip/EXP/Flooded Strand.full.jpg"); -// singleLinks.put("exp/17.jpg", "EXP.zip/EXP/Polluted Delta.full.jpg"); -// singleLinks.put("exp/18.jpg", "EXP.zip/EXP/Bloodstained Mire.full.jpg"); -// singleLinks.put("exp/19.jpg", "EXP.zip/EXP/Wooded Foothills.full.jpg"); -// singleLinks.put("exp/2.jpg", "EXP.zip/EXP/Sunken Hollow.full.jpg"); -// singleLinks.put("exp/20.jpg", "EXP.zip/EXP/Windswept Heath.full.jpg"); -// singleLinks.put("exp/21.jpg", "EXP.zip/EXP/Marsh Flats.full.jpg"); -// singleLinks.put("exp/22.jpg", "EXP.zip/EXP/Scalding Tarn.full.jpg"); -// singleLinks.put("exp/23.jpg", "EXP.zip/EXP/Verdant Catacombs.full.jpg"); -// singleLinks.put("exp/24.jpg", "EXP.zip/EXP/Arid Mesa.full.jpg"); -// singleLinks.put("exp/25.jpg", "EXP.zip/EXP/Misty Rainforest.full.jpg"); -// singleLinks.put("exp/3.jpg", "EXP.zip/EXP/Smoldering Marsh.full.jpg"); -// singleLinks.put("exp/4.jpg", "EXP.zip/EXP/Cinder Glade.full.jpg"); -// singleLinks.put("exp/5.jpg", "EXP.zip/EXP/Canopy Vista.full.jpg"); -// singleLinks.put("exp/6.jpg", "EXP.zip/EXP/Hallowed Fountain.full.jpg"); -// singleLinks.put("exp/7.jpg", "EXP.zip/EXP/Watery Grave.full.jpg"); -// singleLinks.put("exp/8.jpg", "EXP.zip/EXP/Blood Crypt.full.jpg"); -// singleLinks.put("exp/9.jpg", "EXP.zip/EXP/Stomping Ground.full.jpg"); -// singleLinks.put("fnmp/1.jpg", "FNMP.zip/FNMP/River Boa.full.jpg"); -// singleLinks.put("fnmp/10.jpg", "FNMP.zip/FNMP/Stone Rain.full.jpg"); -// singleLinks.put("fnmp/100.jpg", "FNMP.zip/FNMP/Thirst for Knowledge.full.jpg"); -// singleLinks.put("fnmp/101.jpg", "FNMP.zip/FNMP/Serrated Arrows.full.jpg"); -// singleLinks.put("fnmp/102.jpg", "FNMP.zip/FNMP/Isochron Scepter.full.jpg"); -// singleLinks.put("fnmp/103.jpg", "FNMP.zip/FNMP/Shrapnel Blast.full.jpg"); -// singleLinks.put("fnmp/104.jpg", "FNMP.zip/FNMP/Magma Jet.full.jpg"); -// singleLinks.put("fnmp/105.jpg", "FNMP.zip/FNMP/Myr Enforcer.full.jpg"); -// singleLinks.put("fnmp/106.jpg", "FNMP.zip/FNMP/Kitchen Finks.full.jpg"); -// singleLinks.put("fnmp/107.jpg", "FNMP.zip/FNMP/Merrow Reejerey.full.jpg"); -// singleLinks.put("fnmp/108.jpg", "FNMP.zip/FNMP/Wren's Run Vanquisher.full.jpg"); -// singleLinks.put("fnmp/109.jpg", "FNMP.zip/FNMP/Mulldrifter.full.jpg"); -// singleLinks.put("fnmp/11.jpg", "FNMP.zip/FNMP/Llanowar Elves.full.jpg"); -// singleLinks.put("fnmp/110.jpg", "FNMP.zip/FNMP/Murderous Redcap.full.jpg"); -// singleLinks.put("fnmp/111.jpg", "FNMP.zip/FNMP/Lightning Greaves.full.jpg"); -// singleLinks.put("fnmp/112.jpg", "FNMP.zip/FNMP/Watchwolf.full.jpg"); -// singleLinks.put("fnmp/113.jpg", "FNMP.zip/FNMP/Browbeat.full.jpg"); -// singleLinks.put("fnmp/114.jpg", "FNMP.zip/FNMP/Oblivion Ring.full.jpg"); -// singleLinks.put("fnmp/115.jpg", "FNMP.zip/FNMP/Sakura-Tribe Elder.full.jpg"); -// singleLinks.put("fnmp/116.jpg", "FNMP.zip/FNMP/Tidehollow Sculler.full.jpg"); -// singleLinks.put("fnmp/117.jpg", "FNMP.zip/FNMP/Ghostly Prison.full.jpg"); -// singleLinks.put("fnmp/118.jpg", "FNMP.zip/FNMP/Ancient Ziggurat.full.jpg"); -// singleLinks.put("fnmp/119.jpg", "FNMP.zip/FNMP/Bloodbraid Elf.full.jpg"); -// singleLinks.put("fnmp/12.jpg", "FNMP.zip/FNMP/Swords to Plowshares.full.jpg"); -// singleLinks.put("fnmp/120.jpg", "FNMP.zip/FNMP/Cloudpost.full.jpg"); -// singleLinks.put("fnmp/121.jpg", "FNMP.zip/FNMP/Elvish Visionary.full.jpg"); -// singleLinks.put("fnmp/122.jpg", "FNMP.zip/FNMP/Anathemancer.full.jpg"); -// singleLinks.put("fnmp/123.jpg", "FNMP.zip/FNMP/Krosan Grip.full.jpg"); -// singleLinks.put("fnmp/124.jpg", "FNMP.zip/FNMP/Qasali Pridemage.full.jpg"); -// singleLinks.put("fnmp/125.jpg", "FNMP.zip/FNMP/Rift Bolt.full.jpg"); -// singleLinks.put("fnmp/126.jpg", "FNMP.zip/FNMP/Gatekeeper of Malakir.full.jpg"); -// singleLinks.put("fnmp/127.jpg", "FNMP.zip/FNMP/Wild Nacatl.full.jpg"); -// singleLinks.put("fnmp/128.jpg", "FNMP.zip/FNMP/Everflowing Chalice.full.jpg"); -// singleLinks.put("fnmp/129.jpg", "FNMP.zip/FNMP/Spellstutter Sprite.full.jpg"); -// singleLinks.put("fnmp/13.jpg", "FNMP.zip/FNMP/Ophidian.full.jpg"); -// singleLinks.put("fnmp/130.jpg", "FNMP.zip/FNMP/Wall of Omens.full.jpg"); -// singleLinks.put("fnmp/131.jpg", "FNMP.zip/FNMP/Artisan of Kozilek.full.jpg"); -// singleLinks.put("fnmp/132.jpg", "FNMP.zip/FNMP/Squadron Hawk.full.jpg"); -// singleLinks.put("fnmp/133.jpg", "FNMP.zip/FNMP/Rhox War Monk.full.jpg"); -// singleLinks.put("fnmp/134.jpg", "FNMP.zip/FNMP/Jace's Ingenuity.full.jpg"); -// singleLinks.put("fnmp/135.jpg", "FNMP.zip/FNMP/Cultivate.full.jpg"); -// singleLinks.put("fnmp/136.jpg", "FNMP.zip/FNMP/Teetering Peaks.full.jpg"); -// singleLinks.put("fnmp/137.jpg", "FNMP.zip/FNMP/Contagion Clasp.full.jpg"); -// singleLinks.put("fnmp/138.jpg", "FNMP.zip/FNMP/Go for the Throat.full.jpg"); -// singleLinks.put("fnmp/139.jpg", "FNMP.zip/FNMP/Savage Lands.full.jpg"); -// singleLinks.put("fnmp/14.jpg", "FNMP.zip/FNMP/Jackal Pup.full.jpg"); -// singleLinks.put("fnmp/140.jpg", "FNMP.zip/FNMP/Glistener Elf.full.jpg"); -// singleLinks.put("fnmp/141.jpg", "FNMP.zip/FNMP/Despise.full.jpg"); -// singleLinks.put("fnmp/142.jpg", "FNMP.zip/FNMP/Tectonic Edge.full.jpg"); -// singleLinks.put("fnmp/143.jpg", "FNMP.zip/FNMP/Dismember.full.jpg"); -// singleLinks.put("fnmp/144.jpg", "FNMP.zip/FNMP/Ancient Grudge.full.jpg"); -// singleLinks.put("fnmp/145.jpg", "FNMP.zip/FNMP/Acidic Slime.full.jpg"); -// singleLinks.put("fnmp/146.jpg", "FNMP.zip/FNMP/Forbidden Alchemy.full.jpg"); -// singleLinks.put("fnmp/147.jpg", "FNMP.zip/FNMP/Avacyn's Pilgrim.full.jpg"); -// singleLinks.put("fnmp/148.jpg", "FNMP.zip/FNMP/Lingering Souls.full.jpg"); -// singleLinks.put("fnmp/149.jpg", "FNMP.zip/FNMP/Evolving Wilds.full.jpg"); -// singleLinks.put("fnmp/15.jpg", "FNMP.zip/FNMP/Quirion Ranger.full.jpg"); -// singleLinks.put("fnmp/150.jpg", "FNMP.zip/FNMP/Pillar of Flame.full.jpg"); -// singleLinks.put("fnmp/151.jpg", "FNMP.zip/FNMP/Gitaxian Probe.full.jpg"); -// singleLinks.put("fnmp/152.jpg", "FNMP.zip/FNMP/Searing Spear.full.jpg"); -// singleLinks.put("fnmp/153.jpg", "FNMP.zip/FNMP/Reliquary Tower.full.jpg"); -// singleLinks.put("fnmp/154.jpg", "FNMP.zip/FNMP/Farseek.full.jpg"); -// singleLinks.put("fnmp/155.jpg", "FNMP.zip/FNMP/Call of the Conclave.full.jpg"); -// singleLinks.put("fnmp/156.jpg", "FNMP.zip/FNMP/Judge's Familiar.full.jpg"); -// singleLinks.put("fnmp/157.jpg", "FNMP.zip/FNMP/Izzet Charm.full.jpg"); -// singleLinks.put("fnmp/158.jpg", "FNMP.zip/FNMP/Rakdos Cackler.full.jpg"); -// singleLinks.put("fnmp/159.jpg", "FNMP.zip/FNMP/Dimir Charm.full.jpg"); -// singleLinks.put("fnmp/16.jpg", "FNMP.zip/FNMP/Carnophage.full.jpg"); -// singleLinks.put("fnmp/160.jpg", "FNMP.zip/FNMP/Experiment One.full.jpg"); -// singleLinks.put("fnmp/161.jpg", "FNMP.zip/FNMP/Ghor-Clan Rampager.full.jpg"); -// singleLinks.put("fnmp/162.jpg", "FNMP.zip/FNMP/Grisly Salvage.full.jpg"); -// singleLinks.put("fnmp/163.jpg", "FNMP.zip/FNMP/Sin Collector.full.jpg"); -// singleLinks.put("fnmp/164.jpg", "FNMP.zip/FNMP/Warleader's Helix.full.jpg"); -// singleLinks.put("fnmp/165.jpg", "FNMP.zip/FNMP/Elvish Mystic.full.jpg"); -// singleLinks.put("fnmp/166.jpg", "FNMP.zip/FNMP/Banisher Priest.full.jpg"); -// singleLinks.put("fnmp/167.jpg", "FNMP.zip/FNMP/Encroaching Wastes.full.jpg"); -// singleLinks.put("fnmp/168.jpg", "FNMP.zip/FNMP/Tormented Hero.full.jpg"); -// singleLinks.put("fnmp/169.jpg", "FNMP.zip/FNMP/Dissolve.full.jpg"); -// singleLinks.put("fnmp/17.jpg", "FNMP.zip/FNMP/Impulse.full.jpg"); -// singleLinks.put("fnmp/170.jpg", "FNMP.zip/FNMP/Magma Spray.full.jpg"); -// singleLinks.put("fnmp/171.jpg", "FNMP.zip/FNMP/Bile Blight.full.jpg"); -// singleLinks.put("fnmp/172.jpg", "FNMP.zip/FNMP/Banishing Light.full.jpg"); -// singleLinks.put("fnmp/173.jpg", "FNMP.zip/FNMP/Fanatic of Xenagos.full.jpg"); -// singleLinks.put("fnmp/174.jpg", "FNMP.zip/FNMP/Brain Maggot.full.jpg"); -// singleLinks.put("fnmp/175.jpg", "FNMP.zip/FNMP/Stoke the Flames.full.jpg"); -// singleLinks.put("fnmp/176.jpg", "FNMP.zip/FNMP/Frenzied Goblin.full.jpg"); -// singleLinks.put("fnmp/177.jpg", "FNMP.zip/FNMP/Disdainful Stroke.full.jpg"); -// singleLinks.put("fnmp/178.jpg", "FNMP.zip/FNMP/Hordeling Outburst.full.jpg"); -// singleLinks.put("fnmp/179.jpg", "FNMP.zip/FNMP/Suspension Field.full.jpg"); -// singleLinks.put("fnmp/18.jpg", "FNMP.zip/FNMP/Fireblast.full.jpg"); -// singleLinks.put("fnmp/180.jpg", "FNMP.zip/FNMP/Abzan Beastmaster.full.jpg"); -// singleLinks.put("fnmp/181.jpg", "FNMP.zip/FNMP/Frost Walker.full.jpg"); -// singleLinks.put("fnmp/182.jpg", "FNMP.zip/FNMP/Path to Exile.full.jpg"); -// singleLinks.put("fnmp/183.jpg", "FNMP.zip/FNMP/Serum Visions.full.jpg"); -// singleLinks.put("fnmp/184.jpg", "FNMP.zip/FNMP/Orator of Ojutai.full.jpg"); -// singleLinks.put("fnmp/186.jpg", "FNMP.zip/FNMP/Roast.full.jpg"); -// singleLinks.put("fnmp/187.jpg", "FNMP.zip/FNMP/Anticipate.full.jpg"); -// singleLinks.put("fnmp/188.jpg", "FNMP.zip/FNMP/Nissa's Pilgrimage.full.jpg"); -// singleLinks.put("fnmp/189.jpg", "FNMP.zip/FNMP/Clash of Wills.full.jpg"); -// singleLinks.put("fnmp/19.jpg", "FNMP.zip/FNMP/Soltari Priest.full.jpg"); -// singleLinks.put("fnmp/190.jpg", "FNMP.zip/FNMP/Smash to Smithereens.full.jpg"); -// singleLinks.put("fnmp/191.jpg", "FNMP.zip/FNMP/Blighted Fen.full.jpg"); -// singleLinks.put("fnmp/2.jpg", "FNMP.zip/FNMP/Terror.full.jpg"); -// singleLinks.put("fnmp/20.jpg", "FNMP.zip/FNMP/Albino Troll.full.jpg"); -// singleLinks.put("fnmp/21.jpg", "FNMP.zip/FNMP/Dissipate.full.jpg"); -// singleLinks.put("fnmp/22.jpg", "FNMP.zip/FNMP/Black Knight.full.jpg"); -// singleLinks.put("fnmp/23.jpg", "FNMP.zip/FNMP/Wall of Blossoms.full.jpg"); -// singleLinks.put("fnmp/24.jpg", "FNMP.zip/FNMP/Fireslinger.full.jpg"); -// singleLinks.put("fnmp/25.jpg", "FNMP.zip/FNMP/Drain Life.full.jpg"); -// singleLinks.put("fnmp/26.jpg", "FNMP.zip/FNMP/Aura of Silence.full.jpg"); -// singleLinks.put("fnmp/27.jpg", "FNMP.zip/FNMP/Forbid.full.jpg"); -// singleLinks.put("fnmp/28.jpg", "FNMP.zip/FNMP/Spike Feeder.full.jpg"); -// singleLinks.put("fnmp/29.jpg", "FNMP.zip/FNMP/Mogg Fanatic.full.jpg"); -// singleLinks.put("fnmp/3.jpg", "FNMP.zip/FNMP/Longbow Archer.full.jpg"); -// singleLinks.put("fnmp/30.jpg", "FNMP.zip/FNMP/White Knight.full.jpg"); -// singleLinks.put("fnmp/31.jpg", "FNMP.zip/FNMP/Disenchant.full.jpg"); -// singleLinks.put("fnmp/32.jpg", "FNMP.zip/FNMP/Bottle Gnomes.full.jpg"); -// singleLinks.put("fnmp/33.jpg", "FNMP.zip/FNMP/Muscle Sliver.full.jpg"); -// singleLinks.put("fnmp/34.jpg", "FNMP.zip/FNMP/Crystalline Sliver.full.jpg"); -// singleLinks.put("fnmp/35.jpg", "FNMP.zip/FNMP/Capsize.full.jpg"); -// singleLinks.put("fnmp/36.jpg", "FNMP.zip/FNMP/Priest of Titania.full.jpg"); -// singleLinks.put("fnmp/37.jpg", "FNMP.zip/FNMP/Goblin Bombardment.full.jpg"); -// singleLinks.put("fnmp/38.jpg", "FNMP.zip/FNMP/Scragnoth.full.jpg"); -// singleLinks.put("fnmp/39.jpg", "FNMP.zip/FNMP/Smother.full.jpg"); -// singleLinks.put("fnmp/4.jpg", "FNMP.zip/FNMP/Volcanic Geyser.full.jpg"); -// singleLinks.put("fnmp/40.jpg", "FNMP.zip/FNMP/Whipcorder.full.jpg"); -// singleLinks.put("fnmp/41.jpg", "FNMP.zip/FNMP/Sparksmith.full.jpg"); -// singleLinks.put("fnmp/42.jpg", "FNMP.zip/FNMP/Krosan Tusker.full.jpg"); -// singleLinks.put("fnmp/43.jpg", "FNMP.zip/FNMP/Withered Wretch.full.jpg"); -// singleLinks.put("fnmp/44.jpg", "FNMP.zip/FNMP/Willbender.full.jpg"); -// singleLinks.put("fnmp/45.jpg", "FNMP.zip/FNMP/Slice and Dice.full.jpg"); -// singleLinks.put("fnmp/46.jpg", "FNMP.zip/FNMP/Silver Knight.full.jpg"); -// singleLinks.put("fnmp/47.jpg", "FNMP.zip/FNMP/Krosan Warchief.full.jpg"); -// singleLinks.put("fnmp/48.jpg", "FNMP.zip/FNMP/Lightning Rift.full.jpg"); -// singleLinks.put("fnmp/49.jpg", "FNMP.zip/FNMP/Carrion Feeder.full.jpg"); -// singleLinks.put("fnmp/5.jpg", "FNMP.zip/FNMP/Mind Warp.full.jpg"); -// singleLinks.put("fnmp/50.jpg", "FNMP.zip/FNMP/Treetop Village.full.jpg"); -// singleLinks.put("fnmp/51.jpg", "FNMP.zip/FNMP/Accumulated Knowledge.full.jpg"); -// singleLinks.put("fnmp/52.jpg", "FNMP.zip/FNMP/Avalanche Riders.full.jpg"); -// singleLinks.put("fnmp/53.jpg", "FNMP.zip/FNMP/Reanimate.full.jpg"); -// singleLinks.put("fnmp/54.jpg", "FNMP.zip/FNMP/Mother of Runes.full.jpg"); -// singleLinks.put("fnmp/55.jpg", "FNMP.zip/FNMP/Brainstorm.full.jpg"); -// singleLinks.put("fnmp/56.jpg", "FNMP.zip/FNMP/Rancor.full.jpg"); -// singleLinks.put("fnmp/57.jpg", "FNMP.zip/FNMP/Seal of Cleansing.full.jpg"); -// singleLinks.put("fnmp/58.jpg", "FNMP.zip/FNMP/Flametongue Kavu.full.jpg"); -// singleLinks.put("fnmp/59.jpg", "FNMP.zip/FNMP/Blastoderm.full.jpg"); -// singleLinks.put("fnmp/6.jpg", "FNMP.zip/FNMP/Shock.full.jpg"); -// singleLinks.put("fnmp/60.jpg", "FNMP.zip/FNMP/Cabal Therapy.full.jpg"); -// singleLinks.put("fnmp/61.jpg", "FNMP.zip/FNMP/Fact or Fiction.full.jpg"); -// singleLinks.put("fnmp/62.jpg", "FNMP.zip/FNMP/Juggernaut.full.jpg"); -// singleLinks.put("fnmp/63.jpg", "FNMP.zip/FNMP/Circle of Protection Red.full.jpg"); -// singleLinks.put("fnmp/64.jpg", "FNMP.zip/FNMP/Kird Ape.full.jpg"); -// singleLinks.put("fnmp/65.jpg", "FNMP.zip/FNMP/Duress.full.jpg"); -// singleLinks.put("fnmp/66.jpg", "FNMP.zip/FNMP/Counterspell.full.jpg"); -// singleLinks.put("fnmp/67.jpg", "FNMP.zip/FNMP/Icy Manipulator.full.jpg"); -// singleLinks.put("fnmp/68.jpg", "FNMP.zip/FNMP/Elves of Deep Shadow.full.jpg"); -// singleLinks.put("fnmp/69.jpg", "FNMP.zip/FNMP/Armadillo Cloak.full.jpg"); -// singleLinks.put("fnmp/7.jpg", "FNMP.zip/FNMP/Staunch Defenders.full.jpg"); -// singleLinks.put("fnmp/70.jpg", "FNMP.zip/FNMP/Terminate.full.jpg"); -// singleLinks.put("fnmp/71.jpg", "FNMP.zip/FNMP/Lobotomy.full.jpg"); -// singleLinks.put("fnmp/72.jpg", "FNMP.zip/FNMP/Goblin Warchief.full.jpg"); -// singleLinks.put("fnmp/73.jpg", "FNMP.zip/FNMP/Wild Mongrel.full.jpg"); -// singleLinks.put("fnmp/74.jpg", "FNMP.zip/FNMP/Chainer's Edict.full.jpg"); -// singleLinks.put("fnmp/75.jpg", "FNMP.zip/FNMP/Circular Logic.full.jpg"); -// singleLinks.put("fnmp/76.jpg", "FNMP.zip/FNMP/Astral Slide.full.jpg"); -// singleLinks.put("fnmp/77.jpg", "FNMP.zip/FNMP/Arrogant Wurm.full.jpg"); -// singleLinks.put("fnmp/78a.jpg", "FNMP.zip/FNMP/Life (Life/Death.full.jpg"); -// singleLinks.put("fnmp/78b.jpg", "FNMP.zip/FNMP/Death (Life/Death).full.jpg"); -// singleLinks.put("fnmp/79a.jpg", "FNMP.zip/FNMP/Fire (Fire/Ice).full.jpg"); -// singleLinks.put("fnmp/79b.jpg", "FNMP.zip/FNMP/Ice (Fire/Ice).full.jpg"); -// singleLinks.put("fnmp/8.jpg", "FNMP.zip/FNMP/Giant Growth.full.jpg"); -// singleLinks.put("fnmp/80.jpg", "FNMP.zip/FNMP/Firebolt.full.jpg"); -// singleLinks.put("fnmp/81.jpg", "FNMP.zip/FNMP/Deep Analysis.full.jpg"); -// singleLinks.put("fnmp/82.jpg", "FNMP.zip/FNMP/Gerrard's Verdict.full.jpg"); -// singleLinks.put("fnmp/83.jpg", "FNMP.zip/FNMP/Basking Rootwalla.full.jpg"); -// singleLinks.put("fnmp/84.jpg", "FNMP.zip/FNMP/Wonder.full.jpg"); -// singleLinks.put("fnmp/85.jpg", "FNMP.zip/FNMP/Goblin Legionnaire.full.jpg"); -// singleLinks.put("fnmp/86.jpg", "FNMP.zip/FNMP/Engineered Plague.full.jpg"); -// singleLinks.put("fnmp/87.jpg", "FNMP.zip/FNMP/Goblin Ringleader.full.jpg"); -// singleLinks.put("fnmp/88.jpg", "FNMP.zip/FNMP/Wing Shards.full.jpg"); -// singleLinks.put("fnmp/89.jpg", "FNMP.zip/FNMP/Cabal Coffers.full.jpg"); -// singleLinks.put("fnmp/9.jpg", "FNMP.zip/FNMP/Prodigal Sorcerer.full.jpg"); -// singleLinks.put("fnmp/90.jpg", "FNMP.zip/FNMP/Roar of the Wurm.full.jpg"); -// singleLinks.put("fnmp/91.jpg", "FNMP.zip/FNMP/Force Spike.full.jpg"); -// singleLinks.put("fnmp/92.jpg", "FNMP.zip/FNMP/Remand.full.jpg"); -// singleLinks.put("fnmp/93.jpg", "FNMP.zip/FNMP/Tormod's Crypt.full.jpg"); -// singleLinks.put("fnmp/94.jpg", "FNMP.zip/FNMP/Eternal Witness.full.jpg"); -// singleLinks.put("fnmp/95.jpg", "FNMP.zip/FNMP/Tendrils of Agony.full.jpg"); -// singleLinks.put("fnmp/96.jpg", "FNMP.zip/FNMP/Pendelhaven.full.jpg"); -// singleLinks.put("fnmp/97.jpg", "FNMP.zip/FNMP/Resurrection.full.jpg"); -// singleLinks.put("fnmp/98.jpg", "FNMP.zip/FNMP/Wall of Roots.full.jpg"); -// singleLinks.put("fnmp/99.jpg", "FNMP.zip/FNMP/Desert.full.jpg"); -// singleLinks.put("gpx/1.jpg", "GPX.zip/GPX/Spiritmonger.full.jpg"); -// singleLinks.put("gpx/10.jpg", "GPX.zip/GPX/Batterskull.full.jpg"); -// singleLinks.put("gpx/11.jpg", "GPX.zip/GPX/Griselbrand.full.jpg"); -// singleLinks.put("gpx/12.jpg", "GPX.zip/GPX/Stoneforge Mystic.full.jpg"); -// singleLinks.put("gpx/2.jpg", "GPX.zip/GPX/Call of the Herd.full.jpg"); -// singleLinks.put("gpx/3.jpg", "GPX.zip/GPX/Chrome Mox.full.jpg"); -// singleLinks.put("gpx/4.jpg", "GPX.zip/GPX/Umezawa's Jitte.full.jpg"); -// singleLinks.put("gpx/5.jpg", "GPX.zip/GPX/Maelstrom Pulse.full.jpg"); -// singleLinks.put("gpx/6.jpg", "GPX.zip/GPX/Goblin Guide.full.jpg"); -// singleLinks.put("gpx/7.jpg", "GPX.zip/GPX/Lotus Cobra.full.jpg"); -// singleLinks.put("gpx/8.jpg", "GPX.zip/GPX/Primeval Titan.full.jpg"); -// singleLinks.put("gpx/9.jpg", "GPX.zip/GPX/All Is Dust.full.jpg"); -// singleLinks.put("grc/1.jpg", "GRC.zip/GRC/Wood Elves.full.jpg"); -// singleLinks.put("grc/10.jpg", "GRC.zip/GRC/Mogg Fanatic.full.jpg"); -// singleLinks.put("grc/11.jpg", "GRC.zip/GRC/Mind Stone.full.jpg"); -// singleLinks.put("grc/12.jpg", "GRC.zip/GRC/Dauntless Dourbark.full.jpg"); -// singleLinks.put("grc/13.jpg", "GRC.zip/GRC/Lava Axe.full.jpg"); -// singleLinks.put("grc/14.jpg", "GRC.zip/GRC/Cenn's Tactician.full.jpg"); -// singleLinks.put("grc/15.jpg", "GRC.zip/GRC/Oona's Blackguard.full.jpg"); -// singleLinks.put("grc/16.jpg", "GRC.zip/GRC/Gravedigger.full.jpg"); -// singleLinks.put("grc/17.jpg", "GRC.zip/GRC/Boggart Ram-Gang.full.jpg"); -// singleLinks.put("grc/18.jpg", "GRC.zip/GRC/Wilt-Leaf Cavaliers.full.jpg"); -// singleLinks.put("grc/19.jpg", "GRC.zip/GRC/Duergar Hedge-Mage.full.jpg"); -// singleLinks.put("grc/2.jpg", "GRC.zip/GRC/Icatian Javelineers.full.jpg"); -// singleLinks.put("grc/20.jpg", "GRC.zip/GRC/Selkie Hedge-Mage.full.jpg"); -// singleLinks.put("grc/21.jpg", "GRC.zip/GRC/Sprouting Thrinax.full.jpg"); -// singleLinks.put("grc/22.jpg", "GRC.zip/GRC/Woolly Thoctar.full.jpg"); -// singleLinks.put("grc/24.jpg", "GRC.zip/GRC/Path to Exile.full.jpg"); -// singleLinks.put("grc/25.jpg", "GRC.zip/GRC/Hellspark Elemental.full.jpg"); -// singleLinks.put("grc/26.jpg", "GRC.zip/GRC/Marisi's Twinclaws.full.jpg"); -// singleLinks.put("grc/27.jpg", "GRC.zip/GRC/Slave of Bolas.full.jpg"); -// singleLinks.put("grc/28.jpg", "GRC.zip/GRC/Mycoid Shepherd.full.jpg"); -// singleLinks.put("grc/29.jpg", "GRC.zip/GRC/Naya Sojourners.full.jpg"); -// singleLinks.put("grc/3.jpg", "GRC.zip/GRC/Fiery Temper.full.jpg"); -// singleLinks.put("grc/30.jpg", "GRC.zip/GRC/Mind Control.full.jpg"); -// singleLinks.put("grc/31.jpg", "GRC.zip/GRC/Rise from the Grave.full.jpg"); -// singleLinks.put("grc/32.jpg", "GRC.zip/GRC/Kor Duelist.full.jpg"); -// singleLinks.put("grc/33.jpg", "GRC.zip/GRC/Vampire Nighthawk.full.jpg"); -// singleLinks.put("grc/34.jpg", "GRC.zip/GRC/Nissa's Chosen.full.jpg"); -// singleLinks.put("grc/35.jpg", "GRC.zip/GRC/Emeria Angel.full.jpg"); -// singleLinks.put("grc/36.jpg", "GRC.zip/GRC/Kor Firewalker.full.jpg"); -// singleLinks.put("grc/37.jpg", "GRC.zip/GRC/Leatherback Baloth.full.jpg"); -// singleLinks.put("grc/38.jpg", "GRC.zip/GRC/Hada Freeblade.full.jpg"); -// singleLinks.put("grc/39.jpg", "GRC.zip/GRC/Kalastria Highborn.full.jpg"); -// singleLinks.put("grc/4.jpg", "GRC.zip/GRC/Boomerang.full.jpg"); -// singleLinks.put("grc/40.jpg", "GRC.zip/GRC/Syphon Mind.full.jpg"); -// singleLinks.put("grc/46.jpg", "GRC.zip/GRC/Pathrazer of Ulamog.full.jpg"); -// singleLinks.put("grc/47.jpg", "GRC.zip/GRC/Curse of Wizardry.full.jpg"); -// singleLinks.put("grc/48.jpg", "GRC.zip/GRC/Staggershock.full.jpg"); -// singleLinks.put("grc/49.jpg", "GRC.zip/GRC/Deathless Angel.full.jpg"); -// singleLinks.put("grc/5.jpg", "GRC.zip/GRC/Calciderm.full.jpg"); -// singleLinks.put("grc/50.jpg", "GRC.zip/GRC/Fling.full.jpg"); -// singleLinks.put("grc/51.jpg", "GRC.zip/GRC/Sylvan Ranger.full.jpg"); -// singleLinks.put("grc/59.jpg", "GRC.zip/GRC/Plague Stinger.full.jpg"); -// singleLinks.put("grc/6.jpg", "GRC.zip/GRC/Reckless Wurm.full.jpg"); -// singleLinks.put("grc/60.jpg", "GRC.zip/GRC/Golem's Heart.full.jpg"); -// singleLinks.put("grc/63.jpg", "GRC.zip/GRC/Skinrender.full.jpg"); -// singleLinks.put("grc/64.jpg", "GRC.zip/GRC/Master's Call.full.jpg"); -// singleLinks.put("grc/65.jpg", "GRC.zip/GRC/Plague Myr.full.jpg"); -// singleLinks.put("grc/66.jpg", "GRC.zip/GRC/Signal Pest.full.jpg"); -// singleLinks.put("grc/69.jpg", "GRC.zip/GRC/Fling.full.jpg"); -// singleLinks.put("grc/7.jpg", "GRC.zip/GRC/Yixlid Jailer.full.jpg"); -// singleLinks.put("grc/70.jpg", "GRC.zip/GRC/Sylvan Ranger.full.jpg"); -// singleLinks.put("grc/71.jpg", "GRC.zip/GRC/Vault Skirge.full.jpg"); -// singleLinks.put("grc/72.jpg", "GRC.zip/GRC/Maul Splicer.full.jpg"); -// singleLinks.put("grc/73.jpg", "GRC.zip/GRC/Shrine of Burning Rage.full.jpg"); -// singleLinks.put("grc/76.jpg", "GRC.zip/GRC/Tormented Soul.full.jpg"); -// singleLinks.put("grc/77.jpg", "GRC.zip/GRC/Auramancer.full.jpg"); -// singleLinks.put("grc/78.jpg", "GRC.zip/GRC/Circle of Flame.full.jpg"); -// singleLinks.put("grc/79.jpg", "GRC.zip/GRC/Gather the Townsfolk.full.jpg"); -// singleLinks.put("grc/8.jpg", "GRC.zip/GRC/Zoetic Cavern.full.jpg"); -// singleLinks.put("grc/80.jpg", "GRC.zip/GRC/Curse of the Bloody Tome.full.jpg"); -// singleLinks.put("grc/81.jpg", "GRC.zip/GRC/Curse of Thirst.full.jpg"); -// singleLinks.put("grc/82.jpg", "GRC.zip/GRC/Nearheath Stalker.full.jpg"); -// singleLinks.put("grc/83.jpg", "GRC.zip/GRC/Bloodcrazed Neonate.full.jpg"); -// singleLinks.put("grc/84.jpg", "GRC.zip/GRC/Boneyard Wurm.full.jpg"); -// singleLinks.put("grc/9.jpg", "GRC.zip/GRC/Llanowar Elves.full.jpg"); -// singleLinks.put("jr/1.jpg", "JP.zip/JP/Lightning Bolt.full.jpg"); -// singleLinks.put("jr/10.jpg", "JP.zip/JP/Tradewind Rider.full.jpg"); -// singleLinks.put("jr/100.jpg", "JP.zip/JP/Feldon of the Third Path.full.jpg"); -// singleLinks.put("jr/101.jpg", "JP.zip/JP/Wasteland.full.jpg"); -// singleLinks.put("jr/103.jpg", "JP.zip/JP/Mana Drain.full.jpg"); -// singleLinks.put("jr/105.jpg", "JP.zip/JP/Command Beacon.full.jpg"); -// singleLinks.put("jr/11.jpg", "JP.zip/JP/Intuition.full.jpg"); -// singleLinks.put("jr/12.jpg", "JP.zip/JP/Argothian Enchantress.full.jpg"); -// singleLinks.put("jr/13.jpg", "JP.zip/JP/Living Death.full.jpg"); -// singleLinks.put("jr/14.jpg", "JP.zip/JP/Armageddon.full.jpg"); -// singleLinks.put("jr/15.jpg", "JP.zip/JP/Balance.full.jpg"); -// singleLinks.put("jr/16.jpg", "JP.zip/JP/Time Warp.full.jpg"); -// singleLinks.put("jr/17.jpg", "JP.zip/JP/Phyrexian Negator.full.jpg"); -// singleLinks.put("jr/18.jpg", "JP.zip/JP/Deranged Hermit.full.jpg"); -// singleLinks.put("jr/19.jpg", "JP.zip/JP/Hermit Druid.full.jpg"); -// singleLinks.put("jr/2.jpg", "JP.zip/JP/Stroke of Genius.full.jpg"); -// singleLinks.put("jr/20.jpg", "JP.zip/JP/Gemstone Mine.full.jpg"); -// singleLinks.put("jr/21.jpg", "JP.zip/JP/Regrowth.full.jpg"); -// singleLinks.put("jr/22.jpg", "JP.zip/JP/Sol Ring.full.jpg"); -// singleLinks.put("jr/23.jpg", "JP.zip/JP/Mishra's Factory.full.jpg"); -// singleLinks.put("jr/24.jpg", "JP.zip/JP/Exalted Angel.full.jpg"); -// singleLinks.put("jr/25.jpg", "JP.zip/JP/Grim Lavamancer.full.jpg"); -// singleLinks.put("jr/26.jpg", "JP.zip/JP/Meddling Mage.full.jpg"); -// singleLinks.put("jr/27.jpg", "JP.zip/JP/Pernicious Deed.full.jpg"); -// singleLinks.put("jr/28.jpg", "JP.zip/JP/Ravenous Baloth.full.jpg"); -// singleLinks.put("jr/29.jpg", "JP.zip/JP/Cunning Wish.full.jpg"); -// singleLinks.put("jr/3.jpg", "JP.zip/JP/Gaea's Cradle.full.jpg"); -// singleLinks.put("jr/30.jpg", "JP.zip/JP/Yawgmoth's Will.full.jpg"); -// singleLinks.put("jr/31.jpg", "JP.zip/JP/Vindicate.full.jpg"); -// singleLinks.put("jr/32.jpg", "JP.zip/JP/Decree of Justice.full.jpg"); -// singleLinks.put("jr/33.jpg", "JP.zip/JP/Orim's Chant.full.jpg"); -// singleLinks.put("jr/34.jpg", "JP.zip/JP/Mind's Desire.full.jpg"); -// singleLinks.put("jr/35.jpg", "JP.zip/JP/Demonic Tutor.full.jpg"); -// singleLinks.put("jr/36.jpg", "JP.zip/JP/Goblin Piledriver.full.jpg"); -// singleLinks.put("jr/37.jpg", "JP.zip/JP/Living Wish.full.jpg"); -// singleLinks.put("jr/38.jpg", "JP.zip/JP/Dark Ritual.full.jpg"); -// singleLinks.put("jr/39.jpg", "JP.zip/JP/Maze of Ith.full.jpg"); -// singleLinks.put("jr/4.jpg", "JP.zip/JP/Memory Lapse.full.jpg"); -// singleLinks.put("jr/40.jpg", "JP.zip/JP/Stifle.full.jpg"); -// singleLinks.put("jr/41.jpg", "JP.zip/JP/Survival of the Fittest.full.jpg"); -// singleLinks.put("jr/42.jpg", "JP.zip/JP/Burning Wish.full.jpg"); -// singleLinks.put("jr/43.jpg", "JP.zip/JP/Bloodstained Mire.full.jpg"); -// singleLinks.put("jr/44.jpg", "JP.zip/JP/Flooded Strand.full.jpg"); -// singleLinks.put("jr/45.jpg", "JP.zip/JP/Polluted Delta.full.jpg"); -// singleLinks.put("jr/46.jpg", "JP.zip/JP/Windswept Heath.full.jpg"); -// singleLinks.put("jr/47.jpg", "JP.zip/JP/Wooded Foothills.full.jpg"); -// singleLinks.put("jr/48.jpg", "JP.zip/JP/Sinkhole.full.jpg"); -// singleLinks.put("jr/49.jpg", "JP.zip/JP/Natural Order.full.jpg"); -// singleLinks.put("jr/5.jpg", "JP.zip/JP/Counterspell.full.jpg"); -// singleLinks.put("jr/50.jpg", "JP.zip/JP/Phyrexian Dreadnought.full.jpg"); -// singleLinks.put("jr/51.jpg", "JP.zip/JP/Thawing Glaciers.full.jpg"); -// singleLinks.put("jr/52.jpg", "JP.zip/JP/Land Tax.full.jpg"); -// singleLinks.put("jr/53.jpg", "JP.zip/JP/Morphling.full.jpg"); -// singleLinks.put("jr/54.jpg", "JP.zip/JP/Wheel of Fortune.full.jpg"); -// singleLinks.put("jr/55.jpg", "JP.zip/JP/Wasteland.full.jpg"); -// singleLinks.put("jr/56.jpg", "JP.zip/JP/Entomb.full.jpg"); -// singleLinks.put("jr/57.jpg", "JP.zip/JP/Sword of Fire and Ice.full.jpg"); -// singleLinks.put("jr/58.jpg", "JP.zip/JP/Vendilion Clique.full.jpg"); -// singleLinks.put("jr/59.jpg", "JP.zip/JP/Bitterblossom.full.jpg"); -// singleLinks.put("jr/6.jpg", "JP.zip/JP/Vampiric Tutor.full.jpg"); -// singleLinks.put("jr/60.jpg", "JP.zip/JP/Mana Crypt.full.jpg"); -// singleLinks.put("jr/61.jpg", "JP.zip/JP/Dark Confidant.full.jpg"); -// singleLinks.put("jr/62.jpg", "JP.zip/JP/Doubling Season.full.jpg"); -// singleLinks.put("jr/63.jpg", "JP.zip/JP/Goblin Welder.full.jpg"); -// singleLinks.put("jr/64.jpg", "JP.zip/JP/Xiahou Dun, the One-Eyed.full.jpg"); -// singleLinks.put("jr/65.jpg", "JP.zip/JP/Flusterstorm.full.jpg"); -// singleLinks.put("jr/66.jpg", "JP.zip/JP/Noble Hierarch.full.jpg"); -// singleLinks.put("jr/67.jpg", "JP.zip/JP/Karmic Guide.full.jpg"); -// singleLinks.put("jr/68.jpg", "JP.zip/JP/Sneak Attack.full.jpg"); -// singleLinks.put("jr/69.jpg", "JP.zip/JP/Karakas.full.jpg"); -// singleLinks.put("jr/7.jpg", "JP.zip/JP/Ball Lightning.full.jpg"); -// singleLinks.put("jr/70.jpg", "JP.zip/JP/Sword of Light and Shadow.full.jpg"); -// singleLinks.put("jr/71.jpg", "JP.zip/JP/Command Tower.full.jpg"); -// singleLinks.put("jr/72.jpg", "JP.zip/JP/Swords to Plowshares.full.jpg"); -// singleLinks.put("jr/73.jpg", "JP.zip/JP/Bribery.full.jpg"); -// singleLinks.put("jr/74.jpg", "JP.zip/JP/Imperial Recruiter.full.jpg"); -// singleLinks.put("jr/75.jpg", "JP.zip/JP/Crucible of Worlds.full.jpg"); -// singleLinks.put("jr/76.jpg", "JP.zip/JP/Overwhelming Forces.full.jpg"); -// singleLinks.put("jr/77.jpg", "JP.zip/JP/Show and Tell.full.jpg"); -// singleLinks.put("jr/78.jpg", "JP.zip/JP/Vindicate.full.jpg"); -// singleLinks.put("jr/79.jpg", "JP.zip/JP/Genesis.full.jpg"); -// singleLinks.put("jr/8.jpg", "JP.zip/JP/Oath of Druids.full.jpg"); -// singleLinks.put("jr/80.jpg", "JP.zip/JP/Karador, Ghost Chieftain.full.jpg"); -// singleLinks.put("jr/81.jpg", "JP.zip/JP/Greater Good.full.jpg"); -// singleLinks.put("jr/82.jpg", "JP.zip/JP/Riku of Two Reflections.full.jpg"); -// singleLinks.put("jr/83.jpg", "JP.zip/JP/Force of Will.full.jpg"); -// singleLinks.put("jr/84.jpg", "JP.zip/JP/Hanna, Ship's Navigator.full.jpg"); -// singleLinks.put("jr/85.jpg", "JP.zip/JP/Sword of Feast and Famine.full.jpg"); -// singleLinks.put("jr/86.jpg", "JP.zip/JP/Nekusar, the Mindrazer.full.jpg"); -// singleLinks.put("jr/87.jpg", "JP.zip/JP/Elesh Norn, Grand Cenobite.full.jpg"); -// singleLinks.put("jr/88.jpg", "JP.zip/JP/Oloro, Ageless Ascetic.full.jpg"); -// singleLinks.put("jr/89.jpg", "JP.zip/JP/Plains.full.jpg"); -// singleLinks.put("jr/9.jpg", "JP.zip/JP/Hammer of Bogardan.full.jpg"); -// singleLinks.put("jr/90.jpg", "JP.zip/JP/Island.full.jpg"); -// singleLinks.put("jr/91.jpg", "JP.zip/JP/Swamp.full.jpg"); -// singleLinks.put("jr/92.jpg", "JP.zip/JP/Mountain.full.jpg"); -// singleLinks.put("jr/93.jpg", "JP.zip/JP/Forest.full.jpg"); -// singleLinks.put("jr/97.jpg", "JP.zip/JP/Ravages of War.full.jpg"); -// singleLinks.put("jr/98.jpg", "JP.zip/JP/Damnation.full.jpg"); -// singleLinks.put("jr/99.jpg", "JP.zip/JP/Dualcaster Mage.full.jpg"); -// singleLinks.put("mbp/1.jpg", "MBP.zip/MBP/Arena.full.jpg"); -// singleLinks.put("mbp/10.jpg", "MBP.zip/MBP/Lightning Hounds.full.jpg"); -// singleLinks.put("mbp/100.jpg", "MBP.zip/MBP/Jace, the Living Guildpact.full.jpg"); -// singleLinks.put("mbp/101.jpg", "MBP.zip/MBP/Liliana Vess.full.jpg"); -// singleLinks.put("mbp/102.jpg", "MBP.zip/MBP/Chandra, Pyromaster.full.jpg"); -// singleLinks.put("mbp/103.jpg", "MBP.zip/MBP/Nissa, Worldwaker.full.jpg"); -// singleLinks.put("mbp/104.jpg", "MBP.zip/MBP/Garruk, Apex Predator.full.jpg"); -// singleLinks.put("mbp/105.jpg", "MBP.zip/MBP/Shamanic Revelation.full.jpg"); -// singleLinks.put("mbp/106.jpg", "MBP.zip/MBP/Ojutai's Command.full.jpg"); -// singleLinks.put("mbp/107.jpg", "MBP.zip/MBP/Dragonscale General.full.jpg"); -// singleLinks.put("mbp/108.jpg", "MBP.zip/MBP/Sage-Eye Avengers.full.jpg"); -// singleLinks.put("mbp/109.jpg", "MBP.zip/MBP/Archfiend of Depravity.full.jpg"); -// singleLinks.put("mbp/11.jpg", "MBP.zip/MBP/Spined Wurm.full.jpg"); -// singleLinks.put("mbp/110.jpg", "MBP.zip/MBP/Flamerush Rider.full.jpg"); -// singleLinks.put("mbp/111.jpg", "MBP.zip/MBP/Temur War Shaman.full.jpg"); -// singleLinks.put("mbp/112.jpg", "MBP.zip/MBP/Arashin Sovereign.full.jpg"); -// singleLinks.put("mbp/113.jpg", "MBP.zip/MBP/Pristine Skywise.full.jpg"); -// singleLinks.put("mbp/114.jpg", "MBP.zip/MBP/Necromaster Dragon.full.jpg"); -// singleLinks.put("mbp/115.jpg", "MBP.zip/MBP/Boltwing Marauder.full.jpg"); -// singleLinks.put("mbp/116.jpg", "MBP.zip/MBP/Harbinger of the Hunt.full.jpg"); -// singleLinks.put("mbp/117.jpg", "MBP.zip/MBP/Sultai Charm.full.jpg"); -// singleLinks.put("mbp/118.jpg", "MBP.zip/MBP/Aeronaut Tinkerer.full.jpg"); -// singleLinks.put("mbp/119.jpg", "MBP.zip/MBP/Dragon Fodder.full.jpg"); -// singleLinks.put("mbp/12.jpg", "MBP.zip/MBP/Warmonger.full.jpg"); -// singleLinks.put("mbp/120.jpg", "MBP.zip/MBP/Dragonlord's Servant.full.jpg"); -// singleLinks.put("mbp/121.jpg", "MBP.zip/MBP/Evolving Wilds.full.jpg"); -// singleLinks.put("mbp/122.jpg", "MBP.zip/MBP/Foe-Razer Regent.full.jpg"); -// singleLinks.put("mbp/123.jpg", "MBP.zip/MBP/Relic Seeker.full.jpg"); -// singleLinks.put("mbp/124.jpg", "MBP.zip/MBP/Alhammarret, High Arbiter.full.jpg"); -// singleLinks.put("mbp/125.jpg", "MBP.zip/MBP/Dwynen, Gilt-Leaf Daen.full.jpg"); -// singleLinks.put("mbp/126.jpg", "MBP.zip/MBP/Hixus, Prison Warden.full.jpg"); -// singleLinks.put("mbp/127.jpg", "MBP.zip/MBP/Kothophed, Soul Hoarder.full.jpg"); -// singleLinks.put("mbp/128.jpg", "MBP.zip/MBP/Pia and Kiran Nalaar.full.jpg"); -// singleLinks.put("mbp/129.jpg", "MBP.zip/MBP/Honored Hierarch.full.jpg"); -// singleLinks.put("mbp/13.jpg", "MBP.zip/MBP/Silver Drake.full.jpg"); -// singleLinks.put("mbp/130.jpg", "MBP.zip/MBP/Seeker of the Way.full.jpg"); -// singleLinks.put("mbp/131.jpg", "MBP.zip/MBP/Valorous Stance.full.jpg"); -// singleLinks.put("mbp/132.jpg", "MBP.zip/MBP/Dromoka, the Eternal.full.jpg"); -// singleLinks.put("mbp/133.jpg", "MBP.zip/MBP/Siege Rhino.full.jpg"); -// singleLinks.put("mbp/134.jpg", "MBP.zip/MBP/Sandsteppe Citadel.full.jpg"); -// singleLinks.put("mbp/135.jpg", "MBP.zip/MBP/Ruinous Path.full.jpg"); -// singleLinks.put("mbp/136.jpg", "MBP.zip/MBP/Hero of Goma Fada.full.jpg"); -// singleLinks.put("mbp/137.jpg", "MBP.zip/MBP/Drowner of Hope.full.jpg"); -// singleLinks.put("mbp/138.jpg", "MBP.zip/MBP/Defiant Bloodlord.full.jpg"); -// singleLinks.put("mbp/139.jpg", "MBP.zip/MBP/Barrage Tyrant.full.jpg"); -// singleLinks.put("mbp/14.jpg", "MBP.zip/MBP/Phyrexian Rager.full.jpg"); -// singleLinks.put("mbp/140.jpg", "MBP.zip/MBP/Oran-Rief Hydra.full.jpg"); -// singleLinks.put("mbp/141.jpg", "MBP.zip/MBP/Scythe Leopard.full.jpg"); -// singleLinks.put("mbp/142.jpg", "MBP.zip/MBP/Genesis Hydra.full.jpg"); -// singleLinks.put("mbp/143.jpg", "MBP.zip/MBP/Munda's Vanguard.full.jpg"); -// singleLinks.put("mbp/144.jpg", "MBP.zip/MBP/Deepfathom Skulker.full.jpg"); -// singleLinks.put("mbp/145.jpg", "MBP.zip/MBP/Dread Defiler.full.jpg"); -// singleLinks.put("mbp/146.jpg", "MBP.zip/MBP/Tyrant of Valakut.full.jpg"); -// singleLinks.put("mbp/147.jpg", "MBP.zip/MBP/Gladehart Cavalry.full.jpg"); -// singleLinks.put("mbp/148.jpg", "MBP.zip/MBP/Goblin Dark-Dwellers.full.jpg"); -// singleLinks.put("mbp/15.jpg", "MBP.zip/MBP/Jace Beleren.full.jpg"); -// singleLinks.put("mbp/16.jpg", "MBP.zip/MBP/Garruk Wildspeaker.full.jpg"); -// singleLinks.put("mbp/17.jpg", "MBP.zip/MBP/Brion Stoutarm.full.jpg"); -// singleLinks.put("mbp/18.jpg", "MBP.zip/MBP/Jaya Ballard, Task Mage.full.jpg"); -// singleLinks.put("mbp/19.jpg", "MBP.zip/MBP/Broodmate Dragon.full.jpg"); -// singleLinks.put("mbp/2.jpg", "MBP.zip/MBP/Sewers of Estark.full.jpg"); -// singleLinks.put("mbp/20.jpg", "MBP.zip/MBP/Honor of the Pure.full.jpg"); -// singleLinks.put("mbp/21.jpg", "MBP.zip/MBP/Steward of Valeron.full.jpg"); -// singleLinks.put("mbp/22.jpg", "MBP.zip/MBP/Day of Judgment.full.jpg"); -// singleLinks.put("mbp/23.jpg", "MBP.zip/MBP/Celestial Colonnade.full.jpg"); -// singleLinks.put("mbp/24.jpg", "MBP.zip/MBP/Retaliator Griffin.full.jpg"); -// singleLinks.put("mbp/25.jpg", "MBP.zip/MBP/Kor Skyfisher.full.jpg"); -// singleLinks.put("mbp/26.jpg", "MBP.zip/MBP/Guul Draz Assassin.full.jpg"); -// singleLinks.put("mbp/27.jpg", "MBP.zip/MBP/Nissa Revane.full.jpg"); -// singleLinks.put("mbp/28.jpg", "MBP.zip/MBP/Birds of Paradise.full.jpg"); -// singleLinks.put("mbp/29.jpg", "MBP.zip/MBP/Memoricide.full.jpg"); -// singleLinks.put("mbp/3.jpg", "MBP.zip/MBP/Nalathni Dragon.full.jpg"); -// singleLinks.put("mbp/30.jpg", "MBP.zip/MBP/Liliana Vess.full.jpg"); -// singleLinks.put("mbp/31.jpg", "MBP.zip/MBP/Bloodthrone Vampire.full.jpg"); -// singleLinks.put("mbp/32.jpg", "MBP.zip/MBP/Mirran Crusader.full.jpg"); -// singleLinks.put("mbp/33.jpg", "MBP.zip/MBP/Surgical Extraction.full.jpg"); -// singleLinks.put("mbp/34.jpg", "MBP.zip/MBP/Frost Titan.full.jpg"); -// singleLinks.put("mbp/35.jpg", "MBP.zip/MBP/Grave Titan.full.jpg"); -// singleLinks.put("mbp/36.jpg", "MBP.zip/MBP/Inferno Titan.full.jpg"); -// singleLinks.put("mbp/37.jpg", "MBP.zip/MBP/Chandra's Phoenix.full.jpg"); -// singleLinks.put("mbp/38.jpg", "MBP.zip/MBP/Treasure Hunt.full.jpg"); -// singleLinks.put("mbp/39.jpg", "MBP.zip/MBP/Faithless Looting.full.jpg"); -// singleLinks.put("mbp/4.jpg", "MBP.zip/MBP/Fireball.full.jpg"); -// singleLinks.put("mbp/40.jpg", "MBP.zip/MBP/Devil's Play.full.jpg"); -// singleLinks.put("mbp/41.jpg", "MBP.zip/MBP/Gravecrawler.full.jpg"); -// singleLinks.put("mbp/42.jpg", "MBP.zip/MBP/Electrolyze.full.jpg"); -// singleLinks.put("mbp/43.jpg", "MBP.zip/MBP/Feast of Blood.full.jpg"); -// singleLinks.put("mbp/44.jpg", "MBP.zip/MBP/Silverblade Paladin.full.jpg"); -// singleLinks.put("mbp/45.jpg", "MBP.zip/MBP/Merfolk Mesmerist.full.jpg"); -// singleLinks.put("mbp/46.jpg", "MBP.zip/MBP/Knight Exemplar.full.jpg"); -// singleLinks.put("mbp/47.jpg", "MBP.zip/MBP/Sunblast Angel.full.jpg"); -// singleLinks.put("mbp/48.jpg", "MBP.zip/MBP/Serra Avatar.full.jpg"); -// singleLinks.put("mbp/49.jpg", "MBP.zip/MBP/Primordial Hydra.full.jpg"); -// singleLinks.put("mbp/5.jpg", "MBP.zip/MBP/Blue Elemental Blast.full.jpg"); -// singleLinks.put("mbp/50.jpg", "MBP.zip/MBP/Vampire Nocturnus.full.jpg"); -// singleLinks.put("mbp/51.jpg", "MBP.zip/MBP/Cathedral of War.full.jpg"); -// singleLinks.put("mbp/52.jpg", "MBP.zip/MBP/Terastodon.full.jpg"); -// singleLinks.put("mbp/53.jpg", "MBP.zip/MBP/Arrest.full.jpg"); -// singleLinks.put("mbp/54.jpg", "MBP.zip/MBP/Consume Spirit.full.jpg"); -// singleLinks.put("mbp/55.jpg", "MBP.zip/MBP/Dreg Mangler.full.jpg"); -// singleLinks.put("mbp/56.jpg", "MBP.zip/MBP/Supreme Verdict.full.jpg"); -// singleLinks.put("mbp/57.jpg", "MBP.zip/MBP/Standstill.full.jpg"); -// singleLinks.put("mbp/58.jpg", "MBP.zip/MBP/Breath of Malfegor.full.jpg"); -// singleLinks.put("mbp/59.jpg", "MBP.zip/MBP/Angel of Glory's Rise.full.jpg"); -// singleLinks.put("mbp/6.jpg", "MBP.zip/MBP/Mana Crypt.full.jpg"); -// singleLinks.put("mbp/60.jpg", "MBP.zip/MBP/Turnabout.full.jpg"); -// singleLinks.put("mbp/61.jpg", "MBP.zip/MBP/Nightveil Specter.full.jpg"); -// singleLinks.put("mbp/62.jpg", "MBP.zip/MBP/Voidmage Husher.full.jpg"); -// singleLinks.put("mbp/63.jpg", "MBP.zip/MBP/Ogre Arsonist.full.jpg"); -// singleLinks.put("mbp/64.jpg", "MBP.zip/MBP/Corrupt.full.jpg"); -// singleLinks.put("mbp/65.jpg", "MBP.zip/MBP/Chandra's Fury.full.jpg"); -// singleLinks.put("mbp/66.jpg", "MBP.zip/MBP/Render Silent.full.jpg"); -// singleLinks.put("mbp/67.jpg", "MBP.zip/MBP/Ratchet Bomb.full.jpg"); -// singleLinks.put("mbp/68.jpg", "MBP.zip/MBP/Bonescythe Sliver.full.jpg"); -// singleLinks.put("mbp/69.jpg", "MBP.zip/MBP/Ogre Battledriver.full.jpg"); -// singleLinks.put("mbp/7.jpg", "MBP.zip/MBP/Windseeker Centaur.full.jpg"); -// singleLinks.put("mbp/70.jpg", "MBP.zip/MBP/Scavenging Ooze.full.jpg"); -// singleLinks.put("mbp/71.jpg", "MBP.zip/MBP/Hamletback Goliath.full.jpg"); -// singleLinks.put("mbp/72.jpg", "MBP.zip/MBP/Ajani, Caller of the Pride.full.jpg"); -// singleLinks.put("mbp/73.jpg", "MBP.zip/MBP/Jace, Memory Adept.full.jpg"); -// singleLinks.put("mbp/74.jpg", "MBP.zip/MBP/Liliana of the Dark Realms.full.jpg"); -// singleLinks.put("mbp/75.jpg", "MBP.zip/MBP/Chandra, Pyromaster.full.jpg"); -// singleLinks.put("mbp/76.jpg", "MBP.zip/MBP/Garruk, Caller of Beasts.full.jpg"); -// singleLinks.put("mbp/77.jpg", "MBP.zip/MBP/Sylvan Caryatid.full.jpg"); -// singleLinks.put("mbp/78.jpg", "MBP.zip/MBP/Karametra's Acolyte.full.jpg"); -// singleLinks.put("mbp/79.jpg", "MBP.zip/MBP/Fated Conflagration.full.jpg"); -// singleLinks.put("mbp/8.jpg", "MBP.zip/MBP/Giant Badger.full.jpg"); -// singleLinks.put("mbp/80.jpg", "MBP.zip/MBP/High Tide.full.jpg"); -// singleLinks.put("mbp/81.jpg", "MBP.zip/MBP/Gaze of Granite.full.jpg"); -// singleLinks.put("mbp/82.jpg", "MBP.zip/MBP/Wash Out.full.jpg"); -// singleLinks.put("mbp/83.jpg", "MBP.zip/MBP/Acquire.full.jpg"); -// singleLinks.put("mbp/84.jpg", "MBP.zip/MBP/Duress.full.jpg"); -// singleLinks.put("mbp/85.jpg", "MBP.zip/MBP/Eidolon of Blossoms.full.jpg"); -// singleLinks.put("mbp/86.jpg", "MBP.zip/MBP/Magister of Worth.full.jpg"); -// singleLinks.put("mbp/87.jpg", "MBP.zip/MBP/Soul of Ravnica.full.jpg"); -// singleLinks.put("mbp/88.jpg", "MBP.zip/MBP/Soul of Zendikar.full.jpg"); -// singleLinks.put("mbp/89.jpg", "MBP.zip/MBP/Stealer of Secrets.full.jpg"); -// singleLinks.put("mbp/9.jpg", "MBP.zip/MBP/Scent of Cinder.full.jpg"); -// singleLinks.put("mbp/90.jpg", "MBP.zip/MBP/Angelic Skirmisher.full.jpg"); -// singleLinks.put("mbp/91.jpg", "MBP.zip/MBP/Xathrid Necromancer.full.jpg"); -// singleLinks.put("mbp/92.jpg", "MBP.zip/MBP/Rattleclaw Mystic.full.jpg"); -// singleLinks.put("mbp/93.jpg", "MBP.zip/MBP/Ankle Shanker.full.jpg"); -// singleLinks.put("mbp/94.jpg", "MBP.zip/MBP/Avalanche Tusker.full.jpg"); -// singleLinks.put("mbp/95.jpg", "MBP.zip/MBP/Ivorytusk Fortress.full.jpg"); -// singleLinks.put("mbp/96.jpg", "MBP.zip/MBP/Rakshasa Vizier.full.jpg"); -// singleLinks.put("mbp/97.jpg", "MBP.zip/MBP/Sage of the Inward Eye.full.jpg"); -// singleLinks.put("mbp/98.jpg", "MBP.zip/MBP/Goblin Rabblemaster.full.jpg"); -// singleLinks.put("mbp/99.jpg", "MBP.zip/MBP/Ajani Steadfast.full.jpg"); -// singleLinks.put("mgdc/1.jpg", "MGDC.zip/MGDC/Reya Dawnbringer.full.jpg"); -// singleLinks.put("mgdc/10.jpg", "MGDC.zip/MGDC/Stormblood Berserker.full.jpg"); -// singleLinks.put("mgdc/11.jpg", "MGDC.zip/MGDC/Dungrove Elder.full.jpg"); -// singleLinks.put("mgdc/12.jpg", "MGDC.zip/MGDC/Diregraf Ghoul.full.jpg"); -// singleLinks.put("mgdc/13.jpg", "MGDC.zip/MGDC/Elite Inquisitor.full.jpg"); -// singleLinks.put("mgdc/14.jpg", "MGDC.zip/MGDC/Zombie Apocalypse.full.jpg"); -// singleLinks.put("mgdc/15.jpg", "MGDC.zip/MGDC/Strangleroot Geist.full.jpg"); -// singleLinks.put("mgdc/16.jpg", "MGDC.zip/MGDC/Suture Priest.full.jpg"); -// singleLinks.put("mgdc/17.jpg", "MGDC.zip/MGDC/Pristine Talisman.full.jpg"); -// singleLinks.put("mgdc/18.jpg", "MGDC.zip/MGDC/Latch Seeker.full.jpg"); -// singleLinks.put("mgdc/19.jpg", "MGDC.zip/MGDC/Killing Wave.full.jpg"); -// singleLinks.put("mgdc/2.jpg", "MGDC.zip/MGDC/Liliana's Specter.full.jpg"); -// singleLinks.put("mgdc/20.jpg", "MGDC.zip/MGDC/Magmaquake.full.jpg"); -// singleLinks.put("mgdc/21.jpg", "MGDC.zip/MGDC/Mwonvuli Beast Tracker.full.jpg"); -// singleLinks.put("mgdc/22.jpg", "MGDC.zip/MGDC/Cryptborn Horror.full.jpg"); -// singleLinks.put("mgdc/23.jpg", "MGDC.zip/MGDC/Dryad Militant.full.jpg"); -// singleLinks.put("mgdc/24.jpg", "MGDC.zip/MGDC/Firemane Avenger.full.jpg"); -// singleLinks.put("mgdc/25.jpg", "MGDC.zip/MGDC/Zameck Guildmage.full.jpg"); -// singleLinks.put("mgdc/26.jpg", "MGDC.zip/MGDC/Melek, Izzet Paragon.full.jpg"); -// singleLinks.put("mgdc/27.jpg", "MGDC.zip/MGDC/Trostani's Summoner.full.jpg"); -// singleLinks.put("mgdc/28.jpg", "MGDC.zip/MGDC/Hive Stirrings.full.jpg"); -// singleLinks.put("mgdc/29.jpg", "MGDC.zip/MGDC/Goblin Diplomats.full.jpg"); -// singleLinks.put("mgdc/3.jpg", "MGDC.zip/MGDC/Mitotic Slime.full.jpg"); -// singleLinks.put("mgdc/30.jpg", "MGDC.zip/MGDC/Phalanx Leader.full.jpg"); -// singleLinks.put("mgdc/31.jpg", "MGDC.zip/MGDC/Nighthowler.full.jpg"); -// singleLinks.put("mgdc/32.jpg", "MGDC.zip/MGDC/Pain Seer.full.jpg"); -// singleLinks.put("mgdc/33.jpg", "MGDC.zip/MGDC/Kiora's Follower.full.jpg"); -// singleLinks.put("mgdc/34.jpg", "MGDC.zip/MGDC/Squelching Leeches.full.jpg"); -// singleLinks.put("mgdc/35.jpg", "MGDC.zip/MGDC/Dictate of Kruphix.full.jpg"); -// singleLinks.put("mgdc/36.jpg", "MGDC.zip/MGDC/Hall of Triumph.full.jpg"); -// singleLinks.put("mgdc/37.jpg", "MGDC.zip/MGDC/Heir of the Wilds.full.jpg"); -// singleLinks.put("mgdc/38.jpg", "MGDC.zip/MGDC/Utter End.full.jpg"); -// singleLinks.put("mgdc/39.jpg", "MGDC.zip/MGDC/Reclamation Sage.full.jpg"); -// singleLinks.put("mgdc/4.jpg", "MGDC.zip/MGDC/Memnite.full.jpg"); -// singleLinks.put("mgdc/40.jpg", "MGDC.zip/MGDC/Chief Engineer.full.jpg"); -// singleLinks.put("mgdc/41.jpg", "MGDC.zip/MGDC/Mardu Shadowspear.full.jpg"); -// singleLinks.put("mgdc/42.jpg", "MGDC.zip/MGDC/Supplant Form.full.jpg"); -// singleLinks.put("mgdc/43.jpg", "MGDC.zip/MGDC/Thunderbreak Regent.full.jpg"); -// singleLinks.put("mgdc/44.jpg", "MGDC.zip/MGDC/Scaleguard Sentinels.full.jpg"); -// singleLinks.put("mgdc/45.jpg", "MGDC.zip/MGDC/Conclave Naturalists.full.jpg"); -// singleLinks.put("mgdc/46.jpg", "MGDC.zip/MGDC/Languish.full.jpg"); -// singleLinks.put("mgdc/47.jpg", "MGDC.zip/MGDC/Stasis Snare.full.jpg"); -// singleLinks.put("mgdc/48.jpg", "MGDC.zip/MGDC/Radiant Flames.full.jpg"); -// singleLinks.put("mgdc/49.jpg", "MGDC.zip/MGDC/Immolating Glare.full.jpg"); -// singleLinks.put("mgdc/5.jpg", "MGDC.zip/MGDC/Tempered Steel.full.jpg"); -// singleLinks.put("mgdc/50.jpg", "MGDC.zip/MGDC/Jori En, Ruin Diver.full.jpg"); -// singleLinks.put("mgdc/6.jpg", "MGDC.zip/MGDC/Treasure Mage.full.jpg"); -// singleLinks.put("mgdc/7.jpg", "MGDC.zip/MGDC/Black Sun's Zenith.full.jpg"); -// singleLinks.put("mgdc/8.jpg", "MGDC.zip/MGDC/Myr Superion.full.jpg"); -// singleLinks.put("mgdc/9.jpg", "MGDC.zip/MGDC/Priest of Urabrask.full.jpg"); -// singleLinks.put("mlp/1.jpg", "MLP.zip/MLP/Earwig Squad.full.jpg"); -// singleLinks.put("mlp/10.jpg", "MLP.zip/MLP/Lord of Shatterskull Pass.full.jpg"); -// singleLinks.put("mlp/11.jpg", "MLP.zip/MLP/Ancient Hellkite.full.jpg"); -// singleLinks.put("mlp/12.jpg", "MLP.zip/MLP/Steel Hellkite.full.jpg"); -// singleLinks.put("mlp/13.jpg", "MLP.zip/MLP/Thopter Assembly.full.jpg"); -// singleLinks.put("mlp/14.jpg", "MLP.zip/MLP/Phyrexian Metamorph.full.jpg"); -// singleLinks.put("mlp/15.jpg", "MLP.zip/MLP/Garruk's Horde.full.jpg"); -// singleLinks.put("mlp/16a.jpg", "MLP.zip/MLP/Ludevic's Test Subject.full.jpg"); -// singleLinks.put("mlp/16b.jpg", "MLP.zip/MLP/Ludevic's Abomination.full.jpg"); -// singleLinks.put("mlp/17a.jpg", "MLP.zip/MLP/Mondronen Shaman.full.jpg"); -// singleLinks.put("mlp/17b.jpg", "MLP.zip/MLP/Tovolar's Magehunter.full.jpg"); -// singleLinks.put("mlp/18.jpg", "MLP.zip/MLP/Restoration Angel.full.jpg"); -// singleLinks.put("mlp/19.jpg", "MLP.zip/MLP/Staff of Nin.full.jpg"); -// singleLinks.put("mlp/2.jpg", "MLP.zip/MLP/Vexing Shusher.full.jpg"); -// singleLinks.put("mlp/20.jpg", "MLP.zip/MLP/Deadbridge Goliath.full.jpg"); -// singleLinks.put("mlp/21.jpg", "MLP.zip/MLP/Skarrg Goliath.full.jpg"); -// singleLinks.put("mlp/22a.jpg", "MLP.zip/MLP/Breaking (Breaking/Entering).full.jpg"); -// singleLinks.put("mlp/22b.jpg", "MLP.zip/MLP/Entering (Breaking/Entering).full.jpg"); -// singleLinks.put("mlp/23.jpg", "MLP.zip/MLP/Colossal Whale.full.jpg"); -// singleLinks.put("mlp/24.jpg", "MLP.zip/MLP/Bident of Thassa.full.jpg"); -// singleLinks.put("mlp/25.jpg", "MLP.zip/MLP/Tromokratis.full.jpg"); -// singleLinks.put("mlp/26.jpg", "MLP.zip/MLP/Dictate of the Twin Gods.full.jpg"); -// singleLinks.put("mlp/27.jpg", "MLP.zip/MLP/Dragone Throne of Tarkir.full.jpg"); -// singleLinks.put("mlp/28.jpg", "MLP.zip/MLP/In Garruk's Wake.full.jpg"); -// singleLinks.put("mlp/29.jpg", "MLP.zip/MLP/Sandsteppe Mastodon.full.jpg"); -// singleLinks.put("mlp/3.jpg", "MLP.zip/MLP/Figure of Destiny.full.jpg"); -// singleLinks.put("mlp/31.jpg", "MLP.zip/MLP/Deathbringer Regent.full.jpg"); -// singleLinks.put("mlp/32.jpg", "MLP.zip/MLP/Mizzium Meddler.full.jpg"); -// singleLinks.put("mlp/33.jpg", "MLP.zip/MLP/Blight Herder.full.jpg"); -// singleLinks.put("mlp/34.jpg", "MLP.zip/MLP/Endbringer.full.jpg"); -// singleLinks.put("mlp/4.jpg", "MLP.zip/MLP/Ajani Vengeant.full.jpg"); -// singleLinks.put("mlp/5.jpg", "MLP.zip/MLP/Obelisk of Alara.full.jpg"); -// singleLinks.put("mlp/6.jpg", "MLP.zip/MLP/Knight of New Alara.full.jpg"); -// singleLinks.put("mlp/7.jpg", "MLP.zip/MLP/Ant Queen.full.jpg"); -// singleLinks.put("mlp/8.jpg", "MLP.zip/MLP/Valakut, the Molten Pinnacle.full.jpg"); -// singleLinks.put("mlp/9.jpg", "MLP.zip/MLP/Joraga Warcaller.full.jpg"); -// singleLinks.put("mprp/1.jpg", "MPRP.zip/MPRP/Wasteland.full.jpg"); -// singleLinks.put("mprp/10.jpg", "MPRP.zip/MPRP/Hypnotic Specter.full.jpg"); -// singleLinks.put("mprp/11.jpg", "MPRP.zip/MPRP/Hinder.full.jpg"); -// singleLinks.put("mprp/12.jpg", "MPRP.zip/MPRP/Pyroclasm.full.jpg"); -// singleLinks.put("mprp/13.jpg", "MPRP.zip/MPRP/Giant Growth.full.jpg"); -// singleLinks.put("mprp/14.jpg", "MPRP.zip/MPRP/Putrefy.full.jpg"); -// singleLinks.put("mprp/15.jpg", "MPRP.zip/MPRP/Zombify.full.jpg"); -// singleLinks.put("mprp/16.jpg", "MPRP.zip/MPRP/Lightning Helix.full.jpg"); -// singleLinks.put("mprp/17.jpg", "MPRP.zip/MPRP/Wrath of God.full.jpg"); -// singleLinks.put("mprp/18.jpg", "MPRP.zip/MPRP/Condemn.full.jpg"); -// singleLinks.put("mprp/19.jpg", "MPRP.zip/MPRP/Mortify.full.jpg"); -// singleLinks.put("mprp/2.jpg", "MPRP.zip/MPRP/Voidmage Prodigy.full.jpg"); -// singleLinks.put("mprp/20.jpg", "MPRP.zip/MPRP/Psionic Blast.full.jpg"); -// singleLinks.put("mprp/21.jpg", "MPRP.zip/MPRP/Cruel Edict.full.jpg"); -// singleLinks.put("mprp/22.jpg", "MPRP.zip/MPRP/Disenchant.full.jpg"); -// singleLinks.put("mprp/23.jpg", "MPRP.zip/MPRP/Recollect.full.jpg"); -// singleLinks.put("mprp/24.jpg", "MPRP.zip/MPRP/Damnation.full.jpg"); -// singleLinks.put("mprp/25.jpg", "MPRP.zip/MPRP/Tidings.full.jpg"); -// singleLinks.put("mprp/26.jpg", "MPRP.zip/MPRP/Incinerate.full.jpg"); -// singleLinks.put("mprp/27.jpg", "MPRP.zip/MPRP/Mana Tithe.full.jpg"); -// singleLinks.put("mprp/28.jpg", "MPRP.zip/MPRP/Harmonize.full.jpg"); -// singleLinks.put("mprp/29.jpg", "MPRP.zip/MPRP/Ponder.full.jpg"); -// singleLinks.put("mprp/3.jpg", "MPRP.zip/MPRP/Powder Keg.full.jpg"); -// singleLinks.put("mprp/30.jpg", "MPRP.zip/MPRP/Corrupt.full.jpg"); -// singleLinks.put("mprp/31.jpg", "MPRP.zip/MPRP/Cryptic Command.full.jpg"); -// singleLinks.put("mprp/32.jpg", "MPRP.zip/MPRP/Flame Javelin.full.jpg"); -// singleLinks.put("mprp/33.jpg", "MPRP.zip/MPRP/Unmake.full.jpg"); -// singleLinks.put("mprp/34.jpg", "MPRP.zip/MPRP/Nameless Inversion.full.jpg"); -// singleLinks.put("mprp/35.jpg", "MPRP.zip/MPRP/Remove Soul.full.jpg"); -// singleLinks.put("mprp/36.jpg", "MPRP.zip/MPRP/Blightning.full.jpg"); -// singleLinks.put("mprp/37.jpg", "MPRP.zip/MPRP/Rampant Growth.full.jpg"); -// singleLinks.put("mprp/38.jpg", "MPRP.zip/MPRP/Negate.full.jpg"); -// singleLinks.put("mprp/39.jpg", "MPRP.zip/MPRP/Terminate.full.jpg"); -// singleLinks.put("mprp/4.jpg", "MPRP.zip/MPRP/Psychatog.full.jpg"); -// singleLinks.put("mprp/40.jpg", "MPRP.zip/MPRP/Lightning Bolt.full.jpg"); -// singleLinks.put("mprp/41.jpg", "MPRP.zip/MPRP/Cancel.full.jpg"); -// singleLinks.put("mprp/42.jpg", "MPRP.zip/MPRP/Sign in Blood.full.jpg"); -// singleLinks.put("mprp/43.jpg", "MPRP.zip/MPRP/Infest.full.jpg"); -// singleLinks.put("mprp/44.jpg", "MPRP.zip/MPRP/Volcanic Fallout.full.jpg"); -// singleLinks.put("mprp/45.jpg", "MPRP.zip/MPRP/Celestial Purge.full.jpg"); -// singleLinks.put("mprp/46.jpg", "MPRP.zip/MPRP/Bituminous Blast.full.jpg"); -// singleLinks.put("mprp/47.jpg", "MPRP.zip/MPRP/Burst Lightning.full.jpg"); -// singleLinks.put("mprp/48.jpg", "MPRP.zip/MPRP/Harrow.full.jpg"); -// singleLinks.put("mprp/49.jpg", "MPRP.zip/MPRP/Day of Judgment.full.jpg"); -// singleLinks.put("mprp/5.jpg", "MPRP.zip/MPRP/Terror.full.jpg"); -// singleLinks.put("mprp/50.jpg", "MPRP.zip/MPRP/Brave the Elements.full.jpg"); -// singleLinks.put("mprp/51.jpg", "MPRP.zip/MPRP/Doom Blade.full.jpg"); -// singleLinks.put("mprp/52.jpg", "MPRP.zip/MPRP/Treasure Hunt.full.jpg"); -// singleLinks.put("mprp/53.jpg", "MPRP.zip/MPRP/Searing Blaze.full.jpg"); -// singleLinks.put("mprp/6.jpg", "MPRP.zip/MPRP/Fireball.full.jpg"); -// singleLinks.put("mprp/7.jpg", "MPRP.zip/MPRP/Oxidize.full.jpg"); -// singleLinks.put("mprp/8.jpg", "MPRP.zip/MPRP/Mana Leak.full.jpg"); -// singleLinks.put("mprp/9.jpg", "MPRP.zip/MPRP/Reciprocate.full.jpg"); -// singleLinks.put("mpskld/1.jpg", "MPS.zip/MPS/Cataclysmic Gearhulk.full.jpg"); -// singleLinks.put("mpskld/10.jpg", "MPS.zip/MPS/Cloudstone Curio.full.jpg"); -// singleLinks.put("mpskld/11.jpg", "MPS.zip/MPS/Crucible of Worlds.full.jpg"); -// singleLinks.put("mpskld/12.jpg", "MPS.zip/MPS/Gauntlet of Power.full.jpg"); -// singleLinks.put("mpskld/13.jpg", "MPS.zip/MPS/Hangarback Walker.full.jpg"); -// singleLinks.put("mpskld/14.jpg", "MPS.zip/MPS/Lightning Greaves.full.jpg"); -// singleLinks.put("mpskld/15.jpg", "MPS.zip/MPS/Lotus Petal.full.jpg"); -// singleLinks.put("mpskld/16.jpg", "MPS.zip/MPS/Mana Crypt.full.jpg"); -// singleLinks.put("mpskld/17.jpg", "MPS.zip/MPS/Mana Vault.full.jpg"); -// singleLinks.put("mpskld/18.jpg", "MPS.zip/MPS/Mind's Eye.full.jpg"); -// singleLinks.put("mpskld/19.jpg", "MPS.zip/MPS/Mox Opal.full.jpg"); -// singleLinks.put("mpskld/2.jpg", "MPS.zip/MPS/Torrential Gearhulk.full.jpg"); -// singleLinks.put("mpskld/20.jpg", "MPS.zip/MPS/Painter's Servant.full.jpg"); -// singleLinks.put("mpskld/21.jpg", "MPS.zip/MPS/Rings of Brighthearth.full.jpg"); -// singleLinks.put("mpskld/22.jpg", "MPS.zip/MPS/Scroll Rack.full.jpg"); -// singleLinks.put("mpskld/23.jpg", "MPS.zip/MPS/Sculpting Steel.full.jpg"); -// singleLinks.put("mpskld/24.jpg", "MPS.zip/MPS/Sol Ring.full.jpg"); -// singleLinks.put("mpskld/25.jpg", "MPS.zip/MPS/Solemn Simulacrum.full.jpg"); -// singleLinks.put("mpskld/26.jpg", "MPS.zip/MPS/Static Orb.full.jpg"); -// singleLinks.put("mpskld/27.jpg", "MPS.zip/MPS/Steel Overseer.full.jpg"); -// singleLinks.put("mpskld/28.jpg", "MPS.zip/MPS/Sword of Feast and Famine.full.jpg"); -// singleLinks.put("mpskld/29.jpg", "MPS.zip/MPS/Sword of Fire and Ice.full.jpg"); -// singleLinks.put("mpskld/3.jpg", "MPS.zip/MPS/Noxious Gearhulk.full.jpg"); -// singleLinks.put("mpskld/30.jpg", "MPS.zip/MPS/Sword of Light and Shadow.full.jpg"); -// singleLinks.put("mpskld/4.jpg", "MPS.zip/MPS/Combustible Gearhulk.full.jpg"); -// singleLinks.put("mpskld/5.jpg", "MPS.zip/MPS/Verdurous Gearhulk.full.jpg"); -// singleLinks.put("mpskld/6.jpg", "MPS.zip/MPS/Aether Vial.full.jpg"); -// singleLinks.put("mpskld/7.jpg", "MPS.zip/MPS/Champion's Helm.full.jpg"); -// singleLinks.put("mpskld/8.jpg", "MPS.zip/MPS/Chromatic Lantern.full.jpg"); -// singleLinks.put("mpskld/9.jpg", "MPS.zip/MPS/Chrome Mox.full.jpg"); -// singleLinks.put("ptc/1.jpg", "PTC.zip/PTC/Dirtcowl Wurm.full.jpg"); -// singleLinks.put("ptc/10.jpg", "PTC.zip/PTC/Rathi Assassin.full.jpg"); -// singleLinks.put("ptc/100.jpg", "PTC.zip/PTC/Flying Crane Technique.full.jpg"); -// singleLinks.put("ptc/101.jpg", "PTC.zip/PTC/Grim Haruspex.full.jpg"); -// singleLinks.put("ptc/102.jpg", "PTC.zip/PTC/Hardened Scales.full.jpg"); -// singleLinks.put("ptc/103.jpg", "PTC.zip/PTC/Herald of Anafenza.full.jpg"); -// singleLinks.put("ptc/104.jpg", "PTC.zip/PTC/High Sentinels of Arashin.full.jpg"); -// singleLinks.put("ptc/105.jpg", "PTC.zip/PTC/Icy Blast.full.jpg"); -// singleLinks.put("ptc/106.jpg", "PTC.zip/PTC/Ivorytusk Fortress.full.jpg"); -// singleLinks.put("ptc/107.jpg", "PTC.zip/PTC/Jeering Instigator.full.jpg"); -// singleLinks.put("ptc/108.jpg", "PTC.zip/PTC/Jeskai Ascendancy.full.jpg"); -// singleLinks.put("ptc/109.jpg", "PTC.zip/PTC/Kheru Lich Lord.full.jpg"); -// singleLinks.put("ptc/11.jpg", "PTC.zip/PTC/Avatar of Hope.full.jpg"); -// singleLinks.put("ptc/110.jpg", "PTC.zip/PTC/Mardu Ascendancy.full.jpg"); -// singleLinks.put("ptc/111.jpg", "PTC.zip/PTC/Master of Pearls.full.jpg"); -// singleLinks.put("ptc/112.jpg", "PTC.zip/PTC/Narset, Enlightened Master.full.jpg"); -// singleLinks.put("ptc/113.jpg", "PTC.zip/PTC/Necropolis Fiend.full.jpg"); -// singleLinks.put("ptc/114.jpg", "PTC.zip/PTC/Rakshasa Vizier.full.jpg"); -// singleLinks.put("ptc/115.jpg", "PTC.zip/PTC/Rattleclaw Mystic.full.jpg"); -// singleLinks.put("ptc/116.jpg", "PTC.zip/PTC/Sage of the Inward Eye.full.jpg"); -// singleLinks.put("ptc/117.jpg", "PTC.zip/PTC/Sidisi, Brood Tyrant.full.jpg"); -// singleLinks.put("ptc/118.jpg", "PTC.zip/PTC/Siege Rhino.full.jpg"); -// singleLinks.put("ptc/119.jpg", "PTC.zip/PTC/Sultai Ascendacy.full.jpg"); -// singleLinks.put("ptc/12.jpg", "PTC.zip/PTC/Raging Kavu.full.jpg"); -// singleLinks.put("ptc/120.jpg", "PTC.zip/PTC/Surrak Dragonclaw.full.jpg"); -// singleLinks.put("ptc/121.jpg", "PTC.zip/PTC/Temur Ascendancy.full.jpg"); -// singleLinks.put("ptc/122.jpg", "PTC.zip/PTC/Thousand Winds.full.jpg"); -// singleLinks.put("ptc/123.jpg", "PTC.zip/PTC/Trail of Mystery.full.jpg"); -// singleLinks.put("ptc/124.jpg", "PTC.zip/PTC/Trap Essence.full.jpg"); -// singleLinks.put("ptc/125.jpg", "PTC.zip/PTC/Utter End.full.jpg"); -// singleLinks.put("ptc/126.jpg", "PTC.zip/PTC/Villainous Wealth.full.jpg"); -// singleLinks.put("ptc/127.jpg", "PTC.zip/PTC/Zurgo Helmsmasher.full.jpg"); -// singleLinks.put("ptc/128.jpg", "PTC.zip/PTC/Alesha, Who Smiles at Death.full.jpg"); -// singleLinks.put("ptc/129.jpg", "PTC.zip/PTC/Arcbond.full.jpg"); -// singleLinks.put("ptc/13.jpg", "PTC.zip/PTC/Questing Phelddagrif.full.jpg"); -// singleLinks.put("ptc/130.jpg", "PTC.zip/PTC/Archfiend of Depravity.full.jpg"); -// singleLinks.put("ptc/131.jpg", "PTC.zip/PTC/Atarka, World Render.full.jpg"); -// singleLinks.put("ptc/132.jpg", "PTC.zip/PTC/Brutal Hordechief.full.jpg"); -// singleLinks.put("ptc/133.jpg", "PTC.zip/PTC/Daghatar the Adamant.full.jpg"); -// singleLinks.put("ptc/134.jpg", "PTC.zip/PTC/Dragonscale General.full.jpg"); -// singleLinks.put("ptc/135.jpg", "PTC.zip/PTC/Dromoka, the Eternal.full.jpg"); -// singleLinks.put("ptc/136.jpg", "PTC.zip/PTC/Flamerush Rider.full.jpg"); -// singleLinks.put("ptc/137.jpg", "PTC.zip/PTC/Flamewake Phoenix.full.jpg"); -// singleLinks.put("ptc/138.jpg", "PTC.zip/PTC/Jeskai Infiltrator.full.jpg"); -// singleLinks.put("ptc/14.jpg", "PTC.zip/PTC/Fungal Shambler.full.jpg"); -// singleLinks.put("ptc/141.jpg", "PTC.zip/PTC/Mastery of the Unseen.full.jpg"); -// singleLinks.put("ptc/142.jpg", "PTC.zip/PTC/Ojutai, Soul of Winter.full.jpg"); -// singleLinks.put("ptc/143.jpg", "PTC.zip/PTC/Rally the Ancestors.full.jpg"); -// singleLinks.put("ptc/145.jpg", "PTC.zip/PTC/Sandsteppe Mastodon.full.jpg"); -// singleLinks.put("ptc/147.jpg", "PTC.zip/PTC/Shamanic Revelation.full.jpg"); -// singleLinks.put("ptc/15.jpg", "PTC.zip/PTC/Stone-Tongue Basilisk.full.jpg"); -// singleLinks.put("ptc/150.jpg", "PTC.zip/PTC/Soulfire Grand Master.full.jpg"); -// singleLinks.put("ptc/151.jpg", "PTC.zip/PTC/Soulflayer.full.jpg"); -// singleLinks.put("ptc/152.jpg", "PTC.zip/PTC/Supplant Form.full.jpg"); -// singleLinks.put("ptc/153.jpg", "PTC.zip/PTC/Tasigur, the Golden Fang.full.jpg"); -// singleLinks.put("ptc/154.jpg", "PTC.zip/PTC/Torrent Elemental.full.jpg"); -// singleLinks.put("ptc/157.jpg", "PTC.zip/PTC/Yasova Dragonclaw.full.jpg"); -// singleLinks.put("ptc/16.jpg", "PTC.zip/PTC/Laquatus's Champion.full.jpg"); -// singleLinks.put("ptc/166.jpg", "PTC.zip/PTC/Crater Elemental.full.jpg"); -// singleLinks.put("ptc/168.jpg", "PTC.zip/PTC/Deathbringer Regent.full.jpg"); -// singleLinks.put("ptc/17.jpg", "PTC.zip/PTC/Glory.full.jpg"); -// singleLinks.put("ptc/18.jpg", "PTC.zip/PTC/Silent Specter.full.jpg"); -// singleLinks.put("ptc/181.jpg", "PTC.zip/PTC/Kolaghan's Command.full.jpg"); -// singleLinks.put("ptc/183.jpg", "PTC.zip/PTC/Myth Realized.full.jpg"); -// singleLinks.put("ptc/185.jpg", "PTC.zip/PTC/Ojutai's Command.full.jpg"); -// singleLinks.put("ptc/19.jpg", "PTC.zip/PTC/Feral Throwback.full.jpg"); -// singleLinks.put("ptc/196.jpg", "PTC.zip/PTC/Volcanic Vision.full.jpg"); -// singleLinks.put("ptc/198.jpg", "PTC.zip/PTC/Abbot of Keral Keep.full.jpg"); -// singleLinks.put("ptc/2.jpg", "PTC.zip/PTC/Revenant.full.jpg"); -// singleLinks.put("ptc/20.jpg", "PTC.zip/PTC/Soul Collector.full.jpg"); -// singleLinks.put("ptc/21.jpg", "PTC.zip/PTC/Sword of Kaldra.full.jpg"); -// singleLinks.put("ptc/210.jpg", "PTC.zip/PTC/Gilt-Leaf Winnower.full.jpg"); -// singleLinks.put("ptc/212.jpg", "PTC.zip/PTC/Graveblade Marauder.full.jpg"); -// singleLinks.put("ptc/216.jpg", "PTC.zip/PTC/Jace, Vryn's Prodigy.full.jpg"); -// singleLinks.put("ptc/22.jpg", "PTC.zip/PTC/Shield of Kaldra.full.jpg"); -// singleLinks.put("ptc/225.jpg", "PTC.zip/PTC/Nissa's Revelation.full.jpg"); -// singleLinks.put("ptc/227.jpg", "PTC.zip/PTC/Outland Colossus.full.jpg"); -// singleLinks.put("ptc/23.jpg", "PTC.zip/PTC/Helm of Kaldra.full.jpg"); -// singleLinks.put("ptc/238.jpg", "PTC.zip/PTC/Akoum Firebird.full.jpg"); -// singleLinks.put("ptc/239.jpg", "PTC.zip/PTC/Akoum Hellkite.full.jpg"); -// singleLinks.put("ptc/24.jpg", "PTC.zip/PTC/Ryusei, the Falling Star.full.jpg"); -// singleLinks.put("ptc/240.jpg", "PTC.zip/PTC/Aligned Hedron Network.full.jpg"); -// singleLinks.put("ptc/241.jpg", "PTC.zip/PTC/Ally Encampment.full.jpg"); -// singleLinks.put("ptc/242.jpg", "PTC.zip/PTC/Angelic Captain.full.jpg"); -// singleLinks.put("ptc/243.jpg", "PTC.zip/PTC/Barrage Tyrant.full.jpg"); -// singleLinks.put("ptc/244.jpg", "PTC.zip/PTC/Beastcaller Savant.full.jpg"); -// singleLinks.put("ptc/245.jpg", "PTC.zip/PTC/Blight Herder.full.jpg"); -// singleLinks.put("ptc/246.jpg", "PTC.zip/PTC/Bring to Light.full.jpg"); -// singleLinks.put("ptc/247.jpg", "PTC.zip/PTC/Brood Butcher.full.jpg"); -// singleLinks.put("ptc/248.jpg", "PTC.zip/PTC/Brutal Expulsion.full.jpg"); -// singleLinks.put("ptc/249.jpg", "PTC.zip/PTC/Canopy Vista.full.jpg"); -// singleLinks.put("ptc/25.jpg", "PTC.zip/PTC/Ink-Eyes, Servant of Oni.full.jpg"); -// singleLinks.put("ptc/250.jpg", "PTC.zip/PTC/Cinder Glade.full.jpg"); -// singleLinks.put("ptc/251.jpg", "PTC.zip/PTC/Conduit of Ruin.full.jpg"); -// singleLinks.put("ptc/252.jpg", "PTC.zip/PTC/Defiant Bloodlord.full.jpg"); -// singleLinks.put("ptc/253.jpg", "PTC.zip/PTC/Desolation Twin.full.jpg"); -// singleLinks.put("ptc/254.jpg", "PTC.zip/PTC/Dragonmaster Outcast.full.jpg"); -// singleLinks.put("ptc/255.jpg", "PTC.zip/PTC/Drana, Liberator of Malakir.full.jpg"); -// singleLinks.put("ptc/256.jpg", "PTC.zip/PTC/Drowner of Hope.full.jpg"); -// singleLinks.put("ptc/257.jpg", "PTC.zip/PTC/Dust Stalker.full.jpg"); -// singleLinks.put("ptc/258.jpg", "PTC.zip/PTC/Emeria Shepherd.full.jpg"); -// singleLinks.put("ptc/259.jpg", "PTC.zip/PTC/Endless One.full.jpg"); -// singleLinks.put("ptc/26.jpg", "PTC.zip/PTC/Kiyomaro, First to Stand.full.jpg"); -// singleLinks.put("ptc/260.jpg", "PTC.zip/PTC/Exert Influence.full.jpg"); -// singleLinks.put("ptc/261.jpg", "PTC.zip/PTC/Fathom Feeder.full.jpg"); -// singleLinks.put("ptc/262.jpg", "PTC.zip/PTC/Felidar Sovereign.full.jpg"); -// singleLinks.put("ptc/263.jpg", "PTC.zip/PTC/From Beyond.full.jpg"); -// singleLinks.put("ptc/264.jpg", "PTC.zip/PTC/Gideon, Ally of Zendikar.full.jpg"); -// singleLinks.put("ptc/265.jpg", "PTC.zip/PTC/Greenwarden of Murasa.full.jpg"); -// singleLinks.put("ptc/266.jpg", "PTC.zip/PTC/Gruesome Slaughter.full.jpg"); -// singleLinks.put("ptc/267.jpg", "PTC.zip/PTC/Guardian of Tazeem.full.jpg"); -// singleLinks.put("ptc/268.jpg", "PTC.zip/PTC/Guul Draz Overseer.full.jpg"); -// singleLinks.put("ptc/27.jpg", "PTC.zip/PTC/Gleancrawler.full.jpg"); -// singleLinks.put("ptc/271.jpg", "PTC.zip/PTC/Lantern Scout.full.jpg"); -// singleLinks.put("ptc/272.jpg", "PTC.zip/PTC/Lumbering Falls.full.jpg"); -// singleLinks.put("ptc/273.jpg", "PTC.zip/PTC/March from the Tomb.full.jpg"); -// singleLinks.put("ptc/274.jpg", "PTC.zip/PTC/Munda, Ambush Leader.full.jpg"); -// singleLinks.put("ptc/275.jpg", "PTC.zip/PTC/Nissa's Renewal.full.jpg"); -// singleLinks.put("ptc/276.jpg", "PTC.zip/PTC/Noyan Dar, Roil Shaper.full.jpg"); -// singleLinks.put("ptc/277.jpg", "PTC.zip/PTC/Ob Nixilis Reignited.full.jpg"); -// singleLinks.put("ptc/278.jpg", "PTC.zip/PTC/Oblivion Sower.full.jpg"); -// singleLinks.put("ptc/279.jpg", "PTC.zip/PTC/Omnath, Locus of Rage.full.jpg"); -// singleLinks.put("ptc/28.jpg", "PTC.zip/PTC/Djinn Illuminatus.full.jpg"); -// singleLinks.put("ptc/280.jpg", "PTC.zip/PTC/Oran-Rief Hydra.full.jpg"); -// singleLinks.put("ptc/281.jpg", "PTC.zip/PTC/Painful Truths.full.jpg"); -// singleLinks.put("ptc/282.jpg", "PTC.zip/PTC/Part the Waterveil.full.jpg"); -// singleLinks.put("ptc/283.jpg", "PTC.zip/PTC/Planar Outburst.full.jpg"); -// singleLinks.put("ptc/284.jpg", "PTC.zip/PTC/Prairie Stream.full.jpg"); -// singleLinks.put("ptc/285.jpg", "PTC.zip/PTC/Prism Array.full.jpg"); -// singleLinks.put("ptc/286.jpg", "PTC.zip/PTC/Quarantine Field.full.jpg"); -// singleLinks.put("ptc/287.jpg", "PTC.zip/PTC/Radiant Flames.full.jpg"); -// singleLinks.put("ptc/288.jpg", "PTC.zip/PTC/Ruinous Path.full.jpg"); -// singleLinks.put("ptc/289.jpg", "PTC.zip/PTC/Sanctum of Ugin.full.jpg"); -// singleLinks.put("ptc/29.jpg", "PTC.zip/PTC/Avatar of Discord.full.jpg"); -// singleLinks.put("ptc/290.jpg", "PTC.zip/PTC/Scatter to the Winds.full.jpg"); -// singleLinks.put("ptc/291.jpg", "PTC.zip/PTC/Serpentine Spike.full.jpg"); -// singleLinks.put("ptc/292.jpg", "PTC.zip/PTC/Shambling Vent.full.jpg"); -// singleLinks.put("ptc/293.jpg", "PTC.zip/PTC/Shrine of the Forsaken Gods.full.jpg"); -// singleLinks.put("ptc/294.jpg", "PTC.zip/PTC/Sire of Stagnation.full.jpg"); -// singleLinks.put("ptc/295.jpg", "PTC.zip/PTC/Smoldering Marsh.full.jpg"); -// singleLinks.put("ptc/296.jpg", "PTC.zip/PTC/Smothering Abomination.full.jpg"); -// singleLinks.put("ptc/297.jpg", "PTC.zip/PTC/Sunken Hollow.full.jpg"); -// singleLinks.put("ptc/298.jpg", "PTC.zip/PTC/Ugin's Insight.full.jpg"); -// singleLinks.put("ptc/299.jpg", "PTC.zip/PTC/Ulamog, the Ceaseless Hunger.full.jpg"); -// singleLinks.put("ptc/3.jpg", "PTC.zip/PTC/Monstrous Hound.full.jpg"); -// singleLinks.put("ptc/30.jpg", "PTC.zip/PTC/Allosaurus Rider.full.jpg"); -// singleLinks.put("ptc/300.jpg", "PTC.zip/PTC/Undergrowth Champion.full.jpg"); -// singleLinks.put("ptc/301.jpg", "PTC.zip/PTC/Veteran Warleader.full.jpg"); -// singleLinks.put("ptc/302.jpg", "PTC.zip/PTC/Void Winnower.full.jpg"); -// singleLinks.put("ptc/303.jpg", "PTC.zip/PTC/Wasteland Strangler.full.jpg"); -// singleLinks.put("ptc/304.jpg", "PTC.zip/PTC/Woodland Wanderer.full.jpg"); -// singleLinks.put("ptc/305.jpg", "PTC.zip/PTC/Zada, Hedron Grinder.full.jpg"); -// singleLinks.put("ptc/31.jpg", "PTC.zip/PTC/Lotus Bloom.full.jpg"); -// singleLinks.put("ptc/32.jpg", "PTC.zip/PTC/Oros, the Avenger.full.jpg"); -// singleLinks.put("ptc/33.jpg", "PTC.zip/PTC/Korlash, Heir to Blackblade.full.jpg"); -// singleLinks.put("ptc/34.jpg", "PTC.zip/PTC/Wren's Run Packmaster.full.jpg"); -// singleLinks.put("ptc/35.jpg", "PTC.zip/PTC/Door of Destinies.full.jpg"); -// singleLinks.put("ptc/36.jpg", "PTC.zip/PTC/Demigod of Revenge.full.jpg"); -// singleLinks.put("ptc/37.jpg", "PTC.zip/PTC/Overbeing of Myth.full.jpg"); -// singleLinks.put("ptc/38.jpg", "PTC.zip/PTC/Ajani Vengeant.full.jpg"); -// singleLinks.put("ptc/39.jpg", "PTC.zip/PTC/Malfegor.full.jpg"); -// singleLinks.put("ptc/4.jpg", "PTC.zip/PTC/Lightning Dragon.full.jpg"); -// singleLinks.put("ptc/40.jpg", "PTC.zip/PTC/Dragon Broodmother.full.jpg"); -// singleLinks.put("ptc/41.jpg", "PTC.zip/PTC/Vampire Nocturnus.full.jpg"); -// singleLinks.put("ptc/42.jpg", "PTC.zip/PTC/Rampaging Baloths.full.jpg"); -// singleLinks.put("ptc/43.jpg", "PTC.zip/PTC/Comet Storm.full.jpg"); -// singleLinks.put("ptc/44.jpg", "PTC.zip/PTC/Emrakul, the Aeons Torn.full.jpg"); -// singleLinks.put("ptc/45.jpg", "PTC.zip/PTC/Sun Titan.full.jpg"); -// singleLinks.put("ptc/46.jpg", "PTC.zip/PTC/Wurmcoil Engine.full.jpg"); -// singleLinks.put("ptc/47.jpg", "PTC.zip/PTC/Hero of Bladehold.full.jpg"); -// singleLinks.put("ptc/48.jpg", "PTC.zip/PTC/Glissa, the Traitor.full.jpg"); -// singleLinks.put("ptc/49.jpg", "PTC.zip/PTC/Sheoldred, Whispering One.full.jpg"); -// singleLinks.put("ptc/5.jpg", "PTC.zip/PTC/Beast of Burden.full.jpg"); -// singleLinks.put("ptc/50.jpg", "PTC.zip/PTC/Bloodlord of Vaasgoth.full.jpg"); -// singleLinks.put("ptc/51a.jpg", "PTC.zip/PTC/Mayor of Avabruck.full.jpg"); -// singleLinks.put("ptc/51b.jpg", "PTC.zip/PTC/Howlpack Alpha.full.jpg"); -// singleLinks.put("ptc/52a.jpg", "PTC.zip/PTC/Ravenous Demon.full.jpg"); -// singleLinks.put("ptc/52b.jpg", "PTC.zip/PTC/Archdemon of Greed.full.jpg"); -// singleLinks.put("ptc/53.jpg", "PTC.zip/PTC/Moonsilver Spear.full.jpg"); -// singleLinks.put("ptc/54.jpg", "PTC.zip/PTC/Xathrid Gorgon.full.jpg"); -// singleLinks.put("ptc/55.jpg", "PTC.zip/PTC/Archon of the Triumvirate.full.jpg"); -// singleLinks.put("ptc/56.jpg", "PTC.zip/PTC/Hypersonic Dragon.full.jpg"); -// singleLinks.put("ptc/57.jpg", "PTC.zip/PTC/Carnival Hellsteed.full.jpg"); -// singleLinks.put("ptc/58.jpg", "PTC.zip/PTC/Corpsejack Menace.full.jpg"); -// singleLinks.put("ptc/59.jpg", "PTC.zip/PTC/Grove of the Guardian.full.jpg"); -// singleLinks.put("ptc/6.jpg", "PTC.zip/PTC/Lu Bu, Master-at-Arms.full.jpg"); -// singleLinks.put("ptc/60.jpg", "PTC.zip/PTC/Consuming Aberration.full.jpg"); -// singleLinks.put("ptc/61.jpg", "PTC.zip/PTC/Fathom Mage.full.jpg"); -// singleLinks.put("ptc/62.jpg", "PTC.zip/PTC/Foundry Champion.full.jpg"); -// singleLinks.put("ptc/63.jpg", "PTC.zip/PTC/Rubblehulk.full.jpg"); -// singleLinks.put("ptc/64.jpg", "PTC.zip/PTC/Treasury Thrull.full.jpg"); -// singleLinks.put("ptc/65.jpg", "PTC.zip/PTC/Maze's End.full.jpg"); -// singleLinks.put("ptc/66.jpg", "PTC.zip/PTC/Plains.66.full.jpg"); -// singleLinks.put("ptc/67.jpg", "PTC.zip/PTC/Megantic Sliver.full.jpg"); -// singleLinks.put("ptc/68.jpg", "PTC.zip/PTC/Celestial Archon.full.jpg"); -// singleLinks.put("ptc/69.jpg", "PTC.zip/PTC/Shipbreaker Kraken.full.jpg"); -// singleLinks.put("ptc/7.jpg", "PTC.zip/PTC/False Prophet.full.jpg"); -// singleLinks.put("ptc/70.jpg", "PTC.zip/PTC/Abhorrent Overlord.full.jpg"); -// singleLinks.put("ptc/71.jpg", "PTC.zip/PTC/Ember Swallower.full.jpg"); -// singleLinks.put("ptc/72.jpg", "PTC.zip/PTC/Anthousa, Setessan Hero.full.jpg"); -// singleLinks.put("ptc/73.jpg", "PTC.zip/PTC/Silent Sentinel.full.jpg"); -// singleLinks.put("ptc/74.jpg", "PTC.zip/PTC/Arbiter of the Ideal.full.jpg"); -// singleLinks.put("ptc/75.jpg", "PTC.zip/PTC/Eater of Hope.full.jpg"); -// singleLinks.put("ptc/76.jpg", "PTC.zip/PTC/Forgestoker Dragon.full.jpg"); -// singleLinks.put("ptc/77.jpg", "PTC.zip/PTC/Nessian Wilds Ravager.full.jpg"); -// singleLinks.put("ptc/78.jpg", "PTC.zip/PTC/Dawnbringer Charioteers.full.jpg"); -// singleLinks.put("ptc/79.jpg", "PTC.zip/PTC/Scourge of Fleets.full.jpg"); -// singleLinks.put("ptc/8.jpg", "PTC.zip/PTC/Lu Bu, Master-at-Arms.full.jpg"); -// singleLinks.put("ptc/80.jpg", "PTC.zip/PTC/Doomwake Giant.full.jpg"); -// singleLinks.put("ptc/81.jpg", "PTC.zip/PTC/Spawn of Thraxes.full.jpg"); -// singleLinks.put("ptc/82.jpg", "PTC.zip/PTC/Heroes' Bane.full.jpg"); -// singleLinks.put("ptc/83.jpg", "PTC.zip/PTC/Resolute Archangel.full.jpg"); -// singleLinks.put("ptc/84.jpg", "PTC.zip/PTC/Mercurial Pretender.full.jpg"); -// singleLinks.put("ptc/85.jpg", "PTC.zip/PTC/Indulgent Tormentor.full.jpg"); -// singleLinks.put("ptc/86.jpg", "PTC.zip/PTC/Siege Dragon.full.jpg"); -// singleLinks.put("ptc/87.jpg", "PTC.zip/PTC/Phytotitan.full.jpg"); -// singleLinks.put("ptc/88.jpg", "PTC.zip/PTC/Abzan Ascendancy.full.jpg"); -// singleLinks.put("ptc/89.jpg", "PTC.zip/PTC/Anafenza, the Foremost.full.jpg"); -// singleLinks.put("ptc/9.jpg", "PTC.zip/PTC/Overtaker.full.jpg"); -// singleLinks.put("ptc/90.jpg", "PTC.zip/PTC/Ankle Shanker.full.jpg"); -// singleLinks.put("ptc/91.jpg", "PTC.zip/PTC/Avalanche Tusker.full.jpg"); -// singleLinks.put("ptc/92.jpg", "PTC.zip/PTC/Bloodsoaked Champion.full.jpg"); -// singleLinks.put("ptc/93.jpg", "PTC.zip/PTC/Butcher of the Horde.full.jpg"); -// singleLinks.put("ptc/94.jpg", "PTC.zip/PTC/Crackling Doom.full.jpg"); -// singleLinks.put("ptc/95.jpg", "PTC.zip/PTC/Crater's Claws.full.jpg"); -// singleLinks.put("ptc/96.jpg", "PTC.zip/PTC/Deflecting Palm.full.jpg"); -// singleLinks.put("ptc/97.jpg", "PTC.zip/PTC/Dig Through Time.full.jpg"); -// singleLinks.put("ptc/98.jpg", "PTC.zip/PTC/Dragon-Style Twins.full.jpg"); -// singleLinks.put("ptc/99.jpg", "PTC.zip/PTC/Duneblast.full.jpg"); -// singleLinks.put("sus/1.jpg", "SUS.zip/SUS/Thran Quarry.full.jpg"); -// singleLinks.put("sus/10.jpg", "SUS.zip/SUS/Slith Firewalker.full.jpg"); -// singleLinks.put("sus/11.jpg", "SUS.zip/SUS/Royal Assassin.full.jpg"); -// singleLinks.put("sus/12.jpg", "SUS.zip/SUS/Sakura-Tribe Elder.full.jpg"); -// singleLinks.put("sus/13.jpg", "SUS.zip/SUS/Shard Phoenix.full.jpg"); -// singleLinks.put("sus/14.jpg", "SUS.zip/SUS/Soltari Priest.full.jpg"); -// singleLinks.put("sus/15.jpg", "SUS.zip/SUS/Whirling Dervish.full.jpg"); -// singleLinks.put("sus/16.jpg", "SUS.zip/SUS/Glorious Anthem.full.jpg"); -// singleLinks.put("sus/17.jpg", "SUS.zip/SUS/Elvish Champion.full.jpg"); -// singleLinks.put("sus/18.jpg", "SUS.zip/SUS/Mad Auntie.full.jpg"); -// singleLinks.put("sus/19.jpg", "SUS.zip/SUS/Slith Firewalker.full.jpg"); -// singleLinks.put("sus/2.jpg", "SUS.zip/SUS/Serra Avatar.full.jpg"); -// singleLinks.put("sus/20.jpg", "SUS.zip/SUS/Royal Assassin.full.jpg"); -// singleLinks.put("sus/21.jpg", "SUS.zip/SUS/Sakura-Tribe Elder.full.jpg"); -// singleLinks.put("sus/22.jpg", "SUS.zip/SUS/Shard Phoenix.full.jpg"); -// singleLinks.put("sus/23.jpg", "SUS.zip/SUS/Soltari Priest.full.jpg"); -// singleLinks.put("sus/24.jpg", "SUS.zip/SUS/Whirling Dervish.full.jpg"); -// singleLinks.put("sus/25.jpg", "SUS.zip/SUS/Glorious Anthem.full.jpg"); -// singleLinks.put("sus/26.jpg", "SUS.zip/SUS/Elvish Champion.full.jpg"); -// singleLinks.put("sus/27.jpg", "SUS.zip/SUS/Sakura-Tribe Elder.full.jpg"); -// singleLinks.put("sus/28.jpg", "SUS.zip/SUS/Shard Phoenix.full.jpg"); -// singleLinks.put("sus/29.jpg", "SUS.zip/SUS/Soltari Priest.full.jpg"); -// singleLinks.put("sus/3.jpg", "SUS.zip/SUS/Lord of Atlantis.full.jpg"); -// singleLinks.put("sus/30.jpg", "SUS.zip/SUS/Whirling Dervish.full.jpg"); -// singleLinks.put("sus/31.jpg", "SUS.zip/SUS/Glorious Anthem.full.jpg"); -// singleLinks.put("sus/32.jpg", "SUS.zip/SUS/Elvish Champion.full.jpg"); -// singleLinks.put("sus/4.jpg", "SUS.zip/SUS/Crusade.full.jpg"); -// singleLinks.put("sus/5.jpg", "SUS.zip/SUS/Elvish Lyrist.full.jpg"); -// singleLinks.put("sus/6.jpg", "SUS.zip/SUS/City of Brass.full.jpg"); -// singleLinks.put("sus/7.jpg", "SUS.zip/SUS/Volcanic Hammer.full.jpg"); -// singleLinks.put("sus/8.jpg", "SUS.zip/SUS/Giant Growth.full.jpg"); -// singleLinks.put("sus/9.jpg", "SUS.zip/SUS/Two-Headed Dragon.full.jpg"); -// singleLinks.put("ugin/1.jpg", "UGIN.zip/UGIN/Ugin, the Spirit Dragon.full.jpg"); -// singleLinks.put("ugin/113.jpg", "UGIN.zip/UGIN/Jeering Instigator.full.jpg"); -// singleLinks.put("ugin/123.jpg", "UGIN.zip/UGIN/Arashin War Beast.full.jpg"); -// singleLinks.put("ugin/129.jpg", "UGIN.zip/UGIN/Formless Nurturing.full.jpg"); -// singleLinks.put("ugin/131.jpg", "UGIN.zip/UGIN/Dragonscale Boon.full.jpg"); -// singleLinks.put("ugin/146.jpg", "UGIN.zip/UGIN/Wildcall.full.jpg"); -// singleLinks.put("ugin/161.jpg", "UGIN.zip/UGIN/Hewed Stone Retainers.full.jpg"); -// singleLinks.put("ugin/164.jpg", "UGIN.zip/UGIN/Ugin's Construct.full.jpg"); -// singleLinks.put("ugin/19.jpg", "UGIN.zip/UGIN/Mastery of the Unseen.full.jpg"); -// singleLinks.put("ugin/216.jpg", "UGIN.zip/UGIN/Altar of the Brood.full.jpg"); -// singleLinks.put("ugin/217.jpg", "UGIN.zip/UGIN/Briber's Purse.full.jpg"); -// singleLinks.put("ugin/220.jpg", "UGIN.zip/UGIN/Ghostfire Blade.full.jpg"); -// singleLinks.put("ugin/24.jpg", "UGIN.zip/UGIN/Smite the Monstrous.full.jpg"); -// singleLinks.put("ugin/26.jpg", "UGIN.zip/UGIN/Soul Summons.full.jpg"); -// singleLinks.put("ugin/30.jpg", "UGIN.zip/UGIN/Watcher of the Roost.full.jpg"); -// singleLinks.put("ugin/36.jpg", "UGIN.zip/UGIN/Jeskai Infiltrator.full.jpg"); -// singleLinks.put("ugin/46.jpg", "UGIN.zip/UGIN/Reality Shift.full.jpg"); -// singleLinks.put("ugin/48.jpg", "UGIN.zip/UGIN/Mystic of the Hidden Way.full.jpg"); -// singleLinks.put("ugin/59.jpg", "UGIN.zip/UGIN/Write into Being.full.jpg"); -// singleLinks.put("ugin/68.jpg", "UGIN.zip/UGIN/Debilitating Injury.full.jpg"); -// singleLinks.put("ugin/73.jpg", "UGIN.zip/UGIN/Grim Haruspex.full.jpg"); -// singleLinks.put("ugin/85.jpg", "UGIN.zip/UGIN/Sultai Emissary.full.jpg"); -// singleLinks.put("ugin/88.jpg", "UGIN.zip/UGIN/Ruthless Ripper.full.jpg"); -// singleLinks.put("ugin/96.jpg", "UGIN.zip/UGIN/Ainok Tracker.full.jpg"); -// singleLinks.put("ugin/97.jpg", "UGIN.zip/UGIN/Arc Lightning.full.jpg"); -// singleLinks.put("ugin/98.jpg", "UGIN.zip/UGIN/Fierce Invocation.full.jpg"); -// singleLinks.put("wmcq/1.jpg", "WMCQ.zip/WMCQ/Vengevine.full.jpg"); -// singleLinks.put("wmcq/2.jpg", "WMCQ.zip/WMCQ/Geist of Saint Traft.full.jpg"); -// singleLinks.put("wmcq/3.jpg", "WMCQ.zip/WMCQ/Thalia, Guardian of Thraben.full.jpg"); -// singleLinks.put("wmcq/4.jpg", "WMCQ.zip/WMCQ/Liliana of the Veil.full.jpg"); -// singleLinks.put("wmcq/5.jpg", "WMCQ.zip/WMCQ/Snapcaster Mage.full.jpg"); } @Override @@ -2025,7 +458,7 @@ public enum GrabbagImageSource implements CardImageSource { if (singleLinks == null) { setupLinks(); } - return singleLinks.containsKey(setCode + "/" + cardName); + return singleLinks.containsKey(setCode + "/" + cardName) || singleLinks.containsKey(setCode + "/" + cardName + "-a"); } @Override 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 353ecde35a9..3a43aec961d 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 @@ -195,7 +195,6 @@ public enum ScryfallImageSource implements CardImageSource { supportedSets.add("DDS"); supportedSets.add("W17"); supportedSets.add("AKH"); - supportedSets.add("MPS"); supportedSets.add("CMA"); supportedSets.add("E01"); supportedSets.add("HOU"); diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/images/CardDownloadData.java b/Mage.Client/src/main/java/org/mage/plugins/card/images/CardDownloadData.java index f78417a845a..08c0a25587e 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/images/CardDownloadData.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/images/CardDownloadData.java @@ -84,7 +84,7 @@ public class CardDownloadData { if (obj == null) { return false; } - if (getClass() != obj.getClass()) { + if (!getClass().equals(obj.getClass())) { return false; } final CardDownloadData other = (CardDownloadData) obj; @@ -134,6 +134,10 @@ public class CardDownloadData { return CardUtil.parseCardNumberAsInt(collectorId); } + public String getCollectorIdPostfix() { + return getCollectorId().replaceAll(getCollectorIdAsInt().toString(), ""); + } + public boolean isCollectorIdWithStr() { // card have special numbers like "103a", "180b" (scryfall style) return !getCollectorId().equals(getCollectorIdAsInt().toString()); diff --git a/Mage.Client/src/main/resources/card-pictures-tok.txt b/Mage.Client/src/main/resources/card-pictures-tok.txt index 501c7275aab..5c59e59c9c1 100644 --- a/Mage.Client/src/main/resources/card-pictures-tok.txt +++ b/Mage.Client/src/main/resources/card-pictures-tok.txt @@ -84,6 +84,7 @@ |Generate|EMBLEM:M14|Garruk, Caller of Beasts||Emblem Garruk|GarrukCallerOfBeastsEmblem| |Generate|EMBLEM:M14|Liliana of the Dark Realms||Emblem Liliana|LilianaOfTheDarkRealmsEmblem| |Generate|EMBLEM:MMA|Elspeth, Knight Errant||Emblem Elspeth|ElspethKnightErrantEmblem| +|Generate|EMBLEM:SWS|Obi-Wan Kenobi||Emblem Obi-Wan Kenobi|ObiWanKenobiEmblem| |Generate|EMBLEM:RIX|Huatli, Radiant Champion||Emblem Huatli|HuatliRadiantChampionEmblem| |Generate|PLANE:PCA|Plane - Academy At Tolaria West|||AcademyAtTolariaWestPlane| |Generate|PLANE:PCA|Plane - Agyrem|||AgyremPlane| @@ -1031,6 +1032,16 @@ |Generate|TOK:STH|Rat|||RatToken| |Generate|TOK:STH|Sliver|||SliversmithToken| |Generate|TOK:STH|Spike|||SpikeToken| +|Generate|TOK:SWS|Ewok|||EwokToken| +|Generate|TOK:SWS|B-Wing|||RebelStarshipToken| +|Generate|TOK:SWS|Hunter|||HunterToken| +|Generate|TOK:SWS|TIE Fighter|||TIEFighterToken| +|Generate|TOK:SWS|Trooper|||TrooperToken| +|Generate|TOK:SWS|AT-AT|||ATATToken| +|Generate|TOK:SWS|Rebel|||RebelToken| +|Generate|TOK:SWS|Royal Guard|||RoyalGuardToken| +|Generate|TOK:SWS|Tusken Raider|||TuskenRaiderToken| +|Generate|TOK:SWS|Droid|||DroidToken| |Generate|TOK:THS|Bird|||SwanSongBirdToken| |Generate|TOK:THS|Boar|||CurseOfTheSwineBoarToken| |Generate|TOK:THS|Cleric|||HeliodGodOfTheSunToken| diff --git a/Mage.Server.Console/src/main/java/mage/server/console/ConnectDialog.java b/Mage.Server.Console/src/main/java/mage/server/console/ConnectDialog.java index b784adc6cbe..15f8a25737b 100644 --- a/Mage.Server.Console/src/main/java/mage/server/console/ConnectDialog.java +++ b/Mage.Server.Console/src/main/java/mage/server/console/ConnectDialog.java @@ -37,10 +37,8 @@ import java.awt.*; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URL; -import java.util.ArrayList; -import java.util.Arrays; +import java.util.*; import java.util.List; -import java.util.Locale; import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; import javax.swing.*; @@ -84,15 +82,15 @@ public class ConnectDialog extends JDialog { } private void showProxySettings() { - if (cbProxyType.getSelectedItem() == Connection.ProxyType.SOCKS) { + if (Objects.equals(cbProxyType.getSelectedItem(), ProxyType.SOCKS)) { this.pnlProxy.setVisible(true); this.pnlProxyAuth.setVisible(false); this.pnlProxySettings.setVisible(true); - } else if (cbProxyType.getSelectedItem() == Connection.ProxyType.HTTP) { + } else if (Objects.equals(cbProxyType.getSelectedItem(), ProxyType.HTTP)) { this.pnlProxy.setVisible(true); this.pnlProxyAuth.setVisible(true); this.pnlProxySettings.setVisible(true); - } else if (cbProxyType.getSelectedItem() == Connection.ProxyType.NONE) { + } else if (Objects.equals(cbProxyType.getSelectedItem(), ProxyType.NONE)) { this.pnlProxy.setVisible(false); this.pnlProxyAuth.setVisible(false); this.pnlProxySettings.setVisible(false); diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Brawl.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Brawl.java index 0627d07f2b1..227f788d4fa 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Brawl.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Brawl.java @@ -74,12 +74,12 @@ public class Brawl extends Constructed { } } } - banned.add("Attune with Aether"); // since 2008-01-15 + banned.add("Attune with Aether"); // since 2018-01-15 banned.add("Aetherworks Marvel"); banned.add("Felidar Guardian"); - banned.add("Rampaging Ferocidon"); // since 2008-01-15 - banned.add("Ramunap Ruins"); // since 2008-01-15 - banned.add("Rogue Refiner"); // since 2008-01-15 + banned.add("Rampaging Ferocidon"); // since 2018-01-15 + banned.add("Ramunap Ruins"); // since 2018-01-15 + banned.add("Rogue Refiner"); // since 2018-01-15 banned.add("Smuggler's Copter"); } diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Standard.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Standard.java index 95af662d1ff..54eef0df5d6 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Standard.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Standard.java @@ -72,12 +72,12 @@ public class Standard extends Constructed { } } } - banned.add("Attune with Aether"); // since 2008-01-15 + banned.add("Attune with Aether"); // since 2018-01-15 banned.add("Aetherworks Marvel"); banned.add("Felidar Guardian"); - banned.add("Rampaging Ferocidon"); // since 2008-01-15 - banned.add("Ramunap Ruins"); // since 2008-01-15 - banned.add("Rogue Refiner"); // since 2008-01-15 + banned.add("Rampaging Ferocidon"); // since 2018-01-15 + banned.add("Ramunap Ruins"); // since 2018-01-15 + banned.add("Rogue Refiner"); // since 2018-01-15 banned.add("Smuggler's Copter"); } diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java index d3785cfa65a..5d599003ab1 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java @@ -28,17 +28,7 @@ package mage.player.ai; import java.io.File; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Scanner; -import java.util.Set; -import java.util.UUID; +import java.util.*; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; @@ -528,7 +518,7 @@ public class ComputerPlayer6 extends ComputerPlayer /*implements Player*/ { do { sim.getPlayer(nextPlayerId).pass(game); nextPlayerId = sim.getPlayerList().getNext(); - } while (nextPlayerId != this.getId()); + } while (!Objects.equals(nextPlayerId, this.getId())); } SimulationNode2 newNode = new SimulationNode2(node, sim, action, depth, currentPlayer.getId()); sim.checkStateAndTriggered(); diff --git a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java index 63f207e8960..bb2fe8d5452 100644 --- a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java @@ -148,13 +148,23 @@ public class ComputerPlayer extends PlayerImpl implements Player { if (log.isDebugEnabled()) { log.debug("chooseTarget: " + outcome.toString() + ':' + target.toString()); } + // sometimes a target selection can be made from a player that does not control the ability UUID abilityControllerId = playerId; if (target.getTargetController() != null && target.getAbilityController() != null) { abilityControllerId = target.getAbilityController(); } - UUID randomOpponentId = getRandomOpponent(abilityControllerId, game); + + UUID randomOpponentId; + if (target.getTargetController() != null) { + randomOpponentId = getRandomOpponent(target.getTargetController(), game);; + } else if (abilityControllerId != null) { + randomOpponentId = getRandomOpponent(abilityControllerId, game); + } else { + randomOpponentId = getRandomOpponent(playerId, game); + } + if (target.getOriginalTarget() instanceof TargetPlayer) { return setTargetPlayer(outcome, target, null, sourceId, abilityControllerId, randomOpponentId, game); } @@ -438,7 +448,16 @@ public class ComputerPlayer extends PlayerImpl implements Player { if (target.getAbilityController() != null) { abilityControllerId = target.getAbilityController(); } - UUID randomOpponentId = getRandomOpponent(abilityControllerId, game); + + UUID randomOpponentId; + if (target.getTargetController() != null) { + randomOpponentId = getRandomOpponent(target.getTargetController(), game);; + } else if (source != null && source.getControllerId() != null) { + randomOpponentId = getRandomOpponent(source.getControllerId(), game); + } else { + randomOpponentId = getRandomOpponent(playerId, game); + } + if (target.getOriginalTarget() instanceof TargetPlayer) { return setTargetPlayer(outcome, target, source, source.getSourceId(), abilityControllerId, randomOpponentId, game); } @@ -2482,4 +2501,22 @@ public class ComputerPlayer extends PlayerImpl implements Player { } return randomOpponentId; } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (o == null || getClass() != o.getClass()) { + return false; + } + + Player obj = (Player) o; + if (this.getId() == null || obj.getId() == null) { + return false; + } + + return this.getId().equals(obj.getId()); + } } diff --git a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java index de2363ce9ce..bd09c81fa1a 100644 --- a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java @@ -823,7 +823,7 @@ public class HumanPlayer extends PlayerImpl { } } } else if (passedUntilStackResolved) { - if (dateLastAddedToStack == game.getStack().getDateLastAdded()) { + if (Objects.equals(dateLastAddedToStack, game.getStack().getDateLastAdded())) { dateLastAddedToStack = game.getStack().getDateLastAdded(); if (passWithManaPoolCheck(game)) { return false; diff --git a/Mage.Sets/src/mage/cards/a/AliFromCairo.java b/Mage.Sets/src/mage/cards/a/AliFromCairo.java index cc243fb0572..7406471ad32 100644 --- a/Mage.Sets/src/mage/cards/a/AliFromCairo.java +++ b/Mage.Sets/src/mage/cards/a/AliFromCairo.java @@ -97,7 +97,7 @@ class AliFromCairoReplacementEffect extends ReplacementEffectImpl { && (controller.getLife() > 0) &&(controller.getLife() - event.getAmount()) < 1 && event.getPlayerId().equals(controller.getId()) ) { - return true; + return true; } } return false; @@ -106,17 +106,12 @@ class AliFromCairoReplacementEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { Player controller = game.getPlayer(source.getControllerId()); - - // 10/1/2008: The ability doesn't change how much damage is dealt; - // it just changes how much life that damage makes you lose. - // An effect such as Spirit Link will see the full amount of damage being dealt. - game.fireEvent(event); - if (controller != null) { - controller.setLife(1, game, source); + // 10/1/2008: The ability doesn't change how much damage is dealt; + // it just changes how much life that damage makes you lose. + // An effect such as Spirit Link will see the full amount of damage being dealt. + event.setAmount(controller.getLife() - 1); } - - return true; + return false; } - } diff --git a/Mage.Sets/src/mage/cards/b/BatheInLight.java b/Mage.Sets/src/mage/cards/b/BatheInLight.java index 15ee51eb881..7317708635e 100644 --- a/Mage.Sets/src/mage/cards/b/BatheInLight.java +++ b/Mage.Sets/src/mage/cards/b/BatheInLight.java @@ -112,7 +112,7 @@ class BatheInLightEffect extends OneShotEffect { game.addEffect(effect, source); ObjectColor color = target.getColor(game); for (Permanent permanent : game.getBattlefield().getActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURE, source.getControllerId(), source.getSourceId(), game)) { - if (permanent != target && permanent.getColor(game).shares(color)) { + if (!permanent.getId().equals(target.getId()) && permanent.getColor(game).shares(color)) { game.getState().setValue(permanent.getId() + "_color", colorChoice.getColor()); effect.setTargetPointer(new FixedTarget(permanent, game)); game.addEffect(effect, source); diff --git a/Mage.Sets/src/mage/cards/b/BrandOfIllOmen.java b/Mage.Sets/src/mage/cards/b/BrandOfIllOmen.java index ff50756639b..0b66aafdaa1 100644 --- a/Mage.Sets/src/mage/cards/b/BrandOfIllOmen.java +++ b/Mage.Sets/src/mage/cards/b/BrandOfIllOmen.java @@ -44,6 +44,7 @@ import mage.game.permanent.Permanent; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; +import java.util.Objects; import java.util.UUID; /** @@ -122,7 +123,7 @@ class BrandOfIllOmenEffect extends ContinuousRuleModifyingEffectImpl { Permanent brand = game.getPermanent(source.getSourceId()); if (brand != null && brand.getAttachedTo() != null) { UUID enchantedController = game.getPermanent(brand.getAttachedTo()).getControllerId(); - if(enchantedController == event.getPlayerId() && game.getObject(event.getSourceId()).isCreature()) { + if(Objects.equals(enchantedController, event.getPlayerId()) && game.getObject(event.getSourceId()).isCreature()) { return true; } } diff --git a/Mage.Sets/src/mage/cards/d/DesperateGambit.java b/Mage.Sets/src/mage/cards/d/DesperateGambit.java index 3dde02e293d..bee7635cb44 100644 --- a/Mage.Sets/src/mage/cards/d/DesperateGambit.java +++ b/Mage.Sets/src/mage/cards/d/DesperateGambit.java @@ -28,6 +28,7 @@ package mage.cards.d; import java.util.HashSet; +import java.util.Objects; import java.util.Set; import java.util.UUID; import mage.MageObject; @@ -158,7 +159,7 @@ class TargetControlledSource extends TargetSource { int count = 0; for (StackObject stackObject: game.getStack()) { if (game.getState().getPlayersInRange(sourceControllerId, game).contains(stackObject.getControllerId()) - && stackObject.getControllerId() == sourceControllerId) { + && Objects.equals(stackObject.getControllerId(), sourceControllerId)) { count++; if (count >= this.minNumberOfTargets) { return true; @@ -166,7 +167,7 @@ class TargetControlledSource extends TargetSource { } } for (Permanent permanent: game.getBattlefield().getActivePermanents(sourceControllerId, game)) { - if (permanent.getControllerId() == sourceControllerId) { + if (Objects.equals(permanent.getControllerId(), sourceControllerId)) { count++; if (count >= this.minNumberOfTargets) { return true; @@ -174,7 +175,7 @@ class TargetControlledSource extends TargetSource { } } for (Player player : game.getPlayers().values()) { - if (player == game.getPlayer(sourceControllerId)) { + if (Objects.equals(player, game.getPlayer(sourceControllerId))) { for (Card card : player.getGraveyard().getCards(game)) { count++; if (count >= this.minNumberOfTargets) { @@ -183,7 +184,7 @@ class TargetControlledSource extends TargetSource { } // 108.4a If anything asks for the controller of a card that doesn’t have one (because it’s not a permanent or spell), use its owner instead. for (Card card : game.getExile().getAllCards(game)) { - if (card.getOwnerId() == sourceControllerId) { + if (Objects.equals(card.getOwnerId(), sourceControllerId)) { count++; if (count >= this.minNumberOfTargets) { return true; @@ -200,23 +201,23 @@ class TargetControlledSource extends TargetSource { Set possibleTargets = new HashSet<>(); for (StackObject stackObject: game.getStack()) { if (game.getState().getPlayersInRange(sourceControllerId, game).contains(stackObject.getControllerId()) - && stackObject.getControllerId() == sourceControllerId) { + && Objects.equals(stackObject.getControllerId(), sourceControllerId)) { possibleTargets.add(stackObject.getId()); } } for (Permanent permanent: game.getBattlefield().getActivePermanents(sourceControllerId, game)) { - if (permanent.getControllerId() == sourceControllerId) { + if (Objects.equals(permanent.getControllerId(), sourceControllerId)) { possibleTargets.add(permanent.getId()); } } for (Player player : game.getPlayers().values()) { - if (player == game.getPlayer(sourceControllerId)) { + if (Objects.equals(player, game.getPlayer(sourceControllerId))) { for (Card card : player.getGraveyard().getCards(game)) { possibleTargets.add(card.getId()); } // 108.4a If anything asks for the controller of a card that doesn’t have one (because it’s not a permanent or spell), use its owner instead. for (Card card : game.getExile().getAllCards(game)) { - if (card.getOwnerId() == sourceControllerId) { + if (Objects.equals(card.getOwnerId(), sourceControllerId)) { possibleTargets.add(card.getId()); } } diff --git a/Mage.Sets/src/mage/cards/d/DrainPower.java b/Mage.Sets/src/mage/cards/d/DrainPower.java new file mode 100644 index 00000000000..5cc297b22c9 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DrainPower.java @@ -0,0 +1,183 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.cards.d; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.ActivatedAbility; +import mage.abilities.costs.mana.ManaCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.mana.ActivatedManaAbilityImpl; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.AbilityType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.permanent.PermanentInListPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.ManaPoolItem; +import mage.players.Player; +import mage.target.TargetPermanent; +import mage.target.TargetPlayer; + +/** + * + * @author L_J + */ +public class DrainPower extends CardImpl { + + public DrainPower(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{U}{U}"); + + // Target player activates a mana ability of each land they control. Then that player loses all unspent mana and you add the mana lost this way. + this.getSpellAbility().addEffect(new DrainPowerEffect()); + this.getSpellAbility().addTarget(new TargetPlayer()); + } + + public DrainPower(final DrainPower card) { + super(card); + } + + @Override + public DrainPower copy() { + return new DrainPower(this); + } +} + +class DrainPowerEffect extends OneShotEffect { + + private static final FilterLandPermanent filter = new FilterLandPermanent(); + + public DrainPowerEffect() { + super(Outcome.PutManaInPool); + this.staticText = "Target player activates a mana ability of each land they control. Then that player loses all unspent mana and you add the mana lost this way"; + } + + public DrainPowerEffect(final DrainPowerEffect effect) { + super(effect); + } + + @Override + public DrainPowerEffect copy() { + return new DrainPowerEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Player targetPlayer = game.getPlayer(source.getFirstTarget()); + if (targetPlayer != null) { + List ignorePermanents = new ArrayList<>(); + TargetPermanent target = null; + + while (true) { + Map> manaAbilitiesMap = new HashMap<>(); + for (Permanent permanent : game.getBattlefield().getAllActivePermanents(filter, targetPlayer.getId(), game)) { + if (!ignorePermanents.contains(permanent)) { + List manaAbilities = new ArrayList<>(); + abilitySearch: + for (Ability ability : permanent.getAbilities()) { + if (ability instanceof ActivatedAbility && ability.getAbilityType() == AbilityType.MANA) { + ActivatedManaAbilityImpl manaAbility = (ActivatedManaAbilityImpl) ability; + // TODO: make Rhystic Cave untappable due to its instant speed limitation (this is a Rhystic Cave canActivate bug) + if (manaAbility != null && manaAbility.canActivate(targetPlayer.getId(), game)) { + // canActivate can't check for mana abilities that require a mana cost, if the payment isn't possible (Cabal Coffers etc) + // so it's necessary to filter them out manually - might be buggy in some fringe cases + for (ManaCost manaCost : manaAbility.getManaCosts()) { + if (!targetPlayer.getManaPool().getMana().includesMana(manaCost.getMana())) { + continue abilitySearch; + } + } + manaAbilities.add(manaAbility); + } + } + } + if (!manaAbilities.isEmpty()) { + manaAbilitiesMap.put(permanent, manaAbilities); + } + } + } + if (manaAbilitiesMap.isEmpty()) { + break; + } + + List permList = new ArrayList<>(manaAbilitiesMap.keySet()); + Permanent permanent; + if (permList.size() > 1 || target != null) { + FilterLandPermanent filter2 = new FilterLandPermanent("land you control to tap for mana (remaining: " + permList.size() + ')'); + filter2.add(new PermanentInListPredicate(permList)); + target = new TargetPermanent(1, 1, filter2, true); + while (!target.isChosen() && target.canChoose(targetPlayer.getId(), game) && targetPlayer.canRespond()) { + targetPlayer.chooseTarget(Outcome.Neutral, target, source, game); + } + permanent = game.getPermanent(target.getFirstTarget()); + } else { + permanent = permList.get(0); + } + if (permanent != null) { + int i = 0; + for (ActivatedManaAbilityImpl manaAbility : manaAbilitiesMap.get(permanent)) { + i++; + if (manaAbilitiesMap.get(permanent).size() <= i + || targetPlayer.chooseUse(Outcome.Neutral, "Activate mana ability \"" + manaAbility.getRule() + "\" of " + permanent.getLogName() + + "? (Choose \"no\" to activate next mana ability)", source, game)) { + boolean originalCanUndo = manaAbility.isUndoPossible(); + manaAbility.setUndoPossible(false); // prevents being able to undo Drain Power + if (targetPlayer.activateAbility(manaAbility, game)) { + ignorePermanents.add(permanent); + } + manaAbility.setUndoPossible(originalCanUndo); // resets undoPossible to its original state + break; + } + } + } + } + + // 106.12. One card (Drain Power) causes one player to lose unspent mana and another to add “the mana lost this way.” (Note that these may be the same player.) + // This empties the former player’s mana pool and causes the mana emptied this way to be put into the latter player’s mana pool. Which permanents, spells, and/or + // abilities produced that mana are unchanged, as are any restrictions or additional effects associated with any of that mana. + // TODO: retain riders associated with drained mana + List manaItems = targetPlayer.getManaPool().getManaItems(); + targetPlayer.getManaPool().emptyPool(game); + for (ManaPoolItem manaPoolItem : manaItems) { + controller.getManaPool().addMana( + manaPoolItem.isConditional() ? manaPoolItem.getConditionalMana() : manaPoolItem.getMana(), + game, source, Duration.EndOfTurn.equals(manaPoolItem.getDuration())); + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/e/ElderwoodScion.java b/Mage.Sets/src/mage/cards/e/ElderwoodScion.java index c85d61823b7..a5fa4b54375 100644 --- a/Mage.Sets/src/mage/cards/e/ElderwoodScion.java +++ b/Mage.Sets/src/mage/cards/e/ElderwoodScion.java @@ -34,7 +34,6 @@ import mage.abilities.Mode; import mage.abilities.SpellAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.cost.CostModificationEffectImpl; -import mage.abilities.keyword.FlashbackAbility; import mage.abilities.keyword.LifelinkAbility; import mage.abilities.keyword.TrampleAbility; import mage.cards.CardImpl; @@ -99,7 +98,7 @@ class ElderwoodScionCostReductionEffect extends CostModificationEffectImpl { @Override public boolean applies(Ability abilityToModify, Ability source, Game game) { - if (abilityToModify instanceof SpellAbility || abilityToModify instanceof FlashbackAbility) { + if (abilityToModify instanceof SpellAbility) { if (abilityToModify.getControllerId().equals(source.getControllerId())) { for (UUID modeId : abilityToModify.getModes().getSelectedModes()) { Mode mode = abilityToModify.getModes().get(modeId); @@ -125,7 +124,7 @@ class ElderwoodScionCostReductionEffect extends CostModificationEffectImpl { class ElderwoodScionCostReductionEffect2 extends CostModificationEffectImpl { - private static final String effectText = "Spells your opponents cast that target Elderwood Scion cost {2} more to cast"; + private static final String effectText = "Spells your opponents cast that target {this} cost {2} more to cast"; ElderwoodScionCostReductionEffect2() { super(Duration.WhileOnBattlefield, Outcome.Benefit, CostModificationType.INCREASE_COST); @@ -145,7 +144,7 @@ class ElderwoodScionCostReductionEffect2 extends CostModificationEffectImpl { @Override public boolean applies(Ability abilityToModify, Ability source, Game game) { - if (abilityToModify.getAbilityType() == AbilityType.ACTIVATED) { + if (abilityToModify instanceof SpellAbility) { if (game.getOpponents(source.getControllerId()).contains(abilityToModify.getControllerId())) { for (Target target : abilityToModify.getTargets()) { for (UUID targetUUID : target.getTargets()) { diff --git a/Mage.Sets/src/mage/cards/e/EyeForAnEye.java b/Mage.Sets/src/mage/cards/e/EyeForAnEye.java index 9c62933fbf9..697dff7b4f0 100644 --- a/Mage.Sets/src/mage/cards/e/EyeForAnEye.java +++ b/Mage.Sets/src/mage/cards/e/EyeForAnEye.java @@ -123,7 +123,7 @@ class EyeForAnEyeEffect extends ReplacementEffectImpl { Player controller = game.getPlayer(source.getControllerId()); DamageEvent damageEvent = (DamageEvent) event; if (controller != null) { - if (controller.getId() == damageEvent.getTargetId() && damageEvent.getSourceId().equals(damageSource.getFirstTarget())) { + if (controller.getId().equals(damageEvent.getTargetId()) && damageEvent.getSourceId().equals(damageSource.getFirstTarget())) { this.discard(); return true; } diff --git a/Mage.Sets/src/mage/cards/g/GreenerPastures.java b/Mage.Sets/src/mage/cards/g/GreenerPastures.java index 83af2758f68..2ae29036f2a 100644 --- a/Mage.Sets/src/mage/cards/g/GreenerPastures.java +++ b/Mage.Sets/src/mage/cards/g/GreenerPastures.java @@ -92,7 +92,7 @@ enum ActivePlayerMostLandsCondition implements Condition { return false; } for (UUID playerId : game.getPlayerList()) { - if (playerId != activePlayer.getId()) { + if (!playerId.equals(activePlayer.getId())) { if (game.getBattlefield().getAllActivePermanents(filter, playerId, game).size() >= landCount) { return false; } diff --git a/Mage.Sets/src/mage/cards/h/HeraldsHorn.java b/Mage.Sets/src/mage/cards/h/HeraldsHorn.java index 1ad4c814a3a..cadce2f3cec 100644 --- a/Mage.Sets/src/mage/cards/h/HeraldsHorn.java +++ b/Mage.Sets/src/mage/cards/h/HeraldsHorn.java @@ -27,6 +27,7 @@ */ package mage.cards.h; +import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.AsEntersBattlefieldAbility; @@ -45,8 +46,6 @@ import mage.filter.predicate.mageobject.ChosenSubtypePredicate; import mage.game.Game; import mage.players.Player; -import java.util.UUID; - /** * * @author Saga @@ -54,15 +53,15 @@ import java.util.UUID; public class HeraldsHorn extends CardImpl { public HeraldsHorn(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); // As Herald's Horn enters the battlefield, choose a creature type. this.addAbility(new AsEntersBattlefieldAbility(new ChooseCreatureTypeEffect(Outcome.BoostCreature))); - + // Creature spells you cast of the chosen type cost {1} less to cast. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, - new SpellsCostReductionAllOfChosenSubtypeEffect(new FilterCreatureCard("Creature spells you cast of the chosen type"), 1))); - + new SpellsCostReductionAllOfChosenSubtypeEffect(new FilterCreatureCard("Creature spells you cast of the chosen type"), 1, true))); + // At the beginning of your upkeep, look at the top card of your library. If it's a creature card of the chosen type, you may reveal it and put it into your hand. this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new HeraldsHornEffect(), TargetController.YOU, false)); } @@ -97,21 +96,21 @@ class HeraldsHornEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); MageObject sourceObject = game.getObject(source.getSourceId()); - + // Look at the top card of your library. if (controller.getLibrary().hasCards()) { Card card = controller.getLibrary().getFromTop(game); Cards cards = new CardsImpl(card); controller.lookAtCards(sourceObject.getIdName(), cards, game); - + // If it's a creature card of the chosen type, you may reveal it and put it into your hand. FilterCreatureCard filter = new FilterCreatureCard("creature card of the chosen type"); filter.add(new ChosenSubtypePredicate(source.getSourceId())); String message = "Reveal the top card of your library and put that card into your hand?"; if (card != null) { if (filter.match(card, game) && controller.chooseUse(Outcome.Benefit, message, source, game)) { - controller.moveCards(card, Zone.HAND, source, game); - controller.revealCards(sourceObject.getIdName() + " put into hand", cards, game); + controller.moveCards(card, Zone.HAND, source, game); + controller.revealCards(sourceObject.getIdName() + " put into hand", cards, game); } } } diff --git a/Mage.Sets/src/mage/cards/h/HiredGiant.java b/Mage.Sets/src/mage/cards/h/HiredGiant.java index be57e3f3bd9..baefbbb01e6 100644 --- a/Mage.Sets/src/mage/cards/h/HiredGiant.java +++ b/Mage.Sets/src/mage/cards/h/HiredGiant.java @@ -94,7 +94,7 @@ class HiredGiantEffect extends OneShotEffect { if (controller != null) { Set playersThatSearched = new HashSet<>(1); for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) { - if (playerId != controller.getId()) { + if (!playerId.equals(controller.getId())) { Player player = game.getPlayer(playerId); if (player != null && player.chooseUse(Outcome.PutCreatureInPlay, "Search your library for a land card and put it onto the battlefield?", source, game)) { TargetCardInLibrary target = new TargetCardInLibrary(new FilterLandCard()); diff --git a/Mage.Sets/src/mage/cards/i/IceCauldron.java b/Mage.Sets/src/mage/cards/i/IceCauldron.java new file mode 100644 index 00000000000..4ee0fe74ff7 --- /dev/null +++ b/Mage.Sets/src/mage/cards/i/IceCauldron.java @@ -0,0 +1,296 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.cards.i; + +import java.util.UUID; +import mage.ConditionalMana; +import mage.Mana; +import mage.MageObjectReference; +import mage.abilities.Ability; +import mage.abilities.SpellAbility; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.SourceHasCounterCondition; +import mage.abilities.costs.common.RemoveCountersSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.decorator.ConditionalActivatedAbility; +import mage.abilities.effects.AsThoughEffect; +import mage.abilities.effects.AsThoughEffectImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ManaEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.mana.SimpleManaAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.AsThoughEffectType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.TargetCard; +import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; + +/** + * + * @author L_J (based on jeffwadsworth) + */ +public class IceCauldron extends CardImpl { + + public IceCauldron(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}"); + + // {X}, {T}: Put a charge counter on Ice Cauldron and exile a nonland card from your hand. You may cast that card for as long as it remains exiled. Note the type and amount of mana spent to pay this activation cost. Activate this ability only if there are no charge counters on Ice Cauldron. + ConditionalActivatedAbility ability = new ConditionalActivatedAbility( + Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.CHARGE.createInstance(), true), new ManaCostsImpl("{X}"), new SourceHasCounterCondition(CounterType.CHARGE, 0, 0)); + ability.addEffect(new IceCauldronExileEffect()); + ability.addEffect(new IceCauldronNoteManaEffect()); + ability.addCost(new TapSourceCost()); + this.addAbility(ability); + + // {T}, Remove a charge counter from Ice Cauldron: Add Ice Cauldron's last noted type and amount of mana to your mana pool. Spend this mana only to cast the last card exiled with Ice Cauldron. + Ability ability2 = new SimpleManaAbility(Zone.BATTLEFIELD, new IceCauldronAddManaEffect(), new TapSourceCost()); + ability2.addCost(new RemoveCountersSourceCost(CounterType.CHARGE.createInstance())); + this.addAbility(ability2); + } + + public IceCauldron(final IceCauldron card) { + super(card); + } + + @Override + public IceCauldron copy() { + return new IceCauldron(this); + } +} + +class IceCauldronExileEffect extends OneShotEffect { + + private static final FilterCard filter = new FilterCard("nonland card"); + + static { + filter.add(Predicates.not(new CardTypePredicate(CardType.LAND))); + } + + public IceCauldronExileEffect() { + super(Outcome.Benefit); + this.staticText = "and exile a nonland card from your hand. You may cast that card for as long as it remains exiled"; + } + + public IceCauldronExileEffect(final IceCauldronExileEffect effect) { + super(effect); + } + + @Override + public IceCauldronExileEffect copy() { + return new IceCauldronExileEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); + if (controller != null && sourcePermanent != null) { + if (controller.getHand().isEmpty()) { + return true; + } + TargetCard target = new TargetCard(Zone.HAND, filter); + target.setNotTarget(true); + Card chosenCard = null; + if (controller.choose(Outcome.Benefit, target, source.getSourceId(), game)) { + chosenCard = controller.getHand().get(target.getFirstTarget(), game); + } + if (chosenCard != null) { + controller.moveCardToExileWithInfo(chosenCard, source.getSourceId(), sourcePermanent.getIdName(), source.getSourceId(), game, Zone.HAND, true); + AsThoughEffect effect = new IceCauldronCastFromExileEffect(); + effect.setTargetPointer(new FixedTarget(chosenCard.getId())); + game.addEffect(effect, source); + game.getState().setValue("IceCauldronCard" + source.getSourceId().toString(), new MageObjectReference(chosenCard.getId(), game)); //store the exiled card + return true; + } + } + return false; + } +} + +class IceCauldronCastFromExileEffect extends AsThoughEffectImpl { + + IceCauldronCastFromExileEffect() { + super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.Custom, Outcome.Benefit); + staticText = "You may cast that card for as long as it remains exiled"; + } + + IceCauldronCastFromExileEffect(final IceCauldronCastFromExileEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public IceCauldronCastFromExileEffect copy() { + return new IceCauldronCastFromExileEffect(this); + } + + @Override + public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { + if (targetPointer.getTargets(game, source).contains(objectId) + && game.getState().getZone(objectId) == Zone.EXILED) { + Player player = game.getPlayer(source.getControllerId()); + Card card = game.getCard(objectId); + if (player != null + && card != null) { + return true; + } + } + return false; + } +} + +class IceCauldronNoteManaEffect extends OneShotEffect { + + private static String manaUsedString; + + public IceCauldronNoteManaEffect() { + super(Outcome.Benefit); + this.staticText = "Note the type and amount of mana spent to pay this activation cost"; + } + + public IceCauldronNoteManaEffect(final IceCauldronNoteManaEffect effect) { + super(effect); + } + + @Override + public IceCauldronNoteManaEffect copy() { + return new IceCauldronNoteManaEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Permanent iceCauldron = game.getPermanent(source.getSourceId()); + if (controller != null && iceCauldron != null) { + game.getState().setValue("IceCauldronMana" + source.getSourceId().toString(), source.getManaCostsToPay().getUsedManaToPay()); //store the mana used to pay + manaUsedString = source.getManaCostsToPay().getUsedManaToPay().toString(); + iceCauldron.addInfo("MANA USED", CardUtil.addToolTipMarkTags("Mana used last: " + manaUsedString), game); + return true; + } + return false; + } +} + +class IceCauldronAddManaEffect extends ManaEffect { + + private static Mana storedMana; + private static MageObjectReference exiledCardMor; + + IceCauldronAddManaEffect() { + super(); + staticText = "Add {this}'s last noted type and amount of mana to your mana pool. Spend this mana only to cast the last card exiled with {this}"; + } + + IceCauldronAddManaEffect(IceCauldronAddManaEffect effect) { + super(effect); + } + + @Override + public IceCauldronAddManaEffect copy() { + return new IceCauldronAddManaEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent iceCauldron = game.getPermanent(source.getSourceId()); + Player controller = game.getPlayer(source.getControllerId()); + if (iceCauldron != null && controller != null) { + storedMana = (Mana) game.getState().getValue("IceCauldronMana" + source.getSourceId().toString()); + exiledCardMor = (MageObjectReference) game.getState().getValue("IceCauldronCard" + source.getSourceId().toString()); + if (storedMana != null) { // should be adding the mana even if exiled card is null + checkToFirePossibleEvents(storedMana, game, source); + + Card card = exiledCardMor.getCard(game); + if (card == null) { + card = game.getCard(exiledCardMor.getSourceId()); + if (card != null && !(card.getZoneChangeCounter(game) == exiledCardMor.getZoneChangeCounter() + 1 && game.getState().getZone(card.getId()) == Zone.STACK)) { + card = null; + } + } + IceCauldronConditionalMana iceCauldronMana = new IceCauldronConditionalMana(storedMana, card); + if (iceCauldronMana != null) { + controller.getManaPool().addMana(iceCauldronMana, game, source); + return true; + } + } + } + return false; + } + + @Override + public Mana getMana(Game game, Ability source) { + return null; + } +} + +class IceCauldronConditionalMana extends ConditionalMana { + + public IceCauldronConditionalMana(Mana mana, Card exiledCard) { + super(mana); + staticText = "Spend this mana only to cast the last card exiled with {this}"; + addCondition(new IceCauldronManaCondition(exiledCard)); + } +} + +class IceCauldronManaCondition implements Condition { + + private static Card exiledCard; + + public IceCauldronManaCondition(Card exiledCard) { + this.exiledCard = exiledCard; + } + + @Override + public boolean apply(Game game, Ability source) { + if (source instanceof SpellAbility) { + Card card = game.getCard(source.getSourceId()); + if (card != null && exiledCard != null && card.equals(exiledCard)) { + return true; + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/i/IceCave.java b/Mage.Sets/src/mage/cards/i/IceCave.java index bcdf7f4d6f5..42594825f93 100644 --- a/Mage.Sets/src/mage/cards/i/IceCave.java +++ b/Mage.Sets/src/mage/cards/i/IceCave.java @@ -95,7 +95,7 @@ class IceCaveEffect extends OneShotEffect { if (spellController != null) { for (UUID playerId : game.getState().getPlayersInRange(source.getControllerId(), game)) { Player player = game.getPlayer(playerId); - if (player != null && player != spellController) { + if (player != null && !player.equals(spellController)) { cost.clearPaid(); if (cost.canPay(source, source.getSourceId(), player.getId(), game) && player.chooseUse(outcome, "Pay " + cost.getText() + " to counter " + spell.getIdName() + '?', source, game)) { diff --git a/Mage.Sets/src/mage/cards/k/KazarovSengirPureblood.java b/Mage.Sets/src/mage/cards/k/KazarovSengirPureblood.java index 9213c61956d..ad9497028f2 100644 --- a/Mage.Sets/src/mage/cards/k/KazarovSengirPureblood.java +++ b/Mage.Sets/src/mage/cards/k/KazarovSengirPureblood.java @@ -113,7 +113,7 @@ class KazarovSengirPurebloodTriggeredAbility extends TriggeredAbilityImpl { if (permanent == null) { return false; } - if (permanent.getControllerId() == this.getControllerId()) { + if (permanent.getControllerId().equals(this.getControllerId())) { return false; } return true; diff --git a/Mage.Sets/src/mage/cards/m/MairsilThePretender.java b/Mage.Sets/src/mage/cards/m/MairsilThePretender.java index 5d59ec71636..f0e955abb11 100644 --- a/Mage.Sets/src/mage/cards/m/MairsilThePretender.java +++ b/Mage.Sets/src/mage/cards/m/MairsilThePretender.java @@ -27,6 +27,7 @@ */ package mage.cards.m; +import java.util.Objects; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; @@ -165,7 +166,7 @@ class MairsilThePretenderGainAbilitiesEffect extends ContinuousEffectImpl { return false; } for (Card card : game.getExile().getAllCards(game)) { - if (filter.match(card, game) && card.getOwnerId() == perm.getControllerId()) { + if (filter.match(card, game) && Objects.equals(card.getOwnerId(), perm.getControllerId())) { for (Ability ability : card.getAbilities()) { if (ability instanceof ActivatedAbility) { ActivatedAbilityImpl copyAbility = (ActivatedAbilityImpl) ability.copy(); diff --git a/Mage.Sets/src/mage/cards/m/ManaShort.java b/Mage.Sets/src/mage/cards/m/ManaShort.java index 567fef5ed66..701ebe6c831 100644 --- a/Mage.Sets/src/mage/cards/m/ManaShort.java +++ b/Mage.Sets/src/mage/cards/m/ManaShort.java @@ -33,7 +33,7 @@ import mage.abilities.effects.common.TapAllTargetPlayerControlsEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.StaticFilters; +import mage.filter.common.FilterLandPermanent; import mage.game.Game; import mage.players.Player; import mage.target.TargetPlayer; @@ -65,7 +65,7 @@ public class ManaShort extends CardImpl { class ManaShortEffect extends TapAllTargetPlayerControlsEffect { public ManaShortEffect() { - super(StaticFilters.FILTER_LANDS); + super(new FilterLandPermanent()); staticText = "Tap all lands target player controls and empty their mana pool"; } diff --git a/Mage.Sets/src/mage/cards/m/MirrorStrike.java b/Mage.Sets/src/mage/cards/m/MirrorStrike.java index 5d9e5191041..9292fbd1827 100644 --- a/Mage.Sets/src/mage/cards/m/MirrorStrike.java +++ b/Mage.Sets/src/mage/cards/m/MirrorStrike.java @@ -27,6 +27,7 @@ */ package mage.cards.m; +import java.util.Objects; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.ReplacementEffectImpl; @@ -124,7 +125,9 @@ class MirrorStrikeEffect extends ReplacementEffectImpl { DamageEvent damageEvent = (DamageEvent) event; Permanent targetPermanent = game.getPermanent(source.getFirstTarget()); if (controller != null && targetPermanent != null) { - return (damageEvent.isCombatDamage() && controller.getId() == damageEvent.getTargetId() && targetPermanent.getId() == damageEvent.getSourceId()); + return (damageEvent.isCombatDamage() + && Objects.equals(controller.getId(), damageEvent.getTargetId()) + && Objects.equals(targetPermanent.getId(), damageEvent.getSourceId())); } return false; } diff --git a/Mage.Sets/src/mage/cards/m/MyrBattlesphere.java b/Mage.Sets/src/mage/cards/m/MyrBattlesphere.java index 2edd62e9a1a..cade2aa34f9 100644 --- a/Mage.Sets/src/mage/cards/m/MyrBattlesphere.java +++ b/Mage.Sets/src/mage/cards/m/MyrBattlesphere.java @@ -112,7 +112,7 @@ class MyrBattlesphereTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { Permanent source = game.getPermanent(event.getSourceId()); - if (source != null && source.getId() == this.getSourceId()) { + if (source != null && source.getId().equals(this.getSourceId())) { UUID defenderId = game.getCombat().getDefenderId(event.getSourceId()); this.getEffects().get(0).setTargetPointer(new FixedTarget(defenderId)); return true; diff --git a/Mage.Sets/src/mage/cards/p/PsychicBattle.java b/Mage.Sets/src/mage/cards/p/PsychicBattle.java index 63332cc39fe..ec4e60a4657 100644 --- a/Mage.Sets/src/mage/cards/p/PsychicBattle.java +++ b/Mage.Sets/src/mage/cards/p/PsychicBattle.java @@ -37,16 +37,13 @@ import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; import mage.cards.CardImpl; -import mage.cards.CardsImpl; import mage.cards.CardSetInfo; +import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.FilterPermanent; -import mage.filter.predicate.mageobject.NamePredicate; import mage.game.Game; import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; import mage.game.stack.StackObject; import mage.players.Player; import mage.target.targetpointer.FixedTarget; @@ -58,7 +55,7 @@ import mage.target.targetpointer.FixedTarget; public class PsychicBattle extends CardImpl { public PsychicBattle(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{3}{U}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{U}{U}"); // Whenever a player chooses one or more targets, each player reveals the top card of his or her library. The player who reveals the card with the highest converted mana cost may change the target or targets. If two or more cards are tied for highest cost, the target or targets remain unchanged. Changing targets this way doesn't trigger abilities of permanents named Psychic Battle. this.addAbility(new PsychicBattleTriggeredAbility()); @@ -75,11 +72,6 @@ public class PsychicBattle extends CardImpl { } class PsychicBattleTriggeredAbility extends TriggeredAbilityImpl { - - private static final FilterPermanent filter = new FilterPermanent(); - static { - filter.add(new NamePredicate("Psychic Battle")); - } public PsychicBattleTriggeredAbility() { super(Zone.BATTLEFIELD, new PsychicBattleEffect(), false); @@ -103,8 +95,7 @@ class PsychicBattleTriggeredAbility extends TriggeredAbilityImpl { public boolean checkTrigger(GameEvent event, Game game) { StackObject stackObject = game.getStack().getStackObject(event.getSourceId()); if (stackObject != null) { - Permanent psychicBattle = game.getPermanentOrLKIBattlefield(getSourceId()); - if (psychicBattle != null && !(stackObject.isTargetChanged() && filter.match(psychicBattle, game))) { + if (!stackObject.isTargetChanged() && !stackObject.getName().equals("Psychic Battle")) { this.getEffects().get(0).setTargetPointer(new FixedTarget(event.getSourceId())); stackObject.setTargetChanged(false); // resets the targetChanged flag return true; @@ -122,7 +113,7 @@ class PsychicBattleTriggeredAbility extends TriggeredAbilityImpl { class PsychicBattleEffect extends OneShotEffect { public PsychicBattleEffect() { - super(Outcome.Neutral); + super(Outcome.Benefit); this.staticText = "each player reveals the top card of his or her library. The player who reveals the card with the highest converted mana cost may change the target or targets. If two or more cards are tied for highest cost, the target or targets remain unchanged"; } @@ -148,7 +139,7 @@ class PsychicBattleEffect extends OneShotEffect { manacostMap.put(player, card.getConvertedManaCost()); } } - + Player highestCostPlayer = null; int maxValue = Collections.max(manacostMap.values()); boolean tie = false; @@ -162,7 +153,7 @@ class PsychicBattleEffect extends OneShotEffect { } } } - + if (highestCostPlayer != null && !tie) { StackObject stackObject = game.getStack().getStackObject(this.getTargetPointer().getFirst(game, source)); if (stackObject != null) { diff --git a/Mage.Sets/src/mage/cards/r/RagingRiver.java b/Mage.Sets/src/mage/cards/r/RagingRiver.java index f578960b3ae..0357c35e028 100644 --- a/Mage.Sets/src/mage/cards/r/RagingRiver.java +++ b/Mage.Sets/src/mage/cards/r/RagingRiver.java @@ -54,6 +54,7 @@ import mage.target.targetpointer.FixedTarget; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.UUID; import java.util.stream.Collectors; @@ -141,7 +142,7 @@ class RagingRiverEffect extends OneShotEffect { for (UUID attackers : game.getCombat().getAttackers()) { Permanent attacker = game.getPermanent(attackers); - if (attacker != null && attacker.getControllerId() == controller.getId()) { + if (attacker != null && Objects.equals(attacker.getControllerId(), controller.getId())) { CombatGroup combatGroup = game.getCombat().findGroup(attacker.getId()); if (combatGroup != null) { FilterCreaturePermanent filter = new FilterCreaturePermanent(); diff --git a/Mage.Sets/src/mage/cards/s/ScarwoodBandits.java b/Mage.Sets/src/mage/cards/s/ScarwoodBandits.java index 09c803e2250..187b5212f63 100644 --- a/Mage.Sets/src/mage/cards/s/ScarwoodBandits.java +++ b/Mage.Sets/src/mage/cards/s/ScarwoodBandits.java @@ -143,7 +143,7 @@ class DoUnlessAnyOpponentPaysEffect extends OneShotEffect { // check if any opponent is willing to pay for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) { Player player = game.getPlayer(playerId); - if (player != null && player != controller && cost.canPay(source, source.getSourceId(), player.getId(), game) && player.chooseUse(Outcome.Detriment, message, source, game)) { + if (player != null && !player.equals(controller) && cost.canPay(source, source.getSourceId(), player.getId(), game) && player.chooseUse(Outcome.Detriment, message, source, game)) { cost.clearPaid(); if (cost.pay(source, game, source.getSourceId(), player.getId(), false, null)) { if (!game.isSimulation()) { diff --git a/Mage.Sets/src/mage/cards/s/ScourgeOfValkas.java b/Mage.Sets/src/mage/cards/s/ScourgeOfValkas.java index e108894cfc3..26ca584cc72 100644 --- a/Mage.Sets/src/mage/cards/s/ScourgeOfValkas.java +++ b/Mage.Sets/src/mage/cards/s/ScourgeOfValkas.java @@ -33,20 +33,22 @@ import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; +import mage.constants.Outcome; import mage.constants.SubType; import mage.constants.Zone; -import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.FilterPermanent; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; import mage.target.common.TargetAnyTarget; /** @@ -56,17 +58,15 @@ import mage.target.common.TargetAnyTarget; public class ScourgeOfValkas extends CardImpl { private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("{this} or another Dragon"); - private final static FilterControlledCreaturePermanent filter2 = new FilterControlledCreaturePermanent("Dragons you control"); static { filter.add(new SubtypePredicate(SubType.DRAGON)); - filter2.add(new SubtypePredicate(SubType.DRAGON)); } - + private static final String rule = "Whenever {this} or another Dragon enters the battlefield under your control, it deals X damage to any target, where X is the number of Dragons you control."; public ScourgeOfValkas(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{R}{R}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}{R}{R}"); this.subtype.add(SubType.DRAGON); this.color.setRed(true); @@ -77,8 +77,7 @@ public class ScourgeOfValkas extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Whenever Scourge of Valkas or another Dragon enters the battlefield under your control, it deals X damage to any target, where X is the number of Dragons you control. - DynamicValue dragons = new PermanentsOnBattlefieldCount(filter2); - Ability ability = new EntersBattlefieldControlledTriggeredAbility(Zone.BATTLEFIELD, new DamageTargetEffect(dragons), filter, false, rule); + Ability ability = new EntersBattlefieldControlledTriggeredAbility(Zone.BATTLEFIELD, new ScourgeOfValkasDamageEffect(), filter, false, rule); ability.addTarget(new TargetAnyTarget()); this.addAbility(ability); @@ -96,3 +95,45 @@ public class ScourgeOfValkas extends CardImpl { return new ScourgeOfValkas(this); } } + +class ScourgeOfValkasDamageEffect extends OneShotEffect { + + public ScourgeOfValkasDamageEffect() { + super(Outcome.Damage); + this.staticText = "it deals X damage to any target, where X is the number of Dragons you control"; + } + + public ScourgeOfValkasDamageEffect(final ScourgeOfValkasDamageEffect effect) { + super(effect); + } + + @Override + public ScourgeOfValkasDamageEffect copy() { + return new ScourgeOfValkasDamageEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Permanent enteringDragon = (Permanent) getValue("permanentEnteringBattlefield"); + if (controller != null && enteringDragon != null) { + FilterPermanent filter = new FilterPermanent(); + filter.add(new SubtypePredicate(SubType.DRAGON)); + int dragons = game.getBattlefield().countAll(filter, source.getControllerId(), game); + if (dragons > 0) { + Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (permanent != null) { + permanent.damage(dragons, enteringDragon.getId(), game, false, true); + } else { + Player player = game.getPlayer(getTargetPointer().getFirst(game, source)); + if (player != null + && player.isInGame()) { + player.damage(dragons, enteringDragon.getId(), game, false, true); + } + } + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/s/SeasonOfTheWitch.java b/Mage.Sets/src/mage/cards/s/SeasonOfTheWitch.java index e2bc1e7c4f6..b65c850553b 100644 --- a/Mage.Sets/src/mage/cards/s/SeasonOfTheWitch.java +++ b/Mage.Sets/src/mage/cards/s/SeasonOfTheWitch.java @@ -153,7 +153,7 @@ class CouldAttackThisTurnWatcher extends Watcher { for (Permanent permanent : game.getBattlefield().getAllActivePermanents(activePlayer.getId())) { if (permanent.isCreature()) { for (UUID defender : game.getCombat().getDefenders()) { - if (defender != activePlayer.getId()) { + if (!defender.equals(activePlayer.getId())) { if (permanent.canAttack(defender, game)) { // exclude Propaganda style effects if (!game.getContinuousEffects().checkIfThereArePayCostToAttackBlockEffects( diff --git a/Mage.Sets/src/mage/cards/s/ShorecrasherElemental.java b/Mage.Sets/src/mage/cards/s/ShorecrasherElemental.java index e05c34fd25e..416b87e61a3 100644 --- a/Mage.Sets/src/mage/cards/s/ShorecrasherElemental.java +++ b/Mage.Sets/src/mage/cards/s/ShorecrasherElemental.java @@ -35,8 +35,6 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.continuous.BecomesFaceDownCreatureEffect; -import mage.abilities.effects.common.continuous.BecomesFaceDownCreatureEffect.FaceDownType; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.keyword.MorphAbility; import mage.cards.Card; @@ -104,19 +102,18 @@ class ShorecrasherElementalEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); Permanent shorecrasherElemental = game.getPermanent(source.getSourceId()); MageObject sourceObject = source.getSourceObject(game); - if (shorecrasherElemental != null - && sourceObject != null + if (controller != null && shorecrasherElemental != null && sourceObject != null && new MageObjectReference(sourceObject, game).refersTo(shorecrasherElemental, game)) { - if (shorecrasherElemental.moveToExile(source.getSourceId(), sourceObject.getName(), source.getSourceId(), game)) { + if (controller.moveCards(shorecrasherElemental, Zone.EXILED, source, game)) { Card card = game.getExile().getCard(source.getSourceId(), game); if (card != null) { - game.addEffect(new BecomesFaceDownCreatureEffect(Duration.Custom, FaceDownType.MEGAMORPHED), source); - return card.putOntoBattlefield(game, Zone.EXILED, source.getSourceId(), card.getOwnerId(), false, true); - + controller.moveCards(card, Zone.BATTLEFIELD, source, game, false, true, true, null); } } + return true; } return false; } diff --git a/Mage.Sets/src/mage/cards/s/SivvisValor.java b/Mage.Sets/src/mage/cards/s/SivvisValor.java index c63a2b21f14..11f98de471f 100644 --- a/Mage.Sets/src/mage/cards/s/SivvisValor.java +++ b/Mage.Sets/src/mage/cards/s/SivvisValor.java @@ -133,7 +133,7 @@ class SivvisValorEffect extends ReplacementEffectImpl { DamageEvent damageEvent = (DamageEvent) event; Permanent targetPermanent = game.getPermanent(source.getFirstTarget()); if (controller != null && targetPermanent != null) { - return targetPermanent.getId() == damageEvent.getTargetId(); + return targetPermanent.getId().equals(damageEvent.getTargetId()); } return false; } diff --git a/Mage.Sets/src/mage/cards/s/SkySwallower.java b/Mage.Sets/src/mage/cards/s/SkySwallower.java index 0044c72585d..43c5758a8c7 100644 --- a/Mage.Sets/src/mage/cards/s/SkySwallower.java +++ b/Mage.Sets/src/mage/cards/s/SkySwallower.java @@ -96,7 +96,7 @@ class GainControlAllPermanentsEffect extends ContinuousEffectImpl { Player targetPlayer = game.getPlayer(targetPointer.getFirst(game, source)); if (targetPlayer != null && targetPlayer.isInGame()) { for (Permanent permanent : game.getBattlefield().getAllActivePermanents(filter, source.getControllerId(), game)) { - if (permanent != null && permanent.getId() != source.getSourceId()) { + if (permanent != null && !permanent.getId().equals(source.getSourceId())) { permanent.changeControllerId(targetPlayer.getId(), game); } } diff --git a/Mage.Sets/src/mage/cards/s/SorinLordOfInnistrad.java b/Mage.Sets/src/mage/cards/s/SorinLordOfInnistrad.java index f9bad9604fb..c54b02ed3d3 100644 --- a/Mage.Sets/src/mage/cards/s/SorinLordOfInnistrad.java +++ b/Mage.Sets/src/mage/cards/s/SorinLordOfInnistrad.java @@ -27,6 +27,8 @@ */ package mage.cards.s; +import java.util.HashSet; +import java.util.Set; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; @@ -38,8 +40,8 @@ import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.SuperType; import mage.constants.Zone; import mage.filter.FilterPermanent; @@ -113,25 +115,25 @@ class SorinLordOfInnistradEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { + Set toBattlefield = new HashSet<>(); for (UUID targetId : source.getTargets().get(0).getTargets()) { Permanent perm = game.getPermanent(targetId); if (perm != null) { perm.destroy(source.getSourceId(), game, false); - } - } - Player player = game.getPlayer(source.getControllerId()); - if (player != null) { - for (UUID targetId : source.getTargets().get(0).getTargets()) { - if (game.getState().getZone(targetId) == Zone.GRAVEYARD) { + if (Zone.GRAVEYARD == game.getState().getZone(targetId)) { Card card = game.getCard(targetId); if (card != null) { - card.putOntoBattlefield(game, Zone.GRAVEYARD, source.getSourceId(), player.getId()); + toBattlefield.add(card); } } } } - - return true; + game.applyEffects(); + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + return controller.moveCards(toBattlefield, Zone.BATTLEFIELD, source, game); + } + return false; } } diff --git a/Mage.Sets/src/mage/cards/s/SovereignsOfLostAlara.java b/Mage.Sets/src/mage/cards/s/SovereignsOfLostAlara.java index c56d60999bc..9680f25c030 100644 --- a/Mage.Sets/src/mage/cards/s/SovereignsOfLostAlara.java +++ b/Mage.Sets/src/mage/cards/s/SovereignsOfLostAlara.java @@ -58,11 +58,9 @@ import mage.target.targetpointer.FixedTarget; public class SovereignsOfLostAlara extends CardImpl { public SovereignsOfLostAlara(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{W}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{W}{U}"); this.subtype.add(SubType.SPIRIT); - - this.power = new MageInt(4); this.toughness = new MageInt(5); @@ -133,25 +131,25 @@ class SovereignsOfLostAlaraEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player you = game.getPlayer(source.getControllerId()); + Player controller = game.getPlayer(source.getControllerId()); Permanent attackingCreature = game.getPermanent(getTargetPointer().getFirst(game, source)); - if (you != null && attackingCreature != null) { + if (controller != null && attackingCreature != null) { FilterCard filter = new FilterCard("aura that could enchant the lone attacking creature"); filter.add(new SubtypePredicate(SubType.AURA)); filter.add(new AuraCardCanAttachToPermanentId(attackingCreature.getId())); - if (you.chooseUse(Outcome.Benefit, "Do you want to search your library?", source, game)) { + if (controller.chooseUse(Outcome.Benefit, "Do you want to search your library?", source, game)) { TargetCardInLibrary target = new TargetCardInLibrary(filter); target.setNotTarget(true); - if (you.searchLibrary(target, game)) { + if (controller.searchLibrary(target, game)) { if (target.getFirstTarget() != null) { Card aura = game.getCard(target.getFirstTarget()); game.getState().setValue("attachTo:" + aura.getId(), attackingCreature); - aura.putOntoBattlefield(game, Zone.LIBRARY, source.getSourceId(), you.getId()); + controller.moveCards(aura, Zone.BATTLEFIELD, source, game); return attackingCreature.addAttachment(aura.getId(), game); } } } - you.shuffleLibrary(source, game); + controller.shuffleLibrary(source, game); } return false; } @@ -160,4 +158,4 @@ class SovereignsOfLostAlaraEffect extends OneShotEffect { public SovereignsOfLostAlaraEffect copy() { return new SovereignsOfLostAlaraEffect(this); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/s/SpiritualFocus.java b/Mage.Sets/src/mage/cards/s/SpiritualFocus.java index 5e14d68ba20..33ec0a0d01f 100644 --- a/Mage.Sets/src/mage/cards/s/SpiritualFocus.java +++ b/Mage.Sets/src/mage/cards/s/SpiritualFocus.java @@ -27,6 +27,7 @@ */ package mage.cards.s; +import java.util.Objects; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; @@ -95,7 +96,7 @@ class SpiritualFocusTriggeredAbility extends TriggeredAbilityImpl { if (game.getOpponents(this.getControllerId()).contains(stackObject.getControllerId())) { Permanent permanent = game.getPermanent(getSourceId()); if (permanent != null) { - if (permanent.getControllerId() == event.getPlayerId()) { + if (Objects.equals(permanent.getControllerId(), event.getPlayerId())) { return true; } } diff --git a/Mage.Sets/src/mage/cards/s/SteamVines.java b/Mage.Sets/src/mage/cards/s/SteamVines.java index 1efba201adb..c71a070d2f4 100644 --- a/Mage.Sets/src/mage/cards/s/SteamVines.java +++ b/Mage.Sets/src/mage/cards/s/SteamVines.java @@ -30,6 +30,7 @@ package mage.cards.s; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.BecomesTappedAttachedTriggeredAbility; +import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.AttachEffect; import mage.abilities.keyword.EnchantAbility; @@ -37,8 +38,8 @@ import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.Zone; import mage.filter.Filter; import mage.game.Game; @@ -47,6 +48,7 @@ import mage.players.Player; import mage.target.Target; import mage.target.TargetPermanent; import mage.target.common.TargetLandPermanent; +import mage.target.targetpointer.FixedTarget; /** * @@ -65,7 +67,8 @@ public class SteamVines extends CardImpl { Ability ability = new EnchantAbility(auraTarget.getTargetName()); this.addAbility(ability); - // When enchanted land becomes tapped, destroy it and Steam Vines deals 1 damage to that land's controller. That player attaches Steam Vines to a land of their choice. + // When enchanted land becomes tapped, destroy it and Steam Vines deals 1 damage to that land's controller. + // That player attaches Steam Vines to a land of their choice. this.addAbility(new BecomesTappedAttachedTriggeredAbility(new SteamVinesEffect(), "enchanted land")); } @@ -98,10 +101,10 @@ class SteamVinesEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Permanent kudzu = game.getPermanentOrLKIBattlefield(source.getSourceId()); - Card kudzuCard = game.getCard(source.getSourceId()); - if (kudzu != null) { - Permanent enchantedLand = game.getPermanentOrLKIBattlefield(kudzu.getAttachedTo()); + Permanent steamVines = game.getPermanentOrLKIBattlefield(source.getSourceId()); + Card steamVinesCard = game.getCard(source.getSourceId()); + if (steamVines != null) { + Permanent enchantedLand = game.getPermanentOrLKIBattlefield(steamVines.getAttachedTo()); Player controller = game.getPlayer(source.getControllerId()); if (enchantedLand != null && controller != null) { @@ -113,20 +116,20 @@ class SteamVinesEffect extends OneShotEffect { if (!game.getBattlefield().getAllActivePermanents(CardType.LAND).isEmpty()) { //lands are available on the battlefield Target target = new TargetLandPermanent(); target.setNotTarget(true); //not a target, it is chosen - if (kudzuCard != null + if (steamVinesCard != null && landsController != null) { - if (landsController.choose(Outcome.Detriment, target, source.getId(), game)) { + if (landsController.choose(Outcome.DestroyPermanent, target, source.getId(), game)) { if (target.getFirstTarget() != null) { Permanent landChosen = game.getPermanent(target.getFirstTarget()); if (landChosen != null) { - for (Target targetTest : kudzuCard.getSpellAbility().getTargets()) { + for (Target targetTest : steamVinesCard.getSpellAbility().getTargets()) { Filter filterTest = targetTest.getFilter(); if (filterTest.match(landChosen, game)) { if (game.getBattlefield().containsPermanent(landChosen.getId())) { //verify that it is still on the battlefield - game.getState().setValue("attachTo:" + kudzuCard.getId(), landChosen); - Zone zone = game.getState().getZone(kudzuCard.getId()); - kudzuCard.putOntoBattlefield(game, zone, source.getSourceId(), controller.getId()); - return landChosen.addAttachment(kudzuCard.getId(), game); + game.informPlayers(landsController.getLogName() + " attaches " + steamVines.getLogName() + " to " + landChosen.getLogName()); + Effect effect = new AttachEffect(Outcome.Neutral); + effect.setTargetPointer(new FixedTarget(landChosen, game)); + return effect.apply(game, source); } } } diff --git a/Mage.Sets/src/mage/cards/s/StonehewerGiant.java b/Mage.Sets/src/mage/cards/s/StonehewerGiant.java index 540f8488f43..32395d6f4c0 100644 --- a/Mage.Sets/src/mage/cards/s/StonehewerGiant.java +++ b/Mage.Sets/src/mage/cards/s/StonehewerGiant.java @@ -58,7 +58,7 @@ import mage.target.common.TargetControlledCreaturePermanent; public class StonehewerGiant extends CardImpl { public StonehewerGiant(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{W}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}{W}"); this.subtype.add(SubType.GIANT); this.subtype.add(SubType.WARRIOR); @@ -102,28 +102,27 @@ class StonehewerGiantEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player == null) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { return false; } FilterCard filter = new FilterCard("Equipment"); filter.add(new SubtypePredicate(SubType.EQUIPMENT)); TargetCardInLibrary target = new TargetCardInLibrary(filter); - if (player.searchLibrary(target, game)) { - Card card = player.getLibrary().getCard(target.getFirstTarget(), game); + if (controller.searchLibrary(target, game)) { + Card card = controller.getLibrary().getCard(target.getFirstTarget(), game); if (card != null) { - card.putOntoBattlefield(game, Zone.LIBRARY, source.getSourceId(), source.getControllerId()); + controller.moveCards(card, Zone.BATTLEFIELD, source, game); Permanent equipment = game.getPermanent(card.getId()); - Target targetCreature = new TargetControlledCreaturePermanent(); - if (equipment != null && player.choose(Outcome.BoostCreature, targetCreature, source.getSourceId(), game)) { + if (equipment != null && controller.choose(Outcome.BoostCreature, targetCreature, source.getSourceId(), game)) { Permanent permanent = game.getPermanent(targetCreature.getFirstTarget()); permanent.addAttachment(equipment.getId(), game); } } } - player.shuffleLibrary(source, game); + controller.shuffleLibrary(source, game); return true; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/t/TalonOfPain.java b/Mage.Sets/src/mage/cards/t/TalonOfPain.java index b4c1df248e1..ddba456b3a4 100644 --- a/Mage.Sets/src/mage/cards/t/TalonOfPain.java +++ b/Mage.Sets/src/mage/cards/t/TalonOfPain.java @@ -117,7 +117,7 @@ public class TalonOfPain extends CardImpl { UUID sourceControllerId = game.getControllerId(event.getSourceId()); if (sourceControllerId != null && sourceControllerId.equals(this.getControllerId()) - && this.getSourceId() != event.getSourceId()) { + && !this.getSourceId().equals(event.getSourceId())) { // return true so the effect will fire and a charge counter will be added return true; } diff --git a/Mage.Sets/src/mage/cards/t/TidalFlats.java b/Mage.Sets/src/mage/cards/t/TidalFlats.java index d33db8fa398..60d0f3cc779 100644 --- a/Mage.Sets/src/mage/cards/t/TidalFlats.java +++ b/Mage.Sets/src/mage/cards/t/TidalFlats.java @@ -29,6 +29,7 @@ package mage.cards.t; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -128,7 +129,7 @@ class TidalFlatsEffect extends OneShotEffect { if (group != null) { for (UUID blockerId : group.getBlockers()) { Permanent blocker = game.getPermanent(blockerId); - if (blocker != null && blocker.getControllerId() == controller.getId()) { + if (blocker != null && Objects.equals(blocker.getControllerId(), controller.getId())) { ContinuousEffect effect = new GainAbilityTargetEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn); effect.setTargetPointer(new FixedTarget(blocker.getId())); game.addEffect(effect, source); diff --git a/Mage.Sets/src/mage/cards/t/TorgaarFamineIncarnate.java b/Mage.Sets/src/mage/cards/t/TorgaarFamineIncarnate.java index f3e0e188767..5a8751e4d99 100644 --- a/Mage.Sets/src/mage/cards/t/TorgaarFamineIncarnate.java +++ b/Mage.Sets/src/mage/cards/t/TorgaarFamineIncarnate.java @@ -90,56 +90,6 @@ public class TorgaarFamineIncarnate extends CardImpl { } } -//class TorgaarFamineIncarnateSacrificeCost extends CostImpl { -// -// int numbSacrificed = 0; -// -// public TorgaarFamineIncarnateSacrificeCost() { -// this.text = "sacrifice any number of creatures"; -// -// } -// -// public TorgaarFamineIncarnateSacrificeCost(final TorgaarFamineIncarnateSacrificeCost cost) { -// super(cost); -// this.numbSacrificed = cost.numbSacrificed; -// } -// -// @Override -// public boolean canPay(Ability ability, UUID sourceId, UUID controllerId, Game game) { -// return true; -// } -// -// @Override -// public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana, Cost costToPay) { -// TargetControlledCreaturePermanent target -// = new TargetControlledCreaturePermanent(0, Integer.MAX_VALUE, -// new FilterControlledCreaturePermanent("select any number of creatures to sacrifice. " -// + "This spell costs {2} less to cast for each creature sacrificed this way"), true); -// Player player = game.getPlayer(controllerId); -// if (player != null) { -// player.chooseTarget(Outcome.Benefit, target, ability, game); -// for (UUID creatureId : target.getTargets()) { -// Permanent creature = game.getPermanent(creatureId); -// if (creature != null) { -// if (creature.sacrifice(sourceId, game)) { -// numbSacrificed++; -// } -// } -// } -// } -// this.paid = true; -// return paid; -// } -// -// public int getNumbSacrificed() { -// return numbSacrificed; -// } -// -// @Override -// public TorgaarFamineIncarnateSacrificeCost copy() { -// return new TorgaarFamineIncarnateSacrificeCost(this); -// } -//} class TorgaarFamineIncarnateEffect extends OneShotEffect { public TorgaarFamineIncarnateEffect() { diff --git a/Mage.Sets/src/mage/cards/t/TreacherousLink.java b/Mage.Sets/src/mage/cards/t/TreacherousLink.java index f5b7ed121f4..db60b79c508 100644 --- a/Mage.Sets/src/mage/cards/t/TreacherousLink.java +++ b/Mage.Sets/src/mage/cards/t/TreacherousLink.java @@ -125,7 +125,7 @@ class TreacherousLinkEffect extends ReplacementEffectImpl { if (controller != null && enchantment != null) { Permanent enchantedCreature = game.getPermanentOrLKIBattlefield(enchantment.getAttachedTo()); if (enchantedCreature != null) { - return enchantedCreature.getId() == damageEvent.getTargetId(); + return enchantedCreature.getId().equals(damageEvent.getTargetId()); } } return false; diff --git a/Mage.Sets/src/mage/cards/t/Typhoon.java b/Mage.Sets/src/mage/cards/t/Typhoon.java index 2d17c5fc5ba..4dea13bd3ff 100644 --- a/Mage.Sets/src/mage/cards/t/Typhoon.java +++ b/Mage.Sets/src/mage/cards/t/Typhoon.java @@ -83,7 +83,7 @@ class TyphoonEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { for (UUID playerId : game.getState().getPlayersInRange(source.getControllerId(), game)) { - if (playerId != source.getControllerId()) { + if (!playerId.equals(source.getControllerId())) { Player player = game.getPlayer(playerId); if (player != null) { int amount = 0; diff --git a/Mage.Sets/src/mage/cards/v/VoidMaw.java b/Mage.Sets/src/mage/cards/v/VoidMaw.java index a2e4aa88922..e6ac6ce0806 100644 --- a/Mage.Sets/src/mage/cards/v/VoidMaw.java +++ b/Mage.Sets/src/mage/cards/v/VoidMaw.java @@ -132,7 +132,7 @@ class VoidMawEffect extends ReplacementEffectImpl { ZoneChangeEvent zEvent = (ZoneChangeEvent) event; if (zEvent.getToZone() == Zone.GRAVEYARD) { Permanent permanent = ((ZoneChangeEvent) event).getTarget(); - if (permanent != null && permanent.getId() != source.getSourceId()) { + if (permanent != null && !permanent.getId().equals(source.getSourceId())) { if (zEvent.getTarget() != null) { // if it comes from permanent, check if it was a creature on the battlefield if (zEvent.getTarget().isCreature()) { return true; diff --git a/Mage.Sets/src/mage/cards/w/WatchersOfTheDead.java b/Mage.Sets/src/mage/cards/w/WatchersOfTheDead.java index 0e82384d38a..0bd0af1137e 100644 --- a/Mage.Sets/src/mage/cards/w/WatchersOfTheDead.java +++ b/Mage.Sets/src/mage/cards/w/WatchersOfTheDead.java @@ -97,7 +97,7 @@ class WatchersOfTheDeadEffect extends OneShotEffect { for (UUID opponentId : game.getState().getPlayersInRange(controller.getId(), game)) { Player opponent = game.getPlayer(opponentId); if (opponent != null - && opponent != controller) { + && !opponent.equals(controller)) { TargetCard target = new TargetCardInYourGraveyard(2, 2, new FilterCard()); target.setNotTarget(true); Cards cardsInGraveyard = opponent.getGraveyard(); diff --git a/Mage.Sets/src/mage/sets/FifthEdition.java b/Mage.Sets/src/mage/sets/FifthEdition.java index 74a66d2e135..520dc1c6de9 100644 --- a/Mage.Sets/src/mage/sets/FifthEdition.java +++ b/Mage.Sets/src/mage/sets/FifthEdition.java @@ -136,6 +136,7 @@ public class FifthEdition extends ExpansionSet { cards.add(new SetCardInfo("Divine Transformation", 304, Rarity.UNCOMMON, mage.cards.d.DivineTransformation.class)); cards.add(new SetCardInfo("Dragon Engine", 366, Rarity.RARE, mage.cards.d.DragonEngine.class)); cards.add(new SetCardInfo("Drain Life", 18, Rarity.COMMON, mage.cards.d.DrainLife.class)); + cards.add(new SetCardInfo("Drain Power", 82, Rarity.RARE, mage.cards.d.DrainPower.class)); cards.add(new SetCardInfo("Drudge Skeletons", 19, Rarity.COMMON, mage.cards.d.DrudgeSkeletons.class)); cards.add(new SetCardInfo("Durkwood Boars", 151, Rarity.COMMON, mage.cards.d.DurkwoodBoars.class)); cards.add(new SetCardInfo("Dust to Dust", 305, Rarity.UNCOMMON, mage.cards.d.DustToDust.class)); diff --git a/Mage.Sets/src/mage/sets/FourthEdition.java b/Mage.Sets/src/mage/sets/FourthEdition.java index 0b5d5d5f421..7405ca25a5a 100644 --- a/Mage.Sets/src/mage/sets/FourthEdition.java +++ b/Mage.Sets/src/mage/sets/FourthEdition.java @@ -119,6 +119,7 @@ public class FourthEdition extends ExpansionSet { cards.add(new SetCardInfo("Control Magic", 64, Rarity.UNCOMMON, mage.cards.c.ControlMagic.class)); cards.add(new SetCardInfo("Counterspell", 65, Rarity.UNCOMMON, mage.cards.c.Counterspell.class)); cards.add(new SetCardInfo("Creature Bond", 66, Rarity.COMMON, mage.cards.c.CreatureBond.class)); + cards.add(new SetCardInfo("Drain Power", 67, Rarity.RARE, mage.cards.d.DrainPower.class)); cards.add(new SetCardInfo("Energy Flux", 68, Rarity.UNCOMMON, mage.cards.e.EnergyFlux.class)); cards.add(new SetCardInfo("Energy Tap", 69, Rarity.COMMON, mage.cards.e.EnergyTap.class)); cards.add(new SetCardInfo("Erosion", 70, Rarity.COMMON, mage.cards.e.Erosion.class)); diff --git a/Mage.Sets/src/mage/sets/IceAge.java b/Mage.Sets/src/mage/sets/IceAge.java index 0461631cf4a..b25801592b1 100644 --- a/Mage.Sets/src/mage/sets/IceAge.java +++ b/Mage.Sets/src/mage/sets/IceAge.java @@ -176,6 +176,7 @@ public class IceAge extends ExpansionSet { cards.add(new SetCardInfo("Hyalopterous Lemure", 21, Rarity.UNCOMMON, mage.cards.h.HyalopterousLemure.class)); cards.add(new SetCardInfo("Hydroblast", 72, Rarity.COMMON, mage.cards.h.Hydroblast.class)); cards.add(new SetCardInfo("Hymn of Rebirth", 373, Rarity.UNCOMMON, mage.cards.h.HymnOfRebirth.class)); + cards.add(new SetCardInfo("Ice Cauldron", 296, Rarity.RARE, mage.cards.i.IceCauldron.class)); cards.add(new SetCardInfo("Ice Floe", 333, Rarity.UNCOMMON, mage.cards.i.IceFloe.class)); cards.add(new SetCardInfo("Iceberg", 73, Rarity.UNCOMMON, mage.cards.i.Iceberg.class)); cards.add(new SetCardInfo("Icequake", 22, Rarity.UNCOMMON, mage.cards.i.Icequake.class)); diff --git a/Mage.Sets/src/mage/sets/LimitedEditionAlpha.java b/Mage.Sets/src/mage/sets/LimitedEditionAlpha.java index 8b7de5a757d..2b9c646a0e8 100644 --- a/Mage.Sets/src/mage/sets/LimitedEditionAlpha.java +++ b/Mage.Sets/src/mage/sets/LimitedEditionAlpha.java @@ -88,6 +88,7 @@ public class LimitedEditionAlpha extends ExpansionSet { cards.add(new SetCardInfo("Disrupting Scepter", 242, Rarity.RARE, mage.cards.d.DisruptingScepter.class)); cards.add(new SetCardInfo("Dragon Whelp", 142, Rarity.UNCOMMON, mage.cards.d.DragonWhelp.class)); cards.add(new SetCardInfo("Drain Life", 14, Rarity.COMMON, mage.cards.d.DrainLife.class)); + cards.add(new SetCardInfo("Drain Power", 57, Rarity.RARE, mage.cards.d.DrainPower.class)); cards.add(new SetCardInfo("Drudge Skeletons", 15, Rarity.COMMON, mage.cards.d.DrudgeSkeletons.class)); cards.add(new SetCardInfo("Dwarven Demolition Team", 143, Rarity.UNCOMMON, mage.cards.d.DwarvenDemolitionTeam.class)); cards.add(new SetCardInfo("Dwarven Warriors", 144, Rarity.COMMON, mage.cards.d.DwarvenWarriors.class)); diff --git a/Mage.Sets/src/mage/sets/LimitedEditionBeta.java b/Mage.Sets/src/mage/sets/LimitedEditionBeta.java index 9b642609e4c..ba6e2fe89db 100644 --- a/Mage.Sets/src/mage/sets/LimitedEditionBeta.java +++ b/Mage.Sets/src/mage/sets/LimitedEditionBeta.java @@ -89,6 +89,7 @@ public class LimitedEditionBeta extends ExpansionSet { cards.add(new SetCardInfo("Disrupting Scepter", 243, Rarity.RARE, mage.cards.d.DisruptingScepter.class)); cards.add(new SetCardInfo("Dragon Whelp", 142, Rarity.UNCOMMON, mage.cards.d.DragonWhelp.class)); cards.add(new SetCardInfo("Drain Life", 106, Rarity.COMMON, mage.cards.d.DrainLife.class)); + cards.add(new SetCardInfo("Drain Power", 57, Rarity.RARE, mage.cards.d.DrainPower.class)); cards.add(new SetCardInfo("Drudge Skeletons", 107, Rarity.COMMON, mage.cards.d.DrudgeSkeletons.class)); cards.add(new SetCardInfo("Dwarven Demolition Team", 143, Rarity.UNCOMMON, mage.cards.d.DwarvenDemolitionTeam.class)); cards.add(new SetCardInfo("Dwarven Warriors", 144, Rarity.COMMON, mage.cards.d.DwarvenWarriors.class)); diff --git a/Mage.Sets/src/mage/sets/MastersEditionIV.java b/Mage.Sets/src/mage/sets/MastersEditionIV.java index e06cd8e06cd..d8180dd5a79 100644 --- a/Mage.Sets/src/mage/sets/MastersEditionIV.java +++ b/Mage.Sets/src/mage/sets/MastersEditionIV.java @@ -130,6 +130,7 @@ public class MastersEditionIV extends ExpansionSet { cards.add(new SetCardInfo("Diabolic Machine", 196, Rarity.UNCOMMON, mage.cards.d.DiabolicMachine.class)); cards.add(new SetCardInfo("Divine Offering", 10, Rarity.COMMON, mage.cards.d.DivineOffering.class)); cards.add(new SetCardInfo("Dragon Engine", 197, Rarity.COMMON, mage.cards.d.DragonEngine.class)); + cards.add(new SetCardInfo("Drain Power", 46, Rarity.RARE, mage.cards.d.DrainPower.class)); cards.add(new SetCardInfo("Dread Reaper", 78, Rarity.RARE, mage.cards.d.DreadReaper.class)); cards.add(new SetCardInfo("Drop of Honey", 150, Rarity.RARE, mage.cards.d.DropOfHoney.class)); cards.add(new SetCardInfo("Drowned", 47, Rarity.COMMON, mage.cards.d.Drowned.class)); @@ -175,6 +176,7 @@ public class MastersEditionIV extends ExpansionSet { cards.add(new SetCardInfo("Healing Salve", 14, Rarity.COMMON, mage.cards.h.HealingSalve.class)); cards.add(new SetCardInfo("Horn of Deafening", 205, Rarity.UNCOMMON, mage.cards.h.HornOfDeafening.class)); cards.add(new SetCardInfo("Howl from Beyond", 87, Rarity.COMMON, mage.cards.h.HowlFromBeyond.class)); + cards.add(new SetCardInfo("Ice Cauldron", 206, Rarity.RARE, mage.cards.i.IceCauldron.class)); cards.add(new SetCardInfo("Icy Manipulator", 207, Rarity.UNCOMMON, mage.cards.i.IcyManipulator.class)); cards.add(new SetCardInfo("In the Eye of Chaos", 51, Rarity.RARE, mage.cards.i.InTheEyeOfChaos.class)); cards.add(new SetCardInfo("Instill Energy", 157, Rarity.UNCOMMON, mage.cards.i.InstillEnergy.class)); diff --git a/Mage.Sets/src/mage/sets/RevisedEdition.java b/Mage.Sets/src/mage/sets/RevisedEdition.java index 74924028acb..e4e83cf7021 100644 --- a/Mage.Sets/src/mage/sets/RevisedEdition.java +++ b/Mage.Sets/src/mage/sets/RevisedEdition.java @@ -91,6 +91,7 @@ public class RevisedEdition extends ExpansionSet { cards.add(new SetCardInfo("Dragon Engine", 246, Rarity.RARE, mage.cards.d.DragonEngine.class)); cards.add(new SetCardInfo("Dragon Whelp", 142, Rarity.UNCOMMON, mage.cards.d.DragonWhelp.class)); cards.add(new SetCardInfo("Drain Life", 14, Rarity.COMMON, mage.cards.d.DrainLife.class)); + cards.add(new SetCardInfo("Drain Power", 56, Rarity.RARE, mage.cards.d.DrainPower.class)); cards.add(new SetCardInfo("Drudge Skeletons", 15, Rarity.COMMON, mage.cards.d.DrudgeSkeletons.class)); cards.add(new SetCardInfo("Dwarven Warriors", 143, Rarity.COMMON, mage.cards.d.DwarvenWarriors.class)); cards.add(new SetCardInfo("Dwarven Weaponsmith", 144, Rarity.UNCOMMON, mage.cards.d.DwarvenWeaponsmith.class)); diff --git a/Mage.Sets/src/mage/sets/StarWars.java b/Mage.Sets/src/mage/sets/StarWars.java index 0959f928fde..2cfa88c803d 100644 --- a/Mage.Sets/src/mage/sets/StarWars.java +++ b/Mage.Sets/src/mage/sets/StarWars.java @@ -130,10 +130,10 @@ public class StarWars extends ExpansionSet { cards.add(new SetCardInfo("Force Reflex", 13, Rarity.COMMON, mage.cards.f.ForceReflex.class)); cards.add(new SetCardInfo("Force Scream", 104, Rarity.UNCOMMON, mage.cards.f.ForceScream.class)); cards.add(new SetCardInfo("Force Spark", 105, Rarity.COMMON, mage.cards.f.ForceSpark.class)); - cards.add(new SetCardInfo("Forest", 268, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Forest", 269, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Forest", 270, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Forest", 271, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Forest", "268a", Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Forest", "268b", Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Forest", "268c", Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Forest", "268d", Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); cards.add(new SetCardInfo("Fulfill Contract", 224, Rarity.COMMON, mage.cards.f.FulfillContract.class)); cards.add(new SetCardInfo("Gamorrean Prison Guard", 106, Rarity.UNCOMMON, mage.cards.g.GamorreanPrisonGuard.class)); cards.add(new SetCardInfo("General Grievous", 185, Rarity.MYTHIC, mage.cards.g.GeneralGrievous.class)); @@ -160,10 +160,10 @@ public class StarWars extends ExpansionSet { cards.add(new SetCardInfo("Interrogation", 81, Rarity.COMMON, mage.cards.i.Interrogation.class)); cards.add(new SetCardInfo("Ion Cannon", 15, Rarity.COMMON, mage.cards.i.IonCannon.class)); cards.add(new SetCardInfo("Iron Fist of the Empire", 191, Rarity.RARE, mage.cards.i.IronFistOfTheEmpire.class)); - cards.add(new SetCardInfo("Island", 256, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Island", 257, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Island", 258, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Island", 259, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Island", "256a", Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Island", "256b", Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Island", "256c", Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Island", "256d", Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); cards.add(new SetCardInfo("Ithorian Initiate", 140, Rarity.COMMON, mage.cards.i.IthorianInitiate.class)); cards.add(new SetCardInfo("Jabba the Hutt", 192, Rarity.RARE, mage.cards.j.JabbaTheHutt.class)); cards.add(new SetCardInfo("Jango Fett", 111, Rarity.RARE, mage.cards.j.JangoFett.class)); @@ -205,10 +205,10 @@ public class StarWars extends ExpansionSet { cards.add(new SetCardInfo("Moisture Farm", 247, Rarity.UNCOMMON, mage.cards.m.MoistureFarm.class)); cards.add(new SetCardInfo("Mon Calamari Cruiser", 48, Rarity.UNCOMMON, mage.cards.m.MonCalamariCruiser.class)); cards.add(new SetCardInfo("Mon Calamari Initiate", 49, Rarity.COMMON, mage.cards.m.MonCalamariInitiate.class)); - cards.add(new SetCardInfo("Mountain", 264, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Mountain", 265, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Mountain", 266, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Mountain", 267, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Mountain", "264a", Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Mountain", "264b", Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Mountain", "264c", Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Mountain", "264d", Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); cards.add(new SetCardInfo("N-1 Starfighter", 225, Rarity.COMMON, mage.cards.n.N1Starfighter.class)); cards.add(new SetCardInfo("Nebulon-B Frigate", 25, Rarity.COMMON, mage.cards.n.NebulonBFrigate.class)); cards.add(new SetCardInfo("Neophyte Hateflayer", 82, Rarity.COMMON, mage.cards.n.NeophyteHateflayer.class)); @@ -226,10 +226,10 @@ public class StarWars extends ExpansionSet { cards.add(new SetCardInfo("Outer Rim Slaver", 201, Rarity.COMMON, mage.cards.o.OuterRimSlaver.class)); cards.add(new SetCardInfo("Outlaw Holocron", 235, Rarity.COMMON, mage.cards.o.OutlawHolocron.class)); cards.add(new SetCardInfo("Personal Energy Shield", 51, Rarity.COMMON, mage.cards.p.PersonalEnergyShield.class)); - cards.add(new SetCardInfo("Plains", 252, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Plains", 253, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Plains", 254, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Plains", 255, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Plains", "252a", Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Plains", "252b", Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Plains", "252c", Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Plains", "252d", Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); cards.add(new SetCardInfo("Plo Koon", 27, Rarity.RARE, mage.cards.p.PloKoon.class)); cards.add(new SetCardInfo("Precipice of Mortis", 202, Rarity.RARE, mage.cards.p.PrecipiceOfMortis.class)); cards.add(new SetCardInfo("Predator's Strike", 151, Rarity.COMMON, mage.cards.p.PredatorsStrike.class)); @@ -289,10 +289,10 @@ public class StarWars extends ExpansionSet { cards.add(new SetCardInfo("Strike Team Commando", 227, Rarity.COMMON, mage.cards.s.StrikeTeamCommando.class)); cards.add(new SetCardInfo("Super Battle Droid", 59, Rarity.COMMON, mage.cards.s.SuperBattleDroid.class)); cards.add(new SetCardInfo("Surprise Maneuver", 60, Rarity.COMMON, mage.cards.s.SurpriseManeuver.class)); - cards.add(new SetCardInfo("Swamp", 260, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Swamp", 261, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Swamp", 262, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Swamp", 263, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Swamp", "260a", Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Swamp", "260b", Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Swamp", "260c", Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Swamp", "260d", Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); cards.add(new SetCardInfo("Swarm the Skies", 92, Rarity.COMMON, mage.cards.s.SwarmTheSkies.class)); cards.add(new SetCardInfo("Syndicate Enforcer", 124, Rarity.COMMON, mage.cards.s.SyndicateEnforcerSWS.class)); cards.add(new SetCardInfo("Tank Droid", 218, Rarity.RARE, mage.cards.t.TankDroid.class)); @@ -328,5 +328,4 @@ public class StarWars extends ExpansionSet { cards.add(new SetCardInfo("Yoda, Jedi Master", 223, Rarity.MYTHIC, mage.cards.y.YodaJediMaster.class)); cards.add(new SetCardInfo("Zam Wesell", 64, Rarity.RARE, mage.cards.z.ZamWesell.class)); } - } diff --git a/Mage.Sets/src/mage/sets/UnlimitedEdition.java b/Mage.Sets/src/mage/sets/UnlimitedEdition.java index a27c910c64f..ee5e51551d3 100644 --- a/Mage.Sets/src/mage/sets/UnlimitedEdition.java +++ b/Mage.Sets/src/mage/sets/UnlimitedEdition.java @@ -89,6 +89,7 @@ public class UnlimitedEdition extends ExpansionSet { cards.add(new SetCardInfo("Disrupting Scepter", 243, Rarity.RARE, mage.cards.d.DisruptingScepter.class)); cards.add(new SetCardInfo("Dragon Whelp", 142, Rarity.UNCOMMON, mage.cards.d.DragonWhelp.class)); cards.add(new SetCardInfo("Drain Life", 14, Rarity.COMMON, mage.cards.d.DrainLife.class)); + cards.add(new SetCardInfo("Drain Power", 57, Rarity.RARE, mage.cards.d.DrainPower.class)); cards.add(new SetCardInfo("Drudge Skeletons", 15, Rarity.COMMON, mage.cards.d.DrudgeSkeletons.class)); cards.add(new SetCardInfo("Dwarven Demolition Team", 143, Rarity.UNCOMMON, mage.cards.d.DwarvenDemolitionTeam.class)); cards.add(new SetCardInfo("Dwarven Warriors", 144, Rarity.COMMON, mage.cards.d.DwarvenWarriors.class)); diff --git a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java index e0eadcb549b..79cf55db7f8 100644 --- a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java +++ b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java @@ -329,7 +329,7 @@ public class TestPlayer implements Player { } UUID modeId = ability.getModes().getModeId(modeNr); selectedMode = ability.getModes().get(modeId); - if (modeId != ability.getModes().getMode().getId()) { + if (!Objects.equals(modeId, ability.getModes().getMode().getId())) { ability.getModes().setActiveMode(modeId); index = 0; // reset target index if mode changes } @@ -2416,4 +2416,21 @@ public class TestPlayer implements Player { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (o == null || getClass() != o.getClass()) { + return false; + } + + Player obj = (Player) o; + if (this.getId() == null || obj.getId() == null) { + return false; + } + + return this.getId().equals(obj.getId()); + } } diff --git a/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java b/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java index 354b9a88ac6..7eebfc498a8 100644 --- a/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java +++ b/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java @@ -1293,4 +1293,22 @@ public class PlayerStub implements Player { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (o == null || getClass() != o.getClass()) { + return false; + } + + Player obj = (Player) o; + if (this.getId() == null || obj.getId() == null) { + return false; + } + + return this.getId().equals(obj.getId()); + } + } diff --git a/Mage/src/main/java/mage/Mana.java b/Mage/src/main/java/mage/Mana.java index 395f52e284d..d173437878b 100644 --- a/Mage/src/main/java/mage/Mana.java +++ b/Mage/src/main/java/mage/Mana.java @@ -1083,7 +1083,7 @@ public class Mana implements Comparable, Serializable, Copyable { && this.red >= mana.red && this.colorless >= mana.colorless && (this.generic >= mana.generic - || this.countColored() >= mana.countColored() + mana.generic); + || this.countColored() + this.colorless >= mana.count()); } diff --git a/Mage/src/main/java/mage/abilities/effects/common/AddConditionalManaOfAnyColorEffect.java b/Mage/src/main/java/mage/abilities/effects/common/AddConditionalManaOfAnyColorEffect.java index 3f683a25de9..02964f7426a 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/AddConditionalManaOfAnyColorEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/AddConditionalManaOfAnyColorEffect.java @@ -63,9 +63,9 @@ public class AddConditionalManaOfAnyColorEffect extends ManaEffect { staticText = "Add " + (amount instanceof StaticValue ? (CardUtil.numberToText(((StaticValue) amount).toString())) : "") + " mana " - + (oneChoice ? "of any" - + (amount instanceof StaticValue && (((StaticValue) amount).toString()).equals("1") ? "" : " one") - + " color" : "in any combination of colors") + + (oneChoice || (amount instanceof StaticValue && (((StaticValue) amount).toString()).equals("1")) + ? "of any" + (amount instanceof StaticValue && (((StaticValue) amount).toString()).equals("1") ? "" : " one") + " color" + : "in any combination of colors") + ". " + manaBuilder.getRule(); } diff --git a/Mage/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionAllEffect.java b/Mage/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionAllEffect.java index 0b7af33808d..c66870598c2 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionAllEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionAllEffect.java @@ -53,6 +53,7 @@ public class SpellsCostReductionAllEffect extends CostModificationEffectImpl { private FilterCard filter; private int amount; private final boolean upTo; + private boolean onlyControlled; public SpellsCostReductionAllEffect(int amount) { this(new FilterCard("Spells"), amount); @@ -63,19 +64,24 @@ public class SpellsCostReductionAllEffect extends CostModificationEffectImpl { } public SpellsCostReductionAllEffect(FilterCard filter, int amount, boolean upTo) { + this(filter, amount, upTo, false); + } + + public SpellsCostReductionAllEffect(FilterCard filter, int amount, boolean upTo, boolean onlyControlled) { super(Duration.WhileOnBattlefield, Outcome.Benefit, CostModificationType.REDUCE_COST); this.filter = filter; this.amount = amount; this.upTo = upTo; - + this.onlyControlled = onlyControlled; this.staticText = filter.getMessage() + " cost " + (upTo ? "up to " : "") + '{' + amount + "} less to cast"; } - protected SpellsCostReductionAllEffect(SpellsCostReductionAllEffect effect) { + protected SpellsCostReductionAllEffect(final SpellsCostReductionAllEffect effect) { super(effect); this.filter = effect.filter; this.amount = effect.amount; this.upTo = effect.upTo; + this.onlyControlled = effect.onlyControlled; } @Override @@ -136,6 +142,9 @@ public class SpellsCostReductionAllEffect extends CostModificationEffectImpl { @Override public boolean applies(Ability abilityToModify, Ability source, Game game) { + if (onlyControlled && abilityToModify.getControllerId().equals(source.getControllerId())) { + return false; + } if (abilityToModify instanceof SpellAbility) { Spell spell = (Spell) game.getStack().getStackObject(abilityToModify.getId()); if (spell != null) { diff --git a/Mage/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionAllOfChosenSubtypeEffect.java b/Mage/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionAllOfChosenSubtypeEffect.java index 71185730ca1..4a8fdf40d0b 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionAllOfChosenSubtypeEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionAllOfChosenSubtypeEffect.java @@ -19,7 +19,11 @@ import mage.game.Game; public class SpellsCostReductionAllOfChosenSubtypeEffect extends SpellsCostReductionAllEffect { public SpellsCostReductionAllOfChosenSubtypeEffect(FilterCard filter, int amount) { - super(filter, amount); + this(filter, amount, false); + } + + public SpellsCostReductionAllOfChosenSubtypeEffect(FilterCard filter, int amount, boolean onlyControlled) { + super(filter, amount, false, onlyControlled); } public SpellsCostReductionAllOfChosenSubtypeEffect(final SpellsCostReductionAllOfChosenSubtypeEffect effect) { diff --git a/Mage/src/main/java/mage/game/GameState.java b/Mage/src/main/java/mage/game/GameState.java index 384d07ab199..d10618d2de3 100644 --- a/Mage/src/main/java/mage/game/GameState.java +++ b/Mage/src/main/java/mage/game/GameState.java @@ -757,8 +757,8 @@ public class GameState implements Serializable, Copyable { ZoneChangeData data = (ZoneChangeData) obj; return this.fromZone == data.fromZone && this.toZone == data.toZone - && this.sourceId == data.sourceId - && this.playerId == data.playerId; + && Objects.equals(this.sourceId, data.sourceId) + && Objects.equals(this.playerId, data.playerId); } return false; } diff --git a/Mage/src/main/java/mage/game/combat/CombatGroup.java b/Mage/src/main/java/mage/game/combat/CombatGroup.java index c66dcd0c06d..e1f003e1d87 100644 --- a/Mage/src/main/java/mage/game/combat/CombatGroup.java +++ b/Mage/src/main/java/mage/game/combat/CombatGroup.java @@ -28,11 +28,8 @@ package mage.game.combat; import java.io.Serializable; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; +import java.util.*; + import mage.abilities.common.ControllerAssignCombatDamageToBlockersAbility; import mage.abilities.common.ControllerDivideCombatDamageAbility; import mage.abilities.common.DamageAsThoughNotBlockedAbility; @@ -286,7 +283,7 @@ public class CombatGroup implements Serializable, Copyable { if (attacker == null) { return; } - boolean oldRuleDamage = (player.getId() == defendingPlayerId); + boolean oldRuleDamage = (Objects.equals(player.getId(), defendingPlayerId)); int damage = getDamageValueFromPermanent(attacker, game); if (canDamage(attacker, first)) { // must be set before attacker damage marking because of effects like Test of Faith diff --git a/Mage/src/main/java/mage/game/command/planes/EdgeOfMalacolPlane.java b/Mage/src/main/java/mage/game/command/planes/EdgeOfMalacolPlane.java index 9caa2b5677e..23146f69957 100644 --- a/Mage/src/main/java/mage/game/command/planes/EdgeOfMalacolPlane.java +++ b/Mage/src/main/java/mage/game/command/planes/EdgeOfMalacolPlane.java @@ -29,6 +29,7 @@ package mage.game.command.planes; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.ActivateIfConditionActivatedAbility; @@ -132,7 +133,7 @@ class EdgeOfMalacolEffect extends ContinuousRuleModifyingEffectImpl { } } Permanent permanent = game.getPermanent(event.getTargetId()); - if (permanent != null && filter.match(permanent, game) && permanent.getControllerId() == game.getActivePlayerId()) { + if (permanent != null && filter.match(permanent, game) && Objects.equals(permanent.getControllerId(), game.getActivePlayerId())) { UUID oldController = source.getControllerId(); source.setControllerId(game.getActivePlayerId()); Effect effect = new AddCountersTargetEffect(CounterType.P1P1.createInstance(2)); diff --git a/Mage/src/main/java/mage/game/stack/Spell.java b/Mage/src/main/java/mage/game/stack/Spell.java index 693b324c910..5a5d4103ec6 100644 --- a/Mage/src/main/java/mage/game/stack/Spell.java +++ b/Mage/src/main/java/mage/game/stack/Spell.java @@ -149,6 +149,7 @@ public class Spell extends StackObjImpl implements Card { this.resolving = spell.resolving; this.doneActivatingManaAbilities = spell.doneActivatingManaAbilities; + this.targetChanged = spell.targetChanged; } public boolean activate(Game game, boolean noMana) { diff --git a/Mage/src/main/java/mage/game/stack/StackAbility.java b/Mage/src/main/java/mage/game/stack/StackAbility.java index 00eabb629a5..da87c5d3fb5 100644 --- a/Mage/src/main/java/mage/game/stack/StackAbility.java +++ b/Mage/src/main/java/mage/game/stack/StackAbility.java @@ -89,6 +89,7 @@ public class StackAbility extends StackObjImpl implements Ability { this.name = stackAbility.name; this.expansionSetCode = stackAbility.expansionSetCode; this.targetAdjustment = stackAbility.targetAdjustment; + this.targetChanged = stackAbility.targetChanged; } @Override diff --git a/Mage/src/main/java/mage/game/stack/StackObjImpl.java b/Mage/src/main/java/mage/game/stack/StackObjImpl.java index 53c689a618f..12d49f57499 100644 --- a/Mage/src/main/java/mage/game/stack/StackObjImpl.java +++ b/Mage/src/main/java/mage/game/stack/StackObjImpl.java @@ -5,6 +5,8 @@ */ package mage.game.stack; +import java.util.Set; +import java.util.UUID; import mage.MageObject; import mage.abilities.Abilities; import mage.abilities.AbilitiesImpl; @@ -19,16 +21,13 @@ import mage.players.Player; import mage.target.Target; import mage.target.TargetAmount; -import java.util.Set; -import java.util.UUID; - /** * * @author LevelX2 */ public abstract class StackObjImpl implements StackObject { - - private boolean targetChanged; // for Psychic Battle + + protected boolean targetChanged; // for Psychic Battle /** * Choose new targets for a stack Object @@ -74,12 +73,11 @@ public abstract class StackObjImpl implements StackObject { * the change is legal. * * Example: Arc Trail is a sorcery that reads "Arc Trail deals 2 damage to - * any target and 1 damage to another target creature or - * player." The current targets of Arc Trail are Runeclaw Bear and Llanowar - * Elves, in that order. You cast Redirect, an instant that reads "You may - * choose new targets for target spell," targeting Arc Trail. You can change - * the first target to Llanowar Elves and change the second target to - * Runeclaw Bear. + * any target and 1 damage to another target creature or player." The + * current targets of Arc Trail are Runeclaw Bear and Llanowar Elves, in + * that order. You cast Redirect, an instant that reads "You may choose new + * targets for target spell," targeting Arc Trail. You can change the first + * target to Llanowar Elves and change the second target to Runeclaw Bear. * * 114.7. Modal spells and abilities may have different targeting * requirements for each mode. An effect that allows a player to change the diff --git a/Mage/src/main/java/mage/players/ManaPool.java b/Mage/src/main/java/mage/players/ManaPool.java index 565e96cac21..2448b8a9220 100644 --- a/Mage/src/main/java/mage/players/ManaPool.java +++ b/Mage/src/main/java/mage/players/ManaPool.java @@ -395,7 +395,8 @@ public class ManaPool implements Serializable { Mana mana = manaToAdd.copy(); if (!game.replaceEvent(new ManaEvent(EventType.ADD_MANA, source.getId(), source.getSourceId(), playerId, mana))) { if (mana instanceof ConditionalMana) { - ManaPoolItem item = new ManaPoolItem((ConditionalMana) mana, source.getSourceObject(game), source.getOriginalId()); + ManaPoolItem item = new ManaPoolItem((ConditionalMana) mana, source.getSourceObject(game), + ((ConditionalMana) mana).getManaProducerOriginalId() != null ? ((ConditionalMana) mana).getManaProducerOriginalId() : source.getOriginalId()); if (emptyOnTurnsEnd) { item.setDuration(Duration.EndOfTurn); } @@ -505,4 +506,13 @@ public class ManaPool implements Serializable { public boolean isEmpty() { return count() == 0; } + + public List getManaItems() { + List itemsCopy = new ArrayList<>(); + for (ManaPoolItem manaItem : manaItems) { + itemsCopy.add(manaItem.copy()); + } + return itemsCopy; + } + } diff --git a/Mage/src/main/java/mage/players/PlayerImpl.java b/Mage/src/main/java/mage/players/PlayerImpl.java index c850a67fcba..87a78ad1bbb 100644 --- a/Mage/src/main/java/mage/players/PlayerImpl.java +++ b/Mage/src/main/java/mage/players/PlayerImpl.java @@ -3866,7 +3866,7 @@ public abstract class PlayerImpl implements Player, Serializable { return false; } - PlayerImpl obj = (PlayerImpl) o; + Player obj = (Player) o; if (this.getId() == null || obj.getId() == null) { return false; } diff --git a/Mage/src/main/java/mage/watchers/common/BlockedByOnlyOneCreatureThisCombatWatcher.java b/Mage/src/main/java/mage/watchers/common/BlockedByOnlyOneCreatureThisCombatWatcher.java index 3e91f1f0b0a..945a50e2458 100644 --- a/Mage/src/main/java/mage/watchers/common/BlockedByOnlyOneCreatureThisCombatWatcher.java +++ b/Mage/src/main/java/mage/watchers/common/BlockedByOnlyOneCreatureThisCombatWatcher.java @@ -27,11 +27,8 @@ */ package mage.watchers.common; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.UUID; +import java.util.*; + import mage.constants.WatcherScope; import mage.game.Game; import mage.game.combat.CombatGroup; @@ -67,7 +64,7 @@ public class BlockedByOnlyOneCreatureThisCombatWatcher extends Watcher { if (!blockedByOneCreature.containsKey(combatGroup)) { blockedByOneCreature.put(combatGroup, event.getSourceId()); } - else if (blockedByOneCreature.get(combatGroup) != event.getSourceId()) { + else if (!Objects.equals(blockedByOneCreature.get(combatGroup), event.getSourceId())) { blockedByOneCreature.put(combatGroup, null); } }