From 99744eb919bf3246418dbe80594a25651c9dd446 Mon Sep 17 00:00:00 2001 From: L_J Date: Wed, 18 Apr 2018 03:08:53 +0000 Subject: [PATCH 01/26] Implemented Ice Cauldron --- Mage.Sets/src/mage/cards/i/IceCauldron.java | 287 ++++++++++++++++++++ 1 file changed, 287 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/i/IceCauldron.java 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 0000000000..879431465a --- /dev/null +++ b/Mage.Sets/src/mage/cards/i/IceCauldron.java @@ -0,0 +1,287 @@ +/* + * 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.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(), chosenCard.getId()); //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 UUID exiledCardId; + + 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()); + exiledCardId = (UUID) 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); + IceCauldronConditionalMana iceCauldronMana = new IceCauldronConditionalMana(storedMana, game.getCard(exiledCardId)); + 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; + } +} From 03a0cdf05402c20b7a529c3c80a0644ace503e03 Mon Sep 17 00:00:00 2001 From: L_J Date: Wed, 18 Apr 2018 03:09:42 +0000 Subject: [PATCH 02/26] Implemented Ice Cauldron --- Mage.Sets/src/mage/sets/IceAge.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Mage.Sets/src/mage/sets/IceAge.java b/Mage.Sets/src/mage/sets/IceAge.java index 0461631cf4..b25801592b 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)); From 6579354d2b84730eb0d9bc8fe5b3bcbcbee381ce Mon Sep 17 00:00:00 2001 From: L_J Date: Wed, 18 Apr 2018 03:26:00 +0000 Subject: [PATCH 03/26] Implemented Ice Cauldron --- Mage.Sets/src/mage/sets/MastersEditionIV.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Mage.Sets/src/mage/sets/MastersEditionIV.java b/Mage.Sets/src/mage/sets/MastersEditionIV.java index e06cd8e06c..dc6ee017eb 100644 --- a/Mage.Sets/src/mage/sets/MastersEditionIV.java +++ b/Mage.Sets/src/mage/sets/MastersEditionIV.java @@ -175,6 +175,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)); From a2d5bb2bc8252d4e5cc88754259dae063dfa5ab5 Mon Sep 17 00:00:00 2001 From: L_J Date: Wed, 18 Apr 2018 03:50:10 +0000 Subject: [PATCH 04/26] Attempting to track exiled card via MageObjectReference --- Mage.Sets/src/mage/cards/i/IceCauldron.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Mage.Sets/src/mage/cards/i/IceCauldron.java b/Mage.Sets/src/mage/cards/i/IceCauldron.java index 879431465a..3cddcda9e1 100644 --- a/Mage.Sets/src/mage/cards/i/IceCauldron.java +++ b/Mage.Sets/src/mage/cards/i/IceCauldron.java @@ -30,6 +30,7 @@ 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; @@ -137,7 +138,7 @@ class IceCauldronExileEffect extends OneShotEffect { AsThoughEffect effect = new IceCauldronCastFromExileEffect(); effect.setTargetPointer(new FixedTarget(chosenCard.getId())); game.addEffect(effect, source); - game.getState().setValue("IceCauldronCard" + source.getSourceId().toString(), chosenCard.getId()); //store the exiled card + game.getState().setValue("IceCauldronCard" + source.getSourceId().toString(), new MageObjectReference(chosenCard.getId(), game)); //store the exiled card return true; } } @@ -216,7 +217,7 @@ class IceCauldronNoteManaEffect extends OneShotEffect { class IceCauldronAddManaEffect extends ManaEffect { private static Mana storedMana; - private static UUID exiledCardId; + private static MageObjectReference exiledCardMor; IceCauldronAddManaEffect() { super(); @@ -238,10 +239,10 @@ class IceCauldronAddManaEffect extends ManaEffect { Player controller = game.getPlayer(source.getControllerId()); if (iceCauldron != null && controller != null) { storedMana = (Mana) game.getState().getValue("IceCauldronMana" + source.getSourceId().toString()); - exiledCardId = (UUID) game.getState().getValue("IceCauldronCard" + 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); - IceCauldronConditionalMana iceCauldronMana = new IceCauldronConditionalMana(storedMana, game.getCard(exiledCardId)); + IceCauldronConditionalMana iceCauldronMana = new IceCauldronConditionalMana(storedMana, exiledCardMor.getCard(game)); if (iceCauldronMana != null) { controller.getManaPool().addMana(iceCauldronMana, game, source); return true; From 34952f173d57d9b31ba35c02c9e6a7ba0ae5b9d6 Mon Sep 17 00:00:00 2001 From: L_J Date: Sat, 28 Apr 2018 13:15:31 +0000 Subject: [PATCH 05/26] Mana Short filter fix --- Mage.Sets/src/mage/cards/m/ManaShort.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Mage.Sets/src/mage/cards/m/ManaShort.java b/Mage.Sets/src/mage/cards/m/ManaShort.java index 567fef5ed6..e906ca77da 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; @@ -47,7 +47,7 @@ public class ManaShort extends CardImpl { public ManaShort(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{2}{U}"); - // Tap all lands target player controls and empty their mana pool. + // Tap all lands target player controls and empty his or her mana pool. this.getSpellAbility().addEffect(new ManaShortEffect()); this.getSpellAbility().addTarget(new TargetPlayer()); } @@ -65,8 +65,8 @@ public class ManaShort extends CardImpl { class ManaShortEffect extends TapAllTargetPlayerControlsEffect { public ManaShortEffect() { - super(StaticFilters.FILTER_LANDS); - staticText = "Tap all lands target player controls and empty their mana pool"; + super(new FilterLandPermanent()); + staticText = "Tap all lands target player controls and empty his or her mana pool"; } public ManaShortEffect(final ManaShortEffect effect) { From 4446adfadf8cba48ab507137f1bb94516424377d Mon Sep 17 00:00:00 2001 From: L_J Date: Sat, 28 Apr 2018 13:17:25 +0000 Subject: [PATCH 06/26] Made Mana#includesMana capable of comparing colorless to generic --- Mage/src/main/java/mage/Mana.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage/src/main/java/mage/Mana.java b/Mage/src/main/java/mage/Mana.java index 395f52e284..d173437878 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()); } From 826eb6843ef2921d0f2c49e1dc77929e9834d7d1 Mon Sep 17 00:00:00 2001 From: L_J Date: Sat, 28 Apr 2018 15:19:16 +0200 Subject: [PATCH 07/26] Implemented Drain Power --- Mage.Sets/src/mage/cards/d/DrainPower.java | 178 ++++++++++++++++++ Mage.Sets/src/mage/sets/FifthEdition.java | 1 + Mage.Sets/src/mage/sets/FourthEdition.java | 1 + .../src/mage/sets/LimitedEditionAlpha.java | 1 + .../src/mage/sets/LimitedEditionBeta.java | 1 + Mage.Sets/src/mage/sets/MastersEditionIV.java | 1 + Mage.Sets/src/mage/sets/RevisedEdition.java | 1 + Mage.Sets/src/mage/sets/UnlimitedEdition.java | 1 + 8 files changed, 185 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/d/DrainPower.java 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 0000000000..8aa9047668 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DrainPower.java @@ -0,0 +1,178 @@ +/* + * 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.Mana; +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.Outcome; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.permanent.PermanentInListPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +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.Tap); + 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; + + do { + 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 = null; + 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; + } + } + } + } while (target != null && target.canChoose(targetPlayer.getId(), game)); + + // 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 + Mana mana = targetPlayer.getManaPool().getMana(); + targetPlayer.getManaPool().emptyPool(game); + controller.getManaPool().addMana(mana, game, source); + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/FifthEdition.java b/Mage.Sets/src/mage/sets/FifthEdition.java index 74a66d2e13..520dc1c6de 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 0b5d5d5f42..7405ca25a5 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/LimitedEditionAlpha.java b/Mage.Sets/src/mage/sets/LimitedEditionAlpha.java index 8b7de5a757..2b9c646a0e 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 9b642609e4..ba6e2fe89d 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 e06cd8e06c..6e967fa5ca 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)); diff --git a/Mage.Sets/src/mage/sets/RevisedEdition.java b/Mage.Sets/src/mage/sets/RevisedEdition.java index 74924028ac..e4e83cf702 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/UnlimitedEdition.java b/Mage.Sets/src/mage/sets/UnlimitedEdition.java index a27c910c64..ee5e51551d 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)); From d83af8be91ec2c2aa58fb89738d8e052c2b78d6f Mon Sep 17 00:00:00 2001 From: L_J Date: Sat, 28 Apr 2018 13:22:26 +0000 Subject: [PATCH 08/26] Mana Short text fix --- Mage.Sets/src/mage/cards/m/ManaShort.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/cards/m/ManaShort.java b/Mage.Sets/src/mage/cards/m/ManaShort.java index e906ca77da..701ebe6c83 100644 --- a/Mage.Sets/src/mage/cards/m/ManaShort.java +++ b/Mage.Sets/src/mage/cards/m/ManaShort.java @@ -47,7 +47,7 @@ public class ManaShort extends CardImpl { public ManaShort(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{2}{U}"); - // Tap all lands target player controls and empty his or her mana pool. + // Tap all lands target player controls and empty their mana pool. this.getSpellAbility().addEffect(new ManaShortEffect()); this.getSpellAbility().addTarget(new TargetPlayer()); } @@ -66,7 +66,7 @@ class ManaShortEffect extends TapAllTargetPlayerControlsEffect { public ManaShortEffect() { super(new FilterLandPermanent()); - staticText = "Tap all lands target player controls and empty his or her mana pool"; + staticText = "Tap all lands target player controls and empty their mana pool"; } public ManaShortEffect(final ManaShortEffect effect) { From 97606fc50dc44940e85070022abcee147a06aa7a Mon Sep 17 00:00:00 2001 From: L_J Date: Sat, 28 Apr 2018 13:59:28 +0000 Subject: [PATCH 09/26] Drain Power while loop logic fix --- Mage.Sets/src/mage/cards/d/DrainPower.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/cards/d/DrainPower.java b/Mage.Sets/src/mage/cards/d/DrainPower.java index 8aa9047668..dd74c601ca 100644 --- a/Mage.Sets/src/mage/cards/d/DrainPower.java +++ b/Mage.Sets/src/mage/cards/d/DrainPower.java @@ -101,7 +101,7 @@ class DrainPowerEffect extends OneShotEffect { List ignorePermanents = new ArrayList<>(); TargetPermanent target = null; - do { + while (true) { Map> manaAbilitiesMap = new HashMap<>(); for (Permanent permanent : game.getBattlefield().getAllActivePermanents(filter, targetPlayer.getId(), game)) { if (!ignorePermanents.contains(permanent)) { @@ -162,7 +162,7 @@ class DrainPowerEffect extends OneShotEffect { } } } - } while (target != null && target.canChoose(targetPlayer.getId(), game)); + } // 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 From c24ba742f685218750dd7231dc5701557dc72a89 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sat, 28 Apr 2018 21:24:48 +0400 Subject: [PATCH 10/26] Fixed equal or == errors -- 23 cards and more (see #4407) --- .../plugins/adapters/MageActionCallback.java | 11 +++-------- .../plugins/card/images/CardDownloadData.java | 2 +- .../mage/server/console/ConnectDialog.java | 10 ++++------ .../src/mage/player/ai/ComputerPlayer6.java | 14 ++------------ .../java/mage/player/ai/ComputerPlayer.java | 18 ++++++++++++++++++ .../src/mage/player/human/HumanPlayer.java | 2 +- Mage.Sets/src/mage/cards/b/BatheInLight.java | 2 +- .../src/mage/cards/b/BrandOfIllOmen.java | 3 ++- .../src/mage/cards/d/DesperateGambit.java | 17 +++++++++-------- Mage.Sets/src/mage/cards/e/EyeForAnEye.java | 2 +- .../src/mage/cards/g/GreenerPastures.java | 2 +- Mage.Sets/src/mage/cards/h/HiredGiant.java | 2 +- Mage.Sets/src/mage/cards/i/IceCave.java | 2 +- .../mage/cards/k/KazarovSengirPureblood.java | 2 +- .../src/mage/cards/m/MairsilThePretender.java | 3 ++- Mage.Sets/src/mage/cards/m/MirrorStrike.java | 5 ++++- .../src/mage/cards/m/MyrBattlesphere.java | 2 +- Mage.Sets/src/mage/cards/r/RagingRiver.java | 3 ++- .../src/mage/cards/s/ScarwoodBandits.java | 2 +- .../src/mage/cards/s/SeasonOfTheWitch.java | 2 +- Mage.Sets/src/mage/cards/s/SivvisValor.java | 2 +- Mage.Sets/src/mage/cards/s/SkySwallower.java | 2 +- .../src/mage/cards/s/SpiritualFocus.java | 3 ++- Mage.Sets/src/mage/cards/t/TalonOfPain.java | 2 +- Mage.Sets/src/mage/cards/t/TidalFlats.java | 3 ++- .../src/mage/cards/t/TreacherousLink.java | 2 +- Mage.Sets/src/mage/cards/t/Typhoon.java | 2 +- Mage.Sets/src/mage/cards/v/VoidMaw.java | 2 +- .../src/mage/cards/w/WatchersOfTheDead.java | 2 +- .../java/org/mage/test/player/TestPlayer.java | 19 ++++++++++++++++++- .../java/org/mage/test/stub/PlayerStub.java | 18 ++++++++++++++++++ Mage/src/main/java/mage/game/GameState.java | 4 ++-- .../java/mage/game/combat/CombatGroup.java | 9 +++------ .../command/planes/EdgeOfMalacolPlane.java | 3 ++- .../main/java/mage/players/PlayerImpl.java | 2 +- ...kedByOnlyOneCreatureThisCombatWatcher.java | 9 +++------ 36 files changed, 115 insertions(+), 75 deletions(-) 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 d428ad1f65..4d69a16ce8 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/images/CardDownloadData.java b/Mage.Client/src/main/java/org/mage/plugins/card/images/CardDownloadData.java index f78417a845..5016db5b61 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; 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 b784adc6cb..15f8a25737 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.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java index d3785cfa65..5d599003ab 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 63f207e896..fd18966864 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 @@ -2482,4 +2482,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 de2363ce9c..bd09c81fa1 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/b/BatheInLight.java b/Mage.Sets/src/mage/cards/b/BatheInLight.java index 15ee51eb88..7317708635 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 ff50756639..0b66aafdaa 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 3dde02e293..bee7635cb4 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/e/EyeForAnEye.java b/Mage.Sets/src/mage/cards/e/EyeForAnEye.java index 9c62933fbf..697dff7b4f 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 83af2758f6..2ae29036f2 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/HiredGiant.java b/Mage.Sets/src/mage/cards/h/HiredGiant.java index be57e3f3bd..baefbbb01e 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/IceCave.java b/Mage.Sets/src/mage/cards/i/IceCave.java index bcdf7f4d6f..42594825f9 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 9213c61956..ad9497028f 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 5d59ec7163..f0e955abb1 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/MirrorStrike.java b/Mage.Sets/src/mage/cards/m/MirrorStrike.java index 5d9e519104..9292fbd182 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 2edd62e9a1..cade2aa34f 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/r/RagingRiver.java b/Mage.Sets/src/mage/cards/r/RagingRiver.java index f578960b3a..0357c35e02 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 09c803e225..187b5212f6 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/SeasonOfTheWitch.java b/Mage.Sets/src/mage/cards/s/SeasonOfTheWitch.java index e2bc1e7c4f..b65c850553 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/SivvisValor.java b/Mage.Sets/src/mage/cards/s/SivvisValor.java index c63a2b21f1..11f98de471 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 0044c72585..43c5758a8c 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/SpiritualFocus.java b/Mage.Sets/src/mage/cards/s/SpiritualFocus.java index 5e14d68ba2..33ec0a0d01 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/t/TalonOfPain.java b/Mage.Sets/src/mage/cards/t/TalonOfPain.java index b4c1df248e..ddba456b3a 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 d33db8fa39..60d0f3cc77 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/TreacherousLink.java b/Mage.Sets/src/mage/cards/t/TreacherousLink.java index f5b7ed121f..db60b79c50 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 2d17c5fc5b..4dea13bd3f 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 a2e4aa8892..e6ac6ce080 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 0e82384d38..0bd0af1137 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.Tests/src/test/java/org/mage/test/player/TestPlayer.java b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java index e0eadcb549..79cf55db7f 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 354b9a88ac..7eebfc498a 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/game/GameState.java b/Mage/src/main/java/mage/game/GameState.java index 384d07ab19..d10618d2de 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 c66dcd0c06..e1f003e1d8 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 9caa2b5677..23146f6995 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/players/PlayerImpl.java b/Mage/src/main/java/mage/players/PlayerImpl.java index c850a67fcb..87a78ad1bb 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 3e91f1f0b0..945a50e245 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); } } From 7cb90e2475f0f98f5cbcc7ab6280d5004618b906 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sat, 28 Apr 2018 22:23:10 +0400 Subject: [PATCH 11/26] * Fixed same images download bug for basic lands in Star Wars set. --- .../card/dl/sources/GrabbagImageSource.java | 1629 +---------------- .../card/dl/sources/ScryfallImageSource.java | 1 - .../plugins/card/images/CardDownloadData.java | 4 + Mage.Sets/src/mage/sets/StarWars.java | 41 +- 4 files changed, 55 insertions(+), 1620 deletions(-) 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 ef5fa334df..b94fa2c26c 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"); @@ -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 353ecde35a..3a43aec961 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 5016db5b61..08c0a25587 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 @@ -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.Sets/src/mage/sets/StarWars.java b/Mage.Sets/src/mage/sets/StarWars.java index 0959f928fd..2cfa88c803 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)); } - } From bb3c7232ea3935bd66e95081db693b776356f2f0 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sat, 28 Apr 2018 22:43:28 +0400 Subject: [PATCH 12/26] * [Start Wars] Fixed Obi-Wan Kenobi emblem (viewer, image download); --- .../org/mage/plugins/card/dl/sources/GrabbagImageSource.java | 2 +- Mage.Client/src/main/resources/card-pictures-tok.txt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) 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 b94fa2c26c..f089ae111c 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 @@ -384,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 diff --git a/Mage.Client/src/main/resources/card-pictures-tok.txt b/Mage.Client/src/main/resources/card-pictures-tok.txt index 501c7275aa..754ad351f3 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| From f682bfb5278b17d2b9346d717512fef9e721c883 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sun, 29 Apr 2018 01:20:40 +0400 Subject: [PATCH 13/26] * [Start Wars] Fixed all tokens (viewer, image download); --- Mage.Client/src/main/resources/card-pictures-tok.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Mage.Client/src/main/resources/card-pictures-tok.txt b/Mage.Client/src/main/resources/card-pictures-tok.txt index 754ad351f3..5c59e59c9c 100644 --- a/Mage.Client/src/main/resources/card-pictures-tok.txt +++ b/Mage.Client/src/main/resources/card-pictures-tok.txt @@ -1032,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| From a514f121966246e8401ff4ba4ce653957b84ca7d Mon Sep 17 00:00:00 2001 From: Brik Royster Date: Sat, 28 Apr 2018 16:11:39 -0700 Subject: [PATCH 14/26] Fix Brawl.java banlist comments These cards were banned in 2018 --- .../Mage.Deck.Constructed/src/mage/deck/Brawl.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 0627d07f2b..227f788d4f 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"); } From 54e4c2c484cecc0affc93b87d199aeebe112e35c Mon Sep 17 00:00:00 2001 From: Brik Royster Date: Sat, 28 Apr 2018 17:08:43 -0700 Subject: [PATCH 15/26] Update Standard.java update comments to reflect actual ban date --- .../Mage.Deck.Constructed/src/mage/deck/Standard.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 95af662d1f..54eef0df5d 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"); } From 858362a7b4309208475c2bdedac09de9b28ec016 Mon Sep 17 00:00:00 2001 From: GitHubMage Date: Sun, 29 Apr 2018 17:49:18 +0200 Subject: [PATCH 16/26] minor adjustment to previous fix for AliFromCairo --- Mage.Sets/src/mage/cards/a/AliFromCairo.java | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/Mage.Sets/src/mage/cards/a/AliFromCairo.java b/Mage.Sets/src/mage/cards/a/AliFromCairo.java index cc243fb057..7406471ad3 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; } - } From ec96f8a18efaded8210e11834ce59e5720243c10 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 30 Apr 2018 08:05:17 +0200 Subject: [PATCH 17/26] * AI - Improved nadling of target selection if AI doe smot control the ability itself. --- .../src/main/java/mage/player/ai/ComputerPlayer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 fd18966864..d3285ea480 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 @@ -154,7 +154,7 @@ public class ComputerPlayer extends PlayerImpl implements Player { && target.getAbilityController() != null) { abilityControllerId = target.getAbilityController(); } - UUID randomOpponentId = getRandomOpponent(abilityControllerId, game); + UUID randomOpponentId = getRandomOpponent(target.getTargetController() == null ? abilityControllerId : target.getTargetController(), game); if (target.getOriginalTarget() instanceof TargetPlayer) { return setTargetPlayer(outcome, target, null, sourceId, abilityControllerId, randomOpponentId, game); } @@ -438,7 +438,7 @@ public class ComputerPlayer extends PlayerImpl implements Player { if (target.getAbilityController() != null) { abilityControllerId = target.getAbilityController(); } - UUID randomOpponentId = getRandomOpponent(abilityControllerId, game); + UUID randomOpponentId = getRandomOpponent(target.getTargetController() == null ? source.getControllerId() : target.getTargetController(), game); if (target.getOriginalTarget() instanceof TargetPlayer) { return setTargetPlayer(outcome, target, source, source.getSourceId(), abilityControllerId, randomOpponentId, game); } From dc91d6ff8115907300b5d8f320cb30f87dff02bf Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 30 Apr 2018 08:06:23 +0200 Subject: [PATCH 18/26] * Some updated to Psychic Battle handling. --- Mage.Sets/src/mage/cards/p/PsychicBattle.java | 21 ++++++------------- Mage/src/main/java/mage/game/stack/Spell.java | 1 + .../java/mage/game/stack/StackAbility.java | 1 + .../java/mage/game/stack/StackObjImpl.java | 20 ++++++++---------- 4 files changed, 17 insertions(+), 26 deletions(-) diff --git a/Mage.Sets/src/mage/cards/p/PsychicBattle.java b/Mage.Sets/src/mage/cards/p/PsychicBattle.java index 63332cc39f..ec4e60a465 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/src/main/java/mage/game/stack/Spell.java b/Mage/src/main/java/mage/game/stack/Spell.java index 693b324c91..5a5d4103ec 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 00eabb629a..da87c5d3fb 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 53c689a618..12d49f5749 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 From d535dba2531e809dafed6638eb57122ab18281ac Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 30 Apr 2018 15:50:37 +0200 Subject: [PATCH 19/26] * Scourge of Valkas - Fixed damage source handling. --- .../src/mage/cards/s/ScourgeOfValkas.java | 61 ++++++++++++++++--- 1 file changed, 51 insertions(+), 10 deletions(-) diff --git a/Mage.Sets/src/mage/cards/s/ScourgeOfValkas.java b/Mage.Sets/src/mage/cards/s/ScourgeOfValkas.java index e108894cfc..26ca584cc7 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; + } +} From a05726cdeea6f1195a2ea6e166e2e4fb8b332fd1 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 30 Apr 2018 16:58:22 +0200 Subject: [PATCH 20/26] * Replaced some more wrong card movement handling. --- .../mage/cards/s/ShorecrasherElemental.java | 13 ++++----- .../mage/cards/s/SorinLordOfInnistrad.java | 22 +++++++------- .../mage/cards/s/SovereignsOfLostAlara.java | 18 +++++------- Mage.Sets/src/mage/cards/s/SteamVines.java | 29 ++++++++++--------- .../src/mage/cards/s/StonehewerGiant.java | 19 ++++++------ 5 files changed, 50 insertions(+), 51 deletions(-) diff --git a/Mage.Sets/src/mage/cards/s/ShorecrasherElemental.java b/Mage.Sets/src/mage/cards/s/ShorecrasherElemental.java index e05c34fd25..416b87e61a 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/SorinLordOfInnistrad.java b/Mage.Sets/src/mage/cards/s/SorinLordOfInnistrad.java index f9bad9604f..c54b02ed3d 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 c56d60999b..9680f25c03 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/SteamVines.java b/Mage.Sets/src/mage/cards/s/SteamVines.java index 1efba201ad..c71a070d2f 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 540f8488f4..32395d6f4c 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 +} From bdb0254274d091f86019cf5f7e455c7369db5ae3 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 30 Apr 2018 17:21:36 +0200 Subject: [PATCH 21/26] Added 3 AI suitable decks. --- .../release/sample-decks/AI/FastRedHaste.dck | 77 ++++++++++++ .../release/sample-decks/AI/Poison.dck | 98 +++++++++++++++ .../sample-decks/AI/Zombi & Skeleton.dck | 118 ++++++++++++++++++ 3 files changed, 293 insertions(+) create mode 100644 Mage.Client/release/sample-decks/AI/FastRedHaste.dck create mode 100644 Mage.Client/release/sample-decks/AI/Poison.dck create mode 100644 Mage.Client/release/sample-decks/AI/Zombi & Skeleton.dck 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 0000000000..971dbf13e3 --- /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 0000000000..ef2dcb38b8 --- /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 0000000000..a5c0c8c1e1 --- /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)| From bba243c748125e67d16ab2e9640f00d274af09af Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 30 Apr 2018 22:28:34 +0200 Subject: [PATCH 22/26] * Elderwood Scion - Fixed that second static ability causing game exceptions. --- Mage.Sets/src/mage/cards/e/ElderwoodScion.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Mage.Sets/src/mage/cards/e/ElderwoodScion.java b/Mage.Sets/src/mage/cards/e/ElderwoodScion.java index c85d61823b..a5fa4b5437 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()) { From 940fe603c6f16f111e5e7fed58c9868e87ebf290 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 30 Apr 2018 23:15:48 +0200 Subject: [PATCH 23/26] * Herald's Horn - Fixed that cast cost reduction was also applied to other players. --- Mage.Sets/src/mage/cards/h/HeraldsHorn.java | 19 +++++++++---------- .../cost/SpellsCostReductionAllEffect.java | 13 +++++++++++-- ...CostReductionAllOfChosenSubtypeEffect.java | 6 +++++- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/Mage.Sets/src/mage/cards/h/HeraldsHorn.java b/Mage.Sets/src/mage/cards/h/HeraldsHorn.java index 1ad4c814a3..cadce2f3ce 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/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionAllEffect.java b/Mage/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionAllEffect.java index 0b7af33808..c66870598c 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 71185730ca..4a8fdf40d0 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) { From a69aac2243dbce52fd511f2ba61722d9624bd84f Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Tue, 1 May 2018 01:34:24 +0400 Subject: [PATCH 24/26] Fixed tests and exceptions in AI choose target code --- .../java/mage/player/ai/ComputerPlayer.java | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) 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 d3285ea480..bb2fe8d545 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(target.getTargetController() == null ? abilityControllerId : target.getTargetController(), 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(target.getTargetController() == null ? source.getControllerId() : target.getTargetController(), 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); } From b8357d54ebb114e0c1eda55cd3d8ef632d5445d7 Mon Sep 17 00:00:00 2001 From: L_J Date: Mon, 30 Apr 2018 22:19:25 +0000 Subject: [PATCH 25/26] Ice Cauldron MageObjectReference stack tracing fix --- Mage.Sets/src/mage/cards/i/IceCauldron.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/i/IceCauldron.java b/Mage.Sets/src/mage/cards/i/IceCauldron.java index 3cddcda9e1..4ee0fe74ff 100644 --- a/Mage.Sets/src/mage/cards/i/IceCauldron.java +++ b/Mage.Sets/src/mage/cards/i/IceCauldron.java @@ -242,7 +242,15 @@ class IceCauldronAddManaEffect extends ManaEffect { 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); - IceCauldronConditionalMana iceCauldronMana = new IceCauldronConditionalMana(storedMana, exiledCardMor.getCard(game)); + + 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; From 0ceb5fc88f5db45224138558cf8b84166ce9d45d Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 1 May 2018 00:55:46 +0200 Subject: [PATCH 26/26] * Drain Power - Improved conditonal mana handling. --- Mage.Sets/src/mage/cards/d/DrainPower.java | 37 ++++++++------ .../mage/cards/t/TorgaarFamineIncarnate.java | 50 ------------------- .../AddConditionalManaOfAnyColorEffect.java | 6 +-- Mage/src/main/java/mage/players/ManaPool.java | 12 ++++- 4 files changed, 35 insertions(+), 70 deletions(-) diff --git a/Mage.Sets/src/mage/cards/d/DrainPower.java b/Mage.Sets/src/mage/cards/d/DrainPower.java index dd74c601ca..5cc297b22c 100644 --- a/Mage.Sets/src/mage/cards/d/DrainPower.java +++ b/Mage.Sets/src/mage/cards/d/DrainPower.java @@ -32,7 +32,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; -import mage.Mana; import mage.abilities.Ability; import mage.abilities.ActivatedAbility; import mage.abilities.costs.mana.ManaCost; @@ -42,11 +41,13 @@ 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; @@ -58,7 +59,7 @@ import mage.target.TargetPlayer; public class DrainPower extends CardImpl { public DrainPower(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{U}{U}"); + 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()); @@ -76,11 +77,11 @@ public class DrainPower extends CardImpl { } class DrainPowerEffect extends OneShotEffect { - + private static final FilterLandPermanent filter = new FilterLandPermanent(); public DrainPowerEffect() { - super(Outcome.Tap); + 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"; } @@ -100,7 +101,7 @@ class DrainPowerEffect extends OneShotEffect { 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)) { @@ -131,9 +132,9 @@ class DrainPowerEffect extends OneShotEffect { if (manaAbilitiesMap.isEmpty()) { break; } - - List permList = new ArrayList(manaAbilitiesMap.keySet()); - Permanent permanent = null; + + 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)); @@ -149,9 +150,9 @@ class DrainPowerEffect extends OneShotEffect { 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)) { + 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)) { @@ -163,14 +164,18 @@ class DrainPowerEffect extends OneShotEffect { } } } - - // 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 + + // 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 - Mana mana = targetPlayer.getManaPool().getMana(); + List manaItems = targetPlayer.getManaPool().getManaItems(); targetPlayer.getManaPool().emptyPool(game); - controller.getManaPool().addMana(mana, game, source); + 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/t/TorgaarFamineIncarnate.java b/Mage.Sets/src/mage/cards/t/TorgaarFamineIncarnate.java index f3e0e18876..5a8751e4d9 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/src/main/java/mage/abilities/effects/common/AddConditionalManaOfAnyColorEffect.java b/Mage/src/main/java/mage/abilities/effects/common/AddConditionalManaOfAnyColorEffect.java index 3f683a25de..02964f7426 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/players/ManaPool.java b/Mage/src/main/java/mage/players/ManaPool.java index 565e96cac2..2448b8a922 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; + } + }