From dea874e27864e5d6fbc6a419e39de70826b7c795 Mon Sep 17 00:00:00 2001 From: Paul Barrett Date: Fri, 23 Mar 2018 21:47:37 -0500 Subject: [PATCH 001/158] Attempted fix for Momir Free For All Work for #1955 --- .../Mage.Game.MomirGame/src/mage/game/MomirGame.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Mage.Server.Plugins/Mage.Game.MomirGame/src/mage/game/MomirGame.java b/Mage.Server.Plugins/Mage.Game.MomirGame/src/mage/game/MomirGame.java index 5627da16952..42dd12b3271 100644 --- a/Mage.Server.Plugins/Mage.Game.MomirGame/src/mage/game/MomirGame.java +++ b/Mage.Server.Plugins/Mage.Game.MomirGame/src/mage/game/MomirGame.java @@ -49,7 +49,7 @@ import mage.players.Player; * * @author nigelzor */ -public class MomirGame extends FreeForAll { +public class MomirGame extends GameImpl { private int numPlayers; @@ -96,6 +96,11 @@ public class MomirGame extends FreeForAll { } return opponents; } + + @Override + public boolean isOpponent(Player player, UUID playerToCheck) { + return !player.getId().equals(playerToCheck) && player.getInRange().contains(playerToCheck); + } @Override public MomirGame copy() { From 99744eb919bf3246418dbe80594a25651c9dd446 Mon Sep 17 00:00:00 2001 From: L_J Date: Wed, 18 Apr 2018 03:08:53 +0000 Subject: [PATCH 002/158] 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 00000000000..879431465ab --- /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 003/158] 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 0461631cf4a..b25801592b1 100644 --- a/Mage.Sets/src/mage/sets/IceAge.java +++ b/Mage.Sets/src/mage/sets/IceAge.java @@ -176,6 +176,7 @@ public class IceAge extends ExpansionSet { cards.add(new SetCardInfo("Hyalopterous Lemure", 21, Rarity.UNCOMMON, mage.cards.h.HyalopterousLemure.class)); cards.add(new SetCardInfo("Hydroblast", 72, Rarity.COMMON, mage.cards.h.Hydroblast.class)); cards.add(new SetCardInfo("Hymn of Rebirth", 373, Rarity.UNCOMMON, mage.cards.h.HymnOfRebirth.class)); + cards.add(new SetCardInfo("Ice Cauldron", 296, Rarity.RARE, mage.cards.i.IceCauldron.class)); cards.add(new SetCardInfo("Ice Floe", 333, Rarity.UNCOMMON, mage.cards.i.IceFloe.class)); cards.add(new SetCardInfo("Iceberg", 73, Rarity.UNCOMMON, mage.cards.i.Iceberg.class)); cards.add(new SetCardInfo("Icequake", 22, Rarity.UNCOMMON, mage.cards.i.Icequake.class)); From 6579354d2b84730eb0d9bc8fe5b3bcbcbee381ce Mon Sep 17 00:00:00 2001 From: L_J Date: Wed, 18 Apr 2018 03:26:00 +0000 Subject: [PATCH 004/158] 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 e06cd8e06cd..dc6ee017eb6 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 005/158] 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 879431465ab..3cddcda9e13 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 9f5249cc737cd8a2b68db676e672908f91af4eb2 Mon Sep 17 00:00:00 2001 From: L_J Date: Thu, 19 Apr 2018 18:43:09 +0000 Subject: [PATCH 006/158] Implemented Psychic Battle --- Mage/src/main/java/mage/game/stack/StackObject.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Mage/src/main/java/mage/game/stack/StackObject.java b/Mage/src/main/java/mage/game/stack/StackObject.java index 7268f9ab03b..156db54c597 100644 --- a/Mage/src/main/java/mage/game/stack/StackObject.java +++ b/Mage/src/main/java/mage/game/stack/StackObject.java @@ -52,6 +52,10 @@ public interface StackObject extends MageObject, Controllable { boolean chooseNewTargets(Game game, UUID playerId, boolean forceChange, boolean onlyOneTarget, FilterPermanent filterNewTarget); StackObject createCopyOnStack(Game game, Ability source, UUID newControllerId, boolean chooseNewTargets); + + boolean isTargetChanged(); + + void setTargetChanged(boolean targetChanged); @Override StackObject copy(); From f64ec46742bbe2aa67cdc247b7266dfae5518f7a Mon Sep 17 00:00:00 2001 From: L_J Date: Thu, 19 Apr 2018 18:46:33 +0000 Subject: [PATCH 007/158] Implemented Psychic Battle --- Mage/src/main/java/mage/game/stack/StackObjImpl.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Mage/src/main/java/mage/game/stack/StackObjImpl.java b/Mage/src/main/java/mage/game/stack/StackObjImpl.java index 25a3088eab7..f21b3ecc3b9 100644 --- a/Mage/src/main/java/mage/game/stack/StackObjImpl.java +++ b/Mage/src/main/java/mage/game/stack/StackObjImpl.java @@ -27,6 +27,8 @@ import java.util.UUID; * @author LevelX2 */ public abstract class StackObjImpl implements StackObject { + + private boolean targetChanged; // for Psychic Battle /** * Choose new targets for a stack Object @@ -271,4 +273,14 @@ public abstract class StackObjImpl implements StackObject { @Override public void removePTCDA() { } + + @Override + public boolean isTargetChanged() { + return targetChanged; + } + + @Override + public void setTargetChanged(boolean targetChanged) { + this.targetChanged = targetChanged; + } } From ece9bc77dd764a83558a305502c842e3422e7cb6 Mon Sep 17 00:00:00 2001 From: L_J Date: Thu, 19 Apr 2018 18:49:59 +0000 Subject: [PATCH 008/158] Implemented Psychic Battle --- Mage.Sets/src/mage/cards/p/PsychicBattle.java | 178 ++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/p/PsychicBattle.java diff --git a/Mage.Sets/src/mage/cards/p/PsychicBattle.java b/Mage.Sets/src/mage/cards/p/PsychicBattle.java new file mode 100644 index 00000000000..63332cc39fe --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/PsychicBattle.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.p; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import mage.MageObject; +import mage.abilities.Ability; +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.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; + +/** + * + * @author L_J + */ +public class PsychicBattle extends CardImpl { + + public PsychicBattle(UUID ownerId, CardSetInfo setInfo) { + 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()); + } + + public PsychicBattle(final PsychicBattle card) { + super(card); + } + + @Override + public PsychicBattle copy() { + return new PsychicBattle(this); + } +} + +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); + } + + public PsychicBattleTriggeredAbility(PsychicBattleTriggeredAbility ability) { + super(ability); + } + + @Override + public PsychicBattleTriggeredAbility copy() { + return new PsychicBattleTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.TARGETED; + } + + @Override + 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))) { + this.getEffects().get(0).setTargetPointer(new FixedTarget(event.getSourceId())); + stackObject.setTargetChanged(false); // resets the targetChanged flag + return true; + } + } + return false; + } + + @Override + public String getRule() { + return "Whenever a player chooses one or more targets, " + super.getRule() + " Changing targets this way doesn't trigger abilities of permanents named Psychic Battle."; + } +} + +class PsychicBattleEffect extends OneShotEffect { + + public PsychicBattleEffect() { + super(Outcome.Neutral); + 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"; + } + + public PsychicBattleEffect(final PsychicBattleEffect effect) { + super(effect); + } + + @Override + public PsychicBattleEffect copy() { + return new PsychicBattleEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + MageObject sourceObject = game.getObject(source.getSourceId()); + if (sourceObject != null) { + Map manacostMap = new HashMap<>(); + for (UUID playerId : game.getState().getPlayersInRange(source.getControllerId(), game)) { + Player player = game.getPlayer(playerId); + if (player != null && player.getLibrary().hasCards()) { + Card card = player.getLibrary().getFromTop(game); + player.revealCards(sourceObject.getIdName() + " (" + player.getName() + ')', new CardsImpl(card), game); + manacostMap.put(player, card.getConvertedManaCost()); + } + } + + Player highestCostPlayer = null; + int maxValue = Collections.max(manacostMap.values()); + boolean tie = false; + for (Map.Entry entry : manacostMap.entrySet()) { + if (entry.getValue() == maxValue) { + if (highestCostPlayer != null) { // the result is tied, so nobody changes the targets + tie = true; + break; + } else { + highestCostPlayer = entry.getKey(); + } + } + } + + if (highestCostPlayer != null && !tie) { + StackObject stackObject = game.getStack().getStackObject(this.getTargetPointer().getFirst(game, source)); + if (stackObject != null) { + stackObject.setTargetChanged(true); // this makes the new target "invisible" for the Psychic Battle ability + stackObject.chooseNewTargets(game, highestCostPlayer.getId(), false, false, null); + } + return true; + } + return tie; + } + return false; + } +} From afdc1e72766106a2fdf1df1a622cc33782ee3f72 Mon Sep 17 00:00:00 2001 From: L_J Date: Thu, 19 Apr 2018 18:51:16 +0000 Subject: [PATCH 009/158] Implemented Psychic Battle --- Mage.Sets/src/mage/sets/Invasion.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Mage.Sets/src/mage/sets/Invasion.java b/Mage.Sets/src/mage/sets/Invasion.java index 8e7acf64f84..2f764f768a1 100644 --- a/Mage.Sets/src/mage/sets/Invasion.java +++ b/Mage.Sets/src/mage/sets/Invasion.java @@ -236,6 +236,7 @@ public class Invasion extends ExpansionSet { cards.add(new SetCardInfo("Probe", 66, Rarity.COMMON, mage.cards.p.Probe.class)); cards.add(new SetCardInfo("Prohibit", 67, Rarity.COMMON, mage.cards.p.Prohibit.class)); cards.add(new SetCardInfo("Protective Sphere", 26, Rarity.COMMON, mage.cards.p.ProtectiveSphere.class)); + cards.add(new SetCardInfo("Psychic Battle", 68, Rarity.RARE, mage.cards.p.PsychicBattle.class)); cards.add(new SetCardInfo("Pure Reflection", 27, Rarity.RARE, mage.cards.p.PureReflection.class)); cards.add(new SetCardInfo("Pyre Zombie", 261, Rarity.RARE, mage.cards.p.PyreZombie.class)); cards.add(new SetCardInfo("Quirion Elves", 203, Rarity.COMMON, mage.cards.q.QuirionElves.class)); From c96d63c734a0ca78f04e8cd6c061e1f54c63d738 Mon Sep 17 00:00:00 2001 From: Thomas Contis Date: Tue, 24 Apr 2018 19:48:20 -0400 Subject: [PATCH 010/158] Implemented Cephalid Snitch (Torment) --- .../src/mage/cards/c/CephalidSnitch.java | 73 +++++++++++++++++++ Mage.Sets/src/mage/sets/Torment.java | 1 + 2 files changed, 74 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/CephalidSnitch.java diff --git a/Mage.Sets/src/mage/cards/c/CephalidSnitch.java b/Mage.Sets/src/mage/cards/c/CephalidSnitch.java new file mode 100644 index 00000000000..fc328edb8bc --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CephalidSnitch.java @@ -0,0 +1,73 @@ +/* + * 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.c; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.LoseAbilityTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.ProtectionAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author tcontis + */ +public class CephalidSnitch extends CardImpl { + + public CephalidSnitch(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{U}"); + this.subtype.add(SubType.CEPHALID); + this.subtype.add(SubType.WIZARD); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Sacrifice Cephalid Snitch: Target creature loses protection from black until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new LoseAbilityTargetEffect( + ProtectionAbility.from(ObjectColor.BLACK), Duration.EndOfTurn), new SacrificeSourceCost()); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public CephalidSnitch(final CephalidSnitch card) { + super(card); + } + + @Override + public CephalidSnitch copy() { + return new CephalidSnitch(this); + } +} diff --git a/Mage.Sets/src/mage/sets/Torment.java b/Mage.Sets/src/mage/sets/Torment.java index 8bb64ddaf9f..6d69b7240b0 100644 --- a/Mage.Sets/src/mage/sets/Torment.java +++ b/Mage.Sets/src/mage/sets/Torment.java @@ -77,6 +77,7 @@ public class Torment extends ExpansionSet { cards.add(new SetCardInfo("Cephalid Aristocrat", 27, Rarity.COMMON, mage.cards.c.CephalidAristocrat.class)); cards.add(new SetCardInfo("Cephalid Illusionist", 28, Rarity.UNCOMMON, mage.cards.c.CephalidIllusionist.class)); cards.add(new SetCardInfo("Cephalid Sage", 29, Rarity.UNCOMMON, mage.cards.c.CephalidSage.class)); + cards.add(new SetCardInfo("Cephalid Snitch", 30, Rarity.COMMON, mage.cards.c.CephalidSnitch.class)); cards.add(new SetCardInfo("Cephalid Vandal", 31, Rarity.RARE, mage.cards.c.CephalidVandal.class)); cards.add(new SetCardInfo("Chainer, Dementia Master", 56, Rarity.RARE, mage.cards.c.ChainerDementiaMaster.class)); cards.add(new SetCardInfo("Chainer's Edict", 57, Rarity.UNCOMMON, mage.cards.c.ChainersEdict.class)); From a0adf23765299708ccef92ea98638d4ce1e8f925 Mon Sep 17 00:00:00 2001 From: Thomas Contis Date: Tue, 24 Apr 2018 19:48:20 -0400 Subject: [PATCH 011/158] Implemented Cephalid Snitch (Torment) --- .../src/mage/cards/c/CephalidSnitch.java | 73 +++++++++++++++++++ Mage.Sets/src/mage/sets/Torment.java | 1 + 2 files changed, 74 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/CephalidSnitch.java diff --git a/Mage.Sets/src/mage/cards/c/CephalidSnitch.java b/Mage.Sets/src/mage/cards/c/CephalidSnitch.java new file mode 100644 index 00000000000..fc328edb8bc --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CephalidSnitch.java @@ -0,0 +1,73 @@ +/* + * 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.c; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.LoseAbilityTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.ProtectionAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author tcontis + */ +public class CephalidSnitch extends CardImpl { + + public CephalidSnitch(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{U}"); + this.subtype.add(SubType.CEPHALID); + this.subtype.add(SubType.WIZARD); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Sacrifice Cephalid Snitch: Target creature loses protection from black until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new LoseAbilityTargetEffect( + ProtectionAbility.from(ObjectColor.BLACK), Duration.EndOfTurn), new SacrificeSourceCost()); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public CephalidSnitch(final CephalidSnitch card) { + super(card); + } + + @Override + public CephalidSnitch copy() { + return new CephalidSnitch(this); + } +} diff --git a/Mage.Sets/src/mage/sets/Torment.java b/Mage.Sets/src/mage/sets/Torment.java index 8bb64ddaf9f..6d69b7240b0 100644 --- a/Mage.Sets/src/mage/sets/Torment.java +++ b/Mage.Sets/src/mage/sets/Torment.java @@ -77,6 +77,7 @@ public class Torment extends ExpansionSet { cards.add(new SetCardInfo("Cephalid Aristocrat", 27, Rarity.COMMON, mage.cards.c.CephalidAristocrat.class)); cards.add(new SetCardInfo("Cephalid Illusionist", 28, Rarity.UNCOMMON, mage.cards.c.CephalidIllusionist.class)); cards.add(new SetCardInfo("Cephalid Sage", 29, Rarity.UNCOMMON, mage.cards.c.CephalidSage.class)); + cards.add(new SetCardInfo("Cephalid Snitch", 30, Rarity.COMMON, mage.cards.c.CephalidSnitch.class)); cards.add(new SetCardInfo("Cephalid Vandal", 31, Rarity.RARE, mage.cards.c.CephalidVandal.class)); cards.add(new SetCardInfo("Chainer, Dementia Master", 56, Rarity.RARE, mage.cards.c.ChainerDementiaMaster.class)); cards.add(new SetCardInfo("Chainer's Edict", 57, Rarity.UNCOMMON, mage.cards.c.ChainersEdict.class)); From 7e9e78fee467d1ca900fdd2aef321e6eab0e9841 Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Fri, 27 Apr 2018 00:42:21 -0400 Subject: [PATCH 012/158] Update AtarkaMonument.java The turn into a 4/4 dragon ability wasn't working as expected. It was only turning it into a dragon and giving it flying ability, but the rest of the effects never took place. --- Mage.Sets/src/mage/cards/a/AtarkaMonument.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Mage.Sets/src/mage/cards/a/AtarkaMonument.java b/Mage.Sets/src/mage/cards/a/AtarkaMonument.java index 65e7fd63606..10f2d52cebb 100644 --- a/Mage.Sets/src/mage/cards/a/AtarkaMonument.java +++ b/Mage.Sets/src/mage/cards/a/AtarkaMonument.java @@ -74,13 +74,13 @@ public class AtarkaMonument extends CardImpl { private static class AtarkaMonumentToken extends TokenImpl { AtarkaMonumentToken() { super("", "4/4 red and green Dragon artifact creature with flying"); - cardType.add(CardType.ARTIFACT); - cardType.add(CardType.CREATURE); - color.setRed(true); - color.setGreen(true); + this.cardType.add(CardType.ARTIFACT); + this.cardType.add(CardType.CREATURE); + this.color.setRed(true); + this.color.setGreen(true); this.subtype.add(SubType.DRAGON); - power = new MageInt(4); - toughness = new MageInt(4); + this.power = new MageInt(4); + this.toughness = new MageInt(4); this.addAbility(FlyingAbility.getInstance()); } public AtarkaMonumentToken(final AtarkaMonumentToken token) { @@ -91,4 +91,4 @@ public class AtarkaMonument extends CardImpl { return new AtarkaMonumentToken(this); } } -} \ No newline at end of file +} From 59b9449fb904edc68b7ad107ba1b5dc229776324 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 28 Apr 2018 00:30:28 +0200 Subject: [PATCH 013/158] * Some rework of filter hanmdling. --- .../src/mage/cards/c/ConjurersBauble.java | 18 +++++------------ .../src/mage/cards/n/NostalgicDreams.java | 20 ++++++++++--------- .../src/mage/cards/r/RelicOfProgenitus.java | 6 +++--- Mage.Sets/src/mage/cards/r/Restock.java | 7 +++---- .../src/mage/cards/s/SeedsOfRenewal.java | 4 ++-- Mage.Sets/src/mage/cards/w/WildestDreams.java | 6 +++--- .../effects/common/DoIfCostPaid.java | 1 + .../main/java/mage/filter/StaticFilters.java | 7 +++++++ .../common/TargetCardInYourGraveyard.java | 10 +++++----- 9 files changed, 40 insertions(+), 39 deletions(-) diff --git a/Mage.Sets/src/mage/cards/c/ConjurersBauble.java b/Mage.Sets/src/mage/cards/c/ConjurersBauble.java index 87d3db4fe0b..5b80d4da2f3 100644 --- a/Mage.Sets/src/mage/cards/c/ConjurersBauble.java +++ b/Mage.Sets/src/mage/cards/c/ConjurersBauble.java @@ -37,10 +37,8 @@ import mage.abilities.effects.common.PutOnLibraryTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.TargetController; import mage.constants.Zone; -import mage.filter.FilterCard; -import mage.filter.predicate.other.OwnerPredicate; +import mage.filter.StaticFilters; import mage.target.common.TargetCardInYourGraveyard; /** @@ -48,22 +46,16 @@ import mage.target.common.TargetCardInYourGraveyard; * @author jeffwadsworth */ public class ConjurersBauble extends CardImpl { - - private static final FilterCard filter = new FilterCard("card from your graveyard"); - - static { - filter.add(new OwnerPredicate(TargetController.YOU)); - } - + static final String rule = "Put up to one target card from your graveyard on the bottom of your library"; public ConjurersBauble(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{1}"); - + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}"); + // {tap}, Sacrifice Conjurer's Bauble: Put up to one target card from your graveyard on the bottom of your library. Draw a card. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutOnLibraryTargetEffect(false, rule), new TapSourceCost()); ability.addCost(new SacrificeSourceCost()); - ability.addTarget(new TargetCardInYourGraveyard(0, 1, filter)); + ability.addTarget(new TargetCardInYourGraveyard(0, 1, StaticFilters.FILTER_CARD_FROM_YOUR_GRAVEYARD)); ability.addEffect(new DrawCardSourceControllerEffect(1)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/n/NostalgicDreams.java b/Mage.Sets/src/mage/cards/n/NostalgicDreams.java index 64914ea3ed7..4799c0dad2b 100644 --- a/Mage.Sets/src/mage/cards/n/NostalgicDreams.java +++ b/Mage.Sets/src/mage/cards/n/NostalgicDreams.java @@ -29,6 +29,7 @@ package mage.cards.n; import java.util.UUID; import mage.abilities.Ability; +import mage.abilities.SpellAbility; import mage.abilities.costs.common.DiscardXTargetCost; import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; @@ -38,6 +39,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.filter.FilterCard; +import mage.filter.StaticFilters; import mage.game.Game; import mage.target.Target; import mage.target.common.TargetCardInYourGraveyard; @@ -49,16 +51,15 @@ import mage.target.common.TargetCardInYourGraveyard; public class NostalgicDreams extends CardImpl { public NostalgicDreams(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{G}{G}"); - + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{G}{G}"); // As an additional cost to cast Nostalgic Dreams, discard X cards. this.getSpellAbility().addCost(new DiscardXTargetCost(new FilterCard("cards"), true)); - // Return X target cards from your graveyard to your hand. Exile Nostalgic Dreams. + // Return X target cards from your graveyard to your hand. Effect effect = new ReturnFromGraveyardToHandTargetEffect(); effect.setText("Return X target cards from your graveyard to your hand"); - this.getSpellAbility().addEffect(effect); - + this.getSpellAbility().addEffect(effect); + // Exile Nostalgic Dreams. this.getSpellAbility().addEffect(ExileSpellEffect.getInstance()); } @@ -69,11 +70,12 @@ public class NostalgicDreams extends CardImpl { @Override public void adjustTargets(Ability ability, Game game) { - int xValue = new GetXValue().calculate(game, ability, null); -// if (xValue > 0) { - Target target = new TargetCardInYourGraveyard(xValue, new FilterCard("card from your graveyard")); + if (ability instanceof SpellAbility) { + int xValue = new GetXValue().calculate(game, ability, null); + Target target = new TargetCardInYourGraveyard(xValue, StaticFilters.FILTER_CARD_FROM_YOUR_GRAVEYARD); ability.addTarget(target); -// } + } + } @Override diff --git a/Mage.Sets/src/mage/cards/r/RelicOfProgenitus.java b/Mage.Sets/src/mage/cards/r/RelicOfProgenitus.java index d71fd5df411..4f8e73aec56 100644 --- a/Mage.Sets/src/mage/cards/r/RelicOfProgenitus.java +++ b/Mage.Sets/src/mage/cards/r/RelicOfProgenitus.java @@ -51,19 +51,19 @@ import mage.target.common.TargetCardInGraveyard; /** * - * @author jonubuu + * @author jonubuu */ public class RelicOfProgenitus extends CardImpl { public RelicOfProgenitus(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{1}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}"); // {tap}: Target player exiles a card from their graveyard. Ability firstAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, new RelicOfProgenitusEffect(), new TapSourceCost()); firstAbility.addTarget(new TargetPlayer()); this.addAbility(firstAbility); // {1}, Exile Relic of Progenitus: Exile all cards from all graveyards. Draw a card. - Ability secondAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileGraveyardAllPlayersEffect(),new GenericManaCost(1)); + Ability secondAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileGraveyardAllPlayersEffect(), new GenericManaCost(1)); secondAbility.addCost(new ExileSourceCost()); secondAbility.addEffect(new DrawCardSourceControllerEffect(1)); this.addAbility(secondAbility); diff --git a/Mage.Sets/src/mage/cards/r/Restock.java b/Mage.Sets/src/mage/cards/r/Restock.java index e2ca9aaa418..ad176cd16df 100644 --- a/Mage.Sets/src/mage/cards/r/Restock.java +++ b/Mage.Sets/src/mage/cards/r/Restock.java @@ -34,7 +34,7 @@ import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.FilterCard; +import mage.filter.StaticFilters; import mage.target.common.TargetCardInYourGraveyard; /** @@ -44,14 +44,13 @@ import mage.target.common.TargetCardInYourGraveyard; public class Restock extends CardImpl { public Restock(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{3}{G}{G}"); - + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{G}{G}"); // Return two target cards from your graveyard to your hand. Exile Restock. Effect effect = new ReturnFromGraveyardToHandTargetEffect(); effect.setText("Return two target cards from your graveyard to your hand"); this.getSpellAbility().addEffect(effect); - this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(2, new FilterCard("card from your graveyard"))); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(2, StaticFilters.FILTER_CARD_FROM_YOUR_GRAVEYARD)); this.getSpellAbility().addEffect(ExileSpellEffect.getInstance()); } diff --git a/Mage.Sets/src/mage/cards/s/SeedsOfRenewal.java b/Mage.Sets/src/mage/cards/s/SeedsOfRenewal.java index 98fcb0273c5..740b8214042 100644 --- a/Mage.Sets/src/mage/cards/s/SeedsOfRenewal.java +++ b/Mage.Sets/src/mage/cards/s/SeedsOfRenewal.java @@ -35,7 +35,7 @@ import mage.abilities.keyword.UndauntedAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.FilterCard; +import mage.filter.StaticFilters; import mage.target.common.TargetCardInYourGraveyard; /** @@ -53,7 +53,7 @@ public class SeedsOfRenewal extends CardImpl { Effect effect = new ReturnFromGraveyardToHandTargetEffect(); effect.setText("Return up to two target cards from your graveyard to your hand"); this.getSpellAbility().addEffect(effect); - this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0, 2, new FilterCard("card from your graveyard"))); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0, 2, StaticFilters.FILTER_CARD_FROM_YOUR_GRAVEYARD)); this.getSpellAbility().addEffect(ExileSpellEffect.getInstance()); } diff --git a/Mage.Sets/src/mage/cards/w/WildestDreams.java b/Mage.Sets/src/mage/cards/w/WildestDreams.java index 21e5357ef76..a516d080d3c 100644 --- a/Mage.Sets/src/mage/cards/w/WildestDreams.java +++ b/Mage.Sets/src/mage/cards/w/WildestDreams.java @@ -36,7 +36,7 @@ import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.FilterCard; +import mage.filter.StaticFilters; import mage.game.Game; import mage.target.common.TargetCardInYourGraveyard; @@ -47,7 +47,7 @@ import mage.target.common.TargetCardInYourGraveyard; public class WildestDreams extends CardImpl { public WildestDreams(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{X}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{X}{G}"); // Return X target cards from your graveyard to your hand. // Exile Wildest Dreams. @@ -63,7 +63,7 @@ public class WildestDreams extends CardImpl { if (ability instanceof SpellAbility) { int xValue = ability.getManaCostsToPay().getX(); ability.getTargets().clear(); - ability.addTarget(new TargetCardInYourGraveyard(xValue, new FilterCard("card from your graveyard"))); + ability.addTarget(new TargetCardInYourGraveyard(xValue, StaticFilters.FILTER_CARD_FROM_YOUR_GRAVEYARD)); } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/DoIfCostPaid.java b/Mage/src/main/java/mage/abilities/effects/common/DoIfCostPaid.java index bb3c8496625..996f19e597a 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/DoIfCostPaid.java +++ b/Mage/src/main/java/mage/abilities/effects/common/DoIfCostPaid.java @@ -71,6 +71,7 @@ public class DoIfCostPaid extends OneShotEffect { } message = getCostText() + " and " + effectText + '?'; message = Character.toUpperCase(message.charAt(0)) + message.substring(1); + CardUtil.replaceSourceName(message, mageObject.getName()); } else { message = chooseUseText; } diff --git a/Mage/src/main/java/mage/filter/StaticFilters.java b/Mage/src/main/java/mage/filter/StaticFilters.java index 5e0dee3d5c5..6e30403677e 100644 --- a/Mage/src/main/java/mage/filter/StaticFilters.java +++ b/Mage/src/main/java/mage/filter/StaticFilters.java @@ -75,6 +75,13 @@ public final class StaticFilters { static { FILTER_CARD_CREATURE_YOUR_GRAVEYARD.setLockedFilter(true); } + + public static final FilterCard FILTER_CARD_FROM_YOUR_GRAVEYARD = new FilterCard("card from your graveyard"); + + static { + FILTER_CARD_FROM_YOUR_GRAVEYARD.setLockedFilter(true); + } + public static final FilterLandCard FILTER_CARD_LAND = new FilterLandCard(); static { diff --git a/Mage/src/main/java/mage/target/common/TargetCardInYourGraveyard.java b/Mage/src/main/java/mage/target/common/TargetCardInYourGraveyard.java index 0d16c674ad2..b40c02ce270 100644 --- a/Mage/src/main/java/mage/target/common/TargetCardInYourGraveyard.java +++ b/Mage/src/main/java/mage/target/common/TargetCardInYourGraveyard.java @@ -27,20 +27,20 @@ */ package mage.target.common; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; import mage.abilities.Ability; import mage.cards.Card; import mage.cards.Cards; import mage.constants.Zone; import mage.filter.FilterCard; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.events.GameEvent; import mage.players.Player; import mage.target.TargetCard; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; - /** * * @author BetaSteward_at_googlemail.com @@ -48,7 +48,7 @@ import java.util.UUID; public class TargetCardInYourGraveyard extends TargetCard { public TargetCardInYourGraveyard() { - this(1, 1, new FilterCard("card from your graveyard")); + this(1, 1, StaticFilters.FILTER_CARD_FROM_YOUR_GRAVEYARD); } public TargetCardInYourGraveyard(FilterCard filter) { From e9db2a68f1ec913665dc28569593a14eea16dd3a Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 28 Apr 2018 00:31:44 +0200 Subject: [PATCH 014/158] * Greenwarden of Murasa - Fixed "exile if you do" handling (fixes #4475). --- .../src/mage/cards/g/GreenwardenOfMurasa.java | 87 +++++++++---------- 1 file changed, 40 insertions(+), 47 deletions(-) diff --git a/Mage.Sets/src/mage/cards/g/GreenwardenOfMurasa.java b/Mage.Sets/src/mage/cards/g/GreenwardenOfMurasa.java index 26bf8fa207f..217e769da79 100644 --- a/Mage.Sets/src/mage/cards/g/GreenwardenOfMurasa.java +++ b/Mage.Sets/src/mage/cards/g/GreenwardenOfMurasa.java @@ -29,25 +29,17 @@ package mage.cards.g; import java.util.UUID; import mage.MageInt; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.DiesTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.Effect; -import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.ExileSourceEffect; +import mage.abilities.costs.common.ExileSourceFromGraveCost; +import mage.abilities.effects.common.DoIfCostPaid; import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; -import mage.abilities.effects.common.ReturnToHandTargetEffect; -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.game.Game; -import mage.players.Player; import mage.target.common.TargetCardInYourGraveyard; -import mage.target.targetpointer.FixedTarget; /** * @@ -56,7 +48,7 @@ import mage.target.targetpointer.FixedTarget; public class GreenwardenOfMurasa extends CardImpl { public GreenwardenOfMurasa(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{G}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}{G}"); this.subtype.add(SubType.ELEMENTAL); this.power = new MageInt(5); this.toughness = new MageInt(4); @@ -67,7 +59,8 @@ public class GreenwardenOfMurasa extends CardImpl { this.addAbility(ability); // When Greenwarden of Murasa dies, you may exile it. If you do, return target card from your graveyard to your hand. - ability = new DiesTriggeredAbility(new GreenwardenOfMurasaEffect(), false); + ability = new DiesTriggeredAbility(new DoIfCostPaid(new ReturnFromGraveyardToHandTargetEffect(), new ExileSourceFromGraveCost(), + "Exile {this} and return target card from your graveyard to your hand?", true), false); ability.addTarget(new TargetCardInYourGraveyard()); this.addAbility(ability); } @@ -82,38 +75,38 @@ public class GreenwardenOfMurasa extends CardImpl { } } -class GreenwardenOfMurasaEffect extends OneShotEffect { - - public GreenwardenOfMurasaEffect() { - super(Outcome.Benefit); - this.staticText = "you may exile it. If you do, return target card from your graveyard to your hand"; - } - - public GreenwardenOfMurasaEffect(final GreenwardenOfMurasaEffect effect) { - super(effect); - } - - @Override - public GreenwardenOfMurasaEffect copy() { - return new GreenwardenOfMurasaEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = game.getObject(source.getSourceId()); - Card targetCard = game.getCard(getTargetPointer().getFirst(game, source)); - if (controller != null && sourceObject != null && targetCard != null) { - if (controller.chooseUse(outcome, "Exile " + sourceObject.getLogName() + " to return card from your graveyard to your hand?", source, game)) { - // Setting the fixed target prevents to return Greenwarden of Murasa itself (becuase it's exiled meanwhile), - // but of course you can target it as the ability triggers I guess - Effect effect = new ReturnToHandTargetEffect(); - effect.setTargetPointer(new FixedTarget(targetCard.getId(), targetCard.getZoneChangeCounter(game))); - new ExileSourceEffect().apply(game, source); - return effect.apply(game, source); - } - return true; - } - return false; - } -} +//class GreenwardenOfMurasaEffect extends OneShotEffect { +// +// public GreenwardenOfMurasaEffect() { +// super(Outcome.Benefit); +// this.staticText = "you may exile it. If you do, return target card from your graveyard to your hand"; +// } +// +// public GreenwardenOfMurasaEffect(final GreenwardenOfMurasaEffect effect) { +// super(effect); +// } +// +// @Override +// public GreenwardenOfMurasaEffect copy() { +// return new GreenwardenOfMurasaEffect(this); +// } +// +// @Override +// public boolean apply(Game game, Ability source) { +// Player controller = game.getPlayer(source.getControllerId()); +// MageObject sourceObject = game.getObject(source.getSourceId()); +// Card targetCard = game.getCard(getTargetPointer().getFirst(game, source)); +// if (controller != null && sourceObject != null && targetCard != null) { +// if (controller.chooseUse(outcome, "Exile " + sourceObject.getLogName() + " to return card from your graveyard to your hand?", source, game)) { +// // Setting the fixed target prevents to return Greenwarden of Murasa itself (becuase it's exiled meanwhile), +// // but of course you can target it as the ability triggers I guess +// Effect effect = new ReturnToHandTargetEffect(); +// effect.setTargetPointer(new FixedTarget(targetCard.getId(), targetCard.getZoneChangeCounter(game))); +// new ExileSourceEffect().apply(game, source); +// return effect.apply(game, source); +// } +// return true; +// } +// return false; +// } +//} From 7e73cf5d346f659bb154265ac6212af22502d7d4 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 28 Apr 2018 00:52:04 +0200 Subject: [PATCH 015/158] * Mana Vault - Fixed that it doesn't return mana if payment is cancelled (fixes #4473) --- .../effects/common/DoIfCostPaid.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/Mage/src/main/java/mage/abilities/effects/common/DoIfCostPaid.java b/Mage/src/main/java/mage/abilities/effects/common/DoIfCostPaid.java index 996f19e597a..e0882ae4466 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/DoIfCostPaid.java +++ b/Mage/src/main/java/mage/abilities/effects/common/DoIfCostPaid.java @@ -80,6 +80,7 @@ public class DoIfCostPaid extends OneShotEffect { if (cost.canPay(source, source.getSourceId(), player.getId(), game) && executingEffects.size() > 0 && (!optional || player.chooseUse(executingEffects.get(0).getOutcome(), message, source, game))) { cost.clearPaid(); + int bookmark = game.bookmarkState(); if (cost.pay(source, game, source.getSourceId(), player.getId(), false)) { for (Effect effect : executingEffects) { effect.setTargetPointer(this.targetPointer); @@ -90,13 +91,17 @@ public class DoIfCostPaid extends OneShotEffect { } } player.resetStoredBookmark(game); // otherwise you can e.g. undo card drawn with Mentor of the Meek - } else if (!otherwiseEffects.isEmpty()) { - for (Effect effect : otherwiseEffects) { - effect.setTargetPointer(this.targetPointer); - if (effect instanceof OneShotEffect) { - result &= effect.apply(game, source); - } else { - game.addEffect((ContinuousEffect) effect, source); + } else { + // Paying cost was cancels so try to undo payment so far + game.restoreState(bookmark, DoIfCostPaid.class.getName()); + if (!otherwiseEffects.isEmpty()) { + for (Effect effect : otherwiseEffects) { + effect.setTargetPointer(this.targetPointer); + if (effect instanceof OneShotEffect) { + result &= effect.apply(game, source); + } else { + game.addEffect((ContinuousEffect) effect, source); + } } } } From b3d62865d9cf77e9aea38da5a53e3d4d7b751bf4 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 28 Apr 2018 01:13:58 +0200 Subject: [PATCH 016/158] * Fixed a problem of deck generator to use cards from sets not legal to the format (fixes #4642). --- .../client/util/sets/ConstructedFormats.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/Mage.Client/src/main/java/mage/client/util/sets/ConstructedFormats.java b/Mage.Client/src/main/java/mage/client/util/sets/ConstructedFormats.java index ba020a6ffb6..93efaaafba4 100644 --- a/Mage.Client/src/main/java/mage/client/util/sets/ConstructedFormats.java +++ b/Mage.Client/src/main/java/mage/client/util/sets/ConstructedFormats.java @@ -11,7 +11,6 @@ import mage.cards.repository.ExpansionRepository; import mage.constants.SetType; import mage.deck.Standard; - /** * Utility class for constructed formats (expansions and other editions). * @@ -82,14 +81,16 @@ public final class ConstructedFormats { if (STANDARD_CARDS.getSetCodes().contains(set.getCode())) { underlyingSetCodesPerFormat.get(STANDARD).add(set.getCode()); } - if (set.getReleaseDate().after(extendedDate)) { - underlyingSetCodesPerFormat.get(EXTENDED).add(set.getCode()); - } - if (set.getReleaseDate().after(frontierDate)) { - underlyingSetCodesPerFormat.get(FRONTIER).add(set.getCode()); - } - if (set.getReleaseDate().after(modernDate)) { - underlyingSetCodesPerFormat.get(MODERN).add(set.getCode()); + if (set.getType() != SetType.SUPPLEMENTAL_STANDARD_LEGAL) { + if (set.getReleaseDate().after(extendedDate) && (set.getType() == SetType.EXPANSION || set.getType() == SetType.CORE)) { + underlyingSetCodesPerFormat.get(EXTENDED).add(set.getCode()); + } + if (set.getReleaseDate().after(frontierDate) && (set.getType() == SetType.EXPANSION || set.getType() == SetType.CORE)) { + underlyingSetCodesPerFormat.get(FRONTIER).add(set.getCode()); + } + if (set.getReleaseDate().after(modernDate) && (set.getType() == SetType.EXPANSION || set.getType() == SetType.CORE)) { + underlyingSetCodesPerFormat.get(MODERN).add(set.getCode()); + } } } From 1a9f12f5767ce0beeed26a8ff5c8a8f9490c9c47 Mon Sep 17 00:00:00 2001 From: spjspj Date: Sat, 28 Apr 2018 20:37:19 +1000 Subject: [PATCH 017/158] Increase (by 1/3) the chance of getting either a chaos or planar roll for planechase. --- Mage/src/main/java/mage/players/PlayerImpl.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Mage/src/main/java/mage/players/PlayerImpl.java b/Mage/src/main/java/mage/players/PlayerImpl.java index dbd55c6c2f1..4ca624a7554 100644 --- a/Mage/src/main/java/mage/players/PlayerImpl.java +++ b/Mage/src/main/java/mage/players/PlayerImpl.java @@ -2499,7 +2499,7 @@ public abstract class PlayerImpl implements Player, Serializable { @Override public PlanarDieRoll rollPlanarDie(Game game, ArrayList appliedEffects) { - return rollPlanarDie(game, appliedEffects, 1, 1); + return rollPlanarDie(game, appliedEffects, 2, 2); } /** @@ -2514,15 +2514,15 @@ public abstract class PlayerImpl implements Player, Serializable { */ @Override public PlanarDieRoll rollPlanarDie(Game game, ArrayList appliedEffects, int numberChaosSides, int numberPlanarSides) { - int result = RandomUtil.nextInt(6) + 1; + int result = RandomUtil.nextInt(9) + 1; PlanarDieRoll roll = PlanarDieRoll.NIL_ROLL; - if (numberChaosSides + numberPlanarSides > 6) { - numberChaosSides = 1; - numberPlanarSides = 1; + if (numberChaosSides + numberPlanarSides > 9) { + numberChaosSides = 2; + numberPlanarSides = 2; } if (result <= numberChaosSides) { roll = PlanarDieRoll.CHAOS_ROLL; - } else if (result > 6 - numberPlanarSides) { + } else if (result > 9 - numberPlanarSides) { roll = PlanarDieRoll.PLANAR_ROLL; } if (!game.isSimulation()) { From 29605bc5ae1bf81f05e64bd4243afd032808de24 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 28 Apr 2018 13:21:58 +0200 Subject: [PATCH 018/158] * Redirection effect - Added possibility to last for one applyEffect cycle instead of only one absolute use. --- .../src/mage/cards/b/BeaconOfDestiny.java | 7 +-- Mage.Sets/src/mage/cards/c/Carom.java | 22 +++---- .../src/mage/cards/d/DaughterOfAutumn.java | 4 +- .../src/mage/cards/g/GeneralsRegalia.java | 7 +-- Mage.Sets/src/mage/cards/h/HarmsWay.java | 4 +- .../src/mage/cards/h/HazduhrTheAbbot.java | 6 +- Mage.Sets/src/mage/cards/k/KaronasZealot.java | 5 +- Mage.Sets/src/mage/cards/l/LancersEnKor.java | 9 +-- Mage.Sets/src/mage/cards/m/Martyrdom.java | 4 +- Mage.Sets/src/mage/cards/n/NomadsEnKor.java | 7 ++- Mage.Sets/src/mage/cards/n/NovaPentacle.java | 7 +-- Mage.Sets/src/mage/cards/o/OutriderEnKor.java | 9 +-- .../src/mage/cards/p/PersonalIncarnation.java | 6 +- .../src/mage/cards/r/RaziaBorosArchangel.java | 6 +- Mage.Sets/src/mage/cards/s/ShamanEnKor.java | 9 +-- .../src/mage/cards/s/ShimianNightStalker.java | 6 +- Mage.Sets/src/mage/cards/s/ShiningShoal.java | 4 +- Mage.Sets/src/mage/cards/s/SpiritEnKor.java | 7 ++- Mage.Sets/src/mage/cards/v/VassalsDuty.java | 4 +- Mage.Sets/src/mage/cards/w/WardOfPiety.java | 7 ++- Mage.Sets/src/mage/cards/w/WarriorEnKor.java | 7 ++- .../src/mage/cards/z/ZealousInquisitor.java | 5 +- .../src/mage/cards/z/ZhalfirinCrusader.java | 7 ++- .../abilities/effects/RedirectionEffect.java | 61 ++++++++++++++----- ...edirectDamageFromSourceToTargetEffect.java | 4 +- Mage/src/main/java/mage/game/GameState.java | 24 +++++--- 26 files changed, 149 insertions(+), 99 deletions(-) diff --git a/Mage.Sets/src/mage/cards/b/BeaconOfDestiny.java b/Mage.Sets/src/mage/cards/b/BeaconOfDestiny.java index b93b478839b..307143fb4de 100644 --- a/Mage.Sets/src/mage/cards/b/BeaconOfDestiny.java +++ b/Mage.Sets/src/mage/cards/b/BeaconOfDestiny.java @@ -37,20 +37,19 @@ import mage.abilities.effects.RedirectionEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; import mage.game.stack.Spell; import mage.players.Player; import mage.target.TargetPermanent; import mage.target.TargetSource; /** - * + * * @author L_J */ public class BeaconOfDestiny extends CardImpl { @@ -81,7 +80,7 @@ class BeaconOfDestinyEffect extends RedirectionEffect { private final TargetSource damageSource; public BeaconOfDestinyEffect() { - super(Duration.EndOfTurn, Integer.MAX_VALUE, true); + super(Duration.EndOfTurn, Integer.MAX_VALUE, UsageType.ONE_USAGE_ABSOLUTE); staticText = "The next time a source of your choice would deal damage to you this turn, that damage is dealt to {this} instead"; this.damageSource = new TargetSource(); } diff --git a/Mage.Sets/src/mage/cards/c/Carom.java b/Mage.Sets/src/mage/cards/c/Carom.java index 6560f1dd33c..bb6dc4e1c36 100644 --- a/Mage.Sets/src/mage/cards/c/Carom.java +++ b/Mage.Sets/src/mage/cards/c/Carom.java @@ -49,22 +49,22 @@ import mage.target.common.TargetCreaturePermanent; public class Carom extends CardImpl { public Carom(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{1}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{W}"); // The next 1 damage that would be dealt to target creature this turn is dealt to another target creature instead. // Draw a card. this.getSpellAbility().addEffect(new CaromEffect(Duration.EndOfTurn, 1)); - + TargetCreaturePermanent target = new TargetCreaturePermanent(); target.setTargetTag(1); this.getSpellAbility().addTarget(target); - + FilterCreaturePermanent filter = new FilterCreaturePermanent("another creature (damage is redirected to)"); filter.add(new AnotherTargetPredicate(2)); TargetCreaturePermanent target2 = new TargetCreaturePermanent(filter); target2.setTargetTag(2); this.getSpellAbility().addTarget(target2); - + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); } @@ -79,29 +79,29 @@ public class Carom extends CardImpl { } class CaromEffect extends RedirectionEffect { - + protected MageObjectReference redirectToObject; - + public CaromEffect(Duration duration, int amount) { - super(duration, amount, true); + super(duration, amount, UsageType.ONE_USAGE_ABSOLUTE); staticText = "The next " + amount + " damage that would be dealt to target creature this turn is dealt to another target creature instead"; } - + public CaromEffect(final CaromEffect effect) { super(effect); } - + @Override public CaromEffect copy() { return new CaromEffect(this); } - + @Override public void init(Ability source, Game game) { super.init(source, game); redirectToObject = new MageObjectReference(source.getTargets().get(1).getFirstTarget(), game); } - + @Override public boolean applies(GameEvent event, Ability source, Game game) { if (event.getTargetId().equals(getTargetPointer().getFirst(game, source))) { diff --git a/Mage.Sets/src/mage/cards/d/DaughterOfAutumn.java b/Mage.Sets/src/mage/cards/d/DaughterOfAutumn.java index ad1ea1a443b..69684989ffe 100644 --- a/Mage.Sets/src/mage/cards/d/DaughterOfAutumn.java +++ b/Mage.Sets/src/mage/cards/d/DaughterOfAutumn.java @@ -37,8 +37,8 @@ import mage.abilities.effects.RedirectionEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; +import mage.constants.SubType; import mage.constants.SuperType; import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; @@ -90,7 +90,7 @@ class DaughterOfAutumnPreventDamageTargetEffect extends RedirectionEffect { private static FilterCreaturePermanent filter = new FilterCreaturePermanent(); public DaughterOfAutumnPreventDamageTargetEffect(Duration duration, int amount) { - super(duration, amount, true); + super(duration, amount, UsageType.ONE_USAGE_ABSOLUTE); staticText = "The next " + amount + " damage that would be dealt to target white creature this turn is dealt to {this} instead"; } diff --git a/Mage.Sets/src/mage/cards/g/GeneralsRegalia.java b/Mage.Sets/src/mage/cards/g/GeneralsRegalia.java index e3c90b0b6c6..4e24ff5c79d 100644 --- a/Mage.Sets/src/mage/cards/g/GeneralsRegalia.java +++ b/Mage.Sets/src/mage/cards/g/GeneralsRegalia.java @@ -41,20 +41,19 @@ import mage.constants.Outcome; import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; import mage.game.stack.Spell; import mage.players.Player; import mage.target.TargetSource; import mage.target.common.TargetControlledCreaturePermanent; /** - * + * * @author L_J */ public class GeneralsRegalia extends CardImpl { public GeneralsRegalia(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); // {3}: The next time a source of your choice would deal damage to you this turn, that damage is dealt to target creature you control instead. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GeneralsRegaliaEffect(), new GenericManaCost(3)); @@ -77,7 +76,7 @@ class GeneralsRegaliaEffect extends RedirectionEffect { private final TargetSource damageSource; public GeneralsRegaliaEffect() { - super(Duration.EndOfTurn, Integer.MAX_VALUE, true); + super(Duration.EndOfTurn, Integer.MAX_VALUE, UsageType.ONE_USAGE_ABSOLUTE); staticText = "The next time a source of your choice would deal damage to you this turn, that damage is dealt to target creature you control instead"; this.damageSource = new TargetSource(); } diff --git a/Mage.Sets/src/mage/cards/h/HarmsWay.java b/Mage.Sets/src/mage/cards/h/HarmsWay.java index cd2214e6974..81299ade5c1 100644 --- a/Mage.Sets/src/mage/cards/h/HarmsWay.java +++ b/Mage.Sets/src/mage/cards/h/HarmsWay.java @@ -50,7 +50,7 @@ import mage.target.common.TargetAnyTarget; public class HarmsWay extends CardImpl { public HarmsWay(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{W}"); + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{W}"); // The next 2 damage that a source of your choice would deal to you and/or permanents you control this turn is dealt to any target instead. this.getSpellAbility().addEffect(new HarmsWayPreventDamageTargetEffect()); @@ -72,7 +72,7 @@ class HarmsWayPreventDamageTargetEffect extends RedirectionEffect { private final TargetSource damageSource; public HarmsWayPreventDamageTargetEffect() { - super(Duration.EndOfTurn, 2, true); + super(Duration.EndOfTurn, 2, UsageType.ONE_USAGE_ABSOLUTE); staticText = "The next 2 damage that a source of your choice would deal to you and/or permanents you control this turn is dealt to any target instead"; this.damageSource = new TargetSource(); } diff --git a/Mage.Sets/src/mage/cards/h/HazduhrTheAbbot.java b/Mage.Sets/src/mage/cards/h/HazduhrTheAbbot.java index bbe55f549fc..0664483184f 100644 --- a/Mage.Sets/src/mage/cards/h/HazduhrTheAbbot.java +++ b/Mage.Sets/src/mage/cards/h/HazduhrTheAbbot.java @@ -38,8 +38,8 @@ import mage.abilities.effects.RedirectionEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; +import mage.constants.SubType; import mage.constants.SuperType; import mage.constants.Zone; import mage.filter.common.FilterControlledCreaturePermanent; @@ -92,14 +92,14 @@ class HazduhrTheAbbotRedirectDamageEffect extends RedirectionEffect { private static FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent(); public HazduhrTheAbbotRedirectDamageEffect(Duration duration) { - super(duration, 0, true); + super(duration, 0, UsageType.ONE_USAGE_ABSOLUTE); this.staticText = "The next X damage that would be dealt this turn to target white creature you control is dealt to {this} instead"; } public HazduhrTheAbbotRedirectDamageEffect(final HazduhrTheAbbotRedirectDamageEffect effect) { super(effect); } - + @Override public void init(Ability source, Game game) { amountToRedirect = source.getManaCostsToPay().getX(); diff --git a/Mage.Sets/src/mage/cards/k/KaronasZealot.java b/Mage.Sets/src/mage/cards/k/KaronasZealot.java index 6e07f81e71d..680f6ab59ce 100644 --- a/Mage.Sets/src/mage/cards/k/KaronasZealot.java +++ b/Mage.Sets/src/mage/cards/k/KaronasZealot.java @@ -32,13 +32,14 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.TurnedFaceUpSourceTriggeredAbility; import mage.abilities.costs.mana.ManaCostsImpl; +import static mage.abilities.effects.RedirectionEffect.UsageType.ACCORDING_DURATION; import mage.abilities.effects.common.RedirectDamageFromSourceToTargetEffect; import mage.abilities.keyword.MorphAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; +import mage.constants.SubType; import mage.target.common.TargetCreaturePermanent; /** @@ -58,7 +59,7 @@ public class KaronasZealot extends CardImpl { this.addAbility(new MorphAbility(this, new ManaCostsImpl("{3}{W}{W}"))); // When Karona's Zealot is turned face up, all damage that would be dealt to it this turn is dealt to target creature instead. - Ability ability = new TurnedFaceUpSourceTriggeredAbility(new RedirectDamageFromSourceToTargetEffect(Duration.EndOfTurn, Integer.MAX_VALUE, false) + Ability ability = new TurnedFaceUpSourceTriggeredAbility(new RedirectDamageFromSourceToTargetEffect(Duration.EndOfTurn, Integer.MAX_VALUE, ACCORDING_DURATION) .setText("all damage that would be dealt to it this turn is dealt to target creature instead")); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/l/LancersEnKor.java b/Mage.Sets/src/mage/cards/l/LancersEnKor.java index ef7c613d9c1..37e826cbad3 100644 --- a/Mage.Sets/src/mage/cards/l/LancersEnKor.java +++ b/Mage.Sets/src/mage/cards/l/LancersEnKor.java @@ -32,13 +32,14 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.GenericManaCost; +import static mage.abilities.effects.RedirectionEffect.UsageType.ONE_USAGE_ABSOLUTE; import mage.abilities.effects.common.RedirectDamageFromSourceToTargetEffect; import mage.abilities.keyword.TrampleAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; +import mage.constants.SubType; import mage.constants.Zone; import mage.target.common.TargetControlledCreaturePermanent; @@ -49,7 +50,7 @@ import mage.target.common.TargetControlledCreaturePermanent; public class LancersEnKor extends CardImpl { public LancersEnKor(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.KOR); this.subtype.add(SubType.SOLDIER); this.power = new MageInt(3); @@ -57,9 +58,9 @@ public class LancersEnKor extends CardImpl { // Trample this.addAbility(TrampleAbility.getInstance()); - + // {0}: The next 1 damage that would be dealt to Lancers en-Kor this turn is dealt to target creature you control instead. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new RedirectDamageFromSourceToTargetEffect(Duration.EndOfTurn, 1, true), new GenericManaCost(0)); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new RedirectDamageFromSourceToTargetEffect(Duration.EndOfTurn, 1, ONE_USAGE_ABSOLUTE), new GenericManaCost(0)); ability.addTarget(new TargetControlledCreaturePermanent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/m/Martyrdom.java b/Mage.Sets/src/mage/cards/m/Martyrdom.java index fb0cf6c6827..d57ed53505a 100644 --- a/Mage.Sets/src/mage/cards/m/Martyrdom.java +++ b/Mage.Sets/src/mage/cards/m/Martyrdom.java @@ -48,8 +48,8 @@ import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; -import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetAnyTarget; +import mage.target.common.TargetControlledCreaturePermanent; /** * @@ -154,7 +154,7 @@ class MartyrdomRedirectDamageTargetEffect extends RedirectionEffect { private static FilterCreaturePermanent filter = new FilterCreaturePermanent(); public MartyrdomRedirectDamageTargetEffect(Duration duration, int amount) { - super(duration, amount, true); + super(duration, amount, UsageType.ONE_USAGE_ABSOLUTE); staticText = "The next " + amount + " damage that would be dealt to target creature, planeswalker, or player this turn is dealt to {this} instead"; } diff --git a/Mage.Sets/src/mage/cards/n/NomadsEnKor.java b/Mage.Sets/src/mage/cards/n/NomadsEnKor.java index 6f163a1758b..11947abb50a 100644 --- a/Mage.Sets/src/mage/cards/n/NomadsEnKor.java +++ b/Mage.Sets/src/mage/cards/n/NomadsEnKor.java @@ -32,12 +32,13 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.GenericManaCost; +import static mage.abilities.effects.RedirectionEffect.UsageType.ONE_USAGE_ABSOLUTE; import mage.abilities.effects.common.RedirectDamageFromSourceToTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; +import mage.constants.SubType; import mage.constants.Zone; import mage.target.common.TargetControlledCreaturePermanent; @@ -48,7 +49,7 @@ import mage.target.common.TargetControlledCreaturePermanent; public class NomadsEnKor extends CardImpl { public NomadsEnKor(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}"); this.subtype.add(SubType.KOR); this.subtype.add(SubType.NOMAD); this.subtype.add(SubType.SOLDIER); @@ -57,7 +58,7 @@ public class NomadsEnKor extends CardImpl { this.toughness = new MageInt(1); // {0}: The next 1 damage that would be dealt to Nomads en-Kor this turn is dealt to target creature you control instead. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new RedirectDamageFromSourceToTargetEffect(Duration.EndOfTurn, 1, true), new GenericManaCost(0)); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new RedirectDamageFromSourceToTargetEffect(Duration.EndOfTurn, 1, ONE_USAGE_ABSOLUTE), new GenericManaCost(0)); ability.addTarget(new TargetControlledCreaturePermanent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/n/NovaPentacle.java b/Mage.Sets/src/mage/cards/n/NovaPentacle.java index e6571a1a874..356282523c7 100644 --- a/Mage.Sets/src/mage/cards/n/NovaPentacle.java +++ b/Mage.Sets/src/mage/cards/n/NovaPentacle.java @@ -43,20 +43,19 @@ import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; import mage.game.stack.Spell; import mage.players.Player; import mage.target.TargetSource; import mage.target.common.TargetOpponentsChoicePermanent; /** - * + * * @author L_J */ public class NovaPentacle extends CardImpl { public NovaPentacle(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{4}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}"); // {3}, {tap}: The next time a source of your choice would deal damage to you this turn, that damage is dealt to target creature of an opponent's choice instead Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new NovaPentacleEffect(), new GenericManaCost(3)); @@ -80,7 +79,7 @@ class NovaPentacleEffect extends RedirectionEffect { private final TargetSource damageSource; public NovaPentacleEffect() { - super(Duration.EndOfTurn, Integer.MAX_VALUE, true); + super(Duration.EndOfTurn, Integer.MAX_VALUE, UsageType.ONE_USAGE_ABSOLUTE); staticText = "The next time a source of your choice would deal damage to you this turn, that damage is dealt to target creature of an opponent's choice instead"; this.damageSource = new TargetSource(); } diff --git a/Mage.Sets/src/mage/cards/o/OutriderEnKor.java b/Mage.Sets/src/mage/cards/o/OutriderEnKor.java index 80070111cdf..4c249e1e51a 100644 --- a/Mage.Sets/src/mage/cards/o/OutriderEnKor.java +++ b/Mage.Sets/src/mage/cards/o/OutriderEnKor.java @@ -32,13 +32,14 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.GenericManaCost; +import static mage.abilities.effects.RedirectionEffect.UsageType.ONE_USAGE_ABSOLUTE; import mage.abilities.effects.common.RedirectDamageFromSourceToTargetEffect; import mage.abilities.keyword.FlankingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; +import mage.constants.SubType; import mage.constants.Zone; import mage.target.common.TargetControlledCreaturePermanent; @@ -49,7 +50,7 @@ import mage.target.common.TargetControlledCreaturePermanent; public class OutriderEnKor extends CardImpl { public OutriderEnKor(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}"); this.subtype.add(SubType.KOR); this.subtype.add(SubType.REBEL); this.subtype.add(SubType.KNIGHT); @@ -58,9 +59,9 @@ public class OutriderEnKor extends CardImpl { // Flanking this.addAbility(new FlankingAbility()); - + // {0}: The next 1 damage that would be dealt to Outrider en-Kor this turn is dealt to target creature you control instead. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new RedirectDamageFromSourceToTargetEffect(Duration.EndOfTurn, 1, true), new GenericManaCost(0)); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new RedirectDamageFromSourceToTargetEffect(Duration.EndOfTurn, 1, ONE_USAGE_ABSOLUTE), new GenericManaCost(0)); ability.addTarget(new TargetControlledCreaturePermanent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/p/PersonalIncarnation.java b/Mage.Sets/src/mage/cards/p/PersonalIncarnation.java index b24c3cbef3f..5a6557cbb75 100644 --- a/Mage.Sets/src/mage/cards/p/PersonalIncarnation.java +++ b/Mage.Sets/src/mage/cards/p/PersonalIncarnation.java @@ -38,9 +38,9 @@ import mage.abilities.effects.RedirectionEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.TargetController; import mage.constants.Zone; import mage.game.Game; @@ -56,7 +56,7 @@ public class PersonalIncarnation extends CardImpl { public PersonalIncarnation(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}{W}{W}"); - + this.subtype.add(SubType.AVATAR); this.subtype.add(SubType.INCARNATION); this.power = new MageInt(6); @@ -83,7 +83,7 @@ public class PersonalIncarnation extends CardImpl { class PersonalIncarnationRedirectEffect extends RedirectionEffect { public PersonalIncarnationRedirectEffect() { - super(Duration.EndOfTurn, 1, true); + super(Duration.EndOfTurn, 1, UsageType.ONE_USAGE_ABSOLUTE); staticText = "The next 1 damage that would be dealt to {this} this turn is dealt to its owner instead."; } diff --git a/Mage.Sets/src/mage/cards/r/RaziaBorosArchangel.java b/Mage.Sets/src/mage/cards/r/RaziaBorosArchangel.java index 24bacde1358..73011218bac 100644 --- a/Mage.Sets/src/mage/cards/r/RaziaBorosArchangel.java +++ b/Mage.Sets/src/mage/cards/r/RaziaBorosArchangel.java @@ -41,8 +41,8 @@ import mage.abilities.keyword.VigilanceAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; +import mage.constants.SubType; import mage.constants.SuperType; import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; @@ -60,7 +60,7 @@ import mage.target.common.TargetCreaturePermanent; public class RaziaBorosArchangel extends CardImpl { public RaziaBorosArchangel(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{R}{R}{W}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{R}{R}{W}{W}"); addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.ANGEL); @@ -107,7 +107,7 @@ class RaziaBorosArchangelEffect extends RedirectionEffect { protected MageObjectReference redirectToObject; public RaziaBorosArchangelEffect(Duration duration, int amount) { - super(duration, 3, true); + super(duration, 3, UsageType.ONE_USAGE_ABSOLUTE); staticText = "The next " + amount + " damage that would be dealt to target creature you control this turn is dealt to another target creature instead"; } diff --git a/Mage.Sets/src/mage/cards/s/ShamanEnKor.java b/Mage.Sets/src/mage/cards/s/ShamanEnKor.java index 13e67fb808a..2306bbf04c3 100644 --- a/Mage.Sets/src/mage/cards/s/ShamanEnKor.java +++ b/Mage.Sets/src/mage/cards/s/ShamanEnKor.java @@ -35,13 +35,14 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.RedirectionEffect; +import mage.abilities.effects.RedirectionEffect.UsageType; import mage.abilities.effects.common.RedirectDamageFromSourceToTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; @@ -61,7 +62,7 @@ import mage.target.common.TargetCreaturePermanent; public class ShamanEnKor extends CardImpl { public ShamanEnKor(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); this.subtype.add(SubType.KOR); this.subtype.add(SubType.CLERIC); this.subtype.add(SubType.SHAMAN); @@ -71,7 +72,7 @@ public class ShamanEnKor extends CardImpl { // {0}: The next 1 damage that would be dealt to Shaman en-Kor this turn is dealt to target creature you control instead. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, - new RedirectDamageFromSourceToTargetEffect(Duration.EndOfTurn, 1, true), new GenericManaCost(0)); + new RedirectDamageFromSourceToTargetEffect(Duration.EndOfTurn, 1, UsageType.ONE_USAGE_ABSOLUTE), new GenericManaCost(0)); ability.addTarget(new TargetControlledCreaturePermanent()); this.addAbility(ability); @@ -97,7 +98,7 @@ class ShamanEnKorRedirectFromTargetEffect extends RedirectionEffect { protected MageObjectReference sourceObject; ShamanEnKorRedirectFromTargetEffect() { - super(Duration.EndOfTurn, Integer.MAX_VALUE, true); + super(Duration.EndOfTurn, Integer.MAX_VALUE, UsageType.ONE_USAGE_ABSOLUTE); staticText = "The next time a source of your choice would deal damage to target creature this turn, that damage is dealt to {this} instead"; } diff --git a/Mage.Sets/src/mage/cards/s/ShimianNightStalker.java b/Mage.Sets/src/mage/cards/s/ShimianNightStalker.java index 31e80d7ce29..b7a024dfc44 100644 --- a/Mage.Sets/src/mage/cards/s/ShimianNightStalker.java +++ b/Mage.Sets/src/mage/cards/s/ShimianNightStalker.java @@ -37,8 +37,8 @@ import mage.abilities.effects.RedirectionEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; +import mage.constants.SubType; import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.permanent.AttackingPredicate; @@ -88,7 +88,7 @@ class ShimianNightStalkerRedirectDamageEffect extends RedirectionEffect { private static FilterCreaturePermanent filter = new FilterCreaturePermanent(); public ShimianNightStalkerRedirectDamageEffect() { - super(Duration.EndOfTurn, Integer.MAX_VALUE, true); + super(Duration.EndOfTurn, Integer.MAX_VALUE, UsageType.ONE_USAGE_ABSOLUTE); this.staticText = "All damage that would be dealt to you this turn by target attacking creature is dealt to {this} instead"; } @@ -107,7 +107,7 @@ class ShimianNightStalkerRedirectDamageEffect extends RedirectionEffect { if (permanent != null) { if (filter.match(permanent, permanent.getId(), permanent.getControllerId(), game)) { if (event.getSourceId() != null && event.getTargetId() != null) { - if (event.getSourceId().equals(getTargetPointer().getFirst(game, source)) + if (event.getSourceId().equals(getTargetPointer().getFirst(game, source)) && event.getTargetId().equals(source.getControllerId())) { TargetPermanent target = new TargetPermanent(); target.add(source.getSourceId(), game); diff --git a/Mage.Sets/src/mage/cards/s/ShiningShoal.java b/Mage.Sets/src/mage/cards/s/ShiningShoal.java index ec4ec339197..f23e9e1e2c7 100644 --- a/Mage.Sets/src/mage/cards/s/ShiningShoal.java +++ b/Mage.Sets/src/mage/cards/s/ShiningShoal.java @@ -50,8 +50,8 @@ import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.TargetSource; -import mage.target.common.TargetCardInHand; import mage.target.common.TargetAnyTarget; +import mage.target.common.TargetCardInHand; /** * @@ -90,7 +90,7 @@ class ShiningShoalRedirectDamageTargetEffect extends RedirectDamageFromSourceToT private final DynamicValue dynamicAmount; public ShiningShoalRedirectDamageTargetEffect(Duration duration, DynamicValue dynamicAmount) { - super(duration, 0, true); + super(duration, 0, UsageType.ONE_USAGE_AT_THE_SAME_TIME); this.dynamicAmount = dynamicAmount; staticText = "The next X damage that a source of your choice would deal to you and/or creatures you control this turn is dealt to any target instead"; } diff --git a/Mage.Sets/src/mage/cards/s/SpiritEnKor.java b/Mage.Sets/src/mage/cards/s/SpiritEnKor.java index 4a2b64c369e..533a5798950 100644 --- a/Mage.Sets/src/mage/cards/s/SpiritEnKor.java +++ b/Mage.Sets/src/mage/cards/s/SpiritEnKor.java @@ -32,13 +32,14 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.GenericManaCost; +import static mage.abilities.effects.RedirectionEffect.UsageType.ONE_USAGE_ABSOLUTE; import mage.abilities.effects.common.RedirectDamageFromSourceToTargetEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; +import mage.constants.SubType; import mage.constants.Zone; import mage.target.common.TargetControlledCreaturePermanent; @@ -49,7 +50,7 @@ import mage.target.common.TargetControlledCreaturePermanent; public class SpiritEnKor extends CardImpl { public SpiritEnKor(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}"); this.subtype.add(SubType.KOR); this.subtype.add(SubType.SPIRIT); this.power = new MageInt(2); @@ -60,7 +61,7 @@ public class SpiritEnKor extends CardImpl { // {0}: The next 1 damage that would be dealt to Spirit en-Kor this turn is dealt to target creature you control instead. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, - new RedirectDamageFromSourceToTargetEffect(Duration.EndOfTurn, 1, true), new GenericManaCost(0)); + new RedirectDamageFromSourceToTargetEffect(Duration.EndOfTurn, 1, ONE_USAGE_ABSOLUTE), new GenericManaCost(0)); ability.addTarget(new TargetControlledCreaturePermanent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/v/VassalsDuty.java b/Mage.Sets/src/mage/cards/v/VassalsDuty.java index 98db6b0aece..49a19cb0a06 100644 --- a/Mage.Sets/src/mage/cards/v/VassalsDuty.java +++ b/Mage.Sets/src/mage/cards/v/VassalsDuty.java @@ -58,7 +58,7 @@ public class VassalsDuty extends CardImpl { } public VassalsDuty(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{3}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}"); // {1}: The next 1 damage that would be dealt to target legendary creature you control this turn is dealt to you instead. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new VassalsDutyPreventDamageTargetEffect(Duration.EndOfTurn, 1), new GenericManaCost(1)); @@ -79,7 +79,7 @@ public class VassalsDuty extends CardImpl { class VassalsDutyPreventDamageTargetEffect extends RedirectionEffect { public VassalsDutyPreventDamageTargetEffect(Duration duration, int amount) { - super(duration, amount, true); + super(duration, amount, UsageType.ONE_USAGE_ABSOLUTE); staticText = "The next " + amount + " damage that would be dealt to target legendary creature you control this turn is dealt to you instead"; } diff --git a/Mage.Sets/src/mage/cards/w/WardOfPiety.java b/Mage.Sets/src/mage/cards/w/WardOfPiety.java index aca4ea4397d..a959ef250e2 100644 --- a/Mage.Sets/src/mage/cards/w/WardOfPiety.java +++ b/Mage.Sets/src/mage/cards/w/WardOfPiety.java @@ -38,9 +38,9 @@ import mage.abilities.keyword.EnchantAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; @@ -56,7 +56,7 @@ import mage.target.common.TargetCreaturePermanent; public class WardOfPiety extends CardImpl { public WardOfPiety(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}"); this.subtype.add(SubType.AURA); // Enchant creature @@ -87,12 +87,13 @@ class WardOfPietyPreventDamageTargetEffect extends RedirectionEffect { protected MageObjectReference redirectToObject; public WardOfPietyPreventDamageTargetEffect() { - super(Duration.EndOfTurn, 1, true); + super(Duration.EndOfTurn, 1, UsageType.ONE_USAGE_ABSOLUTE); staticText = "The next 1 damage that would be dealt to enchanted creature this turn is dealt to any target instead"; } public WardOfPietyPreventDamageTargetEffect(final WardOfPietyPreventDamageTargetEffect effect) { super(effect); + this.redirectToObject = effect.redirectToObject; } @Override diff --git a/Mage.Sets/src/mage/cards/w/WarriorEnKor.java b/Mage.Sets/src/mage/cards/w/WarriorEnKor.java index f0be2906224..fae063dc7e4 100644 --- a/Mage.Sets/src/mage/cards/w/WarriorEnKor.java +++ b/Mage.Sets/src/mage/cards/w/WarriorEnKor.java @@ -32,12 +32,13 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.GenericManaCost; +import static mage.abilities.effects.RedirectionEffect.UsageType.ONE_USAGE_ABSOLUTE; import mage.abilities.effects.common.RedirectDamageFromSourceToTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; +import mage.constants.SubType; import mage.constants.Zone; import mage.target.common.TargetControlledCreaturePermanent; @@ -48,7 +49,7 @@ import mage.target.common.TargetControlledCreaturePermanent; public class WarriorEnKor extends CardImpl { public WarriorEnKor(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{W}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}{W}"); this.subtype.add(SubType.KOR); this.subtype.add(SubType.WARRIOR); this.subtype.add(SubType.KNIGHT); @@ -57,7 +58,7 @@ public class WarriorEnKor extends CardImpl { // {0}: The next 1 damage that would be dealt to Warrior en-Kor this turn is dealt to target creature you control instead. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, - new RedirectDamageFromSourceToTargetEffect(Duration.EndOfTurn, 1, true), new GenericManaCost(0)); + new RedirectDamageFromSourceToTargetEffect(Duration.EndOfTurn, 1, ONE_USAGE_ABSOLUTE), new GenericManaCost(0)); ability.addTarget(new TargetControlledCreaturePermanent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/z/ZealousInquisitor.java b/Mage.Sets/src/mage/cards/z/ZealousInquisitor.java index 5a0978ffaf0..2839102b10f 100644 --- a/Mage.Sets/src/mage/cards/z/ZealousInquisitor.java +++ b/Mage.Sets/src/mage/cards/z/ZealousInquisitor.java @@ -32,6 +32,7 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; +import static mage.abilities.effects.RedirectionEffect.UsageType.ONE_USAGE_ABSOLUTE; import mage.abilities.effects.common.RedirectDamageFromSourceToTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -48,13 +49,13 @@ import mage.target.common.TargetCreaturePermanent; public class ZealousInquisitor extends CardImpl { public ZealousInquisitor(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}"); this.subtype.add(SubType.HUMAN, SubType.CLERIC); this.power = new MageInt(2); this.toughness = new MageInt(2); // {1}{W}: The next 1 damage that would be dealt to Zealous Inquisitor this turn is dealt to target creature instead. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new RedirectDamageFromSourceToTargetEffect(Duration.EndOfTurn, 1, true), new ManaCostsImpl("{1}{W}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new RedirectDamageFromSourceToTargetEffect(Duration.EndOfTurn, 1, ONE_USAGE_ABSOLUTE), new ManaCostsImpl("{1}{W}")); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/z/ZhalfirinCrusader.java b/Mage.Sets/src/mage/cards/z/ZhalfirinCrusader.java index ddd9bf083d7..90de3c51d19 100644 --- a/Mage.Sets/src/mage/cards/z/ZhalfirinCrusader.java +++ b/Mage.Sets/src/mage/cards/z/ZhalfirinCrusader.java @@ -32,6 +32,7 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; +import static mage.abilities.effects.RedirectionEffect.UsageType.ONE_USAGE_ABSOLUTE; import mage.abilities.effects.common.RedirectDamageFromSourceToTargetEffect; import mage.abilities.keyword.FlankingAbility; import mage.cards.CardImpl; @@ -49,16 +50,16 @@ import mage.target.common.TargetAnyTarget; public class ZhalfirinCrusader extends CardImpl { public ZhalfirinCrusader(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{W}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}{W}"); this.subtype.add(SubType.HUMAN, SubType.KNIGHT); this.power = new MageInt(2); this.toughness = new MageInt(2); // Flanking this.addAbility(new FlankingAbility()); - + // {1}{W}: The next 1 damage that would be dealt to Zhalfirin Crusader this turn is dealt to any target instead. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new RedirectDamageFromSourceToTargetEffect(Duration.EndOfTurn, 1, true), new ManaCostsImpl("{1}{W}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new RedirectDamageFromSourceToTargetEffect(Duration.EndOfTurn, 1, ONE_USAGE_ABSOLUTE), new ManaCostsImpl("{1}{W}")); ability.addTarget(new TargetAnyTarget()); this.addAbility(ability); } diff --git a/Mage/src/main/java/mage/abilities/effects/RedirectionEffect.java b/Mage/src/main/java/mage/abilities/effects/RedirectionEffect.java index 7979ad8f1b1..03fba3bbe25 100644 --- a/Mage/src/main/java/mage/abilities/effects/RedirectionEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/RedirectionEffect.java @@ -27,6 +27,7 @@ */ package mage.abilities.effects; +import mage.MageObject; import mage.abilities.Ability; import mage.constants.Duration; import mage.constants.EffectType; @@ -44,26 +45,34 @@ import mage.target.Target; */ public abstract class RedirectionEffect extends ReplacementEffectImpl { - protected Target redirectTarget; - protected int amountToRedirect; - protected boolean oneUsage; - - public RedirectionEffect(Duration duration) { - this(duration, Integer.MAX_VALUE, false); + public enum UsageType { + ACCORDING_DURATION, + ONE_USAGE_ABSOLUTE, + ONE_USAGE_AT_THE_SAME_TIME; // all damage dealt at the same time } - public RedirectionEffect(Duration duration, int amountToRedirect, boolean oneUsage) { + protected Target redirectTarget; + protected int amountToRedirect; + protected UsageType usageType; + protected int applyEffectsCounter; + + public RedirectionEffect(Duration duration) { + this(duration, Integer.MAX_VALUE, UsageType.ACCORDING_DURATION); + applyEffectsCounter = -1; + } + + public RedirectionEffect(Duration duration, int amountToRedirect, UsageType usageType) { super(duration, Outcome.RedirectDamage); this.effectType = EffectType.REDIRECTION; this.amountToRedirect = amountToRedirect; - this.oneUsage = oneUsage; + this.usageType = usageType; } public RedirectionEffect(final RedirectionEffect effect) { super(effect); this.redirectTarget = effect.redirectTarget; this.amountToRedirect = effect.amountToRedirect; - this.oneUsage = effect.oneUsage; + this.usageType = effect.usageType; } @Override @@ -79,26 +88,38 @@ public abstract class RedirectionEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { + int damageToRedirect = event.getAmount(); + if (damageToRedirect < 1) { // if multiple replacement effect apply, the rest damage can be 0, so the effect is not applied/replaced + return false; + } String sourceLogName = source != null ? game.getObject(source.getSourceId()).getLogName() + ": " : ""; DamageEvent damageEvent = (DamageEvent) event; int restDamage = 0; - int damageToRedirect = event.getAmount(); if (damageEvent.getAmount() > amountToRedirect) { restDamage = damageEvent.getAmount() - amountToRedirect; damageToRedirect = amountToRedirect; } - if (damageToRedirect > 0 && oneUsage) { - this.discard(); + if (damageToRedirect > 0 && usageType != UsageType.ACCORDING_DURATION) { + if (UsageType.ONE_USAGE_ABSOLUTE == usageType) { + this.discard(); + } + if (applyEffectsCounter > 0) { + if (applyEffectsCounter < game.getState().getApplyEffectsCounter()) { + this.discard(); + } + } else { + applyEffectsCounter = game.getState().getApplyEffectsCounter(); + } } Permanent permanent = game.getPermanent(redirectTarget.getFirstTarget()); if (permanent != null) { permanent.damage(damageToRedirect, event.getSourceId(), game, damageEvent.isCombatDamage(), damageEvent.isPreventable(), event.getAppliedEffects()); - game.informPlayers(sourceLogName + "Redirected " + damageToRedirect + " damage to " + permanent.getLogName()); + game.informPlayers(sourceLogName + "Redirected " + damageToRedirect + " damage" + getRedirectedFromText(event, game) + " to " + permanent.getLogName()); } else { Player player = game.getPlayer(redirectTarget.getFirstTarget()); if (player != null) { player.damage(damageToRedirect, event.getSourceId(), game, damageEvent.isCombatDamage(), damageEvent.isPreventable(), event.getAppliedEffects()); - game.informPlayers(sourceLogName + "Redirected " + damageToRedirect + " damage to " + player.getLogName()); + game.informPlayers(sourceLogName + "Redirected " + damageToRedirect + " damage" + getRedirectedFromText(event, game) + " to " + player.getLogName()); } } if (restDamage > 0) { @@ -108,4 +129,16 @@ public abstract class RedirectionEffect extends ReplacementEffectImpl { return true; } + private String getRedirectedFromText(GameEvent event, Game game) { + Player player = game.getPlayer(event.getTargetId()); + if (player != null) { + return " from " + player.getLogName(); + } + MageObject mageObject = game.getObject(event.getTargetId()); + if (mageObject != null) { + return " from " + mageObject.getLogName(); + } + return ""; + + } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/RedirectDamageFromSourceToTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/RedirectDamageFromSourceToTargetEffect.java index bff0d3cceed..76e56084f80 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/RedirectDamageFromSourceToTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/RedirectDamageFromSourceToTargetEffect.java @@ -18,8 +18,8 @@ import mage.game.permanent.Permanent; */ public class RedirectDamageFromSourceToTargetEffect extends RedirectionEffect { - public RedirectDamageFromSourceToTargetEffect(Duration duration, int amountToRedirect, boolean oneUsage) { - super(duration, amountToRedirect, oneUsage); + public RedirectDamageFromSourceToTargetEffect(Duration duration, int amountToRedirect, UsageType usageType) { + super(duration, amountToRedirect, usageType); staticText = "The next " + amountToRedirect + " damage that would be dealt to {this} this turn is dealt to target creature you control instead."; } diff --git a/Mage/src/main/java/mage/game/GameState.java b/Mage/src/main/java/mage/game/GameState.java index 994f62c4a95..384d07ab199 100644 --- a/Mage/src/main/java/mage/game/GameState.java +++ b/Mage/src/main/java/mage/game/GameState.java @@ -30,7 +30,6 @@ package mage.game; import java.io.Serializable; import java.util.*; import java.util.stream.Collectors; - import mage.MageObject; import mage.abilities.*; import mage.abilities.effects.ContinuousEffect; @@ -121,6 +120,8 @@ public class GameState implements Serializable, Copyable { private Map copiedCards = new HashMap<>(); private int permanentOrderNumber; + private int applyEffectsCounter; // Upcounting number of each applyEffects execution + public GameState() { players = new Players(); playerList = new PlayerList(); @@ -137,6 +138,7 @@ public class GameState implements Serializable, Copyable { combat = new Combat(); turnMods = new TurnMods(); watchers = new Watchers(); + applyEffectsCounter = 0; } public GameState(final GameState state) { @@ -193,6 +195,7 @@ public class GameState implements Serializable, Copyable { this.zoneChangeCounter.putAll(state.zoneChangeCounter); this.copiedCards.putAll(state.copiedCards); this.permanentOrderNumber = state.permanentOrderNumber; + this.applyEffectsCounter = state.applyEffectsCounter; } public void restoreForRollBack(GameState state) { @@ -210,7 +213,7 @@ public class GameState implements Serializable, Copyable { this.command = state.command; this.isPlaneChase = state.isPlaneChase; this.seenPlanes = state.seenPlanes; - this.designations = state.designations; + this.designations = state.designations; this.exile = state.exile; this.battlefield = state.battlefield; this.turnNum = state.turnNum; @@ -237,6 +240,7 @@ public class GameState implements Serializable, Copyable { this.zoneChangeCounter = state.zoneChangeCounter; this.copiedCards = state.copiedCards; this.permanentOrderNumber = state.permanentOrderNumber; + this.applyEffectsCounter = state.applyEffectsCounter; } @Override @@ -466,12 +470,12 @@ public class GameState implements Serializable, Copyable { } } return null; - } - + } + public List getSeenPlanes() { return seenPlanes; } - + public boolean isPlaneChase() { return isPlaneChase; } @@ -574,6 +578,7 @@ public class GameState implements Serializable, Copyable { } public void applyEffects(Game game) { + applyEffectsCounter++; for (Player player : players.values()) { player.reset(); } @@ -881,13 +886,13 @@ public class GameState implements Serializable, Copyable { addAbility(ability, designation.getId(), null); } } - + public void addSeenPlane(Plane plane, Game game, UUID controllerId) { if (plane != null) { getSeenPlanes().add(plane.getName()); } } - + public void resetSeenPlanes() { getSeenPlanes().clear(); } @@ -1169,4 +1174,9 @@ public class GameState implements Serializable, Copyable { public int getNextPermanentOrderNumber() { return permanentOrderNumber++; } + + public int getApplyEffectsCounter() { + return applyEffectsCounter; + } + } From 89168723e671bf532cced21e08829bf91c4cc872 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 28 Apr 2018 13:22:11 +0200 Subject: [PATCH 019/158] * Added Glarecaster. --- Mage.Sets/src/mage/cards/g/Glarecaster.java | 137 ++++ Mage.Sets/src/mage/sets/Onslaught.java | 719 ++++++++++---------- 2 files changed, 497 insertions(+), 359 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/g/Glarecaster.java diff --git a/Mage.Sets/src/mage/cards/g/Glarecaster.java b/Mage.Sets/src/mage/cards/g/Glarecaster.java new file mode 100644 index 00000000000..20cdb62b566 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/Glarecaster.java @@ -0,0 +1,137 @@ +/* + * 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.g; + +import java.util.UUID; +import mage.MageInt; +import mage.MageObjectReference; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.RedirectionEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.target.common.TargetAnyTarget; + +/** + * + * @author LevelX2 + */ +public class Glarecaster extends CardImpl { + + public Glarecaster(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{W}{W}"); + + this.subtype.add(SubType.BIRD); + this.subtype.add(SubType.CLERIC); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // {5}{W}: The next time damage would be dealt to Glarecaster and/or you this turn, that damage is dealt to any target instead. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GlarecasterEffect(), new ManaCostsImpl("{5}{W}")); + ability.addTarget(new TargetAnyTarget()); + this.addAbility(ability); + } + + public Glarecaster(final Glarecaster card) { + super(card); + } + + @Override + public Glarecaster copy() { + return new Glarecaster(this); + } +} + +/** + * 10/4/2004 If both you and this card would be dealt damage at the same time, + * or if either you or this card would be dealt damage from multiple sources at + * the same time, the redirection will apply to both chunks of damage. + * + * @author LevelX2 + */ +class GlarecasterEffect extends RedirectionEffect { + + protected MageObjectReference redirectToObject; + + public GlarecasterEffect() { + super(Duration.EndOfTurn, Integer.MAX_VALUE, UsageType.ONE_USAGE_AT_THE_SAME_TIME); + staticText = "The next time damage would be dealt to {this} and/or you this turn, that damage is dealt to any target instead"; + } + + public GlarecasterEffect(final GlarecasterEffect effect) { + super(effect); + this.redirectToObject = effect.redirectToObject; + } + + @Override + public GlarecasterEffect copy() { + return new GlarecasterEffect(this); + } + + @Override + public void init(Ability source, Game game) { + super.init(source, game); + redirectToObject = new MageObjectReference(source.getTargets().get(0).getFirstTarget(), game); + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == EventType.DAMAGE_CREATURE || event.getType() == EventType.DAMAGE_PLAYER; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + if (event.getTargetId().equals(source.getSourceId()) + || event.getTargetId().equals(source.getControllerId())) { + if (redirectToObject.equals(new MageObjectReference(source.getTargets().get(0).getFirstTarget(), game))) { + redirectTarget = source.getTargets().get(0); + return true; + } + } + return false; + } + + @Override + public boolean apply(Game game, Ability source + ) { + return true; + } + +} diff --git a/Mage.Sets/src/mage/sets/Onslaught.java b/Mage.Sets/src/mage/sets/Onslaught.java index 64b59f3cec6..3e347f9fdf0 100644 --- a/Mage.Sets/src/mage/sets/Onslaught.java +++ b/Mage.Sets/src/mage/sets/Onslaught.java @@ -1,359 +1,360 @@ -package mage.sets; - -import mage.ObjectColor; -import mage.cards.CardGraphicInfo; -import mage.cards.ExpansionSet; -import mage.constants.Rarity; -import mage.constants.SetType; - -public class Onslaught extends ExpansionSet { - - private static final Onslaught instance = new Onslaught(); - - public static Onslaught getInstance() { - return instance; - } - - private Onslaught() { - super("Onslaught", "ONS", ExpansionSet.buildDate(2002, 10, 7), SetType.EXPANSION); - this.blockName = "Onslaught"; - this.hasBoosters = true; - this.numBoosterLands = 0; - this.numBoosterCommon = 11; - this.numBoosterUncommon = 3; - this.numBoosterRare = 1; - this.ratioBoosterMythic = 0; - cards.add(new SetCardInfo("Accursed Centaur", 123, Rarity.COMMON, mage.cards.a.AccursedCentaur.class)); - cards.add(new SetCardInfo("Aether Charge", 184, Rarity.UNCOMMON, mage.cards.a.AetherCharge.class)); - cards.add(new SetCardInfo("Aggravated Assault", 185, Rarity.RARE, mage.cards.a.AggravatedAssault.class)); - cards.add(new SetCardInfo("Airborne Aid", 62, Rarity.COMMON, mage.cards.a.AirborneAid.class)); - cards.add(new SetCardInfo("Airdrop Condor", 186, Rarity.UNCOMMON, mage.cards.a.AirdropCondor.class)); - cards.add(new SetCardInfo("Akroma's Blessing", 1, Rarity.UNCOMMON, mage.cards.a.AkromasBlessing.class)); - cards.add(new SetCardInfo("Akroma's Vengeance", 2, Rarity.RARE, mage.cards.a.AkromasVengeance.class)); - cards.add(new SetCardInfo("Ancestor's Prophet", 3, Rarity.RARE, mage.cards.a.AncestorsProphet.class)); - cards.add(new SetCardInfo("Animal Magnetism", 245, Rarity.RARE, mage.cards.a.AnimalMagnetism.class)); - cards.add(new SetCardInfo("Annex", 63, Rarity.UNCOMMON, mage.cards.a.Annex.class)); - cards.add(new SetCardInfo("Anurid Murkdiver", 124, Rarity.COMMON, mage.cards.a.AnuridMurkdiver.class)); - cards.add(new SetCardInfo("Aphetto Alchemist", 64, Rarity.UNCOMMON, mage.cards.a.AphettoAlchemist.class)); - cards.add(new SetCardInfo("Aphetto Dredging", 125, Rarity.COMMON, mage.cards.a.AphettoDredging.class)); - cards.add(new SetCardInfo("Aphetto Grifter", 65, Rarity.UNCOMMON, mage.cards.a.AphettoGrifter.class)); - cards.add(new SetCardInfo("Aphetto Vulture", 126, Rarity.UNCOMMON, mage.cards.a.AphettoVulture.class)); - cards.add(new SetCardInfo("Arcanis the Omnipotent", 66, Rarity.RARE, mage.cards.a.ArcanisTheOmnipotent.class)); - cards.add(new SetCardInfo("Ascending Aven", 68, Rarity.COMMON, mage.cards.a.AscendingAven.class)); - cards.add(new SetCardInfo("Astral Slide", 4, Rarity.UNCOMMON, mage.cards.a.AstralSlide.class)); - cards.add(new SetCardInfo("Aura Extraction", 5, Rarity.UNCOMMON, mage.cards.a.AuraExtraction.class)); - cards.add(new SetCardInfo("Aurification", 6, Rarity.RARE, mage.cards.a.Aurification.class)); - cards.add(new SetCardInfo("Avarax", 187, Rarity.UNCOMMON, mage.cards.a.Avarax.class)); - cards.add(new SetCardInfo("Aven Brigadier", 7, Rarity.RARE, mage.cards.a.AvenBrigadier.class)); - cards.add(new SetCardInfo("Aven Fateshaper", 69, Rarity.UNCOMMON, mage.cards.a.AvenFateshaper.class)); - cards.add(new SetCardInfo("Aven Soulgazer", 8, Rarity.UNCOMMON, mage.cards.a.AvenSoulgazer.class)); - cards.add(new SetCardInfo("Backslide", 70, Rarity.COMMON, mage.cards.b.Backslide.class)); - cards.add(new SetCardInfo("Barkhide Mauler", 246, Rarity.COMMON, mage.cards.b.BarkhideMauler.class)); - cards.add(new SetCardInfo("Barren Moor", 312, Rarity.COMMON, mage.cards.b.BarrenMoor.class)); - cards.add(new SetCardInfo("Battering Craghorn", 188, Rarity.COMMON, mage.cards.b.BatteringCraghorn.class)); - cards.add(new SetCardInfo("Biorhythm", 247, Rarity.RARE, mage.cards.b.Biorhythm.class)); - cards.add(new SetCardInfo("Birchlore Rangers", 248, Rarity.COMMON, mage.cards.b.BirchloreRangers.class)); - cards.add(new SetCardInfo("Blackmail", 127, Rarity.UNCOMMON, mage.cards.b.Blackmail.class)); - cards.add(new SetCardInfo("Blatant Thievery", 71, Rarity.RARE, mage.cards.b.BlatantThievery.class)); - cards.add(new SetCardInfo("Blistering Firecat", 189, Rarity.RARE, mage.cards.b.BlisteringFirecat.class)); - cards.add(new SetCardInfo("Bloodline Shaman", 249, Rarity.UNCOMMON, mage.cards.b.BloodlineShaman.class)); - cards.add(new SetCardInfo("Bloodstained Mire", 313, Rarity.RARE, mage.cards.b.BloodstainedMire.class, new CardGraphicInfo(new ObjectColor("RB"), null, false))); - cards.add(new SetCardInfo("Boneknitter", 128, Rarity.UNCOMMON, mage.cards.b.Boneknitter.class)); - cards.add(new SetCardInfo("Break Open", 190, Rarity.COMMON, mage.cards.b.BreakOpen.class)); - cards.add(new SetCardInfo("Brightstone Ritual", 191, Rarity.COMMON, mage.cards.b.BrightstoneRitual.class)); - cards.add(new SetCardInfo("Broodhatch Nantuko", 250, Rarity.UNCOMMON, mage.cards.b.BroodhatchNantuko.class)); - cards.add(new SetCardInfo("Butcher Orgg", 192, Rarity.RARE, mage.cards.b.ButcherOrgg.class)); - cards.add(new SetCardInfo("Cabal Archon", 129, Rarity.UNCOMMON, mage.cards.c.CabalArchon.class)); - cards.add(new SetCardInfo("Cabal Executioner", 130, Rarity.UNCOMMON, mage.cards.c.CabalExecutioner.class)); - cards.add(new SetCardInfo("Cabal Slaver", 131, Rarity.UNCOMMON, mage.cards.c.CabalSlaver.class)); - cards.add(new SetCardInfo("Callous Oppressor", 72, Rarity.RARE, mage.cards.c.CallousOppressor.class)); - cards.add(new SetCardInfo("Catapult Master", 10, Rarity.RARE, mage.cards.c.CatapultMaster.class)); - cards.add(new SetCardInfo("Catapult Squad", 11, Rarity.UNCOMMON, mage.cards.c.CatapultSquad.class)); - cards.add(new SetCardInfo("Centaur Glade", 251, Rarity.UNCOMMON, mage.cards.c.CentaurGlade.class)); - cards.add(new SetCardInfo("Chain of Acid", 252, Rarity.UNCOMMON, mage.cards.c.ChainOfAcid.class)); - cards.add(new SetCardInfo("Chain of Plasma", 193, Rarity.UNCOMMON, mage.cards.c.ChainOfPlasma.class)); - cards.add(new SetCardInfo("Chain of Silence", 12, Rarity.UNCOMMON, mage.cards.c.ChainOfSilence.class)); - cards.add(new SetCardInfo("Chain of Smog", 132, Rarity.UNCOMMON, mage.cards.c.ChainOfSmog.class)); - cards.add(new SetCardInfo("Chain of Vapor", 73, Rarity.UNCOMMON, mage.cards.c.ChainOfVapor.class)); - cards.add(new SetCardInfo("Charging Slateback", 194, Rarity.COMMON, mage.cards.c.ChargingSlateback.class)); - cards.add(new SetCardInfo("Choking Tethers", 74, Rarity.COMMON, mage.cards.c.ChokingTethers.class)); - cards.add(new SetCardInfo("Clone", 75, Rarity.RARE, mage.cards.c.Clone.class)); - cards.add(new SetCardInfo("Complicate", 76, Rarity.UNCOMMON, mage.cards.c.Complicate.class)); - cards.add(new SetCardInfo("Contested Cliffs", 314, Rarity.RARE, mage.cards.c.ContestedCliffs.class)); - cards.add(new SetCardInfo("Convalescent Care", 14, Rarity.RARE, mage.cards.c.ConvalescentCare.class)); - cards.add(new SetCardInfo("Cover of Darkness", 133, Rarity.RARE, mage.cards.c.CoverOfDarkness.class)); - cards.add(new SetCardInfo("Crafty Pathmage", 77, Rarity.COMMON, mage.cards.c.CraftyPathmage.class)); - cards.add(new SetCardInfo("Crowd Favorites", 15, Rarity.UNCOMMON, mage.cards.c.CrowdFavorites.class)); - cards.add(new SetCardInfo("Crude Rampart", 17, Rarity.UNCOMMON, mage.cards.c.CrudeRampart.class)); - cards.add(new SetCardInfo("Cruel Revival", 135, Rarity.COMMON, mage.cards.c.CruelRevival.class)); - cards.add(new SetCardInfo("Cryptic Gateway", 306, Rarity.RARE, mage.cards.c.CrypticGateway.class)); - cards.add(new SetCardInfo("Custody Battle", 197, Rarity.UNCOMMON, mage.cards.c.CustodyBattle.class)); - cards.add(new SetCardInfo("Daru Cavalier", 18, Rarity.COMMON, mage.cards.d.DaruCavalier.class)); - cards.add(new SetCardInfo("Daru Encampment", 315, Rarity.UNCOMMON, mage.cards.d.DaruEncampment.class)); - cards.add(new SetCardInfo("Daru Healer", 19, Rarity.COMMON, mage.cards.d.DaruHealer.class)); - cards.add(new SetCardInfo("Daru Lancer", 20, Rarity.COMMON, mage.cards.d.DaruLancer.class)); - cards.add(new SetCardInfo("Daunting Defender", 21, Rarity.COMMON, mage.cards.d.DauntingDefender.class)); - cards.add(new SetCardInfo("Dawning Purist", 22, Rarity.UNCOMMON, mage.cards.d.DawningPurist.class)); - cards.add(new SetCardInfo("Death Match", 136, Rarity.RARE, mage.cards.d.DeathMatch.class)); - cards.add(new SetCardInfo("Death Pulse", 137, Rarity.UNCOMMON, mage.cards.d.DeathPulse.class)); - cards.add(new SetCardInfo("Demystify", 24, Rarity.COMMON, mage.cards.d.Demystify.class)); - cards.add(new SetCardInfo("Dirge of Dread", 138, Rarity.COMMON, mage.cards.d.DirgeOfDread.class)); - cards.add(new SetCardInfo("Disciple of Grace", 25, Rarity.COMMON, mage.cards.d.DiscipleOfGrace.class)); - cards.add(new SetCardInfo("Disciple of Malice", 139, Rarity.COMMON, mage.cards.d.DiscipleOfMalice.class)); - cards.add(new SetCardInfo("Discombobulate", 79, Rarity.UNCOMMON, mage.cards.d.Discombobulate.class)); - cards.add(new SetCardInfo("Dispersing Orb", 80, Rarity.UNCOMMON, mage.cards.d.DispersingOrb.class)); - cards.add(new SetCardInfo("Disruptive Pitmage", 81, Rarity.COMMON, mage.cards.d.DisruptivePitmage.class)); - cards.add(new SetCardInfo("Dive Bomber", 26, Rarity.COMMON, mage.cards.d.DiveBomber.class)); - cards.add(new SetCardInfo("Doom Cannon", 307, Rarity.RARE, mage.cards.d.DoomCannon.class)); - cards.add(new SetCardInfo("Doomed Necromancer", 140, Rarity.RARE, mage.cards.d.DoomedNecromancer.class)); - cards.add(new SetCardInfo("Doubtless One", 27, Rarity.UNCOMMON, mage.cards.d.DoubtlessOne.class)); - cards.add(new SetCardInfo("Dragon Roost", 198, Rarity.RARE, mage.cards.d.DragonRoost.class)); - cards.add(new SetCardInfo("Dream Chisel", 308, Rarity.RARE, mage.cards.d.DreamChisel.class)); - cards.add(new SetCardInfo("Dwarven Blastminer", 199, Rarity.UNCOMMON, mage.cards.d.DwarvenBlastminer.class)); - cards.add(new SetCardInfo("Ebonblade Reaper", 141, Rarity.RARE, mage.cards.e.EbonbladeReaper.class)); - cards.add(new SetCardInfo("Elven Riders", 254, Rarity.UNCOMMON, mage.cards.e.ElvenRiders.class)); - cards.add(new SetCardInfo("Elvish Guidance", 255, Rarity.COMMON, mage.cards.e.ElvishGuidance.class)); - cards.add(new SetCardInfo("Elvish Pathcutter", 256, Rarity.COMMON, mage.cards.e.ElvishPathcutter.class)); - cards.add(new SetCardInfo("Elvish Pioneer", 257, Rarity.COMMON, mage.cards.e.ElvishPioneer.class)); - cards.add(new SetCardInfo("Elvish Scrapper", 258, Rarity.UNCOMMON, mage.cards.e.ElvishScrapper.class)); - cards.add(new SetCardInfo("Elvish Vanguard", 259, Rarity.RARE, mage.cards.e.ElvishVanguard.class)); - cards.add(new SetCardInfo("Elvish Warrior", 260, Rarity.COMMON, mage.cards.e.ElvishWarrior.class)); - cards.add(new SetCardInfo("Embermage Goblin", 200, Rarity.UNCOMMON, mage.cards.e.EmbermageGoblin.class)); - cards.add(new SetCardInfo("Enchantress's Presence", 261, Rarity.RARE, mage.cards.e.EnchantresssPresence.class)); - cards.add(new SetCardInfo("Entrails Feaster", 143, Rarity.RARE, mage.cards.e.EntrailsFeaster.class)); - cards.add(new SetCardInfo("Erratic Explosion", 201, Rarity.COMMON, mage.cards.e.ErraticExplosion.class)); - cards.add(new SetCardInfo("Essence Fracture", 82, Rarity.UNCOMMON, mage.cards.e.EssenceFracture.class)); - cards.add(new SetCardInfo("Everglove Courier", 262, Rarity.UNCOMMON, mage.cards.e.EvergloveCourier.class)); - cards.add(new SetCardInfo("Exalted Angel", 28, Rarity.RARE, mage.cards.e.ExaltedAngel.class)); - cards.add(new SetCardInfo("Explosive Vegetation", 263, Rarity.UNCOMMON, mage.cards.e.ExplosiveVegetation.class)); - cards.add(new SetCardInfo("Fade from Memory", 144, Rarity.UNCOMMON, mage.cards.f.FadeFromMemory.class)); - cards.add(new SetCardInfo("Fallen Cleric", 145, Rarity.COMMON, mage.cards.f.FallenCleric.class)); - cards.add(new SetCardInfo("False Cure", 146, Rarity.RARE, mage.cards.f.FalseCure.class)); - cards.add(new SetCardInfo("Feeding Frenzy", 147, Rarity.UNCOMMON, mage.cards.f.FeedingFrenzy.class)); - cards.add(new SetCardInfo("Festering Goblin", 148, Rarity.COMMON, mage.cards.f.FesteringGoblin.class)); - cards.add(new SetCardInfo("Fever Charm", 202, Rarity.COMMON, mage.cards.f.FeverCharm.class)); - cards.add(new SetCardInfo("Flamestick Courier", 203, Rarity.UNCOMMON, mage.cards.f.FlamestickCourier.class)); - cards.add(new SetCardInfo("Fleeting Aven", 83, Rarity.UNCOMMON, mage.cards.f.FleetingAven.class)); - cards.add(new SetCardInfo("Flooded Strand", 316, Rarity.RARE, mage.cards.f.FloodedStrand.class, new CardGraphicInfo(new ObjectColor("UW"), null, false))); - cards.add(new SetCardInfo("Foothill Guide", 29, Rarity.COMMON, mage.cards.f.FoothillGuide.class)); - cards.add(new SetCardInfo("Forest", 347, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Forest", 348, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Forest", 349, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Forest", 350, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Forgotten Cave", 317, Rarity.COMMON, mage.cards.f.ForgottenCave.class)); - cards.add(new SetCardInfo("Frightshroud Courier", 149, Rarity.UNCOMMON, mage.cards.f.FrightshroudCourier.class)); - cards.add(new SetCardInfo("Future Sight", 84, Rarity.RARE, mage.cards.f.FutureSight.class)); - cards.add(new SetCardInfo("Gangrenous Goliath", 150, Rarity.RARE, mage.cards.g.GangrenousGoliath.class)); - cards.add(new SetCardInfo("Ghosthelm Courier", 85, Rarity.UNCOMMON, mage.cards.g.GhosthelmCourier.class)); - cards.add(new SetCardInfo("Gigapede", 264, Rarity.RARE, mage.cards.g.Gigapede.class)); - cards.add(new SetCardInfo("Glory Seeker", 31, Rarity.COMMON, mage.cards.g.GlorySeeker.class)); - cards.add(new SetCardInfo("Gluttonous Zombie", 151, Rarity.UNCOMMON, mage.cards.g.GluttonousZombie.class)); - cards.add(new SetCardInfo("Goblin Burrows", 318, Rarity.UNCOMMON, mage.cards.g.GoblinBurrows.class)); - cards.add(new SetCardInfo("Goblin Machinist", 204, Rarity.UNCOMMON, mage.cards.g.GoblinMachinist.class)); - cards.add(new SetCardInfo("Goblin Piledriver", 205, Rarity.RARE, mage.cards.g.GoblinPiledriver.class)); - cards.add(new SetCardInfo("Goblin Pyromancer", 206, Rarity.RARE, mage.cards.g.GoblinPyromancer.class)); - cards.add(new SetCardInfo("Goblin Sharpshooter", 207, Rarity.RARE, mage.cards.g.GoblinSharpshooter.class)); - cards.add(new SetCardInfo("Goblin Sky Raider", 208, Rarity.COMMON, mage.cards.g.GoblinSkyRaider.class)); - cards.add(new SetCardInfo("Goblin Sledder", 209, Rarity.COMMON, mage.cards.g.GoblinSledder.class)); - cards.add(new SetCardInfo("Goblin Taskmaster", 210, Rarity.COMMON, mage.cards.g.GoblinTaskmaster.class)); - cards.add(new SetCardInfo("Grand Coliseum", 319, Rarity.RARE, mage.cards.g.GrandColiseum.class)); - cards.add(new SetCardInfo("Grand Melee", 211, Rarity.RARE, mage.cards.g.GrandMelee.class)); - cards.add(new SetCardInfo("Grassland Crusader", 32, Rarity.COMMON, mage.cards.g.GrasslandCrusader.class)); - cards.add(new SetCardInfo("Gratuitous Violence", 212, Rarity.RARE, mage.cards.g.GratuitousViolence.class)); - cards.add(new SetCardInfo("Gravel Slinger", 33, Rarity.COMMON, mage.cards.g.GravelSlinger.class)); - cards.add(new SetCardInfo("Gravespawn Sovereign", 152, Rarity.RARE, mage.cards.g.GravespawnSovereign.class)); - cards.add(new SetCardInfo("Grinning Demon", 153, Rarity.RARE, mage.cards.g.GrinningDemon.class)); - cards.add(new SetCardInfo("Gustcloak Harrier", 34, Rarity.COMMON, mage.cards.g.GustcloakHarrier.class)); - cards.add(new SetCardInfo("Gustcloak Runner", 35, Rarity.COMMON, mage.cards.g.GustcloakRunner.class)); - cards.add(new SetCardInfo("Gustcloak Savior", 36, Rarity.RARE, mage.cards.g.GustcloakSavior.class)); - cards.add(new SetCardInfo("Gustcloak Sentinel", 37, Rarity.UNCOMMON, mage.cards.g.GustcloakSentinel.class)); - cards.add(new SetCardInfo("Gustcloak Skirmisher", 38, Rarity.UNCOMMON, mage.cards.g.GustcloakSkirmisher.class)); - cards.add(new SetCardInfo("Harsh Mercy", 39, Rarity.RARE, mage.cards.h.HarshMercy.class)); - cards.add(new SetCardInfo("Haunted Cadaver", 154, Rarity.COMMON, mage.cards.h.HauntedCadaver.class)); - cards.add(new SetCardInfo("Head Games", 155, Rarity.RARE, mage.cards.h.HeadGames.class)); - cards.add(new SetCardInfo("Headhunter", 156, Rarity.UNCOMMON, mage.cards.h.Headhunter.class)); - cards.add(new SetCardInfo("Heedless One", 265, Rarity.UNCOMMON, mage.cards.h.HeedlessOne.class)); - cards.add(new SetCardInfo("Hystrodon", 266, Rarity.RARE, mage.cards.h.Hystrodon.class)); - cards.add(new SetCardInfo("Imagecrafter", 87, Rarity.COMMON, mage.cards.i.Imagecrafter.class)); - cards.add(new SetCardInfo("Improvised Armor", 40, Rarity.UNCOMMON, mage.cards.i.ImprovisedArmor.class)); - cards.add(new SetCardInfo("Infest", 157, Rarity.UNCOMMON, mage.cards.i.Infest.class)); - cards.add(new SetCardInfo("Information Dealer", 88, Rarity.COMMON, mage.cards.i.InformationDealer.class)); - cards.add(new SetCardInfo("Inspirit", 41, Rarity.UNCOMMON, mage.cards.i.Inspirit.class)); - cards.add(new SetCardInfo("Insurrection", 213, Rarity.RARE, mage.cards.i.Insurrection.class)); - cards.add(new SetCardInfo("Invigorating Boon", 267, Rarity.UNCOMMON, mage.cards.i.InvigoratingBoon.class)); - cards.add(new SetCardInfo("Ironfist Crusher", 42, Rarity.UNCOMMON, mage.cards.i.IronfistCrusher.class)); - cards.add(new SetCardInfo("Island", 335, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Island", 336, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Island", 337, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Island", 338, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Ixidor's Will", 90, Rarity.COMMON, mage.cards.i.IxidorsWill.class)); - cards.add(new SetCardInfo("Ixidor, Reality Sculptor", 89, Rarity.RARE, mage.cards.i.IxidorRealitySculptor.class)); - cards.add(new SetCardInfo("Jareth, Leonine Titan", 43, Rarity.RARE, mage.cards.j.JarethLeonineTitan.class)); - cards.add(new SetCardInfo("Kamahl, Fist of Krosa", 268, Rarity.RARE, mage.cards.k.KamahlFistOfKrosa.class)); - cards.add(new SetCardInfo("Kamahl's Summons", 269, Rarity.UNCOMMON, mage.cards.k.KamahlsSummons.class)); - cards.add(new SetCardInfo("Krosan Colossus", 270, Rarity.RARE, mage.cards.k.KrosanColossus.class)); - cards.add(new SetCardInfo("Krosan Groundshaker", 271, Rarity.UNCOMMON, mage.cards.k.KrosanGroundshaker.class)); - cards.add(new SetCardInfo("Krosan Tusker", 272, Rarity.COMMON, mage.cards.k.KrosanTusker.class)); - cards.add(new SetCardInfo("Lavamancer's Skill", 215, Rarity.COMMON, mage.cards.l.LavamancersSkill.class)); - cards.add(new SetCardInfo("Lay Waste", 216, Rarity.COMMON, mage.cards.l.LayWaste.class)); - cards.add(new SetCardInfo("Leery Fogbeast", 273, Rarity.COMMON, mage.cards.l.LeeryFogbeast.class)); - cards.add(new SetCardInfo("Lightning Rift", 217, Rarity.UNCOMMON, mage.cards.l.LightningRift.class)); - cards.add(new SetCardInfo("Lonely Sandbar", 320, Rarity.COMMON, mage.cards.l.LonelySandbar.class)); - cards.add(new SetCardInfo("Mage's Guile", 91, Rarity.COMMON, mage.cards.m.MagesGuile.class)); - cards.add(new SetCardInfo("Mana Echoes", 218, Rarity.RARE, mage.cards.m.ManaEchoes.class)); - cards.add(new SetCardInfo("Menacing Ogre", 219, Rarity.RARE, mage.cards.m.MenacingOgre.class)); - cards.add(new SetCardInfo("Misery Charm", 158, Rarity.COMMON, mage.cards.m.MiseryCharm.class)); - cards.add(new SetCardInfo("Mistform Dreamer", 93, Rarity.COMMON, mage.cards.m.MistformDreamer.class)); - cards.add(new SetCardInfo("Mistform Mask", 94, Rarity.COMMON, mage.cards.m.MistformMask.class)); - cards.add(new SetCardInfo("Mistform Mutant", 95, Rarity.UNCOMMON, mage.cards.m.MistformMutant.class)); - cards.add(new SetCardInfo("Mistform Shrieker", 96, Rarity.UNCOMMON, mage.cards.m.MistformShrieker.class)); - cards.add(new SetCardInfo("Mistform Skyreaver", 97, Rarity.RARE, mage.cards.m.MistformSkyreaver.class)); - cards.add(new SetCardInfo("Mistform Stalker", 98, Rarity.UNCOMMON, mage.cards.m.MistformStalker.class)); - cards.add(new SetCardInfo("Mistform Wall", 99, Rarity.COMMON, mage.cards.m.MistformWall.class)); - cards.add(new SetCardInfo("Mobilization", 44, Rarity.RARE, mage.cards.m.Mobilization.class)); - cards.add(new SetCardInfo("Mountain", 343, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mountain", 344, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mountain", 345, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mountain", 346, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mythic Proportions", 274, Rarity.RARE, mage.cards.m.MythicProportions.class)); - cards.add(new SetCardInfo("Nameless One", 100, Rarity.UNCOMMON, mage.cards.n.NamelessOne.class)); - cards.add(new SetCardInfo("Nantuko Husk", 159, Rarity.COMMON, mage.cards.n.NantukoHusk.class)); - cards.add(new SetCardInfo("Naturalize", 275, Rarity.COMMON, mage.cards.n.Naturalize.class)); - cards.add(new SetCardInfo("Nosy Goblin", 220, Rarity.COMMON, mage.cards.n.NosyGoblin.class)); - cards.add(new SetCardInfo("Nova Cleric", 45, Rarity.UNCOMMON, mage.cards.n.NovaCleric.class)); - cards.add(new SetCardInfo("Oblation", 46, Rarity.RARE, mage.cards.o.Oblation.class)); - cards.add(new SetCardInfo("Oversold Cemetery", 160, Rarity.RARE, mage.cards.o.OversoldCemetery.class)); - cards.add(new SetCardInfo("Overwhelming Instinct", 276, Rarity.UNCOMMON, mage.cards.o.OverwhelmingInstinct.class)); - cards.add(new SetCardInfo("Pacifism", 47, Rarity.COMMON, mage.cards.p.Pacifism.class)); - cards.add(new SetCardInfo("Patriarch's Bidding", 161, Rarity.RARE, mage.cards.p.PatriarchsBidding.class)); - cards.add(new SetCardInfo("Pearlspear Courier", 48, Rarity.UNCOMMON, mage.cards.p.PearlspearCourier.class)); - cards.add(new SetCardInfo("Peer Pressure", 101, Rarity.RARE, mage.cards.p.PeerPressure.class)); - cards.add(new SetCardInfo("Piety Charm", 49, Rarity.COMMON, mage.cards.p.PietyCharm.class)); - cards.add(new SetCardInfo("Pinpoint Avalanche", 221, Rarity.COMMON, mage.cards.p.PinpointAvalanche.class)); - cards.add(new SetCardInfo("Plains", 331, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Plains", 332, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Plains", 333, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Plains", 334, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Polluted Delta", 321, Rarity.RARE, mage.cards.p.PollutedDelta.class, new CardGraphicInfo(new ObjectColor("UB"), null, false))); - cards.add(new SetCardInfo("Primal Boost", 277, Rarity.UNCOMMON, mage.cards.p.PrimalBoost.class)); - cards.add(new SetCardInfo("Profane Prayers", 162, Rarity.COMMON, mage.cards.p.ProfanePrayers.class)); - cards.add(new SetCardInfo("Prowling Pangolin", 163, Rarity.UNCOMMON, mage.cards.p.ProwlingPangolin.class)); - cards.add(new SetCardInfo("Psychic Trance", 102, Rarity.RARE, mage.cards.p.PsychicTrance.class)); - cards.add(new SetCardInfo("Quicksilver Dragon", 103, Rarity.RARE, mage.cards.q.QuicksilverDragon.class)); - cards.add(new SetCardInfo("Ravenous Baloth", 278, Rarity.RARE, mage.cards.r.RavenousBaloth.class)); - cards.add(new SetCardInfo("Read the Runes", 104, Rarity.RARE, mage.cards.r.ReadTheRunes.class)); - cards.add(new SetCardInfo("Reckless One", 222, Rarity.UNCOMMON, mage.cards.r.RecklessOne.class)); - cards.add(new SetCardInfo("Reminisce", 105, Rarity.UNCOMMON, mage.cards.r.Reminisce.class)); - cards.add(new SetCardInfo("Renewed Faith", 50, Rarity.COMMON, mage.cards.r.RenewedFaith.class)); - cards.add(new SetCardInfo("Righteous Cause", 51, Rarity.UNCOMMON, mage.cards.r.RighteousCause.class)); - cards.add(new SetCardInfo("Riptide Biologist", 106, Rarity.COMMON, mage.cards.r.RiptideBiologist.class)); - cards.add(new SetCardInfo("Riptide Chronologist", 107, Rarity.UNCOMMON, mage.cards.r.RiptideChronologist.class)); - cards.add(new SetCardInfo("Riptide Entrancer", 108, Rarity.RARE, mage.cards.r.RiptideEntrancer.class)); - cards.add(new SetCardInfo("Riptide Laboratory", 322, Rarity.RARE, mage.cards.r.RiptideLaboratory.class)); - cards.add(new SetCardInfo("Riptide Replicator", 309, Rarity.RARE, mage.cards.r.RiptideReplicator.class)); - cards.add(new SetCardInfo("Riptide Shapeshifter", 109, Rarity.UNCOMMON, mage.cards.r.RiptideShapeshifter.class)); - cards.add(new SetCardInfo("Risky Move", 223, Rarity.RARE, mage.cards.r.RiskyMove.class)); - cards.add(new SetCardInfo("Rorix Bladewing", 224, Rarity.RARE, mage.cards.r.RorixBladewing.class)); - cards.add(new SetCardInfo("Rotlung Reanimator", 164, Rarity.RARE, mage.cards.r.RotlungReanimator.class)); - cards.add(new SetCardInfo("Rummaging Wizard", 110, Rarity.UNCOMMON, mage.cards.r.RummagingWizard.class)); - cards.add(new SetCardInfo("Run Wild", 279, Rarity.UNCOMMON, mage.cards.r.RunWild.class)); - cards.add(new SetCardInfo("Sage Aven", 111, Rarity.COMMON, mage.cards.s.SageAven.class)); - cards.add(new SetCardInfo("Sandskin", 52, Rarity.COMMON, mage.cards.s.Sandskin.class)); - cards.add(new SetCardInfo("Screaming Seahawk", 112, Rarity.COMMON, mage.cards.s.ScreamingSeahawk.class)); - cards.add(new SetCardInfo("Screeching Buzzard", 165, Rarity.COMMON, mage.cards.s.ScreechingBuzzard.class)); - cards.add(new SetCardInfo("Searing Flesh", 225, Rarity.UNCOMMON, mage.cards.s.SearingFlesh.class)); - cards.add(new SetCardInfo("Sea's Claim", 113, Rarity.COMMON, mage.cards.s.SeasClaim.class)); - cards.add(new SetCardInfo("Seaside Haven", 323, Rarity.UNCOMMON, mage.cards.s.SeasideHaven.class)); - cards.add(new SetCardInfo("Secluded Steppe", 324, Rarity.COMMON, mage.cards.s.SecludedSteppe.class)); - cards.add(new SetCardInfo("Serpentine Basilisk", 280, Rarity.UNCOMMON, mage.cards.s.SerpentineBasilisk.class)); - cards.add(new SetCardInfo("Severed Legion", 166, Rarity.COMMON, mage.cards.s.SeveredLegion.class)); - cards.add(new SetCardInfo("Shade's Breath", 167, Rarity.UNCOMMON, mage.cards.s.ShadesBreath.class)); - cards.add(new SetCardInfo("Shaleskin Bruiser", 226, Rarity.UNCOMMON, mage.cards.s.ShaleskinBruiser.class)); - cards.add(new SetCardInfo("Shared Triumph", 53, Rarity.RARE, mage.cards.s.SharedTriumph.class)); - cards.add(new SetCardInfo("Shepherd of Rot", 168, Rarity.COMMON, mage.cards.s.ShepherdOfRot.class)); - cards.add(new SetCardInfo("Shieldmage Elder", 54, Rarity.UNCOMMON, mage.cards.s.ShieldmageElder.class)); - cards.add(new SetCardInfo("Shock", 227, Rarity.COMMON, mage.cards.s.Shock.class)); - cards.add(new SetCardInfo("Sigil of the New Dawn", 55, Rarity.RARE, mage.cards.s.SigilOfTheNewDawn.class)); - cards.add(new SetCardInfo("Silent Specter", 169, Rarity.RARE, mage.cards.s.SilentSpecter.class)); - cards.add(new SetCardInfo("Silklash Spider", 281, Rarity.RARE, mage.cards.s.SilklashSpider.class)); - cards.add(new SetCardInfo("Silvos, Rogue Elemental", 282, Rarity.RARE, mage.cards.s.SilvosRogueElemental.class)); - cards.add(new SetCardInfo("Skirk Fire Marshal", 229, Rarity.RARE, mage.cards.s.SkirkFireMarshal.class)); - cards.add(new SetCardInfo("Skirk Prospector", 230, Rarity.COMMON, mage.cards.s.SkirkProspector.class)); - cards.add(new SetCardInfo("Skittish Valesk", 231, Rarity.UNCOMMON, mage.cards.s.SkittishValesk.class)); - cards.add(new SetCardInfo("Slate of Ancestry", 310, Rarity.RARE, mage.cards.s.SlateOfAncestry.class)); - cards.add(new SetCardInfo("Slice and Dice", 232, Rarity.UNCOMMON, mage.cards.s.SliceAndDice.class)); - cards.add(new SetCardInfo("Slipstream Eel", 114, Rarity.COMMON, mage.cards.s.SlipstreamEel.class)); - cards.add(new SetCardInfo("Smother", 170, Rarity.UNCOMMON, mage.cards.s.Smother.class)); - cards.add(new SetCardInfo("Snarling Undorak", 283, Rarity.COMMON, mage.cards.s.SnarlingUndorak.class)); - cards.add(new SetCardInfo("Solar Blast", 234, Rarity.COMMON, mage.cards.s.SolarBlast.class)); - cards.add(new SetCardInfo("Soulless One", 171, Rarity.UNCOMMON, mage.cards.s.SoullessOne.class)); - cards.add(new SetCardInfo("Sparksmith", 235, Rarity.COMMON, mage.cards.s.Sparksmith.class)); - cards.add(new SetCardInfo("Spined Basher", 172, Rarity.COMMON, mage.cards.s.SpinedBasher.class)); - cards.add(new SetCardInfo("Spitfire Handler", 236, Rarity.UNCOMMON, mage.cards.s.SpitfireHandler.class)); - cards.add(new SetCardInfo("Spitting Gourna", 284, Rarity.COMMON, mage.cards.s.SpittingGourna.class)); - cards.add(new SetCardInfo("Spurred Wolverine", 237, Rarity.COMMON, mage.cards.s.SpurredWolverine.class)); - cards.add(new SetCardInfo("Spy Network", 115, Rarity.COMMON, mage.cards.s.SpyNetwork.class)); - cards.add(new SetCardInfo("Stag Beetle", 285, Rarity.RARE, mage.cards.s.StagBeetle.class)); - cards.add(new SetCardInfo("Standardize", 116, Rarity.RARE, mage.cards.s.Standardize.class)); - cards.add(new SetCardInfo("Starlit Sanctum", 325, Rarity.UNCOMMON, mage.cards.s.StarlitSanctum.class)); - cards.add(new SetCardInfo("Starstorm", 238, Rarity.RARE, mage.cards.s.Starstorm.class)); - cards.add(new SetCardInfo("Steely Resolve", 286, Rarity.RARE, mage.cards.s.SteelyResolve.class)); - cards.add(new SetCardInfo("Strongarm Tactics", 173, Rarity.RARE, mage.cards.s.StrongarmTactics.class)); - cards.add(new SetCardInfo("Sunfire Balm", 56, Rarity.UNCOMMON, mage.cards.s.SunfireBalm.class)); - cards.add(new SetCardInfo("Supreme Inquisitor", 117, Rarity.RARE, mage.cards.s.SupremeInquisitor.class)); - cards.add(new SetCardInfo("Swamp", 339, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Swamp", 340, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Swamp", 341, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Swamp", 342, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Swat", 174, Rarity.COMMON, mage.cards.s.Swat.class)); - cards.add(new SetCardInfo("Symbiotic Beast", 287, Rarity.UNCOMMON, mage.cards.s.SymbioticBeast.class)); - cards.add(new SetCardInfo("Symbiotic Elf", 288, Rarity.COMMON, mage.cards.s.SymbioticElf.class)); - cards.add(new SetCardInfo("Symbiotic Wurm", 289, Rarity.RARE, mage.cards.s.SymbioticWurm.class)); - cards.add(new SetCardInfo("Syphon Mind", 175, Rarity.COMMON, mage.cards.s.SyphonMind.class)); - cards.add(new SetCardInfo("Syphon Soul", 176, Rarity.COMMON, mage.cards.s.SyphonSoul.class)); - cards.add(new SetCardInfo("Taunting Elf", 290, Rarity.COMMON, mage.cards.t.TauntingElf.class)); - cards.add(new SetCardInfo("Tempting Wurm", 291, Rarity.RARE, mage.cards.t.TemptingWurm.class)); - cards.add(new SetCardInfo("Tephraderm", 239, Rarity.RARE, mage.cards.t.Tephraderm.class)); - cards.add(new SetCardInfo("Thrashing Mudspawn", 177, Rarity.UNCOMMON, mage.cards.t.ThrashingMudspawn.class)); - cards.add(new SetCardInfo("Threaten", 241, Rarity.UNCOMMON, mage.cards.t.Threaten.class)); - cards.add(new SetCardInfo("Thunder of Hooves", 242, Rarity.UNCOMMON, mage.cards.t.ThunderOfHooves.class)); - cards.add(new SetCardInfo("Towering Baloth", 292, Rarity.UNCOMMON, mage.cards.t.ToweringBaloth.class)); - cards.add(new SetCardInfo("Trade Secrets", 118, Rarity.RARE, mage.cards.t.TradeSecrets.class)); - cards.add(new SetCardInfo("Tranquil Thicket", 326, Rarity.COMMON, mage.cards.t.TranquilThicket.class)); - cards.add(new SetCardInfo("Treespring Lorian", 293, Rarity.COMMON, mage.cards.t.TreespringLorian.class)); - cards.add(new SetCardInfo("Tribal Golem", 311, Rarity.RARE, mage.cards.t.TribalGolem.class)); - cards.add(new SetCardInfo("Tribal Unity", 294, Rarity.UNCOMMON, mage.cards.t.TribalUnity.class)); - cards.add(new SetCardInfo("Trickery Charm", 119, Rarity.COMMON, mage.cards.t.TrickeryCharm.class)); - cards.add(new SetCardInfo("True Believer", 57, Rarity.RARE, mage.cards.t.TrueBeliever.class)); - cards.add(new SetCardInfo("Undead Gladiator", 178, Rarity.RARE, mage.cards.u.UndeadGladiator.class)); - cards.add(new SetCardInfo("Unholy Grotto", 327, Rarity.RARE, mage.cards.u.UnholyGrotto.class)); - cards.add(new SetCardInfo("Unified Strike", 58, Rarity.COMMON, mage.cards.u.UnifiedStrike.class)); - cards.add(new SetCardInfo("Venomspout Brackus", 295, Rarity.UNCOMMON, mage.cards.v.VenomspoutBrackus.class)); - cards.add(new SetCardInfo("Visara the Dreadful", 179, Rarity.RARE, mage.cards.v.VisaraTheDreadful.class)); - cards.add(new SetCardInfo("Vitality Charm", 296, Rarity.COMMON, mage.cards.v.VitalityCharm.class)); - cards.add(new SetCardInfo("Voice of the Woods", 297, Rarity.RARE, mage.cards.v.VoiceOfTheWoods.class)); - cards.add(new SetCardInfo("Voidmage Prodigy", 120, Rarity.RARE, mage.cards.v.VoidmageProdigy.class)); - cards.add(new SetCardInfo("Walking Desecration", 180, Rarity.UNCOMMON, mage.cards.w.WalkingDesecration.class)); - cards.add(new SetCardInfo("Wall of Mulch", 298, Rarity.UNCOMMON, mage.cards.w.WallOfMulch.class)); - cards.add(new SetCardInfo("Wave of Indifference", 243, Rarity.COMMON, mage.cards.w.WaveOfIndifference.class)); - cards.add(new SetCardInfo("Weathered Wayfarer", 59, Rarity.RARE, mage.cards.w.WeatheredWayfarer.class)); - cards.add(new SetCardInfo("Weird Harvest", 299, Rarity.RARE, mage.cards.w.WeirdHarvest.class)); - cards.add(new SetCardInfo("Wellwisher", 300, Rarity.COMMON, mage.cards.w.Wellwisher.class)); - cards.add(new SetCardInfo("Wheel and Deal", 121, Rarity.RARE, mage.cards.w.WheelAndDeal.class)); - cards.add(new SetCardInfo("Whipcorder", 60, Rarity.UNCOMMON, mage.cards.w.Whipcorder.class)); - cards.add(new SetCardInfo("Windswept Heath", 328, Rarity.RARE, mage.cards.w.WindsweptHeath.class, new CardGraphicInfo(new ObjectColor("GW"), null, false))); - cards.add(new SetCardInfo("Wirewood Elf", 301, Rarity.COMMON, mage.cards.w.WirewoodElf.class)); - cards.add(new SetCardInfo("Wirewood Herald", 302, Rarity.COMMON, mage.cards.w.WirewoodHerald.class)); - cards.add(new SetCardInfo("Wirewood Lodge", 329, Rarity.RARE, mage.cards.w.WirewoodLodge.class)); - cards.add(new SetCardInfo("Wirewood Pride", 303, Rarity.COMMON, mage.cards.w.WirewoodPride.class)); - cards.add(new SetCardInfo("Wirewood Savage", 304, Rarity.COMMON, mage.cards.w.WirewoodSavage.class)); - cards.add(new SetCardInfo("Withering Hex", 181, Rarity.UNCOMMON, mage.cards.w.WitheringHex.class)); - cards.add(new SetCardInfo("Wooded Foothills", 330, Rarity.RARE, mage.cards.w.WoodedFoothills.class, new CardGraphicInfo(new ObjectColor("RG"), null, false))); - cards.add(new SetCardInfo("Words of War", 244, Rarity.RARE, mage.cards.w.WordsOfWar.class)); - cards.add(new SetCardInfo("Words of Waste", 182, Rarity.RARE, mage.cards.w.WordsOfWaste.class)); - cards.add(new SetCardInfo("Words of Wilding", 305, Rarity.RARE, mage.cards.w.WordsOfWilding.class)); - cards.add(new SetCardInfo("Words of Wind", 122, Rarity.RARE, mage.cards.w.WordsOfWind.class)); - cards.add(new SetCardInfo("Words of Worship", 61, Rarity.RARE, mage.cards.w.WordsOfWorship.class)); - cards.add(new SetCardInfo("Wretched Anurid", 183, Rarity.COMMON, mage.cards.w.WretchedAnurid.class)); - } -} +package mage.sets; + +import mage.ObjectColor; +import mage.cards.CardGraphicInfo; +import mage.cards.ExpansionSet; +import mage.constants.Rarity; +import mage.constants.SetType; + +public class Onslaught extends ExpansionSet { + + private static final Onslaught instance = new Onslaught(); + + public static Onslaught getInstance() { + return instance; + } + + private Onslaught() { + super("Onslaught", "ONS", ExpansionSet.buildDate(2002, 10, 7), SetType.EXPANSION); + this.blockName = "Onslaught"; + this.hasBoosters = true; + this.numBoosterLands = 0; + this.numBoosterCommon = 11; + this.numBoosterUncommon = 3; + this.numBoosterRare = 1; + this.ratioBoosterMythic = 0; + cards.add(new SetCardInfo("Accursed Centaur", 123, Rarity.COMMON, mage.cards.a.AccursedCentaur.class)); + cards.add(new SetCardInfo("Aether Charge", 184, Rarity.UNCOMMON, mage.cards.a.AetherCharge.class)); + cards.add(new SetCardInfo("Aggravated Assault", 185, Rarity.RARE, mage.cards.a.AggravatedAssault.class)); + cards.add(new SetCardInfo("Airborne Aid", 62, Rarity.COMMON, mage.cards.a.AirborneAid.class)); + cards.add(new SetCardInfo("Airdrop Condor", 186, Rarity.UNCOMMON, mage.cards.a.AirdropCondor.class)); + cards.add(new SetCardInfo("Akroma's Blessing", 1, Rarity.UNCOMMON, mage.cards.a.AkromasBlessing.class)); + cards.add(new SetCardInfo("Akroma's Vengeance", 2, Rarity.RARE, mage.cards.a.AkromasVengeance.class)); + cards.add(new SetCardInfo("Ancestor's Prophet", 3, Rarity.RARE, mage.cards.a.AncestorsProphet.class)); + cards.add(new SetCardInfo("Animal Magnetism", 245, Rarity.RARE, mage.cards.a.AnimalMagnetism.class)); + cards.add(new SetCardInfo("Annex", 63, Rarity.UNCOMMON, mage.cards.a.Annex.class)); + cards.add(new SetCardInfo("Anurid Murkdiver", 124, Rarity.COMMON, mage.cards.a.AnuridMurkdiver.class)); + cards.add(new SetCardInfo("Aphetto Alchemist", 64, Rarity.UNCOMMON, mage.cards.a.AphettoAlchemist.class)); + cards.add(new SetCardInfo("Aphetto Dredging", 125, Rarity.COMMON, mage.cards.a.AphettoDredging.class)); + cards.add(new SetCardInfo("Aphetto Grifter", 65, Rarity.UNCOMMON, mage.cards.a.AphettoGrifter.class)); + cards.add(new SetCardInfo("Aphetto Vulture", 126, Rarity.UNCOMMON, mage.cards.a.AphettoVulture.class)); + cards.add(new SetCardInfo("Arcanis the Omnipotent", 66, Rarity.RARE, mage.cards.a.ArcanisTheOmnipotent.class)); + cards.add(new SetCardInfo("Ascending Aven", 68, Rarity.COMMON, mage.cards.a.AscendingAven.class)); + cards.add(new SetCardInfo("Astral Slide", 4, Rarity.UNCOMMON, mage.cards.a.AstralSlide.class)); + cards.add(new SetCardInfo("Aura Extraction", 5, Rarity.UNCOMMON, mage.cards.a.AuraExtraction.class)); + cards.add(new SetCardInfo("Aurification", 6, Rarity.RARE, mage.cards.a.Aurification.class)); + cards.add(new SetCardInfo("Avarax", 187, Rarity.UNCOMMON, mage.cards.a.Avarax.class)); + cards.add(new SetCardInfo("Aven Brigadier", 7, Rarity.RARE, mage.cards.a.AvenBrigadier.class)); + cards.add(new SetCardInfo("Aven Fateshaper", 69, Rarity.UNCOMMON, mage.cards.a.AvenFateshaper.class)); + cards.add(new SetCardInfo("Aven Soulgazer", 8, Rarity.UNCOMMON, mage.cards.a.AvenSoulgazer.class)); + cards.add(new SetCardInfo("Backslide", 70, Rarity.COMMON, mage.cards.b.Backslide.class)); + cards.add(new SetCardInfo("Barkhide Mauler", 246, Rarity.COMMON, mage.cards.b.BarkhideMauler.class)); + cards.add(new SetCardInfo("Barren Moor", 312, Rarity.COMMON, mage.cards.b.BarrenMoor.class)); + cards.add(new SetCardInfo("Battering Craghorn", 188, Rarity.COMMON, mage.cards.b.BatteringCraghorn.class)); + cards.add(new SetCardInfo("Biorhythm", 247, Rarity.RARE, mage.cards.b.Biorhythm.class)); + cards.add(new SetCardInfo("Birchlore Rangers", 248, Rarity.COMMON, mage.cards.b.BirchloreRangers.class)); + cards.add(new SetCardInfo("Blackmail", 127, Rarity.UNCOMMON, mage.cards.b.Blackmail.class)); + cards.add(new SetCardInfo("Blatant Thievery", 71, Rarity.RARE, mage.cards.b.BlatantThievery.class)); + cards.add(new SetCardInfo("Blistering Firecat", 189, Rarity.RARE, mage.cards.b.BlisteringFirecat.class)); + cards.add(new SetCardInfo("Bloodline Shaman", 249, Rarity.UNCOMMON, mage.cards.b.BloodlineShaman.class)); + cards.add(new SetCardInfo("Bloodstained Mire", 313, Rarity.RARE, mage.cards.b.BloodstainedMire.class, new CardGraphicInfo(new ObjectColor("RB"), null, false))); + cards.add(new SetCardInfo("Boneknitter", 128, Rarity.UNCOMMON, mage.cards.b.Boneknitter.class)); + cards.add(new SetCardInfo("Break Open", 190, Rarity.COMMON, mage.cards.b.BreakOpen.class)); + cards.add(new SetCardInfo("Brightstone Ritual", 191, Rarity.COMMON, mage.cards.b.BrightstoneRitual.class)); + cards.add(new SetCardInfo("Broodhatch Nantuko", 250, Rarity.UNCOMMON, mage.cards.b.BroodhatchNantuko.class)); + cards.add(new SetCardInfo("Butcher Orgg", 192, Rarity.RARE, mage.cards.b.ButcherOrgg.class)); + cards.add(new SetCardInfo("Cabal Archon", 129, Rarity.UNCOMMON, mage.cards.c.CabalArchon.class)); + cards.add(new SetCardInfo("Cabal Executioner", 130, Rarity.UNCOMMON, mage.cards.c.CabalExecutioner.class)); + cards.add(new SetCardInfo("Cabal Slaver", 131, Rarity.UNCOMMON, mage.cards.c.CabalSlaver.class)); + cards.add(new SetCardInfo("Callous Oppressor", 72, Rarity.RARE, mage.cards.c.CallousOppressor.class)); + cards.add(new SetCardInfo("Catapult Master", 10, Rarity.RARE, mage.cards.c.CatapultMaster.class)); + cards.add(new SetCardInfo("Catapult Squad", 11, Rarity.UNCOMMON, mage.cards.c.CatapultSquad.class)); + cards.add(new SetCardInfo("Centaur Glade", 251, Rarity.UNCOMMON, mage.cards.c.CentaurGlade.class)); + cards.add(new SetCardInfo("Chain of Acid", 252, Rarity.UNCOMMON, mage.cards.c.ChainOfAcid.class)); + cards.add(new SetCardInfo("Chain of Plasma", 193, Rarity.UNCOMMON, mage.cards.c.ChainOfPlasma.class)); + cards.add(new SetCardInfo("Chain of Silence", 12, Rarity.UNCOMMON, mage.cards.c.ChainOfSilence.class)); + cards.add(new SetCardInfo("Chain of Smog", 132, Rarity.UNCOMMON, mage.cards.c.ChainOfSmog.class)); + cards.add(new SetCardInfo("Chain of Vapor", 73, Rarity.UNCOMMON, mage.cards.c.ChainOfVapor.class)); + cards.add(new SetCardInfo("Charging Slateback", 194, Rarity.COMMON, mage.cards.c.ChargingSlateback.class)); + cards.add(new SetCardInfo("Choking Tethers", 74, Rarity.COMMON, mage.cards.c.ChokingTethers.class)); + cards.add(new SetCardInfo("Clone", 75, Rarity.RARE, mage.cards.c.Clone.class)); + cards.add(new SetCardInfo("Complicate", 76, Rarity.UNCOMMON, mage.cards.c.Complicate.class)); + cards.add(new SetCardInfo("Contested Cliffs", 314, Rarity.RARE, mage.cards.c.ContestedCliffs.class)); + cards.add(new SetCardInfo("Convalescent Care", 14, Rarity.RARE, mage.cards.c.ConvalescentCare.class)); + cards.add(new SetCardInfo("Cover of Darkness", 133, Rarity.RARE, mage.cards.c.CoverOfDarkness.class)); + cards.add(new SetCardInfo("Crafty Pathmage", 77, Rarity.COMMON, mage.cards.c.CraftyPathmage.class)); + cards.add(new SetCardInfo("Crowd Favorites", 15, Rarity.UNCOMMON, mage.cards.c.CrowdFavorites.class)); + cards.add(new SetCardInfo("Crude Rampart", 17, Rarity.UNCOMMON, mage.cards.c.CrudeRampart.class)); + cards.add(new SetCardInfo("Cruel Revival", 135, Rarity.COMMON, mage.cards.c.CruelRevival.class)); + cards.add(new SetCardInfo("Cryptic Gateway", 306, Rarity.RARE, mage.cards.c.CrypticGateway.class)); + cards.add(new SetCardInfo("Custody Battle", 197, Rarity.UNCOMMON, mage.cards.c.CustodyBattle.class)); + cards.add(new SetCardInfo("Daru Cavalier", 18, Rarity.COMMON, mage.cards.d.DaruCavalier.class)); + cards.add(new SetCardInfo("Daru Encampment", 315, Rarity.UNCOMMON, mage.cards.d.DaruEncampment.class)); + cards.add(new SetCardInfo("Daru Healer", 19, Rarity.COMMON, mage.cards.d.DaruHealer.class)); + cards.add(new SetCardInfo("Daru Lancer", 20, Rarity.COMMON, mage.cards.d.DaruLancer.class)); + cards.add(new SetCardInfo("Daunting Defender", 21, Rarity.COMMON, mage.cards.d.DauntingDefender.class)); + cards.add(new SetCardInfo("Dawning Purist", 22, Rarity.UNCOMMON, mage.cards.d.DawningPurist.class)); + cards.add(new SetCardInfo("Death Match", 136, Rarity.RARE, mage.cards.d.DeathMatch.class)); + cards.add(new SetCardInfo("Death Pulse", 137, Rarity.UNCOMMON, mage.cards.d.DeathPulse.class)); + cards.add(new SetCardInfo("Demystify", 24, Rarity.COMMON, mage.cards.d.Demystify.class)); + cards.add(new SetCardInfo("Dirge of Dread", 138, Rarity.COMMON, mage.cards.d.DirgeOfDread.class)); + cards.add(new SetCardInfo("Disciple of Grace", 25, Rarity.COMMON, mage.cards.d.DiscipleOfGrace.class)); + cards.add(new SetCardInfo("Disciple of Malice", 139, Rarity.COMMON, mage.cards.d.DiscipleOfMalice.class)); + cards.add(new SetCardInfo("Discombobulate", 79, Rarity.UNCOMMON, mage.cards.d.Discombobulate.class)); + cards.add(new SetCardInfo("Dispersing Orb", 80, Rarity.UNCOMMON, mage.cards.d.DispersingOrb.class)); + cards.add(new SetCardInfo("Disruptive Pitmage", 81, Rarity.COMMON, mage.cards.d.DisruptivePitmage.class)); + cards.add(new SetCardInfo("Dive Bomber", 26, Rarity.COMMON, mage.cards.d.DiveBomber.class)); + cards.add(new SetCardInfo("Doom Cannon", 307, Rarity.RARE, mage.cards.d.DoomCannon.class)); + cards.add(new SetCardInfo("Doomed Necromancer", 140, Rarity.RARE, mage.cards.d.DoomedNecromancer.class)); + cards.add(new SetCardInfo("Doubtless One", 27, Rarity.UNCOMMON, mage.cards.d.DoubtlessOne.class)); + cards.add(new SetCardInfo("Dragon Roost", 198, Rarity.RARE, mage.cards.d.DragonRoost.class)); + cards.add(new SetCardInfo("Dream Chisel", 308, Rarity.RARE, mage.cards.d.DreamChisel.class)); + cards.add(new SetCardInfo("Dwarven Blastminer", 199, Rarity.UNCOMMON, mage.cards.d.DwarvenBlastminer.class)); + cards.add(new SetCardInfo("Ebonblade Reaper", 141, Rarity.RARE, mage.cards.e.EbonbladeReaper.class)); + cards.add(new SetCardInfo("Elven Riders", 254, Rarity.UNCOMMON, mage.cards.e.ElvenRiders.class)); + cards.add(new SetCardInfo("Elvish Guidance", 255, Rarity.COMMON, mage.cards.e.ElvishGuidance.class)); + cards.add(new SetCardInfo("Elvish Pathcutter", 256, Rarity.COMMON, mage.cards.e.ElvishPathcutter.class)); + cards.add(new SetCardInfo("Elvish Pioneer", 257, Rarity.COMMON, mage.cards.e.ElvishPioneer.class)); + cards.add(new SetCardInfo("Elvish Scrapper", 258, Rarity.UNCOMMON, mage.cards.e.ElvishScrapper.class)); + cards.add(new SetCardInfo("Elvish Vanguard", 259, Rarity.RARE, mage.cards.e.ElvishVanguard.class)); + cards.add(new SetCardInfo("Elvish Warrior", 260, Rarity.COMMON, mage.cards.e.ElvishWarrior.class)); + cards.add(new SetCardInfo("Embermage Goblin", 200, Rarity.UNCOMMON, mage.cards.e.EmbermageGoblin.class)); + cards.add(new SetCardInfo("Enchantress's Presence", 261, Rarity.RARE, mage.cards.e.EnchantresssPresence.class)); + cards.add(new SetCardInfo("Entrails Feaster", 143, Rarity.RARE, mage.cards.e.EntrailsFeaster.class)); + cards.add(new SetCardInfo("Erratic Explosion", 201, Rarity.COMMON, mage.cards.e.ErraticExplosion.class)); + cards.add(new SetCardInfo("Essence Fracture", 82, Rarity.UNCOMMON, mage.cards.e.EssenceFracture.class)); + cards.add(new SetCardInfo("Everglove Courier", 262, Rarity.UNCOMMON, mage.cards.e.EvergloveCourier.class)); + cards.add(new SetCardInfo("Exalted Angel", 28, Rarity.RARE, mage.cards.e.ExaltedAngel.class)); + cards.add(new SetCardInfo("Explosive Vegetation", 263, Rarity.UNCOMMON, mage.cards.e.ExplosiveVegetation.class)); + cards.add(new SetCardInfo("Fade from Memory", 144, Rarity.UNCOMMON, mage.cards.f.FadeFromMemory.class)); + cards.add(new SetCardInfo("Fallen Cleric", 145, Rarity.COMMON, mage.cards.f.FallenCleric.class)); + cards.add(new SetCardInfo("False Cure", 146, Rarity.RARE, mage.cards.f.FalseCure.class)); + cards.add(new SetCardInfo("Feeding Frenzy", 147, Rarity.UNCOMMON, mage.cards.f.FeedingFrenzy.class)); + cards.add(new SetCardInfo("Festering Goblin", 148, Rarity.COMMON, mage.cards.f.FesteringGoblin.class)); + cards.add(new SetCardInfo("Fever Charm", 202, Rarity.COMMON, mage.cards.f.FeverCharm.class)); + cards.add(new SetCardInfo("Flamestick Courier", 203, Rarity.UNCOMMON, mage.cards.f.FlamestickCourier.class)); + cards.add(new SetCardInfo("Fleeting Aven", 83, Rarity.UNCOMMON, mage.cards.f.FleetingAven.class)); + cards.add(new SetCardInfo("Flooded Strand", 316, Rarity.RARE, mage.cards.f.FloodedStrand.class, new CardGraphicInfo(new ObjectColor("UW"), null, false))); + cards.add(new SetCardInfo("Foothill Guide", 29, Rarity.COMMON, mage.cards.f.FoothillGuide.class)); + cards.add(new SetCardInfo("Forest", 347, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 348, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 349, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 350, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forgotten Cave", 317, Rarity.COMMON, mage.cards.f.ForgottenCave.class)); + cards.add(new SetCardInfo("Frightshroud Courier", 149, Rarity.UNCOMMON, mage.cards.f.FrightshroudCourier.class)); + cards.add(new SetCardInfo("Future Sight", 84, Rarity.RARE, mage.cards.f.FutureSight.class)); + cards.add(new SetCardInfo("Gangrenous Goliath", 150, Rarity.RARE, mage.cards.g.GangrenousGoliath.class)); + cards.add(new SetCardInfo("Ghosthelm Courier", 85, Rarity.UNCOMMON, mage.cards.g.GhosthelmCourier.class)); + cards.add(new SetCardInfo("Gigapede", 264, Rarity.RARE, mage.cards.g.Gigapede.class)); + cards.add(new SetCardInfo("Glarecaster", 30, Rarity.RARE, mage.cards.g.Glarecaster.class)); + cards.add(new SetCardInfo("Glory Seeker", 31, Rarity.COMMON, mage.cards.g.GlorySeeker.class)); + cards.add(new SetCardInfo("Gluttonous Zombie", 151, Rarity.UNCOMMON, mage.cards.g.GluttonousZombie.class)); + cards.add(new SetCardInfo("Goblin Burrows", 318, Rarity.UNCOMMON, mage.cards.g.GoblinBurrows.class)); + cards.add(new SetCardInfo("Goblin Machinist", 204, Rarity.UNCOMMON, mage.cards.g.GoblinMachinist.class)); + cards.add(new SetCardInfo("Goblin Piledriver", 205, Rarity.RARE, mage.cards.g.GoblinPiledriver.class)); + cards.add(new SetCardInfo("Goblin Pyromancer", 206, Rarity.RARE, mage.cards.g.GoblinPyromancer.class)); + cards.add(new SetCardInfo("Goblin Sharpshooter", 207, Rarity.RARE, mage.cards.g.GoblinSharpshooter.class)); + cards.add(new SetCardInfo("Goblin Sky Raider", 208, Rarity.COMMON, mage.cards.g.GoblinSkyRaider.class)); + cards.add(new SetCardInfo("Goblin Sledder", 209, Rarity.COMMON, mage.cards.g.GoblinSledder.class)); + cards.add(new SetCardInfo("Goblin Taskmaster", 210, Rarity.COMMON, mage.cards.g.GoblinTaskmaster.class)); + cards.add(new SetCardInfo("Grand Coliseum", 319, Rarity.RARE, mage.cards.g.GrandColiseum.class)); + cards.add(new SetCardInfo("Grand Melee", 211, Rarity.RARE, mage.cards.g.GrandMelee.class)); + cards.add(new SetCardInfo("Grassland Crusader", 32, Rarity.COMMON, mage.cards.g.GrasslandCrusader.class)); + cards.add(new SetCardInfo("Gratuitous Violence", 212, Rarity.RARE, mage.cards.g.GratuitousViolence.class)); + cards.add(new SetCardInfo("Gravel Slinger", 33, Rarity.COMMON, mage.cards.g.GravelSlinger.class)); + cards.add(new SetCardInfo("Gravespawn Sovereign", 152, Rarity.RARE, mage.cards.g.GravespawnSovereign.class)); + cards.add(new SetCardInfo("Grinning Demon", 153, Rarity.RARE, mage.cards.g.GrinningDemon.class)); + cards.add(new SetCardInfo("Gustcloak Harrier", 34, Rarity.COMMON, mage.cards.g.GustcloakHarrier.class)); + cards.add(new SetCardInfo("Gustcloak Runner", 35, Rarity.COMMON, mage.cards.g.GustcloakRunner.class)); + cards.add(new SetCardInfo("Gustcloak Savior", 36, Rarity.RARE, mage.cards.g.GustcloakSavior.class)); + cards.add(new SetCardInfo("Gustcloak Sentinel", 37, Rarity.UNCOMMON, mage.cards.g.GustcloakSentinel.class)); + cards.add(new SetCardInfo("Gustcloak Skirmisher", 38, Rarity.UNCOMMON, mage.cards.g.GustcloakSkirmisher.class)); + cards.add(new SetCardInfo("Harsh Mercy", 39, Rarity.RARE, mage.cards.h.HarshMercy.class)); + cards.add(new SetCardInfo("Haunted Cadaver", 154, Rarity.COMMON, mage.cards.h.HauntedCadaver.class)); + cards.add(new SetCardInfo("Head Games", 155, Rarity.RARE, mage.cards.h.HeadGames.class)); + cards.add(new SetCardInfo("Headhunter", 156, Rarity.UNCOMMON, mage.cards.h.Headhunter.class)); + cards.add(new SetCardInfo("Heedless One", 265, Rarity.UNCOMMON, mage.cards.h.HeedlessOne.class)); + cards.add(new SetCardInfo("Hystrodon", 266, Rarity.RARE, mage.cards.h.Hystrodon.class)); + cards.add(new SetCardInfo("Imagecrafter", 87, Rarity.COMMON, mage.cards.i.Imagecrafter.class)); + cards.add(new SetCardInfo("Improvised Armor", 40, Rarity.UNCOMMON, mage.cards.i.ImprovisedArmor.class)); + cards.add(new SetCardInfo("Infest", 157, Rarity.UNCOMMON, mage.cards.i.Infest.class)); + cards.add(new SetCardInfo("Information Dealer", 88, Rarity.COMMON, mage.cards.i.InformationDealer.class)); + cards.add(new SetCardInfo("Inspirit", 41, Rarity.UNCOMMON, mage.cards.i.Inspirit.class)); + cards.add(new SetCardInfo("Insurrection", 213, Rarity.RARE, mage.cards.i.Insurrection.class)); + cards.add(new SetCardInfo("Invigorating Boon", 267, Rarity.UNCOMMON, mage.cards.i.InvigoratingBoon.class)); + cards.add(new SetCardInfo("Ironfist Crusher", 42, Rarity.UNCOMMON, mage.cards.i.IronfistCrusher.class)); + cards.add(new SetCardInfo("Island", 335, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 336, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 337, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 338, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Ixidor's Will", 90, Rarity.COMMON, mage.cards.i.IxidorsWill.class)); + cards.add(new SetCardInfo("Ixidor, Reality Sculptor", 89, Rarity.RARE, mage.cards.i.IxidorRealitySculptor.class)); + cards.add(new SetCardInfo("Jareth, Leonine Titan", 43, Rarity.RARE, mage.cards.j.JarethLeonineTitan.class)); + cards.add(new SetCardInfo("Kamahl, Fist of Krosa", 268, Rarity.RARE, mage.cards.k.KamahlFistOfKrosa.class)); + cards.add(new SetCardInfo("Kamahl's Summons", 269, Rarity.UNCOMMON, mage.cards.k.KamahlsSummons.class)); + cards.add(new SetCardInfo("Krosan Colossus", 270, Rarity.RARE, mage.cards.k.KrosanColossus.class)); + cards.add(new SetCardInfo("Krosan Groundshaker", 271, Rarity.UNCOMMON, mage.cards.k.KrosanGroundshaker.class)); + cards.add(new SetCardInfo("Krosan Tusker", 272, Rarity.COMMON, mage.cards.k.KrosanTusker.class)); + cards.add(new SetCardInfo("Lavamancer's Skill", 215, Rarity.COMMON, mage.cards.l.LavamancersSkill.class)); + cards.add(new SetCardInfo("Lay Waste", 216, Rarity.COMMON, mage.cards.l.LayWaste.class)); + cards.add(new SetCardInfo("Leery Fogbeast", 273, Rarity.COMMON, mage.cards.l.LeeryFogbeast.class)); + cards.add(new SetCardInfo("Lightning Rift", 217, Rarity.UNCOMMON, mage.cards.l.LightningRift.class)); + cards.add(new SetCardInfo("Lonely Sandbar", 320, Rarity.COMMON, mage.cards.l.LonelySandbar.class)); + cards.add(new SetCardInfo("Mage's Guile", 91, Rarity.COMMON, mage.cards.m.MagesGuile.class)); + cards.add(new SetCardInfo("Mana Echoes", 218, Rarity.RARE, mage.cards.m.ManaEchoes.class)); + cards.add(new SetCardInfo("Menacing Ogre", 219, Rarity.RARE, mage.cards.m.MenacingOgre.class)); + cards.add(new SetCardInfo("Misery Charm", 158, Rarity.COMMON, mage.cards.m.MiseryCharm.class)); + cards.add(new SetCardInfo("Mistform Dreamer", 93, Rarity.COMMON, mage.cards.m.MistformDreamer.class)); + cards.add(new SetCardInfo("Mistform Mask", 94, Rarity.COMMON, mage.cards.m.MistformMask.class)); + cards.add(new SetCardInfo("Mistform Mutant", 95, Rarity.UNCOMMON, mage.cards.m.MistformMutant.class)); + cards.add(new SetCardInfo("Mistform Shrieker", 96, Rarity.UNCOMMON, mage.cards.m.MistformShrieker.class)); + cards.add(new SetCardInfo("Mistform Skyreaver", 97, Rarity.RARE, mage.cards.m.MistformSkyreaver.class)); + cards.add(new SetCardInfo("Mistform Stalker", 98, Rarity.UNCOMMON, mage.cards.m.MistformStalker.class)); + cards.add(new SetCardInfo("Mistform Wall", 99, Rarity.COMMON, mage.cards.m.MistformWall.class)); + cards.add(new SetCardInfo("Mobilization", 44, Rarity.RARE, mage.cards.m.Mobilization.class)); + cards.add(new SetCardInfo("Mountain", 343, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 344, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 345, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 346, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mythic Proportions", 274, Rarity.RARE, mage.cards.m.MythicProportions.class)); + cards.add(new SetCardInfo("Nameless One", 100, Rarity.UNCOMMON, mage.cards.n.NamelessOne.class)); + cards.add(new SetCardInfo("Nantuko Husk", 159, Rarity.COMMON, mage.cards.n.NantukoHusk.class)); + cards.add(new SetCardInfo("Naturalize", 275, Rarity.COMMON, mage.cards.n.Naturalize.class)); + cards.add(new SetCardInfo("Nosy Goblin", 220, Rarity.COMMON, mage.cards.n.NosyGoblin.class)); + cards.add(new SetCardInfo("Nova Cleric", 45, Rarity.UNCOMMON, mage.cards.n.NovaCleric.class)); + cards.add(new SetCardInfo("Oblation", 46, Rarity.RARE, mage.cards.o.Oblation.class)); + cards.add(new SetCardInfo("Oversold Cemetery", 160, Rarity.RARE, mage.cards.o.OversoldCemetery.class)); + cards.add(new SetCardInfo("Overwhelming Instinct", 276, Rarity.UNCOMMON, mage.cards.o.OverwhelmingInstinct.class)); + cards.add(new SetCardInfo("Pacifism", 47, Rarity.COMMON, mage.cards.p.Pacifism.class)); + cards.add(new SetCardInfo("Patriarch's Bidding", 161, Rarity.RARE, mage.cards.p.PatriarchsBidding.class)); + cards.add(new SetCardInfo("Pearlspear Courier", 48, Rarity.UNCOMMON, mage.cards.p.PearlspearCourier.class)); + cards.add(new SetCardInfo("Peer Pressure", 101, Rarity.RARE, mage.cards.p.PeerPressure.class)); + cards.add(new SetCardInfo("Piety Charm", 49, Rarity.COMMON, mage.cards.p.PietyCharm.class)); + cards.add(new SetCardInfo("Pinpoint Avalanche", 221, Rarity.COMMON, mage.cards.p.PinpointAvalanche.class)); + cards.add(new SetCardInfo("Plains", 331, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Plains", 332, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Plains", 333, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Plains", 334, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Polluted Delta", 321, Rarity.RARE, mage.cards.p.PollutedDelta.class, new CardGraphicInfo(new ObjectColor("UB"), null, false))); + cards.add(new SetCardInfo("Primal Boost", 277, Rarity.UNCOMMON, mage.cards.p.PrimalBoost.class)); + cards.add(new SetCardInfo("Profane Prayers", 162, Rarity.COMMON, mage.cards.p.ProfanePrayers.class)); + cards.add(new SetCardInfo("Prowling Pangolin", 163, Rarity.UNCOMMON, mage.cards.p.ProwlingPangolin.class)); + cards.add(new SetCardInfo("Psychic Trance", 102, Rarity.RARE, mage.cards.p.PsychicTrance.class)); + cards.add(new SetCardInfo("Quicksilver Dragon", 103, Rarity.RARE, mage.cards.q.QuicksilverDragon.class)); + cards.add(new SetCardInfo("Ravenous Baloth", 278, Rarity.RARE, mage.cards.r.RavenousBaloth.class)); + cards.add(new SetCardInfo("Read the Runes", 104, Rarity.RARE, mage.cards.r.ReadTheRunes.class)); + cards.add(new SetCardInfo("Reckless One", 222, Rarity.UNCOMMON, mage.cards.r.RecklessOne.class)); + cards.add(new SetCardInfo("Reminisce", 105, Rarity.UNCOMMON, mage.cards.r.Reminisce.class)); + cards.add(new SetCardInfo("Renewed Faith", 50, Rarity.COMMON, mage.cards.r.RenewedFaith.class)); + cards.add(new SetCardInfo("Righteous Cause", 51, Rarity.UNCOMMON, mage.cards.r.RighteousCause.class)); + cards.add(new SetCardInfo("Riptide Biologist", 106, Rarity.COMMON, mage.cards.r.RiptideBiologist.class)); + cards.add(new SetCardInfo("Riptide Chronologist", 107, Rarity.UNCOMMON, mage.cards.r.RiptideChronologist.class)); + cards.add(new SetCardInfo("Riptide Entrancer", 108, Rarity.RARE, mage.cards.r.RiptideEntrancer.class)); + cards.add(new SetCardInfo("Riptide Laboratory", 322, Rarity.RARE, mage.cards.r.RiptideLaboratory.class)); + cards.add(new SetCardInfo("Riptide Replicator", 309, Rarity.RARE, mage.cards.r.RiptideReplicator.class)); + cards.add(new SetCardInfo("Riptide Shapeshifter", 109, Rarity.UNCOMMON, mage.cards.r.RiptideShapeshifter.class)); + cards.add(new SetCardInfo("Risky Move", 223, Rarity.RARE, mage.cards.r.RiskyMove.class)); + cards.add(new SetCardInfo("Rorix Bladewing", 224, Rarity.RARE, mage.cards.r.RorixBladewing.class)); + cards.add(new SetCardInfo("Rotlung Reanimator", 164, Rarity.RARE, mage.cards.r.RotlungReanimator.class)); + cards.add(new SetCardInfo("Rummaging Wizard", 110, Rarity.UNCOMMON, mage.cards.r.RummagingWizard.class)); + cards.add(new SetCardInfo("Run Wild", 279, Rarity.UNCOMMON, mage.cards.r.RunWild.class)); + cards.add(new SetCardInfo("Sage Aven", 111, Rarity.COMMON, mage.cards.s.SageAven.class)); + cards.add(new SetCardInfo("Sandskin", 52, Rarity.COMMON, mage.cards.s.Sandskin.class)); + cards.add(new SetCardInfo("Screaming Seahawk", 112, Rarity.COMMON, mage.cards.s.ScreamingSeahawk.class)); + cards.add(new SetCardInfo("Screeching Buzzard", 165, Rarity.COMMON, mage.cards.s.ScreechingBuzzard.class)); + cards.add(new SetCardInfo("Searing Flesh", 225, Rarity.UNCOMMON, mage.cards.s.SearingFlesh.class)); + cards.add(new SetCardInfo("Sea's Claim", 113, Rarity.COMMON, mage.cards.s.SeasClaim.class)); + cards.add(new SetCardInfo("Seaside Haven", 323, Rarity.UNCOMMON, mage.cards.s.SeasideHaven.class)); + cards.add(new SetCardInfo("Secluded Steppe", 324, Rarity.COMMON, mage.cards.s.SecludedSteppe.class)); + cards.add(new SetCardInfo("Serpentine Basilisk", 280, Rarity.UNCOMMON, mage.cards.s.SerpentineBasilisk.class)); + cards.add(new SetCardInfo("Severed Legion", 166, Rarity.COMMON, mage.cards.s.SeveredLegion.class)); + cards.add(new SetCardInfo("Shade's Breath", 167, Rarity.UNCOMMON, mage.cards.s.ShadesBreath.class)); + cards.add(new SetCardInfo("Shaleskin Bruiser", 226, Rarity.UNCOMMON, mage.cards.s.ShaleskinBruiser.class)); + cards.add(new SetCardInfo("Shared Triumph", 53, Rarity.RARE, mage.cards.s.SharedTriumph.class)); + cards.add(new SetCardInfo("Shepherd of Rot", 168, Rarity.COMMON, mage.cards.s.ShepherdOfRot.class)); + cards.add(new SetCardInfo("Shieldmage Elder", 54, Rarity.UNCOMMON, mage.cards.s.ShieldmageElder.class)); + cards.add(new SetCardInfo("Shock", 227, Rarity.COMMON, mage.cards.s.Shock.class)); + cards.add(new SetCardInfo("Sigil of the New Dawn", 55, Rarity.RARE, mage.cards.s.SigilOfTheNewDawn.class)); + cards.add(new SetCardInfo("Silent Specter", 169, Rarity.RARE, mage.cards.s.SilentSpecter.class)); + cards.add(new SetCardInfo("Silklash Spider", 281, Rarity.RARE, mage.cards.s.SilklashSpider.class)); + cards.add(new SetCardInfo("Silvos, Rogue Elemental", 282, Rarity.RARE, mage.cards.s.SilvosRogueElemental.class)); + cards.add(new SetCardInfo("Skirk Fire Marshal", 229, Rarity.RARE, mage.cards.s.SkirkFireMarshal.class)); + cards.add(new SetCardInfo("Skirk Prospector", 230, Rarity.COMMON, mage.cards.s.SkirkProspector.class)); + cards.add(new SetCardInfo("Skittish Valesk", 231, Rarity.UNCOMMON, mage.cards.s.SkittishValesk.class)); + cards.add(new SetCardInfo("Slate of Ancestry", 310, Rarity.RARE, mage.cards.s.SlateOfAncestry.class)); + cards.add(new SetCardInfo("Slice and Dice", 232, Rarity.UNCOMMON, mage.cards.s.SliceAndDice.class)); + cards.add(new SetCardInfo("Slipstream Eel", 114, Rarity.COMMON, mage.cards.s.SlipstreamEel.class)); + cards.add(new SetCardInfo("Smother", 170, Rarity.UNCOMMON, mage.cards.s.Smother.class)); + cards.add(new SetCardInfo("Snarling Undorak", 283, Rarity.COMMON, mage.cards.s.SnarlingUndorak.class)); + cards.add(new SetCardInfo("Solar Blast", 234, Rarity.COMMON, mage.cards.s.SolarBlast.class)); + cards.add(new SetCardInfo("Soulless One", 171, Rarity.UNCOMMON, mage.cards.s.SoullessOne.class)); + cards.add(new SetCardInfo("Sparksmith", 235, Rarity.COMMON, mage.cards.s.Sparksmith.class)); + cards.add(new SetCardInfo("Spined Basher", 172, Rarity.COMMON, mage.cards.s.SpinedBasher.class)); + cards.add(new SetCardInfo("Spitfire Handler", 236, Rarity.UNCOMMON, mage.cards.s.SpitfireHandler.class)); + cards.add(new SetCardInfo("Spitting Gourna", 284, Rarity.COMMON, mage.cards.s.SpittingGourna.class)); + cards.add(new SetCardInfo("Spurred Wolverine", 237, Rarity.COMMON, mage.cards.s.SpurredWolverine.class)); + cards.add(new SetCardInfo("Spy Network", 115, Rarity.COMMON, mage.cards.s.SpyNetwork.class)); + cards.add(new SetCardInfo("Stag Beetle", 285, Rarity.RARE, mage.cards.s.StagBeetle.class)); + cards.add(new SetCardInfo("Standardize", 116, Rarity.RARE, mage.cards.s.Standardize.class)); + cards.add(new SetCardInfo("Starlit Sanctum", 325, Rarity.UNCOMMON, mage.cards.s.StarlitSanctum.class)); + cards.add(new SetCardInfo("Starstorm", 238, Rarity.RARE, mage.cards.s.Starstorm.class)); + cards.add(new SetCardInfo("Steely Resolve", 286, Rarity.RARE, mage.cards.s.SteelyResolve.class)); + cards.add(new SetCardInfo("Strongarm Tactics", 173, Rarity.RARE, mage.cards.s.StrongarmTactics.class)); + cards.add(new SetCardInfo("Sunfire Balm", 56, Rarity.UNCOMMON, mage.cards.s.SunfireBalm.class)); + cards.add(new SetCardInfo("Supreme Inquisitor", 117, Rarity.RARE, mage.cards.s.SupremeInquisitor.class)); + cards.add(new SetCardInfo("Swamp", 339, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 340, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 341, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 342, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swat", 174, Rarity.COMMON, mage.cards.s.Swat.class)); + cards.add(new SetCardInfo("Symbiotic Beast", 287, Rarity.UNCOMMON, mage.cards.s.SymbioticBeast.class)); + cards.add(new SetCardInfo("Symbiotic Elf", 288, Rarity.COMMON, mage.cards.s.SymbioticElf.class)); + cards.add(new SetCardInfo("Symbiotic Wurm", 289, Rarity.RARE, mage.cards.s.SymbioticWurm.class)); + cards.add(new SetCardInfo("Syphon Mind", 175, Rarity.COMMON, mage.cards.s.SyphonMind.class)); + cards.add(new SetCardInfo("Syphon Soul", 176, Rarity.COMMON, mage.cards.s.SyphonSoul.class)); + cards.add(new SetCardInfo("Taunting Elf", 290, Rarity.COMMON, mage.cards.t.TauntingElf.class)); + cards.add(new SetCardInfo("Tempting Wurm", 291, Rarity.RARE, mage.cards.t.TemptingWurm.class)); + cards.add(new SetCardInfo("Tephraderm", 239, Rarity.RARE, mage.cards.t.Tephraderm.class)); + cards.add(new SetCardInfo("Thrashing Mudspawn", 177, Rarity.UNCOMMON, mage.cards.t.ThrashingMudspawn.class)); + cards.add(new SetCardInfo("Threaten", 241, Rarity.UNCOMMON, mage.cards.t.Threaten.class)); + cards.add(new SetCardInfo("Thunder of Hooves", 242, Rarity.UNCOMMON, mage.cards.t.ThunderOfHooves.class)); + cards.add(new SetCardInfo("Towering Baloth", 292, Rarity.UNCOMMON, mage.cards.t.ToweringBaloth.class)); + cards.add(new SetCardInfo("Trade Secrets", 118, Rarity.RARE, mage.cards.t.TradeSecrets.class)); + cards.add(new SetCardInfo("Tranquil Thicket", 326, Rarity.COMMON, mage.cards.t.TranquilThicket.class)); + cards.add(new SetCardInfo("Treespring Lorian", 293, Rarity.COMMON, mage.cards.t.TreespringLorian.class)); + cards.add(new SetCardInfo("Tribal Golem", 311, Rarity.RARE, mage.cards.t.TribalGolem.class)); + cards.add(new SetCardInfo("Tribal Unity", 294, Rarity.UNCOMMON, mage.cards.t.TribalUnity.class)); + cards.add(new SetCardInfo("Trickery Charm", 119, Rarity.COMMON, mage.cards.t.TrickeryCharm.class)); + cards.add(new SetCardInfo("True Believer", 57, Rarity.RARE, mage.cards.t.TrueBeliever.class)); + cards.add(new SetCardInfo("Undead Gladiator", 178, Rarity.RARE, mage.cards.u.UndeadGladiator.class)); + cards.add(new SetCardInfo("Unholy Grotto", 327, Rarity.RARE, mage.cards.u.UnholyGrotto.class)); + cards.add(new SetCardInfo("Unified Strike", 58, Rarity.COMMON, mage.cards.u.UnifiedStrike.class)); + cards.add(new SetCardInfo("Venomspout Brackus", 295, Rarity.UNCOMMON, mage.cards.v.VenomspoutBrackus.class)); + cards.add(new SetCardInfo("Visara the Dreadful", 179, Rarity.RARE, mage.cards.v.VisaraTheDreadful.class)); + cards.add(new SetCardInfo("Vitality Charm", 296, Rarity.COMMON, mage.cards.v.VitalityCharm.class)); + cards.add(new SetCardInfo("Voice of the Woods", 297, Rarity.RARE, mage.cards.v.VoiceOfTheWoods.class)); + cards.add(new SetCardInfo("Voidmage Prodigy", 120, Rarity.RARE, mage.cards.v.VoidmageProdigy.class)); + cards.add(new SetCardInfo("Walking Desecration", 180, Rarity.UNCOMMON, mage.cards.w.WalkingDesecration.class)); + cards.add(new SetCardInfo("Wall of Mulch", 298, Rarity.UNCOMMON, mage.cards.w.WallOfMulch.class)); + cards.add(new SetCardInfo("Wave of Indifference", 243, Rarity.COMMON, mage.cards.w.WaveOfIndifference.class)); + cards.add(new SetCardInfo("Weathered Wayfarer", 59, Rarity.RARE, mage.cards.w.WeatheredWayfarer.class)); + cards.add(new SetCardInfo("Weird Harvest", 299, Rarity.RARE, mage.cards.w.WeirdHarvest.class)); + cards.add(new SetCardInfo("Wellwisher", 300, Rarity.COMMON, mage.cards.w.Wellwisher.class)); + cards.add(new SetCardInfo("Wheel and Deal", 121, Rarity.RARE, mage.cards.w.WheelAndDeal.class)); + cards.add(new SetCardInfo("Whipcorder", 60, Rarity.UNCOMMON, mage.cards.w.Whipcorder.class)); + cards.add(new SetCardInfo("Windswept Heath", 328, Rarity.RARE, mage.cards.w.WindsweptHeath.class, new CardGraphicInfo(new ObjectColor("GW"), null, false))); + cards.add(new SetCardInfo("Wirewood Elf", 301, Rarity.COMMON, mage.cards.w.WirewoodElf.class)); + cards.add(new SetCardInfo("Wirewood Herald", 302, Rarity.COMMON, mage.cards.w.WirewoodHerald.class)); + cards.add(new SetCardInfo("Wirewood Lodge", 329, Rarity.RARE, mage.cards.w.WirewoodLodge.class)); + cards.add(new SetCardInfo("Wirewood Pride", 303, Rarity.COMMON, mage.cards.w.WirewoodPride.class)); + cards.add(new SetCardInfo("Wirewood Savage", 304, Rarity.COMMON, mage.cards.w.WirewoodSavage.class)); + cards.add(new SetCardInfo("Withering Hex", 181, Rarity.UNCOMMON, mage.cards.w.WitheringHex.class)); + cards.add(new SetCardInfo("Wooded Foothills", 330, Rarity.RARE, mage.cards.w.WoodedFoothills.class, new CardGraphicInfo(new ObjectColor("RG"), null, false))); + cards.add(new SetCardInfo("Words of War", 244, Rarity.RARE, mage.cards.w.WordsOfWar.class)); + cards.add(new SetCardInfo("Words of Waste", 182, Rarity.RARE, mage.cards.w.WordsOfWaste.class)); + cards.add(new SetCardInfo("Words of Wilding", 305, Rarity.RARE, mage.cards.w.WordsOfWilding.class)); + cards.add(new SetCardInfo("Words of Wind", 122, Rarity.RARE, mage.cards.w.WordsOfWind.class)); + cards.add(new SetCardInfo("Words of Worship", 61, Rarity.RARE, mage.cards.w.WordsOfWorship.class)); + cards.add(new SetCardInfo("Wretched Anurid", 183, Rarity.COMMON, mage.cards.w.WretchedAnurid.class)); + } +} From 34952f173d57d9b31ba35c02c9e6a7ba0ae5b9d6 Mon Sep 17 00:00:00 2001 From: L_J Date: Sat, 28 Apr 2018 13:15:31 +0000 Subject: [PATCH 020/158] 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 567fef5ed66..e906ca77da6 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 021/158] 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 395f52e284d..d173437878b 100644 --- a/Mage/src/main/java/mage/Mana.java +++ b/Mage/src/main/java/mage/Mana.java @@ -1083,7 +1083,7 @@ public class Mana implements Comparable, Serializable, Copyable { && this.red >= mana.red && this.colorless >= mana.colorless && (this.generic >= mana.generic - || this.countColored() >= mana.countColored() + mana.generic); + || this.countColored() + this.colorless >= mana.count()); } From 826eb6843ef2921d0f2c49e1dc77929e9834d7d1 Mon Sep 17 00:00:00 2001 From: L_J Date: Sat, 28 Apr 2018 15:19:16 +0200 Subject: [PATCH 022/158] 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 00000000000..8aa9047668b --- /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 74a66d2e135..520dc1c6de9 100644 --- a/Mage.Sets/src/mage/sets/FifthEdition.java +++ b/Mage.Sets/src/mage/sets/FifthEdition.java @@ -136,6 +136,7 @@ public class FifthEdition extends ExpansionSet { cards.add(new SetCardInfo("Divine Transformation", 304, Rarity.UNCOMMON, mage.cards.d.DivineTransformation.class)); cards.add(new SetCardInfo("Dragon Engine", 366, Rarity.RARE, mage.cards.d.DragonEngine.class)); cards.add(new SetCardInfo("Drain Life", 18, Rarity.COMMON, mage.cards.d.DrainLife.class)); + cards.add(new SetCardInfo("Drain Power", 82, Rarity.RARE, mage.cards.d.DrainPower.class)); cards.add(new SetCardInfo("Drudge Skeletons", 19, Rarity.COMMON, mage.cards.d.DrudgeSkeletons.class)); cards.add(new SetCardInfo("Durkwood Boars", 151, Rarity.COMMON, mage.cards.d.DurkwoodBoars.class)); cards.add(new SetCardInfo("Dust to Dust", 305, Rarity.UNCOMMON, mage.cards.d.DustToDust.class)); diff --git a/Mage.Sets/src/mage/sets/FourthEdition.java b/Mage.Sets/src/mage/sets/FourthEdition.java index 0b5d5d5f421..7405ca25a5a 100644 --- a/Mage.Sets/src/mage/sets/FourthEdition.java +++ b/Mage.Sets/src/mage/sets/FourthEdition.java @@ -119,6 +119,7 @@ public class FourthEdition extends ExpansionSet { cards.add(new SetCardInfo("Control Magic", 64, Rarity.UNCOMMON, mage.cards.c.ControlMagic.class)); cards.add(new SetCardInfo("Counterspell", 65, Rarity.UNCOMMON, mage.cards.c.Counterspell.class)); cards.add(new SetCardInfo("Creature Bond", 66, Rarity.COMMON, mage.cards.c.CreatureBond.class)); + cards.add(new SetCardInfo("Drain Power", 67, Rarity.RARE, mage.cards.d.DrainPower.class)); cards.add(new SetCardInfo("Energy Flux", 68, Rarity.UNCOMMON, mage.cards.e.EnergyFlux.class)); cards.add(new SetCardInfo("Energy Tap", 69, Rarity.COMMON, mage.cards.e.EnergyTap.class)); cards.add(new SetCardInfo("Erosion", 70, Rarity.COMMON, mage.cards.e.Erosion.class)); diff --git a/Mage.Sets/src/mage/sets/LimitedEditionAlpha.java b/Mage.Sets/src/mage/sets/LimitedEditionAlpha.java index 8b7de5a757d..2b9c646a0e8 100644 --- a/Mage.Sets/src/mage/sets/LimitedEditionAlpha.java +++ b/Mage.Sets/src/mage/sets/LimitedEditionAlpha.java @@ -88,6 +88,7 @@ public class LimitedEditionAlpha extends ExpansionSet { cards.add(new SetCardInfo("Disrupting Scepter", 242, Rarity.RARE, mage.cards.d.DisruptingScepter.class)); cards.add(new SetCardInfo("Dragon Whelp", 142, Rarity.UNCOMMON, mage.cards.d.DragonWhelp.class)); cards.add(new SetCardInfo("Drain Life", 14, Rarity.COMMON, mage.cards.d.DrainLife.class)); + cards.add(new SetCardInfo("Drain Power", 57, Rarity.RARE, mage.cards.d.DrainPower.class)); cards.add(new SetCardInfo("Drudge Skeletons", 15, Rarity.COMMON, mage.cards.d.DrudgeSkeletons.class)); cards.add(new SetCardInfo("Dwarven Demolition Team", 143, Rarity.UNCOMMON, mage.cards.d.DwarvenDemolitionTeam.class)); cards.add(new SetCardInfo("Dwarven Warriors", 144, Rarity.COMMON, mage.cards.d.DwarvenWarriors.class)); diff --git a/Mage.Sets/src/mage/sets/LimitedEditionBeta.java b/Mage.Sets/src/mage/sets/LimitedEditionBeta.java index 9b642609e4c..ba6e2fe89db 100644 --- a/Mage.Sets/src/mage/sets/LimitedEditionBeta.java +++ b/Mage.Sets/src/mage/sets/LimitedEditionBeta.java @@ -89,6 +89,7 @@ public class LimitedEditionBeta extends ExpansionSet { cards.add(new SetCardInfo("Disrupting Scepter", 243, Rarity.RARE, mage.cards.d.DisruptingScepter.class)); cards.add(new SetCardInfo("Dragon Whelp", 142, Rarity.UNCOMMON, mage.cards.d.DragonWhelp.class)); cards.add(new SetCardInfo("Drain Life", 106, Rarity.COMMON, mage.cards.d.DrainLife.class)); + cards.add(new SetCardInfo("Drain Power", 57, Rarity.RARE, mage.cards.d.DrainPower.class)); cards.add(new SetCardInfo("Drudge Skeletons", 107, Rarity.COMMON, mage.cards.d.DrudgeSkeletons.class)); cards.add(new SetCardInfo("Dwarven Demolition Team", 143, Rarity.UNCOMMON, mage.cards.d.DwarvenDemolitionTeam.class)); cards.add(new SetCardInfo("Dwarven Warriors", 144, Rarity.COMMON, mage.cards.d.DwarvenWarriors.class)); diff --git a/Mage.Sets/src/mage/sets/MastersEditionIV.java b/Mage.Sets/src/mage/sets/MastersEditionIV.java index e06cd8e06cd..6e967fa5ca3 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 74924028acb..e4e83cf7021 100644 --- a/Mage.Sets/src/mage/sets/RevisedEdition.java +++ b/Mage.Sets/src/mage/sets/RevisedEdition.java @@ -91,6 +91,7 @@ public class RevisedEdition extends ExpansionSet { cards.add(new SetCardInfo("Dragon Engine", 246, Rarity.RARE, mage.cards.d.DragonEngine.class)); cards.add(new SetCardInfo("Dragon Whelp", 142, Rarity.UNCOMMON, mage.cards.d.DragonWhelp.class)); cards.add(new SetCardInfo("Drain Life", 14, Rarity.COMMON, mage.cards.d.DrainLife.class)); + cards.add(new SetCardInfo("Drain Power", 56, Rarity.RARE, mage.cards.d.DrainPower.class)); cards.add(new SetCardInfo("Drudge Skeletons", 15, Rarity.COMMON, mage.cards.d.DrudgeSkeletons.class)); cards.add(new SetCardInfo("Dwarven Warriors", 143, Rarity.COMMON, mage.cards.d.DwarvenWarriors.class)); cards.add(new SetCardInfo("Dwarven Weaponsmith", 144, Rarity.UNCOMMON, mage.cards.d.DwarvenWeaponsmith.class)); diff --git a/Mage.Sets/src/mage/sets/UnlimitedEdition.java b/Mage.Sets/src/mage/sets/UnlimitedEdition.java index a27c910c64f..ee5e51551d3 100644 --- a/Mage.Sets/src/mage/sets/UnlimitedEdition.java +++ b/Mage.Sets/src/mage/sets/UnlimitedEdition.java @@ -89,6 +89,7 @@ public class UnlimitedEdition extends ExpansionSet { cards.add(new SetCardInfo("Disrupting Scepter", 243, Rarity.RARE, mage.cards.d.DisruptingScepter.class)); cards.add(new SetCardInfo("Dragon Whelp", 142, Rarity.UNCOMMON, mage.cards.d.DragonWhelp.class)); cards.add(new SetCardInfo("Drain Life", 14, Rarity.COMMON, mage.cards.d.DrainLife.class)); + cards.add(new SetCardInfo("Drain Power", 57, Rarity.RARE, mage.cards.d.DrainPower.class)); cards.add(new SetCardInfo("Drudge Skeletons", 15, Rarity.COMMON, mage.cards.d.DrudgeSkeletons.class)); cards.add(new SetCardInfo("Dwarven Demolition Team", 143, Rarity.UNCOMMON, mage.cards.d.DwarvenDemolitionTeam.class)); cards.add(new SetCardInfo("Dwarven Warriors", 144, Rarity.COMMON, mage.cards.d.DwarvenWarriors.class)); From d83af8be91ec2c2aa58fb89738d8e052c2b78d6f Mon Sep 17 00:00:00 2001 From: L_J Date: Sat, 28 Apr 2018 13:22:26 +0000 Subject: [PATCH 023/158] 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 e906ca77da6..701ebe6c831 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 024/158] 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 8aa9047668b..dd74c601caf 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 025/158] 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 d428ad1f658..4d69a16ce86 100644 --- a/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java +++ b/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java @@ -6,12 +6,7 @@ import java.awt.Point; import java.awt.event.MouseEvent; import java.awt.event.MouseWheelEvent; import java.awt.image.BufferedImage; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.UUID; +import java.util.*; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; @@ -400,10 +395,10 @@ public class MageActionCallback implements ActionCallback { private void handlePopup(TransferData transferData) { MageCard mageCard = (MageCard) transferData.component; if (!popupTextWindowOpen - || mageCard.getOriginal().getId() != bigCard.getCardId()) { + || !Objects.equals(mageCard.getOriginal().getId(), bigCard.getCardId())) { if (bigCard.getWidth() > 0) { synchronized (MageActionCallback.class) { - if (!popupTextWindowOpen || mageCard.getOriginal().getId() != bigCard.getCardId()) { + if (!popupTextWindowOpen || !Objects.equals(mageCard.getOriginal().getId(), bigCard.getCardId())) { if (!popupTextWindowOpen) { bigCard.resetCardId(); } diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/images/CardDownloadData.java b/Mage.Client/src/main/java/org/mage/plugins/card/images/CardDownloadData.java index f78417a845a..5016db5b61c 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 b784adc6cbe..15f8a25737b 100644 --- a/Mage.Server.Console/src/main/java/mage/server/console/ConnectDialog.java +++ b/Mage.Server.Console/src/main/java/mage/server/console/ConnectDialog.java @@ -37,10 +37,8 @@ import java.awt.*; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URL; -import java.util.ArrayList; -import java.util.Arrays; +import java.util.*; import java.util.List; -import java.util.Locale; import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; import javax.swing.*; @@ -84,15 +82,15 @@ public class ConnectDialog extends JDialog { } private void showProxySettings() { - if (cbProxyType.getSelectedItem() == Connection.ProxyType.SOCKS) { + if (Objects.equals(cbProxyType.getSelectedItem(), ProxyType.SOCKS)) { this.pnlProxy.setVisible(true); this.pnlProxyAuth.setVisible(false); this.pnlProxySettings.setVisible(true); - } else if (cbProxyType.getSelectedItem() == Connection.ProxyType.HTTP) { + } else if (Objects.equals(cbProxyType.getSelectedItem(), ProxyType.HTTP)) { this.pnlProxy.setVisible(true); this.pnlProxyAuth.setVisible(true); this.pnlProxySettings.setVisible(true); - } else if (cbProxyType.getSelectedItem() == Connection.ProxyType.NONE) { + } else if (Objects.equals(cbProxyType.getSelectedItem(), ProxyType.NONE)) { this.pnlProxy.setVisible(false); this.pnlProxyAuth.setVisible(false); this.pnlProxySettings.setVisible(false); diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java index d3785cfa65a..5d599003ab1 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java @@ -28,17 +28,7 @@ package mage.player.ai; import java.io.File; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Scanner; -import java.util.Set; -import java.util.UUID; +import java.util.*; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; @@ -528,7 +518,7 @@ public class ComputerPlayer6 extends ComputerPlayer /*implements Player*/ { do { sim.getPlayer(nextPlayerId).pass(game); nextPlayerId = sim.getPlayerList().getNext(); - } while (nextPlayerId != this.getId()); + } while (!Objects.equals(nextPlayerId, this.getId())); } SimulationNode2 newNode = new SimulationNode2(node, sim, action, depth, currentPlayer.getId()); sim.checkStateAndTriggered(); diff --git a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java index 63f207e8960..fd18966864e 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 de2363ce9ce..bd09c81fa1a 100644 --- a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java @@ -823,7 +823,7 @@ public class HumanPlayer extends PlayerImpl { } } } else if (passedUntilStackResolved) { - if (dateLastAddedToStack == game.getStack().getDateLastAdded()) { + if (Objects.equals(dateLastAddedToStack, game.getStack().getDateLastAdded())) { dateLastAddedToStack = game.getStack().getDateLastAdded(); if (passWithManaPoolCheck(game)) { return false; diff --git a/Mage.Sets/src/mage/cards/b/BatheInLight.java b/Mage.Sets/src/mage/cards/b/BatheInLight.java index 15ee51eb881..7317708635e 100644 --- a/Mage.Sets/src/mage/cards/b/BatheInLight.java +++ b/Mage.Sets/src/mage/cards/b/BatheInLight.java @@ -112,7 +112,7 @@ class BatheInLightEffect extends OneShotEffect { game.addEffect(effect, source); ObjectColor color = target.getColor(game); for (Permanent permanent : game.getBattlefield().getActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURE, source.getControllerId(), source.getSourceId(), game)) { - if (permanent != target && permanent.getColor(game).shares(color)) { + if (!permanent.getId().equals(target.getId()) && permanent.getColor(game).shares(color)) { game.getState().setValue(permanent.getId() + "_color", colorChoice.getColor()); effect.setTargetPointer(new FixedTarget(permanent, game)); game.addEffect(effect, source); diff --git a/Mage.Sets/src/mage/cards/b/BrandOfIllOmen.java b/Mage.Sets/src/mage/cards/b/BrandOfIllOmen.java index ff50756639b..0b66aafdaa1 100644 --- a/Mage.Sets/src/mage/cards/b/BrandOfIllOmen.java +++ b/Mage.Sets/src/mage/cards/b/BrandOfIllOmen.java @@ -44,6 +44,7 @@ import mage.game.permanent.Permanent; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; +import java.util.Objects; import java.util.UUID; /** @@ -122,7 +123,7 @@ class BrandOfIllOmenEffect extends ContinuousRuleModifyingEffectImpl { Permanent brand = game.getPermanent(source.getSourceId()); if (brand != null && brand.getAttachedTo() != null) { UUID enchantedController = game.getPermanent(brand.getAttachedTo()).getControllerId(); - if(enchantedController == event.getPlayerId() && game.getObject(event.getSourceId()).isCreature()) { + if(Objects.equals(enchantedController, event.getPlayerId()) && game.getObject(event.getSourceId()).isCreature()) { return true; } } diff --git a/Mage.Sets/src/mage/cards/d/DesperateGambit.java b/Mage.Sets/src/mage/cards/d/DesperateGambit.java index 3dde02e293d..bee7635cb44 100644 --- a/Mage.Sets/src/mage/cards/d/DesperateGambit.java +++ b/Mage.Sets/src/mage/cards/d/DesperateGambit.java @@ -28,6 +28,7 @@ package mage.cards.d; import java.util.HashSet; +import java.util.Objects; import java.util.Set; import java.util.UUID; import mage.MageObject; @@ -158,7 +159,7 @@ class TargetControlledSource extends TargetSource { int count = 0; for (StackObject stackObject: game.getStack()) { if (game.getState().getPlayersInRange(sourceControllerId, game).contains(stackObject.getControllerId()) - && stackObject.getControllerId() == sourceControllerId) { + && Objects.equals(stackObject.getControllerId(), sourceControllerId)) { count++; if (count >= this.minNumberOfTargets) { return true; @@ -166,7 +167,7 @@ class TargetControlledSource extends TargetSource { } } for (Permanent permanent: game.getBattlefield().getActivePermanents(sourceControllerId, game)) { - if (permanent.getControllerId() == sourceControllerId) { + if (Objects.equals(permanent.getControllerId(), sourceControllerId)) { count++; if (count >= this.minNumberOfTargets) { return true; @@ -174,7 +175,7 @@ class TargetControlledSource extends TargetSource { } } for (Player player : game.getPlayers().values()) { - if (player == game.getPlayer(sourceControllerId)) { + if (Objects.equals(player, game.getPlayer(sourceControllerId))) { for (Card card : player.getGraveyard().getCards(game)) { count++; if (count >= this.minNumberOfTargets) { @@ -183,7 +184,7 @@ class TargetControlledSource extends TargetSource { } // 108.4a If anything asks for the controller of a card that doesn’t have one (because it’s not a permanent or spell), use its owner instead. for (Card card : game.getExile().getAllCards(game)) { - if (card.getOwnerId() == sourceControllerId) { + if (Objects.equals(card.getOwnerId(), sourceControllerId)) { count++; if (count >= this.minNumberOfTargets) { return true; @@ -200,23 +201,23 @@ class TargetControlledSource extends TargetSource { Set possibleTargets = new HashSet<>(); for (StackObject stackObject: game.getStack()) { if (game.getState().getPlayersInRange(sourceControllerId, game).contains(stackObject.getControllerId()) - && stackObject.getControllerId() == sourceControllerId) { + && Objects.equals(stackObject.getControllerId(), sourceControllerId)) { possibleTargets.add(stackObject.getId()); } } for (Permanent permanent: game.getBattlefield().getActivePermanents(sourceControllerId, game)) { - if (permanent.getControllerId() == sourceControllerId) { + if (Objects.equals(permanent.getControllerId(), sourceControllerId)) { possibleTargets.add(permanent.getId()); } } for (Player player : game.getPlayers().values()) { - if (player == game.getPlayer(sourceControllerId)) { + if (Objects.equals(player, game.getPlayer(sourceControllerId))) { for (Card card : player.getGraveyard().getCards(game)) { possibleTargets.add(card.getId()); } // 108.4a If anything asks for the controller of a card that doesn’t have one (because it’s not a permanent or spell), use its owner instead. for (Card card : game.getExile().getAllCards(game)) { - if (card.getOwnerId() == sourceControllerId) { + if (Objects.equals(card.getOwnerId(), sourceControllerId)) { possibleTargets.add(card.getId()); } } diff --git a/Mage.Sets/src/mage/cards/e/EyeForAnEye.java b/Mage.Sets/src/mage/cards/e/EyeForAnEye.java index 9c62933fbf9..697dff7b4f0 100644 --- a/Mage.Sets/src/mage/cards/e/EyeForAnEye.java +++ b/Mage.Sets/src/mage/cards/e/EyeForAnEye.java @@ -123,7 +123,7 @@ class EyeForAnEyeEffect extends ReplacementEffectImpl { Player controller = game.getPlayer(source.getControllerId()); DamageEvent damageEvent = (DamageEvent) event; if (controller != null) { - if (controller.getId() == damageEvent.getTargetId() && damageEvent.getSourceId().equals(damageSource.getFirstTarget())) { + if (controller.getId().equals(damageEvent.getTargetId()) && damageEvent.getSourceId().equals(damageSource.getFirstTarget())) { this.discard(); return true; } diff --git a/Mage.Sets/src/mage/cards/g/GreenerPastures.java b/Mage.Sets/src/mage/cards/g/GreenerPastures.java index 83af2758f68..2ae29036f2a 100644 --- a/Mage.Sets/src/mage/cards/g/GreenerPastures.java +++ b/Mage.Sets/src/mage/cards/g/GreenerPastures.java @@ -92,7 +92,7 @@ enum ActivePlayerMostLandsCondition implements Condition { return false; } for (UUID playerId : game.getPlayerList()) { - if (playerId != activePlayer.getId()) { + if (!playerId.equals(activePlayer.getId())) { if (game.getBattlefield().getAllActivePermanents(filter, playerId, game).size() >= landCount) { return false; } diff --git a/Mage.Sets/src/mage/cards/h/HiredGiant.java b/Mage.Sets/src/mage/cards/h/HiredGiant.java index be57e3f3bd9..baefbbb01e6 100644 --- a/Mage.Sets/src/mage/cards/h/HiredGiant.java +++ b/Mage.Sets/src/mage/cards/h/HiredGiant.java @@ -94,7 +94,7 @@ class HiredGiantEffect extends OneShotEffect { if (controller != null) { Set playersThatSearched = new HashSet<>(1); for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) { - if (playerId != controller.getId()) { + if (!playerId.equals(controller.getId())) { Player player = game.getPlayer(playerId); if (player != null && player.chooseUse(Outcome.PutCreatureInPlay, "Search your library for a land card and put it onto the battlefield?", source, game)) { TargetCardInLibrary target = new TargetCardInLibrary(new FilterLandCard()); diff --git a/Mage.Sets/src/mage/cards/i/IceCave.java b/Mage.Sets/src/mage/cards/i/IceCave.java index bcdf7f4d6f5..42594825f93 100644 --- a/Mage.Sets/src/mage/cards/i/IceCave.java +++ b/Mage.Sets/src/mage/cards/i/IceCave.java @@ -95,7 +95,7 @@ class IceCaveEffect extends OneShotEffect { if (spellController != null) { for (UUID playerId : game.getState().getPlayersInRange(source.getControllerId(), game)) { Player player = game.getPlayer(playerId); - if (player != null && player != spellController) { + if (player != null && !player.equals(spellController)) { cost.clearPaid(); if (cost.canPay(source, source.getSourceId(), player.getId(), game) && player.chooseUse(outcome, "Pay " + cost.getText() + " to counter " + spell.getIdName() + '?', source, game)) { diff --git a/Mage.Sets/src/mage/cards/k/KazarovSengirPureblood.java b/Mage.Sets/src/mage/cards/k/KazarovSengirPureblood.java index 9213c61956d..ad9497028f2 100644 --- a/Mage.Sets/src/mage/cards/k/KazarovSengirPureblood.java +++ b/Mage.Sets/src/mage/cards/k/KazarovSengirPureblood.java @@ -113,7 +113,7 @@ class KazarovSengirPurebloodTriggeredAbility extends TriggeredAbilityImpl { if (permanent == null) { return false; } - if (permanent.getControllerId() == this.getControllerId()) { + if (permanent.getControllerId().equals(this.getControllerId())) { return false; } return true; diff --git a/Mage.Sets/src/mage/cards/m/MairsilThePretender.java b/Mage.Sets/src/mage/cards/m/MairsilThePretender.java index 5d59ec71636..f0e955abb11 100644 --- a/Mage.Sets/src/mage/cards/m/MairsilThePretender.java +++ b/Mage.Sets/src/mage/cards/m/MairsilThePretender.java @@ -27,6 +27,7 @@ */ package mage.cards.m; +import java.util.Objects; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; @@ -165,7 +166,7 @@ class MairsilThePretenderGainAbilitiesEffect extends ContinuousEffectImpl { return false; } for (Card card : game.getExile().getAllCards(game)) { - if (filter.match(card, game) && card.getOwnerId() == perm.getControllerId()) { + if (filter.match(card, game) && Objects.equals(card.getOwnerId(), perm.getControllerId())) { for (Ability ability : card.getAbilities()) { if (ability instanceof ActivatedAbility) { ActivatedAbilityImpl copyAbility = (ActivatedAbilityImpl) ability.copy(); diff --git a/Mage.Sets/src/mage/cards/m/MirrorStrike.java b/Mage.Sets/src/mage/cards/m/MirrorStrike.java index 5d9e5191041..9292fbd1827 100644 --- a/Mage.Sets/src/mage/cards/m/MirrorStrike.java +++ b/Mage.Sets/src/mage/cards/m/MirrorStrike.java @@ -27,6 +27,7 @@ */ package mage.cards.m; +import java.util.Objects; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.ReplacementEffectImpl; @@ -124,7 +125,9 @@ class MirrorStrikeEffect extends ReplacementEffectImpl { DamageEvent damageEvent = (DamageEvent) event; Permanent targetPermanent = game.getPermanent(source.getFirstTarget()); if (controller != null && targetPermanent != null) { - return (damageEvent.isCombatDamage() && controller.getId() == damageEvent.getTargetId() && targetPermanent.getId() == damageEvent.getSourceId()); + return (damageEvent.isCombatDamage() + && Objects.equals(controller.getId(), damageEvent.getTargetId()) + && Objects.equals(targetPermanent.getId(), damageEvent.getSourceId())); } return false; } diff --git a/Mage.Sets/src/mage/cards/m/MyrBattlesphere.java b/Mage.Sets/src/mage/cards/m/MyrBattlesphere.java index 2edd62e9a1a..cade2aa34f9 100644 --- a/Mage.Sets/src/mage/cards/m/MyrBattlesphere.java +++ b/Mage.Sets/src/mage/cards/m/MyrBattlesphere.java @@ -112,7 +112,7 @@ class MyrBattlesphereTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { Permanent source = game.getPermanent(event.getSourceId()); - if (source != null && source.getId() == this.getSourceId()) { + if (source != null && source.getId().equals(this.getSourceId())) { UUID defenderId = game.getCombat().getDefenderId(event.getSourceId()); this.getEffects().get(0).setTargetPointer(new FixedTarget(defenderId)); return true; diff --git a/Mage.Sets/src/mage/cards/r/RagingRiver.java b/Mage.Sets/src/mage/cards/r/RagingRiver.java index f578960b3ae..0357c35e028 100644 --- a/Mage.Sets/src/mage/cards/r/RagingRiver.java +++ b/Mage.Sets/src/mage/cards/r/RagingRiver.java @@ -54,6 +54,7 @@ import mage.target.targetpointer.FixedTarget; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.UUID; import java.util.stream.Collectors; @@ -141,7 +142,7 @@ class RagingRiverEffect extends OneShotEffect { for (UUID attackers : game.getCombat().getAttackers()) { Permanent attacker = game.getPermanent(attackers); - if (attacker != null && attacker.getControllerId() == controller.getId()) { + if (attacker != null && Objects.equals(attacker.getControllerId(), controller.getId())) { CombatGroup combatGroup = game.getCombat().findGroup(attacker.getId()); if (combatGroup != null) { FilterCreaturePermanent filter = new FilterCreaturePermanent(); diff --git a/Mage.Sets/src/mage/cards/s/ScarwoodBandits.java b/Mage.Sets/src/mage/cards/s/ScarwoodBandits.java index 09c803e2250..187b5212f63 100644 --- a/Mage.Sets/src/mage/cards/s/ScarwoodBandits.java +++ b/Mage.Sets/src/mage/cards/s/ScarwoodBandits.java @@ -143,7 +143,7 @@ class DoUnlessAnyOpponentPaysEffect extends OneShotEffect { // check if any opponent is willing to pay for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) { Player player = game.getPlayer(playerId); - if (player != null && player != controller && cost.canPay(source, source.getSourceId(), player.getId(), game) && player.chooseUse(Outcome.Detriment, message, source, game)) { + if (player != null && !player.equals(controller) && cost.canPay(source, source.getSourceId(), player.getId(), game) && player.chooseUse(Outcome.Detriment, message, source, game)) { cost.clearPaid(); if (cost.pay(source, game, source.getSourceId(), player.getId(), false, null)) { if (!game.isSimulation()) { diff --git a/Mage.Sets/src/mage/cards/s/SeasonOfTheWitch.java b/Mage.Sets/src/mage/cards/s/SeasonOfTheWitch.java index e2bc1e7c4f6..b65c850553b 100644 --- a/Mage.Sets/src/mage/cards/s/SeasonOfTheWitch.java +++ b/Mage.Sets/src/mage/cards/s/SeasonOfTheWitch.java @@ -153,7 +153,7 @@ class CouldAttackThisTurnWatcher extends Watcher { for (Permanent permanent : game.getBattlefield().getAllActivePermanents(activePlayer.getId())) { if (permanent.isCreature()) { for (UUID defender : game.getCombat().getDefenders()) { - if (defender != activePlayer.getId()) { + if (!defender.equals(activePlayer.getId())) { if (permanent.canAttack(defender, game)) { // exclude Propaganda style effects if (!game.getContinuousEffects().checkIfThereArePayCostToAttackBlockEffects( diff --git a/Mage.Sets/src/mage/cards/s/SivvisValor.java b/Mage.Sets/src/mage/cards/s/SivvisValor.java index c63a2b21f14..11f98de471f 100644 --- a/Mage.Sets/src/mage/cards/s/SivvisValor.java +++ b/Mage.Sets/src/mage/cards/s/SivvisValor.java @@ -133,7 +133,7 @@ class SivvisValorEffect extends ReplacementEffectImpl { DamageEvent damageEvent = (DamageEvent) event; Permanent targetPermanent = game.getPermanent(source.getFirstTarget()); if (controller != null && targetPermanent != null) { - return targetPermanent.getId() == damageEvent.getTargetId(); + return targetPermanent.getId().equals(damageEvent.getTargetId()); } return false; } diff --git a/Mage.Sets/src/mage/cards/s/SkySwallower.java b/Mage.Sets/src/mage/cards/s/SkySwallower.java index 0044c72585d..43c5758a8c7 100644 --- a/Mage.Sets/src/mage/cards/s/SkySwallower.java +++ b/Mage.Sets/src/mage/cards/s/SkySwallower.java @@ -96,7 +96,7 @@ class GainControlAllPermanentsEffect extends ContinuousEffectImpl { Player targetPlayer = game.getPlayer(targetPointer.getFirst(game, source)); if (targetPlayer != null && targetPlayer.isInGame()) { for (Permanent permanent : game.getBattlefield().getAllActivePermanents(filter, source.getControllerId(), game)) { - if (permanent != null && permanent.getId() != source.getSourceId()) { + if (permanent != null && !permanent.getId().equals(source.getSourceId())) { permanent.changeControllerId(targetPlayer.getId(), game); } } diff --git a/Mage.Sets/src/mage/cards/s/SpiritualFocus.java b/Mage.Sets/src/mage/cards/s/SpiritualFocus.java index 5e14d68ba20..33ec0a0d01f 100644 --- a/Mage.Sets/src/mage/cards/s/SpiritualFocus.java +++ b/Mage.Sets/src/mage/cards/s/SpiritualFocus.java @@ -27,6 +27,7 @@ */ package mage.cards.s; +import java.util.Objects; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; @@ -95,7 +96,7 @@ class SpiritualFocusTriggeredAbility extends TriggeredAbilityImpl { if (game.getOpponents(this.getControllerId()).contains(stackObject.getControllerId())) { Permanent permanent = game.getPermanent(getSourceId()); if (permanent != null) { - if (permanent.getControllerId() == event.getPlayerId()) { + if (Objects.equals(permanent.getControllerId(), event.getPlayerId())) { return true; } } diff --git a/Mage.Sets/src/mage/cards/t/TalonOfPain.java b/Mage.Sets/src/mage/cards/t/TalonOfPain.java index b4c1df248e1..ddba456b3a4 100644 --- a/Mage.Sets/src/mage/cards/t/TalonOfPain.java +++ b/Mage.Sets/src/mage/cards/t/TalonOfPain.java @@ -117,7 +117,7 @@ public class TalonOfPain extends CardImpl { UUID sourceControllerId = game.getControllerId(event.getSourceId()); if (sourceControllerId != null && sourceControllerId.equals(this.getControllerId()) - && this.getSourceId() != event.getSourceId()) { + && !this.getSourceId().equals(event.getSourceId())) { // return true so the effect will fire and a charge counter will be added return true; } diff --git a/Mage.Sets/src/mage/cards/t/TidalFlats.java b/Mage.Sets/src/mage/cards/t/TidalFlats.java index d33db8fa398..60d0f3cc779 100644 --- a/Mage.Sets/src/mage/cards/t/TidalFlats.java +++ b/Mage.Sets/src/mage/cards/t/TidalFlats.java @@ -29,6 +29,7 @@ package mage.cards.t; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -128,7 +129,7 @@ class TidalFlatsEffect extends OneShotEffect { if (group != null) { for (UUID blockerId : group.getBlockers()) { Permanent blocker = game.getPermanent(blockerId); - if (blocker != null && blocker.getControllerId() == controller.getId()) { + if (blocker != null && Objects.equals(blocker.getControllerId(), controller.getId())) { ContinuousEffect effect = new GainAbilityTargetEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn); effect.setTargetPointer(new FixedTarget(blocker.getId())); game.addEffect(effect, source); diff --git a/Mage.Sets/src/mage/cards/t/TreacherousLink.java b/Mage.Sets/src/mage/cards/t/TreacherousLink.java index f5b7ed121f4..db60b79c508 100644 --- a/Mage.Sets/src/mage/cards/t/TreacherousLink.java +++ b/Mage.Sets/src/mage/cards/t/TreacherousLink.java @@ -125,7 +125,7 @@ class TreacherousLinkEffect extends ReplacementEffectImpl { if (controller != null && enchantment != null) { Permanent enchantedCreature = game.getPermanentOrLKIBattlefield(enchantment.getAttachedTo()); if (enchantedCreature != null) { - return enchantedCreature.getId() == damageEvent.getTargetId(); + return enchantedCreature.getId().equals(damageEvent.getTargetId()); } } return false; diff --git a/Mage.Sets/src/mage/cards/t/Typhoon.java b/Mage.Sets/src/mage/cards/t/Typhoon.java index 2d17c5fc5ba..4dea13bd3ff 100644 --- a/Mage.Sets/src/mage/cards/t/Typhoon.java +++ b/Mage.Sets/src/mage/cards/t/Typhoon.java @@ -83,7 +83,7 @@ class TyphoonEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { for (UUID playerId : game.getState().getPlayersInRange(source.getControllerId(), game)) { - if (playerId != source.getControllerId()) { + if (!playerId.equals(source.getControllerId())) { Player player = game.getPlayer(playerId); if (player != null) { int amount = 0; diff --git a/Mage.Sets/src/mage/cards/v/VoidMaw.java b/Mage.Sets/src/mage/cards/v/VoidMaw.java index a2e4aa88922..e6ac6ce0806 100644 --- a/Mage.Sets/src/mage/cards/v/VoidMaw.java +++ b/Mage.Sets/src/mage/cards/v/VoidMaw.java @@ -132,7 +132,7 @@ class VoidMawEffect extends ReplacementEffectImpl { ZoneChangeEvent zEvent = (ZoneChangeEvent) event; if (zEvent.getToZone() == Zone.GRAVEYARD) { Permanent permanent = ((ZoneChangeEvent) event).getTarget(); - if (permanent != null && permanent.getId() != source.getSourceId()) { + if (permanent != null && !permanent.getId().equals(source.getSourceId())) { if (zEvent.getTarget() != null) { // if it comes from permanent, check if it was a creature on the battlefield if (zEvent.getTarget().isCreature()) { return true; diff --git a/Mage.Sets/src/mage/cards/w/WatchersOfTheDead.java b/Mage.Sets/src/mage/cards/w/WatchersOfTheDead.java index 0e82384d38a..0bd0af1137e 100644 --- a/Mage.Sets/src/mage/cards/w/WatchersOfTheDead.java +++ b/Mage.Sets/src/mage/cards/w/WatchersOfTheDead.java @@ -97,7 +97,7 @@ class WatchersOfTheDeadEffect extends OneShotEffect { for (UUID opponentId : game.getState().getPlayersInRange(controller.getId(), game)) { Player opponent = game.getPlayer(opponentId); if (opponent != null - && opponent != controller) { + && !opponent.equals(controller)) { TargetCard target = new TargetCardInYourGraveyard(2, 2, new FilterCard()); target.setNotTarget(true); Cards cardsInGraveyard = opponent.getGraveyard(); diff --git a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java index e0eadcb549b..79cf55db7f8 100644 --- a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java +++ b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java @@ -329,7 +329,7 @@ public class TestPlayer implements Player { } UUID modeId = ability.getModes().getModeId(modeNr); selectedMode = ability.getModes().get(modeId); - if (modeId != ability.getModes().getMode().getId()) { + if (!Objects.equals(modeId, ability.getModes().getMode().getId())) { ability.getModes().setActiveMode(modeId); index = 0; // reset target index if mode changes } @@ -2416,4 +2416,21 @@ public class TestPlayer implements Player { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (o == null || getClass() != o.getClass()) { + return false; + } + + Player obj = (Player) o; + if (this.getId() == null || obj.getId() == null) { + return false; + } + + return this.getId().equals(obj.getId()); + } } diff --git a/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java b/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java index 354b9a88ac6..7eebfc498a8 100644 --- a/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java +++ b/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java @@ -1293,4 +1293,22 @@ public class PlayerStub implements Player { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (o == null || getClass() != o.getClass()) { + return false; + } + + Player obj = (Player) o; + if (this.getId() == null || obj.getId() == null) { + return false; + } + + return this.getId().equals(obj.getId()); + } + } diff --git a/Mage/src/main/java/mage/game/GameState.java b/Mage/src/main/java/mage/game/GameState.java index 384d07ab199..d10618d2de3 100644 --- a/Mage/src/main/java/mage/game/GameState.java +++ b/Mage/src/main/java/mage/game/GameState.java @@ -757,8 +757,8 @@ public class GameState implements Serializable, Copyable { ZoneChangeData data = (ZoneChangeData) obj; return this.fromZone == data.fromZone && this.toZone == data.toZone - && this.sourceId == data.sourceId - && this.playerId == data.playerId; + && Objects.equals(this.sourceId, data.sourceId) + && Objects.equals(this.playerId, data.playerId); } return false; } diff --git a/Mage/src/main/java/mage/game/combat/CombatGroup.java b/Mage/src/main/java/mage/game/combat/CombatGroup.java index c66dcd0c06d..e1f003e1d87 100644 --- a/Mage/src/main/java/mage/game/combat/CombatGroup.java +++ b/Mage/src/main/java/mage/game/combat/CombatGroup.java @@ -28,11 +28,8 @@ package mage.game.combat; import java.io.Serializable; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; +import java.util.*; + import mage.abilities.common.ControllerAssignCombatDamageToBlockersAbility; import mage.abilities.common.ControllerDivideCombatDamageAbility; import mage.abilities.common.DamageAsThoughNotBlockedAbility; @@ -286,7 +283,7 @@ public class CombatGroup implements Serializable, Copyable { if (attacker == null) { return; } - boolean oldRuleDamage = (player.getId() == defendingPlayerId); + boolean oldRuleDamage = (Objects.equals(player.getId(), defendingPlayerId)); int damage = getDamageValueFromPermanent(attacker, game); if (canDamage(attacker, first)) { // must be set before attacker damage marking because of effects like Test of Faith diff --git a/Mage/src/main/java/mage/game/command/planes/EdgeOfMalacolPlane.java b/Mage/src/main/java/mage/game/command/planes/EdgeOfMalacolPlane.java index 9caa2b5677e..23146f69957 100644 --- a/Mage/src/main/java/mage/game/command/planes/EdgeOfMalacolPlane.java +++ b/Mage/src/main/java/mage/game/command/planes/EdgeOfMalacolPlane.java @@ -29,6 +29,7 @@ package mage.game.command.planes; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.ActivateIfConditionActivatedAbility; @@ -132,7 +133,7 @@ class EdgeOfMalacolEffect extends ContinuousRuleModifyingEffectImpl { } } Permanent permanent = game.getPermanent(event.getTargetId()); - if (permanent != null && filter.match(permanent, game) && permanent.getControllerId() == game.getActivePlayerId()) { + if (permanent != null && filter.match(permanent, game) && Objects.equals(permanent.getControllerId(), game.getActivePlayerId())) { UUID oldController = source.getControllerId(); source.setControllerId(game.getActivePlayerId()); Effect effect = new AddCountersTargetEffect(CounterType.P1P1.createInstance(2)); diff --git a/Mage/src/main/java/mage/players/PlayerImpl.java b/Mage/src/main/java/mage/players/PlayerImpl.java index c850a67fcba..87a78ad1bbb 100644 --- a/Mage/src/main/java/mage/players/PlayerImpl.java +++ b/Mage/src/main/java/mage/players/PlayerImpl.java @@ -3866,7 +3866,7 @@ public abstract class PlayerImpl implements Player, Serializable { return false; } - PlayerImpl obj = (PlayerImpl) o; + Player obj = (Player) o; if (this.getId() == null || obj.getId() == null) { return false; } diff --git a/Mage/src/main/java/mage/watchers/common/BlockedByOnlyOneCreatureThisCombatWatcher.java b/Mage/src/main/java/mage/watchers/common/BlockedByOnlyOneCreatureThisCombatWatcher.java index 3e91f1f0b0a..945a50e2458 100644 --- a/Mage/src/main/java/mage/watchers/common/BlockedByOnlyOneCreatureThisCombatWatcher.java +++ b/Mage/src/main/java/mage/watchers/common/BlockedByOnlyOneCreatureThisCombatWatcher.java @@ -27,11 +27,8 @@ */ package mage.watchers.common; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.UUID; +import java.util.*; + import mage.constants.WatcherScope; import mage.game.Game; import mage.game.combat.CombatGroup; @@ -67,7 +64,7 @@ public class BlockedByOnlyOneCreatureThisCombatWatcher extends Watcher { if (!blockedByOneCreature.containsKey(combatGroup)) { blockedByOneCreature.put(combatGroup, event.getSourceId()); } - else if (blockedByOneCreature.get(combatGroup) != event.getSourceId()) { + else if (!Objects.equals(blockedByOneCreature.get(combatGroup), event.getSourceId())) { blockedByOneCreature.put(combatGroup, null); } } From 7cb90e2475f0f98f5cbcc7ab6280d5004618b906 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sat, 28 Apr 2018 22:23:10 +0400 Subject: [PATCH 026/158] * 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 ef5fa334df9..b94fa2c26c8 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 353ecde35a9..3a43aec961d 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSource.java @@ -195,7 +195,6 @@ public enum ScryfallImageSource implements CardImageSource { supportedSets.add("DDS"); supportedSets.add("W17"); supportedSets.add("AKH"); - supportedSets.add("MPS"); supportedSets.add("CMA"); supportedSets.add("E01"); supportedSets.add("HOU"); diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/images/CardDownloadData.java b/Mage.Client/src/main/java/org/mage/plugins/card/images/CardDownloadData.java index 5016db5b61c..08c0a25587e 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/images/CardDownloadData.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/images/CardDownloadData.java @@ -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 0959f928fde..2cfa88c803d 100644 --- a/Mage.Sets/src/mage/sets/StarWars.java +++ b/Mage.Sets/src/mage/sets/StarWars.java @@ -130,10 +130,10 @@ public class StarWars extends ExpansionSet { cards.add(new SetCardInfo("Force Reflex", 13, Rarity.COMMON, mage.cards.f.ForceReflex.class)); cards.add(new SetCardInfo("Force Scream", 104, Rarity.UNCOMMON, mage.cards.f.ForceScream.class)); cards.add(new SetCardInfo("Force Spark", 105, Rarity.COMMON, mage.cards.f.ForceSpark.class)); - cards.add(new SetCardInfo("Forest", 268, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Forest", 269, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Forest", 270, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Forest", 271, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Forest", "268a", Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Forest", "268b", Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Forest", "268c", Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Forest", "268d", Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); cards.add(new SetCardInfo("Fulfill Contract", 224, Rarity.COMMON, mage.cards.f.FulfillContract.class)); cards.add(new SetCardInfo("Gamorrean Prison Guard", 106, Rarity.UNCOMMON, mage.cards.g.GamorreanPrisonGuard.class)); cards.add(new SetCardInfo("General Grievous", 185, Rarity.MYTHIC, mage.cards.g.GeneralGrievous.class)); @@ -160,10 +160,10 @@ public class StarWars extends ExpansionSet { cards.add(new SetCardInfo("Interrogation", 81, Rarity.COMMON, mage.cards.i.Interrogation.class)); cards.add(new SetCardInfo("Ion Cannon", 15, Rarity.COMMON, mage.cards.i.IonCannon.class)); cards.add(new SetCardInfo("Iron Fist of the Empire", 191, Rarity.RARE, mage.cards.i.IronFistOfTheEmpire.class)); - cards.add(new SetCardInfo("Island", 256, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Island", 257, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Island", 258, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Island", 259, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Island", "256a", Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Island", "256b", Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Island", "256c", Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Island", "256d", Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); cards.add(new SetCardInfo("Ithorian Initiate", 140, Rarity.COMMON, mage.cards.i.IthorianInitiate.class)); cards.add(new SetCardInfo("Jabba the Hutt", 192, Rarity.RARE, mage.cards.j.JabbaTheHutt.class)); cards.add(new SetCardInfo("Jango Fett", 111, Rarity.RARE, mage.cards.j.JangoFett.class)); @@ -205,10 +205,10 @@ public class StarWars extends ExpansionSet { cards.add(new SetCardInfo("Moisture Farm", 247, Rarity.UNCOMMON, mage.cards.m.MoistureFarm.class)); cards.add(new SetCardInfo("Mon Calamari Cruiser", 48, Rarity.UNCOMMON, mage.cards.m.MonCalamariCruiser.class)); cards.add(new SetCardInfo("Mon Calamari Initiate", 49, Rarity.COMMON, mage.cards.m.MonCalamariInitiate.class)); - cards.add(new SetCardInfo("Mountain", 264, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Mountain", 265, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Mountain", 266, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Mountain", 267, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Mountain", "264a", Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Mountain", "264b", Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Mountain", "264c", Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Mountain", "264d", Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); cards.add(new SetCardInfo("N-1 Starfighter", 225, Rarity.COMMON, mage.cards.n.N1Starfighter.class)); cards.add(new SetCardInfo("Nebulon-B Frigate", 25, Rarity.COMMON, mage.cards.n.NebulonBFrigate.class)); cards.add(new SetCardInfo("Neophyte Hateflayer", 82, Rarity.COMMON, mage.cards.n.NeophyteHateflayer.class)); @@ -226,10 +226,10 @@ public class StarWars extends ExpansionSet { cards.add(new SetCardInfo("Outer Rim Slaver", 201, Rarity.COMMON, mage.cards.o.OuterRimSlaver.class)); cards.add(new SetCardInfo("Outlaw Holocron", 235, Rarity.COMMON, mage.cards.o.OutlawHolocron.class)); cards.add(new SetCardInfo("Personal Energy Shield", 51, Rarity.COMMON, mage.cards.p.PersonalEnergyShield.class)); - cards.add(new SetCardInfo("Plains", 252, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Plains", 253, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Plains", 254, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Plains", 255, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Plains", "252a", Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Plains", "252b", Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Plains", "252c", Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Plains", "252d", Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); cards.add(new SetCardInfo("Plo Koon", 27, Rarity.RARE, mage.cards.p.PloKoon.class)); cards.add(new SetCardInfo("Precipice of Mortis", 202, Rarity.RARE, mage.cards.p.PrecipiceOfMortis.class)); cards.add(new SetCardInfo("Predator's Strike", 151, Rarity.COMMON, mage.cards.p.PredatorsStrike.class)); @@ -289,10 +289,10 @@ public class StarWars extends ExpansionSet { cards.add(new SetCardInfo("Strike Team Commando", 227, Rarity.COMMON, mage.cards.s.StrikeTeamCommando.class)); cards.add(new SetCardInfo("Super Battle Droid", 59, Rarity.COMMON, mage.cards.s.SuperBattleDroid.class)); cards.add(new SetCardInfo("Surprise Maneuver", 60, Rarity.COMMON, mage.cards.s.SurpriseManeuver.class)); - cards.add(new SetCardInfo("Swamp", 260, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Swamp", 261, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Swamp", 262, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Swamp", 263, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Swamp", "260a", Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Swamp", "260b", Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Swamp", "260c", Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Swamp", "260d", Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(FrameStyle.ZEN_FULL_ART_BASIC, true))); cards.add(new SetCardInfo("Swarm the Skies", 92, Rarity.COMMON, mage.cards.s.SwarmTheSkies.class)); cards.add(new SetCardInfo("Syndicate Enforcer", 124, Rarity.COMMON, mage.cards.s.SyndicateEnforcerSWS.class)); cards.add(new SetCardInfo("Tank Droid", 218, Rarity.RARE, mage.cards.t.TankDroid.class)); @@ -328,5 +328,4 @@ public class StarWars extends ExpansionSet { cards.add(new SetCardInfo("Yoda, Jedi Master", 223, Rarity.MYTHIC, mage.cards.y.YodaJediMaster.class)); cards.add(new SetCardInfo("Zam Wesell", 64, Rarity.RARE, mage.cards.z.ZamWesell.class)); } - } From bb3c7232ea3935bd66e95081db693b776356f2f0 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sat, 28 Apr 2018 22:43:28 +0400 Subject: [PATCH 027/158] * [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 b94fa2c26c8..f089ae111cb 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GrabbagImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GrabbagImageSource.java @@ -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 501c7275aab..754ad351f3b 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 028/158] * [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 754ad351f3b..5c59e59c9c1 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 029/158] 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 0627d07f2b1..227f788d4fa 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Brawl.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Brawl.java @@ -74,12 +74,12 @@ public class Brawl extends Constructed { } } } - banned.add("Attune with Aether"); // since 2008-01-15 + banned.add("Attune with Aether"); // since 2018-01-15 banned.add("Aetherworks Marvel"); banned.add("Felidar Guardian"); - banned.add("Rampaging Ferocidon"); // since 2008-01-15 - banned.add("Ramunap Ruins"); // since 2008-01-15 - banned.add("Rogue Refiner"); // since 2008-01-15 + banned.add("Rampaging Ferocidon"); // since 2018-01-15 + banned.add("Ramunap Ruins"); // since 2018-01-15 + banned.add("Rogue Refiner"); // since 2018-01-15 banned.add("Smuggler's Copter"); } From 54e4c2c484cecc0affc93b87d199aeebe112e35c Mon Sep 17 00:00:00 2001 From: Brik Royster Date: Sat, 28 Apr 2018 17:08:43 -0700 Subject: [PATCH 030/158] 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 95af662d1ff..54eef0df5d6 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Standard.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Standard.java @@ -72,12 +72,12 @@ public class Standard extends Constructed { } } } - banned.add("Attune with Aether"); // since 2008-01-15 + banned.add("Attune with Aether"); // since 2018-01-15 banned.add("Aetherworks Marvel"); banned.add("Felidar Guardian"); - banned.add("Rampaging Ferocidon"); // since 2008-01-15 - banned.add("Ramunap Ruins"); // since 2008-01-15 - banned.add("Rogue Refiner"); // since 2008-01-15 + banned.add("Rampaging Ferocidon"); // since 2018-01-15 + banned.add("Ramunap Ruins"); // since 2018-01-15 + banned.add("Rogue Refiner"); // since 2018-01-15 banned.add("Smuggler's Copter"); } From 4ec5563bc6881bc138d119b16edd82ff06f8c4ac Mon Sep 17 00:00:00 2001 From: Thomas Contis Date: Sat, 28 Apr 2018 22:13:59 -0400 Subject: [PATCH 031/158] Beginning of proper implementation of Cephalid Snitch Methods --- .../src/mage/cards/c/CephalidSnitch.java | 96 ++++++++++++++++++- .../abilities/keyword/ProtectionAbility.java | 8 ++ 2 files changed, 101 insertions(+), 3 deletions(-) diff --git a/Mage.Sets/src/mage/cards/c/CephalidSnitch.java b/Mage.Sets/src/mage/cards/c/CephalidSnitch.java index fc328edb8bc..b588ca8f387 100644 --- a/Mage.Sets/src/mage/cards/c/CephalidSnitch.java +++ b/Mage.Sets/src/mage/cards/c/CephalidSnitch.java @@ -27,19 +27,35 @@ */ package mage.cards.c; -import java.util.UUID; +import java.awt.*; +import java.util.*; +import java.util.List; + import mage.MageInt; import mage.ObjectColor; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.LoseAbilityTargetEffect; import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.ProtectionAbility; +import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; +import mage.filter.Filter; +import mage.filter.FilterCard; +import mage.filter.FilterObject; +import mage.filter.predicate.Predicate; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; import mage.target.common.TargetCreaturePermanent; /** @@ -56,8 +72,7 @@ public class CephalidSnitch extends CardImpl { this.toughness = new MageInt(1); // Sacrifice Cephalid Snitch: Target creature loses protection from black until end of turn. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new LoseAbilityTargetEffect( - ProtectionAbility.from(ObjectColor.BLACK), Duration.EndOfTurn), new SacrificeSourceCost()); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CephalidSnitchEffect(), new SacrificeSourceCost()); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); } @@ -71,3 +86,78 @@ public class CephalidSnitch extends CardImpl { return new CephalidSnitch(this); } } +class CephalidSnitchEffect extends LoseAbilityTargetEffect{ + + public CephalidSnitchEffect() { + super(ProtectionAbility.from(ObjectColor.BLACK), Duration.EndOfTurn); + staticText = "Target creature loses protection from black until end of turn."; + } + + public CephalidSnitchEffect(final CephalidSnitchEffect effect) { + super(effect); + } + + @Override + public CephalidSnitchEffect copy() { + return new CephalidSnitchEffect(this); + } + + public String filterNameAssembler(List unsortedColors) { + //Order colors properly by WUBRG (skipping black of course) and construct string to be displayed for ability. + List colors = new ArrayList<>(); + if(unsortedColors.contains(ObjectColor.WHITE)){ + colors.add(ObjectColor.WHITE); + } + if(unsortedColors.contains(ObjectColor.BLUE)){ + colors.add(ObjectColor.BLUE); + } + if(unsortedColors.contains(ObjectColor.RED)){ + colors.add(ObjectColor.RED); + } + if(unsortedColors.contains(ObjectColor.GREEN)){ + colors.add(ObjectColor.GREEN); + } + if (colors.size() == 1) { + return colors.get(0).getDescription(); + } else if (colors.size() == 2) { + return colors.get(0).getDescription() + " and from " + colors.get(1).getDescription(); + } else if (colors.size() == 3) { + return colors.get(0).getDescription() + ", from " + colors.get(1).getDescription() + " and from " + colors.get(2).getDescription(); + } else if (colors.size() == 4) { + return colors.get(0).getDescription() + ", from " + colors.get(1).getDescription() + ", from " + colors.get(2).getDescription() + " and from " + colors.get(3).getDescription(); + } + return ""; + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent targetCreature = game.getPermanent(targetPointer.getFirst(game, source)); + if (targetCreature != null) { + + //Go through protection abilities and sort out any containing black, then record the colors other than black + for(ProtectionAbility a: targetCreature.getAbilities().getProtectionAbilities()) { + List objectColors = new ArrayList<>(); + if(a.getColors().contains(ObjectColor.BLACK)) + for (ObjectColor o : a.getColors()) { + if (!objectColors.contains(o) && !o.isBlack()) + objectColors.add(o); + } + //Construct a card filter excluding black + if(objectColors.size() > 0) { + FilterCard filter = new FilterCard(filterNameAssembler(objectColors)); + if (objectColors.size() == 1) + filter.add(new ColorPredicate(objectColors.get(0))); + else if (objectColors.size() == 2) + filter.add(Predicates.or(new ColorPredicate(objectColors.get(0)), new ColorPredicate(objectColors.get(1)))); + else if (objectColors.size() == 3) + filter.add(Predicates.or(new ColorPredicate(objectColors.get(0)), new ColorPredicate(objectColors.get(1)), new ColorPredicate(objectColors.get(2)))); + else if (objectColors.size() == 4) + filter.add(Predicates.or(new ColorPredicate(objectColors.get(0)), new ColorPredicate(objectColors.get(1)), new ColorPredicate(objectColors.get(2)), new ColorPredicate(objectColors.get(3)))); + a.setFilter(filter); + } + } + return true; + } + return false; + } +} \ No newline at end of file diff --git a/Mage/src/main/java/mage/abilities/keyword/ProtectionAbility.java b/Mage/src/main/java/mage/abilities/keyword/ProtectionAbility.java index 46471af292f..06161120043 100644 --- a/Mage/src/main/java/mage/abilities/keyword/ProtectionAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/ProtectionAbility.java @@ -27,6 +27,8 @@ */ package mage.abilities.keyword; +import java.util.ArrayList; +import java.util.List; import java.util.UUID; import mage.MageObject; import mage.ObjectColor; @@ -53,6 +55,7 @@ public class ProtectionAbility extends StaticAbility { protected Filter filter; protected boolean removeAuras; + protected static List objectColors = new ArrayList<>(); protected UUID auraIdNotToBeRemoved; // defines an Aura objectId that will not be removed from this protection ability public ProtectionAbility(Filter filter) { @@ -72,12 +75,15 @@ public class ProtectionAbility extends StaticAbility { public static ProtectionAbility from(ObjectColor color) { FilterObject filter = new FilterObject(color.getDescription()); filter.add(new ColorPredicate(color)); + objectColors.add(color); return new ProtectionAbility(filter); } public static ProtectionAbility from(ObjectColor color1, ObjectColor color2) { FilterObject filter = new FilterObject(color1.getDescription() + " and from " + color2.getDescription()); filter.add(Predicates.or(new ColorPredicate(color1), new ColorPredicate(color2))); + objectColors.add(color1); + objectColors.add(color2); return new ProtectionAbility(filter); } @@ -140,6 +146,8 @@ public class ProtectionAbility extends StaticAbility { return removeAuras; } + public List getColors() { return objectColors; } + public UUID getAuraIdNotToBeRemoved() { return auraIdNotToBeRemoved; } From 6c8379fcdcc4c22775f2b549df6feb530b5787c8 Mon Sep 17 00:00:00 2001 From: Thomas Contis Date: Tue, 24 Apr 2018 19:48:20 -0400 Subject: [PATCH 032/158] Implemented Cephalid Snitch (Torment) --- .../src/mage/cards/c/CephalidSnitch.java | 73 +++++++++++++++++++ Mage.Sets/src/mage/sets/Torment.java | 1 + 2 files changed, 74 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/CephalidSnitch.java diff --git a/Mage.Sets/src/mage/cards/c/CephalidSnitch.java b/Mage.Sets/src/mage/cards/c/CephalidSnitch.java new file mode 100644 index 00000000000..fc328edb8bc --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CephalidSnitch.java @@ -0,0 +1,73 @@ +/* + * 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.c; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.LoseAbilityTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.ProtectionAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author tcontis + */ +public class CephalidSnitch extends CardImpl { + + public CephalidSnitch(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{U}"); + this.subtype.add(SubType.CEPHALID); + this.subtype.add(SubType.WIZARD); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Sacrifice Cephalid Snitch: Target creature loses protection from black until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new LoseAbilityTargetEffect( + ProtectionAbility.from(ObjectColor.BLACK), Duration.EndOfTurn), new SacrificeSourceCost()); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public CephalidSnitch(final CephalidSnitch card) { + super(card); + } + + @Override + public CephalidSnitch copy() { + return new CephalidSnitch(this); + } +} diff --git a/Mage.Sets/src/mage/sets/Torment.java b/Mage.Sets/src/mage/sets/Torment.java index 8bb64ddaf9f..6d69b7240b0 100644 --- a/Mage.Sets/src/mage/sets/Torment.java +++ b/Mage.Sets/src/mage/sets/Torment.java @@ -77,6 +77,7 @@ public class Torment extends ExpansionSet { cards.add(new SetCardInfo("Cephalid Aristocrat", 27, Rarity.COMMON, mage.cards.c.CephalidAristocrat.class)); cards.add(new SetCardInfo("Cephalid Illusionist", 28, Rarity.UNCOMMON, mage.cards.c.CephalidIllusionist.class)); cards.add(new SetCardInfo("Cephalid Sage", 29, Rarity.UNCOMMON, mage.cards.c.CephalidSage.class)); + cards.add(new SetCardInfo("Cephalid Snitch", 30, Rarity.COMMON, mage.cards.c.CephalidSnitch.class)); cards.add(new SetCardInfo("Cephalid Vandal", 31, Rarity.RARE, mage.cards.c.CephalidVandal.class)); cards.add(new SetCardInfo("Chainer, Dementia Master", 56, Rarity.RARE, mage.cards.c.ChainerDementiaMaster.class)); cards.add(new SetCardInfo("Chainer's Edict", 57, Rarity.UNCOMMON, mage.cards.c.ChainersEdict.class)); From 24f6dc6031afada69b016286815dad812e49f058 Mon Sep 17 00:00:00 2001 From: Thomas Contis Date: Sat, 28 Apr 2018 22:13:59 -0400 Subject: [PATCH 033/158] Beginning of proper implementation of Cephalid Snitch Methods --- .../src/mage/cards/c/CephalidSnitch.java | 96 ++++++++++++++++++- .../abilities/keyword/ProtectionAbility.java | 8 ++ 2 files changed, 101 insertions(+), 3 deletions(-) diff --git a/Mage.Sets/src/mage/cards/c/CephalidSnitch.java b/Mage.Sets/src/mage/cards/c/CephalidSnitch.java index fc328edb8bc..b588ca8f387 100644 --- a/Mage.Sets/src/mage/cards/c/CephalidSnitch.java +++ b/Mage.Sets/src/mage/cards/c/CephalidSnitch.java @@ -27,19 +27,35 @@ */ package mage.cards.c; -import java.util.UUID; +import java.awt.*; +import java.util.*; +import java.util.List; + import mage.MageInt; import mage.ObjectColor; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.LoseAbilityTargetEffect; import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.ProtectionAbility; +import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; +import mage.filter.Filter; +import mage.filter.FilterCard; +import mage.filter.FilterObject; +import mage.filter.predicate.Predicate; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; import mage.target.common.TargetCreaturePermanent; /** @@ -56,8 +72,7 @@ public class CephalidSnitch extends CardImpl { this.toughness = new MageInt(1); // Sacrifice Cephalid Snitch: Target creature loses protection from black until end of turn. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new LoseAbilityTargetEffect( - ProtectionAbility.from(ObjectColor.BLACK), Duration.EndOfTurn), new SacrificeSourceCost()); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CephalidSnitchEffect(), new SacrificeSourceCost()); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); } @@ -71,3 +86,78 @@ public class CephalidSnitch extends CardImpl { return new CephalidSnitch(this); } } +class CephalidSnitchEffect extends LoseAbilityTargetEffect{ + + public CephalidSnitchEffect() { + super(ProtectionAbility.from(ObjectColor.BLACK), Duration.EndOfTurn); + staticText = "Target creature loses protection from black until end of turn."; + } + + public CephalidSnitchEffect(final CephalidSnitchEffect effect) { + super(effect); + } + + @Override + public CephalidSnitchEffect copy() { + return new CephalidSnitchEffect(this); + } + + public String filterNameAssembler(List unsortedColors) { + //Order colors properly by WUBRG (skipping black of course) and construct string to be displayed for ability. + List colors = new ArrayList<>(); + if(unsortedColors.contains(ObjectColor.WHITE)){ + colors.add(ObjectColor.WHITE); + } + if(unsortedColors.contains(ObjectColor.BLUE)){ + colors.add(ObjectColor.BLUE); + } + if(unsortedColors.contains(ObjectColor.RED)){ + colors.add(ObjectColor.RED); + } + if(unsortedColors.contains(ObjectColor.GREEN)){ + colors.add(ObjectColor.GREEN); + } + if (colors.size() == 1) { + return colors.get(0).getDescription(); + } else if (colors.size() == 2) { + return colors.get(0).getDescription() + " and from " + colors.get(1).getDescription(); + } else if (colors.size() == 3) { + return colors.get(0).getDescription() + ", from " + colors.get(1).getDescription() + " and from " + colors.get(2).getDescription(); + } else if (colors.size() == 4) { + return colors.get(0).getDescription() + ", from " + colors.get(1).getDescription() + ", from " + colors.get(2).getDescription() + " and from " + colors.get(3).getDescription(); + } + return ""; + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent targetCreature = game.getPermanent(targetPointer.getFirst(game, source)); + if (targetCreature != null) { + + //Go through protection abilities and sort out any containing black, then record the colors other than black + for(ProtectionAbility a: targetCreature.getAbilities().getProtectionAbilities()) { + List objectColors = new ArrayList<>(); + if(a.getColors().contains(ObjectColor.BLACK)) + for (ObjectColor o : a.getColors()) { + if (!objectColors.contains(o) && !o.isBlack()) + objectColors.add(o); + } + //Construct a card filter excluding black + if(objectColors.size() > 0) { + FilterCard filter = new FilterCard(filterNameAssembler(objectColors)); + if (objectColors.size() == 1) + filter.add(new ColorPredicate(objectColors.get(0))); + else if (objectColors.size() == 2) + filter.add(Predicates.or(new ColorPredicate(objectColors.get(0)), new ColorPredicate(objectColors.get(1)))); + else if (objectColors.size() == 3) + filter.add(Predicates.or(new ColorPredicate(objectColors.get(0)), new ColorPredicate(objectColors.get(1)), new ColorPredicate(objectColors.get(2)))); + else if (objectColors.size() == 4) + filter.add(Predicates.or(new ColorPredicate(objectColors.get(0)), new ColorPredicate(objectColors.get(1)), new ColorPredicate(objectColors.get(2)), new ColorPredicate(objectColors.get(3)))); + a.setFilter(filter); + } + } + return true; + } + return false; + } +} \ No newline at end of file diff --git a/Mage/src/main/java/mage/abilities/keyword/ProtectionAbility.java b/Mage/src/main/java/mage/abilities/keyword/ProtectionAbility.java index 46471af292f..06161120043 100644 --- a/Mage/src/main/java/mage/abilities/keyword/ProtectionAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/ProtectionAbility.java @@ -27,6 +27,8 @@ */ package mage.abilities.keyword; +import java.util.ArrayList; +import java.util.List; import java.util.UUID; import mage.MageObject; import mage.ObjectColor; @@ -53,6 +55,7 @@ public class ProtectionAbility extends StaticAbility { protected Filter filter; protected boolean removeAuras; + protected static List objectColors = new ArrayList<>(); protected UUID auraIdNotToBeRemoved; // defines an Aura objectId that will not be removed from this protection ability public ProtectionAbility(Filter filter) { @@ -72,12 +75,15 @@ public class ProtectionAbility extends StaticAbility { public static ProtectionAbility from(ObjectColor color) { FilterObject filter = new FilterObject(color.getDescription()); filter.add(new ColorPredicate(color)); + objectColors.add(color); return new ProtectionAbility(filter); } public static ProtectionAbility from(ObjectColor color1, ObjectColor color2) { FilterObject filter = new FilterObject(color1.getDescription() + " and from " + color2.getDescription()); filter.add(Predicates.or(new ColorPredicate(color1), new ColorPredicate(color2))); + objectColors.add(color1); + objectColors.add(color2); return new ProtectionAbility(filter); } @@ -140,6 +146,8 @@ public class ProtectionAbility extends StaticAbility { return removeAuras; } + public List getColors() { return objectColors; } + public UUID getAuraIdNotToBeRemoved() { return auraIdNotToBeRemoved; } From e2a5561a87ee02c101760979e89929684e34bda2 Mon Sep 17 00:00:00 2001 From: Thomas Contis Date: Sat, 28 Apr 2018 22:29:16 -0400 Subject: [PATCH 034/158] Began implementing Cephalid Snitch methods --- Mage.Sets/src/mage/cards/c/CephalidSnitch.java | 10 ---------- .../java/mage/abilities/keyword/ProtectionAbility.java | 10 +++++----- 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/Mage.Sets/src/mage/cards/c/CephalidSnitch.java b/Mage.Sets/src/mage/cards/c/CephalidSnitch.java index b588ca8f387..2085c215fd2 100644 --- a/Mage.Sets/src/mage/cards/c/CephalidSnitch.java +++ b/Mage.Sets/src/mage/cards/c/CephalidSnitch.java @@ -36,26 +36,16 @@ import mage.ObjectColor; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeSourceCost; -import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.ContinuousEffect; -import mage.abilities.effects.ContinuousEffectImpl; -import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.LoseAbilityTargetEffect; -import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.ProtectionAbility; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; -import mage.filter.Filter; import mage.filter.FilterCard; -import mage.filter.FilterObject; -import mage.filter.predicate.Predicate; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.ColorPredicate; import mage.game.Game; import mage.game.permanent.Permanent; -import mage.players.Player; import mage.target.common.TargetCreaturePermanent; /** diff --git a/Mage/src/main/java/mage/abilities/keyword/ProtectionAbility.java b/Mage/src/main/java/mage/abilities/keyword/ProtectionAbility.java index 06161120043..3546cc592cb 100644 --- a/Mage/src/main/java/mage/abilities/keyword/ProtectionAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/ProtectionAbility.java @@ -55,7 +55,7 @@ public class ProtectionAbility extends StaticAbility { protected Filter filter; protected boolean removeAuras; - protected static List objectColors = new ArrayList<>(); + protected static List colors = new ArrayList<>(); protected UUID auraIdNotToBeRemoved; // defines an Aura objectId that will not be removed from this protection ability public ProtectionAbility(Filter filter) { @@ -75,15 +75,15 @@ public class ProtectionAbility extends StaticAbility { public static ProtectionAbility from(ObjectColor color) { FilterObject filter = new FilterObject(color.getDescription()); filter.add(new ColorPredicate(color)); - objectColors.add(color); + colors.add(color); return new ProtectionAbility(filter); } public static ProtectionAbility from(ObjectColor color1, ObjectColor color2) { FilterObject filter = new FilterObject(color1.getDescription() + " and from " + color2.getDescription()); filter.add(Predicates.or(new ColorPredicate(color1), new ColorPredicate(color2))); - objectColors.add(color1); - objectColors.add(color2); + colors.add(color1); + colors.add(color2); return new ProtectionAbility(filter); } @@ -146,7 +146,7 @@ public class ProtectionAbility extends StaticAbility { return removeAuras; } - public List getColors() { return objectColors; } + public List getColors() { return colors; } public UUID getAuraIdNotToBeRemoved() { return auraIdNotToBeRemoved; From 1dbffe70b532b3c0527674db5097eb5311250cc2 Mon Sep 17 00:00:00 2001 From: spjspj Date: Sun, 29 Apr 2018 23:47:08 +1000 Subject: [PATCH 035/158] Add planechase to tournaments --- .../mage/client/dialog/NewTournamentDialog.form | 10 ++++++++++ .../mage/client/dialog/NewTournamentDialog.java | 14 +++++++++++++- .../java/mage/client/dialog/PreferencesDialog.java | 1 + .../mage/game/tournament/TournamentOptions.java | 1 + 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.form b/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.form index 26c324e4cad..349e6bf7714 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.form +++ b/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.form @@ -57,6 +57,8 @@ + + @@ -186,6 +188,7 @@ + @@ -454,6 +457,13 @@ + + + + + + + diff --git a/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java b/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java index 81525896965..1cd35f3d214 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java @@ -123,6 +123,7 @@ public class NewTournamentDialog extends MageDialog { tournamentPlayerPanel.init(i++); } cbAllowSpectators.setSelected(true); + cbPlaneChase.setSelected(false); this.setModal(true); this.setLocation(150, 100); } @@ -173,6 +174,7 @@ public class NewTournamentDialog extends MageDialog { jLabel6 = new javax.swing.JLabel(); cbDraftTiming = new javax.swing.JComboBox(); cbAllowSpectators = new javax.swing.JCheckBox(); + cbPlaneChase = new javax.swing.JCheckBox(); lblPlayer1 = new javax.swing.JLabel(); lblConstructionTime = new javax.swing.JLabel(); chkRollbackTurnsAllowed = new javax.swing.JCheckBox(); @@ -286,6 +288,9 @@ public class NewTournamentDialog extends MageDialog { cbAllowSpectators.setText("Allow spectators"); cbAllowSpectators.setToolTipText("Allow other players to watch the games of this table."); + cbPlaneChase.setText("Use Plane Chase"); + cbPlaneChase.setToolTipText("Use Plane Chase variant for the tournament."); + lblPlayer1.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N lblPlayer1.setText("Player 1 (You)"); @@ -379,7 +384,9 @@ public class NewTournamentDialog extends MageDialog { .addGroup(layout.createSequentialGroup() .addComponent(spnNumRounds, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(cbAllowSpectators)))) + .addComponent(cbAllowSpectators) + .addComponent(cbPlaneChase) + ))) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addGap(0, 0, Short.MAX_VALUE) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -491,6 +498,7 @@ public class NewTournamentDialog extends MageDialog { .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(cbAllowSpectators, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(cbPlaneChase, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(spnNumRounds, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblNumRounds)) .addComponent(lblNbrPlayers, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) @@ -537,6 +545,7 @@ public class NewTournamentDialog extends MageDialog { tOptions.setPassword(txtPassword.getText()); tOptions.getPlayerTypes().add(PlayerType.HUMAN); tOptions.setWatchingAllowed(cbAllowSpectators.isSelected()); + tOptions.setPlaneChase(cbPlaneChase.isSelected()); tOptions.setQuitRatio((Integer) spnQuitRatio.getValue()); for (TournamentPlayerPanel player : players) { tOptions.getPlayerTypes().add((PlayerType) player.getPlayerType().getSelectedItem()); @@ -1106,6 +1115,7 @@ public class NewTournamentDialog extends MageDialog { } } this.cbAllowSpectators.setSelected(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_ALLOW_SPECTATORS + versionStr, "Yes").equals("Yes")); + this.cbPlaneChase.setSelected(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_PLANE_CHASE + versionStr, "No").equals("Yes")); this.chkRollbackTurnsAllowed.setSelected(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_ALLOW_ROLLBACKS + versionStr, "Yes").equals("Yes")); this.chkRated.setSelected(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_RATED + versionStr, "No").equals("Yes")); } @@ -1191,6 +1201,7 @@ public class NewTournamentDialog extends MageDialog { } } PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_TOURNAMENT_ALLOW_SPECTATORS + versionStr, (tOptions.isWatchingAllowed() ? "Yes" : "No")); + PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_TOURNAMENT_PLANE_CHASE + versionStr, (tOptions.isPlaneChase() ? "Yes" : "No")); PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_TOURNAMENT_ALLOW_ROLLBACKS + versionStr, (tOptions.getMatchOptions().isRollbackTurnsAllowed() ? "Yes" : "No")); PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_TOURNAMENT_RATED + versionStr, (tOptions.getMatchOptions().isRated() ? "Yes" : "No")); } @@ -1205,6 +1216,7 @@ public class NewTournamentDialog extends MageDialog { private javax.swing.JButton btnSavedConfiguration1; private javax.swing.JButton btnSavedConfiguration2; private javax.swing.JCheckBox cbAllowSpectators; + private javax.swing.JCheckBox cbPlaneChase; private javax.swing.JComboBox cbDeckType; private javax.swing.JComboBox cbDraftCube; private javax.swing.JComboBox cbDraftTiming; diff --git a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java index ee7a329aee2..71b0668eef8 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java @@ -264,6 +264,7 @@ public class PreferencesDialog extends javax.swing.JDialog { public static final String KEY_NEW_TOURNAMENT_PLAYERS_DRAFT = "newTournamentPlayersDraft"; public static final String KEY_NEW_TOURNAMENT_DRAFT_TIMING = "newTournamentDraftTiming"; public static final String KEY_NEW_TOURNAMENT_ALLOW_SPECTATORS = "newTournamentAllowSpectators"; + public static final String KEY_NEW_TOURNAMENT_PLANE_CHASE = "newTournamentPlaneChase"; public static final String KEY_NEW_TOURNAMENT_ALLOW_ROLLBACKS = "newTournamentAllowRollbacks"; public static final String KEY_NEW_TOURNAMENT_DECK_FILE = "newTournamentDeckFile"; public static final String KEY_NEW_TOURNAMENT_QUIT_RATIO = "newTournamentQuitRatio"; diff --git a/Mage/src/main/java/mage/game/tournament/TournamentOptions.java b/Mage/src/main/java/mage/game/tournament/TournamentOptions.java index 2ffa2a6acc3..c445b96bf54 100644 --- a/Mage/src/main/java/mage/game/tournament/TournamentOptions.java +++ b/Mage/src/main/java/mage/game/tournament/TournamentOptions.java @@ -98,6 +98,7 @@ public class TournamentOptions implements Serializable { public void setPlaneChase(boolean planeChase) { this.planeChase = planeChase; + this.matchOptions.setPlaneChase(planeChase); } public int getNumberRounds() { From 858362a7b4309208475c2bdedac09de9b28ec016 Mon Sep 17 00:00:00 2001 From: GitHubMage Date: Sun, 29 Apr 2018 17:49:18 +0200 Subject: [PATCH 036/158] 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 cc243fb0572..7406471ad32 100644 --- a/Mage.Sets/src/mage/cards/a/AliFromCairo.java +++ b/Mage.Sets/src/mage/cards/a/AliFromCairo.java @@ -97,7 +97,7 @@ class AliFromCairoReplacementEffect extends ReplacementEffectImpl { && (controller.getLife() > 0) &&(controller.getLife() - event.getAmount()) < 1 && event.getPlayerId().equals(controller.getId()) ) { - return true; + return true; } } return false; @@ -106,17 +106,12 @@ class AliFromCairoReplacementEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { Player controller = game.getPlayer(source.getControllerId()); - - // 10/1/2008: The ability doesn't change how much damage is dealt; - // it just changes how much life that damage makes you lose. - // An effect such as Spirit Link will see the full amount of damage being dealt. - game.fireEvent(event); - if (controller != null) { - controller.setLife(1, game, source); + // 10/1/2008: The ability doesn't change how much damage is dealt; + // it just changes how much life that damage makes you lose. + // An effect such as Spirit Link will see the full amount of damage being dealt. + event.setAmount(controller.getLife() - 1); } - - return true; + return false; } - } From ec96f8a18efaded8210e11834ce59e5720243c10 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 30 Apr 2018 08:05:17 +0200 Subject: [PATCH 037/158] * 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 fd18966864e..d3285ea480e 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 038/158] * 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 63332cc39fe..ec4e60a4657 100644 --- a/Mage.Sets/src/mage/cards/p/PsychicBattle.java +++ b/Mage.Sets/src/mage/cards/p/PsychicBattle.java @@ -37,16 +37,13 @@ import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; import mage.cards.CardImpl; -import mage.cards.CardsImpl; import mage.cards.CardSetInfo; +import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.FilterPermanent; -import mage.filter.predicate.mageobject.NamePredicate; import mage.game.Game; import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; import mage.game.stack.StackObject; import mage.players.Player; import mage.target.targetpointer.FixedTarget; @@ -58,7 +55,7 @@ import mage.target.targetpointer.FixedTarget; public class PsychicBattle extends CardImpl { public PsychicBattle(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{3}{U}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{U}{U}"); // Whenever a player chooses one or more targets, each player reveals the top card of his or her library. The player who reveals the card with the highest converted mana cost may change the target or targets. If two or more cards are tied for highest cost, the target or targets remain unchanged. Changing targets this way doesn't trigger abilities of permanents named Psychic Battle. this.addAbility(new PsychicBattleTriggeredAbility()); @@ -75,11 +72,6 @@ public class PsychicBattle extends CardImpl { } class PsychicBattleTriggeredAbility extends TriggeredAbilityImpl { - - private static final FilterPermanent filter = new FilterPermanent(); - static { - filter.add(new NamePredicate("Psychic Battle")); - } public PsychicBattleTriggeredAbility() { super(Zone.BATTLEFIELD, new PsychicBattleEffect(), false); @@ -103,8 +95,7 @@ class PsychicBattleTriggeredAbility extends TriggeredAbilityImpl { public boolean checkTrigger(GameEvent event, Game game) { StackObject stackObject = game.getStack().getStackObject(event.getSourceId()); if (stackObject != null) { - Permanent psychicBattle = game.getPermanentOrLKIBattlefield(getSourceId()); - if (psychicBattle != null && !(stackObject.isTargetChanged() && filter.match(psychicBattle, game))) { + if (!stackObject.isTargetChanged() && !stackObject.getName().equals("Psychic Battle")) { this.getEffects().get(0).setTargetPointer(new FixedTarget(event.getSourceId())); stackObject.setTargetChanged(false); // resets the targetChanged flag return true; @@ -122,7 +113,7 @@ class PsychicBattleTriggeredAbility extends TriggeredAbilityImpl { class PsychicBattleEffect extends OneShotEffect { public PsychicBattleEffect() { - super(Outcome.Neutral); + super(Outcome.Benefit); this.staticText = "each player reveals the top card of his or her library. The player who reveals the card with the highest converted mana cost may change the target or targets. If two or more cards are tied for highest cost, the target or targets remain unchanged"; } @@ -148,7 +139,7 @@ class PsychicBattleEffect extends OneShotEffect { manacostMap.put(player, card.getConvertedManaCost()); } } - + Player highestCostPlayer = null; int maxValue = Collections.max(manacostMap.values()); boolean tie = false; @@ -162,7 +153,7 @@ class PsychicBattleEffect extends OneShotEffect { } } } - + if (highestCostPlayer != null && !tie) { StackObject stackObject = game.getStack().getStackObject(this.getTargetPointer().getFirst(game, source)); if (stackObject != null) { diff --git a/Mage/src/main/java/mage/game/stack/Spell.java b/Mage/src/main/java/mage/game/stack/Spell.java index 693b324c910..5a5d4103ec6 100644 --- a/Mage/src/main/java/mage/game/stack/Spell.java +++ b/Mage/src/main/java/mage/game/stack/Spell.java @@ -149,6 +149,7 @@ public class Spell extends StackObjImpl implements Card { this.resolving = spell.resolving; this.doneActivatingManaAbilities = spell.doneActivatingManaAbilities; + this.targetChanged = spell.targetChanged; } public boolean activate(Game game, boolean noMana) { diff --git a/Mage/src/main/java/mage/game/stack/StackAbility.java b/Mage/src/main/java/mage/game/stack/StackAbility.java index 00eabb629a5..da87c5d3fb5 100644 --- a/Mage/src/main/java/mage/game/stack/StackAbility.java +++ b/Mage/src/main/java/mage/game/stack/StackAbility.java @@ -89,6 +89,7 @@ public class StackAbility extends StackObjImpl implements Ability { this.name = stackAbility.name; this.expansionSetCode = stackAbility.expansionSetCode; this.targetAdjustment = stackAbility.targetAdjustment; + this.targetChanged = stackAbility.targetChanged; } @Override diff --git a/Mage/src/main/java/mage/game/stack/StackObjImpl.java b/Mage/src/main/java/mage/game/stack/StackObjImpl.java index 53c689a618f..12d49f57499 100644 --- a/Mage/src/main/java/mage/game/stack/StackObjImpl.java +++ b/Mage/src/main/java/mage/game/stack/StackObjImpl.java @@ -5,6 +5,8 @@ */ package mage.game.stack; +import java.util.Set; +import java.util.UUID; import mage.MageObject; import mage.abilities.Abilities; import mage.abilities.AbilitiesImpl; @@ -19,16 +21,13 @@ import mage.players.Player; import mage.target.Target; import mage.target.TargetAmount; -import java.util.Set; -import java.util.UUID; - /** * * @author LevelX2 */ public abstract class StackObjImpl implements StackObject { - - private boolean targetChanged; // for Psychic Battle + + protected boolean targetChanged; // for Psychic Battle /** * Choose new targets for a stack Object @@ -74,12 +73,11 @@ public abstract class StackObjImpl implements StackObject { * the change is legal. * * Example: Arc Trail is a sorcery that reads "Arc Trail deals 2 damage to - * any target and 1 damage to another target creature or - * player." The current targets of Arc Trail are Runeclaw Bear and Llanowar - * Elves, in that order. You cast Redirect, an instant that reads "You may - * choose new targets for target spell," targeting Arc Trail. You can change - * the first target to Llanowar Elves and change the second target to - * Runeclaw Bear. + * any target and 1 damage to another target creature or player." The + * current targets of Arc Trail are Runeclaw Bear and Llanowar Elves, in + * that order. You cast Redirect, an instant that reads "You may choose new + * targets for target spell," targeting Arc Trail. You can change the first + * target to Llanowar Elves and change the second target to Runeclaw Bear. * * 114.7. Modal spells and abilities may have different targeting * requirements for each mode. An effect that allows a player to change the From d535dba2531e809dafed6638eb57122ab18281ac Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 30 Apr 2018 15:50:37 +0200 Subject: [PATCH 039/158] * 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 e108894cfc3..26ca584cc72 100644 --- a/Mage.Sets/src/mage/cards/s/ScourgeOfValkas.java +++ b/Mage.Sets/src/mage/cards/s/ScourgeOfValkas.java @@ -33,20 +33,22 @@ import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; -import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; +import mage.constants.Outcome; import mage.constants.SubType; import mage.constants.Zone; -import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.FilterPermanent; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; import mage.target.common.TargetAnyTarget; /** @@ -56,17 +58,15 @@ import mage.target.common.TargetAnyTarget; public class ScourgeOfValkas extends CardImpl { private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("{this} or another Dragon"); - private final static FilterControlledCreaturePermanent filter2 = new FilterControlledCreaturePermanent("Dragons you control"); static { filter.add(new SubtypePredicate(SubType.DRAGON)); - filter2.add(new SubtypePredicate(SubType.DRAGON)); } - + private static final String rule = "Whenever {this} or another Dragon enters the battlefield under your control, it deals X damage to any target, where X is the number of Dragons you control."; public ScourgeOfValkas(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{R}{R}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}{R}{R}"); this.subtype.add(SubType.DRAGON); this.color.setRed(true); @@ -77,8 +77,7 @@ public class ScourgeOfValkas extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Whenever Scourge of Valkas or another Dragon enters the battlefield under your control, it deals X damage to any target, where X is the number of Dragons you control. - DynamicValue dragons = new PermanentsOnBattlefieldCount(filter2); - Ability ability = new EntersBattlefieldControlledTriggeredAbility(Zone.BATTLEFIELD, new DamageTargetEffect(dragons), filter, false, rule); + Ability ability = new EntersBattlefieldControlledTriggeredAbility(Zone.BATTLEFIELD, new ScourgeOfValkasDamageEffect(), filter, false, rule); ability.addTarget(new TargetAnyTarget()); this.addAbility(ability); @@ -96,3 +95,45 @@ public class ScourgeOfValkas extends CardImpl { return new ScourgeOfValkas(this); } } + +class ScourgeOfValkasDamageEffect extends OneShotEffect { + + public ScourgeOfValkasDamageEffect() { + super(Outcome.Damage); + this.staticText = "it deals X damage to any target, where X is the number of Dragons you control"; + } + + public ScourgeOfValkasDamageEffect(final ScourgeOfValkasDamageEffect effect) { + super(effect); + } + + @Override + public ScourgeOfValkasDamageEffect copy() { + return new ScourgeOfValkasDamageEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Permanent enteringDragon = (Permanent) getValue("permanentEnteringBattlefield"); + if (controller != null && enteringDragon != null) { + FilterPermanent filter = new FilterPermanent(); + filter.add(new SubtypePredicate(SubType.DRAGON)); + int dragons = game.getBattlefield().countAll(filter, source.getControllerId(), game); + if (dragons > 0) { + Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (permanent != null) { + permanent.damage(dragons, enteringDragon.getId(), game, false, true); + } else { + Player player = game.getPlayer(getTargetPointer().getFirst(game, source)); + if (player != null + && player.isInGame()) { + player.damage(dragons, enteringDragon.getId(), game, false, true); + } + } + } + return true; + } + return false; + } +} From a05726cdeea6f1195a2ea6e166e2e4fb8b332fd1 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 30 Apr 2018 16:58:22 +0200 Subject: [PATCH 040/158] * 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 e05c34fd25e..416b87e61a3 100644 --- a/Mage.Sets/src/mage/cards/s/ShorecrasherElemental.java +++ b/Mage.Sets/src/mage/cards/s/ShorecrasherElemental.java @@ -35,8 +35,6 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.continuous.BecomesFaceDownCreatureEffect; -import mage.abilities.effects.common.continuous.BecomesFaceDownCreatureEffect.FaceDownType; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.keyword.MorphAbility; import mage.cards.Card; @@ -104,19 +102,18 @@ class ShorecrasherElementalEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); Permanent shorecrasherElemental = game.getPermanent(source.getSourceId()); MageObject sourceObject = source.getSourceObject(game); - if (shorecrasherElemental != null - && sourceObject != null + if (controller != null && shorecrasherElemental != null && sourceObject != null && new MageObjectReference(sourceObject, game).refersTo(shorecrasherElemental, game)) { - if (shorecrasherElemental.moveToExile(source.getSourceId(), sourceObject.getName(), source.getSourceId(), game)) { + if (controller.moveCards(shorecrasherElemental, Zone.EXILED, source, game)) { Card card = game.getExile().getCard(source.getSourceId(), game); if (card != null) { - game.addEffect(new BecomesFaceDownCreatureEffect(Duration.Custom, FaceDownType.MEGAMORPHED), source); - return card.putOntoBattlefield(game, Zone.EXILED, source.getSourceId(), card.getOwnerId(), false, true); - + controller.moveCards(card, Zone.BATTLEFIELD, source, game, false, true, true, null); } } + return true; } return false; } diff --git a/Mage.Sets/src/mage/cards/s/SorinLordOfInnistrad.java b/Mage.Sets/src/mage/cards/s/SorinLordOfInnistrad.java index f9bad9604fb..c54b02ed3d3 100644 --- a/Mage.Sets/src/mage/cards/s/SorinLordOfInnistrad.java +++ b/Mage.Sets/src/mage/cards/s/SorinLordOfInnistrad.java @@ -27,6 +27,8 @@ */ package mage.cards.s; +import java.util.HashSet; +import java.util.Set; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; @@ -38,8 +40,8 @@ import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.SuperType; import mage.constants.Zone; import mage.filter.FilterPermanent; @@ -113,25 +115,25 @@ class SorinLordOfInnistradEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { + Set toBattlefield = new HashSet<>(); for (UUID targetId : source.getTargets().get(0).getTargets()) { Permanent perm = game.getPermanent(targetId); if (perm != null) { perm.destroy(source.getSourceId(), game, false); - } - } - Player player = game.getPlayer(source.getControllerId()); - if (player != null) { - for (UUID targetId : source.getTargets().get(0).getTargets()) { - if (game.getState().getZone(targetId) == Zone.GRAVEYARD) { + if (Zone.GRAVEYARD == game.getState().getZone(targetId)) { Card card = game.getCard(targetId); if (card != null) { - card.putOntoBattlefield(game, Zone.GRAVEYARD, source.getSourceId(), player.getId()); + toBattlefield.add(card); } } } } - - return true; + game.applyEffects(); + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + return controller.moveCards(toBattlefield, Zone.BATTLEFIELD, source, game); + } + return false; } } diff --git a/Mage.Sets/src/mage/cards/s/SovereignsOfLostAlara.java b/Mage.Sets/src/mage/cards/s/SovereignsOfLostAlara.java index c56d60999bc..9680f25c030 100644 --- a/Mage.Sets/src/mage/cards/s/SovereignsOfLostAlara.java +++ b/Mage.Sets/src/mage/cards/s/SovereignsOfLostAlara.java @@ -58,11 +58,9 @@ import mage.target.targetpointer.FixedTarget; public class SovereignsOfLostAlara extends CardImpl { public SovereignsOfLostAlara(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{W}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{W}{U}"); this.subtype.add(SubType.SPIRIT); - - this.power = new MageInt(4); this.toughness = new MageInt(5); @@ -133,25 +131,25 @@ class SovereignsOfLostAlaraEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player you = game.getPlayer(source.getControllerId()); + Player controller = game.getPlayer(source.getControllerId()); Permanent attackingCreature = game.getPermanent(getTargetPointer().getFirst(game, source)); - if (you != null && attackingCreature != null) { + if (controller != null && attackingCreature != null) { FilterCard filter = new FilterCard("aura that could enchant the lone attacking creature"); filter.add(new SubtypePredicate(SubType.AURA)); filter.add(new AuraCardCanAttachToPermanentId(attackingCreature.getId())); - if (you.chooseUse(Outcome.Benefit, "Do you want to search your library?", source, game)) { + if (controller.chooseUse(Outcome.Benefit, "Do you want to search your library?", source, game)) { TargetCardInLibrary target = new TargetCardInLibrary(filter); target.setNotTarget(true); - if (you.searchLibrary(target, game)) { + if (controller.searchLibrary(target, game)) { if (target.getFirstTarget() != null) { Card aura = game.getCard(target.getFirstTarget()); game.getState().setValue("attachTo:" + aura.getId(), attackingCreature); - aura.putOntoBattlefield(game, Zone.LIBRARY, source.getSourceId(), you.getId()); + controller.moveCards(aura, Zone.BATTLEFIELD, source, game); return attackingCreature.addAttachment(aura.getId(), game); } } } - you.shuffleLibrary(source, game); + controller.shuffleLibrary(source, game); } return false; } @@ -160,4 +158,4 @@ class SovereignsOfLostAlaraEffect extends OneShotEffect { public SovereignsOfLostAlaraEffect copy() { return new SovereignsOfLostAlaraEffect(this); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/s/SteamVines.java b/Mage.Sets/src/mage/cards/s/SteamVines.java index 1efba201adb..c71a070d2f4 100644 --- a/Mage.Sets/src/mage/cards/s/SteamVines.java +++ b/Mage.Sets/src/mage/cards/s/SteamVines.java @@ -30,6 +30,7 @@ package mage.cards.s; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.BecomesTappedAttachedTriggeredAbility; +import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.AttachEffect; import mage.abilities.keyword.EnchantAbility; @@ -37,8 +38,8 @@ import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.Zone; import mage.filter.Filter; import mage.game.Game; @@ -47,6 +48,7 @@ import mage.players.Player; import mage.target.Target; import mage.target.TargetPermanent; import mage.target.common.TargetLandPermanent; +import mage.target.targetpointer.FixedTarget; /** * @@ -65,7 +67,8 @@ public class SteamVines extends CardImpl { Ability ability = new EnchantAbility(auraTarget.getTargetName()); this.addAbility(ability); - // When enchanted land becomes tapped, destroy it and Steam Vines deals 1 damage to that land's controller. That player attaches Steam Vines to a land of their choice. + // When enchanted land becomes tapped, destroy it and Steam Vines deals 1 damage to that land's controller. + // That player attaches Steam Vines to a land of their choice. this.addAbility(new BecomesTappedAttachedTriggeredAbility(new SteamVinesEffect(), "enchanted land")); } @@ -98,10 +101,10 @@ class SteamVinesEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Permanent kudzu = game.getPermanentOrLKIBattlefield(source.getSourceId()); - Card kudzuCard = game.getCard(source.getSourceId()); - if (kudzu != null) { - Permanent enchantedLand = game.getPermanentOrLKIBattlefield(kudzu.getAttachedTo()); + Permanent steamVines = game.getPermanentOrLKIBattlefield(source.getSourceId()); + Card steamVinesCard = game.getCard(source.getSourceId()); + if (steamVines != null) { + Permanent enchantedLand = game.getPermanentOrLKIBattlefield(steamVines.getAttachedTo()); Player controller = game.getPlayer(source.getControllerId()); if (enchantedLand != null && controller != null) { @@ -113,20 +116,20 @@ class SteamVinesEffect extends OneShotEffect { if (!game.getBattlefield().getAllActivePermanents(CardType.LAND).isEmpty()) { //lands are available on the battlefield Target target = new TargetLandPermanent(); target.setNotTarget(true); //not a target, it is chosen - if (kudzuCard != null + if (steamVinesCard != null && landsController != null) { - if (landsController.choose(Outcome.Detriment, target, source.getId(), game)) { + if (landsController.choose(Outcome.DestroyPermanent, target, source.getId(), game)) { if (target.getFirstTarget() != null) { Permanent landChosen = game.getPermanent(target.getFirstTarget()); if (landChosen != null) { - for (Target targetTest : kudzuCard.getSpellAbility().getTargets()) { + for (Target targetTest : steamVinesCard.getSpellAbility().getTargets()) { Filter filterTest = targetTest.getFilter(); if (filterTest.match(landChosen, game)) { if (game.getBattlefield().containsPermanent(landChosen.getId())) { //verify that it is still on the battlefield - game.getState().setValue("attachTo:" + kudzuCard.getId(), landChosen); - Zone zone = game.getState().getZone(kudzuCard.getId()); - kudzuCard.putOntoBattlefield(game, zone, source.getSourceId(), controller.getId()); - return landChosen.addAttachment(kudzuCard.getId(), game); + game.informPlayers(landsController.getLogName() + " attaches " + steamVines.getLogName() + " to " + landChosen.getLogName()); + Effect effect = new AttachEffect(Outcome.Neutral); + effect.setTargetPointer(new FixedTarget(landChosen, game)); + return effect.apply(game, source); } } } diff --git a/Mage.Sets/src/mage/cards/s/StonehewerGiant.java b/Mage.Sets/src/mage/cards/s/StonehewerGiant.java index 540f8488f43..32395d6f4c0 100644 --- a/Mage.Sets/src/mage/cards/s/StonehewerGiant.java +++ b/Mage.Sets/src/mage/cards/s/StonehewerGiant.java @@ -58,7 +58,7 @@ import mage.target.common.TargetControlledCreaturePermanent; public class StonehewerGiant extends CardImpl { public StonehewerGiant(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{W}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}{W}"); this.subtype.add(SubType.GIANT); this.subtype.add(SubType.WARRIOR); @@ -102,28 +102,27 @@ class StonehewerGiantEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player == null) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { return false; } FilterCard filter = new FilterCard("Equipment"); filter.add(new SubtypePredicate(SubType.EQUIPMENT)); TargetCardInLibrary target = new TargetCardInLibrary(filter); - if (player.searchLibrary(target, game)) { - Card card = player.getLibrary().getCard(target.getFirstTarget(), game); + if (controller.searchLibrary(target, game)) { + Card card = controller.getLibrary().getCard(target.getFirstTarget(), game); if (card != null) { - card.putOntoBattlefield(game, Zone.LIBRARY, source.getSourceId(), source.getControllerId()); + controller.moveCards(card, Zone.BATTLEFIELD, source, game); Permanent equipment = game.getPermanent(card.getId()); - Target targetCreature = new TargetControlledCreaturePermanent(); - if (equipment != null && player.choose(Outcome.BoostCreature, targetCreature, source.getSourceId(), game)) { + if (equipment != null && controller.choose(Outcome.BoostCreature, targetCreature, source.getSourceId(), game)) { Permanent permanent = game.getPermanent(targetCreature.getFirstTarget()); permanent.addAttachment(equipment.getId(), game); } } } - player.shuffleLibrary(source, game); + controller.shuffleLibrary(source, game); return true; } -} \ No newline at end of file +} From bdb0254274d091f86019cf5f7e455c7369db5ae3 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 30 Apr 2018 17:21:36 +0200 Subject: [PATCH 041/158] 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 00000000000..971dbf13e31 --- /dev/null +++ b/Mage.Client/release/sample-decks/AI/FastRedHaste.dck @@ -0,0 +1,77 @@ +NAME:FastRedHaste +16 [DOM:262] Mountain +1 [8ED:200] Lightning Blast +1 [M15:35] Soulmender +1 [M11:149] Lightning Bolt +1 [ZEN:142] Punishing Fire +1 [C16:16] Charging Cinderhorn +1 [M13:200] Akroma's Memorial +1 [RAV:193] Boros Swiftblade +1 [3ED:296] Plateau +1 [EMN:149] Weaver of Lightning +1 [BNG:108] Satyr Firedancer +1 [WTH:93] Cinder Giant +1 [DGM:56] Blaze Commando +1 [TSP:180] Sulfurous Blast +1 [BFZ:150] Outnumber +1 [M14:139] Flames of the Firebrand +1 [INV:11] Crimson Acolyte +1 [LEG:247] Hammerheim +1 [KLD:246] Inspiring Vantage +1 [DGM:107] Tajic, Blade of the Legion +1 [GTC:97] Legion Loyalist +1 [USG:11] Disciple of Law +1 [ORI:143] Exquisite Firecraft +1 [KLD:130] Skyship Stalker +1 [XLN:145] Firecannon Blast +1 [AKH:21] Oketra the True +1 [OGW:175] Needle Spires +1 [ISD:23] Mikaeus, the Lunarch +1 [WWK:90] Searing Blaze +1 [ZEN:119] Burst Lightning +1 [ISD:4] Avacynian Priest +1 [ODY:200] Lava Blister +1 [EVE:139] Figure of Destiny +1 [LEG:175] Clergy of the Holy Nimbus +1 [LEG:133] Beasts of Bogardan +1 [DTK:151] Roast +1 [ME4:113] Fire Imp +1 [RAV:255] Boros Signet +1 [RAV:213] Lightning Helix +1 [M11:129] Chandra's Spitfire +1 [SOI:28] Nahiri's Machinations +1 [GTC:215] Boros Reckoner +1 [OGW:105] Cinder Hellion +1 [M13:148] Slumbering Dragon +1 [M12:133] Flameblast Dragon +1 [CHK:40] Reciprocate +2 [ODY:193] Firebolt +1 [DKA:93] Hellrider +1 [ZEN:127] Goblin Ruinblaster +1 [FUT:115] Ghostfire +1 [M10:34] Soul Warden +1 [HOU:104] Neheb, the Eternal +1 [HOU:103] Manticore Eternal +1 [HOU:92] Firebrand Archer +1 [AVR:141] Hound of Griselbrand +1 [ONS:189] Blistering Firecat +1 [VIS:125] Zhalfirin Crusader +1 [RAV:243] Boros Recruit +1 [ROE:15] Caravan Escort +1 [C14:40] Volcanic Offering +1 [SOI:190] Village Messenger +1 [KTK:118] Monastery Swiftspear +1 [C15:28] Meteor Blast +1 [KTK:11] Firehoof Cavalry +12 [DOM:250] Plains +1 [DIS:10] Guardian of the Guildpact +1 [MMQ:53] Thermal Glider +1 [HOU:20] Sandblast +1 [DKA:84] Burning Oil +1 [TSB:72] Wildfire Emissary +1 [KLD:236] Snare Thopter +1 [DTK:134] Draconic Roar +1 [2ED:245] Gauntlet of Might +1 [ONS:199] Dwarven Blastminer +LAYOUT MAIN:(1,8)(CARD_TYPE,false,50)|([KLD:236])([M13:200],[RAV:255],[2ED:245])([BNG:108])([M15:35],[C16:16],[EMN:149],[KLD:130],[TSB:72],[ISD:23],[ISD:4],[LEG:133],[ZEN:127],[HOU:104],[HOU:103],[AVR:141],[ONS:189],[RAV:243],[ROE:15],[SOI:190],[KTK:118],[MMQ:53],[ONS:199],[DKA:93],[WTH:93],[DGM:56],[INV:11],[DGM:107],[GTC:97],[USG:11],[AKH:21],[M12:133],[LEG:175],[ME4:113],[M11:129],[OGW:105],[M13:148],[M10:34],[HOU:92],[VIS:125],[EVE:139],[KTK:11],[DIS:10],[RAV:193],[GTC:215])([SOI:28])([ZEN:119],[CHK:40],[C14:40],[M11:149],[DTK:134],[8ED:200],[ZEN:142],[WWK:90],[TSP:180],[BFZ:150],[HOU:20],[FUT:115],[RAV:213],[DKA:84])([DOM:262],[DOM:250],[DOM:250],[DOM:250],[DOM:250],[KLD:246],[OGW:175],[DOM:262],[DOM:262],[DOM:262],[DOM:262],[DOM:250],[LEG:247],[DOM:262],[DOM:262],[DOM:262],[DOM:262],[DOM:250],[DOM:250],[DOM:262],[DOM:262],[3ED:296],[DOM:250],[DOM:262],[DOM:262],[DOM:262],[DOM:262],[DOM:250],[DOM:250],[DOM:250],[DOM:250],[DOM:262])([ODY:193],[XLN:145],[DTK:151],[ODY:193],[ORI:143],[ODY:200],[C15:28],[M14:139]) +LAYOUT SIDEBOARD:(0,0)(CMC,true,50)| diff --git a/Mage.Client/release/sample-decks/AI/Poison.dck b/Mage.Client/release/sample-decks/AI/Poison.dck new file mode 100644 index 00000000000..ef2dcb38b8e --- /dev/null +++ b/Mage.Client/release/sample-decks/AI/Poison.dck @@ -0,0 +1,98 @@ +1 [RAV:231] Sisters of Stone Death +1 [THS:201] Reaper of the Wilds +1 [FUT:171] Llanowar Reborn +1 [KLD:243] Blooming Marsh +1 [ALA:225] Jund Panorama +1 [MIR:12] Crypt Cobra +1 [ZEN:221] Oran-Rief, the Vastwood +1 [STH:132] Mox Diamond +1 [M15:194] Reclamation Sage +NAME:Poison +1 [M13:168] Elvish Archdruid +1 [STH:137] Volrath's Stronghold +1 [FUT:174] Dryad Arbor +1 [M15:101] Indulgent Tormentor +1 [DKA:125] Scorned Villager +9 [DOM:266] Forest +1 [USG:321] Gaea's Cradle +1 [ORI:101] Graveblade Marauder +1 [MOR:140] Wolf-Skull Shaman +1 [RTR:229] Golgari Keyrune +1 [GTC:123] Gyre Sage +1 [CON:144] Rupture Spire +1 [LRW:268] Gilt-Leaf Palace +1 [ORI:100] Gnarlroot Trapper +1 [CHK:236] Orochi Sustainer +1 [THS:153] Bow of Nylea +1 [SOM:79] Skithiryx, the Blight Dragon +1 [MBS:94] Viridian Corrupter +1 [SOM:170] Leaden Myr +1 [C13:84] Ophiomancer +1 [M13:118] Xathrid Gorgon +1 [JOU:154] Pharika, God of Affliction +1 [MBS:96] Glissa, the Traitor +1 [NPH:111] Glistener Elf +1 [MBS:90] Rot Wolf +1 [M15:183] Life's Legacy +1 [RAV:262] Golgari Signet +1 [EMN:159] Gnarlwood Dryad +1 [M12:195] Skinshifter +1 [NPH:119] Phyrexian Swarmlord +1 [DGM:26] Maze Abomination +1 [OGW:172] Holdout Settlement +1 [M14:168] Deadly Recluse +1 [OGW:171] Hissing Quagmire +1 [AER:70] Resourceful Return +1 [SOI:203] Duskwatch Recruiter +1 [M14:207] Darksteel Ingot +1 [SOI:202] Deathcap Cultivator +1 [MBS:125] Plague Myr +1 [BNG:68] Fate Unraveler +1 [BFZ:225] Pathway Arrows +1 [ODY:282] Werebear +1 [VMA:250] Deathreap Ritual +1 [MBS:121] Phyrexian Juggernaut +1 [SOM:166] Ichorclaw Myr +1 [CHK:238] Sachi, Daughter of Seshiro +1 [LRW:250] Nath of the Gilt-Leaf +1 [WWK:140] Quicksand +1 [SOM:185] Necropede +1 [SOM:140] Bladed Pinions +1 [SOM:66] Hand of the Praetors +1 [CMA:186] Meren of Clan Nel Toth +1 [SHM:273] Leechridden Swamp +1 [NPH:72] Reaper of Sheoldred +1 [MIR:136] Sabertooth Cobra +1 [RTR:243] Overgrown Tomb +1 [AER:106] Druid of the Cowl +1 [AKH:237] Throne of the God-Pharaoh +1 [AVR:107] Harvester of Souls +1 [DTK:204] Shaman of Forgotten Ways +1 [BFZ:170] Beastcaller Savant +1 [BNG:122] Graverobber Spider +1 [DTK:123] Ukud Cobra +1 [MBS:57] Virulent Wound +1 [EVE:79] Twinblade Slasher +1 [MBS:77] Blightwidow +1 [MRD:270] Viridian Longbow +1 [EVE:124] Noxious Hatchling +1 [MOR:145] Thornbite Staff +1 [ALA:71] Deathgreeter +1 [FRF:169] Jungle Hollow +1 [BOK:136] Matsu-Tribe Sniper +1 [RAV:283] Svogthos, the Restless Tomb +1 [KTK:152] Sultai Flayer +1 [RTR:198] Sluiceway Scorpion +1 [M12:81] Blood Seeker +1 [AER:117] Narnam Renegade +6 [DOM:258] Swamp +1 [LRW:219] Immaculate Magistrate +1 [EMN:175] Ulvenwald Captive +1 [THS:91] Hythonia the Cruel +1 [APC:109] Llanowar Dead +1 [MBS:145] Inkmoth Nexus +1 [BFZ:240] Mortuary Mire +1 [SOM:223] Wurmcoil Engine +1 [AKH:187] Sixth Sense +LAYOUT MAIN:(1,11)(CARD_TYPE,false,50)|([SOM:170],[MBS:121],[MBS:125],[SOM:166],[SOM:185],[SOM:223])([THS:153])([MOR:145])([RTR:229],[BFZ:225],[SOM:140],[M14:207],[STH:132],[RAV:262],[AKH:237],[MRD:270])([JOU:154],[BNG:68])([FUT:174])([RAV:231],[M15:194],[M14:168],[M15:101],[DKA:125],[ORI:101],[ORI:100],[EMN:159],[M12:195],[NPH:119],[DGM:26],[SOI:203],[SOI:202],[LRW:250],[SOM:66],[NPH:72],[NPH:111],[AER:106],[DTK:123],[EVE:79],[EVE:124],[RTR:198],[AER:117],[EMN:175],[THS:91],[AVR:107],[THS:201],[ALA:71],[MIR:12],[MOR:140],[GTC:123],[CHK:236],[SOM:79],[MBS:94],[C13:84],[M13:118],[MBS:96],[MBS:90],[CMA:186],[M13:168],[CHK:238],[ODY:282],[MIR:136],[DTK:204],[BFZ:170],[BNG:122],[MBS:77],[BOK:136],[KTK:152],[M12:81],[LRW:219],[APC:109])([VMA:250],[AKH:187])([MBS:57])([KLD:243],[ZEN:221],[DOM:266],[DOM:266],[DOM:258],[DOM:258],[USG:321],[LRW:268],[RTR:243],[OGW:172],[OGW:171],[FUT:171],[DOM:266],[DOM:266],[DOM:266],[DOM:266],[DOM:266],[DOM:258],[WWK:140],[FRF:169],[MBS:145],[BFZ:240],[ALA:225],[DOM:258],[DOM:266],[STH:137],[SHM:273],[DOM:258],[DOM:258],[CON:144],[DOM:266],[RAV:283])([M15:183],[AER:70]) +LAYOUT SIDEBOARD:(0,0)(CMC,true,50)| diff --git a/Mage.Client/release/sample-decks/AI/Zombi & Skeleton.dck b/Mage.Client/release/sample-decks/AI/Zombi & Skeleton.dck new file mode 100644 index 00000000000..a5c0c8c1e15 --- /dev/null +++ b/Mage.Client/release/sample-decks/AI/Zombi & Skeleton.dck @@ -0,0 +1,118 @@ +NAME:Zombi & Skeleton +1 [FUT:171] Llanowar Reborn +1 [LGN:77] Noxious Ghoul +1 [M12:116] Vengeful Pharaoh +1 [E01:36] Overseer of the Damned +1 [TSP:135] Sudden Spoiling +1 [DKA:70] Mikaeus, the Unhallowed +1 [ZEN:108] Quest for the Gravelord +1 [KTK:73] Grim Haruspex +1 [MRD:285] Tree of Tales +1 [RAV:238] Vulturous Zombie +1 [LRW:265] Wanderer's Twig +1 [7ED:166] Stronghold Assassin +1 [BFZ:234] Canopy Vista +1 [C16:21] Benefactor's Draught +1 [MMQ:129] Dark Ritual +1 [MBS:50] Phyrexian Crusader +1 [6ED:162] Zombie Master +1 [CMD:227] Skullbriar, the Walking Grave +1 [EVE:180] Twilight Mire +1 [ISD:26] Paraselene +1 [DKA:63] Geralf's Messenger +1 [RTR:213] Deathrite Shaman +1 [DKA:64] Gravecrawler +1 [AKH:247] Scattered Groves +1 [LGN:80] Skinthinner +1 [SHM:279] Sapseep Forest +1 [AKH:91] Festering Mummy +1 [SCG:62] Consumptive Goo +1 [TSB:52] Undead Warchief +1 [AKH:99] Lord of the Accursed +1 [KTK:248] Windswept Heath +1 [SHM:273] Leechridden Swamp +1 [APC:86] Strength of Night +1 [DOM:241] Isolated Chapel +1 [AER:109] Heroic Intervention +2 [DOM:248] Woodland Cemetery +1 [MIR:296] Grasslands +1 [SOI:216] Loam Dryad +1 [SOM:63] Fume Spitter +1 [SOI:212] Inexorable Blob +1 [AKH:81] Bone Picker +1 [THS:89] Gray Merchant of Asphodel +1 [JUD:141] Krosan Verge +1 [TSP:206] Molder +1 [CSP:71] Stromgald Crusader +1 [CMD:98] Sewer Nemesis +1 [DOM:250] Plains +1 [M15:121] Wall of Limbs +1 [M15:111] Paragon of Open Graves +1 [ISD:170] Avacyn's Pilgrim +7 [DOM:258] Swamp +1 [SOI:107] Diregraf Colossus +1 [ROE:207] Snake Umbra +1 [ALA:70] Death Baron +1 [NPH:68] Phyrexian Obliterator +1 [OGW:26] Make a Stand +1 [EVE:117] Creakwood Liege +1 [EVE:119] Desecrator Hag +1 [ONS:312] Barren Moor +1 [HOU:171] Desert of the Glorified +1 [M11:229] Terramorphic Expanse +1 [AER:173] Renegade Map +1 [ALA:221] Bant Panorama +1 [CHK:122] Kokusho, the Evening Star +1 [AKH:6] Binding Mummy +1 [MIR:11] Choking Sands +1 [3ED:298] Scrubland +1 [WTH:152] Mana Web +4 [DOM:266] Forest +1 [PLC:145] Essence Warden +1 [ONS:164] Rotlung Reanimator +1 [TOR:78] Rancid Earth +1 [GTC:242] Godless Shrine +1 [ONS:324] Secluded Steppe +1 [ONS:326] Tranquil Thicket +1 [SOM:78] Skinrender +1 [ONS:327] Unholy Grotto +1 [MBS:96] Glissa, the Traitor +1 [3ED:283] Bayou +1 [10E:155] Lord of the Undead +1 [SHM:281] Wooded Bastion +1 [AKH:208] Wayward Servant +1 [4ED:299] Black Vise +1 [DTK:116] Risen Executioner +1 [JOU:120] Desecration Plague +1 [ODY:282] Werebear +1 [ROE:131] Virulent Swipe +1 [CMA:66] Scourge of Nel Toth +1 [SOK:69] Ghost-Lit Stalker +1 [RTR:174] Jarad, Golgari Lich Lord +1 [EMN:90] Graf Harvest +1 [JUD:72] Stitch Together +1 [3ED:274] Sol Ring +1 [GTC:182] Obzedat, Ghost Council +1 [TOR:51] Cabal Ritual +1 [EMN:89] Gavony Unhallowed +1 [BFZ:210] Drana's Emissary +1 [ISD:124] Victim of Night +1 [M13:92] Duty-Bound Dead +1 [SHM:229] Kitchen Finks +1 [TOR:57] Chainer's Edict +1 [PLC:127] Evolution Charm +1 [M14:195] Scavenging Ooze +1 [DKA:158] Vault of the Archangel +1 [M12:81] Blood Seeker +1 [DKA:80] Zombie Apocalypse +1 [DGM:132] Ready // Willing +1 [M14:103] Liliana's Reaver +1 [RTR:158] Dreg Mangler +1 [APC:109] Llanowar Dead +1 [M12:86] Cemetery Reaper +1 [NPH:25] Suture Priest +1 [AKH:104] Plague Belcher +1 [MRD:278] Ancient Den +1 [DTK:172] Ainok Survivalist +LAYOUT MAIN:(1,7)(CARD_TYPE,false,50)|([MRD:278],[MRD:285])([LRW:265],[4ED:299],[AER:173],[WTH:152],[3ED:274])([EVE:119],[LGN:77],[M12:116],[SHM:229],[M14:103],[THS:89],[DKA:70],[RTR:174],[RAV:238],[10E:155],[MBS:50],[CMD:227],[RTR:158],[DKA:63],[RTR:213],[DKA:64],[LGN:80],[7ED:166],[AKH:91],[SCG:62],[KTK:73],[TSB:52],[AKH:99],[SOI:216],[SOM:63],[SOI:212],[AKH:81],[M14:195],[CSP:71],[CMD:98],[M15:121],[M15:111],[6ED:162],[ISD:170],[SOI:107],[ALA:70],[NPH:68],[SOM:78],[SOK:69],[CHK:122],[AKH:6],[EVE:117],[ONS:164],[MBS:96],[E01:36],[M12:81],[AKH:208],[DTK:116],[PLC:145],[ODY:282],[EMN:89],[BFZ:210],[M13:92],[CMA:66],[GTC:182],[APC:109],[M12:86],[NPH:25],[AKH:104],[DTK:172])([ZEN:108],[ROE:207],[EMN:90])([C16:21],[MMQ:129],[TSP:135],[APC:86],[TOR:51],[AER:109],[TSP:206],[OGW:26],[ROE:131],[ISD:124],[PLC:127],[DGM:132])([M11:229],[DOM:258],[DOM:258],[DOM:258],[BFZ:234],[DOM:266],[AKH:247],[SHM:279],[DOM:266],[KTK:248],[FUT:171],[DOM:258],[MIR:296],[DOM:266],[JUD:141],[ONS:312],[HOU:171],[DOM:250],[DOM:258],[GTC:242],[ONS:324],[ONS:326],[ONS:327],[3ED:283],[SHM:273],[DOM:258],[ALA:221],[DOM:241],[DOM:258],[DOM:248],[DOM:248],[3ED:298],[EVE:180],[DOM:266],[SHM:281],[DKA:158])([JUD:72],[ISD:26],[TOR:57],[MIR:11],[TOR:78],[JOU:120],[DKA:80]) +LAYOUT SIDEBOARD:(0,0)(CMC,true,50)| From bba243c748125e67d16ab2e9640f00d274af09af Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 30 Apr 2018 22:28:34 +0200 Subject: [PATCH 042/158] * 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 c85d61823b7..a5fa4b54375 100644 --- a/Mage.Sets/src/mage/cards/e/ElderwoodScion.java +++ b/Mage.Sets/src/mage/cards/e/ElderwoodScion.java @@ -34,7 +34,6 @@ import mage.abilities.Mode; import mage.abilities.SpellAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.cost.CostModificationEffectImpl; -import mage.abilities.keyword.FlashbackAbility; import mage.abilities.keyword.LifelinkAbility; import mage.abilities.keyword.TrampleAbility; import mage.cards.CardImpl; @@ -99,7 +98,7 @@ class ElderwoodScionCostReductionEffect extends CostModificationEffectImpl { @Override public boolean applies(Ability abilityToModify, Ability source, Game game) { - if (abilityToModify instanceof SpellAbility || abilityToModify instanceof FlashbackAbility) { + if (abilityToModify instanceof SpellAbility) { if (abilityToModify.getControllerId().equals(source.getControllerId())) { for (UUID modeId : abilityToModify.getModes().getSelectedModes()) { Mode mode = abilityToModify.getModes().get(modeId); @@ -125,7 +124,7 @@ class ElderwoodScionCostReductionEffect extends CostModificationEffectImpl { class ElderwoodScionCostReductionEffect2 extends CostModificationEffectImpl { - private static final String effectText = "Spells your opponents cast that target Elderwood Scion cost {2} more to cast"; + private static final String effectText = "Spells your opponents cast that target {this} cost {2} more to cast"; ElderwoodScionCostReductionEffect2() { super(Duration.WhileOnBattlefield, Outcome.Benefit, CostModificationType.INCREASE_COST); @@ -145,7 +144,7 @@ class ElderwoodScionCostReductionEffect2 extends CostModificationEffectImpl { @Override public boolean applies(Ability abilityToModify, Ability source, Game game) { - if (abilityToModify.getAbilityType() == AbilityType.ACTIVATED) { + if (abilityToModify instanceof SpellAbility) { if (game.getOpponents(source.getControllerId()).contains(abilityToModify.getControllerId())) { for (Target target : abilityToModify.getTargets()) { for (UUID targetUUID : target.getTargets()) { From 940fe603c6f16f111e5e7fed58c9868e87ebf290 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 30 Apr 2018 23:15:48 +0200 Subject: [PATCH 043/158] * 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 1ad4c814a3a..cadce2f3cec 100644 --- a/Mage.Sets/src/mage/cards/h/HeraldsHorn.java +++ b/Mage.Sets/src/mage/cards/h/HeraldsHorn.java @@ -27,6 +27,7 @@ */ package mage.cards.h; +import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.AsEntersBattlefieldAbility; @@ -45,8 +46,6 @@ import mage.filter.predicate.mageobject.ChosenSubtypePredicate; import mage.game.Game; import mage.players.Player; -import java.util.UUID; - /** * * @author Saga @@ -54,15 +53,15 @@ import java.util.UUID; public class HeraldsHorn extends CardImpl { public HeraldsHorn(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); // As Herald's Horn enters the battlefield, choose a creature type. this.addAbility(new AsEntersBattlefieldAbility(new ChooseCreatureTypeEffect(Outcome.BoostCreature))); - + // Creature spells you cast of the chosen type cost {1} less to cast. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, - new SpellsCostReductionAllOfChosenSubtypeEffect(new FilterCreatureCard("Creature spells you cast of the chosen type"), 1))); - + new SpellsCostReductionAllOfChosenSubtypeEffect(new FilterCreatureCard("Creature spells you cast of the chosen type"), 1, true))); + // At the beginning of your upkeep, look at the top card of your library. If it's a creature card of the chosen type, you may reveal it and put it into your hand. this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new HeraldsHornEffect(), TargetController.YOU, false)); } @@ -97,21 +96,21 @@ class HeraldsHornEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); MageObject sourceObject = game.getObject(source.getSourceId()); - + // Look at the top card of your library. if (controller.getLibrary().hasCards()) { Card card = controller.getLibrary().getFromTop(game); Cards cards = new CardsImpl(card); controller.lookAtCards(sourceObject.getIdName(), cards, game); - + // If it's a creature card of the chosen type, you may reveal it and put it into your hand. FilterCreatureCard filter = new FilterCreatureCard("creature card of the chosen type"); filter.add(new ChosenSubtypePredicate(source.getSourceId())); String message = "Reveal the top card of your library and put that card into your hand?"; if (card != null) { if (filter.match(card, game) && controller.chooseUse(Outcome.Benefit, message, source, game)) { - controller.moveCards(card, Zone.HAND, source, game); - controller.revealCards(sourceObject.getIdName() + " put into hand", cards, game); + controller.moveCards(card, Zone.HAND, source, game); + controller.revealCards(sourceObject.getIdName() + " put into hand", cards, game); } } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionAllEffect.java b/Mage/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionAllEffect.java index 0b7af33808d..c66870598c2 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionAllEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionAllEffect.java @@ -53,6 +53,7 @@ public class SpellsCostReductionAllEffect extends CostModificationEffectImpl { private FilterCard filter; private int amount; private final boolean upTo; + private boolean onlyControlled; public SpellsCostReductionAllEffect(int amount) { this(new FilterCard("Spells"), amount); @@ -63,19 +64,24 @@ public class SpellsCostReductionAllEffect extends CostModificationEffectImpl { } public SpellsCostReductionAllEffect(FilterCard filter, int amount, boolean upTo) { + this(filter, amount, upTo, false); + } + + public SpellsCostReductionAllEffect(FilterCard filter, int amount, boolean upTo, boolean onlyControlled) { super(Duration.WhileOnBattlefield, Outcome.Benefit, CostModificationType.REDUCE_COST); this.filter = filter; this.amount = amount; this.upTo = upTo; - + this.onlyControlled = onlyControlled; this.staticText = filter.getMessage() + " cost " + (upTo ? "up to " : "") + '{' + amount + "} less to cast"; } - protected SpellsCostReductionAllEffect(SpellsCostReductionAllEffect effect) { + protected SpellsCostReductionAllEffect(final SpellsCostReductionAllEffect effect) { super(effect); this.filter = effect.filter; this.amount = effect.amount; this.upTo = effect.upTo; + this.onlyControlled = effect.onlyControlled; } @Override @@ -136,6 +142,9 @@ public class SpellsCostReductionAllEffect extends CostModificationEffectImpl { @Override public boolean applies(Ability abilityToModify, Ability source, Game game) { + if (onlyControlled && abilityToModify.getControllerId().equals(source.getControllerId())) { + return false; + } if (abilityToModify instanceof SpellAbility) { Spell spell = (Spell) game.getStack().getStackObject(abilityToModify.getId()); if (spell != null) { diff --git a/Mage/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionAllOfChosenSubtypeEffect.java b/Mage/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionAllOfChosenSubtypeEffect.java index 71185730ca1..4a8fdf40d0b 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionAllOfChosenSubtypeEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionAllOfChosenSubtypeEffect.java @@ -19,7 +19,11 @@ import mage.game.Game; public class SpellsCostReductionAllOfChosenSubtypeEffect extends SpellsCostReductionAllEffect { public SpellsCostReductionAllOfChosenSubtypeEffect(FilterCard filter, int amount) { - super(filter, amount); + this(filter, amount, false); + } + + public SpellsCostReductionAllOfChosenSubtypeEffect(FilterCard filter, int amount, boolean onlyControlled) { + super(filter, amount, false, onlyControlled); } public SpellsCostReductionAllOfChosenSubtypeEffect(final SpellsCostReductionAllOfChosenSubtypeEffect effect) { From a69aac2243dbce52fd511f2ba61722d9624bd84f Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Tue, 1 May 2018 01:34:24 +0400 Subject: [PATCH 044/158] 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 d3285ea480e..bb2fe8d5452 100644 --- a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java @@ -148,13 +148,23 @@ public class ComputerPlayer extends PlayerImpl implements Player { if (log.isDebugEnabled()) { log.debug("chooseTarget: " + outcome.toString() + ':' + target.toString()); } + // sometimes a target selection can be made from a player that does not control the ability UUID abilityControllerId = playerId; if (target.getTargetController() != null && target.getAbilityController() != null) { abilityControllerId = target.getAbilityController(); } - UUID randomOpponentId = getRandomOpponent(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 045/158] 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 3cddcda9e13..4ee0fe74ff7 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 046/158] * 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 dd74c601caf..5cc297b22c9 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 f3e0e188767..5a8751e4d99 100644 --- a/Mage.Sets/src/mage/cards/t/TorgaarFamineIncarnate.java +++ b/Mage.Sets/src/mage/cards/t/TorgaarFamineIncarnate.java @@ -90,56 +90,6 @@ public class TorgaarFamineIncarnate extends CardImpl { } } -//class TorgaarFamineIncarnateSacrificeCost extends CostImpl { -// -// int numbSacrificed = 0; -// -// public TorgaarFamineIncarnateSacrificeCost() { -// this.text = "sacrifice any number of creatures"; -// -// } -// -// public TorgaarFamineIncarnateSacrificeCost(final TorgaarFamineIncarnateSacrificeCost cost) { -// super(cost); -// this.numbSacrificed = cost.numbSacrificed; -// } -// -// @Override -// public boolean canPay(Ability ability, UUID sourceId, UUID controllerId, Game game) { -// return true; -// } -// -// @Override -// public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana, Cost costToPay) { -// TargetControlledCreaturePermanent target -// = new TargetControlledCreaturePermanent(0, Integer.MAX_VALUE, -// new FilterControlledCreaturePermanent("select any number of creatures to sacrifice. " -// + "This spell costs {2} less to cast for each creature sacrificed this way"), true); -// Player player = game.getPlayer(controllerId); -// if (player != null) { -// player.chooseTarget(Outcome.Benefit, target, ability, game); -// for (UUID creatureId : target.getTargets()) { -// Permanent creature = game.getPermanent(creatureId); -// if (creature != null) { -// if (creature.sacrifice(sourceId, game)) { -// numbSacrificed++; -// } -// } -// } -// } -// this.paid = true; -// return paid; -// } -// -// public int getNumbSacrificed() { -// return numbSacrificed; -// } -// -// @Override -// public TorgaarFamineIncarnateSacrificeCost copy() { -// return new TorgaarFamineIncarnateSacrificeCost(this); -// } -//} class TorgaarFamineIncarnateEffect extends OneShotEffect { public TorgaarFamineIncarnateEffect() { diff --git a/Mage/src/main/java/mage/abilities/effects/common/AddConditionalManaOfAnyColorEffect.java b/Mage/src/main/java/mage/abilities/effects/common/AddConditionalManaOfAnyColorEffect.java index 3f683a25de9..02964f7426a 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/AddConditionalManaOfAnyColorEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/AddConditionalManaOfAnyColorEffect.java @@ -63,9 +63,9 @@ public class AddConditionalManaOfAnyColorEffect extends ManaEffect { staticText = "Add " + (amount instanceof StaticValue ? (CardUtil.numberToText(((StaticValue) amount).toString())) : "") + " mana " - + (oneChoice ? "of any" - + (amount instanceof StaticValue && (((StaticValue) amount).toString()).equals("1") ? "" : " one") - + " color" : "in any combination of colors") + + (oneChoice || (amount instanceof StaticValue && (((StaticValue) amount).toString()).equals("1")) + ? "of any" + (amount instanceof StaticValue && (((StaticValue) amount).toString()).equals("1") ? "" : " one") + " color" + : "in any combination of colors") + ". " + manaBuilder.getRule(); } diff --git a/Mage/src/main/java/mage/players/ManaPool.java b/Mage/src/main/java/mage/players/ManaPool.java index 565e96cac21..2448b8a9220 100644 --- a/Mage/src/main/java/mage/players/ManaPool.java +++ b/Mage/src/main/java/mage/players/ManaPool.java @@ -395,7 +395,8 @@ public class ManaPool implements Serializable { Mana mana = manaToAdd.copy(); if (!game.replaceEvent(new ManaEvent(EventType.ADD_MANA, source.getId(), source.getSourceId(), playerId, mana))) { if (mana instanceof ConditionalMana) { - ManaPoolItem item = new ManaPoolItem((ConditionalMana) mana, source.getSourceObject(game), source.getOriginalId()); + ManaPoolItem item = new ManaPoolItem((ConditionalMana) mana, source.getSourceObject(game), + ((ConditionalMana) mana).getManaProducerOriginalId() != null ? ((ConditionalMana) mana).getManaProducerOriginalId() : source.getOriginalId()); if (emptyOnTurnsEnd) { item.setDuration(Duration.EndOfTurn); } @@ -505,4 +506,13 @@ public class ManaPool implements Serializable { public boolean isEmpty() { return count() == 0; } + + public List getManaItems() { + List itemsCopy = new ArrayList<>(); + for (ManaPoolItem manaItem : manaItems) { + itemsCopy.add(manaItem.copy()); + } + return itemsCopy; + } + } From a84dc233c3350cd49daf36393af9d4fab06d7f1d Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 1 May 2018 01:11:47 +0200 Subject: [PATCH 047/158] * Cleaned up some unnecessary checks for FlashbackAbility due to the old Flashback implementation. --- .../src/mage/cards/a/AngelOfJubilation.java | 39 +++++++++---------- .../mage/cards/a/AnimarSoulOfElements.java | 8 +--- Mage.Sets/src/mage/cards/a/ArcaneMelee.java | 3 +- Mage.Sets/src/mage/cards/a/AvatarOfHope.java | 13 +++---- .../mage/cards/c/CouncilOfTheAbsolute.java | 5 +-- Mage.Sets/src/mage/cards/d/DefenseGrid.java | 11 +++--- Mage.Sets/src/mage/cards/g/Glowrider.java | 7 ++-- .../src/mage/cards/l/LocketOfYesterdays.java | 11 +++--- .../src/mage/cards/l/LodestoneGolem.java | 8 ++-- .../src/mage/cards/r/RakdosLordOfRiots.java | 8 +--- .../src/mage/cards/s/SemblanceAnvil.java | 5 +-- .../src/mage/cards/s/SpellwildOuphe.java | 3 +- .../mage/cards/t/ThaliaGuardianOfThraben.java | 7 ++-- Mage.Sets/src/mage/cards/v/VrynWingmare.java | 11 +++--- 14 files changed, 57 insertions(+), 82 deletions(-) diff --git a/Mage.Sets/src/mage/cards/a/AngelOfJubilation.java b/Mage.Sets/src/mage/cards/a/AngelOfJubilation.java index 94bed2a2417..c575a8a6f86 100644 --- a/Mage.Sets/src/mage/cards/a/AngelOfJubilation.java +++ b/Mage.Sets/src/mage/cards/a/AngelOfJubilation.java @@ -38,7 +38,6 @@ import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.common.continuous.BoostControlledEffect; import mage.abilities.effects.common.cost.CostModificationEffectImpl; -import mage.abilities.keyword.FlashbackAbility; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -63,7 +62,7 @@ public class AngelOfJubilation extends CardImpl { } public AngelOfJubilation(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{W}{W}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}{W}{W}"); this.subtype.add(SubType.ANGEL); this.power = new MageInt(3); @@ -117,36 +116,36 @@ class AngelOfJubilationEffect extends ContinuousEffectImpl { class AngelOfJubilationSacrificeFilterEffect extends CostModificationEffectImpl { - public AngelOfJubilationSacrificeFilterEffect() { + public AngelOfJubilationSacrificeFilterEffect() { super(Duration.WhileOnBattlefield, Outcome.Detriment, CostModificationType.SET_COST); staticText = "Players can't pay life or sacrifice creatures to cast spells or activate abilities"; - } - + } + protected AngelOfJubilationSacrificeFilterEffect(AngelOfJubilationSacrificeFilterEffect effect) { super(effect); } - + @Override public boolean apply(Game game, Ability source, Ability abilityToModify) { for (Cost cost : abilityToModify.getCosts()) { - if(cost instanceof SacrificeTargetCost) { - SacrificeTargetCost sacrificeCost = (SacrificeTargetCost) cost; - Filter filter = sacrificeCost.getTargets().get(0).getFilter(); - filter.add(Predicates.not(new CardTypePredicate(CardType.CREATURE))); - } - } + if (cost instanceof SacrificeTargetCost) { + SacrificeTargetCost sacrificeCost = (SacrificeTargetCost) cost; + Filter filter = sacrificeCost.getTargets().get(0).getFilter(); + filter.add(Predicates.not(new CardTypePredicate(CardType.CREATURE))); + } + } return true; } - + @Override public boolean applies(Ability abilityToModify, Ability source, Game game) { - return abilityToModify.getAbilityType() == AbilityType.ACTIVATED || - abilityToModify instanceof SpellAbility || abilityToModify instanceof FlashbackAbility; + return abilityToModify.getAbilityType() == AbilityType.ACTIVATED + || abilityToModify instanceof SpellAbility; + } + + @Override + public AngelOfJubilationSacrificeFilterEffect copy() { + return new AngelOfJubilationSacrificeFilterEffect(this); } - @Override - public AngelOfJubilationSacrificeFilterEffect copy() { - return new AngelOfJubilationSacrificeFilterEffect(this); - } - } diff --git a/Mage.Sets/src/mage/cards/a/AnimarSoulOfElements.java b/Mage.Sets/src/mage/cards/a/AnimarSoulOfElements.java index 120b3ce6f70..6206bf4dafe 100644 --- a/Mage.Sets/src/mage/cards/a/AnimarSoulOfElements.java +++ b/Mage.Sets/src/mage/cards/a/AnimarSoulOfElements.java @@ -36,9 +36,7 @@ import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.effects.common.cost.CostModificationEffectImpl; import mage.abilities.effects.common.counter.AddCountersSourceEffect; -import mage.abilities.keyword.FlashbackAbility; import mage.abilities.keyword.ProtectionAbility; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; @@ -111,15 +109,11 @@ class AnimarCostReductionEffect 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())) { Spell spell = (Spell) game.getStack().getStackObject(abilityToModify.getId()); if (spell != null) { return spell.isCreature(); - } else { - // used at least for flashback ability because Flashback ability doesn't use stack or for getPlayables where spell is not cast yet - Card sourceCard = game.getCard(abilityToModify.getSourceId()); - return sourceCard != null && sourceCard.isCreature(); } } } diff --git a/Mage.Sets/src/mage/cards/a/ArcaneMelee.java b/Mage.Sets/src/mage/cards/a/ArcaneMelee.java index 3765b2b58bf..3e89b8e23cf 100644 --- a/Mage.Sets/src/mage/cards/a/ArcaneMelee.java +++ b/Mage.Sets/src/mage/cards/a/ArcaneMelee.java @@ -32,7 +32,6 @@ import mage.abilities.Ability; import mage.abilities.SpellAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.cost.CostModificationEffectImpl; -import mage.abilities.keyword.FlashbackAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -82,7 +81,7 @@ class ArcaneMeleeCostReductionEffect extends CostModificationEffectImpl { @Override public boolean applies(Ability abilityToModify, Ability source, Game game) { - if (abilityToModify instanceof SpellAbility || abilityToModify instanceof FlashbackAbility) { + if (abilityToModify instanceof SpellAbility) { Card sourceCard = game.getCard((abilityToModify).getSourceId()); if (sourceCard != null && (sourceCard.isInstant() || sourceCard.isSorcery())) { return true; diff --git a/Mage.Sets/src/mage/cards/a/AvatarOfHope.java b/Mage.Sets/src/mage/cards/a/AvatarOfHope.java index c623f7fcf7b..385ce84e086 100644 --- a/Mage.Sets/src/mage/cards/a/AvatarOfHope.java +++ b/Mage.Sets/src/mage/cards/a/AvatarOfHope.java @@ -36,7 +36,6 @@ import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.AdjustingSourceCosts; import mage.abilities.effects.common.combat.CanBlockAdditionalCreatureEffect; import mage.abilities.effects.common.cost.CostModificationEffectImpl; -import mage.abilities.keyword.FlashbackAbility; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -52,7 +51,7 @@ import mage.util.CardUtil; public class AvatarOfHope extends CardImpl { public AvatarOfHope(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{6}{W}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{6}{W}{W}"); this.subtype.add(SubType.AVATAR); this.power = new MageInt(4); @@ -93,7 +92,7 @@ class AdjustingCostsAbility extends SimpleStaticAbility implements AdjustingSour @Override public String getRule() { - return "If you have 3 or less life, Avatar of Hope costs {6} less to cast"; + return "If you have 3 or less life, {this} costs {6} less to cast"; } @Override @@ -101,7 +100,7 @@ class AdjustingCostsAbility extends SimpleStaticAbility implements AdjustingSour if (ability.getAbilityType() == AbilityType.SPELL) { Player player = game.getPlayer(ability.getControllerId()); if (player != null && player.getLife() < 4) { - CardUtil.adjustCost((SpellAbility)ability, 6); + CardUtil.adjustCost((SpellAbility) ability, 6); } } } @@ -119,10 +118,10 @@ class AdjustingCostsEffect extends CostModificationEffectImpl { @Override public boolean apply(Game game, Ability source, Ability abilityToModify) { - SpellAbility spellAbility = (SpellAbility)abilityToModify; + SpellAbility spellAbility = (SpellAbility) abilityToModify; Mana mana = spellAbility.getManaCostsToPay().getMana(); Player player = game.getPlayer(source.getControllerId()); - + if (mana.getGeneric() > 0 && player != null && player.getLife() < 4) { int newCount = mana.getGeneric() - 6; if (newCount < 0) { @@ -137,7 +136,7 @@ class AdjustingCostsEffect extends CostModificationEffectImpl { @Override public boolean applies(Ability abilityToModify, Ability source, Game game) { - if ((abilityToModify instanceof SpellAbility || abilityToModify instanceof FlashbackAbility) + if ((abilityToModify instanceof SpellAbility) && abilityToModify.getSourceId().equals(source.getSourceId())) { return true; } diff --git a/Mage.Sets/src/mage/cards/c/CouncilOfTheAbsolute.java b/Mage.Sets/src/mage/cards/c/CouncilOfTheAbsolute.java index 223d3cd3f7e..f18b0d4a40b 100644 --- a/Mage.Sets/src/mage/cards/c/CouncilOfTheAbsolute.java +++ b/Mage.Sets/src/mage/cards/c/CouncilOfTheAbsolute.java @@ -37,7 +37,6 @@ import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.effects.common.NameACardEffect; import mage.abilities.effects.common.cost.CostModificationEffectImpl; -import mage.abilities.keyword.FlashbackAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -54,7 +53,7 @@ import mage.util.CardUtil; public class CouncilOfTheAbsolute extends CardImpl { public CouncilOfTheAbsolute(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{W}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}{U}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.ADVISOR); @@ -147,7 +146,7 @@ class CouncilOfTheAbsoluteCostReductionEffect extends CostModificationEffectImpl @Override public boolean applies(Ability abilityToModify, Ability source, Game game) { - if ((abilityToModify instanceof SpellAbility || abilityToModify instanceof FlashbackAbility) + if ((abilityToModify instanceof SpellAbility) && abilityToModify.getControllerId().equals(source.getControllerId())) { Card card = game.getCard(abilityToModify.getSourceId()); return card.getName().equals(game.getState().getValue(source.getSourceId().toString() + NameACardEffect.INFO_KEY)); diff --git a/Mage.Sets/src/mage/cards/d/DefenseGrid.java b/Mage.Sets/src/mage/cards/d/DefenseGrid.java index da1901d4dea..8a47d6aa01c 100644 --- a/Mage.Sets/src/mage/cards/d/DefenseGrid.java +++ b/Mage.Sets/src/mage/cards/d/DefenseGrid.java @@ -33,7 +33,6 @@ import mage.abilities.SpellAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.common.cost.CostModificationEffectImpl; -import mage.abilities.keyword.FlashbackAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; @@ -46,7 +45,7 @@ import mage.game.Game; public class DefenseGrid extends CardImpl { public DefenseGrid(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{2}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}"); // Each spell costs {3} more to cast except during its controller's turn. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DefenseGridCostModificationEffect())); @@ -65,7 +64,7 @@ public class DefenseGrid extends CardImpl { class DefenseGridCostModificationEffect extends CostModificationEffectImpl { - DefenseGridCostModificationEffect ( ) { + DefenseGridCostModificationEffect() { super(Duration.WhileOnBattlefield, Outcome.Benefit, CostModificationType.INCREASE_COST); staticText = "Each spell costs {3} more to cast except during its controller's turn"; } @@ -83,8 +82,8 @@ class DefenseGridCostModificationEffect extends CostModificationEffectImpl { @Override public boolean applies(Ability abilityToModify, Ability source, Game game) { - if (abilityToModify instanceof SpellAbility || abilityToModify instanceof FlashbackAbility) { - if(!abilityToModify.getControllerId().equals(game.getActivePlayerId())) { + if (abilityToModify instanceof SpellAbility) { + if (!abilityToModify.getControllerId().equals(game.getActivePlayerId())) { return true; } } @@ -96,4 +95,4 @@ class DefenseGridCostModificationEffect extends CostModificationEffectImpl { return new DefenseGridCostModificationEffect(this); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/g/Glowrider.java b/Mage.Sets/src/mage/cards/g/Glowrider.java index 530d3be270e..cafb8d1fc06 100644 --- a/Mage.Sets/src/mage/cards/g/Glowrider.java +++ b/Mage.Sets/src/mage/cards/g/Glowrider.java @@ -33,7 +33,6 @@ import mage.abilities.Ability; import mage.abilities.SpellAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.cost.CostModificationEffectImpl; -import mage.abilities.keyword.FlashbackAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -48,7 +47,7 @@ import mage.util.CardUtil; public class Glowrider extends CardImpl { public Glowrider(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.CLERIC); this.power = new MageInt(2); @@ -70,7 +69,7 @@ public class Glowrider extends CardImpl { class GlowriderCostReductionEffect extends CostModificationEffectImpl { - GlowriderCostReductionEffect ( ) { + GlowriderCostReductionEffect() { super(Duration.WhileOnBattlefield, Outcome.Benefit, CostModificationType.INCREASE_COST); staticText = "Noncreature spells cost {1} more to cast"; } @@ -87,7 +86,7 @@ class GlowriderCostReductionEffect extends CostModificationEffectImpl { @Override public boolean applies(Ability abilityToModify, Ability source, Game game) { - if (abilityToModify instanceof SpellAbility || abilityToModify instanceof FlashbackAbility) { + if (abilityToModify instanceof SpellAbility) { Card card = game.getCard(abilityToModify.getSourceId()); if (card != null && !card.isCreature()) { return true; diff --git a/Mage.Sets/src/mage/cards/l/LocketOfYesterdays.java b/Mage.Sets/src/mage/cards/l/LocketOfYesterdays.java index 45293087f20..c9ea2cb4ed7 100644 --- a/Mage.Sets/src/mage/cards/l/LocketOfYesterdays.java +++ b/Mage.Sets/src/mage/cards/l/LocketOfYesterdays.java @@ -33,7 +33,6 @@ import mage.abilities.Ability; import mage.abilities.SpellAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.cost.CostModificationEffectImpl; -import mage.abilities.keyword.FlashbackAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -48,7 +47,7 @@ import mage.util.CardUtil; public class LocketOfYesterdays extends CardImpl { public LocketOfYesterdays(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{1}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}"); // Spells you cast cost {1} less to cast for each card with the same name as that spell in your graveyard. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new LocketOfYesterdaysCostReductionEffect())); @@ -80,7 +79,7 @@ class LocketOfYesterdaysCostReductionEffect extends CostModificationEffectImpl { MageObject sourceObject = game.getObject(abilityToModify.getSourceId()); if (sourceObject != null) { int amount = 0; - for (UUID cardId :game.getPlayer(source.getControllerId()).getGraveyard()) { + for (UUID cardId : game.getPlayer(source.getControllerId()).getGraveyard()) { Card card = game.getCard(cardId); if (card != null && card.getName().equals(sourceObject.getName())) { amount++; @@ -97,9 +96,9 @@ class LocketOfYesterdaysCostReductionEffect extends CostModificationEffectImpl { @Override public boolean applies(Ability abilityToModify, Ability source, Game game) { - if (abilityToModify.getControllerId().equals(source.getControllerId()) && - (abilityToModify instanceof SpellAbility || abilityToModify instanceof FlashbackAbility)) { - return true; + if (abilityToModify.getControllerId().equals(source.getControllerId()) + && (abilityToModify instanceof SpellAbility)) { + return true; } return false; } diff --git a/Mage.Sets/src/mage/cards/l/LodestoneGolem.java b/Mage.Sets/src/mage/cards/l/LodestoneGolem.java index a199f02e9ad..1602273f3d6 100644 --- a/Mage.Sets/src/mage/cards/l/LodestoneGolem.java +++ b/Mage.Sets/src/mage/cards/l/LodestoneGolem.java @@ -34,7 +34,6 @@ import mage.abilities.SpellAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.common.cost.CostModificationEffectImpl; -import mage.abilities.keyword.FlashbackAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -53,7 +52,7 @@ import mage.game.Game; public class LodestoneGolem extends CardImpl { public LodestoneGolem(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{4}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{4}"); this.subtype.add(SubType.GOLEM); this.power = new MageInt(5); @@ -75,7 +74,7 @@ public class LodestoneGolem extends CardImpl { class LodestoneGolemCostReductionEffect extends CostModificationEffectImpl { - LodestoneGolemCostReductionEffect ( ) { + LodestoneGolemCostReductionEffect() { super(Duration.WhileOnBattlefield, Outcome.Benefit, CostModificationType.INCREASE_COST); staticText = "Nonartifact spells cost {1} more to cast"; } @@ -93,7 +92,7 @@ class LodestoneGolemCostReductionEffect extends CostModificationEffectImpl { @Override public boolean applies(Ability abilityToModify, Ability source, Game game) { - if (abilityToModify instanceof SpellAbility || abilityToModify instanceof FlashbackAbility) { + if (abilityToModify instanceof SpellAbility) { Card card = game.getCard(abilityToModify.getSourceId()); if (card != null && !card.isArtifact()) { return true; @@ -108,4 +107,3 @@ class LodestoneGolemCostReductionEffect extends CostModificationEffectImpl { } } - diff --git a/Mage.Sets/src/mage/cards/r/RakdosLordOfRiots.java b/Mage.Sets/src/mage/cards/r/RakdosLordOfRiots.java index 147de4902ad..997f35c6aa5 100644 --- a/Mage.Sets/src/mage/cards/r/RakdosLordOfRiots.java +++ b/Mage.Sets/src/mage/cards/r/RakdosLordOfRiots.java @@ -35,10 +35,8 @@ import mage.abilities.common.SimpleStaticAbility; import mage.abilities.dynamicvalue.common.OpponentsLostLifeCount; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.effects.common.cost.CostModificationEffectImpl; -import mage.abilities.keyword.FlashbackAbility; import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.TrampleAbility; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; @@ -147,15 +145,11 @@ class RakdosLordOfRiotsCostReductionEffect 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())) { Spell spell = (Spell) game.getStack().getStackObject(abilityToModify.getId()); if (spell != null) { return spell.isCreature(); - } else { - // used at least for flashback ability because Flashback ability doesn't use stack or for getPlayables where spell is not cast yet - Card sourceCard = game.getCard(abilityToModify.getSourceId()); - return sourceCard != null && sourceCard.isCreature(); } } } diff --git a/Mage.Sets/src/mage/cards/s/SemblanceAnvil.java b/Mage.Sets/src/mage/cards/s/SemblanceAnvil.java index e9031261feb..0ca46f52d6f 100644 --- a/Mage.Sets/src/mage/cards/s/SemblanceAnvil.java +++ b/Mage.Sets/src/mage/cards/s/SemblanceAnvil.java @@ -35,7 +35,6 @@ import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.cost.CostModificationEffectImpl; -import mage.abilities.keyword.FlashbackAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -54,7 +53,7 @@ import mage.util.CardUtil; public class SemblanceAnvil extends CardImpl { public SemblanceAnvil(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); // Imprint - When Semblance Anvil enters the battlefield, you may exile a nonland card from your hand. this.addAbility(new EntersBattlefieldTriggeredAbility(new SemblanceAnvilEffect(), true)); @@ -134,7 +133,7 @@ class SemblanceAnvilCostReductionEffect extends CostModificationEffectImpl { @Override public boolean applies(Ability abilityToModify, Ability source, Game game) { - if (abilityToModify instanceof SpellAbility || abilityToModify instanceof FlashbackAbility) { + if (abilityToModify instanceof SpellAbility) { Card sourceCard = game.getCard(abilityToModify.getSourceId()); if (sourceCard != null && sourceCard.getOwnerId().equals(source.getControllerId())) { Permanent permanent = game.getPermanent(source.getSourceId()); diff --git a/Mage.Sets/src/mage/cards/s/SpellwildOuphe.java b/Mage.Sets/src/mage/cards/s/SpellwildOuphe.java index 8f7acd0f37f..cf8f3277021 100644 --- a/Mage.Sets/src/mage/cards/s/SpellwildOuphe.java +++ b/Mage.Sets/src/mage/cards/s/SpellwildOuphe.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.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; @@ -90,7 +89,7 @@ class SpellwildOupheCostReductionEffect extends CostModificationEffectImpl { @Override public boolean applies(Ability abilityToModify, Ability source, Game game) { - if (abilityToModify instanceof SpellAbility || abilityToModify instanceof FlashbackAbility) { + if (abilityToModify instanceof SpellAbility) { for (UUID modeId : abilityToModify.getModes().getSelectedModes()) { Mode mode = abilityToModify.getModes().get(modeId); for (Target target : mode.getTargets()) { diff --git a/Mage.Sets/src/mage/cards/t/ThaliaGuardianOfThraben.java b/Mage.Sets/src/mage/cards/t/ThaliaGuardianOfThraben.java index bbccb7e81c8..3d526bcc35f 100644 --- a/Mage.Sets/src/mage/cards/t/ThaliaGuardianOfThraben.java +++ b/Mage.Sets/src/mage/cards/t/ThaliaGuardianOfThraben.java @@ -34,7 +34,6 @@ import mage.abilities.SpellAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.cost.CostModificationEffectImpl; import mage.abilities.keyword.FirstStrikeAbility; -import mage.abilities.keyword.FlashbackAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -49,7 +48,7 @@ import mage.util.CardUtil; public class ThaliaGuardianOfThraben extends CardImpl { public ThaliaGuardianOfThraben(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.SOLDIER); @@ -76,7 +75,7 @@ public class ThaliaGuardianOfThraben extends CardImpl { class ThaliaGuardianOfThrabenCostReductionEffect extends CostModificationEffectImpl { - ThaliaGuardianOfThrabenCostReductionEffect ( ) { + ThaliaGuardianOfThrabenCostReductionEffect() { super(Duration.WhileOnBattlefield, Outcome.Benefit, CostModificationType.INCREASE_COST); staticText = "Noncreature spells cost {1} more to cast"; } @@ -93,7 +92,7 @@ class ThaliaGuardianOfThrabenCostReductionEffect extends CostModificationEffectI @Override public boolean applies(Ability abilityToModify, Ability source, Game game) { - if (abilityToModify instanceof SpellAbility || abilityToModify instanceof FlashbackAbility) { + if (abilityToModify instanceof SpellAbility) { Card card = game.getCard(abilityToModify.getSourceId()); if (card != null && !card.isCreature()) { return true; diff --git a/Mage.Sets/src/mage/cards/v/VrynWingmare.java b/Mage.Sets/src/mage/cards/v/VrynWingmare.java index 03d12ed0877..1c1dad45ab2 100644 --- a/Mage.Sets/src/mage/cards/v/VrynWingmare.java +++ b/Mage.Sets/src/mage/cards/v/VrynWingmare.java @@ -33,7 +33,6 @@ import mage.abilities.Ability; 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.FlyingAbility; import mage.cards.Card; import mage.cards.CardImpl; @@ -54,14 +53,14 @@ import mage.util.CardUtil; public class VrynWingmare extends CardImpl { public VrynWingmare(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}"); this.subtype.add(SubType.PEGASUS); this.power = new MageInt(2); this.toughness = new MageInt(1); // Flying this.addAbility(FlyingAbility.getInstance()); - + // Noncreature spells cost {1} more to cast. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new VrynWingmareCostReductionEffect())); } @@ -78,7 +77,7 @@ public class VrynWingmare extends CardImpl { class VrynWingmareCostReductionEffect extends CostModificationEffectImpl { - VrynWingmareCostReductionEffect ( ) { + VrynWingmareCostReductionEffect() { super(Duration.WhileOnBattlefield, Outcome.Benefit, CostModificationType.INCREASE_COST); staticText = "Noncreature spells cost {1} more to cast"; } @@ -95,7 +94,7 @@ class VrynWingmareCostReductionEffect extends CostModificationEffectImpl { @Override public boolean applies(Ability abilityToModify, Ability source, Game game) { - if (abilityToModify instanceof SpellAbility || abilityToModify instanceof FlashbackAbility) { + if (abilityToModify instanceof SpellAbility) { Card card = game.getCard(abilityToModify.getSourceId()); if (card != null && !card.isCreature()) { return true; @@ -109,4 +108,4 @@ class VrynWingmareCostReductionEffect extends CostModificationEffectImpl { return new VrynWingmareCostReductionEffect(this); } -} \ No newline at end of file +} From e767c79429a66ee1fab703305877b10a7a4c5fd2 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 1 May 2018 01:20:52 +0200 Subject: [PATCH 048/158] XMage 1.4.29V4 --- Mage.Common/src/main/java/mage/utils/MageVersion.java | 2 +- Mage/src/main/java/mage/cards/repository/CardRepository.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage.Common/src/main/java/mage/utils/MageVersion.java b/Mage.Common/src/main/java/mage/utils/MageVersion.java index 0e6c2046238..26802409ef0 100644 --- a/Mage.Common/src/main/java/mage/utils/MageVersion.java +++ b/Mage.Common/src/main/java/mage/utils/MageVersion.java @@ -41,7 +41,7 @@ public class MageVersion implements Serializable, Comparable { public final static int MAGE_VERSION_MAJOR = 1; public final static int MAGE_VERSION_MINOR = 4; public final static int MAGE_VERSION_PATCH = 29; - public final static String MAGE_VERSION_MINOR_PATCH = "V3"; + public final static String MAGE_VERSION_MINOR_PATCH = "V4"; public final static String MAGE_VERSION_INFO = ""; private final int major; diff --git a/Mage/src/main/java/mage/cards/repository/CardRepository.java b/Mage/src/main/java/mage/cards/repository/CardRepository.java index 9e8aba58084..39201d4a6d9 100644 --- a/Mage/src/main/java/mage/cards/repository/CardRepository.java +++ b/Mage/src/main/java/mage/cards/repository/CardRepository.java @@ -58,7 +58,7 @@ public enum CardRepository { // raise this if db structure was changed private static final long CARD_DB_VERSION = 51; // raise this if new cards were added to the server - private static final long CARD_CONTENT_VERSION = 108; + private static final long CARD_CONTENT_VERSION = 109; private Dao cardDao; private Set classNames; From 58a829de0e43b1e19fdae628f72c3f5f2d509086 Mon Sep 17 00:00:00 2001 From: L_J Date: Tue, 1 May 2018 02:07:45 +0200 Subject: [PATCH 049/158] Implemented old cards --- Mage.Sets/src/mage/cards/a/AntiMagicAura.java | 114 ++++++++++++++ .../src/mage/cards/c/ClockworkSteed.java | 140 +++++++++++++++++ Mage.Sets/src/mage/cards/d/DrainPower.java | 7 +- Mage.Sets/src/mage/cards/f/FuneralMarch.java | 117 ++++++++++++++ .../src/mage/cards/g/GreaterWerewolf.java | 108 +++++++++++++ Mage.Sets/src/mage/cards/i/IronclawCurse.java | 110 +++++++++++++ Mage.Sets/src/mage/cards/r/RelicBind.java | 93 +++++++++++ Mage.Sets/src/mage/cards/s/SerraBestiary.java | 145 ++++++++++++++++++ .../src/mage/cards/v/VenomousBreath.java | 144 +++++++++++++++++ Mage.Sets/src/mage/cards/v/Visions.java | 59 +++++++ Mage.Sets/src/mage/cards/w/WallOfDust.java | 134 ++++++++++++++++ Mage.Sets/src/mage/sets/FifthEdition.java | 6 + Mage.Sets/src/mage/sets/FourthEdition.java | 3 + Mage.Sets/src/mage/sets/Homelands.java | 5 + Mage.Sets/src/mage/sets/IceAge.java | 1 + Mage.Sets/src/mage/sets/Legends.java | 4 + Mage.Sets/src/mage/sets/MastersEditionII.java | 4 +- Mage.Sets/src/mage/sets/MastersEditionIV.java | 1 + Mage.Sets/src/mage/sets/MercadianMasques.java | 1 + .../LookLibraryTopCardTargetPlayerEffect.java | 20 +++ 20 files changed, 1211 insertions(+), 5 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/a/AntiMagicAura.java create mode 100644 Mage.Sets/src/mage/cards/c/ClockworkSteed.java create mode 100644 Mage.Sets/src/mage/cards/f/FuneralMarch.java create mode 100644 Mage.Sets/src/mage/cards/g/GreaterWerewolf.java create mode 100644 Mage.Sets/src/mage/cards/i/IronclawCurse.java create mode 100644 Mage.Sets/src/mage/cards/r/RelicBind.java create mode 100644 Mage.Sets/src/mage/cards/s/SerraBestiary.java create mode 100644 Mage.Sets/src/mage/cards/v/VenomousBreath.java create mode 100644 Mage.Sets/src/mage/cards/v/Visions.java create mode 100644 Mage.Sets/src/mage/cards/w/WallOfDust.java diff --git a/Mage.Sets/src/mage/cards/a/AntiMagicAura.java b/Mage.Sets/src/mage/cards/a/AntiMagicAura.java new file mode 100644 index 00000000000..5f34f7abf49 --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AntiMagicAura.java @@ -0,0 +1,114 @@ +/* + * 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.a; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.CantBeTargetedAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.filter.FilterSpell; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.game.permanent.Permanent; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author MTGfan & L_J + */ +public class AntiMagicAura extends CardImpl { + + public AntiMagicAura(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}"); + this.subtype.add(SubType.AURA); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // Enchanted creature can't be the target of spells and can't be enchanted by other Auras. + CantBeTargetedAttachedEffect cantTargetEffect = new CantBeTargetedAttachedEffect(new FilterSpell("spells"), Duration.WhileOnBattlefield, AttachmentType.AURA, TargetController.ANY); + Ability ability2 = new SimpleStaticAbility(Zone.BATTLEFIELD, cantTargetEffect); + ability2.addEffect(new AntiMagicAuraRuleEffect()); + this.addAbility(ability2); + } + + public AntiMagicAura(final AntiMagicAura card) { + super(card); + } + + @Override + public AntiMagicAura copy() { + return new AntiMagicAura(this); + } +} + +// 9/25/2006 ruling: If Consecrate Land enters the battlefield attached to a land that’s enchanted by other Auras, those Auras are put into their owners’ graveyards. +class AntiMagicAuraRuleEffect extends ContinuousRuleModifyingEffectImpl { + + public AntiMagicAuraRuleEffect() { + super(Duration.WhileOnBattlefield, Outcome.Detriment); + staticText = "and can't be enchanted by other Auras"; + } + + public AntiMagicAuraRuleEffect(final AntiMagicAuraRuleEffect effect) { + super(effect); + } + + @Override + public AntiMagicAuraRuleEffect copy() { + return new AntiMagicAuraRuleEffect(this); + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == EventType.ATTACH || event.getType() == EventType.STAY_ATTACHED; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + Permanent sourceObject = game.getPermanent(source.getSourceId()); + if (sourceObject != null && sourceObject.getAttachedTo() != null) { + if (event.getTargetId().equals(sourceObject.getAttachedTo())) { + return !event.getSourceId().equals(source.getSourceId()); + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/c/ClockworkSteed.java b/Mage.Sets/src/mage/cards/c/ClockworkSteed.java new file mode 100644 index 00000000000..041672cd705 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/ClockworkSteed.java @@ -0,0 +1,140 @@ +/* + * 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.c; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EndOfCombatTriggeredAbility; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.SimpleEvasionAbility; +import mage.abilities.condition.common.AttackedOrBlockedThisCombatSourceCondition; +import mage.abilities.condition.common.IsStepCondition; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.decorator.ConditionalActivatedAbility; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.effects.common.counter.RemoveCounterSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Duration; +import mage.constants.PhaseStep; +import mage.constants.Zone; +import mage.counters.Counter; +import mage.counters.CounterType; +import mage.counters.Counters; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.game.Game; +import mage.watchers.common.AttackedOrBlockedThisCombatWatcher; + +/** + * + * @author escplan9, MarcoMarin & L_J + */ +public class ClockworkSteed extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("artifact creatures"); + + static { + filter.add(new CardTypePredicate(CardType.ARTIFACT)); + } + + public ClockworkSteed(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{4}"); + this.subtype.add(SubType.HORSE); + this.power = new MageInt(0); + this.toughness = new MageInt(3); + + // Clockwork Steed enters the battlefield with four +1/+0 counters on it. + this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.P1P0.createInstance(4)), "with four +1/+0 counters on it")); + + // Clockwork Steed can't be blocked by artifact creatures. + this.addAbility(new SimpleEvasionAbility(new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield))); + + // At end of combat, if Clockwork Steed attacked or blocked this combat, remove a +1/+0 counter from it. + this.addAbility(new ConditionalTriggeredAbility( + new EndOfCombatTriggeredAbility(new RemoveCounterSourceEffect(CounterType.P1P0.createInstance()), false), + AttackedOrBlockedThisCombatSourceCondition.instance, + "At end of combat, if {this} attacked or blocked this combat, remove a +1/+0 counter from it."), + new AttackedOrBlockedThisCombatWatcher() + ); + + // {X}, {tap}: Put up to X +1/+0 counters on Clockwork Steed. This ability can't cause the total number of +1/+0 counters on Clockwork Steed to be greater than four. Activate this ability only during your upkeep. + Ability ability = new ConditionalActivatedAbility( + Zone.BATTLEFIELD, + new ClockworkSteedAddCountersSourceEffect( + CounterType.P1P0.createInstance(), + new ManacostVariableValue(), + true, true + ), + new ManaCostsImpl("{X}"), + new IsStepCondition(PhaseStep.UPKEEP), + null + ); + ability.addCost(new TapSourceCost()); + this.addAbility(ability); + } + + public ClockworkSteed(final ClockworkSteed card) { + super(card); + } + + @Override + public ClockworkSteed copy() { + return new ClockworkSteed(this); + } +} + +class ClockworkSteedAddCountersSourceEffect extends AddCountersSourceEffect { + + public ClockworkSteedAddCountersSourceEffect(Counter counter, DynamicValue amount, boolean informPlayers, boolean putOnCard) { + super(counter, amount, informPlayers, putOnCard); + staticText = "Put up to X +1/+0 counters on {this}. This ability can't cause the total number of +1/+0 counters on {this} to be greater than four."; + } + + @Override + public boolean apply(Game game, Ability source) { + //record how many counters + Counters permCounters = game.getPermanent(source.getSourceId()).getCounters(game); + int countersWas = permCounters.getCount(CounterType.P1P0); + if (countersWas < 4) { + super.apply(game, source); + if (permCounters.getCount(CounterType.P1P0) > 4) { + permCounters.removeCounter(CounterType.P1P0, permCounters.getCount(CounterType.P1P0) - 4); + }//if countersWas < 4 then counter is min(current,4); there is no setCounters function tho + }//else this is a rare case of a Steed getting boosted by outside sources :) Which is the sole purpose of this if, for the benefit of this rare but not impossible case :p + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/d/DrainPower.java b/Mage.Sets/src/mage/cards/d/DrainPower.java index 5cc297b22c9..8e81cc943cb 100644 --- a/Mage.Sets/src/mage/cards/d/DrainPower.java +++ b/Mage.Sets/src/mage/cards/d/DrainPower.java @@ -100,10 +100,11 @@ class DrainPowerEffect extends OneShotEffect { Player targetPlayer = game.getPlayer(source.getFirstTarget()); if (targetPlayer != null) { List ignorePermanents = new ArrayList<>(); + Map> manaAbilitiesMap = new HashMap<>(); TargetPermanent target = null; - + while (true) { - Map> manaAbilitiesMap = new HashMap<>(); + manaAbilitiesMap.clear(); for (Permanent permanent : game.getBattlefield().getAllActivePermanents(filter, targetPlayer.getId(), game)) { if (!ignorePermanents.contains(permanent)) { List manaAbilities = new ArrayList<>(); @@ -111,7 +112,6 @@ class DrainPowerEffect extends OneShotEffect { 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 @@ -168,7 +168,6 @@ 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 // abilities produced that mana are unchanged, as are any restrictions or additional effects associated with any of that mana. - // TODO: retain riders associated with drained mana List manaItems = targetPlayer.getManaPool().getManaItems(); targetPlayer.getManaPool().emptyPool(game); for (ManaPoolItem manaPoolItem : manaItems) { diff --git a/Mage.Sets/src/mage/cards/f/FuneralMarch.java b/Mage.Sets/src/mage/cards/f/FuneralMarch.java new file mode 100644 index 00000000000..0a772799c10 --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FuneralMarch.java @@ -0,0 +1,117 @@ +/* + * 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.f; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.ZoneChangeTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.SacrificeEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.ZoneChangeEvent; +import mage.game.permanent.Permanent; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author L_J + */ +public class FuneralMarch extends CardImpl { + + public FuneralMarch(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{B}{B}"); + this.subtype.add(SubType.AURA); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.Benefit)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // When enchanted creature leaves the battlefield, its controller sacrifices a creature. + this.addAbility(new FuneralMarchTriggeredAbility()); + } + + public FuneralMarch(final FuneralMarch card) { + super(card); + } + + @Override + public FuneralMarch copy() { + return new FuneralMarch(this); + } +} + +class FuneralMarchTriggeredAbility extends ZoneChangeTriggeredAbility { + + public FuneralMarchTriggeredAbility() { + super(Zone.BATTLEFIELD, null, new SacrificeEffect(StaticFilters.FILTER_PERMANENT_CREATURE, 1, "its controller"), "When enchanted creature leaves the battlefield, ", false); + } + + public FuneralMarchTriggeredAbility(final FuneralMarchTriggeredAbility ability) { + super(ability); + } + + @Override + public FuneralMarchTriggeredAbility copy() { + return new FuneralMarchTriggeredAbility(this); + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + Permanent enchantment = game.getPermanentOrLKIBattlefield(this.getSourceId()); + if (enchantment != null && enchantment.getAttachedTo() != null && event.getTargetId().equals(enchantment.getAttachedTo())) { + ZoneChangeEvent zEvent = (ZoneChangeEvent) event; + if ((fromZone == null || zEvent.getFromZone() == fromZone) && (toZone == null || zEvent.getToZone() == toZone)) { + for (Effect effect : getEffects()) { + if (zEvent.getTarget() != null) { + Permanent attachedTo = (Permanent) game.getLastKnownInformation(enchantment.getAttachedTo(), Zone.BATTLEFIELD, enchantment.getAttachedToZoneChangeCounter()); + if (attachedTo != null) { + effect.setTargetPointer(new FixedTarget(attachedTo.getControllerId())); + } + } + } + return true; + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/g/GreaterWerewolf.java b/Mage.Sets/src/mage/cards/g/GreaterWerewolf.java new file mode 100644 index 00000000000..72268af829c --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GreaterWerewolf.java @@ -0,0 +1,108 @@ +/* + * 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.g; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EndOfCombatTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Outcome; +import mage.counters.BoostCounter; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.permanent.BlockedByIdPredicate; +import mage.filter.predicate.permanent.BlockingAttackerIdPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author L_J + */ +public class GreaterWerewolf extends CardImpl { + + public GreaterWerewolf(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{B}"); + this.subtype.add(SubType.WEREWOLF); + this.power = new MageInt(2); + this.toughness = new MageInt(4); + + // At end of combat, put a -0/-2 counter on each creature blocking or blocked by Greater Werewolf. + this.addAbility(new EndOfCombatTriggeredAbility(new GreaterWerewolfEffect(), false)); + } + + public GreaterWerewolf(final GreaterWerewolf card) { + super(card); + } + + @Override + public GreaterWerewolf copy() { + return new GreaterWerewolf(this); + } +} + +class GreaterWerewolfEffect extends OneShotEffect { + + public GreaterWerewolfEffect() { + super(Outcome.Detriment); + this.staticText = "put a -0/-2 counter on each creature blocking or blocked by {this}"; + } + + public GreaterWerewolfEffect(final GreaterWerewolfEffect effect) { + super(effect); + } + + @Override + public GreaterWerewolfEffect copy() { + return new GreaterWerewolfEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); + if (sourcePermanent != null) { + FilterCreaturePermanent filter = new FilterCreaturePermanent(); + filter.add(Predicates.or(new BlockedByIdPredicate(sourcePermanent.getId()), new BlockingAttackerIdPredicate(sourcePermanent.getId()))); + for (Permanent permanent : game.getBattlefield().getAllActivePermanents(filter, game)) { + Effect effect = new AddCountersTargetEffect(new BoostCounter(0, -2), Outcome.UnboostCreature); + effect.setTargetPointer(new FixedTarget(permanent.getId())); + effect.apply(game, source); + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/i/IronclawCurse.java b/Mage.Sets/src/mage/cards/i/IronclawCurse.java new file mode 100644 index 00000000000..aae4e3ff4e8 --- /dev/null +++ b/Mage.Sets/src/mage/cards/i/IronclawCurse.java @@ -0,0 +1,110 @@ +/* + * 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.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.combat.CantBlockAttachedEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author L_J + */ +public class IronclawCurse extends CardImpl { + + public IronclawCurse(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{R}"); + this.subtype.add(SubType.AURA); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.UnboostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // Enchanted creature gets 0/-1. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(0, -1, Duration.WhileOnBattlefield))); + + // Enchanted creature can't block creatures with power equal to or greater than the enchanted creature's toughness. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new IronclawCurseEffect())); + } + + public IronclawCurse(final IronclawCurse card) { + super(card); + } + + @Override + public IronclawCurse copy() { + return new IronclawCurse(this); + } +} + +class IronclawCurseEffect extends CantBlockAttachedEffect { + + public IronclawCurseEffect() { + super(AttachmentType.AURA); + this.staticText = "Enchanted creature can't block creatures with power equal to or greater than the enchanted creature's toughness"; + } + + public IronclawCurseEffect(final IronclawCurseEffect effect) { + super(effect); + } + + @Override + public IronclawCurseEffect copy() { + return new IronclawCurseEffect(this); + } + + @Override + public boolean canBlock(Permanent attacker, Permanent blocker, Ability source, Game game) { + Permanent enchantment = game.getPermanentOrLKIBattlefield(source.getSourceId()); + Permanent enchantedCreature = game.getPermanent(enchantment.getAttachedTo()); + if (enchantment != null && enchantment.getAttachedTo() != null) { + return !(attacker.getPower().getValue() >= enchantedCreature.getToughness().getValue()); + } + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/r/RelicBind.java b/Mage.Sets/src/mage/cards/r/RelicBind.java new file mode 100644 index 00000000000..74e6144570b --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RelicBind.java @@ -0,0 +1,93 @@ +/* + * 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.r; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.common.BecomesTappedAttachedTriggeredAbility; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.GainLifeTargetEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.TargetController; +import mage.filter.common.FilterArtifactPermanent; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.target.TargetPermanent; +import mage.target.TargetPlayer; + +/** + * + * @author L_J + */ +public class RelicBind extends CardImpl { + + private static final FilterArtifactPermanent filter = new FilterArtifactPermanent("artifact an opponent controls"); + + static { + filter.add(new ControllerPredicate(TargetController.OPPONENT)); + } + + public RelicBind(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}"); + this.subtype.add(SubType.AURA); + + // Enchant artifact an opponent controls + TargetPermanent auraTarget = new TargetPermanent(filter); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.Detriment)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // Whenever enchanted artifact becomes tapped, choose one + // — Relic Bind deals 1 damage to target player. + Ability ability2 = new BecomesTappedAttachedTriggeredAbility(new DamageTargetEffect(1), "enchanted artifact"); + ability2.addTarget(new TargetPlayer()); + // — Target player gains 1 life. + Mode mode = new Mode(); + mode.getEffects().add(new GainLifeTargetEffect(1)); + mode.getTargets().add(new TargetPlayer()); + ability2.addMode(mode); + + this.addAbility(ability2); + } + + public RelicBind(final RelicBind card) { + super(card); + } + + @Override + public RelicBind copy() { + return new RelicBind(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SerraBestiary.java b/Mage.Sets/src/mage/cards/s/SerraBestiary.java new file mode 100644 index 00000000000..71295623265 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SerraBestiary.java @@ -0,0 +1,145 @@ +/* + * 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.s; + +import java.util.Optional; +import java.util.UUID; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect; +import mage.abilities.effects.common.combat.CantAttackBlockAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author L_J (based on jeffwadsworth) + */ +public class SerraBestiary extends CardImpl { + + public SerraBestiary(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{W}{W}"); + this.subtype.add(SubType.AURA); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.Removal)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // At the beginning of your upkeep, sacrifice Serra Bestiary unless you pay {W}{W}. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ManaCostsImpl("{W}{W}")), TargetController.YOU, false)); + + // Enchanted creature can't attack or block, and its activated abilities with {T} in their costs can't be activated. + Ability ability2 = new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackBlockAttachedEffect(AttachmentType.AURA)); + ability2.addEffect(new SerraBestiaryRuleModifyingEffect()); + this.addAbility(ability2); + + } + + public SerraBestiary(final SerraBestiary card) { + super(card); + } + + @Override + public SerraBestiary copy() { + return new SerraBestiary(this); + } +} + +class SerraBestiaryRuleModifyingEffect extends ContinuousRuleModifyingEffectImpl { + + public SerraBestiaryRuleModifyingEffect() { + super(Duration.WhileOnBattlefield, Outcome.Detriment); + staticText = ", and its activated abilities with {T} in their costs can't be activated"; + } + + public SerraBestiaryRuleModifyingEffect(final SerraBestiaryRuleModifyingEffect effect) { + super(effect); + } + + @Override + public SerraBestiaryRuleModifyingEffect copy() { + return new SerraBestiaryRuleModifyingEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.ACTIVATE_ABILITY; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + Permanent enchantment = game.getPermanentOrLKIBattlefield(source.getSourceId()); + Permanent enchantedCreature = game.getPermanent(enchantment.getAttachedTo()); + if (enchantment != null && enchantment.getAttachedTo() != null) { + MageObject object = game.getObject(event.getSourceId()); + Optional ability = game.getAbility(event.getTargetId(), event.getSourceId()); + if (ability.isPresent() + && object != null + && object.isCreature() + && object.getId().equals(enchantedCreature.getId()) + && game.getState().getPlayersInRange(source.getControllerId(), game).contains(event.getPlayerId())) { + if (ability.get().getCosts().stream().anyMatch((cost) -> (cost instanceof TapSourceCost))) { + return true; + } + } + } + return false; + } + + @Override + public String getInfoMessage(Ability source, GameEvent event, Game game) { + return "Enchanted creature can't use its activated abilities that use {tap} in their costs."; + } +} diff --git a/Mage.Sets/src/mage/cards/v/VenomousBreath.java b/Mage.Sets/src/mage/cards/v/VenomousBreath.java new file mode 100644 index 00000000000..974f2a28297 --- /dev/null +++ b/Mage.Sets/src/mage/cards/v/VenomousBreath.java @@ -0,0 +1,144 @@ +/* + * 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.v; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import mage.MageObjectReference; +import mage.abilities.Ability; +import mage.abilities.common.delayed.AtTheEndOfCombatDelayedTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.InfoEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetCreaturePermanent; +import mage.watchers.common.BlockedAttackerWatcher; + +/** + * + * @author LevelX2 + */ +public class VenomousBreath extends CardImpl { + + public VenomousBreath(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{G}"); + + // Choose target creature. At this turn's next end of combat, destroy all creatures that blocked or were blocked by it this turn. + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + this.getSpellAbility().addEffect(new InfoEffect("Choose target creature")); + this.getSpellAbility().addEffect(new VenomousBreathCreateDelayedTriggeredAbilityEffect()); + this.getSpellAbility().addWatcher(new BlockedAttackerWatcher()); + } + + public VenomousBreath(final VenomousBreath card) { + super(card); + } + + @Override + public VenomousBreath copy() { + return new VenomousBreath(this); + } +} + +class VenomousBreathCreateDelayedTriggeredAbilityEffect extends OneShotEffect { + + public VenomousBreathCreateDelayedTriggeredAbilityEffect() { + super(Outcome.Benefit); + this.staticText = "At this turn's next end of combat, destroy all creatures that blocked or were blocked by it this turn"; + } + + public VenomousBreathCreateDelayedTriggeredAbilityEffect(final VenomousBreathCreateDelayedTriggeredAbilityEffect effect) { + super(effect); + } + + @Override + public VenomousBreathCreateDelayedTriggeredAbilityEffect copy() { + return new VenomousBreathCreateDelayedTriggeredAbilityEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + if (!source.getTargets().isEmpty() && source.getFirstTarget() != null) { + MageObjectReference mor = new MageObjectReference(source.getFirstTarget(), game); + AtTheEndOfCombatDelayedTriggeredAbility delayedAbility = new AtTheEndOfCombatDelayedTriggeredAbility(new VenomousBreathEffect(mor)); + game.addDelayedTriggeredAbility(delayedAbility, source); + return true; + } + return false; + } +} + +class VenomousBreathEffect extends OneShotEffect { + + MageObjectReference targetCreature; + + public VenomousBreathEffect(MageObjectReference targetCreature) { + super(Outcome.DestroyPermanent); + this.targetCreature = targetCreature; + } + + public VenomousBreathEffect(final VenomousBreathEffect effect) { + super(effect); + targetCreature = effect.targetCreature; + } + + @Override + public VenomousBreathEffect copy() { + return new VenomousBreathEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null && targetCreature != null) { + BlockedAttackerWatcher watcher = (BlockedAttackerWatcher) game.getState().getWatchers().get(BlockedAttackerWatcher.class.getSimpleName()); + if (watcher != null) { + List toDestroy = new ArrayList<>(); + for (Permanent creature : game.getBattlefield().getActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURE, source.getControllerId(), source.getSourceId(), game)) { + if (!creature.getId().equals(targetCreature.getSourceId())) { + if (watcher.creatureHasBlockedAttacker(new MageObjectReference(creature, game), targetCreature, game) || watcher.creatureHasBlockedAttacker(targetCreature, new MageObjectReference(creature, game), game)) { + toDestroy.add(creature); + } + } + } + for (Permanent creature : toDestroy) { + creature.destroy(source.getSourceId(), game, false); + } + return true; + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/v/Visions.java b/Mage.Sets/src/mage/cards/v/Visions.java new file mode 100644 index 00000000000..5282ae3c7dd --- /dev/null +++ b/Mage.Sets/src/mage/cards/v/Visions.java @@ -0,0 +1,59 @@ +/* + * 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.v; + +import java.util.UUID; +import mage.abilities.effects.common.LookLibraryTopCardTargetPlayerEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.TargetPlayer; + +/** + * + * @author L_J + */ +public class Visions extends CardImpl { + + public Visions(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{W}"); + + // Look at the top five cards of target player's library. You may then have that player shuffle that library. + this.getSpellAbility().addEffect(new LookLibraryTopCardTargetPlayerEffect(5, false, true)); + this.getSpellAbility().addTarget(new TargetPlayer()); + } + + public Visions(final Visions card) { + super(card); + } + + @Override + public Visions copy() { + return new Visions(this); + } +} diff --git a/Mage.Sets/src/mage/cards/w/WallOfDust.java b/Mage.Sets/src/mage/cards/w/WallOfDust.java new file mode 100644 index 00000000000..d6126143dc8 --- /dev/null +++ b/Mage.Sets/src/mage/cards/w/WallOfDust.java @@ -0,0 +1,134 @@ +/* + * 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.w; + +import java.util.UUID; +import mage.MageInt; +import mage.MageObjectReference; +import mage.abilities.Ability; +import mage.abilities.common.BlocksTriggeredAbility; +import mage.abilities.effects.RestrictionEffect; +import mage.abilities.keyword.DefenderAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Duration; +import mage.constants.TurnPhase; +import mage.game.Game; +import mage.game.permanent.Permanent; + +/** + * + * @author L_J (based on LevelX2) + */ +public class WallOfDust extends CardImpl { + + public WallOfDust(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}"); + this.subtype.add(SubType.WALL); + this.power = new MageInt(1); + this.toughness = new MageInt(4); + + // Defender + this.addAbility(DefenderAbility.getInstance()); + + // Whenever Wall of Dust blocks a creature, that creature can't attack during its controller's next turn. + this.addAbility(new BlocksTriggeredAbility(new WallOfDustRestrictionEffect(), false, true)); + } + + public WallOfDust(final WallOfDust card) { + super(card); + } + + @Override + public WallOfDust copy() { + return new WallOfDust(this); + } +} + +class WallOfDustRestrictionEffect extends RestrictionEffect { + + int nextTurnTargetController = 0; + protected MageObjectReference targetPermanentReference; + + public WallOfDustRestrictionEffect() { + super(Duration.Custom); + staticText = "that creature can't attack during its controller's next turn"; + } + + public WallOfDustRestrictionEffect(final WallOfDustRestrictionEffect effect) { + super(effect); + this.nextTurnTargetController = effect.nextTurnTargetController; + this.targetPermanentReference = effect.targetPermanentReference; + } + + @Override + public WallOfDustRestrictionEffect copy() { + return new WallOfDustRestrictionEffect(this); + } + + @Override + public boolean isInactive(Ability source, Game game) { + if (targetPermanentReference == null) { + return true; + } + Permanent targetPermanent = targetPermanentReference.getPermanent(game); + if (targetPermanent == null) { + return true; + } + if (nextTurnTargetController == 0 && startingTurn != game.getTurnNum() && game.getActivePlayerId().equals(targetPermanent.getControllerId())) { + nextTurnTargetController = game.getTurnNum(); + } + return game.getPhase().getType() == TurnPhase.END && nextTurnTargetController > 0 && game.getTurnNum() > nextTurnTargetController; + } + + @Override + public void init(Ability source, Game game) { + super.init(source, game); + if (getTargetPointer().getFirst(game, source) == null) { + discard(); + } else { + targetPermanentReference = new MageObjectReference(getTargetPointer().getFirst(game, source), game); + } + } + + @Override + public boolean applies(Permanent permanent, Ability source, Game game) { + if (permanent.getId().equals(getTargetPointer().getFirst(game, source))) { + if (game.getActivePlayerId().equals(permanent.getControllerId())) { + return true; + } + } + return false; + } + + public boolean canAttack(Game game) { + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/FifthEdition.java b/Mage.Sets/src/mage/sets/FifthEdition.java index 520dc1c6de9..fa31ca8cbfa 100644 --- a/Mage.Sets/src/mage/sets/FifthEdition.java +++ b/Mage.Sets/src/mage/sets/FifthEdition.java @@ -43,6 +43,7 @@ public class FifthEdition extends ExpansionSet { cards.add(new SetCardInfo("Ambush Party", 208, Rarity.COMMON, mage.cards.a.AmbushParty.class)); cards.add(new SetCardInfo("Amulet of Kroog", 347, Rarity.COMMON, mage.cards.a.AmuletOfKroog.class)); cards.add(new SetCardInfo("An-Havva Constable", 139, Rarity.RARE, mage.cards.a.AnHavvaConstable.class)); + cards.add(new SetCardInfo("Anti-Magic Aura", 72, Rarity.UNCOMMON, mage.cards.a.AntiMagicAura.class)); cards.add(new SetCardInfo("Angry Mob", 280, Rarity.UNCOMMON, mage.cards.a.AngryMob.class)); cards.add(new SetCardInfo("Animate Dead", 2, Rarity.UNCOMMON, mage.cards.a.AnimateDead.class)); cards.add(new SetCardInfo("Animate Wall", 281, Rarity.RARE, mage.cards.a.AnimateWall.class)); @@ -101,6 +102,7 @@ public class FifthEdition extends ExpansionSet { cards.add(new SetCardInfo("City of Brass", 413, Rarity.RARE, mage.cards.c.CityOfBrass.class)); cards.add(new SetCardInfo("Clay Statue", 355, Rarity.COMMON, mage.cards.c.ClayStatue.class)); cards.add(new SetCardInfo("Clockwork Beast", 356, Rarity.RARE, mage.cards.c.ClockworkBeast.class)); + cards.add(new SetCardInfo("Clockwork Steed", 257, Rarity.UNCOMMON, mage.cards.c.ClockworkSteed.class)); cards.add(new SetCardInfo("Cockatrice", 146, Rarity.RARE, mage.cards.c.Cockatrice.class)); cards.add(new SetCardInfo("Colossus of Sardia", 358, Rarity.RARE, mage.cards.c.ColossusOfSardia.class)); cards.add(new SetCardInfo("Conquer", 216, Rarity.UNCOMMON, mage.cards.c.Conquer.class)); @@ -185,6 +187,7 @@ public class FifthEdition extends ExpansionSet { cards.add(new SetCardInfo("Foxfire", 157, Rarity.COMMON, mage.cards.f.Foxfire.class)); cards.add(new SetCardInfo("Fountain of Youth", 372, Rarity.UNCOMMON, mage.cards.f.FountainOfYouth.class)); cards.add(new SetCardInfo("Frozen Shade", 25, Rarity.COMMON, mage.cards.f.FrozenShade.class)); + cards.add(new SetCardInfo("Funeral March", 26, Rarity.COMMON, mage.cards.f.FuneralMarch.class)); cards.add(new SetCardInfo("Fungusaur", 158, Rarity.RARE, mage.cards.f.Fungusaur.class)); cards.add(new SetCardInfo("Fyndhorn Elder", 159, Rarity.UNCOMMON, mage.cards.f.FyndhornElder.class)); cards.add(new SetCardInfo("Game of Chaos", 232, Rarity.RARE, mage.cards.g.GameOfChaos.class)); @@ -203,6 +206,7 @@ public class FifthEdition extends ExpansionSet { cards.add(new SetCardInfo("Goblin Warrens", 238, Rarity.RARE, mage.cards.g.GoblinWarrens.class)); cards.add(new SetCardInfo("Grapeshot Catapult", 375, Rarity.COMMON, mage.cards.g.GrapeshotCatapult.class)); cards.add(new SetCardInfo("Greater Realm of Preservation", 307, Rarity.UNCOMMON, mage.cards.g.GreaterRealmOfPreservation.class)); + cards.add(new SetCardInfo("Greater Werewolf", 28, Rarity.UNCOMMON, mage.cards.g.GreaterWerewolf.class)); cards.add(new SetCardInfo("Grizzly Bears", 163, Rarity.COMMON, mage.cards.g.GrizzlyBears.class)); cards.add(new SetCardInfo("Havenwood Battleground", 421, Rarity.UNCOMMON, mage.cards.h.HavenwoodBattleground.class)); cards.add(new SetCardInfo("Heal", 308, Rarity.COMMON, mage.cards.h.Heal.class)); @@ -231,6 +235,7 @@ public class FifthEdition extends ExpansionSet { cards.add(new SetCardInfo("Infinite Hourglass", 378, Rarity.RARE, mage.cards.i.InfiniteHourglass.class)); cards.add(new SetCardInfo("Initiates of the Ebon Hand", 31, Rarity.COMMON, InitiatesOfTheEbonHand.class)); cards.add(new SetCardInfo("Instill Energy", 166, Rarity.UNCOMMON, mage.cards.i.InstillEnergy.class)); + cards.add(new SetCardInfo("Ironclaw Curse", 244, Rarity.RARE, mage.cards.i.IronclawCurse.class)); cards.add(new SetCardInfo("Ironclaw Orcs", 245, Rarity.COMMON, mage.cards.i.IronclawOrcs.class)); cards.add(new SetCardInfo("Ironroot Treefolk", 167, Rarity.COMMON, mage.cards.i.IronrootTreefolk.class)); cards.add(new SetCardInfo("Iron Star", 379, Rarity.UNCOMMON, mage.cards.i.IronStar.class)); @@ -373,6 +378,7 @@ public class FifthEdition extends ExpansionSet { cards.add(new SetCardInfo("Segovian Leviathan", 122, Rarity.UNCOMMON, mage.cards.s.SegovianLeviathan.class)); cards.add(new SetCardInfo("Sengir Autocrat", 55, Rarity.RARE, mage.cards.s.SengirAutocrat.class)); cards.add(new SetCardInfo("Serpent Generator", 397, Rarity.RARE, mage.cards.s.SerpentGenerator.class)); + cards.add(new SetCardInfo("Serra Bestiary", 336, Rarity.UNCOMMON, mage.cards.s.SerraBestiary.class)); cards.add(new SetCardInfo("Serra Paladin", 337, Rarity.UNCOMMON, mage.cards.s.SerraPaladin.class)); cards.add(new SetCardInfo("Shanodin Dryads", 187, Rarity.COMMON, mage.cards.s.ShanodinDryads.class)); cards.add(new SetCardInfo("Shapeshifter", 398, Rarity.UNCOMMON, mage.cards.s.Shapeshifter.class)); diff --git a/Mage.Sets/src/mage/sets/FourthEdition.java b/Mage.Sets/src/mage/sets/FourthEdition.java index 7405ca25a5a..621e2613f89 100644 --- a/Mage.Sets/src/mage/sets/FourthEdition.java +++ b/Mage.Sets/src/mage/sets/FourthEdition.java @@ -148,6 +148,7 @@ public class FourthEdition extends ExpansionSet { cards.add(new SetCardInfo("Prodigal Sorcerer", 94, Rarity.COMMON, mage.cards.p.ProdigalSorcerer.class)); cards.add(new SetCardInfo("Psionic Entity", 95, Rarity.RARE, mage.cards.p.PsionicEntity.class)); cards.add(new SetCardInfo("Psychic Venom", 96, Rarity.COMMON, mage.cards.p.PsychicVenom.class)); + cards.add(new SetCardInfo("Relic Bind", 97, Rarity.RARE, mage.cards.r.RelicBind.class)); cards.add(new SetCardInfo("Sea Serpent", 98, Rarity.COMMON, mage.cards.s.SeaSerpent.class)); cards.add(new SetCardInfo("Segovian Leviathan", 99, Rarity.UNCOMMON, mage.cards.s.SegovianLeviathan.class)); cards.add(new SetCardInfo("Sindbad", 100, Rarity.UNCOMMON, mage.cards.s.Sindbad.class)); @@ -294,6 +295,7 @@ public class FourthEdition extends ExpansionSet { cards.add(new SetCardInfo("The Brute", 226, Rarity.COMMON, mage.cards.t.TheBrute.class)); cards.add(new SetCardInfo("Tunnel", 227, Rarity.UNCOMMON, mage.cards.t.Tunnel.class)); cards.add(new SetCardInfo("Uthden Troll", 228, Rarity.UNCOMMON, mage.cards.u.UthdenTroll.class)); + cards.add(new SetCardInfo("Wall of Dust", 229, Rarity.UNCOMMON, mage.cards.w.WallOfDust.class)); cards.add(new SetCardInfo("Wall of Fire", 230, Rarity.UNCOMMON, mage.cards.w.WallOfFire.class)); cards.add(new SetCardInfo("Wall of Stone", 231, Rarity.UNCOMMON, mage.cards.w.WallOfStone.class)); cards.add(new SetCardInfo("Winds of Change", 232, Rarity.RARE, mage.cards.w.WindsOfChange.class)); @@ -350,6 +352,7 @@ public class FourthEdition extends ExpansionSet { cards.add(new SetCardInfo("Spirit Link", 51, Rarity.UNCOMMON, mage.cards.s.SpiritLink.class)); cards.add(new SetCardInfo("Swords to Plowshares", 52, Rarity.UNCOMMON, mage.cards.s.SwordsToPlowshares.class)); cards.add(new SetCardInfo("Tundra Wolves", 53, Rarity.COMMON, mage.cards.t.TundraWolves.class)); + cards.add(new SetCardInfo("Visions", 54, Rarity.UNCOMMON, mage.cards.v.Visions.class)); cards.add(new SetCardInfo("Wall of Swords", 55, Rarity.UNCOMMON, mage.cards.w.WallOfSwords.class)); cards.add(new SetCardInfo("White Knight", 56, Rarity.UNCOMMON, mage.cards.w.WhiteKnight.class)); cards.add(new SetCardInfo("White Ward", 57, Rarity.UNCOMMON, mage.cards.w.WhiteWard.class)); diff --git a/Mage.Sets/src/mage/sets/Homelands.java b/Mage.Sets/src/mage/sets/Homelands.java index 36f90535259..7439c7568c6 100644 --- a/Mage.Sets/src/mage/sets/Homelands.java +++ b/Mage.Sets/src/mage/sets/Homelands.java @@ -103,6 +103,7 @@ public class Homelands extends ExpansionSet { cards.add(new SetCardInfo("Chain Stasis", 28, Rarity.RARE, mage.cards.c.ChainStasis.class)); cards.add(new SetCardInfo("Chandler", 88, Rarity.COMMON, mage.cards.c.Chandler.class)); cards.add(new SetCardInfo("Clockwork Gnomes", 127, Rarity.COMMON, mage.cards.c.ClockworkGnomes.class)); + cards.add(new SetCardInfo("Clockwork Steed", 128, Rarity.UNCOMMON, mage.cards.c.ClockworkSteed.class)); cards.add(new SetCardInfo("Clockwork Swarm", 129, Rarity.COMMON, mage.cards.c.ClockworkSwarm.class)); cards.add(new SetCardInfo("Coral Reef", 29, Rarity.COMMON, mage.cards.c.CoralReef.class)); cards.add(new SetCardInfo("Dark Maze", 30, Rarity.COMMON, mage.cards.d.DarkMaze.class, NON_FULL_USE_VARIOUS)); @@ -126,14 +127,17 @@ public class Homelands extends ExpansionSet { cards.add(new SetCardInfo("Folk of An-Havva", 58, Rarity.COMMON, FolkOfAnHavva.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Folk of An-Havva", 59, Rarity.COMMON, FolkOfAnHavva.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Forget", 32, Rarity.RARE, mage.cards.f.Forget.class)); + cards.add(new SetCardInfo("Funeral March", 11, Rarity.UNCOMMON, mage.cards.f.FuneralMarch.class)); cards.add(new SetCardInfo("Ghost Hounds", 12, Rarity.UNCOMMON, mage.cards.g.GhostHounds.class)); cards.add(new SetCardInfo("Grandmother Sengir", 13, Rarity.RARE, mage.cards.g.GrandmotherSengir.class)); + cards.add(new SetCardInfo("Greater Werewolf", 14, Rarity.UNCOMMON, mage.cards.g.GreaterWerewolf.class)); cards.add(new SetCardInfo("Hazduhr the Abbot", 110, Rarity.RARE, mage.cards.h.HazduhrTheAbbot.class)); cards.add(new SetCardInfo("Headstone", 15, Rarity.COMMON, mage.cards.h.Headstone.class)); cards.add(new SetCardInfo("Hungry Mist", 60, Rarity.COMMON, mage.cards.h.HungryMist.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Hungry Mist", 61, Rarity.COMMON, mage.cards.h.HungryMist.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Ihsan's Shade", 16, Rarity.UNCOMMON, mage.cards.i.IhsansShade.class)); cards.add(new SetCardInfo("Irini Sengir", 17, Rarity.UNCOMMON, mage.cards.i.IriniSengir.class)); + cards.add(new SetCardInfo("Ironclaw Curse", 96, Rarity.RARE, mage.cards.i.IronclawCurse.class)); cards.add(new SetCardInfo("Jinx", 36, Rarity.COMMON, mage.cards.j.Jinx.class)); cards.add(new SetCardInfo("Joven", 97, Rarity.COMMON, mage.cards.j.Joven.class)); cards.add(new SetCardInfo("Joven's Tools", 133, Rarity.UNCOMMON, mage.cards.j.JovensTools.class)); @@ -166,6 +170,7 @@ public class Homelands extends ExpansionSet { cards.add(new SetCardInfo("Sengir Bats", 20, Rarity.COMMON, SengirBats.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Sengir Bats", 21, Rarity.COMMON, SengirBats.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Serra Aviary", 118, Rarity.RARE, mage.cards.s.SerraAviary.class)); + cards.add(new SetCardInfo("Serra Bestiary", 119, Rarity.UNCOMMON, mage.cards.s.SerraBestiary.class)); cards.add(new SetCardInfo("Serra Paladin", 121, Rarity.COMMON, mage.cards.s.SerraPaladin.class)); cards.add(new SetCardInfo("Serrated Arrows", 135, Rarity.COMMON, mage.cards.s.SerratedArrows.class)); cards.add(new SetCardInfo("Shrink", 70, Rarity.COMMON, mage.cards.s.Shrink.class, NON_FULL_USE_VARIOUS)); diff --git a/Mage.Sets/src/mage/sets/IceAge.java b/Mage.Sets/src/mage/sets/IceAge.java index b25801592b1..892a4931b37 100644 --- a/Mage.Sets/src/mage/sets/IceAge.java +++ b/Mage.Sets/src/mage/sets/IceAge.java @@ -346,6 +346,7 @@ public class IceAge extends ExpansionSet { cards.add(new SetCardInfo("Updraft", 105, Rarity.UNCOMMON, mage.cards.u.Updraft.class)); cards.add(new SetCardInfo("Urza's Bauble", 318, Rarity.UNCOMMON, mage.cards.u.UrzasBauble.class)); cards.add(new SetCardInfo("Veldt", 358, Rarity.RARE, mage.cards.v.Veldt.class)); + cards.add(new SetCardInfo("Venomous Breath", 161, Rarity.UNCOMMON, mage.cards.v.VenomousBreath.class)); cards.add(new SetCardInfo("Vertigo", 222, Rarity.UNCOMMON, mage.cards.v.Vertigo.class)); cards.add(new SetCardInfo("Vexing Arcanix", 319, Rarity.RARE, mage.cards.v.VexingArcanix.class)); cards.add(new SetCardInfo("Vibrating Sphere", 320, Rarity.RARE, mage.cards.v.VibratingSphere.class)); diff --git a/Mage.Sets/src/mage/sets/Legends.java b/Mage.Sets/src/mage/sets/Legends.java index 3e9ab7b76a1..d1b70490ded 100644 --- a/Mage.Sets/src/mage/sets/Legends.java +++ b/Mage.Sets/src/mage/sets/Legends.java @@ -66,6 +66,7 @@ public class Legends extends ExpansionSet { cards.add(new SetCardInfo("Amrou Kithkin", 172, Rarity.COMMON, mage.cards.a.AmrouKithkin.class)); cards.add(new SetCardInfo("Angelic Voices", 173, Rarity.RARE, mage.cards.a.AngelicVoices.class)); cards.add(new SetCardInfo("Angus Mackenzie", 257, Rarity.RARE, mage.cards.a.AngusMackenzie.class)); + cards.add(new SetCardInfo("Anti-Magic Aura", 45, Rarity.COMMON, mage.cards.a.AntiMagicAura.class)); cards.add(new SetCardInfo("Arboria", 88, Rarity.UNCOMMON, mage.cards.a.Arboria.class)); cards.add(new SetCardInfo("Arcades Sabboth", 258, Rarity.RARE, mage.cards.a.ArcadesSabboth.class)); cards.add(new SetCardInfo("Arena of the Ancients", 215, Rarity.RARE, mage.cards.a.ArenaOfTheAncients.class)); @@ -235,6 +236,7 @@ public class Legends extends ExpansionSet { cards.add(new SetCardInfo("Red Mana Battery", 236, Rarity.UNCOMMON, mage.cards.r.RedManaBattery.class)); cards.add(new SetCardInfo("Reincarnation", 115, Rarity.UNCOMMON, mage.cards.r.Reincarnation.class)); cards.add(new SetCardInfo("Relic Barrier", 237, Rarity.UNCOMMON, mage.cards.r.RelicBarrier.class)); + cards.add(new SetCardInfo("Relic Bind", 71, Rarity.UNCOMMON, mage.cards.r.RelicBind.class)); cards.add(new SetCardInfo("Remove Enchantments", 202, Rarity.COMMON, mage.cards.r.RemoveEnchantments.class)); cards.add(new SetCardInfo("Remove Soul", 72, Rarity.COMMON, mage.cards.r.RemoveSoul.class)); cards.add(new SetCardInfo("Reset", 73, Rarity.UNCOMMON, mage.cards.r.Reset.class)); @@ -293,8 +295,10 @@ public class Legends extends ExpansionSet { cards.add(new SetCardInfo("Urborg", 255, Rarity.UNCOMMON, mage.cards.u.Urborg.class)); cards.add(new SetCardInfo("Vaevictis Asmadi", 309, Rarity.RARE, mage.cards.v.VaevictisAsmadi.class)); cards.add(new SetCardInfo("Vampire Bats", 39, Rarity.COMMON, mage.cards.v.VampireBats.class)); + cards.add(new SetCardInfo("Visions", 210, Rarity.UNCOMMON, mage.cards.v.Visions.class)); cards.add(new SetCardInfo("Walking Dead", 40, Rarity.COMMON, mage.cards.w.WalkingDead.class)); cards.add(new SetCardInfo("Wall of Caltrops", 211, Rarity.COMMON, mage.cards.w.WallOfCaltrops.class)); + cards.add(new SetCardInfo("Wall of Dust", 165, Rarity.UNCOMMON, mage.cards.w.WallOfDust.class)); cards.add(new SetCardInfo("Wall of Earth", 166, Rarity.COMMON, mage.cards.w.WallOfEarth.class)); cards.add(new SetCardInfo("Wall of Heat", 167, Rarity.COMMON, mage.cards.w.WallOfHeat.class)); cards.add(new SetCardInfo("Wall of Light", 212, Rarity.UNCOMMON, mage.cards.w.WallOfLight.class)); diff --git a/Mage.Sets/src/mage/sets/MastersEditionII.java b/Mage.Sets/src/mage/sets/MastersEditionII.java index 6d1617f3636..bf8ed960246 100644 --- a/Mage.Sets/src/mage/sets/MastersEditionII.java +++ b/Mage.Sets/src/mage/sets/MastersEditionII.java @@ -98,6 +98,7 @@ public class MastersEditionII extends ExpansionSet { cards.add(new SetCardInfo("Burnout", 121, Rarity.UNCOMMON, mage.cards.b.Burnout.class)); cards.add(new SetCardInfo("Carapace", 155, Rarity.COMMON, mage.cards.c.Carapace.class)); cards.add(new SetCardInfo("Caribou Range", 8, Rarity.RARE, mage.cards.c.CaribouRange.class)); + cards.add(new SetCardInfo("Clockwork Steed", 205, Rarity.UNCOMMON, mage.cards.c.ClockworkSteed.class)); cards.add(new SetCardInfo("Combat Medic", 9, Rarity.COMMON, CombatMedic.class)); cards.add(new SetCardInfo("Conquer", 122, Rarity.UNCOMMON, mage.cards.c.Conquer.class)); cards.add(new SetCardInfo("Counterspell", 44, Rarity.UNCOMMON, mage.cards.c.Counterspell.class)); @@ -138,6 +139,7 @@ public class MastersEditionII extends ExpansionSet { cards.add(new SetCardInfo("Forgotten Lore", 164, Rarity.UNCOMMON, mage.cards.f.ForgottenLore.class)); cards.add(new SetCardInfo("Foul Familiar", 90, Rarity.COMMON, mage.cards.f.FoulFamiliar.class)); cards.add(new SetCardInfo("Fumarole", 194, Rarity.UNCOMMON, mage.cards.f.Fumarole.class)); + cards.add(new SetCardInfo("Funeral March", 91, Rarity.COMMON, mage.cards.f.FuneralMarch.class)); cards.add(new SetCardInfo("Fungal Bloom", 165, Rarity.RARE, mage.cards.f.FungalBloom.class)); cards.add(new SetCardInfo("Fyndhorn Pollen", 166, Rarity.RARE, mage.cards.f.FyndhornPollen.class)); cards.add(new SetCardInfo("Gangrenous Zombies", 92, Rarity.COMMON, mage.cards.g.GangrenousZombies.class)); @@ -178,7 +180,7 @@ public class MastersEditionII extends ExpansionSet { cards.add(new SetCardInfo("Krovikan Fetish", 100, Rarity.COMMON, mage.cards.k.KrovikanFetish.class)); cards.add(new SetCardInfo("Krovikan Horror", 101, Rarity.RARE, mage.cards.k.KrovikanHorror.class)); cards.add(new SetCardInfo("Krovikan Sorcerer", 51, Rarity.COMMON, mage.cards.k.KrovikanSorcerer.class)); - cards.add(new SetCardInfo("Lat-Nam's Legacy", 52, Rarity.COMMON, mage.cards.l.LatNamsLegacy.class)); + cards.add(new SetCardInfo("Lat-Nam's Legacy", 52, Rarity.COMMON, mage.cards.l.LatNamsLegacy.class)); cards.add(new SetCardInfo("Leaping Lizard", 171, Rarity.COMMON, mage.cards.l.LeapingLizard.class)); cards.add(new SetCardInfo("Lim-Dul's High Guard", 103, Rarity.UNCOMMON, LimDulsHighGuard.class)); cards.add(new SetCardInfo("Lodestone Bauble", 213, Rarity.RARE, mage.cards.l.LodestoneBauble.class)); diff --git a/Mage.Sets/src/mage/sets/MastersEditionIV.java b/Mage.Sets/src/mage/sets/MastersEditionIV.java index d8180dd5a79..41f34f221f4 100644 --- a/Mage.Sets/src/mage/sets/MastersEditionIV.java +++ b/Mage.Sets/src/mage/sets/MastersEditionIV.java @@ -254,6 +254,7 @@ public class MastersEditionIV extends ExpansionSet { cards.add(new SetCardInfo("Serendib Djinn", 61, Rarity.RARE, mage.cards.s.SerendibDjinn.class)); cards.add(new SetCardInfo("Serra Angel", 25, Rarity.UNCOMMON, mage.cards.s.SerraAngel.class)); cards.add(new SetCardInfo("Serra Aviary", 26, Rarity.UNCOMMON, mage.cards.s.SerraAviary.class)); + cards.add(new SetCardInfo("Serra Bestiary", 27, Rarity.COMMON, mage.cards.s.SerraBestiary.class)); cards.add(new SetCardInfo("Shapeshifter", 226, Rarity.UNCOMMON, mage.cards.s.Shapeshifter.class)); cards.add(new SetCardInfo("Shivan Dragon", 136, Rarity.RARE, mage.cards.s.ShivanDragon.class)); cards.add(new SetCardInfo("Sinkhole", 97, Rarity.RARE, mage.cards.s.Sinkhole.class)); diff --git a/Mage.Sets/src/mage/sets/MercadianMasques.java b/Mage.Sets/src/mage/sets/MercadianMasques.java index 5fab43e440b..923cc33a4cb 100644 --- a/Mage.Sets/src/mage/sets/MercadianMasques.java +++ b/Mage.Sets/src/mage/sets/MercadianMasques.java @@ -360,6 +360,7 @@ public class MercadianMasques extends ExpansionSet { cards.add(new SetCardInfo("Unmask", 168, Rarity.RARE, mage.cards.u.Unmask.class)); cards.add(new SetCardInfo("Uphill Battle", 222, Rarity.UNCOMMON, mage.cards.u.UphillBattle.class)); cards.add(new SetCardInfo("Vendetta", 170, Rarity.COMMON, mage.cards.v.Vendetta.class)); + cards.add(new SetCardInfo("Venomous Breath", 281, Rarity.UNCOMMON, mage.cards.v.VenomousBreath.class)); cards.add(new SetCardInfo("Venomous Dragonfly", 282, Rarity.COMMON, mage.cards.v.VenomousDragonfly.class)); cards.add(new SetCardInfo("Vernal Equinox", 283, Rarity.RARE, mage.cards.v.VernalEquinox.class)); cards.add(new SetCardInfo("Vine Dryad", 284, Rarity.RARE, mage.cards.v.VineDryad.class)); diff --git a/Mage/src/main/java/mage/abilities/effects/common/LookLibraryTopCardTargetPlayerEffect.java b/Mage/src/main/java/mage/abilities/effects/common/LookLibraryTopCardTargetPlayerEffect.java index 3081206ac6f..3b10ddb9ba5 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/LookLibraryTopCardTargetPlayerEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/LookLibraryTopCardTargetPlayerEffect.java @@ -47,11 +47,13 @@ public class LookLibraryTopCardTargetPlayerEffect extends OneShotEffect { protected int amount; protected boolean putToGraveyard; + protected boolean mayShuffleAfter; // for Visions public LookLibraryTopCardTargetPlayerEffect(int amount) { super(Outcome.Benefit); this.amount = amount; this.putToGraveyard = false; + this.mayShuffleAfter = false; setText(); } @@ -59,6 +61,15 @@ public class LookLibraryTopCardTargetPlayerEffect extends OneShotEffect { super(Outcome.Benefit); this.amount = amount; this.putToGraveyard = putToGraveyard; + this.mayShuffleAfter = false; + setText(); + } + + public LookLibraryTopCardTargetPlayerEffect(int amount, boolean putToGraveyard, boolean mayShuffleAfter) { + super(Outcome.Benefit); + this.amount = amount; + this.putToGraveyard = putToGraveyard; + this.mayShuffleAfter = mayShuffleAfter; setText(); } @@ -70,6 +81,7 @@ public class LookLibraryTopCardTargetPlayerEffect extends OneShotEffect { super(effect); amount = effect.amount; putToGraveyard = effect.putToGraveyard; + mayShuffleAfter = effect.mayShuffleAfter; } @Override @@ -95,6 +107,11 @@ public class LookLibraryTopCardTargetPlayerEffect extends OneShotEffect { } } } + if (mayShuffleAfter) { + if (player.chooseUse(Outcome.Benefit, (player == targetPlayer ? "Shuffle your library?" : "Do you want the chosen player to shuffle his or her library?"), source, game)) { + targetPlayer.shuffleLibrary(source, game); + } + } return true; } return false; @@ -118,6 +135,9 @@ public class LookLibraryTopCardTargetPlayerEffect extends OneShotEffect { } sb.append(" into that player's graveyard"); } + if (mayShuffleAfter) { + sb.append(". You may then have that player shuffle that library"); + } this.staticText = sb.toString(); } } From 4d31294ee934ae90211a1ba3870b59c59de7a98c Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Wed, 2 May 2018 00:16:41 +0400 Subject: [PATCH 050/158] Refactor images path code --- .../mage/plugins/card/utils/CardImageUtils.java | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/utils/CardImageUtils.java b/Mage.Client/src/main/java/org/mage/plugins/card/utils/CardImageUtils.java index 8bcd8e1fd4f..9e546689c8b 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/utils/CardImageUtils.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/utils/CardImageUtils.java @@ -212,20 +212,11 @@ public final class CardImageUtils { String finalFileName = ""; if (card.getUsesVariousArt()) { - finalFileName = cardName + '.' + card.getCollectorId() + ".full.jpg"; + // different arts uses name + collector id + finalFileName = cardName + prefixType + '.' + card.getCollectorId() + ".full.jpg"; } else { - if (card.getUsesVariousArt()) { - // only various arts can be same name, but different postfixes (a,b,c,d,e) - int len = card.getCollectorId().length(); - if (Character.isLetter(card.getCollectorId().charAt(len - 1))) { - finalFileName = cardName + card.getCollectorId().charAt(len - 1) + ".full.jpg"; - } else { - finalFileName = cardName + prefixType + ".full.jpg"; - } - } else { - // normal cards with same names; - finalFileName = cardName + prefixType + ".full.jpg"; - } + // basic arts uses name + finalFileName = cardName + prefixType + ".full.jpg"; } // if image file exists, correct name (for case sensitive systems) From 3549f958d427f733dc37dbfed6a65c856dfeb970 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Wed, 2 May 2018 00:17:55 +0400 Subject: [PATCH 051/158] Fixed NPE in Riptide Replicator and Volraths Laboratory tokens --- .../java/mage/game/permanent/token/RiptideReplicatorToken.java | 2 +- .../java/mage/game/permanent/token/VolrathsLaboratoryToken.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage/src/main/java/mage/game/permanent/token/RiptideReplicatorToken.java b/Mage/src/main/java/mage/game/permanent/token/RiptideReplicatorToken.java index 3cbad8b40b3..0fb51cb4cdf 100644 --- a/Mage/src/main/java/mage/game/permanent/token/RiptideReplicatorToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/RiptideReplicatorToken.java @@ -42,7 +42,7 @@ public class RiptideReplicatorToken extends TokenImpl { this(null, null, 1); } public RiptideReplicatorToken(ObjectColor color, SubType type, int x) { - super(type.getDescription(), "X/X creature token of the chosen color and type"); + super(type != null ? type.getDescription() : "null", "X/X creature token of the chosen color and type"); cardType.add(CardType.CREATURE); if (color != null) { this.color.setColor(color); diff --git a/Mage/src/main/java/mage/game/permanent/token/VolrathsLaboratoryToken.java b/Mage/src/main/java/mage/game/permanent/token/VolrathsLaboratoryToken.java index 063bfceef63..59c6ec5fc43 100644 --- a/Mage/src/main/java/mage/game/permanent/token/VolrathsLaboratoryToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/VolrathsLaboratoryToken.java @@ -42,7 +42,7 @@ public class VolrathsLaboratoryToken extends TokenImpl { this(null, null); } public VolrathsLaboratoryToken(ObjectColor color, SubType type) { - super(type.getDescription(), "2/2 creature token of the chosen color and type"); + super(type != null ? type.getDescription() : "null", "2/2 creature token of the chosen color and type"); cardType.add(CardType.CREATURE); if (color != null) { this.color.setColor(color); From b6bad9ca96afabd27844488560c59821fe0dab39 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Wed, 2 May 2018 15:16:39 +0400 Subject: [PATCH 052/158] * Fixed viewer's error on tokens show up (Mirage and other); Fixed some tokens. --- .../java/mage/client/deckeditor/collection/viewer/MageBook.java | 2 +- Mage.Sets/src/mage/sets/PrereleaseEvents.java | 2 +- .../game/permanent/token/ChainersTormentNightmareToken.java | 2 ++ .../java/mage/game/permanent/token/GeminiEngineTwinToken.java | 2 ++ .../java/mage/game/permanent/token/RiptideReplicatorToken.java | 2 +- .../java/mage/game/permanent/token/VolrathsLaboratoryToken.java | 2 +- 6 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/MageBook.java b/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/MageBook.java index f8a2b971d34..eba18d1d3b4 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/MageBook.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/MageBook.java @@ -581,7 +581,7 @@ public class MageBook extends JComponent { } int start = page * conf.CARDS_PER_PAGE; int end = page * conf.CARDS_PER_PAGE + conf.CARDS_PER_PAGE; - int ttokens = getTotalNumTokens(set); + int ttokens = tokens.size(); int temblems = getTotalNumEmblems(set); int tplanes = getTotalNumPlanes(set); int numTokensEmblemsPlanes = ttokens + temblems + tplanes; diff --git a/Mage.Sets/src/mage/sets/PrereleaseEvents.java b/Mage.Sets/src/mage/sets/PrereleaseEvents.java index 8c551de7673..265bed8f6eb 100644 --- a/Mage.Sets/src/mage/sets/PrereleaseEvents.java +++ b/Mage.Sets/src/mage/sets/PrereleaseEvents.java @@ -322,4 +322,4 @@ public class PrereleaseEvents extends ExpansionSet { cards.add(new SetCardInfo("Zurgo Bellstriker", 197, Rarity.RARE, mage.cards.z.ZurgoBellstriker.class)); cards.add(new SetCardInfo("Zurgo Helmsmasher", 127, Rarity.SPECIAL, mage.cards.z.ZurgoHelmsmasher.class)); } -} +} \ No newline at end of file diff --git a/Mage/src/main/java/mage/game/permanent/token/ChainersTormentNightmareToken.java b/Mage/src/main/java/mage/game/permanent/token/ChainersTormentNightmareToken.java index db1d907981b..4306280617f 100644 --- a/Mage/src/main/java/mage/game/permanent/token/ChainersTormentNightmareToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/ChainersTormentNightmareToken.java @@ -37,6 +37,8 @@ import mage.MageInt; */ public class ChainersTormentNightmareToken extends TokenImpl { + public ChainersTormentNightmareToken() { this(0); }; + public ChainersTormentNightmareToken(int xValue) { super("Nightmare", "X/X black Nightmare artifact creature token"); cardType.add(CardType.CREATURE); diff --git a/Mage/src/main/java/mage/game/permanent/token/GeminiEngineTwinToken.java b/Mage/src/main/java/mage/game/permanent/token/GeminiEngineTwinToken.java index 951b7f611fd..0ad9c13fbf2 100644 --- a/Mage/src/main/java/mage/game/permanent/token/GeminiEngineTwinToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/GeminiEngineTwinToken.java @@ -6,6 +6,8 @@ import mage.constants.SubType; public class GeminiEngineTwinToken extends TokenImpl { + public GeminiEngineTwinToken() { this(0, 0); } + public GeminiEngineTwinToken(int power, int toughness) { super("Twin", "colorless Construct artifact creature token named Twin that's attacking. Its power is equal to Gemini Engine's power and its toughness is equal to Gemini Engine's toughness."); cardType.add(CardType.ARTIFACT); diff --git a/Mage/src/main/java/mage/game/permanent/token/RiptideReplicatorToken.java b/Mage/src/main/java/mage/game/permanent/token/RiptideReplicatorToken.java index 0fb51cb4cdf..f9a49d222d4 100644 --- a/Mage/src/main/java/mage/game/permanent/token/RiptideReplicatorToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/RiptideReplicatorToken.java @@ -42,7 +42,7 @@ public class RiptideReplicatorToken extends TokenImpl { this(null, null, 1); } public RiptideReplicatorToken(ObjectColor color, SubType type, int x) { - super(type != null ? type.getDescription() : "null", "X/X creature token of the chosen color and type"); + super(type != null ? type.getDescription() : "", "X/X creature token of the chosen color and type"); cardType.add(CardType.CREATURE); if (color != null) { this.color.setColor(color); diff --git a/Mage/src/main/java/mage/game/permanent/token/VolrathsLaboratoryToken.java b/Mage/src/main/java/mage/game/permanent/token/VolrathsLaboratoryToken.java index 59c6ec5fc43..0a4742ba19c 100644 --- a/Mage/src/main/java/mage/game/permanent/token/VolrathsLaboratoryToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/VolrathsLaboratoryToken.java @@ -42,7 +42,7 @@ public class VolrathsLaboratoryToken extends TokenImpl { this(null, null); } public VolrathsLaboratoryToken(ObjectColor color, SubType type) { - super(type != null ? type.getDescription() : "null", "2/2 creature token of the chosen color and type"); + super(type != null ? type.getDescription() : "", "2/2 creature token of the chosen color and type"); cardType.add(CardType.CREATURE); if (color != null) { this.color.setColor(color); From c824d012d1885af0562933b5ae84c7e162cfd997 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 2 May 2018 09:26:37 -0400 Subject: [PATCH 053/158] implemented Mask of the Mimic --- .../src/mage/cards/m/MaskOfTheMimic.java | 111 ++++++++++++++++++ Mage.Sets/src/mage/sets/Stronghold.java | 1 + 2 files changed, 112 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/m/MaskOfTheMimic.java diff --git a/Mage.Sets/src/mage/cards/m/MaskOfTheMimic.java b/Mage.Sets/src/mage/cards/m/MaskOfTheMimic.java new file mode 100644 index 00000000000..f2359367374 --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MaskOfTheMimic.java @@ -0,0 +1,111 @@ +/* + * 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.m; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.filter.FilterCard; +import static mage.filter.StaticFilters.FILTER_CONTROLLED_CREATURE_SHORT_TEXT; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.NamePredicate; +import mage.filter.predicate.permanent.TokenPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.common.TargetCardInLibrary; +import mage.target.common.TargetControlledCreaturePermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public class MaskOfTheMimic extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("nontoken creature"); + + static { + filter.add(Predicates.not(new TokenPredicate())); + } + + public MaskOfTheMimic(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{U}"); + + // As an additional cost to cast Mask of the Mimic, sacrifice a creature. + this.getSpellAbility().addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(FILTER_CONTROLLED_CREATURE_SHORT_TEXT))); + + // Search your library for a card with the same name as target nontoken creature and put that card onto the battlefield. Then shuffle your library. + this.getSpellAbility().addEffect(new MaskOfTheMimicEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); + } + + public MaskOfTheMimic(final MaskOfTheMimic card) { + super(card); + } + + @Override + public MaskOfTheMimic copy() { + return new MaskOfTheMimic(this); + } +} + +class MaskOfTheMimicEffect extends OneShotEffect { + + MaskOfTheMimicEffect() { + super(Outcome.Benefit); + this.staticText = "Search your library for a card with the same name as target nontoken creature " + + "and put that card onto the battlefield. Then shuffle your library."; + } + + MaskOfTheMimicEffect(final MaskOfTheMimicEffect effect) { + super(effect); + } + + @Override + public MaskOfTheMimicEffect copy() { + return new MaskOfTheMimicEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent creature = game.getPermanent(source.getFirstTarget()); + if (creature == null) { + return false; + } + FilterCard filter = new FilterCard("a card named " + creature.getName()); + filter.add(new NamePredicate(creature.getName())); + return new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter)).apply(game, source); + } +} diff --git a/Mage.Sets/src/mage/sets/Stronghold.java b/Mage.Sets/src/mage/sets/Stronghold.java index a08e4c7440a..e4da198867a 100644 --- a/Mage.Sets/src/mage/sets/Stronghold.java +++ b/Mage.Sets/src/mage/sets/Stronghold.java @@ -113,6 +113,7 @@ public class Stronghold extends ExpansionSet { cards.add(new SetCardInfo("Leap", 35, Rarity.COMMON, mage.cards.l.Leap.class)); cards.add(new SetCardInfo("Lowland Basilisk", 59, Rarity.COMMON, mage.cards.l.LowlandBasilisk.class)); cards.add(new SetCardInfo("Mana Leak", 36, Rarity.COMMON, mage.cards.m.ManaLeak.class)); + cards.add(new SetCardInfo("Mask of the Mimic", 37, Rarity.UNCOMMON, mage.cards.m.MaskOfTheMimic.class)); cards.add(new SetCardInfo("Megrim", 12, Rarity.UNCOMMON, mage.cards.m.Megrim.class)); cards.add(new SetCardInfo("Mind Games", 38, Rarity.COMMON, mage.cards.m.MindGames.class)); cards.add(new SetCardInfo("Mind Peel", 13, Rarity.UNCOMMON, mage.cards.m.MindPeel.class)); From 9919a3403da8e141e7bbfd91e3e1e9af0633a560 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Wed, 2 May 2018 17:32:59 +0200 Subject: [PATCH 054/158] * Wall of Deceit - Fixed not working "Turn face down" ability. --- Mage.Sets/src/mage/cards/w/WallOfDeceit.java | 46 ++++++++++++++++---- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/Mage.Sets/src/mage/cards/w/WallOfDeceit.java b/Mage.Sets/src/mage/cards/w/WallOfDeceit.java index a9491133451..ac52e9db285 100644 --- a/Mage.Sets/src/mage/cards/w/WallOfDeceit.java +++ b/Mage.Sets/src/mage/cards/w/WallOfDeceit.java @@ -29,18 +29,20 @@ package mage.cards.w; import java.util.UUID; import mage.MageInt; +import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.Effect; -import mage.abilities.effects.common.continuous.BecomesFaceDownCreatureEffect; +import mage.abilities.effects.OneShotEffect; import mage.abilities.keyword.DefenderAbility; import mage.abilities.keyword.MorphAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.Outcome; import mage.constants.SubType; -import mage.constants.Duration; import mage.constants.Zone; +import mage.game.Game; +import mage.game.permanent.Permanent; /** * @@ -49,19 +51,17 @@ import mage.constants.Zone; public class WallOfDeceit extends CardImpl { public WallOfDeceit(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}"); this.subtype.add(SubType.WALL); this.power = new MageInt(0); this.toughness = new MageInt(5); // Defender this.addAbility(DefenderAbility.getInstance()); - + // {3}: Turn Wall of Deceit face down. - Effect effect = new BecomesFaceDownCreatureEffect(Duration.Custom, BecomesFaceDownCreatureEffect.FaceDownType.MANIFESTED); - effect.setText("Turn Wall of Deceit face down. (It becomes a 2/2 creature.)"); - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{3}"))); - + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new WallOfDeceitEffect(), new ManaCostsImpl("{3}"))); + // Morph {U} this.addAbility(new MorphAbility(this, new ManaCostsImpl("{U}"))); } @@ -75,3 +75,31 @@ public class WallOfDeceit extends CardImpl { return new WallOfDeceit(this); } } + +class WallOfDeceitEffect extends OneShotEffect { + + public WallOfDeceitEffect() { + super(Outcome.Detriment); + this.staticText = "Turn {this} face down"; + } + + public WallOfDeceitEffect(final WallOfDeceitEffect effect) { + super(effect); + } + + @Override + public WallOfDeceitEffect copy() { + return new WallOfDeceitEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent sourcePermanent = game.getPermanent(source.getSourceId()); + if (sourcePermanent != null + && source.getSourceObjectZoneChangeCounter() == sourcePermanent.getZoneChangeCounter(game) // in case source was blinked after ability was set to stack + && !sourcePermanent.isFaceDown(game)) { + sourcePermanent.setFaceDown(true, game); + } + return true; + } +} From 8c8b6c99ccf02947cfbeb2d29079b02865d4b7d0 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 2 May 2018 17:22:46 -0400 Subject: [PATCH 055/158] fixed Karplusan Hound damaging everything --- Mage.Sets/src/mage/cards/k/KarplusanHound.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Mage.Sets/src/mage/cards/k/KarplusanHound.java b/Mage.Sets/src/mage/cards/k/KarplusanHound.java index ab463771b86..917f3937e34 100644 --- a/Mage.Sets/src/mage/cards/k/KarplusanHound.java +++ b/Mage.Sets/src/mage/cards/k/KarplusanHound.java @@ -33,13 +33,14 @@ import mage.abilities.Ability; import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; import mage.abilities.decorator.ConditionalTriggeredAbility; -import mage.abilities.effects.common.DamageEverythingEffect; +import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.filter.common.FilterPlaneswalkerPermanent; import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.common.TargetAnyTarget; /** * @@ -56,9 +57,13 @@ public class KarplusanHound extends CardImpl { FilterPlaneswalkerPermanent filter = new FilterPlaneswalkerPermanent("a Chandra planeswalker"); filter.add(new SubtypePredicate(SubType.CHANDRA)); // Whenever Karplusan Hound attacks, if you control a Chandra planeswalker, this creature deals 2 damage to any target. - Ability ability = new ConditionalTriggeredAbility(new AttacksTriggeredAbility(new DamageEverythingEffect(2), false), new PermanentsOnTheBattlefieldCondition(filter), - "if you control a Chandra planeswalker, this creature deals 2 damage to any target"); - + Ability ability = new ConditionalTriggeredAbility( + new AttacksTriggeredAbility(new DamageTargetEffect(2), false), + new PermanentsOnTheBattlefieldCondition(filter), + "if you control a Chandra planeswalker, " + + "this creature deals 2 damage to any target" + ); + ability.addTarget(new TargetAnyTarget()); this.addAbility(ability); } From 9b5b3afcb85fc633ec2f97123370966163e24a61 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 2 May 2018 17:42:41 -0400 Subject: [PATCH 056/158] fixed Teferi, Hero of Dominaria's untap trigger --- .../effects/common/UntapLandsEffect.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Mage/src/main/java/mage/abilities/effects/common/UntapLandsEffect.java b/Mage/src/main/java/mage/abilities/effects/common/UntapLandsEffect.java index 502b70186ba..f408e17033c 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/UntapLandsEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/UntapLandsEffect.java @@ -31,8 +31,6 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.constants.Outcome; -import mage.filter.FilterPermanent; -import mage.filter.StaticFilters; import mage.filter.common.FilterLandPermanent; import mage.filter.predicate.permanent.TappedPredicate; import mage.game.Game; @@ -46,6 +44,11 @@ import mage.util.CardUtil; */ public class UntapLandsEffect extends OneShotEffect { + private static final FilterLandPermanent filter = new FilterLandPermanent("untapped lands"); + + static { + filter.add(new TappedPredicate()); + } private final int amount; private final boolean upTo; @@ -70,15 +73,12 @@ public class UntapLandsEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - TargetLandPermanent target = new TargetLandPermanent(upTo ? 0 : amount, amount, StaticFilters.FILTER_LAND, true); + int tappedLands = game.getBattlefield().getAllActivePermanents(filter, controller.getId(), game).size(); + TargetLandPermanent target = new TargetLandPermanent(upTo ? 0 : Math.min(tappedLands, amount), amount, filter, true); if (target.canChoose(source.getSourceId(), source.getControllerId(), game)) { // UI Shortcut: Check if any lands are already tapped. If there are equal/fewer than amount, give the option to add those in to be untapped now. - FilterPermanent filter = new FilterLandPermanent(); - filter.add(new TappedPredicate()); - int tappedLands = game.getBattlefield().getAllActivePermanents(filter, controller.getId(), game).size(); - - if (tappedLands <= amount) { + if (tappedLands <= amount && upTo) { if (controller.chooseUse(outcome, "Include your tapped lands to untap?", source, game)) { for (Permanent land : game.getBattlefield().getAllActivePermanents(filter, controller.getId(), game)) { target.addTarget(land.getId(), source, game); From 4bc0ba8509441c368d998296a672e40c219953cd Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 2 May 2018 18:13:34 -0400 Subject: [PATCH 057/158] fixed Dauntless Bodyguard not giving indestructible --- .../src/mage/cards/d/DauntlessBodyguard.java | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/Mage.Sets/src/mage/cards/d/DauntlessBodyguard.java b/Mage.Sets/src/mage/cards/d/DauntlessBodyguard.java index 458863110c9..26fa79b5ad9 100644 --- a/Mage.Sets/src/mage/cards/d/DauntlessBodyguard.java +++ b/Mage.Sets/src/mage/cards/d/DauntlessBodyguard.java @@ -35,8 +35,9 @@ import mage.abilities.Ability; import mage.abilities.common.AsEntersBattlefieldAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeSourceCost; -import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.keyword.IndestructibleAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -51,6 +52,7 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetControlledCreaturePermanent; +import mage.target.targetpointer.FixedTarget; import mage.util.CardUtil; /** @@ -85,9 +87,9 @@ public class DauntlessBodyguard extends CardImpl { } class DauntlessBodyguardChooseCreatureEffect extends OneShotEffect { - + private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature you control"); - + static { filter.add(new AnotherPredicate()); } @@ -127,12 +129,10 @@ class DauntlessBodyguardChooseCreatureEffect extends OneShotEffect { } } -class DauntlessBodyguardGainAbilityEffect extends GainAbilityTargetEffect { - - private MageObjectReference mor; +class DauntlessBodyguardGainAbilityEffect extends OneShotEffect { public DauntlessBodyguardGainAbilityEffect() { - super(IndestructibleAbility.getInstance(), Duration.EndOfTurn); + super(Outcome.AddAbility); this.staticText = "The chosen creature gains indestructible until end of turn"; } @@ -147,17 +147,17 @@ class DauntlessBodyguardGainAbilityEffect extends GainAbilityTargetEffect { @Override public boolean apply(Game game, Ability source) { - if (mor == null) { - Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); - if (sourcePermanent != null) { - mor = (MageObjectReference) game.getState().getValue(sourcePermanent.getId() + "_chosenCreature"); - } + MageObjectReference mor; + Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); + if (sourcePermanent == null) { + return false; } - if (mor != null) { - Permanent permanent = mor.getPermanent(game); - if (permanent != null) { - permanent.addAbility(ability, source.getSourceId(), game, false); - } + mor = (MageObjectReference) game.getState().getValue(sourcePermanent.getId() + "_chosenCreature"); + Permanent chosenPermanent = mor.getPermanent(game); + if (chosenPermanent != null) { + ContinuousEffect effect = new GainAbilityTargetEffect(IndestructibleAbility.getInstance(), Duration.EndOfTurn); + effect.setTargetPointer(new FixedTarget(chosenPermanent, game)); + game.addEffect(effect, source); } return true; } From 75bef57832bdf7b1645ae14ad967ad8aa8554ea3 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 2 May 2018 18:34:22 -0400 Subject: [PATCH 058/158] fixed Lich's Mastery preventing auto-win effects --- Mage/src/main/java/mage/players/PlayerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage/src/main/java/mage/players/PlayerImpl.java b/Mage/src/main/java/mage/players/PlayerImpl.java index d799973b6a1..886d06564fd 100644 --- a/Mage/src/main/java/mage/players/PlayerImpl.java +++ b/Mage/src/main/java/mage/players/PlayerImpl.java @@ -2226,7 +2226,7 @@ public abstract class PlayerImpl implements Player, Serializable { Player opponent = game.getPlayer(opponentId); if (opponent != null && !opponent.hasLost()) { logger.debug("player won -> calling opponent lost: " + this.getName() + " opponent: " + opponent.getName()); - opponent.lost(game); + opponent.lostForced(game); } } // if no more opponents alive, you win and the game ends From cddd81123b93fafab54454942c6e1826ea7ebce0 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 3 May 2018 01:33:21 +0200 Subject: [PATCH 059/158] Some changes related to #4893. --- .../plugins/card/utils/CardImageUtils.java | 5 ++- .../src/mage/player/ai/ComputerPlayer6.java | 4 +- Mage.Sets/src/mage/cards/n/NorinTheWary.java | 4 +- Mage.Sets/src/mage/cards/u/UndeadLeotau.java | 14 +++---- Mage.Sets/src/mage/cards/v/VoiceOfAll.java | 11 +++--- .../test/cards/copy/PhantasmalImageTest.java | 10 ++--- .../redirect/HarmsWayRedirectDamageTest.java | 8 ++-- .../cards/single/bfz/BrutalExpulsionTest.java | 1 - .../main/java/mage/abilities/AbilityImpl.java | 4 +- .../costs/common/ExileFromStackCost.java | 2 +- .../common/CantBeRegeneratedSourceEffect.java | 14 ++++++- .../effects/common/DestroySourceEffect.java | 2 +- .../common/FightTargetSourceEffect.java | 26 ++++++------- .../effects/common/FlipSourceEffect.java | 7 ++-- .../effects/common/PhaseOutSourceEffect.java | 6 +-- .../common/PreventDamageToSourceEffect.java | 11 ++++++ ...ourceFromGraveyardToBattlefieldEffect.java | 25 ++++++++++-- ...tlefieldUnderOwnerControlSourceEffect.java | 8 ++-- .../common/ReturnToHandTargetEffect.java | 2 +- .../effects/common/TapSourceEffect.java | 5 +-- .../continuous/GainAbilitySourceEffect.java | 7 ++++ .../continuous/LoseAbilitySourceEffect.java | 26 +++++++++---- .../LoseCreatureTypeSourceEffect.java | 11 ++++++ .../SwitchPowerToughnessSourceEffect.java | 39 +++++++++++++------ .../RemoveAllCountersSourceEffect.java | 16 ++++---- .../counter/RemoveCounterSourceEffect.java | 24 ++++++------ .../abilities/keyword/UnearthAbility.java | 4 +- Mage/src/main/java/mage/cards/CardImpl.java | 11 ++++-- .../main/java/mage/constants/Duration.java | 28 +++++++------ Mage/src/main/java/mage/game/GameImpl.java | 13 ++++--- Mage/src/main/java/mage/game/GameState.java | 6 ++- .../src/main/java/mage/game/ZonesHandler.java | 9 +++-- Mage/src/main/java/mage/game/stack/Spell.java | 4 +- .../main/java/mage/game/stack/SpellStack.java | 7 ++-- .../java/mage/game/stack/StackAbility.java | 4 +- Mage/src/main/java/mage/game/turn/Turn.java | 2 +- .../main/java/mage/players/PlayerImpl.java | 2 +- 37 files changed, 245 insertions(+), 137 deletions(-) diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/utils/CardImageUtils.java b/Mage.Client/src/main/java/org/mage/plugins/card/utils/CardImageUtils.java index 9e546689c8b..6b7c74587a8 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/utils/CardImageUtils.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/utils/CardImageUtils.java @@ -45,8 +45,11 @@ public final class CardImageUtils { pathCache.put(card, filePath); return filePath; } + + log.warn("Token image file not found. Set: " + card.getSet() + " Token Set Code: " + card.getTokenSetCode() + " Name: " + card.getName() + " File path: " + filePath); + } else { + log.warn("Trying to get token path for non token card. Set: " + card.getSet() + " Set Code: " + card.getTokenSetCode() + " Name: " + card.getName()); } - log.warn("Token image file not found: " + card.getSet() + " - " + card.getTokenSetCode() + " - " + card.getName()); return null; } 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 5d599003ab1..818cb7c3c68 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 @@ -430,7 +430,7 @@ public class ComputerPlayer6 extends ComputerPlayer /*implements Player*/ { } stackObject.resolve(game); if (stackObject instanceof StackAbility) { - game.getStack().remove(stackObject); + game.getStack().remove(stackObject, game); } game.applyEffects(); game.getPlayers().resetPassed(); @@ -968,7 +968,7 @@ public class ComputerPlayer6 extends ComputerPlayer /*implements Player*/ { // swallow e.printStackTrace(); } finally { - if(scanner != null) { + if (scanner != null) { scanner.close(); } } diff --git a/Mage.Sets/src/mage/cards/n/NorinTheWary.java b/Mage.Sets/src/mage/cards/n/NorinTheWary.java index ae1b4096d65..137003d4635 100644 --- a/Mage.Sets/src/mage/cards/n/NorinTheWary.java +++ b/Mage.Sets/src/mage/cards/n/NorinTheWary.java @@ -48,7 +48,7 @@ import mage.game.events.GameEvent.EventType; public class NorinTheWary extends CardImpl { public NorinTheWary(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{R}"); addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WARRIOR); @@ -94,7 +94,7 @@ class NorinTheWaryTriggeredAbility extends TriggeredAbilityImpl { @Override public String getRule() { - return new StringBuilder("When a player casts a spell or a creature attacks, ").append(super.getRule()).toString(); + return "When a player casts a spell or a creature attacks, " + super.getRule(); } @Override diff --git a/Mage.Sets/src/mage/cards/u/UndeadLeotau.java b/Mage.Sets/src/mage/cards/u/UndeadLeotau.java index eca1df7fb9d..869e786d9f7 100644 --- a/Mage.Sets/src/mage/cards/u/UndeadLeotau.java +++ b/Mage.Sets/src/mage/cards/u/UndeadLeotau.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.cards.u; import java.util.UUID; @@ -37,8 +36,8 @@ import mage.abilities.keyword.UnearthAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; +import mage.constants.SubType; import mage.constants.Zone; /** @@ -47,21 +46,22 @@ import mage.constants.Zone; */ public class UndeadLeotau extends CardImpl { - public UndeadLeotau (UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{5}{B}"); + public UndeadLeotau(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{B}"); this.subtype.add(SubType.ZOMBIE); this.subtype.add(SubType.CAT); this.power = new MageInt(3); this.toughness = new MageInt(4); - + // {R}: Undead Leotau gets +1/-1 until end of turn. - // Unearth {2}{B} this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(+1, -1, Duration.EndOfTurn), new ManaCostsImpl("{R}"))); + + // Unearth {2}{B} this.addAbility(new UnearthAbility(new ManaCostsImpl("{2}{B}"))); } - public UndeadLeotau (final UndeadLeotau card) { + public UndeadLeotau(final UndeadLeotau card) { super(card); } diff --git a/Mage.Sets/src/mage/cards/v/VoiceOfAll.java b/Mage.Sets/src/mage/cards/v/VoiceOfAll.java index 9dd44dcb4bf..0574407e6da 100644 --- a/Mage.Sets/src/mage/cards/v/VoiceOfAll.java +++ b/Mage.Sets/src/mage/cards/v/VoiceOfAll.java @@ -37,8 +37,8 @@ import mage.abilities.keyword.FlyingAbility; 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; /** @@ -48,17 +48,18 @@ import mage.constants.Zone; public class VoiceOfAll extends CardImpl { public VoiceOfAll(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{W}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}{W}"); this.subtype.add(SubType.ANGEL); this.power = new MageInt(2); this.toughness = new MageInt(2); // Flying this.addAbility(FlyingAbility.getInstance()); - + // As Voice of All enters the battlefield, choose a color. this.addAbility(new AsEntersBattlefieldAbility(new ChooseColorEffect(Outcome.Benefit))); - + + // Voice of All has protection from the chosen color. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ProtectionChosenColorSourceEffect())); } @@ -70,4 +71,4 @@ public class VoiceOfAll extends CardImpl { public VoiceOfAll copy() { return new VoiceOfAll(this); } -} \ No newline at end of file +} diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/copy/PhantasmalImageTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/copy/PhantasmalImageTest.java index 628e9b71530..3953a7bec09 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/copy/PhantasmalImageTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/copy/PhantasmalImageTest.java @@ -6,14 +6,11 @@ import mage.constants.PhaseStep; import mage.constants.Zone; import mage.game.permanent.Permanent; import org.junit.Assert; - -import org.junit.Test; -import org.mage.test.serverside.base.CardTestPlayerBase; - import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import org.junit.Ignore; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; /** * @author noxx @@ -179,6 +176,9 @@ public class PhantasmalImageTest extends CardTestPlayerBase { @Test public void testCopyEntersTapped() { addCard(Zone.BATTLEFIELD, playerA, "Island", 2); + // You may have Phantasmal Image enter the battlefield as a copy of any creature + // on the battlefield, except it's an Illusion in addition to its other types and + // it gains "When this creature becomes the target of a spell or ability, sacrifice it." addCard(Zone.HAND, playerA, "Phantasmal Image"); addCard(Zone.BATTLEFIELD, playerB, "Geralf's Messenger"); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/replacement/redirect/HarmsWayRedirectDamageTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/replacement/redirect/HarmsWayRedirectDamageTest.java index d7cd0eab5b9..6114dd3cf37 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/replacement/redirect/HarmsWayRedirectDamageTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/replacement/redirect/HarmsWayRedirectDamageTest.java @@ -7,8 +7,7 @@ import org.mage.test.serverside.base.CardTestPlayerBase; /** * Harm's Way: The next 2 damage that a source of your choice would deal to you - * and/or permanents you control this turn is dealt to any target - * instead. + * and/or permanents you control this turn is dealt to any target instead. * * @author noxx */ @@ -23,7 +22,7 @@ public class HarmsWayRedirectDamageTest extends CardTestPlayerBase { addCard(Zone.HAND, playerA, "Lightning Bolt"); addCard(Zone.BATTLEFIELD, playerA, "Mountain"); - addCard(Zone.HAND, playerB, "Harm's Way"); + addCard(Zone.HAND, playerB, "Harm's Way"); // Instant {W} addCard(Zone.BATTLEFIELD, playerB, "Plains"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", playerB); @@ -33,6 +32,9 @@ public class HarmsWayRedirectDamageTest extends CardTestPlayerBase { setStopAt(1, PhaseStep.END_TURN); execute(); + assertGraveyardCount(playerA, "Lightning Bolt", 1); + assertGraveyardCount(playerB, "Harm's Way", 1); + // 2 damage was redirected back assertLife(playerA, 18); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/bfz/BrutalExpulsionTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/bfz/BrutalExpulsionTest.java index 1fa4024618e..37abafb2386 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/single/bfz/BrutalExpulsionTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/bfz/BrutalExpulsionTest.java @@ -29,7 +29,6 @@ package org.mage.test.cards.single.bfz; import mage.constants.PhaseStep; import mage.constants.Zone; -import org.junit.Ignore; import org.junit.Test; import org.mage.test.serverside.base.CardTestPlayerBase; diff --git a/Mage/src/main/java/mage/abilities/AbilityImpl.java b/Mage/src/main/java/mage/abilities/AbilityImpl.java index 4f3ae196a25..94694570623 100644 --- a/Mage/src/main/java/mage/abilities/AbilityImpl.java +++ b/Mage/src/main/java/mage/abilities/AbilityImpl.java @@ -157,6 +157,8 @@ public abstract class AbilityImpl implements Ability { public void newId() { if (!(this instanceof MageSingleton)) { this.id = UUID.randomUUID(); +// this.sourceObject = null; +// this.sourceObjectZoneChangeCounter = -1; } getEffects().newId(); } @@ -1211,7 +1213,7 @@ public abstract class AbilityImpl implements Ability { @Override public Permanent getSourcePermanentIfItStillExists(Game game) { - if (sourceObject == null) { + if (sourceObject == null || !sourceObject.getId().equals(getSourceId())) { setSourceObject(game.getObject(getSourceId()), game); } if (sourceObject instanceof Permanent) { diff --git a/Mage/src/main/java/mage/abilities/costs/common/ExileFromStackCost.java b/Mage/src/main/java/mage/abilities/costs/common/ExileFromStackCost.java index 5f692b1a264..f1ef74cdc04 100644 --- a/Mage/src/main/java/mage/abilities/costs/common/ExileFromStackCost.java +++ b/Mage/src/main/java/mage/abilities/costs/common/ExileFromStackCost.java @@ -63,7 +63,7 @@ public class ExileFromStackCost extends CostImpl { } String spellName = spellToExile.getName(); if (spellToExile.isCopy()) { - game.getStack().remove(spellToExile); + game.getStack().remove(spellToExile, game); } else { spellToExile.moveToExile(null, "", ability.getSourceId(), game); } diff --git a/Mage/src/main/java/mage/abilities/effects/common/CantBeRegeneratedSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/CantBeRegeneratedSourceEffect.java index f1b8a2238f6..2ec9169c65f 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/CantBeRegeneratedSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/CantBeRegeneratedSourceEffect.java @@ -27,6 +27,7 @@ */ package mage.abilities.effects.common; +import java.util.Objects; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; @@ -36,8 +37,6 @@ import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; -import java.util.Objects; - /** * * @author jeffwadsworth @@ -67,6 +66,17 @@ public class CantBeRegeneratedSourceEffect extends ContinuousRuleModifyingEffect return event.getType() == EventType.REGENERATE; } + @Override + public void init(Ability source, Game game) { + super.init(source, game); //To change body of generated methods, choose Tools | Templates. + if (duration.isOnlyValidIfNoZoneChange()) { + // If source permanent is no longer onto battlefield discard the effect + if (source.getSourcePermanentIfItStillExists(game) == null) { + discard(); + } + } + } + @Override public boolean applies(GameEvent event, Ability source, Game game) { return Objects.equals(source.getSourceId(), event.getTargetId()); diff --git a/Mage/src/main/java/mage/abilities/effects/common/DestroySourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/DestroySourceEffect.java index d3bae2ecd35..f3a62ed2319 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/DestroySourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/DestroySourceEffect.java @@ -63,7 +63,7 @@ public class DestroySourceEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(source.getSourceId()); + Permanent permanent = source.getSourcePermanentIfItStillExists(game); if (permanent != null) { permanent.destroy(source.getSourceId(), game, noRegen); return true; diff --git a/Mage/src/main/java/mage/abilities/effects/common/FightTargetSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/FightTargetSourceEffect.java index a97b997d289..1f78bbbe680 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/FightTargetSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/FightTargetSourceEffect.java @@ -27,6 +27,7 @@ */ package mage.abilities.effects.common; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.effects.OneShotEffect; @@ -50,21 +51,19 @@ public class FightTargetSourceEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Permanent originalPermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); - if (originalPermanent != null) { - Permanent sourcePermanent = game.getPermanent(source.getSourceId()); - // only if target is legal the effect will be applied - if (source.getTargets().get(0).isLegal(source, game)) { - Permanent creature1 = game.getPermanent(source.getTargets().get(0).getFirstTarget()); - // 20110930 - 701.10 - if (creature1 != null && sourcePermanent != null) { - if (creature1.isCreature() && sourcePermanent.isCreature()) { - return sourcePermanent.fight(creature1, source, game); - } + MageObject sourceObject = source.getSourceObject(game); + if (sourceObject != null) { + Permanent sourcePermanent = source.getSourcePermanentIfItStillExists(game); + Permanent creature1 = game.getPermanent(getTargetPointer().getFirst(game, source)); + // 20110930 - 701.10 + if (creature1 != null && sourcePermanent != null) { + if (creature1.isCreature() && sourcePermanent.isCreature()) { + return sourcePermanent.fight(creature1, source, game); } } - if (!game.isSimulation()) - game.informPlayers(originalPermanent.getLogName() + ": Fighting effect has been fizzled."); + if (!game.isSimulation()) { + game.informPlayers(sourceObject.getLogName() + ": Fighting effect has been fizzled."); + } } return false; } @@ -83,4 +82,3 @@ public class FightTargetSourceEffect extends OneShotEffect { } } - diff --git a/Mage/src/main/java/mage/abilities/effects/common/FlipSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/FlipSourceEffect.java index aaa46793726..697a83b2a96 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/FlipSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/FlipSourceEffect.java @@ -8,11 +8,9 @@ import mage.abilities.effects.OneShotEffect; import mage.constants.Outcome; import mage.game.Game; import mage.game.permanent.Permanent; -import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; import mage.players.Player; - /** * @author Loki */ @@ -33,14 +31,15 @@ public class FlipSourceEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(source.getSourceId()); + Permanent permanent = source.getSourcePermanentIfItStillExists(game); Player controller = game.getPlayer(source.getControllerId()); if (permanent != null && controller != null) { if (permanent.flip(game)) { ContinuousEffect effect = new ConditionalContinuousEffect(new CopyTokenEffect(flipToken), FlippedCondition.instance, ""); game.addEffect(effect, source); - if (!game.isSimulation()) + if (!game.isSimulation()) { game.informPlayers(new StringBuilder(controller.getLogName()).append(" flips ").append(permanent.getName()).toString()); + } return true; } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/PhaseOutSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/PhaseOutSourceEffect.java index 1df8ff9ff37..3672fd66b1e 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/PhaseOutSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/PhaseOutSourceEffect.java @@ -5,7 +5,6 @@ */ package mage.abilities.effects.common; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.constants.Outcome; @@ -34,9 +33,8 @@ public class PhaseOutSourceEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - MageObject sourceObject = source.getSourceObjectIfItStillExists(game); - if (sourceObject instanceof Permanent) { - Permanent permanent = (Permanent) sourceObject; + Permanent permanent = source.getSourcePermanentIfItStillExists(game); + if (permanent != null) { return permanent.phaseOut(game); } return false; diff --git a/Mage/src/main/java/mage/abilities/effects/common/PreventDamageToSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/PreventDamageToSourceEffect.java index c1f0ade0747..eab8e27cfdf 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/PreventDamageToSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/PreventDamageToSourceEffect.java @@ -54,6 +54,17 @@ public class PreventDamageToSourceEffect extends PreventionEffectImpl { return new PreventDamageToSourceEffect(this); } + @Override + public void init(Ability source, Game game) { + super.init(source, game); //To change body of generated methods, choose Tools | Templates. + if (duration.isOnlyValidIfNoZoneChange()) { + // If source permanent is no longer onto battlefield discard the effect + if (source.getSourcePermanentIfItStillExists(game) == null) { + discard(); + } + } + } + @Override public boolean apply(Game game, Ability source) { return true; diff --git a/Mage/src/main/java/mage/abilities/effects/common/ReturnSourceFromGraveyardToBattlefieldEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ReturnSourceFromGraveyardToBattlefieldEffect.java index 6ba78d9a7ba..327233b1b8e 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ReturnSourceFromGraveyardToBattlefieldEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ReturnSourceFromGraveyardToBattlefieldEffect.java @@ -28,12 +28,18 @@ package mage.abilities.effects.common; import mage.abilities.Ability; +import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.HasteAbility; import mage.cards.Card; +import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Zone; import mage.game.Game; +import mage.game.permanent.Permanent; import mage.players.Player; +import mage.target.targetpointer.FixedTarget; /** * @@ -43,21 +49,25 @@ public class ReturnSourceFromGraveyardToBattlefieldEffect extends OneShotEffect private boolean tapped; private boolean ownerControl; + private boolean haste; public ReturnSourceFromGraveyardToBattlefieldEffect() { this(false); } public ReturnSourceFromGraveyardToBattlefieldEffect(boolean tapped) { - super(Outcome.PutCreatureInPlay); - this.tapped = tapped; - setText(); + this(tapped, true); } public ReturnSourceFromGraveyardToBattlefieldEffect(boolean tapped, boolean ownerControl) { + this(tapped, ownerControl, false); + } + + public ReturnSourceFromGraveyardToBattlefieldEffect(boolean tapped, boolean ownerControl, boolean haste) { super(Outcome.PutCreatureInPlay); this.tapped = tapped; this.ownerControl = ownerControl; + this.haste = haste; setText(); } @@ -65,6 +75,7 @@ public class ReturnSourceFromGraveyardToBattlefieldEffect extends OneShotEffect super(effect); this.tapped = effect.tapped; this.ownerControl = effect.ownerControl; + this.haste = effect.haste; } @Override @@ -89,6 +100,14 @@ public class ReturnSourceFromGraveyardToBattlefieldEffect extends OneShotEffect } if (game.getState().getZone(source.getSourceId()) == Zone.GRAVEYARD) { player.moveCards(card, Zone.BATTLEFIELD, source, game, tapped, false, true, null); + if (haste) { + Permanent permanent = game.getPermanent(card.getId()); + if (permanent != null) { + ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.Custom); + effect.setTargetPointer(new FixedTarget(permanent, game)); + game.addEffect(effect, source); + } + } } return true; } diff --git a/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderOwnerControlSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderOwnerControlSourceEffect.java index 1f5b793fafc..ea3939f1b91 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderOwnerControlSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderOwnerControlSourceEffect.java @@ -33,6 +33,7 @@ import mage.cards.Card; import mage.constants.Outcome; import mage.constants.Zone; import mage.game.Game; +import mage.players.Player; /** * @@ -81,16 +82,17 @@ public class ReturnToBattlefieldUnderOwnerControlSourceEffect extends OneShotEff @Override public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); Card card = game.getCard(source.getSourceId()); - if (card != null) { + if (controller != null && card != null) { // return only from public zones switch (game.getState().getZone(card.getId())) { case EXILED: case COMMAND: case GRAVEYARD: if (zoneChangeCounter < 0 || game.getState().getZoneChangeCounter(card.getId()) == zoneChangeCounter) { - Zone currentZone = game.getState().getZone(card.getId()); - if (card.putOntoBattlefield(game, currentZone, source.getSourceId(), card.getOwnerId(), tapped)) { + + if (controller.moveCards(card, Zone.BATTLEFIELD, source, game, tapped, false, true, null)) { if (attacking) { game.getCombat().addAttackingCreature(card.getId(), game); } diff --git a/Mage/src/main/java/mage/abilities/effects/common/ReturnToHandTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ReturnToHandTargetEffect.java index ad80dffa498..94117fc3eb4 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ReturnToHandTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ReturnToHandTargetEffect.java @@ -103,7 +103,7 @@ public class ReturnToHandTargetEffect extends OneShotEffect { } } for (UUID copyId : copyIds) { - game.getStack().remove(game.getSpell(copyId)); + game.getStack().remove(game.getSpell(copyId), game); } return controller.moveCards(cards, Zone.HAND, source, game); } diff --git a/Mage/src/main/java/mage/abilities/effects/common/TapSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/TapSourceEffect.java index e510ae4844c..10b26d0099c 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/TapSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/TapSourceEffect.java @@ -63,10 +63,7 @@ public class TapSourceEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(source.getSourceId()); - if (permanent == null) { - permanent = game.getPermanentEntering(source.getSourceId()); - } + Permanent permanent = source.getSourcePermanentIfItStillExists(game); if (permanent != null) { if (withoutTrigger) { permanent.setTapped(true); diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/GainAbilitySourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/GainAbilitySourceEffect.java index 4e871839bbb..c9245e98340 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/GainAbilitySourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/GainAbilitySourceEffect.java @@ -92,6 +92,13 @@ public class GainAbilitySourceEffect extends ContinuousEffectImpl implements Sou @Override public void init(Ability source, Game game) { super.init(source, game); + if (!onCard && Duration.WhileOnBattlefield != duration) { + // If source permanent is no longer onto battlefield discard the effect + if (source.getSourcePermanentIfItStillExists(game) == null) { + discard(); + return; + } + } if (affectedObjectsSet) { Permanent permanent = game.getPermanentEntering(source.getSourceId()); if (permanent != null) { diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/LoseAbilitySourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/LoseAbilitySourceEffect.java index bbb09b1281d..6f5d03f33b2 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/LoseAbilitySourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/LoseAbilitySourceEffect.java @@ -12,38 +12,50 @@ import mage.constants.Outcome; import mage.constants.SubLayer; import mage.game.Game; import mage.game.permanent.Permanent; + /** * * @author Noahsark */ -public class LoseAbilitySourceEffect extends ContinuousEffectImpl{ +public class LoseAbilitySourceEffect extends ContinuousEffectImpl { protected Ability ability; - public LoseAbilitySourceEffect(Ability ability){ + public LoseAbilitySourceEffect(Ability ability) { this(ability, Duration.WhileOnBattlefield); } - public LoseAbilitySourceEffect(Ability ability, Duration duration){ + public LoseAbilitySourceEffect(Ability ability, Duration duration) { super(duration, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.LoseAbility); this.ability = ability; staticText = "{this} loses " + ability.getRule() + ' ' + duration.toString(); } - public LoseAbilitySourceEffect(final LoseAbilitySourceEffect effect){ + public LoseAbilitySourceEffect(final LoseAbilitySourceEffect effect) { super(effect); this.ability = effect.ability.copy(); } @Override - public LoseAbilitySourceEffect copy(){ + public LoseAbilitySourceEffect copy() { return new LoseAbilitySourceEffect(this); } @Override - public boolean apply(Game game, Ability source){ + public void init(Ability source, Game game) { + super.init(source, game); //To change body of generated methods, choose Tools | Templates. + if (duration.isOnlyValidIfNoZoneChange()) { + // If source permanent is no longer onto battlefield discard the effect + if (source.getSourcePermanentIfItStillExists(game) == null) { + discard(); + } + } + } + + @Override + public boolean apply(Game game, Ability source) { Permanent permanent = game.getPermanent(source.getSourceId()); - if (permanent != null){ + if (permanent != null) { // 112.10 while (permanent.getAbilities().remove(ability)) { diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/LoseCreatureTypeSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/LoseCreatureTypeSourceEffect.java index c1170ddc95d..af89fd318e1 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/LoseCreatureTypeSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/LoseCreatureTypeSourceEffect.java @@ -69,6 +69,17 @@ public class LoseCreatureTypeSourceEffect extends ContinuousEffectImpl implement return new LoseCreatureTypeSourceEffect(this); } + @Override + public void init(Ability source, Game game) { + super.init(source, game); //To change body of generated methods, choose Tools | Templates. + if (duration.isOnlyValidIfNoZoneChange()) { + // If source permanent is no longer onto battlefield discard the effect + if (source.getSourcePermanentIfItStillExists(game) == null) { + discard(); + } + } + } + @Override public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { if (dynamicValue.calculate(game, source, this) >= lessThan) { diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/SwitchPowerToughnessSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/SwitchPowerToughnessSourceEffect.java index a13e3178d6b..adcd4b7dfba 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/SwitchPowerToughnessSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/SwitchPowerToughnessSourceEffect.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,19 +20,19 @@ * 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.abilities.effects.common.continuous; +import mage.abilities.Ability; +import mage.abilities.effects.ContinuousEffectImpl; import mage.constants.Duration; import mage.constants.Layer; import mage.constants.Outcome; import mage.constants.SubLayer; -import mage.abilities.Ability; -import mage.abilities.effects.ContinuousEffectImpl; import mage.game.Game; import mage.game.permanent.Permanent; @@ -55,14 +55,29 @@ public class SwitchPowerToughnessSourceEffect extends ContinuousEffectImpl { return new SwitchPowerToughnessSourceEffect(this); } + @Override + public void init(Ability source, Game game) { + super.init(source, game); //To change body of generated methods, choose Tools | Templates. + if (duration.isOnlyValidIfNoZoneChange()) { + // If source permanent is no longer onto battlefield discard the effect + if (source.getSourcePermanentIfItStillExists(game) == null) { + discard(); + } + } + } + @Override public boolean apply(Game game, Ability source) { - Permanent target = game.getPermanent(source.getSourceId()); - if (target != null) { - int power = target.getPower().getValue(); - target.getPower().setValue(target.getToughness().getValue()); - target.getToughness().setValue(power); + Permanent sourcePermanent = source.getSourcePermanentIfItStillExists(game); + if (sourcePermanent != null) { + int power = sourcePermanent.getPower().getValue(); + sourcePermanent.getPower().setValue(sourcePermanent.getToughness().getValue()); + sourcePermanent.getToughness().setValue(power); return true; + } else { + if (duration.isOnlyValidIfNoZoneChange()) { + discard(); + } } return false; } diff --git a/Mage/src/main/java/mage/abilities/effects/common/counter/RemoveAllCountersSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/counter/RemoveAllCountersSourceEffect.java index 10b24748f45..3697e18b01c 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/counter/RemoveAllCountersSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/counter/RemoveAllCountersSourceEffect.java @@ -39,7 +39,7 @@ import mage.game.permanent.Permanent; * @author TheElk801 */ public class RemoveAllCountersSourceEffect extends OneShotEffect { - + private final CounterType counterType; public RemoveAllCountersSourceEffect(CounterType counterType) { @@ -55,13 +55,13 @@ public class RemoveAllCountersSourceEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(source.getSourceId()); - if(permanent != null) { - int count = permanent.getCounters(game).getCount(counterType); - permanent.removeCounters(counterType.getName(), count, game); - return true; - } - return false; + Permanent permanent = source.getSourcePermanentIfItStillExists(game); + if (permanent != null) { + int count = permanent.getCounters(game).getCount(counterType); + permanent.removeCounters(counterType.getName(), count, game); + return true; + } + return false; } @Override diff --git a/Mage/src/main/java/mage/abilities/effects/common/counter/RemoveCounterSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/counter/RemoveCounterSourceEffect.java index 2e4feb8c523..35fa7df1f58 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/counter/RemoveCounterSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/counter/RemoveCounterSourceEffect.java @@ -56,7 +56,7 @@ public class RemoveCounterSourceEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(source.getSourceId()); + Permanent permanent = source.getSourcePermanentIfItStillExists(game); if (permanent != null) { int toRemove = Math.min(counter.getCount(), permanent.getCounters(game).getCount(counter.getName())); if (toRemove > 0) { @@ -67,18 +67,20 @@ public class RemoveCounterSourceEffect extends OneShotEffect { } return true; } - Card card = game.getCard(source.getSourceId()); - if (card != null) { - int toRemove = Math.min(counter.getCount(), card.getCounters(game).getCount(counter.getName())); - if (toRemove > 0) { - card.removeCounters(counter.getName(), toRemove, game); - if (!game.isSimulation()) { - game.informPlayers("Removed " + toRemove + ' ' + counter.getName() - + " counter from " + card.getLogName() - + " (" + card.getCounters(game).getCount(counter.getName()) + " left)"); + if (!(source.getSourceObject(game) instanceof Permanent)) { + Card card = game.getCard(source.getSourceId()); + if (card != null) { + int toRemove = Math.min(counter.getCount(), card.getCounters(game).getCount(counter.getName())); + if (toRemove > 0) { + card.removeCounters(counter.getName(), toRemove, game); + if (!game.isSimulation()) { + game.informPlayers("Removed " + toRemove + ' ' + counter.getName() + + " counter from " + card.getLogName() + + " (" + card.getCounters(game).getCount(counter.getName()) + " left)"); + } } + return true; } - return true; } return false; } diff --git a/Mage/src/main/java/mage/abilities/keyword/UnearthAbility.java b/Mage/src/main/java/mage/abilities/keyword/UnearthAbility.java index 239706abad4..b43eb548597 100644 --- a/Mage/src/main/java/mage/abilities/keyword/UnearthAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/UnearthAbility.java @@ -35,7 +35,6 @@ import mage.abilities.effects.ReplacementEffectImpl; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; import mage.abilities.effects.common.ExileSourceEffect; import mage.abilities.effects.common.ReturnSourceFromGraveyardToBattlefieldEffect; -import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.TimingRule; @@ -63,9 +62,8 @@ import mage.game.events.ZoneChangeEvent; public class UnearthAbility extends ActivatedAbilityImpl { public UnearthAbility(ManaCosts costs) { - super(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToBattlefieldEffect(), costs); + super(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToBattlefieldEffect(false, true, true), costs); this.timing = TimingRule.SORCERY; - this.addEffect(new GainAbilitySourceEffect(HasteAbility.getInstance(), Duration.Custom)); this.addEffect(new CreateDelayedTriggeredAbilityEffect(new UnearthDelayedTriggeredAbility())); this.addEffect(new UnearthLeavesBattlefieldEffect()); } diff --git a/Mage/src/main/java/mage/cards/CardImpl.java b/Mage/src/main/java/mage/cards/CardImpl.java index db7017c9ea2..57c4c9427d6 100644 --- a/Mage/src/main/java/mage/cards/CardImpl.java +++ b/Mage/src/main/java/mage/cards/CardImpl.java @@ -55,6 +55,7 @@ import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; import mage.filter.predicate.mageobject.NamePredicate; import mage.filter.predicate.mageobject.PowerPredicate; import mage.game.*; +import mage.game.command.CommandObject; import mage.game.events.GameEvent; import mage.game.events.ZoneChangeEvent; import mage.game.permanent.Permanent; @@ -618,14 +619,18 @@ public abstract class CardImpl extends MageObjectImpl implements Card { stackObject = game.getStack().getSpell(getId()); } if (stackObject != null) { - removed = game.getStack().remove(stackObject); + removed = game.getStack().remove(stackObject, game); lkiObject = stackObject; } break; case COMMAND: - lkiObject = game.getObject(objectId); + for (CommandObject commandObject : game.getState().getCommand()) { + if (commandObject.getId().equals(objectId)) { + lkiObject = commandObject; + } + } if (lkiObject != null) { - removed = game.getState().getCommand().remove(game.getObject(objectId)); + removed = game.getState().getCommand().remove((CommandObject) lkiObject); } break; case OUTSIDE: diff --git a/Mage/src/main/java/mage/constants/Duration.java b/Mage/src/main/java/mage/constants/Duration.java index c2d827c989b..e23951b8e12 100644 --- a/Mage/src/main/java/mage/constants/Duration.java +++ b/Mage/src/main/java/mage/constants/Duration.java @@ -5,21 +5,23 @@ package mage.constants; * @author North */ public enum Duration { - OneUse(""), - EndOfGame("for the rest of the game"), - WhileOnBattlefield(""), - WhileOnStack(""), - WhileInGraveyard(""), - EndOfTurn("until end of turn"), - UntilYourNextTurn("until your next turn"), - EndOfCombat("until end of combat"), - EndOfStep("until end of phase step"), - Custom(""); + OneUse("", true), + EndOfGame("for the rest of the game", false), + WhileOnBattlefield("", false), + WhileOnStack("", false), + WhileInGraveyard("", false), + EndOfTurn("until end of turn", true), + UntilYourNextTurn("until your next turn", true), + EndOfCombat("until end of combat", true), + EndOfStep("until end of phase step", true), + Custom("", true); private final String text; + private final boolean onlyValidIfNoZoneChange; // defines if an effect lasts only if the source has not chnaged zone since init of the effect - Duration(String text) { + Duration(String text, boolean onlyValidIfNoZoneChange) { this.text = text; + this.onlyValidIfNoZoneChange = onlyValidIfNoZoneChange; } @Override @@ -27,4 +29,8 @@ public enum Duration { return text; } + public boolean isOnlyValidIfNoZoneChange() { + return onlyValidIfNoZoneChange; + } + } diff --git a/Mage/src/main/java/mage/game/GameImpl.java b/Mage/src/main/java/mage/game/GameImpl.java index 0149ae16909..98730a7dc58 100644 --- a/Mage/src/main/java/mage/game/GameImpl.java +++ b/Mage/src/main/java/mage/game/GameImpl.java @@ -328,12 +328,15 @@ public abstract class GameImpl implements Game, Serializable { MageObject object; if (state.getBattlefield().containsPermanent(objectId)) { object = state.getBattlefield().getPermanent(objectId); - state.setZone(objectId, Zone.BATTLEFIELD); // why is this neccessary? + // state.setZone(objectId, Zone.BATTLEFIELD); // why is this neccessary? return object; } + if (getPermanentsEntering().containsKey(objectId)) { + return getPermanentEntering(objectId); + } for (StackObject item : state.getStack()) { if (item.getId().equals(objectId)) { - state.setZone(objectId, Zone.STACK); // why is this neccessary? + // state.setZone(objectId, Zone.STACK); // why is this neccessary? return item; } if (item.getSourceId().equals(objectId) && item instanceof Spell) { @@ -1421,7 +1424,7 @@ public abstract class GameImpl implements Game, Serializable { top.resolve(this); } finally { if (top != null) { - state.getStack().remove(top); // seems partly redundant because move card from stack to grave is already done and the stack removed + state.getStack().remove(top, this); // seems partly redundant because move card from stack to grave is already done and the stack removed rememberLKI(top.getSourceId(), Zone.STACK, top); checkInfiniteLoop(top.getSourceId()); if (!getTurn().isEndTurnRequested()) { @@ -2581,10 +2584,10 @@ public abstract class GameImpl implements Game, Serializable { it.remove(); } } - + if (addPlaneAgain) { boolean addedAgain = false; - for (Player aplayer : state.getPlayers().values()) { + for (Player aplayer : state.getPlayers().values()) { if (!aplayer.hasLeft() && !addedAgain) { addedAgain = true; Plane plane = Plane.getRandomPlane(); diff --git a/Mage/src/main/java/mage/game/GameState.java b/Mage/src/main/java/mage/game/GameState.java index d10618d2de3..2e59a19dc01 100644 --- a/Mage/src/main/java/mage/game/GameState.java +++ b/Mage/src/main/java/mage/game/GameState.java @@ -685,7 +685,11 @@ public class GameState implements Serializable, Copyable { } public void setZone(UUID id, Zone zone) { - zones.put(id, zone); + if (zone == null) { + zones.remove(id); + } else { + zones.put(id, zone); + } } public void addSimultaneousEvent(GameEvent event, Game game) { diff --git a/Mage/src/main/java/mage/game/ZonesHandler.java b/Mage/src/main/java/mage/game/ZonesHandler.java index 9a145c862dc..c14b2da8842 100644 --- a/Mage/src/main/java/mage/game/ZonesHandler.java +++ b/Mage/src/main/java/mage/game/ZonesHandler.java @@ -134,12 +134,15 @@ public final class ZonesHandler { case STACK: // There should never be more than one card here. for (Card card : cards.getCards(game)) { + Spell spell; if (info instanceof ZoneChangeInfo.Stack && ((ZoneChangeInfo.Stack) info).spell != null) { - game.getStack().push(((ZoneChangeInfo.Stack) info).spell); + spell = ((ZoneChangeInfo.Stack) info).spell; } else { - game.getStack().push( - new Spell(card, card.getSpellAbility().copy(), card.getOwnerId(), event.getFromZone())); + spell = new Spell(card, card.getSpellAbility().copy(), card.getOwnerId(), event.getFromZone()); } + game.getStack().push(spell); + game.getState().setZone(spell.getId(), Zone.STACK); + game.getState().setZone(card.getId(), Zone.STACK); } break; case BATTLEFIELD: diff --git a/Mage/src/main/java/mage/game/stack/Spell.java b/Mage/src/main/java/mage/game/stack/Spell.java index 5a5d4103ec6..adb17ec7ac9 100644 --- a/Mage/src/main/java/mage/game/stack/Spell.java +++ b/Mage/src/main/java/mage/game/stack/Spell.java @@ -410,7 +410,7 @@ public class Spell extends StackObjImpl implements Card { } } else { // Copied spell, only remove from stack - game.getStack().remove(this); + game.getStack().remove(this, game); } } @@ -772,7 +772,7 @@ public class Spell extends StackObjImpl implements Card { @Override public boolean moveToExile(UUID exileId, String name, UUID sourceId, Game game, List appliedEffects) { if (this.isCopiedSpell()) { - game.getStack().remove(this); + game.getStack().remove(this, game); return true; } return this.card.moveToExile(exileId, name, sourceId, game, appliedEffects); diff --git a/Mage/src/main/java/mage/game/stack/SpellStack.java b/Mage/src/main/java/mage/game/stack/SpellStack.java index ed0bf563879..aa8246d0c5d 100644 --- a/Mage/src/main/java/mage/game/stack/SpellStack.java +++ b/Mage/src/main/java/mage/game/stack/SpellStack.java @@ -67,15 +67,16 @@ public class SpellStack extends ArrayDeque { if (top != null) { if (contains(top)) { logger.warn("StackObject was still on the stack after resoving" + top.getName()); - this.remove(top); + this.remove(top, game); } } } } - public boolean remove(StackObject object) { + public boolean remove(StackObject object, Game game) { for (StackObject spell : this) { if (spell.getId().equals(object.getId())) { + game.getState().setZone(spell.getId(), null); return super.remove(spell); } } @@ -107,7 +108,7 @@ public class SpellStack extends ArrayDeque { } if (!game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.COUNTER, objectId, sourceId, stackObject.getControllerId()))) { if (!(stackObject instanceof Spell)) { // spells are removed from stack by the card movement - this.remove(stackObject); + this.remove(stackObject, game); } stackObject.counter(sourceId, game, zone, owner, zoneDetail); if (!game.isSimulation()) { diff --git a/Mage/src/main/java/mage/game/stack/StackAbility.java b/Mage/src/main/java/mage/game/stack/StackAbility.java index da87c5d3fb5..74038eb306f 100644 --- a/Mage/src/main/java/mage/game/stack/StackAbility.java +++ b/Mage/src/main/java/mage/game/stack/StackAbility.java @@ -101,14 +101,14 @@ public class StackAbility extends StackObjImpl implements Ability { public boolean resolve(Game game) { if (ability.getTargets().stillLegal(ability, game) || !canFizzle()) { boolean result = ability.resolve(game); - game.getStack().remove(this); + game.getStack().remove(this, game); return result; } if (!game.isSimulation()) { game.informPlayers("Ability has been fizzled: " + getRule()); } counter(null, game); - game.getStack().remove(this); + game.getStack().remove(this, game); return false; } diff --git a/Mage/src/main/java/mage/game/turn/Turn.java b/Mage/src/main/java/mage/game/turn/Turn.java index 3463487e455..221c771ea07 100644 --- a/Mage/src/main/java/mage/game/turn/Turn.java +++ b/Mage/src/main/java/mage/game/turn/Turn.java @@ -284,7 +284,7 @@ public class Turn implements Serializable { if (stackObject instanceof Spell) { ((Spell) stackObject).moveToExile(null, "", source.getSourceId(), game); } else { - game.getStack().remove(stackObject); // stack ability + game.getStack().remove(stackObject, game); // stack ability } } // 2) All attacking and blocking creatures are removed from combat. diff --git a/Mage/src/main/java/mage/players/PlayerImpl.java b/Mage/src/main/java/mage/players/PlayerImpl.java index d799973b6a1..0e1136188e7 100644 --- a/Mage/src/main/java/mage/players/PlayerImpl.java +++ b/Mage/src/main/java/mage/players/PlayerImpl.java @@ -3687,7 +3687,7 @@ public abstract class PlayerImpl implements Player, Serializable { final Spell spell = (Spell) card; if (spell.isCopiedSpell()) { // Copied spell, only remove from stack - game.getStack().remove(spell); + game.getStack().remove(spell, game); } } game.informPlayers(this.getLogName() + " moves " + (withName ? card.getLogName() + (card.isCopy() ? " (Copy)" : "") : "a card face down") + ' ' From c18433492d93f70537a76929ed20630a1551cd4e Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 3 May 2018 17:05:37 +0200 Subject: [PATCH 060/158] * Abundance - Fixed reaveal handling and log messages (fixes #4892). --- Mage.Sets/src/mage/cards/a/Abundance.java | 25 +++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/Mage.Sets/src/mage/cards/a/Abundance.java b/Mage.Sets/src/mage/cards/a/Abundance.java index 6f65b0ed59b..e234a73be4a 100644 --- a/Mage.Sets/src/mage/cards/a/Abundance.java +++ b/Mage.Sets/src/mage/cards/a/Abundance.java @@ -51,7 +51,7 @@ import mage.players.Player; public class Abundance extends CardImpl { public Abundance(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{G}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}{G}"); // If you would draw a card, you may instead choose land or nonland and reveal cards from the top of your library until you reveal a card of the chosen kind. Put that card into your hand and put all other cards revealed this way on the bottom of your library in any order. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new AbundanceReplacementEffect())); @@ -94,22 +94,30 @@ class AbundanceReplacementEffect extends ReplacementEffectImpl { MageObject sourceObject = game.getObject(source.getSourceId()); if (controller != null && sourceObject != null) { FilterCard filter = new FilterCard(); - if (controller.chooseUse(Outcome.Benefit, "Choose land? (No = nonland)", source, game)) { + if (controller.chooseUse(Outcome.Detriment, "Choose card type:", + source.getSourceObject(game).getLogName(), "land", "nonland", source, game)) { + game.informPlayers(controller.getLogName() + "chooses land."); filter.add(new CardTypePredicate(CardType.LAND)); } else { + game.informPlayers(controller.getLogName() + "chooses nonland."); filter.add(Predicates.not(new CardTypePredicate(CardType.LAND))); } - Cards cards = new CardsImpl(); + Cards toReveal = new CardsImpl(); + Card selectedCard = null; while (controller.getLibrary().hasCards()) { Card card = controller.getLibrary().removeFromTop(game); + toReveal.add(card); if (filter.match(card, source.getSourceId(), source.getControllerId(), game)) { - controller.moveCards(card, Zone.HAND, source, game); + selectedCard = card; break; } - cards.add(card); + } - controller.revealCards(sourceObject.getIdName(), cards, game); - controller.putCardsOnBottomOfLibrary(cards, game, source, true); + controller.moveCards(selectedCard, Zone.HAND, source, game); + controller.revealCards(sourceObject.getIdName(), toReveal, game); + toReveal.remove(selectedCard); + controller.putCardsOnBottomOfLibrary(toReveal, game, source, true); + } return true; } @@ -124,7 +132,8 @@ class AbundanceReplacementEffect extends ReplacementEffectImpl { if (event.getPlayerId().equals(source.getControllerId())) { Player player = game.getPlayer(source.getControllerId()); if (player != null) { - return player.chooseUse(Outcome.Benefit, "Choose land or nonland?", source, game); + return player.chooseUse(Outcome.Detriment, "Choose:", source.getSourceObject(game).getLogName(), + "land or nonland and reveal cards from the top", "normal card draw", source, game); } } return false; From 22b1147ebb77b1a157a6dbdbca74abcf4cb58b47 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Fri, 4 May 2018 15:17:54 -0400 Subject: [PATCH 061/158] fixed Lyra Dawnbringer giving opposing angels lifelink --- .../src/mage/cards/l/LyraDawnbringer.java | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/Mage.Sets/src/mage/cards/l/LyraDawnbringer.java b/Mage.Sets/src/mage/cards/l/LyraDawnbringer.java index 1a802076503..bd53db6f2d5 100644 --- a/Mage.Sets/src/mage/cards/l/LyraDawnbringer.java +++ b/Mage.Sets/src/mage/cards/l/LyraDawnbringer.java @@ -1,26 +1,29 @@ package mage.cards.l; +import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.common.continuous.BoostControlledEffect; -import mage.abilities.effects.common.continuous.GainAbilityAllEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; import mage.abilities.keyword.FirstStrikeAbility; import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.LifelinkAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; -import java.util.UUID; - public class LyraDawnbringer extends CardImpl { private static final FilterCreaturePermanent AngelFilter = new FilterCreaturePermanent(SubType.ANGEL, "Angels"); - public LyraDawnbringer(UUID ownerID, CardSetInfo cardSetInfo){ + public LyraDawnbringer(UUID ownerID, CardSetInfo cardSetInfo) { super(ownerID, cardSetInfo, new CardType[]{CardType.CREATURE}, "{3}{W}{W}"); addSuperType(SuperType.LEGENDARY); @@ -35,17 +38,17 @@ public class LyraDawnbringer extends CardImpl { Effect effect = new BoostControlledEffect(1, 1, Duration.WhileOnBattlefield, AngelFilter, true); effect.setText("Other Angels you control get +1/+1"); Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, effect); - Effect effect2 = new GainAbilityAllEffect(LifelinkAbility.getInstance(), Duration.WhileOnBattlefield, AngelFilter, true); + Effect effect2 = new GainAbilityControlledEffect(LifelinkAbility.getInstance(), Duration.WhileOnBattlefield, AngelFilter, true); effect2.setText("and have lifelink"); ability.addEffect(effect2); this.addAbility(ability); } - public LyraDawnbringer(final LyraDawnbringer lyraDawnbringer){ + public LyraDawnbringer(final LyraDawnbringer lyraDawnbringer) { super(lyraDawnbringer); } - public LyraDawnbringer copy(){ + public LyraDawnbringer copy() { return new LyraDawnbringer(this); } } From 2fdfaa913876e4e3ea756ec25c9ec1e1a5228973 Mon Sep 17 00:00:00 2001 From: L_J Date: Fri, 4 May 2018 23:20:08 +0200 Subject: [PATCH 062/158] Implemented Gauntlets of Chaos --- .../src/mage/cards/g/GauntletsOfChaos.java | 211 ++++++++++++++++++ Mage.Sets/src/mage/sets/Chronicles.java | 1 + Mage.Sets/src/mage/sets/FifthEdition.java | 1 + Mage.Sets/src/mage/sets/Legends.java | 1 + .../src/mage/sets/MastersEditionIII.java | 1 + .../ExchangeControlTargetEffect.java | 20 ++ 6 files changed, 235 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/g/GauntletsOfChaos.java diff --git a/Mage.Sets/src/mage/cards/g/GauntletsOfChaos.java b/Mage.Sets/src/mage/cards/g/GauntletsOfChaos.java new file mode 100644 index 00000000000..6b8716ce5a3 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GauntletsOfChaos.java @@ -0,0 +1,211 @@ +/* + * 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.g; + +import java.util.EnumSet; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.ExchangeControlTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.TargetPermanent; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author LevelX2 & L_J + */ +public class GauntletsOfChaos extends CardImpl { + + public GauntletsOfChaos(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{5}"); + + // {5}, Sacrifice Gauntlets of Chaos: Exchange control of target artifact, creature, or land you control and target permanent an opponent controls that shares one of those types with it. If those permanents are exchanged this way, destroy all Auras attached to them. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExchangeControlTargetEffect(Duration.EndOfGame, + "exchange control of target artifact, creature, or land you control and target permanent an opponent controls that shares one of those types with it." + + " If those permanents are exchanged this way, destroy all Auras attached to them", false, true, true), + new ManaCostsImpl("{5}") + ); + ability.addCost(new SacrificeSourceCost()); + ability.addTarget(new GauntletsOfChaosFirstTarget()); + ability.addTarget(new GauntletsOfChaosSecondTarget()); + this.addAbility(ability); + } + + public GauntletsOfChaos(final GauntletsOfChaos card) { + super(card); + } + + @Override + public GauntletsOfChaos copy() { + return new GauntletsOfChaos(this); + } +} + +class GauntletsOfChaosFirstTarget extends TargetControlledPermanent { + + public GauntletsOfChaosFirstTarget() { + super(); + this.filter = this.filter.copy(); + filter.add(Predicates.or( + new CardTypePredicate(CardType.ARTIFACT), + new CardTypePredicate(CardType.CREATURE), + new CardTypePredicate(CardType.LAND))); + setTargetName("artifact, creature, or land you control"); + } + + public GauntletsOfChaosFirstTarget(final GauntletsOfChaosFirstTarget target) { + super(target); + } + + @Override + public boolean canTarget(UUID controllerId, UUID id, Ability source, Game game) { + if (super.canTarget(controllerId, id, source, game)) { + Set cardTypes = getOpponentPermanentCardTypes(source.getSourceId(), controllerId, game); + Permanent permanent = game.getPermanent(id); + for (CardType type : permanent.getCardType()) { + if (cardTypes.contains(type)) { + return true; + } + } + } + return false; + } + + @Override + public Set possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) { + // get all cardtypes from opponents permanents + Set cardTypes = getOpponentPermanentCardTypes(sourceId, sourceControllerId, game); + Set possibleTargets = new HashSet<>(); + MageObject targetSource = game.getObject(sourceId); + for (Permanent permanent: game.getBattlefield().getActivePermanents(filter, sourceControllerId, sourceId, game)) { + if (!targets.containsKey(permanent.getId()) && permanent.canBeTargetedBy(targetSource, sourceControllerId, game)) { + for (CardType type : permanent.getCardType()) { + if (cardTypes.contains(type)) { + possibleTargets.add(permanent.getId()); + break; + } + } + } + } + return possibleTargets; + } + + @Override + public GauntletsOfChaosFirstTarget copy() { + return new GauntletsOfChaosFirstTarget(this); + } + + private EnumSet getOpponentPermanentCardTypes(UUID sourceId, UUID sourceControllerId, Game game) { + Player controller = game.getPlayer(sourceControllerId); + EnumSet cardTypes =EnumSet.noneOf(CardType.class); + if (controller != null) { + for (Permanent permanent: game.getBattlefield().getActivePermanents(sourceControllerId, game)) { + if (controller.hasOpponent(permanent.getControllerId(), game)) { + cardTypes.addAll(permanent.getCardType()); + } + } + } + return cardTypes; + } +} + + +class GauntletsOfChaosSecondTarget extends TargetPermanent { + + private Permanent firstTarget = null; + + public GauntletsOfChaosSecondTarget() { + super(); + this.filter = this.filter.copy(); + filter.add(new ControllerPredicate(TargetController.OPPONENT)); + setTargetName("permanent an opponent controls that shares one of those types with it"); + } + + public GauntletsOfChaosSecondTarget(final GauntletsOfChaosSecondTarget target) { + super(target); + this.firstTarget = target.firstTarget; + } + + + @Override + public boolean canTarget(UUID id, Ability source, Game game) { + if (super.canTarget(id, source, game)) { + Permanent target1 = game.getPermanent(source.getFirstTarget()); + Permanent opponentPermanent = game.getPermanent(id); + if (target1 != null && opponentPermanent != null) { + return target1.shareTypes(opponentPermanent); + } + } + return false; + } + + @Override + public Set possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) { + Set possibleTargets = new HashSet<>(); + if (firstTarget != null) { + MageObject targetSource = game.getObject(sourceId); + for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, sourceControllerId, sourceId, game)) { + if (!targets.containsKey(permanent.getId()) && permanent.canBeTargetedBy(targetSource, sourceControllerId, game)) { + if (permanent.shareTypes(firstTarget)) { + possibleTargets.add(permanent.getId()); + } + } + } + } + return possibleTargets; + } + + @Override + public boolean chooseTarget(Outcome outcome, UUID playerId, Ability source, Game game) { + firstTarget = game.getPermanent(source.getFirstTarget()); + return super.chooseTarget(Outcome.Damage, playerId, source, game); + } + + @Override + public GauntletsOfChaosSecondTarget copy() { + return new GauntletsOfChaosSecondTarget(this); + } +} diff --git a/Mage.Sets/src/mage/sets/Chronicles.java b/Mage.Sets/src/mage/sets/Chronicles.java index 75eb7d6636c..64bc7c7c0e0 100644 --- a/Mage.Sets/src/mage/sets/Chronicles.java +++ b/Mage.Sets/src/mage/sets/Chronicles.java @@ -95,6 +95,7 @@ public class Chronicles extends ExpansionSet { cards.add(new SetCardInfo("Flash Flood", 21, Rarity.COMMON, mage.cards.f.FlashFlood.class)); cards.add(new SetCardInfo("Fountain of Youth", 78, Rarity.COMMON, mage.cards.f.FountainOfYouth.class)); cards.add(new SetCardInfo("Gabriel Angelfire", 111, Rarity.RARE, mage.cards.g.GabrielAngelfire.class)); + cards.add(new SetCardInfo("Gauntlets of Chaos", 79, Rarity.RARE, mage.cards.g.GauntletsOfChaos.class)); cards.add(new SetCardInfo("Ghazban Ogre", 37, Rarity.COMMON, mage.cards.g.GhazbanOgre.class)); cards.add(new SetCardInfo("Goblin Artisans", 48, Rarity.UNCOMMON, mage.cards.g.GoblinArtisans.class)); cards.add(new SetCardInfo("Goblin Digging Team", 49, Rarity.COMMON, mage.cards.g.GoblinDiggingTeam.class)); diff --git a/Mage.Sets/src/mage/sets/FifthEdition.java b/Mage.Sets/src/mage/sets/FifthEdition.java index fa31ca8cbfa..50f19fd92da 100644 --- a/Mage.Sets/src/mage/sets/FifthEdition.java +++ b/Mage.Sets/src/mage/sets/FifthEdition.java @@ -192,6 +192,7 @@ public class FifthEdition extends ExpansionSet { cards.add(new SetCardInfo("Fyndhorn Elder", 159, Rarity.UNCOMMON, mage.cards.f.FyndhornElder.class)); cards.add(new SetCardInfo("Game of Chaos", 232, Rarity.RARE, mage.cards.g.GameOfChaos.class)); cards.add(new SetCardInfo("Gaseous Form", 90, Rarity.COMMON, mage.cards.g.GaseousForm.class)); + cards.add(new SetCardInfo("Gauntlets of Chaos", 373, Rarity.RARE, mage.cards.g.GauntletsOfChaos.class)); cards.add(new SetCardInfo("Ghazban Ogre", 160, Rarity.COMMON, mage.cards.g.GhazbanOgre.class)); cards.add(new SetCardInfo("Giant Growth", 161, Rarity.COMMON, mage.cards.g.GiantGrowth.class)); cards.add(new SetCardInfo("Giant Spider", 162, Rarity.COMMON, mage.cards.g.GiantSpider.class)); diff --git a/Mage.Sets/src/mage/sets/Legends.java b/Mage.Sets/src/mage/sets/Legends.java index d1b70490ded..982e71291f8 100644 --- a/Mage.Sets/src/mage/sets/Legends.java +++ b/Mage.Sets/src/mage/sets/Legends.java @@ -132,6 +132,7 @@ public class Legends extends ExpansionSet { cards.add(new SetCardInfo("Frost Giant", 146, Rarity.UNCOMMON, mage.cards.f.FrostGiant.class)); cards.add(new SetCardInfo("Gabriel Angelfire", 266, Rarity.RARE, mage.cards.g.GabrielAngelfire.class)); cards.add(new SetCardInfo("Gaseous Form", 59, Rarity.COMMON, mage.cards.g.GaseousForm.class)); + cards.add(new SetCardInfo("Gauntlets of Chaos", 222, Rarity.RARE, mage.cards.g.GauntletsOfChaos.class)); cards.add(new SetCardInfo("Ghosts of the Damned", 12, Rarity.COMMON, mage.cards.g.GhostsOfTheDamned.class)); cards.add(new SetCardInfo("Giant Strength", 147, Rarity.COMMON, mage.cards.g.GiantStrength.class)); cards.add(new SetCardInfo("Giant Turtle", 102, Rarity.COMMON, mage.cards.g.GiantTurtle.class)); diff --git a/Mage.Sets/src/mage/sets/MastersEditionIII.java b/Mage.Sets/src/mage/sets/MastersEditionIII.java index dfc7254072c..4da97cf5f56 100644 --- a/Mage.Sets/src/mage/sets/MastersEditionIII.java +++ b/Mage.Sets/src/mage/sets/MastersEditionIII.java @@ -126,6 +126,7 @@ public class MastersEditionIII extends ExpansionSet { cards.add(new SetCardInfo("Frost Giant", 101, Rarity.UNCOMMON, mage.cards.f.FrostGiant.class)); cards.add(new SetCardInfo("Gabriel Angelfire", 148, Rarity.RARE, mage.cards.g.GabrielAngelfire.class)); cards.add(new SetCardInfo("Gaea's Touch", 120, Rarity.UNCOMMON, mage.cards.g.GaeasTouch.class)); + cards.add(new SetCardInfo("Gauntlets of Chaos", 196, Rarity.RARE, mage.cards.g.GauntletsOfChaos.class)); cards.add(new SetCardInfo("Ghostly Visit", 67, Rarity.COMMON, mage.cards.g.GhostlyVisit.class)); cards.add(new SetCardInfo("Ghosts of the Damned", 68, Rarity.COMMON, mage.cards.g.GhostsOfTheDamned.class)); cards.add(new SetCardInfo("Giant Growth", 121, Rarity.COMMON, mage.cards.g.GiantGrowth.class)); diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/ExchangeControlTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/ExchangeControlTargetEffect.java index d03847849d6..88617cd10d5 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/ExchangeControlTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/ExchangeControlTargetEffect.java @@ -39,6 +39,9 @@ import mage.constants.Duration; import mage.constants.Layer; import mage.constants.Outcome; import mage.constants.SubLayer; +import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; import mage.game.Game; import mage.game.permanent.Permanent; @@ -50,6 +53,7 @@ public class ExchangeControlTargetEffect extends ContinuousEffectImpl { private String rule; private boolean withSource; private boolean withSecondTarget; + private boolean destroyAttachedAuras; private Map zoneChangeCounter = new HashMap<>(); private Map lockedControllers = new HashMap<>(); @@ -62,9 +66,14 @@ public class ExchangeControlTargetEffect extends ContinuousEffectImpl { } public ExchangeControlTargetEffect(Duration duration, String rule, boolean withSource, boolean withSecondTarget) { + this(duration, rule, withSource, withSecondTarget, false); + } + + public ExchangeControlTargetEffect(Duration duration, String rule, boolean withSource, boolean withSecondTarget, boolean destroyAttachedAuras) { super(duration, Layer.ControlChangingEffects_2, SubLayer.NA, Outcome.GainControl); this.withSource = withSource; this.withSecondTarget = withSecondTarget; + this.destroyAttachedAuras = destroyAttachedAuras; this.rule = rule; } @@ -73,6 +82,7 @@ public class ExchangeControlTargetEffect extends ContinuousEffectImpl { this.rule = effect.rule; this.withSource = effect.withSource; this.withSecondTarget = effect.withSecondTarget; + this.destroyAttachedAuras = effect.destroyAttachedAuras; this.lockedControllers = new HashMap<>(effect.lockedControllers); this.zoneChangeCounter = new HashMap<>(effect.zoneChangeCounter); } @@ -141,6 +151,16 @@ public class ExchangeControlTargetEffect extends ContinuousEffectImpl { } permanent.changeControllerId(lockedControllers.get(permanent.getId()), game); permanent.getAbilities().setControllerId(lockedControllers.get(permanent.getId())); + if (destroyAttachedAuras) { + FilterPermanent filter = new FilterPermanent(); + filter.add(new SubtypePredicate(SubType.AURA)); + for (UUID attachmentId : new HashSet<>(permanent.getAttachments())) { + Permanent attachment = game.getPermanent(attachmentId); + if (attachment != null && filter.match(attachment, game)) { + attachment.destroy(source.getSourceId(), game, false); + } + } + } } if (!toDelete.isEmpty()) { for (UUID uuid : toDelete) { From a65c1f5c3f7727e558200bff00f89cb84cb7ae1d Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sat, 5 May 2018 13:58:14 +0400 Subject: [PATCH 063/158] Refactoring: token names --- .../src/mage/cards/c/ChimericSphere.java | 25 +++++++++---------- .../mage/cards/e/ErayoSoratamiAscendant.java | 13 +++++----- .../src/mage/cards/f/FaithfulSquire.java | 14 +++++------ .../src/mage/cards/h/HiddenAncients.java | 13 +++++----- Mage.Sets/src/mage/cards/o/OpalCaryatid.java | 14 +++++------ 5 files changed, 38 insertions(+), 41 deletions(-) diff --git a/Mage.Sets/src/mage/cards/c/ChimericSphere.java b/Mage.Sets/src/mage/cards/c/ChimericSphere.java index d4fa5a6d580..e08bef467bf 100644 --- a/Mage.Sets/src/mage/cards/c/ChimericSphere.java +++ b/Mage.Sets/src/mage/cards/c/ChimericSphere.java @@ -39,7 +39,6 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Zone; import mage.game.permanent.token.TokenImpl; -import mage.game.permanent.token.Token; /** * @@ -51,10 +50,10 @@ public class ChimericSphere extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}"); // {2}: Until end of turn, Chimeric Sphere becomes a 2/1 Construct artifact creature with flying. - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureSourceEffect(new ChimericSphereCreature1(), + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureSourceEffect(new ChimericSphereFlyingToken(), "", Duration.EndOfTurn), new ManaCostsImpl("{2}"))); // {2}: Until end of turn, Chimeric Sphere becomes a 3/2 Construct artifact creature without flying. - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureSourceEffect(new ChimericSphereCreature2(), + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureSourceEffect(new ChimericSphereNotFlyingToken(), "", Duration.EndOfTurn), new ManaCostsImpl("{2}"))); } @@ -68,9 +67,9 @@ public class ChimericSphere extends CardImpl { } } -class ChimericSphereCreature1 extends TokenImpl { +class ChimericSphereFlyingToken extends TokenImpl { - public ChimericSphereCreature1() { + public ChimericSphereFlyingToken() { super("Chimeric Sphere", "2/1 Construct artifact creature with flying"); cardType.add(CardType.ARTIFACT); cardType.add(CardType.CREATURE); @@ -79,30 +78,30 @@ class ChimericSphereCreature1 extends TokenImpl { this.addAbility(FlyingAbility.getInstance()); } - public ChimericSphereCreature1(final ChimericSphereCreature1 token) { + public ChimericSphereFlyingToken(final ChimericSphereFlyingToken token) { super(token); } - public ChimericSphereCreature1 copy() { - return new ChimericSphereCreature1(this); + public ChimericSphereFlyingToken copy() { + return new ChimericSphereFlyingToken(this); } } -class ChimericSphereCreature2 extends TokenImpl { +class ChimericSphereNotFlyingToken extends TokenImpl { - public ChimericSphereCreature2() { + public ChimericSphereNotFlyingToken() { super("Chimeric Sphere", "3/2 Construct artifact creature without flying"); cardType.add(CardType.ARTIFACT); cardType.add(CardType.CREATURE); power = new MageInt(3); toughness = new MageInt(2); } - public ChimericSphereCreature2(final ChimericSphereCreature2 token) { + public ChimericSphereNotFlyingToken(final ChimericSphereNotFlyingToken token) { super(token); } - public ChimericSphereCreature2 copy() { - return new ChimericSphereCreature2(this); + public ChimericSphereNotFlyingToken copy() { + return new ChimericSphereNotFlyingToken(this); } } diff --git a/Mage.Sets/src/mage/cards/e/ErayoSoratamiAscendant.java b/Mage.Sets/src/mage/cards/e/ErayoSoratamiAscendant.java index 847af0db2b4..c6cd7d05b67 100644 --- a/Mage.Sets/src/mage/cards/e/ErayoSoratamiAscendant.java +++ b/Mage.Sets/src/mage/cards/e/ErayoSoratamiAscendant.java @@ -44,7 +44,6 @@ import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; import mage.game.permanent.token.TokenImpl; -import mage.game.permanent.token.Token; import mage.target.targetpointer.FixedTarget; import mage.watchers.common.CastSpellLastTurnWatcher; @@ -89,7 +88,7 @@ class ErayoSoratamiAscendantTriggeredAbility extends TriggeredAbilityImpl { } private static Effect getFlipEffect() { - Effect effect = new FlipSourceEffect(new ErayosEssence()); + Effect effect = new FlipSourceEffect(new ErayosEssenceToken()); effect.setText("flip {this}"); return effect; } @@ -120,9 +119,9 @@ class ErayoSoratamiAscendantTriggeredAbility extends TriggeredAbilityImpl { } } -class ErayosEssence extends TokenImpl { +class ErayosEssenceToken extends TokenImpl { - ErayosEssence() { + ErayosEssenceToken() { super("Erayo's Essence", ""); addSuperType(SuperType.LEGENDARY); cardType.add(CardType.ENCHANTMENT); @@ -134,12 +133,12 @@ class ErayosEssence extends TokenImpl { effect.setText("counter that spell"); this.addAbility(new ErayosEssenceTriggeredAbility(effect)); } - public ErayosEssence(final ErayosEssence token) { + public ErayosEssenceToken(final ErayosEssenceToken token) { super(token); } - public ErayosEssence copy() { - return new ErayosEssence(this); + public ErayosEssenceToken copy() { + return new ErayosEssenceToken(this); } } diff --git a/Mage.Sets/src/mage/cards/f/FaithfulSquire.java b/Mage.Sets/src/mage/cards/f/FaithfulSquire.java index 91899b75cce..f400e04f3dc 100644 --- a/Mage.Sets/src/mage/cards/f/FaithfulSquire.java +++ b/Mage.Sets/src/mage/cards/f/FaithfulSquire.java @@ -53,7 +53,6 @@ import mage.counters.CounterType; import mage.filter.StaticFilters; import mage.game.events.GameEvent; import mage.game.permanent.token.TokenImpl; -import mage.game.permanent.token.Token; import mage.target.common.TargetCreaturePermanent; /** @@ -76,7 +75,7 @@ public class FaithfulSquire extends CardImpl { // At the beginning of the end step, if there are two or more ki counters on Faithful Squire, you may flip it this.addAbility(new ConditionalTriggeredAbility( - new OnEventTriggeredAbility(GameEvent.EventType.END_TURN_STEP_PRE, "beginning of the end step", true, new FlipSourceEffect(new KaisoMemoryOfLoyalty()), true), + new OnEventTriggeredAbility(GameEvent.EventType.END_TURN_STEP_PRE, "beginning of the end step", true, new FlipSourceEffect(new KaisoMemoryOfLoyaltyToken()), true), new SourceHasCounterCondition(CounterType.KI, 2, Integer.MAX_VALUE), "At the beginning of the end step, if there are two or more ki counters on {this}, you may flip it.")); @@ -92,9 +91,9 @@ public class FaithfulSquire extends CardImpl { } } -class KaisoMemoryOfLoyalty extends TokenImpl { +class KaisoMemoryOfLoyaltyToken extends TokenImpl { - KaisoMemoryOfLoyalty() { + KaisoMemoryOfLoyaltyToken() { super("Kaiso, Memory of Loyalty", ""); addSuperType(SuperType.LEGENDARY); cardType.add(CardType.CREATURE); @@ -114,11 +113,12 @@ class KaisoMemoryOfLoyalty extends TokenImpl { ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); } - public KaisoMemoryOfLoyalty(final KaisoMemoryOfLoyalty token) { + + public KaisoMemoryOfLoyaltyToken(final KaisoMemoryOfLoyaltyToken token) { super(token); } - public KaisoMemoryOfLoyalty copy() { - return new KaisoMemoryOfLoyalty(this); + public KaisoMemoryOfLoyaltyToken copy() { + return new KaisoMemoryOfLoyaltyToken(this); } } diff --git a/Mage.Sets/src/mage/cards/h/HiddenAncients.java b/Mage.Sets/src/mage/cards/h/HiddenAncients.java index 3ee93bf641b..4f39fdbb79b 100644 --- a/Mage.Sets/src/mage/cards/h/HiddenAncients.java +++ b/Mage.Sets/src/mage/cards/h/HiddenAncients.java @@ -42,7 +42,6 @@ import mage.filter.FilterSpell; import mage.filter.StaticFilters; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.game.permanent.token.TokenImpl; -import mage.game.permanent.token.Token; import java.util.UUID; @@ -63,7 +62,7 @@ public class HiddenAncients extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{G}"); // When an opponent casts an enchantment spell, if Hidden Ancients is an enchantment, Hidden Ancients becomes a 5/5 Treefolk creature. - TriggeredAbility ability = new SpellCastOpponentTriggeredAbility(new BecomesCreatureSourceEffect(new HiddenAncientsTreefolk(), "", Duration.WhileOnBattlefield, true, false), + TriggeredAbility ability = new SpellCastOpponentTriggeredAbility(new BecomesCreatureSourceEffect(new HiddenAncientsTreefolkToken(), "", Duration.WhileOnBattlefield, true, false), filter, false); this.addAbility(new ConditionalTriggeredAbility(ability, new SourceMatchesFilterCondition(StaticFilters.FILTER_ENCHANTMENT_PERMANENT), "When an opponent casts an enchantment spell, if {this} is an enchantment, {this} becomes a 5/5 Treefolk creature.")); @@ -79,20 +78,20 @@ public class HiddenAncients extends CardImpl { } } -class HiddenAncientsTreefolk extends TokenImpl { +class HiddenAncientsTreefolkToken extends TokenImpl { - public HiddenAncientsTreefolk() { + public HiddenAncientsTreefolkToken() { super("Treefolk", "5/5 Treefolk creature"); cardType.add(CardType.CREATURE); subtype.add(SubType.TREEFOLK); power = new MageInt(5); toughness = new MageInt(5); } - public HiddenAncientsTreefolk(final HiddenAncientsTreefolk token) { + public HiddenAncientsTreefolkToken(final HiddenAncientsTreefolkToken token) { super(token); } - public HiddenAncientsTreefolk copy() { - return new HiddenAncientsTreefolk(this); + public HiddenAncientsTreefolkToken copy() { + return new HiddenAncientsTreefolkToken(this); } } diff --git a/Mage.Sets/src/mage/cards/o/OpalCaryatid.java b/Mage.Sets/src/mage/cards/o/OpalCaryatid.java index fc8da28d492..05e7af6b31d 100644 --- a/Mage.Sets/src/mage/cards/o/OpalCaryatid.java +++ b/Mage.Sets/src/mage/cards/o/OpalCaryatid.java @@ -41,7 +41,6 @@ import mage.constants.Duration; import mage.filter.StaticFilters; import mage.filter.common.FilterCreatureSpell; import mage.game.permanent.token.TokenImpl; -import mage.game.permanent.token.Token; import java.util.UUID; @@ -56,7 +55,7 @@ public class OpalCaryatid extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{W}"); // When an opponent casts a creature spell, if Opal Caryatid is an enchantment, Opal Caryatid becomes a 2/2 Soldier creature. - TriggeredAbility ability = new SpellCastOpponentTriggeredAbility(new BecomesCreatureSourceEffect(new OpalCaryatidSoldier(), "", Duration.WhileOnBattlefield, true, false), + TriggeredAbility ability = new SpellCastOpponentTriggeredAbility(new BecomesCreatureSourceEffect(new OpalCaryatidSoldierToken(), "", Duration.WhileOnBattlefield, true, false), new FilterCreatureSpell(), false); this.addAbility(new ConditionalTriggeredAbility(ability, new SourceMatchesFilterCondition(StaticFilters.FILTER_ENCHANTMENT_PERMANENT), "When an opponent casts a creature spell, if {this} is an enchantment, {this} becomes a 2/2 Soldier creature.")); @@ -72,20 +71,21 @@ public class OpalCaryatid extends CardImpl { } } -class OpalCaryatidSoldier extends TokenImpl { +class OpalCaryatidSoldierToken extends TokenImpl { - public OpalCaryatidSoldier() { + public OpalCaryatidSoldierToken() { super("Soldier", "2/2 Soldier creature"); cardType.add(CardType.CREATURE); subtype.add(SubType.SOLDIER); power = new MageInt(2); toughness = new MageInt(2); } - public OpalCaryatidSoldier(final OpalCaryatidSoldier token) { + + public OpalCaryatidSoldierToken(final OpalCaryatidSoldierToken token) { super(token); } - public OpalCaryatidSoldier copy() { - return new OpalCaryatidSoldier(this); + public OpalCaryatidSoldierToken copy() { + return new OpalCaryatidSoldierToken(this); } } From 483853658bb9f0523f2947eef279ee300130c8c7 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sat, 5 May 2018 14:37:24 +0400 Subject: [PATCH 064/158] Refactoring: replace custom creature tokens with basic class --- Mage.Sets/src/mage/cards/a/AnimateLand.java | 22 ++----------- .../mage/cards/j/JolraelEmpressOfBeasts.java | 22 ++----------- .../src/mage/cards/l/LifesparkSpellbomb.java | 23 ++------------ Mage.Sets/src/mage/cards/s/Soilshaper.java | 23 ++------------ Mage.Sets/src/mage/cards/v/Vivify.java | 20 ++---------- .../permanent/token/custom/CreatureToken.java | 31 +++++++++++++++++++ 6 files changed, 45 insertions(+), 96 deletions(-) create mode 100644 Mage/src/main/java/mage/game/permanent/token/custom/CreatureToken.java diff --git a/Mage.Sets/src/mage/cards/a/AnimateLand.java b/Mage.Sets/src/mage/cards/a/AnimateLand.java index b3784a6493f..4ffc36cb879 100644 --- a/Mage.Sets/src/mage/cards/a/AnimateLand.java +++ b/Mage.Sets/src/mage/cards/a/AnimateLand.java @@ -36,6 +36,7 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; import mage.target.common.TargetLandPermanent; /** @@ -48,7 +49,7 @@ public class AnimateLand extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{G}"); // Until end of turn, target land becomes a 3/3 creature that's still a land. - this.getSpellAbility().addEffect(new BecomesCreatureTargetEffect(new AnimatedLand(), false, true, Duration.EndOfTurn)); + this.getSpellAbility().addEffect(new BecomesCreatureTargetEffect(new CreatureToken(3, 3), false, true, Duration.EndOfTurn)); this.getSpellAbility().addTarget(new TargetLandPermanent()); } @@ -60,21 +61,4 @@ public class AnimateLand extends CardImpl { public AnimateLand copy() { return new AnimateLand(this); } -} - -class AnimatedLand extends TokenImpl { - - public AnimatedLand() { - super("", "3/3 creature"); - this.cardType.add(CardType.CREATURE); - this.power = new MageInt(3); - this.toughness = new MageInt(3); - } - public AnimatedLand(final AnimatedLand token) { - super(token); - } - - public AnimatedLand copy() { - return new AnimatedLand(this); - } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/j/JolraelEmpressOfBeasts.java b/Mage.Sets/src/mage/cards/j/JolraelEmpressOfBeasts.java index bf3cf980d41..fbc5958cd4a 100644 --- a/Mage.Sets/src/mage/cards/j/JolraelEmpressOfBeasts.java +++ b/Mage.Sets/src/mage/cards/j/JolraelEmpressOfBeasts.java @@ -46,6 +46,7 @@ import mage.filter.predicate.permanent.ControllerIdPredicate; import mage.game.Game; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; import mage.players.Player; import mage.target.TargetPlayer; import mage.target.common.TargetCardInHand; @@ -104,26 +105,9 @@ class JolraelEmpressOfBeastsEffect extends OneShotEffect { if (targetPlayer != null) { FilterPermanent filter = new FilterLandPermanent(); filter.add(new ControllerIdPredicate(targetPlayer.getId())); - game.addEffect(new BecomesCreatureAllEffect(new JolraelLandsToken(), "lands", filter, Duration.EndOfTurn), source); + game.addEffect(new BecomesCreatureAllEffect(new CreatureToken(3, 3), "lands", filter, Duration.EndOfTurn), source); return true; } return false; } -} - -class JolraelLandsToken extends TokenImpl { - - public JolraelLandsToken() { - super("", "3/3 creature"); - cardType.add(CardType.CREATURE); - power = new MageInt(3); - toughness = new MageInt(3); - } - public JolraelLandsToken(final JolraelLandsToken token) { - super(token); - } - - public JolraelLandsToken copy() { - return new JolraelLandsToken(this); - } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/l/LifesparkSpellbomb.java b/Mage.Sets/src/mage/cards/l/LifesparkSpellbomb.java index 33fd4a6a153..f5482a23dad 100644 --- a/Mage.Sets/src/mage/cards/l/LifesparkSpellbomb.java +++ b/Mage.Sets/src/mage/cards/l/LifesparkSpellbomb.java @@ -44,6 +44,7 @@ import mage.constants.Duration; import mage.constants.Zone; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; import mage.target.common.TargetLandPermanent; /** @@ -56,7 +57,7 @@ public class LifesparkSpellbomb extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{1}"); // {G}, Sacrifice Lifespark Spellbomb: Until end of turn, target land becomes a 3/3 creature that's still a land. - Ability firstAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureTargetEffect(new LifesparkSpellbombToken(), false, true, Duration.EndOfTurn), new ColoredManaCost(ColoredManaSymbol.G)); + Ability firstAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureTargetEffect(new CreatureToken(3, 3), false, true, Duration.EndOfTurn), new ColoredManaCost(ColoredManaSymbol.G)); firstAbility.addCost(new SacrificeSourceCost()); firstAbility.addTarget(new TargetLandPermanent()); this.addAbility(firstAbility); @@ -76,22 +77,4 @@ public class LifesparkSpellbomb extends CardImpl { return new LifesparkSpellbomb(this); } -} - -class LifesparkSpellbombToken extends TokenImpl { - - public LifesparkSpellbombToken() { - super("", "3/3 creature"); - this.cardType.add(CardType.CREATURE); - - this.power = new MageInt(3); - this.toughness = new MageInt(3); - } - public LifesparkSpellbombToken(final LifesparkSpellbombToken token) { - super(token); - } - - public LifesparkSpellbombToken copy() { - return new LifesparkSpellbombToken(this); - } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/s/Soilshaper.java b/Mage.Sets/src/mage/cards/s/Soilshaper.java index 592e0a936bc..8f0a127efd5 100644 --- a/Mage.Sets/src/mage/cards/s/Soilshaper.java +++ b/Mage.Sets/src/mage/cards/s/Soilshaper.java @@ -41,6 +41,7 @@ import mage.constants.Duration; import mage.filter.StaticFilters; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; import mage.target.common.TargetLandPermanent; /** @@ -57,7 +58,7 @@ public class Soilshaper extends CardImpl { this.toughness = new MageInt(1); // Whenever you cast a Spirit or Arcane spell, target land becomes a 3/3 creature until end of turn. It's still a land. - Ability ability = new SpellCastControllerTriggeredAbility(new BecomesCreatureTargetEffect(new SoilshaperToken(), false, true, Duration.EndOfTurn), StaticFilters.SPIRIT_OR_ARCANE_CARD, false); + Ability ability = new SpellCastControllerTriggeredAbility(new BecomesCreatureTargetEffect(new CreatureToken(3, 3), false, true, Duration.EndOfTurn), StaticFilters.SPIRIT_OR_ARCANE_CARD, false); ability.addTarget(new TargetLandPermanent()); this.addAbility(ability); } @@ -71,22 +72,4 @@ public class Soilshaper extends CardImpl { return new Soilshaper(this); } -} - -class SoilshaperToken extends TokenImpl { - - public SoilshaperToken() { - super("", "3/3 creature"); - this.cardType.add(CardType.CREATURE); - - this.power = new MageInt(3); - this.toughness = new MageInt(3); - } - public SoilshaperToken(final SoilshaperToken token) { - super(token); - } - - public SoilshaperToken copy() { - return new SoilshaperToken(this); - } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/v/Vivify.java b/Mage.Sets/src/mage/cards/v/Vivify.java index 0ee535ed741..0a5f206149a 100644 --- a/Mage.Sets/src/mage/cards/v/Vivify.java +++ b/Mage.Sets/src/mage/cards/v/Vivify.java @@ -37,6 +37,7 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; import mage.target.common.TargetLandPermanent; /** @@ -49,7 +50,7 @@ public class Vivify extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{2}{G}"); // Target land becomes a 3/3 creature until end of turn. It's still a land. - this.getSpellAbility().addEffect(new BecomesCreatureTargetEffect(new AnimatedLand(), false, true, Duration.EndOfTurn)); + this.getSpellAbility().addEffect(new BecomesCreatureTargetEffect(new CreatureToken(3, 3), false, true, Duration.EndOfTurn)); this.getSpellAbility().addTarget(new TargetLandPermanent()); // Draw a card. this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); @@ -64,20 +65,3 @@ public class Vivify extends CardImpl { return new Vivify(this); } } - -class AnimatedLand extends TokenImpl { - - public AnimatedLand() { - super("", "3/3 creature"); - this.cardType.add(CardType.CREATURE); - this.power = new MageInt(3); - this.toughness = new MageInt(3); - } - public AnimatedLand(final AnimatedLand token) { - super(token); - } - - public AnimatedLand copy() { - return new AnimatedLand(this); - } -} diff --git a/Mage/src/main/java/mage/game/permanent/token/custom/CreatureToken.java b/Mage/src/main/java/mage/game/permanent/token/custom/CreatureToken.java new file mode 100644 index 00000000000..d7cd2e4527e --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/custom/CreatureToken.java @@ -0,0 +1,31 @@ +package mage.game.permanent.token.custom; + +import mage.MageInt; +import mage.constants.CardType; +import mage.game.permanent.token.TokenImpl; + +/** + * + * @author JayDi85 + */ +public class CreatureToken extends TokenImpl { + + public CreatureToken() { + this(0, 0); + } + + public CreatureToken(int power, int toughness) { + super("", String.format("%d/%d creature", power, toughness)); + this.cardType.add(CardType.CREATURE); + this.power = new MageInt(power); + this.toughness = new MageInt(toughness); + } + + public CreatureToken(final CreatureToken token) { + super(token); + } + + public CreatureToken copy() { + return new CreatureToken(this); + } +} From b87e954a995dfd83f0a81890f1923b7d55c1062a Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sat, 5 May 2018 14:42:37 +0400 Subject: [PATCH 065/158] Refactoring: replace custom creature tokens with basic class --- .../src/mage/cards/b/BalduvianConjurer.java | 20 ++---------------- .../src/mage/cards/k/KamahlFistOfKrosa.java | 21 ++----------------- Mage.Sets/src/mage/cards/s/SiegeOfTowers.java | 20 +++--------------- Mage.Sets/src/mage/cards/s/SpikeTiller.java | 20 ++---------------- Mage.Sets/src/mage/cards/v/VerdantTouch.java | 21 ++----------------- 5 files changed, 11 insertions(+), 91 deletions(-) diff --git a/Mage.Sets/src/mage/cards/b/BalduvianConjurer.java b/Mage.Sets/src/mage/cards/b/BalduvianConjurer.java index 73c8d9a8f10..b2ebf83e5e0 100644 --- a/Mage.Sets/src/mage/cards/b/BalduvianConjurer.java +++ b/Mage.Sets/src/mage/cards/b/BalduvianConjurer.java @@ -39,6 +39,7 @@ import mage.filter.common.FilterLandPermanent; import mage.filter.predicate.mageobject.SupertypePredicate; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; import mage.target.TargetPermanent; import java.util.UUID; @@ -63,7 +64,7 @@ public class BalduvianConjurer extends CardImpl { this.toughness = new MageInt(2); // {tap}: Target snow land becomes a 2/2 creature until end of turn. It's still a land. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureTargetEffect(new AnimatedLand(), false, true, Duration.EndOfTurn), new TapSourceCost()); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureTargetEffect(new CreatureToken(2, 2), false, true, Duration.EndOfTurn), new TapSourceCost()); ability.addTarget(new TargetPermanent(filter)); this.addAbility(ability); } @@ -77,20 +78,3 @@ public class BalduvianConjurer extends CardImpl { return new BalduvianConjurer(this); } } - -class AnimatedLand extends TokenImpl { - - public AnimatedLand() { - super("", "2/2 creature"); - this.cardType.add(CardType.CREATURE); - this.power = new MageInt(2); - this.toughness = new MageInt(2); - } - public AnimatedLand(final AnimatedLand token) { - super(token); - } - - public AnimatedLand copy() { - return new AnimatedLand(this); - } -} diff --git a/Mage.Sets/src/mage/cards/k/KamahlFistOfKrosa.java b/Mage.Sets/src/mage/cards/k/KamahlFistOfKrosa.java index 25c9d849acd..08090565b6b 100644 --- a/Mage.Sets/src/mage/cards/k/KamahlFistOfKrosa.java +++ b/Mage.Sets/src/mage/cards/k/KamahlFistOfKrosa.java @@ -45,6 +45,7 @@ import mage.constants.Zone; import mage.filter.StaticFilters; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; import mage.target.common.TargetLandPermanent; /** @@ -65,7 +66,7 @@ public class KamahlFistOfKrosa extends CardImpl { // {G}: Target land becomes a 1/1 creature until end of turn. It's still a land. SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, - new BecomesCreatureTargetEffect(new KamahlFistOfKrosaLandToken(), false, true, Duration.EndOfTurn), + new BecomesCreatureTargetEffect(new CreatureToken(1, 1), false, true, Duration.EndOfTurn), new ManaCostsImpl("{G}")); ability.addTarget(new TargetLandPermanent()); this.addAbility(ability); @@ -87,21 +88,3 @@ public class KamahlFistOfKrosa extends CardImpl { return new KamahlFistOfKrosa(this); } } - -class KamahlFistOfKrosaLandToken extends TokenImpl { - - public KamahlFistOfKrosaLandToken() { - super("", "1/1 creature"); - this.cardType.add(CardType.CREATURE); - - this.power = new MageInt(1); - this.toughness = new MageInt(1); - } - public KamahlFistOfKrosaLandToken(final KamahlFistOfKrosaLandToken token) { - super(token); - } - - public KamahlFistOfKrosaLandToken copy() { - return new KamahlFistOfKrosaLandToken(this); - } -} diff --git a/Mage.Sets/src/mage/cards/s/SiegeOfTowers.java b/Mage.Sets/src/mage/cards/s/SiegeOfTowers.java index 58d437f0f58..6a59b7dadeb 100644 --- a/Mage.Sets/src/mage/cards/s/SiegeOfTowers.java +++ b/Mage.Sets/src/mage/cards/s/SiegeOfTowers.java @@ -41,6 +41,7 @@ import mage.filter.common.FilterLandPermanent; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; import mage.target.TargetPermanent; /** @@ -61,8 +62,9 @@ public class SiegeOfTowers extends CardImpl { // Replicate {1}{R} this.addAbility(new ReplicateAbility(this, "{1}{R}")); + // Target Mountain becomes a 3/1 creature. It's still a land. - Effect effect = new BecomesCreatureTargetEffect(new SiegeOfTowersToken(), false, true, Duration.EndOfGame); + Effect effect = new BecomesCreatureTargetEffect(new CreatureToken(3, 1), false, true, Duration.EndOfGame); effect.setText("Target Mountain becomes a 3/1 creature. It's still a land"); this.getSpellAbility().addEffect(effect); this.getSpellAbility().addTarget(new TargetPermanent(filter)); @@ -77,20 +79,4 @@ public class SiegeOfTowers extends CardImpl { public SiegeOfTowers copy() { return new SiegeOfTowers(this); } -} - -class SiegeOfTowersToken extends TokenImpl { - public SiegeOfTowersToken() { - super("", "3/1 creature"); - cardType.add(CardType.CREATURE); - power = new MageInt(3); - toughness = new MageInt(1); - } - public SiegeOfTowersToken(final SiegeOfTowersToken token) { - super(token); - } - - public SiegeOfTowersToken copy() { - return new SiegeOfTowersToken(this); - } } \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/s/SpikeTiller.java b/Mage.Sets/src/mage/cards/s/SpikeTiller.java index 8256c563b70..d1153a304cd 100644 --- a/Mage.Sets/src/mage/cards/s/SpikeTiller.java +++ b/Mage.Sets/src/mage/cards/s/SpikeTiller.java @@ -46,6 +46,7 @@ import mage.constants.Zone; import mage.counters.CounterType; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetLandPermanent; @@ -72,7 +73,7 @@ public class SpikeTiller extends CardImpl { this.addAbility(ability); // {2}, Remove a +1/+1 counter from Spike Tiller: Target land becomes a 2/2 creature that's still a land. Put a +1/+1 counter on it. - Ability ability2 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureTargetEffect(new SpikeTillerToken(), false, true, Duration.EndOfGame).setText("Target land becomes a 2/2 creature that's still a land. "), new GenericManaCost(2)); + Ability ability2 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureTargetEffect(new CreatureToken(2, 2), false, true, Duration.EndOfGame).setText("Target land becomes a 2/2 creature that's still a land. "), new GenericManaCost(2)); ability2.addCost(new RemoveCountersSourceCost(CounterType.P1P1.createInstance())); ability2.addEffect(new AddCountersTargetEffect(CounterType.P1P1.createInstance()).setText("Put a +1/+1 counter on it.")); ability2.addTarget(new TargetLandPermanent()); @@ -88,20 +89,3 @@ public class SpikeTiller extends CardImpl { return new SpikeTiller(this); } } - -class SpikeTillerToken extends TokenImpl { - - public SpikeTillerToken() { - super("", "2/2 creature"); - cardType.add(CardType.CREATURE); - power = new MageInt(2); - toughness = new MageInt(2); - } - public SpikeTillerToken(final SpikeTillerToken token) { - super(token); - } - - public SpikeTillerToken copy() { - return new SpikeTillerToken(this); - } -} diff --git a/Mage.Sets/src/mage/cards/v/VerdantTouch.java b/Mage.Sets/src/mage/cards/v/VerdantTouch.java index 691fcd328c5..7827edb1ffd 100644 --- a/Mage.Sets/src/mage/cards/v/VerdantTouch.java +++ b/Mage.Sets/src/mage/cards/v/VerdantTouch.java @@ -37,6 +37,7 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; import mage.target.common.TargetLandPermanent; /** @@ -52,7 +53,7 @@ public class VerdantTouch extends CardImpl { this.addAbility(new BuybackAbility("{3}")); // Target land becomes a 2/2 creature that's still a land. - this.getSpellAbility().addEffect(new BecomesCreatureTargetEffect(new VerdantTouchLandToken(), false, true, Duration.Custom)); + this.getSpellAbility().addEffect(new BecomesCreatureTargetEffect(new CreatureToken(2, 2), false, true, Duration.Custom)); this.getSpellAbility().addTarget(new TargetLandPermanent()); } @@ -64,22 +65,4 @@ public class VerdantTouch extends CardImpl { public VerdantTouch copy() { return new VerdantTouch(this); } -} - -class VerdantTouchLandToken extends TokenImpl { - - public VerdantTouchLandToken() { - super("", "2/2 creature"); - this.cardType.add(CardType.CREATURE); - - this.power = new MageInt(2); - this.toughness = new MageInt(2); - } - public VerdantTouchLandToken(final VerdantTouchLandToken token) { - super(token); - } - - public VerdantTouchLandToken copy() { - return new VerdantTouchLandToken(this); - } } \ No newline at end of file From 3f52f2961a37ddbb395d5cc35a69d19cd3a80403 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sat, 5 May 2018 17:09:59 +0400 Subject: [PATCH 066/158] * Hunting Wilds - fixed that it doesn't remove colors from forest on kicked; --- Mage.Sets/src/mage/cards/h/HuntingWilds.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Mage.Sets/src/mage/cards/h/HuntingWilds.java b/Mage.Sets/src/mage/cards/h/HuntingWilds.java index acfd20d500c..71eabb63f5c 100644 --- a/Mage.Sets/src/mage/cards/h/HuntingWilds.java +++ b/Mage.Sets/src/mage/cards/h/HuntingWilds.java @@ -132,6 +132,7 @@ class HuntingWildsToken extends TokenImpl { super("", "3/3 green creature with haste"); this.cardType.add(CardType.CREATURE); + this.color.setGreen(true); this.power = new MageInt(3); this.toughness = new MageInt(3); From 78fdf9a192fa33af79876ea0831a4cff14a52dc8 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sat, 5 May 2018 17:24:30 +0400 Subject: [PATCH 067/158] * Woodwraith Corrupter - fixed that it doesn't change target colors; --- Mage.Sets/src/mage/cards/w/WoodwraithCorrupter.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Mage.Sets/src/mage/cards/w/WoodwraithCorrupter.java b/Mage.Sets/src/mage/cards/w/WoodwraithCorrupter.java index 539048481ff..5985338c466 100644 --- a/Mage.Sets/src/mage/cards/w/WoodwraithCorrupter.java +++ b/Mage.Sets/src/mage/cards/w/WoodwraithCorrupter.java @@ -91,8 +91,12 @@ class WoodwraithCorrupterToken extends TokenImpl { public WoodwraithCorrupterToken() { super("", "4/4 black and green Elemental Horror creature"); cardType.add(CardType.CREATURE); + + color.setBlack(true); + color.setGreen(true); subtype.add(SubType.ELEMENTAL); subtype.add(SubType.HORROR); + power = new MageInt(4); toughness = new MageInt(4); } From 578427a6011971b494072f6546a3ed33bd80057d Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sat, 5 May 2018 17:25:33 +0400 Subject: [PATCH 068/158] Refactoring: replace custom creature tokens with basic class --- .../mage/cards/a/AnthousaSetessanHero.java | 22 ++-------------- .../src/mage/cards/e/ElvishBranchbender.java | 2 +- .../src/mage/cards/f/FendeepSummoner.java | 25 ++++--------------- Mage.Sets/src/mage/cards/o/Omnibian.java | 24 ++++-------------- .../permanent/token/custom/CreatureToken.java | 17 ++++++++++++- Mage/src/main/java/mage/util/SubTypeList.java | 8 ++++++ 6 files changed, 37 insertions(+), 61 deletions(-) diff --git a/Mage.Sets/src/mage/cards/a/AnthousaSetessanHero.java b/Mage.Sets/src/mage/cards/a/AnthousaSetessanHero.java index 99f8f2cb32b..0a3831fcd01 100644 --- a/Mage.Sets/src/mage/cards/a/AnthousaSetessanHero.java +++ b/Mage.Sets/src/mage/cards/a/AnthousaSetessanHero.java @@ -41,6 +41,7 @@ import mage.constants.SuperType; import mage.filter.common.FilterControlledLandPermanent; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; import mage.target.common.TargetControlledPermanent; /** @@ -59,7 +60,7 @@ public class AnthousaSetessanHero extends CardImpl { this.toughness = new MageInt(5); // Heroic - Whenever you cast a spell that targets Anthousa, Setessan Hero, up to three target lands you control each become 2/2 Warrior creatures until end of turn. They're still lands. - Ability ability = new HeroicAbility(new BecomesCreatureTargetEffect(new AnthousaWarriorToken(), false, true, Duration.EndOfTurn)); + Ability ability = new HeroicAbility(new BecomesCreatureTargetEffect(new CreatureToken(2, 2, "2/2 Warrior creature", SubType.WARRIOR),false,true, Duration.EndOfTurn)); ability.addTarget(new TargetControlledPermanent(0,3,new FilterControlledLandPermanent("lands"), false)); this.addAbility(ability); } @@ -72,23 +73,4 @@ public class AnthousaSetessanHero extends CardImpl { public AnthousaSetessanHero copy() { return new AnthousaSetessanHero(this); } -} - -class AnthousaWarriorToken extends TokenImpl { - - public AnthousaWarriorToken() { - super("", "2/2 Warrior creatures"); - cardType.add(CardType.CREATURE); - subtype.add(SubType.WARRIOR); - power = new MageInt(2); - toughness = new MageInt(2); - } - public AnthousaWarriorToken(final AnthousaWarriorToken token) { - super(token); - } - - public AnthousaWarriorToken copy() { - return new AnthousaWarriorToken(this); - } - } \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/e/ElvishBranchbender.java b/Mage.Sets/src/mage/cards/e/ElvishBranchbender.java index 8607e795b7d..bb7331da6e1 100644 --- a/Mage.Sets/src/mage/cards/e/ElvishBranchbender.java +++ b/Mage.Sets/src/mage/cards/e/ElvishBranchbender.java @@ -106,7 +106,7 @@ class ElvishBranchbenderEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { int xValue = new PermanentsOnBattlefieldCount(filter).calculate(game, source, this); - ContinuousEffect effect = new BecomesCreatureTargetEffect(new ElvishBranchbenderToken(xValue), false, false, Duration.EndOfTurn); + ContinuousEffect effect = new BecomesCreatureTargetEffect(new ElvishBranchbenderToken(xValue), false, false, Duration.EndOfTurn); // fix effect.setTargetPointer(targetPointer); game.addEffect(effect, source); return false; diff --git a/Mage.Sets/src/mage/cards/f/FendeepSummoner.java b/Mage.Sets/src/mage/cards/f/FendeepSummoner.java index 5573da9132f..fcc7d7e45b6 100644 --- a/Mage.Sets/src/mage/cards/f/FendeepSummoner.java +++ b/Mage.Sets/src/mage/cards/f/FendeepSummoner.java @@ -43,7 +43,9 @@ import mage.filter.common.FilterLandPermanent; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; import mage.target.common.TargetLandPermanent; +import mage.util.SubTypeList; /** * @author anonymous @@ -65,7 +67,9 @@ public class FendeepSummoner extends CardImpl { this.toughness = new MageInt(5); // {T}: Up to two target Swamps each become 3/5 Treefolk Warrior creatures in addition to their other types until end of turn. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureTargetEffect(new FendeepSummonerToken(), false, false, Duration.EndOfTurn), new TapSourceCost()); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureTargetEffect( + new CreatureToken(3, 5, "3/5 Treefolk Warrior", new SubTypeList(SubType.TREEFOLK, SubType.WARRIOR)), + false, false, Duration.EndOfTurn), new TapSourceCost()); ability.addTarget(new TargetLandPermanent(0, 2, filter, false)); this.addAbility(ability); } @@ -79,22 +83,3 @@ public class FendeepSummoner extends CardImpl { return new FendeepSummoner(this); } } - -class FendeepSummonerToken extends TokenImpl { - - public FendeepSummonerToken() { - super("", "3/5 Treefolk Warrior"); - this.cardType.add(CardType.CREATURE); - this.subtype.add(SubType.TREEFOLK); - this.subtype.add(SubType.WARRIOR); - this.power = new MageInt(3); - this.toughness = new MageInt(5); - } - public FendeepSummonerToken(final FendeepSummonerToken token) { - super(token); - } - - public FendeepSummonerToken copy() { - return new FendeepSummonerToken(this); - } -} diff --git a/Mage.Sets/src/mage/cards/o/Omnibian.java b/Mage.Sets/src/mage/cards/o/Omnibian.java index 943ed6b4c74..04c91e69c7a 100644 --- a/Mage.Sets/src/mage/cards/o/Omnibian.java +++ b/Mage.Sets/src/mage/cards/o/Omnibian.java @@ -41,6 +41,7 @@ import mage.constants.Duration; import mage.constants.Zone; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; import mage.target.common.TargetCreaturePermanent; /** @@ -57,7 +58,9 @@ public class Omnibian extends CardImpl { this.toughness = new MageInt(3); // {T}: Target creature becomes a 3/3 Frog until end of turn. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureTargetEffect(new OmnibianFrogToken(), false, false, Duration.EndOfTurn), new TapSourceCost()); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureTargetEffect( + new CreatureToken(3, 3, "3/3 Frog", SubType.FROG), + false, false, Duration.EndOfTurn), new TapSourceCost()); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); } @@ -70,21 +73,4 @@ public class Omnibian extends CardImpl { public Omnibian copy() { return new Omnibian(this); } -} - -class OmnibianFrogToken extends TokenImpl { - - public OmnibianFrogToken() { - super("", "3/3 Frog"); - this.subtype.add(SubType.FROG); - this.power = new MageInt(3); - this.toughness = new MageInt(3); - } - public OmnibianFrogToken(final OmnibianFrogToken token) { - super(token); - } - - public OmnibianFrogToken copy() { - return new OmnibianFrogToken(this); - } -} +} \ No newline at end of file diff --git a/Mage/src/main/java/mage/game/permanent/token/custom/CreatureToken.java b/Mage/src/main/java/mage/game/permanent/token/custom/CreatureToken.java index d7cd2e4527e..26a7c3bbb9b 100644 --- a/Mage/src/main/java/mage/game/permanent/token/custom/CreatureToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/custom/CreatureToken.java @@ -2,7 +2,9 @@ package mage.game.permanent.token.custom; import mage.MageInt; import mage.constants.CardType; +import mage.constants.SubType; import mage.game.permanent.token.TokenImpl; +import mage.util.SubTypeList; /** * @@ -15,8 +17,21 @@ public class CreatureToken extends TokenImpl { } public CreatureToken(int power, int toughness) { - super("", String.format("%d/%d creature", power, toughness)); + this(power, toughness, String.format("%d/%d creature", power, toughness)); + } + + public CreatureToken(int power, int toughness, String description) { + this(power, toughness, description, (SubTypeList) null); + } + + public CreatureToken(int power, int toughness, String description, SubType extraSubType) { + this(power, toughness, description, new SubTypeList(extraSubType)); + } + + public CreatureToken(int power, int toughness, String description, SubTypeList extraSubTypes) { + super("", description); this.cardType.add(CardType.CREATURE); + this.subtype.addAll(extraSubTypes); this.power = new MageInt(power); this.toughness = new MageInt(toughness); } diff --git a/Mage/src/main/java/mage/util/SubTypeList.java b/Mage/src/main/java/mage/util/SubTypeList.java index cf6fd8ef9e8..84b4fa74912 100644 --- a/Mage/src/main/java/mage/util/SubTypeList.java +++ b/Mage/src/main/java/mage/util/SubTypeList.java @@ -10,7 +10,15 @@ import java.util.stream.Collectors; public class SubTypeList extends ArrayList { + public SubTypeList(SubType firstSubType) { + super(); + this.add(firstSubType); + } + public SubTypeList(SubType... subTypesList) { + super(); + Collections.addAll(this, subTypesList); + } @Deprecated public boolean addAll(List subtypes) { From 7d8c9f5b132ba591222b2ee69c9cc186a8693323 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sat, 5 May 2018 17:32:01 +0400 Subject: [PATCH 069/158] Small fixes --- .../java/mage/game/permanent/token/custom/CreatureToken.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Mage/src/main/java/mage/game/permanent/token/custom/CreatureToken.java b/Mage/src/main/java/mage/game/permanent/token/custom/CreatureToken.java index 26a7c3bbb9b..0cbe256802a 100644 --- a/Mage/src/main/java/mage/game/permanent/token/custom/CreatureToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/custom/CreatureToken.java @@ -31,9 +31,12 @@ public class CreatureToken extends TokenImpl { public CreatureToken(int power, int toughness, String description, SubTypeList extraSubTypes) { super("", description); this.cardType.add(CardType.CREATURE); - this.subtype.addAll(extraSubTypes); this.power = new MageInt(power); this.toughness = new MageInt(toughness); + + if (extraSubTypes != null) { + this.subtype.addAll(extraSubTypes); + } } public CreatureToken(final CreatureToken token) { From 69ba8cada46e36824db09a2df4ed41abf7dd962b Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sat, 5 May 2018 19:18:12 +0400 Subject: [PATCH 070/158] Refactoring: replace custom creature tokens with basic class --- Mage.Sets/src/mage/cards/h/HostileDesert.java | 25 ++-------- Mage.Sets/src/mage/cards/i/IgnitionTeam.java | 26 ++-------- Mage.Sets/src/mage/cards/r/RagingRavine.java | 28 +++-------- .../src/mage/cards/s/SkarrgGuildmage.java | 26 ++-------- .../src/mage/cards/v/VastwoodZendikon.java | 26 +++------- .../permanent/token/custom/CreatureToken.java | 2 +- .../token/custom/ElementalCreatureToken.java | 48 +++++++++++++++++++ 7 files changed, 76 insertions(+), 105 deletions(-) create mode 100644 Mage/src/main/java/mage/game/permanent/token/custom/ElementalCreatureToken.java diff --git a/Mage.Sets/src/mage/cards/h/HostileDesert.java b/Mage.Sets/src/mage/cards/h/HostileDesert.java index 135d8248271..bae75868292 100644 --- a/Mage.Sets/src/mage/cards/h/HostileDesert.java +++ b/Mage.Sets/src/mage/cards/h/HostileDesert.java @@ -44,6 +44,7 @@ import mage.constants.Zone; import mage.filter.common.FilterLandCard; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.ElementalCreatureToken; import mage.target.common.TargetCardInYourGraveyard; /** @@ -60,7 +61,9 @@ public class HostileDesert extends CardImpl { // {T}: Add {C}. addAbility(new ColorlessManaAbility()); // {2}, Exile a land card from your graveyard: Hostile Desert becomes a 3/4 Elemental creature until end of turn. It's still a land. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureSourceEffect(new HostileDesertToken(), "land", Duration.EndOfTurn), new GenericManaCost(2)); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureSourceEffect( + new ElementalCreatureToken(3, 4, "3/4 Elemental creature"), + "land", Duration.EndOfTurn), new GenericManaCost(2)); ability.addCost(new ExileFromGraveCost(new TargetCardInYourGraveyard(new FilterLandCard("land card from your graveyard")))); addAbility(ability); } @@ -73,22 +76,4 @@ public class HostileDesert extends CardImpl { public HostileDesert copy() { return new HostileDesert(this); } -} - -class HostileDesertToken extends TokenImpl { - - public HostileDesertToken() { - super("", "3/4 elemental creature"); - cardType.add(CardType.CREATURE); - subtype.add(SubType.ELEMENTAL); - power = new MageInt(3); - toughness = new MageInt(4); - } - public HostileDesertToken(final HostileDesertToken token) { - super(token); - } - - public HostileDesertToken copy() { - return new HostileDesertToken(this); - } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/i/IgnitionTeam.java b/Mage.Sets/src/mage/cards/i/IgnitionTeam.java index 84132dab69e..a4fa959347a 100644 --- a/Mage.Sets/src/mage/cards/i/IgnitionTeam.java +++ b/Mage.Sets/src/mage/cards/i/IgnitionTeam.java @@ -29,6 +29,7 @@ package mage.cards.i; import java.util.UUID; import mage.MageInt; +import mage.ObjectColor; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.SimpleActivatedAbility; @@ -50,6 +51,7 @@ import mage.filter.predicate.permanent.TappedPredicate; import mage.game.Game; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.ElementalCreatureToken; import mage.target.common.TargetLandPermanent; /** @@ -72,7 +74,9 @@ public class IgnitionTeam extends CardImpl { "with X +1/+1 counters on it, where X is the number of tapped lands on the battlefield.")); // {2}{R}, Remove a +1/+1 counter from Ignition Team: Target land becomes a 4/4 red Elemental creature until end of turn. It's still a land. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureTargetEffect(new IgnitionTeamToken(), false, true, Duration.EndOfTurn), new ManaCostsImpl("{2}{R}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureTargetEffect( + new ElementalCreatureToken(4, 4, "4/4 red Elemental creature", new ObjectColor("R")), + false, true, Duration.EndOfTurn), new ManaCostsImpl("{2}{R}")); ability.addCost(new RemoveCountersSourceCost(CounterType.P1P1.createInstance(1))); ability.addTarget(new TargetLandPermanent()); this.addAbility(ability); @@ -115,24 +119,4 @@ class TappedLandsCount implements DynamicValue { public String getMessage() { return "tapped lands on the battlefield"; } -} - -class IgnitionTeamToken extends TokenImpl { - - public IgnitionTeamToken() { - super("", "4/4 red Elemental creature"); - this.cardType.add(CardType.CREATURE); - this.getSubtype(null).add(SubType.ELEMENTAL); - this.color.setRed(true); - - this.power = new MageInt(4); - this.toughness = new MageInt(4); - } - public IgnitionTeamToken(final IgnitionTeamToken token) { - super(token); - } - - public IgnitionTeamToken copy() { - return new IgnitionTeamToken(this); - } } \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/r/RagingRavine.java b/Mage.Sets/src/mage/cards/r/RagingRavine.java index 035b2aab59d..099b2e85336 100644 --- a/Mage.Sets/src/mage/cards/r/RagingRavine.java +++ b/Mage.Sets/src/mage/cards/r/RagingRavine.java @@ -30,6 +30,7 @@ package mage.cards.r; import java.util.UUID; import mage.MageInt; +import mage.ObjectColor; import mage.abilities.Ability; import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.common.EntersBattlefieldTappedAbility; @@ -50,6 +51,7 @@ import mage.constants.Zone; import mage.counters.CounterType; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.ElementalCreatureToken; /** * @@ -65,7 +67,9 @@ public class RagingRavine extends CardImpl { // Tap: Add Red or Green. this.addAbility(new GreenManaAbility()); this.addAbility(new RedManaAbility()); - Effect effect = new BecomesCreatureSourceEffect(new RagingRavineToken(), "land", Duration.EndOfTurn); + Effect effect = new BecomesCreatureSourceEffect( + new ElementalCreatureToken(3, 3, "3/3 red and green Elemental creature", new ObjectColor("RG")), + "land", Duration.EndOfTurn); effect.setText("Until end of turn, {this} becomes a 3/3 red and green Elemental creature"); // {2}{R}{G}: Until end of turn, Raging Ravine becomes a 3/3 red and green Elemental creature with "Whenever this creature attacks, put a +1/+1 counter on it." It's still a land. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{2}{R}{G}")); @@ -84,24 +88,4 @@ public class RagingRavine extends CardImpl { return new RagingRavine(this); } -} - -class RagingRavineToken extends TokenImpl { - - public RagingRavineToken() { - super("", "3/3 red and green Elemental creature"); - cardType.add(CardType.CREATURE); - subtype.add(SubType.ELEMENTAL); - color.setRed(true); - color.setGreen(true); - power = new MageInt(3); - toughness = new MageInt(3); - } - public RagingRavineToken(final RagingRavineToken token) { - super(token); - } - - public RagingRavineToken copy() { - return new RagingRavineToken(this); - } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/s/SkarrgGuildmage.java b/Mage.Sets/src/mage/cards/s/SkarrgGuildmage.java index c21d85e4de8..cb82b89b267 100644 --- a/Mage.Sets/src/mage/cards/s/SkarrgGuildmage.java +++ b/Mage.Sets/src/mage/cards/s/SkarrgGuildmage.java @@ -45,6 +45,7 @@ import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.common.FilterControlledLandPermanent; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.ElementalCreatureToken; import mage.target.TargetPermanent; /** @@ -66,7 +67,9 @@ public class SkarrgGuildmage extends CardImpl { Zone.BATTLEFIELD, new GainAbilityAllEffect(TrampleAbility.getInstance(), Duration.EndOfTurn, new FilterControlledCreaturePermanent(), "Creatures you control gain trample until end of turn"), new ManaCostsImpl("{R}{G}"))); // {1}{R}{G}: Target land you control becomes a 4/4 Elemental creature until end of turn. It's still a land. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureTargetEffect(new SkarrgGuildmageToken(), false, true, Duration.EndOfTurn), new ManaCostsImpl("{1}{R}{G}") ); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureTargetEffect( + new ElementalCreatureToken(4, 4, "4/4 Elemental creature"), + false, true, Duration.EndOfTurn), new ManaCostsImpl("{1}{R}{G}") ); ability.addTarget(new TargetPermanent(new FilterControlledLandPermanent())); this.addAbility(ability); @@ -80,23 +83,4 @@ public class SkarrgGuildmage extends CardImpl { public SkarrgGuildmage copy() { return new SkarrgGuildmage(this); } -} - -class SkarrgGuildmageToken extends TokenImpl { - - public SkarrgGuildmageToken() { - super("", "4/4 Elemental creature"); - this.cardType.add(CardType.CREATURE); - - this.subtype.add(SubType.ELEMENTAL); - this.power = new MageInt(4); - this.toughness = new MageInt(4); - } - public SkarrgGuildmageToken(final SkarrgGuildmageToken token) { - super(token); - } - - public SkarrgGuildmageToken copy() { - return new SkarrgGuildmageToken(this); - } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/v/VastwoodZendikon.java b/Mage.Sets/src/mage/cards/v/VastwoodZendikon.java index 23acc3dda63..2e667eb368c 100644 --- a/Mage.Sets/src/mage/cards/v/VastwoodZendikon.java +++ b/Mage.Sets/src/mage/cards/v/VastwoodZendikon.java @@ -29,6 +29,7 @@ package mage.cards.v; import java.util.UUID; import mage.MageInt; +import mage.ObjectColor; import mage.abilities.Ability; import mage.abilities.common.DiesAttachedTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; @@ -41,6 +42,7 @@ import mage.cards.CardSetInfo; import mage.constants.*; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.ElementalCreatureToken; import mage.target.TargetPermanent; import mage.target.common.TargetLandPermanent; @@ -65,7 +67,9 @@ public class VastwoodZendikon extends CardImpl { Ability ability = new EnchantAbility(auraTarget.getTargetName()); this.addAbility(ability); - Ability ability2 = new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesCreatureAttachedEffect(new VastwoodElementalToken(), "Enchanted land is a 6/4 green Elemental creature. It's still a land", Duration.WhileOnBattlefield )); + Ability ability2 = new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesCreatureAttachedEffect( + new ElementalCreatureToken(6, 4, "6/4 green Elemental creature", new ObjectColor("G")), + "Enchanted land is a 6/4 green Elemental creature. It's still a land", Duration.WhileOnBattlefield )); this.addAbility(ability2); Ability ability3 = new DiesAttachedTriggeredAbility(new ReturnToHandAttachedEffect(), "enchanted land", false); @@ -80,22 +84,4 @@ public class VastwoodZendikon extends CardImpl { public VastwoodZendikon copy() { return new VastwoodZendikon(this); } -} - -class VastwoodElementalToken extends TokenImpl { - VastwoodElementalToken() { - super("", "6/4 green Elemental creature"); - cardType.add(CardType.CREATURE); - color.setGreen(true); - subtype.add(SubType.ELEMENTAL); - power = new MageInt(6); - toughness = new MageInt(4); - } - public VastwoodElementalToken(final VastwoodElementalToken token) { - super(token); - } - - public VastwoodElementalToken copy() { - return new VastwoodElementalToken(this); - } -} +} \ No newline at end of file diff --git a/Mage/src/main/java/mage/game/permanent/token/custom/CreatureToken.java b/Mage/src/main/java/mage/game/permanent/token/custom/CreatureToken.java index 0cbe256802a..ed54559d736 100644 --- a/Mage/src/main/java/mage/game/permanent/token/custom/CreatureToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/custom/CreatureToken.java @@ -10,7 +10,7 @@ import mage.util.SubTypeList; * * @author JayDi85 */ -public class CreatureToken extends TokenImpl { +public class CreatureToken extends TokenImpl { public CreatureToken() { this(0, 0); diff --git a/Mage/src/main/java/mage/game/permanent/token/custom/ElementalCreatureToken.java b/Mage/src/main/java/mage/game/permanent/token/custom/ElementalCreatureToken.java new file mode 100644 index 00000000000..125bbbd8ee6 --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/custom/ElementalCreatureToken.java @@ -0,0 +1,48 @@ +package mage.game.permanent.token.custom; + +import mage.MageInt; +import mage.ObjectColor; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.game.permanent.token.TokenImpl; +import mage.util.SubTypeList; + +/** + * + * @author JayDi85 + */ +public class ElementalCreatureToken extends TokenImpl { + + public ElementalCreatureToken() { + this(0, 0); + } + + public ElementalCreatureToken(int power, int toughness) { + this(power, toughness, String.format("%d/%d Elemental creature", power, toughness)); + } + + public ElementalCreatureToken(int power, int toughness, String description) { + this(power, toughness, description, (ObjectColor) null); + } + + public ElementalCreatureToken(int power, int toughness, String description, ObjectColor color) { + super("", description); + this.cardType.add(CardType.CREATURE); + this.subtype.add(SubType.ELEMENTAL); + + this.power = new MageInt(power); + this.toughness = new MageInt(toughness); + + if (color != null) { + this.color.addColor(color); + } + } + + public ElementalCreatureToken(final ElementalCreatureToken token) { + super(token); + } + + public ElementalCreatureToken copy() { + return new ElementalCreatureToken(this); + } +} From 51d29c333f85503b40d25b275924b85487029735 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Sat, 5 May 2018 11:45:54 -0400 Subject: [PATCH 071/158] Implemented Battlefield Medic --- .../src/mage/cards/b/BattlefieldMedic.java | 92 +++++++++++++++++++ Mage.Sets/src/mage/sets/Onslaught.java | 1 + 2 files changed, 93 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/b/BattlefieldMedic.java diff --git a/Mage.Sets/src/mage/cards/b/BattlefieldMedic.java b/Mage.Sets/src/mage/cards/b/BattlefieldMedic.java new file mode 100644 index 00000000000..be51f7cec66 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BattlefieldMedic.java @@ -0,0 +1,92 @@ +/* + * 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.b; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; +import mage.abilities.effects.common.PreventDamageToTargetEffect; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public class BattlefieldMedic extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(); + + static { + filter.add(new SubtypePredicate(SubType.CLERIC)); + } + + public BattlefieldMedic(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.CLERIC); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {tap}: Prevent the next X damage that would be dealt to target creature this turn, where X is the number of Clerics on the battlefield. + Ability ability = new SimpleActivatedAbility( + new PreventDamageToTargetEffect( + Duration.EndOfTurn, + false, + true, + new PermanentsOnBattlefieldCount() + ).setText( + "prevent the next X damage " + + "that would be dealt to target creature this turn, " + + "where X is the number of Clerics on the battlefield" + ), + new TapSourceCost() + ); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public BattlefieldMedic(final BattlefieldMedic card) { + super(card); + } + + @Override + public BattlefieldMedic copy() { + return new BattlefieldMedic(this); + } +} diff --git a/Mage.Sets/src/mage/sets/Onslaught.java b/Mage.Sets/src/mage/sets/Onslaught.java index 3e347f9fdf0..988e09a1a3c 100644 --- a/Mage.Sets/src/mage/sets/Onslaught.java +++ b/Mage.Sets/src/mage/sets/Onslaught.java @@ -51,6 +51,7 @@ public class Onslaught extends ExpansionSet { cards.add(new SetCardInfo("Barkhide Mauler", 246, Rarity.COMMON, mage.cards.b.BarkhideMauler.class)); cards.add(new SetCardInfo("Barren Moor", 312, Rarity.COMMON, mage.cards.b.BarrenMoor.class)); cards.add(new SetCardInfo("Battering Craghorn", 188, Rarity.COMMON, mage.cards.b.BatteringCraghorn.class)); + cards.add(new SetCardInfo("Battlefield Medic", 9, Rarity.COMMON, mage.cards.b.BattlefieldMedic.class)); cards.add(new SetCardInfo("Biorhythm", 247, Rarity.RARE, mage.cards.b.Biorhythm.class)); cards.add(new SetCardInfo("Birchlore Rangers", 248, Rarity.COMMON, mage.cards.b.BirchloreRangers.class)); cards.add(new SetCardInfo("Blackmail", 127, Rarity.UNCOMMON, mage.cards.b.Blackmail.class)); From 5ecc49078ea178ac255e499f545a5189cf4e260f Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Sat, 5 May 2018 13:26:07 -0400 Subject: [PATCH 072/158] Implemented Snapping Thragg --- .../src/mage/cards/s/SnappingThragg.java | 117 ++++++++++++++++++ Mage.Sets/src/mage/sets/Onslaught.java | 1 + 2 files changed, 118 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/SnappingThragg.java diff --git a/Mage.Sets/src/mage/cards/s/SnappingThragg.java b/Mage.Sets/src/mage/cards/s/SnappingThragg.java new file mode 100644 index 00000000000..6fb17f61b7e --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SnappingThragg.java @@ -0,0 +1,117 @@ +/* + * 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.s; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.TriggeredAbilityImpl; +import mage.constants.SubType; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.keyword.MorphAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.ControllerIdPredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.players.Player; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public class SnappingThragg extends CardImpl { + + public SnappingThragg(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{R}"); + + this.subtype.add(SubType.BEAST); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Whenever Snapping Thragg deals combat damage to a player, you may have it deal 3 damage to target creature that player controls. + this.addAbility(new SnappingThraggTriggeredAbility()); + + // Morph {4}{R}{R} + this.addAbility(new MorphAbility(this, new ManaCostsImpl("{4}{R}{R}"))); + + } + + public SnappingThragg(final SnappingThragg card) { + super(card); + } + + @Override + public SnappingThragg copy() { + return new SnappingThragg(this); + } +} + +class SnappingThraggTriggeredAbility extends TriggeredAbilityImpl { + + public SnappingThraggTriggeredAbility() { + super(Zone.BATTLEFIELD, new DamageTargetEffect(3), true); + this.addTarget(new TargetCreaturePermanent()); + } + + public SnappingThraggTriggeredAbility(final SnappingThraggTriggeredAbility ability) { + super(ability); + } + + @Override + public SnappingThraggTriggeredAbility copy() { + return new SnappingThraggTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.DAMAGED_PLAYER; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + Player opponent = game.getPlayer(event.getPlayerId()); + if (opponent != null && event.getSourceId().equals(this.sourceId)) { + FilterCreaturePermanent filter = new FilterCreaturePermanent("creature " + opponent.getLogName() + " controls"); + filter.add(new ControllerIdPredicate(opponent.getId())); + this.getTargets().clear(); + this.addTarget(new TargetCreaturePermanent(filter)); + return true; + } + return false; + } + + @Override + public String getRule() { + return "Whenever {this} deals combat damage to a player, you may have it deal 3 damage to target creature that player controls"; + } +} diff --git a/Mage.Sets/src/mage/sets/Onslaught.java b/Mage.Sets/src/mage/sets/Onslaught.java index 988e09a1a3c..97a8bab7b90 100644 --- a/Mage.Sets/src/mage/sets/Onslaught.java +++ b/Mage.Sets/src/mage/sets/Onslaught.java @@ -286,6 +286,7 @@ public class Onslaught extends ExpansionSet { cards.add(new SetCardInfo("Slice and Dice", 232, Rarity.UNCOMMON, mage.cards.s.SliceAndDice.class)); cards.add(new SetCardInfo("Slipstream Eel", 114, Rarity.COMMON, mage.cards.s.SlipstreamEel.class)); cards.add(new SetCardInfo("Smother", 170, Rarity.UNCOMMON, mage.cards.s.Smother.class)); + cards.add(new SetCardInfo("Snapping Thragg", 233, Rarity.UNCOMMON, mage.cards.s.SnappingThragg.class)); cards.add(new SetCardInfo("Snarling Undorak", 283, Rarity.COMMON, mage.cards.s.SnarlingUndorak.class)); cards.add(new SetCardInfo("Solar Blast", 234, Rarity.COMMON, mage.cards.s.SolarBlast.class)); cards.add(new SetCardInfo("Soulless One", 171, Rarity.UNCOMMON, mage.cards.s.SoullessOne.class)); From 427461ebb0efc7f900bf4b572b8218120fba540f Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Sat, 5 May 2018 13:58:59 -0400 Subject: [PATCH 073/158] Implemented Aven Warcraft --- Mage.Sets/src/mage/cards/a/AvenWarcraft.java | 97 ++++++++++++++++++++ Mage.Sets/src/mage/sets/Judgment.java | 1 + 2 files changed, 98 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/a/AvenWarcraft.java diff --git a/Mage.Sets/src/mage/cards/a/AvenWarcraft.java b/Mage.Sets/src/mage/cards/a/AvenWarcraft.java new file mode 100644 index 00000000000..1cc4c5f933e --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AvenWarcraft.java @@ -0,0 +1,97 @@ +/* + * 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.a; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.condition.common.CardsInControllerGraveCondition; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.abilities.effects.common.continuous.GainProtectionFromColorAllEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.filter.StaticFilters; +import mage.game.Game; + +/** + * + * @author TheElk801 + */ +public class AvenWarcraft extends CardImpl { + + public AvenWarcraft(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{W}"); + + // Creatures you control get +0/+2 until end of turn. + this.getSpellAbility().addEffect(new BoostControlledEffect(0, 2, Duration.EndOfTurn)); + + // Threshold - If seven or more cards are in your graveyard, choose a color. Creatures you control also gain protection from the chosen color until end of turn. + this.getSpellAbility().addEffect(new AvenWarcraftEffect()); + } + + public AvenWarcraft(final AvenWarcraft card) { + super(card); + } + + @Override + public AvenWarcraft copy() { + return new AvenWarcraft(this); + } +} + +class AvenWarcraftEffect extends OneShotEffect { + + AvenWarcraftEffect() { + super(Outcome.Benefit); + this.staticText = "

Threshold — If seven or more cards are in your graveyard, " + + "choose a color. Creatures you control also gain protection from the chosen color until end of turn"; + } + + AvenWarcraftEffect(final AvenWarcraftEffect effect) { + super(effect); + } + + @Override + public AvenWarcraftEffect copy() { + return new AvenWarcraftEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + if (new CardsInControllerGraveCondition(7).apply(game, source)) { + game.addEffect(new GainProtectionFromColorAllEffect( + Duration.EndOfTurn, + StaticFilters.FILTER_CONTROLLED_CREATURES + ), source); + } + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/Judgment.java b/Mage.Sets/src/mage/sets/Judgment.java index 7273117178c..f6990c39801 100644 --- a/Mage.Sets/src/mage/sets/Judgment.java +++ b/Mage.Sets/src/mage/sets/Judgment.java @@ -61,6 +61,7 @@ public class Judgment extends ExpansionSet { cards.add(new SetCardInfo("Anurid Swarmsnapper", 105, Rarity.UNCOMMON, mage.cards.a.AnuridSwarmsnapper.class)); cards.add(new SetCardInfo("Arcane Teachings", 78, Rarity.COMMON, mage.cards.a.ArcaneTeachings.class)); cards.add(new SetCardInfo("Aven Fogbringer", 34, Rarity.COMMON, mage.cards.a.AvenFogbringer.class)); + cards.add(new SetCardInfo("Aven Warcraft", 2, Rarity.UNCOMMON, mage.cards.a.AvenWarcraft.class)); cards.add(new SetCardInfo("Balthor the Defiled", 61, Rarity.RARE, mage.cards.b.BalthorTheDefiled.class)); cards.add(new SetCardInfo("Battle Screech", 3, Rarity.UNCOMMON, mage.cards.b.BattleScreech.class)); cards.add(new SetCardInfo("Battlefield Scrounger", 106, Rarity.COMMON, mage.cards.b.BattlefieldScrounger.class)); From 24829c83a4fdc399d32c27a83d85d7e6b3de6456 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Sat, 5 May 2018 13:59:43 -0400 Subject: [PATCH 074/158] fixed Battlefield Medic --- Mage.Sets/src/mage/cards/b/BattlefieldMedic.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/b/BattlefieldMedic.java b/Mage.Sets/src/mage/cards/b/BattlefieldMedic.java index be51f7cec66..e6376fe784e 100644 --- a/Mage.Sets/src/mage/cards/b/BattlefieldMedic.java +++ b/Mage.Sets/src/mage/cards/b/BattlefieldMedic.java @@ -69,7 +69,7 @@ public class BattlefieldMedic extends CardImpl { Duration.EndOfTurn, false, true, - new PermanentsOnBattlefieldCount() + new PermanentsOnBattlefieldCount(filter) ).setText( "prevent the next X damage " + "that would be dealt to target creature this turn, " From 7edcec0dc12e60c47834670250bbd6c28ac84d5b Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Sat, 5 May 2018 14:05:04 -0400 Subject: [PATCH 075/158] fixed ability word text formatting --- .../src/mage/cards/a/AerieWorshippers.java | 2 +- Mage.Sets/src/mage/cards/a/AkoumHellkite.java | 2 +- .../src/mage/cards/a/AkroanConscriptor.java | 2 +- .../src/mage/cards/a/AkroanSkyguard.java | 2 +- .../src/mage/cards/a/AllianceOfArms.java | 2 +- .../src/mage/cards/a/AnthemOfRakdos.java | 2 +- .../mage/cards/a/AnthousaSetessanHero.java | 2 +- .../mage/cards/a/ArahboRoarOfTheWorld.java | 2 +- .../src/mage/cards/a/ArbiterOfTheIdeal.java | 2 +- .../src/mage/cards/a/ArtisanOfForms.java | 2 +- Mage.Sets/src/mage/cards/a/AshioksAdept.java | 2 +- .../src/mage/cards/a/AtarkaBeastbreaker.java | 2 +- .../src/mage/cards/a/AtarkaPummeler.java | 2 +- .../mage/cards/b/BellowingSaddlebrute.java | 2 +- .../src/mage/cards/b/BiteOfTheBlackRose.java | 2 +- .../src/mage/cards/b/BloodsoakedChampion.java | 2 +- Mage.Sets/src/mage/cards/c/CabalRitual.java | 2 +- .../src/mage/cards/c/CacklingFlames.java | 2 +- .../src/mage/cards/c/ChorusOfTheTides.java | 2 +- .../src/mage/cards/c/CircleOfElders.java | 2 +- .../src/mage/cards/c/CoercivePortal.java | 2 +- .../src/mage/cards/c/CollectiveVoyage.java | 2 +- .../src/mage/cards/c/CraterElemental.java | 2 +- Mage.Sets/src/mage/cards/c/CratersClaws.java | 2 +- .../src/mage/cards/c/CrystallineCrawler.java | 2 +- Mage.Sets/src/mage/cards/c/CustodiSquire.java | 2 +- .../src/mage/cards/c/CutthroatIlDal.java | 2 +- Mage.Sets/src/mage/cards/d/DarkPetition.java | 4 +- .../src/mage/cards/d/DeadeyeRigHauler.java | 2 +- .../src/mage/cards/d/DeadeyeTormentor.java | 2 +- .../src/mage/cards/d/DeepwaterHypnotist.java | 2 +- Mage.Sets/src/mage/cards/d/Demonfire.java | 2 +- Mage.Sets/src/mage/cards/d/DemonsJester.java | 2 +- Mage.Sets/src/mage/cards/d/Demoralize.java | 2 +- Mage.Sets/src/mage/cards/d/Draco.java | 2 +- .../src/mage/cards/d/DragonScarredBear.java | 2 +- .../src/mage/cards/d/DragonWhisperer.java | 2 +- Mage.Sets/src/mage/cards/e/EdgarMarkov.java | 2 +- .../src/mage/cards/e/EliteSkirmisher.java | 2 +- .../src/mage/cards/e/EmbodimentOfFury.java | 2 +- .../src/mage/cards/e/EmbodimentOfInsight.java | 2 +- Mage.Sets/src/mage/cards/e/Epicenter.java | 2 +- .../src/mage/cards/e/EtchedChampion.java | 2 +- .../src/mage/cards/e/ExquisiteFirecraft.java | 2 +- Mage.Sets/src/mage/cards/f/FaithsShield.java | 2 +- Mage.Sets/src/mage/cards/f/FarWanderings.java | 2 +- .../src/mage/cards/f/FelhideSpiritbinder.java | 2 +- .../src/mage/cards/f/FlamewakePhoenix.java | 2 +- Mage.Sets/src/mage/cards/f/ForceAway.java | 2 +- Mage.Sets/src/mage/cards/f/ForceDenial.java | 2 +- .../src/mage/cards/f/ForlornPseudamma.java | 2 +- .../src/mage/cards/f/FrontierMastodon.java | 2 +- Mage.Sets/src/mage/cards/g/GathanRaiders.java | 2 +- .../mage/cards/g/GeistOfTheLonelyVigil.java | 2 +- .../src/mage/cards/g/GeyserfieldStalker.java | 2 +- .../src/mage/cards/g/GideonsPhalanx.java | 4 +- Mage.Sets/src/mage/cards/g/GladeWatcher.java | 2 +- .../src/mage/cards/g/GobhobblerRats.java | 2 +- .../src/mage/cards/g/GodFavoredGeneral.java | 2 +- Mage.Sets/src/mage/cards/g/GrizzlyFate.java | 2 +- .../src/mage/cards/g/GuardianOfTazeem.java | 4 +- .../src/mage/cards/h/HeartlashCinder.java | 2 +- .../src/mage/cards/h/HeirOfTheWilds.java | 2 +- .../src/mage/cards/h/HeroOfGomaFada.java | 2 +- Mage.Sets/src/mage/cards/h/HeroOfIroas.java | 2 +- .../src/mage/cards/h/HeroOfLeinaTower.java | 2 +- .../src/mage/cards/h/HowlOfTheHorde.java | 4 +- Mage.Sets/src/mage/cards/i/IcyBlast.java | 2 +- .../mage/cards/i/InallaArchmageRitualist.java | 2 +- Mage.Sets/src/mage/cards/i/InfernalTutor.java | 2 +- .../mage/cards/i/InfuseWithTheElements.java | 2 +- Mage.Sets/src/mage/cards/j/JaddiOffshoot.java | 2 +- Mage.Sets/src/mage/cards/j/JaggedPoppet.java | 2 +- .../src/mage/cards/k/KalastriaHealer.java | 2 +- Mage.Sets/src/mage/cards/k/KirtarsWrath.java | 2 +- Mage.Sets/src/mage/cards/k/KragmaButcher.java | 2 +- Mage.Sets/src/mage/cards/l/LanternScout.java | 2 +- .../src/mage/cards/l/LightFromWithin.java | 2 +- .../src/mage/cards/l/LightningSurge.java | 2 +- Mage.Sets/src/mage/cards/l/LurkingArynx.java | 2 +- .../src/mage/cards/m/MagisterOfWorth.java | 2 +- .../src/mage/cards/m/MaliciousAffliction.java | 2 +- .../src/mage/cards/m/MarduHeartPiercer.java | 2 +- .../src/mage/cards/m/MarduHordechief.java | 2 +- .../src/mage/cards/m/MarduSkullhunter.java | 2 +- .../src/mage/cards/m/MeletisAstronomer.java | 2 +- Mage.Sets/src/mage/cards/m/Mindreaver.java | 2 +- Mage.Sets/src/mage/cards/m/MindsAglow.java | 2 +- Mage.Sets/src/mage/cards/m/MoltenPsyche.java | 2 +- Mage.Sets/src/mage/cards/m/MurasaRanger.java | 2 +- .../src/mage/cards/n/NavigatorsRuin.java | 2 +- .../src/mage/cards/n/NecromanticSummons.java | 4 +- .../src/mage/cards/o/OmnathLocusOfRage.java | 2 +- Mage.Sets/src/mage/cards/o/OranRiefHydra.java | 4 +- .../src/mage/cards/o/OreskosSunGuide.java | 2 +- Mage.Sets/src/mage/cards/o/OutrageShaman.java | 2 +- Mage.Sets/src/mage/cards/p/PainSeer.java | 2 +- Mage.Sets/src/mage/cards/p/PainfulTruths.java | 2 +- .../src/mage/cards/p/PheresBandRaiders.java | 2 +- .../src/mage/cards/p/PheresBandTromper.java | 2 +- .../src/mage/cards/p/PhosphorescentFeast.java | 2 +- Mage.Sets/src/mage/cards/p/PredatorsHowl.java | 2 +- Mage.Sets/src/mage/cards/p/Primalcrux.java | 2 +- Mage.Sets/src/mage/cards/p/PrismArray.java | 2 +- Mage.Sets/src/mage/cards/p/ProteanRaider.java | 2 +- Mage.Sets/src/mage/cards/r/RaidersWake.java | 2 +- Mage.Sets/src/mage/cards/r/RancidEarth.java | 2 +- .../src/mage/cards/r/RetreatToEmeria.java | 2 +- .../src/mage/cards/r/RoarOfChallenge.java | 2 +- Mage.Sets/src/mage/cards/r/RuinRaider.java | 2 +- .../src/mage/cards/s/SabertoothOutrider.java | 2 +- Mage.Sets/src/mage/cards/s/SatyrNyxSmith.java | 2 +- Mage.Sets/src/mage/cards/s/SavagePunch.java | 2 +- .../src/mage/cards/s/SeeTheUnwritten.java | 2 +- .../src/mage/cards/s/ServantOfTymaret.java | 2 +- .../src/mage/cards/s/SetessanOathsworn.java | 2 +- .../mage/cards/s/ShamanOfForgottenWays.java | 2 +- .../mage/cards/s/ShamanOfTheGreatHunt.java | 2 +- .../src/mage/cards/s/ShamanicRevelation.java | 2 +- Mage.Sets/src/mage/cards/s/SharedTrauma.java | 2 +- .../src/mage/cards/s/ShipwreckLooter.java | 2 +- Mage.Sets/src/mage/cards/s/ShowerOfCoals.java | 2 +- .../mage/cards/s/SirenOfTheSilentSong.java | 2 +- Mage.Sets/src/mage/cards/s/SithAssassin.java | 2 +- .../src/mage/cards/s/SlitheringShade.java | 2 +- .../src/mage/cards/s/SphinxsDisciple.java | 2 +- Mage.Sets/src/mage/cards/s/SplitDecision.java | 2 +- .../src/mage/cards/s/SpringjackShepherd.java | 2 +- .../src/mage/cards/s/StampedingElkHerd.java | 2 +- .../src/mage/cards/s/StitchTogether.java | 2 +- .../src/mage/cards/s/StormFleetAerialist.java | 2 +- Mage.Sets/src/mage/cards/s/Stratadon.java | 2 +- .../src/mage/cards/s/StubbornDenial.java | 2 +- .../src/mage/cards/s/SurrakTheHuntCaller.java | 2 +- .../src/mage/cards/s/SwaggeringCorsair.java | 2 +- .../src/mage/cards/s/SwirlingSandstorm.java | 2 +- .../src/mage/cards/t/TajuruBeastmaster.java | 2 +- .../src/mage/cards/t/TalentOfTheTelepath.java | 4 +- .../src/mage/cards/t/TemptWithDiscovery.java | 2 +- .../src/mage/cards/t/TemptWithGlory.java | 2 +- .../mage/cards/t/TemptWithImmortality.java | 2 +- .../mage/cards/t/TemptWithReflections.java | 2 +- .../src/mage/cards/t/TemptWithVengeance.java | 2 +- Mage.Sets/src/mage/cards/t/TheUrDragon.java | 2 +- Mage.Sets/src/mage/cards/t/ThermalBlast.java | 2 +- .../src/mage/cards/t/TimelyHordemate.java | 2 +- Mage.Sets/src/mage/cards/t/ToxicStench.java | 2 +- .../src/mage/cards/t/TritonFortuneHunter.java | 2 +- .../src/mage/cards/t/TrompTheDomains.java | 2 +- .../src/mage/cards/t/TunnelingGeopede.java | 2 +- Mage.Sets/src/mage/cards/t/Twinstrike.java | 2 +- Mage.Sets/src/mage/cards/t/TyrantsChoice.java | 2 +- Mage.Sets/src/mage/cards/u/UmbraStalker.java | 2 +- Mage.Sets/src/mage/cards/u/UnholyHunger.java | 4 +- .../src/mage/cards/v/ValakutPredator.java | 2 +- .../src/mage/cards/v/VanguardOfBrimaz.java | 2 +- .../src/mage/cards/w/WarNameAspirant.java | 2 +- .../src/mage/cards/w/WarchanterOfMogis.java | 2 +- .../src/mage/cards/w/WorldlyCounsel.java | 2 +- .../cards/asthough/SpendOtherManaTest.java | 2 +- .../triggers/dies/OmnathLocusOfRageTest.java | 4 +- .../test/commander/duel/AnafenzaTest.java | 2 +- .../abilityword/ConstellationAbility.java | 2 +- .../abilities/abilityword/KinshipAbility.java | 2 +- .../abilityword/LieutenantAbility.java | 4 +- .../abilities/abilityword/StriveAbility.java | 2 +- .../effects/keyword/SweepEffect.java | 2 +- .../abilities/keyword/BattalionAbility.java | 2 +- .../abilities/keyword/BloodrushAbility.java | 2 +- .../abilities/keyword/ChannelAbility.java | 2 +- .../mage/abilities/keyword/HeroicAbility.java | 2 +- .../abilities/keyword/InspiredAbility.java | 2 +- Utils/mtg-cards-data.txt | 98 +++++++++---------- 173 files changed, 231 insertions(+), 231 deletions(-) diff --git a/Mage.Sets/src/mage/cards/a/AerieWorshippers.java b/Mage.Sets/src/mage/cards/a/AerieWorshippers.java index a12c399b259..f70f0b5e64a 100644 --- a/Mage.Sets/src/mage/cards/a/AerieWorshippers.java +++ b/Mage.Sets/src/mage/cards/a/AerieWorshippers.java @@ -53,7 +53,7 @@ public class AerieWorshippers extends CardImpl { this.power = new MageInt(2); this.toughness = new MageInt(4); - // Inspired - Whenever Aerie Worshipers becomes untapped, you may pay {2}{U}. If you do, create a 2/2 blue Bird enchantment creature token with flying. + // Inspired — Whenever Aerie Worshipers becomes untapped, you may pay {2}{U}. If you do, create a 2/2 blue Bird enchantment creature token with flying. this.addAbility(new InspiredAbility(new DoIfCostPaid(new CreateTokenEffect(new AerieWorshippersBirdToken()), new ManaCostsImpl("{2}{U}")))); } diff --git a/Mage.Sets/src/mage/cards/a/AkoumHellkite.java b/Mage.Sets/src/mage/cards/a/AkoumHellkite.java index 04ac8ad3a3a..dc8b44d7815 100644 --- a/Mage.Sets/src/mage/cards/a/AkoumHellkite.java +++ b/Mage.Sets/src/mage/cards/a/AkoumHellkite.java @@ -82,7 +82,7 @@ public class AkoumHellkite extends CardImpl { class AkoumHellkiteTriggeredAbility extends TriggeredAbilityImpl { - private static final String text = "Landfall - Whenever a land enters the battlefield under your control, {this} deals 1 damage to any target. " + private static final String text = "Landfall — Whenever a land enters the battlefield under your control, {this} deals 1 damage to any target. " + "If that land is a Mountain, Akoum Hellkite deals 2 damage to that permanent or player instead."; public AkoumHellkiteTriggeredAbility() { diff --git a/Mage.Sets/src/mage/cards/a/AkroanConscriptor.java b/Mage.Sets/src/mage/cards/a/AkroanConscriptor.java index 9f0bde4a6fe..f90b399d6e0 100644 --- a/Mage.Sets/src/mage/cards/a/AkroanConscriptor.java +++ b/Mage.Sets/src/mage/cards/a/AkroanConscriptor.java @@ -65,7 +65,7 @@ public class AkroanConscriptor extends CardImpl { this.power = new MageInt(3); this.toughness = new MageInt(2); - // Heroic - Whenever you cast a spell that targets Akroan Conscriptor, gain control of another target creature until end of turn. Untap that creature. It gains haste until end of turn. + // Heroic — Whenever you cast a spell that targets Akroan Conscriptor, gain control of another target creature until end of turn. Untap that creature. It gains haste until end of turn. Ability ability = new HeroicAbility(new GainControlTargetEffect(Duration.EndOfTurn, true), false); Effect effect = new UntapTargetEffect(); effect.setText("Untap that creature"); diff --git a/Mage.Sets/src/mage/cards/a/AkroanSkyguard.java b/Mage.Sets/src/mage/cards/a/AkroanSkyguard.java index 12fb69787a2..3b8f220f03a 100644 --- a/Mage.Sets/src/mage/cards/a/AkroanSkyguard.java +++ b/Mage.Sets/src/mage/cards/a/AkroanSkyguard.java @@ -54,7 +54,7 @@ public class AkroanSkyguard extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); - // Heroic - Whenever you cast a spell that targets Akroan Skyguard, put a +1/+1 counter on Akroan Skyguard. + // Heroic — Whenever you cast a spell that targets Akroan Skyguard, put a +1/+1 counter on Akroan Skyguard. this.addAbility(new HeroicAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(), true))); } diff --git a/Mage.Sets/src/mage/cards/a/AllianceOfArms.java b/Mage.Sets/src/mage/cards/a/AllianceOfArms.java index 3263ea37668..1cef473597b 100644 --- a/Mage.Sets/src/mage/cards/a/AllianceOfArms.java +++ b/Mage.Sets/src/mage/cards/a/AllianceOfArms.java @@ -72,7 +72,7 @@ class AllianceOfArmsEffect extends OneShotEffect { public AllianceOfArmsEffect() { super(Outcome.Detriment); - this.staticText = "Join forces - Starting with you, each player may pay any amount of mana. Each player creates X 1/1 white Soldier creature tokens, where X is the total amount of mana paid this way"; + this.staticText = "Join forces — Starting with you, each player may pay any amount of mana. Each player creates X 1/1 white Soldier creature tokens, where X is the total amount of mana paid this way"; } public AllianceOfArmsEffect(final AllianceOfArmsEffect effect) { diff --git a/Mage.Sets/src/mage/cards/a/AnthemOfRakdos.java b/Mage.Sets/src/mage/cards/a/AnthemOfRakdos.java index 71625783534..34aae5aaeaa 100644 --- a/Mage.Sets/src/mage/cards/a/AnthemOfRakdos.java +++ b/Mage.Sets/src/mage/cards/a/AnthemOfRakdos.java @@ -81,7 +81,7 @@ class AnthemOfRakdosHellbentEffect extends ReplacementEffectImpl { public AnthemOfRakdosHellbentEffect() { super(Duration.WhileOnBattlefield, Outcome.Damage); - staticText = "Hellbent - As long as you have no cards in hand, if a source you control would deal damage to a permanent or player, it deals double that damage to that permanent or player instead."; + staticText = "Hellbent — As long as you have no cards in hand, if a source you control would deal damage to a permanent or player, it deals double that damage to that permanent or player instead."; } public AnthemOfRakdosHellbentEffect(final AnthemOfRakdosHellbentEffect effect) { diff --git a/Mage.Sets/src/mage/cards/a/AnthousaSetessanHero.java b/Mage.Sets/src/mage/cards/a/AnthousaSetessanHero.java index 0a3831fcd01..de8b55b25b6 100644 --- a/Mage.Sets/src/mage/cards/a/AnthousaSetessanHero.java +++ b/Mage.Sets/src/mage/cards/a/AnthousaSetessanHero.java @@ -59,7 +59,7 @@ public class AnthousaSetessanHero extends CardImpl { this.power = new MageInt(4); this.toughness = new MageInt(5); - // Heroic - Whenever you cast a spell that targets Anthousa, Setessan Hero, up to three target lands you control each become 2/2 Warrior creatures until end of turn. They're still lands. + // Heroic — Whenever you cast a spell that targets Anthousa, Setessan Hero, up to three target lands you control each become 2/2 Warrior creatures until end of turn. They're still lands. Ability ability = new HeroicAbility(new BecomesCreatureTargetEffect(new CreatureToken(2, 2, "2/2 Warrior creature", SubType.WARRIOR),false,true, Duration.EndOfTurn)); ability.addTarget(new TargetControlledPermanent(0,3,new FilterControlledLandPermanent("lands"), false)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/a/ArahboRoarOfTheWorld.java b/Mage.Sets/src/mage/cards/a/ArahboRoarOfTheWorld.java index d8feae173b7..fbf523e26ce 100644 --- a/Mage.Sets/src/mage/cards/a/ArahboRoarOfTheWorld.java +++ b/Mage.Sets/src/mage/cards/a/ArahboRoarOfTheWorld.java @@ -85,7 +85,7 @@ public class ArahboRoarOfTheWorld extends CardImpl { Ability ability = new ConditionalTriggeredAbility( new BeginningOfCombatTriggeredAbility(Zone.ALL, new BoostTargetEffect(3, 3, Duration.EndOfTurn), TargetController.YOU, false, false), SourceOnBattlefieldOrCommandZoneCondition.instance, - "Eminence - At the beginning of combat on your turn, if Arahbo, Roar of the World is in the command zone or on the battlefield, another target Cat you control gets +3/+3 until end of turn."); + "Eminence — At the beginning of combat on your turn, if Arahbo, Roar of the World is in the command zone or on the battlefield, another target Cat you control gets +3/+3 until end of turn."); ability.addTarget(new TargetCreaturePermanent(filter)); ability.setAbilityWord(AbilityWord.EMINENCE); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/a/ArbiterOfTheIdeal.java b/Mage.Sets/src/mage/cards/a/ArbiterOfTheIdeal.java index de172fddb18..44e5c7b2f03 100644 --- a/Mage.Sets/src/mage/cards/a/ArbiterOfTheIdeal.java +++ b/Mage.Sets/src/mage/cards/a/ArbiterOfTheIdeal.java @@ -62,7 +62,7 @@ public class ArbiterOfTheIdeal extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); - // Inspired - Whenever Arbiter of the Ideal becomes untapped, reveal the top card of your library. If it's an artifact, creature, or land card, you may put it onto the battlefield with a manifestation counter on it. It's an enchantment in addition to its other types. + // Inspired — Whenever Arbiter of the Ideal becomes untapped, reveal the top card of your library. If it's an artifact, creature, or land card, you may put it onto the battlefield with a manifestation counter on it. It's an enchantment in addition to its other types. this.addAbility(new InspiredAbility(new ArbiterOfTheIdealEffect())); } diff --git a/Mage.Sets/src/mage/cards/a/ArtisanOfForms.java b/Mage.Sets/src/mage/cards/a/ArtisanOfForms.java index 7b1b4a739c5..93bd5a7fe2a 100644 --- a/Mage.Sets/src/mage/cards/a/ArtisanOfForms.java +++ b/Mage.Sets/src/mage/cards/a/ArtisanOfForms.java @@ -58,7 +58,7 @@ public class ArtisanOfForms extends CardImpl { this.power = new MageInt(1); this.toughness = new MageInt(1); - // Heroic - Whenever you cast a spell that targets Artisan of Forms, you may have Artisan of Forms become a copy of target creature and gain this ability. + // Heroic — Whenever you cast a spell that targets Artisan of Forms, you may have Artisan of Forms become a copy of target creature and gain this ability. Effect effect = new CopyPermanentEffect(StaticFilters.FILTER_PERMANENT_CREATURE, new ArtisanOfFormsApplyToPermanent(), true); effect.setText("have {this} become a copy of target creature and gain this ability"); Ability ability = new HeroicAbility(effect, true); diff --git a/Mage.Sets/src/mage/cards/a/AshioksAdept.java b/Mage.Sets/src/mage/cards/a/AshioksAdept.java index 4d8e6777e44..5a734506999 100644 --- a/Mage.Sets/src/mage/cards/a/AshioksAdept.java +++ b/Mage.Sets/src/mage/cards/a/AshioksAdept.java @@ -51,7 +51,7 @@ public class AshioksAdept extends CardImpl { this.power = new MageInt(1); this.toughness = new MageInt(3); - // Heroic - Whenever you cast a spell that targets Ashiok's Adept, each opponent discards a card. + // Heroic — Whenever you cast a spell that targets Ashiok's Adept, each opponent discards a card. this.addAbility(new HeroicAbility(new DiscardEachPlayerEffect(TargetController.OPPONENT))); } diff --git a/Mage.Sets/src/mage/cards/a/AtarkaBeastbreaker.java b/Mage.Sets/src/mage/cards/a/AtarkaBeastbreaker.java index 33edee63623..efac07480c9 100644 --- a/Mage.Sets/src/mage/cards/a/AtarkaBeastbreaker.java +++ b/Mage.Sets/src/mage/cards/a/AtarkaBeastbreaker.java @@ -51,7 +51,7 @@ public class AtarkaBeastbreaker extends CardImpl { this.power = new MageInt(2); this.toughness = new MageInt(2); - // Formidable - {4}{G}: Atarka Beastbreaker gets +4/+4 until end of turn. Activate this only if creatures you control have total power 8 or greater. + // Formidable — {4}{G}: Atarka Beastbreaker gets +4/+4 until end of turn. Activate this only if creatures you control have total power 8 or greater. Ability ability = new ActivateIfConditionActivatedAbility( Zone.BATTLEFIELD, new BoostSourceEffect(4,4, Duration.EndOfTurn), diff --git a/Mage.Sets/src/mage/cards/a/AtarkaPummeler.java b/Mage.Sets/src/mage/cards/a/AtarkaPummeler.java index 631bbb377ec..e4e6a774451 100644 --- a/Mage.Sets/src/mage/cards/a/AtarkaPummeler.java +++ b/Mage.Sets/src/mage/cards/a/AtarkaPummeler.java @@ -60,7 +60,7 @@ public class AtarkaPummeler extends CardImpl { this.power = new MageInt(4); this.toughness = new MageInt(5); - // Formidable - {3}{R}{R}: Creatures you control gain menace until end of turn. Activate this ability only if creature you control have total power 8 or greater. (They can't be blocked except by two or more creatures.) + // Formidable — {3}{R}{R}: Creatures you control gain menace until end of turn. Activate this ability only if creature you control have total power 8 or greater. (They can't be blocked except by two or more creatures.) Ability ability = new ActivateIfConditionActivatedAbility( Zone.BATTLEFIELD, new GainAbilityAllEffect(new MenaceAbility(), Duration.EndOfTurn, filter), diff --git a/Mage.Sets/src/mage/cards/b/BellowingSaddlebrute.java b/Mage.Sets/src/mage/cards/b/BellowingSaddlebrute.java index 59f3558e889..eccf4bda2dd 100644 --- a/Mage.Sets/src/mage/cards/b/BellowingSaddlebrute.java +++ b/Mage.Sets/src/mage/cards/b/BellowingSaddlebrute.java @@ -58,7 +58,7 @@ public class BellowingSaddlebrute extends CardImpl { this.addAbility(new ConditionalTriggeredAbility( new EntersBattlefieldTriggeredAbility(new LoseLifeSourceControllerEffect(4)), new InvertCondition(RaidCondition.instance), - "Raid - When {this} enters the battlefield, you lose 4 life unless you attacked with a creature this turn" + "Raid — When {this} enters the battlefield, you lose 4 life unless you attacked with a creature this turn" ), new PlayerAttackedWatcher()); } diff --git a/Mage.Sets/src/mage/cards/b/BiteOfTheBlackRose.java b/Mage.Sets/src/mage/cards/b/BiteOfTheBlackRose.java index e66bf7968cf..8fb724ca755 100644 --- a/Mage.Sets/src/mage/cards/b/BiteOfTheBlackRose.java +++ b/Mage.Sets/src/mage/cards/b/BiteOfTheBlackRose.java @@ -70,7 +70,7 @@ class BiteOfTheBlackRoseEffect extends OneShotEffect { BiteOfTheBlackRoseEffect() { super(Outcome.Benefit); - this.staticText = "Will of the council - Starting with you, each player votes for sickness or psychosis. If sickness gets more votes, creatures your opponents control get -2/-2 until end of turn. If psychosis gets more votes or the vote is tied, each opponent discards two cards"; + this.staticText = "Will of the council — Starting with you, each player votes for sickness or psychosis. If sickness gets more votes, creatures your opponents control get -2/-2 until end of turn. If psychosis gets more votes or the vote is tied, each opponent discards two cards"; } BiteOfTheBlackRoseEffect(final BiteOfTheBlackRoseEffect effect) { diff --git a/Mage.Sets/src/mage/cards/b/BloodsoakedChampion.java b/Mage.Sets/src/mage/cards/b/BloodsoakedChampion.java index 3127c144a57..953b4c64c26 100644 --- a/Mage.Sets/src/mage/cards/b/BloodsoakedChampion.java +++ b/Mage.Sets/src/mage/cards/b/BloodsoakedChampion.java @@ -58,7 +58,7 @@ public class BloodsoakedChampion extends CardImpl { // Bloodstained Brave can't block. this.addAbility(new CantBlockAbility()); - // Raid - {1}{B}: Return Bloodstained Brave from your graveyard to the battlefield. Activate this ability only if you attacked with a creature this turn. + // Raid — {1}{B}: Return Bloodstained Brave from your graveyard to the battlefield. Activate this ability only if you attacked with a creature this turn. Ability ability = new ConditionalActivatedAbility( Zone.GRAVEYARD, new ReturnSourceFromGraveyardToBattlefieldEffect(), diff --git a/Mage.Sets/src/mage/cards/c/CabalRitual.java b/Mage.Sets/src/mage/cards/c/CabalRitual.java index 11d69bd7854..9068db8d4d2 100644 --- a/Mage.Sets/src/mage/cards/c/CabalRitual.java +++ b/Mage.Sets/src/mage/cards/c/CabalRitual.java @@ -52,7 +52,7 @@ public class CabalRitual extends CardImpl { new BasicManaEffect(Mana.BlackMana(5)), new BasicManaEffect(Mana.BlackMana(3)), new CardsInControllerGraveCondition(7), - "Add {B}{B}{B}.

Threshold - Add {B}{B}{B}{B}{B} instead if seven or more cards are in your graveyard")); + "Add {B}{B}{B}.

Threshold — Add {B}{B}{B}{B}{B} instead if seven or more cards are in your graveyard")); } public CabalRitual(final CabalRitual card) { diff --git a/Mage.Sets/src/mage/cards/c/CacklingFlames.java b/Mage.Sets/src/mage/cards/c/CacklingFlames.java index 10a3f9e4fed..69bbea04285 100644 --- a/Mage.Sets/src/mage/cards/c/CacklingFlames.java +++ b/Mage.Sets/src/mage/cards/c/CacklingFlames.java @@ -55,7 +55,7 @@ public class CacklingFlames extends CardImpl { this.getSpellAbility().addEffect(new ConditionalOneShotEffect( new DamageTargetEffect(5), HellbentCondition.instance, - "

Hellbent - {this} deals 5 damage to that permanent or player instead if you have no cards in hand.")); + "

Hellbent — {this} deals 5 damage to that permanent or player instead if you have no cards in hand.")); this.getSpellAbility().addTarget(new TargetAnyTarget()); } diff --git a/Mage.Sets/src/mage/cards/c/ChorusOfTheTides.java b/Mage.Sets/src/mage/cards/c/ChorusOfTheTides.java index d6ee131adaa..bdf0055fa37 100644 --- a/Mage.Sets/src/mage/cards/c/ChorusOfTheTides.java +++ b/Mage.Sets/src/mage/cards/c/ChorusOfTheTides.java @@ -52,7 +52,7 @@ public class ChorusOfTheTides extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); - // Heroic - Whenever you cast a spell that targets Chorus of the Tides, scry 1. + // Heroic — Whenever you cast a spell that targets Chorus of the Tides, scry 1. this.addAbility(new HeroicAbility(new ScryEffect(1))); } diff --git a/Mage.Sets/src/mage/cards/c/CircleOfElders.java b/Mage.Sets/src/mage/cards/c/CircleOfElders.java index 68761c27ee7..e63ba43655c 100644 --- a/Mage.Sets/src/mage/cards/c/CircleOfElders.java +++ b/Mage.Sets/src/mage/cards/c/CircleOfElders.java @@ -59,7 +59,7 @@ public class CircleOfElders extends CardImpl { // Vigilance this.addAbility(VigilanceAbility.getInstance()); - // Formidable - {T}: Add {C}{C}{C}. Activate this only if creatures you control have total power 8 or greater. + // Formidable — {T}: Add {C}{C}{C}. Activate this only if creatures you control have total power 8 or greater. Ability ability = new ActivateIfConditionManaAbility( Zone.BATTLEFIELD, new BasicManaEffect(Mana.ColorlessMana(3)), diff --git a/Mage.Sets/src/mage/cards/c/CoercivePortal.java b/Mage.Sets/src/mage/cards/c/CoercivePortal.java index fb508f989f8..e1ec484e6bf 100644 --- a/Mage.Sets/src/mage/cards/c/CoercivePortal.java +++ b/Mage.Sets/src/mage/cards/c/CoercivePortal.java @@ -69,7 +69,7 @@ class CoercivePortalEffect extends OneShotEffect { CoercivePortalEffect() { super(Outcome.Benefit); - this.staticText = "Will of the council - At the beginning of your upkeep, starting with you, each player votes for carnage or homage. If carnage gets more votes, sacrifice Coercive Portal and destroy all nonland permanents. If homage gets more votes or the vote is tied, draw a card"; + this.staticText = "Will of the council — At the beginning of your upkeep, starting with you, each player votes for carnage or homage. If carnage gets more votes, sacrifice Coercive Portal and destroy all nonland permanents. If homage gets more votes or the vote is tied, draw a card"; } CoercivePortalEffect(final CoercivePortalEffect effect) { diff --git a/Mage.Sets/src/mage/cards/c/CollectiveVoyage.java b/Mage.Sets/src/mage/cards/c/CollectiveVoyage.java index 48dc3636ab1..88728d60278 100644 --- a/Mage.Sets/src/mage/cards/c/CollectiveVoyage.java +++ b/Mage.Sets/src/mage/cards/c/CollectiveVoyage.java @@ -71,7 +71,7 @@ class CollectiveVoyageEffect extends OneShotEffect { public CollectiveVoyageEffect() { super(Outcome.Detriment); - this.staticText = "Join forces - Starting with you, each player may pay any amount of mana. Each player searches their library for up to X basic land cards, where X is the total amount of mana paid this way, puts them onto the battlefield tapped, then shuffles their library"; + this.staticText = "Join forces — Starting with you, each player may pay any amount of mana. Each player searches their library for up to X basic land cards, where X is the total amount of mana paid this way, puts them onto the battlefield tapped, then shuffles their library"; } public CollectiveVoyageEffect(final CollectiveVoyageEffect effect) { diff --git a/Mage.Sets/src/mage/cards/c/CraterElemental.java b/Mage.Sets/src/mage/cards/c/CraterElemental.java index 935ac7afaa2..ce2863c02a0 100644 --- a/Mage.Sets/src/mage/cards/c/CraterElemental.java +++ b/Mage.Sets/src/mage/cards/c/CraterElemental.java @@ -68,7 +68,7 @@ public class CraterElemental extends CardImpl { ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); - // Formidable - {2}{R}: Crater Elemental has base power 8 until end of turn. Activate this ability only if creatures you control have total power 8 or greater. + // Formidable — {2}{R}: Crater Elemental has base power 8 until end of turn. Activate this ability only if creatures you control have total power 8 or greater. ability = new ActivateIfConditionActivatedAbility( Zone.BATTLEFIELD, new SetPowerSourceEffect(new StaticValue(8), Duration.EndOfTurn, SubLayer.SetPT_7b), diff --git a/Mage.Sets/src/mage/cards/c/CratersClaws.java b/Mage.Sets/src/mage/cards/c/CratersClaws.java index e844238119e..97ae8f450f4 100644 --- a/Mage.Sets/src/mage/cards/c/CratersClaws.java +++ b/Mage.Sets/src/mage/cards/c/CratersClaws.java @@ -48,7 +48,7 @@ public class CratersClaws extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{R}"); // Crater's Claws deals X damage to any target. - // Ferocious - Crater's Claws deals X plus 2 damage to that creature or player instead if you control a creature with power 4 or greater. + // Ferocious — Crater's Claws deals X plus 2 damage to that creature or player instead if you control a creature with power 4 or greater. this.getSpellAbility().addEffect(new ConditionalOneShotEffect( new DamageTargetEffect(new IntPlusDynamicValue(2, new ManacostVariableValue())), new DamageTargetEffect(new ManacostVariableValue()), diff --git a/Mage.Sets/src/mage/cards/c/CrystallineCrawler.java b/Mage.Sets/src/mage/cards/c/CrystallineCrawler.java index 653e6d13bd0..4644270b05b 100644 --- a/Mage.Sets/src/mage/cards/c/CrystallineCrawler.java +++ b/Mage.Sets/src/mage/cards/c/CrystallineCrawler.java @@ -59,7 +59,7 @@ public class CrystallineCrawler extends CardImpl { // Converge — Crystalline Crawler enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it. this.addAbility(new EntersBattlefieldAbility( new AddCountersSourceEffect(CounterType.P1P1.createInstance(), ColorsOfManaSpentToCastCount.getInstance(), true), - null, "Converge - {this} enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it.", null)); + null, "Converge — {this} enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it.", null)); // Remove a +1/+1 counter from Crystalline Crawler: Add one mana of any color. this.addAbility(new AnyColorManaAbility(new RemoveCountersSourceCost(CounterType.P1P1.createInstance(1)))); diff --git a/Mage.Sets/src/mage/cards/c/CustodiSquire.java b/Mage.Sets/src/mage/cards/c/CustodiSquire.java index 2a821426a29..dd0f91281c0 100644 --- a/Mage.Sets/src/mage/cards/c/CustodiSquire.java +++ b/Mage.Sets/src/mage/cards/c/CustodiSquire.java @@ -89,7 +89,7 @@ class CustodiSquireVoteEffect extends OneShotEffect { CustodiSquireVoteEffect() { super(Outcome.Benefit); - this.staticText = "Will of the council - When {this} enters the battlefield, starting with you, each player votes for an artifact, creature, or enchantment card in your graveyard. Return each card with the most votes or tied for most votes to your hand"; + this.staticText = "Will of the council — When {this} enters the battlefield, starting with you, each player votes for an artifact, creature, or enchantment card in your graveyard. Return each card with the most votes or tied for most votes to your hand"; } CustodiSquireVoteEffect(final CustodiSquireVoteEffect effect) { diff --git a/Mage.Sets/src/mage/cards/c/CutthroatIlDal.java b/Mage.Sets/src/mage/cards/c/CutthroatIlDal.java index d707cf1669b..c0a3df5cd53 100644 --- a/Mage.Sets/src/mage/cards/c/CutthroatIlDal.java +++ b/Mage.Sets/src/mage/cards/c/CutthroatIlDal.java @@ -57,7 +57,7 @@ public class CutthroatIlDal extends CardImpl { // Hellbent - Cutthroat il-Dal has shadow as long as you have no cards in hand. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect( new GainAbilitySourceEffect(ShadowAbility.getInstance(), Duration.WhileOnBattlefield), HellbentCondition.instance, - "Hellbent - {this} has shadow as long as you have no cards in hand"))); } + "Hellbent — {this} has shadow as long as you have no cards in hand"))); } public CutthroatIlDal(final CutthroatIlDal card) { super(card); diff --git a/Mage.Sets/src/mage/cards/d/DarkPetition.java b/Mage.Sets/src/mage/cards/d/DarkPetition.java index a170b72e5a7..ac7af3209be 100644 --- a/Mage.Sets/src/mage/cards/d/DarkPetition.java +++ b/Mage.Sets/src/mage/cards/d/DarkPetition.java @@ -51,9 +51,9 @@ public class DarkPetition extends CardImpl { // Search your library for a card and put that card into your hand. Then shuffle your library. this.getSpellAbility().addEffect(new SearchLibraryPutInHandEffect(new TargetCardInLibrary())); - // Spell mastery - If there are two or more instant and/or sorcery cards in your graveyard, add {B}{B}{B}. + // Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, add {B}{B}{B}. Effect effect = new ConditionalOneShotEffect(new AddManaToManaPoolSourceControllerEffect(Mana.BlackMana(3)), - SpellMasteryCondition.instance, "
Spell mastery - If there are two or more instant and/or sorcery cards in your graveyard, add {B}{B}{B}"); + SpellMasteryCondition.instance, "
Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, add {B}{B}{B}"); this.getSpellAbility().addEffect(effect); } diff --git a/Mage.Sets/src/mage/cards/d/DeadeyeRigHauler.java b/Mage.Sets/src/mage/cards/d/DeadeyeRigHauler.java index 57d5ba84fdd..8fc708b907f 100644 --- a/Mage.Sets/src/mage/cards/d/DeadeyeRigHauler.java +++ b/Mage.Sets/src/mage/cards/d/DeadeyeRigHauler.java @@ -57,7 +57,7 @@ public class DeadeyeRigHauler extends CardImpl { // Raid— When Deadeye Rig-Hauler enters the battlefield, if you attacked with a creature this turn, you may return target creature to its owner's hand. Ability ability = new ConditionalTriggeredAbility(new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect(), true), RaidCondition.instance, - "Raid - When {this} enters the battlefield, if you attacked with a creature this turn, you may return target creature to its owner's hand."); + "Raid — When {this} enters the battlefield, if you attacked with a creature this turn, you may return target creature to its owner's hand."); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability, new PlayerAttackedWatcher()); } diff --git a/Mage.Sets/src/mage/cards/d/DeadeyeTormentor.java b/Mage.Sets/src/mage/cards/d/DeadeyeTormentor.java index 9e9e44ae286..ec6eb634465 100644 --- a/Mage.Sets/src/mage/cards/d/DeadeyeTormentor.java +++ b/Mage.Sets/src/mage/cards/d/DeadeyeTormentor.java @@ -57,7 +57,7 @@ public class DeadeyeTormentor extends CardImpl { // Raid — When Deadeye Tormentor enters the battlefield, if you attacked with a creature this turn, target opponent discards a card. Ability ability = new ConditionalTriggeredAbility(new EntersBattlefieldTriggeredAbility(new DiscardTargetEffect(1)), RaidCondition.instance, - "Raid - When {this} enters the battlefield, if you attacked with a creature this turn, target opponent discards a card."); + "Raid — When {this} enters the battlefield, if you attacked with a creature this turn, target opponent discards a card."); ability.addTarget(new TargetOpponent()); this.addAbility(ability, new PlayerAttackedWatcher()); } diff --git a/Mage.Sets/src/mage/cards/d/DeepwaterHypnotist.java b/Mage.Sets/src/mage/cards/d/DeepwaterHypnotist.java index 0d9364785ac..4318a094cb8 100644 --- a/Mage.Sets/src/mage/cards/d/DeepwaterHypnotist.java +++ b/Mage.Sets/src/mage/cards/d/DeepwaterHypnotist.java @@ -63,7 +63,7 @@ public class DeepwaterHypnotist extends CardImpl { this.power = new MageInt(2); this.toughness = new MageInt(1); - // Inspired - Whenever Deepwater Hypnotist becomes untapped, target creature an opponent controls gets -3/-0 until end of turn. + // Inspired — Whenever Deepwater Hypnotist becomes untapped, target creature an opponent controls gets -3/-0 until end of turn. Ability ability = new InspiredAbility(new BoostTargetEffect(-3,0,Duration.EndOfTurn)); ability.addTarget(new TargetCreaturePermanent(filter)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/d/Demonfire.java b/Mage.Sets/src/mage/cards/d/Demonfire.java index 186976479eb..1fa4a2cab62 100644 --- a/Mage.Sets/src/mage/cards/d/Demonfire.java +++ b/Mage.Sets/src/mage/cards/d/Demonfire.java @@ -69,7 +69,7 @@ public class Demonfire extends CardImpl { this.getSpellAbility().addEffect(new ConditionalOneShotEffect( new DamageTargetEffect(new ManacostVariableValue(), false), HellbentCondition.instance, - "
Hellbent - If you have no cards in hand, {this} can't be countered by spells or abilities and the damage can't be prevented.")); + "
Hellbent — If you have no cards in hand, {this} can't be countered by spells or abilities and the damage can't be prevented.")); // can't be countered Effect effect = new CantBeCounteredSourceEffect(); effect.setText(""); diff --git a/Mage.Sets/src/mage/cards/d/DemonsJester.java b/Mage.Sets/src/mage/cards/d/DemonsJester.java index be8c2c4188b..1754b7dd750 100644 --- a/Mage.Sets/src/mage/cards/d/DemonsJester.java +++ b/Mage.Sets/src/mage/cards/d/DemonsJester.java @@ -59,7 +59,7 @@ public class DemonsJester extends CardImpl { // Hellbent - Demon's Jester gets +2/+1 as long as you have no cards in hand. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect( new BoostSourceEffect(2,1,Duration.WhileOnBattlefield), HellbentCondition.instance, - "Hellbent - {this} gets +2/+1 as long as you have no cards in hand"))); + "Hellbent — {this} gets +2/+1 as long as you have no cards in hand"))); } public DemonsJester(final DemonsJester card) { diff --git a/Mage.Sets/src/mage/cards/d/Demoralize.java b/Mage.Sets/src/mage/cards/d/Demoralize.java index fc29a2b247a..51435fbb231 100644 --- a/Mage.Sets/src/mage/cards/d/Demoralize.java +++ b/Mage.Sets/src/mage/cards/d/Demoralize.java @@ -59,7 +59,7 @@ public class Demoralize extends CardImpl { new ConditionalOneShotEffect( new AddContinuousEffectToGame(new CantBlockAllEffect(StaticFilters.FILTER_PERMANENT_CREATURES, Duration.EndOfTurn)), new CardsInControllerGraveCondition(7), - "

Threshold - If seven or more cards are in your graveyard, creatures can't block this turn" + "

Threshold — If seven or more cards are in your graveyard, creatures can't block this turn" )); } diff --git a/Mage.Sets/src/mage/cards/d/Draco.java b/Mage.Sets/src/mage/cards/d/Draco.java index 9132028b6fb..12af257b086 100644 --- a/Mage.Sets/src/mage/cards/d/Draco.java +++ b/Mage.Sets/src/mage/cards/d/Draco.java @@ -81,7 +81,7 @@ class DracoCostReductionEffect extends CostModificationEffectImpl { public DracoCostReductionEffect() { super(Duration.WhileOnStack, Outcome.Benefit, CostModificationType.REDUCE_COST); - staticText = "Domain - {this} costs {2} less to cast for each basic land type among lands you control."; + staticText = "Domain — {this} costs {2} less to cast for each basic land type among lands you control."; } protected DracoCostReductionEffect(final DracoCostReductionEffect effect) { diff --git a/Mage.Sets/src/mage/cards/d/DragonScarredBear.java b/Mage.Sets/src/mage/cards/d/DragonScarredBear.java index d3fdb0f0663..1c6dc5d5ca7 100644 --- a/Mage.Sets/src/mage/cards/d/DragonScarredBear.java +++ b/Mage.Sets/src/mage/cards/d/DragonScarredBear.java @@ -53,7 +53,7 @@ public class DragonScarredBear extends CardImpl { this.power = new MageInt(3); this.toughness = new MageInt(2); - // Formidable - {1}{G}: Regenerate Dragon-Scarred Bear. Activate this only if creatures you control have total power 8 or greater. + // Formidable — {1}{G}: Regenerate Dragon-Scarred Bear. Activate this only if creatures you control have total power 8 or greater. Ability ability = new ActivateIfConditionActivatedAbility( Zone.BATTLEFIELD, new RegenerateSourceEffect(), diff --git a/Mage.Sets/src/mage/cards/d/DragonWhisperer.java b/Mage.Sets/src/mage/cards/d/DragonWhisperer.java index 1692643f3fd..6197d7437e1 100644 --- a/Mage.Sets/src/mage/cards/d/DragonWhisperer.java +++ b/Mage.Sets/src/mage/cards/d/DragonWhisperer.java @@ -70,7 +70,7 @@ public class DragonWhisperer extends CardImpl { new BoostSourceEffect(1, 0, Duration.EndOfTurn), new ManaCostsImpl("{1}{R}"))); - // - {4}{R}{R}: Create a 4/4 red Dragon creature token with flying. Activate this ability only if creatures you control have total power 8 or greater. + // — {4}{R}{R}: Create a 4/4 red Dragon creature token with flying. Activate this ability only if creatures you control have total power 8 or greater. Ability ability = new ActivateIfConditionActivatedAbility( Zone.BATTLEFIELD, new CreateTokenEffect(new DragonToken()), diff --git a/Mage.Sets/src/mage/cards/e/EdgarMarkov.java b/Mage.Sets/src/mage/cards/e/EdgarMarkov.java index 40a6da44f23..b5ed346cac6 100644 --- a/Mage.Sets/src/mage/cards/e/EdgarMarkov.java +++ b/Mage.Sets/src/mage/cards/e/EdgarMarkov.java @@ -78,7 +78,7 @@ public class EdgarMarkov extends CardImpl { Ability ability = new ConditionalTriggeredAbility( new SpellCastControllerTriggeredAbility(Zone.ALL, new CreateTokenEffect(new EdgarMarkovToken()), filter2, false, false), SourceOnBattlefieldOrCommandZoneCondition.instance, - "Eminence - Whenever you cast another Vampire spell, if {this} is in the command zone or on the battlefield, create a 1/1 black Vampire creature token."); + "Eminence — Whenever you cast another Vampire spell, if {this} is in the command zone or on the battlefield, create a 1/1 black Vampire creature token."); ability.setAbilityWord(AbilityWord.EMINENCE); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/e/EliteSkirmisher.java b/Mage.Sets/src/mage/cards/e/EliteSkirmisher.java index 94ed1b806ac..b45b68092e5 100644 --- a/Mage.Sets/src/mage/cards/e/EliteSkirmisher.java +++ b/Mage.Sets/src/mage/cards/e/EliteSkirmisher.java @@ -52,7 +52,7 @@ public class EliteSkirmisher extends CardImpl { this.power = new MageInt(3); this.toughness = new MageInt(1); - // Heroic - Whenever you cast a spell that targets Elite Skirmisher, you may tap target creature. + // Heroic — Whenever you cast a spell that targets Elite Skirmisher, you may tap target creature. Ability ability = new HeroicAbility(new TapTargetEffect(), true); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/e/EmbodimentOfFury.java b/Mage.Sets/src/mage/cards/e/EmbodimentOfFury.java index ed0225c0978..1522f411110 100644 --- a/Mage.Sets/src/mage/cards/e/EmbodimentOfFury.java +++ b/Mage.Sets/src/mage/cards/e/EmbodimentOfFury.java @@ -74,7 +74,7 @@ public class EmbodimentOfFury extends CardImpl { // Land creatures you control have trample. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.WhileOnBattlefield, filterLandCreatures))); - // Landfall - Whenever a land enters the battlefield under your control, you may have target land you control + // Landfall — Whenever a land enters the battlefield under your control, you may have target land you control // become a 3/3 Elemental creature with haste until end of turn. It's still a land. Ability ability = new LandfallAbility(new BecomesCreatureTargetEffect(new EmbodimentOfFuryToken(), false, true, Duration.EndOfTurn), true); ability.addTarget(new TargetPermanent(new FilterControlledLandPermanent())); diff --git a/Mage.Sets/src/mage/cards/e/EmbodimentOfInsight.java b/Mage.Sets/src/mage/cards/e/EmbodimentOfInsight.java index 13481664dab..f7508e379e3 100644 --- a/Mage.Sets/src/mage/cards/e/EmbodimentOfInsight.java +++ b/Mage.Sets/src/mage/cards/e/EmbodimentOfInsight.java @@ -74,7 +74,7 @@ public class EmbodimentOfInsight extends CardImpl { // Land creatures you control have vigilance. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(VigilanceAbility.getInstance(), Duration.WhileOnBattlefield, filterLandCreatures))); - // Landfall - Whenever a land enters the battlefield under you control, you may have target land you control + // Landfall — Whenever a land enters the battlefield under you control, you may have target land you control // become a 3/3 Elemental creature with haste until end of turn. It's still a land. Ability ability = new LandfallAbility(new BecomesCreatureTargetEffect(new EmbodimentOfInsightToken(), false, true, Duration.EndOfTurn), true); ability.addTarget(new TargetPermanent(new FilterControlledLandPermanent())); diff --git a/Mage.Sets/src/mage/cards/e/Epicenter.java b/Mage.Sets/src/mage/cards/e/Epicenter.java index 70f553a8b86..b474ab89c43 100644 --- a/Mage.Sets/src/mage/cards/e/Epicenter.java +++ b/Mage.Sets/src/mage/cards/e/Epicenter.java @@ -62,7 +62,7 @@ public class Epicenter extends CardImpl { this.getSpellAbility().addEffect(new ConditionalOneShotEffect( new EpicenterEffect(), new CardsInControllerGraveCondition(7), - "

Threshold - Each player sacrifices all lands he or she controls instead if seven or more cards are in your graveyard.")); + "

Threshold — Each player sacrifices all lands he or she controls instead if seven or more cards are in your graveyard.")); this.getSpellAbility().addTarget(new TargetPlayer()); } diff --git a/Mage.Sets/src/mage/cards/e/EtchedChampion.java b/Mage.Sets/src/mage/cards/e/EtchedChampion.java index a21f74ad7be..6828dd283e4 100644 --- a/Mage.Sets/src/mage/cards/e/EtchedChampion.java +++ b/Mage.Sets/src/mage/cards/e/EtchedChampion.java @@ -51,7 +51,7 @@ import mage.filter.predicate.mageobject.ColorPredicate; * @author North */ public class EtchedChampion extends CardImpl { - private static final String ruleText = "Metalcraft - Etched Champion has protection from all colors as long as you control three or more artifacts"; + private static final String ruleText = "Metalcraft — Etched Champion has protection from all colors as long as you control three or more artifacts"; private static final FilterCard filter = new FilterCard("all colors"); diff --git a/Mage.Sets/src/mage/cards/e/ExquisiteFirecraft.java b/Mage.Sets/src/mage/cards/e/ExquisiteFirecraft.java index 49bd943d4fa..8866bb61053 100644 --- a/Mage.Sets/src/mage/cards/e/ExquisiteFirecraft.java +++ b/Mage.Sets/src/mage/cards/e/ExquisiteFirecraft.java @@ -54,7 +54,7 @@ public class ExquisiteFirecraft extends CardImpl { this.getSpellAbility().addTarget(new TargetAnyTarget()); this.getSpellAbility().addEffect(new DamageTargetEffect(4)); - // Spell mastery - If there are two or more instant and/or sorcery cards in your graveyard, Exquisite Firecraft can't be countered by spells or abilities. + // Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, Exquisite Firecraft can't be countered by spells or abilities. ContinuousRuleModifyingEffect cantBeCountered = new CantBeCounteredSourceEffect(); ConditionalContinuousRuleModifyingEffect conditionalCantBeCountered = new ConditionalContinuousRuleModifyingEffect(cantBeCountered, SpellMasteryCondition.instance); conditionalCantBeCountered.setText("
If there are two or more instant and/or sorcery cards in your graveyard, {this} can't be countered by spells or abilities"); diff --git a/Mage.Sets/src/mage/cards/f/FaithsShield.java b/Mage.Sets/src/mage/cards/f/FaithsShield.java index c126094461d..c5af9943f2f 100644 --- a/Mage.Sets/src/mage/cards/f/FaithsShield.java +++ b/Mage.Sets/src/mage/cards/f/FaithsShield.java @@ -78,7 +78,7 @@ class FaithsShieldEffect extends OneShotEffect { public FaithsShieldEffect() { super(Outcome.Protect); staticText = "Target permanent you control gains protection from the color of your choice until end of turn." - + "

Fateful hour - If you have 5 or less life, instead you and each permanent you control gain protection from the color of your choice until end of turn"; + + "

Fateful hour — If you have 5 or less life, instead you and each permanent you control gain protection from the color of your choice until end of turn"; } public FaithsShieldEffect(final FaithsShieldEffect effect) { diff --git a/Mage.Sets/src/mage/cards/f/FarWanderings.java b/Mage.Sets/src/mage/cards/f/FarWanderings.java index 82c859e7226..95f0f581c14 100644 --- a/Mage.Sets/src/mage/cards/f/FarWanderings.java +++ b/Mage.Sets/src/mage/cards/f/FarWanderings.java @@ -55,7 +55,7 @@ public class FarWanderings extends CardImpl { new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(0, 3, StaticFilters.FILTER_BASIC_LAND_CARD), true, true), new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(0, 1, StaticFilters.FILTER_BASIC_LAND_CARD), true, true), new CardsInControllerGraveCondition(7), - "Search your library for a basic land card, put that card onto the battlefield tapped, then shuffle your library.

Threshold - If seven or more cards are in your graveyard, instead search your library for up to three basic land cards, put them onto the battlefield tapped, then shuffle your library."); + "Search your library for a basic land card, put that card onto the battlefield tapped, then shuffle your library.

Threshold — If seven or more cards are in your graveyard, instead search your library for up to three basic land cards, put them onto the battlefield tapped, then shuffle your library."); this.getSpellAbility().addEffect(effect); } diff --git a/Mage.Sets/src/mage/cards/f/FelhideSpiritbinder.java b/Mage.Sets/src/mage/cards/f/FelhideSpiritbinder.java index 3ffef384f9e..538727a3585 100644 --- a/Mage.Sets/src/mage/cards/f/FelhideSpiritbinder.java +++ b/Mage.Sets/src/mage/cards/f/FelhideSpiritbinder.java @@ -70,7 +70,7 @@ public class FelhideSpiritbinder extends CardImpl { this.power = new MageInt(3); this.toughness = new MageInt(4); - // Inspired - Whenever Felhide Spiritbinder becomes untapped, you may pay {1}{R}. If you do, create a token that's a copy of another target creature except it's an enchantment in addition to its other types. It gains haste. Exile it at the beginning of the next end step. + // Inspired — Whenever Felhide Spiritbinder becomes untapped, you may pay {1}{R}. If you do, create a token that's a copy of another target creature except it's an enchantment in addition to its other types. It gains haste. Exile it at the beginning of the next end step. Ability ability = new InspiredAbility(new DoIfCostPaid(new FelhideSpiritbinderEffect(), new ManaCostsImpl("{1}{R}"), "Use effect of {source}?")); ability.addTarget(new TargetCreaturePermanent(filter)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/f/FlamewakePhoenix.java b/Mage.Sets/src/mage/cards/f/FlamewakePhoenix.java index da64c996d13..e6dbb996697 100644 --- a/Mage.Sets/src/mage/cards/f/FlamewakePhoenix.java +++ b/Mage.Sets/src/mage/cards/f/FlamewakePhoenix.java @@ -64,7 +64,7 @@ public class FlamewakePhoenix extends CardImpl { // Flamewake Phoenix attacks each turn if able. this.addAbility(new AttacksEachCombatStaticAbility()); - // Ferocious - At the beginning of combat on your turn, if you control a creature with power 4 or greater, you may pay {R}. If you do, return Flamewake Phoenix from your graveyard to the battlefield. + // Ferocious — At the beginning of combat on your turn, if you control a creature with power 4 or greater, you may pay {R}. If you do, return Flamewake Phoenix from your graveyard to the battlefield. this.addAbility(new ConditionalTriggeredAbility( new BeginningOfCombatTriggeredAbility( Zone.GRAVEYARD, diff --git a/Mage.Sets/src/mage/cards/f/ForceAway.java b/Mage.Sets/src/mage/cards/f/ForceAway.java index d1b31da3f57..bcf0ff5472a 100644 --- a/Mage.Sets/src/mage/cards/f/ForceAway.java +++ b/Mage.Sets/src/mage/cards/f/ForceAway.java @@ -51,7 +51,7 @@ public class ForceAway extends CardImpl { this.getSpellAbility().addEffect(new ReturnToHandTargetEffect()); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); - // Ferocious - If you control a creature with power 4 or greater, you may draw a card. If you do, discard a card. + // Ferocious — If you control a creature with power 4 or greater, you may draw a card. If you do, discard a card. Effect effect = new ConditionalOneShotEffect(new DrawDiscardControllerEffect(1,1, true), FerociousCondition.instance , "
Ferocious — If you control a creature with power 4 or greater, you may draw a card. If you do, discard a card"); this.getSpellAbility().addEffect(effect); diff --git a/Mage.Sets/src/mage/cards/f/ForceDenial.java b/Mage.Sets/src/mage/cards/f/ForceDenial.java index 4e41371172a..4a1825dbcfe 100644 --- a/Mage.Sets/src/mage/cards/f/ForceDenial.java +++ b/Mage.Sets/src/mage/cards/f/ForceDenial.java @@ -60,7 +60,7 @@ public class ForceDenial extends CardImpl { this.getSpellAbility().addEffect(new ConditionalOneShotEffect( new CounterTargetEffect(), HateCondition.instance, - "
Hate - If an opponent lost life from a source other than combat damage this turn, counter that spell instead.")); + "
Hate — If an opponent lost life from a source other than combat damage this turn, counter that spell instead.")); this.getSpellAbility().addTarget(new TargetSpell()); this.getSpellAbility().addWatcher(new LifeLossOtherFromCombatWatcher()); diff --git a/Mage.Sets/src/mage/cards/f/ForlornPseudamma.java b/Mage.Sets/src/mage/cards/f/ForlornPseudamma.java index ea3e3223f73..28150994587 100644 --- a/Mage.Sets/src/mage/cards/f/ForlornPseudamma.java +++ b/Mage.Sets/src/mage/cards/f/ForlornPseudamma.java @@ -55,7 +55,7 @@ public class ForlornPseudamma extends CardImpl { // Intimidate this.addAbility(IntimidateAbility.getInstance()); - // Inspired - Whenever Forlorn Pseudamma becomes untapped, you may pay {2}{B}. If you do, create a 2/2 black Zombie enchantment creature token. + // Inspired — Whenever Forlorn Pseudamma becomes untapped, you may pay {2}{B}. If you do, create a 2/2 black Zombie enchantment creature token. this.addAbility(new InspiredAbility(new DoIfCostPaid(new CreateTokenEffect(new ForlornPseudammaZombieToken()), new ManaCostsImpl("{2}{B}")))); } diff --git a/Mage.Sets/src/mage/cards/f/FrontierMastodon.java b/Mage.Sets/src/mage/cards/f/FrontierMastodon.java index afecb7cbd42..c4ec48c6273 100644 --- a/Mage.Sets/src/mage/cards/f/FrontierMastodon.java +++ b/Mage.Sets/src/mage/cards/f/FrontierMastodon.java @@ -50,7 +50,7 @@ public class FrontierMastodon extends CardImpl { this.power = new MageInt(3); this.toughness = new MageInt(2); - // Ferocious - Frontier Mastodon enters the battlefield with a +1/+1 counter on it if you control a creature with power 4 or greater. + // Ferocious — Frontier Mastodon enters the battlefield with a +1/+1 counter on it if you control a creature with power 4 or greater. this.addAbility(new EntersBattlefieldAbility( new AddCountersSourceEffect(CounterType.P1P1.createInstance(1)), FerociousCondition.instance, diff --git a/Mage.Sets/src/mage/cards/g/GathanRaiders.java b/Mage.Sets/src/mage/cards/g/GathanRaiders.java index 27d2ff7a175..0e50ecac7e5 100644 --- a/Mage.Sets/src/mage/cards/g/GathanRaiders.java +++ b/Mage.Sets/src/mage/cards/g/GathanRaiders.java @@ -59,7 +59,7 @@ public class GathanRaiders extends CardImpl { // Hellbent - Gathan Raiders gets +2/+2 as long as you have no cards in hand. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect( new BoostSourceEffect(2,2,Duration.WhileOnBattlefield), HellbentCondition.instance, - "Hellbent - {this} gets +2/+2 as long as you have no cards in hand"))); + "Hellbent — {this} gets +2/+2 as long as you have no cards in hand"))); // Morph-Discard a card. this.addAbility(new MorphAbility(this, new DiscardCardCost())); } diff --git a/Mage.Sets/src/mage/cards/g/GeistOfTheLonelyVigil.java b/Mage.Sets/src/mage/cards/g/GeistOfTheLonelyVigil.java index 716e220f265..a086ce1d3ad 100644 --- a/Mage.Sets/src/mage/cards/g/GeistOfTheLonelyVigil.java +++ b/Mage.Sets/src/mage/cards/g/GeistOfTheLonelyVigil.java @@ -65,7 +65,7 @@ public class GeistOfTheLonelyVigil extends CardImpl { Effect effect = new ConditionalAsThoughEffect( new CanAttackAsThoughItDidntHaveDefenderSourceEffect(Duration.WhileOnBattlefield), DeliriumCondition.instance); - effect.setText("Delirium - {this} can attack as though it didn't have defender as long as there are four or more card types among cards in your graveyard"); + effect.setText("Delirium — {this} can attack as though it didn't have defender as long as there are four or more card types among cards in your graveyard"); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); } diff --git a/Mage.Sets/src/mage/cards/g/GeyserfieldStalker.java b/Mage.Sets/src/mage/cards/g/GeyserfieldStalker.java index 265d515e2c3..8e64d05eea4 100644 --- a/Mage.Sets/src/mage/cards/g/GeyserfieldStalker.java +++ b/Mage.Sets/src/mage/cards/g/GeyserfieldStalker.java @@ -52,7 +52,7 @@ public class GeyserfieldStalker extends CardImpl { // Menace this.addAbility(new MenaceAbility()); - // Landfall - Whenever a land enters the battlefield under your control, Geyserfield Stalker gets +2/+2 until end of turn. + // Landfall — Whenever a land enters the battlefield under your control, Geyserfield Stalker gets +2/+2 until end of turn. this.addAbility(new LandfallAbility(new BoostSourceEffect(2, 2, Duration.EndOfTurn), false)); } diff --git a/Mage.Sets/src/mage/cards/g/GideonsPhalanx.java b/Mage.Sets/src/mage/cards/g/GideonsPhalanx.java index 3ed8c94bc04..6a012da973e 100644 --- a/Mage.Sets/src/mage/cards/g/GideonsPhalanx.java +++ b/Mage.Sets/src/mage/cards/g/GideonsPhalanx.java @@ -54,11 +54,11 @@ public class GideonsPhalanx extends CardImpl { // Create four 2/2 white Knight creature tokens with vigilance. this.getSpellAbility().addEffect(new CreateTokenEffect(new KnightToken(), 4)); - // Spell mastery - If there are two or more instant and/or sorcery cards in your graveyard, creatures you control gain indestructible until end of turn. + // Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, creatures you control gain indestructible until end of turn. Effect effect = new ConditionalOneShotEffect( new AddContinuousEffectToGame(new GainAbilityAllEffect(IndestructibleAbility.getInstance(), Duration.EndOfTurn, new FilterControlledCreaturePermanent())), SpellMasteryCondition.instance, - "
Spell mastery - If there are two or more instant and/or sorcery cards in your graveyard, creatures you control gain indestructible until end of turn"); + "
Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, creatures you control gain indestructible until end of turn"); this.getSpellAbility().addEffect(effect); } diff --git a/Mage.Sets/src/mage/cards/g/GladeWatcher.java b/Mage.Sets/src/mage/cards/g/GladeWatcher.java index 8f44492647a..2b3e1c24ff7 100644 --- a/Mage.Sets/src/mage/cards/g/GladeWatcher.java +++ b/Mage.Sets/src/mage/cards/g/GladeWatcher.java @@ -57,7 +57,7 @@ public class GladeWatcher extends CardImpl { // Defender this.addAbility(DefenderAbility.getInstance()); - // Formidable - {G}: Glade Watcher can attack this turn as though it didn't have defender. Activate this ability only if creatures you control have total power 8 or greater. + // Formidable — {G}: Glade Watcher can attack this turn as though it didn't have defender. Activate this ability only if creatures you control have total power 8 or greater. Ability ability = new ActivateIfConditionActivatedAbility( Zone.BATTLEFIELD, new CanAttackAsThoughItDidntHaveDefenderSourceEffect(Duration.EndOfTurn), diff --git a/Mage.Sets/src/mage/cards/g/GobhobblerRats.java b/Mage.Sets/src/mage/cards/g/GobhobblerRats.java index 76ec6cdd07f..364006d06c8 100644 --- a/Mage.Sets/src/mage/cards/g/GobhobblerRats.java +++ b/Mage.Sets/src/mage/cards/g/GobhobblerRats.java @@ -60,7 +60,7 @@ public class GobhobblerRats extends CardImpl { // Hellbent - As long as you have no cards in hand, Gobhobbler Rats gets +1/+0 and has "{B}: Regenerate Gobhobbler Rats." Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect( - new BoostSourceEffect(1,0, Duration.WhileOnBattlefield), HellbentCondition.instance, "Hellbent - As long as you have no cards in hand, {this} gets +1/+0")); + new BoostSourceEffect(1,0, Duration.WhileOnBattlefield), HellbentCondition.instance, "Hellbent — As long as you have no cards in hand, {this} gets +1/+0")); Ability gainedAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), new ManaCostsImpl("{B}")); ability.addEffect(new ConditionalContinuousEffect( new GainAbilitySourceEffect(gainedAbility, Duration.WhileOnBattlefield), HellbentCondition.instance, "and has \"{B}: Regenerate {this}.\"")); diff --git a/Mage.Sets/src/mage/cards/g/GodFavoredGeneral.java b/Mage.Sets/src/mage/cards/g/GodFavoredGeneral.java index 18e71fe7452..8f15d680551 100644 --- a/Mage.Sets/src/mage/cards/g/GodFavoredGeneral.java +++ b/Mage.Sets/src/mage/cards/g/GodFavoredGeneral.java @@ -53,7 +53,7 @@ public class GodFavoredGeneral extends CardImpl { this.power = new MageInt(1); this.toughness = new MageInt(1); - // Inspired - Whenever God-Favored General becomes untapped, you may pay {2}{W}. If you do, create two 1/1 white Soldier enchantment creature tokens. + // Inspired — Whenever God-Favored General becomes untapped, you may pay {2}{W}. If you do, create two 1/1 white Soldier enchantment creature tokens. this.addAbility(new InspiredAbility(new DoIfCostPaid(new CreateTokenEffect(new GodFavoredGeneralSoldierToken(), 2), new ManaCostsImpl("{2}{W}")))); } diff --git a/Mage.Sets/src/mage/cards/g/GrizzlyFate.java b/Mage.Sets/src/mage/cards/g/GrizzlyFate.java index c4d920b6fe5..bd54800e618 100644 --- a/Mage.Sets/src/mage/cards/g/GrizzlyFate.java +++ b/Mage.Sets/src/mage/cards/g/GrizzlyFate.java @@ -55,7 +55,7 @@ public class GrizzlyFate extends CardImpl { Effect effect = new ConditionalOneShotEffect(new CreateTokenEffect(new BearToken(), 4), new CreateTokenEffect(new BearToken(), 2), new CardsInControllerGraveCondition(7), - "Create two 2/2 green Bear creature tokens.

Threshold - Create four 2/2 green Bear creature tokens instead if seven or more cards are in your graveyard."); + "Create two 2/2 green Bear creature tokens.

Threshold — Create four 2/2 green Bear creature tokens instead if seven or more cards are in your graveyard."); this.getSpellAbility().addEffect(effect); // Flashback {5}{G}{G} diff --git a/Mage.Sets/src/mage/cards/g/GuardianOfTazeem.java b/Mage.Sets/src/mage/cards/g/GuardianOfTazeem.java index 64996b3853d..4bbd31d00c0 100644 --- a/Mage.Sets/src/mage/cards/g/GuardianOfTazeem.java +++ b/Mage.Sets/src/mage/cards/g/GuardianOfTazeem.java @@ -69,7 +69,7 @@ public class GuardianOfTazeem extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); - // Landfall - Whenever a land enters the battlefield under you control, tap target creature an opponent controls. If that land is an Island, that creature doesn't untap during its controller's next untap step. + // Landfall — Whenever a land enters the battlefield under you control, tap target creature an opponent controls. If that land is an Island, that creature doesn't untap during its controller's next untap step. Ability ability = new GuardianOfTazeemTriggeredAbility(); ability.addTarget(new TargetCreaturePermanent(filter)); this.addAbility(ability); @@ -124,7 +124,7 @@ class GuardianOfTazeemTriggeredAbility extends TriggeredAbilityImpl { @Override public String getRule() { - return "Landfall - Whenever a land enters the battlefield under your control, " + super.getRule(); + return "Landfall — Whenever a land enters the battlefield under your control, " + super.getRule(); } } diff --git a/Mage.Sets/src/mage/cards/h/HeartlashCinder.java b/Mage.Sets/src/mage/cards/h/HeartlashCinder.java index 0606066095f..b6685e431de 100644 --- a/Mage.Sets/src/mage/cards/h/HeartlashCinder.java +++ b/Mage.Sets/src/mage/cards/h/HeartlashCinder.java @@ -67,7 +67,7 @@ public class HeartlashCinder extends CardImpl { // Chroma - When Heartlash Cinder enters the battlefield, it gets +X/+0 until end of turn, where X is the number of red mana symbols in the mana costs of permanents you control. ContinuousEffect effect = new BoostSourceEffect(new ChromaHeartlashCinderCount(), new StaticValue(0), Duration.EndOfTurn, true); - effect.setText("Chroma - When Heartlash Cinder enters the battlefield, it gets +X/+0 until end of turn, where X is the number of red mana symbols in the mana costs of permanents you control."); + effect.setText("Chroma — When Heartlash Cinder enters the battlefield, it gets +X/+0 until end of turn, where X is the number of red mana symbols in the mana costs of permanents you control."); this.addAbility(new EntersBattlefieldTriggeredAbility(effect, false, true)); } diff --git a/Mage.Sets/src/mage/cards/h/HeirOfTheWilds.java b/Mage.Sets/src/mage/cards/h/HeirOfTheWilds.java index 0b78fed34f6..4920ce96e55 100644 --- a/Mage.Sets/src/mage/cards/h/HeirOfTheWilds.java +++ b/Mage.Sets/src/mage/cards/h/HeirOfTheWilds.java @@ -61,7 +61,7 @@ public class HeirOfTheWilds extends CardImpl { Ability ability = new ConditionalTriggeredAbility( new AttacksTriggeredAbility(new BoostSourceEffect(1,1,Duration.EndOfTurn), false), FerociousCondition.instance, - "Ferocious - Whenever {this} attacks, if you control a creature with power 4 or greater, {this} gets +1/+1 until end of turn." + "Ferocious — Whenever {this} attacks, if you control a creature with power 4 or greater, {this} gets +1/+1 until end of turn." ); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/h/HeroOfGomaFada.java b/Mage.Sets/src/mage/cards/h/HeroOfGomaFada.java index 96233fd4d1a..ce03d6341b9 100644 --- a/Mage.Sets/src/mage/cards/h/HeroOfGomaFada.java +++ b/Mage.Sets/src/mage/cards/h/HeroOfGomaFada.java @@ -54,7 +54,7 @@ public class HeroOfGomaFada extends CardImpl { this.power = new MageInt(4); this.toughness = new MageInt(3); - // Rally - Whenever Hero of Goma Fada or another Ally enters the battlefield under your control, creatures you control gain indestructible until end of turn. + // Rally — Whenever Hero of Goma Fada or another Ally enters the battlefield under your control, creatures you control gain indestructible until end of turn. Ability ability = new AllyEntersBattlefieldTriggeredAbility( new GainAbilityAllEffect(IndestructibleAbility.getInstance(), Duration.EndOfTurn, new FilterControlledCreaturePermanent("creatures you control")), false); diff --git a/Mage.Sets/src/mage/cards/h/HeroOfIroas.java b/Mage.Sets/src/mage/cards/h/HeroOfIroas.java index a30f1f21fe5..748afba3402 100644 --- a/Mage.Sets/src/mage/cards/h/HeroOfIroas.java +++ b/Mage.Sets/src/mage/cards/h/HeroOfIroas.java @@ -63,7 +63,7 @@ public class HeroOfIroas extends CardImpl { // Aura spells you cast cost {1} less to cast. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SpellsCostReductionControllerEffect(filter, 1))); - // Heroic - Whenever you cast a spell that targets Hero of Iroas, put a +1/+1 counter on Hero of Iroas. + // Heroic — Whenever you cast a spell that targets Hero of Iroas, put a +1/+1 counter on Hero of Iroas. this.addAbility(new HeroicAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()))); } diff --git a/Mage.Sets/src/mage/cards/h/HeroOfLeinaTower.java b/Mage.Sets/src/mage/cards/h/HeroOfLeinaTower.java index 0acf76c40b5..54cc004eaac 100644 --- a/Mage.Sets/src/mage/cards/h/HeroOfLeinaTower.java +++ b/Mage.Sets/src/mage/cards/h/HeroOfLeinaTower.java @@ -60,7 +60,7 @@ public class HeroOfLeinaTower extends CardImpl { this.power = new MageInt(1); this.toughness = new MageInt(1); - // Heroic - Whenever you cast a spell that targets Hero of Leina Tower, you may pay {X}. If you do, put X +1/+1 counters on Hero of Leina Tower. + // Heroic — Whenever you cast a spell that targets Hero of Leina Tower, you may pay {X}. If you do, put X +1/+1 counters on Hero of Leina Tower. this.addAbility(new HeroicAbility(new HeroOfLeinaTowerEffect())); } diff --git a/Mage.Sets/src/mage/cards/h/HowlOfTheHorde.java b/Mage.Sets/src/mage/cards/h/HowlOfTheHorde.java index d6e46210fa7..4a709af6d7d 100644 --- a/Mage.Sets/src/mage/cards/h/HowlOfTheHorde.java +++ b/Mage.Sets/src/mage/cards/h/HowlOfTheHorde.java @@ -59,8 +59,8 @@ public class HowlOfTheHorde extends CardImpl { effect.setText("When you cast your next instant or sorcery spell this turn, copy that spell. You may choose new targets for the copy."); this.getSpellAbility().addEffect(effect); - // Raid - If you attacked with a creature this turn, when you cast your next instant or sorcery spell this turn, copy that spell an additional time. You may choose new targets for the copy. - this.getSpellAbility().addEffect(new ConditionalOneShotEffect(new CreateDelayedTriggeredAbilityEffect(new HowlOfTheHordeDelayedTriggeredAbility()), RaidCondition.instance, "

Raid - If you attacked with a creature this turn, when you cast your next instant or sorcery spell this turn, copy that spell an additional time. You may choose new targets for the copy.")); + // Raid — If you attacked with a creature this turn, when you cast your next instant or sorcery spell this turn, copy that spell an additional time. You may choose new targets for the copy. + this.getSpellAbility().addEffect(new ConditionalOneShotEffect(new CreateDelayedTriggeredAbilityEffect(new HowlOfTheHordeDelayedTriggeredAbility()), RaidCondition.instance, "

Raid — If you attacked with a creature this turn, when you cast your next instant or sorcery spell this turn, copy that spell an additional time. You may choose new targets for the copy.")); this.getSpellAbility().addWatcher(new PlayerAttackedWatcher()); } diff --git a/Mage.Sets/src/mage/cards/i/IcyBlast.java b/Mage.Sets/src/mage/cards/i/IcyBlast.java index d2c06f3d004..2dce926f881 100644 --- a/Mage.Sets/src/mage/cards/i/IcyBlast.java +++ b/Mage.Sets/src/mage/cards/i/IcyBlast.java @@ -56,7 +56,7 @@ public class IcyBlast extends CardImpl { this.getSpellAbility().addEffect(new TapTargetEffect("X target creatures")); this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 1, StaticFilters.FILTER_PERMANENT_CREATURE, false)); - // Ferocious - If you control a creature with power 4 or greater, those creatures don't untap during their controllers' next untap steps. + // Ferocious — If you control a creature with power 4 or greater, those creatures don't untap during their controllers' next untap steps. Effect effect = new ConditionalContinuousRuleModifyingEffect( new DontUntapInControllersNextUntapStepTargetEffect(), new LockedInCondition(FerociousCondition.instance)); diff --git a/Mage.Sets/src/mage/cards/i/InallaArchmageRitualist.java b/Mage.Sets/src/mage/cards/i/InallaArchmageRitualist.java index b425301391f..4fe37b08e47 100644 --- a/Mage.Sets/src/mage/cards/i/InallaArchmageRitualist.java +++ b/Mage.Sets/src/mage/cards/i/InallaArchmageRitualist.java @@ -96,7 +96,7 @@ public class InallaArchmageRitualist extends CardImpl { new InallaArchmageRitualistEffect(), new ManaCostsImpl("{1}"), "Pay {1} to create a token copy?"), filter, false, SetTargetPointer.PERMANENT, ""), SourceOnBattlefieldOrCommandZoneCondition.instance, - "Eminence - Whenever another nontoken Wizard enters the battlefield under your control, " + "Eminence — Whenever another nontoken Wizard enters the battlefield under your control, " + "{this} is in the command zone or on the battlefield, " + "you may pay {1}. If you do, create a token that's a copy of that Wizard. " + "That token gains haste. Exile it at the beginning of the next end step"); diff --git a/Mage.Sets/src/mage/cards/i/InfernalTutor.java b/Mage.Sets/src/mage/cards/i/InfernalTutor.java index 5e93fa0106f..9ae168485b8 100644 --- a/Mage.Sets/src/mage/cards/i/InfernalTutor.java +++ b/Mage.Sets/src/mage/cards/i/InfernalTutor.java @@ -65,7 +65,7 @@ public class InfernalTutor extends CardImpl { Effect effect = new ConditionalOneShotEffect( new SearchLibraryPutInHandEffect(new TargetCardInLibrary(new FilterCard()), false, true), HellbentCondition.instance, - "

Hellbent - If you have no cards in hand, instead search your library for a card, put it into your hand, then shuffle your library"); + "

Hellbent — If you have no cards in hand, instead search your library for a card, put it into your hand, then shuffle your library"); this.getSpellAbility().addEffect(effect); } diff --git a/Mage.Sets/src/mage/cards/i/InfuseWithTheElements.java b/Mage.Sets/src/mage/cards/i/InfuseWithTheElements.java index d9596b33668..baf48b212a9 100644 --- a/Mage.Sets/src/mage/cards/i/InfuseWithTheElements.java +++ b/Mage.Sets/src/mage/cards/i/InfuseWithTheElements.java @@ -50,7 +50,7 @@ public class InfuseWithTheElements extends CardImpl { public InfuseWithTheElements(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{3}{G}"); - // Converge - Put X +1/+1 counters on target creature, where X is the number of colors of mana spent to cast Infuse with the Elements. + // Converge — Put X +1/+1 counters on target creature, where X is the number of colors of mana spent to cast Infuse with the Elements. this.getSpellAbility().setAbilityWord(AbilityWord.CONVERGE); Effect effect = new AddCountersTargetEffect(CounterType.P1P1.createInstance(0), ColorsOfManaSpentToCastCount.getInstance()); effect.setText("Put X +1/+1 counters on target creature, where X is the number of colors of mana spent to cast {this}"); diff --git a/Mage.Sets/src/mage/cards/j/JaddiOffshoot.java b/Mage.Sets/src/mage/cards/j/JaddiOffshoot.java index d9a79655295..678feec5b91 100644 --- a/Mage.Sets/src/mage/cards/j/JaddiOffshoot.java +++ b/Mage.Sets/src/mage/cards/j/JaddiOffshoot.java @@ -51,7 +51,7 @@ public class JaddiOffshoot extends CardImpl { // Defender this.addAbility(DefenderAbility.getInstance()); - // Landfall - Whenever a land enters the battlefield under your control, you gain 1 life. + // Landfall — Whenever a land enters the battlefield under your control, you gain 1 life. this.addAbility(new LandfallAbility(new GainLifeEffect(1), false)); } diff --git a/Mage.Sets/src/mage/cards/j/JaggedPoppet.java b/Mage.Sets/src/mage/cards/j/JaggedPoppet.java index 7062dbf0e7b..b4828248895 100644 --- a/Mage.Sets/src/mage/cards/j/JaggedPoppet.java +++ b/Mage.Sets/src/mage/cards/j/JaggedPoppet.java @@ -66,7 +66,7 @@ public class JaggedPoppet extends CardImpl { Ability hellbentAbility = new ConditionalTriggeredAbility( new DealsCombatDamageToAPlayerTriggeredAbility(new JaggedPoppetDealsDamageEffect(), false, true), HellbentCondition.instance, - "Hellbent - Whenever {this} deals combat damage to a player, if you have no cards in hand, that player discards cards equal to the damage."); + "Hellbent — Whenever {this} deals combat damage to a player, if you have no cards in hand, that player discards cards equal to the damage."); hellbentAbility.setAbilityWord(AbilityWord.HELLBENT); this.addAbility(hellbentAbility); diff --git a/Mage.Sets/src/mage/cards/k/KalastriaHealer.java b/Mage.Sets/src/mage/cards/k/KalastriaHealer.java index df0c5a46b05..555957ee127 100644 --- a/Mage.Sets/src/mage/cards/k/KalastriaHealer.java +++ b/Mage.Sets/src/mage/cards/k/KalastriaHealer.java @@ -53,7 +53,7 @@ public class KalastriaHealer extends CardImpl { this.power = new MageInt(1); this.toughness = new MageInt(2); - // Rally - Whenever Kalastria Healer or another Ally enters the battlefield under your control, each opponent loses 1 life and you gain 1 life. + // Rally — Whenever Kalastria Healer or another Ally enters the battlefield under your control, each opponent loses 1 life and you gain 1 life. Ability ability = new AllyEntersBattlefieldTriggeredAbility(new LoseLifeOpponentsEffect(1), false); Effect effect = new GainLifeEffect(1); effect.setText("and you gain 1 life"); diff --git a/Mage.Sets/src/mage/cards/k/KirtarsWrath.java b/Mage.Sets/src/mage/cards/k/KirtarsWrath.java index 316dc58934b..7a8803a199c 100644 --- a/Mage.Sets/src/mage/cards/k/KirtarsWrath.java +++ b/Mage.Sets/src/mage/cards/k/KirtarsWrath.java @@ -58,7 +58,7 @@ public class KirtarsWrath extends CardImpl { new KirtarsWrathEffect(), new DestroyAllEffect(new FilterCreaturePermanent("all creatures"), true), new CardsInControllerGraveCondition(7), - "Destroy all creatures. They can't be regenerated.

Threshold - If seven or more cards are in your graveyard, instead destroy all creatures, then create two 1/1 white Spirit creature tokens with flying. Creatures destroyed this way can't be regenerated")); + "Destroy all creatures. They can't be regenerated.

Threshold — If seven or more cards are in your graveyard, instead destroy all creatures, then create two 1/1 white Spirit creature tokens with flying. Creatures destroyed this way can't be regenerated")); } diff --git a/Mage.Sets/src/mage/cards/k/KragmaButcher.java b/Mage.Sets/src/mage/cards/k/KragmaButcher.java index bae2fbb1134..0506b4be931 100644 --- a/Mage.Sets/src/mage/cards/k/KragmaButcher.java +++ b/Mage.Sets/src/mage/cards/k/KragmaButcher.java @@ -52,7 +52,7 @@ public class KragmaButcher extends CardImpl { this.power = new MageInt(2); this.toughness = new MageInt(3); - // Inspired - Whenever Kragma Butcher becomes untapped, it gets +2/+0 until end of turn. + // Inspired — Whenever Kragma Butcher becomes untapped, it gets +2/+0 until end of turn. Effect effect = new BoostSourceEffect(2,0, Duration.EndOfTurn); effect.setText("it gets +2/+0 until end of turn"); this.addAbility(new InspiredAbility(effect)); diff --git a/Mage.Sets/src/mage/cards/l/LanternScout.java b/Mage.Sets/src/mage/cards/l/LanternScout.java index c46ca86e3dc..83d22abe0dc 100644 --- a/Mage.Sets/src/mage/cards/l/LanternScout.java +++ b/Mage.Sets/src/mage/cards/l/LanternScout.java @@ -64,7 +64,7 @@ public class LanternScout extends CardImpl { new CardIdPredicate(this.getId()), new SubtypePredicate(SubType.ALLY))); - // Rally - Whenever Lantern Scout or another Ally enters the battlefield under your control, creatures you control gain lifelink until end of turn. + // Rally — Whenever Lantern Scout or another Ally enters the battlefield under your control, creatures you control gain lifelink until end of turn. Effect effect = new GainAbilityAllEffect(LifelinkAbility.getInstance(), Duration.EndOfTurn, new FilterControlledCreaturePermanent()); effect.setText("creatures you control gain lifelink until end of turn"); Ability ability = new AllyEntersBattlefieldTriggeredAbility( diff --git a/Mage.Sets/src/mage/cards/l/LightFromWithin.java b/Mage.Sets/src/mage/cards/l/LightFromWithin.java index ae8eca23ad7..b394c05f10e 100644 --- a/Mage.Sets/src/mage/cards/l/LightFromWithin.java +++ b/Mage.Sets/src/mage/cards/l/LightFromWithin.java @@ -68,7 +68,7 @@ public class LightFromWithin extends CardImpl { // Chroma - Each creature you control gets +1/+1 for each white mana symbol in its mana cost. Effect effect = new LightFromWithinEffect(); - effect.setText("Chroma - Each creature you control gets +1/+1 for each white mana symbol in its mana cost."); + effect.setText("Chroma — Each creature you control gets +1/+1 for each white mana symbol in its mana cost."); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); } diff --git a/Mage.Sets/src/mage/cards/l/LightningSurge.java b/Mage.Sets/src/mage/cards/l/LightningSurge.java index 0c80ac11a06..c5697dfa6d0 100644 --- a/Mage.Sets/src/mage/cards/l/LightningSurge.java +++ b/Mage.Sets/src/mage/cards/l/LightningSurge.java @@ -54,7 +54,7 @@ public class LightningSurge extends CardImpl { Effect effect = new ConditionalOneShotEffect(new DamageTargetEffect(6, false), new DamageTargetEffect(4), new CardsInControllerGraveCondition(7), - "{this} deals 4 damage to any target.

Threshold - {this} deals 6 damage to that permanent or player and the damage can't be prevented instead if seven or more cards are in your graveyard."); + "{this} deals 4 damage to any target.

Threshold — {this} deals 6 damage to that permanent or player and the damage can't be prevented instead if seven or more cards are in your graveyard."); this.getSpellAbility().addTarget(new TargetAnyTarget()); this.getSpellAbility().addEffect(effect); diff --git a/Mage.Sets/src/mage/cards/l/LurkingArynx.java b/Mage.Sets/src/mage/cards/l/LurkingArynx.java index 22bac9ce5be..3edc5c1daf1 100644 --- a/Mage.Sets/src/mage/cards/l/LurkingArynx.java +++ b/Mage.Sets/src/mage/cards/l/LurkingArynx.java @@ -56,7 +56,7 @@ public class LurkingArynx extends CardImpl { this.power = new MageInt(3); this.toughness = new MageInt(5); - // Formidable - {2}{G}: Target creature blocks Lurking Arynx this turn if able. Activate this ability only if creatures you control have total power 8 or greater. + // Formidable — {2}{G}: Target creature blocks Lurking Arynx this turn if able. Activate this ability only if creatures you control have total power 8 or greater. Ability ability = new ActivateIfConditionActivatedAbility( Zone.BATTLEFIELD, new MustBeBlockedByTargetSourceEffect(Duration.EndOfTurn), diff --git a/Mage.Sets/src/mage/cards/m/MagisterOfWorth.java b/Mage.Sets/src/mage/cards/m/MagisterOfWorth.java index 1eaf8660a05..fdf4899bbee 100644 --- a/Mage.Sets/src/mage/cards/m/MagisterOfWorth.java +++ b/Mage.Sets/src/mage/cards/m/MagisterOfWorth.java @@ -84,7 +84,7 @@ class MagisterOfWorthVoteEffect extends OneShotEffect { MagisterOfWorthVoteEffect() { super(Outcome.Benefit); - this.staticText = "Will of the council - When {this} enters the battlefield, starting with you, each player votes for grace or condemnation. If grace gets more votes, each player returns each creature card from their graveyard to the battlefield. If condemnation gets more votes or the vote is tied, destroy all creatures other than {this}."; + this.staticText = "Will of the council — When {this} enters the battlefield, starting with you, each player votes for grace or condemnation. If grace gets more votes, each player returns each creature card from their graveyard to the battlefield. If condemnation gets more votes or the vote is tied, destroy all creatures other than {this}."; } MagisterOfWorthVoteEffect(final MagisterOfWorthVoteEffect effect) { diff --git a/Mage.Sets/src/mage/cards/m/MaliciousAffliction.java b/Mage.Sets/src/mage/cards/m/MaliciousAffliction.java index 1eaa3f14215..c626237b6fe 100644 --- a/Mage.Sets/src/mage/cards/m/MaliciousAffliction.java +++ b/Mage.Sets/src/mage/cards/m/MaliciousAffliction.java @@ -68,7 +68,7 @@ public class MaliciousAffliction extends CardImpl { Ability ability = new ConditionalTriggeredAbility( new CastSourceTriggeredAbility(new CopySourceSpellEffect(), true), new LockedInCondition(MorbidCondition.instance), - "Morbid - When you cast {this}, if a creature died this turn, you may copy {this} and may choose a new target for the copy"); + "Morbid — When you cast {this}, if a creature died this turn, you may copy {this} and may choose a new target for the copy"); ability.setRuleAtTheTop(true); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/m/MarduHeartPiercer.java b/Mage.Sets/src/mage/cards/m/MarduHeartPiercer.java index bce976a76bf..57ec3fab09d 100644 --- a/Mage.Sets/src/mage/cards/m/MarduHeartPiercer.java +++ b/Mage.Sets/src/mage/cards/m/MarduHeartPiercer.java @@ -57,7 +57,7 @@ public class MarduHeartPiercer extends CardImpl { // Raid - When Mardu Heart-Piercer enters the battlefield, if you attacked with a creature this turn, Mardu Heart-Piercer deals 2 damage to any target. Ability ability = new ConditionalTriggeredAbility(new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(2)), RaidCondition.instance, - "Raid - When {this} enters the battlefield, if you attacked with a creature this turn, {this} deals 2 damage to any target."); + "Raid — When {this} enters the battlefield, if you attacked with a creature this turn, {this} deals 2 damage to any target."); ability.addTarget(new TargetAnyTarget()); this.addAbility(ability, new PlayerAttackedWatcher()); } diff --git a/Mage.Sets/src/mage/cards/m/MarduHordechief.java b/Mage.Sets/src/mage/cards/m/MarduHordechief.java index 53cd6c4d662..b36e97d1ee2 100644 --- a/Mage.Sets/src/mage/cards/m/MarduHordechief.java +++ b/Mage.Sets/src/mage/cards/m/MarduHordechief.java @@ -54,7 +54,7 @@ public class MarduHordechief extends CardImpl { this.power = new MageInt(2); this.toughness = new MageInt(3); - // Raid - When Mardu Hordechief enters the battlefield, if you attacked with a creature this turn, create a 1/1 white Warrior creature token + // Raid — When Mardu Hordechief enters the battlefield, if you attacked with a creature this turn, create a 1/1 white Warrior creature token this.addAbility(new ConditionalTriggeredAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new WarriorToken())), RaidCondition.instance, "Raid — When {this} enters the battlefield, if you attacked with a creature this turn, create a 1/1 white Warrior creature token."), new PlayerAttackedWatcher()); diff --git a/Mage.Sets/src/mage/cards/m/MarduSkullhunter.java b/Mage.Sets/src/mage/cards/m/MarduSkullhunter.java index 53c90d3d2bc..16e2b5a3711 100644 --- a/Mage.Sets/src/mage/cards/m/MarduSkullhunter.java +++ b/Mage.Sets/src/mage/cards/m/MarduSkullhunter.java @@ -61,7 +61,7 @@ public class MarduSkullhunter extends CardImpl { // Raid - When Mardu Skullhunter enters the battlefield, if you attacked with a creature this turn, target opponent discards a card. Ability ability = new ConditionalTriggeredAbility(new EntersBattlefieldTriggeredAbility(new DiscardTargetEffect(1)), RaidCondition.instance, - "Raid - When {this} enters the battlefield, if you attacked with a creature this turn, target opponent discards a card."); + "Raid — When {this} enters the battlefield, if you attacked with a creature this turn, target opponent discards a card."); ability.addTarget(new TargetOpponent()); this.addAbility(ability, new PlayerAttackedWatcher()); } diff --git a/Mage.Sets/src/mage/cards/m/MeletisAstronomer.java b/Mage.Sets/src/mage/cards/m/MeletisAstronomer.java index 240c02d8620..be245129c54 100644 --- a/Mage.Sets/src/mage/cards/m/MeletisAstronomer.java +++ b/Mage.Sets/src/mage/cards/m/MeletisAstronomer.java @@ -58,7 +58,7 @@ public class MeletisAstronomer extends CardImpl { this.power = new MageInt(1); this.toughness = new MageInt(3); - // Heroic - Whenever you cast a spell that targets Meletis Astronomer, look at the top three cards of your library. You may reveal an enchantment card from among them and put it into your hand. Put the rest on the bottom of your library in any order. + // Heroic — Whenever you cast a spell that targets Meletis Astronomer, look at the top three cards of your library. You may reveal an enchantment card from among them and put it into your hand. Put the rest on the bottom of your library in any order. this.addAbility(new HeroicAbility(new LookLibraryAndPickControllerEffect(3, 1, filter, true, false, Zone.HAND, true), false)); } diff --git a/Mage.Sets/src/mage/cards/m/Mindreaver.java b/Mage.Sets/src/mage/cards/m/Mindreaver.java index 0040ff54856..24370b26641 100644 --- a/Mage.Sets/src/mage/cards/m/Mindreaver.java +++ b/Mage.Sets/src/mage/cards/m/Mindreaver.java @@ -72,7 +72,7 @@ public class Mindreaver extends CardImpl { this.power = new MageInt(2); this.toughness = new MageInt(1); - // Heroic - Whenever you cast a spell that targets Mindreaver, exile the top three cards of target player's library. + // Heroic — Whenever you cast a spell that targets Mindreaver, exile the top three cards of target player's library. Ability ability = new HeroicAbility(new MindreaverExileEffect(), false); ability.addTarget(new TargetPlayer()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/m/MindsAglow.java b/Mage.Sets/src/mage/cards/m/MindsAglow.java index 6b32184ec4f..2f2137d1f8d 100644 --- a/Mage.Sets/src/mage/cards/m/MindsAglow.java +++ b/Mage.Sets/src/mage/cards/m/MindsAglow.java @@ -68,7 +68,7 @@ class MindsAglowEffect extends OneShotEffect { public MindsAglowEffect() { super(Outcome.Detriment); - this.staticText = "Join forces - Starting with you, each player may pay any amount of mana. Each player draws X cards, where X is the total amount of mana paid this way"; + this.staticText = "Join forces — Starting with you, each player may pay any amount of mana. Each player draws X cards, where X is the total amount of mana paid this way"; } public MindsAglowEffect(final MindsAglowEffect effect) { diff --git a/Mage.Sets/src/mage/cards/m/MoltenPsyche.java b/Mage.Sets/src/mage/cards/m/MoltenPsyche.java index 07700b22e2e..57007c38199 100644 --- a/Mage.Sets/src/mage/cards/m/MoltenPsyche.java +++ b/Mage.Sets/src/mage/cards/m/MoltenPsyche.java @@ -76,7 +76,7 @@ class MoltenPsycheEffect extends OneShotEffect { public MoltenPsycheEffect() { super(Outcome.Neutral); staticText = "Each player shuffles the cards from their hand into their library, then draws that many cards.\n" - + "Metalcraft - If you control three or more artifacts, {this} deals damage to each opponent equal to the number of cards that player has drawn this turn."; + + "Metalcraft — If you control three or more artifacts, {this} deals damage to each opponent equal to the number of cards that player has drawn this turn."; } public MoltenPsycheEffect(final MoltenPsycheEffect effect) { diff --git a/Mage.Sets/src/mage/cards/m/MurasaRanger.java b/Mage.Sets/src/mage/cards/m/MurasaRanger.java index 34dba086ff7..0f1c5584894 100644 --- a/Mage.Sets/src/mage/cards/m/MurasaRanger.java +++ b/Mage.Sets/src/mage/cards/m/MurasaRanger.java @@ -52,7 +52,7 @@ public class MurasaRanger extends CardImpl { this.power = new MageInt(3); this.toughness = new MageInt(3); - // Landfall - Whenever a land enters the battlefield under your control, you may pay {3}{G}. IF you do, put two +1/+1 counters on Murasa Ranger. + // Landfall — Whenever a land enters the battlefield under your control, you may pay {3}{G}. IF you do, put two +1/+1 counters on Murasa Ranger. this.addAbility(new LandfallAbility(new DoIfCostPaid(new AddCountersSourceEffect(CounterType.P1P1.createInstance(2)), new ManaCostsImpl("{3}{G}")), false)); } diff --git a/Mage.Sets/src/mage/cards/n/NavigatorsRuin.java b/Mage.Sets/src/mage/cards/n/NavigatorsRuin.java index 5b5dc9bd4aa..6c271933647 100644 --- a/Mage.Sets/src/mage/cards/n/NavigatorsRuin.java +++ b/Mage.Sets/src/mage/cards/n/NavigatorsRuin.java @@ -53,7 +53,7 @@ public class NavigatorsRuin extends CardImpl { Ability ability = new ConditionalTriggeredAbility( new BeginningOfEndStepTriggeredAbility(new PutLibraryIntoGraveTargetEffect(4), TargetController.YOU, false), RaidCondition.instance, - "Raid - At the beginning of your end step, if you attacked with a creature this turn, target opponent puts the top four cards of their library into their graveyard."); + "Raid — At the beginning of your end step, if you attacked with a creature this turn, target opponent puts the top four cards of their library into their graveyard."); ability.addTarget(new TargetOpponent()); this.addAbility(ability, new PlayerAttackedWatcher()); } diff --git a/Mage.Sets/src/mage/cards/n/NecromanticSummons.java b/Mage.Sets/src/mage/cards/n/NecromanticSummons.java index a2c07949d2c..7a9924e71b7 100644 --- a/Mage.Sets/src/mage/cards/n/NecromanticSummons.java +++ b/Mage.Sets/src/mage/cards/n/NecromanticSummons.java @@ -60,8 +60,8 @@ public class NecromanticSummons extends CardImpl { this.getSpellAbility().addEffect(new ReturnFromGraveyardToBattlefieldTargetEffect()); this.getSpellAbility().addTarget(new TargetCardInGraveyard(new FilterCreatureCard("creature card from a graveyard"))); - // Spell mastery - If there are two or more instant and/or sorcery cards in your graveyard, that creature enters the battlefield with two additional +1/+1 counters on it. - this.getSpellAbility().addEffect(new InfoEffect("\"
Spell mastery - If there are two or more instant and/or sorcery cards in your graveyard, that creature enters the battlefield with two additional +1/+1 counters on it\"")); + // Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, that creature enters the battlefield with two additional +1/+1 counters on it. + this.getSpellAbility().addEffect(new InfoEffect("\"
Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, that creature enters the battlefield with two additional +1/+1 counters on it\"")); } public NecromanticSummons(final NecromanticSummons card) { diff --git a/Mage.Sets/src/mage/cards/o/OmnathLocusOfRage.java b/Mage.Sets/src/mage/cards/o/OmnathLocusOfRage.java index 9f422026a8e..1d678ffe5c0 100644 --- a/Mage.Sets/src/mage/cards/o/OmnathLocusOfRage.java +++ b/Mage.Sets/src/mage/cards/o/OmnathLocusOfRage.java @@ -66,7 +66,7 @@ public class OmnathLocusOfRage extends CardImpl { this.power = new MageInt(5); this.toughness = new MageInt(5); - // Landfall - Whenever a land enters the battlefield under your control, create a 5/5 red and green Elemental creature token. + // Landfall — Whenever a land enters the battlefield under your control, create a 5/5 red and green Elemental creature token. this.addAbility(new LandfallAbility(new CreateTokenEffect(new OmnathElementalToken()), false)); // Whenever Omnath, Locus of Rage or another Elemental you control dies, Omnath deals 3 damage to any target. diff --git a/Mage.Sets/src/mage/cards/o/OranRiefHydra.java b/Mage.Sets/src/mage/cards/o/OranRiefHydra.java index e877cd23380..e80023a5149 100644 --- a/Mage.Sets/src/mage/cards/o/OranRiefHydra.java +++ b/Mage.Sets/src/mage/cards/o/OranRiefHydra.java @@ -61,7 +61,7 @@ public class OranRiefHydra extends CardImpl { // Trample this.addAbility(TrampleAbility.getInstance()); - // Landfall - Whenever a land enters the battlefield under your control, put a +1/+1 counter on Oran-Rief Hydra. + // Landfall — Whenever a land enters the battlefield under your control, put a +1/+1 counter on Oran-Rief Hydra. // If that land is a Forest, put two +1/+1 counters on Oran-Rief Hydra instead. this.addAbility(new OranRiefHydraTriggeredAbility()); } @@ -78,7 +78,7 @@ public class OranRiefHydra extends CardImpl { class OranRiefHydraTriggeredAbility extends TriggeredAbilityImpl { - private static final String text = "Landfall - Whenever a land enters the battlefield under your control, put a +1/+1 counter on {this}. " + private static final String text = "Landfall — Whenever a land enters the battlefield under your control, put a +1/+1 counter on {this}. " + "If that land is a Forest, put two +1/+1 counters on {this} instead."; public OranRiefHydraTriggeredAbility() { diff --git a/Mage.Sets/src/mage/cards/o/OreskosSunGuide.java b/Mage.Sets/src/mage/cards/o/OreskosSunGuide.java index fd0fe3e97af..e501dbd603b 100644 --- a/Mage.Sets/src/mage/cards/o/OreskosSunGuide.java +++ b/Mage.Sets/src/mage/cards/o/OreskosSunGuide.java @@ -50,7 +50,7 @@ public class OreskosSunGuide extends CardImpl { this.power = new MageInt(2); this.toughness = new MageInt(2); - // Inspired - Whenever Oreskos Sun Guide becomes untapped, you gain 2 life. + // Inspired — Whenever Oreskos Sun Guide becomes untapped, you gain 2 life. this.addAbility(new InspiredAbility(new GainLifeEffect(2))); } diff --git a/Mage.Sets/src/mage/cards/o/OutrageShaman.java b/Mage.Sets/src/mage/cards/o/OutrageShaman.java index fddcf54d5cd..405a8ab90b0 100644 --- a/Mage.Sets/src/mage/cards/o/OutrageShaman.java +++ b/Mage.Sets/src/mage/cards/o/OutrageShaman.java @@ -57,7 +57,7 @@ public class OutrageShaman extends CardImpl { // Chroma - When Outrage Shaman enters the battlefield, it deals damage to target creature equal to the number of red mana symbols in the mana costs of permanents you control. Effect effect = new DamageTargetEffect(new ChromaOutrageShamanCount()); - effect.setText("Chroma - When Outrage Shaman enters the battlefield, it deals damage to target creature equal to the number of red mana symbols in the mana costs of permanents you control."); + effect.setText("Chroma — When Outrage Shaman enters the battlefield, it deals damage to target creature equal to the number of red mana symbols in the mana costs of permanents you control."); Ability ability = new EntersBattlefieldTriggeredAbility(effect, false, true); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/p/PainSeer.java b/Mage.Sets/src/mage/cards/p/PainSeer.java index bcf3ff7163b..f14ac0d4b75 100644 --- a/Mage.Sets/src/mage/cards/p/PainSeer.java +++ b/Mage.Sets/src/mage/cards/p/PainSeer.java @@ -58,7 +58,7 @@ public class PainSeer extends CardImpl { this.power = new MageInt(2); this.toughness = new MageInt(2); - // Inspired - Whenever Pain Seer becomes untapped, reveal the top card of your library and put that card into your hand. You lose life equal to that card's converted mana cost. + // Inspired — Whenever Pain Seer becomes untapped, reveal the top card of your library and put that card into your hand. You lose life equal to that card's converted mana cost. this.addAbility(new InspiredAbility(new PainSeerEffect())); } diff --git a/Mage.Sets/src/mage/cards/p/PainfulTruths.java b/Mage.Sets/src/mage/cards/p/PainfulTruths.java index f0cbfb07860..52de989f2a3 100644 --- a/Mage.Sets/src/mage/cards/p/PainfulTruths.java +++ b/Mage.Sets/src/mage/cards/p/PainfulTruths.java @@ -46,7 +46,7 @@ public class PainfulTruths extends CardImpl { public PainfulTruths(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{2}{B}"); - // Converge - You draw X cards and lose X life, where X is the number of colors of mana spent to cast Painful Truths. + // Converge — You draw X cards and lose X life, where X is the number of colors of mana spent to cast Painful Truths. getSpellAbility().setAbilityWord(AbilityWord.CONVERGE); Effect effect = new DrawCardSourceControllerEffect(ColorsOfManaSpentToCastCount.getInstance()); effect.setText("You draw X cards"); diff --git a/Mage.Sets/src/mage/cards/p/PheresBandRaiders.java b/Mage.Sets/src/mage/cards/p/PheresBandRaiders.java index e8c3759b54f..d01fa3ca098 100644 --- a/Mage.Sets/src/mage/cards/p/PheresBandRaiders.java +++ b/Mage.Sets/src/mage/cards/p/PheresBandRaiders.java @@ -53,7 +53,7 @@ public class PheresBandRaiders extends CardImpl { this.power = new MageInt(5); this.toughness = new MageInt(5); - // Inspired - Whenever Pheres-Band Raiders becomes untapped, you may pay {2}{G}. If you do, create a 3/3 green Centaur enchantment creature token. + // Inspired — Whenever Pheres-Band Raiders becomes untapped, you may pay {2}{G}. If you do, create a 3/3 green Centaur enchantment creature token. this.addAbility(new InspiredAbility(new DoIfCostPaid(new CreateTokenEffect(new CentaurEnchantmentCreatureToken()), new ManaCostsImpl("{2}{G}")))); } diff --git a/Mage.Sets/src/mage/cards/p/PheresBandTromper.java b/Mage.Sets/src/mage/cards/p/PheresBandTromper.java index 5126a381bc3..a662f67e2df 100644 --- a/Mage.Sets/src/mage/cards/p/PheresBandTromper.java +++ b/Mage.Sets/src/mage/cards/p/PheresBandTromper.java @@ -51,7 +51,7 @@ public class PheresBandTromper extends CardImpl { this.power = new MageInt(3); this.toughness = new MageInt(3); - // Inspired - Whenever Pheres-Band Tromper becomes untapped, put a +1/+1 counter on it. + // Inspired — Whenever Pheres-Band Tromper becomes untapped, put a +1/+1 counter on it. this.addAbility(new InspiredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()))); } diff --git a/Mage.Sets/src/mage/cards/p/PhosphorescentFeast.java b/Mage.Sets/src/mage/cards/p/PhosphorescentFeast.java index 62fb26d2330..fc421b28974 100644 --- a/Mage.Sets/src/mage/cards/p/PhosphorescentFeast.java +++ b/Mage.Sets/src/mage/cards/p/PhosphorescentFeast.java @@ -56,7 +56,7 @@ public class PhosphorescentFeast extends CardImpl { // Chroma - Reveal any number of cards in your hand. You gain 2 life for each green mana symbol in those cards' mana costs. Effect effect = new PhosphorescentFeastEffect(); - effect.setText("Chroma - Reveal any number of cards in your hand. You gain 2 life for each green mana symbol in those cards' mana costs."); + effect.setText("Chroma — Reveal any number of cards in your hand. You gain 2 life for each green mana symbol in those cards' mana costs."); this.getSpellAbility().addEffect(effect); } diff --git a/Mage.Sets/src/mage/cards/p/PredatorsHowl.java b/Mage.Sets/src/mage/cards/p/PredatorsHowl.java index 9390c6c24d3..71aeffc0fe5 100644 --- a/Mage.Sets/src/mage/cards/p/PredatorsHowl.java +++ b/Mage.Sets/src/mage/cards/p/PredatorsHowl.java @@ -52,7 +52,7 @@ public class PredatorsHowl extends CardImpl { new CreateTokenEffect(new WolfToken(), 3), new CreateTokenEffect(new WolfToken(), 1), MorbidCondition.instance, - "Create a 2/2 green Wolf creature token.

Morbid - Create three 2/2 green Wolf creature tokens instead if a creature died this turn."); + "Create a 2/2 green Wolf creature token.

Morbid — Create three 2/2 green Wolf creature tokens instead if a creature died this turn."); this.getSpellAbility().addEffect(effect); } diff --git a/Mage.Sets/src/mage/cards/p/Primalcrux.java b/Mage.Sets/src/mage/cards/p/Primalcrux.java index ab41acd0d18..a46e610afa4 100644 --- a/Mage.Sets/src/mage/cards/p/Primalcrux.java +++ b/Mage.Sets/src/mage/cards/p/Primalcrux.java @@ -64,7 +64,7 @@ public class Primalcrux extends CardImpl { // Chroma - Primalcrux's power and toughness are each equal to the number of green mana symbols in the mana costs of permanents you control. Effect effect = new SetPowerToughnessSourceEffect(new ChromaPrimalcruxCount(), Duration.WhileOnBattlefield); - effect.setText("Chroma - Primalcrux's power and toughness are each equal to the number of green mana symbols in the mana costs of permanents you control."); + effect.setText("Chroma — Primalcrux's power and toughness are each equal to the number of green mana symbols in the mana costs of permanents you control."); this.addAbility(new SimpleStaticAbility(Zone.ALL, effect)); } diff --git a/Mage.Sets/src/mage/cards/p/PrismArray.java b/Mage.Sets/src/mage/cards/p/PrismArray.java index fce1925dbe0..d4a807fa806 100644 --- a/Mage.Sets/src/mage/cards/p/PrismArray.java +++ b/Mage.Sets/src/mage/cards/p/PrismArray.java @@ -53,7 +53,7 @@ public class PrismArray extends CardImpl { public PrismArray(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{4}{U}"); - // Converge - Prism Array enters the battlefield with a crystal counter on it for each color of mana spent to cast it. + // Converge — Prism Array enters the battlefield with a crystal counter on it for each color of mana spent to cast it. this.addAbility(new EntersBattlefieldAbility( new AddCountersSourceEffect(CounterType.CRYSTAL.createInstance(), ColorsOfManaSpentToCastCount.getInstance(), true), null, "Converge — {this} enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it.", null)); diff --git a/Mage.Sets/src/mage/cards/p/ProteanRaider.java b/Mage.Sets/src/mage/cards/p/ProteanRaider.java index 1949db295e4..108657c6a8b 100644 --- a/Mage.Sets/src/mage/cards/p/ProteanRaider.java +++ b/Mage.Sets/src/mage/cards/p/ProteanRaider.java @@ -52,7 +52,7 @@ public class ProteanRaider extends CardImpl { this.power = new MageInt(2); this.toughness = new MageInt(2); - // Raid - If you attacked with a creature this turn, you may have Protean Raider enter the battlefield as a copy of any creature on the battlefield. + // Raid — If you attacked with a creature this turn, you may have Protean Raider enter the battlefield as a copy of any creature on the battlefield. Ability ability = new EntersBattlefieldAbility(new CopyPermanentEffect(), true, RaidCondition.instance, "Raid — If you attacked with a creature this turn, you may have {this} enter the battlefield as a copy of any creature on the battlefield.", ""); this.addAbility(ability, new PlayerAttackedWatcher()); diff --git a/Mage.Sets/src/mage/cards/r/RaidersWake.java b/Mage.Sets/src/mage/cards/r/RaidersWake.java index 0cfd603bf1b..6f5cbee073f 100644 --- a/Mage.Sets/src/mage/cards/r/RaidersWake.java +++ b/Mage.Sets/src/mage/cards/r/RaidersWake.java @@ -58,7 +58,7 @@ public class RaidersWake extends CardImpl { // Raid — At the beginning of your end step, if you attacked with a creature this turn, target opponent discards a card. Ability ability = new ConditionalTriggeredAbility( new BeginningOfEndStepTriggeredAbility(new DiscardTargetEffect(1), TargetController.YOU, false), RaidCondition.instance, - "Raid - At the beginning of your end step, if you attacked with a creature this turn, target opponent discards a card."); + "Raid — At the beginning of your end step, if you attacked with a creature this turn, target opponent discards a card."); ability.addTarget(new TargetOpponent()); this.addAbility(ability, new PlayerAttackedWatcher()); } diff --git a/Mage.Sets/src/mage/cards/r/RancidEarth.java b/Mage.Sets/src/mage/cards/r/RancidEarth.java index 7aed5eebb9c..dd850640733 100644 --- a/Mage.Sets/src/mage/cards/r/RancidEarth.java +++ b/Mage.Sets/src/mage/cards/r/RancidEarth.java @@ -57,7 +57,7 @@ public class RancidEarth extends CardImpl { new RancidEarthEffect(), new DestroyTargetEffect(), new CardsInControllerGraveCondition(7), - "Destroy target land.

Threshold - If seven or more cards are in your graveyard, instead destroy that land and Rancid Earth deals 1 damage to each creature and each player.")); + "Destroy target land.

Threshold — If seven or more cards are in your graveyard, instead destroy that land and Rancid Earth deals 1 damage to each creature and each player.")); this.getSpellAbility().addTarget(new TargetLandPermanent()); } diff --git a/Mage.Sets/src/mage/cards/r/RetreatToEmeria.java b/Mage.Sets/src/mage/cards/r/RetreatToEmeria.java index 28e4315a976..899d84206f6 100644 --- a/Mage.Sets/src/mage/cards/r/RetreatToEmeria.java +++ b/Mage.Sets/src/mage/cards/r/RetreatToEmeria.java @@ -47,7 +47,7 @@ public class RetreatToEmeria extends CardImpl { public RetreatToEmeria(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}"); - // Landfall - Whenever a land enters the battlefield under you control, choose one - Create a 1/1 white Kor Ally creature token; or Creatures you control get +1/+1 until end of turn. + // Landfall — Whenever a land enters the battlefield under you control, choose one - Create a 1/1 white Kor Ally creature token; or Creatures you control get +1/+1 until end of turn. LandfallAbility ability = new LandfallAbility(new CreateTokenEffect(new KorAllyToken()), false); Mode mode = new Mode(); mode.getEffects().add(new BoostControlledEffect(1, 1, Duration.EndOfTurn)); diff --git a/Mage.Sets/src/mage/cards/r/RoarOfChallenge.java b/Mage.Sets/src/mage/cards/r/RoarOfChallenge.java index 18baa778169..660fb9308b6 100644 --- a/Mage.Sets/src/mage/cards/r/RoarOfChallenge.java +++ b/Mage.Sets/src/mage/cards/r/RoarOfChallenge.java @@ -52,7 +52,7 @@ public class RoarOfChallenge extends CardImpl { // All creatures able to block target creature this turn do so. this.getSpellAbility().addEffect(new MustBeBlockedByAllTargetEffect(Duration.EndOfTurn)); - // Ferocious - That creature gains indestructible until end of turn if you control a creature with power 4 or greater. + // Ferocious — That creature gains indestructible until end of turn if you control a creature with power 4 or greater. this.getSpellAbility().addEffect(new ConditionalContinuousEffect( new GainAbilityTargetEffect(IndestructibleAbility.getInstance(), Duration.EndOfTurn), new LockedInCondition(FerociousCondition.instance), diff --git a/Mage.Sets/src/mage/cards/r/RuinRaider.java b/Mage.Sets/src/mage/cards/r/RuinRaider.java index 3c69a9b1a21..9b7f7e76075 100644 --- a/Mage.Sets/src/mage/cards/r/RuinRaider.java +++ b/Mage.Sets/src/mage/cards/r/RuinRaider.java @@ -67,7 +67,7 @@ public class RuinRaider extends CardImpl { Ability ability = new ConditionalTriggeredAbility( new BeginningOfEndStepTriggeredAbility(new RuinRaiderEffect(), TargetController.YOU, false), RaidCondition.instance, - "Raid - At the beginning of your end step, if you attacked with a creature this turn, " + "Raid — At the beginning of your end step, if you attacked with a creature this turn, " + "reveal the top card of your library and put that card into your hand. " + "You lose life equal to the card's converted mana cost."); this.addAbility(ability, new PlayerAttackedWatcher()); diff --git a/Mage.Sets/src/mage/cards/s/SabertoothOutrider.java b/Mage.Sets/src/mage/cards/s/SabertoothOutrider.java index ac25f60d476..70a5bb55798 100644 --- a/Mage.Sets/src/mage/cards/s/SabertoothOutrider.java +++ b/Mage.Sets/src/mage/cards/s/SabertoothOutrider.java @@ -57,7 +57,7 @@ public class SabertoothOutrider extends CardImpl { // Trample this.addAbility(TrampleAbility.getInstance()); - // Formidable - Whenever Sabertooth Outrider attacks, if creatures you control have total power 8 or greater, Sabertooth Outrider gains first strike until end of turn. + // Formidable — Whenever Sabertooth Outrider attacks, if creatures you control have total power 8 or greater, Sabertooth Outrider gains first strike until end of turn. this.addAbility(new ConditionalTriggeredAbility( new AttacksTriggeredAbility(new GainAbilitySourceEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn), false), FormidableCondition.instance, diff --git a/Mage.Sets/src/mage/cards/s/SatyrNyxSmith.java b/Mage.Sets/src/mage/cards/s/SatyrNyxSmith.java index bfeb7ef6e28..7f8dbcc8792 100644 --- a/Mage.Sets/src/mage/cards/s/SatyrNyxSmith.java +++ b/Mage.Sets/src/mage/cards/s/SatyrNyxSmith.java @@ -56,7 +56,7 @@ public class SatyrNyxSmith extends CardImpl { // Haste this.addAbility(HasteAbility.getInstance()); - // Inspired - Whenever Satyr Nyx-Smith becomes untapped, you may pay {2}{R}. If you do, create a 3/1 red Elemental enchantment creature token with haste. + // Inspired — Whenever Satyr Nyx-Smith becomes untapped, you may pay {2}{R}. If you do, create a 3/1 red Elemental enchantment creature token with haste. this.addAbility(new InspiredAbility(new DoIfCostPaid(new CreateTokenEffect(new SatyrNyxSmithElementalToken()), new ManaCostsImpl("{2}{R}")))); } diff --git a/Mage.Sets/src/mage/cards/s/SavagePunch.java b/Mage.Sets/src/mage/cards/s/SavagePunch.java index 486b48dcf87..434f628add6 100644 --- a/Mage.Sets/src/mage/cards/s/SavagePunch.java +++ b/Mage.Sets/src/mage/cards/s/SavagePunch.java @@ -60,7 +60,7 @@ public class SavagePunch extends CardImpl { public SavagePunch(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{G}"); - // Ferocious - The creature you control gets +2/+2 until end of turn before it fights if you control a creature with power 4 or greater. + // Ferocious — The creature you control gets +2/+2 until end of turn before it fights if you control a creature with power 4 or greater. Effect effect = new ConditionalContinuousEffect( new BoostTargetEffect(2, 2, Duration.EndOfTurn), new LockedInCondition(FerociousCondition.instance), diff --git a/Mage.Sets/src/mage/cards/s/SeeTheUnwritten.java b/Mage.Sets/src/mage/cards/s/SeeTheUnwritten.java index dfbb8f4f3c6..ebb62766750 100644 --- a/Mage.Sets/src/mage/cards/s/SeeTheUnwritten.java +++ b/Mage.Sets/src/mage/cards/s/SeeTheUnwritten.java @@ -57,7 +57,7 @@ public class SeeTheUnwritten extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{4}{G}{G}"); // Reveal the top eight cards of your library. You may put a creature card from among them onto the battlefield. Put the rest into your graveyard. - // Ferocious - If you control a creature with power 4 or greater, you may put two creature cards onto the battlefield instead of one. + // Ferocious — If you control a creature with power 4 or greater, you may put two creature cards onto the battlefield instead of one. this.getSpellAbility().addEffect(new ConditionalOneShotEffect( new SeeTheUnwrittenEffect(1), new SeeTheUnwrittenEffect(2), diff --git a/Mage.Sets/src/mage/cards/s/ServantOfTymaret.java b/Mage.Sets/src/mage/cards/s/ServantOfTymaret.java index 518075f85ae..91d702d8957 100644 --- a/Mage.Sets/src/mage/cards/s/ServantOfTymaret.java +++ b/Mage.Sets/src/mage/cards/s/ServantOfTymaret.java @@ -56,7 +56,7 @@ public class ServantOfTymaret extends CardImpl { this.power = new MageInt(1); this.toughness = new MageInt(3); - // Inspired - Whenever Servant of Tymaret becomes untapped, each opponent loses 1 life. You gain life equal to the life lost this way. + // Inspired — Whenever Servant of Tymaret becomes untapped, each opponent loses 1 life. You gain life equal to the life lost this way. this.addAbility(new InspiredAbility(new ServantOfTymaretEffect())); // {2}{B}: Regenerate Servant of Tymaret. diff --git a/Mage.Sets/src/mage/cards/s/SetessanOathsworn.java b/Mage.Sets/src/mage/cards/s/SetessanOathsworn.java index 90a40e2800e..d07032378da 100644 --- a/Mage.Sets/src/mage/cards/s/SetessanOathsworn.java +++ b/Mage.Sets/src/mage/cards/s/SetessanOathsworn.java @@ -51,7 +51,7 @@ public class SetessanOathsworn extends CardImpl { this.power = new MageInt(1); this.toughness = new MageInt(1); - // Heroic - Whenever you cast a spell that targets Setessan Oathsworn, put two +1/+1 counters on Setessan Oathsworn. + // Heroic — Whenever you cast a spell that targets Setessan Oathsworn, put two +1/+1 counters on Setessan Oathsworn. this.addAbility(new HeroicAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(2), true))); } diff --git a/Mage.Sets/src/mage/cards/s/ShamanOfForgottenWays.java b/Mage.Sets/src/mage/cards/s/ShamanOfForgottenWays.java index 74c7095e872..ad58b7aaa5b 100644 --- a/Mage.Sets/src/mage/cards/s/ShamanOfForgottenWays.java +++ b/Mage.Sets/src/mage/cards/s/ShamanOfForgottenWays.java @@ -70,7 +70,7 @@ public class ShamanOfForgottenWays extends CardImpl { // {T}:Add two mana in any combination of colors. Spend this mana only to cast creature spells. this.addAbility(new ConditionalAnyColorManaAbility(2, new ShamanOfForgottenWaysManaBuilder())); - // Formidable - {9}{G}{G},{T}:Each player's life total becomes the number of creatures he or she controls. Activate the ability only if creatures you control have total power 8 or greater. + // Formidable — {9}{G}{G},{T}:Each player's life total becomes the number of creatures he or she controls. Activate the ability only if creatures you control have total power 8 or greater. Ability ability = new ActivateIfConditionActivatedAbility( Zone.BATTLEFIELD, new ShamanOfForgottenWaysEffect(), diff --git a/Mage.Sets/src/mage/cards/s/ShamanOfTheGreatHunt.java b/Mage.Sets/src/mage/cards/s/ShamanOfTheGreatHunt.java index efe482f5af6..7ba8456ddaf 100644 --- a/Mage.Sets/src/mage/cards/s/ShamanOfTheGreatHunt.java +++ b/Mage.Sets/src/mage/cards/s/ShamanOfTheGreatHunt.java @@ -81,7 +81,7 @@ public class ShamanOfTheGreatHunt extends CardImpl { new FilterControlledCreaturePermanent("a creature you control"), false, SetTargetPointer.PERMANENT, true )); - // Ferocious - {2}{G/U}{G/U}: Draw a card for each creature you control with power 4 or greater. + // Ferocious — {2}{G/U}{G/U}: Draw a card for each creature you control with power 4 or greater. DynamicValue amount = new PermanentsOnBattlefieldCount(filter); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(amount), new ManaCostsImpl("{2}{G/U}{G/U}")); ability.setAbilityWord(AbilityWord.FEROCIOUS); diff --git a/Mage.Sets/src/mage/cards/s/ShamanicRevelation.java b/Mage.Sets/src/mage/cards/s/ShamanicRevelation.java index 4829a3675f9..357e9a7993d 100644 --- a/Mage.Sets/src/mage/cards/s/ShamanicRevelation.java +++ b/Mage.Sets/src/mage/cards/s/ShamanicRevelation.java @@ -58,7 +58,7 @@ public class ShamanicRevelation extends CardImpl { // Draw a card for each creature you control. this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(new PermanentsOnBattlefieldCount(new FilterControlledCreaturePermanent()))); - // Ferocious - You gain 4 life for each creature you control with power 4 or greater. + // Ferocious — You gain 4 life for each creature you control with power 4 or greater. DynamicValue amount = new PermanentsOnBattlefieldCount(filter, 4); Effect effect = new GainLifeEffect(amount); effect.setText("
Ferocious — You gain 4 life for each creature you control with power 4 or greater."); diff --git a/Mage.Sets/src/mage/cards/s/SharedTrauma.java b/Mage.Sets/src/mage/cards/s/SharedTrauma.java index 80df7d5a6ff..fe94815a324 100644 --- a/Mage.Sets/src/mage/cards/s/SharedTrauma.java +++ b/Mage.Sets/src/mage/cards/s/SharedTrauma.java @@ -71,7 +71,7 @@ class SharedTraumaEffect extends OneShotEffect { public SharedTraumaEffect() { super(Outcome.Detriment); - this.staticText = "Join forces - Starting with you, each player may pay any amount of mana. Each player puts the top X cards of their library into their graveyard, where X is the total amount of mana paid this way"; + this.staticText = "Join forces — Starting with you, each player may pay any amount of mana. Each player puts the top X cards of their library into their graveyard, where X is the total amount of mana paid this way"; } public SharedTraumaEffect(final SharedTraumaEffect effect) { diff --git a/Mage.Sets/src/mage/cards/s/ShipwreckLooter.java b/Mage.Sets/src/mage/cards/s/ShipwreckLooter.java index dc6f2eb24b1..87278b4ff87 100644 --- a/Mage.Sets/src/mage/cards/s/ShipwreckLooter.java +++ b/Mage.Sets/src/mage/cards/s/ShipwreckLooter.java @@ -58,7 +58,7 @@ public class ShipwreckLooter extends CardImpl { Ability ability = new ConditionalTriggeredAbility( new EntersBattlefieldTriggeredAbility(new DrawDiscardControllerEffect(1, 1, true)), RaidCondition.instance, - "Raid - When {this} enters the battlefield, if you attacked with a creature this turn, you may draw a card. If you do, discard a card."); + "Raid — When {this} enters the battlefield, if you attacked with a creature this turn, you may draw a card. If you do, discard a card."); this.addAbility(ability, new PlayerAttackedWatcher()); } diff --git a/Mage.Sets/src/mage/cards/s/ShowerOfCoals.java b/Mage.Sets/src/mage/cards/s/ShowerOfCoals.java index b66e2159ca2..f3eda970320 100644 --- a/Mage.Sets/src/mage/cards/s/ShowerOfCoals.java +++ b/Mage.Sets/src/mage/cards/s/ShowerOfCoals.java @@ -51,7 +51,7 @@ public class ShowerOfCoals extends CardImpl { Effect effect = new ConditionalOneShotEffect(new DamageTargetEffect(4), new DamageTargetEffect(2), new CardsInControllerGraveCondition(7), - "{this} deals 2 damage to each of up to three targets.

Threshold - {this} deals 4 damage to each of those permanents and/or players instead if seven or more cards are in your graveyard."); + "{this} deals 2 damage to each of up to three targets.

Threshold — {this} deals 4 damage to each of those permanents and/or players instead if seven or more cards are in your graveyard."); this.getSpellAbility().addTarget(new TargetAnyTarget(0, 3)); this.getSpellAbility().addEffect(effect); diff --git a/Mage.Sets/src/mage/cards/s/SirenOfTheSilentSong.java b/Mage.Sets/src/mage/cards/s/SirenOfTheSilentSong.java index dcc45468175..d40a148a989 100644 --- a/Mage.Sets/src/mage/cards/s/SirenOfTheSilentSong.java +++ b/Mage.Sets/src/mage/cards/s/SirenOfTheSilentSong.java @@ -57,7 +57,7 @@ public class SirenOfTheSilentSong extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); - // Inspired - Whenever Siren of the Silent Song becomes untapped, each opponent discards a card, then puts the top card of their library into their graveyard. + // Inspired — Whenever Siren of the Silent Song becomes untapped, each opponent discards a card, then puts the top card of their library into their graveyard. Ability ability = new InspiredAbility(new DiscardEachPlayerEffect(TargetController.OPPONENT)); Effect effect = new PutTopCardOfLibraryIntoGraveEachPlayerEffect(1, TargetController.OPPONENT); effect.setText(", then puts the top card of their library into their graveyard"); diff --git a/Mage.Sets/src/mage/cards/s/SithAssassin.java b/Mage.Sets/src/mage/cards/s/SithAssassin.java index b0bcd90e98a..2e46269bd41 100644 --- a/Mage.Sets/src/mage/cards/s/SithAssassin.java +++ b/Mage.Sets/src/mage/cards/s/SithAssassin.java @@ -68,7 +68,7 @@ public class SithAssassin extends CardImpl { Ability ability = new ConditionalTriggeredAbility( new EntersBattlefieldTriggeredAbility(new DestroyTargetEffect(), true), HateCondition.instance, - "Hate - When {this} enters the battlefield, if an opponent lost life from a source other than combat damage this turn, you may destroy target nonblack creature."); + "Hate — When {this} enters the battlefield, if an opponent lost life from a source other than combat damage this turn, you may destroy target nonblack creature."); ability.addTarget(new TargetCreaturePermanent(filter)); this.addAbility(ability, new LifeLossOtherFromCombatWatcher()); } diff --git a/Mage.Sets/src/mage/cards/s/SlitheringShade.java b/Mage.Sets/src/mage/cards/s/SlitheringShade.java index 832fe062641..d7c44101ab7 100644 --- a/Mage.Sets/src/mage/cards/s/SlitheringShade.java +++ b/Mage.Sets/src/mage/cards/s/SlitheringShade.java @@ -68,7 +68,7 @@ public class SlitheringShade extends CardImpl { Effect effect = new ConditionalAsThoughEffect( new CanAttackAsThoughItDidntHaveDefenderSourceEffect(Duration.WhileOnBattlefield), HellbentCondition.instance); - effect.setText("Hellbent - {this} can attack as though it didn't have defender as long as you have no cards in hand"); + effect.setText("Hellbent — {this} can attack as though it didn't have defender as long as you have no cards in hand"); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); } diff --git a/Mage.Sets/src/mage/cards/s/SphinxsDisciple.java b/Mage.Sets/src/mage/cards/s/SphinxsDisciple.java index a6b23449021..2d7ecd54340 100644 --- a/Mage.Sets/src/mage/cards/s/SphinxsDisciple.java +++ b/Mage.Sets/src/mage/cards/s/SphinxsDisciple.java @@ -53,7 +53,7 @@ public class SphinxsDisciple extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); - // Inspired - Whenever Sphinx's Disciple becomes untapped, draw a card. + // Inspired — Whenever Sphinx's Disciple becomes untapped, draw a card. this.addAbility(new InspiredAbility(new DrawCardSourceControllerEffect(1))); } diff --git a/Mage.Sets/src/mage/cards/s/SplitDecision.java b/Mage.Sets/src/mage/cards/s/SplitDecision.java index e45e7789d8a..8482c141f3b 100644 --- a/Mage.Sets/src/mage/cards/s/SplitDecision.java +++ b/Mage.Sets/src/mage/cards/s/SplitDecision.java @@ -68,7 +68,7 @@ class SplitDecisionEffect extends OneShotEffect { SplitDecisionEffect() { super(Outcome.Benefit); - this.staticText = "Will of the council - Choose target instant or sorcery spell. Starting with you, each player votes for denial or duplication. If denial gets more votes, counter the spell. If duplication gets more votes or the vote is tied, copy the spell. You may choose new targets for the copy"; + this.staticText = "Will of the council — Choose target instant or sorcery spell. Starting with you, each player votes for denial or duplication. If denial gets more votes, counter the spell. If duplication gets more votes or the vote is tied, copy the spell. You may choose new targets for the copy"; } SplitDecisionEffect(final SplitDecisionEffect effect) { diff --git a/Mage.Sets/src/mage/cards/s/SpringjackShepherd.java b/Mage.Sets/src/mage/cards/s/SpringjackShepherd.java index 821ec5414ee..af8d12aac7d 100644 --- a/Mage.Sets/src/mage/cards/s/SpringjackShepherd.java +++ b/Mage.Sets/src/mage/cards/s/SpringjackShepherd.java @@ -60,7 +60,7 @@ public class SpringjackShepherd extends CardImpl { // Chroma - When Springjack Shepherd enters the battlefield, create a 0/1 white Goat creature token for each white mana symbol in the mana costs of permanents you control. Effect effect = new CreateTokenEffect(new GoatToken(), new ChromaSpringjackShepherdCount()); - effect.setText("Chroma - When Springjack Shepherd enters the battlefield, create a 0/1 white Goat creature token for each white mana symbol in the mana costs of permanents you control."); + effect.setText("Chroma — When Springjack Shepherd enters the battlefield, create a 0/1 white Goat creature token for each white mana symbol in the mana costs of permanents you control."); this.addAbility(new EntersBattlefieldTriggeredAbility(effect, false, true)); } diff --git a/Mage.Sets/src/mage/cards/s/StampedingElkHerd.java b/Mage.Sets/src/mage/cards/s/StampedingElkHerd.java index 1c77640ee19..d4f6b841100 100644 --- a/Mage.Sets/src/mage/cards/s/StampedingElkHerd.java +++ b/Mage.Sets/src/mage/cards/s/StampedingElkHerd.java @@ -53,7 +53,7 @@ public class StampedingElkHerd extends CardImpl { this.power = new MageInt(5); this.toughness = new MageInt(5); - // Formidable - Whenever Stampeding Elk Herd attacks, if creatures you control have total power 8 or greater, creatures you control gain trample until end of turn. + // Formidable — Whenever Stampeding Elk Herd attacks, if creatures you control have total power 8 or greater, creatures you control gain trample until end of turn. this.addAbility(new ConditionalTriggeredAbility( new AttacksTriggeredAbility(new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.EndOfTurn, new FilterControlledCreaturePermanent()), false), FormidableCondition.instance, diff --git a/Mage.Sets/src/mage/cards/s/StitchTogether.java b/Mage.Sets/src/mage/cards/s/StitchTogether.java index 7b3928ed782..38e01a44be3 100644 --- a/Mage.Sets/src/mage/cards/s/StitchTogether.java +++ b/Mage.Sets/src/mage/cards/s/StitchTogether.java @@ -54,7 +54,7 @@ public class StitchTogether extends CardImpl { new ReturnFromGraveyardToBattlefieldTargetEffect(), new ReturnFromGraveyardToHandTargetEffect(), new CardsInControllerGraveCondition(7), - "Return target creature card from your graveyard to your hand.

Threshold - Return that card from your graveyard to the battlefield instead if seven or more cards are in your graveyard."); + "Return target creature card from your graveyard to your hand.

Threshold — Return that card from your graveyard to the battlefield instead if seven or more cards are in your graveyard."); this.getSpellAbility().addEffect(effect); this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD)); } diff --git a/Mage.Sets/src/mage/cards/s/StormFleetAerialist.java b/Mage.Sets/src/mage/cards/s/StormFleetAerialist.java index c62904dbd12..0e51079befc 100644 --- a/Mage.Sets/src/mage/cards/s/StormFleetAerialist.java +++ b/Mage.Sets/src/mage/cards/s/StormFleetAerialist.java @@ -60,7 +60,7 @@ public class StormFleetAerialist extends CardImpl { // Raid - Storm Fleet Aerialist enters the battlefield with a +1/+1 counter on it if you attacked with a creature this turn. this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(1), false), RaidCondition.instance, - "Raid - {this} enters the battlefield with a +1/+1 counter on it if you attacked with a creature this turn.", + "Raid — {this} enters the battlefield with a +1/+1 counter on it if you attacked with a creature this turn.", "{this} enters the battlefield with a +1/+1 counter"), new PlayerAttackedWatcher()); } diff --git a/Mage.Sets/src/mage/cards/s/Stratadon.java b/Mage.Sets/src/mage/cards/s/Stratadon.java index 5d3f96f73f3..fea57a7ffed 100644 --- a/Mage.Sets/src/mage/cards/s/Stratadon.java +++ b/Mage.Sets/src/mage/cards/s/Stratadon.java @@ -77,7 +77,7 @@ class StratadonCostReductionEffect extends CostModificationEffectImpl { public StratadonCostReductionEffect() { super(Duration.WhileOnStack, Outcome.Benefit, CostModificationType.REDUCE_COST); - staticText = "Domain - {this} costs {1} less to cast for each basic land type among lands you control."; + staticText = "Domain — {this} costs {1} less to cast for each basic land type among lands you control."; } protected StratadonCostReductionEffect(final StratadonCostReductionEffect effect) { diff --git a/Mage.Sets/src/mage/cards/s/StubbornDenial.java b/Mage.Sets/src/mage/cards/s/StubbornDenial.java index eb85512442f..fe912ceae46 100644 --- a/Mage.Sets/src/mage/cards/s/StubbornDenial.java +++ b/Mage.Sets/src/mage/cards/s/StubbornDenial.java @@ -61,7 +61,7 @@ public class StubbornDenial extends CardImpl { new CounterUnlessPaysEffect(new GenericManaCost(1)), new InvertCondition(FerociousCondition.instance), "Counter target noncreature spell unless its controller pays {1}.")); - // Ferocious - If you control a creature with power 4 or greater, counter that spell instead. + // Ferocious — If you control a creature with power 4 or greater, counter that spell instead. this.getSpellAbility().addEffect(new ConditionalOneShotEffect( new CounterTargetEffect(), FerociousCondition.instance, diff --git a/Mage.Sets/src/mage/cards/s/SurrakTheHuntCaller.java b/Mage.Sets/src/mage/cards/s/SurrakTheHuntCaller.java index 4bdcbebf12b..be99ba23b0d 100644 --- a/Mage.Sets/src/mage/cards/s/SurrakTheHuntCaller.java +++ b/Mage.Sets/src/mage/cards/s/SurrakTheHuntCaller.java @@ -58,7 +58,7 @@ public class SurrakTheHuntCaller extends CardImpl { this.power = new MageInt(5); this.toughness = new MageInt(4); - // Formidable - At the beginning of combat on your turn, if creatures you control have total power 8 or greater, target creature you control gains haste until end of turn. + // Formidable — At the beginning of combat on your turn, if creatures you control have total power 8 or greater, target creature you control gains haste until end of turn. Ability ability = new ConditionalTriggeredAbility( new BeginningOfCombatTriggeredAbility(new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn), TargetController.YOU, false), FormidableCondition.instance, diff --git a/Mage.Sets/src/mage/cards/s/SwaggeringCorsair.java b/Mage.Sets/src/mage/cards/s/SwaggeringCorsair.java index e1ae8c7d9d5..8943ed758d2 100644 --- a/Mage.Sets/src/mage/cards/s/SwaggeringCorsair.java +++ b/Mage.Sets/src/mage/cards/s/SwaggeringCorsair.java @@ -53,7 +53,7 @@ public class SwaggeringCorsair extends CardImpl { this.power = new MageInt(2); this.toughness = new MageInt(2); - // Raid - Swaggering Corsair enters the battlefield with a +1/+1 counter on it if you attacked with a creature this turn. + // Raid — Swaggering Corsair enters the battlefield with a +1/+1 counter on it if you attacked with a creature this turn. this.addAbility(new EntersBattlefieldAbility( new AddCountersSourceEffect(CounterType.P1P1.createInstance(1)), RaidCondition.instance, diff --git a/Mage.Sets/src/mage/cards/s/SwirlingSandstorm.java b/Mage.Sets/src/mage/cards/s/SwirlingSandstorm.java index cc4169c8006..049c4ac1b57 100644 --- a/Mage.Sets/src/mage/cards/s/SwirlingSandstorm.java +++ b/Mage.Sets/src/mage/cards/s/SwirlingSandstorm.java @@ -59,7 +59,7 @@ public class SwirlingSandstorm extends CardImpl { Effect effect = new ConditionalOneShotEffect( new DamageAllEffect(5, filter), new CardsInControllerGraveCondition(7), - "Threshold - {this} deals 5 damage to each creature without flying if seven or more cards are in your graveyard."); + "Threshold — {this} deals 5 damage to each creature without flying if seven or more cards are in your graveyard."); this.getSpellAbility().addEffect(effect); } diff --git a/Mage.Sets/src/mage/cards/t/TajuruBeastmaster.java b/Mage.Sets/src/mage/cards/t/TajuruBeastmaster.java index 3fa8e8de55b..0dba9713f72 100644 --- a/Mage.Sets/src/mage/cards/t/TajuruBeastmaster.java +++ b/Mage.Sets/src/mage/cards/t/TajuruBeastmaster.java @@ -51,7 +51,7 @@ public class TajuruBeastmaster extends CardImpl { this.power = new MageInt(5); this.toughness = new MageInt(5); - // Rally - Whenever Tajuru Beastmaster or another Ally creature enters the battlefield under your control, creatures you control get +1/+1 until end of turn. + // Rally — Whenever Tajuru Beastmaster or another Ally creature enters the battlefield under your control, creatures you control get +1/+1 until end of turn. this.addAbility(new AllyEntersBattlefieldTriggeredAbility(new BoostControlledEffect(1, 1, Duration.EndOfTurn), false)); } diff --git a/Mage.Sets/src/mage/cards/t/TalentOfTheTelepath.java b/Mage.Sets/src/mage/cards/t/TalentOfTheTelepath.java index f2ccd7970f1..68475d200ce 100644 --- a/Mage.Sets/src/mage/cards/t/TalentOfTheTelepath.java +++ b/Mage.Sets/src/mage/cards/t/TalentOfTheTelepath.java @@ -58,7 +58,7 @@ public class TalentOfTheTelepath extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{2}{U}{U}"); // Target opponent reveals the top seven cards of their library. You may cast an instant or sorcery card from among them without paying its mana cost. Then that player puts the rest into their graveyard. - // Spell mastery - If there are two or more instant and/or sorcery cards in your graveyard, you may cast up to two revealed instant and/or sorcery cards instead of one. + // Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, you may cast up to two revealed instant and/or sorcery cards instead of one. getSpellAbility().addEffect(new TalentOfTheTelepathEffect()); getSpellAbility().addTarget(new TargetOpponent()); @@ -81,7 +81,7 @@ class TalentOfTheTelepathEffect extends OneShotEffect { public TalentOfTheTelepathEffect() { super(Outcome.PlayForFree); this.staticText = "Target opponent reveals the top seven cards of their library. You may cast an instant or sorcery card from among them without paying its mana cost. Then that player puts the rest into their graveyard. " - + "
Spell mastery - If there are two or more instant and/or sorcery cards in your graveyard, you may cast up to two revealed instant and/or sorcery cards instead of one."; + + "
Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, you may cast up to two revealed instant and/or sorcery cards instead of one."; } public TalentOfTheTelepathEffect(final TalentOfTheTelepathEffect effect) { diff --git a/Mage.Sets/src/mage/cards/t/TemptWithDiscovery.java b/Mage.Sets/src/mage/cards/t/TemptWithDiscovery.java index b60644bf8bd..ccf47c1169f 100644 --- a/Mage.Sets/src/mage/cards/t/TemptWithDiscovery.java +++ b/Mage.Sets/src/mage/cards/t/TemptWithDiscovery.java @@ -73,7 +73,7 @@ class TemptWithDiscoveryEffect extends OneShotEffect { public TemptWithDiscoveryEffect() { super(Outcome.PutLandInPlay); - this.staticText = "Tempting offer - Search your library for a land card and put it onto the battlefield. Each opponent may search their library for a land card and put it onto the battlefield. For each opponent who searches a library this way, search your library for a land card and put it onto the battlefield. Then each player who searched a library this way shuffles it"; + this.staticText = "Tempting offer — Search your library for a land card and put it onto the battlefield. Each opponent may search their library for a land card and put it onto the battlefield. For each opponent who searches a library this way, search your library for a land card and put it onto the battlefield. Then each player who searched a library this way shuffles it"; } public TemptWithDiscoveryEffect(final TemptWithDiscoveryEffect effect) { diff --git a/Mage.Sets/src/mage/cards/t/TemptWithGlory.java b/Mage.Sets/src/mage/cards/t/TemptWithGlory.java index 088abe7079b..510f6f1a9dc 100644 --- a/Mage.Sets/src/mage/cards/t/TemptWithGlory.java +++ b/Mage.Sets/src/mage/cards/t/TemptWithGlory.java @@ -71,7 +71,7 @@ class TemptWithGloryEffect extends OneShotEffect { public TemptWithGloryEffect() { super(Outcome.PutLandInPlay); - this.staticText = "Tempting offer - Put a +1/+1 counter on each creature you control. Each opponent may put a +1/+1 counter on each creature he or she controls. For each opponent who does, put a +1/+1 counter on each creature you control"; + this.staticText = "Tempting offer — Put a +1/+1 counter on each creature you control. Each opponent may put a +1/+1 counter on each creature he or she controls. For each opponent who does, put a +1/+1 counter on each creature you control"; } public TemptWithGloryEffect(final TemptWithGloryEffect effect) { diff --git a/Mage.Sets/src/mage/cards/t/TemptWithImmortality.java b/Mage.Sets/src/mage/cards/t/TemptWithImmortality.java index 054e87f7501..a34a7a9564e 100644 --- a/Mage.Sets/src/mage/cards/t/TemptWithImmortality.java +++ b/Mage.Sets/src/mage/cards/t/TemptWithImmortality.java @@ -72,7 +72,7 @@ class TemptWithImmortalityEffect extends OneShotEffect { public TemptWithImmortalityEffect() { super(Outcome.PutCreatureInPlay); - this.staticText = "Tempting offer - Return a creature card from your graveyard to the battlefield. Each opponent may return a creature card from their graveyard to the battlefield. For each player who does, return a creature card from your graveyard to the battlefield"; + this.staticText = "Tempting offer — Return a creature card from your graveyard to the battlefield. Each opponent may return a creature card from their graveyard to the battlefield. For each player who does, return a creature card from your graveyard to the battlefield"; } diff --git a/Mage.Sets/src/mage/cards/t/TemptWithReflections.java b/Mage.Sets/src/mage/cards/t/TemptWithReflections.java index f10b0688c86..93316a1dbfd 100644 --- a/Mage.Sets/src/mage/cards/t/TemptWithReflections.java +++ b/Mage.Sets/src/mage/cards/t/TemptWithReflections.java @@ -72,7 +72,7 @@ class TemptWithReflectionsEffect extends OneShotEffect { public TemptWithReflectionsEffect() { super(Outcome.PutCreatureInPlay); - this.staticText = "Tempting offer - Choose target creature you control. Create a token that's a copy of that creature. Each opponent may create a token that's a copy of that creature. For each opponent who does, create a token that's a copy of that creature"; + this.staticText = "Tempting offer — Choose target creature you control. Create a token that's a copy of that creature. Each opponent may create a token that's a copy of that creature. For each opponent who does, create a token that's a copy of that creature"; } public TemptWithReflectionsEffect(final TemptWithReflectionsEffect effect) { diff --git a/Mage.Sets/src/mage/cards/t/TemptWithVengeance.java b/Mage.Sets/src/mage/cards/t/TemptWithVengeance.java index 8402c8a4793..d3c6174d98f 100644 --- a/Mage.Sets/src/mage/cards/t/TemptWithVengeance.java +++ b/Mage.Sets/src/mage/cards/t/TemptWithVengeance.java @@ -67,7 +67,7 @@ class TemptWithVengeanceEffect extends OneShotEffect { public TemptWithVengeanceEffect() { super(Outcome.PutLandInPlay); - this.staticText = "Tempting offer - create X 1/1 red Elemental creature tokens with haste. Each opponent may create X 1/1 red Elemental creature tokens with haste. For each player who does, create X 1/1 red Elemental creature tokens with haste"; + this.staticText = "Tempting offer — create X 1/1 red Elemental creature tokens with haste. Each opponent may create X 1/1 red Elemental creature tokens with haste. For each player who does, create X 1/1 red Elemental creature tokens with haste"; } public TemptWithVengeanceEffect(final TemptWithVengeanceEffect effect) { diff --git a/Mage.Sets/src/mage/cards/t/TheUrDragon.java b/Mage.Sets/src/mage/cards/t/TheUrDragon.java index bf3283104f7..88b2653f776 100644 --- a/Mage.Sets/src/mage/cards/t/TheUrDragon.java +++ b/Mage.Sets/src/mage/cards/t/TheUrDragon.java @@ -72,7 +72,7 @@ public class TheUrDragon extends CardImpl { this.power = new MageInt(10); this.toughness = new MageInt(10); - // Eminence - As long as The Ur-Dragon is in the command zone or on the battlefield, other Dragon spells you cast cost {1} less to cast. + // Eminence — As long as The Ur-Dragon is in the command zone or on the battlefield, other Dragon spells you cast cost {1} less to cast. Effect effect = new SpellsCostReductionControllerEffect(filter, 1); effect.setText("As long as {this} is in the command zone or on the battlefield, other Dragon spells you cast cost {1} less to cast"); Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, effect); diff --git a/Mage.Sets/src/mage/cards/t/ThermalBlast.java b/Mage.Sets/src/mage/cards/t/ThermalBlast.java index 09d6342660c..f5e506b3c76 100644 --- a/Mage.Sets/src/mage/cards/t/ThermalBlast.java +++ b/Mage.Sets/src/mage/cards/t/ThermalBlast.java @@ -52,7 +52,7 @@ public class ThermalBlast extends CardImpl { Effect effect = new ConditionalOneShotEffect(new DamageTargetEffect(5), new DamageTargetEffect(3), new CardsInControllerGraveCondition(7), - "{this} deals 3 damage to target creature.

Threshold - {this} deals 5 damage to that creature instead if seven or more cards are in your graveyard."); + "{this} deals 3 damage to target creature.

Threshold — {this} deals 5 damage to that creature instead if seven or more cards are in your graveyard."); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); this.getSpellAbility().addEffect(effect); } diff --git a/Mage.Sets/src/mage/cards/t/TimelyHordemate.java b/Mage.Sets/src/mage/cards/t/TimelyHordemate.java index 0c1be7483da..1c81660e5c3 100644 --- a/Mage.Sets/src/mage/cards/t/TimelyHordemate.java +++ b/Mage.Sets/src/mage/cards/t/TimelyHordemate.java @@ -64,7 +64,7 @@ public class TimelyHordemate extends CardImpl { this.power = new MageInt(3); this.toughness = new MageInt(2); - // Raid - When Timely Hordemate enters the battlefield, if you attacked this turn, return target creature card with converted mana cost 2 or less from your graveyard to the battlefield. + // Raid — When Timely Hordemate enters the battlefield, if you attacked this turn, return target creature card with converted mana cost 2 or less from your graveyard to the battlefield. Ability ability = new ConditionalTriggeredAbility(new EntersBattlefieldTriggeredAbility(new ReturnFromGraveyardToBattlefieldTargetEffect()), RaidCondition.instance, "Raid — When {this} enters the battlefield, if you attacked with a creature this turn, return target creature card with converted mana cost 2 or less from your graveyard to the battlefield."); ability.addTarget(new TargetCardInYourGraveyard(filter)); diff --git a/Mage.Sets/src/mage/cards/t/ToxicStench.java b/Mage.Sets/src/mage/cards/t/ToxicStench.java index c057d1de70a..c2d6c78f896 100644 --- a/Mage.Sets/src/mage/cards/t/ToxicStench.java +++ b/Mage.Sets/src/mage/cards/t/ToxicStench.java @@ -75,7 +75,7 @@ public class ToxicStench extends CardImpl { this.getSpellAbility().addEffect(new ConditionalOneShotEffect( new DestroyTargetEffect(true), new CardsInControllerGraveCondition(7), - "

Threshold - If seven or more cards are in your graveyard, instead destroy that creature. It can't be regenerated.")); + "

Threshold — If seven or more cards are in your graveyard, instead destroy that creature. It can't be regenerated.")); this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); } diff --git a/Mage.Sets/src/mage/cards/t/TritonFortuneHunter.java b/Mage.Sets/src/mage/cards/t/TritonFortuneHunter.java index 44ac3fd7738..ca92fb28631 100644 --- a/Mage.Sets/src/mage/cards/t/TritonFortuneHunter.java +++ b/Mage.Sets/src/mage/cards/t/TritonFortuneHunter.java @@ -50,7 +50,7 @@ public class TritonFortuneHunter extends CardImpl { this.power = new MageInt(2); this.toughness = new MageInt(2); - // Heroic - Whenever you cast a spell that targets Triton Fortune Hunter, draw a card. + // Heroic — Whenever you cast a spell that targets Triton Fortune Hunter, draw a card. this.addAbility(new HeroicAbility(new DrawCardSourceControllerEffect(1))); } diff --git a/Mage.Sets/src/mage/cards/t/TrompTheDomains.java b/Mage.Sets/src/mage/cards/t/TrompTheDomains.java index 374f9e22a98..4ccc9db3d8b 100644 --- a/Mage.Sets/src/mage/cards/t/TrompTheDomains.java +++ b/Mage.Sets/src/mage/cards/t/TrompTheDomains.java @@ -51,7 +51,7 @@ public class TrompTheDomains extends CardImpl { // Domain - Until end of turn, creatures you control gain trample and get +1/+1 for each basic land type among lands you control. Effect effect = new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.EndOfTurn); - effect.setText("Domain - Until end of turn, creatures you control gain Trample"); + effect.setText("Domain — Until end of turn, creatures you control gain Trample"); this.getSpellAbility().addEffect(effect); DynamicValue domain = new DomainValue(); effect = new BoostControlledEffect(domain, domain, Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURE, false); diff --git a/Mage.Sets/src/mage/cards/t/TunnelingGeopede.java b/Mage.Sets/src/mage/cards/t/TunnelingGeopede.java index 647a7770184..6087d8f9c14 100644 --- a/Mage.Sets/src/mage/cards/t/TunnelingGeopede.java +++ b/Mage.Sets/src/mage/cards/t/TunnelingGeopede.java @@ -49,7 +49,7 @@ public class TunnelingGeopede extends CardImpl { this.power = new MageInt(3); this.toughness = new MageInt(2); - // Landfall - Whenever a land enters the battlefield under your control, Tunneling Geopede deals 1 damage to each opponent. + // Landfall — Whenever a land enters the battlefield under your control, Tunneling Geopede deals 1 damage to each opponent. this.addAbility(new LandfallAbility(new DamagePlayersEffect(1, TargetController.OPPONENT), false)); } diff --git a/Mage.Sets/src/mage/cards/t/Twinstrike.java b/Mage.Sets/src/mage/cards/t/Twinstrike.java index b23223682aa..208f6e174e6 100644 --- a/Mage.Sets/src/mage/cards/t/Twinstrike.java +++ b/Mage.Sets/src/mage/cards/t/Twinstrike.java @@ -56,7 +56,7 @@ public class Twinstrike extends CardImpl { this.getSpellAbility().addEffect(new ConditionalOneShotEffect( new DestroyTargetEffect(), HellbentCondition.instance, - "

Hellbent - Destroy those creatures instead if you have no cards in hand")); + "

Hellbent — Destroy those creatures instead if you have no cards in hand")); this.getSpellAbility().addTarget(new TargetCreaturePermanent(2,2)); } diff --git a/Mage.Sets/src/mage/cards/t/TyrantsChoice.java b/Mage.Sets/src/mage/cards/t/TyrantsChoice.java index a943e94bc37..92020df34e7 100644 --- a/Mage.Sets/src/mage/cards/t/TyrantsChoice.java +++ b/Mage.Sets/src/mage/cards/t/TyrantsChoice.java @@ -66,7 +66,7 @@ class TyrantsChoiceEffect extends OneShotEffect { TyrantsChoiceEffect() { super(Outcome.Benefit); - this.staticText = "Will of the council - Starting with you, each player votes for death or torture. If death gets more votes, each opponent sacrifices a creature. If torture gets more votes or the vote is tied, each opponent loses 4 life"; + this.staticText = "Will of the council — Starting with you, each player votes for death or torture. If death gets more votes, each opponent sacrifices a creature. If torture gets more votes or the vote is tied, each opponent loses 4 life"; } TyrantsChoiceEffect(final TyrantsChoiceEffect effect) { diff --git a/Mage.Sets/src/mage/cards/u/UmbraStalker.java b/Mage.Sets/src/mage/cards/u/UmbraStalker.java index b0ae34b5ac8..fffb18f7980 100644 --- a/Mage.Sets/src/mage/cards/u/UmbraStalker.java +++ b/Mage.Sets/src/mage/cards/u/UmbraStalker.java @@ -60,7 +60,7 @@ public class UmbraStalker extends CardImpl { // Chroma - Umbra Stalker's power and toughness are each equal to the number of black mana symbols in the mana costs of cards in your graveyard. Effect effect = new SetPowerToughnessSourceEffect(new ChromaUmbraStalkerCount(), Duration.WhileOnBattlefield); - effect.setText("Chroma - Umbra Stalker's power and toughness are each equal to the number of black mana symbols in the mana costs of cards in your graveyard."); + effect.setText("Chroma — Umbra Stalker's power and toughness are each equal to the number of black mana symbols in the mana costs of cards in your graveyard."); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); } diff --git a/Mage.Sets/src/mage/cards/u/UnholyHunger.java b/Mage.Sets/src/mage/cards/u/UnholyHunger.java index ec319dfd596..db902f5dd0e 100644 --- a/Mage.Sets/src/mage/cards/u/UnholyHunger.java +++ b/Mage.Sets/src/mage/cards/u/UnholyHunger.java @@ -51,9 +51,9 @@ public class UnholyHunger extends CardImpl { this.getSpellAbility().addEffect(new DestroyTargetEffect()); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); - // Spell mastery - If there are two or more instant and/or sorcery cards in your graveyard, you gain 2 life. + // Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, you gain 2 life. Effect effect = new ConditionalOneShotEffect(new GainLifeEffect(2), - SpellMasteryCondition.instance, "Spell mastery - If there are two or more instant and/or sorcery cards in your graveyard, you gain 2 life"); + SpellMasteryCondition.instance, "Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, you gain 2 life"); this.getSpellAbility().addEffect(effect); } diff --git a/Mage.Sets/src/mage/cards/v/ValakutPredator.java b/Mage.Sets/src/mage/cards/v/ValakutPredator.java index 6e0fdb4e642..2ebb6cb1cec 100644 --- a/Mage.Sets/src/mage/cards/v/ValakutPredator.java +++ b/Mage.Sets/src/mage/cards/v/ValakutPredator.java @@ -49,7 +49,7 @@ public class ValakutPredator extends CardImpl { this.power = new MageInt(2); this.toughness = new MageInt(2); - // Landfall - Whenever a land enters the battlefield under your control, Valakut Predator gets +2/+2 until end of turn. + // Landfall — Whenever a land enters the battlefield under your control, Valakut Predator gets +2/+2 until end of turn. this.addAbility(new LandfallAbility(new BoostSourceEffect(2, 2, Duration.EndOfTurn), false)); } diff --git a/Mage.Sets/src/mage/cards/v/VanguardOfBrimaz.java b/Mage.Sets/src/mage/cards/v/VanguardOfBrimaz.java index 62df5b49ba2..a46b8d87899 100644 --- a/Mage.Sets/src/mage/cards/v/VanguardOfBrimaz.java +++ b/Mage.Sets/src/mage/cards/v/VanguardOfBrimaz.java @@ -54,7 +54,7 @@ public class VanguardOfBrimaz extends CardImpl { // Vigilance this.addAbility(VigilanceAbility.getInstance()); - // Heroic - Whenever you cast a spell that targets Vanguard of Brimaz, create a 1/1 white Cat Soldier creature token with vigilance. + // Heroic — Whenever you cast a spell that targets Vanguard of Brimaz, create a 1/1 white Cat Soldier creature token with vigilance. this.addAbility(new HeroicAbility(new CreateTokenEffect(new CatSoldierCreatureToken()), false)); } diff --git a/Mage.Sets/src/mage/cards/w/WarNameAspirant.java b/Mage.Sets/src/mage/cards/w/WarNameAspirant.java index 6493133c3b0..a5c3e402594 100644 --- a/Mage.Sets/src/mage/cards/w/WarNameAspirant.java +++ b/Mage.Sets/src/mage/cards/w/WarNameAspirant.java @@ -65,7 +65,7 @@ public class WarNameAspirant extends CardImpl { this.power = new MageInt(2); this.toughness = new MageInt(1); - // Raid - War-Name Aspirant enters the battlefield with a +1/+1 counter on it if you attacked with a creature this turn. + // Raid — War-Name Aspirant enters the battlefield with a +1/+1 counter on it if you attacked with a creature this turn. this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(1), false), RaidCondition.instance, "Raid — {this} enters the battlefield with a +1/+1 counter on it if you attacked with a creature this turn", diff --git a/Mage.Sets/src/mage/cards/w/WarchanterOfMogis.java b/Mage.Sets/src/mage/cards/w/WarchanterOfMogis.java index b2a37943e7f..2c92169220d 100644 --- a/Mage.Sets/src/mage/cards/w/WarchanterOfMogis.java +++ b/Mage.Sets/src/mage/cards/w/WarchanterOfMogis.java @@ -54,7 +54,7 @@ public class WarchanterOfMogis extends CardImpl { this.power = new MageInt(3); this.toughness = new MageInt(3); - // Inspired - Whenever Warchanter of Mogis becomes untapped, target creature you control gains intimidate until end of turn. + // Inspired — Whenever Warchanter of Mogis becomes untapped, target creature you control gains intimidate until end of turn. Ability ability = new InspiredAbility(new GainAbilityTargetEffect(IntimidateAbility.getInstance(), Duration.EndOfTurn), false); ability.addTarget(new TargetControlledCreaturePermanent()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/w/WorldlyCounsel.java b/Mage.Sets/src/mage/cards/w/WorldlyCounsel.java index 2ac46960a3e..634748da29c 100644 --- a/Mage.Sets/src/mage/cards/w/WorldlyCounsel.java +++ b/Mage.Sets/src/mage/cards/w/WorldlyCounsel.java @@ -72,7 +72,7 @@ class WorldlyCounselEffect extends OneShotEffect { public WorldlyCounselEffect() { super(Outcome.DrawCard); - this.staticText = "Domain - Look at the top X cards of your library, where X is the number of basic land types among lands you control. Put one of those cards into your hand and the rest on the bottom of your library in any order"; + this.staticText = "Domain — Look at the top X cards of your library, where X is the number of basic land types among lands you control. Put one of those cards into your hand and the rest on the bottom of your library in any order"; } public WorldlyCounselEffect(final WorldlyCounselEffect effect) { diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/asthough/SpendOtherManaTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/asthough/SpendOtherManaTest.java index 739a9043932..2c7808d5d5f 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/asthough/SpendOtherManaTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/asthough/SpendOtherManaTest.java @@ -115,7 +115,7 @@ public class SpendOtherManaTest extends CardTestPlayerBase { addCard(Zone.GRAVEYARD, playerA, "Lightning Bolt", 2); // Search your library for a card and put that card into your hand. Then shuffle your library. - // Spell mastery - If there are two or more instant and/or sorcery cards in your graveyard, add {B}{B}{B}. + // Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, add {B}{B}{B}. addCard(Zone.HAND, playerA, "Dark Petition"); // {3}{B}{B} // +1: Create a 0/1 green Plant creature token onto the battlefield. diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/dies/OmnathLocusOfRageTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/dies/OmnathLocusOfRageTest.java index ad134443413..9439e4dd352 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/dies/OmnathLocusOfRageTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/dies/OmnathLocusOfRageTest.java @@ -44,7 +44,7 @@ public class OmnathLocusOfRageTest extends CardTestPlayerBase { */ @Test public void testDiesTriggeredAbility() { - // Landfall - Whenever a land enters the battlefield under your control, put a 5/5 red and green Elemental creature token onto the battlefield. + // Landfall — Whenever a land enters the battlefield under your control, put a 5/5 red and green Elemental creature token onto the battlefield. // Whenever Omnath, Locus of Rage or another Elemental you control dies, Omnath deals 3 damage to any target. addCard(Zone.BATTLEFIELD, playerA, "Omnath, Locus of Rage", 1); @@ -68,7 +68,7 @@ public class OmnathLocusOfRageTest extends CardTestPlayerBase { @Test public void testDiesTriggeredAbilityOnlyIfPresent() { - // Landfall - Whenever a land enters the battlefield under your control, put a 5/5 red and green Elemental creature token onto the battlefield. + // Landfall — Whenever a land enters the battlefield under your control, put a 5/5 red and green Elemental creature token onto the battlefield. // Whenever Omnath, Locus of Rage or another Elemental you control dies, Omnath deals 3 damage to any target. addCard(Zone.BATTLEFIELD, playerA, "Omnath, Locus of Rage", 1); addCard(Zone.BATTLEFIELD, playerA, "Lightning Elemental", 1); // 4/1 Elemental - Haste diff --git a/Mage.Tests/src/test/java/org/mage/test/commander/duel/AnafenzaTest.java b/Mage.Tests/src/test/java/org/mage/test/commander/duel/AnafenzaTest.java index ef1441ce5cd..cf96c0c518a 100644 --- a/Mage.Tests/src/test/java/org/mage/test/commander/duel/AnafenzaTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/commander/duel/AnafenzaTest.java @@ -103,7 +103,7 @@ public class AnafenzaTest extends CardTestCommanderDuelBase { addCard(Zone.BATTLEFIELD, playerA, "Acidic Slime", 1); addCard(Zone.HAND, playerB, "Forest", 2); - // Landfall - Whenever a land enters the battlefield under your control, put a 5/5 red and green Elemental creature token onto the battlefield. + // Landfall — Whenever a land enters the battlefield under your control, put a 5/5 red and green Elemental creature token onto the battlefield. // Whenever Omnath, Locus of Rage or another Elemental you control dies, Omnath deals 3 damage to any target. addCard(Zone.BATTLEFIELD, playerB, "Omnath, Locus of Rage", 1); diff --git a/Mage/src/main/java/mage/abilities/abilityword/ConstellationAbility.java b/Mage/src/main/java/mage/abilities/abilityword/ConstellationAbility.java index 6dd21c8b275..1f1edfde803 100644 --- a/Mage/src/main/java/mage/abilities/abilityword/ConstellationAbility.java +++ b/Mage/src/main/java/mage/abilities/abilityword/ConstellationAbility.java @@ -79,6 +79,6 @@ public class ConstellationAbility extends TriggeredAbilityImpl { @Override public String getRule() { - return new StringBuilder("Constellation - Whenever {this} or another enchantment enters the battlefield under your control, ").append(super.getRule()).toString(); + return new StringBuilder("Constellation — Whenever {this} or another enchantment enters the battlefield under your control, ").append(super.getRule()).toString(); } } diff --git a/Mage/src/main/java/mage/abilities/abilityword/KinshipAbility.java b/Mage/src/main/java/mage/abilities/abilityword/KinshipAbility.java index 3bc8a61082b..8ff8641c943 100644 --- a/Mage/src/main/java/mage/abilities/abilityword/KinshipAbility.java +++ b/Mage/src/main/java/mage/abilities/abilityword/KinshipAbility.java @@ -86,7 +86,7 @@ public class KinshipAbility extends TriggeredAbilityImpl { @Override public String getRule() { - return new StringBuilder("Kinship - At the beginning of your upkeep, ").append(super.getRule()).toString(); + return new StringBuilder("Kinship — At the beginning of your upkeep, ").append(super.getRule()).toString(); } } diff --git a/Mage/src/main/java/mage/abilities/abilityword/LieutenantAbility.java b/Mage/src/main/java/mage/abilities/abilityword/LieutenantAbility.java index 6471e97e765..701c6dff438 100644 --- a/Mage/src/main/java/mage/abilities/abilityword/LieutenantAbility.java +++ b/Mage/src/main/java/mage/abilities/abilityword/LieutenantAbility.java @@ -46,12 +46,12 @@ import mage.constants.Zone; public class LieutenantAbility extends SimpleStaticAbility { public LieutenantAbility(ContinuousEffect effect) { - super(Zone.BATTLEFIELD, new ConditionalContinuousEffect(new BoostSourceEffect(2, 2, Duration.WhileOnBattlefield), CommanderInPlayCondition.instance, "Lieutenant - As long as you control your commander, {this} gets +2/+2")); + super(Zone.BATTLEFIELD, new ConditionalContinuousEffect(new BoostSourceEffect(2, 2, Duration.WhileOnBattlefield), CommanderInPlayCondition.instance, "Lieutenant — As long as you control your commander, {this} gets +2/+2")); this.addEffect(new ConditionalContinuousEffect(effect, CommanderInPlayCondition.instance, effect.getText(null))); } public LieutenantAbility(Effects effects) { - super(Zone.BATTLEFIELD, new ConditionalContinuousEffect(new BoostSourceEffect(2, 2, Duration.WhileOnBattlefield), CommanderInPlayCondition.instance, "Lieutenant - As long as you control your commander, {this} gets +2/+2")); + super(Zone.BATTLEFIELD, new ConditionalContinuousEffect(new BoostSourceEffect(2, 2, Duration.WhileOnBattlefield), CommanderInPlayCondition.instance, "Lieutenant — As long as you control your commander, {this} gets +2/+2")); for (Effect effect : effects) { this.addEffect(new ConditionalContinuousEffect((ContinuousEffect) effect, CommanderInPlayCondition.instance, effect.getText(null))); } diff --git a/Mage/src/main/java/mage/abilities/abilityword/StriveAbility.java b/Mage/src/main/java/mage/abilities/abilityword/StriveAbility.java index 4517b16cd5f..8804fe9b33a 100644 --- a/Mage/src/main/java/mage/abilities/abilityword/StriveAbility.java +++ b/Mage/src/main/java/mage/abilities/abilityword/StriveAbility.java @@ -68,7 +68,7 @@ public class StriveAbility extends SimpleStaticAbility { @Override public String getRule() { - return new StringBuilder("Strive - {this} costs ").append(striveCost).append(" more to cast for each target beyond the first.").toString(); + return new StringBuilder("Strive — {this} costs ").append(striveCost).append(" more to cast for each target beyond the first.").toString(); } } diff --git a/Mage/src/main/java/mage/abilities/effects/keyword/SweepEffect.java b/Mage/src/main/java/mage/abilities/effects/keyword/SweepEffect.java index b70c5895679..fa6a28a5f90 100644 --- a/Mage/src/main/java/mage/abilities/effects/keyword/SweepEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/keyword/SweepEffect.java @@ -53,7 +53,7 @@ public class SweepEffect extends OneShotEffect { public SweepEffect(SubType sweepSubtype) { super(Outcome.Benefit); this.sweepSubtype = sweepSubtype; - this.staticText = "Sweep - Return any number of " + sweepSubtype + (sweepSubtype.getDescription().endsWith("s") ? "" : "s") + " you control to their owner's hand"; + this.staticText = "Sweep — Return any number of " + sweepSubtype + (sweepSubtype.getDescription().endsWith("s") ? "" : "s") + " you control to their owner's hand"; } public SweepEffect(final SweepEffect effect) { diff --git a/Mage/src/main/java/mage/abilities/keyword/BattalionAbility.java b/Mage/src/main/java/mage/abilities/keyword/BattalionAbility.java index 9b78f558631..a9fedfd858a 100644 --- a/Mage/src/main/java/mage/abilities/keyword/BattalionAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/BattalionAbility.java @@ -72,7 +72,7 @@ public class BattalionAbility extends TriggeredAbilityImpl { @Override public String getRule() { - return new StringBuilder("Battalion - Whenever {this} and at least two other creatures attack, ").append(super.getRule()).toString() ; + return new StringBuilder("Battalion — Whenever {this} and at least two other creatures attack, ").append(super.getRule()).toString() ; } } diff --git a/Mage/src/main/java/mage/abilities/keyword/BloodrushAbility.java b/Mage/src/main/java/mage/abilities/keyword/BloodrushAbility.java index dafb43c8e81..ea9fda3ca01 100644 --- a/Mage/src/main/java/mage/abilities/keyword/BloodrushAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/BloodrushAbility.java @@ -65,7 +65,7 @@ public class BloodrushAbility extends ActivatedAbilityImpl { @Override public String getRule() { - StringBuilder sb = new StringBuilder("Bloodrush - "); + StringBuilder sb = new StringBuilder("Bloodrush — "); sb.append(super.getRule()); return sb.toString(); } diff --git a/Mage/src/main/java/mage/abilities/keyword/ChannelAbility.java b/Mage/src/main/java/mage/abilities/keyword/ChannelAbility.java index f181894b99b..a88831f2253 100644 --- a/Mage/src/main/java/mage/abilities/keyword/ChannelAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/ChannelAbility.java @@ -60,7 +60,7 @@ public class ChannelAbility extends ActivatedAbilityImpl { @Override public String getRule() { - StringBuilder sb = new StringBuilder("Channel - "); + StringBuilder sb = new StringBuilder("Channel — "); sb.append(super.getRule()); if(this.timing == TimingRule.SORCERY) { sb.append(" Activate this ability only any time you could cast a sorcery."); diff --git a/Mage/src/main/java/mage/abilities/keyword/HeroicAbility.java b/Mage/src/main/java/mage/abilities/keyword/HeroicAbility.java index 083a80484b7..1a8d5d70583 100644 --- a/Mage/src/main/java/mage/abilities/keyword/HeroicAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/HeroicAbility.java @@ -103,6 +103,6 @@ public class HeroicAbility extends TriggeredAbilityImpl { @Override public String getRule() { - return new StringBuilder("Heroic - Whenever you cast a spell that targets {this}, ").append(super.getRule()).toString(); + return new StringBuilder("Heroic — Whenever you cast a spell that targets {this}, ").append(super.getRule()).toString(); } } diff --git a/Mage/src/main/java/mage/abilities/keyword/InspiredAbility.java b/Mage/src/main/java/mage/abilities/keyword/InspiredAbility.java index 23a8b876bb1..5ac808f7dad 100644 --- a/Mage/src/main/java/mage/abilities/keyword/InspiredAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/InspiredAbility.java @@ -71,6 +71,6 @@ public class InspiredAbility extends TriggeredAbilityImpl { @Override public String getRule() { - return "Inspired - Whenever {this} becomes untapped, " + super.getRule(); + return "Inspired — Whenever {this} becomes untapped, " + super.getRule(); } } diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 603cdffbda8..1f28bcb355a 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -1358,12 +1358,12 @@ Crack the Earth|Betrayers of Kamigawa|98|C|{R}|Sorcery - Arcane|||Each player sa Cunning Bandit|Betrayers of Kamigawa|99|U|{1}{R}{R}|Creature - Human Warrior|2|2|Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Cunning Bandit.$At the beginning of the end step, if there are two or more ki counters on Cunning Bandit, you may flip it.$| Acolyte's Reward|Born of the Gods|1|U|{1}{W}|Instant|||Prevent the next X damage that would be dealt to target creature this turn, where X is your devotion to white. If damage is prevented this way, Acolyte's Reward deals that much damage to any target.| Akroan Phalanx|Born of the Gods|2|U|{3}{W}|Creature - Human Soldier|3|3|Vigilance${2}{R}: Creatures you control get +1/+0 until end of turn.| -Akroan Skyguard|Born of the Gods|3|C|{1}{W}|Creature - Human Soldier|1|1|Flying$Heroic - Whenever you cast a spell that targets Akroan Skyguard, put a +1/+1 counter on Akroan Skyguard.| +Akroan Skyguard|Born of the Gods|3|C|{1}{W}|Creature - Human Soldier|1|1|Flying$Heroic — Whenever you cast a spell that targets Akroan Skyguard, put a +1/+1 counter on Akroan Skyguard.| Archetype of Courage|Born of the Gods|4|U|{1}{W}{W}|Enchantment Creature Human Soldier|2|2|Creatures you control have first strike.$Creatures your opponents control lose first strike and can't have or gain first strike.| Brimaz, King of Oreskos|Born of the Gods|5|M|{1}{W}{W}|Legendary Creature Cat Soldier|3|4|Vigilance$Whenever Brimaz, King of Oreskos attacks, put a 1/1 white Cat Soldier creature token with vigilance onto the battlefield attacking.$Whenever Brimaz blocks a creature, put a 1/1 white Cat Soldier creature token with vigilance onto the battlefield blocking that creature.| Dawn to Dusk|Born of the Gods|6|U|{2}{W}{W}|Sorcery|||Choose one or both Return target enchantment card from your graveyard to your hand; and/or destroy target enchantment.| Eidolon of Countless Battles|Born of the Gods|7|R|{1}{W}{W}|Enchantment Creature Spirit|0|0|Bestow {2}{W}{W}$Eidolon of Countless Battles and enchanted creature get +1/+1 for each creature you control and +1/+1 for each Aura you control.| -Elite Skirmisher|Born of the Gods|8|C|{2}{W}|Creature - Human Soldier|3|1|Heroic - Whenever you cast a spell that targets Elite Skirmisher, you may tap target creature.| +Elite Skirmisher|Born of the Gods|8|C|{2}{W}|Creature - Human Soldier|3|1|Heroic — Whenever you cast a spell that targets Elite Skirmisher, you may tap target creature.| Ephara's Radiance|Born of the Gods|9|C|{W}|Enchantment - Aura|||Enchant creature$Enchanted creature has "{1}{W}, {T}: You gain 3 life."| Excoriate|Born of the Gods|10|C|{3}{W}|Sorcery|||Exile target tapped creature.| Fated Retribution|Born of the Gods|11|R|{4}{W}{W}{W}|Instant|||Destroy all creatures and planeswalkers. If it's your turn, scry 2.| @@ -1377,7 +1377,7 @@ Hold at Bay|Born of the Gods|18|C|{1}{W}|Instant|||Prevent the next 7 damage tha Loyal Pegasus|Born of the Gods|19|C|{W}|Creature Pegasus|2|1|Flying$Loyal Pegasus can't attack or block alone.| Mortal's Ardor|Born of the Gods|20|C|{W}|Instant|||Target creature gets +1/+1 and gains lifelink until end of turn.| Nyxborn Shieldmate|Born of the Gods|21|C|{W}|Enchantment Creature Human Soldier|1|2|Bestow {2}{W}$Enchanted creature gets +1/+2.| -Oreskos Sun Guide|Born of the Gods|22|C|{1}{W}|Creature Cat Monk|2|2|Inspired - Whenever Oreskos Sun Guide becomes untapped, you gain 2 life.| +Oreskos Sun Guide|Born of the Gods|22|C|{1}{W}|Creature Cat Monk|2|2|Inspired — Whenever Oreskos Sun Guide becomes untapped, you gain 2 life.| Ornitharch|Born of the Gods|23|U|{3}{W}{W}|Creature - Archon|3|3|Flying$Tribute 2$When Ornitharch enters the battlefield, if tribute wasn't paid, put two 1/1 white Bird creature tokens with flying onto the battlefield.| Plea for Guidance|Born of the Gods|24|R|{5}{W}|Sorcery|||Search your library for up to two enchantment cards, reveal them, and put them into your hand. Then shuffle your library.| Revoke Existence|Born of the Gods|25|C|{1}{W}|Sorcery|||Exile target artifact or enchantment.| @@ -1385,12 +1385,12 @@ Silent Sentinel|Born of the Gods|26|R|{5}{W}{W}|Creature Archon|4|6|Flying$Whe Spirit of the Labyrinth|Born of the Gods|27|R|{1}{W}|Enchantment Creature Spirit|3|1|Each player can't draw more than one card each turn.| Sunbond|Born of the Gods|28|U|{3}{W}|Enchantment Aura|||Enchant creature$Enchanted creature has "Whenever you gain life, put that many +1/+1 counters on this creature."| Vanguard of Brimaz|Born of the Gods|29|U|{W}{W}|Creature Cat Soldier|2|2|Vigilance$Heroic Whenever you cast a spell that targets Vanguard of Brimaz, put a 1/1 white Cat Soldier creature token with vigilance onto the battlefield.| -Aerie Worshippers|Born of the Gods|30|U|{3}{U}|Creature Human Cleric|2|4|Inspired - Whenever Aerie Worshipers becomes untapped, you may pay {2}{U}. If you do, put a 2/2 blue Bird enchantment creature token with flying onto the battlefield.| -Arbiter of the Ideal|Born of the Gods|31|R|{4}{U}{U}|Creature Sphinx|4|5|Flying$Inspired - Whenever Arbiter of the Ideal becomes untapped, reveal the top card of your library. If it's an artifact, creature, or land card, you may put it onto the battlefield with a manifestation counter on it. It's an enchantment in addition to its other types.| +Aerie Worshippers|Born of the Gods|30|U|{3}{U}|Creature Human Cleric|2|4|Inspired — Whenever Aerie Worshipers becomes untapped, you may pay {2}{U}. If you do, put a 2/2 blue Bird enchantment creature token with flying onto the battlefield.| +Arbiter of the Ideal|Born of the Gods|31|R|{4}{U}{U}|Creature Sphinx|4|5|Flying$Inspired — Whenever Arbiter of the Ideal becomes untapped, reveal the top card of your library. If it's an artifact, creature, or land card, you may put it onto the battlefield with a manifestation counter on it. It's an enchantment in addition to its other types.| Archetype of Imagination|Born of the Gods|32|U|{4}{U}{U}|Enchantment Creature Human Wizard|3|2|Creatures you control have flying.$Creatures your opponents control lose flying and can't have or gain flying.| -Chorus of the Tides|Born of the Gods|33|C|{3}{U}|Creature - Siren|3|2|Flying$Heroic - Whenever you cast a spell that targets Chorus of the Tides, scry 1.| +Chorus of the Tides|Born of the Gods|33|C|{3}{U}|Creature - Siren|3|2|Flying$Heroic — Whenever you cast a spell that targets Chorus of the Tides, scry 1.| Crypsis|Born of the Gods|34|C|{1}{U}|Instant|||Target creature you control gains protection from creatures your opponents control until end of turn. Untap it.| -Deepwater Hypnotist|Born of the Gods|35|C|{1}{U}|Creature - Merfolk Wizard|2|1|Inspired - Whenever Deepwater Hypnotist becomes untapped, target creature an opponent controls gets -3/-0 until end of turn.| +Deepwater Hypnotist|Born of the Gods|35|C|{1}{U}|Creature - Merfolk Wizard|2|1|Inspired — Whenever Deepwater Hypnotist becomes untapped, target creature an opponent controls gets -3/-0 until end of turn.| Divination|Born of the Gods|36|C|{2}{U}|Sorcery|||Draw two cards.| Eternity Snare|Born of the Gods|37|U|{5}{U}|Enchantment - Aura|||Enchant creature$When Eternity Snare enters the battlefield, draw a card.$Enchanted creature doesn't untap during its controller's untap step.| Evanescent Intellect|Born of the Gods|38|C|{U}|Enchantment - Aura|||Enchant creature$Enchanted creature has "{1}{U}, {T}: Target player puts the top three cards of his or her library into his or her graveyard."| @@ -1406,7 +1406,7 @@ Oracle's Insight|Born of the Gods|47|U|{3}{U}|Enchantment - Aura|||Enchant creat Perplexing Chimera|Born of the Gods|48|R|{4}{U}|Enchantment Creature Chimera|3|3|Whenever an opponent casts a spell, you may exchange control of Perplexing Chimera and that spell. If you do, you may choose new targets for the spell. (If the spell becomes a permanent, you control that permanent.)| Retraction Helix|Born of the Gods|49|C|{U}|Instant|||Until end of turn, target creature gains "{T}: Return target nonland permanent to its owner's hand."| Siren of the Fanged Coast|Born of the Gods|50|U|{3}{U}{U}|Creature - Siren|1|1|Flying$Tribute 3$When Siren of the Fanged Coast enters the battlefield, if tribute wasn't paid, gain control of target creature.| -Sphinx's Disciple|Born of the Gods|51|C|{3}{U}{U}|Creature - Human Wizard|2|2|Flying$Inspired - Whenever Sphinx's Disciple becomes untapped, draw a card.| +Sphinx's Disciple|Born of the Gods|51|C|{3}{U}{U}|Creature - Human Wizard|2|2|Flying$Inspired — Whenever Sphinx's Disciple becomes untapped, draw a card.| Stratus Walk|Born of the Gods|52|C|{1}{U}|Enchantment - Aura|||Enchant creature$When Stratus Walk enters the battlefield, draw a card.$Enchanted creature has flying.$Enchanted creature can block only creatures with flying.| Sudden Storm|Born of the Gods|53|C|{3}{U}|Instant|||Tap up to two target creatures. Those creatures don't untap during their controllers' next untap steps. Scry 1.| Thassa's Rebuff|Born of the Gods|54|U|{1}{U}|Instant|||Counter target spell unless its controller pays {X}, where X is your devotion to blue.| @@ -1426,7 +1426,7 @@ Eye Gouge|Born of the Gods|67|C|{B}|Instant|||Target creature gets -1/-1 until e Fate Unraveler|Born of the Gods|68|R|{3}{B}|Enchantment Creature Hag|3|4|Whenever an opponent draws a card, Fate Unraveler deals 1 damage to that player.| Fated Return|Born of the Gods|69|R|{4}{B}{B}{B}|Instant|||Put target creature card from a graveyard onto the battlefield under your control. It gains indestructible. If it's your turn, scry 2.| Felhide Brawler|Born of the Gods|70|C|{1}{B}|Creature Minotaur|2|2|Felhide Brawler can't block unless you control another Minotaur.| -Forlorn Pseudamma|Born of the Gods|71|U|{3}{B}|Creature Zombie|2|1|Intimidate$Inspired - Whenever Forlorn Pseudamma becomes untapped, you may pay {2}{B}. If you do, put a 2/2 black Zombie enchantment creature token onto the battlefield.| +Forlorn Pseudamma|Born of the Gods|71|U|{3}{B}|Creature Zombie|2|1|Intimidate$Inspired — Whenever Forlorn Pseudamma becomes untapped, you may pay {2}{B}. If you do, put a 2/2 black Zombie enchantment creature token onto the battlefield.| Forsaken Drifters|Born of the Gods|72|C|{3}{B}|Creature - Zombie|4|2|When Forsaken Drifters dies, put the top four cards of your library into your graveyard.| Gild|Born of the Gods|73|R|{3}{B}|Enchantment Creature Hag|3|4|Whenever an opponent draws a card, Fate Unraveler deals 1 damage to that player.| Grisly Transformation|Born of the Gods|74|C|{2}{B}|Enchantment - Aura|||Enchant creature$When Grisly Transformation enters the battlefield, draw a card.$Enchanted creature has intimidate.| @@ -1435,12 +1435,12 @@ Marshmist Titan|Born of the Gods|76|C|{6}{B}|Creature Giant|4|5|Marshmist Tita Necrobite|Born of the Gods|77|C|{2}{B}|Instant|||Target creature gains deathtouch until end of turn. Regenerate it.| Nyxborn Eidolon|Born of the Gods|78|C|{1}{B}|Enchantment Creature Spirit|2|1|Bestow {4}{B}$Enchanted creature gets +2/+1.| Odunos River Trawler|Born of the Gods|79|U|{2}{B}|Creature - Zombie|2|2|When Odunos River Trawler enters the battlefield, return target enchantment creature card from your graveyard to your hand.${W}, Sacrifice Odunos River Trawler: Return target enchantment creature card from your graveyard to your hand.| -Pain Seer|Born of the Gods|80|R|{1}{B}|Creature Human Wizard|2|2|Inspired - Whenever Pain Seer becomes untapped, reveal the top card of your library and put that card into your hand. You lose life equal to that card's converted mana cost.| +Pain Seer|Born of the Gods|80|R|{1}{B}|Creature Human Wizard|2|2|Inspired — Whenever Pain Seer becomes untapped, reveal the top card of your library and put that card into your hand. You lose life equal to that card's converted mana cost.| Sanguimancy|Born of the Gods|81|U|{4}{B}|Sorcery|||You draw X cards and you lose X life, where X is your devotion to black.| -Servant of Tymaret|Born of the Gods|82|C|{2}{B}|Creature Zombie|1|3|Inspired - Whenever Servant of Tymaret becomes untapped, each opponent loses 1 life. You gain life equal to the life lost this way.${2}{B}: Regenerate Servant of Tymaret.| +Servant of Tymaret|Born of the Gods|82|C|{2}{B}|Creature Zombie|1|3|Inspired — Whenever Servant of Tymaret becomes untapped, each opponent loses 1 life. You gain life equal to the life lost this way.${2}{B}: Regenerate Servant of Tymaret.| Shrike Harpy|Born of the Gods|83|U|{3}{B}{B}|Creature Harpy|2|2|Flying$Tribute 2 (As this creature enters the battlefield, an opponent of your choice may place two +1/+1 counters on it.)$When Shrike Harpy enters the battlefield, if tribute wasn't paid, target opponent sacrifices a creature.| Spiteful Returned|Born of the Gods|84|U|{1}{B}|Enchantment Creature Zombie|1|1|Bestow {3}{B}$Whenever Spiteful Returned or enchanted creature attacks, defending player loses 2 life.$Enchanted creature gets +1/+1.| -Warchanter of Mogis|Born of the Gods|85|C|{3}{B}{B}|Creature Minotaur Shaman|3|3|Inspired - Whenever Warchanter of Mogis becomes untapped, target creature you control gains intimidate until end of turn.| +Warchanter of Mogis|Born of the Gods|85|C|{3}{B}{B}|Creature Minotaur Shaman|3|3|Inspired — Whenever Warchanter of Mogis becomes untapped, target creature you control gains intimidate until end of turn.| Weight of the Underworld|Born of the Gods|86|C|{3}{B}|Enchantment Aura|||Enchant creature$Enchanted creature gets -3/-2.| Akroan Conscriptor|Born of the Gods|87|U|{4}{R}|Creature Human Shaman|3|2|Heroic Whenever you cast a spell that targets Akroan Conscriptor, gain control of another target creature until end of turn. Untap that creature. It gains haste until end of turn.| Archetype of Aggression|Born of the Gods|88|U|{1}{R}{R}|Enchantment Creature Human Warrior|3|2|Creatures you control have trample.$Creatures your opponents control lose trample and can't have or gain trample.| @@ -1451,11 +1451,11 @@ Everflame Eidolon|Born of the Gods|92|U|{1}{R}|Enchantment Creature Spirit|1|1 Fall of the Hammer|Born of the Gods|93|C|{1}{R}|Instant|||Target creature you control deals damage equal to its power to another target creature.| Fated Conflagration|Born of the Gods|94|R|{1}{R}{R}{R}|Instant|||Fated Conflagration deals 5 damage to target creature or planewalker. If it's your turn, scry 2.| Fearsome Temper|Born of the Gods|95|C|{2}{R}|Enchantment Aura|||Enchant creature$Enchanted creature gets +2/+2 and has "{2}{R}: Target creature can't block this creature this turn."| -Felhide Spiritbinder|Born of the Gods|96|R|{3}{R}|Creature Minotaur Shaman|3|4|Inspired - Whenever Felhide Spiritbinder becomes untapped, you may pay {1}{R}. If you do, put a token onto the battlefield that's a copy of another target creature except it's an enchantment in addition to its other types. It gains haste. Exile it at the beginning of the next end step.| +Felhide Spiritbinder|Born of the Gods|96|R|{3}{R}|Creature Minotaur Shaman|3|4|Inspired — Whenever Felhide Spiritbinder becomes untapped, you may pay {1}{R}. If you do, put a token onto the battlefield that's a copy of another target creature except it's an enchantment in addition to its other types. It gains haste. Exile it at the beginning of the next end step.| Flame-Wreathed Phoenix|Born of the Gods|97|M|{2}{R}{R}|Creature Phoenix|3|3|Flying$Tribute 2 (As this creature enters the battlefield, an opponent of your choice may place two +1/+1 counters on it.)$When Flame-Wreathed Phoenix enters the battlefield, if tribute wasn't paid, it gains haste and "When this creature dies, return it to its owner's hand."| Forgestoker Dragon|Born of the Gods|98|R|{4}{R}{R}|Creature Dragon|5|4|Flying${1}{R}: Forgestoker Dragon deals 1 damage to target creature. That creature can't block this combat. Activate this ability only if Forgestoker Dragon is attacking.| Impetuous Sunchaser|Born of the Gods|99|C|{1}{R}|Creature Human Soldier|1|1|Flying, haste$Impetuous Sunchaser attacks each turn if able.| -Kragma Butcher|Born of the Gods|100|C|{2}{R}|Creature Minotaur Warrior|2|3|Inspired - Whenever Kragma Butcher becomes untapped, it gets +2/+0 until end of turn.| +Kragma Butcher|Born of the Gods|100|C|{2}{R}|Creature Minotaur Warrior|2|3|Inspired — Whenever Kragma Butcher becomes untapped, it gets +2/+0 until end of turn.| Lightning Volley|Born of the Gods|101|U|{3}{R}|Instant|||Until end of turn, creatures you control gain "{T}: This creature deals 1 damage to any target."| Nyxborn Rollicker|Born of the Gods|102|C|{R}|Enchantment Creature Satyr|1|1|Bestow {1}{R}$Enchanted creature gets +1/+1.| Oracle of Bones|Born of the Gods|103|R|{2}{R}{R}|Creature Minotaur Shaman|3|1|Haste$Tribute 2 (As this creature enters the battlefield, an opponent of your choice may place two +1/+1 counters on it.)$When Oracle of Bones enters the battlefield, if tribute wasn't paid, you may cast an instant or sorcery card from your hand without paying its mana cost.| @@ -1464,7 +1464,7 @@ Pinnacle of Rage|Born of the Gods|105|U|{4}{R}{R}|Sorcery|||Pinnacle of Rage dea Reckless Reveler|Born of the Gods|106|C|{1}{R}|Creature Satyr|2|1|{R}, Sacrifice Reckless Reveler: Destroy target artifact.| Rise to the Challenge|Born of the Gods|107|C|{1}{R}|Instant|||Target creature gets +2/+0 and gains first strike until end of turn.| Satyr Firedancer|Born of the Gods|108|R|{1}{R}|Enchantment Creature Satyr|1|1|Whenever an instant or sorcery spell you control deals damage to an opponent, Satyr Firedancer deals that much damage to target creature that player controls.| -Satyr Nyx-Smith|Born of the Gods|109|U|{2}{R}|Creature Satyr Shaman|2|1|Haste$Inspired - Whenever Satyr Nyx-Smith becomes untapped, you may pay {2}{R}. If you do, put a 3/1 red Elemental enchantment creature token with haste onto the battlefield.| +Satyr Nyx-Smith|Born of the Gods|109|U|{2}{R}|Creature Satyr Shaman|2|1|Haste$Inspired — Whenever Satyr Nyx-Smith becomes untapped, you may pay {2}{R}. If you do, put a 3/1 red Elemental enchantment creature token with haste onto the battlefield.| Scouring Sands|Born of the Gods|110|C|{1}{R}|Sorcery|||Scouring Sands deals 1 damage to each creature your opponents control. Scry 1.| Searing Blood|Born of the Gods|111|U|{R}{R}|Instant|||Searing Blood deals 2 damage to target creature. When that creature dies this turn, Searing Blood deals 3 damage to that creature's controller.| Stormcaller of Keranos|Born of the Gods|112|U|{2}{R}|Creature Human Shaman|2|2|Haste${1}{U}: Scry 1.| @@ -1488,8 +1488,8 @@ Nessian Wilds Ravager|Born of the Gods|129|R|{4}{G}{G}|Creature Hydra|6|6|Trib Noble Quarry|Born of the Gods|130|U|{2}{G}|Enchantment Creature Unicorn|1|1|Bestow {5}{G}$All creatures able to block Noble Quarry or enchanted creature do so.$Enchanted creature gets +1/+1.| Nyxborn Wolf|Born of the Gods|131|C|{2}{G}|Enchantment Creature Wolf|3|1|Bestow {4}{G}$Enchanted creature gets +3/+1.| Peregrination|Born of the Gods|132|U|{3}{G}|Sorcery|||Seach your library for up to two basic land cards, reveal those cards, and put one onto the battlefield tapped and the other into your hand. Shuffle your library, then scry 1.| -Pheres-Band Raiders|Born of the Gods|133|U|{5}{G}|Creature Centaur Warrior|5|5|Inspired - Whenever Pheres-Band Raiders becomes untapped, you may pay {2}{G}. If you do, put a 3/3 green Centaur enchantment creature token onto the battlefield.| -Pheres-Band Tromper|Born of the Gods|134|C|{3}{G}|Creature Centaur Warrior|3|3|Inspired - Whenever Pheres-Band Tromper becomes untapped, put a +1/+1 counter on it.| +Pheres-Band Raiders|Born of the Gods|133|U|{5}{G}|Creature Centaur Warrior|5|5|Inspired — Whenever Pheres-Band Raiders becomes untapped, you may pay {2}{G}. If you do, put a 3/3 green Centaur enchantment creature token onto the battlefield.| +Pheres-Band Tromper|Born of the Gods|134|C|{3}{G}|Creature Centaur Warrior|3|3|Inspired — Whenever Pheres-Band Tromper becomes untapped, put a +1/+1 counter on it.| Raised by Wolves|Born of the Gods|135|U|{3}{G}{G}|Enchantment Aura|||Enchant creature$When Raised by Wolves enters the battlefield, put two 2/2 green Wolf creature tokens onto the battlefield.$Enchanted creature gets +1/+1 for each Wolf you control.| Satyr Wayfinder|Born of the Gods|136|C|{1}{G}|Creature Satyr|1|1|When Satyr Wayfinder enters the battlefield, reveal the top four cards of your library. You may put a land card from among them into your hand. Put the rest into your graveyard.| Scourge of Skola Vale|Born of the Gods|137|R|{2}{G}|Creature Hydra|0|0|Trample$Scourge of Skola Vale enters the battlefield with two +1/+1 counters on it.${T}, Sacrifice another creature: Put a number of +1/+1 counters on Scourge of Skola Vale equal to the sacrificed creature's toughness.| @@ -1510,7 +1510,7 @@ Mogis, God of Slaughter|Born of the Gods|151|M|{2}{B}{R}|Legendary Enchantment C Phenax, God of Deception|Born of the Gods|152|M|{3}{U}{B}|Legendary Enchantment Creature God|4|7|Indestructible$As long as your devotion to blue and black is less than seven, Phenax isn't a creature.$Creatures you control have "{T}: Target player puts the top X cards of his or her library into his or her graveyard, where X is this creature's toughness."| Ragemonger|Born of the Gods|153|U|{1}{B}{R}|Creature Minotaur Shaman|2|3|Minotaur spells you cast cost {B}{R} less to cast. This effect reduces only the amount of colored mana you pay. (For example, if you cast a Minotaur spell with mana cost {2}{R}, it costs {2} to cast.)| Reap What Is Sown|Born of the Gods|154|U|{1}{G}{W}|Instant|||Put a +1/+1 counter on each of up to three target creatures.| -Siren of the Silent Song|Born of the Gods|155|U|{1}{U}{B}|Creature Zombie Siren|2|1|Flying$Inspired - Whenever Siren of the Silent Song becomes untapped, each opponent discards a card, then puts the top card of his or her library into his or her graveyard.| +Siren of the Silent Song|Born of the Gods|155|U|{1}{U}{B}|Creature Zombie Siren|2|1|Flying$Inspired — Whenever Siren of the Silent Song becomes untapped, each opponent discards a card, then puts the top card of his or her library into his or her graveyard.| Xenagos, God of Revels|Born of the Gods|156|M|{3}{R}{G}|Legendary Enchantment Creature God|6|5|Indestructible$As long as your devotion to red and green is less than seven, Xenagos isn't a creature.$At the beginning of combat on your turn, another target creature you control gains haste and gets +X/+X until end of turn, where X is that creature's power.| Astral Cornucopia|Born of the Gods|157|R|{X}{X}{X}|Artifact|||Astral Cornucopia enters the battlefield with X charge counters on it.${T}: Choose a color. Add one mana of that color for each charge counter on Astral Cornucopia.| Gorgon's Head|Born of the Gods|158|U|{1}|Artifact Equipment|||Equipped creature has deathtouch.$Equip {2}| @@ -4371,15 +4371,15 @@ Virulent Plague|Dragons of Tarkir|125|U|{2}{B}|Enchantment|||Creature tokens get Vulturous Aven|Dragons of Tarkir|126|C|{3}{B}|Creature - Bird Shaman|2|3|Flying$Exploit (When this creature enters the battlefield, you may sacrifice a creature.)$When Vulturous Aven explots a creature, you draw two cards and you lose 2 life.| Wandering Tombshell|Dragons of Tarkir|127|C|{3}{B}|Creature - Zombie Turtle|1|6|| Atarka Efreet|Dragons of Tarkir|128|C|{3}{R}|Creature - Efreet Shaman|5|1|Megamorph {2}{R} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.)$When Atarka Efreet is turned face up, it deals 1 damage to any target.| -Atarka Pummeler|Dragons of Tarkir|129|U|{4}{R}|Creature - Ogre Warrior|4|5|Formidable - {3}{R}{R}: Each creature you control can't be blocked this turn except by two or more creatures. Activate this ability only if creature you control have total power 8 or greater,| +Atarka Pummeler|Dragons of Tarkir|129|U|{4}{R}|Creature - Ogre Warrior|4|5|Formidable — {3}{R}{R}: Each creature you control can't be blocked this turn except by two or more creatures. Activate this ability only if creature you control have total power 8 or greater,| Berserkers' Onslaught|Dragons of Tarkir|130|R|{3}{R}{R}|Enchantment|||Attacking creatures you control have double strike.| Commune with Lava|Dragons of Tarkir|131|R|{X}{R}{R}|Instant|||Exile the top X cards of your library. Until the end of your next turn, you may play those cards.| -Crater Elemental|Dragons of Tarkir|132|R|{2}{R}|Creature - Elemental|0|6|{R}, {T}, Sacrifice Crater Elemental: Crater Elemental deals 4 damage to target creature.$Formidable - {2}{R}: Crater Elemental has base power 8 until end of turn. Activate this ability only if creatures you control have total power 8 or greater.| +Crater Elemental|Dragons of Tarkir|132|R|{2}{R}|Creature - Elemental|0|6|{R}, {T}, Sacrifice Crater Elemental: Crater Elemental deals 4 damage to target creature.$Formidable — {2}{R}: Crater Elemental has base power 8 until end of turn. Activate this ability only if creatures you control have total power 8 or greater.| Descent of the Dragons|Dragons of Tarkir|133|M|{4}{R}{R}|Sorcery||Destroy any number of target creatures. For each creature destroyed this way, its controller puts a 4/4 red Dragon creature token with flying onto the battlefield.| Draconic Roar|Dragons of Tarkir|134|U|{1}{R}|Instant|||As an additional cost to cast Draconic Roar, you may reveal a Dragon card from your hand.$Draconic Roar deals 3 damage to target creature. If you revealed a Dragon card or controlled a Dragon as you cast Draconic Roar, Draconic Roar deals 3 damage to that creature's controller.| Dragon Fodder|Dragons of Tarkir|135|C|{1}{R}|Sorcery|||Put two 1/1 red Goblin creature tokens onto the battlefield.| Dragon Tempest|Dragons of Tarkir|136|R|{1}{R}|Enchantment|||Whenever a creature with flying enters the battlefield under your control, it gains haste until the end of turn.$Whenever a Dragon enters the battlefield under your control, it deals X damage to any target, where X is the number of Dragons you control.| -Dragon Whisperer|Dragons of Tarkir|137|M|{R}{R}|Creature - Human Shaman|2|2|{R}: Dragon Whisperer gains flying until end of turn.${1}{R}: Dragon Whisperer get +1/+0 until end of turn$ - {4}{R}{R}: Put a 4/4 red Dragon creature token with flying onto the battlefield. Activate this ability only if creatures you control have total power 8 or greater.| +Dragon Whisperer|Dragons of Tarkir|137|M|{R}{R}|Creature - Human Shaman|2|2|{R}: Dragon Whisperer gains flying until end of turn.${1}{R}: Dragon Whisperer get +1/+0 until end of turn$ — {4}{R}{R}: Put a 4/4 red Dragon creature token with flying onto the battlefield. Activate this ability only if creatures you control have total power 8 or greater.| Dragonlord's Servant|Dragons of Tarkir|138|U|{1}{R}|Creature - Goblin Shaman|1|3|Dragon spells you cast cost {1} less to cast.| Hardened Berserker|Dragons of Tarkir|139|C|{2}{R}|Creature - Human Berserker|3|2|Whenever Hardened Berserker attacks the next spell you cast this turn costs {1} less to cast.| Impact Tremors|Dragons of Tarkir|140|C|{1}{R}|Enchantment|||Whenever a creature enters the battlefield under your control, Impact Tremors deals 1 damage to each opponent.| @@ -4394,7 +4394,7 @@ Magmatic Chasm|Dragons of Tarkir|148|C|{1}{R}|Sorcery|||Creature without flying Qal Sisma Behemoth|Dragons of Tarkir|149|U|{2}{R}|Creature - Ogre Warrior|5|5|Qal Sisma Behemoth can't attack or block unless you pay {2}.| Rending Volley|Dragons of Tarkir|150|U|{R}|Instant|||Rending Volley can't be countered by spells or abilities.$Rending Volley deals 4 damage to target white or blue creature.| Roast|Dragons of Tarkir|151|U|{1}{R}|Sorcery|||Roast deals 5 damage to target creature without flying.| -Sabertooth Outrider|Dragons of Tarkir|152|C|{3}{R}|Creature - Human Warrior|4|2|Trample$Formidable - Whenever Sabertooth Outrider attacks, if creatures you control have total power 8 or greater, Sabertooth Outrider gains first strike until end of turn.| +Sabertooth Outrider|Dragons of Tarkir|152|C|{3}{R}|Creature - Human Warrior|4|2|Trample$Formidable — Whenever Sabertooth Outrider attacks, if creatures you control have total power 8 or greater, Sabertooth Outrider gains first strike until end of turn.| Sarkhan's Rage|Dragons of Tarkir|153|C|{4}{R}|Instant|||Sarkhan's Rage deals 5 damage to any target. If you control no Dragons, Sarkhan's Rage deals 2 damage to you.| Sarkhan's Triumph|Dragons of Tarkir|154|U|{2}{R}|Instant|||Search your library for a Dragon creature card, reveal it, put it into your hand, then shuffle your library.| Screamreach Brawler|Dragons of Tarkir|155|C|{2}{R}|Creature - Orc Berserker|2|3|Dash {1}{R} (You may cast this spell for its dash cost. If you do, it gains haste, and it's returned from the battlefield to its owner's hand at the beginning of the next end step.)| @@ -4416,25 +4416,25 @@ Aerie Bowmasters|Dragons of Tarkir|170|C|{2}|{G}{G}|Creature - Hound Archer|Reac Ainok Artillerist|Dragons of Tarkir|171|C|{2}{G}|Creature - Hound Arch|4|1|Ainok Artillerist has reach as long as it has a +1/+1 counter on it. (It can block creatures with flying.)| Ainok Survivalist|Dragons of Tarkir|172|U|{1}{G}|Creature - Hound Shaman|2|1|Megamorph {1}{G} (You may cast this card face down for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.)$When Ainok Survivalist is turned face up, destroy target artifact or enchantment an opponent controls.| Assault Formation|Dragons of Tarkir|173|R|{1}{G}|Enchantment|||Each creature you control assigns combat damage equal to its toughness rather than its power.${G}: Target creature with defender can attack this turn as though it didn't have defender.${2}{G}: Creatures you control get +0/+1 until end of turn.| -Atarka Beastbreaker|Dragons of Tarkir|174|C|{1}{G}|Creature - Human Warrior|2|2|Formidable - {4}{G}: Atarka Beastbreaker gets +4/+4 until end of turn. Activate this only if creatures you control have total power 8 or greater.| +Atarka Beastbreaker|Dragons of Tarkir|174|C|{1}{G}|Creature - Human Warrior|2|2|Formidable — {4}{G}: Atarka Beastbreaker gets +4/+4 until end of turn. Activate this only if creatures you control have total power 8 or greater.| Avatar of the Resolute|Dragons of Tarkir|175|R|{G}{G}|Creature - Avatar|3|2|Reach, trample$Avatar of the Resolute enters the battlefield with a +1/+1 counter on it for each other creature you control with a +1/+1 counter on it.| -Circle of Elders|Dragons of Tarkir|176|U|{2}{G}{G}|Creature - Human Shaman|2|4|Vigilance$Formidable - {T}: Add {C}{C}{C}. Activate this only if creatures you control have total power 8 or greater.| +Circle of Elders|Dragons of Tarkir|176|U|{2}{G}{G}|Creature - Human Shaman|2|4|Vigilance$Formidable — {T}: Add {C}{C}{C}. Activate this only if creatures you control have total power 8 or greater.| Collected Company|Dragons of Tarkir|177|R|{3}{G}|Instant|||Look at the top six cards of your library. Put up to two creature cards with converted mana cost 3 or less from among them onto the battlefield. Put the rest on the bottom of your library in any order.| Colossodon Yearling|Dragons of Tarkir|178|C|{2}{G}|Creature - Beast|2|4|| Conifer Strider|Dragons of Tarkir|179|C|{3}{G}|Creature - Elemental|5|1|Hexproof (This creature can't be the target of spells or abilities your opponents control.)| Deathmist Raptor|Dragons of Tarkir|180|M|{1}{G}{G}|Creature - Lizard Beast|3|3|Deathtouch$Whenever a permanent you control is turned face up, you may return Deathmist Raptor from your graveyard to the battlefield face up or face down.$Megamorph {4}{G} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.)| Den Protector|Dragons of Tarkir|181|R|{1}{G}|Creature - Human Warrior|2|1|Creatures with power less than Den Protector's power can't block it.$Megamorph {1}{G} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.)| Display of Dominance|Dragons of Tarkir|182|U|{1}{G}|Instant|||Choose one - Destroy target blue or black noncreature permanent; or Permanents you control can't be the targets of blue or black spells your opponents control this turn.| -Dragon-Scarred Bear|Dragons of Tarkir|183|C|{2}{G}|Creature - Bear|3|2|Formidable - {1}{G}: Regenerate Dragon-Scarred Bear. Activate this only if creatures you control have total power 8 or greater.| +Dragon-Scarred Bear|Dragons of Tarkir|183|C|{2}{G}|Creature - Bear|3|2|Formidable — {1}{G}: Regenerate Dragon-Scarred Bear. Activate this only if creatures you control have total power 8 or greater.| Dromoka's Gift|Dragons of Tarkir|184|U|{4}{G}|Instant|||Bolster 4. (Choose a creature with the least toughness among creatures you control and put four +1/+1 counters on it.)| Epic Confrontation|Dragons of Tarkir|185|C|{1}{G}|Sorcery|||Target creature you control gets +1/+2 until end of turn. It fights target creature you don't control.| Explosive Vegetation|Dragons of Tarkir|186|U|{3}{G}|Sorcery|||Search your library for up to two basic land cards and put them onto the battlefield tapped. Then shuffle your library.| Foe-Razer Regent|Dragons of Tarkir|187|R|{5}{G}{G}|Creature - Dragon|4|5|Flying$When Foe-Razer Regent enters the battlefield, you may have it fight target creature you don't control.$Whenever a creature you control fights, put two +1/+1 counters on it at the beginning of the next end step.| -Glade Watcher|Dragons of Tarkir|188|C|{1}{G}|Creature - Elemental|3|3|Defender$Formidable - {G}: Glade Watcher can attack this turn as though it didn't have defender. Activate this ability only if creatures you control have total power 8 or greater.| +Glade Watcher|Dragons of Tarkir|188|C|{1}{G}|Creature - Elemental|3|3|Defender$Formidable — {G}: Glade Watcher can attack this turn as though it didn't have defender. Activate this ability only if creatures you control have total power 8 or greater.| Guardian Shield-Bearer|Dragons of Tarkir|189|C|{1}{G}|Creature - Human Soldier|2|1|Megamorph {3}{G} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.)$When Guardian Shield-Bearer is turned face up, put a +1/+1 counter on another target creature you control.| Herdchaser Dragon|Dragons of Tarkir|190|U|{5}{G}|Creature - Dragon|3|3|Flying, trample$Megamorph {5}{G}{G} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it)$When Herdchaser Dragon is turned face up, put a +1/+1 counter on each other Dragon creature you control.| Inspiring Call|Dragons of Tarkir|191|U|{2}{G}|Instant|||Draw a card for each creature you control with a +1/+1 counter on it. THose creatures gain indestructible until end of turn. (Damage and effects that say "destroy" don't destroy them.)| -Lurking Arynx|Dragons of Tarkir|192|U|{4}{G}|Creature - Cat Beast|3|5|Formidable - {2}{G}: Target creature blocks Lurking Arynx this turn if able. Activate this ability only if creatures you control have total power 8 or greater.| +Lurking Arynx|Dragons of Tarkir|192|U|{4}{G}|Creature - Cat Beast|3|5|Formidable — {2}{G}: Target creature blocks Lurking Arynx this turn if able. Activate this ability only if creatures you control have total power 8 or greater.| Naturalize|Dragons of Tarkir|193|C|{1}{G}|Instant|||Destroy target artifact or enchantment.| Obscuring AEther|Dragons of Tarkir|194|R|{G}|Enchantment|||Face-down creature spells you cast cost {1} less to cast.${1}{G}: Turn Obscuring AEther face down. (It becomes a 2/2 creature.)| Pinion Feast|Dragons of Tarkir|195|C|{4}{G}|Instant|||Destroy target creature with flying. Bolster 2. (Choose a creature with the least toughness among creature you control and put two +1/1 counters on it.)| @@ -4446,13 +4446,13 @@ Sandsteppe Scavenger|Dragons of Tarkir|200|C|{4}{G}|Creature - Hound Scount|2|2| Scaleguard Sentinels|Dragons of Tarkir|201|U|{G}{G}|Creature - Human Soldier|2|3|As an additional cost to cast Scaleguard Sentinels, you may reveal a Dragon card from your hand.$Scaleguard Sentinels enters the battlefield with a +1/+1 counter on it if you revealed a Dragon card or controlled a Dragon as you cast Scaleguard Sentinels.| Segmented Krotiq|Dragons of Tarkir|202|C|{5}{G}|Creature - Insect|6|5|Megamorph {6}{G} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.)| Servant of the Scale|Dragons of Tarkir|203|C|{G}|Creature - Human Soldier|0|0|Servant of the Scale enters the battlefield with a +1/+1 counter on it.$When Servant of the Scale dies, put X +1/+1 counters on target creature you control, where X is the number of +1/+1 counter on Servant of the Scale.| -Shaman of Forgotten Ways|Dragons of Tarkir|204|M|{2}G}|Creature - Human Shaman| 2|3|{T}:Add two mana in any combination of colors. Spend this mana only to cast creature spells.$Formidable - {9}{G}{G},{T}:Each player's life total becomes the number of creatures he or she controls. Acitave the ability only if creatures you control have total power 8 or greater.| +Shaman of Forgotten Ways|Dragons of Tarkir|204|M|{2}G}|Creature - Human Shaman| 2|3|{T}:Add two mana in any combination of colors. Spend this mana only to cast creature spells.$Formidable — {9}{G}{G},{T}:Each player's life total becomes the number of creatures he or she controls. Acitave the ability only if creatures you control have total power 8 or greater.| Shape the Sands|Dragons of Tarkir|205|C|{G}|Instant|||Target creature gets +0/+5 and gains reach until end of turn. (It can block creatures with flying.)| Sheltered Aerie|Dragons of Tarkir|206|C|{2}{G}|Enchantment - Aura|||Enchant land$Enchanted land has "{T}: Add two mana of any one color."| Sight of the Scalelords|Dragons of Tarkir|207|U|{4}{G}|Enchantment|||At the beginning of combat on your turn, creature you control with toughness 4 or greater get +2/+2 and gain vigilance until end of turn.| -Stampeding Elk Herd|Dragons of Tarkir|208|C|{3}{G}{G}|Creature - Elk|5|5|Formidable - Whenever Stampeding Elk Herd attacks, if creatures you control have total power 8 or greater, creatures you control gain trample until end of turn.| +Stampeding Elk Herd|Dragons of Tarkir|208|C|{3}{G}{G}|Creature - Elk|5|5|Formidable — Whenever Stampeding Elk Herd attacks, if creatures you control have total power 8 or greater, creatures you control gain trample until end of turn.| Sunbringer's Touch|Dragons of Tarkir|209|R|{2}{G}{G}|Sorcery|||Bolster X, where X is the number of cards in your hand. Each creature you control with a +1/+1 counter on it gains trample until end of turn. (To bolster X, choose a creature with the least toughness among creature you control and put X +1/+1 counters on it.)| -Surrak, the Hunt Caller|Dragons of Tarkir|210|R|{2}{G}{G}|Legendary Creature - Human Warrior|5|4|Formidable - At the beginning of combat on your turn, if creatures you control have total power 8 or greater, target creature you control gains haste until end of turn.| +Surrak, the Hunt Caller|Dragons of Tarkir|210|R|{2}{G}{G}|Legendary Creature - Human Warrior|5|4|Formidable — At the beginning of combat on your turn, if creatures you control have total power 8 or greater, target creature you control gains haste until end of turn.| Tread Upon|Dragons of Tarkir|211|C|{1}{G}|Instant|||Target creature gets +2/+2 and gains trample until end of turn.| Arashin Sovereign|Dragons of Tarkir|212|R|{5}{G}{W}|Creature - Dragon|6|6|Flying$When Arashin Sovereign dies, you may put it on the top or bottom of its owner's library.| Atarka's Command|Dragons of Tarkir|213|R|{R}{G}|Instant|||Choose two - Your opponents can't gain life this turn; or Atarka's Command deals 3 damage to each opponent; or You may put a land card from your hand onto the battlefield; or Creatures you control get +1/+1 and gain reach until the end of turn.| @@ -13709,7 +13709,7 @@ Skaab Goliath|Magic Origins|74|U|{5}{U}|Creature - Zombie Giant|6|9|As an additi Soulblade Djinn|Magic Origins|75|R|{3}{U}{U}|Creature - Djinn|4|3|Flying$Whenever you cast a noncreature spell, creatures you control get +1/+1 until end of turn.| Sphinx's Tutelage|Magic Origins|76|U|{2}{U}|Enchantment|||Whenever you draw a card, target opponent puts the top two cards of his or her library into his or her graveyard. If they're both nonland cards that share a color, repeat this process.${5}{U}: Draw a card, then discard a card.| Stratus Walk|Magic Origins|77|C|{1}{U}|Enchantment - Aura|||Enchant creature$When Stratus Walk enters the battlefield, draw a card.$Enchanted creature has flying.$Enchanted creature can block only creatures with flying.| -Talent of the Telepath|Magic Origins|78|R|{2}{U}{U}|Sorcery|||Target opponent reveals the top seven cards of his or her library. You may cast an instant or sorcery card from among them without paying its mana cost. Then that player puts the rest into his or her graveyard. $Spell mastery --- If there are two or more instant and/or sorcery cards in your graveyard, you may cast up to two revealed instant and/or sorcery cards instead of one.| +Talent of the Telepath|Magic Origins|78|R|{2}{U}{U}|Sorcery|||Target opponent reveals the top seven cards of his or her library. You may cast an instant or sorcery card from among them without paying its mana cost. Then that player puts the rest into his or her graveyard. $Spell mastery —-- If there are two or more instant and/or sorcery cards in your graveyard, you may cast up to two revealed instant and/or sorcery cards instead of one.| Thopter Spy Network|Magic Origins|79|R|{2}{U}{U}|Enchantment|||At the beginning of your upkeep, if you control an artifact, put a 1/1 colorless Thopter artifact creature token with flying onto the battlefield.$Whenever one or more artifact creatures you control deals combat damage to a player, draw a card.| Tower Geist|Magic Origins|80|U|{3}{U}|Creature - Spirit|2|2|Flying$When Tower Geist enters the battlefield, look at the top two cards of your library. Put one of them into your hand and the other into your graveyard.| Turn to Frog|Magic Origins|81|U|{1}{U}|Instant|||Until end of turn, target creature loses all abilities and becomes a blue Frog with base power and toughness 1/1.| @@ -20058,7 +20058,7 @@ Avatar of the Resolute|Prerelease Events|162|R|{G}{G}|Creature - Avatar|3|2|Reac Blessed Reincarnation|Prerelease Events|163|R|{3}{U}|Instant|||Exile target creature an opponent controls. That player reveals cards from the top of his or her library until a creature card is revealed. The player puts that card onto the battlefield, then shuffles the rest into his or her library$Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of you next upkeep, you may cast this card from exile without paying its mana cost.)| Blood-Chin Fanatic|Prerelease Events|164|R|{1}{B}{B}|Creature - Orc Warrior|3|3|{1}{B}, Sacrifice another Warrior creature: Target player loses X life and you gain X life, where X is the sacrificed creature's power.| Boltwing Marauder|Prerelease Events|165|R|{3}{B}{R}|Creature - Dragon|5|4|Flying$Whenever another creature enters the battlefield under your control, target creature gets +2/+0 until end of turn.| -Crater Elemental|Prerelease Events|166|R|{2}{R}|Creature - Elemental|0|6|{R}, {T}, Sacrifice Crater Elemental: Crater Elemental deals 4 damage to target creature.$Formidable - {2}{R}: Crater Elemental has base power 8 until end of turn. Activate this ability only if creatures you control have total power 8 or greater.| +Crater Elemental|Prerelease Events|166|R|{2}{R}|Creature - Elemental|0|6|{R}, {T}, Sacrifice Crater Elemental: Crater Elemental deals 4 damage to target creature.$Formidable — {2}{R}: Crater Elemental has base power 8 until end of turn. Activate this ability only if creatures you control have total power 8 or greater.| Damnable Pact|Prerelease Events|167|R|{X}{B}{B}|Sorcery|||Target player draws X cards and loses X life.| Deathbringer Regent|Prerelease Events|168|R|{5}{B}{B}|Creature - Dragon|5|6|Flying$When Deathbringer Regent enters the battlefield, if you cast it from your hand and there are five or more other creatures on the battlefield, destroy all other creatures.| Den Protector|Prerelease Events|169|R|{1}{G}|Creature - Human Warrior|2|1|Creatures with power less than Den Protector's power can't block it.$Megamorph {1}{G} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.)| @@ -20086,7 +20086,7 @@ Silumgar Assassin|Prerelease Events|190|R|{1}{B}|Creature - Human Assassin|2|1|C Silumgar's Command|Prerelease Events|191|R|{3}{U}{B}|Instant|||Choose two - Counter target noncreature spell; or Return target permanent to its owner's hand; or Target creature gets -3/-3 until end of turn; or Destroy target planeswalker.| Stratus Dancer|Prerelease Events|192|R|{1}{U}|Creature - Djinn Monk|2|1|Flying$Megamorph {1}{U} You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time from its megamorph cost and put a +1/+1 counter on it.)| Sunscorch Regent|Prerelease Events|193|R|{3}{W}{W}|Creature - Dragon|4|3|Flying$Whenever an opponent casts a spell, put a +1/+1 counter on Sunscorch Regent and you gain 1 life.| -Surrak, the Hunt Caller|Prerelease Events|194|R|{2}{G}{G}|Legendary Creature - Human Warrior|5|4|Formidable - At the beginning of combat on your turn, if creatures you control have total power 8 or greater, target creature you control gains haste until end of turn.| +Surrak, the Hunt Caller|Prerelease Events|194|R|{2}{G}{G}|Legendary Creature - Human Warrior|5|4|Formidable — At the beginning of combat on your turn, if creatures you control have total power 8 or greater, target creature you control gains haste until end of turn.| Thunderbreak Regent|Prerelease Events|195|R|{2}{R}{R}|Creature - Dragon|4|4|Flying$Whenever a Dragon you control becomes the target of a spell or ability your opponent controls, Thunderbreak Regent deals 3 damage to that player.| Volcanic Vision|Prerelease Events|196|R|{5}{R}{R}|Sorcery|||Return target instant or sorcery card from your graveyard to your hand. Volcanic Visions deals damage equal to that card's converted mana cost to each creature your opponents control. Exile Volcanic Vision.| Zurgo Bellstriker|Prerelease Events|197|R|{R}|Legendary Creature - Orc Warrior|2|2|Zurgo Bellstriker can't block creatures with power 2 or greater.$Dash {1}{R} You may cast this creature for its dash cost. If you do, it gains haste, and it's returned to its owner's hand at the beginning of the next end step.)| @@ -20125,7 +20125,7 @@ Priest of the Blood Rite|Prerelease Events|229|R|{3}{B}{B}|Creature - Human Cler Relic Seeker|Prerelease Events|230|R|{1}{W}|Creature - Human Soldier|2|2|Renown 1 (When this creature deals combat damage to a player, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.)$When Relic Seeker becomes renowned, you may search your library for an Equipment card, reveal it, put it into your hand, then shuffle your library.| Scab-Clan Berserker|Prerelease Events|231|R|{1}{R}{R}|Creature - Human Berserker|2|2|Haste$Renown 1 (When this creature deals combat damage to a player, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.)$Whenever an opponent casts a noncreature spell, if Scab-Clan Berserker is renowned, Scab-Clan Berserker deals 2 damage to that player.| Soulblade Djinn|Prerelease Events|232|R|{3}{U}{U}|Creature - Djinn|4|3|Flying$Whenever you cast a noncreature spell, creatures you control get +1/+1 until end of turn.| -Talent of the Telepath|Prerelease Events|233|R|{2}{U}{U}|Sorcery|||Target opponent reveals the top seven cards of his or her library. You may cast an instant or sorcery card from among them without paying its mana cost. Then that player puts the rest into his or her graveyard. $Spell mastery --- If there are two or more instant and/or sorcery cards in your graveyard, you may cast up to two revealed instant and/or sorcery cards instead of one.| +Talent of the Telepath|Prerelease Events|233|R|{2}{U}{U}|Sorcery|||Target opponent reveals the top seven cards of his or her library. You may cast an instant or sorcery card from among them without paying its mana cost. Then that player puts the rest into his or her graveyard. $Spell mastery —-- If there are two or more instant and/or sorcery cards in your graveyard, you may cast up to two revealed instant and/or sorcery cards instead of one.| Thopter Spy Network|Prerelease Events|234|R|{2}{U}{U}|Enchantment|||At the beginning of your upkeep, if you control an artifact, put a 1/1 colorless Thopter artifact creature token with flying onto the battlefield.$Whenever one or more artifact creatures you control deals combat damage to a player, draw a card.| Tragic Arrogance|Prerelease Events|235|R|{3}{W}{W}|Sorcery|||For each player, you choose from among the permanents that player controls an artifact, a creature, an enchantment, and a planeswalker. Then each player sacrifices all other nonland permanents he or she controls.| Vryn Wingmare|Prerelease Events|236|R|{2}{W}|Creature - Pegasus|2|1|Flying$Noncreature spells cost {1} more to cast.| @@ -27496,12 +27496,12 @@ Demon's Grasp|Battle for Zendikar|108|C|{4}{B}|Sorcery|||Target creature gets -5 Dominator Drone|Battle for Zendikar|92|C|{2}{B}|Creature - Eldrazi Drone|3|2|Devoid (This creature has no color.)$Ingest (Whenever this creature deals combat damage to a player, that player exiles the top card of his or her library.)$When Dominator Drone enters the battlefield, if you control another colorless creature, each opponent loses 2 life.| Drana, Liberator of Malakir|Battle for Zendikar|109|M|{1}{B}{B}|Legendary Creature - Vampire Ally|2|3|Flying, first strike$Whenever Drana, Liberator of Malakir deals combat damage to a player, put a +1/+1 counter on each attacking creature you control.| Dutiful Return|Battle for Zendikar|110|C|{3}{B}|Sorcery|||Return up to two target creature cards from your graveyard to your hand.| -Geyserfield Stalker|Battle for Zendikar|111|C|{4}{B}|Creature - Elemental|3|2|Menace$Landfall - Whenever a land enters the battlefield under your control, Geyserfield Stalker gets +2/+2 until end of turn.| +Geyserfield Stalker|Battle for Zendikar|111|C|{4}{B}|Creature - Elemental|3|2|Menace$Landfall — Whenever a land enters the battlefield under your control, Geyserfield Stalker gets +2/+2 until end of turn.| Grave Birthing|Battle for Zendikar|93|C|{2}{B}|Instant|||Devoid (This card has no color.)$Target opponent exiles a card from his or her graveyard. You put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has "Sacrifice this creature: Add {C}."$Draw a card.| Grip of Desolation|Battle for Zendikar|94|U|{4}{B}{B}|Intant|||Devoid (This card has no color.)$Exile target creature and target land.| Guul Draz Overseer|Battle for Zendikar|112|R|{4}{B}{B}|Creature - Vampire|3|4|Flying$Landfall � Whenever a land enters the battlefield under your control, other creatures you control get +1/+0 until end of turn. If that land is a Swamp, those creatures get +2/+0 until end of turn instead.| Hagra Sharpshooter|Battle for Zendikar|113|U|{2}{B}|Creature - Human Assassin Ally|2|2|{4}{B}: Target creature gets -1/-1 until end of turn.| -Kalastria Healer|Battle for Zendikar|114|C|{1}{B}|Creature - Vampire Cleric Ally|1|2|Rally - Whenever Kalastria Healer or another Ally enters the battlefield under your control, each opponent loses 1 life and you gain 1 life.| +Kalastria Healer|Battle for Zendikar|114|C|{1}{B}|Creature - Vampire Cleric Ally|1|2|Rally — Whenever Kalastria Healer or another Ally enters the battlefield under your control, each opponent loses 1 life and you gain 1 life.| Kalastria Nightwatch|Battle for Zendikar|115|C|{4}{B}|Creature - Vampire Warrior Ally|4|5|Whenever you gain life, Kalastria Nightwatch gains flying until end of turn.| Malakir Familiar|Battle for Zendikar|116|U|{2}{B}|Creature - Bat|2|1|Flying, deahtouch$Whenever you gain life, Malakir Familiar gets +1/+1 until end of turn.| Mind Raker|Battle for Zendikar|95|C|{3}{B}|Creature - Eldrazi Processor|3|3|Devoid (This card has no color.)$When Mind Raker enters the battlefield, you may put a card an opponent owns from exile into that player's graveyard. If you do, each opponent discards a card.| @@ -27550,10 +27550,10 @@ Shatterskull Recruit|Battle for Zendikar|155|C|{3}{R}{R}|Creature - Giant Warrio Stonefury|Battle for Zendikar|156|C|{3}{R}{R}|Instant|||Stonefury deals damage to target creature equal to the number of lands you control.| Sure Strike|Battle for Zendikar|157|C|{1}{R}|Instant|||Target creature gets +3/+0 and gains first strike until end of turn.| Touch of the Void|Battle for Zendikar|134|C|{2}{R}|Sorcery|||Devoid (This card has no color.)$Touch of the Void deals 3 damage to any target. If a creature dealt damage this way would die this turn, exile it instead.| -Tunneling Geopede|Battle for Zendikar|158|U|{2}{R}|Creature - Insect|3|2|Landfall - Whenever a land enters the battlefield under your control, Tunneling Geopede deals 1 damage to each opponent.| +Tunneling Geopede|Battle for Zendikar|158|U|{2}{R}|Creature - Insect|3|2|Landfall — Whenever a land enters the battlefield under your control, Tunneling Geopede deals 1 damage to each opponent.| Turn Against|Battle for Zendikar|135|U|{4}{R}|Instant|||Devoid (This card has no color.)$Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn.| Valakut Invoker|Battle for Zendikar|159|C|{2}{R}|Creature - Human Shaman|2|3|{8}: Valakut Invoker deals 3 damage to any target.| -Valakut Predator|Battle for Zendikar|160|C|{2}{R}|Creature - Elemental|2|2|Landfall - Whenever a land enters the battlefield under your control, Valakut Predator gets +2/+2 until end of turn.| +Valakut Predator|Battle for Zendikar|160|C|{2}{R}|Creature - Elemental|2|2|Landfall — Whenever a land enters the battlefield under your control, Valakut Predator gets +2/+2 until end of turn.| Vestige of Emrakul|Battle for Zendikar|136|C|{3}{R}|Creature - Eldrazi Drone|3|4|Devoid (This card has no color.)$Trample| Vile Aggregate|Battle for Zendikar|137|U|{2}{R}|Creature - Eldrazi Drone|0|5|Devoid (This card has no color.)$Vile Aggregate's power is equal to the number of colorless creatures you control.$Trample$Ingest (Whenever this creature deals combat damage to a player, that player exiles the top card of his or her library.)| Volcanic Upheaval|Battle for Zendikar|161|C|{3}{R}|Instant|||Destroy target land.| @@ -27568,10 +27568,10 @@ Eyeless Watcher|Battle for Zendikar|166|C|{3}{G}|Creature - Eldrazi Drone|1|1|De From Beyond|Battle for Zendikar|167|R|{3}{G}|Enchantment|||Devoid (This card has no color.)$At the beginning of your upkeep, put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has "Sacrifice this creature: Add {C}."${1}{G}, Sacrifice From Beyond: Search your library for an Eldrazi card, reveal it, put it into your hand, then shuffle your library.| Giant Mantis|Battle for Zendikar|173|C|{3}{G}|Creature - Insect|2|4|Reach (This creature can block creatures with flying.)| Greenwarden of Murasa|Battle for Zendikar|174|M|{4}{G}{G}|Creature - Elemental|5|4|When Greenwarden of Murasa enters the battlefield, you may return target card from your graveyard to your hand.$When Greenwarden of Murasa dies, you may exile it. If you do, you may return target card from your graveyard to your hand.| -Infuse with the Elements|Battle for Zendikar|175|U|{3}{G}|Instant|||Converge - Put X +1/+1 counters on target creature, where X is the number of colors of mana spent to cast Infuse with the Elements. That creature gains trample until end of turn.| -Jaddi Offshoot|Battle for Zendikar|176|U|{G}|Creature - Plant|0|3|Defender$Landfall - Whenever a land enters the battlefield under your control, you gain 1 life.| +Infuse with the Elements|Battle for Zendikar|175|U|{3}{G}|Instant|||Converge — Put X +1/+1 counters on target creature, where X is the number of colors of mana spent to cast Infuse with the Elements. That creature gains trample until end of turn.| +Jaddi Offshoot|Battle for Zendikar|176|U|{G}|Creature - Plant|0|3|Defender$Landfall — Whenever a land enters the battlefield under your control, you gain 1 life.| Lifespring Druid|Battle for Zendikar|177|C|{2}{G}|Creature - Elf Druid|2|1|{T}: Add one mana of any color.| -Murasa Ranger|Battle for Zendikar|178|U|{3}{G}|Creature - Human Warrior|3|3|Landfall - Whenever a land enters the battlefield under your control, you may pay {3}{G}. IF you do, put two +1/+1 counters on Murasa Ranger.| +Murasa Ranger|Battle for Zendikar|178|U|{3}{G}|Creature - Human Warrior|3|3|Landfall — Whenever a land enters the battlefield under your control, you may pay {3}{G}. IF you do, put two +1/+1 counters on Murasa Ranger.| Natural Connection|Battle for Zendikar|179|C|{2}{G}|Instant|||Search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library.| Nissa's Renewal|Battle for Zendikar|180|R|{5}{G}|Sorcery|||Search your library for up to three basic land cards, put them onto the battlefield tapped, then shuffle your library. You gain 7 life.| Oran-Rief Hydra|Battle for Zendikar|181|R|{4}{G}{G}|Creature - Hydra|5|5|Trample$Landfall � Whenever a land enters the battlefield under your control, put a +1/+1 counter on Oran-Rief Hydra. If that land is a Forest, put two +1/+1 counters on Oran-Rief Hydra instead.| @@ -27586,10 +27586,10 @@ Seek the Wilds|Battle for Zendikar|189|C|{1}{G}|Sorcery|||Look at the top four c Snapping Gnarlid|Battle for Zendikar|190|C|{1}{G}|Creature - Beast|2|2|Landfall � Whenever a land enters the battlefield under your control, Snapping Gnarlid gets +1/+1 until end of turn.| Swell of Growth|Battle for Zendikar|191|C|{1}{G}|Instant|||Target creature gets +2/+2 until end of turn. You may put a land card from your hand onto the battlefield.| Sylvan Scrying|Battle for Zendikar|192|U|{1}{G}|Sorcery|||Search your library for a land card, reveal it, and put it into your hand. Then shuffle your library.| -Tajuru Beastmaster|Battle for Zendikar|193|C|{5}{G}|Creature - Elf Warrior Ally|5|5|Rally - Whenever Tajuru Beastmaster or another Ally creature enters the battlefield under your control, creatures you control get +1/+1 until end of turn.| -Tajuru Stalwart|Battle for Zendikar|194|C|{2}{G}|Creature - Elf Scout Ally|0|1|Converge - Tajuru Stalwart enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it.| +Tajuru Beastmaster|Battle for Zendikar|193|C|{5}{G}|Creature - Elf Warrior Ally|5|5|Rally — Whenever Tajuru Beastmaster or another Ally creature enters the battlefield under your control, creatures you control get +1/+1 until end of turn.| +Tajuru Stalwart|Battle for Zendikar|194|C|{2}{G}|Creature - Elf Scout Ally|0|1|Converge — Tajuru Stalwart enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it.| Tajuru Warcaller|Battle for Zendikar|195|U|{3}{G}{G}|Creature - Elf Warrior Ally|2|1|Rally � Whenever Tajuru Warcaller or another Ally enters the battlefield under your control, creatures you control get +2/+2 until end of turn.| -Territorial Baloth|Battle for Zendikar|196|C|{4}{G}|Creature - Beast|4|4|Landfall - Whenever a land enters the battlefield under your control, Territorial Baloth gets +2/+2 until end of turn.| +Territorial Baloth|Battle for Zendikar|196|C|{4}{G}|Creature - Beast|4|4|Landfall — Whenever a land enters the battlefield under your control, Territorial Baloth gets +2/+2 until end of turn.| Undergrowth Champion|Battle for Zendikar|197|M|{1}{G}{G}|Creature - Elemental|2|2|If damage would be dealt to Undergrowth Champion while it has a +1/+1 counter on it, prevent that damage and remove a +1/+1 counter from Undergrowth Champion.$Landfall � Whenever a land enters the battlefield under your control, put a +1/+1 counter on Undergrowth Champion.| Unnatural Aggression|Battle for Zendikar|168|C|{2}{G}|Instant|||Devoid (This card has no color.)$Target creature you control fights target creature an opponent controls. If the creature an opponent controls would die this turn, exile it instead.| Void Attendant|Battle for Zendikar|169|U|{2}{G}|Creature - Eldrazi Processor|2|3|Devoid (This card has no color.)${1}{G}, Put a card an opponent owns from exile into that player's graveyard: Put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has "Sacrifice this creature: Add {C}."| @@ -28355,7 +28355,7 @@ Brute Strength|Oath of the Gatewatch|103|C|{1}{R}|Instant|||Target creature gets Chandra, Flamecaller|Oath of the Gatewatch|104|M|{4}{R}{R}|Legendary Planeswalker - Chandra|||+1: Put two 3/1 red Elemental creature tokens with haste onto the battlefield. Exile them at the beginning of the next end step.$0: Discard all the cards in your hand, then draw that many cards plus one.$-X: Chandra, Flamecaller deals X damage to each creature.| Cinder Hellion|Oath of the Gatewatch|105|C|{4}{R}|Creature - Hellion|4|4|Trample$When Cinder Hellion enters the battlefield, it deals 2 damage to target opponent.| Devour in Flames|Oath of the Gatewatch|106|U|{2}{R}|Sorcery|||As an additional cost to cast Devour in Flames, return a land you control to its owner's hand.$Devour in Flames deals 5 damage to target creature or planeswalker.| -Embodiment of Fury|Oath of the Gatewatch|107|U|{3}{R}|Creature - Elemental|4|3|Trample$Land creatures you control have trample.$Landfall - Whenever a land enters the battlefield under your control, you may have target land you control become a 3/3 Elemental creature with haste until end of turn. It's still a land.| +Embodiment of Fury|Oath of the Gatewatch|107|U|{3}{R}|Creature - Elemental|4|3|Trample$Land creatures you control have trample.$Landfall — Whenever a land enters the battlefield under your control, you may have target land you control become a 3/3 Elemental creature with haste until end of turn. It's still a land.| Expedite|Oath of the Gatewatch|108|C|{R}|Instant|||Target creature gains haste until end of turn.$Draw a card.| Fall of the Titans|Oath of the Gatewatch|109|R|{X}{X}{R}|Instant|||Surge {X}{R} (You may cast this spell for its surge cost if you or a teammate has cast another spell this turn.)$Fall of the Titans deals X damage to each of up to two target creatures and/or players.| Goblin Dark-Dwellers|Oath of the Gatewatch|110|R|{3}{R}{R}|Creature - Goblin|4|4|Menace$When Goblin Dark-Dwellers enters the battlefield, you may cast target instant or sorcery card with converted mana cost 3 or less from your graveyard without paying its mana cost. If that card would be put into your graveyard this turn, exile it instead.| @@ -28379,7 +28379,7 @@ Baloth Pup|Oath of the Gatewatch|127|U|{1}{G}|Creature - Beast|3|1|Baloth Pup ha Bonds of Mortality|Oath of the Gatewatch|128|U|{1}{G}|Enchantment|||When Bonds of Mortality enters the battlefield, draw a card.${G}: Creatures your opponents control lose hexproof and indestructible until end of turn.| Canopy Gorger|Oath of the Gatewatch|129|C|{4}{G}{G}|Creature - Wurm|6|5|| Elemental Uprising|Oath of the Gatewatch|130|C|{1}{G}|Instant|||Target land you control becomes a 4/4 Elemental creature with haste until end of turn. It's still a land. It must be blocked this turn if able.| -Embodiment of Insight|Oath of the Gatewatch|131|U|{4}{G}|Creature - Elemental|4|4|Vigilance$Land creatures you control have vigilance.$Landfall - Whenever a land enters the battlefield under you control, you may have target land you control become a 3/3 Elemental creature with haste until end of turn. It's still a land.| +Embodiment of Insight|Oath of the Gatewatch|131|U|{4}{G}|Creature - Elemental|4|4|Vigilance$Land creatures you control have vigilance.$Landfall — Whenever a land enters the battlefield under you control, you may have target land you control become a 3/3 Elemental creature with haste until end of turn. It's still a land.| Gladehart Cavalry|Oath of the Gatewatch|132|R|{5}{G}{G}|Creature - Elf Knight|6|6|When Gladehart Cavalry enters the battlefield, support 6. (Put a +1/+1 counter on each of up to six other target creatures.)$Whenever a creature you control with a +1/+1 counter on it dies, you gain 2 life.| Harvester Troll|Oath of the Gatewatch|133|U|{3}{G}|Creature - Troll|2|3|When Harvester Troll enters the battlefield, you may sacrifice a creature or land. If you do, put two +1/+1 counters on Harvester Troll.| Lead by Example|Oath of the Gatewatch|134|C|{1}{G}|Instant|||Support 2. (Put a +1/+1 counter on each of up to two target creatures.)| @@ -28614,7 +28614,7 @@ Thunderbreak Regent|Game Day|44|R|{2}{R}{R}|Creature - Dragon|4|4|Flying$Wheneve Conclave Naturalists|Game Day|45|U|{4}{G}|Creature - Dryad|4|4|When Conclave Naturalists enters the battlefield, you may destroy target artifact or enchantment.| Languish|Game Day|46|R|{2}{B}{B}|Sorcery|||All creatures get -4/-4 until end of turn.| Stasis Snare|Game Day|47|U|{1}{W}{W}|Enchantment|||Flash$When Stasis Snare enters the battlefield, exile target creature an opponent controls until Stasis Snare leaves the battlefield.| -Radiant Flames|Game Day|48|R|{2}{R}|Sorcery||Converge - Radiant Flames deals X damage to each creature, where X is the number of colors of mana spent to cast Radiant Flames.| +Radiant Flames|Game Day|48|R|{2}{R}|Sorcery||Converge — Radiant Flames deals X damage to each creature, where X is the number of colors of mana spent to cast Radiant Flames.| Immolating Glare|Game Day|49|U|{1}{W}|Instant|||Destroy target attacking creature.| Jori En, Ruin Diver|Game Day|50|R|{1}{U}{R}|Legendary Creature - Merfolk Wizard|2|3|Whenever you cast your second spell each turn, draw a card.| Incorrigible Youths|Game Day|51|U|{3}{R}{R}|Creature - Vampire|4|3|Haste$Madness {2}{R} (If you discard this card, discard it into exile. When you do, cast it for its madness cost or put it into your graveyard.)| @@ -28800,7 +28800,7 @@ Liliana Vess|Media Inserts|101|Special|{3}{B}{B}|Legendary Planeswalker - Lilian Chandra, Pyromaster|Media Inserts|102|Special|{2}{R}{R}|Legendary Planeswalker - Chandra||4|+1: Chandra, Pyromaster deals 1 damage to target player and 1 damage to up to one target creature that player controls. That creature can't block this turn.$0: Exile the top card of your library. You may play it this turn.$-7: Exile the top ten cards of your library. Choose an instant or sorcery card exiled this way and copy it three times. You may cast the copies without paying their mana costs.| Nissa, Worldwaker|Media Inserts|103|Special|{3}{G}{G}|Legendary Planeswalker - Nissa||3|+1: Target land you control becomes a 4/4 Elemental creature with trample. It's still a land.$+1: Untap up to four target Forests.$-7: Search your library for any number of basic land cards, put them onto the battlefield, then shuffle your library. Those lands become 4/4 Elemental creatures with trample. They're still lands.| Garruk, Apex Predator|Media Inserts|104|Special|{5}{B}{G}|Legendary Planeswalker - Garruk||5|+1: Destroy another target planeswalker.$+1: Put a 3/3 black Beast creature token with deathtouch onto the battlefield.$-3: Destroy target creature. You gain life equal to its toughness.$-8: Target opponent gets an emblem with "Whenever a creature attacks you, it gets +5/+5 and gains trample until end of turn."| -Shamanic Revelation|Media Inserts|105|Special|{2}{G}{G}|Sorcery|||Draw a card for each creature you control.$Ferocious - You gain 4 life for each creature you control with power 4 or greater.| +Shamanic Revelation|Media Inserts|105|Special|{2}{G}{G}|Sorcery|||Draw a card for each creature you control.$Ferocious — You gain 4 life for each creature you control with power 4 or greater.| Ojutai's Command|Media Inserts|106|Special|{2}{W}{U}|Instant|||Choose two - Return target creature card with converted mana cost 2 or less from your graveyard to the battlefield; or You gain 4 life; or Counter target creature spell; or Draw a card.| Dragonscale General|Media Inserts|107|Special|{3}{W}|Creature - Human Warrior|2|3|At the beginning of your end step, bolster X, where X is the number of tapped creatures you control. (Choose a creature with the least toughness among creatures you control and put X +1/+1 counters on it.)| Sage-Eye Avengers|Media Inserts|108|Special|{4}{U}{U}|Creature - Djinn Monk|4|5|Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.)$Whenever Sage-Eye Avengers attacks, you may return target creature to its owner's hand if its power is less than Sage-Eye Avengers's power.| @@ -31735,7 +31735,7 @@ Nazahn, Revered Bladesmith|Commander 2017|44|M|{4}{G}{W}|Legendary Creature - Ca O-Kagachi, Vengeful Kami|Commander 2017|45|M|{1}{W}{U}{B}{R}{G}|Legendary Creature - Dragon Spirit|6|6|Flying, Trample$Whenever O-Kagachi, Vengeful Kami deals combat damage to a player, if that player attacked you during his or her last turn, exile target nonland permanent that player controls| Taigam, Ojutai Master|Commander 2017|46|R|{2}{W}{U}|Legendary Creature - Human Monk|3|4|Instant, sorcery, and Dragon spells you control can't be countered by spells or abilities.$Whenever you cast an instant or sorcery spell from your hand, if Taigam, Ojutai Master attacked this turn, that spell gains rebound. (Exile the spell as it resolves. At the beginning of your next upkeep, you may cast that card from exile without paying its mana cost.)| Taigam, Sidisi's Hand|Commander 2017|47|R|{3}{U}{B}|Legendary Creature - Human Wizard|3|4|Skip your draw step.$At the beginning of your upkeep, look at the top three cards of your library. Put one of them into your hand and the rest into your graveyard.$B, T, Exile X cards from your graveyard: Target creature gets -X/-X until end of turn.| -The Ur-Dragon|Commander 2017|48|M|{4}{W}{U}{B}{R}{G}|Legendary Creature - Dragon Avatar|10|10|Eminence - As long as The Ur-Dragon is in the command zone or on the battlefield, other Dragon spells you cast cost {1} less to cast.$Flying$Whenever one or more Dragons you control attack, draw that many cards, then you may put a permanent card from your hand onto the battlefield| +The Ur-Dragon|Commander 2017|48|M|{4}{W}{U}{B}{R}{G}|Legendary Creature - Dragon Avatar|10|10|Eminence — As long as The Ur-Dragon is in the command zone or on the battlefield, other Dragon spells you cast cost {1} less to cast.$Flying$Whenever one or more Dragons you control attack, draw that many cards, then you may put a permanent card from your hand onto the battlefield| Wasitora, Nekoru Queen|Commander 2017|49|M|{2}{B}{R}{G}|Legendary Creature - Cat Dragon|5|4|Flying, trample$Whenever Wasitora, Nekoru Queen deals combat damage to a player, that player sacrifices a creature. If the player can't, you create a 3/3 black, red, and green Cat Dragon creature token with flying| Bloodforged War Axe|Commander 2017|50|R|{1}|Artifact - Equipment|||Equipped creature gets +2/+0.$Whenever equipped creature deals combat damage to a player, create a token that's a copy of Bloodforged War Axe.$Equip 2| Hammer of Nazahn|Commander 2017|51|R|{4}|Legendary Artifact - Equipment|||Whenever Hammer of Nazahn or another Equipment enters the battlefield under your control, you may attach that Equipment to target creature you control.$Equipped creature gets +2/+0 and has indestructible.$Equip 4| From 459ef9af94c75a18dd0c26017ea7b94e64998f7a Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sun, 6 May 2018 00:48:16 +0400 Subject: [PATCH 076/158] Refactoring: added mana color check and fix --- .../src/mage/cards/h/HallOfGemstone.java | 2 +- .../src/mage/cards/p/ProtectiveSphere.java | 2 +- Mage/src/main/java/mage/ObjectColor.java | 22 +++++++++++++++---- .../AnyColorPermanentTypesManaAbility.java | 2 +- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/Mage.Sets/src/mage/cards/h/HallOfGemstone.java b/Mage.Sets/src/mage/cards/h/HallOfGemstone.java index 15a65e890b8..9cd0715735c 100644 --- a/Mage.Sets/src/mage/cards/h/HallOfGemstone.java +++ b/Mage.Sets/src/mage/cards/h/HallOfGemstone.java @@ -123,7 +123,7 @@ class HallOfGemstoneEffect extends ReplacementEffectImpl { int genericAmount = mana.getGeneric(); int colorlessAmount = mana.getColorless(); int coloredAmount = mana.countColored(); - switch (colorChosen.getColoredManaSymbol()) { + switch (colorChosen.getOneColoredManaSymbol()) { case W: mana.setToMana(Mana.WhiteMana(coloredAmount)); break; diff --git a/Mage.Sets/src/mage/cards/p/ProtectiveSphere.java b/Mage.Sets/src/mage/cards/p/ProtectiveSphere.java index 61b81042325..17264baa7b5 100644 --- a/Mage.Sets/src/mage/cards/p/ProtectiveSphere.java +++ b/Mage.Sets/src/mage/cards/p/ProtectiveSphere.java @@ -124,7 +124,7 @@ class ProtectiveSphereEffect extends PreventionEffectImpl { if (event.getTargetId().equals(source.getControllerId()) && event.getSourceId().equals(target.getFirstTarget())) { colorsOfChosenSource = game.getObject(target.getFirstTarget()).getColor(game).getColors(); - if (colorsOfChosenSource.stream().anyMatch((c) -> (manaUsed.getColor(c.getColoredManaSymbol()) > 0))) { + if (colorsOfChosenSource.stream().anyMatch((c) -> (manaUsed.getColor(c.getOneColoredManaSymbol()) > 0))) { return true; } } diff --git a/Mage/src/main/java/mage/ObjectColor.java b/Mage/src/main/java/mage/ObjectColor.java index 0c055fa9d65..4d55762e60f 100644 --- a/Mage/src/main/java/mage/ObjectColor.java +++ b/Mage/src/main/java/mage/ObjectColor.java @@ -126,6 +126,8 @@ public class ObjectColor implements Serializable, Copyable, Compara newColor.black = black && other.black; newColor.red = red && other.red; newColor.green = green && other.green; + + newColor.gold = gold && other.gold; return newColor; } @@ -157,6 +159,7 @@ public class ObjectColor implements Serializable, Copyable, Compara List colors = new ArrayList<>(); int firstColor = 5000; int secondColor = -1; + if (this.isWhite()) { firstColor = 1; secondColor = 1; @@ -177,6 +180,7 @@ public class ObjectColor implements Serializable, Copyable, Compara firstColor = Math.min(firstColor, 5); secondColor = Math.max(secondColor, 5); } + if (this.isWhite()) { colors.add(ObjectColor.WHITE); } @@ -192,6 +196,7 @@ public class ObjectColor implements Serializable, Copyable, Compara if (this.isGreen()) { colors.add(ObjectColor.GREEN); } + if (colors.size() >= 2 && secondColor - firstColor >= 3) { Collections.swap(colors, 0, 1); } @@ -391,7 +396,11 @@ public class ObjectColor implements Serializable, Copyable, Compara if (test.green != this.green) { return false; } - return test.gold == this.gold; + if (test.gold != this.gold) { + return false; + } + + return true; } @Override @@ -465,10 +474,10 @@ public class ObjectColor implements Serializable, Copyable, Compara o1 = 4; } else if (this.isWhite()) { o1 = 5; - } else if (this.isGold()) { o1 = 6; } + if (o.isMulticolored()) { o2 = 7; } else if (o.isColorless()) { @@ -483,10 +492,10 @@ public class ObjectColor implements Serializable, Copyable, Compara o2 = 4; } else if (o.isWhite()) { o2 = 5; - } else if (o.isGold()) { o2 = 6; } + return o1 - o2; } @@ -496,7 +505,12 @@ public class ObjectColor implements Serializable, Copyable, Compara * * @return null or */ - public ColoredManaSymbol getColoredManaSymbol() { + public ColoredManaSymbol getOneColoredManaSymbol() { + + if (isMulticolored()) { + throw new IllegalStateException("Founded multicolored object, but it's must call with single mana color."); + } + if (isBlack()) { return ColoredManaSymbol.B; } diff --git a/Mage/src/main/java/mage/abilities/mana/AnyColorPermanentTypesManaAbility.java b/Mage/src/main/java/mage/abilities/mana/AnyColorPermanentTypesManaAbility.java index b94f573055c..e9c34732907 100644 --- a/Mage/src/main/java/mage/abilities/mana/AnyColorPermanentTypesManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/AnyColorPermanentTypesManaAbility.java @@ -179,7 +179,7 @@ class AnyColorPermanentTypesManaEffect extends ManaEffect { else{ List permanentColors = permanent.getColor(game).getColors(); for (ObjectColor color : permanentColors){ - types.add(new Mana(color.getColoredManaSymbol())); + types.add(new Mana(color.getOneColoredManaSymbol())); } } } From e9d5afd530082b3ef5833272af71e67c7c231995 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sun, 6 May 2018 00:50:02 +0400 Subject: [PATCH 077/158] Refactoring: replace custom creature tokens with basic class --- .../mage/plugins/card/images/ImageCache.java | 8 ------- .../src/mage/cards/l/LiegeOfTheTangle.java | 23 +++---------------- 2 files changed, 3 insertions(+), 28 deletions(-) diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/images/ImageCache.java b/Mage.Client/src/main/java/org/mage/plugins/card/images/ImageCache.java index 354c197ecd1..2edbe802025 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/images/ImageCache.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/images/ImageCache.java @@ -447,14 +447,6 @@ public final class ImageCache { return IMAGE_CACHE.containsKey(key) ? IMAGE_CACHE.get(key) : null; } - /** - * Returns the Image corresponding to the key only if it already exists in - * the cache. - */ - private static BufferedImage tryGetFaceImage(String key) { - return FACE_IMAGE_CACHE.containsKey(key) ? FACE_IMAGE_CACHE.get(key) : null; - } - /** * Returns the map key for a card, without any suffixes for the image size. */ diff --git a/Mage.Sets/src/mage/cards/l/LiegeOfTheTangle.java b/Mage.Sets/src/mage/cards/l/LiegeOfTheTangle.java index 1f5be18f12e..28278fe0f98 100644 --- a/Mage.Sets/src/mage/cards/l/LiegeOfTheTangle.java +++ b/Mage.Sets/src/mage/cards/l/LiegeOfTheTangle.java @@ -32,6 +32,7 @@ import java.util.Iterator; import java.util.UUID; import mage.MageInt; import mage.MageObjectReference; +import mage.ObjectColor; import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.ContinuousEffectImpl; @@ -49,6 +50,7 @@ import mage.game.events.GameEvent.EventType; import mage.game.permanent.Permanent; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.ElementalCreatureToken; import mage.target.Target; import mage.target.common.TargetLandPermanent; @@ -115,7 +117,7 @@ class LiegeOfTheTangleTriggeredAbility extends TriggeredAbilityImpl { class LiegeOfTheTangleEffect extends ContinuousEffectImpl { - private static AwakeningLandToken token = new AwakeningLandToken(); + private static ElementalCreatureToken token = new ElementalCreatureToken(8, 8, "8/8 green Elemental creature", new ObjectColor("G")); public LiegeOfTheTangleEffect() { super(Duration.EndOfGame, Outcome.BecomeCreature); @@ -185,23 +187,4 @@ class LiegeOfTheTangleEffect extends ContinuousEffectImpl { } -class AwakeningLandToken extends TokenImpl { - - public AwakeningLandToken() { - super("", "8/8 green Elemental creature"); - cardType.add(CardType.CREATURE); - color.setGreen(true); - subtype.add(SubType.ELEMENTAL); - power = new MageInt(8); - toughness = new MageInt(8); - } - public AwakeningLandToken(final AwakeningLandToken token) { - super(token); - } - - public AwakeningLandToken copy() { - return new AwakeningLandToken(this); - } -} - From 1a4e892f0435123d2385f0118ba5eed61645ae90 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sun, 6 May 2018 01:05:04 +0400 Subject: [PATCH 078/158] Cheat engine: + added commands to show my hand and library (@show my hand, @show my library); + added params to show color identity ("color commander") and card's color ("color cost"); --- .../java/mage/server/util/SystemUtil.java | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/Mage.Server/src/main/java/mage/server/util/SystemUtil.java b/Mage.Server/src/main/java/mage/server/util/SystemUtil.java index 1f2adf2d198..0d0941623e1 100644 --- a/Mage.Server/src/main/java/mage/server/util/SystemUtil.java +++ b/Mage.Server/src/main/java/mage/server/util/SystemUtil.java @@ -41,6 +41,8 @@ public final class SystemUtil { private static final String COMMAND_CLEAR_BATTLEFIELD = "@clear battlefield"; private static final String COMMAND_SHOW_OPPONENT_HAND = "@show opponent hand"; private static final String COMMAND_SHOW_OPPONENT_LIBRARY = "@show opponent library"; + private static final String COMMAND_SHOW_MY_HAND = "@show my hand"; + private static final String COMMAND_SHOW_MY_LIBRARY = "@show my library"; private static final Map supportedCommands = new HashMap<>(); static { @@ -50,6 +52,8 @@ public final class SystemUtil { supportedCommands.put(COMMAND_CLEAR_BATTLEFIELD, "CLAR BATTLEFIELD"); supportedCommands.put(COMMAND_SHOW_OPPONENT_HAND, "SHOW OPPONENT HAND"); supportedCommands.put(COMMAND_SHOW_OPPONENT_LIBRARY, "SHOW OPPONENT LIBRARY"); + supportedCommands.put(COMMAND_SHOW_MY_HAND, "SHOW MY HAND"); + supportedCommands.put(COMMAND_SHOW_MY_LIBRARY, "SHOW MY LIBRARY"); } private static final Pattern patternGroup = Pattern.compile("\\[(.+)\\]"); // [test new card] @@ -57,7 +61,8 @@ public final class SystemUtil { private static final Pattern patternCardInfo = Pattern.compile("([\\S ]+):([\\S ]+)"); // Island:XLN // show ext info for special commands - private static final String PARAM_COLOR = "color"; + private static final String PARAM_COLOR_COST = "color cost"; + private static final String PARAM_COLOR_COMMANDER = "color commander"; private static final String PARAM_PT = "pt"; // power toughness private static final String PARAM_ABILITIES_COUNT = "abilities count"; private static final String PARAM_ABILITIES_LIST = "abilities list"; @@ -114,7 +119,10 @@ public final class SystemUtil { ArrayList resInfo = new ArrayList<>(); for (String param : commandParams) { switch (param) { - case PARAM_COLOR: + case PARAM_COLOR_COST: + resInfo.add(card.getColor(game).toString()); + break; + case PARAM_COLOR_COMMANDER: resInfo.add(card.getColorIdentity().toString()); break; case PARAM_PT: @@ -359,6 +367,20 @@ public final class SystemUtil { game.informPlayer(feedbackPlayer, info); } break; + + case COMMAND_SHOW_MY_HAND: + if (feedbackPlayer != null) { + String info = getCardsListForSpecialInform(game, feedbackPlayer.getHand(), runGroup.commands); + game.informPlayer(feedbackPlayer, info); + } + break; + + case COMMAND_SHOW_MY_LIBRARY: + if (feedbackPlayer != null) { + String info = getCardsListForSpecialInform(game, feedbackPlayer.getLibrary().getCardList(), runGroup.commands); + game.informPlayer(feedbackPlayer, info); + } + break; } return; From 765c42b2c68593b66abdd7fc72257c1becb4b9df Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Sun, 6 May 2018 00:38:50 -0400 Subject: [PATCH 079/158] fixed Soul Ransom not working correctly --- Mage.Sets/src/mage/cards/s/SoulRansom.java | 57 +++++++++++++++++----- 1 file changed, 45 insertions(+), 12 deletions(-) diff --git a/Mage.Sets/src/mage/cards/s/SoulRansom.java b/Mage.Sets/src/mage/cards/s/SoulRansom.java index fd0a77a8e13..6b060fdf5b8 100644 --- a/Mage.Sets/src/mage/cards/s/SoulRansom.java +++ b/Mage.Sets/src/mage/cards/s/SoulRansom.java @@ -32,16 +32,17 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.common.DiscardTargetCost; -import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.AttachEffect; -import mage.abilities.effects.common.DrawCardSourceControllerEffect; -import mage.abilities.effects.common.SacrificeSourceEffect; import mage.abilities.effects.common.continuous.ControlEnchantedEffect; import mage.abilities.keyword.EnchantAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; import mage.filter.FilterCard; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; import mage.target.TargetPermanent; import mage.target.common.TargetCardInHand; import mage.target.common.TargetCreaturePermanent; @@ -53,10 +54,9 @@ import mage.target.common.TargetCreaturePermanent; public class SoulRansom extends CardImpl { public SoulRansom(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{U}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}{B}"); this.subtype.add(SubType.AURA); - // Enchant creature TargetPermanent auraTarget = new TargetCreaturePermanent(); this.getSpellAbility().addTarget(auraTarget); @@ -65,14 +65,15 @@ public class SoulRansom extends CardImpl { this.addAbility(ability); // You control enchanted creature. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ControlEnchantedEffect())); - + // Discard two cards: Soul Ransom's controller sacrifices it, then draws two cards. Only any opponent may activate this ability. - Effect effect = new SacrificeSourceEffect(); - effect.setText("{this}'s controller sacrifices it"); - SimpleActivatedAbility ability2 = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect , new DiscardTargetCost(new TargetCardInHand(2,2, new FilterCard("two cards")))); - effect = new DrawCardSourceControllerEffect(2); - effect.setText("Then draws two cards. Only any opponent may activate this ability"); - ability2.addEffect(effect); + SimpleActivatedAbility ability2 = new SimpleActivatedAbility( + Zone.BATTLEFIELD, + new SoulRansomEffect(), + new DiscardTargetCost( + new TargetCardInHand(2, 2, new FilterCard("two cards")) + ) + ); ability2.setMayActivate(TargetController.OPPONENT); this.addAbility(ability2); @@ -87,3 +88,35 @@ public class SoulRansom extends CardImpl { return new SoulRansom(this); } } + +class SoulRansomEffect extends OneShotEffect { + + SoulRansomEffect() { + super(Outcome.Benefit); + this.staticText = "{this} controller sacrifices it, then draws two cards. Only any opponent may activate this ability"; + } + + SoulRansomEffect(final SoulRansomEffect effect) { + super(effect); + } + + @Override + public SoulRansomEffect copy() { + return new SoulRansomEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); + if (permanent == null) { + return false; + } + Player controller = game.getPlayer(permanent.getControllerId()); + if (controller == null) { + return false; + } + controller.drawCards(2, game); + permanent.sacrifice(source.getSourceId(), game); + return true; + } +} From 2b69f1a311cac9bb3fd0cb40b6835fe0a8fdcf96 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 6 May 2018 09:43:47 +0200 Subject: [PATCH 080/158] * Soul Ransom - Fixed handling of some rare cases (e.g. Vedalken Orrery in play using Boomerang and playing Soul Ransom again). --- Mage.Sets/src/mage/cards/s/SoulRansom.java | 10 +++++++--- .../main/java/mage/abilities/ActivatedAbilityImpl.java | 1 + 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Mage.Sets/src/mage/cards/s/SoulRansom.java b/Mage.Sets/src/mage/cards/s/SoulRansom.java index 6b060fdf5b8..73fa2162245 100644 --- a/Mage.Sets/src/mage/cards/s/SoulRansom.java +++ b/Mage.Sets/src/mage/cards/s/SoulRansom.java @@ -93,7 +93,7 @@ class SoulRansomEffect extends OneShotEffect { SoulRansomEffect() { super(Outcome.Benefit); - this.staticText = "{this} controller sacrifices it, then draws two cards. Only any opponent may activate this ability"; + this.staticText = "{this}'s controller sacrifices it, then draws two cards. Only any opponent may activate this ability"; } SoulRansomEffect(final SoulRansomEffect effect) { @@ -107,7 +107,12 @@ class SoulRansomEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); + Permanent permanent = source.getSourcePermanentIfItStillExists(game); + if (permanent != null) { + permanent.sacrifice(source.getSourceId(), game); + } else { + permanent = (Permanent) game.getLastKnownInformation(source.getSourceId(), Zone.BATTLEFIELD); + } if (permanent == null) { return false; } @@ -116,7 +121,6 @@ class SoulRansomEffect extends OneShotEffect { return false; } controller.drawCards(2, game); - permanent.sacrifice(source.getSourceId(), game); return true; } } diff --git a/Mage/src/main/java/mage/abilities/ActivatedAbilityImpl.java b/Mage/src/main/java/mage/abilities/ActivatedAbilityImpl.java index 5ef80ab0f1e..073a4596885 100644 --- a/Mage/src/main/java/mage/abilities/ActivatedAbilityImpl.java +++ b/Mage/src/main/java/mage/abilities/ActivatedAbilityImpl.java @@ -250,6 +250,7 @@ public abstract class ActivatedAbilityImpl extends AbilityImpl implements Activa return false; } + @Override public void setMayActivate(TargetController mayActivate) { this.mayActivate = mayActivate; } From feb17320c54363bc931fcff43177978e8c9ad6f1 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 6 May 2018 09:44:14 +0200 Subject: [PATCH 081/158] Some minor changes. --- .../mage/plugins/card/images/ImageCache.java | 21 +++++++++---------- .../src/mage/cards/c/CaligoSkinWitch.java | 3 +-- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/images/ImageCache.java b/Mage.Client/src/main/java/org/mage/plugins/card/images/ImageCache.java index 2edbe802025..ffe80ecdf55 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/images/ImageCache.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/images/ImageCache.java @@ -3,7 +3,6 @@ package org.mage.plugins.card.images; import com.google.common.base.Function; import com.google.common.collect.ComputationException; import com.google.common.collect.MapMaker; - import java.awt.*; import java.awt.geom.RoundRectangle2D; import java.awt.image.BufferedImage; @@ -13,6 +12,7 @@ import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.imageio.ImageIO; +import mage.client.constants.Constants; import mage.client.dialog.PreferencesDialog; import mage.client.util.TransformedImageCache; import mage.view.CardView; @@ -22,7 +22,6 @@ import net.java.truevfs.access.TFileOutputStream; import org.apache.log4j.Logger; import org.mage.plugins.card.dl.sources.DirectLinksForDownload; import org.mage.plugins.card.utils.CardImageUtils; -import mage.client.constants.Constants; /** * This class stores ALL card images in a cache with soft values. this means @@ -54,6 +53,7 @@ public final class ImageCache { private static final Pattern KEY_PATTERN = Pattern.compile("(.*)#(.*)#(.*)#(.*)#(.*)#(.*)"); static { + // softValues() = Specifies that each value (not key) stored in the map should be wrapped in a SoftReference (by default, strong references are used). Softly-referenced objects will be garbage-collected in a globally least-recently-used manner, in response to memory demand. IMAGE_CACHE = new MapMaker().softValues().makeComputingMap(new Function() { @Override public BufferedImage apply(String key) { @@ -130,7 +130,7 @@ public final class ImageCache { thumbnailImage = makeThumbnailByFile(key, file, thumbnailPath); } - if (cardback){ + if (cardback) { // unknown tokens on opponent desk thumbnailImage = getRoundCorner(thumbnailImage); } @@ -140,12 +140,12 @@ public final class ImageCache { return makeThumbnailByFile(key, file, thumbnailPath); } } else { - if (cardback){ + if (cardback) { // need cardback image BufferedImage image = loadImage(file); image = getRoundCorner(image); return image; - }else { + } else { // need normal card image BufferedImage image = loadImage(file); image = getWizardsCard(image); @@ -322,7 +322,7 @@ public final class ImageCache { return thumbnailPath; } - public static BufferedImage getRoundCorner(BufferedImage image){ + public static BufferedImage getRoundCorner(BufferedImage image) { if (image != null) { BufferedImage cornerImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB); @@ -363,7 +363,7 @@ public final class ImageCache { public static boolean isFaceImagePresent(CardView card) { String path; path = CardImageUtils.generateFaceImagePath(card.getName(), card.getExpansionSetCode()); - + if (path == null) { return false; } @@ -389,10 +389,9 @@ public final class ImageCache { return getImage(getKey(card, card.getName(), "")); } - public static BufferedImage getImageFaceOriginal(CardView card) { - return getFaceImage(getFaceKey(card, card.getName(), card.getExpansionSetCode())); - } - +// public static BufferedImage getImageFaceOriginal(CardView card) { +// return getFaceImage(getFaceKey(card, card.getName(), card.getExpansionSetCode())); +// } public static BufferedImage getImageOriginalAlternateName(CardView card) { return getImage(getKey(card, card.getAlternateName(), "")); } diff --git a/Mage.Sets/src/mage/cards/c/CaligoSkinWitch.java b/Mage.Sets/src/mage/cards/c/CaligoSkinWitch.java index 8b8fc90dac9..5857b92887e 100644 --- a/Mage.Sets/src/mage/cards/c/CaligoSkinWitch.java +++ b/Mage.Sets/src/mage/cards/c/CaligoSkinWitch.java @@ -28,7 +28,6 @@ package mage.cards.c; import java.util.UUID; - import mage.MageInt; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.common.KickedCondition; @@ -66,7 +65,7 @@ public class CaligoSkinWitch extends CardImpl { TargetController.OPPONENT )), KickedCondition.instance, - "When {this} enters the battlefield, if it was kicked, each opponent discards two cards" + "When {this} enters the battlefield, if it was kicked, each opponent discards two cards." )); } From 858f210a83f5f6270a00218ce85d51fbe97f9f13 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sun, 6 May 2018 18:57:06 +0400 Subject: [PATCH 082/158] Test framework: added assert color; --- .../base/impl/CardTestPlayerAPIImpl.java | 53 ++++++++++++++++--- 1 file changed, 45 insertions(+), 8 deletions(-) diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java b/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java index d405956f83b..24f6e7cce97 100644 --- a/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java +++ b/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java @@ -1,6 +1,7 @@ package org.mage.test.serverside.base.impl; import mage.Mana; +import mage.ObjectColor; import mage.abilities.Ability; import mage.cards.Card; import mage.cards.decks.Deck; @@ -516,20 +517,20 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement } } - public void assertAbility(Player player, String cardName, Ability ability, boolean flag) throws AssertionError { - assertAbility(player, cardName, ability, flag, 1); + public void assertAbility(Player player, String cardName, Ability ability, boolean mustHave) throws AssertionError { + assertAbility(player, cardName, ability, mustHave, 1); } /** * @param player * @param cardName * @param ability - * @param flag true if creature should contain ability, false if it should + * @param mustHave true if creature should contain ability, false if it should * NOT contain it instead * @param count number of permanents with that ability * @throws AssertionError */ - public void assertAbility(Player player, String cardName, Ability ability, boolean flag, int count) throws AssertionError { + public void assertAbility(Player player, String cardName, Ability ability, boolean mustHave, int count) throws AssertionError { int foundCount = 0; Permanent found = null; for (Permanent permanent : currentGame.getBattlefield().getAllActivePermanents(player.getId())) { @@ -545,7 +546,7 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement Assert.assertTrue("There is another number (" + foundCount + ") as defined (" + count + ") of such permanents under player's control, player=" + player.getName() + ", cardName=" + cardName, count == foundCount); - if (flag) { + if (mustHave) { Assert.assertTrue("No such ability=" + ability.toString() + ", player=" + player.getName() + ", cardName" + cardName, found.getAbilities(currentGame).containsRule(ability)); } else { @@ -682,9 +683,9 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement * * @param cardName Name of the permanent that should be checked. * @param type A type to test for - * @param flag true if creature should have type, false if it should not + * @param mustHave true if creature should have type, false if it should not */ - public void assertType(String cardName, CardType type, boolean flag) throws AssertionError { + public void assertType(String cardName, CardType type, boolean mustHave) throws AssertionError { Permanent found = null; for (Permanent permanent : currentGame.getBattlefield().getAllActivePermanents()) { if (permanent.getName().equals(cardName)) { @@ -695,7 +696,7 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement Assert.assertNotNull("There is no such permanent on the battlefield, cardName=" + cardName, found); - Assert.assertTrue("(Battlefield) card type not found (" + cardName + ':' + type + ')', (found.getCardType().contains(type) == flag)); + Assert.assertTrue("(Battlefield) card type not found (" + cardName + ':' + type + ')', (found.getCardType().contains(type) == mustHave)); } @@ -738,6 +739,42 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement } } + /** + * Assert permanent color + * + * @param player player to check + * @param cardName card name on battlefield from player + * @param searchColors colors list with searchable values + * @param mustHave must or not must have that colors + */ + public void assertColor(Player player, String cardName, ObjectColor searchColors, boolean mustHave) { + Assert.assertNotEquals("must setup colors to search", 0, searchColors.getColorCount()); + + Permanent card = getPermanent(cardName, player); + ObjectColor cardColor = card.getColor(currentGame); + + List colorsHave = new ArrayList<>(); + List colorsDontHave = new ArrayList<>(); + + for (ObjectColor searchColor : searchColors.getColors()) { + if (cardColor.shares(searchColor)) { + colorsHave.add(searchColor); + } else { + colorsDontHave.add(searchColor); + } + } + + if (mustHave) { + Assert.assertEquals("must contain colors [" + searchColors.toString() + "] but found only [" + cardColor.toString() + "]", 0, colorsDontHave.size()); + } else { + Assert.assertEquals("must not contain colors [" + searchColors.toString() + "] but found [" + cardColor.toString() + "]", 0, colorsHave.size()); + } + } + + public void assertColor(Player player, String cardName, String searchColors, boolean mustHave) { + assertColor(player, cardName, new ObjectColor(searchColors), mustHave); + } + /** * Assert whether a permanent is tapped or not * From 72314a9512ea787434bce4599af11d26777b5f5f Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sun, 6 May 2018 19:07:45 +0400 Subject: [PATCH 083/158] * Fixed 8 cards with "becomes creature attached" effect that it adds colors instead replace it; * Affected cards: Awaken the Ancient, Corrupted Zendikon, Crusher Zendikon, Deep Freeze, Guardian Zendikon, Living Terrain, Vastwood Zendikon, Wind Zendikon; --- .../src/mage/cards/a/AwakenTheAncient.java | 3 +- .../src/mage/cards/c/CorruptedZendikon.java | 2 +- .../src/mage/cards/c/CrusherZendikon.java | 3 +- Mage.Sets/src/mage/cards/d/DeepFreeze.java | 2 +- .../src/mage/cards/g/GuardianZendikon.java | 13 +- Mage.Sets/src/mage/cards/l/LivingTerrain.java | 3 +- .../src/mage/cards/v/VastwoodZendikon.java | 2 +- Mage.Sets/src/mage/cards/w/WindZendikon.java | 14 ++- .../BecomesCreatureAttachedTest.java | 114 ++++++++++++++++++ .../BecomesCreatureAttachedEffect.java | 16 +-- 10 files changed, 146 insertions(+), 26 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/continuous/BecomesCreatureAttachedTest.java diff --git a/Mage.Sets/src/mage/cards/a/AwakenTheAncient.java b/Mage.Sets/src/mage/cards/a/AwakenTheAncient.java index 37549cb360e..1dc0f1b8184 100644 --- a/Mage.Sets/src/mage/cards/a/AwakenTheAncient.java +++ b/Mage.Sets/src/mage/cards/a/AwakenTheAncient.java @@ -65,7 +65,8 @@ public class AwakenTheAncient extends CardImpl { this.addAbility(ability); // Enchanted Mountain is a 7/7 red Giant creature with haste. It's still a land. - Ability ability2 = new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesCreatureAttachedEffect(new GiantToken(), "Enchanted Mountain is a 7/7 red Giant creature with haste. It's still a land", Duration.WhileOnBattlefield)); + Ability ability2 = new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesCreatureAttachedEffect( + new GiantToken(), "Enchanted Mountain is a 7/7 red Giant creature with haste. It's still a land", Duration.WhileOnBattlefield, BecomesCreatureAttachedEffect.LoseType.COLOR)); this.addAbility(ability2); } diff --git a/Mage.Sets/src/mage/cards/c/CorruptedZendikon.java b/Mage.Sets/src/mage/cards/c/CorruptedZendikon.java index 01744b45ca9..e63ced72db0 100644 --- a/Mage.Sets/src/mage/cards/c/CorruptedZendikon.java +++ b/Mage.Sets/src/mage/cards/c/CorruptedZendikon.java @@ -68,7 +68,7 @@ public class CorruptedZendikon extends CardImpl { // Enchanted land is a 3/3 black Ooze creature. It's still a land. Ability ability2 = new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesCreatureAttachedEffect(new CorruptedZendikonOozeToken(), - "Enchanted land is a 3/3 black Ooze creature. It's still a land.", Duration.WhileOnBattlefield)); + "Enchanted land is a 3/3 black Ooze creature. It's still a land.", Duration.WhileOnBattlefield, BecomesCreatureAttachedEffect.LoseType.COLOR)); this.addAbility(ability2); // When enchanted land dies, return that card to its owner's hand. diff --git a/Mage.Sets/src/mage/cards/c/CrusherZendikon.java b/Mage.Sets/src/mage/cards/c/CrusherZendikon.java index c6b9ab3fc90..0f3d07b8376 100644 --- a/Mage.Sets/src/mage/cards/c/CrusherZendikon.java +++ b/Mage.Sets/src/mage/cards/c/CrusherZendikon.java @@ -67,7 +67,8 @@ public class CrusherZendikon extends CardImpl { Ability ability = new EnchantAbility(auraTarget.getTargetName()); this.addAbility(ability); // Enchanted land is a 4/2 red Beast creature with trample. It's still a land. - Ability ability2 = new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesCreatureAttachedEffect(new BeastToken(), "Enchanted land is a 4/2 red Beast creature with trample. It's still a land.", Duration.WhileOnBattlefield)); + Ability ability2 = new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesCreatureAttachedEffect( + new BeastToken(), "Enchanted land is a 4/2 red Beast creature with trample. It's still a land.", Duration.WhileOnBattlefield, BecomesCreatureAttachedEffect.LoseType.COLOR)); this.addAbility(ability2); // When enchanted land dies, return that card to its owner's hand. Ability ability3 = new DiesAttachedTriggeredAbility(new ReturnToHandAttachedEffect(), "enchanted land", false); diff --git a/Mage.Sets/src/mage/cards/d/DeepFreeze.java b/Mage.Sets/src/mage/cards/d/DeepFreeze.java index a7b21e6873d..3af29de23e7 100644 --- a/Mage.Sets/src/mage/cards/d/DeepFreeze.java +++ b/Mage.Sets/src/mage/cards/d/DeepFreeze.java @@ -69,7 +69,7 @@ public class DeepFreeze extends CardImpl { this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesCreatureAttachedEffect(new DeepFreezeToken(), "Enchanted creature has base power and toughness 0/4, has defender, loses all other abilities, and is a blue Wall in addition to its other colors and types", - Duration.WhileOnBattlefield, BecomesCreatureAttachedEffect.LoseType.ABILITIES_AND_PT) + Duration.WhileOnBattlefield, BecomesCreatureAttachedEffect.LoseType.ABILITIES) )); } diff --git a/Mage.Sets/src/mage/cards/g/GuardianZendikon.java b/Mage.Sets/src/mage/cards/g/GuardianZendikon.java index a8d3d66af37..02ba012b78e 100644 --- a/Mage.Sets/src/mage/cards/g/GuardianZendikon.java +++ b/Mage.Sets/src/mage/cards/g/GuardianZendikon.java @@ -70,7 +70,8 @@ public class GuardianZendikon extends CardImpl { Ability ability = new EnchantAbility(auraTarget.getTargetName()); this.addAbility(ability); - Ability ability2 = new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesCreatureAttachedEffect(new WallToken(), "Enchanted land is a 2/6 white wall creature with defender. It's still a land", Duration.WhileOnBattlefield)); + Ability ability2 = new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesCreatureAttachedEffect( + new GuardianZendikonWallToken(), "Enchanted land is a 2/6 white wall creature with defender. It's still a land", Duration.WhileOnBattlefield, BecomesCreatureAttachedEffect.LoseType.COLOR)); this.addAbility(ability2); Ability ability3 = new DiesAttachedTriggeredAbility(new ReturnToHandAttachedEffect(), "enchanted land", false); @@ -87,9 +88,9 @@ public class GuardianZendikon extends CardImpl { } } -class WallToken extends TokenImpl { +class GuardianZendikonWallToken extends TokenImpl { - WallToken() { + GuardianZendikonWallToken() { super("", "2/6 white wall creature with defender"); cardType.add(CardType.CREATURE); color.setWhite(true); @@ -98,11 +99,11 @@ class WallToken extends TokenImpl { toughness = new MageInt(6); this.addAbility(DefenderAbility.getInstance()); } - public WallToken(final WallToken token) { + public GuardianZendikonWallToken(final GuardianZendikonWallToken token) { super(token); } - public WallToken copy() { - return new WallToken(this); + public GuardianZendikonWallToken copy() { + return new GuardianZendikonWallToken(this); } } \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/l/LivingTerrain.java b/Mage.Sets/src/mage/cards/l/LivingTerrain.java index 019471ebb00..21c05cb2931 100644 --- a/Mage.Sets/src/mage/cards/l/LivingTerrain.java +++ b/Mage.Sets/src/mage/cards/l/LivingTerrain.java @@ -61,7 +61,8 @@ public class LivingTerrain extends CardImpl { Ability ability = new EnchantAbility(auraTarget.getTargetName()); this.addAbility(ability); // Enchanted land is a 5/6 green Treefolk creature that's still a land. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesCreatureAttachedEffect(new TreefolkToken(), "Enchanted land is a 5/6 green Treefolk creature that's still a land", Duration.WhileOnBattlefield))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesCreatureAttachedEffect( + new TreefolkToken(), "Enchanted land is a 5/6 green Treefolk creature that's still a land", Duration.WhileOnBattlefield, BecomesCreatureAttachedEffect.LoseType.COLOR))); } public LivingTerrain(final LivingTerrain card) { diff --git a/Mage.Sets/src/mage/cards/v/VastwoodZendikon.java b/Mage.Sets/src/mage/cards/v/VastwoodZendikon.java index 2e667eb368c..b86de1f50b1 100644 --- a/Mage.Sets/src/mage/cards/v/VastwoodZendikon.java +++ b/Mage.Sets/src/mage/cards/v/VastwoodZendikon.java @@ -69,7 +69,7 @@ public class VastwoodZendikon extends CardImpl { Ability ability2 = new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesCreatureAttachedEffect( new ElementalCreatureToken(6, 4, "6/4 green Elemental creature", new ObjectColor("G")), - "Enchanted land is a 6/4 green Elemental creature. It's still a land", Duration.WhileOnBattlefield )); + "Enchanted land is a 6/4 green Elemental creature. It's still a land", Duration.WhileOnBattlefield, BecomesCreatureAttachedEffect.LoseType.COLOR)); this.addAbility(ability2); Ability ability3 = new DiesAttachedTriggeredAbility(new ReturnToHandAttachedEffect(), "enchanted land", false); diff --git a/Mage.Sets/src/mage/cards/w/WindZendikon.java b/Mage.Sets/src/mage/cards/w/WindZendikon.java index 44b44448886..836e9fafdc8 100644 --- a/Mage.Sets/src/mage/cards/w/WindZendikon.java +++ b/Mage.Sets/src/mage/cards/w/WindZendikon.java @@ -66,7 +66,9 @@ public class WindZendikon extends CardImpl { Ability ability = new EnchantAbility(auraTarget.getTargetName()); this.addAbility(ability); - Ability ability2 = new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesCreatureAttachedEffect(new ElementalToken(), "Enchanted land is a 2/2 blue Elemental creature with flying. It's still a land", Duration.WhileOnBattlefield)); + Ability ability2 = new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesCreatureAttachedEffect( + new WindZendikonElementalToken(), "Enchanted land is a 2/2 blue Elemental creature with flying. It's still a land", + Duration.WhileOnBattlefield, BecomesCreatureAttachedEffect.LoseType.COLOR)); this.addAbility(ability2); Ability ability3 = new DiesAttachedTriggeredAbility(new ReturnToHandAttachedEffect(), "enchanted land", false); @@ -82,8 +84,8 @@ public class WindZendikon extends CardImpl { return new WindZendikon(this); } - class ElementalToken extends TokenImpl { - ElementalToken() { + class WindZendikonElementalToken extends TokenImpl { + WindZendikonElementalToken() { super("", "2/2 blue Elemental creature with flying"); cardType.add(CardType.CREATURE); color.setBlue(true); @@ -92,12 +94,12 @@ public class WindZendikon extends CardImpl { toughness = new MageInt(2); addAbility(FlyingAbility.getInstance()); } - public ElementalToken(final ElementalToken token) { + public WindZendikonElementalToken(final WindZendikonElementalToken token) { super(token); } - public ElementalToken copy() { - return new ElementalToken(this); + public WindZendikonElementalToken copy() { + return new WindZendikonElementalToken(this); } } } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/continuous/BecomesCreatureAttachedTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/continuous/BecomesCreatureAttachedTest.java new file mode 100644 index 00000000000..7b2b9270143 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/continuous/BecomesCreatureAttachedTest.java @@ -0,0 +1,114 @@ +/* + * 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 org.mage.test.cards.continuous; + +import mage.ObjectColor; +import mage.abilities.AbilitiesImpl; +import mage.abilities.keyword.DefenderAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.constants.CardType; +import mage.constants.PhaseStep; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.game.permanent.Permanent; +import org.junit.Assert; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author JayDi85 + */ +public class BecomesCreatureAttachedTest extends CardTestPlayerBase { + + // Dryad Arbor -- green creature land + + @Test + public void test_CreatureLandWithColor() { + addCard(Zone.BATTLEFIELD, playerA, "Dryad Arbor", 1); + addCard(Zone.BATTLEFIELD, playerA, "Forest", 1); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertPermanentCount(playerA, "Dryad Arbor", 1); + assertPowerToughness(playerA, "Dryad Arbor", 1, 1); + // land + assertColor(playerA, "Forest", "WUBGR", false); + // dryad + assertColor(playerA, "Dryad Arbor", "G", true); + assertColor(playerA, "Dryad Arbor", "WUBR", false); + } + + @Test + public void test_AttachToLandWithColorReplace() { + // Enchanted land is a 2/2 blue Elemental creature with flying. It’s still a land. + addCard(Zone.HAND, playerA, "Wind Zendikon", 1); + addCard(Zone.BATTLEFIELD, playerA, "Island", 1); + + addCard(Zone.BATTLEFIELD, playerA, "Dryad Arbor", 1); + + // attach to forest and check color changing + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Wind Zendikon", "Dryad Arbor"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertPermanentCount(playerA, "Dryad Arbor", 1); + assertPowerToughness(playerA, "Dryad Arbor", 2, 2); + assertType("Dryad Arbor", CardType.CREATURE, true); + assertType("Dryad Arbor", CardType.LAND, true); + assertAbilities(playerA, "Dryad Arbor", new AbilitiesImpl<>(FlyingAbility.getInstance())); + assertColor(playerA, "Dryad Arbor", "U", true); + assertColor(playerA, "Dryad Arbor", "WBGR", false); + } + + @Test + public void test_AttachToLandWithColorAdd() { + // Enchanted land is a 2/2 blue Elemental creature with flying. It’s still a land. + addCard(Zone.HAND, playerA, "Deep Freeze", 1); + addCard(Zone.BATTLEFIELD, playerA, "Island", 3); + + addCard(Zone.BATTLEFIELD, playerA, "Dryad Arbor", 1); + + // attach to forest and check color changing + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Deep Freeze", "Dryad Arbor"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertPermanentCount(playerA, "Dryad Arbor", 1); + assertPowerToughness(playerA, "Dryad Arbor", 0, 4); + assertType("Dryad Arbor", CardType.CREATURE, true); + assertType("Dryad Arbor", CardType.LAND, true); + assertType("Dryad Arbor", CardType.LAND, SubType.WALL); + assertAbilities(playerA, "Dryad Arbor", new AbilitiesImpl<>(DefenderAbility.getInstance())); + assertColor(playerA, "Dryad Arbor", "UG", true); + assertColor(playerA, "Dryad Arbor", "WBR", false); + } +} diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAttachedEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAttachedEffect.java index aca32daee2d..ae71f505861 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAttachedEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAttachedEffect.java @@ -40,7 +40,7 @@ import mage.game.permanent.token.Token; public class BecomesCreatureAttachedEffect extends ContinuousEffectImpl { public enum LoseType { - NONE, ALL, ALL_BUT_COLOR, ABILITIES, ABILITIES_SUBTYPE_AND_PT, ABILITIES_AND_PT + NONE, ALL, ALL_BUT_COLOR, ABILITIES, ABILITIES_SUBTYPE, COLOR } protected Token token; @@ -98,7 +98,7 @@ public class BecomesCreatureAttachedEffect extends ContinuousEffectImpl { switch (loseType) { case ALL: case ALL_BUT_COLOR: - case ABILITIES_SUBTYPE_AND_PT: + case ABILITIES_SUBTYPE: permanent.getSubtype(game).retainAll(SubType.getLandTypes(false)); break; } @@ -107,12 +107,12 @@ public class BecomesCreatureAttachedEffect extends ContinuousEffectImpl { permanent.getSubtype(game).add(t); } } - } break; + case ColorChangingEffects_5: if (sublayer == SubLayer.NA) { - if (loseType == LoseType.ALL) { + if (loseType == LoseType.ALL || loseType == LoseType.COLOR) { permanent.getColor(game).setBlack(false); permanent.getColor(game).setGreen(false); permanent.getColor(game).setBlue(false); @@ -124,29 +124,29 @@ public class BecomesCreatureAttachedEffect extends ContinuousEffectImpl { } } break; + case AbilityAddingRemovingEffects_6: if (sublayer == SubLayer.NA) { switch (loseType) { case ALL: case ALL_BUT_COLOR: case ABILITIES: - case ABILITIES_AND_PT: - case ABILITIES_SUBTYPE_AND_PT: + case ABILITIES_SUBTYPE: permanent.removeAllAbilities(source.getSourceId(), game); break; } for (Ability ability : token.getAbilities()) { permanent.addAbility(ability, source.getSourceId(), game); } - } break; + case PTChangingEffects_7: if (sublayer == SubLayer.SetPT_7b) { permanent.getPower().setValue(token.getPower().getValue()); permanent.getToughness().setValue(token.getToughness().getValue()); - break; } + break; } } return true; From f7a4e7590978d0deed01fe9d6bda3eccf42995f3 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sun, 6 May 2018 19:08:56 +0400 Subject: [PATCH 084/158] Refactoring: replace custom creature tokens with basic class (11 cards) --- .../src/mage/cards/e/EnsoulArtifact.java | 20 +---- Mage.Sets/src/mage/cards/f/FowlPlay.java | 24 +----- Mage.Sets/src/mage/cards/l/LifeDeath.java | 21 +---- Mage.Sets/src/mage/cards/l/Lignify.java | 25 +----- Mage.Sets/src/mage/cards/l/LivingLands.java | 20 +---- Mage.Sets/src/mage/cards/l/LivingPlane.java | 20 +---- .../src/mage/cards/n/NaturalAffinity.java | 83 ++----------------- Mage.Sets/src/mage/cards/n/NaturesRevolt.java | 22 +---- Mage.Sets/src/mage/cards/r/RudeAwakening.java | 23 +---- .../src/mage/cards/t/TezzeretsTouch.java | 23 +---- .../src/mage/cards/t/TheloniteDruid.java | 3 +- 11 files changed, 32 insertions(+), 252 deletions(-) diff --git a/Mage.Sets/src/mage/cards/e/EnsoulArtifact.java b/Mage.Sets/src/mage/cards/e/EnsoulArtifact.java index 42c01e78957..0c04a8bcdc2 100644 --- a/Mage.Sets/src/mage/cards/e/EnsoulArtifact.java +++ b/Mage.Sets/src/mage/cards/e/EnsoulArtifact.java @@ -43,6 +43,7 @@ import mage.constants.Outcome; import mage.constants.Zone; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; import mage.target.TargetPermanent; import mage.target.common.TargetArtifactPermanent; @@ -66,7 +67,7 @@ public class EnsoulArtifact extends CardImpl { // Enchanted artifact is a creature with base power and toughness 5/5 in addition to its other types. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, - new BecomesCreatureAttachedEffect(new EnsoulArtifactToken(), "Enchanted artifact is a creature with base power and toughness 5/5 in addition to its other types", Duration.WhileOnBattlefield) + new BecomesCreatureAttachedEffect(new CreatureToken(5, 5), "Enchanted artifact is a creature with base power and toughness 5/5 in addition to its other types", Duration.WhileOnBattlefield) )); } @@ -79,21 +80,4 @@ public class EnsoulArtifact extends CardImpl { public EnsoulArtifact copy() { return new EnsoulArtifact(this); } -} - -class EnsoulArtifactToken extends TokenImpl { - - EnsoulArtifactToken() { - super("", "5/5"); - cardType.add(CardType.CREATURE); - power = new MageInt(5); - toughness = new MageInt(5); - } - public EnsoulArtifactToken(final EnsoulArtifactToken token) { - super(token); - } - - public EnsoulArtifactToken copy() { - return new EnsoulArtifactToken(this); - } } \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/f/FowlPlay.java b/Mage.Sets/src/mage/cards/f/FowlPlay.java index 2aa7e833f10..69edefb0e72 100644 --- a/Mage.Sets/src/mage/cards/f/FowlPlay.java +++ b/Mage.Sets/src/mage/cards/f/FowlPlay.java @@ -34,6 +34,7 @@ import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.continuous.BecomesCreatureAttachedEffect; import mage.constants.Outcome; +import mage.game.permanent.token.custom.CreatureToken; import mage.target.TargetPermanent; import mage.abilities.keyword.EnchantAbility; import mage.cards.CardImpl; @@ -43,7 +44,6 @@ import mage.constants.Duration; import mage.constants.SubType; import mage.constants.Zone; import mage.game.permanent.token.TokenImpl; -import mage.game.permanent.token.Token; import mage.target.common.TargetCreaturePermanent; /** @@ -66,9 +66,9 @@ public class FowlPlay extends CardImpl { // Enchanted creature is a Chicken with base power and toughness 1/1 and loses all abilities. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, - new BecomesCreatureAttachedEffect(new FowlPlayToken(), + new BecomesCreatureAttachedEffect(new CreatureToken(1, 1, "1/1 Chicken creature", SubType.CHICKEN), "Enchanted creature is a Chicken with base power and toughness 1/1 and loses all abilities", - Duration.WhileOnBattlefield, BecomesCreatureAttachedEffect.LoseType.ABILITIES_SUBTYPE_AND_PT))); + Duration.WhileOnBattlefield, BecomesCreatureAttachedEffect.LoseType.ABILITIES_SUBTYPE))); } public FowlPlay(final FowlPlay card) { @@ -80,21 +80,3 @@ public class FowlPlay extends CardImpl { return new FowlPlay(this); } } - -class FowlPlayToken extends TokenImpl { - - public FowlPlayToken() { - super("Chicken", "a Chicken with base power and toughness 1/1 with no abilities"); - cardType.add(CardType.CREATURE); - subtype.add(SubType.CHICKEN); - power = new MageInt(1); - toughness = new MageInt(1); - } - public FowlPlayToken(final FowlPlayToken token) { - super(token); - } - - public FowlPlayToken copy() { - return new FowlPlayToken(this); - } -} diff --git a/Mage.Sets/src/mage/cards/l/LifeDeath.java b/Mage.Sets/src/mage/cards/l/LifeDeath.java index f7c9a6d7413..12555e30b0e 100644 --- a/Mage.Sets/src/mage/cards/l/LifeDeath.java +++ b/Mage.Sets/src/mage/cards/l/LifeDeath.java @@ -45,6 +45,7 @@ import mage.filter.common.FilterControlledLandPermanent; import mage.game.Game; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; import mage.players.Player; import mage.target.Target; import mage.target.common.TargetCardInYourGraveyard; @@ -60,7 +61,7 @@ public class LifeDeath extends SplitCard { // Life // All lands you control become 1/1 creatures until end of turn. They're still lands. - getLeftHalfCard().getSpellAbility().addEffect(new BecomesCreatureAllEffect(new LifeLandToken(), "lands", + getLeftHalfCard().getSpellAbility().addEffect(new BecomesCreatureAllEffect(new CreatureToken(1, 1), "lands", new FilterControlledLandPermanent("lands you control"), Duration.EndOfTurn)); // Death @@ -81,24 +82,6 @@ public class LifeDeath extends SplitCard { } } -class LifeLandToken extends TokenImpl { - - public LifeLandToken() { - super("", "1/1 creatures"); - cardType.add(CardType.CREATURE); - power = new MageInt(1); - toughness = new MageInt(1); - } - public LifeLandToken(final LifeLandToken token) { - super(token); - } - - public LifeLandToken copy() { - return new LifeLandToken(this); - } - -} - class DeathEffect extends OneShotEffect { public DeathEffect() { diff --git a/Mage.Sets/src/mage/cards/l/Lignify.java b/Mage.Sets/src/mage/cards/l/Lignify.java index 9d2c1349246..788b26ab5e6 100644 --- a/Mage.Sets/src/mage/cards/l/Lignify.java +++ b/Mage.Sets/src/mage/cards/l/Lignify.java @@ -42,7 +42,7 @@ import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Zone; import mage.game.permanent.token.TokenImpl; -import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; @@ -66,9 +66,9 @@ public class Lignify extends CardImpl { // Enchanted creature is a Treefolk with base power and toughness 0/4 and loses all abilities. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, - new BecomesCreatureAttachedEffect(new LignifyTreefolkToken(), + new BecomesCreatureAttachedEffect(new CreatureToken(0, 4, "0/4 Treefolk creature", SubType.TREEFOLK), "Enchanted creature is a Treefolk with base power and toughness 0/4 and loses all abilities", - Duration.WhileOnBattlefield, BecomesCreatureAttachedEffect.LoseType.ABILITIES_SUBTYPE_AND_PT))); + Duration.WhileOnBattlefield, BecomesCreatureAttachedEffect.LoseType.ABILITIES_SUBTYPE))); } @@ -81,22 +81,3 @@ public class Lignify extends CardImpl { return new Lignify(this); } } - -class LignifyTreefolkToken extends TokenImpl { - - public LignifyTreefolkToken() { - super("Treefolk", "a Treefolk with base power and toughness 0/4 with no abilities"); - cardType.add(CardType.CREATURE); - subtype.add(SubType.TREEFOLK); - power = new MageInt(0); - toughness = new MageInt(4); - } - public LignifyTreefolkToken(final LignifyTreefolkToken token) { - super(token); - } - - public LignifyTreefolkToken copy() { - return new LignifyTreefolkToken(this); - } - -} diff --git a/Mage.Sets/src/mage/cards/l/LivingLands.java b/Mage.Sets/src/mage/cards/l/LivingLands.java index eb1d8b1b02f..6c4d52f64ae 100644 --- a/Mage.Sets/src/mage/cards/l/LivingLands.java +++ b/Mage.Sets/src/mage/cards/l/LivingLands.java @@ -38,6 +38,7 @@ import mage.filter.common.FilterLandPermanent; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; import java.util.UUID; @@ -57,7 +58,7 @@ public class LivingLands extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{G}"); // All Forests are 1/1 creatures that are still lands. - ContinuousEffect effect = new BecomesCreatureAllEffect(new LivingLandsToken(), "lands", filter, Duration.WhileOnBattlefield); + ContinuousEffect effect = new BecomesCreatureAllEffect(new CreatureToken(1, 1), "lands", filter, Duration.WhileOnBattlefield); effect.getDependencyTypes().add(DependencyType.BecomeForest); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); } @@ -71,20 +72,3 @@ public class LivingLands extends CardImpl { return new LivingLands(this); } } - -class LivingLandsToken extends TokenImpl { - - public LivingLandsToken() { - super("", "1/1 creatures"); - cardType.add(CardType.CREATURE); - power = new MageInt(1); - toughness = new MageInt(1); - } - public LivingLandsToken(final LivingLandsToken token) { - super(token); - } - - public LivingLandsToken copy() { - return new LivingLandsToken(this); - } -} diff --git a/Mage.Sets/src/mage/cards/l/LivingPlane.java b/Mage.Sets/src/mage/cards/l/LivingPlane.java index d6b9f4ffca3..a35d681a0e0 100644 --- a/Mage.Sets/src/mage/cards/l/LivingPlane.java +++ b/Mage.Sets/src/mage/cards/l/LivingPlane.java @@ -40,6 +40,7 @@ import mage.constants.Zone; import mage.filter.StaticFilters; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; /** * @@ -52,7 +53,7 @@ public class LivingPlane extends CardImpl { this.addSuperType(SuperType.WORLD); // All lands are 1/1 creatures that are still lands. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesCreatureAllEffect(new LivingPlaneToken(), "lands", StaticFilters.FILTER_LANDS, Duration.WhileOnBattlefield))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesCreatureAllEffect(new CreatureToken(1, 1), "lands", StaticFilters.FILTER_LANDS, Duration.WhileOnBattlefield))); } public LivingPlane(final LivingPlane card) { @@ -64,20 +65,3 @@ public class LivingPlane extends CardImpl { return new LivingPlane(this); } } - -class LivingPlaneToken extends TokenImpl { - - public LivingPlaneToken() { - super("Land", "1/1 creatures"); - cardType.add(CardType.CREATURE); - power = new MageInt(1); - toughness = new MageInt(1); - } - public LivingPlaneToken(final LivingPlaneToken token) { - super(token); - } - - public LivingPlaneToken copy() { - return new LivingPlaneToken(this); - } -} diff --git a/Mage.Sets/src/mage/cards/n/NaturalAffinity.java b/Mage.Sets/src/mage/cards/n/NaturalAffinity.java index cfae01cb44c..1f021b3f9fc 100644 --- a/Mage.Sets/src/mage/cards/n/NaturalAffinity.java +++ b/Mage.Sets/src/mage/cards/n/NaturalAffinity.java @@ -31,17 +31,17 @@ import java.util.Iterator; import java.util.UUID; import mage.MageObjectReference; import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.common.continuous.BecomesCreatureAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Layer; -import mage.constants.Outcome; -import mage.constants.SubLayer; +import mage.constants.*; +import mage.filter.StaticFilters; import mage.filter.common.FilterLandPermanent; import mage.game.Game; import mage.game.permanent.Permanent; +import mage.game.permanent.token.custom.CreatureToken; /** * @@ -53,7 +53,7 @@ public class NaturalAffinity extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{2}{G}"); // All lands become 2/2 creatures until end of turn. They're still lands. - this.getSpellAbility().addEffect(new BecomesCreatureAllEffect()); + this.getSpellAbility().addEffect(new BecomesCreatureAllEffect(new CreatureToken(2, 2), "lands", StaticFilters.FILTER_LANDS, Duration.EndOfTurn)); } public NaturalAffinity(final NaturalAffinity card) { @@ -64,73 +64,4 @@ public class NaturalAffinity extends CardImpl { public NaturalAffinity copy() { return new NaturalAffinity(this); } -} - -class BecomesCreatureAllEffect extends ContinuousEffectImpl { - - public BecomesCreatureAllEffect() { - super(Duration.EndOfTurn, Outcome.BecomeCreature); - staticText = "All lands become 2/2 creatures until end of turn. They're still lands"; - } - - public BecomesCreatureAllEffect(final BecomesCreatureAllEffect effect) { - super(effect); - } - - @Override - public BecomesCreatureAllEffect copy() { - return new BecomesCreatureAllEffect(this); - } - - @Override - public void init(Ability source, Game game) { - super.init(source, game); - this.affectedObjectsSet = true; - for (Permanent perm : game.getBattlefield().getActivePermanents(new FilterLandPermanent(), source.getControllerId(), source.getSourceId(), game)) { - affectedObjectList.add(new MageObjectReference(perm, game)); - } - } - - @Override - public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { - switch (layer) { - case TypeChangingEffects_4: - if (sublayer == SubLayer.NA) { - for (Iterator it = affectedObjectList.iterator(); it.hasNext();) { - Permanent permanent = it.next().getPermanent(game); - if (permanent != null) { - permanent.addCardType(CardType.CREATURE); - } else { - it.remove(); - } - } - } - break; - - case PTChangingEffects_7: - if (sublayer == SubLayer.SetPT_7b) { - for (Iterator it = affectedObjectList.iterator(); it.hasNext();) { - Permanent permanent = it.next().getPermanent(game); - if (permanent != null) { - permanent.getPower().setValue(2); - permanent.getToughness().setValue(2); - } else { - it.remove(); - } - } - } - } - return true; - } - - @Override - public boolean apply(Game game, Ability source) { - return false; - } - - @Override - public boolean hasLayer(Layer layer) { - return layer == Layer.PTChangingEffects_7 || layer == Layer.AbilityAddingRemovingEffects_6 || layer == Layer.ColorChangingEffects_5 || layer == Layer.TypeChangingEffects_4; - } - -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/n/NaturesRevolt.java b/Mage.Sets/src/mage/cards/n/NaturesRevolt.java index 3eef22208d4..a9445feb0a3 100644 --- a/Mage.Sets/src/mage/cards/n/NaturesRevolt.java +++ b/Mage.Sets/src/mage/cards/n/NaturesRevolt.java @@ -39,6 +39,7 @@ import mage.constants.Zone; import mage.filter.common.FilterLandPermanent; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; /** * @@ -51,7 +52,7 @@ public class NaturesRevolt extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{G}{G}"); // All lands are 2/2 creatures that are still lands. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesCreatureAllEffect(new NaturesRevoltToken(), + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesCreatureAllEffect(new CreatureToken(2, 2), "lands", new FilterLandPermanent(), Duration.WhileOnBattlefield))); } @@ -63,21 +64,4 @@ public class NaturesRevolt extends CardImpl { public NaturesRevolt copy() { return new NaturesRevolt(this); } -} - -class NaturesRevoltToken extends TokenImpl { - - public NaturesRevoltToken() { - super("Land", "2/2 creatures"); - cardType.add(CardType.CREATURE); - power = new MageInt(2); - toughness = new MageInt(2); - } - public NaturesRevoltToken(final NaturesRevoltToken token) { - super(token); - } - - public NaturesRevoltToken copy() { - return new NaturesRevoltToken(this); - } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/r/RudeAwakening.java b/Mage.Sets/src/mage/cards/r/RudeAwakening.java index e12cda24da0..1b21de2ffb4 100644 --- a/Mage.Sets/src/mage/cards/r/RudeAwakening.java +++ b/Mage.Sets/src/mage/cards/r/RudeAwakening.java @@ -40,6 +40,7 @@ import mage.constants.Duration; import mage.filter.common.FilterControlledLandPermanent; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; /** * @@ -57,7 +58,7 @@ public class RudeAwakening extends CardImpl { this.getSpellAbility().addEffect(new UntapAllLandsControllerEffect()); // or until end of turn, lands you control become 2/2 creatures that are still lands. Mode mode = new Mode(); - mode.getEffects().add(new BecomesCreatureAllEffect(new RudeAwakeningToken(), "lands", new FilterControlledLandPermanent("lands you control"), Duration.EndOfTurn)); + mode.getEffects().add(new BecomesCreatureAllEffect(new CreatureToken(2, 2), "lands", new FilterControlledLandPermanent("lands you control"), Duration.EndOfTurn)); this.getSpellAbility().getModes().addMode(mode); // Entwine {2}{G} @@ -72,22 +73,4 @@ public class RudeAwakening extends CardImpl { public RudeAwakening copy() { return new RudeAwakening(this); } -} - -class RudeAwakeningToken extends TokenImpl { - - public RudeAwakeningToken() { - super("", "2/2 creatures"); - cardType.add(CardType.CREATURE); - power = new MageInt(2); - toughness = new MageInt(2); - } - public RudeAwakeningToken(final RudeAwakeningToken token) { - super(token); - } - - public RudeAwakeningToken copy() { - return new RudeAwakeningToken(this); - } - -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/t/TezzeretsTouch.java b/Mage.Sets/src/mage/cards/t/TezzeretsTouch.java index 881cb3e90d9..14de72c7165 100644 --- a/Mage.Sets/src/mage/cards/t/TezzeretsTouch.java +++ b/Mage.Sets/src/mage/cards/t/TezzeretsTouch.java @@ -45,6 +45,7 @@ import mage.constants.Outcome; import mage.constants.Zone; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; import mage.target.TargetPermanent; import mage.target.common.TargetArtifactPermanent; @@ -67,9 +68,8 @@ public class TezzeretsTouch extends CardImpl { this.addAbility(ability); // Enchanted artifact is a creature with base power and toughness 5/5 in addition to its other types. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, - new BecomesCreatureAttachedEffect(new TezzeretsTouchToken(), - "Enchanted artifact is a creature with base power and toughness 5/5 in addition to its other types", Duration.WhileOnBattlefield))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesCreatureAttachedEffect( + new CreatureToken(5, 5, "5/5 creature"),"Enchanted artifact is a creature with base power and toughness 5/5 in addition to its other types", Duration.WhileOnBattlefield))); // When enchanted artifact is put into a graveyard, return that card to its owner's hand. this.addAbility(new DiesAttachedTriggeredAbility(new ReturnToHandAttachedEffect(), "enchanted artifact", false, false)); @@ -83,21 +83,4 @@ public class TezzeretsTouch extends CardImpl { public TezzeretsTouch copy() { return new TezzeretsTouch(this); } -} - -class TezzeretsTouchToken extends TokenImpl { - - TezzeretsTouchToken() { - super("", "5/5"); - cardType.add(CardType.CREATURE); - power = new MageInt(5); - toughness = new MageInt(5); - } - public TezzeretsTouchToken(final TezzeretsTouchToken token) { - super(token); - } - - public TezzeretsTouchToken copy() { - return new TezzeretsTouchToken(this); - } } \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/t/TheloniteDruid.java b/Mage.Sets/src/mage/cards/t/TheloniteDruid.java index 3cd6579b7ee..01f8b0c052d 100644 --- a/Mage.Sets/src/mage/cards/t/TheloniteDruid.java +++ b/Mage.Sets/src/mage/cards/t/TheloniteDruid.java @@ -44,6 +44,7 @@ import mage.filter.common.FilterControlledLandPermanent; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; import mage.target.common.TargetControlledCreaturePermanent; /** @@ -67,7 +68,7 @@ public class TheloniteDruid extends CardImpl { this.toughness = new MageInt(1); // {1}{G}, {tap}, Sacrifice a creature: Forests you control become 2/3 creatures until end of turn. They're still lands. - ContinuousEffect effect = new BecomesCreatureAllEffect(new TheloniteDruidLandToken(), "Forests", filter, Duration.EndOfTurn); + ContinuousEffect effect = new BecomesCreatureAllEffect(new CreatureToken(2, 3), "Forests", filter, Duration.EndOfTurn); effect.getDependencyTypes().add(DependencyType.BecomeForest); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, From 721f37c5ae681a580f5ae0d84a1bf5940a53c3c2 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sun, 6 May 2018 19:47:00 +0400 Subject: [PATCH 085/158] * Summon the Pack - fixed that it gives black color to cards (#4905); --- Mage.Sets/src/mage/cards/s/SummonThePack.java | 2 +- .../BecomesBlackZombieAdditionEffect.java | 24 +++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/Mage.Sets/src/mage/cards/s/SummonThePack.java b/Mage.Sets/src/mage/cards/s/SummonThePack.java index 445e3dc47d0..59b2edf00d5 100644 --- a/Mage.Sets/src/mage/cards/s/SummonThePack.java +++ b/Mage.Sets/src/mage/cards/s/SummonThePack.java @@ -115,7 +115,7 @@ class SummonThePackEffect extends OneShotEffect { message.append(c.getName()).append(" "); if (c != null && c.isCreature()) { message.append(" (creature card) "); - ContinuousEffect effect2 = new BecomesBlackZombieAdditionEffect(); + ContinuousEffect effect2 = new BecomesBlackZombieAdditionEffect(false); effect2.setTargetPointer(new FixedTarget(c.getId())); game.addEffect(effect2, source); creatureCards.add(c); diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesBlackZombieAdditionEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesBlackZombieAdditionEffect.java index 488568c71ee..b4ade73721d 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesBlackZombieAdditionEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesBlackZombieAdditionEffect.java @@ -38,13 +38,33 @@ import mage.game.permanent.Permanent; */ public class BecomesBlackZombieAdditionEffect extends ContinuousEffectImpl { + private boolean giveBlackColor = true; + public BecomesBlackZombieAdditionEffect() { super(Duration.Custom, Outcome.Neutral); - staticText = "That creature is a black Zombie in addition to its other colors and types"; + this.giveBlackColor = true; + updateText(); } + public BecomesBlackZombieAdditionEffect(boolean giveBlackColor) { + this(); + this.giveBlackColor = giveBlackColor; + updateText(); + } + + public BecomesBlackZombieAdditionEffect(final BecomesBlackZombieAdditionEffect effect) { super(effect); + this.giveBlackColor = effect.giveBlackColor; + updateText(); + } + + private void updateText() { + if (this.giveBlackColor) { + this.staticText = "That creature is a black Zombie in addition to its other colors and types"; + } else { + this.staticText = "That creature is a Zombie in addition to its other types"; + } } @Override @@ -73,7 +93,7 @@ public class BecomesBlackZombieAdditionEffect extends ContinuousEffectImpl { } break; case ColorChangingEffects_5: - if (sublayer == SubLayer.NA) { + if (sublayer == SubLayer.NA && this.giveBlackColor) { creature.getColor(game).setBlack(true); } break; From bb15176a84f9790e8c450f7e9a686ef357e0214a Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 7 May 2018 00:44:32 +0200 Subject: [PATCH 086/158] * Fixed token ability (id handling) and token cardType (reset was not correctly done) handling (this fixed problems with copying Planeswalker with Helm of the Host). --- .../test/cards/copy/HelmOfTheHostTest.java | 80 +++++++++++++++++++ .../BecomesCreatureSourceEffect.java | 5 +- .../mage/game/permanent/PermanentToken.java | 5 +- .../mage/game/permanent/token/TokenImpl.java | 4 - .../util/functions/CopyTokenFunction.java | 5 +- 5 files changed, 87 insertions(+), 12 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/copy/HelmOfTheHostTest.java diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/copy/HelmOfTheHostTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/copy/HelmOfTheHostTest.java new file mode 100644 index 00000000000..16530d72d31 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/copy/HelmOfTheHostTest.java @@ -0,0 +1,80 @@ +/* + * 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 org.mage.test.cards.copy; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import mage.counters.CounterType; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ +public class HelmOfTheHostTest extends CardTestPlayerBase { + + /** + * If you animate Gideon of the Trials and equip it with Helm of the Host + * the nonlegendary copies can't become creatures with the 0 ability. You + * can activate it just fine (and it gets put on the stack) but nothing + * happens and you can't use another ability. + */ + @Test + public void testCopyPlaneswalker() { + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 5); + //Starting Loyalty: 3 + // +1: Until your next turn, prevent all damage target permanent would deal. + // 0: Until end of turn, Gideon of the Trials becomes a 4/4 Human Soldier creature with indestructible that's still a planeswalker. Prevent all damage that would be dealt to him this turn. + // 0: You get an emblem with "As long as you control a Gideon planeswalker, you can't lose the game and your opponent can't win the game." + addCard(Zone.BATTLEFIELD, playerA, "Gideon of the Trials", 1); + // At the beginning of combat on your turn, create a token that’s a copy of equipped creature, except the token isn’t legendary if equipped creature is legendary. That token gains haste. + // Equip {5} + addCard(Zone.BATTLEFIELD, playerA, "Helm of the Host", 1); + + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "0: Until end of turn"); + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Equip"); + + activateAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "0: Until end of turn"); + activateAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "0: Until end of turn"); + + attack(3, playerA, "Gideon of the Trials"); + attack(3, playerA, "Gideon of the Trials"); + + setStopAt(4, PhaseStep.PRECOMBAT_MAIN); + execute(); + + assertPermanentCount(playerA, "Gideon of the Trials", 2); + + assertCounterCount("Gideon of the Trials", CounterType.LOYALTY, 3); + + assertLife(playerB, 12); + assertLife(playerA, 20); + } + +} diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureSourceEffect.java index 72e0ccf17c9..377f649a94e 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureSourceEffect.java @@ -34,7 +34,6 @@ import mage.abilities.effects.ContinuousEffectImpl; import mage.constants.*; import mage.game.Game; import mage.game.permanent.Permanent; -import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; /** @@ -108,8 +107,8 @@ public class BecomesCreatureSourceEffect extends ContinuousEffectImpl implements if (losePreviousTypes) { permanent.getCardType().clear(); } - for (CardType t : token.getCardType()) { - permanent.addCardType(t); + for (CardType cardType : token.getCardType()) { + permanent.addCardType(cardType); } if (type != null && type.isEmpty() || type == null && permanent.isLand()) { permanent.getSubtype(game).retainAll(SubType.getLandTypes(false)); diff --git a/Mage/src/main/java/mage/game/permanent/PermanentToken.java b/Mage/src/main/java/mage/game/permanent/PermanentToken.java index c005bef4294..ba625cc5582 100644 --- a/Mage/src/main/java/mage/game/permanent/PermanentToken.java +++ b/Mage/src/main/java/mage/game/permanent/PermanentToken.java @@ -46,7 +46,7 @@ public class PermanentToken extends PermanentImpl { super(controllerId, controllerId, token.getName()); this.expansionSetCode = expansionSetCode; this.token = token.copy(); - this.token.getAbilities().newId(); // neccessary if token has ability like DevourAbility() + this.token.getAbilities().newOriginalId(); // neccessary if token has ability like DevourAbility() this.token.getAbilities().setSourceId(objectId); this.power.modifyBaseValue(token.getPower().getBaseValueModified()); this.toughness.modifyBaseValue(token.getToughness().getBaseValueModified()); @@ -84,7 +84,8 @@ public class PermanentToken extends PermanentImpl { for (ManaCost cost : token.getManaCost()) { this.getManaCost().add(cost.copy()); } - this.cardType = token.getCardType(); + this.cardType.clear(); + this.cardType.addAll(token.getCardType()); this.color = token.getColor(game).copy(); this.frameColor = token.getFrameColor(game); this.frameStyle = token.getFrameStyle(); diff --git a/Mage/src/main/java/mage/game/permanent/token/TokenImpl.java b/Mage/src/main/java/mage/game/permanent/token/TokenImpl.java index b817f3f714a..20a58ded3e3 100644 --- a/Mage/src/main/java/mage/game/permanent/token/TokenImpl.java +++ b/Mage/src/main/java/mage/game/permanent/token/TokenImpl.java @@ -33,11 +33,8 @@ import java.util.Locale; import java.util.UUID; import mage.MageObject; import mage.MageObjectImpl; -import mage.ObjectColor; -import mage.abilities.Abilities; import mage.abilities.Ability; import mage.cards.Card; -import mage.constants.CardType; import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; @@ -47,7 +44,6 @@ import mage.game.permanent.Permanent; import mage.game.permanent.PermanentToken; import mage.players.Player; import mage.util.RandomUtil; -import mage.util.SubTypeList; public abstract class TokenImpl extends MageObjectImpl implements Token { diff --git a/Mage/src/main/java/mage/util/functions/CopyTokenFunction.java b/Mage/src/main/java/mage/util/functions/CopyTokenFunction.java index 1c9f57fc6a6..c39fcf50b74 100644 --- a/Mage/src/main/java/mage/util/functions/CopyTokenFunction.java +++ b/Mage/src/main/java/mage/util/functions/CopyTokenFunction.java @@ -36,7 +36,6 @@ import mage.constants.SubType; import mage.constants.SuperType; import mage.game.permanent.PermanentCard; import mage.game.permanent.PermanentToken; -import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; /** @@ -110,8 +109,8 @@ public class CopyTokenFunction implements Function { for (Ability ability0 : sourceObj.getAbilities()) { Ability ability = ability0.copy(); - ability.newId(); - ability.setSourceId(target.getId()); + ability.newOriginalId(); // The token is independant from the copy from object so it need a new original Id, otherwise there are problems to check for created continuous effects to check if the source (the Token) has still this ability + target.addAbility(ability); } From 8f06fd130abae3c5a740e1293186e0102fa90629 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 7 May 2018 00:48:41 +0200 Subject: [PATCH 087/158] * Some formatting. --- .../mage/game/permanent/token/TokenImpl.java | 31 +++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/Mage/src/main/java/mage/game/permanent/token/TokenImpl.java b/Mage/src/main/java/mage/game/permanent/token/TokenImpl.java index 20a58ded3e3..a15d39ae9a4 100644 --- a/Mage/src/main/java/mage/game/permanent/token/TokenImpl.java +++ b/Mage/src/main/java/mage/game/permanent/token/TokenImpl.java @@ -108,49 +108,56 @@ public abstract class TokenImpl extends MageObjectImpl implements Token { this.tokenDescriptor = tokenDescriptor(); } + @Override public String getTokenDescriptor() { this.tokenDescriptor = tokenDescriptor(); return tokenDescriptor; } private String tokenDescriptor() { - String name = this.name.replaceAll("[^a-zA-Z0-9]", ""); - String color = this.color.toString().replaceAll("[^a-zA-Z0-9]", ""); - String subtype = this.subtype.toString().replaceAll("[^a-zA-Z0-9]", ""); - String cardType = this.cardType.toString().replaceAll("[^a-zA-Z0-9]", ""); - String originalset = this.getOriginalExpansionSetCode(); - String descriptor = name + '.' + color + '.' + subtype + '.' + cardType + '.' + this.power + '.' + this.toughness; + String strName = this.name.replaceAll("[^a-zA-Z0-9]", ""); + String strColor = this.color.toString().replaceAll("[^a-zA-Z0-9]", ""); + String strSubtype = this.subtype.toString().replaceAll("[^a-zA-Z0-9]", ""); + String strCardType = this.cardType.toString().replaceAll("[^a-zA-Z0-9]", ""); + String descriptor = strName + '.' + strColor + '.' + strSubtype + '.' + strCardType + '.' + this.power + '.' + this.toughness; descriptor = descriptor.toUpperCase(Locale.ENGLISH); return descriptor; } + @Override public String getDescription() { return description; } + @Override public UUID getLastAddedToken() { return lastAddedTokenId; } + @Override public ArrayList getLastAddedTokenIds() { ArrayList ids = new ArrayList<>(); ids.addAll(lastAddedTokenIds); return ids; } + @Override public void addAbility(Ability ability) { ability.setSourceId(this.getId()); abilities.add(ability); } + @Override public boolean putOntoBattlefield(int amount, Game game, UUID sourceId, UUID controllerId) { return this.putOntoBattlefield(amount, game, sourceId, controllerId, false, false); } + @Override public boolean putOntoBattlefield(int amount, Game game, UUID sourceId, UUID controllerId, boolean tapped, boolean attacking) { return putOntoBattlefield(amount, game, sourceId, controllerId, tapped, attacking, null); } + @Override public boolean putOntoBattlefield(int amount, Game game, UUID sourceId, UUID controllerId, boolean tapped, boolean attacking, UUID attackedPlayer) { Player controller = game.getPlayer(controllerId); if (controller == null) { @@ -224,49 +231,60 @@ public abstract class TokenImpl extends MageObjectImpl implements Token { return false; } + @Override public void setPower(int power) { this.power.setValue(power); } + @Override public void setToughness(int toughness) { this.toughness.setValue(toughness); } + @Override public int getTokenType() { return tokenType; } + @Override public void setTokenType(int tokenType) { this.tokenType = tokenType; } + @Override public String getOriginalCardNumber() { return originalCardNumber; } + @Override public void setOriginalCardNumber(String originalCardNumber) { this.originalCardNumber = originalCardNumber; } + @Override public String getOriginalExpansionSetCode() { return originalExpansionSetCode; } + @Override public void setOriginalExpansionSetCode(String originalExpansionSetCode) { this.originalExpansionSetCode = originalExpansionSetCode; setTokenDescriptor(); } + @Override public Card getCopySourceCard() { return copySourceCard; } + @Override public void setCopySourceCard(Card copySourceCard) { if (copySourceCard != null) { this.copySourceCard = copySourceCard.copy(); } } + @Override public void setExpansionSetCodeForImage(String code) { if (!availableImageSetCodes.isEmpty()) { if (availableImageSetCodes.contains(code)) { @@ -284,6 +302,7 @@ public abstract class TokenImpl extends MageObjectImpl implements Token { setTokenDescriptor(); } + @Override public boolean updateExpansionSetCode(String setCode) { if (setCode == null || setCode.isEmpty()) { return false; From c44127e238f6fa438cc65951b27e77cf62668c2d Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Mon, 7 May 2018 21:53:56 +0400 Subject: [PATCH 088/158] Removed gray background file from random folder (#3152) --- Mage.Client/release/backgrounds/Gray.jpg | Bin 1309123 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Mage.Client/release/backgrounds/Gray.jpg diff --git a/Mage.Client/release/backgrounds/Gray.jpg b/Mage.Client/release/backgrounds/Gray.jpg deleted file mode 100644 index 284a678ea9354777f2329a2658fb68f76888f9db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1309123 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 z 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�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�qU5%?NHNny?Et^x}hK6`Oq#eUrn)2-7oJc%;}^ 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�I##s#U{y(45nxe~&sx=X&qNJXK}>xv@|Y!-N1eq~0FBHqAg z3xk|WViZ&xoLBcgM)nGBURH4NO6ufxSu3Vz;UCVGTfE!4=&_bOTJh8`tSY!=Hiz}59aw`puQ{E2| z*sr3jL|-bc$Nw!#+_tzPVzI3W*M(TTv-b2s-<7B7UwktF?+>!FO7Xb`m33RrpN`Q@ ztyqTf@eLg|dm|QjTHOxv@|KpVc@h^;JEG^A5d9w%iqGq_J@|o!VpzM~UgR7ZymGVg zFHyMSw)S|jVNja0W~#k${Q%?2!w@@U6867z_GpghMJ9pRtOP6L*V+UfXyl6P)KJY| zqYoVqgktow8Ila5v31;KaXQ=M^q_5#LYGv^DnsQ1x6bIR>}Ji#5^+Im zx2=Cnk()nkNSw-Z4WOv!#_#q@+A;}=B5*EF)Cb+#m9ds zIoTBQ(@&*I4dM(t4Ohd)U*{_x#I(X`n@aZ$&>fqldB^Ij0SyY9DVDmO{!m-}P9}&J zE#(lS%qb%FI*Bm+)m|SI=D?izBRw(Mzb`60#Axys%c`}u~(>}c3sOZ zSIfYlQ6y#`TxH}u*P63X>dR)u7Pn%s7NgWCNbzV@X<-=j^w@|l2UC!`EiFa&|2R4q zN2d4xk8g%W+A69o8#)xh0%jDjB(LVd!$wn#*)sGsIjfm&!F1 ziP4E+Lb)DOGuLFu!ufs9?@t(?efEC8UeD*_5$SetUQnC=73IgO>oOrr7RA36c=R`? z2rY9QUAL3Xcccg$MZPH-l1x1DmO@HKchC^72smq2y#0_`?B%?Dd&0~?cvu{;aUi%} z%LY*#SrqT+eC9Z>A?egVpOgFLP>Nu!JKlU*n&H}er%&lg=@%s~&^p#tdZC{z6K*oUZbFgK8;a+HX7-b#{g;!0uw<1sMTNL7DT zyX6QafhtY)d=t33GiFbE+zfyR+;qZpr@eRiTcfNEA$07HB{o(>a8GN6*m@_O`1(S5aT(L(oL*SsB{nUDFDvabz;SwFre#Vu>mA)a8Ekw z_Zw4XXfwGh3YfhvPggrdf%21PrXwQsEAQtX0=K~x123d=gEEA^-0q>wDG-0q2U^1OG1?Mh#b^N)MRFYCm!INR87|0Z(|=#;ivtg1CwDDfvdI*Ow`!4FgL-<57+NCPR&^8dq>Z;EtK8IR46vfJPb_R4P~x z&b;XUzKv(3?7d3WHS8^?5tRnQEgGVvPBR&6@`=nlZ;H<+lT8@00)z&5O(s44 z=krV8w1|X;iKOlb%9|~nK|eskD=s{`syQnW?%BKN^38VvV+0xS(T1a2?L!R6ZP=#y1I|9-Jgcf>z z3`ebe#h`L)Crh!Yx6JjG6*PnO8M+8~y`BeO;TSS*6_IJ*~H{y+Sb+X^M~F%N-fGF*VPy#d3#O5_sMjxZQ6wj(&IHa)5J(< zvIlB!R$Y1V7S&{1A|NQ%XnTfuT=#@$|zrLzcM3dgI#FYCOC4|WY9�HcjX8hH8_oxRi?m#$M$ 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

&7+{^Fn$N`U99% z8QzD2IN7f(?$4KMn|68UCn#g3-#z&27VYhpS>?r>k3;nOID1QV4nZ62wXc*Pa~Uir zeti@Sda0{FQQeUO!&70ODF#WRqWEifMACueydDMM*JX4KoG*Ns<|twXA?HLXzwya% zMc_`5cVYF+)+tJ=pS<}xiGp*TOmT%|zC|BG?c8O(pwfav1zxnGrMX?wb>G6W6OKrQ z-V{$6i?sbg6;u_?MBEdXXuV9Yi9*bESJU_DtNHQr6SG@yy$q;91uPxfA5?c&-7re% zN^>qv0>je2L*`Xau7CWPY)gtK;)8ebtaySRa_XC#kn}8_a4?tVI$`v$#R_PrdP@?L zX@PSH+}3Nc1v-aowBb!5_x^HK_FHKdAcaQR_34S(lOd(=Vh^kLJ9H9|($u3$FvUPf z#gdG3^M8=68_kVjO$YsD4ku~XItDS?kDR5akD%a&W0FFr!kP9?i=XY7f`?Il7>MmX zG%$)+gHAfveP%}lH2oU?mf%~FA9MXpDj8z=V&v5n3dPXn$x+KP5jVlOic|YW#f-_T zf6k*h4E5cn8)76H^N0|#0)3-VND2do)g!gTowSrJ!=zIF zn4fqfO$lyLgzg(CsS21@2yLDIr5!8gdPrAD`s+hGALtAo^_ogv%nk|m5aQzqzZMR= zw+JN6K&|H2TkIuVE-xf&Ab7LKAAcJZ;^Tscbm@SGBoE5!I(G&RXC{r@J&}}!XS(B8M#GOr?s@8a66K2MW zMv=u>7-Xx^r#rNvx#aXk73;*AQOjHsz9KwlY_{~*nVdc6f&Br+PHIOM3>+Rym(_3I z71DLkqv4ryH{6rC^(c3n#(40^LPJvV_2O2{%pyQh;iEnbg^k{opJj9>7c%1x6n)61|6K8UDBl6%K7o}@S zKS>2UoICl7fa-Pp5V|VC#8z*@$Q)bVm-LFneU5L%&4bw&oFa>d^U#GKvRw5W%`D^6h2){$CbIizgfmY~TyTHF= zM;w2bP9FuUXYbaDOz%|2x8>z2m%-HtlNvDVZNU>z7EW9k6ed+T_3MP>3TmlY-<=3V zam%ITv+nBaW_?Ux0&)jo{-sBIbj~LD=)Uy(MzHR_3NDqI^a?czuc)t=^>d_A-c53V zI<5*!jk1RCs>GmB5fW{{x(tMu+hqEZ?0!jcyYx_fOEL^S$T6obFeTFN$9G&3xDpH> zcuMhq8zLwSjZ(wuLEtAgfHyT_3&ja9ztOoIFQ_T4224cHJ3GV}TMWXjKZNdrCf!^C z6jE&CDeHw;-NJvT@7@eI%JnfOZI$WwjI*JEP<#| z(pG@A7JuthEr>gQ34S?|8=(`VQ;S-opY-+eQWQ-Yedre#5fem-QyL+Aq6Uv4<9))g zVkSbKn~X&wQCvUH{i*xgfBaLg4dQnYo24V8JiF#L*$GbXdrgu@zNALhw+_U(2h3zl z|L&rKYXgPoLWBbx2~)l?1u$T|B(1p*xrt-naFX&6W4B8=DsVDBHs6{X-8_AX7yzSn zP6uS)>Eck^1?Pt%$MZ&Sbb3b5!&GxB(!UC4$*B%UgSOnkVZ-VEa+US4Ipcy(Df&u7P9-E`4T=9C<`hmyCx zVIsX`dE(UV^Nu-1Iv-nG+J83P+Oy54-0rBqj;(-mWjD#dX0^q#Y_{Ka_mCvPj2B$W zq)j@AyWGo-mbQh?qETbBD0Pr6K2O-(BTnLq=-vtq51t$e1D{FT7bZ5oNwDg1)uN!s zJ{6MO87EpBkR&=46bvP(G#iXI(T^oq@m^=pyNN<-(3|E-4eFGsu|8XFdt=)jbM=E2 z`LN!53+3h3;&kT)y3cP}cSke1eyJ-AP82oG#yzjm#{VQbBJFILX&TA5E{}p&Cemj+ zcHB;RGfepO&+#J~=5H`_Yw|pUrzqYGamq@mb>R$Z3!XtX;~O9iDkhZ<#JQL0MZ=NS zFfJ!p+NvV0-FYw8G<5&zAzj-8%1S1kB#54U+xAnpdavDDs@F`KX*pn1RJW{E_wss9 z-Tm5d9E(1lQL=yba3%epo@`&6n|GR4JDi(NxPV4M;CgTfd(_S&qbJOwYb*kyb|F)9 zV+b6+FP+IMKP)ELq~wf+{bp)Hq&2s~T~A;Siz=4>V=08=Ux=WRnj-P3VKEh5TDIFz zg4JzhBd37d@4|HvEALXpy$M8YVVb?6Zo^Z;*{TSaXF!o4o3s zv|6=qUgaSw`_i!R`GUwxPp5`wjYNGqIIu8o!oxkJ$8Ps-mYpZ!Ro0dPgwpEH{@=Rp ze>}UH8_}sEvF_GbY%!jz#RWY<$0ut8;Vm$6T8o^C-W8YZ%{m!k-JS^9?A1*r&aasF zgNRt099=68X38qNx1eVGrOc6PM4ez{LQR}P6eQLzIBqw=9-iGX`|AQE>_M`%$Vp!f zeE5|@0AlaD;eti8d<;t9Ij(k~qlTO{?&z!piVQ5H3zt45#9j41HYaLy+u!gZ%=8AF z+KGtOt^DPJGTa?NZrQV&fWIum6jXpRg7Xg|vDSXk0{P=TLDP2=Xgne=ss&d(3GjZU z=s%-QcMfCcZswAJ5I&RrqTxo|<%43mjx=YH^}StQ)XN{P+0i5BB`g(IpqOerile7P zp0>cQ*4FnX3nCl?SV-R=kmSV;6Psk7h5YfARXbNiQsOF^8;@EPrMT79Z=bbf_miQ0 zeKtwp9A?`IFu6AmbVt+riYf{p49QzfEqXqld9VCUzPiVKu7jLX^yRZvJwGLXqI>E=3A%V0FfK^ zrK8yGqC@}SZ^kO*hsD`&zg880>`7--wu&>9;qg{bvY%R7yiZ^evN$}(uf>t+^#po&N#YiVeI88a3lX7ey@mH`2BZSj!%ApO~y zqbxCx1cw(KFyACW=UR8~kBHWSE(wY2jYy@Se^R+jQo2=3jOzB^qvX6>>zmfN1 zM;hD*@u}lr*j2k=%!v5Z(XngcR}XwNg4!~2q=`)TtZHb|y!CR4O1rvz3=v$(n;>pL zt~rLj7U6@mS7T9;Lhn<=!%j~rG%gG0&pGGgkIrt*_)2nzaevVL4FPR6+nFKrTRK0w zAnZ=rU$f8PbA3gWxLleN{p}llN&9O-NwuXY`Y4q}*Une>huQTQB!6^p2IV%4v!!S&Fm zzcujB;75bB4JFw=^b;Yo(>M)@H7oX&B*DZ>KP|pa$K)|?azFj)Cn3p)M&L$HStf;1$<3go6yWI7J6^Htg4}}n_Qz+*F2LEpNS63oq%x{RN7Hd1zKlE zJq|IHP{6kl$O)dRRP~m*!}NYW3y%HojvYEBD5n&l@yf=`(k{iXDJ4hFTMp7w5Kt^~ zLN`e9$5@~>)${#KK;WE-;oYJVy_jWv39#xw1bK*X#?J7{szbHgc4_O_dQ(r@2$Fc$ z$zYAGuR@o=0abbRr$X7@K7Z#|v{7EXkAex&v5*lk&Z{5tW_8kdB;*?TMA7y*2OJh= z&EwVP3w$K3#*dpL6qo^w@YuOyTO2)G>Aap%K>qg~PpsGRx*`K0XNp;e>cH4=DYfzC zRX+W~9i+4mKXvEezHQ`&K{Z_qNBy|jQns>c(+j)!D?GRzmsAi8%ZvFzyJIZwQWxP zDH=ZqmF)_#^4nSZTmLj}0jwxKh+r(-rafUN^e3YJ+v7Tx*@Gg!)d__r4^>!+KoSmv?`zh44!%9ieejieTJ=bh;=9zF1H~`1Evte^Lpu)ojMaabHy{8f0C1Z~vV?@^JLLO;XWkd&&PG z1HYCyY&cS{?j)6KmxOdY^d9s8oF=Y^um*2RYdI6l$g7B6w{^A^Zr>4_n_Prl3rsoJ znt$r!#`1MyI8xTj{`QzEGlDKHYl-V; z)7PgCxx&Fqdn+W)Rw%JI_-d2fhj|=2IlWs2vJ~bByuUDvJ~J9_lrrKY1z^Gpuj%!}APf@;_EUH#rDexnju^Q^h&eAD`0EEVG5XFE+qTn5qP94aIiiYMo zb*i=rFk{{7IY}9GR?_yOmm6PSQ{PB#Sc{|S=ZaS($nD(hQ@d~2w?eF0jPcBEs%T_e z^HSk(H!^Hu!auci^9l=LCleXntnl`R3FHPMgxC zon$IDuUM=*a<6a&ssgHUk?TRN%F5JLQT-R_=!7R-x0yk1oK)s2WA?K<9h^Ea*TO9l zu38oBKM7<6ASA%skmekwu^NPj2t|wvT^v)=d;irpT92NGXLPim)-_t2BzIQH;7m!Ml$)K9tx-^ZKQBzNU`&wvz8*9KGTs z9QC_@Qpcvae>%-$zGff($LDeoWIdm`qCK(cR9jnT3?Hz=(F}G&Vxsu_i^Y`SxxUoS z5-c{%Jz!Z3L(x4}#l4x`B>OXGZq9v13bC+^AUr)nP<3F%e~U-oGP#mo)_3%kzOoQI&qOY5U25`aNpUm%n5CfS5cBR!^35K|CM6zje4+%ru?2AW zARNLu@~P?}`>mfYO{-~T-bi5so6!o1u-S+yN)LeA(WM^AfO|#{+egeFVA%tGYAMs>SH0m zYMh$w;0q~%nx$Dq>Iars9&vY?V42%PJ|5=S&2?Gn-Oq6JwNv20KMzWeFWJ4p^QW(x zIbThi(EF@4QC_SB(oDRURC0Ay0+E7~%LH0}l5#y_u)y)6f}ccxKHWvuvpAX(N{~Zy zbWJrjGbh|>e4P!e@kjH{eMUZgU7oytRGhd|9YXEVg^W@E_%wU!byT{jc+wu*g5>*| zLQpWC$>xiRwU9`;!22S}mFcHOZSf{o4>FI*TCu|38@>q$Wefo6yoXmTOS%4qdo6fL z%p7?px>%J(YO?R&gq^lp2+51Mza?49ZkxEs=GM4dvHFXI zkDUBksNe>Z)SDjrqrXko@;m3s?+Thc2Xp9{Zg7*C^+KE(=hx|3zRy8yXY6v}&sh1) ziQ)0I0xzYaV{$wu8k?3II38Fgv1sYWxF}n?H(Qq@Lwoof+#(mv!~;^QcicQ%>!D0_t*_Z7FAeR z(mkL)x#!6Dr$U(FVhZE2;eq;1gH6{1eu&I^cqE(5%BKhR*W<5a1~VN0lDFp@e1R7- zbOA1Opu)25vgy^ehG0jX7ZG2%FKD}i9^BWGFgG0VCMI=%obC#S@ECMnr9vHFY~B4b zo9s;(&hck4Ht5}&3q1US-Pf$Ly8Am0zt~-C7-pN(p1*&}f|uYIS~#0g8*KS8+1OzJ zlvSYRD=Qv_^u^I44(jNTmQ?O4)-IxDz#(gEp43}q~k~MO`1VyF2eK~*ma`YJ$jS-=JCtgWWlM4nYi7n2~%jpj$ zL|Y`xaE-8@54T>YhQ%C;+o@92QGAP=<}?8;*KcgCJDnMc(zsI{g1Z0A>5yhNkxTab7N>EJUVpj2uh?S-G@gLZ z+FRA|re7c&l6|bx7_F_C$huF`KM7kx#19Ca}Q*4|Ks?>u#`(hCu$oVa;Z~UR&8u9IbmW#mvba3ela04*X_8cPFiyr zU6>)4QHf4&C7H^`Imd zuhWIrtTudu9ijel)5>Mm?2_!MdoX#VQ@yT9sgYIapXE9fqXDFlIO!Rmgw%OvtWeAS z$ZlAN&`v@KK3_LL+vI4=p+)oR)zMi`{M9)`g^mHX_Y|%UZ>}tDriuTfj+TmV-!pP`)-e0EKlaVYiPK1 zYTeEu+ubg1La1rDWLm8+zPxA;O!EOrmqI{wA6|9dNxxw^(Yp4?6>JR&np<+4T}SuP9;OYg4f1*)-Q)Uf(`0?BDu^NOs{wR===si>oTe0R!&oR!;=)3 znXoHQKEE*B-TWPnoFF`BM=8nB_x>#MYEKWlAs|=kr!M1awXAfr{(ud?|(7`Yh?FH zI_JjC_^yJt^S~OxYgNGI<#pag!~sAV_Jby7g{d@ z6iY$~^S)G;c>>Yz8n%92^%fqo6#XX7NU$y2KeD18{1i$+y^!`Si5etM`}$ftds;<} ziy*AvjsS96j`^{vt8~N zROeQ@zkhldHs@$uMM)I>bHW_cqn59`UEAkMrgSCY!Xta{W9M`bibZaOl?+LlaxYr7 zm__s5^}n#4jRWM9_SnwNA61tc(<20&W=cB6_8>IJ3^yOHv{sJUIvYaa&2Y%muqf1e z1*>V`Y~OTn#b4p}OJm|^jHof%`xB){4^o*A@0NcfeWJMi0zxuzrnbp#o0ql_QopVR zDgNu6g$}&$o3>i&Sc@%ENc}cW=SM%^9`hcOZrG+dE5SxzF8!E2x!FcB`(uhFTQ(Od zH2)AzH|2w*_ugs-CG=4(H>OEW|H{pE@;kC4YF6uTUL z8z7JWJxm_8ru5t7NcwRC_cTrBS5qn|nrFnl~(Zvjb;f&5>N?bv($I9J`L4af?v+>nb}7 z5Z~xua#-#91b3r6Ht@y0pZsR=nT|k7Ztqzdi4_r6 zx@NQW8po8~@hK6G=DfmBYdqd#pDODg&(7Q)`bI|$lulaEve@+A#=$G6UcnS4{ooGo z)$gbrDJyh)SRho#D|IcTo}2yFaOoFwZM`uz$GP(4gYg?kYnYI>8E#Msyg;>XuiECi zG6X*|fPm^;boNU#^bC+zvskU;)c(A?;+p$KS&rH`I1}Xm2!mm0t3r^07?0!s7ZBQI z0fxK2YSaE%_J-`_RB`X+s%z2v4**Q+*TYuQG4V}LsNLq({OOOY&VE+mj`n&Xe%o9I z!XRl%oC?LunjB!Fs2Q<1&7dhwxkHjl;m}sMZFTu-(@&FR`&T{{6y9ghzudC%8|mA1 zo*}_+=#>enDNeq_ZYK5qJ6}w2Z1)|;E={l%WsRF+tzQ_!_yG3)c_zb!_LtocnStf# zB&*0$o=y3^wTvoEUjyJ8*vM1YzPTAsFYQp&)ZQGD5Ui>0=b~>M@@?_nC%JMTu(_N< zmfDbXPMvyEttVj0(N-2qrg|RD9<$ReEbLD|KU{y3wDd#9TktWvbPg3K+)Tl(biHVo z*nB81Z-DTKghX#NTZ6gr5bW5jv<7C_0iFv?CkWVTF@66eq<$Y1>$R5tDZ}ngy!CsV zPe`?ivIPt)Be%jb$xc3L*cnc3x%fj;Y6?kRa9PbQmy=tvr0-#p6k85;&eM1n zDS}TqpM*`qeIVPaBLND#;g^shJAxu469;=`MJs)GOr!kV2&qcNr*vk<7PsQPb`e zm1%vuOuNJX1*N9uJm&z*>gT8pC6VII8$Vd=zN@kzX7O~3Qk;C|7oy5b0%osgpNDOa z)8De}S@F*wLt7L4HXYe{z7)L^D^mI$c+j0cgs{3$SZ?fkx#obqFiwCdbV0L{MFzKa zK&s*Dghsxq!8^+o2xi1yd2bzdfAd=vHgnCN?FCNitie$x#SI549g6q+e;raC^DjoC zPiFPf8K{3DS>D;6C8&cS#EyaeVZu#7L_hxlYFVe@%AP|d%@D}7DoWOz)4>NC zDzQNuSAQc`P_~WO{0scr#%nXV$R`5slBvBQs5-V;{j#n<&W~IU8dr#KR$DjO)J6#| zUUZ4MdP?hiD{fuYP+|nT7INigb3SCKeP1IJf^l_+1%?(LjnOzvu((%MB~UNSdLiAR zgAg~iawT^_vlZevw~C5NKU3Fmg0mf+r_a7jLTJD;6PuVRNpRB)djY2O$w(5U^xnN_ z99ufadC&>~Cw5+puUNpTI>qw~P^JY$wPBkqc3~wrK@~j1_jT?$x2B|84p_i883Ppn zr?&9Eq{cK)*iVOUW>XteS%Z0&8Nbn#-MsER$%YIiu+KB%I&&$As+*=$!Bv$Sj%TdS zJJavli&lUA^c?y#N*W3>S}uh?SpwhS+$BF4LnEpk57_sJOsjPFa2*!sRa7TtopL-h z*ktAp-LGI)n0DwdCe|jkOnr)Si#Wmzr2mdvM8wCHl~>al=3v-bIy-nd^uPdWXlZR6 zJNNPSOwsuZ{Nz^bUx;~*Ro;bH;S^yoJ6|s;KK>69Sqlp=u}1i0;s={gpWTMkw3lxA zaNKELso8X$3t7ieoT3a;M35Bl70PE!FE!AE;KeHPiHUR^Y-;Thvi`WnRxUh+ zhN6I^H-cv15`66S!}14;sW&OJBfYdBOHLg6r?#ZFru2g-<-&pdLM5gk! zRTN*!G@CS}D+mKpPQR2%a`M@(df|odC+|IDX}mcm+*R!02jr;L)yr*~=An&)C!-Il z%V4aD_VUa)cy?TSyE6CZuDma29paYS^{|q3`wgo1__W!0!9Xe9FS=A1kCj7IuS4{T z_ndm2YL6lMSdX9Duz=L~<<5^!`2FYA8?qy8Q9=HEd%f1FzK5&EX+e*(vIGP;Ex~zA ziGSE4PFFhU>=Ej8N&6>srt?yJk*or&s$;75KhE7r;UXk}*;KMdsQfr%yw`Zpne<|2 zwCX?bBYnaBfz!#&!hcTSh~z6rqKc>te|&1XE$9{bkilaigU^^}B~OWTPdvRoyfAIz zEVM^R%3~E^6rfX3#g3ZZXZ*7K*wv43wax>IWFRQ7B48<6)TH42&vpf~Pq3ETo%N?J zlU+MR@WOKPiQ(FTix*Da>1PCJ5oa7NdD!)RwAH_HxwSf~=kcI+d*>j~ouDF=I)hl} zY95N49PGeG$Lb41iM71o^~2ny#`0Oq�M{_)46L9~Jnei)QO;j`^~emP!SNDBSvf z&TddS=z-tr0U(l>M?|GfHW)gDoKu$vyrK|I?4Xj7 zUu_CYC3U_&e>3wY#Eh0SMVMV`zceb&%5&Qr`tu&#*h=I$c}sv)BcV3`dsiX}D8wgr)O`8D{fp&wxMrZ6KWM>SZ}-n|8Fm zx2@{fQ6+(E!tr}JBjc?kI_0?c(c7eR@3s66$Ii%gl^t;^0RdMk_hSa83#Ogp)@|;W zZE0eH(({4Ojf)O9eeG>YFNzdK75c{SN#<9#lL4(S z`xMrgAwdnDlHM)Red_201LlF!ul6{ZzTOk*=RLy62p{p48rK!2E4pn57zab0#7ZFM}>@U zj7cVVr5{&~jHNNC59Kv{n^Qc+G}Ws{3zB48PBGE;le9nt^~{#xnw{K>UAqojBfi<> zShr!?=#%$ro1S%1C#_HWel+<(S5~p8l9g%hK4J*jL$b<8BR{zvUD~PFYA~DCKI}ee z({d`f@9x=Muag`TbqX&Bjji@BEURkb}U|)Jyc2kR8J&0D1DJ4&3Wd{lL6_sHU+U=BBKn9I9$sEhd@PlJauMQm1 zkn?aNndi1F&iecm0RKJLYg~?=l_5}aZa+h=|FE+OicfrVZ*ArMNAutVbs;3Gy=Ylp zarSxB-WQR_yXEpZhnVL-S$$I*l8Z2joI0Abo4HBScC=!W*7FR`rj8;fkDR|{d~YAh z0taXDX`ixwVa;&p9Qn(TQ_}^*f@kAFVGj&bEa#lUx6bl}S~OYNX7vt3*Z`AqdgMlRIv=6P)neEB@5TLnsCz zH|8DEm8_+W^LPw}dHZ2n3gn&?SyQU2pKQAgX{TF(4 zmpOgb%~*w@FmUKA91ig%uV#LuGvw9oAf45o>V`ve;@|lVwCL;DY+vZ|4Ff#>&ctt_n)@Z!!y_Em)V=7 z+mfg=XJVVicQXe{L-}?%o@vz{eRzs{F+MN9V}f#LCb{2mdo1P^L}78bpyy27>$mgT zs*}y@-f2G;>pRDMp($kl0GbJ6hiM3nMWmfTxwxq*1^D+s#|{Vl6xIWYdn^*0r?Q=b zm3Rsm45!j}r?kh;tW~~do+y(1YSXX1N4q7#JUF{<&~EPmx7x-h)f7Vf_?OyH@3%js z-_eOyvh3%ini}bWC>$a_Xk4jHmss@^*l5WS*+D9SAfIi2@_ZPSz>bI?FI76>8BK>S z7bFW4Z)R)#_e+^u*XX1W2uUFD0Lu_Dx~uMMjcLg7+c<8}tZ|~YFBexlcoOpaZ73k~ zF#J?P?M;S3r~Q}PO~0syzUGQyb%gM6M?1lB3u5_`Cj*b^pasEuYf zc*~`!wkx@_kXHQbT7=FJ*dB?V zB-3`YWio&qPZ7zXN=dTngrsn?)0o{jm6aEBj;4OJufnn)NoCrX>M4*-U(%xD)vURR z!6X4bfqm-9T==edM`xZ2wWq*sG867=IoCRAeiW=6XtK((D-Fj7(0mK0g%ZuIg}{EJ zDiBpx?ti{>K`MJnaocy8I?ASZ9~=+$ITenZY2~}=n;K~-Ay8`Iz&*}Wf@5VI8D89? z(eruf$$%z6&)@@@a(2N0Af=&luyu`)iuONK9gAF4;Xe+vAr*ZjNlo>TxbSbvnW#rf zuT~&Z+>G-tN%lg@Uz^Xd$eUMcF(FeNI7pl1WvU^0`W+I6SH$d%J>%~7O$4`N;gb>C z&#)D==B=9}Akzx`JV@lc)#1<>*{Wynx`n}xvVX9>=Sy~sHOf>nTuA4&%r?A%r_7h&^d0S2y!rCW#FgW;vmdASLe7&^=eO0a@zY8vZhJ>~sTIp{uzGjzqp7_TT)T=#w5CrC zq1l3<`ExjWhF$2ry{V?H!}O_j)QlZJ&Zf}i>AB}>d^UnXVJ&;zl9b26@K;!U9Y3BY z7uRkRRKt_|a{t`y>Tm4-)D2V#E^@#3#Ml(X$#nY<6trEfMH1XUyXtog3vjKN-28L8 z1(_RhBGS+|GJy~ax>>`lp{u76%rzP2J|xYwwpUb4mfz)k`z>0CI3sH)Q z9~E-XRA_>m^VqtDriwpv6Mp6Wua9eXInWqUJbut*qR2bn=3T>;l=O;^i$O);T>hb? z*%ax0eDgk5`dKiS#rIG$!!4QIiXGN9#IXBx*j#F-5#$660^E)(sB>G9Z&mzcMMl`7 zt(M8D0xw2ylkp7=CH=kjlERH!HG9$IEy7wLr&9N|B5-&rnrIvY;zxY{^Ktb&fBdqG3OjLOzPCS(I?{e#5jfz6Ah60)91e`TJuLVp!f8SI!io~f}M6mv){XSp>F@YA3B4qHg=OV(*aD+{8+yuw`@da4)5FB8WP&r$*eE>T*VzP_VK)#j5zAI_Ks`U72 zuvx;`M-y=>o^@Tx4d^MR<&4XD{dPey!R*U(7v9L?E}|(CE$U&UII3C6Y;wf)Ra+@*u)0?F)D0Z116} z8#8YMw9E**dt<6}SsyYRLc-Jz6PJ*kd*Jx_!k*`~97bthQn>bo(Oxh2FWP#NvY^~r z^T%l_(V{63s0!FWYmlLvSor3~T%ck5GyzcW4owOm%ZNK1O)7h#cDU~zXmoZ7{NDsFd|DznG@YOpqM@(UUfTkSdo zCXdfgw!67ZzKIff;-GG^5uqs(b0j8$7mno<1(j{46N5~%(DEcwOU9HlRfO%3>^NMT z=bUeyY_!5*Zw{6lD-`%ERpiT@l4Gb>f%q&^m|7QB_g$@n9SE)%6cQ%+|~8(a95$N<<-zGD+($p#l7=Z=zN&pRaCYOzRr1uHZ{>#u8JmFWKtYQd7K} zI`=t*_mgo_;aFX6FeA!15UUIKM7JTNw3sr&gQ<~$B~^_YTxA=vj_KNZyN8170etlA^7%^(00n_bWN zHCHM_OC75sW>N*supd>!shpOwW2vKGXH~b|?&F_ro(+*?tGB|YNPu0vjy`8rxBus- zYk$Kvju}+h!r<5RTNPXaYu7g|>ZJC?;25JdYG1K+@Uf?iXv;2kR!2zins%GQD-%~wx@6#({2k6Ab`ygj0iP5b2JuPc-IWrAgwZ{2 z^0L@oD$%zoNF&t55;jeAd?}s^=*m?><$?$M9F5xLndbkXC|cnWdI(SHQnUr!tq-|(W#AQkv13xHRKqEOfc74YJQNjTd*=fViiD>}69r-RNAh1j zb8D!1A=4vREtc{Ojy3p}=PDYH_JpQud$5(AJcQ=7GcT-z(~wcxQaGluT}YRAk{->r z-Js5OQL|OCfkt{*)i_+|&Zg$HDEej|L#aauM&~LK^wgBN$E-hw{Qn?0g_&De$&xmW z^_rYK36}rs*iHi<+85SY0N{v+ad=B27w_MC{1lrZ(<1q!`g@l_kr^>cM}F@ZS2dqY z&UAO^-Icq0(DOQfdY%zEmyVNVl1QXDf8t|nNMpN_g!w{-v9PX*P{MUg9B=C0EcwH- z&~=P+!nV3mqPytdm{`bXvd$eUwljiesI8P2$rRfi*DhQf-qOhBcg>$-3 z%$mCpF|ua7xy`8Wm*Ro=FcWd3#u!_MwB!2Y5UTLhkGIF)NSvn>{5b9mu6>Z9)ogAW z7`cU1l7YA@>B+AJf{UqMU~&&Vl@~T+v4=Po07h8pnP6m*?0E3N9sOBwPI&d65Pf1( zgtG)S*0WBsy=%T&^-E4!3DN9|^u_AB}a{9~}p5Qij#b^t_ z%Y!4K5fNeO)$bScLwab$vzxZb5?pCX^e``cPAslEa?`znz;x3(I(cHy^^`j1RSFH^ zxj$58&9E(6+Q{kk1#v5D z$;z2Z(V_DNyR67+av+(Y|(rjiDHU+mNQ(>n&>I-nD>}@HkBz68Li**h+G;<9ovfbLok0ajcUqAK6u*V?F^{MLhiC9}6))8elHC7v zHmHIE>+J;ifV{G=&5+&haN|Wo&#~;pmrm8VM+tMUGPfkNfj^_Pb=v7SX`o55wRNrX z5;(=>(C7R65uQzI2%XUk2WK_wZKC7UyqKjJm4nb)$6An4iz}UzlidWZ2g&i@%pqD7 zc7^H~-)xgh$*uK+QilxO%K*qG+a@>k-~}jZkEH+W6V~&_EgK0r4@5={s4tmHqGdS7 zpOB19n4>)&EZX9RTwtu~^rY4Q4o_sSdPW&Y0Z$dWFY;O3Fglsx9=2XN;xPm>YBcuX z46pB_Lx4U-s0?yHy`{@OnOACk)4pj#mAUU@M6ar((03W9oGeCc;MB@j08?OGbTL@R zr{2%R`d{c^W0^kh;mWwd9(4iNmww8T#uCQq>*<0U$7V|V1e?`%3=t|s4{1 z4u)d|s0R~{5$bwE0NMRr_D)0%0y1_MF84zV0DEarBbjG$k+iterlbm05y}!CC?RE~U9-QMGruc>GA$Sv}LwSe|rSGO?8xB4d7sPW6aA zZf(SqY2hF^^C=_d6e32OM8JK@X9qGPa0K$+7(bnr?m-)gfy>T!Nw&GVgaIE1Ayrge z38qv(UY{vy&{oW8t4^14iW8DY2gP-O{evoL!5o;r-&X2FWiY7=%7=ra!g%H& zqdC`;%p8UzB8z8v-egmiLLNjc=cF{feuEsgWH0g2_K3p5Y|D(`$7PQkbiz(EW{~!C z?g*fJhI+v|SLLTTXe%X)htqAM^!i0gj)aDqC{vQqQ+cjzDF=uf?jQ&K4!Rp70;_{9 zJEWX<9J%rIfw0+kYodh`15WH*+xC-@d|fSDVO;TRo^B#Y)12%*w%LJ=NYMXO6%nG8 zA%b-5$7vjNa*~_oug!LL7FfN-iFC&?P(PikYB~=!+oH7SVkSD%hFfR-?Zbe3 z`?ckjZpL=&t|4!|&HH{*4gfmwajAa_Q9f=)yjr1zm2n&NF43JkcHPLRx?)l-MljpA5DEC8DX$qgB1fH*hmN-j4uEp77iI(92#i$dp9sT$9w#LbMf?(Ik4r^+M1nT`GwGvO6>Bkf# zS_L0-_q-Mr3D=k8X*bw#>f&#RgZs5)@)gg7LJ3$TV3JK5E@gn{;N6nuuJbk56?4;8 z;38!!vBTZ0&xhC5J0uD01q7XE^K4f9NPQKl^DvdM zoi=tkXC0lCxcNYw_h){`o)WgQRg_KdO#}3Vh|+hb;Ks~jjbkb??ciM{+bW5YI*`td z^L_WU3XUo)^dK@68}XAq`MrXNHCg;F~yj^DpAf6DQ z9mVN^&+s5TFxK}bQR=~2tUKLDa%f2ND(3BJLEG?&lASqHotbG*_=ro9_i zOYEhUDh3YBoR+^(a?_XpD+_QG-~e#WBxifSy`javip_#R`_1JrO(cgGNE zsd2ky?;`$6mI$!rDj)myq3$YMrnL?-0vpRMq$o;qf8OrTAJioAl<)E2m0pYNJM{pa z?&xTTkD5qzc9s(;eK}DtL(Xa~V^>x^lIOm&-&4K4)iUhW;4mnPSG1AHM4y(s4IH?7 z+nG91$S=lZ|L8jzCUMYVYPYC(qzX^d0$%{=<#hO2JG<7;_G^t5?S^BDMdPk)gQNA3 z(k#3$CxsS?bUaM`nBP2Yoy6Zn0Q@sdEAy4SET;2nnxdvf>P21H#^TuIjJ@zun?CkM zf4K(k!1$7tii)!t9{(fkQ%pU>0i<>5l02+J^q061)A776f9rgPFIe|9IUaU5#oEXL zx3Bc>n{COx@o-F=tF}X{vFC7Y@@yT*Uq}N2F5h{96LCp7`SlXLSfRLeEH%Z_Is90B zEX*kV={;y164*{>_1xi#Gy0O2HF2_PYPxm<#&_Kg5F@A~$<+NHCGM~nc#Xn^wF;cP zeVzD78gV;X&q4$w)0gi%5_h`*KRvFJxVLDNvj92IxAN#!4#%yz9Scj^g9t!rQHVmg zJzot(c{_$vYEnUKen4LSHQa74brfTZ*AdbIKg#7>N&$zivUq%6rw zZf`rLvTfbz$bm(>wd;m#YO*j^c)~yg0^E={*$>+)wAM<=1J9e1?}^7XOv$biBkmJU~r5*zj|n@kO|Y;WERQYo(Sl!dd3<8{UR25PC~RwM zNBi8#)YJw=N87=G&y?obfkp{L8OIg{E=X(?G_wVQi*c*3-B5U}S`KB2d0u~Ib6cDB z%&Dc0ST3FyUtBkHLnTDe`UJT&aB zt%s9VheUOn8>XNcD6Jn^_Jo!`JQ?j5;VklU=gCZs zwQlxZmp+}|c6J;aIhHoTG2?|@kCZWk+%nwK^kCzZLYn)1)J~)Nc<>i14?fNi_4nmx ze(=g#*~Q)2<$hYMoo}Q9q{_3TeRk^nkyqbnN+;%!&WwQkrmgJ-N&SEb zlT+*58?LXy`20J57L%>u$FsMP6o2R^4ZCEgXjFFME^qG>D`Y_x-amwUac{O zlA>PBxVRe`F(N10PB#C!^NSG|2eH4osc7=3tkGxXb-4q1&2O(b>)~waRoH5vdBQ3l ze4Ixw(I@U)WndEMVPn6Q=kjB^!$Zz*!9vZrpN^o$Atv zw1>C&2E8OnhlhjA_k7o%#L0AvwoNeK+bAR z3mGzkMs;uH8FBl|T(+NWerHYBVfAB5EreEyR^9tekOHQiX|fpCTBa|wm*~mr0%NYK zF&urEuUMpi>_kYoGS4Io2XeS;ZDCHyqZ@EUEIQct}fE}7J&tBjp$Esy@}Dj z+Ot=Gz5wo*se}E@6MFC>!g6O|)!##>G~{}sO8rV&y!Cr`w=MMzI)-1>D1#qw;1B`Z z5AW2&mhFzxwovg?w&YXNeVeiJNwnK)|5?2#g+ztYcaK1i4-Q*|6dOJsy$MY@?~P~Z z*$*?dk`_dG8K$LB)~5Nf580%?ys9Vzbw`){D1*N@8QHM?jXh?*_jp_1reLM)zy=kH z(|1|w>A{$n$TYahwwVbR8hd`Uq3Td3q(9dynJ-ZZpsY(6UxS(k&h@o2)%i|F{dwpi zgL^ds%nj4TzeYGjAxx(?0{T*YcLMXnYsqUb0kuP*kIBE`i0)Tmv%CU-P_BoJ2)A&u z^e`eGz-N_C_r1JzP_n8_`x+}u}6y+`=oh^3B)oDno=fC-bpUKULcTVv4DRZheS`!cEAte<7WC(hQoC8gVoTxD3qE+4>~!4e)_8&1-Y%D&1mw3Ve5@$0*gp+6GLi;pHV zD56V!kMrh!w#_W1WC${?y2bTWcCU{;hce`ERH<8gp+<+r_Q$PsgFZ3bK)Or220lq~ zJ72M7CE@ga83E{{o?cPzp~tL|jpr_1Y`5G%)%xoT62Pt4`6tM~XsLv~C_ps_>D|;E z3~$GyRIT!^1t?QEAJ&5aQ}FGM&?fIUEmvR}7X{7mQ6$xKknDq8Fq008Bfj6$J=Se3f#+JOm0Jj8Bq=|e-ajPj`Kn?!nPcR zmIN-lp6xp~j`5?h+D&oTH8X=)cA=jmR4m_b_oqxxE-%w3Py{MkC#-+d1R8TFz!M}t=?CjCUZeHU+3`Uyn|T-AWo;%_W07C7qx}xqlx!?N%)5QL?^6P- z(6=^P!ieOXM|JJ4p^C&ARR}P~RUh=Y?S@L_x_*r-p5zg3nZ9<{RfgL2L|9lJrcr6q z#;=*mN%B-~giy_oUeuno!yunfnqbv`lK*rhSub>SbecYXse~5%O+&CzISh36FA@~{ z%cFRRY=mc0CiYjU^H;m9uA;0Y`o|@j z)9lWzvh!gSUaQ9FaM(b=RX*5tt||DRUglf9_BPb|N`h`f?`0~enTp-UpD4#$t$rgX zZrjh|5(`!zA;ICpUi_f;YI6PN3GY#a9EY4fXJhZIc#cZHkE6&pLDUaFy#a^g|031U$)k^a)>ra#hg#%J06(jYSa}oeYu1F zda-)eHJX}*|HFUPzP7M7-f-z6CTB540#H+pZ39NRIPdPiP|6?b4 zrYnBly*;NoS`cU}=`{6XTzPucP3?Vd_Es5|Z;!~bpKG09TAjV>7KU!*{rNS1qJ+(q zA@W+HhHp*%?~*qBs|-1zi77mA^P9F{L55*xh#D>tE6Oe@YOZH7A`;8YjgWT#J>*xb z(ieB>WzC6vzod}t1bVWe-lmJgD&h}!{NP~V?AyzY(UTeB#&*%0hz~w?mfnyunCrrb zph+~J%05H<_3`1+H`52Zd+XiH?aJqw%QGBDGO_vTk)BUq1*02(t&Rd#Dqf0{VOM0b+sJP1A@oAf#Qn z2SrZ_kQFXg1EI%^r;XHbQef|rdvGFXsC^ga+HdPJ)`yga*kVB2Gn$%m^F8>c8y;fd zlTO;CLe26xaN#MsG*f*GPvi>~Z6#u5<&?f!_ps8DZ_kyB7}VvwOFq=4n_h~_yQ|l8 z+kCQVW2ybkDv_-paVm%}dES$4yBnf!)WDMaU(C3He|P9<$M-8Ym*t;w*pgHpuk7L7 zv^_7tvt59x^Nh|8%KzAL12^-1v6N5~J(fYr)tZ?+*7K<+W^tW*?&{y}zA1bihs(_`Z!8K>OChRH{>N%5BKp4)f(bpF^ifE5(!K1v9YZ=5E67`M2@&ZNzM zQ|Ml&$r_7~G}brmUhz6iW1s|O-sI`G@o%kfY{IQAm$oib1=x-++1+)QunSSJ9Aj8t zl6JX0sCy65_6K2-C=9;^kx!Q++=DG&b-N{knQ$nZ01=4g zC3~M-FL=+-<%tM!zd94!aidD(f)^C+yjyg}><P=dS6NThBWN{Yu9(Ov_ZJ72`ee*WBop&6|v$+EziKNFhm$ zU|umC)MkG2{2p0@`=89Uh5qDpgzuv6>H5rnn28#JJ-HU@f)Ln*NA;=PxuQ=4Dp5vk zI?zf@$RE9|%ieT!3Gr(LBsb!GVPz@C;pXx>Pc;oY)fG;%hk9y6muYft=qX!!bv_yZw4=Gw zLVJO$PN()IQ_9$OZNJwqbh{_SrpX_Hy-RV{HT)1fZ#RK#bT3! z0Zd(E?dK_WfJ|Qb-r{&-Y=D1ZaT%n+0t4hITuIgd@d!Ozn+Ibn5IrEFHQ_*hY<%V& z4A#YI@s1+R+3&qnDk%~iRFVKi?LvAuSX&ee%G`#Z?Em#9SYmR6&kRo`0|B9q18w-n zoA6otc2H%O+q|MMHgoq66rd`sSXqKFcDFd0C*8pG9}2(w@%Hy!-k#6j|L7lSsy~y} zcel(ms`zStMGVMqd2GZ!TFR%Ty)|m-qMj6e?lgYd`s-v`7~llR+f1hEvsmd@GGX^Q zO*;ywC^aKEwgaC{S#suUW0o&eUt)R*@Z0)LGNl029{<5@=y?3UkSog($hbAMy(2#O9O(s4@>f00PsH#q2PuQL z7hNn~AhHP-=6@2WcUhw;3&@g@)FdaqJ z^V@niqo-m_BXZi&teL~O%#3Fyyy{tc{Jp0a{|-0R&xubIVOlm`-Yn~SnU3a!Td#Nb zO8hiP*ww`FSP8aA@<`+d$|{$h`LY~Szq^M1cx&*$Wcea;qd_QV;; zWMZtyw$y+{?=O{-hA(m_LiIBG>^eEgLj;iBwUPf`S@jgkaJFVU7j@_q4Cp5UHn?H* zzBv-V*4)W!3Ov#C5M9O=Q+wy`NN0H>OgJc(Sw#WNd&;H7Aie>!+bYRE-wNtFdDwG4 zgN8#CA(8$XgOdjfN9M8;52X0-SY+H`Q3X*y-r>1;#4gNKqI|o*?)Wr)nL~5#j-7Ng z@C?0p=VH%}v_^B_K0AdMMRKP*@ufRm{ocI;L~b|FHmk|o}=^;7ZQ2Nb57w*~21T!XneJ6!RLT=)D4SmmY26X?BRTs3`Uz?5OP zo7)X_dC>@C1(isjlk`M(9hjk+5x6|>!&G1Au{_F(q*R(}XBAM|PR+KQ+@oQX6i$hh zx~Nhz_>ye$n?9gJ9}ZBr>?vb66omFr?z8RBfkazYJN4P|2*fAlP#O z>;1HOufG@-PV$)lmY-5*JwY8$TogspsZ5ZL=sZC4?=~|bhCATetf}Ca^%wHrcEA#< zKk(l~wtju$%JplQmdf&Ikv!i(Mm5+At=K%;!L}kRyt4h4l^hpE>%k_L)D`}L7tWlL zt!r;N<+_~y=OO)e2jFZ?{T`M;1{%f!a!ilU#e4DbZYojmK!PRv_7?k+a5IWVF@rOx z>wz!syLaFNU%PWc=fvUvL0;v$*ct0SROuYLY$XPo2h45Wu8VW2J~z;p7K4N8?1O5w zIC-6GlTy}3a(384@KKZLp|tQIn7%#-Wsmd-6U6whA7}G)L`x2oBvU@Tw<-T3>`QKl zm0T=MPDTIr;`mRg#_*bLcfiy6RC^GTYXP0~x%fvK`tWm*T5{4j_|EFdxZEmh8=DDHO|)TP!#HW%}7i zRg<;#B*j5%ntp#q6@+UvFMyAJGoL7-84?GSAReal#CDBsI-)3k%^tb`Rz7G%_XrG; zx86%epL@k3ZZEjgY2a z0V_Wwlo2SvbNoD*N@Gndb&6(1dptAk#6r60%!8Bn={jPR;zLID(s1;2cId1>dGY{G zw-U!ycr2R4N>{UQRSaw@V(z3%{s-wx%}{KDN?i{Cv!FNe&luapvebC4w@o$YI_L&i zG3up5%0)#VXgZOrANVNC1UL;3wCyvNTTEhG^%N_dkC5bgWCjnLYp9o{^t|V4c1+b4 zd)!2lt+!uzJXOm@VE|2-b5_)tqtVb>nBe97cs*>i6^2IM>q2x}2HKjSO4rNk!qsWR zi>eN$PVbCc5t9&vk>~zvN=bMr11B$>@1c$}Lur9*RoIQ}Q<-MeaM&$RXY7#wVQUtP zEPGMyTY5C5h@I~UZ6UhV9KTt0hrif`vXYlh8Q-k01_EqhCZ@XSUgIz^l11uRDI9D` z!=Woe%IBK$8k;My{vw8bH(5t!M*k1I8y0?WS7k|?TxD%=sHqn7v=hO<@r}}ho`exh z=~RydYX$Xm)=2UM$mRA;JIh<~vf`QSO`u^f+Kecmv)p%YAybo9cP)ZSwYjDyX%H$ zHHU;lYWm6ghBXOzbn;1`i@$q7Zbq_6Js!}NMzJ)*?)~2kHGRE6`so66@okq7*Ug1( zXqY~(8&+dMSSQAgmm5yCqkWg=Q#X6A&#e5-x>hW`RIemy0i~C96N1UXGd_bVT!KSF zb+!E5&N_RXZAl>)DbBpTGuX=Fh3ahmpK=H#(y@|*FT`97F&06J8h`Q~Hs zw&q`w*JLlAlYgZ{% zP3T8Nq26l(ts8gbrAz1Fo$SZ2;3Ae>Bw7qMXRMo%%fmSm4jURIqp->uvbFM%x;=1B6bH|&U- z1l}b|*hvySc?@|LoAc3oL@n|mrw%;zXUNxLOS5LubFXi0dRV_6TWCwA$Fv>UYcz;@ zKj}t@6Xz8ypoe>F$6Mn-LQTFHTo29xi97@rUH(Zoeat?S@FSblJ&Ly`zkK}ok8SN) z2pC7ZO^-W8VGIk0ynfmf3mUXMLa-5`)}9&$kC}+h|L50}Uf)kseh3082Zn|HUcJAJ z$ki9)9nruHWJ-_zF~}{JeShX-d|ted4GKhDHId0x%O_Ry-s!FU(P4N0I7xU=; zbgkZ%;t6KeB_H*JjsjXBb`2A7MU!ovj)YS21Z z`a$D=$}5blM#T~MwR(Ax*dTym-#XF%`oZ;49j^UEa@wiIVAHYO{(G}jy)AB>r9vfU zrYSFA@B@>{(|Oywxyg9DuoIG$kb{W@Qk7ncI|fW(CM~`oL=hBWIH$oE*nUz=t%~y0 z5&{@+pA~g|U-PX=%rml& z@Y=mejwn2el<4Fn+1d?AM>KUP7{p1P>|uf=Z*t=mo#3}0yQzUHniAKCbJcqyB8Mf= z-Yxdk(bkg049`C^e_i}Ba8wnB{-)?HU?C%@Tk3Rte1oTC+rx=40}Z$1E@lq)05*nY zUcc2>6oB7sc@sV4zyvO6AbkF zARksdsuA)^Tp~=fkJ~1Et+Jw=BL$I>IWg99n7+fSb>Dz8T}`blRrANKDWWI(HsO&;I%$1tGCkAd&7H z)Se-)RRB?Fg-F>%*N^7f8ji0YE*OWuysIgX`$Y- z7=3{AtS)c1h>3FTFi1L+9zi&9c4lTUZZH}?Bl}}lc9W7E%!Sp?5?Db!|sn&5*oTTQ6iIImqI=? z8K+#e_}aO(LoVKRh%}Je?e!t=Tzz=L+hKM0flA$nLA5I7r0~ttLe7osV|GYJZd>ZT zxtZ3Xl9qpdX8mh_Iin}7NTX|$tPy_HneQp=@%+xeu~Gk$F_iM2CV4&K&aWzY{Nz|) zaSA{LMLNZzlK^zUWoYxokr>U&>63NngC?4&1?P~N^Gk~*-N0S!Q#?vIq3L*q+#A07 zNXMKWVd(*}m*mY3vijMxuXt5Uyjwp`Ys4XcsGo6`9cyfUT20R9_l z_cDH(C9`={)aWnU<>K*caRm?3Fd`ga%i=|`h*{Q$T`@wVP@aZ~Ie5G+(4!_~`KINY zeQ|A2RgD~*3XWR?@rF<5j%9xQ)lH%pf5P!x?X8{o$K~(8=wyB^A-K&>g&u(5-RdEz zR#Z2!VAwH__v|g%DPIHNIJ(@JPjI8hEipcm0L2d+$ zl$`oJm^6dN8!Yr_j6bPV38be*o>6^9w~U^X4@xSe><)7KFFH z?eg=B`Iybv6{WRx%br+qGJO#P#}Fv$taZ$==xTVlCHusY=n_@6ZWD9bHeC3BHZm?C z7um=ShDN{MFoSuhTK?Fhsb8VA9z5SezSxFbRBN5@b)R2rbRTd}0UL2Kyk+C%o;o{d zJArpgR`7a`Bx|#|h-mWl&`5aur~pCeko4~H*;KcekLP`EJLEh+wDv!UO9NqN)vc7- z4ul?AY@KbA7ZJ(qjVX1V*|TkLctphJ8B>o5%^RL+c|%oC_a@FMAx}Fvh26E6ye_@z zrF`qp6^H_wdOG|(^0#=)D|d@)cm3I>SQz_O^wNub<4`T|iuh8MgCl?+@?}fo4MV{iyRtRA}=Z)3i~%?1gbr)m{@YdArKOl_;n%E?a?oFRiRu11?iMj z2%1(d8L8$%{oM9Mu#`+Vvz1t)>fE}8wBl^QmT~mHP?_{dyYdQg=Y%pi90=n3aIpN& zuCo;tZDCKgA9jE-rv*ucYh3?D0w8nf8<~M!u2E!02NX}(gwqgblGv2g(6WePlf4cQ z#0W6*6tqC6ta^WRUU+R}5k5T&qR$6$|It}qo?~>}HtED~=n`ekk-X!hoHJZY#g5zx zOmJDqCnboq(}2wFEGkv9%1wyBYkY)S21x)py)oEZ%+e(X5_Cj zcGEpE6uy0HWoGz0e+r?UvxbX9r=MIy#QE}F$ozL_p%t`FCkEtT)`0A_IC+u!I8+Rys^Uh=eHQHgB3-#Ea!OCH9q~Zd739k`)4$B zL=C6MFl7Md>tgYk-A_#Vvbc24@CkKu6Kqu>5Y#<=KQA1^RvQd%TZ8Gmebn;#Q%Zc8 z(gxv&yHL)dUdX3xbskeJxc>Mwc)2|xSyuRu)(}`!yPq4*p>7pQPfp7v)6Vs>en-pZZS|XvZ0{1nf$W z_tq1dCr9YEfM7=2ZHtljr#aE&yszyBfW|8M^5O)7hfruhd_Z zBO-YO8X*`!-Y-lkN9F>YNCM|u*O9$)B}nUZE)iceUI^uQ3QG&d>bnV;$vI^*7mAFW zKPlb7(yWr{>}S$8i=6lBN_56|EF{ORi$Mv%ag;JTT3eygbJS7M;i4n7?rX>lpJJ-ECTqLWOIhF?I>L(G4g=|v_n;VQ2fe*|S*nb$VI2v9_E-5SFg?5DB&Av zse&)Dkm0wtXoQpK%Y2t3VIt%Li<;=Fw^Y5n!be%@oEvB=Y@WFug^LsT8Oi;h(6aJ~Q_3jdsdjtzk629qfrIHJFkF|0Adcl#@6P zuG=-7TeYnsS@f@u#MV(|DPDKrXX0+`@(hOWz>b~LB>LQ!$RAb9yyyZE20 z8z?Z({j0H=MxS7ebj~~FI0JRphzV#&r)>Iz$D&8KV>W9O;{TwY&dF)51}9dbHs9BS zrIolktIaulKh3^@faBr*yZX70v03ZEkUNrE*k|Xo2>eW3z7Z{e5YI5={5>1~Q~Cm3 zwoz?RUeLR@N>eBY=LYsR^v$PAd<5@pJO3}*jduzPsmr36NQ~_$$O41f zj~ZfV&qf^JFaQ12hZSH=kz_wSoJW9u;i7wF@?x=eHx8NH*=BKlPWit8PPghN-3d_6 zX&QVqQ*nq&S`V&X_3q2>jC24U$!~yeBoA=uxEWy*I}y-)xHghkcZ6u{JzhFLPx(=gz zDSLKhHg1X%s3(r)Cdk^6QPV4p*D|kXe|>^VH%-ia!nx&Xp3XyxVS;-vM(N(cc_}K; zbj^i;hC)7}%EZ#s?c(|BxA{GCc*>IEwD8oJlhdl%8u-bg1s(du0)yl&y6RuL}`~(iDu3dkcfEKz|g3@1LNCi z4vub1{Vb(+4b!u)e3~#9WLo-QCm|xa;ySzcO1Uo|ye<6uBuJ+M94+}Pvt^g@kItk= zzfoc3dOEpJiuN~=_lA0pfADs$d8sngv_0*zTvmVs^xP}g3BKtsgg353D3V&t=1)#Y zr7_f|;9b|JJm>a}uq4(2)AsE|H~mCL$VGPDw*Dk#JWL@k1Rg>mn+V1aHSZf5@1N}T z2X&!7+>+IBz6lIU*kmFx?$FP)6ZMWBRO}r1b>Ao4kB<||=1vVNB1)Q_;aBG5=D9na z)@(cd6aC5Cv=Ag_wP4^$0>gL`pBZymtq*hOcY1aWD7z2Q^laD+E6V1g2T5GfB^(b>cHVdQF><*-U*?phwccj(n?TNjhx6+R!-sy zN_6qj*_Zac;%|s9bR@s-vx}5|Y9oQAWrvs4)tvO|AOCu;Dy7n$9)(Q~?pT=&4`DXe z%Z5*>vuK-t)QhsiOyWdL7T|!cHe^*m-s@IYmh15%8FmU`$iEOV8ii3)AO*sDU&ErQ zw)mL6bAzHx4XQ`ro*BW^0*)uLsf+$!j!@q83quo>TNyCt1`JshF|fg;1hF`O_`G8a9Z9sH3o zw1*oCJ|(AOx}58Q){hBd4i=yyQj{@K)kKo~(BhBfHo7XL6g^)V8gzA$| z3U&_Ii>@Nm_{rI-XC@ey(V*$@_h`rI*lw$YN2N7sr>>@*y2c2tz&`HpP1vfH+|lib z!{*Tyq=C`QOe`GYZ2OLn{dQCW)30s-#6lVok_QWfg~jm`zzoR{ z)fwhiZuH{juDl%?JXFUO*Mo~@W{$q{l8Cn*F@3KG4Yb%JX$HcjI=!?~g5e5#Jap_= z3+qg^>7Iy?<168KkcKprG@{;VBjh|{o@Y}=8Zkb&^8WB;pr5X!T;favEa!!-C4ti? zG@pg&f?NZD?s^+}dtB&@izj z7DSE+Q@gUndgojZ=wH=*f)`zlO!XBb>C~0{HJ2}Os&*4U7}Yb(p}91{b7$v}pN){Ef3_=> z;JfYhCqO>oB8+OarInIF1UC1rp2>dd2!ZVm!tL0ondWXkfY>+VG3iR_t5~QHXZAA5nJ9TNGI0#2@gs+Y^ zYV9Y-pg`~JEhc35pDTwtY_m`)^8EP{m`(!_$}}7D2=~Rc+k7_8yq8_KKkqNDyFBZp z0iRg(DgdOa2bC0dXA*hPGnt)2 z7YUYzbXfF-Hd53_1A}$MbJSeE3h0FXdMq6a_$dm?%R5P7tkQO zB`bv|uluCBq4PV$cx>KIOTh1W3SXJR3gPOvcXR_pLqWP5UYyt-vP#>cAeu!`B98mGR4?7sE zucsT5>tH(iRHX6tQU3(}5Q*Ku89qk@JGkR?cCZ=9p5z{Pra)uhnXpqo$a%`xkEG>hEeJJxyOSQ zz)oh%caG4uyZOgWjy|d$O$;lDoz66|ifRK(QJ+e9$jF>ht|S!@EqJa*F1 zT8n`f*K?ZuwdY`q(=L<+L5`pg0>&N%!u@8?2Q5lgHfxt#Gw0vmT>QI85& zJ;D*jtnN+Dj8~h~RL&+h4{qbx)LTWEm<3HbTBY3Z2wDrgD|l{CgL`?QIKhw)S!*5+x1hEl0}3P;SaZF%yhf?nAGv0SJTem84Q?okeu5o zlEEFxC;hJH->-+Rk~`N*BY+F@9TxYoa4@^YT?1m(7&(P;u$SJ2(&fbh*W!EHFuH^d zE_xNFiG$Iqg@?l>Yru3GLAmm>^S~TBA-RQLgI&=J#7%~%TBW-2h8D`)vTl~ZtT!G3 zCW#w3YtbhHb^c_g+FFLWmO-ko#s|j@s_5IaB(@n_ysA*%!Ly%b(*%8&vL{v6Cb`|W zZDI>wjLazuZf8s%`@?nY^iQdHSq)&SZLwVHz*fu%etK~7!TRkjn2Vpf(kAr4eqqVJ zRU}#U{966o3A#`)fLr_iVrsTZWBq@SB5m#VI9XAz&jWB6QUs)8iIbN{lav$^0{7*) z8&H|z!&r-?4J%+O1(nn`X0Cc_h8%oyu<^G|@aJDCuP=p9OIHO6@%Ark)`yb%R2@j{ zc*8Z*Pn@s<^}v>%2t#>?4iAlc;oYnPC3IM)o2V5jvd;y`_9o8`ly+$ozOPleTKUb5 zHEnGLf4-xiWS%(NT8PwoEHXqdy_oCP z!yq$pmuLIa)dTYR7l)ay&cRVoXM;u4ZY7C<=XdLboT&tVbEuWuS3_iGk^KzO>a6o9 z=6<3b?6%;^&3|ZkK7QUKOF<9&H+oAUi!=alIZA4$>V}jo8QXb;6RncLmP5iLm@+Q2b-WocsJpy3Jz)}eoWbt6S>>w#iech@j=cyXel%+IB>cR|L zDgo?f?eqHVmeT~hcmS4PJdcbVWRbg^Zp^4C#~Jg9PYW2P_w<+Gn*Z9fSdssQzBdDs`R%|o> z#uJ?|K4R!?t5JPtzB~yGA^s}wbQwTYr!3j_KiJ>v3geXP71sS9 z?lO10rLEw3F2_b3`V|s-Z|6wW4u{Q>T>j6@U(SmZsW#o8Co#xdA7LLzsllxhJ&L-P z6Toml5>`|+czSzq?UCIiZa1dIu5a@Ud%@z$Z^b2Quu6!$3rlMK$8c}16ClcAVd$v^c*sP-UfTH+qnf>>(l2TM$NhgdD;imIQP#ZwXl# zbdy?{+WQDt#pZb@XTo*oBiDV8e5I%pVxc{OCGfyZ^Gt%(nNO}ae(GyVL^Z5g_7Dlu zkqgDV%W4xyB}M~s{0St}*|-M@Fn-UhjG%vz_auDVz_FV9Z&&tc{BW^n!G5c;wiQ4v~LWQAyUe=?+#Z} zk+AQT8eJ?#2m9Dl0;|MJh0w5YXEfW{y7ywUOWie-r1L9z8T0^VZ=coB<92ti=Z#RV zI1w193&CJ5ej8!`l}9)C8@z9o+4}v($dzC%mT#P`srP_TSsN)>;cfNw3q}us^;6nq zVa?L9YXxR>%81Y9y6gM)7F#Z~^1MBhGY0ZHO0(wr?&%q5IGEVv3Dtgy)sbMc`?(fK z8B{mDRBh$b^SrMwk9zN;>{waJV`*My{u(vBOYsnG#8Y9II%zmKi=ttOu0s!fEoVTH z*}=3&QiDeCv*Y3Q>De`T&(Be|eH5m>`;;ygBA58M7k>|zkSVH~r;u`q;7KwgxxZk| zzP95S?26lG`j+DZ!cUCyUr`E}?Z!)t_orco*UIG+zT~EZBd2rX{|7l}-fj4&XAcN^ z-qDDh9>ekAS2lE0^uY@=^{7Ank;o~C+r=l z-Q@LT|HX$JQT`0lD&wH%_3^DrQdT582UjSPO|N=J)TFN7m$Eentb6Qd>9S7vk$>eN zHEFHL^(N957!(cJ{=c6ZAKlx8W@`q_o&sc@NEX%8%LlTH=V4op6kUbb=6I6*(Jq$p zRzE!Ij*(-w*tspC?*GhuDEm!~Xo8bLM{`^+Rqd!U5KlQ+#Ru6M?zKbG6~fHx_EzQh zGMK#H#7~bz|AXun!CbPaM)YfL_P}!HK^o|lm;c;YwS6MfQuC7cDNSOIWj1&vB_&=h zt{d02&zhx-pGXEb>Rrow*?6u}W9soyer~r3Oa0*+<`)0u`hN_3Fy2FKW&1$9W4-UbCU@Ve7)DG}|@eX+_25 z*MD^#w1Y@_x<#lT8}<2@PUg>9t;%g(PHjB0C{GW~gWUGr5-}mBsjW<(F+nrAdhB@V zm)E`i6y^Wcj;}@}RS-QUJ;^cQ5kQfZT4%zPON)iaT#vR9K(8(J>M_P zN8^f%^F9sJ`O%zKF4CVmv8TeP%>Y2}v>MPj6wwio#3jd__me>H*-ipOQFUa`xT{T+ zjIKi$cco525_BstBd!-;t!Tw4<5y-V0&%Y>PHi@L zcXW9wkJ%+33xSzXLi7R4(PJM5`!4J+_3EG95;q~2OS=x(>Q<_9;x}iKd;C6jfP{@-tdxIh>Db%a z-wX!a&&}(+UzRAdWA)Y}g2>dn%U)0#9w#g5j+N;DXutPr#>h9r0aod0CsCpA_`W9; zYkc%Z%n39yMmBq*ziu;j#u)xs@e@37K&JA6+EfKsXWh2-KHCj0G0M-$WUUsvf0TWM zY594#-sk?SI75fwRKB^Ll5B~T%A`h~2YIhvB^4K_* zBddCcir=UPn%MN9;T%sdZw>u?zTfDh9BEUO>IAdr)Y1k)8gcs_{L{(vX{Qa?EvAYq zEM-Y1@RH}1?EZdNfBvXFN>$a=f#{4dkV!Mnl;@457Y6RH7cs^&9x1VEt+t!Dp|4LG zT?}!;A(67#PtR%2(*roX^1bZgnB6G8`|#B*Rx8pbU5P??@_K%vznV_;_Pi@0*d$-Fl_4yN;{`G1i1$7Mcn6d}dFKbcpw8-i+9xHAfb_%@3H z`wOEhyVK1eT(N=VKvqPYXE&Y?&#p;q3V~H2RFDA7lcF*KWWq<>L$6aMd>^%#o|DQr1KsjNCMI|s2*>6aS7p6=r58ppiD9vo@{^IGw0xxJn-7DB znB*(z_#5it2GJffbGqdF+oTlgRI9TIcVoVmMDGbt@MJvWQM`*!x1@wsC+p+!3VA_1 z)IBnh*#lCzTYXYiCp1{1~&r^rM-kqj2V|FoSLzM{n* zY=cRvw_f60n&1lzGL z*41#w;>|^2O2cG|M#>S)r^(ApTCBA~fAs*{w2}gSa=m!kW%(m5w6)ufWBoYaPP=`6 zj>Qtb$!u;5ZJUr-YsA4|@ZoL4n(;i}|16ghSb@+U<^~`Y!H|u7}m$E`sHLk$Q}b zaBX#R;!Aj6=DS@zfn9Vgk0cb=ciOoxxfy<5)K;I(2m7U!3K(qu{p9U z35kji$Fn~9qgTg)Er%uiBe?Tk-4xUS800bNWIvn8HjN>wb1UT8p>?Wij%;W>84N zI=@F3r|wktdL}Lf)Z(%v_1iiO zBzZun*BytOpdHNoPz9H;KvAdv>AAf`)!lF1{>A{)we?a{u^QsQBk?+mol=ghScc%x z9DUm?h`IzJMzn8JyXdr3y}i)AT$XkBUXvA321% zn^_VoSM@TmpGx5!ItrYC*&-8(b zNT7n`xGLG@?Vtd0g2jT>=(X!sQ@iI5Y2F-QV5~^ejMT8MNmIbVA*S>{PZf z6ccY}cV2$XoR6--Evx}P*HD2{S%;p4#Y{f|*}>A_)D<1M-b71dYa+>W+fbWrO?hP` z=TC}FJe@m?wd^#!zZub#f2s%KaDJKRSIx0D=j?9fts%)ddV6Y09w_QWGs;RWg z;CVC6bU;rwX=dsw6Kx!L2zL9r{WO~e9IT>`V+^V)coCC9zzjLb4~9qb;MGd?{3Swt zo*0M1l#KR+m3qn)VTr%XBh~534wk?A)p%3q#7vOyCvLlDOkwaoGq|4Nh3t(2>r`s< z`S;MTKe%F=<#wwc=ME@Dk@4wy&Fp1^AHUlyTV)a*;Xgt3CKAE2apsDScy0rmVlBbX z=emR*F$VT_GejV&^=mqC;w94s)8SeJw)Zf$>%MzpeCu}S#p9*DEMNjflym zqJ7Y@Q8R2|+m<@rqVCK0Uc#+3$uYC{_oeh>Tq$vlJSa_de(-U{KR@?m9)MF%; zLg+FJ`t>hu!Ho|9&L9_NWp$7E>F~k)dLf62Opic zMsl9KI?9EtlXS{-iraN`dvFLklJ}KBk{x3MC>1QeU zMo`0Z^{sm!IQHIzy;TE$XEmyg@QYD#4s8R`ZVJNQL#e?-CCr!`Znu`Dp8(w@OVALq zZnti$=%rhz-?qt8)?mrGkf`w&?L<{4dGXAlQ17au*pZCyI+)G4y$#k;T;-gK{``bj z$240iEU(cVs1)&AOjFyiJDHklXGCW$@o;U}c++*mQ16c5kr7iMbanN2n*N^c)zo9q zJaBEFLBJQubgzJUmv37f)aUmXy|Q397~xAE2Ecd$3?CLxb^lj>oOJP5Jl;CG9ZWO% z3okuJhI4jRs|VywD98nDP(>SOHlA~fw6`f3%f`>TEHnKP+I(#(TNcyWN}!OApHk^I zgGegj!xF>|Xb-uloIbRYdHf#imK=@7?u=KHC|9675BH?OV$Asi<>(voO971F&gK1W zVQU0rhJ{M2~oiMiKhd;U#uCM+v8>TN%in4|64q=AE$iZhJJ@$48AKczO_ugJ?)X! zz+xBrwApQ>=Yu-?2Q)K{aEA!YQxx^87E4xKi7wl^Iqmj0_^WW(0NVQM*~Ri-t4AJM zQCR*<--R8JZxL>OrWfA+mUq$kqi(=sUEYiv9E^(9i(E0xR`*IUmhR zj^DHW>Qx52o{!xztN{>!sM8Ly3l zq8@G|+&Jmm{|25>A5fJ_wK@s4$;* zFeBn2fbEjG&sICU0K&r_F*v@)mYM&UWd~rhnT8rlB zC%c2DJbO>_@V$|_pSL4uj>P1WU5AMccw6rib9eSO{Ng}>v|~2bfjcVnNQ2Az@igCD zJ5v{kl*tDKhv#|CjJUmN*u2nby80X*J8RzKQc_{NY4eJM-zO$!urxi7znMDz;M^PamD%Z&?Uods*jJxI z{H6>q7K-Qr!=fz-pOZA)ZYcUIEPxiOlWQBraD?xIqFHPWe3#q7H%{kJJqhq?R$OE1 zsC*7x5l=mh0}oWpGp}By3|uCfP5~#9`!sN#Hxy2MiB}PK`OnWvN7I%V)y2ubjwZ>0 zre(GZ2ie@oN5*uyMD(4QL^hWFY|jOM!y{U*Bb%8msQ=V*S|#AI6nw?%WwvbB-R?1) zrf^YHW>)0l4Q*Xt(z&Akf-BjVcsf~!x@s<8$_s=-8>XxTb2c35{I6N_`Pt8>5P(I2 zT%c#zp)`LT$#q-$l%gH=+uvSq_G_;?5})C_4j^_CECU6PYMZW(Oy%0?6TTxiuz6+V zj(Jz3I9Ko_Q(t227oBvIvhHDB&qTJS(u{((HK&apTOn z3N-`qFw1i(^Jk3dcT^L}b#Ed>p}qiaLMn2>yU8MqMbQHx$(+&Ll6Cm@z_dqs`MayS zZvTUv#ej_3+n`;7V^=|J4~HEeYD_)an`OH%b|QY%UR#WPddbiEzshX$Ls-DqZqU#n zb;vo$WhlpuQr6}oLcr*Ad~et0D$;a@$B2CQ!BCfX4La=J9l4w-%*e-}pNJw;q2Mud zt}`u9^LBeGJo^JYs{)>zbH@AJjlC`dI(b@*NRS3FREy(RM8vlFkdKiYs|xVCCip3{ zU^RVwtM2^v>pSmE{16Y-fXSnInqS<1g1rKA0x=;Oe)Uis6yFWWZ!3TID?&w*>$}G@ zu{#`xD1MdoudsPYoxzgvU3}M-**igdQ?cJx-)3Iw#2D`k*C?P8VzQRy8q`UpLz6$4v&dm~(} z3um@$&6IT(Zgu_TFnTDr5}wR1P|+oId1NtRaCuc^J%#-BE^ajepwBgMMQ`+(7uzQ7 zpfZtr;v^wHc+XZRf&($W3xZrq&x@I0rBN^+KZ&&0Fp;0io)ul+T9txs0a-W4)#ZGn zu`IgxP0#dUih6Wu4B+tby+Pta0>6`$tTXXJSPH`3f}5A`Ir?r?7bJIzSf_ebM zP~^&Vu}#kR0@q)ZX>O%5o(s`lU#9@Ozj?5_-e1BYk~)gCS6h^0Co$?8J!UeWRK@E1x@9lVYdA=Aah~IKqVkMa}0o8S80ov^1kH zeUsX4Jz*vF-(t%z*BF5qasul&k3MD&tGsxUzV(FihfVPQW(V}D)X{fkt+e5iJq%!X zu{HWzh?2FCSD(JtZ*`W5s7u*5oys6B66MtAajAc=RJot1NSgZr6EMLz;N_i}p1*3Jv ziiOea_jFQ5M$gq$J43|&H?3V5eVoD7W&VNkkr~=4e+^PH8<$5L&56v&# z45`se^Op@FfKKT5PiOe}TBbr$$QIF(C?c_(s={#a6Y zFr-18%;ZYwA3DJHK#nLb?^S8FrK)Ig+euE2qmxQd7-4cGr3AXs4s##FK5RE_ovx0E zbp26&;o+)jAxp%f3!gk3&cqS$MP>DOxCVy6JY1b)2KqEtwFIo2@wDR^W7YwsB6kLu zx#GqjzwYNAQkzeIN5B>D$o0!xI59Fui_;S`U^j$RRv?V!`3Lb|XtrS^alsB;ArCMC z{^R(7dkBiBy&_K41iYjW6D}d#b)Sk1r}v?(*JVB&3N0qun%hIz&-4Q8$J5)Z&}^7) z78b(GZDx!ZDv{XdcRHvNf>b2={xAb2R{*K1w;h2*#PWY;m@lTir@3O8Z}XtqlGX9# zR)X8xAXm=yyK~#<>4AsbL2tX%5ocwMJ1*FQq%hjx(DDpZTbBv|L5r3 zWP8hE0N^8cHni+Dg94coC z6{9OA6XkrF%nS=#B7A?Z&+lJux4GHgd%d2A$K(FcIQ9?-d#W7TI2N#h)D#0q%g@YM zh(FUFy_x6VvmG{~zVY1Q9H|||;2deJ^VL`TKZp`d7`}t1m7_LQT(=6jVvD0kAPkU* zMgYE6do1w<&c=-fly5+Sfx?tAjkeg{_IMIKN#5d_J;JuZ##wx~ix=+>rX+DJ&Rd!{ zbndc?3wuSj?K((#j$+4@lY&1xj@A0LhZ_&I;!PbKy_vKCsrVcp2#3BXVTDT@!BlBC zj^e-9gcuJgzKvVt*?vBkBwQ+VeyXif<>kTin8Qr+>t59zJ`w%w5V)z9&Jc#qT(&6^ zkBqaTW6+Px15$_9`fq&coZ5w&+?^6!Hs&++seAM?pxLA4Gk7{?6}s~$D}hba1dC2D zhT{ZsxA&zTtP!F$8s`jlz&I-Cy}I>bsiYKq(tY$A&nrQ?$E)7A5dV^a6%=c`QRd+F zB8mNt#N1hfZHHF39_K9YY)YPuAay#TrXJN7_~1<$!9}c5ua#?urkCxo)0F;QuR?{i zNzMTOC35)UJ=`AS(Vt6>sS_(89JMOKKYsRR5uh#Y_x~;Pv&H)N;=-Kq2K=eV|HkwZ z$L95e&GYB$t2a;)jyxm{;+@1Ekk#G^jZw4zm%Z9+++*gC-HODIWgI!)Kpuj(XxP~b zhRXEnf-kyfMYX(@Zly4vcW)5gLy#6PQa4t*i)5XSBHF;~KMVKf0YmyUjeiQdNM^76 z7PI3r$-*?S)XboJG5~QKzs>9Z$iTmkO8rJ|N%A)h*!$*;$Xp!j0n6#ai5Av=HQa7~ zemAy+&0HZ#QawsNe;Xl=9psCh2bLXHOPd-b@B39-ufIv7g!KPvoh^3Jz=}Tm=Ra|e z4!!f;A?B-tg6U!eg%c9Ce&}%MG5G-c!?}cDcJ;y!`mKtNka^D(&4O4ZBjPo_qt!zg z!{8)4>{QIF-(|fA2UgN4e`hLURY)0%9mdNX5}SmF&8@x%i!l1KmKxe{9uaZ&(Kb? zix9W8V7HoiMlpj4aQeLz#1G*wSlpUduf@pTrvX64K%GPC4XzL9CiIjW0Ys^i z5s5P~SYn~~#XnA%k@wY6*4_RuWoxhFgqzO@6&RPryb5g`dt;nUK0QO2b?H74aNJWq z2F`i>(B2b^Vkju=G_HsWay9PKMzB3pJo@$|rcj69rU@F%hHXg*%2H=S*#>ro^*T+U z%Ao{Anzb2gfq+L$#lf^%#!g`+bQU}9aT}eS+~*tftnD;59)%xDmbJ;}ksS=(`76IohbG8%pQbo4huMC|$uBL%dS*Qf0H zpix0WI(;C#{F(c=z|xDn;Bq27jsgbso1ivMJ3+5E`tQ|ih_@MsMD z#5R2N-g75SdndxA^EW5y_$5|-uUwlY>C|10fSo1Ajx*&Zf`3qC|cx6a^>oFsM z%w~hW93S@kGFDxO*{zVZyGvb{O&WFgYB`f|%`!y=rE&^e#OpGhNDKYrGhF!?g%;tM zkD_f|5?R(Q>eXK*z0F{l7!O1u-GfgwJXE?Z$U5{@9>%c)fZ)5d`qJfh!JTAmrUPR-wF0l%BdGQ!dAMW+(&B3@Oz?+|yw zKT_Ox8L8-|w#m%AerAXMirHgl4RCDV1(wZ-mNJ(G61vH^v|2|(;+PUTP5J0=*e7-K zC2G39G6ClmA1tSw?s{F=I}{F1eRPYqwiFnPS?2KyEx@~7wbrL#fiNK=(S{M72;_Fz5R5#++>SXT$_#5jo3WzZ`v zxr`517atrw8(39&1_-T$8ja=mhj$eFfv6{5m=MWkehw`jh}90P1lUX@$3~r(SYz;q zZpzl_9LvNoVv?7luCKD@Qg8U=0I84y$XA8$S$|TP15A-q(|$zbnWq{N5(Ffss(w8F2@W_>KYP#q~})*k3zpZRl@Wd{}8f_^NP)Nr64z2 z!RneEzM0>7lGA`9_2>odndC#Gc7kkf4JB1i)Xi)6RvhMW)wCO(=P9=BSE!CQTUw|dn` zA{k@#SA?0?N1!~64nE@v9^}G03RUH=tc&u64(&*d8*4F zK9l$BQTAFVRZy9v4sG17d>R4{)6CM%b0c2{X+&&TCV5_8aV}oCR5EbEl}L;X#{-w% zN-E72L2mCtR}ffPdKc*`_;CAwojI@kHGZ@g7&gP*f`OV#X((oIo0MCtVFm1tQPqK& zmZ=~`)V5qj$zsj>Gr`LV`(=PufqQ(jUf3liBpg+3cMS!sYTAdYuhi zH{CTM-aY){*Ea2y;p~=pZ(?oR*XNu4Sj}5h%g{IU)XJnccfWYGKiP%VDdDFM6`0LO zsR_{P(@IDGjK5iX7TXSXaQU6v4AfEm{i|x=?OPSd(Z?q|SjRdlI)J&%p5J2DPbv5( zpI*uw>d#)<2&svwhObF%)@PXX%K2@D8|xl7%60n`c|T@S*R=ZY7sh+bfrNM0g@AcE zt+z`HXLM_CJeKYUaV^=y1Abcx1^`kOIFjMgauFI-w7R46zcbpZ0DI+p9vu_j;7)R> zSwQOD@2hcd;VaY+=ojTSDH~W5r}a+-kNt7iv6qMnOdU;oS~>Y?RptL6e-!h63@8Ic z-$U4NdClv6(6z+KS|_Jr>Z4UuOjlPSR<`lnT@aRkTx2ii3LV$e+Rtc*d{LGqkJb;fB?H z6?@;g)YcZQ-ty&|XU4(s=Np)!v3V%hU*x<+?7t`f>D@;2W)N(m<yX3?IjyWLM6G|^B46l9=-UBeF$W+I+kjl-`xNzbmq~#ochyURt2xc&5&c;Gk%8B=l@eM0P_ zQCtbAkg(+tF?}Pta4nBg6+Hr$?KSQyZU_}0jSHD?kKgswNoQj=Nsk;!D7@uBJoPNaVJcb1x1lX z^fe-rZvf5u}*%kVO@~s`!@~ydE~m_KkEFu;}_d=U^%~H2xtH1B-@N<8NyV!xXFvk-Iw+VmmCOPRGomr|`xi@Bm;+3!53trsh+VOS3`c z(XUgLPID%*E424(5JfD4>431R8mTmeikXgC+-3>>0m87izvCjb3nNN(WNY3QH`Dr6 z>*n2UG3)()v0r1Qm>EvCM&~|&70df-qeR)G(txyTy4%nQ+07wDkj8W9uO?SA9Q-3} zAqe9kvqW6t@1-%-3V0Q(mNUm)V}%0(R`4a`s9gavFd-8EAbHuH{6xEc3eeZ^5!L;P3{w1Lz|izjVS+?limZf~Ri_PY1PK8WO)4mx2 zXxWCaprAf{ZJU}fE%$B0Z{W6HEw0cgysD5&7HzzAmI*~pt1h==0BSZ?#zV&R#{0Tw zRW2UCd+r_A@=p6K-uUdVwm2zB?mdi7u=|-W&rGoc2fK?-=(amPal*lzCeOVSM~4r@ z7HUww*$VngT{Bx4E#wiHtZ0KQEjkfc7PY?QU@D@;^F8P8#LReJ39QFO;SDI!IL^R# z%04ylpdTPwA%5n5 zO`|_)2qmbrR3dCmRGjRuH-s9?1QQkNz4kYhR}1RKi^OFQ*QIz&&$fmx9X^}2Ya-{s z=r^@6)KWJ%>kul$hk|;T*~luhfqi9NLE;1O(`7(O@Qmr-)bh7sN&;Be1U6`S9h+Vt zIp^f(JxGANIZDo>4<{(?w`%ylT9Vog&zHDYj(yH?db68LcqN;3=S*|pCBc~5fh!C} zI3Lq4cEMMlT%5CmA~VtU71VD8#|S$kQa__wD-uCI!%3AMa10xr6e3}?Zy-7@F(lK` z^0C*rP0L#QBrWZ_Pm9R#vTJ4&p`9xbFPyo^bUwH5f`c^}{{zyOw9{7GwLkOY{beP5 z0z5IqEUX(c9;>^=0x|~Q2>e|C;=5_a+g?K4+y!lhey@V1X50*O^`ai$Y!`bKJAHuE z_Vpihm9Dh>-s1cv#@iq657bb;Tc}UVU&IX|X!%smCbUEA--!yl_aFR;Sa^EkK%Z$U zPp8x^t@-G+f1EEGb$445RJ^P7Qf$@Q)kU3%VEw0yX0;d80P{#q9gjg4lSbg6H+ZS# zc{0r>`MAyhL3EJk?Oi_K_#38~${F?e{iN-CcA$2Of__9Zq3xMD3KDzx`GB;5s@~nk z-Rl$+{5y^hc@??#54se|=OBfU&7fd(q}5mqj1dk3bt&GUl=dCCOrHh^y<1N~t-`Hx%OEn~Y^K^ED**5?v}`hVPGz~n&W5L% z+tprR{z0lBZE52q--2HOK}iBmJOhr`&zU`dCRu#v@>zsJ@ekL>-x+Pn(ZYeK63y)> z|8m_=UxKg1dER^e0W%rDbQTyX$?SDkybaAi1)q&`4#G<1OFgnj6#vW49IHgXA<6701sx#|QmFi$EmAwU=tf$**n% zk6gSzXQZ5WB|f@z4_qA$5vY~ErrL3@|7z1U7t}4JeHRv=NVs%U;%x(&RQ-|ZVkXEm z{U3SXjWtP|WW;i-%VWC*RfLeLe+%u-Yfo3tTCx_lXbe{FBVS8* zVRVu?h1F%RdlWC1DepS9703wwp(fB`JWgEM78U(&(Sl=?U@*aNEUEF_%lvf6$V5?m zuW`D609*0c;N-KnV6B@F&x+OE&0JgQ0D|uNIW*ps^UyosO4f1Q^1I|3U;pL8i}W%3 z098&~2D8rA19yc{x$S-MMcLb!UhYk#3CivR3$EEvVHXwMfOr35WR(qco39t zl*InkxS(Y)^^=PCs(gY0ImH%Fi4;3FN9yeyaSPwE$NqG?Szsnsz+Os2);N9ra!tSO z`@8|%L$cM4`V`ubSv^O5YwdL5b-g@)aO&fh8QZ=2invUYO|Osw`fN+AH7B$KeBe^Wh(=|HbcMq+gc?{b-}L- zkVS!{s@5!-|#~LGjCzq&7)L2nExM`2!p@6Jb z{@8QzMEtzg?fwV!%h7_miaT@)YBRPN7sdPPZs@a$01~MKm?tkBy|Z_mC|f*9kJGqq z>$tWVe{SF4J(XdIaH#)&qXsaicX(f_<*(~^`g|~fmv;-b z`7dGtO_%@rJ2Kn$GcZ7cYShUw>cEJr2wc;;E6)6l)hD4Xzn;E1xDJ92hVx5`)^A0` z!TI=dqV@aQl(`eS3uPo`dMO6yo|@XFrny%3faP8A1KZ85Qee=g$wTO`W?q90oI7{v z?+}og>@XF1y1fT0#>MP#Mea==m_XD*AhrT+Uy4WQiN9Qn8-z4X(rCXXX^6uPIFKE1 z=jCg`%jA^pFtzqyQYR`CTgsz6^uOm*wT(&XpFq6JK6L%NrQmJtpEjy1r&KkIOETIM9MOJ0PieGN( zu3G1X=M+U|_0xK%wk>AL0W{Y%BXdPUa8g87NEOG%8HS7HD$0Mm( zluUi?=`HpWLHhxm-&&#gW!CaC3DlpmW;af}uvC4D&5GBqmHD3|Gwe%I$ppN;`l=L^ z)O#-M$3?`tQaF$z05a$}MUWSx&Jjr!WBH&5D0~K~u>!wKxQ-dN~=+NFT{jRYMOu%xJ7-|FBqQJ;7}>_(Zm|6G7|v2m%vTG-}*ntElMCO z9&clPsN;C+b&`UDu z_c$l0!l#iBpQc?Lg+YF928U=aP9B2D)QgK25@3D$LSVym4;*~r+23{)EK;!L&|s^q zi)HY&F0r!s?-iwT0e44PA&0BsNh>`^Q9KtLeK3NsK4iM3QHERhpWp*>#bRNlm^$_Mq2l^+3 ziN3a+g2gu|Ml09(q9Mdz9bISR9lrC3R2yYpfjB8=b$j%Ht0^}Ev@>6$8=&%H%6xgKn#`D z|A(ETyx>-+{+C7QYI>BQiriziQJArU+LF5+6Z+d=({^KKhGgCaGi{{PYD>>D8x+jR zFYz1U+JR;t{)ZvxhZ2YKMSZRod8dr|XzQ&eh_SeHJ6vq5)-8bXIR>>?A$e6p{V7l^ zB%^IQ{p%TNH7m5@^qSkb!uT)u?xBR(PFrNrPkKuada=dL{G~&%r5&j^7Di+FIP{u! zwMiVCv&?lE1S4{HkMj9!b&m;Hf4b{_Mx#L6A1s4Xb=Q>bFQAb;A`l%u$D zMDXo-5cfV0T?waLp)rA8viL6}JP|9MR5D7yK5_hG?AE3YEzx_06AV%hM+KR|MKyhn zhpSt8^|gn3G2(Ui%&&cZ0D8TW=X7})KWB4V#Az%-CI3KBrhxH8DNf!!@VPd_a;fK# z*~5>_QCdRKzmaQ>GM@E){KLyn57_%+MVvxwq1jh8o?&~ZabLfllS`#1OtQN(PV6Gc z7%B&EoX3%|chk}GlbVzR*FBoiR=0}}(GTCjn)NqI=p|2v^;{%|JH$gv$U)3pxJ4lD zlh0D$(|bqkckrviYDzKPFsr`@YCd&bwX8E!UYsQJb+iw7j&UZ*kQ7b)lNoZI;EHp6t|01~|-o znCJ}p*61habGa#V3p=lolOL>eYUCm)(`5SEWAg+jDKfP|>v~wtqpc;lXt=n!POqOZ zwM#CA+{Ga2%J@-d!^GcVe(%)9e2L!l9zZw1~UQlH#%cmoV%gD;X?1Psa{`K__ z)`7!PcB&tCz++Zt?zU7q*W~^Ui%GPk^x43_qDyg{kp34ffA@zi-08GP_Y=ExYfcI> zh6_DCUO%|9s=f~7_{DIv)$6Hy=idpU9|{scGqVhWt6F7<`p3W*{{I1A{EO=HD2{YA)9=sE+aUocQkU*uj9VIDi9mK;Yf25hc8ebGzHI%@wdT_vW_0L3 zw$k=h-{|hko7Nlqett1Z!so_Deog-?p>9hkc z2$P4jrxW-x2#fYDLBUkw^nHIQjI$ZEp&#byG+FgYkwZaImK9RXA!< z;A_RU()8>l9S}_*Isc)u@{Z$*IcaTSWW7%jrV&GlF4Z6L!(7cTAa|N(nk$pi64e4x z&_2q*g!2yOc+)9>xNnp3oIHBN!{g)KLXQP8T1-cVe#wgJ!f)HRyrZJ>NJhpSbj{w| zqaCgT&kM_X_Q)h+u*=(b7Z3)1OwX2Inizgip7rU|Z8u`Yo3T`!X3%$yShZP$h~fYP z!^Mut-EFHvvnWZ%kWR6+ThW7*6w?vh_eqZz?*dD!;1w{)_Sw&H&KZn>dV4o+71#gb zy04sNy7yA2i$(U^KCiLcYqC=4ggT60VOgPI8ScXdiImkCZDrZUkvPvgCRbQv_kN}P znRw+CTW0oOn^1i*LDZ?V+IVWyatoUuGiN$SK0mE-X5D?-7lObFvCqD0ocXglPsj<{ zy6kjv?9N#8A^W=cX;2R;gmdvk?MdjV*A?`Ct8d5DSw{Yn+i8ox?URyQvGeBlhm%H* zGP8t)Bqy*pJq3*5-9O>7iwpzT#;x*Q_!EqivMLjM1Bk1 z=f+LUyN{`Ta^>E5JyLl(rt9(Tmch3U5evN4Sn*u&sdeRaa(~W++J_xjbr{YcPIFb{ zecMv+LC4PORbu26r5o7%KsXxT-r+L-;Z`l-zX=`s#7(%wUnkGD$NhrWFAr8V9P>zA zOyOuy=t%ynB#!=ijL0MG!-d-6Q*4HUh2|IJc+z_3-TD2|Ew`1YzY)ud)!MprFmRlQ zSBqU$ai4FUT?Cx)u=GC9V}n|>+J}d$rmk%o+iu|F7KolQzk#y?$!_|998nEaD`(ci zSUWyP9a0ypMHLsnlQsFx8`C*IiZ!Ql9FM*+|7^*zuj*%lq4i~jyO!PsvC<9la0)TM zC^xt3b<-g`6Gf4Gs876*&vvbCyx`u{K;3TWthLG|gBku*UDuDNlnoK~$VPD1F1(udH_oB_kgy&ALQet5oHtBTCr_7Ni|3E)#pAYL|4$Ni{5F1 zv>>i73)sp+Am+&uB4_uY@C76)v}X$^y&LXii*l zH%_MI6GZ5py%5|2n}9C~%t&k!BGVp3yPYZ&9+1P7<*l zM+;Z5_wXEkVLM}vR+IN{MN-SH3Rh-|op`>e#%bT(TSK;lBbKS05z0}sk?6zCmT+b3 zrA4?d=)cYj(KxAEr%ib^EBb})05f%YNmeu$bKE;{Cl`4*{9^qf;kO0$va!QCx z*FBzb&2`7KK?~2KPAEuUVzGQoTyUowF`1= zzB3kyTI;m!!e}U#hIVTJrl@I$HmLg$^9cBOLGm25Hx_SGnh&7U>hg>2@J5M~i4C?* zBO?E=TuGC@x3ciHkyTcITwCXVD-j4|$CBiY^}o7& zG@L}|B5zjt3d_}SF+8My!CX=?fG!z@PP`qm8lbFj1uVs}d9)o)fEiX%E2X$yZT^J{ zOsM@y>6GivhKf(`o^k2a%C1F@SJdoRRp+%f7MK3@X?~xo&VX_hF9hE`ZxZhwKcsLY z$qPbUS#Wka>Z)kJCM}49CT*U3w2^eoW&i6*bq!On)J&`~FMcK$^BvT}HNQJv^uufw z;>)!95)A6&mA!~vn<^B~F>32(SdGWmxrfJXO=Z@$&W?I*2G+3k^Ov)KJ5~T*p~ZS# zW;v%A@;TAEpUL?FdH}b2n>o}b7FcO(F8cjLmcp1B9D^hnXT0R@O}@&?4|h_Y#~^h- zh@5dqQvTkfVPh)h{%||@U>VZg8E!g@2sWifj_~Q9EH1kuC&?pXI|4>y$>mJ-F2U8;6b%W$9z$&B00P6K_&X?%}HpfMd zTX9qO!XQeS;qifhL9PQql#0`$R~yeH9U^yWSi^eEXbUKM3tTSwo=$`1KNuZ#h5HnL zuowJTt=JopPl3ed-xytKh`}jQ!aggVMom(Qu4jyHO_TVTUdUsYNazO@AIzj+FsE;2 zs7}9*27|XkRy)*rqzu`#TYSauif43X4bb(i$fP5+M^8dAA`u;~R@h2tDEst0<{Gw3 zpwlSLN5svMGEHgyTKR7fDlnR$MQ@O+!L_9+g$!MQ8jb&eXIiAWTTm6@`P|bNdNlum zKx}lCVe=6|xB$8lA@Tn4cs;peaq`c9Rpi!J)gFT^8uxLGb|Mz){qT_otf&Hh0TR&k zuyZF;Qu2_(gH)8|qzAoEuGt}s()Lvot5 z+)P(?FAyG&7%Ezh2CsItFZ2e-@lK}$$ofBaM0YE;$GKhc{tXgODdE?%cDjL_HHq_s zuHNn1-z*N~x@MoOSAD85%tZrGbOiC+WJI`44>m}u*|dA(bGt4*6(e?0@9tGFrSBvN zkk54^h2P9>Uf?*Ot3_!gEU(PL`u$-*LNUszc|#o6NFT$_+@DX=VA2FSBjqJ^Dwr-5 z=bcAH=pT3OEGw}i?1bPvBaE0iQM@nYgKvZ}JCMV^!gAaS9L()U<}z~QWE=WC9{?0G zP0L#7^QtWaRY76&K|^DN0?~*4S32eCiE3&8yw_QfX*HEuoBL+CM6>lWViY;A|k#z8Wb`Sg{wupEsZv3PW1dg$_NhF>mfP{$FJKPWC3j+Qd~!FYOHeL3Q@>MV z-W)x_)*SV?^L~=E;h%D(@@HE2(OUu3aO}FxIlJE%qjmFKOdsR<% zjD?x&20}n9VIhNSZyGx;b{28|IsN{5n^r~gJ!V2JoH6`XoA&Ufk+u>y(zR4oE8$@WfRv278TyD}ba!TW^?s8$h z%{DbOMA}K}alSa(jNju=9$4*Cb4zxd!*}t{Cb8XtOGT0(FI(6s>r^1XuZM)J&S-tm z=W4{kGn@#E-w)R}T}k|dD|SIcu6Gi{c50}NIKXw+6SduqX5kufX8i*>uRZ(58gSn% zGsYRI57a?ZJ^ks7o_owGcbcY3*}9VV^TBz?6Ag(0(FG1d+!kgg>-?8fQSD%C-;eqk zSlVCPQomP*cv}@VFqTiAXgoT|T)bt_i)pi7(9Fu^0+I2zt7a2#eH(IK*qn`L2V7z9 z;2r*_ONcwr+%fxZ(JUjiu|W)Ux}}?g`s0H^cKB}zn5k^6Hj^6Rh-N*U@7s8GB8P5b zf2ELRn`w)tA+TZ>OT#-)3yM^`HQ=~FmRrN}c5V6^az3Y}qvvXnQ58|5StvgP;^j4d zt^nr4C3sI+Bf2j_rPOSK&FsR$>f*|8^m?8R{fyCYkec-srZkL5dr)`6-rD~Z#FiT3sdfOu0CE84 zurhJl{o{7Cp{ld2 z$_rPsYGJ9JU`dgtIA=)mR!vM|C zXls`^jt}oF;)0;iJU6;DKgGoK$F#>wQbVrnRMcUDF&%IOu^TInm;b`=6Ht3iY{VRC zE@?ApwRVT$??Cc$BvuWMZ5PrT%Rl{VXXxCJL-e`ZE-T$VM_i>uJ((aikJ#oTKB%R( zDHLgQZX+xEy;786eQb)*Y$w+42Oiya)oE&%>2fMPe%Zyc(3jjM9A~A!YHtp* zgm5gQ;As}q{!4_AtZSXO5sd;h!GJqM#V1LXcvV?}l$tE2u`aI+-oG!o5|Fbis+)T@ z+=MJE&0rKE3QMrXW@EPluX@{dCY6Z@+ico}3`~zx?I*@Ncs{J5*RucrAiKM;XsYF> z=7u}X7u~q(-b;Paz~D)VhkAUNuyHvlg?zDU{otOQUi#W`Lv$vp;qCt{C(gX*Ps1+s zxl|UUa%{d!>@j$*dbza~yaMF6?_su@suWBo;@qcWM3N4~$z$DyN;WwC4UxkYiZV?l zzla&XZJ{BDpi+mRc)Yxc*&x~&jNC72mo_|Q5Qw&Y(!v>a6e?j}6SNm$3$VGH=x|H& zI*cIg#n1j$Bq^)OOK&-Ue=P0FNB95qMijsXWjtLxdahOPw_I)j0^8oM^E!w(j!_fy z{2iLbzTQIG9+1_XhDG^C0ND@ntxsXEing3B54S6bi#w?()Cg9(P?x+CSZA?pOxRQ@ zD5*-2&ptWtWs~nZ692r0ldbZWZjf{&?5J+X!7uqm)@QZOGPW7E!0T<>=wg=BiBG?~ zhyGDwpay57K(5@=c2r_%u_vo2ZT!tbH*OLLyWQHijwfPHSpIP_r`1!k>; zSLa7w8bASLqFY!JOnCE-lSfx9Q>Z*y=#*SlLA*~bo(kiKw5 z=@po1M66^n#E}+y^lu$?0d6Wc(-AVcev-J?^W$g7_(9d{7>$?AVY-5e!Z?{8SMXk> zw*xgnov53$Y+392Ndny)#(qB+vl0 zxUA6n(fUj-XFmJSIH))UJ{u7v0YS_7$bHOGjBrf}*Bx_j&Gj3CLYgBe7&L(3jzw&t zU&-)i9}@?3)xWe|L7m}FvM>Tv@2>I4`LZHS5*ykZY`gX%o<6Cx-!F}{f$vrEcK>E# zzPl5PDOmJ>N=Y-8Vlg~-1AC9;MUXJ^(J-u&0}SFW$wNG)g=CNa z2iB@F=d+$N|G$9Bt)$$ej$a2?l??8e%%9G?{-M8b|5^Rg<_kN2MPug^8s(GnK%+wz zpXU4WowotEwzZjYgzdr)+KR1^19m6w(313_<*DQ-WQz5#ANiawARjw9?ce$`cxx^8 z`9L_CUsm#|?uyfxo&OMgq(6HGux#U$2!nm@CzlV>H=jE->IzF`MJEy;8$p)iQ>94N zOa&7Q|0?yTsSd=(Luy^9K%A!ZCS^guNO*E_aF!wt?*>*8o~~+-P9BI0qPd0rr7IzI zocm@E`zDuS%Ee8uPkuUj;!njk>ln0#4N{P4u^^E?ju}f^uk|a%=;%Ix!;@2qWaSq6v09DjgpRSA*7@%P z#rnVz8!w>69e!b>#asWl?phB4ulUK{2GEym&;szN6>nNQLG<%s;P3Qk(TP%!xS9o^ zNg#9=nRf?(hqP{oWz{II85=L83+>{+Zw9Hg-mYGJvz44na zXWA(Wr(~FJNPv)q-Ad>+1q=jZMKzF!NGI3@&4njG#e)neV8zKVtCZHlV}4>5*nPQF z8#VF(hd|-ahAmEN3vn^rK?W^j)>y)_ktZ`g3p1#;W*_#Bl6&zKrG|-1+nQTCptm4l zuM0DS1ekU>7T)4qD@7ElEtAD`Xd$+9Mvb?$(qV2$+m2f3wa_G(I=VyYQn!X@Riuc6 zZ2Gt~@A4Z~6QOOaUUhBBd8p2EhViy8X)`h)Y8Iq2JFVL2MVPj07IO5p_b4u~a%$du zhjRb>99c+jRMR3DTrFcZMA*xd`3)UM@wc=gkphv8a3H2#O!R~#bjE2){}xnUEVb>w zS@{6^NPChrN^d|m_AcaeY_S4sCyfVGbT}4r;|o5>Bb9qP#c?XfXU^9^hej`=Ixd_w z1avi>{s(1>Ad$L2172+378bXd;G#6NS5`|^?InbprkJuUmTe&!BMO`c(Hc}iU6N*2 z-tDi>=ae>o>%=E)ih{Y>7pdg+?}cJ#XKEBK{oUk>ebRLw>75%xA2aHJ)!rxX$TYt> zKr72%p7v*gsAf=bVa}{>kb5NpFCuCiV9~gbp`B)-lZ@YmkZ_~m2y8EK-nD&fdG_}M z0m4DNP><=s$w52KW8i9~(Of@8tS;vr#KHrQU0*fBo2j;ZMb&WX#NR8@R8hk8L~LU}7UwN3HZ&CU?W|b{NC61%C%Jw_FbCMylg2JV>>71{B5g{Ky5C z9~_MVI)8~1FXCo*VmL@7wEXx$K>x83z~Zyy(vNS$N$Uo8{o%b=CIQNzG)@dM;Kfn^N^_t zhUsYzUU%BHxBe((-*^kx87}#7MKzTXhXUy|*ElNIatFTlWnrjs=z6d8AH>VAER-^D z2Wl^3g|zVCiXnQcPKmKi&FMIaOjh_m*1}Zz>{#EtMo>Y`yvw3i1-k!!MOi;(6hY#n z`8f9|-VWwa>xm+-dFPb)=LaEB+IQICqfP?BL7@H30BgSQy;B=JjLaM3%4G+s!F2;N zNojY@qm6zw3RfW3yPXA;o1~iuq7Rq0yzB0QL@iR>O%}0ewm&`V^2O(7MXXcH#-r(9 z9T1LEk%SeojPmzGeB@R&b_R7pzTUEk6gej_3`hNj70eO9bxdm4uoquET6?hG&0-bS ziX+)q-PkHA09}RQr5Zp!`j7LYXoDmzKFBDP7~Znyx9X+8WzJ#>eAabbx!83Ni%iAI zfb}a+{(Urh=W@X98-?Y<(G^<(ds11*JawTtDEi`d2UH3M6(jFHy}O$$@aS&29rkyC zZ( z_)j%WcP^hNZEr(ul$Ms8lCAh$Oe zK3c=Po1kRMggwnn?u|HOw#wDP13ckH_>o2L1KYCCEfRJqSwH6iP& zvMQG_@aErYs+?Wyf>SISqsH?%by{^oho}q9^NHt!N!&i4}-g ze$AhK?6nB&G*g~%s70mtR_-F>Yg@O~gck%KagN+=7IiIt2SDrXGVZkCw_O7owl+jo zCAewYj*8l+k6Ufgtxbk3LAQcn3`&(}^MHbu&qM#1NO-$Tyqty^CnVM|zv%uY*&k2sj1xIO zZ)S2{eKPkyQ#p%(s|i1U>{P-3nEdPRrT90s*-ghbggWW(?~|x_u2bHvh27Cbg?5EZXhbK;mPlW-~J3$CoB#kL+5R*y-d?D zzk*i~236e1&gXk2;h~4ai`&ICYFyFuYU7cO4_NfT#~NV?!2|?$MqNpNH4;Q5u_J|p zc`L_kHB2XTz=z;)Vy5X7#1=vmvZEB(1o$ZxOdD)(ShrUP`Qp^JZXunBExzuv)p?(F z0Um$J*vhY42gW3dH`2kXL`hK`t+5^XcfhJ>b84G=bjalWk!WNjs4toS6ZDpc);C_f z2Dl(_(V0%m%0;YrB+b1@`6rp@^s#y4*E&T}Q2VZF9ojTLqI~BKD zvV5@|dNX)`Lvg$=jvXWJ&k7viC_uSLgSf2zu{-tn9s_Vw^S-9#pyQ2$HLgL4OR9N9 zFLxXDUbw(fv7;sI7#x@W(04j8&Gd5wAv~Hr#V$^yKK?ZSj_315I+I7Wkq=xJIsTG! zH30oy1@?6z-7DPMT%9|VUZHbBFQ+dY^cp_c-ZQ_@TNHU#k4m4k-2GV7;m4-hHVMZO7%4L#U#W)?tCgh&U%r$Ie;ru@5_aE%> zNT1K={eHh*&*vK`kc^V~;1^~RqkfsHSiC)Y&m{rTF^ha|)4B-JwZy@W;Ac#((taAQ z^NUAxD?>2eSi6GuLnY3jP_4zhj7p{G@N(h{&A1T{CJR1)<|tTdhzt`*{Lx*J5Qe13 zhazV12%e>*pBagdQVm&Fth5r->WG-n;s0EDM-%IIh^UP8hffEuI&0g<%|zMuM%*x7 zh&mKal1dn72g%v^5ij8-8u~VU_t}#0pE>xf)iLy+A#8>*(G0%)h_+*=5WvK#r(|VENPK+ zt<4}KR~;yPP0|sa;;NF1?2EDbj}Eu+vB;Lr!tS+wH6D(q0X8CEd%YW{hT$Mh^oj;# z1-`FuB+YA}5xRH4i&c^(Aa2V2V5mzN)+-Q{A+!zTbZ+^fI1kX4h^He?PiPl@A}{wB zo?SR>SN^MNLaUM{Km~C9F0^4#De4+YR;OM?ekrfkr|kj3byt}_^&%u$#C8kU|8uj; z7-CN%tNApH1fBFy2E$lZXPLm^onL-F+kNKParma~iivzxDse|24*@~GtC75bIJaC9 z3v$fqXBd_tGmtwBbWt0jt1r?oIGO2ZShF5HyB<{xjAwU@%dgY?Ov2xx%u+YwizH_T zZx(oau9^+P$Y~oQx~VM|{eFKsahi0mAshzeq%H08IY>_cObhrsn!iu@;NwPi6mrfQ zXs%A_QF{3`1_xF*Jz?L4`)V| z0nWX{TfwgTXB3GuA6kIFbNpGScZ}wZNy-81yR63wVUw9VbS-G)|Ax!4yfKPa{*`Zq za=&*?Ir|x_TR1f0gitaABDE&Z~@^p38J-G+7r*PNUa?u$SAGvZFDC{&c;JQ@4wn;ryHa zSakQ)s7yWar3@&6BTaYP09}Gdj?VHOhvCvqw26Yc-4-d+${k78b0K&(%w#e=u6*l) zt(Iy3>E#3<@MYG;qPpaEAOQ<=7}V5e+U$<6ty74HjI4T#nVC@u;O72f5KWIjTc%gIyL!-VM!UMJhn|JItE0sNm0o?hZBPkZW^ZCYMM!r+z!)?}XR-9P6F@p< zF0*iGmouH(HH23+3-ko(k=mZe3Yl((76aC>#i zazFEJ$a03q^m8mXv%Pb+WxZv=Rfz^}-Do&RN{v%f#2_X_eZ7(f3S0t!L4H&b1@FKE zlJu~4WlLnE=_>O4JNckhx22V2T&w2r^&5H{MUWA&{2;NR0Wt-oxmkTQIK0@rTNxAC zXi5^*lIS(q+FbDJL5R{%ePX>7iXt<#(qpac$k7;ZHlX`RwL5d-2`wewff?vihrMH@ zK)V_hFG;77GycBQG}-@-=tBVeK>IcF2lVxn}B|*Mf-NDN(bglyrmcJ@3M$Fp*Tm*I{ ze$a$-=!%!-z^13py4J|!jtiI1lvpx&K?zz39}dkQ>t)K23D*5a*)}X-Rhkhu+wrKR zLn}GqRg?qT!foU(5Y5&xn0)RT_dnIICxi2`@DdwBcS7sbLH_h1YRmSM39op=RDMrT zT2f(;14lm(wmOe!$L&hEVRm>Cq0h!%I3(2o$Vt$UZ&q`(Ymdh9X@F;(CQrX^f_%+_ zKlij28jr06x+;MbCiWYatKo+Y^8-z1iwfjfjBe*vzK7Si1wxx2DbrOPRpLQ5b4^QY z51J{#wB>?5>hX|L8M_xkRvV_6BRdN~8vj^~gfc&!Ji_j9Kkj7|3oeP)AbBvMrdUGO zfY$X-IqYgpMtc-U8^VU!18Ak$qi0LpeKp!MR=@kYuh+aYz2ssY+qvEzZEotCv^kY{ z^ip{Rw(-$>2N69{qP%l~^<9$t)Tq+H_w!ERK`fh!_Jse~wr2Q}?u8F)4<~9EBDC4y zjMMq=?*C}G`?mk!7M{k8>oV{^S>m+Okn5X%;rGbnhDPd^B>KZ~61UTC@Lp}LX2BA* zP22i6m-*vI0(nW&JRs#E6Fh#&ov$oS#PeYA$;_=pbr*Ok*~sW?qL(J?+&Zs6r5+*T z=;%uP_}I$C+e%C^EmqQ5vNd084meM|i51T(a(AMASOp@7K4Crw^Y>FmT)jTd2soRn z?_5kQb2BVKNXDMq+U-lc@gB@dwnZ!Gh~UqM+)ry?fDI$tOu?)s4y)uLJG4-F{-k|Y z52HO{`XRL^)DY$%-Kc2&ym&Vx*a$!pUVbZ6k}Z<^W;x_tmtO2dDaoKL&d&@wp`YP7 zI{06W8L@zBcP*RDV_&bDO@&HzEnGeR1!bM7ui>(5C-tTP1}p?BP=C@QX@RQwc)f0H zwR`3oIYCpm{cp9*jO8VTg?ELYNGeXynX%}JYcmYdEdq{wb)s{hDk@;TgXqslE?k1b zE*uK;%5%tTEd2%eW4oAjD)$Cxo%bcnNn0{JthJau9l{-Zk2&<38Z?{O9++hB9)g(i~7DXI0;x5JC5< zhcCS}8!o7CcY^|65A(t9k>FaC^+G6F>*V-&ot9pLcy1uKq`I+1nM5yw#!k{Xa}2Mk z%)GG_?^AWo4`u=If6qjgbBm7AH`|yJGt#{Q04?Ryp?tT64`U_XG4G#>Hb6O ztKl(PFbi05?G6t+rV!u|8LiQ10H4a>*VruHhC8U+EI_kSN}3C3rK#odiukgDQs(*L zDtQ>BUYAVN%58Xky4T;E$pElmKqthJZKAV;x%|KV=y`~4haAgj(M{NNDyiWLs-74Z ztJwlKnJ|SxoesUc9iU)1oNvFzhSg-M#-&&~8PN!|TuTcHAM3J{{XC*Gt+c>GH?0C~ ziUA(r1NMNGYw z``8VPA%m71@f!i+3k?*%oEv(Y`Y9UH|B(3Ur<3H1nUn-EGX{xMpO=A1MC-3{f@9sC z#&&crqTN;?pVI#)Iz0CNn_aOQ$?tX8BH(`5aoz>v`(cBq$r{TKaO^BQ-vA;LJKAi9 z8n^`Gc`BtFzgZ6qTz!G7nGOLC-^A8NxzRyD4_7>G6w|^tWMIJ1P$P05VE3!|{jhC} zqd$@3^9I{XpIrb!NebF)i4da!{^x?ZGn!&G}+dpfg*c>24Vr7O6u+>odZ zs7I$?{5jO7J|SJ;VL`x8A(SoB}9xftvJ9lG-X--wRXKhWLCV<>aE7R)HY$ z>kU})O$^Cj2K^z^a?3^`F<^(O*EhXh20-~1PJ0bNq&cia~nQSL;OhZ?MQ z>4_wm(Hf!g^{Xn#dL-a|)LD{Evh8dHdmnc`8;NP{n34z40EmD^hJRn9dxXnC5LC=y z;=lX6+ufR)q*uKKVJ{vVBT%IaXMu(n&p)PE@e7$OQqDEE{2V;YyjEs*%xvG_rWkHW zM@Hc+Xsr58)9|!rZ(I6zhk7N|D4(oedb~ua)5(E8GGc86*!rLc zOpo4x@4?)v?DKLV?M3MR0(jYXAJj@jSwDT{3SDK9&g~G45Jk>>9o^T?d1KjC-t@%n zyfS&=Qlbx3dGTSM3QyM+8hHN9=SKIYTCLwRHYU9PW>DKP0e=?PMZ5}`e=>#wa`H4W zjR2tW!u=Xj!iSW18sJ%P)fG6JS$zL*$i&iH<lNM&#%&`yr^qjvi{ zhAd@=Cu|Tch0F>+Hkc>hC1-t*3qsbV5*oAjh4HZ=H(T*@z#yfe#nllZ<;>nUevim^ z)d?&lFn7*ERtx!6QuXirFJtK#=NpH`sa?k%#e%1=XZ9yvB+e!=gVK+^zYM&a=0uIh z`+@;}p6{&6Z;>#-nS|p6N{aTZi{%0_O+C*w96ivpw<=X<9y53LJ55e(JA6lLeyjkp zxn(jD2LekcZ@WJ(SGD|%&_w_VntTsYxkD)Vp|*HD8<*7hFUSYg&~UFoHL5&?6m8L2 z6a|AXCg_GWJ+9*6`=m3<2|s7jwtAw-nqyBfXDLPh(?Cp-dq!@(ua_DyPJ3Pkuc#ML zY57kmE-1F{A4rneIQROaXD0=dc-q7SR0MBfcSM?_2|^kcHPfa&=)m&yb|# z2fF`)3T8~StGyJ7b6sX2tt7KXr;{!Ps-n~A z&A?YIxcMeO*AHas=vWENc7+sG69phPBP&aW3Kfw5f=Yn4sXbN!w^Q#SNPiU| z=Ww+C6zlg0M*@-YtvmyP6;$G>`zZVT&|c-`dp=I8o|xQL=_hs zvlDj|zPOgFUx3x%VAyB1^-J)s%??}fCDq}RsH209dVkKHJ&p1YQs|se1FR2*bx7_M z7G$9J+3;IYGmvPafMte~baYYbcq)IT0O)80=SL^op5`mX>U-_B!*N@f>J3TNBca;R z%$<>inNRDScLg#tfHne<6g5P^pt;=g#g<4RcXgfaS_RO^Qa67C%o#{2$cVKWm1r_U z%5YCUoCXyc&UND)6@)s#pVX&l${y#rK6Tq(D$qb5PS^JYd4T&uzZH!EyPRETR0chV zy^5!q!HHhSCbx}5^|Lr-j8WjW^3w~C7~0S^_@*6pb@O?whq4StSGFUvdFTYC>_i+$ zVICqBWJV&BJ!l65L5nk_pS}y2DTujtjq-ypV|42BK7UOBd<)JWZ@s0E50)M&<(Y#E zV2;NjTCI8SzXsXTSmBo%xC(*1%=h4Q=YbNk*JS_1v7PO4Vx?d~=9>5=1k5(jlnfN; zRTIWjXAoLzg8|QYqBHviqVbr+AQ52W(H0|@(@z0(io|#w>Bb!>0N+V^^1Q+Qz2YId zvkbyM3}QUime3Wn-rQ5rC5C(>;oCrE8!zX&$-QxT?beGt9p0!2W(_+92Xm#?$XLy$ z8JldRx)pWXx~G1Mtd0X;@C}RiQb9!js;U6i}c>& zF@2Yv^zkY2JVXhds0i@`^G4HMJ9uAdfx-um z7SV5J57omV&lbigWA$^iU~6X0n=_G0;_n$qb9K+-FzCA2PzM0^(3H(}qtVHatVX1T za!%0i6*&hOl0m@i$70pXdq$Vy>~Pl~K;=Ln%`aRd&Xf?N27JqWaZ5~oWNO5s9jcvI zX%VN}CCg@ruYipk)v*FEE9S%PS#P6EfiKpfuB!i8(VLo5a)3VN`ZK%m6JsI_XktpN zv|ie$CCS#X&&E}}QHyiBu{ISvcK5y7Dsb7cvrCuHTT?6+B>kCL`IwLJ65;nJ0JgR| zDIfjGrlIF?O%KL@I}bX!AQ?#7Jc%A=h6d*zVyNS1K?W-b-9Hf1^qqV-T&5L6 zQXd}u;~aE(V-;ZjS0OKHxhDQ<4NbAgPI|~)|HY0VsE+KcYI>*J#Y#%6IXU3KObol+ zt|JBBYM5KGfFK58S68NvvVpCvEuE!B!P&ZgT*8@|_CVS(1?{#&E}%}{m0;hIiurWk z9)CQI6h%nK!I+Hf8eyk}qep_~zPKm}TCUtLY~>bCOx%{+Dh9 zB{@7Ki-d4lnRnBS(v6=oCK0d^fdX}gEY6MYp8@{WGYl=BDBKUI2RMwp0~D#Rj>3d@sASPx~SIfpr_4PVf5=$;yK>SA`ngg+w*|m zcRJ}J{H1V-r{f=;Ejn{9Z$>FpG&;)WM^xDFMtL02`a&*wzAfT^Cu>!f0LwQ0JxG2I z7PF`>2Zj^T%Z?Y?f<#+^8dI!)=h$C2>`RAK z>vg(STEWP&uTG23_Ofo%l@s;(cKsdR%&8T83o>k!CUzvl=s2YG>WjXd%GH7&WSZPN z?qfiKIk#m(;~m9nMmfrYk*g<)9HR2=SK>QFTHjQ}a7kw&>B!Z)TFX5w)&umA!y?9i z)u*baF-^7|Tv}|u&J&hf9()y1#Y4uoY0IYB1e@G5ev*sceaozoZ#ztpug6!Pj|Vln zDzKQLM+Hn|JRbrR6nf!(HDwB&u%!5fA!@cIAv^xrslf3OMbo4dz$W|>?Yy>Q!mfE9TM=%@2?d^$lCmXksb)F5-vXRO9W`v zndg)5<9Bpu{_*I1CRZl!?T&}~;E<8V3r9*P3!)JLV|~ngAm2V&bRHIWsm@C-cu6FhHWPLmDXn;S*MlPYGw^oc-n(3@jcK`R(SQ-9aoc<^|L@R1>`IWfp_a%!*6W{ zuNr&i7Y%jce2^g1BE=HkGS_vc=jo@gV<*XkzDX*JFgGZB?%Vixj|G)JA}em~;DMV- z(XVEH|NCjA2T}CB2LWG_U>;p^@w?Rmv8U--rRL@s8YtSy=G@I-SJ_ReppSbv6kEAZ zedk8BZ9XZ|^u}rNbWgyayfb1b!(H8WnU(a&sx5J3GH6kkinL4t^^#)Vz9MBE^M$#>&|EX=g zDomyS3%Ub7sPWQXTp5nnHj*KD;V&-v-Xn%js);fJEO)}$9WY%9;H+mCG?ITnpydH&5)R*#ktaWfo@;+arCW zo!YEDwQZem0V{y;CL>1cQ+#6T;Gj_fC{C`{6 zbxdSZ3hPVLyIx?-JWI@U3BLj`|1Pnq$YapZ;U?SO?Sx|U?YBL)6S3RXJ*r58u=y%VST+%hGy%z1 zdD_~Yz{QgX(2TA$GU>dMquid#S*TXeaF_??*S@t?Y{z zAz)?g;pWj}ywW+w>DT=e_Wy#aoesa|v5)nrFS44RuwjWej2W-h>H=(ImONYi10xZ7 z6e`yEDbXVd^K34a>CN+(t;1j7uLn_*9O*cf1-?C0?~x72UayE53(InM%(otTy?!T_ z4B40^xNh+LJjdRH7Y5iMsW^8pmz4)@PJXXlm_2grN$|IYv%bZ`Pj~AMS|%9gCl&j= zA#1qjT%S3Rczdo7E81iw6vIlrF;f71cyr1tFRv}6rYgztk-m7`I$hOKqnoln9pq35 z%!$GVa+T)5(Bn)Mp3u4)lwW>aT44Wy|8)R417EcIuIZ#8Z8egsURiBZ>@z8_;bMtf zVUQ}|Q?a^QvCl)mjGG|$IGPtykJePh%$))60Sc&Cksbx`X(=XSf?e(LPPoQxlUbymZXRVMsa13^tKey)z(xi{!D+uMN{}(-&)bDS{vvK?Z-*v@YsE z??gbcwmK$G`qhrsU;J?Ov7{TJ8`kdB39hhI2bvW#Emxr{ zT6EHCn;lM+uKC&nY#*{V0Wxi-^2*QUMp!G*zXLP81}NJJTxMJ%A5q!_eo8fR4fLP% z#8KRM*yasg3=tYS`rX`E--l^z@$(=D-EI;FgZcikvN;qTf^}ZRqh?!Fc!(AV%g(!d z5!E^a>evkXN}|LZ%_eMi*>N_yGFLO!tchDKvUUQ?)1cJ=ngxV%OQyysc|6@e zVJr>@Vf~;EM5Pz$rQEx8R`E?^dmi@?8f_Q!kiMyIiFf~@NE}2XpyC1v)fFL?2l~98 zHRnen6D0~T=pMih;4U8omoB&h0h7bTs;6%V1G@K$4Po}?Iukt>;Hj7?mQ}hlbLG&i z?fJ`tes<3WhXIHYtQO}Q@YId3(|yLkee`r0-viH5KXY<~x!xixwgCK*bRML}zI2fs zT<-9AFY#x?(glediF4 zFUV06D5#TvLah=FWo_0!3J>NjKG_Qqv4A74wg?&+7%F)BxbDp5%g@YFoh`g732KF! zl~Fe5@}fd?aJW&Wv)k1`s0{J4R9Jsj;j2)m#B!cGdAjXblsZ_m9p6%{=;aFV!9#y8 zKN*sB@-^}5-1thdn3W&~@=9UPG$Nligr=XFU{)FBb55YUFC4jCYpNsLl-z%8uh}XW zGRXT1EDXe)ITVnZsf6U-mErD}Q&!vK_42Ho?3vl{34w1@A+d=TVQN1G+{KBR$VX2e zVkK4cPx_5QD<|sNju~HaIpo7OJ;^NT6B%r9ogI_&CX`%PP?WK3fQ7CQ1}CC+W6C&@ z-p@!W1Qv-Y*!skiZ6qS~0~&tcUw}QO+}X z^ulM0QJYUKfuZzK(kklgm3zC>zLN!^jspgtj`HJv*BaD+=B@Y-zUlTINa=tjwj z>(=kDg4*GmEz^tv00}9${r1DcD<@m^#El}!(#EIKn#09KReGBlJhtBZO&sb+OP*W} zwm9`WK+x{g?$FCOY2R`1?|~x?0q;cIZlpq+6>gMgI8c7H#_S^V=JVa<9lX+#&~a_J z!>1CuoW5`*<`{w3%po1BgBS{*ojCsJBCe!DE16|!@~M1}{11#_DnlZ1MQp ziXPQO2OkRW37q;tkhGZ&nLGZG5g;o>1$-U8G!ki>%)(g>u<{EE&prkE^O>$wK+|l+ zMI%yL%(%c+hSd45K>V)ng}}1Oab@(W&cQ(KcGo(kXxwiJN^08>#B+wbT$5PjflXM0 zLh&A81V0dmLM{djD?m~Q*Gtytct|e$n#|aLz;}PT!+xn=_oSX>0>EcjS4tf=fT|{K zRpM*qhcQrw&_1}_IxG7kUf4IC%ZLb5ncv|g5tblL>)Y{6&GRu8Pqp&i>^2|)hL@_M zGMP3%AnZPBX!2pUI%EJ*`23%j2tZju#>OEQWQrwox&6leqe{D}EPM+Oiv1}Q1xoxS zcKQbU)gh(`oN1BO1#52p;=2@~^r!-+Jw=dXMNFUu%sxu)O7E(R1BQ++7@7kcr{!`= zI*3j0f{paHi>iv@a4~Hi85XeaTpz;~IK$_Y>c( z%nWbgKKFn0pTycLy3Hd^wgVc=Og@iIm5eniEdiKP41jbbu{H_5?2qJ!C(r~5m2MhU zKvw?@FE;AcQ^(6@ajqY`5lCcM-4h$@EWS4I;LoVk1wv^N4Z9;#Y55*P?fozsDdf}9 z>Pd@Xw9Se-#P~_P!J^JWR-2pJ46sV-un!3xDyv;6tvIYp=q5vh?i$4EVgfynL`14i zw_KS7Ng>=x_QW?rwq4xw=*M-}u&|>y-Xiwx__zqY$k?dU^ zsg#0Q&$#L}`bOc1mhsrk-TJ5Mz&_pHd$Yl(*_j=&ry5KjS%cMhW=A}0TGK1m+X;Tw zA*?7K3YP%&s z&(AKp{t|7e(w_7%R2NMG(}83t+9|i;bVlSj))cXc-^h(?`lnza{{!n?4j7>nvZm{~ z7d`m~J#YX7BIJ9I z&ND~NdLDQ^c>D#oNVgNxrzWh;c&nb+P3k>x?TNriEZ6KNw6;Dc0$n2M=`ssCNVLjXtgHWJ zcf#MpN-*EO6kwSU59aFmkJCqv&bpn8oolzt@{Eih`polg*=PEBWdDM{cc-`xR1t+6 z5d(P~Jt;EQv;o-ypod$#aZ$?g>mpjOI8cM96_nWq=YJ7e$F(avJXBp9QBDHnxGqR! z{B!rAYW306i_1I@y6r*#&>wFT38!#ZoWs|G@Us{L5%k>CrXUUHja(Z)bBwoDT`Iug zFlJh?@?Pg=SM~(#?2xa|Ic>*cYaeS$6(md=DVrqN3l3J&i1r1x6@KzjJ0Z~0S6itue;N`+qBZ+URHY)CJNpLW1qbF zs>P?S6b#H}Nx^g#2*)F+*hVXM!)<}J+j?s<8V)P5?Qx&AXW33gPNfr1p`bCNbH2l$ zEbnHkpQp~)61ol#nWGay0eF;={O(hYxdj0K=FEL83gZVfltzxt9F5U!T^iuPyR1!l zvG!8LJ_E<*jV^=r7mbTUyY34zS2t$^-VB2CMw9%Ls{aeRmX1xBS&I!JN^7$gZdVTX zjcvUi7~khUH^yxPic{FLpTeNq`sHTW+JBxQ9p%%Hnc40wI-4`apR#*=M@+VG*CXy~ z<^7Oun)o*T1purPtO?(@AI3ta%(M%@bExrVNxBmNSDI#Qt``6_Tv_jSJf~pC;iYcJ zW2T^LpV}O*<6X%eW8|{iU<9^YaWj`<~wP+CJxHW1RTSQ(tVY*zBFG=un-U z@2;%7%rDnX;%?qinv2m7U{wb*x^}2+^vbh%Y(>B?3T8?-)x(tM%?!4Z?Y%6*#6Y7{ z;*?*S@4p?K>!)D%;@)=+bfPJaP2_%%73FW&Pcd8uP?TUHcoT;Md0+VWJDHN-opE!{ zoBOEt0Azez_l{m8gmnGVj0N($?&?s+>VnG)XB<8Z*gN!AykpckBV_tHTGfkxA&rbl zD}Xl-=(0N091h8A(Jz(p!z}^Sx`?UwaEGj_ny~Fq+_QV|bhmTIx>7o%?#oziL(j3w ztCp@SoS~RK_69Jx}VW zlt(IkLu~*X8SC4MC-){SNqm0)M7t^;Se<_K%3@H&L7IYg*8_He5xH`4H$iAdqaBPm z!L8xqyRCXcrY4_mC&m|B;8~3(1&Zm#H5Xuya8cXm@`Y6`S}alH<9EGoK}m^QrWivl z5Hm&u#LAEsOfk#cbha7<<8zz|XZ z(sbT&ucQ6jF1_M|`)V2#>PNF0bS4z-1Ycga!tFyxd_G$%LL(JOa@IrU9!q?-^N>ZG zioa4Tj1q-vgVp&Ll{3l_{k>t7TXA&gNBPuO(z%ye05>lxX!n)K$@}Yo8N!Dh%?Uj934fI?w{vkpF zZ(!_sc=wmsPj{o@9sitjcaA(I5^9%f4mg`9w5uyfP~)4Ed86g{dHpRC=BwMjzsz7s z`SkE2volAcTJ(MB8$|!K4SF~>bptcz z=+Os`8*#FrJMnehl(RBK(ykK`k?J3P4WLq(F20|M5F3D^?549UP%+y7sDNa=Gm!M7 zZq~ZhLICVE*wcI0!Y(=igT9?qXiyavW ze)Cp9a2&KGc=F;Sn2&~p?`?3a>7V!Eee6yUXIgk}L`OOEAafT&8U-Ow`wzFYFCKt~ z;61O>(dOp3qp&i+&nm4vdlqRA4$;}}CSNc9y5!#-ef=tm=aUg29n-ltV=*$3>%MT? z=vakP4*BJ}GdR~vdl}g9)-(GV{nPhG&{o5ae-_!ZEa(bIl~N+cOX#hEgj{)Q zuLca{rv`aC_Tt>)yuYZ`b;>Oes2;cU8=_P1t!Dq7#gACh3w5y4;&%1zSl-P5E(bf% z6M2%TtlMpwfP7%B#^S7WbR99y%zGMeb%g!|E;(bp^kUbU-~3MjOY_+2oJNx&`GZ)^ zK5@oZS0%NW1$y62v-E>W0SZR>0iMRf&YKkwY#1(}<7v~iv}6qf*4w}kVLZSV=}wpr z|4Xob=1^UnbvBA$;u^3UhHQ{dvf-TiplHHM79CN9T&BOxUtL1YN{=jY-v%T37!RLl z$Q2Ih#n9hJAQL!?fq@b1g@%2MgQE`2K!ufbMMa3CAL5eV;Z!|TtN7~_b`K;;9Z-65 z4iz&rZx$Zh3G~nnq%g%yz2pygAEJH?QFEn(4Gqe@@aYc(f}b=d6;j9b+2@CDn3dk4 zN>WoS?Q*@h7SmYdN%p1R%xmsua*)GWtcN3e?Y7T*!s@N&ty3j@PUAk+<9}*RvSw6T z#bBzd_CkKZ_i{weiMs{}kZjA;VR={Pu4skHhxyJY0}UP1oT;?F&~OIDVn##x(a@{l z14O%wNUkXT6j^*15^3r_cMh=joyKW+^9dRF3xfwS-U%hO2R+~OYJ<(KIA_A|zN z>YB)VEyFMOcjRadUG2$gSz^8QiE_NX*2($1VfQ8O+kLYqH43_nUB=$7X%~L1`T&76 z%dGR{*|yOHbocrt(Ctvx$v9&`Fu6&}wH;LI)_{W@ws0pwBxt^K|3k)SbM5mP4$XN= z!5Q!Eh5Oecc9K>*B~IOLJn!`DIhSasESRFED4?->Bk3WqP2P#N;Q26BEmlLD*(cOH zf)5QCB6*D`o6+s}f7@FZl!O34C;x&T91O>vXdP{jD{T$B1m0(X*l-f1+iG{Z{yBS0 zlx+cU@lR@Y8Yy)CVwE2rdDFYKVcwBz2zS^r*=AK|-+We3{iS0m>wCK9NKz@$yPB5q z#jsJ^h~;`?l3nxqfH%GqIw6&^chOeQ$ic#Mwv60FH+pMNOiMSMz3CXRV@C<=-S)W& zR|F8uwpUd)*~Q!oRIvLWMxkz~(UyC##2NRSm(o%5RzrDIzIG=c>P?>Eac`4EeSy;% z%k~p=)1v|Wg5Ltx4t#U?&IwUhm2O6d5#NOAuARzCLBWAmfNJy#%U=M5s21x&+GZDZB?-vqF%hFV zL+|Ks_h|G*hod*-ru_2VO@Y!qbV4T53hnTH-j>KA9=Wb^)JBOqqEW7!ND_Q9PK&K5 zN^=;KrqN^uB=wqGf3GQ5nDB1V?FeWiJ@aU|&Sasd^vEH?}pMVHJZ2YiV@_n#Sx9nyQF5xbG)>X*D^%1Q9qRv!b zWfcunAWe!cSDc-0WN7e!FEt;OREgDje~~QZOo0?Y;DIW|M-?AY#vcNUWcI7>m%z^? z_%&&vw zb@{<7tEqxKhM&a@%(~{6QKtZeJWf_z=y`)Cj+}_XpsiRM?mo01-j&BDJ`Dy2*Al+x z+KHhg%{G9xCb~W(YP}{Z5NGkV^hhBS-;_b!VYNBG43+$nv4$5`63_@kx<-AG7is20 zd*Yj^U|Nq2a{`d5!K+y%Nvn-d8s&7>hV|lSzQaS*=wrs^U%NH*-d-ynA&VZj>Y83J z(!{y(P9UiJ2=?QqE5WfimQa^w% z9%!X<&D$->dg79>E;a9_I*nB({;XSxiD;3*;3ok_g}Gt-^Jf}=vKjDFqFVvED=iLK zdqOtXZE}4K2loAR*m)74>`$ei*Xb0q9*p!}tI=EILbIL3Ts9~~w4}bi&g;iqrur z?atISI!KABHl+yQ(@bNIV*SX4+o<eaMZNJ!YxwIyd&TK`q{XyM%d@ zcx^vg^qR(?0DT;6Ut{~D+e_OdFT(J0$E>MYjCS(>$b#+0*`n*SiZK8tkzW$F&Tp=P zy*LoH{SXK?9=;px#xqz3`mBBtzZn|~Mlk<^d~rC%0WXjpVLWgwYVY*Maz+{+(UFZR& zp8Yj%5SUGJBVHI$9QkZxS16r8Ckfngx_Z;?2>C!u@Hl?1gnC9d(tHUp0pR)5VGSfu zb)Ezi`i)(%p9&NPIf)-+RrwFh3?fIBfQ?(wW9l7!aXJXI%q}<{@u5S)!jXWJo|gj3 zY1dfBYL{YAvg{4^o8vobS~7;u*54v@DKGZRT=bSJcgbl7l=KaWD7dui z3|JHR5wieR9k`Yu5!QNJq`3daTKE#G3ph0bL9NQG=kh3yTQS7q;m8SStbI~UV)8*J z{jDSol3$Q)FFmn|CB;Sgeunr*=B~x&kKTdJ^ zQ$#_CcJ+m(R}im02yJaw;8oi9L|?**kofZ-Bb-3nrfu$(^0Ug?#g1D^2_==^Xnr0m z@%DjRxJK)$UE>_R>T{HQk3_3MAkG>$mu>89OnyS{+=yTz*P7u(_gK}C8kB{ zw7a-0*-P9L74?Bif1))ePBF&|wV$J|ct;8}E9W-6Ggh-bO@H$z5(lrW zE}a1azcRkQy9a6Vi3n*U#;BpN1h$^-9K2PTUU935*Ei&lK7Gk5dm_Ykm z&*Gyh?odvYHe9mc@}4-lyA?)%vM^v>kT{XhGPRr;{^%+3YAjda)K2Jj;u#4-Q_#u? zU6l1*Q>j5Juq2t%uN0$?3HCi5eb5U0lWcMgf^zc9WD~08(5FX?S%0a3_By(Iylm|N zfQpqkwdzffI!t>LdvAcKn``*N8Q|_fw)<5p2@Jr+1^0U4nZEbBAtvVL+ z`!g3HtYZ1KvLg*p2JT*UNOp2T$%D7DAX^PT-}T3oVK?m*3;qx8GBS;>I(qg}hRa=GCO1+8<0Wt$ZpUFA zdB%;txuYXNiSv6c#n3TPMHvYbkZ;tM&y^<eHRCnrxXbp{^M}IY=re-7K zr=PAYz#-#VS>9Ufd+|42RO1oiX6LS>#6tvLCuJH&nrIeHywakD^*yIjLdQda7O>f(b@Pjz5oAzGg%}$wQ6cZhZ=QMvT8GP zQOCuIp-y!qhxp{8Xfu}+hAvLpnTzR4GjlmA7oA*1M8&KQ)21kwr^(D*gpDkGf3NfV z1Ke)2z4zYx`FcJc_q(!KQkNR;_u8scC@_#Bv72&K4$zLiivwWgq|B>1{b2d9uUa0P1c-iKJKxmrCBg zXMUaioi)mlW_6;qi#uhoOyD1FCwayA6s&%8!IbgB+wjW6PqMvypNJI+4E*9Ee?{;Z zqP=MFWX-;|_fW%UoFSiKKKN6r^RN`X(e?U(|G>meT@8EHm|kic*S5%{0@u(~_{ZV? zng4^x5c*g3PqL4_uW)VotUbcVtx#PFGR!0}2UrH3sJRiX(nWSde&!<= zQ4$9VkgLAm67(8M?`9l}KR?j0_JXmqGID*_eyvFBQD#hm;J(RB(}wPZz`5=aX}u(! zdfG8%t$BjbFpzOI+kDT^fc*jKckeaa?6HU+8}5WbU>r`el`CXz33UojXx5Mu^o(UG z%%~1x$i5pw5aEFrAjXF8In<5D+=W$nadMOY@Y&ML4rt&6Z8}5`?(zPH>$Vbe62~L~ zL5(_*@Z%hm;lWS`)ST#YE zU`TxDtcV^qSmiLW82E6fhh74#4a*4c(1%xkf%3P8I}gT!g%GH6Ew6-y$A|2I$g(m# z3hy!5HPh&LWY?*d-PEu>i6ji)24eotJLUny=7xf|`=4y$c zg)-RlVw)7Mp5=mnZuU9xgr{D-46R>5__h-FsPU=I=LrnH0|&g=0OVM5!2ZL#Q}5=#2AWL{o!@v10?UYiGfms+pK5RyWl=jv^5jTk|Jg3E=^#VY}St69)A2Q zoSjW}ja?pR$6iK+C;n>sL*LuUaX+mmW35(iNJIVU7K_GBgkxtH6fVgJjahaFxd-NA3k2KOJLK#vA=g{l0`4m%;hZaRvKsUwR7n^RQ%hL-|V6u}Fd} zJ@S2Vifx_l%FsbFttZ{9cTt88bGr6Rq!vVTN%1j<`>BI&6c#=-c%bL_JLptA(ggc0 zW>GGvCC2V?=Le;Mr|0GO-iL!PrU8*~(VVAqU~hVOeS_F7fYyc_TPj|GEE*X9Mmrex zgXO7j!%4QL26mhZq#%vw&1uA2*)JOn?1m<&0vqu>kj(zf-hI5JbzVP^BXN06(bL*U z5bmI}S~b~<{D&x=*#Cq0iW{`r0e(;Bl+jvCO%k4WCN|VqsZe`Dyix{wv)B2?ngOuS{P^8c5+(>ra{lLZ3)9CO zzIO^k6RN4{emOcqUl3z-uENc-di8k_+sm>6uDP{p&G+Q_^Bo83w20&yxyGJVB5s|lr*@^K>fxq8 zKWH<6o8V^jLI&xJrme>RYnYx2J!tiM-kPm&Z&JehlQq?I9I%^7sY%u&pY-@Vq}8Oq znkcvIPS&IE@K8AIFFTPMBgL(h$FT0pCH`91`$elJHNDbs@g+c$ts<~C0je|)cHu@wR?UJ*8b zHTmtM#fFxi=fx}F(yukyzWknC+f&(eQ$E`fQqWZ0e?pyc>{i2|mwLcF#eK2r zWSy=B_6RF$#~Au^t7a?2vdutDGbfra0aIlZ@92>Bcfd#XO%YBj#Eiz4LK)=85*&kg zpg!q8)VOXBD5HDy-mpMu*Oy#_sH6sCQUh#_F7SeTSPce>Q+=*nv@lpwFSNt{-ojDZ ziSGidb(L-2Q|Dzc>=iP$q)b@#4c|?{*6SRyVrKBKdhS!{_bD9L!RcmOXDRpZgxJ}h0OeXyx{tjvKrfhzf2dU|ECk%kun;c~5k<$W z?jEFQVJ+v{Y_Naf<6l*pvlXfAe$|rT@X?kpefRah1E6WLsN@L#58i{dq#O6Zm&nB; z@fDbrA=&3P3jE_l`0*Uw;KA(B5x27z6|W1rJqT&y%!8&ZzOt~ZdD9FGzLAwwb1l=E znDA3OnE5rA;|JqmKvDAiU9f>%Xo3W9c<7~zLihbe?*c2=+vbJY1UD!cgk1OEa|j!{ zfB$n-mz6UJ>s>XghK?=CyXj(9>o;vo^?2s`I2@c`jq*;AHbaa~B&*7J9s_U?oK5kN z>X>hyjRG-R)P;wGbk+8`!puM1`j6pEaH9)y=j65L{ELgo1X&;7RsVzxJs;N&Ea>(} zInlZTJZ0UO{+KWB2aQKN?UZ6uA!n`)c3z%{dDjZWhb_fN376uO~(;q1T25ehi_D~0lb zPNQ7bm+Lp)$MGb7`pjx1+#NBdINVw430odx=w=Vld@rxQ=F`< zOEXFxoR&`fm^yqx%3PFlUx<^rd+%91u_QWKeV=oX;nh_6?+jEDFA4iWhVPEsNrx&+ zhg7?p4pSlBkw}ho+<3YK?P5yp*W1fp@-cIkX-17DVKpfB(sJ+k)?#VEM#yNEL^A@9 zko5c?WLIx5Yt+pj61Q67`MXb#dnH4hM^@wn?kD;vwc-Hci>?Qafd~^9K3qXpe)Z z$4r_jT_<$LvKX}_^6SWyj#Sd;Jof+d!1*Di@ZR}boZR>8_TWWdozK6edT(PX7tfqP zKMZ^AB3vAml${QH?fTlX#_*_KgTSS%}(+&S3Yz%GEbFwzfzhi*!u$-WgAN>79 zll8)%Do?-FP5Q6?=04>((6l|3w@7r5=7tWi^pjRYZU09(9S+5$WK*m}6_A7!Zta!3 zU4>PNTc8~d2I!jsr2P3%vnk2$BYC;{;7s09KCpa}E8k8jWfju{72aQFFKG*R$7t5s zqo~|a>a0la_@N@;cSRY4OB2F*%HqqM1l1T*r|j`jDnHR_lM|IKdEQ#GvpUIF)_bv_ zZs?PRkhC5Ur>NYxVgs4s0~2%zXebS?9nUB+%J}!UJ$L`?J`)-CW$pKIwvpfS*^n!V{hYKxxk?(!rk?xr6TSvl47vE|)&Xn5ui2T6kM9pmV0~x>G!^{MS zn@D`-J+$Z$9;;`)Bque{k0yQaK4%5WP-iF`z7+Ck5pDg@x~X%zGI?Tusi~lUV-vZCmu}`>JSz;J6CI z{Eh6s8J@)a18iOOb0`D}J?Xr>eaY;Yhh_Jngo~N_C)7*w-x8Hus~U=f4VKEjz2YPrZJV+7u?5ff(F2AL+N=Cap*@jK|pRZ>FgSD^z_!upZXcrNvEzc882_i z5MQ#xq>VGXQTbQ(xTzWUD-n4@6>rBG{UqBOrnU(x8ejf_Wck;=g>9x%*1C0PFf4sj zRokNlXkLTi%{{3HUDnQ*K^s&u2`lvZx(vJ_S2@IeBb>5{gvwiq0_)bSc|$gmDlg3vdcR%d+8SOa#*==Cj*lAX2R4b&Yj^` z!R(BOFw`PeZ)etbVA3qkZTLUP9TwSw!%^{*k{M|8eV_l448?9YAW{dnq+1HdC~-?$ zUEOPWAvX_rl18Z+^!V35rS+tdhF5QmH%}e7%CKY&m6K(jV)Fg6ra$dg&&u7%BnzP= zkB|-lz-Qe|b9|Tf+2R+i6g8#T2kJe{#jUOkpe6C@{Dos4^2+!~ua#{)9OmH0>AzKwr_1T-S` z&>`FsAIixlnUu*>ymK4>*350XOo1U`CVe*J_aFzTBURXvf9er|ZwI!6N2iqw5AOtK zG>`D?{@R^*`Q#;ccoaB>aY0UMw{~i#ory(5AJ??QjJfxxLUf%`N#{e4%v9R#YNfSG z(d0m{(W_jy7CV+A?|WJl3)J3ENb?-(khPcOXKV?s7%P>b*UR z?wwIdo3z&1LDv{+x~(kC98y&m8I0%Z8wYdoZ5r36dw#j+5Z}ogTj`%2KrGR3c7pPh zft&%3secJB7w`dDw<(R(Z?6|;nj#@~5jNJS2E)7?FSr9cGK1L29!_Zmb1xsF!@pz! zEmasH+rR#8` zW4dbQ*m%i6fp>V=HB*1iPa+I{>mFL(%UkV7hW`m2DZB1rnSa%=W-DZKyb0IC{3xaR z5v^ZWkFi)njI_=3usnXcnpn33hcq>8)s5mC@nLco*B@Ba!tAs-V?MM(b(}up6-k-} zEuvx*o2W4_Ow7&=U@Vn$Bpt(ih^}so#>0=T;tN0B1zvlq)4xp&>$wi|%Nsi5;Z4;1 ze>{sI;Mb26rIp!^fza84fD=&CSYEHr$4NUAn{Tv~_5)=mtPss76%E>y+L(aIFpaLt_rWpN~xvDwps1HXjo)-%v|;Ce~|8-why}F z_<5ha`k5$hDaU)f$K7H-HY1<4G8QDRGBuPw?>_5wxc4$`6R0mv9&+4oFMWy5@bT^b zcrhmYGAa-aXQAyl?-Nf2!4%Ae1IOH-TSmrDI8ob#JQbS0ddRG9DX`afEf||fUy?PWH@)TnP{hgUzWR^1{icmU z{*2t?)%zonAl}k)cN^POmP%ylV_^~?ynU{mbvuLLGD8Q=NzJnyNEj`da@N#k=%ZRbA6ch*N@ZJ5eUpE`D;3`HFn=+=#cq}&ncnR zHJ%3n1O`Mp=Q5Jzqzn%rzmxFRnJIc@A2YQ9CF$k28K9vE0Uwu+`tvK0KOF{i zFIDdG&6!I`1KydwfDqmMvtT9}1Z@NyNN8t?73 z*Wyc7UT#TWSMe${qiQsC@`jP$p!oef)J{Ee2c}eK(;Su6+2Fsw)Bi@MS~Z&>$y7!D zN%l?&!Bu__N*;Y}j2PW*;R+P1b+Mb7bm~CL=Nq#d|(fR>mHUI@sHq@P)NRvSl&Q>5GU+#azFjle_geUh)f2%JF-#iB(z|DapUVM zM;In=P;wJ#suQ$x>r*NRh`c@w+-=p{C zalt~lqHG<4xTpn)WF=@~GBo$tqyd??@}wDC&eEOprFTFe|?6wM5_zd#HySjI8y(Wb)m4ER?6~Uv(mr zD*mgz5P3A}$~*Br;KXgINjv|m42Sz1uNY<&*TZdxuK$*o*Ta1RQLu1AL72XQY~b_l zJr5l>`l^Hq4(dXVOoAVk+|F)J>v1+V$BhOh^#0GKgT7^?x}4s`n9cbXleR**IlmV5 z?|dprlP=xrI&}7q%A~{LvTTkBzBwu}Nyt1A3}V=hM{*k>?M5;i@rR$!)n@CEtF-P6 z?EO556TS2y`&o5ckF)B7o}UX?kHmu%J4S;YnI(D~33<%@s&_I=!peJ^d+7*>=OY!K zciJz_T>HGfvs14wjCmaCzqE#eLQ zlGoqt{Ce}NzIN%Hp%?mKmr6LGZhco15tvQ-c zCg|#yhRVZlWgH$FPK!H@sZ7wTG0cy}ix6AQ=WBV4MZh#LU%&enkY}_Zh-Z(?)NJ*b zN)w_k-lrQhFYHmTpxwLiFe=;1Sa7gX>_w)=i(kCnMBw#Ub3)#v?QMa*^(Gw`KfDHJWZ zZ!c1)kphbTe$YEN?xXejM$CCwwQ1JT9Iusn~7U0(HxszVF(c1DavVk2RNHe z>Qg6%sYp(52n&7=tQWzkT=S#vq9coy@4?S+E-3uKvf=g0;wP&gZzGt}9@RapF$A`-hTr0Am^3;tdjW@xGhFVUcvK8$*Z#|~=*KJ{rCbQjf@CowIIYYyYsXP6f zslBnwO;D1k*MF5%F!c0%ZPax+Yj8AJoCSEo>u2;$PmcE=?G1rz&ZQ|%2)k+1x%j+~ zX?38w8&bGZDEjb` z$^VKBP>JR>`oj%*4XuJ+snTui^?N-R;q#f z_!^gysE;hIv-J`Zah(MNg~+COOqngPf|y<%Iq>gr3KZWaBCaovh;$HKjr}?M^e0_% zC7nuADW)^chkP~hqALQdcoUbN{~9|~#XEng?A3a86gXPkq_w^a9lbS^vos1=EXaa= z!>u~rc!(H^T-qmsk6^j!ug<*R@K?9K*8oeo z!c8!Ah8v6BFZ=%1$e4`WKuzf^nWD>-#TAL~0&`e5k%HrclDT@KhDzDKafp2h!)xLA z2i7|{+3Bj5%0mCXUig>Eg`Hu?K(hoe>_Bcw^_Lf2Z-NHu3~$DB0;$SwDB5gmJ8}#< zI2!Xa$0;F@zt!Rr<^2#;-UfR~yuROF!PHOc<-}J|`fUSlK%a7g0ug+;riMO#@ezPk z5QYdhQ4~FobC_mQ=Jp1l1o-_eh$SX!n`AN8&${A}I6>*beeOGcefN+TGa6X`ubb<1 z1uXfNcGhaVG~G8=^zZS{(jUh%`fLJ;=5(k6B%w)X(cF6w{Q!>s+bqh?-8oQ2+u_q> zhm4((acv5AXP23`Hm1t%j#~sFyYK$B&5?LiAd;Vv)FSw~;O&g`?||=AL4=ZDj|N{v zpO|x6?7yMfjzpmH6x{l4z{hbsD-)@87s@0`U%s>F;jthJksi(WcKeO; zB5?Kyn!b>h{js)s*$?y^tKDaaF$WPw$L516`(pEz#J(aSbduUIm{oj5}UvJiSVjg)5@vC!=sj|(9z%ljr{K!z2kYqsu8~FHLik3CH~@@k?8YpB?up zV$8ero?a8i1bPGm5G&?dL1d}&c6}iI=ijXz0#O-3NGl*g~3dhFqPH}b9=*^ zaOO8l7i@nljRhU$_Lm@yE0a4O#%@eA==L}^*IF_blxZ&jO}2DrbmQ2JK{0&1RX$?{ z5SZ(5M7#;-o1?L2owNg|ejj;R0Lz!upR^~&*}nYi$Y2G}r|b6(+~yzjFD$x$vd`%m zz5jy*`2i2Q-fEW_DrM!V`(x}8%<*OBd+@SA1F_sq@?43Lx=u^8SHsCU23Cq>~Gy5e-=)fzFtK8j`Et=9qz5y+_@IjJZG<}_ELLO zKTf$1L>YkvtI=3)$ul!DFu{vAd5w(Bm2w-k2_yD}H{;Lez_^2J21T0D@VVlBH}Hz@ z9B~TwQ|kl{JM)8ih-4}w>PMKHLlUI(rEEJXvXp;gM<|Wa*?t=umnU?*) znA+hHO0U*D;-p^}a^~5EGj)ZWs16DtFvaDC?n?8sZu5P=Gn40+l%SYL_!cMkMqgf6 zos6P(nd7F&;_}C)ZOc&HcxE7efT<#CWB2s<{_!UNZMyr=AmoQSF$Af|Ol;p>$$(D+ zQ>XZzME%>__l@?5Je+b$FYH{y2IplZD3aMD{)<~0HWQ5KcKYAC2%!lKuzexFwmabs z4dETtG241~5kMt-WuO(v<6Te{8?A;xV&Kx1@&>icu()SWZR57IHkJJI{Z|=Z2Wc)K z1d3Gh5=kp&T1NL|jvD7IG}0kNBHdfRa|z|Sae(*o`fk{ErBZ-RJQOEvmD@vBTCVlD z*aV`R(mYlncKIl;{41SvF0QM;$_D2DV}SbhY#VW)xn_~m@5R6;`m z0p*nT)|m!Z9RA2vc8Oh*lmun0Ot zCu@4N78_bDEtgMH)4f!Ps|;5&iRTu>*I>=*ci&8=(Ite|-FKC^U6b;PXieWX4?IDE?f7wAOTL#*z@oNpwfb z1s>NH9A|so2Y67{D)5yiabG?BP<&&TDXkS|%I^1GHLEST$gq~+$5KQl|RCgPVK zxsK{?_(`I^m`g`3uI;GU9LnHvsTt)qCy75!5u&zSqLMna@RJD=l5l$P%kAGMEkpIF z^HNM{r1_^mDEeScn(niOG^mMwj!}>VU9AQf{H)WGKcMqGUqZGO3)kd|!QR`Iul%>+ zftg;4eOOKZVMMdPXVu&`$6YQRlY+>xw1RLcfM*(_{W_htulOJA9EAlRCyiMpn%;c&=E@*=kR#D5{qAU zz19RIg|Q3lP$9|?C&T7vp8F@nz$QP!4C$Mu;Cu_6UMWdP#YlXn}9^{W&Lw>5e%dy!iR@LyptjYIl=*XFI<`6YrF?kinN zOWIs9@p&7p+yGb9@CG@m>~IDn)$2KQgDK4Agm1RS+%&@(F`O*&2_4`)4C~@a)zLha z9LOFbW~;r8su24udYq0#{F~wg3{nYo_<}thU*Gm{`FKs;F{wtTKde4GURBEWcJv!{ z=uU*ARHd1uwhn^7_fYyGVl0rIk{Lh#fYpH7l5tgXNBxv%!^}L0v(3o^1eRvUeeujo z5yV%cDp*;GoU=*}!=8Dbcej31xX>iqL%aC0uK#G1NxnEEv$v{oQ{&i}Awh|F_%{V2 z@>25OmAv&>g=eeW1V8Mh&ilyA;xd@f(q2B23deni*2G0rkGVGC= zJHm4DtM|W!Ga)Yk@L8?jYOzXEd>;YxjTz;~QBy93MeP-}T z$~3n@;Q%5R%0lvkLB!^J2lJ)h$1|CuLENE6Z zvLMOut2Io%mX!+ZlaDQ?Omiiiw7AacAW@wjTKr^(CACw{{+!BN4aHyLU4G)+ebAwU*4mCCHgsvXTspFI z22*u4+1hf1$Rd0oG?k_*8aR3{%Zo>2zh)Tu{5cZvr+u5|JUtuNbu@<7pkW>LrM%gD zV_IJ-e7N(=eJV#UiGP^ve(gtkY!rr-*lujf)pHSDU9dmDxCO)2igX!M7RxgF(Caon z4zY|E)%U21Y`+(10|xGi&19ru5h`6<#(mJCqr$p5FpW7uOua+vdD(hXsZ<8x!fih_ zqr2HM+rzeIhO^0T2e$fNmLYWj&XXUHv|mYV*SI}AaY=)YVkIoNxT@MPJ>S9#KYae5 z-)k2P_km2|F6TDe%dmOu_bJZ?gIJ8wO&;a|>Zvs3cwcEcR6CGunB)h@XJLmLO!eYN zS+rBN&HaV7XHYbO=0bmp2b#8=Xja#Kq9QucI$6wEP zdecp>+XRLXEvHGdS!cd&#|aPNP>QCmlr<=6m?#4A`6qc#);%;<&Sr#prKP&4+I`Pg5)}Rfk|wtqj?(d6 zH>q#)6lqX?x~169yCqe3G>rj=r;*#HDCUz{q_e*7-Oim2`)my8G{#uh6Gopu@r z8mPYHin63>@9_MEX~A)k#E$rdjP=E-VN;9rP5=lWGs4$!WBPZ3Cc^@r2z5kTf|1y z1l3Kx8d_VCnfKwztCYU1tSKkZv)pkSbZ_m)e#Bz+nynPd;#J4lgOg71f5B7t%1w+8j+6X z9RvtrscetWRJ#Dwx%k-kP285jly=LC^X)Rc4EKY_)bRrUy`ThLYeebLf=DIUK%%p( zYrj;#)l-kU8i&>1=j-Em%AYK^IL&1Hym*jk&Z|D1g z^!vWsE)&M4LApk*oF9@zATL7cp8B-7^Ni2tv9WL%desqW!R@#CN#R&;cK)4&I5)W9 z1c!l}eJB5)Y5z?N*U{Y+kI>gE<9F{uz+Nl5h?Rfccn7UpgU!m>pIGN|aPct}u62VG=w*08$THVZSfT=E~uVg@i)d<3h;H%mMi z7%bfEja93*HA%#0eF#WYtI{S25In&HtcH7SbxVHUeyu||TMp-gQ(r9dffU3e6<&fX z-^!u-{|7n86a#l?y-!Yc7!0J+gjy)%^L14sot_Ggf4gn<#_c~J(YfB z9NWT7%fAXsx6}W}Q)6kC$%>Pc`uKiyrl-D_z*LEbNU>Y($Zt-Lcy9T&5+ZFj)+@5> z25jK9Mu?rOD{$#;W21hICWdZ^riSpgmwDN9GV}k<2=o0fpIE5h>D8UsoY1pf{Kcpe zo?HTYm0A`Eh_^r8Q$rkU+q}$MS6o_A(duKa+E!nEf5kSZrX^s06DJmCniRE#^+Mn0 z$~|`{c*e<$6S+RSBN&MLOKYbN2iXhugs9L87;#@@k5I38!HBAJIk*@G#He4i5xYD$`L=`exVdMq}`=pM|Z z-}?YX|3?w73;%~(y1F0VEg6i|qL_6W7eXNyEmNdOJg&9F961(jlXU}DP_8+H z1@4lum}1j3@YKCdxU$Y@t*T;Y7(l1=slC)Jj#rGzALHt?-+ij~7zMu~sy(o**3sFd zRAh9dh-5PxA&|go^bPZ{Qq@9B* zomR662TkZ?h(Vk5C4imBLWf6Xb%!jystGK-$j;~2q37D{dM;ya4|7wz0h*%cQu-qY zHv_g0`T(}#zkb~fGG0`&i>_;cVI8E&b3LGADJtFt>B3S`3UgCZj@IXOd*COizr_|o z)JdnB^$0P4x`xwmhuW^Q#M3aE=0?9Qr$rRgD5Py#NJ2j zPpk5GnT#tz`Dc=Ov-a7yKd}NiGS(re+-poXRwaWWX8+z9d*_KcZf$eibovSP-1qcj z|4A}Ihm!j;AFA4KB!MyPtRLm3uXt*wTf_f4^|Y-{y}tTQI> zf-@nYzZLt%Hm}|H+3#~y@8XJbq~ zm&_uc%18PZit!tTYv;|Hv?{So2L4WS;{GzV}Ky$*(z!a_31xa6`cWFQ@3S zUNam&N#d!b3#x*WpqazF%O1!Ez>5F>Aehg8MfV1t-Rxv30Q}Zhps4=OW)}z(%B+YZAS2WJy5WPNj(Wi{Zib(`sfOb8hQl@R-TZ&J|q0&l0V+K`$VCz6!8 z$x=YqHW;PLuwU4*8!jcJwA$^D>mWDpQe-J|e;FIPfi@>Z!X>r4w+T;&Pr?U`GH^WI zAT=k~?F?_W;zqSlNQ7VY_x?7t`fT`-Yxi_^A-nmF7x#tKM?zp{9_9D9LyVFP5 zlW>mimX0sbwl3@@(4b`%UcWdH*bID%k`N*U$M62lu8=XKU&& z2TYLAAmdijX<~xTz+yr-HeJ3pBzmhYurnf?=ztNPoXK`{9q#&T zNymc>?&}(yyXCunCtlW!bWpH4h8vF>@~epPU3)k&fne#<{PJX$5FwG67_%irx$}c5 zVN6RAl`|T&Bt-C{m+jFE{7PBaRP1ECMMk65Gz(g)N3J*J)*QZc#FMU+meR#^igT5T zRmv`ZtB7V`Y(+jKM%^bCTJ}pArBm#%Bv^KCpwWYaE zU*%NYJ zxh@akU?SH3oRP0?FdlnfGh;TGOF!vTv8k%!+T~3GQ>h87qfm+y5a$F4$H@_|m!6|X zoTwA=T6y1t<)^=PHEr<=bTN=EpFGP+VM*D{Qx!8uD(km|iZC{-G_qVd-47*Ss?!ds z?4WhxASw(xw8RAxGvTc1Su7q$<|X~%k%nl%kB+VRiXXoCEpxr|ys!(Mu!fk9U|?nS zAl;Iaygy!kj9we?hnF64ZcW&J_)j5f9;XEE(TcmdH3FIvi)&At*KRMA6hN3vp!8~$|4?PDwn{{ z3On%Za9>L2C^WxKfx6CoX};) ze8~yssOOXg=T7%?o>U%?ITFvme%MJd5O!O3?YH{t&8X6Z8@6@!!gXU9i=ySyg=gT5 z4la3u&RBm=^Z2d-PGFU945E19t?Xs3zFTSPqOU4 zM_!@2&NrgD1%EsDp~U`?nP_)XJr-sCOJFxnZDQI~C0Jh>Q~f0(#Pe6#zkTkW1?J zKF@pN7L%Z-E2vhd^(2~)>W;xgS9_<3>J-J&(`knZU{;M-(wai)0xXDu2x$}Clj{&& zStu<-8b}*TM7~VuU>5VYD?f+x_vy>s*2r7W9geIyeJuE;JT2Gf-cHxf&2_098UQsc z6%*YL++Wl=$#t?4G$4ykX-HcRMrwJ`T(yqKc0C8AD16>5H8zydJ=>IVz9nZIl9k1E z?(w=b=+=7-$!4YX0f?-nP*d+YkPV7mAXCmTB!<)D7K8pyybcZj#Q^`K0S)T0<0-dE zoIngJMTOmP?lzFV9&$>w?%C+qwnl%?9ZU+w7mZnlfE43jzlrP3ZOShrbWh#FR9WfZ zMFuNo2YLYx6SKTj9&N_4amK>;*k8>wcOf#@=q+M8=%Z1fNfLC=SlV~IBd&TzR(29v!i?cYKg{-Jxq zKaB$v4=tC0xS43_UR!zX_loO8XOj`)ge+fzNk1cQKO9{a%t>l4Gu3-pv1}cqeHwwq-N6OXT0Z?6sH0t7copTjm7d zFH|xy!{guS48iAn4U1S^JH6FVnw*gs-yO;iuGY?fSAhW2z?OW0TC7&*d%GJ;%Df~T zY1LPIOEX!6(F5K(UXlsXfd^ZebJUnb7*)n8BpQsqYFhsfF)9|c$?e-k5lTxusRt7hJjoYm(;peS!7s6ZqG{&?aV0FNM|B{7C_biZ4&7~=R>u@E)d_R< zzx#cm{{VqVE1-2yIb1oon!MLs*PK{w=V!L%%pd?ItGs*6!)o+hPeiwZPyx(iQUBFF z^n{TY5ois2lZ+E`!LoC{2tF`hTG0zzUc;3X?=h-CSfB-ynE!)37H9a5CSldP{q?wv z#qqnh9CMklYQyovYoTXK zDNYH7h4=X0X3y+*X-X%p`bsPapY}m_ns*up^Xz;mkmwGwjpsmSuKQrb!8bFoZ+21- zIH92n|g@Gp{81k^_w~L#jc%E8y^NPGNGw)ll0z1C=%_Ye>~mRVZzv? zB~gxpgv&D=(vNRnR<>i7750$n)%X&jynpQ!WMp9$V3>R?8gf6ku~t_@L*Pj%q?Kj< zzk@M&=YMUSXL^S{QnS_N6IPN zjq~`D`V-;^lk0m0aP(hCABCAgoz@eNAMmt3`8V$w4a@;%`Sw5E^wovX>`l`;l27zT zSg6-)4RXq*T(WBb61THj?~vuGyGzK1Hl;~cUoLcv&0dZ!PhjL(%aEODGwE{;hK~8; zW{BC0^$#iHQseGF9s{6)E^V6QCBaJvxt1=wdo9-z*X@Z7iZbb|g`Js1dNH{mYD3Tc zLtv~Fl|U0Ochn(%lGw!JO1g2P6ErZ>8gAG!%grl)|}`R%h@2mOwg^U)lluu4kCrr0snaW?3KF;FH3NCp(<+D9w;*p>5o-{ z?ypRK{KH>ImX1lBXhMY~{g+vPx|W_kY{0+(q3qN@Cwad2e ztxcO>@h}5?hX2RWxyLiz|NnnX7HKN0&>V`4`cy>P*c>Y7Y@sV%DiPP^P-Nyfmvd5D za~LJfHaSSD}7&Y8^2nUN*m-|PDQ<96#Gw{^4I`~7-7pO44=zRa@ke=84I zn^3=ZFXZ(a)Urq4*#;6oMnDc%`rMEXvP0?kzOdIj3%$|QY(Vnysz5<$?F)E&1?6h3|M@;Kji(R zXWMZ!=eC<$>bao`rl9N~E?GM!v+w?ZQOx4QI%F_8tf0k-7y9c{XhE3|QCKHMnLG|r z=@2@4W)S;TS}>>FjIt=bRRedV+N9bAB1`ry=EqYeN1tuHdU}@BhTAaX@#DJ#yCQ|D zAD%wUP$j%j;jEgwUG)G1pO-@wz*I3gDQ&HYs%3?AS(|QFjy!g<8*)g&Ok3+Ay+b;* zv=EO#HQajVr}6RK@szb<4_T;|vT$0j!TsK)UgFdD{CJ)ZH_jH;E$Pl0s<~EBwF@d1 zb)LBWPp{)K>%#Dg%pN*8PjdX9HYPTu&G>?v8km$^8`04()d**eD`Z%m_}u)@xAEK& zS-r+b-e3rDXRmMtI^diU6ftPxy(;~nZgj$L#q?ks^{~1BUH>6kph_< zTj#1O5E=?aYYTGD3vi@4ZrQuaG(8>TRCdmt!GVAw&y&#xV@!KD^QN_L^m8Ls9*u*p!>ySGEU7wsX$=R2dm`VE5pb9D>|$ zytd4^QaWqe3xOUaXnYi=_=8lG+w4cyY?C{WiziR=wc(kAeyLTTpxV{2YEoa0s|pqp z$+^WFj+!@46TJILbo~ip67M=b&uuH*X*$(J;#j|8MrickHR^sdRm^qPs#D=AyR6D~T%;!|`gDDp69B$^W z7~wdv_4K}xd2oDC;BtRdjU)&B?@sf$SA2I^p+HN1^k>UnFO&upE)1tL`{S(6t=q}>A(CL2mQ7h-nGBoaA36KVN0lyxpAm1u z%o0);L1=ArD6!#VlSXRZRBlED#~ns4y@tEX-N z*%rQDfx!9;aRLDtwx>PV6ivKZ^EX!J7SIK_4s1@)0@x2jR<=ma zlhqZKx2}WNxVs*Nt-VZM#`}f+I9%rHIbzsSxRELYR}4&`h4-~;oBFL4%1f!)Z6>*X zbKAxyk4G_vd&ZWhO07E$?849V*nRFCQPTb9`>_G>^!>11)e8k;8>|YNV6MPN%E!OD zG;}K}h{U;?YJYY;(VHPPF2AGu{N!Zn|3UsZZbC-_MysDq4g2n7f}+MlWk?3037e7? z&dO=J(5}5J+Qv;8N~18@Wv<7nZv6B5YlYc~@oB7~LizxDEk7+fnl$*J?y}#p zd0gFis^y$rb62FfWaq&Vm?krm#=(rM5@kHZIKmmJ=e;$xUIP~he_=S^bHZRSjk_oP z!!)w~!+4>Xq3gxtmy=9j^+KEDT0VBY^4?Zj)>m0S{hw{JWh;=>pshbHlXv_|W{`8;TH`0$gQ@;yS+r8o)z}ASx!;|JH zie<-)p6(Uj@Q99F=mcK$)$+gPMkly2=AUU{74Iw7u~K8)$D5KrPKQ*g0{G>00lu`5 z=(}}2o%I^cPvxeT^3^aR{Fj;?9Bl!$o@9x*=GG@=D<}~TWawcy7UWQ2j-_X$sCP6Y zP66qove4dne1|vRNY0N{AVpUvBQKB@!bEJctgbfyM~9l+r2K6c9smMLNYDz~h|7Q>)BB#LS$cKg-V^cs;PqrE z^A%<_UwIye!4gx#$wgoAsN}1Oi9ZD? z`rF&kTE$u^fv$Ft7^B9ohu$bHaM&Y6Rm3ISg7Dm5{F7AQWxh$z}goV z6RoR8USfWT6C<*^00@PibB0LwYI32-%j8U}uww-_B8!iUTL~0!)P9SXT!yAvGTm2a z1r_b=&Tg(0T0-AK5EDfM@({ug$=`7}@cClSo2%-ouE@KaX#5+>g7B-P@N#Of9~Mvz z%c0i=?0gLFv;gvL5ys5JixzLj+;`BG@ zz*sC#hp}S*V4NtZ0P9VQ-zF3J=OkVd5%(j4e3GX~Vm zIA3QI^$jg#PFRn4p#zvY!}q=a^PV+{T{G>6{*_;|Ua<4{huzC1*fa}%d=5Tx(nBeO z40Zjh-2gsInS;HGY=u#6yGZ>BI|4L@sTvnce^bzcSj)V`t9OEHIDWwc=5c@ zewE!ScqeK_5sKgWtM+>AuLb6BbEJ4YyfEO_C(RBN1JT};JD!N>NiByW z_vlVO_6+6u&ZWUvYXw79ctd7j5pCv`f!WpZjME`96IqY7PisMMSL@a_H2b0jGK`p8 z0-a3CF2f-@vGrhJ<&9n2KW}N3X?EH4HWeGmm0gOHQ5$d63EI>=jHj-*XXw%!1Vs!ICJ%LNp;{T%#O@0X)+1TXRI-A4@o3t^ z5q*P{cnS z>?LYrEq@t&&A-}&C_31&HgQn^$HI((Ji9XM9B!8f>F6T1VG4zefywpKoB!JVSs`8* z+3|iwsrqw>m5gb#8g`(ceBzw#{j*R0e9iKyXvQt?)MJluidBkz8j{;9d5S7s{N?43 zER9_KzuvZU)GUkmfrX~4I}5yH&>ZE0xksSO@6_v8>O}8cE2^89N)!EqQOf<(o+z)854*)IIt&kbp;^31I zDCkh8<2$2T&|{uY1k7w7#IV#5)s78OJ)!5jJAC*$9*mBBVYC@VkxK==VgB;Nwy;M? zDv=?@nha?p2?>{6kC)!V8`KDDnp+Qg@y31PPMY+-jnZ_ybqAs`vGKMa!WRxrEBT4(v!p+i$B4;I zMt3B^q@NcXM(#g)d;{?Q`890B@N2MNx>W1NW9K-&@`k(-XnI6VJ)ZI)$EbC>9vM+3 z{aKLR+h1hB(JDJ4P=PWSUr%TBS)DG~y+Y!RFC|#8vZUhHMeVXh4wsO9)rr;sR)!7T z^sQR=TDJV@y{fEYeD04k@&2n@Q_O96f42!;%oa1)ooLocO3h<|c2++a`b(L54 zLZ*yZTsmmcB48LgPVU*x>7{HTNXI|;eH*YI8d8}I6vjIO?_V%JXqZ3vBCK_P;VV-u zB$e@`Q-`4S?iVYE@z+hG9Z%f(L4<#8aJW)-zqWV=?&w%YgB=SzDBc8LKWCrfTavGb z^WUCwoiR%6(g$X2G)0VBoS;=@WmnyFN{Src3ZQWJZPdc3H3E9CyLdiczFFhxyR#{N z*XLK-qIG{bl+bSjcN#bWhOf(Yw4%-u@!#r+qyuqemkZ>^jeReZBLD{)`>~oa5`AhFVm#ibUy* zYkVT^174#u6jnzco3xIGrwrw zR2s9_?n=qaQIJd{hqYr#jxbuYOt@Lqu>b_F`kW6&Bw96+j@(8yN$)>p{3GoAiGfQZ zcCq?uGF@5L7C7ATS!T%feaD3c*au;UO ziL%Fp@fBP8Zde8zE3PdNP$wl}K>6jDcftu5|DVrIhXAEeymNZ~L`An;zw)5D1E5RV zoP$WrA1;4)tiNjYh+tcBzMn^Wr_-0w3wAnL4+a#~eoGXbclTp|!;gp`=6D#SEXy_H ze(Qb~l%wamtd5Poe0=m)A_k`NJF+B>1FiV2JCOyils1vx9`;j z(GkeTnvq%Ee?)U!6v|Dt0C9e$SfKea8 zG0_vZU6=#u5T#B!9{sb{*y!;&G~}Cd3zE2L#DX)+tK8mJKYK&I+siR^?e;Os4>tt> zrl)6qL|Z|jYLT0Mlfmc~v-%W!SJ&4bJD@+~f~1P~n9VDDGhUo^+V}A{%!#5-w0jqK zfY#C>I>$U=i3)378(&>RRPAn@z8wP9TuJ?y29_S!OZ1NEor5jba$UIl9P9<|O#IOu z?;ega%g||Il67dAPZ)!*ps>4cSzG=>u}nC}trYjtVaoAxn8mMV=teg@5;?inW`#Q3 zkb+oh8E51^Ja(S^I&#=R;&FpYfGGT;(EmV%Y}^^T2BoNf3QWUamAwHPWhTNY0 z4{FGFv5bNXH7F!w(`zsBN;PiKE_G5WX%l8?S4m_yRq5H!x4+8gxWmm|?C7E3G5dGc z@4h?yvR38cU^M6oy)xmS(lcH?Ff?k(emze2j?YQARnKPz8@d8B{5N?!q!indA~5pc zcLRBZ)o`^%kk#JP*Akyyf-@2qTM;=oiRj`Q zCu$9bEwtU^aPGKb5bf9FEw96HbO=DL%ArdHHvq7AhKq$JB(! znoH@aWk!tm$^R1G!(l+DsQ0nID9F(zBkGwO{*ri{h<)Ja z?^ZI71vKF2TmwkRaI35m#Lp`BQ@DIwq@Y3W+5qlCIC#vk*2h=G zMZK=wM%_V2X;~s6&=?Cw(7Nx0i*sGmn;_WR*S00 z_v->bYI>3wCfp3eHZqv?9}9jZF48SvAjU>nlbQ%CgTCHYJBzm{{>%Hb z|M#|&Hdo10k8we{jc(JP_#{#m3Uz%GYr@ydpRK`QC#%0N{u`6 zAhByW&O*fg4hZfo9HMUW<65 zg~2MQTAlX9Z(kGjBP#E_6rT+nr*Uv~e?JCZcQd{;EGAZg+dU$IWJ{#xT8|w7I<6sB za#ItG!tEB{aI8i!zbtiXIu`#8+oV=jB0!HASSSFNP<=J`7uh?s({xtnmB!te%*wkO z1cJSJv3U{%$@O9WALJSYnu8^dra<)0(1ddf7LTu;TNql*2LYy`Dkz-6 zOhU*@2AqL36I#piqza15-EQ-uf*c`wlas_b3+)gfTZafX!Bb31iw^uD^NP{+} zii@vue!_N*QlmJfW=^T3w?+;GP#=@SmDTGh&QhjPlCaj}(Y0&SR;E>Nr4%n%{EL3qbmqzo4(yooqwqhSDZxVY4U`qyV>WiR%|j zlH3PYjm7_iC;-Z|$(}mp+~n_b4mMXb?OSZdW0^*A_{`XJuy)&4&}GiVB>}aF`<>7h z_8IfS(>HzN&Lh`auwof!3|}-wu z98ITC<%?;y!kp+=aev!-rPI>;=(2O)IK?)gcOVn|G8~Tdwky{suRE($>mV>$W>V&b50lnJV#;KdT!d%HYL~Hoy*i8>< zZo@?Yv4>~tsbhb%M$djisdTJP8`|1(uKF}8u9T4PA8qu6;0^jkw$_nSxwS^chFYt(aYQAd^_epL^{Qz_lofVDkS?uWEUO{ zSua+AhliTy+7BDuE1>UekocrLj7QN!Ixp7dIKGZY5_9X-8-y_A>SQ$0e)PthVFEjz zp=Yb5!pAOkYQK`J9!+qL1@o&tVQ=BV|LtbGV-=QVBc@(txvd}UC_ten$5)0Y61yq< z8tiI*&P>NnIf{)>u7)Ir*!n^Hr<=LXfaI ze?#)Cr*I)S!%mJyYeE0^vxCm~_WYS=T=uWNo&rvvPy!Bdy=Op=Rx^y_=Gc(<#BG9V z&?RdehmS1UW!S<;A&wU9!;cegh0a7yPz6HC*Xr_xgSQtS-dfY5NG5XG{*Hy=`wky2 z8~7l_!HU1XP9b8h!sX_-8|h>Wlk1H1i+3xfyY6BH4RN$NaXUW&Jk1Ue;8!pi?MR(?o8oN0EusvhgB3Lb4pW{Bq z4=H`gzu^O-=5tnuUo<>$yW*rADjt`tSOXAcM%eFd$8VnYmMitYOY2bPyz{c&h4f<7 zbZ8lo8b7|DKcN5$X2ugw#*iKYwVm4Ba4#ho5rul)df;A*JY-s*lyms+RoIL&`&TWW zK9$C>XxYU1kI*Au9u+=UVqPUL4N|C2%FO@8R8;0@9?R$RJ9n?FP{2D#}Yd7_7{xtbFu`k1kd$ygnBW zXxwR1=XrW!2&%YDkBvV|MtY>w41Te|&rIL$-%K&}fRE@tdJwcB*P?b(5y8bk(N3w4 z_v*QuB-OLk4bzOpMetzEtWrpk%V?9uAhP$W zQRo+?x#ql9W3xY^?h&-8i2$n@XGjq*Tr@Te>N4asAtYDXMVvYF=B1ar14B#~Su$ z(3AhQun>m}2NcYYTgcEuajmBrPi<7#$doiCEf84#mn@Gr+&ssy)11r+5A((Ce4TO9 z+Cu0MKLptoj1N9iK+8&}T*(^wSPBW=rl-Z*a}r2iwKJ;j=FXLjlZIfW<0L>Wt@a*&OznNvkFH~ZGQ;^=O@43u*gcDEoO}MA17o)t; zdg3(}9{If9xo)_oVOQZ>wue4?Dh`o)mI8RorlN`;?dz~rBQGtaw4(px>WQznl4JLg zW}-k|^yfWoDhnxfCdJEj#x#}9rMupgj=9Ac_UQRHYkq%SMS}o?NPT4Ge;o=F;F2X8HiBS-H zr1*Km2T@LY5biDehaIgQKsVnt7MQ*(S!%}tz1lBshS{PPjKWB`v--og^8K*0Mav9? zgIuw@YhtAj66ukf9D?=sm73QToWJJ-1L6!)97NgQ-=o~E+7*O0S>~U zV;Z8;HB9FZ(z1FkA@vd7#4+qR_g8}4!t^%G=>Vx04~CJy6mF#UVtLmcWap<%*SG#V zke2_*QT%x+#qG}rL1M5)D~6jbqP2P(&bke@c;|k?N=L!%@--IKWlaDO;oqy{=|jsC zk8=k`2I9z4_`$0ODrS?Ai_z$g0w|Ud9nsP$_xk$9oov%uj&#AMZ^Qi*d&g?j)m>m) zwM+4OIp4AFRGy>z;9VkxF_v`PJXg;610m=c?M?TS7vGX^ZD~Bzxa-&9Hi#H`PgNs( zGrt&pPjBnqJ|B@cS3|1{Qw6CY2AP;Bbf}x^!Zl1^3cGZGJ8SZY({#ZOQ6Fb51(i`v zYgnzQQD7}z4pFl}ES%r0K~nYg%ALN2!K2?xXbxKu*xulPKhq1Y&~C&t#(k7K(G+;D zM4)x*a9vftLRye9gAA`+5w)}Vmc}WbU8MAPqAtI@4m3L$T|@)I_P*}emHhG|^Rh!p z5>UU%g!q)J#UxNSm&Q`$oE`K0EL(&OlkmOvgTn`Y%z&zGv06>5-Vc(HvIpIIRK9cg zLUJO5ZxxlcQX?cbF2h{VsXf9EtHcMlF zyB9sECJdfGPok5kjl6k-g?^()d|Gw2w0RpfS!-;xwCq-PZ-BohdfLRR*gpunY{)>f z5lPzXXBOo!o?U2UPkdecd@)wO_-H}e70-(+9WxQ@Mm17zyX=1Zhn}HT-wT6b6_<*Z zgAG8f3Eg=}!|?5m@!#;^pp!fGIwb1(rwET7R7b|nsr*(nijIybj7mxZNf>7tgmaJV zh$6jjmrC1DIlTHP!CTBnYp53l>8M_2v@toq8@ii;!L+VHFQ)T#QCYU|O zWZtj(nmtj*arrq#Lt~>A1APa`J32Tqn9hS8Sg&eX!%owMpi6!KhDl+x{P>K_adHwC zE`{sVRJGMyHe^19=0IRtI63G$qbn5|4I6h*XwEGG{bC}Et&wUU9#+*>X-Qf4uu&1@ zc&eZ%bn&xwnT%<9cqHr{HcoF+X^ct^B3kFj9lN6VbQw^;JeF3ZZE&VeQU2Lr;y?%J ze>mjBuh1d}bzBdb$QdWAVlWF^iv_9!*F7xE&-ZLu?Y~rU*oOsy5kxky6@Fr`#Cd0+ z@}$J6<;5h~cV}T8JdvdV`gMY0qw+Vt$59*O>-mi)qzx`tqS<5MTYU2sXp739r-*<1 z+tf61Bu*CDxl3cO(D|voKwz;doO7@!e_@LUd<17P>sa*JP3F~}-ll&P$6{bM!(W{c62-Y?&wci|ng8Q>Lh*?5nKb28C6$fu@deW)K z?k{eDfc}MnB;`D1cifeJZI27mlVmR{zff7k!N(NEK{tL!6mG+#)q?PN1DlfVgbIyZ z6qJF-=|a{ysErFC&gcsPP)#Ag>RFUmv56c_FCKRf*_$t->MF;AU9hfFLz18MAYE>&hUQ0+GdO&)8fIdx&|L zZ;|Q!)?){8A;93+->JvpFIap?3G-FHvjYB|KbjLpzHfThnmGE1HfEWGD#m9X^_Tj& zE}}T4nJhxO2=@QH>aUOzBp9x?Ad=DJ%#X;ekn+M;itUaC$4{Cg8G6m2r-w#4svDg_5OKQ?q8YhZtM{S43kuB`;o-H4_9s zxoMI7+P%jrl+>0wft)Q-l*sU{TJW$G^@A#D0$M%u`lV*bP|~WhxNtK#(rk)W5vcaN zv7Q@q5mFh;bocw`PFc4Pv0b3mzX>iHr6WJpzj5|D@NTG^1;%71*J^32D^|H=N#r}W z8&b{I&!$;OKb~KAYSH#V@~TJDK6Rb^CL`t}?$F0~cgz~tSORX2t(N9*vJYT{ADljp zVfQk4%p__1|3dC#rF-!mto|#>lmErsla4likNH6Q8NS-8yp9pCzo?@5s^<(Cu-(bd zeK)G#soFFV&Zk@@QlbspS$Tz#?QIbvZl=boNbO)Efpw)KSpnC8k0@F!pb`O3C2z># z$Ile70}KwaWj z{Q@CxX~Dub%{!KgnR@zYIA-2(hLj>bI84OGVKCDsy$9%|MCRw`ryCOy2?Q7niX&R% zw+}|}Q{4`Gx2`B}7li*4#a*<8K+Nd8q<1_|K1RmFTkzAS6wtR@W)!b35getCO8o-3 z%yIA3dcCG(BmT{ADgMH5vM`j!qis98*PAhW9se{s^+weeEs&&G|D{z#mN@@YJ#YhJ zt&f14NG{kkl2?T}@&2cQI3xAeRN}{f>V3e{{prmxR1;b5OE7`(kIR*eAF+3?h6=y{ z$?hjfG-rV^(hvyk*ydR-Uys5?&lL%rMqkwb?=gq1*1F#aALkDwI*hS6C8C^DY0ut; zD}p$U?Ilk6`EG7^p4`FO77cr+hwQv|eoDMM4_IPy1Yw(nS%WYcXV-%C%4ut&AopDzn`;uug$xd!sLRz9eX2*Cy!t#Nl8$ zHe$5y&^_Ss-rco*9H3bB^<$5yzOfGMtUEaDJ-J&%jdL-HrT4zOcZprBIl@23TDkb%rf1++;A_Cl1p#t3W`~q zkoC8J+;7>o?t4!UOb)0PT8FYoT@a3a@y+1jn^q-lGRO>gv}t#QV5}U`s1t8IukxEb z?i?cIK6)-eXcWiz3O4>=|MB_gfLUBjeUDvh*`0#IsO=E~Y)oc%GmTws1FAM3xT@OQ z@FajWFycbQn62G?cdOnWNa0I&#I%uYKPtB@P|=+`F9%%nZDZhVVr)6~SJe$E z-s6I*{cpP;nC4wcARt2kpj|`_cJ!Z}PkC@2{+;fDRIkBuy|4_tsifz*+aZh+?S?@3 z(^;vb1H!n8dePl;P5Yo%Z&9>qW`p&>sdHtZ62E8Xhj0ZwSQ}nE_ zG(FS7iM^VO1;iQK&f{p60}=dcKhvW+DFX1&u5(Bnzu`CwCSdqkzT&+e2nooPk`NfFTzi{vkO>@n$i7G^7( zu|Kbat)-D$m@atx-`j@IKt$auab(rM<>M6b4Wx^XgLPi7hZUr{>61M*0cORo zqK~*VK1AGWaRyfD>uovPJ^RsO$jZg}te0vw3So2Xe_RZxEQ67ucZI5ctWSsUYyTfa zPMG62Nn`)$d!X~RHGBZm7Aub@j;S{!8PAUC&gwz?nFM?L6E}TzK0#Hq#n`{@cj`?& zbie0yfVNJe7N^@W-M52CqvM}Ai!-w0WZLFiM{V`}KP0QAj;15`Z{OT0;g5+divwg2 z@^Q@?R6piH9KpORH-q}2pQTnG&&W4pxhVb%EVv0-4_*6O3)OxvM;qmPs?P3;1ij6b*JO6Q1 z)~mz>Dh36i);p6Z+cZO3L>CLyl8gqso!Dw{ke>hVWhh)V9qr#%^%BvbA59K6;Vt{3 z=Ec(RNJ%$Y!NaRIKg+()>oHI>`zb@I4W+OHaZnsymSit9&aU;&d5Z|(CuZo0q5YQz zvRgWE4UXuLWfZv|R%x+lNsv31XdM&kG9cWNK~7 zUE+CRm{x_$K9exD1E==+%^J@t|8GBvvO=ABEaQ{@t}*&Z)f?UcJBSQLJvUXQ@JG}m z!QkVgvwsy_n?E7WhhaL{U{-uo^;A&v0>xRfln|S1UlGpR-lA3W>}kL^aK||#@h1M{ z8?CvE5@{V+-n?;US%^_-JKNko$c335b6JG{;8&N&R+B?|&FICd-h5(u@QN$3fT16J zT7eIv^fp8Yf3BQ;@ZJ&?a0`VEX~S@^+)47*)!xj2fHPR2i;{y5z(KBqoY|iiiiJm) z5>%$6sYI*wTaTEYu-ji$(5#0Ib{&&cmeaq#?gI33Fx(^zF=c*YNg5xOX!qxQTLGgz za8xc3vR>!}QjXrszBjKNd@pIWy2x7iK%xX`YI|63^Bt za0}V5JPlheM1oq+k(|EvQY$;7){WN`WGG@@pRLi_75VJawEYxy7CzqqnwIU-nZY$9 zWAsFhz!_O4B3fV*ASwcCrMFZ(%g`IYJfc>t zae#;9TotBq@#S%nkd1U=#9q~~2OcijN3T9C(Ku?s-wL5PI6QizbX8}#?}j=*4}pBW z5g}w>?Z)M%Z6!j(h#8U1g?wLSZ4FBTaXKwohGOW`y$Je7?o2womQ8AvpQ8o(JXi2o z8lL3#-pu-z*C4a`erdJv*^#;Qg=-_ps|9B4RnFeS#nD&xgPo-P_5<-*!UWS*Uf z8IOzdDTHO%La{#a9R)iJYt~Q|bGZe`e1`xwzza{!$C9@M&`B9LTu#7iEnk&!Eh| z6du#5db{uU8K9+;3If>VO6FF%|Nr(0iLvgH6^v07vS_BBVn$<6PYu}$l~40UDi60S)(jX1SBTefay&0TH|K+uy zH2PR9xsdhg>l!rGgV1Q`K=95!Dpu+Rmt`_0|H(*&|F1kh^N)*#Gy7*@y-?xcqqI+$ zIbf(?DUOaa<#LspEII%x6e_Q~M;>3V9#hi^MWn`_ZQE|-;>S`f$F2bXJdsMkZPSF4 zL|}>s;HJ92O+#Cy{ePdWHeBs6Vx|AKDTD6fn{%l@1*D&*kt-c`}_lDpGaVC>$*0C;@5)DonMDGUq zzl((~q)@BrcC1?%cU&hrZc}K@Z|=}2)Kp6Bp33xI>hD%+X2C*SIPZ|Xx>BTm8spP? z0dVNNopFR{Jf7L9!CQ&9P&^QQ(gKBQ&=;=()anv`7=S<&-7_K46J)qv41pvBd(hE> zrMf1gC#X`LI7RkKKJMN+$6jV60kkqfTMerCafr%`71tC8+}iQ)cCFrb4JulB=EZKt zUP?_(wG)q-DJ@(x?;*e+d-k{Il-wL+FO4I#NDB~k37{#GoC zcs7mzhh=fjsatNRJbeoeXckO8y%Z+X`|ZIN$*yIcvs_g0Rjdrh0p5z9zXcvgUg}RV zoJ%DX8a*Y;O71hHu0JjQ2V~{&c3NP|57`wlNMsY-ZvVP0z)GN7j=1nzlNSTmIw|8J zGTtQHI8q1a`^E3yQk^VT&wD20I`swEWgCH=^>6Frz0_KyTJ6-6?iJ=@URgj8lHmTW zEgDiV9s9_}KMg#7uE7?uKD2m?%jWDVJ@MviFa|iExUh;Yl9D)gzZ`Vk`>0Q;>Go|m z5bsF+P+IrJGCAhwrh#?LEh5FI{1mp#A7UN-w#_e=!+n^|$R~jKFM*UIp8znKrd;@U zT8+33hI@Oyd4$6M)v!_Y)U~1+@ZnO+$(Q)Z@{1Rs}CBc30qB*)+)M(cMou*6*Y1d-|q~pQfhLdj=5bGE3eM_)fpuW4ii9N zcg}vkuO<{u7ZhXW9GHD~W_v5l`jlWen;)ZTzo_G6r@(^2PG98~R6qA|Ifh@ZHhnv4 zZ&bDZNf2EZT55l9x}(8OySlw?!jKUZG4b?^dj0BJQ4*@+j)#Oe)}Uhs*7c{44up?> zALBWVX)aAio;p<5_<_XO&IUsoJT0y|E*5g#`b4Kz6C!v%DgEA#sm z;)uPJsq`VFkD85|MgA0YKdW668i&Rh&8o+0WP7C?tH^jW?7v9ROu)?e;pc-*Ly<0z zC|=tkKG+qun~4{lX`y$!8!8bj7i9&@@nLyL)#J?;H5iEi(R5Vp3p4x(E;;xSxgXrVU7@1X zf4S-#nx08u4yBp2hkMp%*L#yu_cX>g%;f>{j>XkVF)Xk9!Ft z;jn_}?)LFX2*D-YQ496Ih?eOivLj_-$1QIC@@CLo@KPH#m~nXa^Gk1Qdb@qPeW1r? ztT0b;jai54ZeBdSxnhN5lsJs^B$pws-3+-9W6t!)H|C2{q6haqw)ItR?;?RcWN{R* z8={L|y=?tb_7c>}n*g|V%(A^LdgkfX_lLqBwKU7T!(eY@M`B|Vt9+gxeNyJ8qzo9O zb}IZ{I#)-2EQ|S}&%fY}n_uE!wJwPuzW-yir*VSVH;r6tSAW9kbZlQ0(s{-C zfERVj152ZB0Bge5lVYEJIY!*?Le5Ij5}i&RUM=*y?csNmh^(00P2F&I)SZTm^Al5o zvu3ql!nCw0)Ed4~(p~s=j>sX(7++c^J0VN{jq|&c-mA&iCOe__zkwZ{zRQ5alv^f! zQq1jd{=HC=zhA{P#r*d*a?ek%KB~=EFv80w2(7oz7+B36YCP7>+q>mzW9H)OOYV^K-GCdN%=gx4o!m+!fE`VheQSLUQ152-lwd`qD&@N^ zc=KTuF8X)Z{xNS#*)w7{*U@?q>5-oPs0Ary#aKH){wB4G=-v2zq#$<)RNc)ocjp{F zD)hY1xf*QpcTNix&AG~_I6J;DfI#9IvAL&e0+ZDnWc@yG4$6V>R6sM9F=Emy$AKjP zpkk+6kH6Wo<(m2J+Umrdz$tOZ=0?E+>ZXF6a`Ps~*$+K~HxQR(ga>{y8aj_>{w8l% zvz`1y&vZLwzG5XEXgRmSNaIhenO{r-F%MCzwFtJkn^3DTW=@16QLrzRPF zI7oIB_fS8$Ii5QD)wymUtVc&d3adn8P#ldG4O%1~IX5d4Bm?Fgqg~Meu;kcq%b-4F z#*%~cizi@2(~+I$11r5hFMPidqcgnHiHF+GwtZ+`sO>vVjX|CMuBuSBu5 z*Hk1Iq&hY-rP1wJ)s%_D9dAY@^&47(S@Wc{rFvUZ(PQOGFEM}2sG6K6 z&U&TMU!~l>CYj`&KKkwP3Q~RxC$v-pOAcH1sr;URASDzk?PT%j!sxm+b#Gjp z8{&NO1lUA}I%Xy*jo6Ere>Jqj?ehovQp?umd?q(1T=r2JRjs3iukldF0@rwFDl_yJ z0l+`ClskmYMt77rTG|X#=O6274FX=Q%s(H|lP<}SAbb$6)vBuMOI2SUx!ONwbvrmtLb`mYb0EjkuQTl9<`&{o zSiqZ+X9+1KRUt3sfb)>9LFy0}QNlSfcfr!p9<1EL)hRDcY)gL#W$E+dBxvkO( zcILnT>1}*zGoibYF;C-NQbFVw$H2&q(f><2Fg-xp)M8{C#U%s*&qI;lwapKg-k*2b z=vf#m)H`Z=RW)FURT=)!1JusZ7fPUD11GOPOUhMxb0c9dYQ;gdGK`!{|8&JIABYx$^`|KT4k&NKrSU0%U>HO}3`4dN?)Mfq8 z#5Tk?&qQ_Cy$&2ynrfd^bQ$2zE2GVsGTe7ht{;S<$CsMB{A}D=D}xWuiT5Ka1jBY8z~Oi;<*eY}^PgqOhaO!aVtueP8$uzu)N}OWRvSfX1uD z))db~w%YdRKLm{WPA$z|5LDuP;!e38$O_t__%}L05&%f*c?( ze>6XjI##*AiM3h?Nh1?^>Xi#`&JxdC@;rR#BzrsU%>s3Tf4XkTmvcu_v%SOD^M6t! zt_@EmFw?##F3%~euW~WdQe9HWzn_W?-`3SkwQENCXi;+fZhLjXj`1#(MLPhO19>SU z7=V9H4&8$wy_eai$YzB*YU1Q%B>bx5QscyK2IkZgWM`eWE-w1M(At`q{@=Cm%f3{% zGcgH1LmF;w+x{xaHTg|)!1pT=W-AKJHlugK`@5q9<3d13)a`$lCpc%1CjU-K+3aAaE>c{hWYp5|wHgxDf%W;sT6+zS)P2b0yG<;FpV zgGh1Fej8W!_B~Q+`oi%{asKn3vgR6MlrcRx`me>OAjpg*`Vd{#u4^7nUNy>U+3|&% z6jKkiV}nLn4Qj9J%@EY#SNUOrG$~kyi3cxx;|*yBx6Sd@NOFx*m#I2>W~U}Z>5GA2 z3~|MQ;&Qirty6cL%!is)UcS_y4O4+qo6d80krOur2>1S-$_>9(MGJN{Bx+C)k*cTQ z-e4n0G1ziEm0u$zN~bn2G4x_j{BYB$y)2hb2c?TDW>)hVsTo6#IuCSCH45Q_e?lsm z@#a~FB6n5(5%T8jH#rAq{d~!V{jL>ELi-IWxM;XnLYlUk+EQfZ-YS)AlP4a<-xu~T z=Zhq&GNb&v2J3caBeC-KQdd}^TiKlm*?VV*GtquAnF^-i9k<;RQh!J;NH60JISmKL z7h{k34M1sJD&T`hm&y-TtFS@I$4yt6xL_&SEoyI-h8x%$r02-W1QXvO`BNP%_-42= zN`(bg7HAE@v@Z~_zd=L<{{J{S8-J$P|Bp|@Qku#-XKF@=jC@t1+RU&zxwoNvIZ~XM zkeS;p_uZVFH8<<-Xl8OVDmR_nCZb~0VQYkPw@hZ{HX9|J-*tX}fQOsM$3EBfe!pJN zCv^b*SD}m>FQ^EC_y+8_Zq-HXG}U;nn-S?4tX61nx$Sn)Q?QZKBmr!>rO1=cnPZ67 z0sK3_24H6$HsGeS;nZoDR5+YK7eQ#-N?UDDXz~WNuB1I4`#9P3#Cjg=N}X*c^_#aEP)(&n){UVZ z?29%nK=uKE=JjOVm$l`%BD;@W zYPV;_75>*-1Th$YG(DgixcruEyT#4=Heg0Xhkh4Bcu6GAg=Aeqe1~2a!7Lck#mFmy zajRyZT9lO|z<#+LGfHRBoW3fh>ry_N3|%XDnbdr&=3brhyvs<%=TDi{QwHxo-TRKN z(k9Q%I@-YVh~PH=8QdxR+(@0_*O3o1HB4xOK~0-L64ai|r-Rwh+w?;wowYHBxLIyb z)y#p3ox;n#phWDwb!gJWYG7dutWDNAbS#TJ3+!ZAMe<2@F`1Sk;!>uR{>ZldbgIgl z7qH@CxaE1EF82-1V`sWjPtn)71G3F{J|%%HbbtW3(riM}s zSt~33el7^kIv^O19^1aP&U~hS^i%;=(1#GOpNx}dIq!H@$q$wQpJ(A_h;6hainnd~ z54uVpuYC+iLNHm~Ihq!GD{3c$Apx8%g3DzlwC@3>|52_z#6#B%4am(WT20b@t}|G1 z!bS`8uMJuaS}H}}>oN?X-FCj`c(g`%D#xJ0U1iuEK}{79te6)cbq&6*?1Le(ID&vq z;$-j%w|+jUX4S)u(6PIH=a;@px(f5P6EVF(ZJ=|q8kd>0m5IA#z| zqI;??e6Uc*)M-4GyOL2c!bDha=7-mqIzbb$c>L(hV1 zRhOe%QxN`YTN`oJ=3@4vzJ_fTvFGhcAB&{6$MO7!=$gvB6kZTV34lD0i_1k8$(c5z z8D7G^GUFl9Z#1o2Z_p#&X6x0rv}5JmJ073re<~fk1bomr9^abPqsGDv(~c!nZ<>vQ zVG6Qs*s~s(3LIhHF-@uSu5UOM7`6Xw8mnP993dO!wd{<=M!YyRPQEH0ynv}wtZ~-MrN40OQv(Wu!?wlge=nRMqk^`X zeVTaRHf@Oodvtyo%$S`Xd8xoO+^IrAG>+0M?7mgK?e*ZiV%qs|8at0vS2{VhV+O@a zHXw3P;1b<2wkSVY(EC5{S}$Mi=$4h%180c#83zu|Y$|!oyQn^Ar7Dz`J2g>TP42cM z?k>TPfCN_S&PnR*tYd}ui#Pc?8a+B)o(&SUw7EJQreIKfapA)^Wh9+Yk!9=3XGZSm9mN=lfkN|7G@ed_1XpJu3Y@HIzh9ywoWZ2rF-6* z=?q?~&}LWGCqDy@RhY zo5Z#1p~hJDt|7}zBI_`V69@n&K!Jv|8?DHePl7YR)vr3`i7FGDMFDpFUS=C37W~Wh zRRnkzl{X)F4#AEEA(4p2RV~${vt^LOa6&>P%^7iPP?AU57koCoJs4+R$B{_85#22Z zJor5UwQ#Je(|V3!@TzF&dcj$YUDZ&%zNUjfob&wIg~?w^WcKc|#(iH&YCt+LG->@L zH1);0{YRbc8l8~aNN;0$}Y|QX4YR~u+eC{rQzl&eER-`2&*>D z-ER764eCKqJ$VWl3dta8+KlEM{=JeXYa%B(Q0zjv*bYVCwnIxC=RZAseVIY_8D4Hj z_UwK~jnkX$-+sbSmwVNJp8TsP?+1Mv+qKCa5@Z~>#M7Mm7jg+4eA9Zi$(c0JMaZ4G zHtrm$^DengvXGCZEd4f_u!Lv>T( zE~VH~^6fH7FjdP~MR!4t>VSvI#LOPLjn%D>ON=RVSwCTqt`BJTr=?2DaCanHRAPVg++&Ug!H%C`fr8f z2FUGW0Z2USbL$r0fu{$kk%T#VH0TC%)9fN3?ov(END>uah+!4vQ7e&KK;KnV8;IX z{2%>tl88Q*N+@>(5XuJJptYU?KEDxZcSEH(703=lR?S9T z!(qmugB!5&{=f~s<%4bas_&$b3Hx;d6r^2g(JiZ%$BJ&03A8~K`*pFIjcy7+d==s^ zpML{)F*s;*F;hD*BfOyc7^OOJkKYsOSagdbFT}2??d~kG#?(+|93+b2N6;6zjkgR> z4*E(_;h{l@7yA7$+bu$ROk+wzh>7RdH@X9;?xnpYsMygIlUl$tL^nFyrdxKAi+A6y z3TT+xYYca=8%(#Fu=3tMsDoZfaT9_we&#-5XwdvPTW^|c)!t<$FYCWtISQGTcW1dm z>~bB{0|94*Or_mua}hLR_bCNfDUwG~T>7)61CvZd{NDIHkj2OGJXDpuG?y-%qVLn= zzdp5?M<1ytWY~9Q%(ViJAlYv)#&(?bCJ?Nkwah2>8u9%I@<7U;O zAT^=O=4?)&wUll&AB17}`YsZP+3Ov37{1=v#YgWvh$FnhE0P744O}U0p3oBNO}l=Y zA^+MBk|}^wHGDh3SeMEADDgJ63mdA*>Z>cl^hDs6w)x;EJnF;FQySZ4m~qUuU95+9 zUflG#IgmlJ%5o&@q2}PYb$@QWN2P$-RA1I{@0vcampJ9>V*?E{(L;ECxSq-kT3IUG z6`qpDwcp@v*`fgP0?mCcIB8m|34T#NodfaI>H;69(x)%P(-YagTa-mA4uJaAw9>2peE0(Ql8ElHf) z-@90ORcgzGV->D&#u&r%NB^EYFN$TyDucSl5KR|d*C!>}y?D=xn;qy8u^Esg`-n{z zhPruv|3WegxD3&*L|$UuN{LElm*+!go?B4l99g4w8vexQA0uDXwnyWPvuB@|kSWlmela`D#(?s*r?VS)k!o=+CvPew;T^UV> z*qN`nc!-qyU1%+CsN8To zgXqy^m;1dr|1o~uORvF{OzNa2-Fqulq$biRToy)w9P8-9-$!z;(+_|hrtb> zO!y-wgIkb8$S-6Pe#2o$HG@3E@noH((n&Kbq3v1}BuGzUKy2sb@ud!M<85uuMlcr5 zAP$Ov7lx@wSgt_)%z>%E=4qlYRCf$Z22 zw?cEtAPy&^9Bq<;X)HWWvN-MFOJ3+Sl>tu!WYUU5_gYJsfUKx3kF%{eysPw<=Jn=Q z(V678ce89_bwAx(PCT4a6rR6Q!aMH-kf-JMy&QfU8q$Cb=g!tOgIsH`v6nNn9z29q zpec!H)TjV^d6js3OheCwyspf|7eKEGYEq&-El%H8Op(CfaK(GgXnw*}&F)6V8xd__ z9$=3&VcoST@4$tx99Hf#XQ*MUB-&VMz1cD?W#!qaJxopBWTcKU9h9AovSH?Z2W%)j zHC(&zIxS)2uQsyz+1?zl%hXFTf}mLS8H#$1{tH4ZrrqCK+RQjqML@RAWbh~R!Z&thF_&n>H;`R@)3x4cVqc=#NcuO zw3J}#Vu3W?t6xcW#jW5Be25Wt^^)jLJ@m^8BtNJh5>P{U+Kmu9Owyqs8hffK*|bH^ zz|6LLM;{YSA_RZ<+xtVqA2HeZD}3b-CfEQsUns2p}8 zV2kt_2`+LE%zJH8t`3PYXKKsg7Rn|mQyo-yY`c^b{mZ?9`BKxvaH}j}x@@!TE8ggT zEPPe{!|P8E>cQsP0AyCqPVC#gp9Ck@A#U}L$x2{3e6wf>&d4?+fFnu_4U8U>EUHR3 zwM9B=8KW(S*{I0f4^I9K3h3#CxUPMsOUl9l*hMZ6Zj~Y|9lP*=^y*8d z4Wt}ZR;sq!g{m$>OAQ0XYMe0|bJ?r%tQW~LOEk|GSa-9moc__w{bR(h97erY<`KYH)Ytdh&fJ(cT zfZCyOJAX^|@?Xd!7H*2M(6P@*Dt#=Q$8c6X7>#;MMRJU)UyU*Dc<%hCFIy`Ac$YoT`dcuAu zAIf8V`l(@QleZIz&gdo&D?s{Fw{@rB(k%ixT!Pjr)Mvyf#1GuubWRQd8IvtdSawLh zJSK*X>B*4!*NH0ovK^ZrG`LgRjkK*M;!Um#N?@wuFHt7hl^?p+Z{#}p-EII^b7PtS z_5PCi!*2R->x&w}?240qevCayrawN~h{RNSk7Y+P5~D3b#JVvdmb!!_`yzu|J6jvW zuV-paCeW3#3m+BP5B{)&XnAd%Wz z@Y3#sUGRfyHFs=m|} zhv3^Tq^z2~CWh1;MmuTSxBXRnUJtic4WFeZl)dS|8XOb)?6=vHrTXR3{!726_l{Ql zkI>lQO=S<#x>HUdW(Hv9=1*}`u%r-k!r2d5#>2I6?(1dm*cI~=$VGK=NV_|v7DqIggWcE1X!Tapgvkmx8KKZksat(E0>r%sLq4H(9n{M8|_Y816N+hxWKKq>WrZx=kuILRStr|~R9Yo==R0>?~G!3u7(Tu#fT9W#E| zTM!Tr9=?d9X48VCVvXRkx|)Vio7iQxhoV7Gpn51IVqy!BadK8YR#IjXK|aC;)8v7( zgIWZlY%r#fUsR3cj72Hsojb8hg8XT>^3kweF-}Zv8P_Jd&`7V#>0FWZv}oH>eGNjl zMH2N(p&W3vPgE6_2WZS5wBAZ2;IB!se9u|LCH?SbTDM9;ekEn62}wuYfB*erx#x?! zZ^u$vgnInFP);Jc>d7=iOTjBxX0J@xC(i(ek#FzQL(ja_Lw$TnTS!ft3pR)>DxQ%RLSJh;{qd%d?ov-fAq( zI6c_X4P!F|uYXU8yXqyu=>t&_wHw0WYGV!M(5gC73*(ptHlI zfb@IWo80Fcd)CneJmVbSN_8ow;(RLw6S!e17O~aQ$$bt`z5az{rQe->_`A6ZzM8bb zmo~C|ylSR(mxs$5p)K1P(jl6ff;vte$@;+k2eanLJ)lHM@usaFU8uAJH$r>>n~`YD33rTaj^pD_kr&1ozWBS_y~ z7~;p%2-h;=);-+&@PZG;f5*L)g;-#n;u|ufY`4f=Y8m+yYR_M7_yuNn40X_0%-Hzt z{TY7I&G8AdW?Nc@7e~x|Dgfh(pK=<@^^g;XbX>8vv9{8h;L0<8@(qsfyN#JaEHfUI z>!2S$epS_DusdYpHYZ`&Wh|(!05+kCMNxh5ZbO<=<(YMW*(|6;sHv8@G;fe$*z(eI zd8uFkY)y;8y$+Voq`hn+bXo)+{2sNzbo<$%WT8?}hWf#J>2-o)eZ=RnR!z^7U9eLU~b!F#)x3F@Hlvdq%JCR=t9a1wFYa7Wq){7n`Z#c+Qvr-7UM zE=urCPCz-a15-{pgktBdRTk&6dm3h=@EdH_5fv%JTm*b1FXZIQ!zas%uNiA+)1zmd zKIc&n5AuuK9Zocz??Vc&9J>baJBM_+5^aVo9k*yuw&_eiX`sde8_1w9k7jtf4jthQ z+C+CiysD_FkV!{4r7`BHj<5DL87f6!{m+&*wHcyb>9*(Drh@PnT$dJ}EL#&axyvSL&HNBmJUZ;*cHTjzZt&_JN;lcbAHV%Te^^n&rq?`3qz#kleMg4LVhzz8r#wEU zyJ>UKoPewxKfXG^7b!d*hYCvSr-w6_aQbZwc*x;Xmx%GkW7zVa;k<0B6~&8bQ~UX z%dU@tr4(huawBv>wJZjNICz4o`M4?ATh#0`0~9%1uFZnOoieJYOcs^ys?euEII)=T?*}UEILQDqQ{UwjzMi*^WC{sy z%7vl2n>Qs>^8(Twv~8n0(5p1kcLx;~6~og!_DnA5E`wka-ElKP8wZYKN-GIE$Oiy*(>}NRcDLP-U^S zqGH@k^A)Sn=?F*3-vjxQ(vE^VQXZf4vWVWC(gT{X#u5=sPrBb-bGs(iAhU}V5|nvjl_ zsvGb_AojqHqgnxabRHtsz}I_Q=9X{Zu91J^xWTz@Zt!X_(tEpBliYBv>ZQzj)4BhC znckL%Dc3Nc9X3#~`upr%{Xqr;emiPb(1>=hFnD`|F{yUca09^Y@<ZPMIqoghGP& z1ag_7z-t6u1*rq@Unl|mO@c4CL;Enx{@#I1wutUkP?ufnMTCK(zQPH&*wWm3AgBN- z!i7?sp`h0>wl)4!98Q*QO-Ua9LtHIw*n-bemw?XoM3IN$))v*;_GPVq{_ z7~I%qWYGMb6p2p{0(<2pg@eujCkVR)f^It^*Gu~dB|rVxBps>NCy)sB*3$*RGzLr~ zox8Nom9&Drg4IzS2c64B27eINZWGXBZ-pgZ&SCvWvat#QfNX&u{SLM$mU=_ERII}J zqIp>?3eL~{RKkq}nBNN3134V$mrL!0%!QZugH_t5<G^b>9qKeC4$siar+TRpHrJ3BJvk3JV(D{*G1ya#B|xG5`{oNn^7LkJ%G@Xe|Xz z4-+3IseW|Vqsnp6?0CdEH!Yt}>mBi9fh>4@p>$*+KU}M!s?`_`neCC}1TV_J&67^O zA56^864nqEPEC$>w=E9n#!z-b6lqz_P;sjBX9tXWN_S3JvFgZDtTt0xkNG9X;m1o$ ztg&wT?eZzhgWRhD!*{L^!${=LY%9{qrj&*4jt(ttk^Q#bTd|5P<`1z_x8|S2`{=Ay z9AaI(9vHK?7mt2;(_6cFKJT1Az1xcOC6e4jbsZw^sYSz`_!YcjD}R8vUV0q4s~l_aM`MOdePH8Oh%661sE7Zc_S^=%EGRts{s7Vd}kIEq7JE0s0Y?rUKi< zGuEd=eNmhk)il5zi{Ux92n&KT3-6d<@5cMLBee8|m~yk~_%rIiNA0b)8pi=I)NP+b zgZ~?Ovr{>RwJSV!);4c8dRd&160K_}O%v$1nzdmiEN=1L*~8brl4t{5vkLWW<`(vHR@7EzXoX}`pk>8%_jewad?W-{b7o3j*dg0J}vmZht ze8wg~-etDoPJ8o=lh@JenBVsjvFhxW<#|`D6cJlK%=Uh7$$0cxE_Z&5!=R42v>x2v z@EF$FMV)3TTbPlW5-q`jgOTAa;kW+0HBi@i2ak^P z`9V={V_xplX{U2j)2}>@eWt${YU6c0duZR?f5_dnz$m*|dP~)?J>YbZVgPZ!<=BWi znl76CXDHcEt4&RYH7c_HOuO4gHeB|OY`VEly!?klKnHRP(6yv6JAQb4X{|$e$J4*2 zJM>m=nQfeKq%V9b-qyVSj_J}^V#Y@u$5L2Uf zlFxxLsR;r9HDU7L^U5JRcWABWpK>fIc`&%9-zXS-FZ6?;a5 zaN?FlC48UNw2*GED;Nurnm3%jOobgw>B}a?7vZ2^pdcR$x2e$@@_Vf%qu6m$+|Q>m zX&vbM#YJJ6XNE_&?q^8#;Vy*)GEb$-uRl}VGAyyH=k3ovRnj3<*Z$Btoqw=_lHWkY zfyG97)-#U8AHG)g+sOHkyDsi=L9JUaP!Bxrq=y5Hd!wAco|e}*fab`#5c}6S{oP;6 zp1?odnz2kKlt$R)k*pldEgQ%IRVsle#gbd5Y7tuBQ9XxI>%2zP;Xte$XRFJl<@xNW z)Qp!%0{EUz-#d5WjF>Spu5z@#{Jyz@YM+a#P(JL9scZ|3(CUhtppriAx0$o-OZRB{ zjoFAqKMtF7Z2SXW%RKZAPNoiK zsM{T(b??xUXzSbu&ynaG$Sz=kMYOc2|6t5J8!&RDK$4d7{djXwHctNSgax|TW$27$ zzdW6yXBa3;V=1418qf0h4Q|Y4FEuQUb79a}XvKNrjSQQX1NJeDR2 zhtm@r(C?r(3L{5fq6<(2hqv2d8v9zI~{ z3}vkiX_ye|sadMoXV&0p|;JIDOR%0>}t#3rE2*|Ew=u4 zm4~}T*8A*vO-m4CFosV1E&)>TJ?-e6lttyDtyq$+Wx(hY7d?*Ng)c@Lu`}T?qa0t3 zN&uLimh#L47eK*t{2@ttY7%#<{49$Kther)vC^`Gvw?0Np$5XD zy|v)sdl1|I_%ih)o{aU4wyPS(wmArJH~@qFRCmTAQ_5t$)<1%#IEwh)1g%b=upwFSKz$ilX?RB`s`h|yYBS_ z1@+*P>W;tfOd$#?d>P7Oakp1t_KVY;$o*RS)K=SdiC4#>I(HUbI_*I2(apBWxmUg) zK(Lm5nuqR=qLQ{u#LOTUxrCxc%`Mv?xZ3Txu*uOXqvaI&xV#jLQx;fI>Cd=&b{ z2G2+<@O65nhb#^Q)R(N=_I=UY1l(x}*4}H@*=C`8pls9Gl7Vx<$5_10gyoC5DQ!B& zoUsp%)7RMBv4lvx6k}a)I0H@lmhKT*$r`xHLEpy|s}=b>YK<)+s>JQ5?)1+cOipN^ zdxIq04e=w}2FrorIv)HrI=2)D+r)}T1*MZZ`oovuOZGnAT5WKr3;U1$oN*zrHtZ(r zWuNue9oaa*rJ#~dg^XtGHLtvHn{C zI%?N{rfOuzkg&ANbmoc0r)NLcV??o|_iCFcP|{M}u^P6J9zN@ZudYPNFnaRz@c0Sm zv22_4OaD+$*3FBOEr|&2YQ4B5X2lEKG{w zSA6mA^H11u`0IWeYrm6Mj(5apz^4r-3tT~2X?D4}zR5#E_H@N9g4#_o_4 z^$5-ran^X_YS^Ra2;~ZX-Vq<8Y~5)(5M!Zlm-jaHfm=jjK7QYfg#jokhK=xoXHwID z`jL9_B$2q5`>oJ8&l5v0UhBAdK;K&1}@5ZX>^Hesw z%LWpR$p&gD?L~gV|2$vNb^IvxI63zt`Zgx)h$j^D{`goRN2KE&*MY?3^Al^g{^nRi zCNQYX?QsxoYM$cAEY-Y53IB-1q~v&U;EoB@R%1^uT?cV_5PX6 zT?y*b{|_^G?3r5difQk1viGs-epo3liEE}+*!u9#S?V8&b*fpn-b}5GD@nI32oU@2 zWC42oT4M)&<62^sPM=7k?bYY~9~f}n&H3c1I)kqaF-^6cqha#l37*{pRyp>sQq#Dv zIn)t^S{sAvkoNsO;Gh<%U78dnaZT<1g{;yw(YdR^6LEm7I-b1kex@*b z3!wePE+HTi9-HHz2xc@HNpy%WQ<|xRMKQ&wpqBx12lyxFAB`YiP3pX^r+=L0pas6> z2fAlUq8j?;*51fDr?PJ)Vnm5tR69pmsLFFoji3US?JDQ-f$#^OOvxS zpg(_Eo0osjiP6;3rph@qhfVD>jn8F`CS%G58!Hq}rnBr9Y0xOMq zA#;61WE@hjdD^9myg)EjlQ8|Wd1xw&F7`)B=InhE4yp0=<3aLmU2=ks-+kL02NQyp zM3!ncNCRtST>~i*0eP}sPu`a=MQm1+jQIzAO4hljr+M9ZO69z z9Ddd~V?qhZ{USQwtwdL)5rj!^3pK3*kXUUxo20k4IMbAzc>9yfM6)lIl?!L2hsZFQ zLpJE1yv*vEoyKEnxA+{crQ_$N=P}_o*5#b4!%(%bMydN9I>yp1lOtgw6x+2WI^m5S z|79rmc90!MM_ej!8@%wPW(=h!iYmkyssgeF{hmePDPV+wl$9sQcmIm9Urkg-Y9Vbs zw-b&^Yti*QhUlkLbzW;8c)Qmk`@HIH79l2!o0;zw;O4&VH;eOSF*<9t=-X9gfIbA0 z7+1P=e0O>>WNZ)fb!I7&O?pYYi3_KxkuT0B7lQrJf|miJL0Jd z@|EI(v-Mx##1=y1mUZ4Cq+OagBu-yGJo)PVCc*+oMW8tufpiQt%P|dcw_`BU2_=zu zG1Hi1@B&n~>ypUBj_Dp`H>^a($lFXWJvNayoz)U?Ok2kCjuBx!td$FQTYoc8Zk8IX z($5b@zCiEazdj$YvE;0?F|Dr#*ZPYLhg|Bi@d|tWXq^p5!b&qt|M_tg!A$es;6)Hh zc-*)bH9w$wMDdZQx|}20Bp#P`krPMnOh3Hv!_BL%5SB_tbCvKPH~ex<|0}ttwy+xp zpxlpzxaqXPA32ZDooqFpeh9b+!b9YV7`M4R3HdPtyA%7f{=5TXJR%Rbltu8 zkHw(A zJwZL^2XRZb2Vn+2M>;xo&|L68&0a*sN`fj%iW2wzoWdfQRX;wZeh7n`2*%kis7e(V z_RPFlk?ZJ_)mJTvi4Va)TZp^V77Yu%P--8qwd;~EUO9=w6=E{2`VLShU&o)en=l5q zk6jN?0jRAy^uO$a{MpsHX<6KeNKHuLC!(rN3$oxwTERRIYzm3(bePNA$G?UBXA4pRbEotji|-{ z1s!(k`(OMh$0neh#zCk4DX*)V_|;KIF?@Sk3LBp>KN0k37vuRk2U{sCO(phobDIvKl!SOd9qO77s42VgbtQOKp3#==!RXzn z@CPu~h8&&m&1L9EOICdk{EIW;Rv?Dp=JD=S!ch!}1zrTmkZ(gLX5Jl6UfrJ{MErw} zBw2OEKjAX}I$9g`rr9{-OCN%_Ig$ZV_}E9Tdwia{uH?5tWH2s$J7p?vnMLFu`k2XX z?C%!3@0BsVSmbZ>-bGitm+Fm; zR?*F?P<@TbcRP$A(2P*AhCmWOsj=}?lxagP50#d4WFg=(-@!6{o2uSp3O4h((k`Gw zaxrsE)xl}jo zp1=t!q|UKa(Xvc@XJ)Eq+tSbAQbExY5S*${TCh2c#rGV$X(AMwmTR9`Axq)O>r{Q+|0{o@MFbQe$SkRZRxV65q2O z`T%a~h#l*J} zT%;U;FJE4(HYV&T-+Q@lm}OsP`~&bglSkaxr(9d(H1Ac&Jmww_kmM$*VJ?+-N`c`7{jD&wn7 zFCZ=;kYF6%EI>^2HR=@qffoxdXh6TQ%)V`i_$Zv?pf;TRa$a`+26K#EYdcT=A66>Q zDSmLc0ii9)r1cR@kw(F=a?#JY1LkFKdwl1}wm}55B*TPNvw?)DT@8P(no$Rp?TDJ* z|LC_!W{^G%APZ$Yplw8}5C?RsSGB_$i#mT!hPG5opW22Ps@ib7s7p z)l|$uFZpw8g3nP$^2!YS_TiNIc9akdgTZr5Sok)6_jc`t^vTzGpce_l6-9~N!^%#) z{w{mz?j^L(_gKqG^L(@h^((kJ3 zg5QLqN@Yzr{yLq$?#7)5{wDT4wfCihJD!TLyQ=94=^Zu671y$=bKdz%M^&-`$?E(2 zHNc{1h5eIQIF~^AricFn6$R7-&)tu<8yPa^h4h2-OMgJ58qNrfdtR@1e1}r?Z(5H! z!<5aV$scD7ZG%diyEI*_>vp9~v$)s)+WL26t3uJQEGUQD+otbms3V#Ozky}y4BPcg z9BmI(} zJq3~b2v1w_=Y_Rp-r)qzodel%P(IXzQ}$g~fNV9XHW^m6)e!A1PoOvpobG|kdW1&Y z!{x#7K3zlBSc+(?6{*c(uzA=XSIN^QQ_-_*Zal7lOE(~g zY%8DHu7vAcStL;Qk!YD#EijH()0Dp>PUvmJ@r3BxY<0m2t%tg|p46ss6aQ-GW#Z8Z zX5p>>l<{T-tezXmq=X+4rqoMO)_o3O$Cwb@xxIKjA?X!3uK7l|jAmF~PiQu|r{u>B z|KXSa&FkBbp6j(b3#!5u!54?t0svlg(E2{F9B1Y6T_NWdTK|)Sl1Ayp6Or&ZPZBsgc8mcrO-8o{D>(DCzPnE;p;JwWtsI> z7h?m#bJ03ZvLz>ah~3K(?AGxe&7+=c*HYK#@1V18H*0kujkwFQ_ zB99qu1cI=z?~@cq{G6#8em+a+r?GcVmamkiLqI<^qs$CRcpjx+qPEW}lOENn2{OXu zP_Zn0Jq}X_F_h||qKXJ{s?lU!)O!_g-GAoK29cWZn>Z*Vl%8p-7R=K?&gQ+!N!o7; zGWF*wK#C$A0z^xyn}w_PK3a`KnSoKWEiH<4pAGNT{)HHXo0&q4_{v!~pgH}@=fU`W zs5G{lay6bGcH+KP-sLVPovGUg12zto8i*R3I8~6UFdzT$aZj1DyM1l;T!cNj4?&L- zklQM97fsK}mc_Bco}i}P0M_@7;nk*t1QPOe|DBlUocTM8D&8IJy8wb+C`!EbPOE`? zKzcZ?W5r>@!+Pb$phsivd3u(>=dfkAOS8b3dwZacU8fUi$=TyX*V0!Tss&K|BOcKj zi3JW5v_3=B5+8L9hmx^do!gRu7^yAsb`onpcxaNqGI|3JQ_g_fc%IyQE-hqceU*V$ zQHfTESG)QgJtgN@W?d+2gm_|S@cn4~O=)GZ3d3Ors?c?%-dDBLr_`4K4g$2R^K<18LJeC!7*C z=T1$jbG9h@z@fg99#lWd{&36u<5T?mG`4(sJmd_`)j4-J$`>^L1m-P zOSy*;6Pm$ClrPq;ys@7SWcNpE80ulr_Z3SXKhv*O*Y%>ndCzydd(cu?DGzN;7*(tc5^8d1jct!Izb6mgX8CChjX+x*aR*L5y0b{m)R(^jqQrF-ZH>s zqz1<@cA76~e?2bi2}pNvP<*|MsW9}c9n9COGt|zcrZpGe8k7R)JI%>+9S&fMyDUAB zveId8a*l&Fo2zCEG^};<=`40mRrmW$Hfj21&z;{V$Ufd`T@2N-XgbVM6%bLtLEAM_ zuBN?`fzi1DsOi-BMahx~+Vm9V?3Z?ZfuHjFY|#0JmwQQ6H!glFZPL=+Yy8LI#QS>7 zIj(zoGn(wVwd^dQ+`b(-}S<)>C^<*8*2CGw+L&?E8ChYgkdUta3V& z>@JQN0`e)}?r?eV)~PgTW`rXh{VIoCvJ+6IDR|6GWmEe_wJv;ORKr=+GJWykY+ZJ2 zqf(cU+`M82Szb_CU;h%G;v&>vrL|EO%+J7oY=|K0Z!)1NGD4&C>1mBsP@#Thd;uz; zm@X~bNGePyb5t%GbCWa8v@l*w^J1#i+c`#pnel^| zK%C34Ih8l(vMDP~g{Zd;ldn={O&;w2I<*JRK<|qi&xGuQ(lWIa?8DWcOdb7Pgnn-} z1R3123qN(iXSiLhZND=rwiOkGYwmIq7ga6m?wAtgb_m}M7{L%}oU~M@(3pHe!YC*N zQ*`q6@gEK)9Mh#X-XDIk*yaSHh3FUK&weUDdmYzB?k32QKcpO5%cGBcf4aqKF@oB& z*t*l(Mk%3o`eet3sh_AQPYr;rEP%AEmL4jglK=d2x>@FXO@h%WpDx8bNU+3DwWd;W)?FX@L1%C*4k zZpc^v$;_b&qnW#7Q3kj0*E%M3+~FGD&te@fpFOi_Q->mLg+Q@vkurflRaMXM`Jel8 zVuG0tf!0a35;spj^tZbTPs13#XVJRo(bz}q57yS%qQjQ*lxdOomO3Ce{z#y-mj6ML zKmDs&N}#3Uz0ren5j1hB3*maMi1Qc5DLxa8~ z-f&85zJ^7#D(8ZUy7hk-~_nBwgk)B-kS&B-`y!ZujI*?+6ydGwhK=ey2BBM zifJwgUJ~#__C^h*l_X1~IKW9b9t4>qIEn8p?K)H0rZt6~j67-r^JPXxl0%9f^weYI2_wJpt3pKiV6<>?NYwEepLdSuEkhjg&&;~<)bbLqtAGX?aiB&a2 z8^??yY23y}v;9^qopWt>rhE35jJ!q!l-Q>AFCTNa8N8LE0Dk$(;yXrPjJ5xT{Cwru z?FU0z6EmGfw%JbaM%2MJk~qy|cqcG#SIn5;&D){sG5V%nT$rAmn_9m2?wVC%m zQFJc;Ot=3Z-%Liab+c+}LpK@qt;nj4jj21Q*h1ZP3n{uCip(4`Vd!wDHHW2xW+vyl z9V*8pRE&zrgq*Y0%rR_4^7~!)Kj2aM^!Z%Z`~7-7pM%bl8Y19q6N*IMv`ZdT$BQ?= zMg~3&rD4sJCfoOjd7K&&2ZGuWtE2w&$)CTo{rQR+jaIVd@d>`<^i%psIuWc0v+op7 zw<>?nsvk&7ufH#@CIM;*?`gh4qFVH1iwk&j>8%tHc$g^tgO#K!eLL*S$hMD@ha7fH z95nEU8KwQmjGz1?`ch4`hendny0)>#!45QfwqQER+ zG`sOyp43(M1jX{@7G`2#Wyqr*iNk<+-Sf$2lQ%kdu`k@~DzCjSnIVn(tA_t9|Gw;<9^NXOz>}wN~qwzC<~VAR)&d(Zb`6#nU1bN|@0kg=5| zY^ySlpxXus$1+^%hNUiE0oR1k=WK=AyUNI8s@Ueeipi#L6)(cRmcx5T`1kWy)+#dVD-7+Qfdl|(QQ(}xaCYg$Oi~7pKKv3e zPFI(T_l8RSFhALgg^(~|8ix|%qVjRqDWc6mT}-wILz^gicUdM7{I5bYjSXQm5+_U> zx!sz6Nl9tR>vok~MMHQ#p$s7&acZtfR;A@N8^ARg8XilxyDY(`;IBT_A2RZb8oQH` zQHmd{!~&IpNQ`Ij`&w5Y+xsn@?Ok24cLq{G$itp-TON-E()G*;qQ?pf7Y~k$sETWk z)`LU&nK;F8Rp&v}FOxjy^h=?WiaZIK4ocgJ*+unCiA_Pk>@?+0aCwcYvT+HoSBR7M zBwmH^9}o&PN7*d0miwP4DF)K{P^*~rQ8)t0cUv?LmEPcX{=?#?L((*UTumXD{qxw} zs%=d3yo81L%>=#ftLDO?rnTc&ZZ;gai9pNX;2xxoRVU1{mvY+b-wl7*2cJ`6Ml?fi zzx6Gnf4r@6u-xERt<&{SaK4lf* zvU}YQpGOHdfiXv*Dq2?IDAunCY-EP`ik@5@P{o!Xb#OTYihz^r)j?1izpk?8fx=)7 z-_RO03NbkV{NBP8=3CQVI} z|5|~?7|_e%n@E4rB<+yBzQ3mCgeZu^XdE7LRd3aOzRp4F7k0!v`25){ve4TxU)4{) zb0NvWmm_XO%gO{fuRJy5Zy%H<6+IAM(P<;M7D#Xjyr{)ISlwujf5J#3u!mN+XlRQTzW~3fb|j`w$Y10Uzkw218tzbGeJiaV1<%2EyF>}*^P0I2ZSIV2YyjHzN=Gbk@85t;}?%6Kzt+s7Z zGpALt_5|cX!C3Z$(Ev2i^kD2CpQiRMe@l_gI`yI-{P%Qk2(8KbWj~o|wYc&d_xP+a zbdBy1#^^x)ertE98qyndDQlVyVL}|NxK$1gnJfsw0D}+~3w(``-qaXzeMZ{OpXO9G z>!mmf4#k63N69+Z9~CGlYQy_zV2^+HsR-VUnLF&QOne`s-rjN0++YRPZZdHykvN;Y zHK-T;;dUM$F~;mv*HzVvSw!6o`t`?X6i(3&7OI?AV+lhe$8i!cC+h-B-TYb+3@D{6 z_^WFLsT#dGt&7dOtytOFV}XEhow=v;VR^iz^RIYAySl{sHx0G=*I=tZKTc@%k#C?E z8wC+$n>~S=h#2TdPim@~1Hs0f@?!XPwx_?|;20Z02hQ1eeuX#|zF}uQQ^XE9D(u9~CafJ1wcr0-#gF^1!AWqWxlAXfst!gTzP!{a#7_w>Qd)_`2}5BnP-=ZkO1pWO3Q>7C8Uu2Yk~AUNvOLL zW;$?sA68nmG0~EZ;6>)bxqTS-kM9q4Ju4qZ*yue_jR#gV-6j$zm)G_Dq?TLfnS~!+ zjO?|i&D(E~8#45N`L-YQQ=F~2s)iP+vR5)G$FTwyqm{&U__ONG(>5XiMg2onH)Qk9 zKGU)>zm1Dh)sZJ&&L2Lh3n#)FjBoU1ok&Ly)Z#||0~qnMXdaum&N)PRYu-eR&PdP0 z=XE-t1cvjf{OGY%P~!lRz>~p=ofot%TEOzN0OL2aJ#uNnr0U-GT4M!9l9s?H%z%fF z2EG{e$nN?}V#)^m{=@^=Wg0wZp~vF?Ho0^>)(hGhr4iVl&)2cQ#T;o6E^B8gP0o<830W z$_wd)r3uS(sbP~Jj48Vt$z)=IYy?I^yw0jK%a|7U6Ld#iQ-rIgp9}v!O7$?ed4u;? z%J>M=@XG7l9#GE8o8-jR9>FrU##5C#Q$x)_Vk`J;hWDk?O9&_W|KPvCN$ zT`q(l3~>-TM>LJ4vN8Ti?1faVT_H30%vX>6G}&zZ#uVn^|Hk(ZC~<|>c?_^6#m1Th z4&Hs(x2-`}5H3$Hn8`@noS}rZ0t@r+3d0;&Sqbh*u%XK-f$!i-_hpmf&gDDJuzePCCu_XpY?WE>qFmEI@tl4hr=9rEi{l`V0qKV3!L%Gp0M zGWxoLmd?fLdoHwZ7t-Efcb=%MQG9-C&Z3BjSVu@#kpZZhPUIfd&JFa^YHX3TVHa${ zJv6(%m-zVkg$K6_{YtmD4674HQ;7wujlZmv&A**=-WnP7+Gj~LW`4xexx~1?#%+$9 zepxa5*MWiVPex@$Ei!{p8Vo=68+)$#%q}mxw=g|fZ*9Kpl?^O2Z!G;JD!l&fx77Ld zvTQIusdfK&XFKLQM3uwDi2tG)@u1m7oA@HP|Dcs)l+h$MkZD(52I@|@2c7wO)4Xmg za2B;rnOd}%S=W!>eUaF397cX-$?B8fF`&_9E@HT4r?H|3~ZZ8T@l!pz|$YLzAC=qEUS(W z0v`a;nTOWU)8|B}?#s-?RKn-3zE7`0=)xE%Q3)HtEl(ybv`D4s*fd zVjH~<1#MG`NZp6AD>|US{P0ZpsnD1uA+@`U-eK=iD5x3?L|Z+B&Nh8xk#D>*_2>!I zI7M%4lvJ5_fe2C(KdGyD;+VL_0h?l!83@xAfsLSCF{lbN;Ef^_*gU^0Z+gp%(l4Fe zwX`ke()Ya8penV!%aRg=lbbH%L+K33o4r8=ywT(Bwf3YQ! zE>sOS_{N2i%{%O@K1M#&zFpxQy3`U|q%RWJA2p1)aLcJiWb=MMrYv(2?^>>e^Q8Pb z4ievST3qJdC(fwy?WR-V?vqLVcQ!&>A<9Nl=I^?Ytr;v&Bno(`aHCK&^&I>nbdB`sg6mH?UX-;m2+Q>gT8xM%+K}aZ4(xQ zTPtcq`kZ#2PMp>ck9Vd14@tIZNsqewc40^7vC9VG`C6RQ*-qP{cG;CS;|NyvaAWp5 zoDnY^Ya49v{~(d6`&MM+eU|Q5%1+-pZH$5P9`jO>kgZYQmxziEmqRWY zkG8O5e5=v9Nuv0UhaNeMU7t5l9{u^r7%%QKSqs19=OXQF@B}38zR~XtVF_`6Wim?t z9@@x{L(GXAH=5&pw>(~=R2%ujr18BDnCb3Rmu`HEAYdmR)_qFTZ7+EAdQ=IQf2Mg)G_1=;C z|2xuVw2&~HYJPM9mErl zc-s7yZQGObUDnT{{(_}(K7-QF0ToaHb^%x z*j@Z+lAfBq^YL+hJ_0>GlIcPExOJ#bV^WN*^XW?IRpfT+|CzLqH*UFR%%brP$jdA4 zHLX)NBsYxv>4XUeCvVP2@?Y$WWqAfBt8n2DGnX zotdE>RzCDW_b3nZ>Z+Wyte0SZ=r1D}@D&N(tx>Q7Fb?2t^=A6d73L>Y$6keXOL^K_ zdu`s&=bSFeE8Dyqb-(L{t^I-^?vQWxq}+}f=jr-MZ8`@i3*!KzCo!d0Zo9|yR zR@2XW9?_>z%te4g=?Vg(*Xc~;l~6L(v3(s91}X2bhvPxA)bG3H0__+yA@z+RVUp^p zIX7iy|MkcVNUouEAwh|sip1IE6#CtK{z`JXFXf&dFQ!W-&i1|x68;ywa-xuh&TNJQ zopV`tobYJ)Fm>ELi6>D-{J^hkiJts%?&@@CwJQb2f~;t|AptzlRBI){W*VB*I(zh& z4N2@6vFQa%MEqr%OEhBZaF$hW<$c~wJZ;-IVXyiz<-NFa-HnC3MiGtrpm{^P?vbA# zB2c>(b~&JefuvhqG&YU-Nq1nXtC_6U#fY`8Jxa~2@r9So=Z!`f#NAOF*Z|Cz0%n8` zfXIqV_DXEmAGl~EVw#vf=`*!C^F4=cvnN)~G-gp$4}o#A-8m+Lb*-?@6@KEKU;C&r zGCU}Xw$Ad+SI0qhUIrv34kXN0^Od>oW3cPAi`jAab2X6-GKxCUx59Tt+_9xd(i!H0 zS2+&{C5)WB{{hhvKe}Kr*pKC=!qcW*i7ZIB0#bqFtgpf)JAy|D0_;UK^$%yd0q?qG zm<3~9R%MLf&16QJkhJqHqur@!1G}n&)48mx-+d^dFeFUG+H}L@FiOEYuE(>z1spx)!RJ& zf`}LRYSs@5%`j|D#4jo+cIwwxgVDc1tI(AffqHQ>VI5w|#zctDG=n02EjyF29)1{IIu+ipU#?f01MpxW64^f`Bc_J^abV)X_Lg{U@$17h6 zhF)kHVkwOi(H*8u#MvZ{Ri<`bIWB@;3z5KJ3%Ost-_9w=xPy@>XpJVlo0%Nga(T6; z*#Hx2!3ne3?f~vNKa>TPfevj2pEjNJeT4zTAiPmPUWO zK2WaJA3aJ3=Y0I*gE5d;IXv|$qwO2lNC|e;9Hv5n4Zz;O%^9;)G>nk*CfLTt>0Y3e z=_j@d&x?%jGgtIMh4+^<)O@9ro|aTic2Ejb;c(z?_fKbn!mgQ}t%wpm#%)+`hU^Wo zWV*IPK;0DSVbXVSJ@A2UfMXl(nymgGBuAi10MK1vEst5R;ZkL_0(|EWKc*bLu{`PM z;1YCgWx;+~6l#K1mg`^YO{SG$i_jI>X9{}~tQ4D*)pqEwJ^u8wmxB2j^UL(Yfq#v} z7ikN#_Py1N;ne0lk?!OOs((TIQh7!8dwyW?Ul+HO$AyFBBEW_lXUw$d9~LJKx{iFG zJUnu2;{isK{t3fm&;NrQ7FTMWS|{=zT1(7)UpD|OMx{NCZ;A~75%U3R&=(eU$ZQ?i zt1;4Y_0^4uz=!cy(-91ww#K8Sp~MDP2h}Q|EL|+fkfvPZEfq-e8v_l?2UZ{3wN1sQ zgqc)UQ|uE4Qryhb1MMtY+Z~`Y_7Go;f2PKSIyUxsCWLlI-VBE|Ca| zT6JQRK*Zr!U;r}J4K`(G4k{P@r}XOu&^5Fq!JaTFD%pO$6G4#`Vkh=NiK^1{lU-Rq z;U6N$%rk7Jf9rIov%fU-!^n^Cc(YxiRg^?Sbo+MnD9e^O#HX)5_IQ5o**6q4EulKy zaTNKE%W@#^gLkERRbRNt<{{_CQolPWeg){eGDGbze&d4e45c|lke0;C<1t(mqE1G4 z=kC;CT{s|1flTi2nUzZ1SbgV>LI9C2$LE%l>0O)`sEW?RNvY7biIW&N&Ff@`DVnW= zDzQbqZN{E%XWj@WGk7P+rA@bulG@r2rW_-8&`;>)A{rNslGQXOg<+a}gUMv+9hBX`N6RmLI~ zKYzL*b9((2IM&XRqqY5*RcdUEyO-18C9Haz&2>|xyK=TCqv^>LDE#RR(0|U2;D{}j z>o>2gyDmlSL+J+v;>Z*%qa`S>q`VpXy+#HE5hxg+&K(c@%i~MUAm0*fs8zU^+Sv=r zSvP3syaih}oI1)`mP!?mKMiV^-(Oh}qw-c*R&&&kU+dp?ofVQ9ed1W=+VRY19yfPw z_!TW;0!MXrVUR}^`N#^xo@sgOL@X#XkORpMxU^KQt$p4~<>8|X^D=^jl=3c>e>M9) zl%JFg{3xemk2Ez2i7oVA{A+47TCw70Ol_-xhSkpUesiD?%(WFhf$!Q*)FsE>a0^&P zcHOSj3NNo%uX8fWH2;&vNW)|@na+t{k9}dLgZYl^t=w)%0woMiQ2nQ1_2lQ>A!?D_ zkt7HE4;1t&vx^?^WJk%H9buO7*LG<_Ik^Rdg8ao(y!1YQT-guaN4J6C36BMxlw+0= zA}6HvNY)9(vp?ECYfXw-mZ^Y8q#9{m|J=#?-0h(mQ&j+^QA?xJ`7cMAol{lk|2a+E zaas90m#Di-cn+Ggr+V{{8khmD9j60L*!sMo)|0eQ`I_T57JYK0{&0PNZS1wC7P_$1 z!o?s0cyWRrJ?#76!ze^H&AsbEg$!5dw$DX>Ltst{$q)2)KJpeNJ)F}=s#t$t77e+| zo0>Iqfw+)4cF&^nX5Fizzr&)9QcBQpGQ2zUNkxgzi=NlM#WH<&$H^v1f5B2lUzqUp zEf*geNOMHv2Z9fn?yCHIFRc(QG`=VQ;qE$e|Hzn5x4sgWE-Omqd6aVf2XRTLX-guikzOlVtv7LV9DaOS*bfDkw$v%$3beW6*!4C)3i zO6sduVY(-H<69p_lbpxy(qZrQe$av3R5C-$JREKG{RkRo*ibw=mj0?5alQz0Ds(VI z|C-r%szYOLTe(YRjK91)GZ@s$e4NK(44l?qDtrLvgw>W0|IWoIvi>rPG!o!$JisSZR5es|67sh zYV~U1W;~tH5?Ba{&=rL-{+jM|7=YCbT5$?XNWfa(0Y(I^;ta238o|cXG#_JXU5F-| zE|1|WfrU7ED=oBc%5gyx3i=}X zN=aGCQOAqBPrI--2&r&1x*38PTAocVCht8v7}^rX7#QY3hnAk%`^pbr@=`OV+Bw1t zVF0C+7*@z0m8505JgL}GBGh#z8l1F~Bc0F1#oc+irtcJ7npf3J5$KKb>3xb~ zZt!RGkybax1i}XDWX^4cEQoRYP3P;(rwHXF-_XU@LSNWdELg7Q%~V|UV1ebJ6Xo+b zB4+IF2Yy6f9B~$8M8F@J@Ys9t_U-xl=0e1MLepw=$^X*(1h1tFjW)MU-)nLc_|_Q@ zqdo~R!Vsiqq(C|+enks}(9j5oc&Xr?y-;I`T)$E({MifC^Gon2|E9e1HA@ zf6HPvEcmd&_9_*5Wz+*^*4v*|)4J}yIa#OmHe}F(a|c$TRMpb}SDX#$diH2C zA~U-0Lf9J&aM=*R5-cQIZdpXO|b6 zcOMuS#HJ5g2&)fs)J$aaSj)@{r^lV|&PWmrW*QZXc^zoKjRYIBM*NG5_=i8PZM&}^ z{nR!cI7xsjbE>BHZ#&TZ&b-AU<(x_X%hA->6sK*qhcwk7`kvx{w$*EGt^aN7!3*mh zba9xuZfRz`Dnt!|6g*n;_3+XdAd0G)w7A?ts>P8OWtZe#LaQ$5CB|+;lN8_5_Wd}; zQeffUK~$o3rDH_}3OgG*`$Nxh*2z**jmg~Fv$Wf&$~Hv=v~d00YD(-ML!2;mrD00` z9-EeHQRP7yeFBxxm_%~XQl8W2XU?gDC8a#U*?|92FN@WFU}oUR>7&}gqY7Q(vK_HN z!Z~a{BqkCC=$RPJSbDPikHt~f*#GVR^e=k0BkrZI+w(Qnv{=vN0NNH$D5SZA!WroN* zkL@bh6K!)4ppRLM1n&5tFMc4Tu`B3vIcV8ez!|2)GmRsF1 zJY_3voc4QS5)n6_KWlsNs2?tF`>RNRPO_1PKT0sV`#Sql4>x79T_pp^x#LJNo%>^g_IAcQ zQIQLRbBfu_GXTOSLqYTk;iM>nK<}l07fVwii(+Kb-Yj=QkMa-}b)*HbqC-yhaLWo8 z1n^nm;Xb4X^nYMD2P6q5(AuUYd0K}lgWIQn@f%A!i)GH2sq&H`w!NH}>qB*MfJ3bi zKob+qE{n>X>5=N zXls=aG*MPv+Y;pU7Mdo!0)Rh5IoG3cBd9kM)Y#}&6l97gO>Bf%Oa#6Q6P7oE+wN9o zIs#6GHs!a$8JdgA!sk#Snv_<@vE(}Ic37WZJ8tFa;u&gyc!~Jp&~E56U%OkLyf+`n zkT#|lmQm~FZ*@AQNrUHZS@oUU6yn%Ke#*aN+A{k^Le_wEiU9zJrLA^(QdDYkQ4_N< z_Idz%N=CyqXcV7;*X^@F?>f5J4SG3EY2^kjNWmr9Ic zx-Z!)e2X76>@!JXh$}TQ;tIDhS_uVO0|J)6AmJO&H37#T47NCAV8RTI$VLsT4t zt`_|=fvm+gqhRX^AiD;r)sPz?BkOG%u%jfT@4iS}hOaTF z`u<|mN@N~U7TC0eIp#zilc;8U)4VI9Cakl@w?%GQT@i0V6WXM*TD+zwXP<*i&ZV?< z*x6)}|EJ;`@bj%N@2Sx__Ua&8??G!*-fp-*E=O2~F5s(6|I3wag--p>);^tRzP$Aq zgXfbSa{XcOxW?(DX^D0W5!IosoiL*-GFb7?NBpugwk&VLT88IucMN&SXfaQw;1fFF z*p;vVO${;uPErUUp`V3@1C_?xxO}Oi(U`SSAt`HcvJp{Dt79PA^u{*u)Y#aFHXZ$= z?`2=b@zV1}XG-1xKMqqdx%{yplkGvxQsG|`W9eKMS)@73cKg#*EtQ_peWCO> z{t??De!ishF-uPd{x)lB`@7}9LT|F&|A_9_B>b20P6=M#udfJrEJqoElrkRB3LZBq z|IP|XQ#9-)wC?JN(Q!d5mVoLw$kghdfseo5128WC3>f`*l~>g;VMBR-+c`DJbZSug zAhxs=`(0zU4g8AbWR1UEUxCiG0M#A#UXZ~FUN8TKO>Gj=hoA%k+7m)B!F^2f&^a% z@bM9J&@)L9&oytG&^l0YE@okMTv8VQF599q8Tp2^(049HuFQ`iqqT6V>_`zQ1ka|~ zRvy)N@3~bUp%YVJJh~4N!=889_H1x8#rw$b(Ul(mG#`zL5;ANz^ev3r1@<@JZZa69 zk8~y0Yk;55sfg%w@q!_9CSAsbp$bUC@Qo)mb?QRSuleXk)LHuv=BtlO`Cp-~dHm=MvFB%18l_owq{&Up69UgD&RHW-VHSx z`WNM1br0bmbBZPq$?Xf#Ht%l#PiwL~E8cpaM&6eiBW+}e!fR>6Q1S^Xa|J_p?zc$b zrMR~2?DEn*oX~F;YG$PpT~IZM$de?Epz!J4)c!#iAzFqO9;WEdF8BCUR$fn<2Itwl zmUzq3)03fr0Rx-44b+$1KXTt~sqr5v^iT^63$xM;FRtn2%_v;Om~W}9xLoqibg#b- z#$K1Os7yD%Dzv0j&87w1_DYSH!!figzOQJ%bK!S=Xw{WO{Ln|<*s--gqH<@p0I*z6 zUr>I}6v%K<@K^9nCx=g>{fdNGN4+~eElj0M{#RZ7Uw3kGe+!ZK02PEc=kl7(5LQ`G zXAcd4r7bvLPui1Kesb>orPTgb*KJ*)-*PRtJFg@X<$kMvrYWd$eSmHYbB=$f{%cWx z*K3Tw5yrR7)ro4&ueS@b!^0BIyO|4_L2Q25OSV7EICCiI@QcAiP;$d-Hqx7X;jbg+ z%|ix4BSf@>^C**Qr8A|*aD7)@GgU?hF|xHgF^lAt6ZovY?YBi}qohvEF?w1nMxW`l zXW&-k)VAxEz)w*RSM@iNa0vO2B2|0oSxC$R=gwvkyr>{cQ69M6Qg4LA6f@((GhLat zKkq&~IX!!HGW&ahG^^I}$Dau!`FKemw1Y+o;-{SBzJRu>N(d7~l({gJtf9@5xOu)=E;n1Hd7kFVSXJp&NmaD0}u-}Zd{Rgv`&d0b*6Bjlrp z$dtqLKNp6cXZ}6K{%^Y^J~q?F=61clOHf7BVph7(-_ipQOtJi#Y2Ff+?U(Ao(`Oe<`gySw)ru1nn#R zuZLHX!kZ>JvF0uWNm};XzaJ{rg*FivWeM%uZKSTRayLSGORE7bOqpJW=LA`0srzh` z2#saT9`?~cyqvu4)xT;y4l~SxGnSO@&|;-2L7fTTT~YH<-a0+&@L3hwDk4s-+ww}% z3t}a&m#mYL4^cWOZLL$63x56FzQgyzt9TgAH(edKs)aZ(aehb24f$;HVScEZRRj*7vGNpOMi+7z3E&GF@YV4m ztv+^RF080+N$zCMDU=^s?5tQ(VJDg~e)z3dix%zt?}Xqg9gUCbb5DTh$eSda_H?{$ z9zKcEqmPtPO)d3ZSBu;JvU;XK$yQg~6G*^^&gJa&C>`qh z8G$B3!T#>3Za)C%<@f#jbz4kZVtp$8R{+RX8jaM4PUzFV9tF#`(S<)Uu5!Nx-%^ef zr!$WTLoN9A*M7TI-;Y%~(2aCjMWlo-RuqP-z_3rmluRT{2(g13?Z5Wl`!&2ORTSOZ zQ?+Gx+1bx6wjlS$TYJeID~TxrEGPR*VCawtKF{1?ZeU?i&~_Yp)nzY9o6<-iPCNd5 z>iB5SV1@6C`NQ-UOF!|m__{PS@--0Lh;vY;dhvNrme$M%=V(ymj z3XH2g{_beKtUVUKXKcuxTH9_M7EPKHT{&Up=wZ@nE;>e>6sz!RRTok`yEp#&R3ur7 zTMUc#O~_QUu90*f%NV*|*{w2~zAans@YYX-ieUOBpWe6iTYAkDLS6r`{Ah}sOEAvQ z!|5j!RmuGvU|r@4_x?Y~O?<_*9WfjD$Oipu+ZD6y%%J`uuF(i(vNJ9=&~A8bnOyg= z>cdtK<7RT?0tbQgaGxIyWAdZ(ymQh%-c)5r{eFiBIj}HLBXFr3hZU=;&^+ltIc}#m z<+~#7bn;#(Z`c#ts3`QWUl)jN1_RY`c?(e34Q}MEk?8$doYABtG2caNXi)oBxu*Y) zf6y!Lts!4&h1kGTv_CsB>tI+1v|hz(#H6TqH^nTojZY6Ow;1 zGd<8{xlzcqdXsZ%79vTrK~x{q5ZkEC<=Df>_YyLhbvM0x%5$z;hY%;bb$$ifbL>W`n1D&g%P zDmqVihA}yjoWMw>&^?WNT*8th zqbCzG!~UEg>m~jo2>i=HyRNHOE!%E4ev}giZdAwWq2BMt6c~O|dVuIZa>w>tjwAS< z%)XO@*5HKZaflfKD9%w7gvLaed3C`Nw8;0z-w6jl!bjDZV<`)>l%7`VFPp9ID>A(w zf;}(}yjgBEUD-ks2l@5HhpBYa0g%WMUHKJYG$$;>w(oUK5YAzI66qbLvA-I2 z;%iC`;NY7K?zz%B{||C|Z)cifmSUY4cPf`8 zX((h+njf){Yn7;t_g)TNm4g7NXO!~W!>CIEutcl;-!e%RV742lN)Qgqp zKDyyb@2xj6)ffQ~cKu%<)aet^xbk0Re;IQOnlvq!A5rNV185`JfVj{}bvCl|Rqfi} zT+&YvT2OoW-@{6E!K#aBPHLEl*$xv~Z;Es0W-Ld8Y*VrwtNx#wWG2d&AbJ-D&Fi3d z#$k^@tPB#VmOjjH4=Hfj4}g(@VBuKWu`ohD4sQ4rbTnxT&Fdc4PS|)rA_=>>X#@4! zUVJxWg0&q%RT^q{ytp+Ve(7SOnk{x5O5811$dZw`hC)0f-!9ZrG3}Vd3vZOCB|{)> zhBeb*jk1C~Ou1-flxRk76*@U%=$&gQjcGxCXtV(x(3eJIf6*z87&es4_6N;w9Ar^M zL_ro3SoZH%?K9O$5(1X&q7pTZmH`kWB-xEAgBfOfsF`gV5PH+=k|V{OZP{<>F2;*K zzjIC-Xq(R-)<){W!z`aDsy0w^2h#rD`-aW2)=#ca`VDv$Ezm6~Uy% zi;LvPM;;*`g1TlOqus*jd_2`;gU49J6jW}1hWe`B1%@c(A-_@ykYIf?5gw8S-XsnA zdrp!yML?p#EAXDs(fW4|7+Q1p_`aaP0E0fV>SZSM_g- z7|9-LsAEva)n5}lkCTweHHX~nUb(}A(~l9cc5ydQ6&_2^u<0IfeOXsBrLsq2|DOMb zEFUQ$pI#U8Pk?HaVYk1b&26jIZx5L}e7b3GLFF#!itwzBu!jwyT5&}Tmjh)*@P$bc zK73^b=CB8M2=1EHCjFL_NbIn_FF1W$gS|0Y6z{}106s6|ow*k#oWpBa(kp}hg@pEP zH-{3{kZ|2xKuCRy)|L7e2~kPkW}rrQr<=7a`?L&viLGSyykc#~iw;nIckl~7b-qs1 ze;`v0uT9iW9eJzxUo&1uD)|0RP z_53ZB`ene7)a6gqYQxO61g#JHY5tbMX3-N-iv`!W{bK}^x6o~OD+25~P7~qPIUtFH zrgK|jA&_I_O_5&Jv|$fX{v1_a`AHz^0rV&Zb~Dv0RmY+r|{`Ss>P#%$Na5NDkRTk9Ly zS277wnQ|0Krd+@YW7Rzl9G^esi9e+o57kmqT$dMI2KU7mHCyEu z_1E`dMmaxZsIHfEw&vP??ckXc*{;@ZlqPuJR_D?0q2zi~P1m%x4hE?07ihob`RdA( zsBhcy_yP*9X7zGzc8S5W=ML%s4EXa~vc^(+{eQLQGx!s`m3qYil{z&_64Kq?yU+SZ z`vyDlhNBm*(`Vw>tLusmJ3fin*>llln8k-G3ciTkSr+2rf`=Z0sOP^qwlJpP-T~(? zy>t*!Ea`68{ae04657CKcB=cr}r|AYML~F%Y8? zIF+>eD?sq%=2~o#j1y+X?H2#}ndP?;7<>(R(1bpOW6nU%=5K?P)5NLEP2(np+gNSz zQl!)Vs@#Dvk`73BquZMP5Ay1n)@I*I)^{Q(?RYrPt67S_O#-jbxE60C0e{sWUelES zq;6ZxAhC@EzG2%N!MiU+DnspVMpta#No${Mx%@4SLod^jnG`G|Di!Sp5&|Y-GCfdO`sfZbC)*-YNj3{ab~2^R<5i13 z6-#~uerVkJNj@VJ)S_69kRsCG=_gGu_|r9(IRwZeU7%yyqE7CuMw!gEn07CYL! zn}kc{@pY5-OefD5rAWE-Ov%p@DTZA!q?&VG#V%sS5#5<2uyMwR$mVGdv9_AXR z2#L}Zr`zFwygxpLBfxXU?QM_pi3C`7{^=mgBgtJ{m)qpf=q5N;SdWHC3?eP3 zx5*-I9rgvnP@Jdpj zP#>xlmQnA#&Xb`rXT#K+?OsZl8hkT~p}uqGCBi5q3|@|6SXCr|;~7I-jpIk>uKslW zFq2WaxjNtwQA9*5@>&SO_rfzCF>>Qw_@PuE-dsWji%q7O5z{@bK>qAH3csn!&rcNi2$f(UW75 zHB7ed>}0cLs$$%NU=Z9Wg*kHaN@-Z6+AWAy%`7|H+w^KYYvov%4;=f9u`H%W;|zZC zlGnW&KioPKGv_KbMK57vP7wOA)dvqquy?{?{6J|`f20gX9#8LYy>C?ZuF)s^;aB|! zg~5=SHqzKFue=*k1&P`9EeKj%bYUv;m`%yij}_#~vyEsGRii^ammgo|M0SiCH17zb z%Uetty(6fBSH;Nt;ES0y+mot-+(9GJ8&SMVFE(W@>8AtzGo5q&&PKIJWycr!(WrCx zmBfzALMqaOf&%_jU-C8N>ApYz^lfZ3xGu!ZwL=gz0@j=r6nwcahoVV+lS*d(&D&xm zrMD1U^C~K@W;I?}ZuNm<(%N^y8ryyjN(_^`mO%KHeo6u-FUy^*Yuk@LkGy#9qsy)X zheQ5nlO4~nqf9mm-83IR8o2LQ;8!j@@)$Rvmygb`hCRF(E6MCpPpzv8OXSC2&J&DHRhR%4cT$1 z^e7*0egBr8JDPLZZ+V}{=P#fPT)97hnwR<}QbZOy-P>G^JMsu~+<#=Dp!Bewx(JgX z#`iB}eE#FrRVC_H`aU{OV%WvYe10f6Vha}O?4Qt;lrTL~ybF9>!Lzp*v!Wq)}+=?%}Cm?>F;#`p%LZ z)TX9Z0#V9sCX`$XjlA6qLY`Plb~1trKNDh}$rv7|n%4cZ1xqDE2&mbGmLQcqKa;I_ zA6@F6ntUD}jjgvAqaG~c%BBRJj0MA!h*AZ%FM<^yrdQ<7`zemMDn$VNVJcwpwldv?f@=-v{ zLHf`_O3OV+xZ(G9kHGx`MLL)QWdj+c*UOn!IVS@d`mE1A<7}g(kl1c|MRFHbi`vos zXEy>W`_}pub-BZhLjrL*xdcMcKZ+yTxV;QO3BQc>T0VUTt<+w)tN;?WzIpsSKO z8Ag&xgz@xZ5J$ELAO-#GAj2V>9fYGPS^<|H>QIN#g9FYb{Nt$g|F^HRK?%fz0?7xu!|s#15a;cuT8! z!l-i6;UESM5Eta~&m`Y<`89n+bdE|k3pKUi6IcH!aNC@$;WS;PzxD!I2v?#u!(i2V z-G#csARr}s4NDpzMXF^dhEm4KPY(@hUx);eW?7`QYxjCJ^CYF>@z=<2s_A{)Lhq#7 z0?88}#Bx)|PCH%VXc^UN!NrKjj`Oitgf4_=&a09C!Pm-o5Q|>jJmq=s9%MJY zsUy%V`n^u7y?)B1LrF6RDk^ksx6B#|_0Ztcrvcm($iDT4#$)kNT9w7}+|ffLJ{wc! z0~$MGK878?Q<^l=;6#*V7h+Adasn;aGF-qo^~psKYF5gZPNput%07C7jB#gwmo*7jbVdT#ll&*(H z)#NicmsctHJnU!5!hTOqTh4Wh1sIDyP{04gy-q)~H&B{OQogJn zd6ND#)S?s2g!LRZOwcNc#&;8YZEJ=)p(!2rzQJ)g&X5*mWyYk#QC9{>HyU$sIWwVf zr&9l-yR0baIMYva&h8UN&v7yTT?-)ugV7_9P4iOin2WHq%qTJaLX5eZW4}(yA@y%} zxV*g~Ny!hdRXjr>qV($r5dlrRd82VPPrknR$bI)Sq1CW_ts;Un%AQl^SFwW}>tN<^ zh##lHDG*Kq;&K(@Bez=TBRI0Xr!Q%1)Q0rf6+gC{*W0pB8=BxD7K%JrNLb`|>c>`B zs>{J}GaMR6kf*p(Wjx;j)V-K%+`+SLs%he4(pIW@!jyUE`u&6J+NMIm6Av1`xK}i= z#=TbFNf%r5=x(E6027x({9t zIao%M*;mUc@M`e0Qd(n+x@LCLMu* zreJ7VumQ{f9zDG0x7RGUpBse+LEzan`cX<{4gc-J3?;X>+9nHzoLlMYbeWmDy3}$R zBoYCDjHD@!xpS~r;L8uS2OpST6w4|hX+-XPF~*;a{1de!s^(u4I1CfMgbJ-oiCcS6 z*wc%suDLHd6lO=m7DI4EEb`)s16iqFR>^kEcy%HEHm64NblT~3pPt-PGQauFROi&`X-y!x|rLm5O^J)T=_`(cechYVp`FG z+<&FmZu$<4twLOge1o_(T7n}5s78PH_eZ^ zd8Q~tNHx=tZUisVl0(u3p(kdZe*8{wWQ(SG2L){q+*$yN3oj)}?!C5NlR4WZI9-_m z^SBpd`RCuap5U7|owXQP{RT+-peyenm?5;zwu5OG8R;DWk4u#D3k{&nxF7$|(YePn z-T(i83`3%#+G<80GSY#p+SnZGa*WNPtGXl+-&hBkv+crAxzd`$q|%Hsr^=x#$K-UC zjq8f7QRGmrw#*#EMixH5*XQ@Q+l`y|ZF{|6&*$UuxIdPQ^I4}=vfV(2i4^eu$HsYQ z^}WGb1Y6dqvfmAYT#+pG;_Qapr-XNTw#e~0Jb+Tsa+t1|1H6NguAl!4iD%}$gR-~i zx+4tLcbUn7@i8FMRtH%`b<`3xjcYp|ll9BF$^zy+2@1^k z2p|cqm9TmQ(Qc<(Mw1V}{vK&Xw4fUfS>8nEk87)L90$x))*ymFey!i1<2a`Sh=?oj zudMWBxHUNag0M;r2F z6n^<3>r+1jqif1h3im+q?l0h^7BNRtrwdXqT!T&~m?%o*$`4C~2=wl{w;hC+N>Px$ zK*p&zj36is-Q1+6l%D1CA>ztlF#8r1AL4M+4j!?7*d2fAj^$mmx~s=+rHtj7&4`W} z!mDu+{4eV?%}$w9A5KC|7YYxy+-CLLuObZC@|9k@;lIv!0c49}0~5dUl+y5g|J>MH zu-e#VyU}*1_BukrNLExS^E0+0{q&K~MX$^rz2E$M7#uGNGcd|ywV+`&Xw0>jJKwUx z!wFO!F(=Q;ICUtpt|sionb)x)L@_9Yl5-IqV?7F4LHYNwto&oGH`ibj;SQvaxp(4( zDOT%bYbJf-&JmEZAKv;3r9q>(C8(`y!ahDd_HuVz)7ThfJf_Et9UsI{nRJ66IqW|Y z_3PNkt~hz0HPf;8SbJchU0V3Jh?)9`w5$h9oeD9cBpXiY4z;bK@;4eK^^WcTIdSxoK1<7AuYHb1%#1!9&V)VGj3pv@F3hc4q~)PU7qz zLfH!iyW(H$Cj24=!3}M2%x9Hj4ji$lvBrWi1JR{&i;_()Up_8Au6PqF$6`CVc$MrZ zJ^xa(xo#i8$O_G2*P8xJ&D4!@CE`Z-2F?xsjZRuUNEN0P!JOxkWGh;UI9P>2i(Qwv zqtwloFz{D;xB_axyNjVn6it~4kw}qCAFDS{-A+1a(J}j_)jD;*m0c{Z>tsAF&loVs zG;xBfewq;vq(?36dHVDA%u)UKb~yfh=$HkK&!zO<6)@>a@p5!!qB{ zg3jY55D1VGH9&PzcI~7EsFlE#KG%NjxPlP z69Z6Gcmw0yID|I;7%1l|7A=M@?9PA>~JZ<`P{? zJcyiNv1r*x_k-P1lTeEhH595`cjZ5&P0IT{Je zl?~5)Vup;)o#eom+1P1WBAUm@)n9M_160#}n`h!=iatK@jRM# zURZm;Mod+Ft=-sfoBcjTr>5p3i>k2Stqw=JR+CGEnbQL)%E{7_dm?=hkNoLJ@0oJg zWjgbh>{GFWCk42fW2DUi0~L+WP$eDq|2EsF<)ztlDyBcP&$U(`XbgJRbJfa(5tdHE z#~@k5`M29bP3IoD>EXcmwAs*(<8|;_>@G*!mFX`9f#va@Kw9C}%)`9r90@<>eeF}A z9Wt-dn64dTbGLG}2uT`tq7b~QgT1-O;Ke*Ylzm`T2ZBdlg~5%bSU&ai^;3U)ym9ZC zvXK$jHLy@ona4Y?XF~xg9C@=LaK_gkm?PX;Xc-X01x`d6BNyi6^~LRl<@p!xrs@66 zF$?}&Iy+Uy+gD=vH!?ny!jwNmmwSq*%;Q?(b}-^eSJ!cv*eM6whv5hI7T0A|NR2+` zdd+y3uK~JP)`gmY_k+Gh6`*h9?N)(j7=q`u=fJtEJ8RIOjY?7tG2Ey#7_J|w9dGJ3 zF~J$kFmI$K*$FKVo1CyvdnlTa!MasnU^`OB}g;31&4B;+Y|*h z&0$N+EyqT=@}?rG=suRvzUzG59?S??>ocbqb=ZdA+;!}k@IPZSZ^{w{*cC1ssgv5z znYi(}TAUB!!C6k=#akPtX(CM8=OMo+%{`_XnIOQ7vYDXO{i#=s%|vcoIAE{3=S~U)|vM!hG*Wc{Ii7`1`$$5 z9I`xMPYf3Mh6z)4{oh@kIBg$D_1*bd4cI3(Hi>`r#msEd1_`=rG=CaJfNNW?vv$*OyB@TC68s_#vyL%>fF z;Ikrn#O=|pWhpvJp$GHnI~&38AvN%lFEF?ogpx@;TQ)q2L`DncYUu_3_mV5PbB%g6 zKPayKjTOCCgWgXHm;YmXeZWE6Vh1dJI?GdxNk_H)K%+6L{*9CrV)*|a5$d^JQD5HH zqL%*0-Mo}Oatk^5u3*)yi1&FF)VoDB{;B(fewLM!O%16i1Erh^CPkh;OM8Zo?S+|A zc!#mvznBT&`&KpLo>wST)r}tc4liTe8ZUal>glnsD_GhgIF09UB(Y+HCg89$Fc(U}f{fDe|f2M<1G7P<--PWtXR2U1-Pq<#Y}bkf;6Z*L#sTeJDl8?uqb zlJ8&d`?dwo56VsgJJy^cIG*6$39BuVGJK^)*XKa*%sDh?X&tZ7;{oc4AJ zOc7vsC7DX6Nxmc;gp%W^Gm|jB;9;PHG*??8kiaav9f2PY!HdkLoTB>%kmmVDMpj^6 zP;^$Y;gX~Fv(Y8Ni5|22NW&qdBG6prwK(+)(8Oy=P}D$w!($1ifu=t=?co}jj+{lT zhktnSoAGF*>v0EN3yJtgM&OS=izULA2xEYyBt{X;(a1R{b2QVS0G>{f7QF@ZVm-(> zfCxWd+0p3eB#|&;tB8B-RTlq&zv$)OmvNb!`Y3?vi8yV=(%e?0Y*c#DM!jW& zM|_ihDx0&OP)4_M_W^E&x+`XWQ5PA=&+_m^xXpS?5HoZXohH_ZTSV=(4sLcoyv8PtLnKw`maN{ehc zYPa&F=-p%3pm2$2k$hvRX9YtyU-N>X2Sh^4>0k$wwMpO%oOkTPq;U4J$l8NbW`vsu z+%AM7lQBuywaW6U8LPFF^%(CCQjILf^@nh_^oEf39V=NWSyf(QUrYLhHT6cmg6lF0 zC|ao81!{^x%tAM1mp{alN?EJukuqW>Vgq?CWNn?S7o3&6ZUHgxBqVb=WYQpFJSkk| zVUXhndsmz*)&$Hbo_#+nty^k`056LMGvHQitOTq)%^Y;`-=c%U;Ta6QY4`4)i`Hvr zCvN}N3O`4AYk|N+1%Ny!RrbRIbO|uEOQjK7XHTsB8J*4!VqCiWmcqgEKUShIWoxDV zuQtk;t>B|RsC;}A34?ccKqz!_;_Q!gb9l0ep?zHn%kip#U&}==!UJJ+T7p@jyYc0f zrvB7iq7Ab=)gwhO*~Vi|ytDoKv^!mEmd)w{eBn68yuZ`^)i{GLXmK)^` z#Jvm{bO90>-f(~CzSb^&js3&2qe(3s+syOOsvCWCdK0#y-#fyJAqu2XmG&SIDTI-> z5EpB=w)G!>PQ*DVh0Lf@ON z7zOnL=y|FS9fwAS(9Nftp441I2#zQ9Vl;Xt2|o*{J^9+7OrvMnQRFC<$!OMySuQzn z5`PQI8Y#nZdrUbFDD$SxAY6VQGec>q*f{k^yw`2_qK-&)f(P+m1;6#sx8t(ny4+X6 zZj@ZD>1do&1tE8f z4x|lKpjS9Bf|KeLRig6(WGaJ{H`o)|!vRGvm?+ z;=VrmOEFC0JRBE}Aml1Gs#0l6i-qSw8Q(GP=F0x3(NTBJ1SBd6e`?N=L~_g2!~z4ORDu5~xY4 z&x?OTYUk6Uk9*zma)#)zy0M*nEEnDA#8?}`M97^&>%##P_~A5DK1!K_B@_4E`zWz% zOep3hzXtv_ccz9rwnI=^^2nzKlq=nBia|VfBVhUP8H>8YG2S=R*c;34GA3Vi%KvEPqQEhR4Osl@EILYDuHi0mcRi{|NRjj?@+}rn_H9!n_RV!XxS4VC*_#0e*rXE+XZTHiArYg8C zjpmE8zFWeM9(cdtK6Ie?2Fk4iw5{gx#&RPa1=FN^=y|K{?l{~U%q)AH?)sUKzc(=ASb zyo#yb6r?iE)HNsDr&cInh(5b$fx$=cqEV)Qd{A9|tmeOvfUoRRVuuI#i}&&ibfr0e4hadQTYObB0LUsj>nd5y0?^jQ$8->IQA;oj=W-Rz`9KHm452}48h zujhe^QQbuTw3kD`Dfh+4=^-%m0M$=7fsYzXe0G=Z*R=aGJo|9dYy)>3z!f-6y_@ZZ zd4WqWRoKi=rNN8KqtR(p?~#aav!P%im~3B{5l^rU{VyZ~lM2*nI} zDHgs?=yg9f=#wJ&c%PZ#q1`sDt?@N_q>-x9DVv>lB*%G>5KMJ2PQBS> z6!^M7EtNyGX)%@PEyRPsEEtkJ#O2b44MtX z8WoT43M3)0a>ISquXOy{88xK2B~ssbBD^mFsdxDfx1jb>t;W?b1Y+I7k!R&%t1LM8 zTUw)2{J}^nd)=Jyox&lI%kp!Ne^%00o#5zpQC1CjO_1XDzI)VE3;|vzG?Ya&UK&z$ zpWR4!cJIDp#D5{0v+akjazJtwc?@sVzr7$S^Zn(ntI+;0RTd-sb`#ZmLwT%8%%NU( zP@LchI)IsEn{%qFvBxH#wz9E)n|LnajhDkQK&63x6-$?LJY ze8_RXE4tA~MqEwgr$~?Ao!i^8xDzf*<&X@$_Na+D84WJZN4T-*dyn1z3o-th4beMo zs$9yXw8VRsKcjB?e80v)>^;M|F(!NWmS?N`TC{>UszC}zXzACE{A~~##E9l_w*ouU z6Vg0g$!<%}$3&Ab^|MpBp%T5lqFFg@l z*=k|;$=Y%1Y)~?R>~8$seV)lJ@^Ci&Sfb?6mNGpR@T*zX<`z@tK7A>7Se$`5`PT2B z&Ju0o0lCzE=-K^!KV09{G~L*ytE)9h%M6J9F9f}vu-|Ux5FyGcfrl&I=NgFPUp^34 zaTN}XGe!3~aU#k3Oe~zhv#7i8t=K(i-%3--jQ@v8%^9Qa%DJ5jJ|lz|q$!+VY6rB{ zUgB}=!{(8mz(hkQT$g)47K&ssb;;YC-oj^GA$lIkiG)b&k<6%gx8RM$uZ&0+D*_C| z8Yo3yFSVAyd++3-p^O5DW%T{@|5l!XUG9W*;i56x6R2c{>Ld=1;y0Xl#4JNG)u3m=C&`x)eg+S!=j+n0@-& zZ~oohb}5^F@3@N5h4iS!6ZW0>F&NrYh8)rpx$fa$MKYpzh(@FiTObxrRW57^>v^q()+sLTe zAzIlTH{fsXXy6yoYX@z3XFkneEE|qLz3E!8-SWn%WN>6ThL3e|!SzZvPsdK-;CU&Z zu8$zJA0z`^tucu3!Wm)^?U?Ja3~{0Gs73z1q&65a9A21|2!id@UFtQFtCTM$1ZsgN zO0PQcYw8{Lx>z>vqK8H%(Yzs=$SoxMA6-Z&&m{%wxM|?puok)jS9}Pa+FuUXOJfEU zmQdM$Ds*Wz9uTKg6MDd-e;Wp4Mze1bp9_3o0V{qPykcPzDPShBc!>^DC9=%W4YMyZ@2Cow|httv?3GB9QDb z%xvi##5Hh@&3VH1ShTVR??mEAvB9`lM+KkceC*zg#irJq4z#SV$QTn`>F!&R<%C|y zn<#~)fS5PNWp8ClsM=Kjj|lYNZS?3OY8K(;q7tcX6nvpO0oKefHsFpgQr0iu|BGj+ zWePBnDo)xm;|1Bpm z8Xui`Tm_CbK_hyk1r7a^rmN|YwQ{htjIwa-=!7bc95we7_>he_4% zFs#(wsivDKS$^{ONX~(n?yr z*UX&=f))ZI%8h2x-x%77)M+huJNbcHGL9T#MPtjwrBEH+=Sf(<9)rRT#F{$90;#x| zh*$cGnI!CaAM@$j=K66??yFMNgYrhFI~xhWqbE|)GU_pO}RBA2o$w@lN>S|%gy z4VT?t&cQY_3Y$Rzl*P%SfaqDTqjk-WyR+S3PzbZB1o2Op;ewZQOYQEQAM4@LoM~Tl za;mEoBs-=IiijH}kBd*cSw#;rw|~Tcm=p|m6X}3@FVipx9E&4iUF)MSH+-MC1(&|ggeTg zG?eIQ_zV(mPy2|66kV3ju3A=qjWJjHx8^Ipf|&?6AvonGEWMc>>9LK;28 z=;n>SzO^9@q%vB+%i+X-s5!!4duB4*8a8wFnM9(EP+N11t>_$)dG8oH%A_tPK4$8{ zfTQ@S`<2M{2Rd60$44egw8?>5oiKvk#T&y-XRn)vG}fGO?=Pe2u9M9^{&l9UBXOC# zZeK@;HS9ux&T91IjspTLUVD2@<-yZ!Ps9l6mm%Mf8Yp|2`|F$H@t8jKV`!7ePJHAi zL@}z^%`^_lkfd$4f&VNayiD(cj1@j8jkIkn7I;KhZHh-$VCHyck+`YD3Gy;z+9x%j zU#Gi4bhU8ml=(~?f=4Qw8`%0R(@lfIN;~Xei|g^>S&R)mYkOlKpwbPkRTTgJ35}K= zZ}d(s0T&sC-z}>IQ$>%wB+g^y{H^zb3S~TIeZ=e`u{UB57$24I|2IR%kGjvKgL*@1 z&Pk9upNOO0B`2w}zE9i?YkE^G*|?OAlyYFw%vN!Dtt!!tN6VrfheA1g^w7s^zYTG! z-;jR3jU8vXXD!Hjjj#M_##`u_gP|UltStdZGyL9@SqfF3)3$Ey78Pk-G--bA=+Mad zvnp&kGIWuWxmjyy8}XfI81oHcDzS`HqEdVA$#?awcZVpp|z2m#!RvqEWdo+Ih6SHV7JXi&$=!6_opf>Y4KY)txZ?}bh1Y8q5Vq! z``5J$6kQpeUXWD*f#{*~#;fOaKgMri#KM|NOwt?zosLAz)(4F^H7k>2>T~a0%p6O_ zZUm^3VMvuh_CjW3+5P4dk;zvpBr8`bC)1)ixEb21ZS`&Gj=23!JS{_uX73XacWEp6 zN?EnDC_G??30~D*Y)~$dpjz)Gt?PhwdeZT{>vZbp5w?ucu$U z#ivPB9aRi7BzFx@x?ig(l4e>9rS^Q>6Zh(pc&EWe`}ImK6DXpOs_)U)d*`9HYomD9 zokM9HA-wRlLkm64dwkL-HMF=>&3t2y9)@t9cT5d1_OQLj&}9jz!W7$Qi}IZn+lUFs z?}^2XZMH@vkEq=HPL@}KpMQSKWG|e|p}P`5?$n$SF?aBaoi%rXlL2cWhMO2_B=(VT zNBr$ZuXmql2Ro*+Y|?&5IE*uJ==P^H@YTqNz38)Js9F?d0sd{C^8Af^{kj^~oKHQx z@Y3D0lxHzu!w<2~djPi=Blwt!=h+TcP_Uk0N~_GAWH}>Pq&DZwmCU)p+PfR?vG(ks z_iO;^i(^JnPJFUd{qdmxW<*B$I9U^SfDtM|b$GKm_fhxjZx~A&l3-=zV!$5Ab|xp& z^Tn?YTK6T&M2}?*3;yrS%Qvss74vqR>a)ejCE^^>&5-DN+5OqjEDToOL0Khnw- zCgMo;#?w?#O`E`#Z>)(B{X^oN+0Ymc8#G+S8uYLHp)hpf$|uqBmmX|ouozKpR|`U- zV1Glp9sKoM|K17jvr2k3-cPh1Eb~?gNCjbshMY5;6+dD8xlOIpSY zqw-lNEJQzj_C)3d&C6HKta(I7iDcJ(BXb_{a~rpRBK$@}(`OsuuH;Q&H88rD*$6fN z5MJjHQ8%#^J0246*CTWO{8vQpp4Dl(mLTveOJTp}^DX3nwxpv z(Jq9*m%!VM4{eOdz?OcPIy*y?OO#vP90jH*X*}8h)a2|PJg|(OM$E-F5m94Kr`qX5x~XiY?Q^BHb?jj1Y7zvzV_auS34_ZeT2j=V~02FZ0o|Z zyTjL5VQ~%|(1Q4pmA*mwHGIs}U%n$Xm8q)%Q!V8-z#^W2N^oRIqe0O|4X-rEw9V9l z=lIP{(St4dM$qgqbQ>4?p7EHZOsWKko8~M!4BvjY4Mo+TdF7+N+v97t4U1rBGb(}^zdub%=ugc$!P!{WV?4#2-15E)rf`+8<)|w#q-|RH{ zg&|m}Q0Tr&ixzQP4^T*^-_JGo$OIk%kSHuZm9NTq<~Ws_FhvTC=H$({vg5#fu;)l* zhj;>wHl+G;^n4Qpp1)o$d~p3GWVdPBkgUJ-pqmM+r!R>d`{Bm*E7tMqeLL}zcwDK& zQPOuspY@5;p_hkSc1B(WiIj8__@KfdaXn9S8+||IKh9wzDVZ?gdcs8Uj=p!+%!g}B znGUE{b0e>tQsst0Yq#3?(s1=r|AvzuXX1D6P6P?4YHK&ZZ$%r*j>X65-P7xXLHEOm zKgyIv4^V4cS?;841vXWou|()Mlm!vWf7mC%7H0cOW9NRh`JuX5!$h51_PliJg1x&=F4U^sut z$|!Y3*6YqTH=^M>jWd6V`ln#UM6m*&9xi-&_YICuBr6T%DlO^E*I{Z~EWWj^m@w}0 z>yJKv`$2h2bJEE)EsEw{j#J>p9Cfc5!+U&6pY@bW_zVvHg&vOj2ra59Hgx9_^n5A8 z1;=YuH|4W(nd<?%L(#qox6QqrXyZ80V3KvHN2CI zE>{bwhvCFE#H;xrgQQtGz z3#8KLsMJ9Ypy_KJRcbL7HZYM6_Z%L$Unn->e}9s7RC~1I0)Ii~zSeHzk{=pY!b?^iE(0p7np?q7lJb=%K9O+LIPKcuih8|R)ZJrokXuHN>b(1%(PTGp>wS= z9;xW)8247mrLi~=FvbPuK@{sG&!DfjBHTKZIUkE$pt$a3{=!yLFhdfRsHWd#tRE2- z<;F`|a_ZRaLbMu?4`@gkF^FC}6Nc`WqeLLU^`PS%{wi=c4UOPCbs~z@I~|TiB%;&E zBThWcK3nK#ATnME#9}e+HnlLE!)*+h>f?J^Ab~jbk1!U71S4~Xy22j5o8_tg5Y&>;VRtNOtRej$?3S;-nUCul?@uk@HA?+*@{<~f`uD|u3!-g zJ_f?gP2|HTogTmFvkhs#4Dr<*M?oevWp2>}(y3@ih?;yop)^PX*CWLX_q+~K>gE-R zN6Nz0tDh7Ql3I#9ppk2&exy%7n?s}utsQzw*9qY&Ku@`AF_(yegcQ{bR-wOv`PzYR z;O)_>xcL6~7vHq3r61n9>i~mXGXR3?hJ1&wUMit0$KPjOYb((<_gEQ#f~W>yM0>1z zQ@`6P6=1dKa95S$Y3rN9?r+Pl{Wt>UFO$@-MI6IRMBi&j4x;CGsZpuCEMEDu>l~wv5-#Ay+1{m)KO$ z7&z9m(wuI548{(F;k}88YY9*0KB|uugE-{JudIHhXt(jjdq!jfeJBP(ycP(`f zW;O-q48)e%==V8nv+2_F(HdD*7$8wNg;>PNH!AKIAQ`cSlg3DfZlVYg5$x*`(u{ zT4!2necWof(?lh!x;JBKBjzD?wxvvE-ub81``DdX7ks+^g*_;JlKdT?pFPO5;@hypsx@nAh-S5~r#?aMJ_i7w? z7)}1$WGPn$tsgD;_93; zwERSopI5v^^ZDPj`lwlDn~zaU=2&ys?T^TEqt_WaN~5>^j{F)Jg!S=W;qoTMMg1>2 zI7`8Q=K7u8J(k4qoGqiACKJ0&O0QT( z@T#^pfiq%~lI4`%nBEM)fo3@ei$`;bt?sE*objC#;)tri$n1h zNs$h_JZoTsbBc0WIpx!33(1nehgtVPtQI2<$044trTtSZ)WnV^Af;^Ibf)cijQD`p zGu2o61V=dBbY-I840Hmjmh6&U$YTJX%6M$?x?Ui!=)B9Y$80KWNmg)zxt@V;F#kY+ zx>ns7wsHk61*rm`>CeEL(3H>oD^vrAet}%(Ca)TiswOWkJSCR3lziij!=(V65&&|KuL*M1KD3#^wX=#a!t?k>|3(>hL7CtMn3jr6sn< zWIO5@>cI-4ERS_{SCl`{-E$Zl_=!ii`fL{E_H`esKcrnNeX=W>9jX9HJOeJOsT;Ya zJoj>Se!A~akhD5E1JR2pMMvC(;iafA9wCQtd;X-xb{^4Q>-qD%Qi}syA*oq(a!u4W znvaykjfQ)I14ELG;gkT=S{fzu=;iK1O*+XArDh;KJCb?b=lrN6Za#Is6LSOAEK_QG z9eZhhDUwu!|LI%!Rs)L5e=B&fBSwE&A>!8Kv(FbGRD2Ie20DKJ=NNts> zrFM31>O7k|I#t40I(ceYzbzG<37^K(Y$hEm{ygn<*TK3jMv7gT+?Ts@b6)TIeHc!V zT-QWkf=Xj}Wj=HATH6~wB;Gj5##N^DeMueNLg~jV!wLe&QcyO2amu@NNm1~qqI5Mn zeVWZwa6^h!;0{chZ??NB>%S1yS@*?fcAJD$Ca!ZbVb;y52Zxm-2gtPANjqT(ejQSl zv!n|n9D{yj`x9p#2KHvj*c@p^hbptx`jjY+yxC)}Q(#nMP?FWpVh;ogoD?D5V&g?y zwiKiC1<%PFeWd$%X*tN64|*C_ys1n4&jzdPIe%a$NLV6DzRlL_ac`7ZF^V?OwGgB7)s~ZF_xD>XuTv>nHr_qPxm!{{`Zz|g6XuRO^ zX7If0wNVXQCeDmwGs;}^E-aj}1go$ALZGgTin84I4M&Fm{gN(db9?gCi=b6s5U%&{ z50MTiLyU~_@`$te5==TFXvC;63!9&gjBPJD;5?DFB&fQiYY{*ae3ua&9I>-rEu*Bf z6s8`dzo8}ai=&hhWM$?5iaw6Ml{ zwbmW!^d5j*vkea6;1GNh#1Ud|d9da13i6!c%OAeWP)IDny{B|>)3bWYuhB)IDa>w1gCKU%Lb*Fx6V7T~Oes#-d>c)sYZ*k5S>~FU1Y7Z;rYo zD51k_Hz~HmgwUls276bpflSX@X%Sj;U_OAyK`IcpLuHN*0b%8koKs*TFnrWj9KDL7 zD-7D{+}j>KW(e^J0CGT3>1d_z{y^(_p=hD88t{BI#My}^4z~@~a`mpVIpopP=e=*B z#`OYXRrAom>q^|U$E`Cdb_tzQn5zy+xF3N6tU zDT-Gj<$oc$m+xB=XRZvGm$rLdGP=uLn-l{yUz#|E(=tN!rb`luG;dD zb}ng5P07Ag;0RJ|v5)6=ie{XcDa5aZclrB3pR1?HY^`UJxtAITx?{A%?GidASr3@u z`%i<2(gH6WmYPi@yb@aOt?KHIkc5gWdbO>nNxSGx8e&sC74Wc78JxYusAJu(0muN_)M1C&A_gnXV2fRR@tO0Ecbg;JmoYQrVU32-j&G+9+oUt2 zoYl6u=vx2iuT>G}w2Z3chVO?_O!J^y682xTD&Zs3xNT5j%_> zx-jkXPHmjMwHr9ZI#fu}eOideQ_B#Xu})~5qFl1>2s0J740+Wx?4mBdX8g=_YC((} z`MSZmy9h${3$H0H_^pGO@47@c{6d$V4x`2xsYj%+Tnv-wEAY~=rswcJ6-jM3u9S}r zVP)kl7hn9YVUru3$|U{!v7kbapqGp*yEm48F8!eW!|Bi2;sLQRbJxpStqwv0e~>dlzNArlj%wAAvqDmD4e zYT6;St(li#@6OUGvmKRf4f-IhVjCF`f-qo_rA?%T)gW1?9-W|WdO091as(LCi#9nU z>0NvNc%!DkfenU8&odNBaa4!Zz?cc>%5qvuH$-=%5M+IlIdyh1zx@5vSiHbB3IIDc zT8q=VV|S%Ksh z<_riciR+K-j^I^)tZ>Ti*xI=adUL(vP3==_0l(7tle5&K5h5u~jTnkc24XMuqy5}>8nVHHnX>Qj%ie58X$U<>^ zOKs83LqL8@MaKyr%5oj@$>Fo&*@x+AsIvV`)(;(1PPux>Tu=|Mpi|!6ik~ zlc2yvT!m4b*@KQ5(RElq)jxY8UKn-t!nEsZ2e&H8Y3WMn9@CiVxk!uGYk=y7HY87d z=9WHnROtz#E?auIIDrsx{hNY$r_w+8e@D-<)+%*HPSc=%OE}Q=sU*1k(*RGnE-Mh8+7R61z1j+z_%D6Uh2ivN_ zil2bLiAaP?(%qHo`|7?87|PuAP09 zVHDYoFBOQY{Cnu5<0}_!I1g1*bKQ~O9eIup>(qeiW%Mt@$JGf$75n1YvK#@f&nodN z*Z22^CW^rR!3wu~MOyR-QOxbHe~=t9?cP5WEzA79_nE$h|H^UE);^jt^y{OB{9W-Y zH{OI*7`Br20I*zIu9{)lu#iuzr&&XP?g5MnfA$;18uYW;F^^SuW% z^Ub^Cc`oifGn-+?ioQf|r(Vki*V_G02nhCh=gWp2!Dh?8ys~sHg_rx`)9pBYfVSgi;8mf+}Q5b_D8FomH=?}OOG&h-KTkn zRWNT(P97udMsiwH)=yyckysZJwrYCcUZZNn-6ZD*EP%Ul4A@q++TKseXA#iB1k5 zgPnRXUa$o;SL2iGo^jsBO@F?Z+ji5Qn~pQIPF3_8{uI~LYmH5A4v4d5OHdF*H&;y+ z#Ae14%kBqf{iBm>!;S;l9Vi_@YWyljsi2Fdw4ZW}unZAGxG^@xxk; zHfsF6p3%D1ONMqhl+nC~oi6Y`oPd(bJd$!Por|BlB>PMe?&9JA_v2T~scdbU z0t#1CO(>aTMygDYLVak@tnK7R%+^FHXCRWOg_IjkotwIaX#lN4wtlVcyn;{KN@g$m zM?WR*{muHOnXp05>esySAXLh@D}p=r{FbpS+f9sSYiGwOWTJa(w=*w~AC8s@V|zC< z80?Ube^kYr`AoqeDkG_>{RXW+!xSZ_p7V0skMJqXhXkrP(=KL`D)RWogs5Wq2rMj9 zFM4rFnC_3A$=y*!E4ig9;oxxHrD_msuyJn=8MtjWU;J8M?ofqT#uPN%&U-XP&;FmP zol8z?n(y6P;<^3NHQ4HM$r|b3Uy5E2Z~8Q37goflt6Oxe*cVH@m6msh{{mT4ScSBH zpI8`DMnWI?&;R4-%%hUd{{N3+qGeKP6DBUDiPqQBv;qOe8W&u^rDbx;ES+2`6Uhz6 zy>fC0_ZC9L+$)zR*UZ99(HaGp)LcnS!Zi~#N&Wop{QmPCJsuC<_xs-adOn|z=hXQW zeO_Ra5>KMNQ0ZYM)81M*7smIk9?=`2Ee$Ot{X?9wkc#x#yE0-ah*Py}wM+A(Fz7v`0rRud zCU64SDiK9IX|;s?o$9dC@JsbF=f(IT>bTs3AeJ9Ft#0ZamO_pwFIq`f%vo zS>NSdw&NFk{`*ju%gl#MIsnxJ`tjC&4NK@?>mI>)5B;!V!N|*9Qh=6 zroMhMf(M|fxvnp^%v{6>WRD-!DkN*!eZ<}YED-OBXfXi+D zM2`IV(YlvNNxq$n+0D~`6Ey=Cf|1!yBQ>Ipc%97 zup~?y3}63vU=VrXB1DC~eOM(BQ4-O-O16&K>ibq>iOrBTOI@W*df;o*rdjLd`d5nr z5WvXVU-;#vf|Gq4D_@a=GTXTIPNhl@$xvF$+Wv{hE4w@%XWe~y_jU}QX7_LzU1sH8 zTcZh-ASS3oe}8SP-OPp=kJNG>ow?X({##hQfToVzs4;?P^|Ph2;H zN|zfRO1-uZl+%_#mFPHO!RdbxpM-&`cpFnl;aaP5&-oLwlE^uZW&2dp?F|?gmwKTb zaxfNM`2UMx&PBzf;g>e zDRu8sABwNkhCEaeFY!a7uD*x^h~-z*jQ%1#yEtj+iFbyZf z#$)!$c(^KuDRNW=dD;|KoKVR)@QwCwkc)`|`{AmhP@;|q5@xefoEb|9oec=c_!TB9aAo3?KYo3A49}?h~9^H=E z%b0IdwXp08al|5UN^)5-=kEc`ii%LC>^@wifb~?zRHA-oaykoTMf>I=MsOnqF ze~>+?KEGnD-x*EEJv8WNQWiiQzGa}!;Fci_gW{x=XwO3qTfhi5c|MwSV6r_Y?8q4s zdIQm@$Yf`X5eC1SZ#?#_GJX7I%+)k|zI6}DRRa{TeRJP~zfo_2>4LxE7JjvD!m@iw z0zZ2WWC4`3pOaxGZ}5xM%R{mG4MrKmC7|qOX#l7}jV|q*xN`Z*PD6ttfTig&)gmb@ z9+#aR`&@9Jb};xiH9@7wxd>*r?$6p*M8|HG7-zMi^|RT3jwp`(Yq1G) zWZBuhWWkbjj0zBzQ-&VIj<<^VT_!mk#v8-oj;ra;ZD5w40-V*O2@@In2Z-v8Z!mgE zi>VgGt7RQJLt&cx7YZD%_NaQ<=C;cV1r8|ac-ax?wv2)47$bC%Y?j`8nzp&W>H+`H zbKte?&3z}#NtasrQ3B& zF1jB{uuFMv9cf-D(^Pe&{19#lOgbu7Sz_U4f7zazH60^$LtvWQh#s0T)=@h`=HF(9 zTfMM5PAIaA)_;Y(bn|0wv-Q}7oh?s;EiaZKlLw?u=|dkaZ32 zye>iNb|4{)Tqf;Q{^_PFvKow(w(b#Uunp`TS{#KBVUf-%i=4jKPcX6$DM7)&1>$4G zRYkf9SZDpQz5)A0KElqMxDlg05)t`pW92QSwI-^=t{PSVrhZzO_u0{E0QN0EGz7t~ z6M9P7`gzBLvH0}L(g4judSG&@O}GUaVe+W=VyKW2hSAZ(G()_p>)pd|wC^dhtu-4| z{EN{ge}Z90RLA4xs9>jqFl>co3mTe=v@H0b3i`m1M&ZbN8mN=WBk1Qg18KO`sFIv zm{Q%?HzeGtr}v*CYkbs~b{r-k4Nid2H=eF_BBcK~acu4{zytRk5r#EPf*#&f-K)j2 z`reEV{7+7G2`Xcp@v|o~>iJRk5EIL0F&>U$1@qBzo_-GLm`m$E{lBm)n8(?fzi-RB zK4w2qgIb-sf6P@ocUkxQeA}4Qac@M4u;L5XdhB1b!i?TLH_dF<3IEW3VK78P#Ia(^ zcKn_|4`BPTuAi*lQBC{n@Vh{ULHR-5d$6p$&&{n~Uur6lV<+g4Fo=XLE0!C{isue+ zzc80~p*K;+pHJ>~GqG@nP&qMWspB61GzpQ^E<2K$Rl1taM)k-pM+{cYae*9al^Qx$ z53BS}-SM~ZUc<|+Je|=bCjzk(7B*Lh6P?=oZb2}>g8O1+ohMcX)i?C3Pu4UX?3hK! z4T^SpUc0gN`bEq--1=sy5$7=V*UYij1M+Q@z9nFBw*HPm@Ky3pSjRBO!`&`UOguHUebb$|d~w zQWbjSdZnN?kfP;~ZuakSFy1G<_i73?DPoi!Y6Q zoxDvyEMChsPry_!YXsXpW{z2qZdT6lV?-!LH)}5lfnP_6#@oKm9v6V)@}F%6DHlFi zk1X}YpYv|2RTSTO?vFYyV3{vc7) zom+u#Uso?vsRQYk89kBUd`=$%#_xP<)9Oe2M$LI3uG4cLzz2J^uTx5<&He<6f<9HPj=RbGJL5t zZmE06Xw9z5KYubUf(dP~i$i$_o)bqbvohl~!nPWued%Fde%9eKP&KO|7vp0=iz0$I zH&Fh2W-WK5GT@dm^tMsZEWKx~AvAARUKS^Rc;>h!Nv#XN$xcPzDmjhU8`AOVZ%1t6 zxDIA2?E~laR8bI%Fz450LtBw?KSG26kY|ny@h(K=m-cpEhbWn>pvRresd-sn8F=N+$U3Yi_XM#zRSP`c zeIFv-Geg=>$S})B-%rJpqi_409%Ppwj0!G4iaPD=GJhsW zX+0YBbm6NU9WjEYeb++4pf8ca-WJQGv>q}JdleYgX;R+j+353pP)9|xiNf$8w4(u^ zMqX68vy8NkIAq&^ys_YT*a^L|klI-jyD8RNkD-V|7Xo|^o<5ZlRe!9{3qTrWGcyiH z`;$&b`9H5iitBN#bHDKMRxIO%@;ffhQBWhKCa7&`v^%)V_{MV4<?$s`F@Uq9{ZhX&d|q3O0-|y&{;Fv z7dtroq8k=Y>EJ)#dtYy9yy&DqJ@d=UAp5}`q%^okq(;ga)B#t-J4aPJRO6X^kPTN3Gk(`KT01!?g>x>$jzQ$W;7!x zIyS~zySdQk&qYXGe=Me+K2HGUn!Z>uJ|#S)Jc9eKT|Ra1)`u6z|LG&UTo5RyFo?ihP0CoZ>4wY*Iggs775wpys`L^F?Ief(Fl2dBs($ zzxJf&k*7?#n97%MUk-amFnVTYt#r5Bg^d~m3DXpjbpM+{rHe|=%iH8P+WvNFp9#Fl zyay7*yc)19A}NA%i-b)FseM%7#8c{%l=N!X`!kPeVi}tu>Y>!cRf?m%5oQR6Tw*~& zl>moNrlXu)OKhLv>zM-IDy2=y8j}3w+zLv2=c@grg%0|XsS;!)Ua6OrE~!Gw z72drb2vwr-H!MenESuq@9}k^#AEu~X%$nh_CldL`L0mWF1e60D|BOIZG%m3N)qrTV zo)y0QyB?I6R=?UVf8x9JF^QF2;+r1 zI>z5(kP_u|xS{{^g*o@hNXg9c?vYJjqw(0~!iBVr8fABE0?Ibet(*CZ6Yml=Cf2R{ z*F*NaeW~`KmZ;BE4 z9P@itU7w;ypXZ@}K2B!`7RTMBI4Cq6bmnPGF0gZcpwpmd;Tl%9^mNoRsyN-gqKBDugLgvZ&^4!vL)ihDCllx92wVB+b^{+c zEGZfp$yE_lIQde6ysM`G+$mCCg*q3COl%`xvbWa9f_^b2J3y#9(Jtxb1jpz3QW>$P za6raWK)j+B*3F>5q^gwv;m7T*f17H~t&9|AQ+n>!Ui@do$87Wd4-~r#iv@<^(O@$V z?LTpmLtgDPgtEicJNBfRskE4T2pHzi^J_`#AIZMIr_Y!$;4WJtM(YB(-CklpC88K*)3x;g zGS7u@EL9WD+f2{s>zxJ0iZ8P3AapU9u9i3We;t`aH)scAe~EdA+#l@+pj+F;7vSmsWZ$Zit%4f z-s3kJ1;a|E#7t6rUeTsI90-KTyP?XYaqO(J2-QAH&3s)ayBi6?5J8jDk`lvzb+_3l zR|wGXjr9*Db&}3KV!Y+R;*+bSp%l+{MY8)4L?*#ZhuHtQUohk3kmJ0FS8b%sn^u7h}3(t(|JO8v1v4R%(I7$rtp;_dU^NEEre|n_t>QweM zL>G0eF!(n|i2hCHt1$b*4jxPAFyI> zoJ=fS(NqP{j%b}3B0FH4Ra;(~sT9k6F&bj@wK<&Gnu9WYUIw-lpml*C!Dm1IP8IL!ZfZ z2amngx{Ux0$%EdSF>(ouGzxt$0wNrGl2h%c4?i(3?9U*cAJNj3amFW4qN_JGd5n0C=bR!Qg;QebRrFx6bePQnmc4wqc@$_j3bu$JrgF5;9xyMs=fy*B9a zYd(7wR&f|JH^!hOQS;tb=7b!gvnKqQx%HAJJxV6Jc}4XF>~+C!lcF0^4#D~@#s~y0 zly43hjh{ZPEt7RjMi}!5u#{zUN#P-9j`RQ~ zxh7G{Y`{}pXEL2Uhgt4tKQV%N2tRmlX|YDufU(B+;OXHn`$qFYd&#_tK0JgJ1=Re` zQ}+++zWJp2=_>q!y}d7HK}xLqX9RzOJKIECDXzk8BM+1bet2ZLpVR$E7>q&l{DoN~ z!cQB4Qun%=+bD8bv%GMIy?6hiDJ&hIy7zglG$xaGwkAr#dF2L$@ zZ#_*u)C*KZzZ4(3WRAn->aGH_;u=5W?ng?wH zOY#fFXn}8-JIbW)_}!25DB;haJxB>Ge_m7VX=D9p+YUG~-R|!mR*aybqZR*aQKXPt zg$zW}g%=Db;Vl?#=$S!~+eHIj!_j;BjUf|MzV^sJ3@w=iw{*PblkekDTp(sMO@ipO zW{YG3D1QI5v48Q7qHrotus56OEMW$DM18!|sHTYpL`6^6`gcaJDa>HCX{U4BNu6Ww ziY~vyCLnY+mPuQ!85ROVk;c^D!DYv_x@_VQomO@hx(S#sbReDH8VFkuii;gB-Hj_f z*;x!f%Bk34==CpKdUcv%4Db4Oktjky%iLRA^_h_bJIAR$NMR%oZ*>^!Kj4}sDTza) zRg)9bsB`_fl`pKaUYBhdXUkd*1`-z>hHF0b5+uWl?(ZvIG{42pgGF2Vl6&>Op-bjO z7w>HR>Q$u)(RBJsbymKI10nqA{BiD%?E^4`-CZc&=>)$&lQw(67>i4KM;RFOaMfad zl1-Z>6X$VMre$@;2`#1)YABP`HH&K%=&w=Qf@I6c$b8>r#G4Df{mC2jkG?$9$#Au{ z7_n+%mt{K1a_;Qd(#M3IZ6w+bjJ!nCvdu<6xO({Xj%oDs_6_7x)&}6iw%9i0AFxD4 zg)Q_c{Ai*s*#5gnb?NZ|S8^fecmBEjD4p>jvJj2YtPq%DP8oR-Q4PHpEj$@5Te+Tp1LuklHMXicOuqMFU~jI>_andtsu#nZ@o!A z=%qACorcklin7?y8HUHH%K8FmiOy8EvTbe(x8zEw>%Aw<0G_aH{hE6N7;}DF6!Jl= zc?jH{_M$(K{2{$>VTY+MXAqb!Seyg?svLFyqJ=tQ{%|zk`jw~>g_Ef4#-&CH9hTee#(9R` z{4xLWM3#BL&7Ns9v^WY!yPO1Rm*W=`LYk!JcRXr7@*rX4h*lJe(}0Z@Lz_r~lRh=o zCz#kYx7grdJ40!Kmd?zNs0k)$f8QNCjY|RVRzN^}KlYtG7 z*WbUfr~ixteH-jdS_)FJ*r~l0E8DgnzumQ$Ls>W76cx$8=MfIWgPPY!_D>px73Vi( z-%u5eV^2~NN&D=lm7vIF?VEEil&aYh{L&CBrVaj{w#?&_-p{IchzFP$ZE2yFW_8=D@euIHa)Kw9*6)U+45W~ zB=1}-oCfvHA3)>sM5k>Ot%x+dtDx)xL`&9ZT4z5qDxNkI7Jl{fT5jE;My@ z%P$d%C9v_~3MUBoucm8|5G;YST?wAHV8E| zcr??AE?n{3%4u}clj7rnQtJda-jJ7UQ4{|nEA)tX@tK$Vk{JCa}D+x1!vxGUFU zFi>Xp!j<1HvX|2SU34K{vUrdFax#3Y$#4yi+(%dRi0dx!S(}RH%_eu^6}{@v3W_jE z71o5Bv~1DmteYYOn5)yKN=_2zXgOlCci^;AB3l$#K^M~WvlA#tWgCAW%SgNIa;z(6 zAq^VN3ed}|iIz_?F0peSY)KrzF`F>j34!BMFXgoYJ5mEm^Hrff>Zx8FmbgD?u!)fWcvXwnhsPYGPLPz{VyVN0p->hE+-bOAmA98c`lQOc#nNCG2pege^PeW)sA@0T9 zXyz5CJy>h`rnl)-Ey7Z-h1#0{pK*>h)<_&k&3jNiVwH*Dz=S&h(UCKV;;5Rc&i#X| z$F$i)r|_2UMzDPTQn8)=dzwPdck5LJG3R&DKu0y!e<%=MdYEUQ7CKnWi|+7+VZLH} zqrYMo1;`%AMP^DJRoGn*oSnwIA#i-tkB(v?Bz`^iM@cvhKIINE)RE2yaba5NSpN!q zuo^-SvsMb5M2TRC1;=>6Vus}Ych#4Us?I{wKo3y_E@Pgyn6-f!j_qh=*O%& z&#wlaY5Dk|!h??u$_!k*`B&F130c4I!N=lXur3VL!HS@p-TVgz%9USFbQ5HN8**W( z69Np*fd(h~{5V1FdbGedDyb#cjwl5w`jR)hsJqus@6mIHqGyCzt_wdrJd)81d=RII zeX(IZ+$8%Ym#0s*+jx29m|u)odNQXl`Py$csU1p>>SrA1>U9L?Kh3bf1O|96w?Fy> z;5n`>`r&E|!bI}Jr%9nLQF^cPO7Rp&M@>!D!;og{%9n^|pW19+uNE&Q^Py6fL8*FP zG2UGp6&R+mj$Rn)7JM&>2)v=BP>5?#0C;eSrBI6(ou@H_<1f5VN{$+9H$3!bn8Tso zH#28SOw}Ce8uXqWP6ToPy4yfw3O{mI7li~^mROqx==a#rPL$fQWwawEDZs{Fx6#dBcNXJW+o;Ae%C zlXM9)xUu7WvQM$KOkm&3=w>#BQ8O>1h>dX{#aiOSSrtP5jF(S^+t_DV6F z>}fUfKZy917b8$e_fnlJ%}eP?kA)~`-o#_|jsuZ?qK&CX6+ zbDEwH)Ev@(wYzBKOjMNC02n;pkPG@UQc0sq$D&G+0G`@`(r#MZurIlGNU!B7;#4e| z%-eh%4xzMJW)cc>Ifc``Q@ZT}SUyC8&`vh|hM9B!G@A2`i+#X0oZ&P{u|E~5M&%Pn z=(R1=G)1qIcW-4GN_%c!K=W{Ep-hzbKC#QuA{vbkcHj5-*QcX*60m`jd<&V5mL!-Z-z=jSe_ ze5GH$SA9CQPc>s8naD}dEXnwK0J|J8I(`y%fKw0onHl`X?!a8LZ4EYi9pb0|^Cjb( z*{iH+^30i?1@5T>r?=gn1EAY5N^<*J>D?^1oPQr_=C0fAhWqDT)#xkNd;d=#0ZwHF zqZ-=iQOecs$LLuHTF4^i1c!4 zX>Y7YccN@r_BiW0>vPdy9@DZ? zky!Uc9o3|OD)E14BbW3VQ}Pw;o>`Qf-(TF{_-oQJN=srEatMO7G`v#C_Q#FB)+(uHfBl6E=#2F4j zPxW&ji~Nx6%~TC@SE-52eTT}Vf>IPO3KK-ql2cFA*6C!iW%_`D$#eo;Bx0i@$G(t8 z?Xj|>)H>K&Y8J-uJC*V6faBxx%g4KGC?c`WTTb+HaRNdskvBIZz z6eRb>TFrR5%SU|I|1kq&^0`#w;r)ltw?a5%JiZgV|6Ldn8GaacVdi*kXSRwc{je)l zU>Ijmz9pI28V&KR*F;=h6fW^~ig-pwcSjVv?|e9!skNkiZNzFg9WyB`NlYSP^qljL zjG!AzN5`!uH--cZu`r#@umcjP%D;@%yf~ zFG>AMA2b3qCIj~tN;7$&!|$qh@Y$oy5!=dO5D{{Hld1h2n=X9D(mjK;OuJ6I;I`7d z7Bu8OcqgboAH4Y|7oEc}#!3sVzm`W`d@2t}&X)|*vfK?wbbT(1D65x+in9$~QGY~f ze`a%9xX_A_oGco1de&ms^$XOy~x%s%w3C=e~_XT+zWaNTrYk(~6l`vggG z$2jM0*7voq#PX}gHP=#!JTXJAoL3)!^v5eEQm%|1uKWa-vL%TfbI!C-v`SP*>(Q6+ zu>Z44?7%Vm9{R=br4Cu$IyL(WokH8J6p=-CX*2yrBiDZ&zSIpQo^I#8GTJ5+JAMhx zeYDnVz|#p;**BF8;FNN2ACq4T8r^I*^d~Q~W4_pnD~*?qUkgdCsc4YfWvL=Qp*3jNBWy9l?{xNqw6HEXyEWH7uNu4Ahy(-bRlSg5o>uWNE&eLvlD(W$VQ>suM{vZ} zuOTaV4+bJzB_mX`GI`&L^T9he_KbYrRXRwepgGDgV9A zH%enatEN5c_f7lR+ec(#CXg3$7R?b27-KO&T)S8h#n1uP30jB-XgAkqFBd@##b5N` zcn4)rS`3LB@!rK9~koWkCH;&i0YH*e#KshYH?1)|@; zkGp*zlAKAE7uV?`!(e*rORWbT$7q_##lasY{K0-cvVlUE*+lWZPJ|PRqUx(JLEFM& z(8k+LXI4n+P)1aKV`FN!vsbtcm2Kb?^tm2^!m(M0CXE;NbTY&ZdSRNIpj-IGR`SAA zHBEefypyC8G0Engri zxWI{-a|t7iGHKfdN6x&SRh>jZesU~ZVL2UupgZsK(&sOLA}RvJwpl-Wkj^X9p{uJ=@bYZ_k&EW#>K8BUxA_ zSV~=1XxXN`E<9O6OxOMP!M_IkbcFbuH(zhnDAjF;?FvqRuu$%=@%beOU*CDak5k{~ ztTX2f)d_uoXqK5|Gs$Aof*%wVM>}tvSS(Zm#x8)a?S0-x#)BW~RH~i5`@D;Y0P0QO z!wwZ@bUO$!3{&cjP@8w5l){5%(gBJRFC8!9?IeWqkWeR_%P zT}2`%mv{w1lZ$-cKGiy{9}OLAmQFgO?AU0od7u0EF`fO`u&rpuHw>yy`=fkoa&iXn zxEDa{RTOgT;70%5aiI^uLn~2uK?+J&Q}Bx{`_RX0gVMATnD#A_(1!DH-t5zm2#Q8S zc7ncfrL|xG982!Md!zo|%FY+VMhvj02SOW{R(I=O_o#h~RJMSwY>M8SoD?YoXa&O1 z?|v2+sWM*=9l)(Zt&*58V>(g+ZK5hMcP{bR|Y{IaDQ?uMZRfj6^&sZgi! zW?SrOvAyhN@X7caeYGOIJ45LSF`XDEYo7b%b>?oxTv%nI!{RPUj|BpykLm zTZxmG&jmg-wug;y*O@BMH2!z4tB}M7jYHsRJq&K`7vr_S)agm$EtGG;QY%D9&*=>* zhAUfZ)FN!zaM%aY!`ta^IM@?S*N)Rs_0<1j_u6bR2x(~?k5#3u zAUY2%A-#J99^2U4J64%^0#^j>vdoedy1w*LgPr^CtTORPa7ss#TY~hiy|0%E?NG^7 zZ*H^kvf2uk%zao-`WB8w;o4Yza{)r+pPY6)wp6u$K!=ZC#|N)=DP4*sKq1~$c#qyR z52x>i`N5Ps8}x3V=>1w#F1!KS91R9oP=}(M5-4+{$w7bA!oEYwqHCLc&Pp73Q&yb8 zq0#AHJF~WZk3q6Cl2fnuu4=jSU8`1Mwr_Hf%J!mVmEHf>eb61Bj3*e1lgCnbGz4D{ z*u(d25PvH~gHpI}B-3k69Y0RZnrQ#o?Bvhu=!7WKvXTK5z2E3riO^(Xe7DrrT!S1z^@%YOx6_ipAO zLWbYJx|XV$C#W!;#siQ}nd{gYd(_3lyH?qp>}~ZJs2*7_gykBrucFk?pUp`DeC(cZ z^7A%I^Rw22m!DxMBk2Hq6TDeG1v6UW?w<0ov>>AmX*~fl8H(jUx(P9(m`LBJCmhiT zr)$Q*tQ#i%doh3ryX(aZe=-W0K$oN*e#-C{ihFJa$gN&idTu!sMiHP5FX!A@mUYEw zUkwt|x9WH&Il`|pgX<-T4xosS-?(L{Od{$Li!-_$Aqoboq#$JC%$3u~z)Jn~Qk*7x zo!)Ko>>0AQ@%SHUsLCQ}nHXA!>BK)19;>=3ZrW7kgp8UE!L?o)fB4tCZS;*AM8|@l z;c4pVU{U#lCaak>JC_p-4b9l;`&NX}oOe@+0-#jb2BlJ(1|Kib6Gft4vi>VJg>_r* zFVhx9h^4$@3tXUa{EM-_syX@GYv>t{tT*qaGjHQmI6x)^x9dbo*vb_45*flQ{BzW{ z=F!OM>rTSI6W~86sh;)7xn@44&$B4E+2JYlXw2j{5@xcSA?u3YlNxpUIl29M1&B%c zsM0}k?)AsNE?sa;m<*81^uDgG$0e10O|6QsbCV2ZZ#2E|{t){hvX2zQU$q_+v9*Tv zVCC*?--4=sNTAAhqOHtN{C~Pkktosq6JDM4-S3^a0)CFt^C&T|RNxb`>jjKHi{MR% z(KP!wV-0eXvhU?OXKH6PX-LV8(953@koG6LC;a0U$H9^K>Jf31Mq{Jw@k*pKspn-q zJG=lh8K*r0Qu`b4rfv>J?)dQxT`ES#+g!%~$8qiZSUCUNCe)fcO6+>$6Yk{*esPXP zcDc7&tMzfvCm5~2vF?6q#K$etXAfQS+N=b_gX~a8^_SI`gx!_9-}O%OfxTubW6M+C&{hLqiY@3E3 zTT@A&z4V`FYV)grth_j-V(;3w%)&r?hf%5{W`Q$m=Fk+nOQ)CRCRvMa&Zj{V7&(*r zBz5D7?6m7~(N8{2Lu1;=bw)kRhoeA(ZYr~j7&`uG>)A&=iMk5>!DjsD)jx&G_()ThMVz`d7%w+$CoaJEJNZCTH2!* z`Vu=@O{%}xUkg1HFLec+*8%GTMfDM&hKiv{Nhl~n8TzHu{itVa$3Dk>=BzRQP8`tY z)=t2TBSuCy!5_|B4pTowSU=5R13|&(X-VTRLw_gs>gSSmxEsc@{I%T-4Vrgnd^z&9JWH){n#W#BPV)#JuG@x(iTm$h@VnK2{}se$SGz1z&t57Ax`rNF)#lR^7GCQx+oCh{q~!t^Ezaw+4(`diUGY=NuhC) zft6$kHyh-ue|R`@f{9?}q9;9>VKFLS9MK>c*nh~WFA^WG=qo`&G-KC8+-CcdQlFOp z-{0e5{GvkyT~0l^qZQS#pV*{h7}{V+^JG8wwPbSHEC-+Wos6rT0<>`;vhS6_pEs6E z${+NSFXF$4IpQ%~4b3KewDyIt=|dIa*d()ffe&``xi>)=)CfDGs7*DT%CY%oc6J`6 zJy?R2U}grF2;Q7L&K1|Y^EMhuROm})c^%Kio9dA zIC@-@gXYiMb=|kskP-aPEK;HVXgK^&S)u9J-1AY8*CaXlTFuP3`+RNFiAiSOy5seP4`e(T&#OnvYKlA+Y-E^v4 zZY&b2+JV`F_vO*_p&?#uJO7I#1-zCzO8Q7PBNzS$Igi5s$gi&cwQkuXaN4#yE?!Ks z8GSsvKu`G^91^8PteOE>Zc>n-?sKoT2HZOVCguc*zt40kd!DIhQw2Y~Ta<>`ipVF| ztaDO#T~`s;(t2&VKWUc=)s+NT5@k5S!6*VO2D;FFwibMU8yxeNS$znmOZiIRYp>Au zys?iFF_PI-$1`CPb`Br&B-^Ko?HyImoxEX}=5v9()M>8O$1MOn0;!kT1unIXCXBTp z*-KNEt|H;rg zevUDf9d0QYsM+`W@u$J4EhFMuLXnhXcTny*awza}TSlg?9_%=UfXvDmFEQSI>|Wwm zzE+n7V0k+L0~kYt6CCrK{~3em#HC}NBq^K9v54t3)Hp~+h&h^OF_Mz+Jnkki1@r6$ zzAA#Mn(=l;D#0c_8r|i%6@o59C4^zWDQS;rOhU+RKTjRGa`sN+?}XJmGl_Hkp!vKD z@YJ8pQNAMDtT-YM3%gfJ%bkY1^x3i4%~t)7lwf4ihJ4TP00JTI|GOz6)Yfb4$C_CQ zzR58tIRB^}v{%nHa)L!qbJ@{Yl`~{7QxO9eHbyc~SF|gL%ZC}WlclYutM+&&62V#> zE7QXM!;_(A#s`(|g8;h;t$x3zgcG+N_#I$*G>q zQM=s`H;p{+fn?V%x<9xXZrt!+`s#juuHaJCtTnS9w~hhH9|>r*9BnC1N=&Pyf?ih5 z_=7f^gQfM@uO>uX7@m^BLaQu-C+_6U@;*1s!W@N{NY=5|=B|Ez@YwNdMrc4=IV!0_ zw6{yF#rl4=_q1<8p*lthvBA4gd(xiE^2@zc%KzDZAIY@a?O=SY0@$Kmx|&}!z3cFb zzmG1`AmIFd_8FdzdO`~!<@@HE#Zm>KeZQ#~NK)~M>)}B=$0q&<;q-aarj-MuKP_4us{jS+u*n9Kk2@3Ij`|JwGkHv{UD@~316m)JRf7F6sv{O$Xg(5Dds+kIC z^7i5iDkaolag7**<*%#?LF!O9suXV4o7kPEx5EzCHizY@O(3iOh<|vx-pWP74Yk@?0V5n`TOjiz4bTesN86IaX`Suw7ZRAMjFBO`k^pfGhn$JWa78(P{$Py zztjzAX~QA%yp3-$&aP7B`5(rXJ)pEqD}jHTneaUb-2s&*?`@&40C|I&=YiqA&+{&T z&l%QlX~k=B)|HP==LCE7ZM&?w8g3!eM(r7X_D67k%9^}Tj9B>DRXxJUPH`t=fA!BN zk8sMP@(;av7fSpW1))<@kEwRr)e6kYi{=h@wvNfgS_p)w2AZxy{h4eRcH=sM1MFRk ziS|v2cYeJWr#V{p+|0BH0YsH4%87t@^e9~A<(?Ka(mW$IF8QAV^{a?+_BVlbjogg5 z1V3}yaIPQqtj!?V8U1v=A#o79(}8xRpW_*&E2^`sfQy>7Ce(`^%KWbsH3he~PqT)N zlgs!Eig;NuP=h{jANm+Um7w!2N{H{ob!Yp`yL-F6BBU##XmDTzpT#{%*0f+mwqmSN z7P+rDr)YuM*E{Mnw=Z-f=n)-9^=n&++m7m#so%HYLA(}4#cIY3R$+jQpI<%u zapK6}a~o@Ph4(sz>_@(=UW9Jw?{?FMeY6I?GO5~^dPw9_$LX8Jc+UWcPLx7>2TT_; zrT#T1GAe4@!PspE2%qn27;aK}I#x;Eae{oGH?Vqpb_PHzjXln9k_&M~6AALEf=iRm zIZ?HFy=-Y~82x1X@UyjdL^}1S=nxLaH&CNFFH)%gzLybXLB7)*e;nWOQ`ED)YaJ{t zKUHXAZ;pwY`D$v%f2Uja6~Z~Xp@FX-oB_a`*7YGOH`F4l@b)|Q(0Em?A@_aE1W4$0 zf8(4T^I1*iTqwG9Vc&3|9UHtm7D3r6UMngcYk-@nN45H;<5`K~i{rnj;@oN!t?vaGkNz@AJLXvwEj zo&38&McK4-eSP8C`vQfyx-s`Oqzb(!NF1qz(`ug|NC$V5d@OP&#O(IF4Az>qxlRgJ z;PtJ{?Al%TfPg4TMYX*Ht__$Qy~f$Wll@tzncfOw#O;s#r^fF9<53IUb^A(f(H_>r z+=lKs=dR31_3tyrwjg=QwL&R%V?Qj{1%EF83pTh|68bTW`m^WnDVKUO_A)1ukP|j1 zgQ07R^mOw`)Vxkcg6n9}(fv==Iwzy{hFQ&n?UC3(-qzM(c-KnjXcW?%*39Et4oHyp zh7Uap`!}i3YC#7iy^AR!zVXOnN7imxT`GF~^~~k_-UG@9E2rItxlhX9Q9AL<5?+CB zEIOS!duC6#LcgBwT^L~pj(5fKZ5XZ7s>3j=sy4(Zgro8ETVC^W=U&6|%BS2Uf5b&g z?=Z?cl<50Tj~~N4n;L2otPc=*t~M=BQd1usnf1jPyqiwPfIZMbaQI%|Kk@|i^oc4C zHu@FWRR=8jMm8-g`xf~0ZJO5)3>m>hEP^vY4$pp%f?ffxBZM2X0^2IILe_XNv6Mw2zLG!#;bv^zF{_|K!r**p+J<8PfqEi7xqj0Ix#gTG zd(XVs!NLp6FTCB`hpfR43Ym+&EQJYOevwtCLp|n$!_1L&^N6CoCRQLeJgGb2+k~gK zVu{WNvD2faQ^x~2R~{mJW)9d=Gq|-poxC)$+wiLD%bd;UC4Z!MDfyEW>v| z!`{b5!vjZ>ZaN_>(Fq-#V|A zMYd*(Dh%1dJjV_e3~3t|D7ZYq9hTz5k-vDZZJl=Uba~0w=e9I~i@D3klU@v)v?FZ71jw2AJfTiw2?|1r$?baIs)5j~@I-tf?zq2WK%X zjnQn@YTD2~9a+on;URXAM+8V(-uEIs^?S3Y!TXerUFo{=e>x^O09DhN4+zk?2OoKI zBa^N+6s;SRb~V*|q*f*`>`AGo+!V39mkiU!`6#AL(=5@T!k2`XeAg;ST)U1B-1Yit zOQEC|I%=jr`EH@85b2%dzbMVHjazJ`)0~TM-g&h}CY8+|CpBpH-f}7EIX!a%WfQu*MONmKjNI^+?2?A9IFd}Rco|ajNtH0MA@x*={p>D<_7twQA6 zG?L|Nw<SD%(AQn zf+l(9i*XYvYORaz?KT>l0__iEQxdV;(Z0wr2%kWgA;RNn|gL$kRJt<^kF(rj-V z6qN*B3Wcb6KBo3Bj;?K(nIgo92uat2Px#BwGi9x&^Zi{v_M~fa@5{>!2PWSSgkhWI zv$jJB4Hh0jC3W^y_C3&Ggi<*dL+G0myteLa5+f&1Pg(G+E$+iAu6A9Y@_f@^aeCjr zA&4e11zI=>JbZEsbvDu7@6lo>mHC6-mA=VftB+W#Lut8w535jyqyW)9v3M}j zC~Fo{)@qk;aIwGJUoS}wWAEIU2vkXaky0iEihdcUws-K`^HiOOkOG{hY_R3v<*2bm zsf$xJyaK{XNzOU;T3jnhbBvwiPw>lt2>7$h5;om+;|X}QUi`x5O5n9vm>zdZp-I={ z*y;K>o3yKA9B$HGREWyafOK^lX|8wgs`uNtne|Y6Y;)mW8=taSfzpNa8mCZ$-&hSd z=v_K{V1%t~u8~q5{l-ZAq<;;A4kFIN@EPSpDO){+_i}OGJ`cu62~H0&rgLqx(`pTA2to;}R_F)m zdik%aI^?T7>)x`z_c6L?wf?+9*cK5t7i(7cbnerGV2Aomhr+Co7*^9KCbT|nPTt`V z6{ieBBjUbtGYJ}1@y0_%*&6W*=HpwXxmkPp}n1IpEuRXV^RGs5W6ytmFILpI>t6CU?sxx;74@G2U1LxvDBt4J z;|Zdd6)u|A69+JpF#~~0KFmyNJMP=9E%gd@H?Vx&Y?MyC`(P$MM`HaD+^kGUnO zKHC~gzrgKPh=1*dSYXDRU4JgLTtBJyS+YiHseZN}7ud8YoQUGn{~Zh2b8{ZpBtbJv z(%xaaV1vZv=%!|=&7rjHSN<^cyvvH)C)SC3A!kAXF=h(ib@Am8t4UsleCeFh!PgQT z+nsoV&93`*x;1ngbPu-xmBEa9$k?99y>C`cxjeUTo(gVSE`{Pf_t7u*>Zo`3wSXJ* zP0fWp_jg70+}_`5GIEa(8_BW1e6fO1fr8J}Tn_d;d0++tX#?9dk-hFaDSK5kT(1~B zmn_Qr!0uZM%>1lhTf(EWfhRe(2uWuUQ-0^|s02j-*w!#pS&L#;T|^)tr8MYG#aAtL zQ%W8|yLDFPN0NnOa>=CeR-X`RpJ=FSPN4Lgz|!MNobttwhtn*L_sOIiaFFefl9VF+ z(wj2ri=zw08EiIpEs}Rc`wTc*aV<)$I<(TVz-;!#ANBj5sW|-8iBI!#GwO`NE)^QJ zH!?hv@M;^~L-a7Lw5{c^U+ye#?&S6%ZqpBpGgvj@X|^9dex#Hj)Vn`%GDC6GHoeXv>6HjJkyR3KiSp*MPw>;CP1yVrov1?J>g02%VW1^WEx7zwHcyxtK!NK zn2Y&#T*t1E)s%e$#}@wE9%fNj2*RDHOj}bIvnM&1tRL2(Ebt@K)6R~zq zOyA1mrzG2^csV})THZ!QP^$~TVxqBG3)2;$A-5VcX?d;XSdT~<_ zLWe0FVcpnJ{0b=_GBMAnPH}$C*h@$!+i0>{SdKOwRNGL zpnW8**h)z)tGCZz19?U%nFY#(uiKI)%=uE zZB6Owz*~(Z6D%KHVWuGicGOch%o0DymNdt603L@}&$iFX9=_(_G2p&BFEvA`^5SgSv8c)5Sp@CQ%r*iugKO?XwYi-c zwd46GeR~7eJLGXJ#GKkyG1-{Z*p?4bTAzO}F>^lL{ih|A-M^4AePSbS@>T5C$nm4080oa*AtL{( z&W#k_lN4GzVQIh`YBo0v#Dp8;%YQu{_34Zz=vvXW4*~K6bG*zm-#6`@ZW_EnEmo}4 zop;nn{X?1;YYnkfMtvS!899Xw7H3*yB|}(0Wzy3x&nQfcr4O4gv>03PG&qdC=L%x= zkNS?Rg@etbPdE%o=aW^cB8ac#2IT%BY-{%HTmM?cA+XoShVzY@2%uxr;qs%fWb zCT`vlP|o~egv}4I#h>txF_J4@i`)hh#hx%W#_nV7r5Aoa4T{&K>GY$s7NvxJ&1@ zztftZjGlKSk)^I9lbwzO#n>Gfpnr}fZJPdhk`lb_D8zKMwgf>(Q13KPAEOV!jzqEw z7urgEw#p?H?jE>(C1L0H4sUJUq{pOYBBm3flM}_7a$pW<0F~;0#KB@&V-VZe<))G`-Fu69rQ>CGp0JOqs)ki(2r)c zPT7TCk&a|-n8`gdW&P^CSs?PJE;%j>C=0?f4q4+Y%TYT>=D)(f-HNCSmQvqQAPkH! zw>90Dtb17hMDX^p2HJFnqr)tFzF*WA8q!<2l{1miC!~^~ebt9UczvGATFuh=A$K(v zPY%)g7{lB2^egGf$wIg1)$Nh>$c#)3g9HnHnA>S$#h-N6FAvt+8!h=ZEid3)9mW#A zQ|hC1Y7p2aG>3lSZd%X@D$w95DzS_6q@|FLkv54_n9R5`74yYO5{-1EvGBv{-&+#d zZDNaWcQZ{Bo2JN+9(;9yw&%<10s~GcUZ<)Ax-S!pu5s*G3TS`XWz#G$>(tEn#K3up zYR`}KyKLeUSCG*~hzM|&m>7jD|08W^+8V%608(_0`_F*Yg&eEQo?^IroZ0TfxewIV zIAG%U9;PoGA1)6wcrv>Z#yR=3-VPzCFxYx?e(F@o|m!8-TU*B^>K@+jud7O}rXIKdc<9DrI<}jc*FDhRPo}2_uWxO`!3NJHI z9kTU@c?c>;eFTO`k24nzf8GxQhR7APyzp18m>?ed6gzqP@dbRvI5E~Od~7=rYk2FD zZ{zJPfO1?>txNt9WIeK~V*U%f&dLlQoZb=xqB{`Fe0W^o%ez~q-c8%R5rYcuSLcpD z%mB-o!uh^wr!(hT3IU!eM{(FjzAA(u;)%|B&yRJ*S$fHNnh438-n%P8r!yztFD(IF z7nWD@Pn;rqO^!}gHk{>Ean=KsV}o=hT;qfT!wS<@B64X|3tXAq?VTfBqt8BJ0M$0G0oF$GM*Ug zF13Q8-c;CdDGvMlV>7H286?#fU=c$S7p&AeEvDG(lucUgm*w+TnbmS_Qdojxx(|~Z zYUx-yuzC}ps28=SjE3~s{7|KqZ_X%UTkjMiCIn^%nY$)K zYfiZRCeV~-(vm2XiWMJ7XEY~#mX-?$dHlX2eb3q_kcm)x9JE1SiED?}Tj*spn4v+S&o_A8w#xxb00qN47v#BRYoC%{)5^JQeJ#gF1Sq0 zKJ8E595dZ5L2N!gygp+jhbndHjGMH2c7Hd%*DleW*Qruo-mOVUFsES&;Yi#Z<*^r- z64U#!pv6F^s;)JTOh?Ymnf$q_)u9RD6H0+t9`#b&G->2K3@M?^PO6t9Swj+Ho0Q~G zQoBiER!9#oG+69jr43}~K1G*)Vd~(}IHa+OgC2-$A6u?gXc{n0qnmC}og$sj+RP?S z(cL4*GU*XmfniE%Q*yt51#y9-g}8{W@UYVF{L;qvHtoHe_jM$983L#7 zd2YCtKWgulpm@4zK~{9;#4o=`r)%H+K~kd%5f|=i;q>BSCR|^=(1`S9;1x33bh485 zGSba`ZLuXrk0;*_3@P|$q{m6ECRJer|F$%EYF@7!W7RfK=h&gKO|3+MSy72K@m?x! zgsd|mVyS+4?1<*!e1UII} za(qc7sC#LGAh@>X^sZg7+=66#CCyF;oNlht1iOo&vAR{k?q!UO2Vpaz{05~(;ZdY& zt20D54QPR@7Z@6-JZ})Su2PLjwYALEhYj*9WQq=#lNj+ShzOqV2Hg*=4SK8;{s&Rx zES#`XMuP7KrejC)$91c5#;*VS;;H}Uh8b_p|Dc$zx<&*aFI5Bj$)B55`8CrgtZ(4Z zTq}6h-&OtF_Os0MLYxn-tQl`!j#NM22M!(YXu~{P3`QzkOb0I{D!5M4A>6lXJum+- zEbNcc)Qdv(vh{S<)QqRATM?l#gfSfpk4s_EC{CJ(LACv#+(|D+p-(cC+H7|3Yy1T* zr3t?Ww;ED_WbQ8yUAA!;9V0m7ZWh_vzYFUrB(1{zG2Df}pR9 zF)(J0ZRUR&xJO1cMoZaNLG!$nJA1L%rZ#McUXy>jlx2%6DeFXFYIJgmWe$51r*Hrccv2ShHe@gn*GiK%flVTx>?Ae| zZ)gj<@5#BAf3C_v|$ycP6{1|&;Y zKV9f)Uioe95g8Ujg5?)*Q|8qQ25ub|9^NYF!CiI(7URMD6Q zAbSe~+=mXJOB$3E29fK=kN3axyp1woZl|ugkj%F(O%L4lOyOOd*nyGB3dL6{DqK6Z zjfP`tCuqzc7?#mW8zEUBwueY~?a<0%xn!lsd+9HS2){A<;%r-?E)b6VgVB%G^V?Sa z*d-MuG`n-qoZiZ));%mxl6#}PI~L~sIv&f@d7bwCQT-VwlGH1Z=-G!A6WqQ><8=5* zLH1Qer6~lTsHINhYd^wFOa+9l{lf+aHxF0h{R*0a0V3Q?`N@<0J4t6IUG58})O+vT z{`1q3`iA#%fps6Q@JoskcaxZ%^ZV?jn+?HKoWZsS&yrN99e`S@%)+6}K&8yBAxfvX zeZDJ8=Y!{3&}CqAK)a`_2`z50*}`xcw0ze~@yk*Zhvr#+NLH?`N{p=S@QE)z6+N*3 zv-lUREf>WcAqld#p}LuF!C*lG%W3rV{)j4{X})16LRXt)qp;0OlR-PKoZM04q9tvz zSU;{ew#d9_dE2db8TqpE+5~q~0h*cS6xmkPegFj9x9~w3uYfG=Fj%?5i!0VGM?>?x zOH%(F(2kliNlYH)&QM7(7N(Wha^UaCU8$?gKbvF%LMUC-=${^$EbT2bYEWf92tHy` zd?+>^r^q_O9z;zViLyV#mxo+nv{4|kaX9Rs^sdu!n?a~}+Fpg2ppogk>jh9aCifc> z9puR4f#QG}RnO3+DdI1oZES`NTb7-h{Q-ipC!;uOu~B7|(JYU81|jpcM34LWWPpzb zCoEc;cs}Fde_vX~PVY|*+B;_p z{LgM(5WU>?hic)TvzL@RN%0|&_HicjI{&hmm9>2JiF0iGknIFr=QFq`2R^q!WQgVB zf?&nfdgwp&Z~^Wc8~5dnNpuOdK57rUO{>+|qM9%=+rPhNGZDWYZOA4~IcU66(VUjg z+9v={ip`mF**^-fXV8^T%y6ilPn=O?WkfdxR@X{xB6MA>fEi3&EZ%29#@vSLfu-v& zx2+ni+;$|@16eK13yzP_$WT_@jPn8W39kK<4_D6c6gRDqVWJ|4uGhvX*GRu_jfpH8 zTckNlR-kgmR@J&sWMB3;4b3!dLK4e{Cj228vYq<1Uy^^Y+1+W5oA^!v-`_aiKYziD zXy*?0$;i@XVv_{mm&&;ew5YF(TW|-Rc3RqD0uKSA-Ta2xxG6Z)cl!?99!}q+$PESU zdRwWs17}a1NFiL*`B@~!N*({Jd;EWbk8`^noK(t9y9yi1+wav@3 z?L1=uk}m8a4hBBBvI`sWB?UE-V`D6BRX2MwF()*r$k)>o*U9*1zi|TS67KQC@CP7z zVe*(M7egx!8^)C0ZO{+qU5jcLiv(-!A^TGozjXM-E&bm0{+@G*b09z4m2CQu@K?voKsM3mp z%PuCwgx>>EMEWVSYMW1!4D|}a59j?(6;V`=b^~a#UBV)#mplEu?hyGn)uG*DWtKEJ zsJ9w-2{UXc(^fMTmB9UfKDX3yRz2{9dtokf_dLKJut{DDoUMQl*LA$)Bld`$(iqpS z0qqVt&g`6W{>*)%e&U?kv`mJAbMLj9Bch7ORuzLmzmjPl2)leJs;_i>mjD$IrSD+h zH4*+fdm1tbVecQG3qR{G6=x2csMjJVBO9-UHD08~OhVS^P)BMf$i1h2J$E+O zs?(OJZngv0+uEaYi108U_RM>ZtAJ`If>WB*`y7TUi8eBB%dG)L; z+?qkFl8afk#`T~QktRRvc>2@B;Z=+^;*KU_hbJ#T5ry;Zq^CMeKRa?I{9qqXK6}Dp z@`HlBT|O5GE^_#}hW;5OJ{}5>oL~Kx{wl?q#Q=VogoEWr=8inwuL(3s`}^L%R0VxQ z-zfrnVz4EDIgL%i4HssvadBNowA9rQ7chNOf?Au5HqG6K9gyshoH_|LDkPU z$i?t?B4piCaSy{QU@Sf*brU}%CC3Wwlwd7%ucy^>8cktg#mrX<~WL%4p7_F4o-38`= za&$Z?VKc;3@KaU*h2<508hHTWFF)gp9qF97n0)+MCEzPcyDU6%7w69bkxnYn{8ny> z5{p(-1F!YE+L|sLb&A)?s?`F&J9Nn9L|l462vN=4NSq21#ItQOcvtN}t*ATgex2aI zPD(SrMvEZPGQ2hQ^hQOu?LLmN;Jll$?buPZT>5gMuD-<_`Pil=v+*IYT{q8pe3

my6R+a(-jgP6lc_gsVMfF0VZ6-h8eA5oUMw6!Bc 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

)MA9(_h@tmrwm$H^mv{JQHXEb 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 z

  • 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

    H0|uU|I3MXtN_%`fn)l!ii1 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

    j`M8zc)9A)w0%UE7+E& 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�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%0Am|+}o&W z(9AF*QDkK^ zbEy+XwovLwQk)o(ZMki^7p0lY=%ShHj0$y*yVO)RI)`a<%l+7D?s6H&!ufrF|G{jw z@AG^<@AvCv96gh%3hpaaVMz+kjn+s)b$-9Haw>lR9pxmav!Xhu&W?^&a9-rshLwxm zWM=jbK7zW)+9RMs=0(QCFGlx60hpefF0J6hzN3Wm7-Qi1?1TjNw{t?z3y{W0)zYse zKW75%U8?&1$@#s1UQTG|J6f`7TCQ%tT}l27Jep>*V+qKeyRoqhij(QcPZt(&JK|Ce z$Dk0;KfZ=0`_8rLJq0QR;i&Zt{8MFgdDy%peYSSjmyVwV<&rcVqiyj@XXL+MF&LZa zFKV4g`OJr943d_1CLh|+zV^BpY%D6)eO-+pzmdB3>1(3i7ysFsL*|EcdZ zXa+FitZ@UY4Sr~O9uB#b`+GQ8MVhey^L(IOEna-y)N*fs$wk1*(uMKp`3vVOiBklb zY~5bTiPRbG*SspIc8OGz)Sug5SZrK>zOOpu9 zr3n3}6}bx)xWmO7F+92UN~u1>SzvSEkSNMnL>#{ABU4;wshU&TWnyH%)$yCv4ptWM z{6^?%As|)(!bJ1(fI3M)=J>yYv)6OJlR*YD)U=!N{K+{#ov4UwnUqJUPE>ODvLS82XW&SO@3ainUHM*zJhEuC^*yZmu}5!Zm`d%(P^mrl(2^l+K0F@ z&2xLR*gs8i?ME9#ppid5y2U)C-)Ujk-ULuY9-2mEELC0q$mMB`nQQOv>z5(EVAnx1 zLqlXO_0>XQLl=c7mu3bXCSyT-n)q98;_Ytp53go;%0}w;&Yu#LX70ffe?>N{&UMFM z$0VtB7$;r&nh1)}=9u|@@W)AIU&jOWa{ifGqh5=i0tQ6t0Cdk;rcS2tX0~Fd3U^Z# zfvjaW+>4@z3|A%Lov6ZBJb@8w$+A=PA~|5tTLVTO0CQkkA7W!BDvZT9&5ZNgx~y4b z&|1lNN$p|ooA*}U7S?()c!7f}Te`Y=WcC^UtB;Zd-371#O1nsj!^uohS=j2I2fwtm zX-|ebPdlCMwq)k*&FvLLz(Z2668Mh`z60``CUEG5kGku+_S+t%>NF2Ov7%W3=L6fC zz=E*2#v&k}eItpvg}h4#cwmDW5fMK>hR6Ui6hG}44U@ePoBY;9TLrcaD@3xhZ%Sf0DE|8r5A zs>4l*E+rE{e2>#av??#-s+RzW`EB`3!73pR$cG)~JUM)g)TJp&?lgtzX+m{P+^Ifh z(8Hx?CcgfFYZ(p)_xTD5`5%Su7un3h$|r^3o(6strhZCwz2)j zXr~32WbR1l6jldc6)Z2D&W;7YdOB}0c^tnB_9I?i?mBvE{h_eDV|C6sdJ;F4>Eyx< zY6on8SPk2n3EVVjO?L`yckfW>g3qn^Fgt6ztDIfPp@zYR+hFYtYo?n`0A16Q;fCs% zwQy+H{e$o}h&OFXmoCL{Fz^tyFG_Qad(9NrvBnitvDMk@T6F2607OQpX&VL5>4{y4 z=DMNl&7$|fuPN(B78wVhN)(k{rmJ~=PO#DR#%ri`(P-l4NSs;^OTx34KG>h;`JYx&&Vw(9**GAoT+-^;R3{W(fAm0NA%=S({T99;MvJc-)|hrv^}y5I^}@2=Ks^(YtHnZSzm;5*tR#)bVHopxy4;JO6X- zM{L}xh6AtEXs_cX#XZ43-(|0c%U1*-OJ)Lv4bW}KWH3}(M>?}m0wl76Fb|}W-&g=7 z7(AAD?DvvgsunhjOKhbDXH}=0E8EJ}dNa3-st{o>m|3l+bV-X&1{u3U;2njZd$bU` zogaRFTq9W2z#0c#+sYD|xb4WR_ zuJ=hE;T(T>F|lVc8Q09(yJI%^=SiQ>Ul@j&)OdF{Ab{%oq38uE{qrq*z^^BOYEKj6 zQc>_0&q(`}-8ktsN9xjc6aH*KrggyD%i5*}<()|me5|8|+fFBRhe9i@0@)T;EDhy# z=(SXEXV@Q5r7uUGV17%~27R|5-z3%y{`qGB`Dnnr8T|i}*E6OERKu}kESdw{dA<`* z_-Vb1Z_ly^LYmCeH;>$cUxEMA7xl;Sg!Xv#qPE{coOIbPg6ypVT}(k#>)JN zTxI3r?!d!j=Sczw(Pd5MDz~_mcEd@fj40UFlTu}rwnYEjcB9$0g)2L7tA77ah#72C zYHhViytsf|(PdAt-z@i|CbBufy=|+>Q}T@e10U#%{;gHwvV(M275Zid|rv<$o7(T?E5AFz3R{kuRsDTgqr2ACb&tW!iVB?B0GV^!Uxb!Z@a)O$`YyzVIdqRE)A~kTJa~q zSX(fW1QfNZOFSCVqI@2HR)VE{dkkCBhHy!^Nxn}@~t@nJZ82r`j*ln2NbAN#^A&htiE8cH-*&O(P z5NRoPN>|E>mFg~D!&vLB+k3`90B+7As`(7qzktv@O>Dm02svEL+$o#3jX%!ZHWbY2UNnS;WE}0UU!B{ zjq0LwGA3YFXz3mY4-(H13NP9h_4SYIBxY2DF))ZHQ)b-eW47bf+6_dvE+>1_{#H}j zcoX<_r4#DdZsY$NX%{m9xvi~;C6f9)tu<}y!qMR?AT^a_gAL43nN?_xf;zEV# zl`Mdon%^ANQ8o@^w_wy60d;4{{J8;p4Fc@8jBUaLNge?b<_odeswIOwC1sWzoOU`f zMI{l4h$2sxm~LOtRfTOM{TtDa)cazvGHI=jzxd9?d8W^PFbSjeFR6 z%$O_4#?MdxtW?<<;87F-A|Tzt24Xwc%d;jz`pi9feB8Zh2O zAw`!oqWpn{R0@Yn^LhQoZ&?V1ExS&u9;dN$y%#8$E7Ne4{^&y9DT>$-Wut_*qUF4N zX@-=;#;Ka#k+rS-`3b2^w^;SGs%(UHskPUDLe?1w`;pE zVjk|Z^jqa}SQM&X_Snmm7do?4H)r0D~O6+CPOW{kV}tQHbcw<5G?=92 z>Mz*?oKoOJpR~YjkrBZ)4UdYqQD$S>k$q@vRK!$YWh2JezpCQ+FAC*p^?hr0O0Z67S<& z+^Kxd-bimifaZqG!lT>D+JuHS@|n>b=_-H;9?WbE4S7ApumDmYft+LKDBUDx-@}mC z$3v%nHsNgr0NX1mTe|ZH#qHgp!ntk|Pap=8E!Y;~W!J~^Wk>gG3k_dS5(U~y(STzm z+UCen7Rs#1ESqPUbt zU%fQT^(|mbdS28g%dF2Co`ZLD&JKGL%P`=aR%LxEldU9stz3&SQ+}4)tPTa9v6`nv zkE>yun$$;g-8ick*Cpcq0;*+(aGyqBZ93#;{y>!NJJF-6qm$HzSN}KO#TUFUcXd5e zWF5~E_0%?>3bhJ+6<8nk1TwA!hxZrlgY|jAfV!X-z;*9SAayM~Pwd!tQ8c9$~J+4F;+yPY_K-YTb3}zF}4|WK`(3~z;5=#%=-l^eLn>2s&tj9$ZRJWo1+v9cr zzKSoCpKxJ!G0nid3KIBMRnus#n6EKBn2P=+Vau=xr<;qNF3lHpxU|xvAc>8fhn~pE z)!np~8?&BWQFr&krKkbA)4x3!JFq0i(=K3__~4*}E{(;e0Yvi(!+PyErG zs5+ZlHE(ASrE4h!LjpE6!{oS2W~O0g#$cbFiizTm5yLZO=_w=@%P-(N(dpj{s4>^Q zk_E~o6GabZP!cwnLIWhb7NhrHRDP6ZciRblk2tJdW-*ehh_q!9jp+R@&F8Qn3f^lF0OeDPy64M;GHQnXGCbQrpohI@eCb-fK62EiUlgjym~w zY2xvSPjlRBj-B4TSoDUqN5QQnVj27Ei%R7UAgOm-q?ImjaL>lDHE5sVA;zcOa5c#` ztWBb`K&ol8=lo#Z*S7kmoiMEd_Q;f-ZOik}kV}sSGdDEI*d`gobdSI{b~=<+V`W@f zn9dwn?pF7Ro32-n{T?iC+W)3>;GZN51{k)6oJ~O6<$FY3bWGZ2kqI>AI#eHHo#LtZ zBZ}jLmN=`d10T zK6HP*v3t(^a1G53unkMxD*GlA!!E$9cqTTt-+w1I&apJ!HgH2eZbxAhJoSUeS|i<9X#a6%kc4@Bm^RJmtF$)*U=C7_*psz?0T<{DYti56gVgA{m=Jc=l z>dy(^5MYOCx<5NY)i;>Lg(~ZHsQGGnk&U|k5D@Y@-oyQU@ zJ-TT{r~O|ENFAjsFd94h#PPMuhvrRlv-MQ1fm7|)nG;VGi5=qspJTAUc*}uGZzdkx zV4T?g3$Aq<)ONBybZ2<0p#Gi9X}*M+#m7x>N8eQ(^GZG#$$q0JK^7jJ2ZYY&hz&#M zkqh0{%0o8ei)o;7f5uZ(2NHvEX{~lAYaFMrss4wOyZypx{`l)!k@*NXt+sL*H}o@ubsNw`Ma($@6PtHruG8 zo~w@8y7Fsz_7*_=66xf1w{P_nn?)O!YnLTykUADJyvszngF8kl&rPG}=&MEn=i6q= z2OA;*iTddwWV|Ke*O8Qsk2BL2jxhpB_e9Ei?cQK#i!P_D-5x87G_OB<>6U8`Y$7@& z#tf98pDwCHx#PCX=>OjApY{?Mg%(1C+)se~q4io2F;o5Y#lf=S!3;lvHkR_Q2OxP!3cI3QsLYC(C&tE=>~nuL7x7$c zMd9wkwf}rSTB_6&SVfFpS=D#R8BK;r47IyLcf@LN7g8n;EKvMPg~BM90^CA9n7P1qrLR zo5;%SG>Dk`@=JKikm6f1i`239Jp0P-H}^`X(Yj8j-DY!>e@*@he{IWNxve7Akg{_v zYG?NkT&?!TZ!Z3Oy>bxG6NOEfw;L>(li${8fNk@e&(}W z;rO7q`3LDncSmMAu&MseJ3ti@b`odi#dUH`_Nzvpf;X788615NbBUS7-i}5d05tac zC&m3sod@5uSrS85cMiK==g)2r=wj}gZ4K+Bs=dv3Fy!z;(8pTuqT>!co-CUNP(UtkSZ5ik5ElD?X_?pA{ZF1wqqd?; zHdfk95y9pHY-$T^4Xx<;gt(;ootivtEt2#bGeiIS6%?aC?p&h#XTOb`EE#{Gh#?~-$x22IK_`$ znmEI9&xOU#vLeRwDsIsx&t9LqZ39Ftp__RMlPi7PDR_0$>Ulf@`V*Op|B!A{ykstYsI#S6Piz877B{e#n;#;sLHf(OR+!krw>!d6g* z{fF}2PVE}XYo!M=Qh`x4w#yvYJ)3?zX3GnR(1x@?c2nhZo!-PN33tnZ)dXuI{bQ1* zfnu5P+sO`c?Og%)*0nZmy$^lap(DdVw>-s(!1c#-jK12YemQOFEf1KUC0Iw6j_XMV zG%TG?R=ge}#b2#dk<^Qadu`9JSN%MEc4I*3!;U4ITQ0CRMswNug5O*2wzsz4@>MFG z;XB)l8LSM{hIO|HZKT6`q{GLm^_=9mSSs*Ht8cn}jcI)#PiKgC-F} zzFyczFVDhOO%>lB7ovDuzm?8KeL@^I`@p4ij4RxkEI*01u*K@HYw*aA@P4SElihQ- z%A(t!p$VB_PJ0IbptnjvRQW0gme`I)x3;4z+;9H!BORzfM*~WMX=-4Y#H|JG0UiCY zgq{vs=#jABXa9+xprvUXSK=A`Sax^ zb$5-{*~RogR)#F^R(<7#bS>(zoe=r6z+b-4sySE^_5s(vjz@1DqU42-%(1NlmfelS zdqbz6M2$zA&BmepKA5WYD?_H3iH90~6#!q)j<(p z3Q(}2wF`j-_E{={!Q)5je;nap>}|USSgEWee(>^t-Cs1d~Yzb~-aS z%5MWMN7ougSr(h-6jyd~9{LjE1g&t2$=i%6|0}scc|P{Mr)%C^u5ll)BxpE#BL;bL zbR@P>rI$Q)qs=UTU{uwS<_Ei7GFB+G&0*zS$l5)!^x7i1-Ed~gNz$r&TdlCc6S;V-j;Af9Va?#k-LLzQsC z41V$Q{y&=hEQPQDiSoA0tYL}alpAXH34&sDP|`mDLa4z3`Q806=Zdtb18D#l*2z6>Rtl4|trNR~MwTA<_G@9u zG!Y2w;6|jq@?JTxKKoIhC;Cd6CRmzLo)wX_7KYI+WOL>I7XFPkjGc=h!g8ISD z3mSG%E&!scxPg#Ysc^I*eG569B{pL7B!})YiLczS$@M-bPnJ zHR=D+$sAZ@7b2S#HmG5zPjET=gRw5-D3kExmcyXfM(t8C_Vo-v_w=cnan~%zs_Ei) z9gD+IfLiC)^WTZ2f|K*sbh_ArnfXzcq`B|pFyE*1%PU!lQtMpbW93EkLSkCT$UtP> zgt7q6oN6xxUI0(Z#0yE6FBHDNh}MRSYt7}rw|=mq<#JHPt-=DlwI~XOo)Xu(jZutq zbD!*W3Nt5oU%L*CniE%I)^kH^4mgq>%{5{sG65E*Cw}wfKGyHFXP*dUO2*Ce4{J=$ z#ejRV@FSu1+A7u|8c_WI6Ggj??f=70$5>H@H&+wk5j(+KJ4* z^@RKU&AAe^gl*EQONMNnw`%krF+Rewy2`;id1zi0G2c$$kNs+VS)5Uc3I~Rh#y^-4 zxn7A)Wcv)u^EKoAHthPL2d45J!i%>-7SkhfHP6U+YGA!bFpLwM+Wsg@Po2JVbpfDu z$i1@a%|<0YFI*G!SaPVGt7@RsL)NUcf;_5rxB7eiG-y*iR5W9+i|vXwJh8uloiz|` zL*4-*6Dal|Edkc4%EVaV&5QmIM0_oPa%@WjGd|`$GoDA5XvUp6)$^b_0cil7|~}KSA{I zWW0P^2qSOT2i9T^Ldb_XiaFnT(z)w2@M9|Ujg}~L2*=NQxHT7@4$uQjdOQ=g`FMMN z402&XnTiQUWi04VZ%2{|-(o}1zKTqa-et4aW?i1uwJDDXkZel@YkDSZf;fqg!FFnO zK)8uwWWnk4VmG6M+F-iA!;BM9JfjADdocTR&83!>t(44U#yhJiTxih4r{%_(3zhru ztKApzUe^OR7({BuG7~qMI1e?1LuJ}>DeTW z0LBs(F1Y4Da;j!C>Bp@l>*~JAbrw$6gRLef#SKdIA1paM@9Oe`YhGXDW#nBrD6yY` zh{fEf5%I%@yT-x50mYOwfMdEFIRHXU0<8kb= zi~U!ep*Ff}yJ1>n5pdCOX5x!H-=Pczy;G3^llt0go?5>4WVP1{z5g3U4_6SBt zhEOlXK~IebdmgLo^wSq0pYUn2B-QB31JhUXs5_jz+y&=i-{vf~>o)0OgZ&|Ezy5Yo z?BB9g^EX)suAAz@4e=fyYI0-PWrRH`DI>sbpO#!GK12Cv`}SSsF*|R!QL6^D(JY*> z2=MitL}f=i?$!)w*uf%H6NjqMwkdh|u3wj(Ub$ym@3r&3*J#suGht^v0PD?*G}lBM zWwCh|P^I-pbtsn{6pLx+H0{F&ro?H9Xw0C=Ewmi_FPCu{o;=m*5xV`^$WLoAgE1Q< z7cSP4F3HAqUOX{+znA!`l)hv!tncXTuOgkE-98q1bS@=4UVmZ%4`wD<--b?I_$%_g$6&k1`EmaW*t5uO%dS3QF|Y!T35>-`9$49j2>xP8l4zuSh!_h9^ z#0Zu|kxx{TmrBqWoH|60jOGE|fA?G)g?{j((w9{ieFIEJ07JF;c723ShD6TQJvwl- z{uGlHuGt7PGnuAk@neI3Z|;6Ea}6gDbChQaI46p~IaChR6iDSKtbvEpteI7zR5p`% zVc+T#O*lL;gX`e7Arz;fYyHe%i|d;~)R3Re^xo_L|1Zp09^&l(lV}jUY5(K)R!)Ni z4QBbBZyxjT?wiHe%+5ifGNxO|?SbA$_s#8Ex-9D

    }`4GLJ0Kislc3=UIvfRAJH^ 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

    O!1cKc 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

    * An index is permitted after the permanent's name to denote their index on * the battlefield Either use name="" which will get the first * permanent with that name on the battlefield that meets the filter * criteria or name=":" to get the named permanent with * that index on the battlefield. - * + *

    * Permanents are zero indexed in the order they entered the battlefield for * each controller: - * + *

    * findPermanent(new AttackingCreatureFilter(), "Human", , * ) Will find the first "Human" creature that entered the battlefield * under this controller and is attacking. - * + *

    * findPermanent(new FilterControllerPermanent(), "Fabled Hero:3", * , ) Will find the 4th permanent named "Fabled Hero" * that entered the battlefield under this controller - * + *

    * An exception will be thrown if no permanents match the criteria or the * index is larger than the number of permanents found with that name. - * + *

    * failOnNotFound boolean controls if this function returns null for a * permanent not found on the battlefield. Currently used only as a * workaround for attackers in selectAttackers() being able to attack @@ -431,7 +442,7 @@ public class TestPlayer implements Player { if (groups.length > 2 && !checkExecuteCondition(groups, game)) { break; } - for (Ability ability : computerPlayer.getPlayable(game, true)) { + for (Ability ability : computerPlayer.getPlayable(game, true)) { // add wrong action log? if (ability.toString().startsWith(groups[0])) { int bookmark = game.bookmarkState(); Ability newAbility = ability.copy(); @@ -526,6 +537,60 @@ public class TestPlayer implements Player { actions.remove(action); } } + } else if (action.getAction().startsWith("check:")) { + String command = action.getAction(); + command = command.substring(command.indexOf("check:") + 6); + + String[] params = command.split("@"); + boolean checkProccessed = false; + if (params.length > 0) { + + // check PT: card name, P, T + if (params[0].equals(CHECK_COMMAND_PT) && params.length == 4) { + assertPT(action, game, computerPlayer, params[1], Integer.parseInt(params[2]), Integer.parseInt(params[3])); + actions.remove(action); + checkProccessed = true; + } + + // check ability: card name, ability class, must have + if (params[0].equals(CHECK_COMMAND_ABILITY) && params.length == 4) { + assertAbility(action, game, computerPlayer, params[1], params[2], Boolean.parseBoolean(params[3])); + actions.remove(action); + checkProccessed = true; + } + + // check battlefield count: card name, count + if (params[0].equals(CHECK_COMMAND_PERMANENT_COUNT) && params.length == 3) { + assertPermanentCount(action, game, computerPlayer, params[1], Integer.parseInt(params[2])); + actions.remove(action); + checkProccessed = true; + } + + // check hand count: count + if (params[0].equals(CHECK_COMMAND_HAND_COUNT) && params.length == 2) { + assertHandCount(action, game, computerPlayer, Integer.parseInt(params[1])); + actions.remove(action); + checkProccessed = true; + } + + // check color: card name, colors, must have + if (params[0].equals(CHECK_COMMAND_COLOR) && params.length == 4) { + assertColor(action, game, computerPlayer, params[1], params[2], Boolean.parseBoolean(params[3])); + actions.remove(action); + checkProccessed = true; + } + + // check subtype: card name, subtype, must have + if (params[0].equals(CHECK_COMMAND_SUBTYPE) && params.length == 4) { + assertSubType(action, game, computerPlayer, params[1], SubType.fromString(params[2]), Boolean.parseBoolean(params[3])); + actions.remove(action); + checkProccessed = true; + } + } + + if (!checkProccessed) { + Assert.fail("Unknow check command or params: " + command); + } } } } @@ -546,8 +611,105 @@ public class TestPlayer implements Player { return false; } + private Permanent findPermanentWithAssert(PlayerAction action, Game game, Player player, String cardName) { + Permanent founded = null; + for (Permanent perm : game.getBattlefield().getAllPermanents()) { + if (perm.getName().equals(cardName) && perm.getControllerId().equals(player.getId())) { + return perm; + } + } + Assert.assertNotNull(action.getActionName() + " - can''t find permanent to check PT: " + cardName, founded); + return null; + } + + private void assertPT(PlayerAction action, Game game, Player player, String permanentName, int Power, int Toughness) { + Permanent perm = findPermanentWithAssert(action, game, player, permanentName); + + Assert.assertEquals(action.getActionName() + " - permanent " + permanentName + " have wrong power: " + perm.getPower().getValue() + " <> " + Power, + Power, perm.getPower().getValue()); + Assert.assertEquals(action.getActionName() + " - permanent " + permanentName + " have wrong toughness: " + perm.getToughness().getValue() + " <> " + Toughness, + Toughness, perm.getToughness().getValue()); + } + + private void assertAbility(PlayerAction action, Game game, Player player, String permanentName, String abilityClass, boolean mustHave) { + Permanent perm = findPermanentWithAssert(action, game, player, permanentName); + + boolean founded = false; + for (Ability ability : perm.getAbilities(game)) { + if (ability.getClass().getName().equals(abilityClass)) { + founded = true; + break; + } + } + + if (mustHave) { + Assert.assertEquals(action.getActionName() + " - permanent " + permanentName + " must have ability " + abilityClass, true, founded); + } else { + Assert.assertEquals(action.getActionName() + " - permanent " + permanentName + " must have not ability " + abilityClass, false, founded); + } + } + + private void assertPermanentCount(PlayerAction action, Game game, Player player, String permanentName, int count) { + int foundedCount = 0; + for (Permanent perm : game.getBattlefield().getAllPermanents()) { + if (perm.getName().equals(permanentName) && perm.getControllerId().equals(player.getId())) { + foundedCount++; + } + } + + Assert.assertEquals(action.getActionName() + " - permanent " + permanentName + " must exists in " + count + " instances", count, foundedCount); + } + + private void assertHandCount(PlayerAction action, Game game, Player player, int count) { + Assert.assertEquals(action.getActionName() + " - hand must contain " + count, count, player.getHand().size()); + } + + private void assertColor(PlayerAction action, Game game, Player player, String permanentName, String colors, boolean mustHave) { + Assert.assertNotEquals(action.getActionName() + " - must setup colors", "", colors); + + Permanent card = findPermanentWithAssert(action, game, player, permanentName); + ObjectColor cardColor = card.getColor(game); + ObjectColor searchColors = new ObjectColor(colors); + + List colorsHave = new ArrayList<>(); + List colorsDontHave = new ArrayList<>(); + + for (ObjectColor searchColor : searchColors.getColors()) { + if (cardColor.shares(searchColor)) { + colorsHave.add(searchColor); + } else { + colorsDontHave.add(searchColor); + } + } + + if (mustHave) { + Assert.assertEquals(action.getActionName() + " - must contain colors [" + searchColors.toString() + "] but found only [" + cardColor.toString() + "]", 0, colorsDontHave.size()); + } else { + Assert.assertEquals(action.getActionName() + " - must not contain colors [" + searchColors.toString() + "] but found [" + cardColor.toString() + "]", 0, colorsHave.size()); + } + } + + private void assertSubType(PlayerAction action, Game game, Player player, String permanentName, SubType subType, boolean mustHave) { + + Permanent perm = findPermanentWithAssert(action, game, player, permanentName); + + boolean founded = false; + for (SubType st : perm.getSubtype(game)) { + if (st.equals(subType)) { + founded = true; + break; + } + } + + if (mustHave) { + Assert.assertEquals(action.getActionName() + " - permanent " + permanentName + " must have subtype " + subType, true, founded); + } else { + Assert.assertEquals(action.getActionName() + " - permanent " + permanentName + " must have not subtype " + subType, false, founded); + } + } + /* - * Iterates through each player on the current turn and asserts if they can attack or block legally this turn + * Iterates through each player on the current turn and asserts if they can attack or block legally this turn */ private void checkLegalMovesThisTurn(Game game) { // Each player is given priority before actual turns start for e.g. leylines and pre-game initialisation @@ -589,7 +751,7 @@ public class TestPlayer implements Player { // Loop through players and validate can attack/block this turn UUID defenderId = null; //List - for (Iterator it = actions.iterator(); it.hasNext();) { + for (Iterator it = actions.iterator(); it.hasNext(); ) { PlayerAction action = it.next(); if (action.getTurnNum() == game.getTurnNum() && action.getAction().startsWith("attack:")) { String command = action.getAction(); @@ -2242,7 +2404,7 @@ public class TestPlayer implements Player { @Override public boolean choose(Outcome outcome, Target target, - UUID sourceId, Game game + UUID sourceId, Game game ) { // needed to call here the TestPlayer because it's overwitten return choose(outcome, target, sourceId, game, null); @@ -2250,7 +2412,7 @@ public class TestPlayer implements Player { @Override public boolean choose(Outcome outcome, Cards cards, - TargetCard target, Game game + TargetCard target, Game game ) { if (!choices.isEmpty()) { for (String choose2 : choices) { @@ -2282,7 +2444,7 @@ public class TestPlayer implements Player { @Override public boolean chooseTargetAmount(Outcome outcome, TargetAmount target, - Ability source, Game game + Ability source, Game game ) { return computerPlayer.chooseTargetAmount(outcome, target, source, game); } @@ -2295,15 +2457,15 @@ public class TestPlayer implements Player { @Override public boolean choosePile(Outcome outcome, String message, - List pile1, List pile2, - Game game + List pile1, List pile2, + Game game ) { return computerPlayer.choosePile(outcome, message, pile1, pile2, game); } @Override public boolean playMana(Ability ability, ManaCost unpaid, - String promptText, Game game + String promptText, Game game ) { groupsForTargetHandling = null; return computerPlayer.playMana(ability, unpaid, promptText, game); @@ -2317,15 +2479,15 @@ public class TestPlayer implements Player { @Override public UUID chooseBlockerOrder(List blockers, CombatGroup combatGroup, - List blockerOrder, Game game + List blockerOrder, Game game ) { return computerPlayer.chooseBlockerOrder(blockers, combatGroup, blockerOrder, game); } @Override public void assignDamage(int damage, List targets, - String singleTargetName, UUID sourceId, - Game game + String singleTargetName, UUID sourceId, + Game game ) { computerPlayer.assignDamage(damage, targets, singleTargetName, sourceId, game); } @@ -2344,14 +2506,14 @@ public class TestPlayer implements Player { @Override public void pickCard(List cards, Deck deck, - Draft draft + Draft draft ) { computerPlayer.pickCard(cards, deck, draft); } @Override public boolean scry(int value, Ability source, - Game game + Game game ) { // Don't scry at the start of the game. if (game.getTurnNum() == 1 && game.getStep() == null) { @@ -2362,37 +2524,37 @@ public class TestPlayer implements Player { @Override public boolean moveCards(Card card, Zone toZone, - Ability source, Game game + Ability source, Game game ) { return computerPlayer.moveCards(card, toZone, source, game); } @Override public boolean moveCards(Card card, Zone toZone, - Ability source, Game game, - boolean tapped, boolean faceDown, boolean byOwner, List appliedEffects + Ability source, Game game, + boolean tapped, boolean faceDown, boolean byOwner, List appliedEffects ) { return computerPlayer.moveCards(card, toZone, source, game, tapped, faceDown, byOwner, appliedEffects); } @Override public boolean moveCards(Cards cards, Zone toZone, - Ability source, Game game + Ability source, Game game ) { return computerPlayer.moveCards(cards, toZone, source, game); } @Override public boolean moveCards(Set cards, Zone toZone, - Ability source, Game game + Ability source, Game game ) { return computerPlayer.moveCards(cards, toZone, source, game); } @Override public boolean moveCards(Set cards, Zone toZone, - Ability source, Game game, - boolean tapped, boolean faceDown, boolean byOwner, List appliedEffects + Ability source, Game game, + boolean tapped, boolean faceDown, boolean byOwner, List appliedEffects ) { return computerPlayer.moveCards(cards, toZone, source, game, tapped, faceDown, byOwner, appliedEffects); } diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java b/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java index 24f6e7cce97..27d02fbefd8 100644 --- a/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java +++ b/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java @@ -1,5 +1,6 @@ package org.mage.test.serverside.base.impl; +import mage.MageInt; import mage.Mana; import mage.ObjectColor; import mage.abilities.Ability; @@ -47,6 +48,13 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement // Defines the constant if for activate ability is not target but a ability on the stack to define public static final String NO_TARGET = "NO_TARGET"; + public static final String CHECK_COMMAND_PT = "PT"; + public static final String CHECK_COMMAND_ABILITY = "ABILITY"; + public static final String CHECK_COMMAND_PERMANENT_COUNT = "PERMANENT_COUNT"; + public static final String CHECK_COMMAND_HAND_COUNT = "HAND_COUNT"; + public static final String CHECK_COMMAND_COLOR = "COLOR"; + public static final String CHECK_COMMAND_SUBTYPE = "SUBTYPE"; + protected GameOptions gameOptions; protected String deckNameA; @@ -64,7 +72,7 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement UNKNOWN } - public CardTestPlayerAPIImpl(){ + public CardTestPlayerAPIImpl() { // load all cards to db from class list ArrayList errorsList = new ArrayList<>(); CardScanner.scan(errorsList); @@ -219,6 +227,38 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement return player; } + private void check(String checkName, int turnNum, PhaseStep step, TestPlayer player, String command, String... params) { + String res = "check:" + command; + for (String param : params) { + res += "@" + param; + } + player.addAction(checkName, turnNum, step, res); + } + + public void checkPT(String checkName, int turnNum, PhaseStep step, TestPlayer player, String permanentName, Integer power, Integer toughness) { + check(checkName, turnNum, step, player, CHECK_COMMAND_PT, permanentName, power.toString(), toughness.toString()); + } + + public void checkAbility(String checkName, int turnNum, PhaseStep step, TestPlayer player, String permanentName, Class abilityClass, Boolean mustHave) { + check(checkName, turnNum, step, player, CHECK_COMMAND_ABILITY, permanentName, abilityClass.getName(), mustHave.toString()); + } + + public void checkPermanentCount(String checkName, int turnNum, PhaseStep step, TestPlayer player, String permanentName, Integer count) { + check(checkName, turnNum, step, player, CHECK_COMMAND_PERMANENT_COUNT, permanentName, count.toString()); + } + + public void checkHandCount(String checkName, int turnNum, PhaseStep step, TestPlayer player, Integer count) { + check(checkName, turnNum, step, player, CHECK_COMMAND_HAND_COUNT, count.toString()); + } + + public void checkColor(String checkName, int turnNum, PhaseStep step, TestPlayer player, String permanentName, String colors, Boolean mustHave) { + check(checkName, turnNum, step, player, CHECK_COMMAND_COLOR, permanentName, colors, mustHave.toString()); + } + + public void checkSubType(String checkName, int turnNum, PhaseStep step, TestPlayer player, String permanentName, SubType subType, Boolean mustHave) { + check(checkName, turnNum, step, player, CHECK_COMMAND_SUBTYPE, permanentName, subType.toString(), mustHave.toString()); + } + /** * Removes all cards from player's library from the game. Usually this * should be used once before initialization to form the library in certain @@ -525,7 +565,7 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement * @param player * @param cardName * @param ability - * @param mustHave true if creature should contain ability, false if it should + * @param mustHave true if creature should contain ability, false if it should * NOT contain it instead * @param count number of permanents with that ability * @throws AssertionError @@ -683,7 +723,7 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement * * @param cardName Name of the permanent that should be checked. * @param type A type to test for - * @param mustHave true if creature should have type, false if it should not + * @param mustHave true if creature should have type, false if it should not */ public void assertType(String cardName, CardType type, boolean mustHave) throws AssertionError { Permanent found = null; @@ -742,10 +782,10 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement /** * Assert permanent color * - * @param player player to check - * @param cardName card name on battlefield from player + * @param player player to check + * @param cardName card name on battlefield from player * @param searchColors colors list with searchable values - * @param mustHave must or not must have that colors + * @param mustHave must or not must have that colors */ public void assertColor(Player player, String cardName, ObjectColor searchColors, boolean mustHave) { Assert.assertNotEquals("must setup colors to search", 0, searchColors.getColorCount()); @@ -876,26 +916,26 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement } - public void assertManaPool(Player player, ManaType color, int amount){ + public void assertManaPool(Player player, ManaType color, int amount) { ManaPool manaPool = currentGame.getPlayer(player.getId()).getManaPool(); - switch (color){ + switch (color) { case COLORLESS: - Assert.assertEquals(amount,manaPool.getColorless() + manaPool.getConditionalMana().stream().mapToInt(Mana::getColorless).sum()); + Assert.assertEquals(amount, manaPool.getColorless() + manaPool.getConditionalMana().stream().mapToInt(Mana::getColorless).sum()); break; case RED: - Assert.assertEquals(amount,manaPool.getRed() + manaPool.getConditionalMana().stream().mapToInt(Mana::getRed).sum()); + Assert.assertEquals(amount, manaPool.getRed() + manaPool.getConditionalMana().stream().mapToInt(Mana::getRed).sum()); break; case BLUE: - Assert.assertEquals(amount,manaPool.getBlue() + manaPool.getConditionalMana().stream().mapToInt(Mana::getBlue).sum()); + Assert.assertEquals(amount, manaPool.getBlue() + manaPool.getConditionalMana().stream().mapToInt(Mana::getBlue).sum()); break; case WHITE: - Assert.assertEquals(amount,manaPool.getWhite() + manaPool.getConditionalMana().stream().mapToInt(Mana::getWhite).sum()); + Assert.assertEquals(amount, manaPool.getWhite() + manaPool.getConditionalMana().stream().mapToInt(Mana::getWhite).sum()); break; case GREEN: - Assert.assertEquals(amount,manaPool.getGreen() + manaPool.getConditionalMana().stream().mapToInt(Mana::getGreen).sum()); + Assert.assertEquals(amount, manaPool.getGreen() + manaPool.getConditionalMana().stream().mapToInt(Mana::getGreen).sum()); break; case BLACK: - Assert.assertEquals(amount,manaPool.getBlack() + manaPool.getConditionalMana().stream().mapToInt(Mana::getBlack).sum()); + Assert.assertEquals(amount, manaPool.getBlack() + manaPool.getConditionalMana().stream().mapToInt(Mana::getBlack).sum()); break; } } diff --git a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java index fda71e4f3eb..acc9db29673 100644 --- a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java +++ b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java @@ -30,7 +30,6 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; /** - * * @author JayDi85 */ public class VerifyCardDataTest { @@ -39,9 +38,18 @@ public class VerifyCardDataTest { private static final boolean CHECK_SOURCE_TOKENS = false; private static final HashMap> skipCheckLists = new HashMap<>(); - private static void skipListCreate(String listName){ skipCheckLists.put(listName, new LinkedHashSet<>()); } - private static void skipListAddName(String listName, String name){ skipCheckLists.get(listName).add(name); } - private static boolean skipListHaveName(String listName, String name){ return skipCheckLists.get(listName).contains(name); } + + private static void skipListCreate(String listName) { + skipCheckLists.put(listName, new LinkedHashSet<>()); + } + + private static void skipListAddName(String listName, String name) { + skipCheckLists.get(listName).add(name); + } + + private static boolean skipListHaveName(String listName, String name) { + return skipCheckLists.get(listName).contains(name); + } static { // skip lists for checks (example: unstable cards with same name may have different stats) @@ -114,7 +122,7 @@ public class VerifyCardDataTest { private void fail(Card card, String category, String message) { failed++; - System.out.println("Error: (" + category + ") " + message + " for " + card.getName() + " (" + card.getExpansionSetCode() + ")"); + System.out.println("Error: (" + category + ") " + message + " for " + card.getName() + " (" + card.getExpansionSetCode() + ")"); } private int failed = 0; @@ -136,31 +144,31 @@ public class VerifyCardDataTest { } @Test - public void checkDuplicateCardNumbersInDB(){ + public void checkDuplicateCardNumbersInDB() { Collection doubleErrors = new ArrayList<>(); Collection sets = Sets.getInstance().values(); for (ExpansionSet set : sets) { Map cardsList = new HashMap<>(); - for (ExpansionSet.SetCardInfo checkCard: set.getSetCardInfo()) { + for (ExpansionSet.SetCardInfo checkCard : set.getSetCardInfo()) { String cardNumber = checkCard.getCardNumber(); // ignore double faced Card realCard = CardImpl.createCard(checkCard.getCardClass(), new CardSetInfo(checkCard.getName(), set.getCode(), checkCard.getCardNumber(), checkCard.getRarity(), checkCard.getGraphicInfo())); - if (realCard.isNightCard()){ + if (realCard.isNightCard()) { continue; } - if (cardsList.containsKey(cardNumber)){ + if (cardsList.containsKey(cardNumber)) { ExpansionSet.SetCardInfo prevCard = cardsList.get(cardNumber); String errorType; - if (checkCard.getName().equals(prevCard.getName())){ + if (checkCard.getName().equals(prevCard.getName())) { errorType = " founded DUPLICATED cards" + " set (" + set.getCode() + " - " + set.getName() + ")" + " (" + checkCard.getCardNumber() + " - " + checkCard.getName() + ")"; - }else{ + } else { errorType = " founded TYPOS in card numbers" + " set (" + set.getCode() + " - " + set.getName() + ")" + " (" + prevCard.getCardNumber() + " - " + prevCard.getName() + ")" @@ -171,23 +179,23 @@ public class VerifyCardDataTest { String error = "Error: " + errorType; doubleErrors.add(error); - }else{ + } else { cardsList.put(cardNumber, checkCard); } } } - for (String error: doubleErrors) { + for (String error : doubleErrors) { System.out.println(error); } - if (doubleErrors.size() > 0){ + if (doubleErrors.size() > 0) { Assert.fail("DB have duplicated card numbers, founded errors: " + doubleErrors.size()); } } @Test - public void checkWrongCardClasses(){ + public void checkWrongCardClasses() { Collection errorsList = new ArrayList<>(); Map classesIndex = new HashMap<>(); int totalCards = 0; @@ -202,7 +210,7 @@ public class VerifyCardDataTest { String needClass = classesIndex.get(checkCard.getName()); if (!needClass.equals(currentClass)) { // workaround to star wars set with same card names - if(!checkCard.getName().equals("Syndicate Enforcer")) { + if (!checkCard.getName().equals("Syndicate Enforcer")) { errorsList.add("Error: founded wrong class in set " + set.getCode() + " - " + checkCard.getName() + " (" + currentClass + " <> " + needClass + ")"); } } @@ -212,45 +220,45 @@ public class VerifyCardDataTest { } } - for (String error: errorsList) { + for (String error : errorsList) { System.out.println(error); } // unique cards stats System.out.println("Total unique cards: " + classesIndex.size() + ", total non unique cards (reprints): " + totalCards); - if (errorsList.size() > 0){ + if (errorsList.size() > 0) { Assert.fail("DB have wrong card classes, founded errors: " + errorsList.size()); } } @Test - public void checkMissingSets(){ + public void checkMissingSets() { Collection errorsList = new ArrayList<>(); int totalMissingSets = 0; int totalMissingCards = 0; Collection sets = Sets.getInstance().values(); - for(Map.Entry refEntry: MtgJson.sets().entrySet()){ + for (Map.Entry refEntry : MtgJson.sets().entrySet()) { JsonSet refSet = refEntry.getValue(); // replace codes for aliases String searchSet = MtgJson.mtgJsonToXMageCodes.getOrDefault(refSet.code, refSet.code); ExpansionSet mageSet = Sets.findSet(searchSet); - if(mageSet == null){ + if (mageSet == null) { totalMissingSets = totalMissingSets + 1; totalMissingCards = totalMissingCards + refSet.cards.size(); errorsList.add("Warning: missing set " + refSet.code + " - " + refSet.name + " (cards: " + refSet.cards.size() + ")"); } } - if(errorsList.size() > 0){ + if (errorsList.size() > 0) { errorsList.add("Warning: total missing sets: " + totalMissingSets + ", with missing cards: " + totalMissingCards); } // only warnings - for (String error: errorsList) { + for (String error : errorsList) { System.out.println(error); } } @@ -383,7 +391,7 @@ public class VerifyCardDataTest { printMessages(warningsList); printMessages(errorsList); - if(errorsList.size() > 0){ + if (errorsList.size() > 0) { Assert.fail("Founded token errors: " + errorsList.size()); } } @@ -455,7 +463,9 @@ public class VerifyCardDataTest { } private void checkColors(Card card, JsonCard ref) { - if (skipListHaveName("COLOR", card.getName())){ return; } + if (skipListHaveName("COLOR", card.getName())) { + return; + } Collection expected = ref.colors; ObjectColor color = card.getColor(null); @@ -473,14 +483,16 @@ public class VerifyCardDataTest { } private void checkSubtypes(Card card, JsonCard ref) { - if (skipListHaveName("SUBTYPE", card.getName())){ return; } + if (skipListHaveName("SUBTYPE", card.getName())) { + return; + } Collection expected = ref.subtypes; // fix names (e.g. Urza’s to Urza's) if (expected != null && expected.contains("Urza’s")) { expected = new ArrayList<>(expected); - for (ListIterator it = ((List) expected).listIterator(); it.hasNext();) { + for (ListIterator it = ((List) expected).listIterator(); it.hasNext(); ) { if (it.next().equals("Urza’s")) { it.set("Urza's"); } @@ -493,7 +505,9 @@ public class VerifyCardDataTest { } private void checkSupertypes(Card card, JsonCard ref) { - if (skipListHaveName("SUPERTYPE", card.getName())){ return; } + if (skipListHaveName("SUPERTYPE", card.getName())) { + return; + } Collection expected = ref.supertypes; if (!eqSet(card.getSuperType().stream().map(s -> s.toString()).collect(Collectors.toList()), expected)) { @@ -502,7 +516,9 @@ public class VerifyCardDataTest { } private void checkTypes(Card card, JsonCard ref) { - if (skipListHaveName("TYPE", card.getName())){ return; } + if (skipListHaveName("TYPE", card.getName())) { + return; + } Collection expected = ref.types; List type = new ArrayList<>(); @@ -522,7 +538,9 @@ public class VerifyCardDataTest { } private void checkPT(Card card, JsonCard ref) { - if (skipListHaveName("PT", card.getName())){ return; } + if (skipListHaveName("PT", card.getName())) { + return; + } if (!eqPT(card.getPower().toString(), ref.power) || !eqPT(card.getToughness().toString(), ref.toughness)) { String pt = card.getPower() + "/" + card.getToughness(); @@ -540,7 +558,9 @@ public class VerifyCardDataTest { } private void checkCost(Card card, JsonCard ref) { - if (skipListHaveName("COST", card.getName())){ return; } + if (skipListHaveName("COST", card.getName())) { + return; + } String expected = ref.manaCost; String cost = join(card.getManaCost().getSymbols()); @@ -556,7 +576,9 @@ public class VerifyCardDataTest { } private void checkNumbers(Card card, JsonCard ref) { - if (skipListHaveName("NUMBER", card.getName())){ return; } + if (skipListHaveName("NUMBER", card.getName())) { + return; + } String expected = ref.number; String current = card.getCardNumber(); diff --git a/Mage/src/main/java/mage/constants/SubType.java b/Mage/src/main/java/mage/constants/SubType.java index c634327fae9..33938432a46 100644 --- a/Mage/src/main/java/mage/constants/SubType.java +++ b/Mage/src/main/java/mage/constants/SubType.java @@ -4,6 +4,7 @@ import java.util.Arrays; import java.util.EnumSet; import java.util.Set; import java.util.stream.Collectors; + import mage.util.SubTypeList; public enum SubType { @@ -328,17 +329,16 @@ public enum SubType { TROOPER("Trooper", SubTypeSet.CreatureType, true), // Star Wars TRILOBITE("Trilobite", SubTypeSet.CreatureType), TWILEK("Twi'lek", SubTypeSet.CreatureType, true), // Star Wars - // U UGNAUGHT("Ugnaught", SubTypeSet.CreatureType, true), UNICORN("Unicorn", SubTypeSet.CreatureType), - //V + // V VAMPIRE("Vampire", SubTypeSet.CreatureType), VEDALKEN("Vedalken", SubTypeSet.CreatureType), VIASHINO("Viashino", SubTypeSet.CreatureType), VILLAIN("Villain", SubTypeSet.CreatureType, true), // Unstable VOLVER("Volver", SubTypeSet.CreatureType), - //W + // W WALL("Wall", SubTypeSet.CreatureType), WARRIOR("Warrior", SubTypeSet.CreatureType), WEEQUAY("Weequay", SubTypeSet.CreatureType, true), @@ -429,6 +429,16 @@ public enum SubType { return description; } + public static SubType fromString(String value) { + for (SubType st : SubType.values()) { + if (st.toString().equals(value)) { + return st; + } + } + + throw new IllegalArgumentException("Can''t find subtype enum value: " + value); + } + public static SubType byDescription(String subType) { for (SubType s : values()) { if (s.getDescription().equals(subType)) { From ec4bee43d28522288a550d758bc7b90200871450 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Mon, 14 May 2018 02:42:57 +0400 Subject: [PATCH 147/158] * Daxos's Torment - fixed that it can't get Vampire type from Mephidross Vampire; --- .../src/mage/cards/m/MephidrossVampire.java | 7 +- .../abilities/keywords/ConstellationTest.java | 231 ++++++++++++++++++ .../abilities/effects/ContinuousEffects.java | 8 + .../BecomesCreatureSourceEffect.java | 4 + .../java/mage/constants/DependencyType.java | 4 +- 5 files changed, 249 insertions(+), 5 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/ConstellationTest.java diff --git a/Mage.Sets/src/mage/cards/m/MephidrossVampire.java b/Mage.Sets/src/mage/cards/m/MephidrossVampire.java index 3d95b59e693..0b0f9a53099 100644 --- a/Mage.Sets/src/mage/cards/m/MephidrossVampire.java +++ b/Mage.Sets/src/mage/cards/m/MephidrossVampire.java @@ -46,14 +46,12 @@ import mage.game.permanent.Permanent; import java.util.UUID; /** - * * @author jeffwadsworth - * */ public class MephidrossVampire extends CardImpl { public MephidrossVampire(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{B}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{B}{B}"); this.subtype.add(SubType.VAMPIRE); this.power = new MageInt(3); @@ -88,6 +86,9 @@ class MephidrossVampireEffect extends ContinuousEffectImpl { MephidrossVampireEffect() { super(Duration.WhileOnBattlefield, Outcome.Detriment); this.staticText = "Each creature you control is a Vampire in addition to its other creature types and has \"Whenever this creature deals damage to a creature, put a +1/+1 counter on this creature.\""; + + // wait become creature effects first then apply own + this.addDependedToType(DependencyType.BecomeCreature); } MephidrossVampireEffect(final MephidrossVampireEffect effect) { diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/ConstellationTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/ConstellationTest.java new file mode 100644 index 00000000000..22755f1ac7d --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/ConstellationTest.java @@ -0,0 +1,231 @@ +package org.mage.test.cards.abilities.keywords; + +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.HasteAbility; +import mage.constants.CardType; +import mage.constants.PhaseStep; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.util.functions.Function; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * @author JayDi85 + */ +public class ConstellationTest extends CardTestPlayerBase { + + /** + * Daxos's Torment {3}{B} + * Constellation — Whenever Daxos’s Torment or another enchantment enters the battlefield under your control, + * Daxos’s Torment becomes a 5/5 Demon creature with flying and haste in addition to its other types until end of turn. + */ + + private final String daxosCard = "Daxos's Torment"; + + private void assertDaxosBoost(boolean mustHave) { + if (mustHave) { + assertPowerToughness(playerA, daxosCard, 5, 5); + assertType(daxosCard, CardType.CREATURE, SubType.DEMON); + assertAbility(playerA, daxosCard, FlyingAbility.getInstance(), true); + assertAbility(playerA, daxosCard, HasteAbility.getInstance(), true); + } else { + assertPowerToughness(playerA, daxosCard, 0, 0); + assertNotSubtype(daxosCard, SubType.DEMON); + assertAbility(playerA, daxosCard, FlyingAbility.getInstance(), false); + assertAbility(playerA, daxosCard, HasteAbility.getInstance(), false); + } + } + + @Test + public void test_DaxosGotBoostOnEnter() { + addCard(Zone.HAND, playerA, daxosCard, 1); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 4); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, daxosCard); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertHandCount(playerA, daxosCard, 0); + assertPermanentCount(playerA, daxosCard, 1); + assertDaxosBoost(true); + } + + @Test + public void test_DaxosLostBoostOnNextTurn() { + addCard(Zone.HAND, playerA, daxosCard, 1); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 4); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, daxosCard); + + setStopAt(2, PhaseStep.BEGIN_COMBAT); + execute(); + + assertHandCount(playerA, daxosCard, 0); + assertPermanentCount(playerA, daxosCard, 1); + assertDaxosBoost(false); + } + + @Test + public void test_DaxosGotBoostOnOtherEnchantment() { + addCard(Zone.HAND, playerA, daxosCard, 1); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 4); + + addCard(Zone.HAND, playerA, "Absolute Grace", 1); + addCard(Zone.BATTLEFIELD, playerA, "Plains", 2); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, daxosCard); + castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Absolute Grace"); + + setStopAt(3, PhaseStep.BEGIN_COMBAT); + execute(); + + assertHandCount(playerA, "Absolute Grace", 0); + assertPermanentCount(playerA, "Absolute Grace", 1); + assertHandCount(playerA, daxosCard, 0); + assertPermanentCount(playerA, daxosCard, 1); + assertDaxosBoost(true); + } + + @Test + public void test_DaxosGotBoostAndWithPTLose() { + addCard(Zone.HAND, playerA, daxosCard, 1); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 4); + addCard(Zone.BATTLEFIELD, playerA, "Night of Souls' Betrayal", 1); // All creatures get -1/-1 + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, daxosCard); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertHandCount(playerA, daxosCard, 0); + assertPermanentCount(playerA, daxosCard, 1); + + assertPowerToughness(playerA, daxosCard, 5 - 1, 5 - 1); + assertType(daxosCard, CardType.CREATURE, SubType.DEMON); + assertAbility(playerA, daxosCard, FlyingAbility.getInstance(), true); + assertAbility(playerA, daxosCard, HasteAbility.getInstance(), true); + } + + @Test + public void test_DaxosGotBoostWithLoseFly() { + // 112.10c If two or more effects add and remove the same ability, in general the most recent one prevails. + addCard(Zone.HAND, playerA, daxosCard, 1); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 4); + // + addCard(Zone.HAND, playerB, "Invert the Skies", 1); // Creatures your opponents control lose flying until end of turn + addCard(Zone.BATTLEFIELD, playerB, "Forest", 4); + + // got fly on enter + checkHandCount("start hand", 1, PhaseStep.PRECOMBAT_MAIN, playerA, 1); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, daxosCard); + checkHandCount("first cast hand", 1, PhaseStep.POSTCOMBAT_MAIN, playerA, 0); + checkPermanentCount("dax exist", 1, PhaseStep.POSTCOMBAT_MAIN, playerA, daxosCard, 1); + checkPT("pt after enter", 1, PhaseStep.POSTCOMBAT_MAIN, playerA, daxosCard, 5, 5); + checkAbility("fly after enter", 1, PhaseStep.POSTCOMBAT_MAIN, playerA, daxosCard, FlyingAbility.class, true); + // lose fly on invert + castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "Invert the Skies"); + checkPT("pt after invert", 1, PhaseStep.END_TURN, playerA, daxosCard, 5, 5); + checkAbility("fly after invert", 1, PhaseStep.END_TURN, playerA, daxosCard, FlyingAbility.class, false); + + setStopAt(1, PhaseStep.END_TURN); + execute(); + } + + @Test + public void test_DaxosGotBoostWithLoseFlyAndGotItAgain() { + // 112.10c If two or more effects add and remove the same ability, in general the most recent one prevails. + addCard(Zone.HAND, playerA, daxosCard, 1); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 4); + addCard(Zone.HAND, playerA, "Gravity Sphere", 1); // All creatures lose flying. + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3); + + // got fly on enter, lose on gravity, got fly on gravity enter + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, daxosCard); + castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Gravity Sphere"); + + setStopAt(1, PhaseStep.END_TURN); + execute(); + + assertHandCount(playerA, daxosCard, 0); + assertPermanentCount(playerA, daxosCard, 1); + assertHandCount(playerA, "Gravity Sphere", 0); + assertPermanentCount(playerA, "Gravity Sphere", 1); + + assertPowerToughness(playerA, daxosCard, 5, 5); + assertType(daxosCard, CardType.CREATURE, SubType.DEMON); + assertAbility(playerA, daxosCard, FlyingAbility.getInstance(), true); + assertAbility(playerA, daxosCard, HasteAbility.getInstance(), true); + } + + @Test + public void test_DaxosGotBoostAndSaveColor() { + addCard(Zone.HAND, playerA, daxosCard, 1); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 4); + // + addCard(Zone.HAND, playerA, "Chaoslace", 1); // Target spell or permanent becomes red. + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 1); + // + addCard(Zone.HAND, playerA, "Archetype of Courage", 1); // Enchantment to trigger Daxos + addCard(Zone.BATTLEFIELD, playerA, "Plains", 4); + + // dax cast + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, daxosCard); + checkPermanentCount("dax exist", 1, PhaseStep.POSTCOMBAT_MAIN, playerA, daxosCard, 1); + checkColor("dax without color", 1, PhaseStep.POSTCOMBAT_MAIN, playerA, daxosCard, "R", false); + // give dax new color + castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Chaoslace", daxosCard); + checkPT("dax not boost", 3, PhaseStep.BEGIN_COMBAT, playerA, daxosCard, 0, 0); + checkColor("dax is red", 3, PhaseStep.BEGIN_COMBAT, playerA, daxosCard, "R", true); + // color is saved on boost + castSpell(5, PhaseStep.PRECOMBAT_MAIN, playerA, "Archetype of Courage"); // make dax to creature + checkPT("dax boost", 5, PhaseStep.BEGIN_COMBAT, playerA, daxosCard, 5, 5); + checkAbility("dax fly", 5, PhaseStep.BEGIN_COMBAT, playerA, daxosCard, FlyingAbility.class, true); + checkColor("dax is red", 5, PhaseStep.BEGIN_COMBAT, playerA, daxosCard, "R", true); + + setStopAt(5, PhaseStep.END_TURN); + execute(); + } + + public void playDaxosAndVampire(boolean castVampireDifferentWay) { + // 112.10c If two or more effects add and remove the same ability, in general the most recent one prevails. + // 613.7 -- dependacy effects (Mephidross Vampire must ALWAYS wait Daxos effect, not timestamp) + addCard(Zone.HAND, playerA, daxosCard, 1); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 4); + // + addCard(Zone.HAND, playerA, "Mephidross Vampire", 1); // Each creature you control is a Vampire in addition to its other creature types + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 6); + // + addCard(Zone.HAND, playerA, "Archetype of Courage", 1); // Enchantment to trigger Daxos + addCard(Zone.BATTLEFIELD, playerA, "Plains", 4); + + // dax cast + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, daxosCard); + checkPermanentCount("dax exist", 1, PhaseStep.POSTCOMBAT_MAIN, playerA, daxosCard, 1); + + // give dax a new type (on next turn) -- effects dependacy + if (castVampireDifferentWay) { + castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Archetype of Courage"); // make dax to creature + castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Mephidross Vampire"); // give vampire to creatures + } else { + castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Mephidross Vampire"); // give vampire to creatures + castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Archetype of Courage"); // make dax to creature + } + + checkPT("dax boost", 3, PhaseStep.BEGIN_COMBAT, playerA, daxosCard, 5, 5); + checkAbility("dax fly", 3, PhaseStep.BEGIN_COMBAT, playerA, daxosCard, FlyingAbility.class, true); + checkSubType("dax is vampire", 3, PhaseStep.BEGIN_COMBAT, playerA, daxosCard, SubType.VAMPIRE, true); + + setStopAt(3, PhaseStep.END_TURN); + execute(); + } + + @Test + public void test_DaxosGotBoostAndNewTypeByDependencyEffects() { + playDaxosAndVampire(false); + playDaxosAndVampire(true); + } +} + + diff --git a/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java b/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java index db908e4a289..90306488a3c 100644 --- a/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java +++ b/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java @@ -926,6 +926,14 @@ public class ContinuousEffects implements Serializable { while (!done) { // loop needed if a added effect adds again an effect (e.g. Level 5- of Joraga Treespeaker) done = true; layer = filterLayeredEffects(activeLayerEffects, Layer.AbilityAddingRemovingEffects_6); + + // debug + /* + System.out.println(game.getTurn() + ", " + game.getPhase() + ": " + "need apply " + layer.stream() + .map((eff) -> {return eff.getClass().getName().replaceAll(".+\\.(.+)", "$1");}) + .collect(Collectors.joining(", "))); + */ + for (ContinuousEffect effect : layer) { if (activeLayerEffects.contains(effect) && !appliedEffects.contains(effect.getId())) { // Effect does still exist and was not applied yet Set dependentTo = effect.isDependentTo(layer); diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureSourceEffect.java index 55c68421124..3f818e36597 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureSourceEffect.java @@ -31,6 +31,7 @@ import mage.MageObjectReference; import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.keyword.FlyingAbility; import mage.constants.*; import mage.game.Game; import mage.game.permanent.Permanent; @@ -64,6 +65,8 @@ public class BecomesCreatureSourceEffect extends ContinuousEffectImpl implements this.power = power; this.toughness = toughness; setText(); + + this.addDependencyType(DependencyType.BecomeCreature); } public BecomesCreatureSourceEffect(final BecomesCreatureSourceEffect effect) { @@ -110,6 +113,7 @@ public class BecomesCreatureSourceEffect extends ContinuousEffectImpl implements for (CardType cardType : token.getCardType()) { permanent.addCardType(cardType); } + if (theyAreStillType != null && theyAreStillType.isEmpty() || theyAreStillType == null && permanent.isLand()) { permanent.getSubtype(game).retainAll(SubType.getLandTypes(false)); } diff --git a/Mage/src/main/java/mage/constants/DependencyType.java b/Mage/src/main/java/mage/constants/DependencyType.java index e5533442bf6..abb7a8fb846 100644 --- a/Mage/src/main/java/mage/constants/DependencyType.java +++ b/Mage/src/main/java/mage/constants/DependencyType.java @@ -39,7 +39,6 @@ package mage.constants; * @author LevelX2 */ public enum DependencyType { - AuraAddingRemoving, ArtifactAddingRemoving, AddingAbility, @@ -48,6 +47,7 @@ public enum DependencyType { BecomeMountain, BecomePlains, BecomeSwamp, + BecomeCreature, EnchantmentAddingRemoving, LooseDefenderEffect -} +} \ No newline at end of file From 505d09b0bb4ab8b9eb483e6f0070d5ad68906b09 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 14 May 2018 10:22:49 -0400 Subject: [PATCH 148/158] fixed Firesong and Sunspeaker triggering off of other players gaining life (fixes #4933) --- Mage.Sets/src/mage/cards/f/FiresongAndSunspeaker.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/f/FiresongAndSunspeaker.java b/Mage.Sets/src/mage/cards/f/FiresongAndSunspeaker.java index 0340e7ebc9c..1890f041676 100644 --- a/Mage.Sets/src/mage/cards/f/FiresongAndSunspeaker.java +++ b/Mage.Sets/src/mage/cards/f/FiresongAndSunspeaker.java @@ -114,7 +114,8 @@ class FiresongAndSunspeakerTriggeredAbility extends TriggeredAbilityImpl { public boolean checkTrigger(GameEvent event, Game game) { MageObject object = game.getObject(event.getSourceId()); if (object != null && object instanceof Spell) { - if (object.getColor(game).contains(ObjectColor.WHITE) + if (event.getTargetId().equals(this.getControllerId()) + && object.getColor(game).contains(ObjectColor.WHITE) && (object.isInstant() || object.isSorcery())) { return true; From 376aaa19d50c2f4ad2df4b0ec616e0fe4f78a00d Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 14 May 2018 10:26:20 -0400 Subject: [PATCH 149/158] fixed Traitor's Roar not having the creature deal the damage --- Mage.Sets/src/mage/cards/t/TraitorsRoar.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/cards/t/TraitorsRoar.java b/Mage.Sets/src/mage/cards/t/TraitorsRoar.java index 3ec18b152d3..ff25b64417f 100644 --- a/Mage.Sets/src/mage/cards/t/TraitorsRoar.java +++ b/Mage.Sets/src/mage/cards/t/TraitorsRoar.java @@ -56,7 +56,7 @@ public class TraitorsRoar extends CardImpl { } public TraitorsRoar(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{4}{B/R}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{B/R}"); // Tap target untapped creature. It deals damage equal to its power to its controller. this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); @@ -101,7 +101,7 @@ class TraitorsRoarEffect extends OneShotEffect { applied = targetCreature.tap(game); Player controller = game.getPlayer(targetCreature.getControllerId()); if (controller != null) { - controller.damage(targetCreature.getPower().getValue(), source.getSourceId(), game, false, true); + controller.damage(targetCreature.getPower().getValue(), targetCreature.getId(), game, false, true); applied = true; } } From 44d0022d14a4e8e2b714d7265fe7bcd067e2c398 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 14 May 2018 10:43:21 -0400 Subject: [PATCH 150/158] fixed Barren Glory not triggering properly --- Mage.Sets/src/mage/cards/b/BarrenGlory.java | 71 +++++---------------- 1 file changed, 17 insertions(+), 54 deletions(-) diff --git a/Mage.Sets/src/mage/cards/b/BarrenGlory.java b/Mage.Sets/src/mage/cards/b/BarrenGlory.java index 3fb25418a1c..579a2c2cd73 100644 --- a/Mage.Sets/src/mage/cards/b/BarrenGlory.java +++ b/Mage.Sets/src/mage/cards/b/BarrenGlory.java @@ -28,36 +28,41 @@ package mage.cards.b; import java.util.UUID; -import mage.abilities.TriggeredAbility; -import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.condition.Condition; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.condition.CompoundCondition; import mage.abilities.condition.common.CardsInHandCondition; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; import mage.abilities.decorator.ConditionalTriggeredAbility; import mage.abilities.effects.common.WinGameSourceControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.ComparisonType; -import mage.constants.Zone; -import mage.filter.FilterPermanent; +import mage.constants.TargetController; +import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.permanent.AnotherPredicate; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; /** * @author fireshoes */ public class BarrenGlory extends CardImpl { + private static final FilterControlledPermanent filter = new FilterControlledPermanent(); + + static { + filter.add(new AnotherPredicate()); + } + public BarrenGlory(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{W}{W}"); // At the beginning of your upkeep, if you control no permanents other than Barren Glory and have no cards in hand, you win the game. - Condition condition = new CardsInHandCondition(ComparisonType.EQUAL_TO, 0); - TriggeredAbility ability = new BarrenGloryTriggeredAbility(); - this.addAbility(new ConditionalTriggeredAbility(ability, - condition, + this.addAbility(new ConditionalTriggeredAbility( + new BeginningOfUpkeepTriggeredAbility(new WinGameSourceControllerEffect(), TargetController.YOU, false), + new CompoundCondition( + new CardsInHandCondition(ComparisonType.EQUAL_TO, 0), + new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.EQUAL_TO, 0) + ), "At the beginning of your upkeep, if you control no permanents other than {this} and have no cards in hand, you win the game")); } @@ -70,45 +75,3 @@ public class BarrenGlory extends CardImpl { return new BarrenGlory(this); } } - -class BarrenGloryTriggeredAbility extends TriggeredAbilityImpl { - - private static final FilterPermanent filter = new FilterPermanent(); - - static { - filter.add(new AnotherPredicate()); - } - - BarrenGloryTriggeredAbility() { - super(Zone.BATTLEFIELD, new WinGameSourceControllerEffect()); - } - - BarrenGloryTriggeredAbility(final BarrenGloryTriggeredAbility ability) { - super(ability); - } - - @Override - public BarrenGloryTriggeredAbility copy() { - return new BarrenGloryTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == EventType.UPKEEP_STEP_PRE; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getPlayerId().equals(this.controllerId)) { - if (game.getBattlefield().count(filter, this.getSourceId(), this.getControllerId(), game) == 0) { - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "At the beginning of your upkeep, if you control no permanents other than {this} and have no cards in hand, you win the game"; - } -} \ No newline at end of file From 9a66f1713b2bbf1a56506e59f535e79f6072c734 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 14 May 2018 11:11:11 -0400 Subject: [PATCH 151/158] refactored instances of various types of counters --- .../src/mage/cards/a/ArbiterOfTheIdeal.java | 4 +-- .../src/mage/cards/a/AzorsElocutors.java | 14 ++++----- .../src/mage/cards/b/BloodletterQuill.java | 9 +++--- Mage.Sets/src/mage/cards/b/BribersPurse.java | 8 ++--- .../mage/cards/c/CelestialConvergence.java | 17 +++++------ Mage.Sets/src/mage/cards/j/JumboImp.java | 2 +- .../src/mage/cards/p/PhylacteryLich.java | 6 ++-- .../src/mage/cards/q/QuarantineField.java | 8 ++--- .../src/mage/cards/s/SenseiGoldenTail.java | 29 +++++++++++++------ Mage.Sets/src/mage/cards/s/Smokestack.java | 8 ++--- .../mage/cards/y/YisanTheWandererBard.java | 8 ++--- .../main/java/mage/counters/CounterType.java | 9 ++++++ 12 files changed, 69 insertions(+), 53 deletions(-) diff --git a/Mage.Sets/src/mage/cards/a/ArbiterOfTheIdeal.java b/Mage.Sets/src/mage/cards/a/ArbiterOfTheIdeal.java index 44e5c7b2f03..23f0696bd35 100644 --- a/Mage.Sets/src/mage/cards/a/ArbiterOfTheIdeal.java +++ b/Mage.Sets/src/mage/cards/a/ArbiterOfTheIdeal.java @@ -38,7 +38,7 @@ import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.InspiredAbility; import mage.cards.*; import mage.constants.*; -import mage.counters.Counter; +import mage.counters.CounterType; import mage.filter.FilterCard; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; @@ -116,7 +116,7 @@ class ArbiterOfTheIdealEffect extends OneShotEffect { controller.moveCards(card, Zone.BATTLEFIELD, source, game); Permanent permanent = game.getPermanent(card.getId()); if (permanent != null) { - permanent.addCounters(new Counter("Manifestation"), source, game); + permanent.addCounters(CounterType.MANIFESTATION.createInstance(), source, game); ContinuousEffect effect = new AddCardTypeTargetEffect(Duration.Custom, CardType.ENCHANTMENT); effect.setTargetPointer(new FixedTarget(permanent, game)); game.addEffect(effect, source); diff --git a/Mage.Sets/src/mage/cards/a/AzorsElocutors.java b/Mage.Sets/src/mage/cards/a/AzorsElocutors.java index 20fbcb0c980..90103594a03 100644 --- a/Mage.Sets/src/mage/cards/a/AzorsElocutors.java +++ b/Mage.Sets/src/mage/cards/a/AzorsElocutors.java @@ -37,14 +37,13 @@ import mage.abilities.effects.common.counter.RemoveCounterSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; -import mage.counters.Counter; +import mage.counters.CounterType; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; import mage.game.permanent.Permanent; import mage.players.Player; - /** * * @author LevelX2 @@ -52,11 +51,10 @@ import mage.players.Player; public class AzorsElocutors extends CardImpl { public AzorsElocutors(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{W/U}{W/U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W/U}{W/U}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.ADVISOR); - this.power = new MageInt(3); this.toughness = new MageInt(5); @@ -65,7 +63,6 @@ public class AzorsElocutors extends CardImpl { // Whenever a source deals damage to you, remove a filibuster counter from Azor's Elocutors. this.addAbility(new AzorsElocutorsTriggeredAbility()); - } public AzorsElocutors(final AzorsElocutors card) { @@ -77,10 +74,11 @@ public class AzorsElocutors extends CardImpl { return new AzorsElocutors(this); } } + class AzorsElocutorsTriggeredAbility extends TriggeredAbilityImpl { public AzorsElocutorsTriggeredAbility() { - super(Zone.BATTLEFIELD, new RemoveCounterSourceEffect(new Counter("filibuster")), false); + super(Zone.BATTLEFIELD, new RemoveCounterSourceEffect(CounterType.FILIBUSTER.createInstance()), false); } public AzorsElocutorsTriggeredAbility(final AzorsElocutorsTriggeredAbility ability) { @@ -124,8 +122,8 @@ class AzorsElocutorsEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Permanent permanent = game.getPermanent(source.getSourceId()); if (permanent != null) { - permanent.addCounters(new Counter("filibuster"), source, game); - if (permanent.getCounters(game).getCount("filibuster") > 4) { + permanent.addCounters(CounterType.FILIBUSTER.createInstance(), source, game); + if (permanent.getCounters(game).getCount(CounterType.FILIBUSTER) > 4) { Player player = game.getPlayer(permanent.getControllerId()); if (player != null) { player.won(game); diff --git a/Mage.Sets/src/mage/cards/b/BloodletterQuill.java b/Mage.Sets/src/mage/cards/b/BloodletterQuill.java index 746d619d0c8..c7b12eb8896 100644 --- a/Mage.Sets/src/mage/cards/b/BloodletterQuill.java +++ b/Mage.Sets/src/mage/cards/b/BloodletterQuill.java @@ -42,7 +42,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; -import mage.counters.Counter; +import mage.counters.CounterType; /** * @@ -53,17 +53,16 @@ public class BloodletterQuill extends CardImpl { public BloodletterQuill(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); - Counter bloodCounter = new Counter("blood"); // {2}, {T}, Put a blood counter on Bloodletter Quill: Draw a card, then lose 1 life for each blood counter on Bloodletter Quill. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), new GenericManaCost(2)); - ability.addEffect(new LoseLifeSourceControllerEffect(new CountersSourceCount(bloodCounter.getName())) + ability.addEffect(new LoseLifeSourceControllerEffect(new CountersSourceCount(CounterType.BLOOD)) .setText(", then lose 1 life for each blood counter on {this}")); ability.addCost(new TapSourceCost()); - ability.addCost(new PutCountersSourceCost(bloodCounter)); + ability.addCost(new PutCountersSourceCost(CounterType.BLOOD.createInstance())); this.addAbility(ability); // {U}{B}: Remove a blood counter from Bloodletter Quill. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, - new RemoveCounterSourceEffect(bloodCounter), new ManaCostsImpl("{U}{B}"))); + new RemoveCounterSourceEffect(CounterType.BLOOD.createInstance()), new ManaCostsImpl("{U}{B}"))); } public BloodletterQuill(final BloodletterQuill card) { diff --git a/Mage.Sets/src/mage/cards/b/BribersPurse.java b/Mage.Sets/src/mage/cards/b/BribersPurse.java index 56ee979ae07..f515587dd60 100644 --- a/Mage.Sets/src/mage/cards/b/BribersPurse.java +++ b/Mage.Sets/src/mage/cards/b/BribersPurse.java @@ -41,7 +41,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Zone; -import mage.counters.Counter; +import mage.counters.CounterType; import mage.target.common.TargetCreaturePermanent; /** @@ -51,15 +51,15 @@ import mage.target.common.TargetCreaturePermanent; public class BribersPurse extends CardImpl { public BribersPurse(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{X}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{X}"); // Briber's Purse enters the battlefield with X gem counters on it. - this.addAbility(new EntersBattlefieldAbility(new EntersBattlefieldWithXCountersEffect(new Counter("gem")))); + this.addAbility(new EntersBattlefieldAbility(new EntersBattlefieldWithXCountersEffect(CounterType.GEM.createInstance()))); // {1}, {T}, Remove a gem counter from Briber's Purse: Target creature can't attack or block this turn. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CantAttackBlockTargetEffect(Duration.EndOfTurn), new GenericManaCost(1)); ability.addCost(new TapSourceCost()); - ability.addCost(new RemoveCountersSourceCost(new Counter("gem"))); + ability.addCost(new RemoveCountersSourceCost(CounterType.GEM.createInstance())); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/c/CelestialConvergence.java b/Mage.Sets/src/mage/cards/c/CelestialConvergence.java index 3efb58cbecd..4acdfa85c43 100644 --- a/Mage.Sets/src/mage/cards/c/CelestialConvergence.java +++ b/Mage.Sets/src/mage/cards/c/CelestialConvergence.java @@ -44,7 +44,7 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.TargetController; import mage.constants.Zone; -import mage.counters.Counter; +import mage.counters.CounterType; import mage.game.Game; import mage.players.Player; @@ -58,12 +58,12 @@ public class CelestialConvergence extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}{W}"); // Celestial Convergence enters the battlefield with seven omen counters on it. - Effect effect = new AddCountersSourceEffect(new Counter("omen", 7)); + Effect effect = new AddCountersSourceEffect(CounterType.OMEN.createInstance(7)); this.addAbility(new EntersBattlefieldAbility(effect, "with seven omen counters")); // At the beginning of your upkeep, remove an omen counter from Celestial Convergence. If there are no omen counters on Celestial Convergence, the player with the highest life total wins the game. If two or more players are tied for highest life total, the game is a draw. Ability ability = new BeginningOfUpkeepTriggeredAbility( - Zone.BATTLEFIELD, new RemoveCounterSourceEffect(new Counter("omen")), TargetController.YOU, false); + Zone.BATTLEFIELD, new RemoveCounterSourceEffect(CounterType.OMEN.createInstance(1)), TargetController.YOU, false); ability.addEffect(new CelestialConvergenceEffect()); this.addAbility(ability); } @@ -100,18 +100,17 @@ class CelestialConvergenceEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); if (sourceObject != null && controller != null - && sourceObject.getCounters(game).getCount("omen") == 0) { + && sourceObject.getCounters(game).getCount(CounterType.OMEN) == 0) { /** * 801.14. If an effect states that a player wins the game, all of - * that player’s opponents within their range of influence lose - * the game instead. # + * that player’s opponents within their range of influence lose the + * game instead. # * * 801.15. If the effect of a spell or ability states that the game * is a draw, the game is a draw for that spell or ability’s - * controller and all players within their range of influence. - * They leave the game. All remaining players continue to play the - * game. + * controller and all players within their range of influence. They + * leave the game. All remaining players continue to play the game. * */ List highestLifePlayers = new ArrayList<>(); diff --git a/Mage.Sets/src/mage/cards/j/JumboImp.java b/Mage.Sets/src/mage/cards/j/JumboImp.java index bd7f5ef02f3..b64c2b454c1 100644 --- a/Mage.Sets/src/mage/cards/j/JumboImp.java +++ b/Mage.Sets/src/mage/cards/j/JumboImp.java @@ -67,7 +67,7 @@ public class JumboImp extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // As Jumbo Imp enters the battlefield, roll a six-sided die. Jumbo Imp enters the battlefield with a number of +1/+1 counters on it equal to the result. - this.addAbility(new EntersBattlefieldAbility(new JumboImpEffect(new Counter("P1P1")))); + this.addAbility(new EntersBattlefieldAbility(new JumboImpEffect(CounterType.P1P1.createInstance()))); // At the beginning of your upkeep, roll a six-sided die and put a number of +1/+1 counters on Jumbo Imp equal to the result. Ability ability2 = new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new JumboImpAddCountersEffect(), TargetController.YOU, false); diff --git a/Mage.Sets/src/mage/cards/p/PhylacteryLich.java b/Mage.Sets/src/mage/cards/p/PhylacteryLich.java index 76dc257746e..259c524ee80 100644 --- a/Mage.Sets/src/mage/cards/p/PhylacteryLich.java +++ b/Mage.Sets/src/mage/cards/p/PhylacteryLich.java @@ -41,7 +41,7 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Outcome; import mage.constants.Zone; -import mage.counters.Counter; +import mage.counters.CounterType; import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.game.Game; @@ -57,7 +57,7 @@ import mage.target.common.TargetControlledPermanent; public class PhylacteryLich extends CardImpl { public PhylacteryLich(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{B}{B}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B}{B}{B}"); this.subtype.add(SubType.ZOMBIE); this.power = new MageInt(5); @@ -142,7 +142,7 @@ class PhylacteryLichEffect extends OneShotEffect { if (player.choose(Outcome.Neutral, target, source.getSourceId(), game)) { Permanent permanent = game.getPermanent(target.getFirstTarget()); if (permanent != null) { - permanent.addCounters(new Counter("phylactery"), source, game); + permanent.addCounters(CounterType.PHYLACTERY.createInstance(), source, game); } } } diff --git a/Mage.Sets/src/mage/cards/q/QuarantineField.java b/Mage.Sets/src/mage/cards/q/QuarantineField.java index 6a2c9a2672d..76cb9db918d 100644 --- a/Mage.Sets/src/mage/cards/q/QuarantineField.java +++ b/Mage.Sets/src/mage/cards/q/QuarantineField.java @@ -41,7 +41,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.TargetController; -import mage.counters.Counter; +import mage.counters.CounterType; import mage.filter.common.FilterNonlandPermanent; import mage.filter.predicate.permanent.ControllerPredicate; import mage.game.Game; @@ -56,10 +56,10 @@ import mage.util.CardUtil; public class QuarantineField extends CardImpl { public QuarantineField(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{X}{X}{W}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{X}{X}{W}{W}"); // Quarantine Field enters the battlefield with X isolation counters on it. - this.addAbility(new EntersBattlefieldAbility(new EntersBattlefieldWithXCountersEffect(new Counter("isolation")))); + this.addAbility(new EntersBattlefieldAbility(new EntersBattlefieldWithXCountersEffect(CounterType.ISOLATION.createInstance()))); // When Quarantine Field enters the battlefield, for each isolation counter on it, exile up to one target nonland permanent an opponenet controls until Quarantine Field leaves the battlefield. Ability ability = new EntersBattlefieldTriggeredAbility(new QuarantineFieldEffect(), false); @@ -77,7 +77,7 @@ public class QuarantineField extends CardImpl { if (ability instanceof EntersBattlefieldTriggeredAbility) { Permanent sourceObject = game.getPermanent(ability.getSourceId()); if (sourceObject != null) { - int isolationCounters = sourceObject.getCounters(game).getCount("isolation"); + int isolationCounters = sourceObject.getCounters(game).getCount(CounterType.ISOLATION); FilterNonlandPermanent filter = new FilterNonlandPermanent("up to " + isolationCounters + " nonland permanents controlled by any opponents"); filter.add(new ControllerPredicate(TargetController.OPPONENT)); ability.addTarget(new TargetPermanent(0, isolationCounters, filter, false)); diff --git a/Mage.Sets/src/mage/cards/s/SenseiGoldenTail.java b/Mage.Sets/src/mage/cards/s/SenseiGoldenTail.java index 1a65a80d324..8dc162790f1 100644 --- a/Mage.Sets/src/mage/cards/s/SenseiGoldenTail.java +++ b/Mage.Sets/src/mage/cards/s/SenseiGoldenTail.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.cards.s; import java.util.UUID; @@ -41,7 +40,7 @@ import mage.abilities.keyword.BushidoAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; -import mage.counters.Counter; +import mage.counters.CounterType; import mage.target.common.TargetCreaturePermanent; /** @@ -50,8 +49,8 @@ import mage.target.common.TargetCreaturePermanent; */ public class SenseiGoldenTail extends CardImpl { - public SenseiGoldenTail (UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{W}"); + public SenseiGoldenTail(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.FOX); this.subtype.add(SubType.SAMURAI); @@ -61,17 +60,29 @@ public class SenseiGoldenTail extends CardImpl { // Bushido 1 (When this blocks or becomes blocked, it gets +1/+1 until end of turn.) this.addAbility(new BushidoAbility(1)); + // {1}{W}, {T}: Put a training counter on target creature. - Ability ability = new ActivateAsSorceryActivatedAbility(Zone.BATTLEFIELD, new AddCountersTargetEffect(new Counter("Training")), new ManaCostsImpl("{1}{W}")); + // That creature gains bushido 1 and becomes a Samurai in addition to its other creature types. + // Activate this ability only any time you could cast a sorcery. + Ability ability = new ActivateAsSorceryActivatedAbility( + Zone.BATTLEFIELD, + new AddCountersTargetEffect(CounterType.TRAINING.createInstance()), + new ManaCostsImpl("{1}{W}") + ); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetCreaturePermanent()); - // That creature gains bushido 1 and becomes a Samurai in addition to its other creature types. Activate this ability only any time you could cast a sorcery. - ability.addEffect(new GainAbilityTargetEffect(new BushidoAbility(1),Duration.Custom)); - ability.addEffect(new AddCardSubTypeTargetEffect(SubType.SAMURAI,Duration.Custom)); + ability.addEffect(new GainAbilityTargetEffect( + new BushidoAbility(1), Duration.Custom) + .setText("That creature gains bushido 1") + ); + ability.addEffect( + new AddCardSubTypeTargetEffect(SubType.SAMURAI, Duration.Custom) + .setText("and becomes a Samurai in addition to its other creature types.") + ); this.addAbility(ability); } - public SenseiGoldenTail (final SenseiGoldenTail card) { + public SenseiGoldenTail(final SenseiGoldenTail card) { super(card); } diff --git a/Mage.Sets/src/mage/cards/s/Smokestack.java b/Mage.Sets/src/mage/cards/s/Smokestack.java index fbe693f5535..ab121db090d 100644 --- a/Mage.Sets/src/mage/cards/s/Smokestack.java +++ b/Mage.Sets/src/mage/cards/s/Smokestack.java @@ -37,7 +37,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.TargetController; -import mage.counters.Counter; +import mage.counters.CounterType; import mage.filter.common.FilterControlledPermanent; import mage.game.Game; import mage.game.permanent.Permanent; @@ -52,10 +52,10 @@ import mage.target.common.TargetControlledPermanent; public class Smokestack extends CardImpl { public Smokestack(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{4}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}"); // At the beginning of your upkeep, you may put a soot counter on Smokestack. - this.addAbility(new BeginningOfUpkeepTriggeredAbility(new AddCountersSourceEffect(new Counter("Soot")), TargetController.YOU, true)); + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new AddCountersSourceEffect(CounterType.SOOT.createInstance()), TargetController.YOU, true)); // At the beginning of each player's upkeep, that player sacrifices a permanent for each soot counter on Smokestack. this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SmokestackEffect(), TargetController.ANY, false)); @@ -92,7 +92,7 @@ class SmokestackEffect extends OneShotEffect { Player activePlayer = game.getPlayer(getTargetPointer().getFirst(game, source)); Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); if (activePlayer != null && sourcePermanent != null) { - int count = sourcePermanent.getCounters(game).getCount("Soot"); + int count = sourcePermanent.getCounters(game).getCount(CounterType.SOOT); if (count > 0) { int amount = Math.min(count, game.getBattlefield().countAll(new FilterControlledPermanent(), activePlayer.getId(), game)); Target target = new TargetControlledPermanent(amount, amount, new FilterControlledPermanent(), true); diff --git a/Mage.Sets/src/mage/cards/y/YisanTheWandererBard.java b/Mage.Sets/src/mage/cards/y/YisanTheWandererBard.java index 718561d6e5a..f1780d1f670 100644 --- a/Mage.Sets/src/mage/cards/y/YisanTheWandererBard.java +++ b/Mage.Sets/src/mage/cards/y/YisanTheWandererBard.java @@ -44,7 +44,7 @@ import mage.constants.ComparisonType; import mage.constants.Outcome; import mage.constants.SuperType; import mage.constants.Zone; -import mage.counters.Counter; +import mage.counters.CounterType; import mage.filter.FilterCard; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; @@ -60,7 +60,7 @@ import mage.target.common.TargetCardInLibrary; public class YisanTheWandererBard extends CardImpl { public YisanTheWandererBard(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.ROGUE); @@ -71,7 +71,7 @@ public class YisanTheWandererBard extends CardImpl { // {2}{G}, {T}, Put a verse counter on Yisan, the Wanderer Bard: Search your library for a creature card with converted mana cost equal to the number of verse counters on Yisan, put it onto the battlefield, then shuffle your library. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new YisanTheWandererBardEffect(), new ManaCostsImpl("{2}{G}")); ability.addCost(new TapSourceCost()); - ability.addCost(new PutCountersSourceCost(new Counter("verse"))); + ability.addCost(new PutCountersSourceCost(CounterType.VERSE.createInstance())); this.addAbility(ability); } @@ -106,7 +106,7 @@ class YisanTheWandererBardEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); if (sourcePermanent != null && controller != null) { - int newConvertedCost = sourcePermanent.getCounters(game).getCount("verse"); + int newConvertedCost = sourcePermanent.getCounters(game).getCount(CounterType.VERSE); FilterCard filter = new FilterCard("creature card with converted mana cost " + newConvertedCost); filter.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, newConvertedCost)); filter.add(new CardTypePredicate(CardType.CREATURE)); diff --git a/Mage/src/main/java/mage/counters/CounterType.java b/Mage/src/main/java/mage/counters/CounterType.java index c7ecd539e57..39e6d55ef72 100644 --- a/Mage/src/main/java/mage/counters/CounterType.java +++ b/Mage/src/main/java/mage/counters/CounterType.java @@ -39,6 +39,7 @@ public enum CounterType { ARROWHEAD("arrowhead"), AWAKENING("awakening"), BLAZE("blaze"), + BLOOD("blood"), BOUNTY("bounty"), BRIBERY("bribery"), BRICK("brick"), @@ -67,10 +68,12 @@ public enum CounterType { FADE("fade"), FATE("fate"), FEATHER("feather"), + FILIBUSTER("filibuster"), FLOOD("flood"), FURY("fury"), FUNGUS("fungus"), FUSE("fuse"), + GEM("gem"), GLOBE("globe"), GOLD("gold"), GROWTH("growth"), @@ -83,6 +86,7 @@ public enum CounterType { ICE("ice"), INFECTION("infection"), INTERVENTION("intervention"), + ISOLATION("isolation"), JAVELIN("javelin"), KI("ki"), LANDMARK("landmark"), @@ -90,6 +94,7 @@ public enum CounterType { LORE("lore"), LUCK("luck"), LOYALTY("loyalty"), + MANIFESTATION("manifestation"), MANNEQUIN("mannequin"), M1M1(new BoostCounter(-1, -1).name), M2M1(new BoostCounter(-2, -1).name), @@ -99,6 +104,7 @@ public enum CounterType { MIRE("mire"), MUSTER("muster"), NET("net"), + OMEN("omen"), P0P1(new BoostCounter(0, 1).name), P1P0(new BoostCounter(1, 0).name), P1P1(new BoostCounter(1, 1).name), @@ -108,6 +114,7 @@ public enum CounterType { PAIN("pain"), PETAL("petal"), PETRIFICATION("petrification"), + PHYLACTERY("phylactery"), PLAGUE("plague"), PLOT("plot"), POLYP("polyp"), @@ -123,6 +130,7 @@ public enum CounterType { SHIELD("shield"), SHRED("shred"), SLIME("slime"), + SOOT("soot"), SPITE("spite"), SPORE("spore"), STORAGE("storage"), @@ -132,6 +140,7 @@ public enum CounterType { TIDE("tide"), TIME("time"), TOWER("tower"), + TRAINING("training"), TRAP("trap"), TREASURE("treasure"), UNITY("unity"), From 40ff146764331ac3e3dc4606ab675cf936ff9375 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 14 May 2018 11:39:27 -0400 Subject: [PATCH 152/158] fixed Death's Shadow getting bigger from negative life totals (no longer how the rules work) --- Mage.Sets/src/mage/cards/d/DeathsShadow.java | 4 ++-- .../common/SignInversionDynamicValue.java | 14 +++++++++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/Mage.Sets/src/mage/cards/d/DeathsShadow.java b/Mage.Sets/src/mage/cards/d/DeathsShadow.java index 6bae1cb5898..71c65af311f 100644 --- a/Mage.Sets/src/mage/cards/d/DeathsShadow.java +++ b/Mage.Sets/src/mage/cards/d/DeathsShadow.java @@ -47,14 +47,14 @@ import mage.constants.Zone; public class DeathsShadow extends CardImpl { public DeathsShadow(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B}"); this.subtype.add(SubType.AVATAR); this.power = new MageInt(13); this.toughness = new MageInt(13); // Death's Shadow gets -X/-X, where X is your life total. - SignInversionDynamicValue x = new SignInversionDynamicValue(new ControllerLifeCount()); + SignInversionDynamicValue x = new SignInversionDynamicValue(new ControllerLifeCount(), false); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostSourceEffect(x, x, Duration.WhileOnBattlefield))); } diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/SignInversionDynamicValue.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/SignInversionDynamicValue.java index 6f630c48617..db00aa1ccbe 100644 --- a/Mage/src/main/java/mage/abilities/dynamicvalue/common/SignInversionDynamicValue.java +++ b/Mage/src/main/java/mage/abilities/dynamicvalue/common/SignInversionDynamicValue.java @@ -8,18 +8,30 @@ import mage.game.Game; public class SignInversionDynamicValue implements DynamicValue { private final DynamicValue value; + private final boolean canBePositive; public SignInversionDynamicValue(DynamicValue value) { + this(value, true); + } + + public SignInversionDynamicValue(DynamicValue value, boolean canBePositive) { this.value = value.copy(); + this.canBePositive = canBePositive; } SignInversionDynamicValue(final SignInversionDynamicValue dynamicValue) { this.value = dynamicValue.value.copy(); + this.canBePositive = dynamicValue.canBePositive; } @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { - return -1 * value.calculate(game, sourceAbility, effect); + int amount = value.calculate(game, sourceAbility, effect); + if (amount >= 0 || canBePositive) { + return -1 * amount; + } else { + return 0; + } } @Override From e0bead005a961ecf6509542176710093782d0722 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 14 May 2018 11:43:15 -0400 Subject: [PATCH 153/158] fixed Dissipation Field returning creatures that have left the battlefield --- Mage.Sets/src/mage/cards/d/DissipationField.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Mage.Sets/src/mage/cards/d/DissipationField.java b/Mage.Sets/src/mage/cards/d/DissipationField.java index 592643e6729..58a8eff315e 100644 --- a/Mage.Sets/src/mage/cards/d/DissipationField.java +++ b/Mage.Sets/src/mage/cards/d/DissipationField.java @@ -47,8 +47,7 @@ import mage.target.targetpointer.FixedTarget; public class DissipationField extends CardImpl { public DissipationField(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{U}{U}"); - + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}{U}"); // Whenever a permanent deals damage to you, return it to its owner's hand. this.addAbility(new DissipationFieldAbility()); @@ -89,7 +88,7 @@ class DissipationFieldAbility extends TriggeredAbilityImpl { if (event.getTargetId().equals(this.controllerId)) { Permanent permanent = game.getPermanent(event.getSourceId()); if (permanent != null) { - this.getEffects().get(0).setTargetPointer(new FixedTarget(permanent.getId())); + this.getEffects().get(0).setTargetPointer(new FixedTarget(permanent, game)); return true; } } From 00e953ed19ae1bf942a64e95731671e43946d5c8 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 14 May 2018 11:54:49 -0400 Subject: [PATCH 154/158] fixed Kederekt Parasite dealing unpreventable damage --- .../src/mage/cards/k/KederektParasite.java | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/Mage.Sets/src/mage/cards/k/KederektParasite.java b/Mage.Sets/src/mage/cards/k/KederektParasite.java index 5033645889e..ac7309829df 100644 --- a/Mage.Sets/src/mage/cards/k/KederektParasite.java +++ b/Mage.Sets/src/mage/cards/k/KederektParasite.java @@ -29,17 +29,21 @@ package mage.cards.k; import java.util.UUID; import mage.MageInt; +import mage.ObjectColor; import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.ComparisonType; import mage.constants.SubType; import mage.constants.Zone; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.ColorPredicate; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; -import mage.game.permanent.Permanent; import mage.target.targetpointer.FixedTarget; /** @@ -49,7 +53,7 @@ import mage.target.targetpointer.FixedTarget; public class KederektParasite extends CardImpl { public KederektParasite(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B}"); this.subtype.add(SubType.HORROR); this.power = new MageInt(1); @@ -71,8 +75,14 @@ public class KederektParasite extends CardImpl { class KederektParasiteTriggeredAbility extends TriggeredAbilityImpl { + private static final FilterControlledPermanent filter = new FilterControlledPermanent(); + + static { + filter.add(new ColorPredicate(ObjectColor.RED)); + } + KederektParasiteTriggeredAbility() { - super(Zone.BATTLEFIELD, new DamageTargetEffect(1, false, "opponent"), true); + super(Zone.BATTLEFIELD, new DamageTargetEffect(1, true, "opponent"), true); } KederektParasiteTriggeredAbility(final KederektParasiteTriggeredAbility ability) { @@ -89,20 +99,16 @@ class KederektParasiteTriggeredAbility extends TriggeredAbilityImpl { return event.getType() == EventType.DREW_CARD; } + @Override + public boolean checkInterveningIfClause(Game game) { + return new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.EQUAL_TO, 0).apply(game, this); + } + @Override public boolean checkTrigger(GameEvent event, Game game) { if (game.getOpponents(this.getControllerId()).contains(event.getPlayerId())) { - boolean youControlRedPermanent = false; - for (Permanent permanent : game.getBattlefield().getAllActivePermanents(this.getControllerId())) { - if (permanent.getColor(game).isRed()) { - youControlRedPermanent = true; - break; - } - } - if (youControlRedPermanent) { - getEffects().get(0).setTargetPointer(new FixedTarget(event.getPlayerId())); - return true; - } + getEffects().get(0).setTargetPointer(new FixedTarget(event.getPlayerId())); + return true; } return false; } @@ -112,4 +118,3 @@ class KederektParasiteTriggeredAbility extends TriggeredAbilityImpl { return "Whenever an opponent draws a card, if you control a red permanent, you may have {this} deal 1 damage to that player."; } } - From 954237e5ffc0e74cc5927f30960101d2452b2d62 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 14 May 2018 12:01:34 -0400 Subject: [PATCH 155/158] fixed Stench of Decay shrinking artifacts rather than nonartifacts --- Mage.Sets/src/mage/cards/s/StenchOfDecay.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/s/StenchOfDecay.java b/Mage.Sets/src/mage/cards/s/StenchOfDecay.java index 8dc04666b67..a640a9432e7 100644 --- a/Mage.Sets/src/mage/cards/s/StenchOfDecay.java +++ b/Mage.Sets/src/mage/cards/s/StenchOfDecay.java @@ -34,6 +34,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; /** @@ -45,7 +46,7 @@ public class StenchOfDecay extends CardImpl { private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Nonartifact creatures"); static { - filter.add(new CardTypePredicate(CardType.ARTIFACT)); + filter.add(Predicates.not(new CardTypePredicate(CardType.ARTIFACT))); } public StenchOfDecay(UUID ownerId, CardSetInfo setInfo) { From 9b53aebab82224ebef76d843f058fc59c17d93f1 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 14 May 2018 12:24:39 -0400 Subject: [PATCH 156/158] fixed Elemental Appeal not properly pumping tokens it creates --- .../src/mage/cards/e/ElementalAppeal.java | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/Mage.Sets/src/mage/cards/e/ElementalAppeal.java b/Mage.Sets/src/mage/cards/e/ElementalAppeal.java index 2f277c5f724..0071b499bd7 100644 --- a/Mage.Sets/src/mage/cards/e/ElementalAppeal.java +++ b/Mage.Sets/src/mage/cards/e/ElementalAppeal.java @@ -27,20 +27,25 @@ */ package mage.cards.e; +import java.util.ArrayList; +import java.util.List; import java.util.UUID; +import mage.MageObject; import mage.abilities.Ability; -import mage.abilities.condition.LockedInCondition; import mage.abilities.condition.common.KickedCondition; -import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; -import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.common.continuous.BoostAllEffect; import mage.abilities.keyword.KickerAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicate; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardIdPredicate; import mage.game.Game; import mage.game.permanent.token.ElementalAppealElementalToken; @@ -56,13 +61,8 @@ public class ElementalAppeal extends CardImpl { // Kicker {5} this.addAbility(new KickerAbility("{5}")); - // Create a 7/1 red Elemental creature token with trample and haste. Exile it at the beginning of the next end step. + // Create a 7/1 red Elemental creature token with trample and haste. Exile it at the beginning of the next end step. If Elemental Appeal was kicked, that creature gets +7/+0 until end of turn. this.getSpellAbility().addEffect(new ElementalAppealEffect()); - // If Elemental Appeal was kicked, that creature gets +7/+0 until end of turn. - this.getSpellAbility().addEffect(new ConditionalContinuousEffect( - new BoostTargetEffect(7, 0, Duration.EndOfTurn), - new LockedInCondition(KickedCondition.instance), - "if this spell was kicked, that creature gets +7/+0 until end of turn")); } public ElementalAppeal(final ElementalAppeal card) { @@ -79,7 +79,9 @@ class ElementalAppealEffect extends OneShotEffect { public ElementalAppealEffect() { super(Outcome.PutCreatureInPlay); - this.staticText = "Create a 7/1 red Elemental creature token with trample and haste. Exile it at the beginning of the next end step"; + this.staticText = "Create a 7/1 red Elemental creature token with trample and haste. " + + "Exile it at the beginning of the next end step. " + + "If this spell was kicked, that creature gets +7/+0 until end of turn"; } public ElementalAppealEffect(final ElementalAppealEffect effect) { @@ -93,10 +95,20 @@ class ElementalAppealEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - CreateTokenEffect effect = new CreateTokenEffect(new ElementalAppealElementalToken()); if (effect.apply(game, source)) { effect.exileTokensCreatedAtNextEndStep(game, source); + if (KickedCondition.instance.apply(game, source)) { + List> predList = new ArrayList<>(); + for (UUID tokenId : effect.getLastAddedTokenIds()) { + predList.add(new CardIdPredicate(tokenId)); + } + if (predList.size() > 0) { + FilterCreaturePermanent filter = new FilterCreaturePermanent(); + filter.add(Predicates.or(predList)); + game.addEffect(new BoostAllEffect(7, 0, Duration.EndOfTurn, filter, false), source); + } + } return true; } return false; From 211f36c3cd04ed868582fb3845841e1eda5c4da3 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 14 May 2018 12:40:18 -0400 Subject: [PATCH 157/158] fixed Myriad Landscape being able to get Wastes --- .../src/mage/cards/m/MyriadLandscape.java | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/Mage.Sets/src/mage/cards/m/MyriadLandscape.java b/Mage.Sets/src/mage/cards/m/MyriadLandscape.java index 939093f34fc..0081bcd4e28 100644 --- a/Mage.Sets/src/mage/cards/m/MyriadLandscape.java +++ b/Mage.Sets/src/mage/cards/m/MyriadLandscape.java @@ -27,6 +27,7 @@ */ package mage.cards.m; +import java.util.ArrayList; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.common.SimpleActivatedAbility; @@ -44,13 +45,19 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; import mage.filter.FilterCard; -import mage.filter.StaticFilters; import mage.game.Game; import mage.target.common.TargetCardInLibrary; import mage.util.SubTypeList; import java.util.Iterator; +import java.util.List; import java.util.UUID; +import mage.MageObject; +import mage.constants.SuperType; +import mage.filter.predicate.Predicate; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.filter.predicate.mageobject.SupertypePredicate; /** * @@ -59,7 +66,7 @@ import java.util.UUID; public class MyriadLandscape extends CardImpl { public MyriadLandscape(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.LAND},""); + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Myriad Landscape enters the battlefield tapped. this.addAbility(new EntersBattlefieldTappedAbility()); @@ -68,14 +75,13 @@ public class MyriadLandscape extends CardImpl { this.addAbility(new ColorlessManaAbility()); // {2}, {tap}, Sacrifice Myriad Landscape: Search your library for up to two basic land cards that share a land type, put them onto the battlefield tapped, then shuffle your library. - Effect effect = new SearchLibraryPutInPlayEffect(new TargetCardInLibrarySharingLandType(0, 2, StaticFilters.FILTER_BASIC_LAND_CARD), true); + Effect effect = new SearchLibraryPutInPlayEffect(new TargetCardInLibrarySharingLandType(0, 2), true); effect.setText("Search your library for up to two basic land cards that share a land type, put them onto the battlefield tapped, then shuffle your library"); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new GenericManaCost(2)); ability.addCost(new TapSourceCost()); ability.addCost(new SacrificeSourceCost()); this.addAbility(ability); - } public MyriadLandscape(final MyriadLandscape card) { @@ -90,7 +96,18 @@ public class MyriadLandscape extends CardImpl { class TargetCardInLibrarySharingLandType extends TargetCardInLibrary { - public TargetCardInLibrarySharingLandType(int minNumTargets, int maxNumTargets, FilterCard filter) { + private static final FilterCard filter = new FilterCard("basic land card"); + + static { + List> subTypePreds = new ArrayList<>(); + for (SubType landType : SubType.getLandTypes(false)) { + subTypePreds.add(new SubtypePredicate(landType)); + } + filter.add(Predicates.or(subTypePreds)); + filter.add(new SupertypePredicate(SuperType.BASIC)); + } + + public TargetCardInLibrarySharingLandType(int minNumTargets, int maxNumTargets) { super(minNumTargets, maxNumTargets, filter); } @@ -104,7 +121,7 @@ class TargetCardInLibrarySharingLandType extends TargetCardInLibrary { if (!getTargets().isEmpty()) { // check if new target shares a Land Type SubTypeList landTypes = new SubTypeList(); - for (UUID landId: getTargets()) { + for (UUID landId : getTargets()) { Card landCard = game.getCard(landId); if (landCard != null) { if (landTypes.isEmpty()) { @@ -130,7 +147,6 @@ class TargetCardInLibrarySharingLandType extends TargetCardInLibrary { } return false; } - @Override public TargetCardInLibrarySharingLandType copy() { From 342b4486e86a725e56da592975466aaac5e4321b Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 14 May 2018 13:53:09 -0400 Subject: [PATCH 158/158] fixed Damping Sphere not reducing sources of conditional mana (such as Eldrazi Temple and Mishra's Workshop) --- .../AddConditionalColorlessManaEffect.java | 37 +------------------ .../mana/AddConditionalManaEffect.java | 3 ++ 2 files changed, 5 insertions(+), 35 deletions(-) diff --git a/Mage/src/main/java/mage/abilities/effects/mana/AddConditionalColorlessManaEffect.java b/Mage/src/main/java/mage/abilities/effects/mana/AddConditionalColorlessManaEffect.java index 057985a45b9..7a2822f2f8b 100644 --- a/Mage/src/main/java/mage/abilities/effects/mana/AddConditionalColorlessManaEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/mana/AddConditionalColorlessManaEffect.java @@ -6,57 +6,24 @@ package mage.abilities.effects.mana; import mage.Mana; -import mage.abilities.Ability; -import mage.abilities.effects.common.ManaEffect; import mage.abilities.mana.builder.ConditionalManaBuilder; -import mage.game.Game; -import mage.players.Player; /** * * @author LevelX2 */ -public class AddConditionalColorlessManaEffect extends ManaEffect { - - private final int amount; - private final ConditionalManaBuilder manaBuilder; +public class AddConditionalColorlessManaEffect extends AddConditionalManaEffect { public AddConditionalColorlessManaEffect(int amount, ConditionalManaBuilder manaBuilder) { - super(); - this.amount = amount; - this.manaBuilder = manaBuilder; - - staticText = "Add " + String.format(String.format("%%%ds", amount), " ").replace(" ", "{C}") - + ". " + manaBuilder.getRule(); + super(Mana.ColorlessMana(amount), manaBuilder); } public AddConditionalColorlessManaEffect(final AddConditionalColorlessManaEffect effect) { super(effect); - this.amount = effect.amount; - this.manaBuilder = effect.manaBuilder; } @Override public AddConditionalColorlessManaEffect copy() { return new AddConditionalColorlessManaEffect(this); } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - controller.getManaPool().addMana(getMana(game, source), game, source); - return true; - } - return false; - } - - @Override - public Mana produceMana(boolean netMana, Game game, Ability source) { - return manaBuilder.setMana(Mana.ColorlessMana(amount), source, game).build(); - } - - public Mana getMana() { - return Mana.ColorlessMana(amount); - } } diff --git a/Mage/src/main/java/mage/abilities/effects/mana/AddConditionalManaEffect.java b/Mage/src/main/java/mage/abilities/effects/mana/AddConditionalManaEffect.java index d8e4bca5884..3ee00370fff 100644 --- a/Mage/src/main/java/mage/abilities/effects/mana/AddConditionalManaEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/mana/AddConditionalManaEffect.java @@ -54,4 +54,7 @@ public class AddConditionalManaEffect extends ManaEffect { return manaBuilder.setMana(mana, source, game).build(); } + public Mana getMana() { + return mana; + } }

    7( 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 From 7b4ca412b877365095b4f8db48886846414a1bd3 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 8 May 2018 10:30:51 +0200 Subject: [PATCH 089/158] * Grab The Reins - Fixed Sacrifice bug (fixes #4912). --- Mage.Sets/src/mage/cards/g/GrabTheReins.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/g/GrabTheReins.java b/Mage.Sets/src/mage/cards/g/GrabTheReins.java index 6bae8aa5c61..ab3b3bcddd0 100644 --- a/Mage.Sets/src/mage/cards/g/GrabTheReins.java +++ b/Mage.Sets/src/mage/cards/g/GrabTheReins.java @@ -46,6 +46,7 @@ import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.Target; import mage.target.common.TargetAnyTarget; +import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetCreaturePermanent; /** @@ -107,7 +108,7 @@ class GrabTheReinsEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { UUID controllerId = source.getControllerId(); - Target target = new TargetCreaturePermanent(); + Target target = new TargetControlledCreaturePermanent(); target.setNotTarget(true); target.setTargetName("a creature to sacrifice"); if (!target.canChoose(source.getSourceId(), controllerId, game)) { From df987049c06d8e12eabb9cc2706c87a06cd78df8 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 8 May 2018 18:01:15 +0200 Subject: [PATCH 090/158] * Fixed some card movement (fixes #4910). --- .../src/mage/cards/a/AbbotOfKeralKeep.java | 4 +- Mage.Sets/src/mage/cards/a/Abundance.java | 3 +- Mage.Sets/src/mage/cards/a/ActOnImpulse.java | 70 ++++++++----------- Mage.Sets/src/mage/cards/a/AdNauseam.java | 2 +- Mage.Sets/src/mage/cards/a/AerialCaravan.java | 4 +- .../src/mage/cards/a/AethermagesTouch.java | 52 ++++++-------- Mage.Sets/src/mage/cards/a/AladdinsLamp.java | 62 ++++++---------- .../src/mage/cards/a/AncestralKnowledge.java | 56 +++++---------- .../src/mage/cards/a/AncestralMemories.java | 38 +++------- .../src/mage/cards/a/ArchitectsOfWill.java | 16 ++--- Mage.Sets/src/mage/cards/a/AshnodsCylix.java | 36 +++------- Mage.Sets/src/mage/cards/a/AuguryAdept.java | 13 ++-- Mage.Sets/src/mage/cards/b/BalustradeSpy.java | 23 +++--- .../src/mage/cards/b/BitterRevelation.java | 42 ++++------- .../mage/cards/b/BlessedReincarnation.java | 62 +++++++--------- .../src/mage/cards/b/BreathstealersCrypt.java | 33 ++++----- Mage.Sets/src/mage/cards/b/Browse.java | 29 +++----- .../src/mage/cards/c/ChandraPyromaster.java | 2 +- .../src/mage/cards/c/ChaosHarlequin.java | 6 +- Mage.Sets/src/mage/cards/c/CloneShell.java | 53 +++++--------- .../src/mage/cards/c/ColfenorsPlans.java | 24 ++++--- .../src/mage/cards/c/CommuneWithTheGods.java | 46 ++++-------- .../src/mage/cards/c/ConsumingAberration.java | 23 +++--- .../src/mage/cards/c/ConundrumSphinx.java | 4 +- .../src/mage/cards/c/CountrysideCrusher.java | 7 +- .../src/mage/cards/d/DemonicConsultation.java | 3 +- Mage.Sets/src/mage/cards/d/DiviningWitch.java | 3 +- Mage.Sets/src/mage/cards/f/FathomTrawl.java | 5 +- .../src/mage/cards/g/GoblinCharbelcher.java | 21 +++--- Mage.Sets/src/mage/cards/h/HeirloomBlade.java | 7 +- Mage.Sets/src/mage/cards/o/OathOfDruids.java | 34 +++++---- Mage.Sets/src/mage/cards/p/ProteusStaff.java | 3 +- .../src/mage/cards/r/RiptideShapeshifter.java | 3 +- .../src/mage/cards/s/ShiftingShadow.java | 9 ++- .../src/mage/cards/s/SpoilsOfTheVault.java | 5 +- .../java/org/mage/test/player/TestPlayer.java | 20 ++++++ .../java/org/mage/test/stub/PlayerStub.java | 20 ++++++ Mage/src/main/java/mage/cards/CardsImpl.java | 6 ++ Mage/src/main/java/mage/players/Library.java | 42 ++++++----- Mage/src/main/java/mage/players/Player.java | 27 +++++++ .../main/java/mage/players/PlayerImpl.java | 41 ++++++++--- .../target/targetpointer/FixedTargets.java | 10 +++ Mage/src/main/java/mage/util/CardUtil.java | 60 ++++++++++------ 43 files changed, 481 insertions(+), 548 deletions(-) diff --git a/Mage.Sets/src/mage/cards/a/AbbotOfKeralKeep.java b/Mage.Sets/src/mage/cards/a/AbbotOfKeralKeep.java index 688697154bf..6f031ca861d 100644 --- a/Mage.Sets/src/mage/cards/a/AbbotOfKeralKeep.java +++ b/Mage.Sets/src/mage/cards/a/AbbotOfKeralKeep.java @@ -52,7 +52,7 @@ import mage.target.targetpointer.FixedTarget; public class AbbotOfKeralKeep extends CardImpl { public AbbotOfKeralKeep(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.MONK); this.power = new MageInt(2); @@ -97,7 +97,7 @@ class AbbotOfKeralKeepExileEffect extends OneShotEffect { Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); if (sourcePermanent != null && controller != null && controller.getLibrary().hasCards()) { Library library = controller.getLibrary(); - Card card = library.removeFromTop(game); + Card card = library.getFromTop(game); if (card != null) { String exileName = sourcePermanent.getIdName() + " "; controller.moveCardsToExile(card, source, game, true, source.getSourceId(), exileName); diff --git a/Mage.Sets/src/mage/cards/a/Abundance.java b/Mage.Sets/src/mage/cards/a/Abundance.java index e234a73be4a..b29a7f461ce 100644 --- a/Mage.Sets/src/mage/cards/a/Abundance.java +++ b/Mage.Sets/src/mage/cards/a/Abundance.java @@ -104,8 +104,7 @@ class AbundanceReplacementEffect extends ReplacementEffectImpl { } Cards toReveal = new CardsImpl(); Card selectedCard = null; - while (controller.getLibrary().hasCards()) { - Card card = controller.getLibrary().removeFromTop(game); + for (Card card : controller.getLibrary().getCards(game)) { toReveal.add(card); if (filter.match(card, source.getSourceId(), source.getControllerId(), game)) { selectedCard = card; diff --git a/Mage.Sets/src/mage/cards/a/ActOnImpulse.java b/Mage.Sets/src/mage/cards/a/ActOnImpulse.java index 8f45324b184..d03aa7e837b 100644 --- a/Mage.Sets/src/mage/cards/a/ActOnImpulse.java +++ b/Mage.Sets/src/mage/cards/a/ActOnImpulse.java @@ -27,19 +27,21 @@ */ package mage.cards.a; -import java.util.ArrayList; -import java.util.List; +import java.util.HashSet; +import java.util.Set; import java.util.UUID; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.AsThoughEffectImpl; +import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; import mage.game.Game; -import mage.players.Library; import mage.players.Player; +import mage.target.targetpointer.FixedTargets; /** * @@ -48,8 +50,7 @@ import mage.players.Player; public class ActOnImpulse extends CardImpl { public ActOnImpulse(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{2}{R}"); - + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{R}"); // Exile the top three cards of your library. Until end of turn, you may play cards exiled this way. this.getSpellAbility().addEffect(new ActOnImpulseExileEffect()); @@ -66,12 +67,12 @@ public class ActOnImpulse extends CardImpl { } class ActOnImpulseExileEffect extends OneShotEffect { - + public ActOnImpulseExileEffect() { super(Outcome.Benefit); this.staticText = "Exile the top three cards of your library. Until end of turn, you may play cards exiled this way."; } - + public ActOnImpulseExileEffect(final ActOnImpulseExileEffect effect) { super(effect); } @@ -80,69 +81,58 @@ class ActOnImpulseExileEffect extends OneShotEffect { public ActOnImpulseExileEffect copy() { return new ActOnImpulseExileEffect(this); } - + @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - Library library = controller.getLibrary(); - List cards = new ArrayList<>(); - int count = Math.min(3, library.size()); - for (int i = 0; i < count; i++) { - Card card = library.removeFromTop(game); - if (card != null) { - cards.add(card); - } - } + MageObject sourceObject = game.getObject(source.getSourceId()); + if (controller != null && sourceObject != null) { + Set cards = new HashSet<>(controller.getLibrary().getTopCards(game, 3)); if (!cards.isEmpty()) { - List cardsId = new ArrayList<>(); + controller.moveCardsToExile(cards, source, game, true, source.getSourceId(), sourceObject.getIdName()); + // remove cards that could not be moved to exile for (Card card : cards) { - card.moveToExile(source.getSourceId(), "Act on Impulse", source.getSourceId(), game); - cardsId.add(card.getId()); + if (!Zone.EXILED.equals(game.getState().getZone(card.getId()))) { + cards.remove(card); + } + } + if (!cards.isEmpty()) { + ContinuousEffect effect = new ActOnImpulseMayPlayExiledEffect(); + effect.setTargetPointer(new FixedTargets(cards, game)); + game.addEffect(effect, source); } - game.addEffect(new ActOnImpulseMayPlayExiledEffect(cardsId), source); } return true; } return false; } - + } class ActOnImpulseMayPlayExiledEffect extends AsThoughEffectImpl { - public List cards = new ArrayList<>(); - - public ActOnImpulseMayPlayExiledEffect(List cards) { + public ActOnImpulseMayPlayExiledEffect() { super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.EndOfTurn, Outcome.Benefit); - this.cards.addAll(cards); } - + public ActOnImpulseMayPlayExiledEffect(final ActOnImpulseMayPlayExiledEffect effect) { super(effect); - this.cards.addAll(effect.cards); } @Override public ActOnImpulseMayPlayExiledEffect copy() { return new ActOnImpulseMayPlayExiledEffect(this); } - + @Override public boolean apply(Game game, Ability source) { return true; } @Override - public boolean applies(UUID sourceId, Ability source, UUID affectedControllerId, Game game) { - Card card = game.getCard(sourceId); - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null && card != null && game.getState().getZone(sourceId) == Zone.EXILED) { - if (cards.contains(sourceId)) { - return true; - } - } - return false; + public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { + return affectedControllerId.equals(source.getControllerId()) + && getTargetPointer().getTargets(game, source).contains(objectId); } - + } diff --git a/Mage.Sets/src/mage/cards/a/AdNauseam.java b/Mage.Sets/src/mage/cards/a/AdNauseam.java index dbe8a9c7f4d..9677fdd14e9 100644 --- a/Mage.Sets/src/mage/cards/a/AdNauseam.java +++ b/Mage.Sets/src/mage/cards/a/AdNauseam.java @@ -87,7 +87,7 @@ class AdNauseamEffect extends OneShotEffect { return false; } while (controller.chooseUse(outcome, message, source, game) && controller.getLibrary().hasCards()) { - Card card = controller.getLibrary().removeFromTop(game); + Card card = controller.getLibrary().getFromTop(game); if (card != null) { controller.moveCards(card, Zone.HAND, source, game); int cmc = card.getConvertedManaCost(); diff --git a/Mage.Sets/src/mage/cards/a/AerialCaravan.java b/Mage.Sets/src/mage/cards/a/AerialCaravan.java index c9961f8e3a6..c1482249cec 100644 --- a/Mage.Sets/src/mage/cards/a/AerialCaravan.java +++ b/Mage.Sets/src/mage/cards/a/AerialCaravan.java @@ -35,7 +35,6 @@ import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.AsThoughEffectImpl; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; -import mage.constants.SubType; import mage.abilities.keyword.FlyingAbility; import mage.cards.Card; import mage.cards.CardImpl; @@ -44,6 +43,7 @@ import mage.constants.AsThoughEffectType; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; +import mage.constants.SubType; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Library; @@ -103,7 +103,7 @@ class AerialCaravanExileEffect extends OneShotEffect { Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); if (sourcePermanent != null && controller != null && controller.getLibrary().hasCards()) { Library library = controller.getLibrary(); - Card card = library.removeFromTop(game); + Card card = library.getFromTop(game); if (card != null) { String exileName = sourcePermanent.getIdName() + " "; controller.moveCardsToExile(card, source, game, true, source.getSourceId(), exileName); diff --git a/Mage.Sets/src/mage/cards/a/AethermagesTouch.java b/Mage.Sets/src/mage/cards/a/AethermagesTouch.java index a2d62f2dede..3dbef178a16 100644 --- a/Mage.Sets/src/mage/cards/a/AethermagesTouch.java +++ b/Mage.Sets/src/mage/cards/a/AethermagesTouch.java @@ -28,6 +28,7 @@ package mage.cards.a; import java.util.UUID; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.BeginningOfEndStepTriggeredAbility; import mage.abilities.effects.ContinuousEffect; @@ -38,6 +39,7 @@ import mage.cards.*; import mage.constants.*; import mage.filter.common.FilterCreatureCard; import mage.game.Game; +import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.TargetCard; import mage.target.targetpointer.FixedTarget; @@ -49,8 +51,7 @@ import mage.target.targetpointer.FixedTarget; public class AethermagesTouch extends CardImpl { public AethermagesTouch(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{2}{W}{U}"); - + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{W}{U}"); // Reveal the top four cards of your library. You may put a creature card from among them onto the battlefield. It gains "At the beginning of your end step, return this creature to its owner's hand." Then put the rest of the cards revealed this way on the bottom of your library in any order. this.getSpellAbility().addEffect(new AethermagesTouchEffect()); @@ -65,12 +66,11 @@ public class AethermagesTouch extends CardImpl { return new AethermagesTouch(this); } } + class AethermagesTouchEffect extends OneShotEffect { - private static final FilterCreatureCard filterPutOntoBattlefield = new FilterCreatureCard("a creature card to put onto the battlefield"); - public AethermagesTouchEffect() { - super(Outcome.DrawCard); + super(Outcome.PutCardInPlay); this.staticText = "Reveal the top four cards of your library. You may put a creature card from among them onto the battlefield. It gains \"At the beginning of your end step, return this creature to its owner's hand.\" Then put the rest of the cards revealed this way on the bottom of your library in any order"; } @@ -85,40 +85,32 @@ class AethermagesTouchEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player != null) { - Cards cards = new CardsImpl(); - - boolean properCardFound = false; - int count = Math.min(player.getLibrary().size(), 4); - for (int i = 0; i < count; i++) { - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - if (filterPutOntoBattlefield.match(card, source.getSourceId(), source.getControllerId(), game)) { - properCardFound = true; - } - } - } - + Player controller = game.getPlayer(source.getControllerId()); + MageObject sourceObject = game.getObject(source.getSourceId()); + if (controller != null && sourceObject != null) { + Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, 4)); if (!cards.isEmpty()) { - player.revealCards("Aethermage's Touch", cards, game); - TargetCard target = new TargetCard(Zone.LIBRARY, filterPutOntoBattlefield); - if (properCardFound && player.choose(Outcome.PutCreatureInPlay, cards, target, game)) { + FilterCreatureCard filter = new FilterCreatureCard("a creature card to put onto the battlefield"); + controller.revealCards(sourceObject.getIdName(), cards, game); + TargetCard target = new TargetCard(Zone.LIBRARY, filter); + if (cards.count(filter, game) > 0 && controller.choose(outcome, cards, target, game)) { Card card = game.getCard(target.getFirstTarget()); if (card != null) { cards.remove(card); - if (card.putOntoBattlefield(game, Zone.LIBRARY, source.getSourceId(), source.getControllerId())) { + if (controller.moveCards(card, Zone.BATTLEFIELD, source, game)) { // It gains \"At the beginning of your end step, return this creature to its owner's hand.\" - Ability ability = new BeginningOfEndStepTriggeredAbility(Zone.BATTLEFIELD, new ReturnToHandSourceEffect(true), TargetController.YOU, null, false); - ContinuousEffect effect = new GainAbilityTargetEffect(ability, Duration.Custom); - effect.setTargetPointer(new FixedTarget(card.getId())); - game.addEffect(effect, source); + Permanent permanent = game.getPermanent(card.getId()); + if (permanent != null) { + Ability ability = new BeginningOfEndStepTriggeredAbility(Zone.BATTLEFIELD, new ReturnToHandSourceEffect(true), TargetController.YOU, null, false); + ContinuousEffect effect = new GainAbilityTargetEffect(ability, Duration.Custom); + effect.setTargetPointer(new FixedTarget(permanent, game)); + game.addEffect(effect, source); + } } } } - player.putCardsOnBottomOfLibrary(cards, game, source, true); + controller.putCardsOnBottomOfLibrary(cards, game, source, true); } return true; diff --git a/Mage.Sets/src/mage/cards/a/AladdinsLamp.java b/Mage.Sets/src/mage/cards/a/AladdinsLamp.java index cc5864cf6d7..bf70fa15571 100644 --- a/Mage.Sets/src/mage/cards/a/AladdinsLamp.java +++ b/Mage.Sets/src/mage/cards/a/AladdinsLamp.java @@ -51,15 +51,14 @@ import mage.target.TargetCard; public class AladdinsLamp extends CardImpl { public AladdinsLamp(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{10}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{10}"); - // {X}, {tap}: The next time you would draw a card this turn, instead look at the top X cards of your library, put all but one of them on the bottom of your library in a random order, then draw a card. X can't be 0. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AladdinsLampEffect(), new ManaCostsImpl("{X}")); + // {X}, {T}: The next time you would draw a card this turn, instead look at the top X cards of your library, put all but one of them on the bottom of your library in a random order, then draw a card. X can't be 0. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AladdinsLampEffect(), new ManaCostsImpl("{X}")); ability.addCost(new TapSourceCost()); this.addAbility(ability); - + } - public AladdinsLamp(final AladdinsLamp card) { super(card); @@ -88,53 +87,32 @@ class AladdinsLampEffect extends ReplacementEffectImpl { } @Override - public boolean replaceEvent(GameEvent event, Ability source, Game game) { - Player player = game.getPlayer(source.getControllerId()); - if (player == null) { + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { return false; } - Cards cards = new CardsImpl(); - int count = source.getManaCostsToPay().getX(); - count = Math.min(player.getLibrary().size(), count); - for (int i = 0; i < count; i++) { - Card card = player.getLibrary().removeFromTop(game);// I'd like to use .getTopCards(game, count), but it returns a set which I dunno how to work with and would break the copied code adding to effort/time; - if (card != null) { - cards.add(card); - } + Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, source.getManaCostsToPay().getX())); + controller.lookAtCards(source, null, cards, game); + TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCard("card to stay at the top of library")); + if (controller.choose(outcome, cards, target, game)) { + cards.remove(target.getFirstTarget()); } - player.lookAtCards("Aladdin's Lamp", cards, game); - - TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCard()); - - if (player.choose(outcome, cards, target, game)) { - Card card = cards.get(target.getFirstTarget(), game); - if (card != null) { - cards.remove(card); - card.moveToZone(Zone.HAND, source.getSourceId(), game, false); - } - } - - - // Put the rest on the bottom of your library in a random order - while (!cards.isEmpty()) { - Card card = cards.getRandom(game); - if (card != null) { - cards.remove(card); - card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, false); - } - } - //player.drawCards(1, game); // Technically I should move it to the top and then draw but, I cant confirm that flag above refers to bottom of library + controller.putCardsOnBottomOfLibrary(cards, game, source, false); + game.applyEffects(); + controller.drawCards(1, game, event.getAppliedEffects()); + discard(); return true; } - + @Override public boolean checksEventType(GameEvent event, Game game) { return event.getType() == GameEvent.EventType.DRAW_CARD; - } - + } + @Override public boolean applies(GameEvent event, Ability source, Game game) { return source.getControllerId().equals(event.getPlayerId()); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/a/AncestralKnowledge.java b/Mage.Sets/src/mage/cards/a/AncestralKnowledge.java index b83b8a15e74..3ce6ce1345f 100644 --- a/Mage.Sets/src/mage/cards/a/AncestralKnowledge.java +++ b/Mage.Sets/src/mage/cards/a/AncestralKnowledge.java @@ -51,15 +51,14 @@ import mage.target.TargetCard; public class AncestralKnowledge extends CardImpl { public AncestralKnowledge(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{U}"); - + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}"); // Cumulative upkeep {1} this.addAbility(new CumulativeUpkeepAbility(new ManaCostsImpl<>("{1}"))); - + // When Ancestral Knowledge enters the battlefield, look at the top ten cards of your library, then exile any number of them and put the rest back on top of your library in any order. this.addAbility(new EntersBattlefieldTriggeredAbility(new AncestralKnowledgeEffect())); - + // When Ancestral Knowledge leaves the battlefield, shuffle your library. this.addAbility(new LeavesBattlefieldTriggeredAbility(new ShuffleLibrarySourceEffect(), false)); } @@ -75,53 +74,34 @@ public class AncestralKnowledge extends CardImpl { } class AncestralKnowledgeEffect extends OneShotEffect { - + AncestralKnowledgeEffect() { super(Outcome.Benefit); this.staticText = "look at the top ten cards of your library, then exile any number of them and put the rest back on top of your library in any order"; } - + AncestralKnowledgeEffect(final AncestralKnowledgeEffect effect) { super(effect); } - + @Override public AncestralKnowledgeEffect copy() { return new AncestralKnowledgeEffect(this); } - + @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player != null) { - int numCards = Math.min(10, player.getLibrary().size()); - if (numCards > 0) { - Cards cards = new CardsImpl(); - for (int i = 0; i < numCards; i++) { - cards.add(player.getLibrary().removeFromTop(game)); - } - TargetCard target = new TargetCard(0, numCards, Zone.LIBRARY, new FilterCard("cards to exile")); - player.choose(Outcome.Exile, cards, target, game); - for (UUID cardId : target.getTargets()) { - Card card = cards.get(cardId, game); - if (card != null) { - player.moveCardToExileWithInfo(card, null, "", source.getSourceId(), game, Zone.LIBRARY, true); - cards.remove(card); - } - } - while (cards.size() > 1) { - target = new TargetCard(1, Zone.LIBRARY, new FilterCard("card to put on top of library (last put is first drawn)")); - player.choose(Outcome.Benefit, cards, target, game); - Card card = cards.get(target.getFirstTarget(), game); - player.moveCardToLibraryWithInfo(card, source.getSourceId(), game, Zone.LIBRARY, true, false); - cards.remove(card); - } - if (cards.size() == 1) { - Card card = cards.get(cards.iterator().next(), game); - if (card != null) { - player.moveCardToLibraryWithInfo(card, source.getSourceId(), game, Zone.LIBRARY, true, false); - } - } + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, 10)); + if (cards.size() > 0) { + controller.lookAtCards(source, null, cards, game); + TargetCard target = new TargetCard(0, Integer.MAX_VALUE, Zone.LIBRARY, new FilterCard("cards to exile")); + controller.choose(Outcome.Exile, cards, target, game); + Cards toExile = new CardsImpl(target.getTargets()); + controller.moveCards(toExile, Zone.EXILED, source, game); + cards.removeAll(toExile); + controller.putCardsOnTopOfLibrary(cards, game, source, true); } return true; } diff --git a/Mage.Sets/src/mage/cards/a/AncestralMemories.java b/Mage.Sets/src/mage/cards/a/AncestralMemories.java index 9dec2fdb8cc..f3511c3542f 100644 --- a/Mage.Sets/src/mage/cards/a/AncestralMemories.java +++ b/Mage.Sets/src/mage/cards/a/AncestralMemories.java @@ -27,6 +27,7 @@ */ package mage.cards.a; +import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.*; @@ -38,8 +39,6 @@ import mage.game.Game; import mage.players.Player; import mage.target.TargetCard; -import java.util.UUID; - /** * * @author Quercitron @@ -47,8 +46,7 @@ import java.util.UUID; public class AncestralMemories extends CardImpl { public AncestralMemories(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{2}{U}{U}{U}"); - + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{U}{U}{U}"); // Look at the top seven cards of your library. Put two of them into your hand and the rest into your graveyard. this.getSpellAbility().addEffect(new AncestralMemoriesEffect()); @@ -82,32 +80,18 @@ class AncestralMemoriesEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - - if (player != null) { - Cards cards = new CardsImpl(); - int cardsCount = Math.min(7, player.getLibrary().size()); - for (int i = 0; i < cardsCount; i++) { - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - } - } - + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, 7)); if (!cards.isEmpty()) { - player.lookAtCards("Ancestral Memories", cards, game); - + controller.lookAtCards(source, null, cards, game); TargetCard target = new TargetCard(Math.min(2, cards.size()), Zone.LIBRARY, new FilterCard("two cards to put in your hand")); - if (player.choose(Outcome.Benefit, cards, target, game)) { - for (UUID targetId : target.getTargets()) { - Card card = cards.get(targetId, game); - if (card != null) { - card.moveToZone(Zone.HAND, source.getSourceId(), game, false); - cards.remove(card); - } - } + if (controller.choose(Outcome.DrawCard, cards, target, game)) { + Cards toHand = new CardsImpl(target.getTargets()); + controller.moveCards(cards, Zone.HAND, source, game); + cards.removeAll(toHand); } - player.moveCards(cards, Zone.GRAVEYARD, source, game); + controller.moveCards(cards, Zone.GRAVEYARD, source, game); } return true; } diff --git a/Mage.Sets/src/mage/cards/a/ArchitectsOfWill.java b/Mage.Sets/src/mage/cards/a/ArchitectsOfWill.java index e8fab3707b0..443d7a7f876 100644 --- a/Mage.Sets/src/mage/cards/a/ArchitectsOfWill.java +++ b/Mage.Sets/src/mage/cards/a/ArchitectsOfWill.java @@ -49,7 +49,7 @@ import mage.target.TargetPlayer; public class ArchitectsOfWill extends CardImpl { public ArchitectsOfWill(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{2}{U}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{2}{U}{B}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WIZARD); @@ -95,19 +95,11 @@ class ArchitectsOfWillEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); Player targetPlayer = game.getPlayer(source.getFirstTarget()); - if (targetPlayer == null - || controller == null) { + if (targetPlayer == null || controller == null) { return false; } - Cards cards = new CardsImpl(); - int count = Math.min(targetPlayer.getLibrary().size(), 3); - for (int i = 0; i < count; i++) { - Card card = targetPlayer.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - } - } - controller.lookAtCards("Architects of Will", cards, game); + Cards cards = new CardsImpl(targetPlayer.getLibrary().getTopCards(game, 3)); + controller.lookAtCards(source, null, cards, game); controller.putCardsOnTopOfLibrary(cards, game, source, true); return true; } diff --git a/Mage.Sets/src/mage/cards/a/AshnodsCylix.java b/Mage.Sets/src/mage/cards/a/AshnodsCylix.java index 0615ee96b47..f57ce54bff6 100644 --- a/Mage.Sets/src/mage/cards/a/AshnodsCylix.java +++ b/Mage.Sets/src/mage/cards/a/AshnodsCylix.java @@ -30,7 +30,6 @@ package mage.cards.a; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.Cost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.OneShotEffect; @@ -44,9 +43,7 @@ import mage.constants.Outcome; import mage.constants.Zone; import mage.filter.FilterCard; import mage.game.Game; -import mage.game.permanent.Permanent; import mage.players.Player; -import mage.target.Target; import mage.target.TargetCard; import mage.target.TargetPlayer; @@ -57,7 +54,7 @@ import mage.target.TargetPlayer; public class AshnodsCylix extends CardImpl { public AshnodsCylix(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{2}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}"); // {3}, {T}: Target player looks at the top three cards of their library, puts one of them back on top of their library, then exiles the rest. SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AshnodsCylixEffect(), new GenericManaCost(3)); @@ -77,49 +74,38 @@ public class AshnodsCylix extends CardImpl { } class AshnodsCylixEffect extends OneShotEffect { - + AshnodsCylixEffect() { super(Outcome.Benefit); this.staticText = "Target player looks at the top three cards of their library, puts one of them back on top of their library, then exiles the rest"; } - + AshnodsCylixEffect(final AshnodsCylixEffect effect) { super(effect); } - + @Override public AshnodsCylixEffect copy() { return new AshnodsCylixEffect(this); } - + @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getFirstTarget()); + Player player = game.getPlayer(getTargetPointer().getFirst(game, source)); if (player == null) { return false; } - Cards cards = new CardsImpl(); - int count = Math.min(player.getLibrary().size(), 3); - for (int i = 0; i < count; i++) { - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - } - } - //~ player.revealCards(source.getSourceObject(game).getIdName(), cards, game); + Cards cards = new CardsImpl(player.getLibrary().getTopCards(game, 3)); + player.lookAtCards(source, null, cards, game); TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCard("card to put on top of your library")); - if (player.choose(Outcome.DrawCard, cards, target, game)) { + if (player.choose(Outcome.Benefit, cards, target, game)) { Card card = cards.get(target.getFirstTarget(), game); if (card != null) { cards.remove(card); - player.getLibrary().putOnTop(card, game); - game.informPlayers(source.getSourceObject(game).getIdName() + ": " + player.getLogName() + " puts a card on top of their library"); + game.informPlayers(source.getSourceObject(game).getIdName() + ": " + player.getLogName() + " puts a card back on top of their library"); } } - for (UUID cardId : cards) { - Card card = game.getCard(cardId); - card.moveToExile(null, "", source.getSourceId(), game); - } + player.moveCards(cards, Zone.EXILED, source, game); return true; } } diff --git a/Mage.Sets/src/mage/cards/a/AuguryAdept.java b/Mage.Sets/src/mage/cards/a/AuguryAdept.java index ac83ca62458..2a93b5a236d 100644 --- a/Mage.Sets/src/mage/cards/a/AuguryAdept.java +++ b/Mage.Sets/src/mage/cards/a/AuguryAdept.java @@ -29,7 +29,6 @@ package mage.cards.a; import java.util.UUID; import mage.MageInt; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; import mage.abilities.effects.OneShotEffect; @@ -48,7 +47,7 @@ import mage.players.Player; public class AuguryAdept extends CardImpl { public AuguryAdept(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{W/U}{W/U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W/U}{W/U}"); this.subtype.add(SubType.KITHKIN); this.subtype.add(SubType.WIZARD); @@ -87,22 +86,18 @@ class AuguryAdeptEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - MageObject sourceObject = game.getObject(source.getSourceId()); Player controller = game.getPlayer(source.getControllerId()); - if (controller == null || sourceObject == null) { + if (controller == null) { return false; } - Cards cards = new CardsImpl(); - Card card = controller.getLibrary().removeFromTop(game); + Card card = controller.getLibrary().getFromTop(game); if (card != null) { card.moveToZone(Zone.HAND, source.getSourceId(), game, true); - int cmc = card.getConvertedManaCost(); if (cmc > 0) { controller.gainLife(cmc, game, source); } - cards.add(card); - controller.revealCards(sourceObject.getName(), cards, game); + controller.revealCards(source, new CardsImpl(card), game); } return true; } diff --git a/Mage.Sets/src/mage/cards/b/BalustradeSpy.java b/Mage.Sets/src/mage/cards/b/BalustradeSpy.java index 3b9f2725573..c764d93e4af 100644 --- a/Mage.Sets/src/mage/cards/b/BalustradeSpy.java +++ b/Mage.Sets/src/mage/cards/b/BalustradeSpy.java @@ -29,7 +29,6 @@ package mage.cards.b; import java.util.UUID; import mage.MageInt; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.OneShotEffect; @@ -53,7 +52,7 @@ import mage.target.TargetPlayer; public class BalustradeSpy extends CardImpl { public BalustradeSpy(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}"); this.subtype.add(SubType.VAMPIRE, SubType.ROGUE); this.power = new MageInt(2); @@ -97,26 +96,20 @@ class BalustradeSpyEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(getTargetPointer().getFirst(game, source)); - MageObject sourceObject = source.getSourceObject(game); - if (controller == null || sourceObject == null) { + if (controller == null) { return false; } - CardsImpl cards = new CardsImpl(); - boolean landFound = false; - while (controller.getLibrary().hasCards() && !landFound) { - Card card = controller.getLibrary().removeFromTop(game); + CardsImpl toGraveyard = new CardsImpl(); + for (Card card : controller.getLibrary().getCards(game)) { if (card != null) { - cards.add(card); + toGraveyard.add(card); if (card.isLand()) { - landFound = true; + break; } } } - if (!cards.isEmpty()) { - controller.revealCards(sourceObject.getName(), cards, game); - controller.moveCards(cards, Zone.GRAVEYARD, source, game); - return true; - } + controller.revealCards(source, toGraveyard, game); + controller.moveCards(toGraveyard, Zone.GRAVEYARD, source, game); return true; } } diff --git a/Mage.Sets/src/mage/cards/b/BitterRevelation.java b/Mage.Sets/src/mage/cards/b/BitterRevelation.java index e93f564f622..230b15fb400 100644 --- a/Mage.Sets/src/mage/cards/b/BitterRevelation.java +++ b/Mage.Sets/src/mage/cards/b/BitterRevelation.java @@ -47,8 +47,7 @@ import mage.target.TargetCard; public class BitterRevelation extends CardImpl { public BitterRevelation(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{3}{B}"); - + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{B}"); // Look at the top four cards of your library. Put two of them into your hand and the rest into your graveyard. You lose 2 life. this.getSpellAbility().addEffect(new BitterRevelationEffect()); @@ -66,48 +65,35 @@ public class BitterRevelation extends CardImpl { } class BitterRevelationEffect extends OneShotEffect { - + BitterRevelationEffect() { super(Outcome.Benefit); this.staticText = "Look at the top four cards of your library. Put two of them into your hand and the rest into your graveyard"; } - + BitterRevelationEffect(final BitterRevelationEffect effect) { super(effect); } - + @Override public BitterRevelationEffect copy() { return new BitterRevelationEffect(this); } - + @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player != null) { - Cards cards = new CardsImpl(); - int cardsCount = Math.min(4, player.getLibrary().size()); - for (int i = 0; i < cardsCount; i++) { - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - } - } + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, 4)); if (!cards.isEmpty()) { - Cards cardsToHand = new CardsImpl(); - player.lookAtCards("Bitter Revelation", cards, game); + controller.lookAtCards(source, null, cards, game); TargetCard target = new TargetCard(Math.min(2, cards.size()), Zone.LIBRARY, new FilterCard("two cards to put in your hand")); - if (player.choose(Outcome.DrawCard, cards, target, game)) { - for (UUID targetId : target.getTargets()) { - Card card = cards.get(targetId, game); - if (card != null) { - cardsToHand.add(card); - cards.remove(card); - } - } + if (controller.choose(Outcome.DrawCard, cards, target, game)) { + Cards toHand = new CardsImpl(target.getTargets()); + controller.moveCards(toHand, Zone.HAND, source, game); + cards.removeAll(toHand); } - player.moveCards(cardsToHand, Zone.HAND, source, game); - player.moveCards(cards, Zone.GRAVEYARD, source, game); + controller.moveCards(cards, Zone.GRAVEYARD, source, game); } return true; } diff --git a/Mage.Sets/src/mage/cards/b/BlessedReincarnation.java b/Mage.Sets/src/mage/cards/b/BlessedReincarnation.java index b7bea59d2ad..012bf6fdd58 100644 --- a/Mage.Sets/src/mage/cards/b/BlessedReincarnation.java +++ b/Mage.Sets/src/mage/cards/b/BlessedReincarnation.java @@ -27,11 +27,9 @@ */ package mage.cards.b; -import java.util.Set; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.ExileTargetEffect; import mage.abilities.keyword.ReboundAbility; import mage.cards.*; import mage.constants.CardType; @@ -51,24 +49,22 @@ import mage.target.common.TargetCreaturePermanent; * @author fireshoes */ public class BlessedReincarnation extends CardImpl { - + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature an opponent controls"); - + static { filter.add(new ControllerPredicate(TargetController.OPPONENT)); } public BlessedReincarnation(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{3}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{U}"); - // Exile target creature an opponent controls. - this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); - this.getSpellAbility().addEffect(new ExileTargetEffect()); - + // Exile target creature an opponent controls. // That player reveals cards from the top of their library until a creature card is revealed. // The player puts that card onto the battlefield, then shuffles the rest into their library. this.getSpellAbility().addEffect(new BlessedReincarnationEffect()); - + this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); + // Rebound this.addAbility(new ReboundAbility()); } @@ -87,7 +83,7 @@ class BlessedReincarnationEffect extends OneShotEffect { public BlessedReincarnationEffect() { super(Outcome.PutCreatureInPlay); - this.staticText = "That player reveals cards from the top of their library until a creature card is revealed. The player puts that card onto the battlefield, then shuffles the rest into their library"; + this.staticText = "Exile target creature an opponent controls. That player reveals cards from the top of their library until a creature card is revealed. The player puts that card onto the battlefield, then shuffles the rest into their library"; } public BlessedReincarnationEffect(final BlessedReincarnationEffect effect) { @@ -101,37 +97,31 @@ class BlessedReincarnationEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(source.getFirstTarget()); - if (permanent == null) { - permanent = (Permanent) game.getLastKnownInformation(source.getFirstTarget(), Zone.BATTLEFIELD); - } + Player controller = game.getPlayer(source.getControllerId()); + Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (permanent != null && controller != null) { + controller.moveCards(permanent, Zone.EXILED, source, game); + game.applyEffects(); - if (permanent != null) { - Player player = game.getPlayer(permanent.getControllerId()); - if (player != null) { - Library library = player.getLibrary(); + Player permanentController = game.getPlayer(permanent.getControllerId()); + if (permanentController != null) { + Library library = permanentController.getLibrary(); if (library.hasCards()) { - Cards cards = new CardsImpl(); - Card card = library.removeFromTop(game); - cards.add(card); - while (!card.isCreature() && library.hasCards()) { - card = library.removeFromTop(game); - cards.add(card); + Cards toReveal = new CardsImpl(); + for (Card card : library.getCards(game)) { + toReveal.add(card); + if (card.isCreature()) { + permanentController.moveCards(card, Zone.BATTLEFIELD, source, game); + break; + } } - - if (card.isCreature()) { - card.putOntoBattlefield(game, Zone.LIBRARY, source.getSourceId(), player.getId()); - } - - if (!cards.isEmpty()) { - player.revealCards("BlessedReincarnation", cards, game); - Set cardsToShuffle = cards.getCards(game); - cardsToShuffle.remove(card); - library.addAll(cardsToShuffle, game); + permanentController.revealCards(source, toReveal, game); + if (toReveal.size() > 1) { + library.shuffle(); } } - return true; } + return true; } return false; } diff --git a/Mage.Sets/src/mage/cards/b/BreathstealersCrypt.java b/Mage.Sets/src/mage/cards/b/BreathstealersCrypt.java index c93450f6e33..94718a650a1 100644 --- a/Mage.Sets/src/mage/cards/b/BreathstealersCrypt.java +++ b/Mage.Sets/src/mage/cards/b/BreathstealersCrypt.java @@ -36,7 +36,6 @@ import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.cards.Cards; -import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; @@ -93,25 +92,27 @@ class BreathstealersCryptEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { Player player = game.getPlayer(event.getPlayerId()); - PayLifeCost cost = new PayLifeCost(3); if (player != null) { - Card cardDrawn = player.getLibrary().removeFromTop(game); - if (cardDrawn != null) { - player.moveCardToHandWithInfo(cardDrawn, source.getSourceId(), game); - Cards cards = new CardsImpl(); - cards.add(cardDrawn); - player.revealCards("The card drawn from " + player.getName() + "'s library", cards, game); - if (cardDrawn.isCreature()) { - game.informPlayers("The card drawn by " + player.getName() + " is a creature card. He/she must pay 3 life or that card gets discarded."); - if (cost.canPay(source, source.getSourceId(), player.getId(), game) - && player.chooseUse(outcome, "Do you wish to pay 3 life to keep the drawn creature card? If not, you discard it.", source, game)) { - return cost.pay(source, game, source.getSourceId(), player.getId(), true, cost); - } else { - game.informPlayers("The cost of 3 life was not paid by " + player.getName() + ", so the creature card will be discarded."); - return player.discard(cardDrawn, source, game); + Cards oldHand = player.getHand().copy(); + if (player.drawCards(1, game, event.getAppliedEffects()) > 0) { + Cards drawnCards = player.getHand().copy(); + drawnCards.removeAll(oldHand); + player.revealCards(source, "The card drawn from " + player.getName() + "'s library.", drawnCards, game); + for (Card cardDrawn : drawnCards.getCards(game)) { + if (cardDrawn.isCreature()) { + game.informPlayers("The card drawn by " + player.getName() + " is a creature card. He/she must pay 3 life or that card gets discarded."); + PayLifeCost cost = new PayLifeCost(3); + if (cost.canPay(source, source.getSourceId(), player.getId(), game) + && player.chooseUse(outcome, "Do you wish to pay 3 life to keep the card " + cardDrawn.getIdName() + "? If not, you discard it.", source, game)) { + cost.pay(source, game, source.getSourceId(), player.getId(), true, cost); + } else { + game.informPlayers("The cost of 3 life was not paid by " + player.getName() + ", so " + cardDrawn.getIdName() + " will be discarded."); + player.discard(cardDrawn, source, game); + } } } } + return true; } return false; } diff --git a/Mage.Sets/src/mage/cards/b/Browse.java b/Mage.Sets/src/mage/cards/b/Browse.java index 0a1e222e078..dd7ca439a9d 100644 --- a/Mage.Sets/src/mage/cards/b/Browse.java +++ b/Mage.Sets/src/mage/cards/b/Browse.java @@ -48,7 +48,7 @@ import mage.target.TargetCard; public class Browse extends CardImpl { public Browse(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{U}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}{U}"); // {2}{U}{U}: Look at the top five cards of your library, put one of them into your hand, and exile the rest. SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BrowseEffect(), new ManaCostsImpl("{2}{U}{U}")); @@ -83,33 +83,20 @@ class BrowseEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - - if (player != null) { - Cards cards = new CardsImpl(); - int cardsCount = Math.min(5, player.getLibrary().size()); - for (int i = 0; i < cardsCount; i++) { - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - } - } - + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, 5)); if (!cards.isEmpty()) { - player.lookAtCards("Browse", cards, game); - + controller.lookAtCards(source, null, cards, game); TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCard("card to put in your hand")); - if (player.choose(Outcome.Benefit, cards, target, game)) { + if (controller.choose(Outcome.Benefit, cards, target, game)) { Card card = cards.get(target.getFirstTarget(), game); if (card != null) { - card.moveToZone(Zone.HAND, source.getSourceId(), game, false); + controller.moveCards(card, Zone.HAND, source, game); cards.remove(card); } } - - for (Card card : cards.getCards(game)) { - card.moveToExile(null, null, source.getSourceId(), game); - } + controller.moveCards(cards, Zone.EXILED, source, game); } return true; } diff --git a/Mage.Sets/src/mage/cards/c/ChandraPyromaster.java b/Mage.Sets/src/mage/cards/c/ChandraPyromaster.java index 7ada58cf61a..75c5b5f59f8 100644 --- a/Mage.Sets/src/mage/cards/c/ChandraPyromaster.java +++ b/Mage.Sets/src/mage/cards/c/ChandraPyromaster.java @@ -205,7 +205,7 @@ class ChandraPyromasterEffect2 extends OneShotEffect { MageObject sourceObject = source.getSourceObject(game); if (controller != null && sourceObject != null && controller.getLibrary().hasCards()) { Library library = controller.getLibrary(); - Card card = library.removeFromTop(game); + Card card = library.getFromTop(game); if (card != null) { controller.moveCardToExileWithInfo(card, source.getSourceId(), sourceObject.getIdName() + " ", source.getSourceId(), game, Zone.LIBRARY, true); game.addEffect(new ChandraPyromasterPlayEffect(new MageObjectReference(card, game)), source); diff --git a/Mage.Sets/src/mage/cards/c/ChaosHarlequin.java b/Mage.Sets/src/mage/cards/c/ChaosHarlequin.java index 8da3349e7eb..f9d39b82eea 100644 --- a/Mage.Sets/src/mage/cards/c/ChaosHarlequin.java +++ b/Mage.Sets/src/mage/cards/c/ChaosHarlequin.java @@ -38,9 +38,9 @@ import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.Zone; import mage.game.Game; import mage.players.Player; @@ -52,7 +52,7 @@ import mage.players.Player; public class ChaosHarlequin extends CardImpl { public ChaosHarlequin(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{R}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}{R}"); this.subtype.add(SubType.HUMAN); this.power = new MageInt(2); this.toughness = new MageInt(4); @@ -91,7 +91,7 @@ class ChaosHarlequinEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); if (player != null) { - Card card = player.getLibrary().removeFromTop(game); + Card card = player.getLibrary().getFromTop(game); if (card != null) { player.moveCardToExileWithInfo(card, null, "", source.getSourceId(), game, Zone.LIBRARY, true); if (card.isLand()) { diff --git a/Mage.Sets/src/mage/cards/c/CloneShell.java b/Mage.Sets/src/mage/cards/c/CloneShell.java index 8d6ae28ee91..cf0c4c95531 100644 --- a/Mage.Sets/src/mage/cards/c/CloneShell.java +++ b/Mage.Sets/src/mage/cards/c/CloneShell.java @@ -36,14 +36,15 @@ import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.cards.*; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.Zone; import mage.filter.FilterCard; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.TargetCard; +import mage.util.CardUtil; /** * @author nantuko @@ -51,7 +52,7 @@ import mage.target.TargetCard; public class CloneShell extends CardImpl { public CloneShell(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{5}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{5}"); this.subtype.add(SubType.SHAPESHIFTER); this.power = new MageInt(2); @@ -90,48 +91,28 @@ class CloneShellEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - Cards cards = new CardsImpl(); - int count = Math.min(player.getLibrary().size(), 4); - for (int i = 0; i < count; i++) { - Card card = player.getLibrary().removeFromTop(game); - cards.add(card); - } - - if (cards.isEmpty()) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { return false; - } - TargetCard target1 = new TargetCard(Zone.LIBRARY, filter1); - if (player.choose(Outcome.Detriment, cards, target1, game)) { - Card card = cards.get(target1.getFirstTarget(), game); - if (card != null) { - cards.remove(card); - card.moveToExile(getId(), "Clone Shell (Imprint)", source.getSourceId(), game); - card.setFaceDown(true, game); - Permanent permanent = game.getPermanent(source.getSourceId()); - if (permanent != null) { - permanent.imprint(card.getId(), game); - } - } - target1.clearChosen(); - } - + Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, 4)); if (!cards.isEmpty()) { - TargetCard target2 = new TargetCard(Zone.LIBRARY, filter2); - while (player.canRespond() && cards.size() > 1) { - player.choose(Outcome.Benefit, cards, target2, game); - Card card = cards.get(target2.getFirstTarget(), game); + TargetCard target1 = new TargetCard(Zone.LIBRARY, filter1); + if (controller.choose(Outcome.Detriment, cards, target1, game)) { + Card card = cards.get(target1.getFirstTarget(), game); if (card != null) { cards.remove(card); - card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, false); + controller.moveCardsToExile(card, source, game, false, CardUtil.getCardExileZoneId(game, source), CardUtil.createObjectRealtedWindowTitle(source, game, "(Imprint)")); + card.setFaceDown(true, game); + Permanent permanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); + if (permanent != null) { + permanent.imprint(card.getId(), game); + } } - target2.clearChosen(); + target1.clearChosen(); } - Card card = cards.get(cards.iterator().next(), game); - card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); + controller.putCardsOnBottomOfLibrary(cards, game, source, true); } - return true; } diff --git a/Mage.Sets/src/mage/cards/c/ColfenorsPlans.java b/Mage.Sets/src/mage/cards/c/ColfenorsPlans.java index 6b1aba598f5..89d26739faa 100644 --- a/Mage.Sets/src/mage/cards/c/ColfenorsPlans.java +++ b/Mage.Sets/src/mage/cards/c/ColfenorsPlans.java @@ -39,6 +39,8 @@ import mage.abilities.effects.common.continuous.CantCastMoreThanOneSpellEffect; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.cards.CardsImpl; import mage.constants.*; import mage.game.ExileZone; import mage.game.Game; @@ -92,13 +94,16 @@ class ColfenorsPlansExileEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - MageObject sourceObject = game.getObject(source.getSourceId()); - if (player != null && sourceObject != null) { - for (int i = 0; i < 7; i++) { - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - if (player.moveCardToExileWithInfo(card, CardUtil.getCardExileZoneId(game, source), sourceObject.getIdName(), source.getSourceId(), game, Zone.LIBRARY, true)) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + Cards toExile = new CardsImpl(controller.getLibrary().getTopCards(game, 7)); + UUID exileId = CardUtil.getCardExileZoneId(game, source); + controller.moveCardsToExile(toExile.getCards(game), source, game, false, + exileId, CardUtil.createObjectRealtedWindowTitle(source, game, null)); + ExileZone exileZone = game.getExile().getExileZone(exileId); + if (exileZone != null) { + for (Card card : exileZone.getCards(game)) { + if (card != null) { card.setFaceDown(true, game); } } @@ -137,10 +142,9 @@ class ColfenorsPlansPlayCardEffect extends AsThoughEffectImpl { @Override public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { - Card card = game.getCard(objectId); - if (affectedControllerId.equals(source.getControllerId()) && card != null && game.getState().getZone(card.getId()) == Zone.EXILED) { + if (affectedControllerId.equals(source.getControllerId()) && game.getState().getZone(objectId) == Zone.EXILED) { ExileZone zone = game.getExile().getExileZone(CardUtil.getCardExileZoneId(game, source)); - return zone != null && zone.contains(card.getId()); + return zone != null && zone.contains(objectId); } return false; } diff --git a/Mage.Sets/src/mage/cards/c/CommuneWithTheGods.java b/Mage.Sets/src/mage/cards/c/CommuneWithTheGods.java index 7bdb9385a78..c2bdbb97df8 100644 --- a/Mage.Sets/src/mage/cards/c/CommuneWithTheGods.java +++ b/Mage.Sets/src/mage/cards/c/CommuneWithTheGods.java @@ -28,7 +28,6 @@ package mage.cards.c; import java.util.UUID; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.*; @@ -49,7 +48,7 @@ import mage.target.TargetCard; public class CommuneWithTheGods extends CardImpl { public CommuneWithTheGods(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{1}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{G}"); // Reveal the top five cards of your library. You may put a creature or enchantment card from among them into your hand. Put the rest into your graveyard. this.getSpellAbility().addEffect(new CommuneWithTheGodsEffect()); @@ -68,11 +67,6 @@ public class CommuneWithTheGods extends CardImpl { class CommuneWithTheGodsEffect extends OneShotEffect { - private static final FilterCard filterPutInHand = new FilterCard("creature or enchantment card to put in hand"); - static { - filterPutInHand.add(Predicates.or(new CardTypePredicate(CardType.CREATURE), new CardTypePredicate(CardType.ENCHANTMENT))); - } - public CommuneWithTheGodsEffect() { super(Outcome.DrawCard); this.staticText = "Reveal the top five cards of your library. You may put a creature or enchantment card from among them into your hand. Put the rest into your graveyard"; @@ -90,32 +84,22 @@ class CommuneWithTheGodsEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = game.getObject(source.getSourceId()); - if (sourceObject != null && controller != null) { - Cards cards = new CardsImpl(); - - boolean properCardFound = false; - int count = Math.min(controller.getLibrary().size(), 5); - for (int i = 0; i < count; i++) { - Card card = controller.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - if (filterPutInHand.match(card, source.getSourceId(), source.getControllerId(), game)) { - properCardFound = true; - } - } - } - + if (controller != null) { + Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, 5)); if (!cards.isEmpty()) { - controller.revealCards(sourceObject.getName(), cards, game); - TargetCard target = new TargetCard(0, 1, Zone.LIBRARY, filterPutInHand); - if (properCardFound && controller.choose(Outcome.DrawCard, cards, target, game)) { - Card card = game.getCard(target.getFirstTarget()); - if (card != null) { - cards.remove(card); - controller.moveCards(card, Zone.HAND, source, game); - } + FilterCard filterPutInHand = new FilterCard("creature or enchantment card to put in hand"); + filterPutInHand.add(Predicates.or(new CardTypePredicate(CardType.CREATURE), new CardTypePredicate(CardType.ENCHANTMENT))); + controller.revealCards(source, cards, game); + if (cards.count(filterPutInHand, source.getSourceId(), source.getControllerId(), game) > 0) { + TargetCard target = new TargetCard(0, 1, Zone.LIBRARY, filterPutInHand); + if (controller.choose(Outcome.DrawCard, cards, target, game)) { + Card card = game.getCard(target.getFirstTarget()); + if (card != null) { + cards.remove(card); + controller.moveCards(card, Zone.HAND, source, game); + } + } } controller.moveCards(cards, Zone.GRAVEYARD, source, game); } diff --git a/Mage.Sets/src/mage/cards/c/ConsumingAberration.java b/Mage.Sets/src/mage/cards/c/ConsumingAberration.java index 7ee94832c60..574fbf23ab1 100644 --- a/Mage.Sets/src/mage/cards/c/ConsumingAberration.java +++ b/Mage.Sets/src/mage/cards/c/ConsumingAberration.java @@ -38,9 +38,9 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.SetPowerToughnessSourceEffect; import mage.cards.*; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.Zone; import mage.game.Game; import mage.players.Player; @@ -52,11 +52,10 @@ import mage.players.Player; public class ConsumingAberration extends CardImpl { public ConsumingAberration(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{U}{B}"); - + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}{B}"); + this.subtype.add(SubType.HORROR); - this.power = new MageInt(0); this.toughness = new MageInt(0); @@ -76,7 +75,6 @@ public class ConsumingAberration extends CardImpl { } } - class ConsumingAberrationEffect extends OneShotEffect { public ConsumingAberrationEffect() { @@ -100,33 +98,32 @@ class ConsumingAberrationEffect extends OneShotEffect { if (player == null) { continue; } - Cards cards = new CardsImpl(); - while(player.getLibrary().hasCards()){ - Card card = player.getLibrary().removeFromTop(game); + for (Card card : player.getLibrary().getCards(game)) { if (card != null) { cards.add(card); - if(card.isLand()){ + if (card.isLand()) { break; } } } - player.revealCards("Consuming Aberrtion", cards, game); + player.revealCards(source, cards, game); player.moveCards(cards, Zone.GRAVEYARD, source, game); } return true; } } - class CardsInOpponentsGraveyardsCount implements DynamicValue { - public CardsInOpponentsGraveyardsCount(){ + public CardsInOpponentsGraveyardsCount() { super(); } - public CardsInOpponentsGraveyardsCount(DynamicValue count){ + + public CardsInOpponentsGraveyardsCount(DynamicValue count) { super(); } + @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { int amount = 0; diff --git a/Mage.Sets/src/mage/cards/c/ConundrumSphinx.java b/Mage.Sets/src/mage/cards/c/ConundrumSphinx.java index 37279502a92..9cc733409bb 100644 --- a/Mage.Sets/src/mage/cards/c/ConundrumSphinx.java +++ b/Mage.Sets/src/mage/cards/c/ConundrumSphinx.java @@ -107,10 +107,10 @@ class ConundrumSphinxEffect extends OneShotEffect { } String cardName = cardChoice.getChoice(); game.informPlayers(sourceObject.getLogName() + ", player: " + player.getLogName() + ", named: [" + cardName + ']'); - Card card = player.getLibrary().removeFromTop(game); + Card card = player.getLibrary().getFromTop(game); if (card != null) { Cards cards = new CardsImpl(card); - player.revealCards(sourceObject.getIdName(), cards, game); + player.revealCards(source, player.getName(), cards, game); if (card.getName().equals(cardName)) { player.moveCards(cards, Zone.HAND, source, game); } else { diff --git a/Mage.Sets/src/mage/cards/c/CountrysideCrusher.java b/Mage.Sets/src/mage/cards/c/CountrysideCrusher.java index 954851fb495..b526c7e1c75 100644 --- a/Mage.Sets/src/mage/cards/c/CountrysideCrusher.java +++ b/Mage.Sets/src/mage/cards/c/CountrysideCrusher.java @@ -36,8 +36,8 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.cards.*; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.TargetController; import mage.constants.Zone; import mage.counters.CounterType; @@ -53,7 +53,7 @@ import mage.players.Player; public class CountrysideCrusher extends CardImpl { public CountrysideCrusher(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{R}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{R}"); this.subtype.add(SubType.GIANT); this.subtype.add(SubType.WARRIOR); @@ -102,8 +102,7 @@ class CountrysideCrusherEffect extends OneShotEffect { Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); if (controller != null && sourcePermanent != null) { Cards cards = new CardsImpl(); - while (controller.getLibrary().hasCards()) { - Card card = controller.getLibrary().getFromTop(game); + for (Card card : controller.getLibrary().getCards(game)) { cards.add(card); if (card.isLand()) { controller.moveCards(card, Zone.GRAVEYARD, source, game); diff --git a/Mage.Sets/src/mage/cards/d/DemonicConsultation.java b/Mage.Sets/src/mage/cards/d/DemonicConsultation.java index 1be6c39d27b..948756c63c5 100644 --- a/Mage.Sets/src/mage/cards/d/DemonicConsultation.java +++ b/Mage.Sets/src/mage/cards/d/DemonicConsultation.java @@ -100,8 +100,7 @@ class DemonicConsultationEffect extends OneShotEffect { // then reveal cards from the top of your library until you reveal the named card. Cards cardsToReaveal = new CardsImpl(); Card cardToHand = null; - while (controller.getLibrary().hasCards()) { - Card card = controller.getLibrary().removeFromTop(game); + for (Card card : controller.getLibrary().getCards(game)) { if (card != null) { cardsToReaveal.add(card); // Put that card into your hand diff --git a/Mage.Sets/src/mage/cards/d/DiviningWitch.java b/Mage.Sets/src/mage/cards/d/DiviningWitch.java index bf003028bb5..10ca9ae2321 100644 --- a/Mage.Sets/src/mage/cards/d/DiviningWitch.java +++ b/Mage.Sets/src/mage/cards/d/DiviningWitch.java @@ -114,8 +114,7 @@ public class DiviningWitch extends CardImpl { // then reveal cards from the top of your library until you reveal the named card. Cards cardsToReaveal = new CardsImpl(); Card cardToHand = null; - while (controller.getLibrary().hasCards()) { - Card card = controller.getLibrary().removeFromTop(game); + for (Card card : controller.getLibrary().getCards(game)) { if (card != null) { cardsToReaveal.add(card); // Put that card into your hand diff --git a/Mage.Sets/src/mage/cards/f/FathomTrawl.java b/Mage.Sets/src/mage/cards/f/FathomTrawl.java index 769f34586b7..6287eff1d0a 100644 --- a/Mage.Sets/src/mage/cards/f/FathomTrawl.java +++ b/Mage.Sets/src/mage/cards/f/FathomTrawl.java @@ -45,7 +45,7 @@ import mage.players.Player; public class FathomTrawl extends CardImpl { public FathomTrawl(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{3}{U}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{U}{U}"); // Reveal cards from the top of your library until you reveal three nonland cards. Put the nonland cards revealed this way into your hand, then put the rest of the revealed cards on the bottom of your library in any order. this.getSpellAbility().addEffect(new FathomTrawlEffect()); @@ -86,8 +86,7 @@ public class FathomTrawl extends CardImpl { Cards cards = new CardsImpl(); Cards nonlandCards = new CardsImpl(); Cards landCards = new CardsImpl(); - while (controller.getLibrary().hasCards()) { - Card card = controller.getLibrary().removeFromTop(game); + for (Card card : controller.getLibrary().getCards(game)) { if (card != null) { cards.add(card); if (!card.isLand()) { diff --git a/Mage.Sets/src/mage/cards/g/GoblinCharbelcher.java b/Mage.Sets/src/mage/cards/g/GoblinCharbelcher.java index 3150d6d44f4..09a39b50e0e 100644 --- a/Mage.Sets/src/mage/cards/g/GoblinCharbelcher.java +++ b/Mage.Sets/src/mage/cards/g/GoblinCharbelcher.java @@ -27,6 +27,7 @@ */ package mage.cards.g; +import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -43,8 +44,6 @@ import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetAnyTarget; -import java.util.UUID; - /** * * @author Plopman @@ -52,7 +51,7 @@ import java.util.UUID; public class GoblinCharbelcher extends CardImpl { public GoblinCharbelcher(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{4}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}"); // {3}, {tap}: Reveal cards from the top of your library until you reveal a land card. Goblin Charbelcher deals damage equal to the number of nonland cards revealed this way to any target. If the revealed land card was a Mountain, Goblin Charbelcher deals double that damage instead. Put the revealed cards on the bottom of your library in any order. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GoblinCharbelcherEffect(), new ManaCostsImpl("{3}")); @@ -97,13 +96,12 @@ class GoblinCharbelcherEffect extends OneShotEffect { } Cards cards = new CardsImpl(); boolean landFound = false; - while (controller.getLibrary().hasCards()) { - Card card = controller.getLibrary().removeFromTop(game); + for (Card card : controller.getLibrary().getCards(game)) { if (card != null) { cards.add(card); - if (card.isLand()){ + if (card.isLand()) { landFound = true; - if(card.hasSubtype(SubType.MOUNTAIN, game)){ + if (card.hasSubtype(SubType.MOUNTAIN, game)) { isMountain = true; } break; @@ -118,20 +116,19 @@ class GoblinCharbelcherEffect extends OneShotEffect { if (landFound) { damage--; } - if(isMountain){ + if (isMountain) { damage *= 2; } - + Permanent permanent = game.getPermanent(targetPointer.getFirst(game, source)); if (permanent != null) { permanent.damage(damage, source.getSourceId(), game, false, true); - } - else{ + } else { Player targetPlayer = game.getPlayer(targetPointer.getFirst(game, source)); if (targetPlayer != null) { targetPlayer.damage(damage, source.getSourceId(), game, false, true); } - } + } controller.putCardsOnBottomOfLibrary(cards, game, source, true); return true; } diff --git a/Mage.Sets/src/mage/cards/h/HeirloomBlade.java b/Mage.Sets/src/mage/cards/h/HeirloomBlade.java index d268f73c285..35bb0d1db1f 100644 --- a/Mage.Sets/src/mage/cards/h/HeirloomBlade.java +++ b/Mage.Sets/src/mage/cards/h/HeirloomBlade.java @@ -60,8 +60,8 @@ public class HeirloomBlade extends CardImpl { // Equipped creature gets +3/+1. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEquippedEffect(3, 1))); - - // Whenever equipped creature dies, you may reveal cards from the top of your library until you reveal a creature card that shares a creature type with it. + + // Whenever equipped creature dies, you may reveal cards from the top of your library until you reveal a creature card that shares a creature type with it. // Put that card into your hand and the rest on the bottom of your library in a random order. this.addAbility(new DiesAttachedTriggeredAbility(new HeirloomBladeEffect(), "equipped creature", true)); @@ -106,8 +106,7 @@ class HeirloomBladeEffect extends OneShotEffect { if (equipped != null) { Cards revealed = new CardsImpl(); Cards otherCards = new CardsImpl(); - while (controller.getLibrary().hasCards()) { - Card card = controller.getLibrary().removeFromTop(game); + for (Card card : controller.getLibrary().getCards(game)) { revealed.add(card); if (card != null && card.isCreature() && equipped.shareSubtypes(card, game)) { controller.moveCardToHandWithInfo(card, source.getSourceId(), game, true); diff --git a/Mage.Sets/src/mage/cards/o/OathOfDruids.java b/Mage.Sets/src/mage/cards/o/OathOfDruids.java index 8b4566fe658..804b8043e53 100644 --- a/Mage.Sets/src/mage/cards/o/OathOfDruids.java +++ b/Mage.Sets/src/mage/cards/o/OathOfDruids.java @@ -28,7 +28,6 @@ package mage.cards.o; import java.util.UUID; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.effects.OneShotEffect; @@ -65,7 +64,9 @@ public class OathOfDruids extends CardImpl { public OathOfDruids(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{G}"); - // At the beginning of each player's upkeep, that player chooses target player who controls more creatures than he or she does and is their opponent. The first player may reveal cards from the top of their library until he or she reveals a creature card. If he or she does, that player puts that card onto the battlefield and all other cards revealed this way into their graveyard. + // At the beginning of each player's upkeep, that player chooses target player who controls more creatures than he or she does and is their opponent. + // The first player may reveal cards from the top of their library until he or she reveals a creature card. + // If he or she does, that player puts that card onto the battlefield and all other cards revealed this way into their graveyard. Ability ability = new BeginningOfUpkeepTriggeredAbility(new OathOfDruidsEffect(), TargetController.ANY, false); ability.addTarget(new TargetPlayer(1, 1, false, filter)); originalId = ability.getOriginalId(); @@ -78,8 +79,6 @@ public class OathOfDruids extends CardImpl { Player activePlayer = game.getPlayer(game.getActivePlayerId()); if (activePlayer != null) { ability.getTargets().clear(); -// FilterPlayer filter = new FilterPlayer(); -// filter.add(new OathOfDruidsPredicate()); TargetPlayer target = new TargetPlayer(1, 1, false, filter); target.setTargetController(activePlayer.getId()); ability.getTargets().add(target); @@ -140,36 +139,35 @@ class OathOfDruidsEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - MageObject sourceObject = game.getObject(source.getSourceId()); - Player player = game.getPlayer(game.getActivePlayerId()); - if (player == null || sourceObject == null) { + Player controller = game.getPlayer(game.getActivePlayerId()); + if (controller == null) { return false; } Cards revealed = new CardsImpl(); - Card creatureCard = null; - Cards nonCreatureCards = new CardsImpl(); - if (!player.chooseUse(Outcome.Benefit, "Use this ability?", source, game)) { + Card selectedCard = null; + Cards notSelectedCards = new CardsImpl(); + if (!controller.chooseUse(Outcome.Benefit, "Use this ability?", source, game)) { return true; } //The first player may reveal cards from the top of their library - while (creatureCard == null && player.getLibrary().hasCards()) { - Card card = player.getLibrary().removeFromTop(game); + for (Card card : controller.getLibrary().getCards(game)) { revealed.add(card); // until he or she reveals a creature card. if (card.isCreature()) { - creatureCard = card; + selectedCard = card; + break; } else { - nonCreatureCards.add(card); + notSelectedCards.add(card); } } - player.revealCards(sourceObject.getIdName(), revealed, game); + controller.revealCards(source, revealed, game); //If he or she does, that player puts that card onto the battlefield - if (creatureCard != null) { - player.moveCards(creatureCard, Zone.BATTLEFIELD, source, game); + if (selectedCard != null) { + controller.moveCards(selectedCard, Zone.BATTLEFIELD, source, game); } // and all other cards revealed this way into their graveyard - player.moveCards(nonCreatureCards, Zone.GRAVEYARD, source, game); + controller.moveCards(notSelectedCards, Zone.GRAVEYARD, source, game); return true; } diff --git a/Mage.Sets/src/mage/cards/p/ProteusStaff.java b/Mage.Sets/src/mage/cards/p/ProteusStaff.java index eedabc15e84..93c38536a18 100644 --- a/Mage.Sets/src/mage/cards/p/ProteusStaff.java +++ b/Mage.Sets/src/mage/cards/p/ProteusStaff.java @@ -102,8 +102,7 @@ class ProteusStaffEffect extends OneShotEffect { // That creature's controller reveals cards from the top of their library until he or she reveals a creature card. Cards cards = new CardsImpl(); - while (controller.getLibrary().hasCards()) { - Card card = controller.getLibrary().removeFromTop(game); + for (Card card : controller.getLibrary().getCards(game)) { if (card != null) { if (card.isCreature()) { // The player puts that card onto the battlefield diff --git a/Mage.Sets/src/mage/cards/r/RiptideShapeshifter.java b/Mage.Sets/src/mage/cards/r/RiptideShapeshifter.java index ff278dab8c2..b4b485d6317 100644 --- a/Mage.Sets/src/mage/cards/r/RiptideShapeshifter.java +++ b/Mage.Sets/src/mage/cards/r/RiptideShapeshifter.java @@ -100,8 +100,7 @@ class RiptideShapeshifterEffect extends OneShotEffect { return false; } Cards revealedCards = new CardsImpl(); - while (controller.getLibrary().hasCards()) { - Card card = controller.getLibrary().removeFromTop(game); + for (Card card : controller.getLibrary().getCards(game)) { if (card.isCreature() && card.hasSubtype(SubType.byDescription(choice.getChoice()), game)) { controller.moveCards(card, Zone.BATTLEFIELD, source, game); break; diff --git a/Mage.Sets/src/mage/cards/s/ShiftingShadow.java b/Mage.Sets/src/mage/cards/s/ShiftingShadow.java index 8a0e0bfc9ad..abd6d679b0f 100644 --- a/Mage.Sets/src/mage/cards/s/ShiftingShadow.java +++ b/Mage.Sets/src/mage/cards/s/ShiftingShadow.java @@ -73,8 +73,8 @@ public class ShiftingShadow extends CardImpl { this.getSpellAbility().addTarget(auraTarget); this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility)); this.addAbility(new EnchantAbility(auraTarget.getTargetName())); - - // Enchanted creature has haste and “At the beginning of your upkeep, destroy this creature. Reveal cards from the top of your library until you reveal a creature card. + + // Enchanted creature has haste and “At the beginning of your upkeep, destroy this creature. Reveal cards from the top of your library until you reveal a creature card. // Put that card onto the battlefield and attach Shifting Shadow to it, then put all other cards revealed this way on the bottom of your library in a random order.” Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(HasteAbility.getInstance(), AttachmentType.AURA)); Effect effect = new GainAbilityAttachedEffect(new BeginningOfUpkeepTriggeredAbility( @@ -135,11 +135,10 @@ class ShiftingShadowEffect extends OneShotEffect { enchanted.destroy(source.getSourceId(), game, false); Cards revealed = new CardsImpl(); Cards otherCards = new CardsImpl(); - while (controller.getLibrary().hasCards()) { - Card card = controller.getLibrary().removeFromTop(game); + for (Card card : controller.getLibrary().getCards(game)) { revealed.add(card); if (card != null && card.isCreature()) { - card.putOntoBattlefield(game, Zone.LIBRARY, source.getSourceId(), controller.getId()); + controller.moveCards(card, Zone.BATTLEFIELD, source, game); Permanent newEnchanted = game.getPermanent(card.getId()); FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent(); filter.add(new PermanentIdPredicate(card.getId())); diff --git a/Mage.Sets/src/mage/cards/s/SpoilsOfTheVault.java b/Mage.Sets/src/mage/cards/s/SpoilsOfTheVault.java index c0aaa9537ac..624c5cea3ef 100644 --- a/Mage.Sets/src/mage/cards/s/SpoilsOfTheVault.java +++ b/Mage.Sets/src/mage/cards/s/SpoilsOfTheVault.java @@ -50,7 +50,7 @@ import mage.players.Player; public class SpoilsOfTheVault extends CardImpl { public SpoilsOfTheVault(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{B}"); + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{B}"); // Name a card. Reveal cards from the top of your library until you reveal the named card, then put that card into your hand. Exile all other cards revealed this way, and you lose 1 life for each of the exiled cards. this.getSpellAbility().addEffect(new NameACardEffect(NameACardEffect.TypeOfName.ALL)); @@ -94,8 +94,7 @@ class SpoilsOfTheVaultEffect extends OneShotEffect { Cards cardsToReveal = new CardsImpl(); Cards cardsToExile = new CardsImpl(); - while (controller.getLibrary().hasCards()) { - Card card = controller.getLibrary().removeFromTop(game); + for (Card card : controller.getLibrary().getCards(game)) { if (card != null) { cardsToReveal.add(card); if (card.getName().equals(cardName)) { 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 79cf55db7f8..b81671cfc68 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 @@ -1473,21 +1473,41 @@ public class TestPlayer implements Player { computerPlayer.shuffleLibrary(source, game); } + @Override + public void revealCards(Ability source, Cards cards, Game game) { + computerPlayer.revealCards(source, cards, game); + } + @Override public void revealCards(String name, Cards cards, Game game) { computerPlayer.revealCards(name, cards, game); } + @Override + public void revealCards(Ability source, String name, Cards cards, Game game) { + computerPlayer.revealCards(name, cards, game); + } + @Override public void revealCards(String name, Cards cards, Game game, boolean postToLog) { computerPlayer.revealCards(name, cards, game, postToLog); } + @Override + public void revealCards(Ability source, String name, Cards cards, Game game, boolean postToLog) { + computerPlayer.revealCards(name, cards, game, postToLog); + } + @Override public void lookAtCards(String name, Cards cards, Game game) { computerPlayer.lookAtCards(name, cards, game); } + @Override + public void lookAtCards(Ability source, String name, Cards cards, Game game) { + computerPlayer.lookAtCards(source, name, cards, game); + } + @Override public void lookAtCards(String name, Card card, Game game) { computerPlayer.lookAtCards(name, card, game); 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 7eebfc498a8..ca01958cb61 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 @@ -758,16 +758,31 @@ public class PlayerStub implements Player { } + @Override + public void revealCards(Ability source, Cards cards, Game game) { + + } + @Override public void revealCards(String name, Cards cards, Game game) { } + @Override + public void revealCards(Ability source, String name, Cards cards, Game game) { + + } + @Override public void revealCards(String name, Cards cards, Game game, boolean postToLog) { } + @Override + public void revealCards(Ability source, String name, Cards cards, Game game, boolean postToLog) { + + } + @Override public void lookAtCards(String name, Card card, Game game) { @@ -778,6 +793,11 @@ public class PlayerStub implements Player { } + @Override + public void lookAtCards(Ability source, String name, Cards cards, Game game) { + + } + @Override public Player copy() { return null; diff --git a/Mage/src/main/java/mage/cards/CardsImpl.java b/Mage/src/main/java/mage/cards/CardsImpl.java index 473021c2751..3174bfdc00f 100644 --- a/Mage/src/main/java/mage/cards/CardsImpl.java +++ b/Mage/src/main/java/mage/cards/CardsImpl.java @@ -54,6 +54,12 @@ public class CardsImpl extends LinkedHashSet implements Cards, Serializabl } } + public CardsImpl(Set cards) { + for (Card card : cards) { + this.add(card.getId()); + } + } + public CardsImpl(Collection cardIds) { if (cardIds != null) { this.addAll(cardIds); diff --git a/Mage/src/main/java/mage/players/Library.java b/Mage/src/main/java/mage/players/Library.java index 61c4734a68f..77b816948f9 100644 --- a/Mage/src/main/java/mage/players/Library.java +++ b/Mage/src/main/java/mage/players/Library.java @@ -136,24 +136,26 @@ public class Library implements Serializable { } public void putCardThirdFromTheTop(Card card, Game game) { - if (card != null && card.getOwnerId().equals(playerId)) { - Card cardTop = null; - Card cardSecond = null; - if (hasCards()) { - cardTop = removeFromTop(game); + if (card != null) { + if (card.getOwnerId().equals(playerId)) { + Card cardTop = null; + Card cardSecond = null; + if (hasCards()) { + cardTop = removeFromTop(game); + } + if (hasCards()) { + cardSecond = removeFromTop(game); + } + putOnTop(card, game); + if (cardSecond != null) { + putOnTop(cardSecond, game); + } + if (cardTop != null) { + putOnTop(cardTop, game); + } + } else { + game.getPlayer(card.getOwnerId()).getLibrary().putCardThirdFromTheTop(card, game); } - if (hasCards()) { - cardSecond = removeFromTop(game); - } - putOnTop(card, game); - if (cardSecond != null) { - putOnTop(cardSecond, game); - } - if (cardTop != null) { - putOnTop(cardTop, game); - } - } else { - game.getPlayer(card.getOwnerId()).getLibrary().putCardThirdFromTheTop(card, game); } } @@ -190,6 +192,12 @@ public class Library implements Serializable { return new ArrayList<>(library); } + /** + * Returns the cards of the library in a list ordered from top to buttom + * + * @param game + * @return + */ public List getCards(Game game) { return library.stream().map(game::getCard).collect(Collectors.toList()); } diff --git a/Mage/src/main/java/mage/players/Player.java b/Mage/src/main/java/mage/players/Player.java index 83d698dafba..b08e8e8c410 100644 --- a/Mage/src/main/java/mage/players/Player.java +++ b/Mage/src/main/java/mage/players/Player.java @@ -474,14 +474,41 @@ public interface Player extends MageItem, Copyable { void resetStoredBookmark(Game game); + void revealCards(Ability source, Cards cards, Game game); + void revealCards(String name, Cards cards, Game game); + void revealCards(Ability source, String name, Cards cards, Game game); + void revealCards(String name, Cards cards, Game game, boolean postToLog); + /** + * Adds the cards to the reveal window and adds the source object's id name + * to the title bar of the revealed cards window + * + * @param source + * @param name + * @param cards + * @param game + * @param postToLog + */ + void revealCards(Ability source, String name, Cards cards, Game game, boolean postToLog); + void lookAtCards(String name, Card card, Game game); void lookAtCards(String name, Cards cards, Game game); + /** + * Adds the cards to the look window and adds the source object's id name to + * the title bar of the lookedAt window + * + * @param source + * @param name + * @param cards + * @param game + */ + void lookAtCards(Ability source, String name, Cards cards, Game game); + @Override Player copy(); diff --git a/Mage/src/main/java/mage/players/PlayerImpl.java b/Mage/src/main/java/mage/players/PlayerImpl.java index 307fc1d5272..9fd608468ca 100644 --- a/Mage/src/main/java/mage/players/PlayerImpl.java +++ b/Mage/src/main/java/mage/players/PlayerImpl.java @@ -1474,16 +1474,34 @@ public abstract class PlayerImpl implements Player, Serializable { } @Override - public void revealCards(String name, Cards cards, Game game) { - revealCards(name, cards, game, true); + public void revealCards(Ability source, Cards cards, Game game) { + revealCards(source, null, cards, game, true); } @Override - public void revealCards(String name, Cards cards, Game game, boolean postToLog) { + public void revealCards(String titleSuffix, Cards cards, Game game) { + revealCards(titleSuffix, cards, game, true); + } + + @Override + public void revealCards(String titleSuffix, Cards cards, Game game, boolean postToLog) { + revealCards(null, titleSuffix, cards, game, postToLog); + } + + @Override + public void revealCards(Ability source, String titleSuffix, Cards cards, Game game) { + revealCards(source, titleSuffix, cards, game, true); + } + + @Override + public void revealCards(Ability source, String titleSuffix, Cards cards, Game game, boolean postToLog) { + if (cards == null || cards.isEmpty()) { + return; + } if (postToLog) { - game.getState().getRevealed().add(name, cards); + game.getState().getRevealed().add(CardUtil.createObjectRealtedWindowTitle(source, game, titleSuffix), cards); } else { - game.getState().getRevealed().update(name, cards); + game.getState().getRevealed().update(CardUtil.createObjectRealtedWindowTitle(source, game, titleSuffix), cards); } if (postToLog && !game.isSimulation()) { StringBuilder sb = new StringBuilder(getLogName()).append(" reveals "); @@ -1500,14 +1518,19 @@ public abstract class PlayerImpl implements Player, Serializable { } @Override - public void lookAtCards(String name, Card card, Game game) { - game.getState().getLookedAt(this.playerId).add(name, card); + public void lookAtCards(String titleSuffix, Card card, Game game) { + game.getState().getLookedAt(this.playerId).add(titleSuffix, card); game.fireUpdatePlayersEvent(); } @Override - public void lookAtCards(String name, Cards cards, Game game) { - game.getState().getLookedAt(this.playerId).add(name, cards); + public void lookAtCards(String titleSuffix, Cards cards, Game game) { + this.lookAtCards(null, titleSuffix, cards, game); + } + + @Override + public void lookAtCards(Ability source, String titleSuffix, Cards cards, Game game) { + game.getState().getLookedAt(this.playerId).add(CardUtil.createObjectRealtedWindowTitle(source, game, titleSuffix), cards); game.fireUpdatePlayersEvent(); } diff --git a/Mage/src/main/java/mage/target/targetpointer/FixedTargets.java b/Mage/src/main/java/mage/target/targetpointer/FixedTargets.java index e220491074e..f4ca2f05c36 100644 --- a/Mage/src/main/java/mage/target/targetpointer/FixedTargets.java +++ b/Mage/src/main/java/mage/target/targetpointer/FixedTargets.java @@ -7,9 +7,11 @@ package mage.target.targetpointer; import java.util.ArrayList; import java.util.List; +import java.util.Set; import java.util.UUID; import mage.MageObjectReference; import mage.abilities.Ability; +import mage.cards.Card; import mage.cards.Cards; import mage.game.Game; import mage.game.permanent.Permanent; @@ -46,6 +48,14 @@ public class FixedTargets implements TargetPointer { this.initialized = true; } + public FixedTargets(Set cards, Game game) { + for (Card card : cards) { + MageObjectReference mor = new MageObjectReference(card.getId(), card.getZoneChangeCounter(game), game); + targets.add(mor); + } + this.initialized = true; + } + private FixedTargets(final FixedTargets fixedTargets) { this.targets.addAll(fixedTargets.targets); this.targetsNotInitialized.addAll(fixedTargets.targetsNotInitialized); diff --git a/Mage/src/main/java/mage/util/CardUtil.java b/Mage/src/main/java/mage/util/CardUtil.java index 930c3d2315c..7c636d2afe4 100644 --- a/Mage/src/main/java/mage/util/CardUtil.java +++ b/Mage/src/main/java/mage/util/CardUtil.java @@ -27,6 +27,7 @@ */ package mage.util; +import java.util.UUID; import mage.MageObject; import mage.Mana; import mage.abilities.Ability; @@ -37,22 +38,18 @@ import mage.abilities.costs.mana.*; import mage.cards.Card; import mage.game.Game; import mage.game.permanent.Permanent; -import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; import mage.util.functions.CopyTokenFunction; -import java.util.UUID; - /** * @author nantuko */ public final class CardUtil { - private static final String SOURCE_EXILE_ZONE_TEXT = "SourceExileZone"; static final String[] numberStrings = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", - "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty"}; + "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty"}; /** * Increase spell or ability cost to be paid. @@ -133,7 +130,6 @@ public final class CardUtil { return adjustedCost; } - public static void reduceCost(SpellAbility spellAbility, ManaCosts manaCostsToReduce) { adjustCost(spellAbility, manaCostsToReduce, true); } @@ -154,8 +150,8 @@ public final class CardUtil { * * @param spellAbility * @param manaCostsToReduce costs to reduce - * @param convertToGeneric colored mana does reduce generic mana if no - * appropriate colored mana is in the costs included + * @param convertToGeneric colored mana does reduce generic mana if no + * appropriate colored mana is in the costs included */ public static void adjustCost(SpellAbility spellAbility, ManaCosts manaCostsToReduce, boolean convertToGeneric) { ManaCosts previousCost = spellAbility.getManaCostsToPay(); @@ -340,7 +336,7 @@ public final class CardUtil { * * @param number number to convert to text * @param forOne if the number is 1, this string will be returnedinstead of - * "one". + * "one". * @return */ public static String numberToText(int number, String forOne) { @@ -383,21 +379,22 @@ public final class CardUtil { return true; } - /** - * Parse card number as int (support base [123] and alternative numbers [123b]). + * Parse card number as int (support base [123] and alternative numbers + * [123b]). * * @param cardNumber origin card number * @return int */ - public static int parseCardNumberAsInt(String cardNumber){ + public static int parseCardNumberAsInt(String cardNumber) { - if (cardNumber.isEmpty()){ throw new IllegalArgumentException("Card number is empty.");} + if (cardNumber.isEmpty()) { + throw new IllegalArgumentException("Card number is empty."); + } - if(Character.isDigit(cardNumber.charAt(cardNumber.length() - 1))) - { + if (Character.isDigit(cardNumber.charAt(cardNumber.length() - 1))) { return Integer.parseInt(cardNumber); - }else{ + } else { return Integer.parseInt(cardNumber.substring(0, cardNumber.length() - 1)); } } @@ -405,7 +402,7 @@ public final class CardUtil { /** * Creates and saves a (card + zoneChangeCounter) specific exileId. * - * @param game the current game + * @param game the current game * @param source source ability * @return the specific UUID */ @@ -440,9 +437,9 @@ public final class CardUtil { * be specific to a permanent instance. So they won't match, if a permanent * was e.g. exiled and came back immediately. * - * @param text short value to describe the value + * @param text short value to describe the value * @param cardId id of the card - * @param game the game + * @param game the game * @return */ public static String getCardZoneString(String text, UUID cardId, Game game) { @@ -513,9 +510,9 @@ public final class CardUtil { public static int addWithOverflowCheck(int base, int increment) { long result = ((long) base) + increment; if (result > Integer.MAX_VALUE) { - return Integer.MAX_VALUE; + return Integer.MAX_VALUE; } else if (result < Integer.MIN_VALUE) { - return Integer.MIN_VALUE; + return Integer.MIN_VALUE; } return base + increment; } @@ -523,11 +520,28 @@ public final class CardUtil { public static int subtractWithOverflowCheck(int base, int decrement) { long result = ((long) base) - decrement; if (result > Integer.MAX_VALUE) { - return Integer.MAX_VALUE; + return Integer.MAX_VALUE; } else if (result < Integer.MIN_VALUE) { - return Integer.MIN_VALUE; + return Integer.MIN_VALUE; } return base - decrement; } + public static String createObjectRealtedWindowTitle(Ability source, Game game, String textSuffix) { + String title; + if (source != null) { + MageObject sourceObject = game.getObject(source.getSourceId()); + if (sourceObject != null) { + title = sourceObject.getIdName() + + " [" + source.getSourceObjectZoneChangeCounter() + "]" + + (textSuffix == null ? "" : " " + textSuffix); + } else { + title = textSuffix == null ? "" : textSuffix; + } + } else { + title = textSuffix == null ? "" : textSuffix;; + } + return title; + + } } From a4c9ba5b3333ca931874667bc37a640721ff1f10 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 8 May 2018 18:01:30 +0200 Subject: [PATCH 091/158] * Fixed some card movement. --- .../src/mage/cards/c/CovenantOfMinds.java | 25 +++++-------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/Mage.Sets/src/mage/cards/c/CovenantOfMinds.java b/Mage.Sets/src/mage/cards/c/CovenantOfMinds.java index 7e1174b44ff..0b77aecf83d 100644 --- a/Mage.Sets/src/mage/cards/c/CovenantOfMinds.java +++ b/Mage.Sets/src/mage/cards/c/CovenantOfMinds.java @@ -30,7 +30,6 @@ package mage.cards.c; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.cards.CardsImpl; @@ -48,8 +47,7 @@ import mage.target.common.TargetOpponent; public class CovenantOfMinds extends CardImpl { public CovenantOfMinds(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{4}{U}"); - + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{U}"); // Reveal the top three cards of your library. Target opponent may choose to put those cards into your hand. // If he or she doesn't, put those cards into your graveyard and draw five cards. @@ -91,33 +89,22 @@ class CovenantOfMindsEffect extends OneShotEffect { return false; } - CardsImpl cards = new CardsImpl(); - int count = Math.min(player.getLibrary().size(), 3); - for (int i = 0; i < count; i++) { - cards.add(player.getLibrary().removeFromTop(game)); - } - + CardsImpl cards = new CardsImpl(player.getLibrary().getTopCards(game, 3)); if (!cards.isEmpty()) { - player.revealCards("Covenant of Minds", cards, game); - + player.revealCards(source, cards, game); StringBuilder sb = new StringBuilder(); sb.append("Put the revealed cards into ").append(player.getLogName()).append("'s hand?"); sb.append(" If you don't, those cards are put into his graveyard and he will draw five cards."); - Zone zone = Zone.GRAVEYARD; if (opponent.chooseUse(Outcome.Neutral, sb.toString(), source, game)) { - zone = Zone.HAND; + player.moveCards(cards, Zone.HAND, source, game); } else { + player.moveCards(cards, Zone.GRAVEYARD, source, game); player.drawCards(5, game); } - for (Card card : cards.getCards(game)) { - card.moveToZone(zone, source.getSourceId(), game, true); - } } else { - StringBuilder sb = new StringBuilder(); - sb.append(player.getLogName()).append("'s library is empty? Do you want him to draw five cards?"); - if (!opponent.chooseUse(Outcome.Benefit, sb.toString(), source, game)) { + if (!opponent.chooseUse(Outcome.Benefit, player.getLogName() + "'s library is empty? Do you want him to draw five cards?", source, game)) { player.drawCards(5, game); } } From d07209c33bd507301a75aecf04d44d68bf3ab613 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 8 May 2018 21:42:11 +0200 Subject: [PATCH 092/158] * Clockwork Steed - Fixed wrong collectors number in fith edition. --- Mage.Sets/src/mage/sets/FifthEdition.java | 956 +++++++++++----------- 1 file changed, 478 insertions(+), 478 deletions(-) diff --git a/Mage.Sets/src/mage/sets/FifthEdition.java b/Mage.Sets/src/mage/sets/FifthEdition.java index 50f19fd92da..2f46b3cb5d3 100644 --- a/Mage.Sets/src/mage/sets/FifthEdition.java +++ b/Mage.Sets/src/mage/sets/FifthEdition.java @@ -1,478 +1,478 @@ -package mage.sets; - -import mage.cards.ExpansionSet; -import mage.cards.b.BrassclawOrcs; -import mage.cards.d.DwarvenSoldier; -import mage.cards.g.GoblinWarDrums; -import mage.cards.h.HomaridWarrior; -import mage.cards.i.IcatianScout; -import mage.cards.i.InitiatesOfTheEbonHand; -import mage.cards.m.MesaFalcon; -import mage.cards.m.MindstabThrull; -import mage.cards.n.Necrite; -import mage.cards.r.ReefPirates; -import mage.cards.t.Torture; -import mage.cards.v.VodalianSoldiers; -import mage.constants.Rarity; -import mage.constants.SetType; - -public class FifthEdition extends ExpansionSet { - - private static final FifthEdition instance = new FifthEdition(); - - public static FifthEdition getInstance() { - return instance; - } - - private FifthEdition() { - super("Fifth Edition", "5ED", ExpansionSet.buildDate(1997, 3, 1), SetType.CORE); - this.hasBoosters = true; - this.numBoosterLands = 0; - this.numBoosterCommon = 11; - this.numBoosterUncommon = 3; - this.numBoosterRare = 1; - this.ratioBoosterMythic = 0; - cards.add(new SetCardInfo("Aether Storm", 70, Rarity.UNCOMMON, mage.cards.a.AetherStorm.class)); - cards.add(new SetCardInfo("Abbey Gargoyles", 277, Rarity.UNCOMMON, mage.cards.a.AbbeyGargoyles.class)); - cards.add(new SetCardInfo("Abyssal Specter", 1, Rarity.UNCOMMON, mage.cards.a.AbyssalSpecter.class)); - cards.add(new SetCardInfo("Adarkar Wastes", 410, Rarity.RARE, mage.cards.a.AdarkarWastes.class)); - cards.add(new SetCardInfo("Air Elemental", 71, Rarity.UNCOMMON, mage.cards.a.AirElemental.class)); - cards.add(new SetCardInfo("Akron Legionnaire", 278, Rarity.RARE, mage.cards.a.AkronLegionnaire.class)); - cards.add(new SetCardInfo("Alabaster Potion", 279, Rarity.COMMON, mage.cards.a.AlabasterPotion.class)); - cards.add(new SetCardInfo("Aladdin's Ring", 346, Rarity.RARE, mage.cards.a.AladdinsRing.class)); - cards.add(new SetCardInfo("Ambush Party", 208, Rarity.COMMON, mage.cards.a.AmbushParty.class)); - cards.add(new SetCardInfo("Amulet of Kroog", 347, Rarity.COMMON, mage.cards.a.AmuletOfKroog.class)); - cards.add(new SetCardInfo("An-Havva Constable", 139, Rarity.RARE, mage.cards.a.AnHavvaConstable.class)); - cards.add(new SetCardInfo("Anti-Magic Aura", 72, Rarity.UNCOMMON, mage.cards.a.AntiMagicAura.class)); - cards.add(new SetCardInfo("Angry Mob", 280, Rarity.UNCOMMON, mage.cards.a.AngryMob.class)); - cards.add(new SetCardInfo("Animate Dead", 2, Rarity.UNCOMMON, mage.cards.a.AnimateDead.class)); - cards.add(new SetCardInfo("Animate Wall", 281, Rarity.RARE, mage.cards.a.AnimateWall.class)); - cards.add(new SetCardInfo("Ankh of Mishra", 348, Rarity.RARE, mage.cards.a.AnkhOfMishra.class)); - cards.add(new SetCardInfo("Arenson's Aura", 282, Rarity.UNCOMMON, mage.cards.a.ArensonsAura.class)); - cards.add(new SetCardInfo("Armageddon", 283, Rarity.RARE, mage.cards.a.Armageddon.class)); - cards.add(new SetCardInfo("Armor of Faith", 284, Rarity.COMMON, mage.cards.a.ArmorOfFaith.class)); - cards.add(new SetCardInfo("Ashes to Ashes", 3, Rarity.UNCOMMON, mage.cards.a.AshesToAshes.class)); - cards.add(new SetCardInfo("Ashnod's Altar", 349, Rarity.UNCOMMON, mage.cards.a.AshnodsAltar.class)); - cards.add(new SetCardInfo("Ashnod's Transmogrant", 350, Rarity.COMMON, mage.cards.a.AshnodsTransmogrant.class)); - cards.add(new SetCardInfo("Aspect of Wolf", 140, Rarity.RARE, mage.cards.a.AspectOfWolf.class)); - cards.add(new SetCardInfo("Atog", 209, Rarity.UNCOMMON, mage.cards.a.Atog.class)); - cards.add(new SetCardInfo("Aurochs", 141, Rarity.COMMON, mage.cards.a.Aurochs.class)); - cards.add(new SetCardInfo("Aysen Bureaucrats", 285, Rarity.COMMON, mage.cards.a.AysenBureaucrats.class)); - cards.add(new SetCardInfo("Azure Drake", 73, Rarity.UNCOMMON, mage.cards.a.AzureDrake.class)); - cards.add(new SetCardInfo("Bad Moon", 4, Rarity.RARE, mage.cards.b.BadMoon.class)); - cards.add(new SetCardInfo("Ball Lightning", 210, Rarity.RARE, mage.cards.b.BallLightning.class)); - cards.add(new SetCardInfo("Barbed Sextant", 351, Rarity.COMMON, mage.cards.b.BarbedSextant.class)); - cards.add(new SetCardInfo("Barl's Cage", 352, Rarity.RARE, mage.cards.b.BarlsCage.class)); - cards.add(new SetCardInfo("Battering Ram", 353, Rarity.COMMON, mage.cards.b.BatteringRam.class)); - cards.add(new SetCardInfo("Benalish Hero", 286, Rarity.COMMON, mage.cards.b.BenalishHero.class)); - cards.add(new SetCardInfo("Binding Grasp", 74, Rarity.UNCOMMON, mage.cards.b.BindingGrasp.class)); - cards.add(new SetCardInfo("Bird Maiden", 211, Rarity.COMMON, mage.cards.b.BirdMaiden.class)); - cards.add(new SetCardInfo("Birds of Paradise", 142, Rarity.RARE, mage.cards.b.BirdsOfParadise.class)); - cards.add(new SetCardInfo("Black Knight", 5, Rarity.UNCOMMON, mage.cards.b.BlackKnight.class)); - cards.add(new SetCardInfo("Blessed Wine", 287, Rarity.COMMON, mage.cards.b.BlessedWine.class)); - cards.add(new SetCardInfo("Blight", 6, Rarity.UNCOMMON, mage.cards.b.Blight.class)); - cards.add(new SetCardInfo("Blinking Spirit", 288, Rarity.RARE, mage.cards.b.BlinkingSpirit.class)); - cards.add(new SetCardInfo("Blood Lust", 212, Rarity.COMMON, mage.cards.b.BloodLust.class)); - cards.add(new SetCardInfo("Bog Imp", 7, Rarity.COMMON, mage.cards.b.BogImp.class)); - cards.add(new SetCardInfo("Bog Rats", 8, Rarity.COMMON, mage.cards.b.BogRats.class)); - cards.add(new SetCardInfo("Bog Wraith", 9, Rarity.UNCOMMON, mage.cards.b.BogWraith.class)); - cards.add(new SetCardInfo("Boomerang", 75, Rarity.COMMON, mage.cards.b.Boomerang.class)); - cards.add(new SetCardInfo("Bottle of Suleiman", 354, Rarity.RARE, mage.cards.b.BottleOfSuleiman.class)); - cards.add(new SetCardInfo("Bottomless Vault", 411, Rarity.RARE, mage.cards.b.BottomlessVault.class)); - cards.add(new SetCardInfo("Brainstorm", 76, Rarity.COMMON, mage.cards.b.Brainstorm.class)); - cards.add(new SetCardInfo("Brainwash", 289, Rarity.COMMON, mage.cards.b.Brainwash.class)); - cards.add(new SetCardInfo("Brassclaw Orcs", 213, Rarity.COMMON, BrassclawOrcs.class)); - cards.add(new SetCardInfo("Breeding Pit", 10, Rarity.UNCOMMON, mage.cards.b.BreedingPit.class)); - cards.add(new SetCardInfo("Broken Visage", 11, Rarity.RARE, mage.cards.b.BrokenVisage.class)); - cards.add(new SetCardInfo("Brothers of Fire", 214, Rarity.COMMON, mage.cards.b.BrothersOfFire.class)); - cards.add(new SetCardInfo("Brushland", 412, Rarity.RARE, mage.cards.b.Brushland.class)); - cards.add(new SetCardInfo("Carapace", 143, Rarity.COMMON, mage.cards.c.Carapace.class)); - cards.add(new SetCardInfo("Caribou Range", 290, Rarity.RARE, mage.cards.c.CaribouRange.class)); - cards.add(new SetCardInfo("Carrion Ants", 12, Rarity.UNCOMMON, mage.cards.c.CarrionAnts.class)); - cards.add(new SetCardInfo("Castle", 291, Rarity.UNCOMMON, mage.cards.c.Castle.class)); - cards.add(new SetCardInfo("Cat Warriors", 144, Rarity.COMMON, mage.cards.c.CatWarriors.class)); - cards.add(new SetCardInfo("Cave People", 215, Rarity.UNCOMMON, mage.cards.c.CavePeople.class)); - cards.add(new SetCardInfo("Chub Toad", 145, Rarity.COMMON, mage.cards.c.ChubToad.class)); - cards.add(new SetCardInfo("Circle of Protection: Artifacts", 292, Rarity.COMMON, mage.cards.c.CircleOfProtectionArtifacts.class)); - cards.add(new SetCardInfo("Circle of Protection: Black", 293, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlack.class)); - cards.add(new SetCardInfo("Circle of Protection: Blue", 294, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlue.class)); - cards.add(new SetCardInfo("Circle of Protection: Green", 295, Rarity.COMMON, mage.cards.c.CircleOfProtectionGreen.class)); - cards.add(new SetCardInfo("Circle of Protection: Red", 296, Rarity.COMMON, mage.cards.c.CircleOfProtectionRed.class)); - cards.add(new SetCardInfo("Circle of Protection: White", 297, Rarity.COMMON, mage.cards.c.CircleOfProtectionWhite.class)); - cards.add(new SetCardInfo("City of Brass", 413, Rarity.RARE, mage.cards.c.CityOfBrass.class)); - cards.add(new SetCardInfo("Clay Statue", 355, Rarity.COMMON, mage.cards.c.ClayStatue.class)); - cards.add(new SetCardInfo("Clockwork Beast", 356, Rarity.RARE, mage.cards.c.ClockworkBeast.class)); - cards.add(new SetCardInfo("Clockwork Steed", 257, Rarity.UNCOMMON, mage.cards.c.ClockworkSteed.class)); - cards.add(new SetCardInfo("Cockatrice", 146, Rarity.RARE, mage.cards.c.Cockatrice.class)); - cards.add(new SetCardInfo("Colossus of Sardia", 358, Rarity.RARE, mage.cards.c.ColossusOfSardia.class)); - cards.add(new SetCardInfo("Conquer", 216, Rarity.UNCOMMON, mage.cards.c.Conquer.class)); - cards.add(new SetCardInfo("Coral Helm", 359, Rarity.RARE, mage.cards.c.CoralHelm.class)); - cards.add(new SetCardInfo("Counterspell", 77, Rarity.COMMON, mage.cards.c.Counterspell.class)); - cards.add(new SetCardInfo("Craw Giant", 147, Rarity.UNCOMMON, mage.cards.c.CrawGiant.class)); - cards.add(new SetCardInfo("Craw Wurm", 148, Rarity.COMMON, mage.cards.c.CrawWurm.class)); - cards.add(new SetCardInfo("Crimson Manticore", 217, Rarity.RARE, mage.cards.c.CrimsonManticore.class)); - cards.add(new SetCardInfo("Crown of the Ages", 360, Rarity.RARE, mage.cards.c.CrownOfTheAges.class)); - cards.add(new SetCardInfo("Crumble", 149, Rarity.UNCOMMON, mage.cards.c.Crumble.class)); - cards.add(new SetCardInfo("Crusade", 298, Rarity.RARE, mage.cards.c.Crusade.class)); - cards.add(new SetCardInfo("Crystal Rod", 361, Rarity.UNCOMMON, mage.cards.c.CrystalRod.class)); - cards.add(new SetCardInfo("Cursed Land", 14, Rarity.UNCOMMON, mage.cards.c.CursedLand.class)); - cards.add(new SetCardInfo("Dance of Many", 78, Rarity.RARE, mage.cards.d.DanceOfMany.class)); - cards.add(new SetCardInfo("Dancing Scimitar", 362, Rarity.RARE, mage.cards.d.DancingScimitar.class)); - cards.add(new SetCardInfo("Dandan", 79, Rarity.COMMON, mage.cards.d.Dandan.class)); - cards.add(new SetCardInfo("Dark Maze", 80, Rarity.COMMON, mage.cards.d.DarkMaze.class)); - cards.add(new SetCardInfo("Dark Ritual", 15, Rarity.COMMON, mage.cards.d.DarkRitual.class)); - cards.add(new SetCardInfo("D'Avenant Archer", 299, Rarity.COMMON, mage.cards.d.DAvenantArcher.class)); - cards.add(new SetCardInfo("Deathgrip", 16, Rarity.UNCOMMON, mage.cards.d.Deathgrip.class)); - cards.add(new SetCardInfo("Death Speakers", 300, Rarity.COMMON, mage.cards.d.DeathSpeakers.class)); - cards.add(new SetCardInfo("Death Ward", 301, Rarity.COMMON, mage.cards.d.DeathWard.class)); - cards.add(new SetCardInfo("Deflection", 81, Rarity.RARE, mage.cards.d.Deflection.class)); - cards.add(new SetCardInfo("Derelor", 17, Rarity.RARE, mage.cards.d.Derelor.class)); - cards.add(new SetCardInfo("Desert Twister", 150, Rarity.UNCOMMON, mage.cards.d.DesertTwister.class)); - cards.add(new SetCardInfo("Detonate", 218, Rarity.UNCOMMON, mage.cards.d.Detonate.class)); - cards.add(new SetCardInfo("Diabolic Machine", 363, Rarity.UNCOMMON, mage.cards.d.DiabolicMachine.class)); - cards.add(new SetCardInfo("Dingus Egg", 364, Rarity.RARE, mage.cards.d.DingusEgg.class)); - cards.add(new SetCardInfo("Disenchant", 302, Rarity.COMMON, mage.cards.d.Disenchant.class)); - cards.add(new SetCardInfo("Disintegrate", 219, Rarity.COMMON, mage.cards.d.Disintegrate.class)); - cards.add(new SetCardInfo("Disrupting Scepter", 365, Rarity.RARE, mage.cards.d.DisruptingScepter.class)); - cards.add(new SetCardInfo("Divine Offering", 303, Rarity.COMMON, mage.cards.d.DivineOffering.class)); - 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)); - cards.add(new SetCardInfo("Dwarven Catapult", 220, Rarity.UNCOMMON, mage.cards.d.DwarvenCatapult.class)); - cards.add(new SetCardInfo("Dwarven Hold", 414, Rarity.RARE, mage.cards.d.DwarvenHold.class)); - cards.add(new SetCardInfo("Dwarven Ruins", 415, Rarity.UNCOMMON, mage.cards.d.DwarvenRuins.class)); - cards.add(new SetCardInfo("Dwarven Soldier", 221, Rarity.COMMON, DwarvenSoldier.class)); - cards.add(new SetCardInfo("Dwarven Warriors", 222, Rarity.COMMON, mage.cards.d.DwarvenWarriors.class)); - cards.add(new SetCardInfo("Earthquake", 223, Rarity.RARE, mage.cards.e.Earthquake.class)); - cards.add(new SetCardInfo("Ebon Stronghold", 416, Rarity.UNCOMMON, mage.cards.e.EbonStronghold.class)); - cards.add(new SetCardInfo("Elder Druid", 152, Rarity.RARE, mage.cards.e.ElderDruid.class)); - cards.add(new SetCardInfo("Elkin Bottle", 367, Rarity.RARE, mage.cards.e.ElkinBottle.class)); - cards.add(new SetCardInfo("Elven Riders", 153, Rarity.UNCOMMON, mage.cards.e.ElvenRiders.class)); - cards.add(new SetCardInfo("Elvish Archers", 154, Rarity.RARE, mage.cards.e.ElvishArchers.class)); - cards.add(new SetCardInfo("Energy Flux", 83, Rarity.UNCOMMON, mage.cards.e.EnergyFlux.class)); - cards.add(new SetCardInfo("Enervate", 84, Rarity.COMMON, mage.cards.e.Enervate.class)); - cards.add(new SetCardInfo("Erg Raiders", 20, Rarity.COMMON, mage.cards.e.ErgRaiders.class)); - cards.add(new SetCardInfo("Errantry", 224, Rarity.COMMON, mage.cards.e.Errantry.class)); - cards.add(new SetCardInfo("Eternal Warrior", 225, Rarity.COMMON, mage.cards.e.EternalWarrior.class)); - cards.add(new SetCardInfo("Evil Eye of Orms-by-Gore", 21, Rarity.UNCOMMON, mage.cards.e.EvilEyeOfOrmsByGore.class)); - cards.add(new SetCardInfo("Evil Presence", 22, Rarity.UNCOMMON, mage.cards.e.EvilPresence.class)); - cards.add(new SetCardInfo("Eye for an Eye", 306, Rarity.RARE, mage.cards.e.EyeForAnEye.class)); - cards.add(new SetCardInfo("Fallen Angel", 23, Rarity.UNCOMMON, mage.cards.f.FallenAngel.class)); - cards.add(new SetCardInfo("Fear", 24, Rarity.COMMON, mage.cards.f.Fear.class)); - cards.add(new SetCardInfo("Feedback", 85, Rarity.UNCOMMON, mage.cards.f.Feedback.class)); - cards.add(new SetCardInfo("Feldon's Cane", 368, Rarity.UNCOMMON, mage.cards.f.FeldonsCane.class)); - cards.add(new SetCardInfo("Fellwar Stone", 369, Rarity.UNCOMMON, mage.cards.f.FellwarStone.class)); - cards.add(new SetCardInfo("Feroz's Ban", 370, Rarity.RARE, mage.cards.f.FerozsBan.class)); - cards.add(new SetCardInfo("Fireball", 227, Rarity.COMMON, mage.cards.f.Fireball.class)); - cards.add(new SetCardInfo("Firebreathing", 228, Rarity.COMMON, mage.cards.f.Firebreathing.class)); - cards.add(new SetCardInfo("Fire Drake", 226, Rarity.UNCOMMON, mage.cards.f.FireDrake.class)); - cards.add(new SetCardInfo("Flame Spirit", 229, Rarity.UNCOMMON, mage.cards.f.FlameSpirit.class)); - cards.add(new SetCardInfo("Flare", 230, Rarity.COMMON, mage.cards.f.Flare.class)); - cards.add(new SetCardInfo("Flashfires", 231, Rarity.UNCOMMON, mage.cards.f.Flashfires.class)); - cards.add(new SetCardInfo("Flight", 86, Rarity.COMMON, mage.cards.f.Flight.class)); - cards.add(new SetCardInfo("Flood", 87, Rarity.COMMON, mage.cards.f.Flood.class)); - cards.add(new SetCardInfo("Flying Carpet", 371, Rarity.RARE, mage.cards.f.FlyingCarpet.class)); - cards.add(new SetCardInfo("Fog", 155, Rarity.COMMON, mage.cards.f.Fog.class)); - cards.add(new SetCardInfo("Force of Nature", 156, Rarity.RARE, mage.cards.f.ForceOfNature.class)); - cards.add(new SetCardInfo("Force Spike", 88, Rarity.COMMON, mage.cards.f.ForceSpike.class)); - cards.add(new SetCardInfo("Forest", 417, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Forest", 418, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Forest", 419, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Forest", 420, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Forget", 89, Rarity.RARE, mage.cards.f.Forget.class)); - cards.add(new SetCardInfo("Foxfire", 157, Rarity.COMMON, mage.cards.f.Foxfire.class)); - cards.add(new SetCardInfo("Fountain of Youth", 372, Rarity.UNCOMMON, mage.cards.f.FountainOfYouth.class)); - cards.add(new SetCardInfo("Frozen Shade", 25, Rarity.COMMON, mage.cards.f.FrozenShade.class)); - cards.add(new SetCardInfo("Funeral March", 26, Rarity.COMMON, mage.cards.f.FuneralMarch.class)); - cards.add(new SetCardInfo("Fungusaur", 158, Rarity.RARE, mage.cards.f.Fungusaur.class)); - cards.add(new SetCardInfo("Fyndhorn Elder", 159, Rarity.UNCOMMON, mage.cards.f.FyndhornElder.class)); - cards.add(new SetCardInfo("Game of Chaos", 232, Rarity.RARE, mage.cards.g.GameOfChaos.class)); - cards.add(new SetCardInfo("Gaseous Form", 90, Rarity.COMMON, mage.cards.g.GaseousForm.class)); - cards.add(new SetCardInfo("Gauntlets of Chaos", 373, Rarity.RARE, mage.cards.g.GauntletsOfChaos.class)); - cards.add(new SetCardInfo("Ghazban Ogre", 160, Rarity.COMMON, mage.cards.g.GhazbanOgre.class)); - cards.add(new SetCardInfo("Giant Growth", 161, Rarity.COMMON, mage.cards.g.GiantGrowth.class)); - cards.add(new SetCardInfo("Giant Spider", 162, Rarity.COMMON, mage.cards.g.GiantSpider.class)); - cards.add(new SetCardInfo("Giant Strength", 233, Rarity.COMMON, mage.cards.g.GiantStrength.class)); - cards.add(new SetCardInfo("Glacial Wall", 91, Rarity.UNCOMMON, mage.cards.g.GlacialWall.class)); - cards.add(new SetCardInfo("Glasses of Urza", 374, Rarity.UNCOMMON, mage.cards.g.GlassesOfUrza.class)); - cards.add(new SetCardInfo("Gloom", 27, Rarity.UNCOMMON, mage.cards.g.Gloom.class)); - cards.add(new SetCardInfo("Goblin Digging Team", 234, Rarity.COMMON, mage.cards.g.GoblinDiggingTeam.class)); - cards.add(new SetCardInfo("Goblin Hero", 235, Rarity.COMMON, mage.cards.g.GoblinHero.class)); - cards.add(new SetCardInfo("Goblin King", 236, Rarity.RARE, mage.cards.g.GoblinKing.class)); - cards.add(new SetCardInfo("Goblin War Drums", 237, Rarity.COMMON, GoblinWarDrums.class)); - cards.add(new SetCardInfo("Goblin Warrens", 238, Rarity.RARE, mage.cards.g.GoblinWarrens.class)); - cards.add(new SetCardInfo("Grapeshot Catapult", 375, Rarity.COMMON, mage.cards.g.GrapeshotCatapult.class)); - cards.add(new SetCardInfo("Greater Realm of Preservation", 307, Rarity.UNCOMMON, mage.cards.g.GreaterRealmOfPreservation.class)); - cards.add(new SetCardInfo("Greater Werewolf", 28, Rarity.UNCOMMON, mage.cards.g.GreaterWerewolf.class)); - cards.add(new SetCardInfo("Grizzly Bears", 163, Rarity.COMMON, mage.cards.g.GrizzlyBears.class)); - cards.add(new SetCardInfo("Havenwood Battleground", 421, Rarity.UNCOMMON, mage.cards.h.HavenwoodBattleground.class)); - cards.add(new SetCardInfo("Heal", 308, Rarity.COMMON, mage.cards.h.Heal.class)); - cards.add(new SetCardInfo("Healing Salve", 309, Rarity.COMMON, mage.cards.h.HealingSalve.class)); - cards.add(new SetCardInfo("Hecatomb", 29, Rarity.RARE, mage.cards.h.Hecatomb.class)); - cards.add(new SetCardInfo("Helm of Chatzuk", 376, Rarity.RARE, mage.cards.h.HelmOfChatzuk.class)); - cards.add(new SetCardInfo("Hill Giant", 239, Rarity.COMMON, mage.cards.h.HillGiant.class)); - cards.add(new SetCardInfo("Hollow Trees", 422, Rarity.RARE, mage.cards.h.HollowTrees.class)); - cards.add(new SetCardInfo("Holy Strength", 311, Rarity.COMMON, mage.cards.h.HolyStrength.class)); - cards.add(new SetCardInfo("Homarid Warrior", 92, Rarity.COMMON, HomaridWarrior.class)); - cards.add(new SetCardInfo("Howl from Beyond", 30, Rarity.COMMON, mage.cards.h.HowlFromBeyond.class)); - cards.add(new SetCardInfo("Howling Mine", 377, Rarity.RARE, mage.cards.h.HowlingMine.class)); - cards.add(new SetCardInfo("Hungry Mist", 164, Rarity.COMMON, mage.cards.h.HungryMist.class)); - cards.add(new SetCardInfo("Hurkyl's Recall", 93, Rarity.RARE, mage.cards.h.HurkylsRecall.class)); - cards.add(new SetCardInfo("Hurloon Minotaur", 240, Rarity.COMMON, mage.cards.h.HurloonMinotaur.class)); - cards.add(new SetCardInfo("Hurricane", 165, Rarity.UNCOMMON, mage.cards.h.Hurricane.class)); - cards.add(new SetCardInfo("Hydroblast", 94, Rarity.UNCOMMON, mage.cards.h.Hydroblast.class)); - cards.add(new SetCardInfo("Icatian Phalanx", 312, Rarity.UNCOMMON, mage.cards.i.IcatianPhalanx.class)); - cards.add(new SetCardInfo("Icatian Scout", 313, Rarity.COMMON, IcatianScout.class)); - cards.add(new SetCardInfo("Icatian Store", 423, Rarity.RARE, mage.cards.i.IcatianStore.class)); - cards.add(new SetCardInfo("Icatian Town", 314, Rarity.RARE, mage.cards.i.IcatianTown.class)); - cards.add(new SetCardInfo("Ice Floe", 424, Rarity.UNCOMMON, mage.cards.i.IceFloe.class)); - cards.add(new SetCardInfo("Imposing Visage", 241, Rarity.COMMON, mage.cards.i.ImposingVisage.class)); - cards.add(new SetCardInfo("Incinerate", 242, Rarity.COMMON, mage.cards.i.Incinerate.class)); - cards.add(new SetCardInfo("Inferno", 243, Rarity.RARE, mage.cards.i.Inferno.class)); - cards.add(new SetCardInfo("Infinite Hourglass", 378, Rarity.RARE, mage.cards.i.InfiniteHourglass.class)); - cards.add(new SetCardInfo("Initiates of the Ebon Hand", 31, Rarity.COMMON, InitiatesOfTheEbonHand.class)); - cards.add(new SetCardInfo("Instill Energy", 166, Rarity.UNCOMMON, mage.cards.i.InstillEnergy.class)); - cards.add(new SetCardInfo("Ironclaw Curse", 244, Rarity.RARE, mage.cards.i.IronclawCurse.class)); - cards.add(new SetCardInfo("Ironclaw Orcs", 245, Rarity.COMMON, mage.cards.i.IronclawOrcs.class)); - cards.add(new SetCardInfo("Ironroot Treefolk", 167, Rarity.COMMON, mage.cards.i.IronrootTreefolk.class)); - cards.add(new SetCardInfo("Iron Star", 379, Rarity.UNCOMMON, mage.cards.i.IronStar.class)); - cards.add(new SetCardInfo("Island", 425, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Island", 426, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Island", 427, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Island", 428, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Island Sanctuary", 315, Rarity.RARE, mage.cards.i.IslandSanctuary.class)); - cards.add(new SetCardInfo("Ivory Cup", 380, Rarity.UNCOMMON, mage.cards.i.IvoryCup.class)); - cards.add(new SetCardInfo("Ivory Guardians", 316, Rarity.UNCOMMON, mage.cards.i.IvoryGuardians.class)); - cards.add(new SetCardInfo("Jade Monolith", 381, Rarity.RARE, mage.cards.j.JadeMonolith.class)); - cards.add(new SetCardInfo("Jalum Tome", 382, Rarity.RARE, mage.cards.j.JalumTome.class)); - cards.add(new SetCardInfo("Jandor's Saddlebags", 383, Rarity.RARE, mage.cards.j.JandorsSaddlebags.class)); - cards.add(new SetCardInfo("Jayemdae Tome", 384, Rarity.RARE, mage.cards.j.JayemdaeTome.class)); - cards.add(new SetCardInfo("Jester's Cap", 385, Rarity.RARE, mage.cards.j.JestersCap.class)); - cards.add(new SetCardInfo("Johtull Wurm", 168, Rarity.UNCOMMON, mage.cards.j.JohtullWurm.class)); - cards.add(new SetCardInfo("Jokulhaups", 246, Rarity.RARE, mage.cards.j.Jokulhaups.class)); - cards.add(new SetCardInfo("Joven's Tools", 386, Rarity.UNCOMMON, mage.cards.j.JovensTools.class)); - cards.add(new SetCardInfo("Justice", 317, Rarity.UNCOMMON, mage.cards.j.Justice.class)); - cards.add(new SetCardInfo("Juxtapose", 95, Rarity.RARE, mage.cards.j.Juxtapose.class)); - cards.add(new SetCardInfo("Karma", 318, Rarity.UNCOMMON, mage.cards.k.Karma.class)); - cards.add(new SetCardInfo("Karplusan Forest", 429, Rarity.RARE, mage.cards.k.KarplusanForest.class)); - cards.add(new SetCardInfo("Keldon Warlord", 247, Rarity.UNCOMMON, mage.cards.k.KeldonWarlord.class)); - cards.add(new SetCardInfo("Killer Bees", 169, Rarity.UNCOMMON, mage.cards.k.KillerBees.class)); - cards.add(new SetCardInfo("Kismet", 319, Rarity.UNCOMMON, mage.cards.k.Kismet.class)); - cards.add(new SetCardInfo("Kjeldoran Dead", 32, Rarity.COMMON, mage.cards.k.KjeldoranDead.class)); - cards.add(new SetCardInfo("Kjeldoran Royal Guard", 320, Rarity.RARE, mage.cards.k.KjeldoranRoyalGuard.class)); - cards.add(new SetCardInfo("Kjeldoran Skycaptain", 321, Rarity.UNCOMMON, mage.cards.k.KjeldoranSkycaptain.class)); - cards.add(new SetCardInfo("Knight of Stromgald", 33, Rarity.UNCOMMON, mage.cards.k.KnightOfStromgald.class)); - cards.add(new SetCardInfo("Krovikan Fetish", 34, Rarity.COMMON, mage.cards.k.KrovikanFetish.class)); - cards.add(new SetCardInfo("Krovikan Sorcerer", 96, Rarity.COMMON, mage.cards.k.KrovikanSorcerer.class)); - cards.add(new SetCardInfo("Labyrinth Minotaur", 97, Rarity.COMMON, mage.cards.l.LabyrinthMinotaur.class)); - cards.add(new SetCardInfo("Leshrac's Rite", 35, Rarity.UNCOMMON, mage.cards.l.LeshracsRite.class)); - cards.add(new SetCardInfo("Leviathan", 98, Rarity.RARE, mage.cards.l.Leviathan.class)); - cards.add(new SetCardInfo("Ley Druid", 170, Rarity.COMMON, mage.cards.l.LeyDruid.class)); - cards.add(new SetCardInfo("Lhurgoyf", 171, Rarity.RARE, mage.cards.l.Lhurgoyf.class)); - cards.add(new SetCardInfo("Library of Leng", 387, Rarity.UNCOMMON, mage.cards.l.LibraryOfLeng.class)); - cards.add(new SetCardInfo("Lifeforce", 172, Rarity.UNCOMMON, mage.cards.l.Lifeforce.class)); - cards.add(new SetCardInfo("Lifetap", 99, Rarity.UNCOMMON, mage.cards.l.Lifetap.class)); - cards.add(new SetCardInfo("Living Artifact", 173, Rarity.RARE, mage.cards.l.LivingArtifact.class)); - cards.add(new SetCardInfo("Living Lands", 174, Rarity.RARE, mage.cards.l.LivingLands.class)); - cards.add(new SetCardInfo("Llanowar Elves", 175, Rarity.COMMON, mage.cards.l.LlanowarElves.class)); - cards.add(new SetCardInfo("Lord of Atlantis", 100, Rarity.RARE, mage.cards.l.LordOfAtlantis.class)); - cards.add(new SetCardInfo("Lord of the Pit", 36, Rarity.RARE, mage.cards.l.LordOfThePit.class)); - cards.add(new SetCardInfo("Lost Soul", 37, Rarity.COMMON, mage.cards.l.LostSoul.class)); - cards.add(new SetCardInfo("Lure", 176, Rarity.UNCOMMON, mage.cards.l.Lure.class)); - cards.add(new SetCardInfo("Magus of the Unseen", 102, Rarity.RARE, mage.cards.m.MagusOfTheUnseen.class)); - cards.add(new SetCardInfo("Manabarbs", 250, Rarity.RARE, mage.cards.m.Manabarbs.class)); - cards.add(new SetCardInfo("Mana Clash", 248, Rarity.RARE, mage.cards.m.ManaClash.class)); - cards.add(new SetCardInfo("Mana Flare", 249, Rarity.RARE, mage.cards.m.ManaFlare.class)); - cards.add(new SetCardInfo("Mana Vault", 388, Rarity.RARE, mage.cards.m.ManaVault.class)); - cards.add(new SetCardInfo("Marsh Viper", 177, Rarity.COMMON, mage.cards.m.MarshViper.class)); - cards.add(new SetCardInfo("Meekstone", 389, Rarity.RARE, mage.cards.m.Meekstone.class)); - cards.add(new SetCardInfo("Memory Lapse", 103, Rarity.COMMON, mage.cards.m.MemoryLapse.class)); - cards.add(new SetCardInfo("Merfolk of the Pearl Trident", 104, Rarity.COMMON, mage.cards.m.MerfolkOfThePearlTrident.class)); - cards.add(new SetCardInfo("Mesa Falcon", 322, Rarity.COMMON, MesaFalcon.class)); - cards.add(new SetCardInfo("Mesa Pegasus", 323, Rarity.COMMON, mage.cards.m.MesaPegasus.class)); - cards.add(new SetCardInfo("Millstone", 390, Rarity.RARE, mage.cards.m.Millstone.class)); - cards.add(new SetCardInfo("Mind Bomb", 105, Rarity.UNCOMMON, mage.cards.m.MindBomb.class)); - cards.add(new SetCardInfo("Mind Ravel", 38, Rarity.COMMON, mage.cards.m.MindRavel.class)); - cards.add(new SetCardInfo("Mindstab Thrull", 40, Rarity.COMMON, MindstabThrull.class)); - cards.add(new SetCardInfo("Mind Warp", 39, Rarity.UNCOMMON, mage.cards.m.MindWarp.class)); - cards.add(new SetCardInfo("Mole Worms", 41, Rarity.UNCOMMON, mage.cards.m.MoleWorms.class)); - cards.add(new SetCardInfo("Mons's Goblin Raiders", 251, Rarity.COMMON, mage.cards.m.MonssGoblinRaiders.class)); - cards.add(new SetCardInfo("Mountain", 430, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mountain", 431, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mountain", 432, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mountain", 433, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mountain Goat", 252, Rarity.COMMON, mage.cards.m.MountainGoat.class)); - cards.add(new SetCardInfo("Murk Dwellers", 42, Rarity.COMMON, mage.cards.m.MurkDwellers.class)); - cards.add(new SetCardInfo("Nature's Lore", 178, Rarity.COMMON, mage.cards.n.NaturesLore.class)); - cards.add(new SetCardInfo("Necrite", 43, Rarity.COMMON, Necrite.class)); - cards.add(new SetCardInfo("Necropotence", 44, Rarity.RARE, mage.cards.n.Necropotence.class)); - cards.add(new SetCardInfo("Nether Shadow", 45, Rarity.RARE, mage.cards.n.NetherShadow.class)); - cards.add(new SetCardInfo("Nevinyrral's Disk", 391, Rarity.RARE, mage.cards.n.NevinyrralsDisk.class)); - cards.add(new SetCardInfo("Nightmare", 46, Rarity.RARE, mage.cards.n.Nightmare.class)); - cards.add(new SetCardInfo("Obelisk of Undoing", 392, Rarity.RARE, mage.cards.o.ObeliskOfUndoing.class)); - cards.add(new SetCardInfo("Orcish Artillery", 253, Rarity.UNCOMMON, mage.cards.o.OrcishArtillery.class)); - cards.add(new SetCardInfo("Orcish Captain", 254, Rarity.UNCOMMON, mage.cards.o.OrcishCaptain.class)); - cards.add(new SetCardInfo("Orcish Oriflamme", 257, Rarity.UNCOMMON, mage.cards.o.OrcishOriflamme.class)); - cards.add(new SetCardInfo("Orcish Squatters", 258, Rarity.RARE, mage.cards.o.OrcishSquatters.class)); - cards.add(new SetCardInfo("Order of the Sacred Torch", 324, Rarity.RARE, mage.cards.o.OrderOfTheSacredTorch.class)); - cards.add(new SetCardInfo("Order of the White Shield", 325, Rarity.UNCOMMON, mage.cards.o.OrderOfTheWhiteShield.class)); - cards.add(new SetCardInfo("Orgg", 259, Rarity.RARE, mage.cards.o.Orgg.class)); - cards.add(new SetCardInfo("Ornithopter", 393, Rarity.UNCOMMON, mage.cards.o.Ornithopter.class)); - cards.add(new SetCardInfo("Panic", 260, Rarity.COMMON, mage.cards.p.Panic.class)); - cards.add(new SetCardInfo("Paralyze", 47, Rarity.COMMON, mage.cards.p.Paralyze.class)); - cards.add(new SetCardInfo("Pearled Unicorn", 326, Rarity.COMMON, mage.cards.p.PearledUnicorn.class)); - cards.add(new SetCardInfo("Pentagram of the Ages", 394, Rarity.RARE, mage.cards.p.PentagramOfTheAges.class)); - cards.add(new SetCardInfo("Personal Incarnation", 327, Rarity.RARE, mage.cards.p.PersonalIncarnation.class)); - cards.add(new SetCardInfo("Pestilence", 48, Rarity.COMMON, mage.cards.p.Pestilence.class)); - cards.add(new SetCardInfo("Phantasmal Forces", 106, Rarity.UNCOMMON, mage.cards.p.PhantasmalForces.class)); - cards.add(new SetCardInfo("Phantasmal Terrain", 107, Rarity.COMMON, mage.cards.p.PhantasmalTerrain.class)); - cards.add(new SetCardInfo("Phantom Monster", 108, Rarity.UNCOMMON, mage.cards.p.PhantomMonster.class)); - cards.add(new SetCardInfo("Pikemen", 328, Rarity.COMMON, mage.cards.p.Pikemen.class)); - cards.add(new SetCardInfo("Pirate Ship", 109, Rarity.RARE, mage.cards.p.PirateShip.class)); - cards.add(new SetCardInfo("Pit Scorpion", 49, Rarity.COMMON, mage.cards.p.PitScorpion.class)); - cards.add(new SetCardInfo("Plague Rats", 50, Rarity.COMMON, mage.cards.p.PlagueRats.class)); - cards.add(new SetCardInfo("Plains", 434, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Plains", 435, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Plains", 436, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Plains", 437, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Portent", 110, Rarity.COMMON, mage.cards.p.Portent.class)); - cards.add(new SetCardInfo("Power Sink", 111, Rarity.UNCOMMON, mage.cards.p.PowerSink.class)); - cards.add(new SetCardInfo("Pox", 51, Rarity.RARE, mage.cards.p.Pox.class)); - cards.add(new SetCardInfo("Pradesh Gypsies", 179, Rarity.COMMON, mage.cards.p.PradeshGypsies.class)); - cards.add(new SetCardInfo("Primal Clay", 395, Rarity.RARE, mage.cards.p.PrimalClay.class)); - cards.add(new SetCardInfo("Primal Order", 180, Rarity.RARE, mage.cards.p.PrimalOrder.class)); - cards.add(new SetCardInfo("Primordial Ooze", 261, Rarity.UNCOMMON, mage.cards.p.PrimordialOoze.class)); - cards.add(new SetCardInfo("Prismatic Ward", 329, Rarity.COMMON, mage.cards.p.PrismaticWard.class)); - cards.add(new SetCardInfo("Prodigal Sorcerer", 112, Rarity.COMMON, mage.cards.p.ProdigalSorcerer.class)); - cards.add(new SetCardInfo("Psychic Venom", 113, Rarity.COMMON, mage.cards.p.PsychicVenom.class)); - cards.add(new SetCardInfo("Pyroblast", 262, Rarity.UNCOMMON, mage.cards.p.Pyroblast.class)); - cards.add(new SetCardInfo("Pyrotechnics", 263, Rarity.UNCOMMON, mage.cards.p.Pyrotechnics.class)); - cards.add(new SetCardInfo("Rabid Wombat", 181, Rarity.UNCOMMON, mage.cards.r.RabidWombat.class)); - cards.add(new SetCardInfo("Radjan Spirit", 182, Rarity.UNCOMMON, mage.cards.r.RadjanSpirit.class)); - cards.add(new SetCardInfo("Rag Man", 52, Rarity.RARE, mage.cards.r.RagMan.class)); - cards.add(new SetCardInfo("Raise Dead", 53, Rarity.COMMON, mage.cards.r.RaiseDead.class)); - cards.add(new SetCardInfo("Ray of Command", 114, Rarity.COMMON, mage.cards.r.RayOfCommand.class)); - cards.add(new SetCardInfo("Recall", 115, Rarity.RARE, mage.cards.r.Recall.class)); - cards.add(new SetCardInfo("Reef Pirates", 116, Rarity.COMMON, ReefPirates.class)); - cards.add(new SetCardInfo("Regeneration", 183, Rarity.COMMON, mage.cards.r.Regeneration.class)); - cards.add(new SetCardInfo("Remove Soul", 117, Rarity.COMMON, mage.cards.r.RemoveSoul.class)); - cards.add(new SetCardInfo("Repentant Blacksmith", 330, Rarity.COMMON, mage.cards.r.RepentantBlacksmith.class)); - cards.add(new SetCardInfo("Reverse Damage", 331, Rarity.RARE, mage.cards.r.ReverseDamage.class)); - cards.add(new SetCardInfo("Righteousness", 332, Rarity.RARE, mage.cards.r.Righteousness.class)); - cards.add(new SetCardInfo("Rod of Ruin", 396, Rarity.UNCOMMON, mage.cards.r.RodOfRuin.class)); - cards.add(new SetCardInfo("Ruins of Trokair", 438, Rarity.UNCOMMON, mage.cards.r.RuinsOfTrokair.class)); - cards.add(new SetCardInfo("Sabretooth Tiger", 264, Rarity.COMMON, mage.cards.s.SabretoothTiger.class)); - cards.add(new SetCardInfo("Samite Healer", 334, Rarity.COMMON, mage.cards.s.SamiteHealer.class)); - cards.add(new SetCardInfo("Sand Silos", 439, Rarity.RARE, mage.cards.s.SandSilos.class)); - cards.add(new SetCardInfo("Scaled Wurm", 184, Rarity.COMMON, mage.cards.s.ScaledWurm.class)); - cards.add(new SetCardInfo("Scathe Zombies", 54, Rarity.COMMON, mage.cards.s.ScatheZombies.class)); - cards.add(new SetCardInfo("Scavenger Folk", 185, Rarity.COMMON, mage.cards.s.ScavengerFolk.class)); - cards.add(new SetCardInfo("Scryb Sprites", 186, Rarity.COMMON, mage.cards.s.ScrybSprites.class)); - cards.add(new SetCardInfo("Sea Serpent", 118, Rarity.COMMON, mage.cards.s.SeaSerpent.class)); - cards.add(new SetCardInfo("Seasinger", 121, Rarity.UNCOMMON, mage.cards.s.Seasinger.class)); - cards.add(new SetCardInfo("Sea Spirit", 119, Rarity.UNCOMMON, mage.cards.s.SeaSpirit.class)); - cards.add(new SetCardInfo("Sea Sprite", 120, Rarity.UNCOMMON, mage.cards.s.SeaSprite.class)); - cards.add(new SetCardInfo("Segovian Leviathan", 122, Rarity.UNCOMMON, mage.cards.s.SegovianLeviathan.class)); - cards.add(new SetCardInfo("Sengir Autocrat", 55, Rarity.RARE, mage.cards.s.SengirAutocrat.class)); - cards.add(new SetCardInfo("Serpent Generator", 397, Rarity.RARE, mage.cards.s.SerpentGenerator.class)); - cards.add(new SetCardInfo("Serra Bestiary", 336, Rarity.UNCOMMON, mage.cards.s.SerraBestiary.class)); - cards.add(new SetCardInfo("Serra Paladin", 337, Rarity.UNCOMMON, mage.cards.s.SerraPaladin.class)); - cards.add(new SetCardInfo("Shanodin Dryads", 187, Rarity.COMMON, mage.cards.s.ShanodinDryads.class)); - cards.add(new SetCardInfo("Shapeshifter", 398, Rarity.UNCOMMON, mage.cards.s.Shapeshifter.class)); - cards.add(new SetCardInfo("Shatter", 265, Rarity.COMMON, mage.cards.s.Shatter.class)); - cards.add(new SetCardInfo("Shatterstorm", 266, Rarity.UNCOMMON, mage.cards.s.Shatterstorm.class)); - cards.add(new SetCardInfo("Shield Bearer", 338, Rarity.COMMON, mage.cards.s.ShieldBearer.class)); - cards.add(new SetCardInfo("Shield Wall", 339, Rarity.COMMON, mage.cards.s.ShieldWall.class)); - cards.add(new SetCardInfo("Shivan Dragon", 267, Rarity.RARE, mage.cards.s.ShivanDragon.class)); - cards.add(new SetCardInfo("Shrink", 188, Rarity.COMMON, mage.cards.s.Shrink.class)); - cards.add(new SetCardInfo("Sibilant Spirit", 123, Rarity.RARE, mage.cards.s.SibilantSpirit.class)); - cards.add(new SetCardInfo("Skull Catapult", 399, Rarity.UNCOMMON, mage.cards.s.SkullCatapult.class)); - cards.add(new SetCardInfo("Smoke", 268, Rarity.RARE, mage.cards.s.Smoke.class)); - cards.add(new SetCardInfo("Sorceress Queen", 56, Rarity.RARE, mage.cards.s.SorceressQueen.class)); - cards.add(new SetCardInfo("Soul Barrier", 125, Rarity.COMMON, mage.cards.s.SoulBarrier.class)); - cards.add(new SetCardInfo("Soul Net", 400, Rarity.UNCOMMON, mage.cards.s.SoulNet.class)); - cards.add(new SetCardInfo("Spell Blast", 126, Rarity.COMMON, mage.cards.s.SpellBlast.class)); - cards.add(new SetCardInfo("Spirit Link", 340, Rarity.UNCOMMON, mage.cards.s.SpiritLink.class)); - cards.add(new SetCardInfo("Stampede", 189, Rarity.RARE, mage.cards.s.Stampede.class)); - cards.add(new SetCardInfo("Stasis", 127, Rarity.RARE, mage.cards.s.Stasis.class)); - cards.add(new SetCardInfo("Steal Artifact", 128, Rarity.UNCOMMON, mage.cards.s.StealArtifact.class)); - cards.add(new SetCardInfo("Stone Giant", 269, Rarity.UNCOMMON, mage.cards.s.StoneGiant.class)); - cards.add(new SetCardInfo("Stone Rain", 270, Rarity.COMMON, mage.cards.s.StoneRain.class)); - cards.add(new SetCardInfo("Stone Spirit", 271, Rarity.UNCOMMON, mage.cards.s.StoneSpirit.class)); - cards.add(new SetCardInfo("Stream of Life", 190, Rarity.COMMON, mage.cards.s.StreamOfLife.class)); - cards.add(new SetCardInfo("Stromgald Cabal", 57, Rarity.RARE, mage.cards.s.StromgaldCabal.class)); - cards.add(new SetCardInfo("Sulfurous Springs", 440, Rarity.RARE, mage.cards.s.SulfurousSprings.class)); - cards.add(new SetCardInfo("Svyelunite Temple", 441, Rarity.UNCOMMON, mage.cards.s.SvyeluniteTemple.class)); - cards.add(new SetCardInfo("Swamp", 442, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Swamp", 443, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Swamp", 444, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Swamp", 445, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Sylvan Library", 191, Rarity.RARE, mage.cards.s.SylvanLibrary.class)); - cards.add(new SetCardInfo("Tarpan", 192, Rarity.COMMON, mage.cards.t.Tarpan.class)); - cards.add(new SetCardInfo("Tawnos's Weaponry", 401, Rarity.UNCOMMON, mage.cards.t.TawnossWeaponry.class)); - cards.add(new SetCardInfo("Terror", 58, Rarity.COMMON, mage.cards.t.Terror.class)); - cards.add(new SetCardInfo("The Brute", 272, Rarity.COMMON, mage.cards.t.TheBrute.class)); - cards.add(new SetCardInfo("The Hive", 402, Rarity.RARE, mage.cards.t.TheHive.class)); - cards.add(new SetCardInfo("The Wretched", 59, Rarity.RARE, mage.cards.t.TheWretched.class)); - cards.add(new SetCardInfo("Thicket Basilisk", 193, Rarity.UNCOMMON, mage.cards.t.ThicketBasilisk.class)); - cards.add(new SetCardInfo("Throne of Bone", 403, Rarity.UNCOMMON, mage.cards.t.ThroneOfBone.class)); - cards.add(new SetCardInfo("Thrull Retainer", 60, Rarity.UNCOMMON, mage.cards.t.ThrullRetainer.class)); - cards.add(new SetCardInfo("Time Bomb", 404, Rarity.RARE, mage.cards.t.TimeBomb.class)); - cards.add(new SetCardInfo("Time Elemental", 129, Rarity.RARE, mage.cards.t.TimeElemental.class)); - cards.add(new SetCardInfo("Titania's Song", 194, Rarity.RARE, mage.cards.t.TitaniasSong.class)); - cards.add(new SetCardInfo("Torture", 61, Rarity.COMMON, Torture.class)); - cards.add(new SetCardInfo("Touch of Death", 62, Rarity.COMMON, mage.cards.t.TouchOfDeath.class)); - cards.add(new SetCardInfo("Tranquility", 195, Rarity.COMMON, mage.cards.t.Tranquility.class)); - cards.add(new SetCardInfo("Truce", 341, Rarity.RARE, mage.cards.t.Truce.class)); - cards.add(new SetCardInfo("Tsunami", 196, Rarity.UNCOMMON, mage.cards.t.Tsunami.class)); - cards.add(new SetCardInfo("Tundra Wolves", 342, Rarity.COMMON, mage.cards.t.TundraWolves.class)); - cards.add(new SetCardInfo("Twiddle", 130, Rarity.COMMON, mage.cards.t.Twiddle.class)); - cards.add(new SetCardInfo("Underground River", 446, Rarity.RARE, mage.cards.u.UndergroundRiver.class)); - cards.add(new SetCardInfo("Unholy Strength", 63, Rarity.COMMON, mage.cards.u.UnholyStrength.class)); - cards.add(new SetCardInfo("Unstable Mutation", 131, Rarity.COMMON, mage.cards.u.UnstableMutation.class)); - cards.add(new SetCardInfo("Unsummon", 132, Rarity.COMMON, mage.cards.u.Unsummon.class)); - cards.add(new SetCardInfo("Untamed Wilds", 197, Rarity.UNCOMMON, mage.cards.u.UntamedWilds.class)); - cards.add(new SetCardInfo("Updraft", 133, Rarity.COMMON, mage.cards.u.Updraft.class)); - cards.add(new SetCardInfo("Urza's Avenger", 405, Rarity.RARE, mage.cards.u.UrzasAvenger.class)); - cards.add(new SetCardInfo("Urza's Bauble", 406, Rarity.UNCOMMON, mage.cards.u.UrzasBauble.class)); - cards.add(new SetCardInfo("Urza's Mine", 447, Rarity.COMMON, mage.cards.u.UrzasMine.class)); - cards.add(new SetCardInfo("Urza's Power Plant", 448, Rarity.COMMON, mage.cards.u.UrzasPowerPlant.class)); - cards.add(new SetCardInfo("Urza's Tower", 449, Rarity.COMMON, mage.cards.u.UrzasTower.class)); - cards.add(new SetCardInfo("Vampire Bats", 64, Rarity.COMMON, mage.cards.v.VampireBats.class)); - cards.add(new SetCardInfo("Venom", 198, Rarity.COMMON, mage.cards.v.Venom.class)); - cards.add(new SetCardInfo("Verduran Enchantress", 199, Rarity.RARE, mage.cards.v.VerduranEnchantress.class)); - cards.add(new SetCardInfo("Vodalian Soldiers", 134, Rarity.COMMON, VodalianSoldiers.class)); - cards.add(new SetCardInfo("Wall of Air", 135, Rarity.UNCOMMON, mage.cards.w.WallOfAir.class)); - cards.add(new SetCardInfo("Wall of Bone", 65, Rarity.UNCOMMON, mage.cards.w.WallOfBone.class)); - cards.add(new SetCardInfo("Wall of Brambles", 200, Rarity.UNCOMMON, mage.cards.w.WallOfBrambles.class)); - cards.add(new SetCardInfo("Wall of Fire", 273, Rarity.UNCOMMON, mage.cards.w.WallOfFire.class)); - cards.add(new SetCardInfo("Wall of Spears", 407, Rarity.COMMON, mage.cards.w.WallOfSpears.class)); - cards.add(new SetCardInfo("Wall of Stone", 274, Rarity.UNCOMMON, mage.cards.w.WallOfStone.class)); - cards.add(new SetCardInfo("Wall of Swords", 343, Rarity.UNCOMMON, mage.cards.w.WallOfSwords.class)); - cards.add(new SetCardInfo("Wanderlust", 201, Rarity.UNCOMMON, mage.cards.w.Wanderlust.class)); - cards.add(new SetCardInfo("War Mammoth", 202, Rarity.COMMON, mage.cards.w.WarMammoth.class)); - cards.add(new SetCardInfo("Warp Artifact", 66, Rarity.RARE, mage.cards.w.WarpArtifact.class)); - cards.add(new SetCardInfo("Weakness", 67, Rarity.COMMON, mage.cards.w.Weakness.class)); - cards.add(new SetCardInfo("Whirling Dervish", 203, Rarity.UNCOMMON, mage.cards.w.WhirlingDervish.class)); - cards.add(new SetCardInfo("White Knight", 344, Rarity.UNCOMMON, mage.cards.w.WhiteKnight.class)); - cards.add(new SetCardInfo("Wild Growth", 204, Rarity.COMMON, mage.cards.w.WildGrowth.class)); - cards.add(new SetCardInfo("Winds of Change", 275, Rarity.RARE, mage.cards.w.WindsOfChange.class)); - cards.add(new SetCardInfo("Wind Spirit", 136, Rarity.UNCOMMON, mage.cards.w.WindSpirit.class)); - cards.add(new SetCardInfo("Winter Blast", 205, Rarity.UNCOMMON, mage.cards.w.WinterBlast.class)); - cards.add(new SetCardInfo("Winter Orb", 408, Rarity.RARE, mage.cards.w.WinterOrb.class)); - cards.add(new SetCardInfo("Wolverine Pack", 206, Rarity.UNCOMMON, mage.cards.w.WolverinePack.class)); - cards.add(new SetCardInfo("Wooden Sphere", 409, Rarity.UNCOMMON, mage.cards.w.WoodenSphere.class)); - cards.add(new SetCardInfo("Word of Blasting", 276, Rarity.UNCOMMON, mage.cards.w.WordOfBlasting.class)); - cards.add(new SetCardInfo("Wrath of God", 345, Rarity.RARE, mage.cards.w.WrathOfGod.class)); - cards.add(new SetCardInfo("Wyluli Wolf", 207, Rarity.RARE, mage.cards.w.WyluliWolf.class)); - cards.add(new SetCardInfo("Xenic Poltergeist", 68, Rarity.RARE, mage.cards.x.XenicPoltergeist.class)); - cards.add(new SetCardInfo("Zephyr Falcon", 137, Rarity.COMMON, mage.cards.z.ZephyrFalcon.class)); - cards.add(new SetCardInfo("Zombie Master", 69, Rarity.RARE, mage.cards.z.ZombieMaster.class)); - cards.add(new SetCardInfo("Zur's Weirding", 138, Rarity.RARE, mage.cards.z.ZursWeirding.class)); - } - -} +package mage.sets; + +import mage.cards.ExpansionSet; +import mage.cards.b.BrassclawOrcs; +import mage.cards.d.DwarvenSoldier; +import mage.cards.g.GoblinWarDrums; +import mage.cards.h.HomaridWarrior; +import mage.cards.i.IcatianScout; +import mage.cards.i.InitiatesOfTheEbonHand; +import mage.cards.m.MesaFalcon; +import mage.cards.m.MindstabThrull; +import mage.cards.n.Necrite; +import mage.cards.r.ReefPirates; +import mage.cards.t.Torture; +import mage.cards.v.VodalianSoldiers; +import mage.constants.Rarity; +import mage.constants.SetType; + +public class FifthEdition extends ExpansionSet { + + private static final FifthEdition instance = new FifthEdition(); + + public static FifthEdition getInstance() { + return instance; + } + + private FifthEdition() { + super("Fifth Edition", "5ED", ExpansionSet.buildDate(1997, 3, 1), SetType.CORE); + this.hasBoosters = true; + this.numBoosterLands = 0; + this.numBoosterCommon = 11; + this.numBoosterUncommon = 3; + this.numBoosterRare = 1; + this.ratioBoosterMythic = 0; + cards.add(new SetCardInfo("Aether Storm", 70, Rarity.UNCOMMON, mage.cards.a.AetherStorm.class)); + cards.add(new SetCardInfo("Abbey Gargoyles", 277, Rarity.UNCOMMON, mage.cards.a.AbbeyGargoyles.class)); + cards.add(new SetCardInfo("Abyssal Specter", 1, Rarity.UNCOMMON, mage.cards.a.AbyssalSpecter.class)); + cards.add(new SetCardInfo("Adarkar Wastes", 410, Rarity.RARE, mage.cards.a.AdarkarWastes.class)); + cards.add(new SetCardInfo("Air Elemental", 71, Rarity.UNCOMMON, mage.cards.a.AirElemental.class)); + cards.add(new SetCardInfo("Akron Legionnaire", 278, Rarity.RARE, mage.cards.a.AkronLegionnaire.class)); + cards.add(new SetCardInfo("Alabaster Potion", 279, Rarity.COMMON, mage.cards.a.AlabasterPotion.class)); + cards.add(new SetCardInfo("Aladdin's Ring", 346, Rarity.RARE, mage.cards.a.AladdinsRing.class)); + cards.add(new SetCardInfo("Ambush Party", 208, Rarity.COMMON, mage.cards.a.AmbushParty.class)); + cards.add(new SetCardInfo("Amulet of Kroog", 347, Rarity.COMMON, mage.cards.a.AmuletOfKroog.class)); + cards.add(new SetCardInfo("An-Havva Constable", 139, Rarity.RARE, mage.cards.a.AnHavvaConstable.class)); + cards.add(new SetCardInfo("Anti-Magic Aura", 72, Rarity.UNCOMMON, mage.cards.a.AntiMagicAura.class)); + cards.add(new SetCardInfo("Angry Mob", 280, Rarity.UNCOMMON, mage.cards.a.AngryMob.class)); + cards.add(new SetCardInfo("Animate Dead", 2, Rarity.UNCOMMON, mage.cards.a.AnimateDead.class)); + cards.add(new SetCardInfo("Animate Wall", 281, Rarity.RARE, mage.cards.a.AnimateWall.class)); + cards.add(new SetCardInfo("Ankh of Mishra", 348, Rarity.RARE, mage.cards.a.AnkhOfMishra.class)); + cards.add(new SetCardInfo("Arenson's Aura", 282, Rarity.UNCOMMON, mage.cards.a.ArensonsAura.class)); + cards.add(new SetCardInfo("Armageddon", 283, Rarity.RARE, mage.cards.a.Armageddon.class)); + cards.add(new SetCardInfo("Armor of Faith", 284, Rarity.COMMON, mage.cards.a.ArmorOfFaith.class)); + cards.add(new SetCardInfo("Ashes to Ashes", 3, Rarity.UNCOMMON, mage.cards.a.AshesToAshes.class)); + cards.add(new SetCardInfo("Ashnod's Altar", 349, Rarity.UNCOMMON, mage.cards.a.AshnodsAltar.class)); + cards.add(new SetCardInfo("Ashnod's Transmogrant", 350, Rarity.COMMON, mage.cards.a.AshnodsTransmogrant.class)); + cards.add(new SetCardInfo("Aspect of Wolf", 140, Rarity.RARE, mage.cards.a.AspectOfWolf.class)); + cards.add(new SetCardInfo("Atog", 209, Rarity.UNCOMMON, mage.cards.a.Atog.class)); + cards.add(new SetCardInfo("Aurochs", 141, Rarity.COMMON, mage.cards.a.Aurochs.class)); + cards.add(new SetCardInfo("Aysen Bureaucrats", 285, Rarity.COMMON, mage.cards.a.AysenBureaucrats.class)); + cards.add(new SetCardInfo("Azure Drake", 73, Rarity.UNCOMMON, mage.cards.a.AzureDrake.class)); + cards.add(new SetCardInfo("Bad Moon", 4, Rarity.RARE, mage.cards.b.BadMoon.class)); + cards.add(new SetCardInfo("Ball Lightning", 210, Rarity.RARE, mage.cards.b.BallLightning.class)); + cards.add(new SetCardInfo("Barbed Sextant", 351, Rarity.COMMON, mage.cards.b.BarbedSextant.class)); + cards.add(new SetCardInfo("Barl's Cage", 352, Rarity.RARE, mage.cards.b.BarlsCage.class)); + cards.add(new SetCardInfo("Battering Ram", 353, Rarity.COMMON, mage.cards.b.BatteringRam.class)); + cards.add(new SetCardInfo("Benalish Hero", 286, Rarity.COMMON, mage.cards.b.BenalishHero.class)); + cards.add(new SetCardInfo("Binding Grasp", 74, Rarity.UNCOMMON, mage.cards.b.BindingGrasp.class)); + cards.add(new SetCardInfo("Bird Maiden", 211, Rarity.COMMON, mage.cards.b.BirdMaiden.class)); + cards.add(new SetCardInfo("Birds of Paradise", 142, Rarity.RARE, mage.cards.b.BirdsOfParadise.class)); + cards.add(new SetCardInfo("Black Knight", 5, Rarity.UNCOMMON, mage.cards.b.BlackKnight.class)); + cards.add(new SetCardInfo("Blessed Wine", 287, Rarity.COMMON, mage.cards.b.BlessedWine.class)); + cards.add(new SetCardInfo("Blight", 6, Rarity.UNCOMMON, mage.cards.b.Blight.class)); + cards.add(new SetCardInfo("Blinking Spirit", 288, Rarity.RARE, mage.cards.b.BlinkingSpirit.class)); + cards.add(new SetCardInfo("Blood Lust", 212, Rarity.COMMON, mage.cards.b.BloodLust.class)); + cards.add(new SetCardInfo("Bog Imp", 7, Rarity.COMMON, mage.cards.b.BogImp.class)); + cards.add(new SetCardInfo("Bog Rats", 8, Rarity.COMMON, mage.cards.b.BogRats.class)); + cards.add(new SetCardInfo("Bog Wraith", 9, Rarity.UNCOMMON, mage.cards.b.BogWraith.class)); + cards.add(new SetCardInfo("Boomerang", 75, Rarity.COMMON, mage.cards.b.Boomerang.class)); + cards.add(new SetCardInfo("Bottle of Suleiman", 354, Rarity.RARE, mage.cards.b.BottleOfSuleiman.class)); + cards.add(new SetCardInfo("Bottomless Vault", 411, Rarity.RARE, mage.cards.b.BottomlessVault.class)); + cards.add(new SetCardInfo("Brainstorm", 76, Rarity.COMMON, mage.cards.b.Brainstorm.class)); + cards.add(new SetCardInfo("Brainwash", 289, Rarity.COMMON, mage.cards.b.Brainwash.class)); + cards.add(new SetCardInfo("Brassclaw Orcs", 213, Rarity.COMMON, BrassclawOrcs.class)); + cards.add(new SetCardInfo("Breeding Pit", 10, Rarity.UNCOMMON, mage.cards.b.BreedingPit.class)); + cards.add(new SetCardInfo("Broken Visage", 11, Rarity.RARE, mage.cards.b.BrokenVisage.class)); + cards.add(new SetCardInfo("Brothers of Fire", 214, Rarity.COMMON, mage.cards.b.BrothersOfFire.class)); + cards.add(new SetCardInfo("Brushland", 412, Rarity.RARE, mage.cards.b.Brushland.class)); + cards.add(new SetCardInfo("Carapace", 143, Rarity.COMMON, mage.cards.c.Carapace.class)); + cards.add(new SetCardInfo("Caribou Range", 290, Rarity.RARE, mage.cards.c.CaribouRange.class)); + cards.add(new SetCardInfo("Carrion Ants", 12, Rarity.UNCOMMON, mage.cards.c.CarrionAnts.class)); + cards.add(new SetCardInfo("Castle", 291, Rarity.UNCOMMON, mage.cards.c.Castle.class)); + cards.add(new SetCardInfo("Cat Warriors", 144, Rarity.COMMON, mage.cards.c.CatWarriors.class)); + cards.add(new SetCardInfo("Cave People", 215, Rarity.UNCOMMON, mage.cards.c.CavePeople.class)); + cards.add(new SetCardInfo("Chub Toad", 145, Rarity.COMMON, mage.cards.c.ChubToad.class)); + cards.add(new SetCardInfo("Circle of Protection: Artifacts", 292, Rarity.COMMON, mage.cards.c.CircleOfProtectionArtifacts.class)); + cards.add(new SetCardInfo("Circle of Protection: Black", 293, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlack.class)); + cards.add(new SetCardInfo("Circle of Protection: Blue", 294, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlue.class)); + cards.add(new SetCardInfo("Circle of Protection: Green", 295, Rarity.COMMON, mage.cards.c.CircleOfProtectionGreen.class)); + cards.add(new SetCardInfo("Circle of Protection: Red", 296, Rarity.COMMON, mage.cards.c.CircleOfProtectionRed.class)); + cards.add(new SetCardInfo("Circle of Protection: White", 297, Rarity.COMMON, mage.cards.c.CircleOfProtectionWhite.class)); + cards.add(new SetCardInfo("City of Brass", 413, Rarity.RARE, mage.cards.c.CityOfBrass.class)); + cards.add(new SetCardInfo("Clay Statue", 355, Rarity.COMMON, mage.cards.c.ClayStatue.class)); + cards.add(new SetCardInfo("Clockwork Beast", 356, Rarity.RARE, mage.cards.c.ClockworkBeast.class)); + cards.add(new SetCardInfo("Clockwork Steed", 357, Rarity.UNCOMMON, mage.cards.c.ClockworkSteed.class)); + cards.add(new SetCardInfo("Cockatrice", 146, Rarity.RARE, mage.cards.c.Cockatrice.class)); + cards.add(new SetCardInfo("Colossus of Sardia", 358, Rarity.RARE, mage.cards.c.ColossusOfSardia.class)); + cards.add(new SetCardInfo("Conquer", 216, Rarity.UNCOMMON, mage.cards.c.Conquer.class)); + cards.add(new SetCardInfo("Coral Helm", 359, Rarity.RARE, mage.cards.c.CoralHelm.class)); + cards.add(new SetCardInfo("Counterspell", 77, Rarity.COMMON, mage.cards.c.Counterspell.class)); + cards.add(new SetCardInfo("Craw Giant", 147, Rarity.UNCOMMON, mage.cards.c.CrawGiant.class)); + cards.add(new SetCardInfo("Craw Wurm", 148, Rarity.COMMON, mage.cards.c.CrawWurm.class)); + cards.add(new SetCardInfo("Crimson Manticore", 217, Rarity.RARE, mage.cards.c.CrimsonManticore.class)); + cards.add(new SetCardInfo("Crown of the Ages", 360, Rarity.RARE, mage.cards.c.CrownOfTheAges.class)); + cards.add(new SetCardInfo("Crumble", 149, Rarity.UNCOMMON, mage.cards.c.Crumble.class)); + cards.add(new SetCardInfo("Crusade", 298, Rarity.RARE, mage.cards.c.Crusade.class)); + cards.add(new SetCardInfo("Crystal Rod", 361, Rarity.UNCOMMON, mage.cards.c.CrystalRod.class)); + cards.add(new SetCardInfo("Cursed Land", 14, Rarity.UNCOMMON, mage.cards.c.CursedLand.class)); + cards.add(new SetCardInfo("Dance of Many", 78, Rarity.RARE, mage.cards.d.DanceOfMany.class)); + cards.add(new SetCardInfo("Dancing Scimitar", 362, Rarity.RARE, mage.cards.d.DancingScimitar.class)); + cards.add(new SetCardInfo("Dandan", 79, Rarity.COMMON, mage.cards.d.Dandan.class)); + cards.add(new SetCardInfo("Dark Maze", 80, Rarity.COMMON, mage.cards.d.DarkMaze.class)); + cards.add(new SetCardInfo("Dark Ritual", 15, Rarity.COMMON, mage.cards.d.DarkRitual.class)); + cards.add(new SetCardInfo("D'Avenant Archer", 299, Rarity.COMMON, mage.cards.d.DAvenantArcher.class)); + cards.add(new SetCardInfo("Deathgrip", 16, Rarity.UNCOMMON, mage.cards.d.Deathgrip.class)); + cards.add(new SetCardInfo("Death Speakers", 300, Rarity.COMMON, mage.cards.d.DeathSpeakers.class)); + cards.add(new SetCardInfo("Death Ward", 301, Rarity.COMMON, mage.cards.d.DeathWard.class)); + cards.add(new SetCardInfo("Deflection", 81, Rarity.RARE, mage.cards.d.Deflection.class)); + cards.add(new SetCardInfo("Derelor", 17, Rarity.RARE, mage.cards.d.Derelor.class)); + cards.add(new SetCardInfo("Desert Twister", 150, Rarity.UNCOMMON, mage.cards.d.DesertTwister.class)); + cards.add(new SetCardInfo("Detonate", 218, Rarity.UNCOMMON, mage.cards.d.Detonate.class)); + cards.add(new SetCardInfo("Diabolic Machine", 363, Rarity.UNCOMMON, mage.cards.d.DiabolicMachine.class)); + cards.add(new SetCardInfo("Dingus Egg", 364, Rarity.RARE, mage.cards.d.DingusEgg.class)); + cards.add(new SetCardInfo("Disenchant", 302, Rarity.COMMON, mage.cards.d.Disenchant.class)); + cards.add(new SetCardInfo("Disintegrate", 219, Rarity.COMMON, mage.cards.d.Disintegrate.class)); + cards.add(new SetCardInfo("Disrupting Scepter", 365, Rarity.RARE, mage.cards.d.DisruptingScepter.class)); + cards.add(new SetCardInfo("Divine Offering", 303, Rarity.COMMON, mage.cards.d.DivineOffering.class)); + 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)); + cards.add(new SetCardInfo("Dwarven Catapult", 220, Rarity.UNCOMMON, mage.cards.d.DwarvenCatapult.class)); + cards.add(new SetCardInfo("Dwarven Hold", 414, Rarity.RARE, mage.cards.d.DwarvenHold.class)); + cards.add(new SetCardInfo("Dwarven Ruins", 415, Rarity.UNCOMMON, mage.cards.d.DwarvenRuins.class)); + cards.add(new SetCardInfo("Dwarven Soldier", 221, Rarity.COMMON, DwarvenSoldier.class)); + cards.add(new SetCardInfo("Dwarven Warriors", 222, Rarity.COMMON, mage.cards.d.DwarvenWarriors.class)); + cards.add(new SetCardInfo("Earthquake", 223, Rarity.RARE, mage.cards.e.Earthquake.class)); + cards.add(new SetCardInfo("Ebon Stronghold", 416, Rarity.UNCOMMON, mage.cards.e.EbonStronghold.class)); + cards.add(new SetCardInfo("Elder Druid", 152, Rarity.RARE, mage.cards.e.ElderDruid.class)); + cards.add(new SetCardInfo("Elkin Bottle", 367, Rarity.RARE, mage.cards.e.ElkinBottle.class)); + cards.add(new SetCardInfo("Elven Riders", 153, Rarity.UNCOMMON, mage.cards.e.ElvenRiders.class)); + cards.add(new SetCardInfo("Elvish Archers", 154, Rarity.RARE, mage.cards.e.ElvishArchers.class)); + cards.add(new SetCardInfo("Energy Flux", 83, Rarity.UNCOMMON, mage.cards.e.EnergyFlux.class)); + cards.add(new SetCardInfo("Enervate", 84, Rarity.COMMON, mage.cards.e.Enervate.class)); + cards.add(new SetCardInfo("Erg Raiders", 20, Rarity.COMMON, mage.cards.e.ErgRaiders.class)); + cards.add(new SetCardInfo("Errantry", 224, Rarity.COMMON, mage.cards.e.Errantry.class)); + cards.add(new SetCardInfo("Eternal Warrior", 225, Rarity.COMMON, mage.cards.e.EternalWarrior.class)); + cards.add(new SetCardInfo("Evil Eye of Orms-by-Gore", 21, Rarity.UNCOMMON, mage.cards.e.EvilEyeOfOrmsByGore.class)); + cards.add(new SetCardInfo("Evil Presence", 22, Rarity.UNCOMMON, mage.cards.e.EvilPresence.class)); + cards.add(new SetCardInfo("Eye for an Eye", 306, Rarity.RARE, mage.cards.e.EyeForAnEye.class)); + cards.add(new SetCardInfo("Fallen Angel", 23, Rarity.UNCOMMON, mage.cards.f.FallenAngel.class)); + cards.add(new SetCardInfo("Fear", 24, Rarity.COMMON, mage.cards.f.Fear.class)); + cards.add(new SetCardInfo("Feedback", 85, Rarity.UNCOMMON, mage.cards.f.Feedback.class)); + cards.add(new SetCardInfo("Feldon's Cane", 368, Rarity.UNCOMMON, mage.cards.f.FeldonsCane.class)); + cards.add(new SetCardInfo("Fellwar Stone", 369, Rarity.UNCOMMON, mage.cards.f.FellwarStone.class)); + cards.add(new SetCardInfo("Feroz's Ban", 370, Rarity.RARE, mage.cards.f.FerozsBan.class)); + cards.add(new SetCardInfo("Fireball", 227, Rarity.COMMON, mage.cards.f.Fireball.class)); + cards.add(new SetCardInfo("Firebreathing", 228, Rarity.COMMON, mage.cards.f.Firebreathing.class)); + cards.add(new SetCardInfo("Fire Drake", 226, Rarity.UNCOMMON, mage.cards.f.FireDrake.class)); + cards.add(new SetCardInfo("Flame Spirit", 229, Rarity.UNCOMMON, mage.cards.f.FlameSpirit.class)); + cards.add(new SetCardInfo("Flare", 230, Rarity.COMMON, mage.cards.f.Flare.class)); + cards.add(new SetCardInfo("Flashfires", 231, Rarity.UNCOMMON, mage.cards.f.Flashfires.class)); + cards.add(new SetCardInfo("Flight", 86, Rarity.COMMON, mage.cards.f.Flight.class)); + cards.add(new SetCardInfo("Flood", 87, Rarity.COMMON, mage.cards.f.Flood.class)); + cards.add(new SetCardInfo("Flying Carpet", 371, Rarity.RARE, mage.cards.f.FlyingCarpet.class)); + cards.add(new SetCardInfo("Fog", 155, Rarity.COMMON, mage.cards.f.Fog.class)); + cards.add(new SetCardInfo("Force of Nature", 156, Rarity.RARE, mage.cards.f.ForceOfNature.class)); + cards.add(new SetCardInfo("Force Spike", 88, Rarity.COMMON, mage.cards.f.ForceSpike.class)); + cards.add(new SetCardInfo("Forest", 417, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 418, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 419, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 420, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forget", 89, Rarity.RARE, mage.cards.f.Forget.class)); + cards.add(new SetCardInfo("Foxfire", 157, Rarity.COMMON, mage.cards.f.Foxfire.class)); + cards.add(new SetCardInfo("Fountain of Youth", 372, Rarity.UNCOMMON, mage.cards.f.FountainOfYouth.class)); + cards.add(new SetCardInfo("Frozen Shade", 25, Rarity.COMMON, mage.cards.f.FrozenShade.class)); + cards.add(new SetCardInfo("Funeral March", 26, Rarity.COMMON, mage.cards.f.FuneralMarch.class)); + cards.add(new SetCardInfo("Fungusaur", 158, Rarity.RARE, mage.cards.f.Fungusaur.class)); + cards.add(new SetCardInfo("Fyndhorn Elder", 159, Rarity.UNCOMMON, mage.cards.f.FyndhornElder.class)); + cards.add(new SetCardInfo("Game of Chaos", 232, Rarity.RARE, mage.cards.g.GameOfChaos.class)); + cards.add(new SetCardInfo("Gaseous Form", 90, Rarity.COMMON, mage.cards.g.GaseousForm.class)); + cards.add(new SetCardInfo("Gauntlets of Chaos", 373, Rarity.RARE, mage.cards.g.GauntletsOfChaos.class)); + cards.add(new SetCardInfo("Ghazban Ogre", 160, Rarity.COMMON, mage.cards.g.GhazbanOgre.class)); + cards.add(new SetCardInfo("Giant Growth", 161, Rarity.COMMON, mage.cards.g.GiantGrowth.class)); + cards.add(new SetCardInfo("Giant Spider", 162, Rarity.COMMON, mage.cards.g.GiantSpider.class)); + cards.add(new SetCardInfo("Giant Strength", 233, Rarity.COMMON, mage.cards.g.GiantStrength.class)); + cards.add(new SetCardInfo("Glacial Wall", 91, Rarity.UNCOMMON, mage.cards.g.GlacialWall.class)); + cards.add(new SetCardInfo("Glasses of Urza", 374, Rarity.UNCOMMON, mage.cards.g.GlassesOfUrza.class)); + cards.add(new SetCardInfo("Gloom", 27, Rarity.UNCOMMON, mage.cards.g.Gloom.class)); + cards.add(new SetCardInfo("Goblin Digging Team", 234, Rarity.COMMON, mage.cards.g.GoblinDiggingTeam.class)); + cards.add(new SetCardInfo("Goblin Hero", 235, Rarity.COMMON, mage.cards.g.GoblinHero.class)); + cards.add(new SetCardInfo("Goblin King", 236, Rarity.RARE, mage.cards.g.GoblinKing.class)); + cards.add(new SetCardInfo("Goblin War Drums", 237, Rarity.COMMON, GoblinWarDrums.class)); + cards.add(new SetCardInfo("Goblin Warrens", 238, Rarity.RARE, mage.cards.g.GoblinWarrens.class)); + cards.add(new SetCardInfo("Grapeshot Catapult", 375, Rarity.COMMON, mage.cards.g.GrapeshotCatapult.class)); + cards.add(new SetCardInfo("Greater Realm of Preservation", 307, Rarity.UNCOMMON, mage.cards.g.GreaterRealmOfPreservation.class)); + cards.add(new SetCardInfo("Greater Werewolf", 28, Rarity.UNCOMMON, mage.cards.g.GreaterWerewolf.class)); + cards.add(new SetCardInfo("Grizzly Bears", 163, Rarity.COMMON, mage.cards.g.GrizzlyBears.class)); + cards.add(new SetCardInfo("Havenwood Battleground", 421, Rarity.UNCOMMON, mage.cards.h.HavenwoodBattleground.class)); + cards.add(new SetCardInfo("Heal", 308, Rarity.COMMON, mage.cards.h.Heal.class)); + cards.add(new SetCardInfo("Healing Salve", 309, Rarity.COMMON, mage.cards.h.HealingSalve.class)); + cards.add(new SetCardInfo("Hecatomb", 29, Rarity.RARE, mage.cards.h.Hecatomb.class)); + cards.add(new SetCardInfo("Helm of Chatzuk", 376, Rarity.RARE, mage.cards.h.HelmOfChatzuk.class)); + cards.add(new SetCardInfo("Hill Giant", 239, Rarity.COMMON, mage.cards.h.HillGiant.class)); + cards.add(new SetCardInfo("Hollow Trees", 422, Rarity.RARE, mage.cards.h.HollowTrees.class)); + cards.add(new SetCardInfo("Holy Strength", 311, Rarity.COMMON, mage.cards.h.HolyStrength.class)); + cards.add(new SetCardInfo("Homarid Warrior", 92, Rarity.COMMON, HomaridWarrior.class)); + cards.add(new SetCardInfo("Howl from Beyond", 30, Rarity.COMMON, mage.cards.h.HowlFromBeyond.class)); + cards.add(new SetCardInfo("Howling Mine", 377, Rarity.RARE, mage.cards.h.HowlingMine.class)); + cards.add(new SetCardInfo("Hungry Mist", 164, Rarity.COMMON, mage.cards.h.HungryMist.class)); + cards.add(new SetCardInfo("Hurkyl's Recall", 93, Rarity.RARE, mage.cards.h.HurkylsRecall.class)); + cards.add(new SetCardInfo("Hurloon Minotaur", 240, Rarity.COMMON, mage.cards.h.HurloonMinotaur.class)); + cards.add(new SetCardInfo("Hurricane", 165, Rarity.UNCOMMON, mage.cards.h.Hurricane.class)); + cards.add(new SetCardInfo("Hydroblast", 94, Rarity.UNCOMMON, mage.cards.h.Hydroblast.class)); + cards.add(new SetCardInfo("Icatian Phalanx", 312, Rarity.UNCOMMON, mage.cards.i.IcatianPhalanx.class)); + cards.add(new SetCardInfo("Icatian Scout", 313, Rarity.COMMON, IcatianScout.class)); + cards.add(new SetCardInfo("Icatian Store", 423, Rarity.RARE, mage.cards.i.IcatianStore.class)); + cards.add(new SetCardInfo("Icatian Town", 314, Rarity.RARE, mage.cards.i.IcatianTown.class)); + cards.add(new SetCardInfo("Ice Floe", 424, Rarity.UNCOMMON, mage.cards.i.IceFloe.class)); + cards.add(new SetCardInfo("Imposing Visage", 241, Rarity.COMMON, mage.cards.i.ImposingVisage.class)); + cards.add(new SetCardInfo("Incinerate", 242, Rarity.COMMON, mage.cards.i.Incinerate.class)); + cards.add(new SetCardInfo("Inferno", 243, Rarity.RARE, mage.cards.i.Inferno.class)); + cards.add(new SetCardInfo("Infinite Hourglass", 378, Rarity.RARE, mage.cards.i.InfiniteHourglass.class)); + cards.add(new SetCardInfo("Initiates of the Ebon Hand", 31, Rarity.COMMON, InitiatesOfTheEbonHand.class)); + cards.add(new SetCardInfo("Instill Energy", 166, Rarity.UNCOMMON, mage.cards.i.InstillEnergy.class)); + cards.add(new SetCardInfo("Ironclaw Curse", 244, Rarity.RARE, mage.cards.i.IronclawCurse.class)); + cards.add(new SetCardInfo("Ironclaw Orcs", 245, Rarity.COMMON, mage.cards.i.IronclawOrcs.class)); + cards.add(new SetCardInfo("Ironroot Treefolk", 167, Rarity.COMMON, mage.cards.i.IronrootTreefolk.class)); + cards.add(new SetCardInfo("Iron Star", 379, Rarity.UNCOMMON, mage.cards.i.IronStar.class)); + cards.add(new SetCardInfo("Island", 425, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 426, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 427, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 428, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island Sanctuary", 315, Rarity.RARE, mage.cards.i.IslandSanctuary.class)); + cards.add(new SetCardInfo("Ivory Cup", 380, Rarity.UNCOMMON, mage.cards.i.IvoryCup.class)); + cards.add(new SetCardInfo("Ivory Guardians", 316, Rarity.UNCOMMON, mage.cards.i.IvoryGuardians.class)); + cards.add(new SetCardInfo("Jade Monolith", 381, Rarity.RARE, mage.cards.j.JadeMonolith.class)); + cards.add(new SetCardInfo("Jalum Tome", 382, Rarity.RARE, mage.cards.j.JalumTome.class)); + cards.add(new SetCardInfo("Jandor's Saddlebags", 383, Rarity.RARE, mage.cards.j.JandorsSaddlebags.class)); + cards.add(new SetCardInfo("Jayemdae Tome", 384, Rarity.RARE, mage.cards.j.JayemdaeTome.class)); + cards.add(new SetCardInfo("Jester's Cap", 385, Rarity.RARE, mage.cards.j.JestersCap.class)); + cards.add(new SetCardInfo("Johtull Wurm", 168, Rarity.UNCOMMON, mage.cards.j.JohtullWurm.class)); + cards.add(new SetCardInfo("Jokulhaups", 246, Rarity.RARE, mage.cards.j.Jokulhaups.class)); + cards.add(new SetCardInfo("Joven's Tools", 386, Rarity.UNCOMMON, mage.cards.j.JovensTools.class)); + cards.add(new SetCardInfo("Justice", 317, Rarity.UNCOMMON, mage.cards.j.Justice.class)); + cards.add(new SetCardInfo("Juxtapose", 95, Rarity.RARE, mage.cards.j.Juxtapose.class)); + cards.add(new SetCardInfo("Karma", 318, Rarity.UNCOMMON, mage.cards.k.Karma.class)); + cards.add(new SetCardInfo("Karplusan Forest", 429, Rarity.RARE, mage.cards.k.KarplusanForest.class)); + cards.add(new SetCardInfo("Keldon Warlord", 247, Rarity.UNCOMMON, mage.cards.k.KeldonWarlord.class)); + cards.add(new SetCardInfo("Killer Bees", 169, Rarity.UNCOMMON, mage.cards.k.KillerBees.class)); + cards.add(new SetCardInfo("Kismet", 319, Rarity.UNCOMMON, mage.cards.k.Kismet.class)); + cards.add(new SetCardInfo("Kjeldoran Dead", 32, Rarity.COMMON, mage.cards.k.KjeldoranDead.class)); + cards.add(new SetCardInfo("Kjeldoran Royal Guard", 320, Rarity.RARE, mage.cards.k.KjeldoranRoyalGuard.class)); + cards.add(new SetCardInfo("Kjeldoran Skycaptain", 321, Rarity.UNCOMMON, mage.cards.k.KjeldoranSkycaptain.class)); + cards.add(new SetCardInfo("Knight of Stromgald", 33, Rarity.UNCOMMON, mage.cards.k.KnightOfStromgald.class)); + cards.add(new SetCardInfo("Krovikan Fetish", 34, Rarity.COMMON, mage.cards.k.KrovikanFetish.class)); + cards.add(new SetCardInfo("Krovikan Sorcerer", 96, Rarity.COMMON, mage.cards.k.KrovikanSorcerer.class)); + cards.add(new SetCardInfo("Labyrinth Minotaur", 97, Rarity.COMMON, mage.cards.l.LabyrinthMinotaur.class)); + cards.add(new SetCardInfo("Leshrac's Rite", 35, Rarity.UNCOMMON, mage.cards.l.LeshracsRite.class)); + cards.add(new SetCardInfo("Leviathan", 98, Rarity.RARE, mage.cards.l.Leviathan.class)); + cards.add(new SetCardInfo("Ley Druid", 170, Rarity.COMMON, mage.cards.l.LeyDruid.class)); + cards.add(new SetCardInfo("Lhurgoyf", 171, Rarity.RARE, mage.cards.l.Lhurgoyf.class)); + cards.add(new SetCardInfo("Library of Leng", 387, Rarity.UNCOMMON, mage.cards.l.LibraryOfLeng.class)); + cards.add(new SetCardInfo("Lifeforce", 172, Rarity.UNCOMMON, mage.cards.l.Lifeforce.class)); + cards.add(new SetCardInfo("Lifetap", 99, Rarity.UNCOMMON, mage.cards.l.Lifetap.class)); + cards.add(new SetCardInfo("Living Artifact", 173, Rarity.RARE, mage.cards.l.LivingArtifact.class)); + cards.add(new SetCardInfo("Living Lands", 174, Rarity.RARE, mage.cards.l.LivingLands.class)); + cards.add(new SetCardInfo("Llanowar Elves", 175, Rarity.COMMON, mage.cards.l.LlanowarElves.class)); + cards.add(new SetCardInfo("Lord of Atlantis", 100, Rarity.RARE, mage.cards.l.LordOfAtlantis.class)); + cards.add(new SetCardInfo("Lord of the Pit", 36, Rarity.RARE, mage.cards.l.LordOfThePit.class)); + cards.add(new SetCardInfo("Lost Soul", 37, Rarity.COMMON, mage.cards.l.LostSoul.class)); + cards.add(new SetCardInfo("Lure", 176, Rarity.UNCOMMON, mage.cards.l.Lure.class)); + cards.add(new SetCardInfo("Magus of the Unseen", 102, Rarity.RARE, mage.cards.m.MagusOfTheUnseen.class)); + cards.add(new SetCardInfo("Manabarbs", 250, Rarity.RARE, mage.cards.m.Manabarbs.class)); + cards.add(new SetCardInfo("Mana Clash", 248, Rarity.RARE, mage.cards.m.ManaClash.class)); + cards.add(new SetCardInfo("Mana Flare", 249, Rarity.RARE, mage.cards.m.ManaFlare.class)); + cards.add(new SetCardInfo("Mana Vault", 388, Rarity.RARE, mage.cards.m.ManaVault.class)); + cards.add(new SetCardInfo("Marsh Viper", 177, Rarity.COMMON, mage.cards.m.MarshViper.class)); + cards.add(new SetCardInfo("Meekstone", 389, Rarity.RARE, mage.cards.m.Meekstone.class)); + cards.add(new SetCardInfo("Memory Lapse", 103, Rarity.COMMON, mage.cards.m.MemoryLapse.class)); + cards.add(new SetCardInfo("Merfolk of the Pearl Trident", 104, Rarity.COMMON, mage.cards.m.MerfolkOfThePearlTrident.class)); + cards.add(new SetCardInfo("Mesa Falcon", 322, Rarity.COMMON, MesaFalcon.class)); + cards.add(new SetCardInfo("Mesa Pegasus", 323, Rarity.COMMON, mage.cards.m.MesaPegasus.class)); + cards.add(new SetCardInfo("Millstone", 390, Rarity.RARE, mage.cards.m.Millstone.class)); + cards.add(new SetCardInfo("Mind Bomb", 105, Rarity.UNCOMMON, mage.cards.m.MindBomb.class)); + cards.add(new SetCardInfo("Mind Ravel", 38, Rarity.COMMON, mage.cards.m.MindRavel.class)); + cards.add(new SetCardInfo("Mindstab Thrull", 40, Rarity.COMMON, MindstabThrull.class)); + cards.add(new SetCardInfo("Mind Warp", 39, Rarity.UNCOMMON, mage.cards.m.MindWarp.class)); + cards.add(new SetCardInfo("Mole Worms", 41, Rarity.UNCOMMON, mage.cards.m.MoleWorms.class)); + cards.add(new SetCardInfo("Mons's Goblin Raiders", 251, Rarity.COMMON, mage.cards.m.MonssGoblinRaiders.class)); + cards.add(new SetCardInfo("Mountain", 430, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 431, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 432, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 433, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain Goat", 252, Rarity.COMMON, mage.cards.m.MountainGoat.class)); + cards.add(new SetCardInfo("Murk Dwellers", 42, Rarity.COMMON, mage.cards.m.MurkDwellers.class)); + cards.add(new SetCardInfo("Nature's Lore", 178, Rarity.COMMON, mage.cards.n.NaturesLore.class)); + cards.add(new SetCardInfo("Necrite", 43, Rarity.COMMON, Necrite.class)); + cards.add(new SetCardInfo("Necropotence", 44, Rarity.RARE, mage.cards.n.Necropotence.class)); + cards.add(new SetCardInfo("Nether Shadow", 45, Rarity.RARE, mage.cards.n.NetherShadow.class)); + cards.add(new SetCardInfo("Nevinyrral's Disk", 391, Rarity.RARE, mage.cards.n.NevinyrralsDisk.class)); + cards.add(new SetCardInfo("Nightmare", 46, Rarity.RARE, mage.cards.n.Nightmare.class)); + cards.add(new SetCardInfo("Obelisk of Undoing", 392, Rarity.RARE, mage.cards.o.ObeliskOfUndoing.class)); + cards.add(new SetCardInfo("Orcish Artillery", 253, Rarity.UNCOMMON, mage.cards.o.OrcishArtillery.class)); + cards.add(new SetCardInfo("Orcish Captain", 254, Rarity.UNCOMMON, mage.cards.o.OrcishCaptain.class)); + cards.add(new SetCardInfo("Orcish Oriflamme", 257, Rarity.UNCOMMON, mage.cards.o.OrcishOriflamme.class)); + cards.add(new SetCardInfo("Orcish Squatters", 258, Rarity.RARE, mage.cards.o.OrcishSquatters.class)); + cards.add(new SetCardInfo("Order of the Sacred Torch", 324, Rarity.RARE, mage.cards.o.OrderOfTheSacredTorch.class)); + cards.add(new SetCardInfo("Order of the White Shield", 325, Rarity.UNCOMMON, mage.cards.o.OrderOfTheWhiteShield.class)); + cards.add(new SetCardInfo("Orgg", 259, Rarity.RARE, mage.cards.o.Orgg.class)); + cards.add(new SetCardInfo("Ornithopter", 393, Rarity.UNCOMMON, mage.cards.o.Ornithopter.class)); + cards.add(new SetCardInfo("Panic", 260, Rarity.COMMON, mage.cards.p.Panic.class)); + cards.add(new SetCardInfo("Paralyze", 47, Rarity.COMMON, mage.cards.p.Paralyze.class)); + cards.add(new SetCardInfo("Pearled Unicorn", 326, Rarity.COMMON, mage.cards.p.PearledUnicorn.class)); + cards.add(new SetCardInfo("Pentagram of the Ages", 394, Rarity.RARE, mage.cards.p.PentagramOfTheAges.class)); + cards.add(new SetCardInfo("Personal Incarnation", 327, Rarity.RARE, mage.cards.p.PersonalIncarnation.class)); + cards.add(new SetCardInfo("Pestilence", 48, Rarity.COMMON, mage.cards.p.Pestilence.class)); + cards.add(new SetCardInfo("Phantasmal Forces", 106, Rarity.UNCOMMON, mage.cards.p.PhantasmalForces.class)); + cards.add(new SetCardInfo("Phantasmal Terrain", 107, Rarity.COMMON, mage.cards.p.PhantasmalTerrain.class)); + cards.add(new SetCardInfo("Phantom Monster", 108, Rarity.UNCOMMON, mage.cards.p.PhantomMonster.class)); + cards.add(new SetCardInfo("Pikemen", 328, Rarity.COMMON, mage.cards.p.Pikemen.class)); + cards.add(new SetCardInfo("Pirate Ship", 109, Rarity.RARE, mage.cards.p.PirateShip.class)); + cards.add(new SetCardInfo("Pit Scorpion", 49, Rarity.COMMON, mage.cards.p.PitScorpion.class)); + cards.add(new SetCardInfo("Plague Rats", 50, Rarity.COMMON, mage.cards.p.PlagueRats.class)); + cards.add(new SetCardInfo("Plains", 434, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Plains", 435, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Plains", 436, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Plains", 437, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Portent", 110, Rarity.COMMON, mage.cards.p.Portent.class)); + cards.add(new SetCardInfo("Power Sink", 111, Rarity.UNCOMMON, mage.cards.p.PowerSink.class)); + cards.add(new SetCardInfo("Pox", 51, Rarity.RARE, mage.cards.p.Pox.class)); + cards.add(new SetCardInfo("Pradesh Gypsies", 179, Rarity.COMMON, mage.cards.p.PradeshGypsies.class)); + cards.add(new SetCardInfo("Primal Clay", 395, Rarity.RARE, mage.cards.p.PrimalClay.class)); + cards.add(new SetCardInfo("Primal Order", 180, Rarity.RARE, mage.cards.p.PrimalOrder.class)); + cards.add(new SetCardInfo("Primordial Ooze", 261, Rarity.UNCOMMON, mage.cards.p.PrimordialOoze.class)); + cards.add(new SetCardInfo("Prismatic Ward", 329, Rarity.COMMON, mage.cards.p.PrismaticWard.class)); + cards.add(new SetCardInfo("Prodigal Sorcerer", 112, Rarity.COMMON, mage.cards.p.ProdigalSorcerer.class)); + cards.add(new SetCardInfo("Psychic Venom", 113, Rarity.COMMON, mage.cards.p.PsychicVenom.class)); + cards.add(new SetCardInfo("Pyroblast", 262, Rarity.UNCOMMON, mage.cards.p.Pyroblast.class)); + cards.add(new SetCardInfo("Pyrotechnics", 263, Rarity.UNCOMMON, mage.cards.p.Pyrotechnics.class)); + cards.add(new SetCardInfo("Rabid Wombat", 181, Rarity.UNCOMMON, mage.cards.r.RabidWombat.class)); + cards.add(new SetCardInfo("Radjan Spirit", 182, Rarity.UNCOMMON, mage.cards.r.RadjanSpirit.class)); + cards.add(new SetCardInfo("Rag Man", 52, Rarity.RARE, mage.cards.r.RagMan.class)); + cards.add(new SetCardInfo("Raise Dead", 53, Rarity.COMMON, mage.cards.r.RaiseDead.class)); + cards.add(new SetCardInfo("Ray of Command", 114, Rarity.COMMON, mage.cards.r.RayOfCommand.class)); + cards.add(new SetCardInfo("Recall", 115, Rarity.RARE, mage.cards.r.Recall.class)); + cards.add(new SetCardInfo("Reef Pirates", 116, Rarity.COMMON, ReefPirates.class)); + cards.add(new SetCardInfo("Regeneration", 183, Rarity.COMMON, mage.cards.r.Regeneration.class)); + cards.add(new SetCardInfo("Remove Soul", 117, Rarity.COMMON, mage.cards.r.RemoveSoul.class)); + cards.add(new SetCardInfo("Repentant Blacksmith", 330, Rarity.COMMON, mage.cards.r.RepentantBlacksmith.class)); + cards.add(new SetCardInfo("Reverse Damage", 331, Rarity.RARE, mage.cards.r.ReverseDamage.class)); + cards.add(new SetCardInfo("Righteousness", 332, Rarity.RARE, mage.cards.r.Righteousness.class)); + cards.add(new SetCardInfo("Rod of Ruin", 396, Rarity.UNCOMMON, mage.cards.r.RodOfRuin.class)); + cards.add(new SetCardInfo("Ruins of Trokair", 438, Rarity.UNCOMMON, mage.cards.r.RuinsOfTrokair.class)); + cards.add(new SetCardInfo("Sabretooth Tiger", 264, Rarity.COMMON, mage.cards.s.SabretoothTiger.class)); + cards.add(new SetCardInfo("Samite Healer", 334, Rarity.COMMON, mage.cards.s.SamiteHealer.class)); + cards.add(new SetCardInfo("Sand Silos", 439, Rarity.RARE, mage.cards.s.SandSilos.class)); + cards.add(new SetCardInfo("Scaled Wurm", 184, Rarity.COMMON, mage.cards.s.ScaledWurm.class)); + cards.add(new SetCardInfo("Scathe Zombies", 54, Rarity.COMMON, mage.cards.s.ScatheZombies.class)); + cards.add(new SetCardInfo("Scavenger Folk", 185, Rarity.COMMON, mage.cards.s.ScavengerFolk.class)); + cards.add(new SetCardInfo("Scryb Sprites", 186, Rarity.COMMON, mage.cards.s.ScrybSprites.class)); + cards.add(new SetCardInfo("Sea Serpent", 118, Rarity.COMMON, mage.cards.s.SeaSerpent.class)); + cards.add(new SetCardInfo("Seasinger", 121, Rarity.UNCOMMON, mage.cards.s.Seasinger.class)); + cards.add(new SetCardInfo("Sea Spirit", 119, Rarity.UNCOMMON, mage.cards.s.SeaSpirit.class)); + cards.add(new SetCardInfo("Sea Sprite", 120, Rarity.UNCOMMON, mage.cards.s.SeaSprite.class)); + cards.add(new SetCardInfo("Segovian Leviathan", 122, Rarity.UNCOMMON, mage.cards.s.SegovianLeviathan.class)); + cards.add(new SetCardInfo("Sengir Autocrat", 55, Rarity.RARE, mage.cards.s.SengirAutocrat.class)); + cards.add(new SetCardInfo("Serpent Generator", 397, Rarity.RARE, mage.cards.s.SerpentGenerator.class)); + cards.add(new SetCardInfo("Serra Bestiary", 336, Rarity.UNCOMMON, mage.cards.s.SerraBestiary.class)); + cards.add(new SetCardInfo("Serra Paladin", 337, Rarity.UNCOMMON, mage.cards.s.SerraPaladin.class)); + cards.add(new SetCardInfo("Shanodin Dryads", 187, Rarity.COMMON, mage.cards.s.ShanodinDryads.class)); + cards.add(new SetCardInfo("Shapeshifter", 398, Rarity.UNCOMMON, mage.cards.s.Shapeshifter.class)); + cards.add(new SetCardInfo("Shatter", 265, Rarity.COMMON, mage.cards.s.Shatter.class)); + cards.add(new SetCardInfo("Shatterstorm", 266, Rarity.UNCOMMON, mage.cards.s.Shatterstorm.class)); + cards.add(new SetCardInfo("Shield Bearer", 338, Rarity.COMMON, mage.cards.s.ShieldBearer.class)); + cards.add(new SetCardInfo("Shield Wall", 339, Rarity.COMMON, mage.cards.s.ShieldWall.class)); + cards.add(new SetCardInfo("Shivan Dragon", 267, Rarity.RARE, mage.cards.s.ShivanDragon.class)); + cards.add(new SetCardInfo("Shrink", 188, Rarity.COMMON, mage.cards.s.Shrink.class)); + cards.add(new SetCardInfo("Sibilant Spirit", 123, Rarity.RARE, mage.cards.s.SibilantSpirit.class)); + cards.add(new SetCardInfo("Skull Catapult", 399, Rarity.UNCOMMON, mage.cards.s.SkullCatapult.class)); + cards.add(new SetCardInfo("Smoke", 268, Rarity.RARE, mage.cards.s.Smoke.class)); + cards.add(new SetCardInfo("Sorceress Queen", 56, Rarity.RARE, mage.cards.s.SorceressQueen.class)); + cards.add(new SetCardInfo("Soul Barrier", 125, Rarity.COMMON, mage.cards.s.SoulBarrier.class)); + cards.add(new SetCardInfo("Soul Net", 400, Rarity.UNCOMMON, mage.cards.s.SoulNet.class)); + cards.add(new SetCardInfo("Spell Blast", 126, Rarity.COMMON, mage.cards.s.SpellBlast.class)); + cards.add(new SetCardInfo("Spirit Link", 340, Rarity.UNCOMMON, mage.cards.s.SpiritLink.class)); + cards.add(new SetCardInfo("Stampede", 189, Rarity.RARE, mage.cards.s.Stampede.class)); + cards.add(new SetCardInfo("Stasis", 127, Rarity.RARE, mage.cards.s.Stasis.class)); + cards.add(new SetCardInfo("Steal Artifact", 128, Rarity.UNCOMMON, mage.cards.s.StealArtifact.class)); + cards.add(new SetCardInfo("Stone Giant", 269, Rarity.UNCOMMON, mage.cards.s.StoneGiant.class)); + cards.add(new SetCardInfo("Stone Rain", 270, Rarity.COMMON, mage.cards.s.StoneRain.class)); + cards.add(new SetCardInfo("Stone Spirit", 271, Rarity.UNCOMMON, mage.cards.s.StoneSpirit.class)); + cards.add(new SetCardInfo("Stream of Life", 190, Rarity.COMMON, mage.cards.s.StreamOfLife.class)); + cards.add(new SetCardInfo("Stromgald Cabal", 57, Rarity.RARE, mage.cards.s.StromgaldCabal.class)); + cards.add(new SetCardInfo("Sulfurous Springs", 440, Rarity.RARE, mage.cards.s.SulfurousSprings.class)); + cards.add(new SetCardInfo("Svyelunite Temple", 441, Rarity.UNCOMMON, mage.cards.s.SvyeluniteTemple.class)); + cards.add(new SetCardInfo("Swamp", 442, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 443, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 444, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 445, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Sylvan Library", 191, Rarity.RARE, mage.cards.s.SylvanLibrary.class)); + cards.add(new SetCardInfo("Tarpan", 192, Rarity.COMMON, mage.cards.t.Tarpan.class)); + cards.add(new SetCardInfo("Tawnos's Weaponry", 401, Rarity.UNCOMMON, mage.cards.t.TawnossWeaponry.class)); + cards.add(new SetCardInfo("Terror", 58, Rarity.COMMON, mage.cards.t.Terror.class)); + cards.add(new SetCardInfo("The Brute", 272, Rarity.COMMON, mage.cards.t.TheBrute.class)); + cards.add(new SetCardInfo("The Hive", 402, Rarity.RARE, mage.cards.t.TheHive.class)); + cards.add(new SetCardInfo("The Wretched", 59, Rarity.RARE, mage.cards.t.TheWretched.class)); + cards.add(new SetCardInfo("Thicket Basilisk", 193, Rarity.UNCOMMON, mage.cards.t.ThicketBasilisk.class)); + cards.add(new SetCardInfo("Throne of Bone", 403, Rarity.UNCOMMON, mage.cards.t.ThroneOfBone.class)); + cards.add(new SetCardInfo("Thrull Retainer", 60, Rarity.UNCOMMON, mage.cards.t.ThrullRetainer.class)); + cards.add(new SetCardInfo("Time Bomb", 404, Rarity.RARE, mage.cards.t.TimeBomb.class)); + cards.add(new SetCardInfo("Time Elemental", 129, Rarity.RARE, mage.cards.t.TimeElemental.class)); + cards.add(new SetCardInfo("Titania's Song", 194, Rarity.RARE, mage.cards.t.TitaniasSong.class)); + cards.add(new SetCardInfo("Torture", 61, Rarity.COMMON, Torture.class)); + cards.add(new SetCardInfo("Touch of Death", 62, Rarity.COMMON, mage.cards.t.TouchOfDeath.class)); + cards.add(new SetCardInfo("Tranquility", 195, Rarity.COMMON, mage.cards.t.Tranquility.class)); + cards.add(new SetCardInfo("Truce", 341, Rarity.RARE, mage.cards.t.Truce.class)); + cards.add(new SetCardInfo("Tsunami", 196, Rarity.UNCOMMON, mage.cards.t.Tsunami.class)); + cards.add(new SetCardInfo("Tundra Wolves", 342, Rarity.COMMON, mage.cards.t.TundraWolves.class)); + cards.add(new SetCardInfo("Twiddle", 130, Rarity.COMMON, mage.cards.t.Twiddle.class)); + cards.add(new SetCardInfo("Underground River", 446, Rarity.RARE, mage.cards.u.UndergroundRiver.class)); + cards.add(new SetCardInfo("Unholy Strength", 63, Rarity.COMMON, mage.cards.u.UnholyStrength.class)); + cards.add(new SetCardInfo("Unstable Mutation", 131, Rarity.COMMON, mage.cards.u.UnstableMutation.class)); + cards.add(new SetCardInfo("Unsummon", 132, Rarity.COMMON, mage.cards.u.Unsummon.class)); + cards.add(new SetCardInfo("Untamed Wilds", 197, Rarity.UNCOMMON, mage.cards.u.UntamedWilds.class)); + cards.add(new SetCardInfo("Updraft", 133, Rarity.COMMON, mage.cards.u.Updraft.class)); + cards.add(new SetCardInfo("Urza's Avenger", 405, Rarity.RARE, mage.cards.u.UrzasAvenger.class)); + cards.add(new SetCardInfo("Urza's Bauble", 406, Rarity.UNCOMMON, mage.cards.u.UrzasBauble.class)); + cards.add(new SetCardInfo("Urza's Mine", 447, Rarity.COMMON, mage.cards.u.UrzasMine.class)); + cards.add(new SetCardInfo("Urza's Power Plant", 448, Rarity.COMMON, mage.cards.u.UrzasPowerPlant.class)); + cards.add(new SetCardInfo("Urza's Tower", 449, Rarity.COMMON, mage.cards.u.UrzasTower.class)); + cards.add(new SetCardInfo("Vampire Bats", 64, Rarity.COMMON, mage.cards.v.VampireBats.class)); + cards.add(new SetCardInfo("Venom", 198, Rarity.COMMON, mage.cards.v.Venom.class)); + cards.add(new SetCardInfo("Verduran Enchantress", 199, Rarity.RARE, mage.cards.v.VerduranEnchantress.class)); + cards.add(new SetCardInfo("Vodalian Soldiers", 134, Rarity.COMMON, VodalianSoldiers.class)); + cards.add(new SetCardInfo("Wall of Air", 135, Rarity.UNCOMMON, mage.cards.w.WallOfAir.class)); + cards.add(new SetCardInfo("Wall of Bone", 65, Rarity.UNCOMMON, mage.cards.w.WallOfBone.class)); + cards.add(new SetCardInfo("Wall of Brambles", 200, Rarity.UNCOMMON, mage.cards.w.WallOfBrambles.class)); + cards.add(new SetCardInfo("Wall of Fire", 273, Rarity.UNCOMMON, mage.cards.w.WallOfFire.class)); + cards.add(new SetCardInfo("Wall of Spears", 407, Rarity.COMMON, mage.cards.w.WallOfSpears.class)); + cards.add(new SetCardInfo("Wall of Stone", 274, Rarity.UNCOMMON, mage.cards.w.WallOfStone.class)); + cards.add(new SetCardInfo("Wall of Swords", 343, Rarity.UNCOMMON, mage.cards.w.WallOfSwords.class)); + cards.add(new SetCardInfo("Wanderlust", 201, Rarity.UNCOMMON, mage.cards.w.Wanderlust.class)); + cards.add(new SetCardInfo("War Mammoth", 202, Rarity.COMMON, mage.cards.w.WarMammoth.class)); + cards.add(new SetCardInfo("Warp Artifact", 66, Rarity.RARE, mage.cards.w.WarpArtifact.class)); + cards.add(new SetCardInfo("Weakness", 67, Rarity.COMMON, mage.cards.w.Weakness.class)); + cards.add(new SetCardInfo("Whirling Dervish", 203, Rarity.UNCOMMON, mage.cards.w.WhirlingDervish.class)); + cards.add(new SetCardInfo("White Knight", 344, Rarity.UNCOMMON, mage.cards.w.WhiteKnight.class)); + cards.add(new SetCardInfo("Wild Growth", 204, Rarity.COMMON, mage.cards.w.WildGrowth.class)); + cards.add(new SetCardInfo("Winds of Change", 275, Rarity.RARE, mage.cards.w.WindsOfChange.class)); + cards.add(new SetCardInfo("Wind Spirit", 136, Rarity.UNCOMMON, mage.cards.w.WindSpirit.class)); + cards.add(new SetCardInfo("Winter Blast", 205, Rarity.UNCOMMON, mage.cards.w.WinterBlast.class)); + cards.add(new SetCardInfo("Winter Orb", 408, Rarity.RARE, mage.cards.w.WinterOrb.class)); + cards.add(new SetCardInfo("Wolverine Pack", 206, Rarity.UNCOMMON, mage.cards.w.WolverinePack.class)); + cards.add(new SetCardInfo("Wooden Sphere", 409, Rarity.UNCOMMON, mage.cards.w.WoodenSphere.class)); + cards.add(new SetCardInfo("Word of Blasting", 276, Rarity.UNCOMMON, mage.cards.w.WordOfBlasting.class)); + cards.add(new SetCardInfo("Wrath of God", 345, Rarity.RARE, mage.cards.w.WrathOfGod.class)); + cards.add(new SetCardInfo("Wyluli Wolf", 207, Rarity.RARE, mage.cards.w.WyluliWolf.class)); + cards.add(new SetCardInfo("Xenic Poltergeist", 68, Rarity.RARE, mage.cards.x.XenicPoltergeist.class)); + cards.add(new SetCardInfo("Zephyr Falcon", 137, Rarity.COMMON, mage.cards.z.ZephyrFalcon.class)); + cards.add(new SetCardInfo("Zombie Master", 69, Rarity.RARE, mage.cards.z.ZombieMaster.class)); + cards.add(new SetCardInfo("Zur's Weirding", 138, Rarity.RARE, mage.cards.z.ZursWeirding.class)); + } + +} From dcd3e7c0395b12dc11cd41bf58785fa06f640ad9 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 8 May 2018 23:46:34 +0200 Subject: [PATCH 093/158] * Some more fixed/reworked card movement handling. --- Mage.Client/serverlist.txt | 1 - .../mage/cards/a/ApproachOfTheSecondSun.java | 24 +-------- Mage.Sets/src/mage/cards/c/Chronostutter.java | 26 +++------ Mage.Sets/src/mage/cards/c/CommitMemory.java | 44 +++------------ .../src/mage/cards/c/CreamOfTheCrop.java | 22 ++++---- Mage.Sets/src/mage/cards/c/CruelFate.java | 45 +++++----------- Mage.Sets/src/mage/cards/d/DarkBargain.java | 9 +--- Mage.Sets/src/mage/cards/d/DarkConfidant.java | 6 +-- Mage.Sets/src/mage/cards/d/DarkTutelage.java | 25 ++++----- .../src/mage/cards/d/DemonlordBelzenlok.java | 12 ++--- .../src/mage/cards/d/DeployTheGatewatch.java | 19 ++----- .../src/mage/cards/d/DestroyTheEvidence.java | 19 +++---- Mage.Sets/src/mage/cards/d/DimirCharm.java | 42 +++++++-------- .../src/mage/cards/d/DimirMachinations.java | 53 ++++++------------- .../cards/d/DivergentTransformations.java | 27 ++++------ .../src/mage/cards/d/DuskmantleSeer.java | 10 ++-- .../src/mage/cards/e/ElementalAugury.java | 13 ++--- Mage.Sets/src/mage/cards/e/ElkinBottle.java | 23 +++----- Mage.Sets/src/mage/cards/e/EnigmaSphinx.java | 25 +++------ .../src/mage/cards/e/ErraticExplosion.java | 16 ++---- .../src/mage/cards/e/ErraticMutation.java | 12 ++--- .../src/mage/cards/e/ExplosiveRevelation.java | 32 ++++++----- Mage.Sets/src/mage/cards/e/EyeOfYawgmoth.java | 20 ++----- .../src/mage/cards/f/FlamesOfRemembrance.java | 52 ++++++------------ Mage.Sets/src/mage/cards/l/LongTermPlans.java | 2 +- .../src/mage/cards/o/OrochiSustainer.java | 5 +- .../mage/cards/t/TeferiHeroOfDominaria.java | 13 +---- .../java/org/mage/test/player/TestPlayer.java | 5 ++ .../java/org/mage/test/stub/PlayerStub.java | 5 ++ Mage/src/main/java/mage/players/Library.java | 31 ++++------- Mage/src/main/java/mage/players/Player.java | 11 ++++ .../main/java/mage/players/PlayerImpl.java | 22 ++++++++ Mage/src/main/java/mage/util/CardUtil.java | 10 ++++ Utils/gen-list-unimplemented-cards-for-set.pl | 8 +-- 34 files changed, 253 insertions(+), 436 deletions(-) diff --git a/Mage.Client/serverlist.txt b/Mage.Client/serverlist.txt index fdceb7823dc..caecdb8ac02 100644 --- a/Mage.Client/serverlist.txt +++ b/Mage.Client/serverlist.txt @@ -1,6 +1,5 @@ XMage.de 1 (Europe/Germany) fast :xmage.de:17171 old xmage.de (Europe/Germany) :185.3.232.200:17171 -xmage.us (North America/USA) :xmage.us:17171 XMage Players MTG:xmageplayersmtg.ddns.net:17171 XMage.tahiti :xmage.tahiti.one:443 Seedds Server (Asia) :115.29.203.80:17171 diff --git a/Mage.Sets/src/mage/cards/a/ApproachOfTheSecondSun.java b/Mage.Sets/src/mage/cards/a/ApproachOfTheSecondSun.java index f87cfd3a35a..b8d7e21facc 100644 --- a/Mage.Sets/src/mage/cards/a/ApproachOfTheSecondSun.java +++ b/Mage.Sets/src/mage/cards/a/ApproachOfTheSecondSun.java @@ -79,29 +79,7 @@ class ApproachOfTheSecondSunEffect extends OneShotEffect { } Card spellCard = game.getStack().getSpell(source.getSourceId()).getCard(); if (spellCard != null) { - List top6 = new ArrayList<>(); - // Cut the top 6 cards off into a temporary array - for (int i = 0; i < 6 && controller.getLibrary().hasCards(); ++i) { - top6.add(controller.getLibrary().removeFromTop(game)); - } - - // Is the library now empty, thus the rise is on the bottom (for the message to the players)? - boolean isOnBottom = controller.getLibrary().size() < 6; - // Put this card (if the ability came from an ApproachOfTheSecondSun spell card) on top - spellCard.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); - - // put the top 6 we took earlier back on top (going in reverse order this time to get them back - // on top in the proper order) - for (int i = top6.size() - 1; i >= 0; --i) { - controller.getLibrary().putOnTop(top6.get(i), game); - } - - // Inform the players - if (isOnBottom) { - game.informPlayers(controller.getLogName() + " puts " + spell.getLogName() + " on the bottom of their library."); - } else { - game.informPlayers(controller.getLogName() + " puts " + spell.getLogName() + " into their library 7th from the top."); - } + controller.putCardOnTopXOfLibrary(spellCard, game, source, 7); } } return true; diff --git a/Mage.Sets/src/mage/cards/c/Chronostutter.java b/Mage.Sets/src/mage/cards/c/Chronostutter.java index 2bd233048b2..7a3499c45f9 100644 --- a/Mage.Sets/src/mage/cards/c/Chronostutter.java +++ b/Mage.Sets/src/mage/cards/c/Chronostutter.java @@ -30,12 +30,10 @@ package mage.cards.c; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; -import mage.constants.Zone; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; @@ -48,8 +46,7 @@ import mage.target.common.TargetCreaturePermanent; public class Chronostutter extends CardImpl { public Chronostutter(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{5}{U}"); - + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{5}{U}"); // Put target creature into its owner's library second from the top. this.getSpellAbility().addEffect(new ChronostutterEffect()); @@ -85,22 +82,11 @@ class ChronostutterEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(source.getFirstTarget()); - if (permanent != null) { - Player owner = game.getPlayer(permanent.getOwnerId()); - Player controller = game.getPlayer(permanent.getControllerId()); - if (owner == null || controller == null) { - return false; - } - - Card card = null; - if (owner.getLibrary().hasCards()) { - card = owner.getLibrary().removeFromTop(game); - } - - permanent.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); - if (card != null) { - owner.getLibrary().putOnTop(card, game); + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (permanent != null) { + controller.putCardOnTopXOfLibrary(permanent, game, source, 2); } return true; } diff --git a/Mage.Sets/src/mage/cards/c/CommitMemory.java b/Mage.Sets/src/mage/cards/c/CommitMemory.java index 5ec85447778..88a3bfed1dc 100644 --- a/Mage.Sets/src/mage/cards/c/CommitMemory.java +++ b/Mage.Sets/src/mage/cards/c/CommitMemory.java @@ -33,7 +33,6 @@ import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DrawCardAllEffect; import mage.abilities.keyword.AftermathAbility; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.cards.SplitCard; @@ -107,43 +106,16 @@ class CommitEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(source.getFirstTarget()); - if (permanent != null) { - Player owner = game.getPlayer(permanent.getOwnerId()); - Player controller = game.getPlayer(permanent.getControllerId()); - if (owner == null || controller == null) { - return false; + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (permanent != null) { + return controller.putCardOnTopXOfLibrary(permanent, game, source, 2); } - - Card card = null; - if (owner.getLibrary().hasCards()) { - card = owner.getLibrary().removeFromTop(game); + Spell spell = game.getStack().getSpell(source.getFirstTarget()); + if (spell != null) { + return controller.putCardOnTopXOfLibrary(spell, game, source, 2); } - - permanent.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); - if (card != null) { - owner.getLibrary().putOnTop(card, game); - } - return true; - } - Spell spell = game.getStack().getSpell(source.getFirstTarget()); - if (spell != null) { - Player owner = game.getPlayer(spell.getOwnerId()); - Player controller = game.getPlayer(spell.getControllerId()); - if (owner == null || controller == null) { - return false; - } - - Card card = null; - if (owner.getLibrary().hasCards()) { - card = owner.getLibrary().removeFromTop(game); - } - - spell.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); - if (card != null) { - owner.getLibrary().putOnTop(card, game); - } - return true; } return false; } diff --git a/Mage.Sets/src/mage/cards/c/CreamOfTheCrop.java b/Mage.Sets/src/mage/cards/c/CreamOfTheCrop.java index 28151228784..3d94b9d83f7 100644 --- a/Mage.Sets/src/mage/cards/c/CreamOfTheCrop.java +++ b/Mage.Sets/src/mage/cards/c/CreamOfTheCrop.java @@ -89,21 +89,19 @@ class CreamOfTheCropEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); + Player controller = game.getPlayer(source.getControllerId()); Permanent permanent = ((FixedTarget) getTargetPointer()).getTargetedPermanentOrLKIBattlefield(game); - if (player != null && permanent != null) { - int numLooked = Math.min(permanent.getPower().getValue(), player.getLibrary().size()); - if (numLooked > 0) { - Cards cards = new CardsImpl(); - for (int i = 0; i < numLooked; i++) { - cards.add(player.getLibrary().removeFromTop(game)); - } + if (controller != null && permanent != null) { + Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, permanent.getPower().getValue())); + if (!cards.isEmpty()) { TargetCard target = new TargetCardInHand(new FilterCard("card to put on top of your library")); - player.choose(Outcome.Benefit, cards, target, game); + controller.choose(Outcome.Benefit, cards, target, game); Card card = cards.get(target.getFirstTarget(), game); - cards.remove(card); - player.moveCardToLibraryWithInfo(card, source.getSourceId(), game, Zone.LIBRARY, true, false); - player.putCardsOnBottomOfLibrary(cards, game, source, true); + if (card != null) { + cards.remove(card); + controller.putCardsOnTopOfLibrary(new CardsImpl(card), game, source, true); + } + controller.putCardsOnBottomOfLibrary(cards, game, source, true); } return true; } diff --git a/Mage.Sets/src/mage/cards/c/CruelFate.java b/Mage.Sets/src/mage/cards/c/CruelFate.java index 8863d25beaa..8fab4b1f991 100644 --- a/Mage.Sets/src/mage/cards/c/CruelFate.java +++ b/Mage.Sets/src/mage/cards/c/CruelFate.java @@ -89,51 +89,30 @@ class CruelFateEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Card sourceCard = game.getCard(source.getSourceId()); if (sourceCard != null) { - Player you = game.getPlayer(source.getControllerId()); - Player player = game.getPlayer(source.getFirstTarget()); - if (player != null && you != null) { - Cards cards = new CardsImpl(); - int count = Math.min(player.getLibrary().size(), 5); - for (int i = 0; i < count; i++) { - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - } - } - - you.lookAtCards(sourceCard.getIdName(), cards, game); + Player controller = game.getPlayer(source.getControllerId()); + Player targetOpponent = game.getPlayer(getTargetPointer().getFirst(game, source)); + if (targetOpponent != null && controller != null) { + Cards cards = new CardsImpl(targetOpponent.getLibrary().getTopCards(game, 5)); + controller.lookAtCards(source, null, cards, game); // card to put into opponent's graveyard TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCard("card to put into target opponent's graveyard")); - if (player.canRespond()) { + if (targetOpponent.isInGame()) { if (cards.size() > 1) { - you.choose(Outcome.Detriment, cards, target, game); + controller.choose(Outcome.Detriment, cards, target, game); Card card = cards.get(target.getFirstTarget(), game); if (card != null) { cards.remove(card); - card.moveToZone(Zone.GRAVEYARD, source.getSourceId(), game, true); + controller.moveCards(card, Zone.GRAVEYARD, source, game); } - } - else if (cards.size() == 1) { + } else if (cards.size() == 1) { Card card = cards.get(cards.iterator().next(), game); + controller.moveCards(card, Zone.GRAVEYARD, source, game); card.moveToZone(Zone.GRAVEYARD, source.getSourceId(), game, true); + cards.clear(); } } - // cards to put on the top of opponent's library - TargetCard target2 = new TargetCard(Zone.LIBRARY, new FilterCard("card to put on the top of target opponent's library")); - while (player.canRespond() && cards.size() > 1) { - you.choose(Outcome.Neutral, cards, target2, game); - Card card = cards.get(target2.getFirstTarget(), game); - if (card != null) { - cards.remove(card); - card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); - } - target2.clearChosen(); - } - if (cards.size() == 1) { - Card card = cards.get(cards.iterator().next(), game); - card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); - } + controller.putCardsOnTopOfLibrary(cards, game, source, true); return true; } } diff --git a/Mage.Sets/src/mage/cards/d/DarkBargain.java b/Mage.Sets/src/mage/cards/d/DarkBargain.java index c649310409b..1dd99d314c9 100644 --- a/Mage.Sets/src/mage/cards/d/DarkBargain.java +++ b/Mage.Sets/src/mage/cards/d/DarkBargain.java @@ -87,14 +87,7 @@ class DarkBargainEffect extends OneShotEffect { Player player = game.getPlayer(source.getControllerId()); MageObject sourceOject = source.getSourceObject(game); if (player != null && sourceOject != null) { - Cards cards = new CardsImpl(); - int cardsCount = Math.min(3, player.getLibrary().size()); - for (int i = 0; i < cardsCount; i++) { - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - } - } + Cards cards = new CardsImpl(player.getLibrary().getTopCards(game, 3)); if (!cards.isEmpty()) { Cards cardsToHand = new CardsImpl(); player.lookAtCards(sourceOject.getIdName(), cards, game); diff --git a/Mage.Sets/src/mage/cards/d/DarkConfidant.java b/Mage.Sets/src/mage/cards/d/DarkConfidant.java index bca6a50257b..2dc4d58361c 100644 --- a/Mage.Sets/src/mage/cards/d/DarkConfidant.java +++ b/Mage.Sets/src/mage/cards/d/DarkConfidant.java @@ -34,8 +34,8 @@ import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.cards.*; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.TargetController; import mage.constants.Zone; import mage.game.Game; @@ -49,7 +49,7 @@ import mage.players.Player; public class DarkConfidant extends CardImpl { public DarkConfidant(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WIZARD); @@ -87,7 +87,7 @@ class DarkConfidantEffect extends OneShotEffect { Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); if (controller != null && sourcePermanent != null) { if (controller.getLibrary().hasCards()) { - Card card = controller.getLibrary().removeFromTop(game); + Card card = controller.getLibrary().getFromTop(game); if (card != null) { Cards cards = new CardsImpl(card); controller.revealCards(sourcePermanent.getIdName(), cards, game); diff --git a/Mage.Sets/src/mage/cards/d/DarkTutelage.java b/Mage.Sets/src/mage/cards/d/DarkTutelage.java index 150301fdc2c..3895e610a74 100644 --- a/Mage.Sets/src/mage/cards/d/DarkTutelage.java +++ b/Mage.Sets/src/mage/cards/d/DarkTutelage.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,12 +20,11 @@ * 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.UUID; @@ -47,7 +46,7 @@ import mage.players.Player; public class DarkTutelage extends CardImpl { public DarkTutelage(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}"); this.addAbility(new OnEventTriggeredAbility(EventType.UPKEEP_STEP_PRE, "beginning of your upkeep", new DarkTutelageEffect(), false)); } @@ -75,15 +74,13 @@ class DarkTutelageEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player != null && player.getLibrary().hasCards()) { - Card card = player.getLibrary().removeFromTop(game); + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + Card card = controller.getLibrary().getFromTop(game); if (card != null) { + controller.revealCards(source, new CardsImpl(card), game); card.moveToZone(Zone.HAND, source.getSourceId(), game, false); - player.loseLife(card.getConvertedManaCost(), game, false); - Cards cards = new CardsImpl(); - cards.add(card); - player.revealCards("Dark Tutelage", cards, game); + controller.loseLife(card.getConvertedManaCost(), game, false); return true; } } diff --git a/Mage.Sets/src/mage/cards/d/DemonlordBelzenlok.java b/Mage.Sets/src/mage/cards/d/DemonlordBelzenlok.java index cac0c1d439a..0e5273b82d8 100644 --- a/Mage.Sets/src/mage/cards/d/DemonlordBelzenlok.java +++ b/Mage.Sets/src/mage/cards/d/DemonlordBelzenlok.java @@ -32,8 +32,6 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.OneShotEffect; -import mage.constants.SubType; -import mage.constants.SuperType; import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.TrampleAbility; import mage.cards.Card; @@ -41,6 +39,8 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.SuperType; import mage.constants.Zone; import mage.game.Game; import mage.game.permanent.Permanent; @@ -103,15 +103,15 @@ class DemonlordBelzenlokEffect extends OneShotEffect { } boolean cont = true; int addedToHand = 0; - while (controller.getLibrary().hasCards() && controller.canRespond() && cont) { - Card card = controller.getLibrary().removeFromTop(game); + while (controller.getLibrary().hasCards() && cont) { + Card card = controller.getLibrary().getFromTop(game); if (card != null) { - controller.moveCardToExileWithInfo(card, null, null, source.getSourceId(), game, Zone.LIBRARY, true); + controller.moveCards(card, Zone.EXILED, source, game); if (!card.isLand()) { if (card.getConvertedManaCost() < 4) { cont = false; } - card.moveToZone(Zone.HAND, source.getSourceId(), game, true); + controller.moveCards(card, Zone.HAND, source, game); addedToHand++; } } diff --git a/Mage.Sets/src/mage/cards/d/DeployTheGatewatch.java b/Mage.Sets/src/mage/cards/d/DeployTheGatewatch.java index e056e3cf2eb..00080266e24 100644 --- a/Mage.Sets/src/mage/cards/d/DeployTheGatewatch.java +++ b/Mage.Sets/src/mage/cards/d/DeployTheGatewatch.java @@ -89,27 +89,15 @@ class DeployTheGatewatchEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); if (controller == null) { return false; } // Look at the top seven cards of your library. - Cards cards = new CardsImpl(); - boolean planeswalkerIncluded = false; - for (int i = 0; i < 7; i++) { - Card card = controller.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - if (filter.match(card, game)) { - planeswalkerIncluded = true; - } - } - } - controller.lookAtCards("Deploy the Gatewatch", cards, game); - + Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, 7)); + controller.lookAtCards(source, null, cards, game); // Put up to two planeswalker cards from among them onto the battlefield. - if (planeswalkerIncluded) { + if (cards.count(filter, game) > 0) { TargetCard target = new TargetCard(0, 2, Zone.LIBRARY, filter); if (controller.choose(Outcome.DrawCard, cards, target, game)) { Cards pickedCards = new CardsImpl(target.getTargets()); @@ -117,7 +105,6 @@ class DeployTheGatewatchEffect extends OneShotEffect { controller.moveCards(pickedCards.getCards(game), Zone.BATTLEFIELD, source, game); } } - // Put the rest on the bottom of your library in a random order controller.putCardsOnBottomOfLibrary(cards, game, source, false); return true; diff --git a/Mage.Sets/src/mage/cards/d/DestroyTheEvidence.java b/Mage.Sets/src/mage/cards/d/DestroyTheEvidence.java index 50e5e2998ce..52f9cb912fa 100644 --- a/Mage.Sets/src/mage/cards/d/DestroyTheEvidence.java +++ b/Mage.Sets/src/mage/cards/d/DestroyTheEvidence.java @@ -28,7 +28,6 @@ package mage.cards.d; import java.util.UUID; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DestroyTargetEffect; @@ -48,7 +47,7 @@ import mage.target.common.TargetLandPermanent; public class DestroyTheEvidence extends CardImpl { public DestroyTheEvidence(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{4}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{B}"); // Destroy target land. Its controller reveals cards from the top of his // or her library until he or she reveals a land card, then puts those cards into their graveyard. @@ -87,27 +86,21 @@ class DestroyTheEvidenceEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Permanent landPermanent = game.getPermanentOrLKIBattlefield(getTargetPointer().getFirst(game, source)); - MageObject sourceObject = source.getSourceObject(game); - if (sourceObject != null && landPermanent != null) { + if (landPermanent != null) { Player player = game.getPlayer(landPermanent.getControllerId()); if (player == null) { return false; } - boolean landFound = false; - Cards cards = new CardsImpl(); - while (player.getLibrary().hasCards() && !landFound) { - if (!player.canRespond()) { - return false; - } - Card card = player.getLibrary().removeFromTop(game); + Cards cards = new CardsImpl(); + for (Card card : player.getLibrary().getCards(game)) { if (card != null) { cards.add(card); if (card.isLand()) { - landFound = true; + break; } } } - player.revealCards(sourceObject.getName(), cards, game, true); + player.revealCards(source, cards, game); player.moveCards(cards, Zone.GRAVEYARD, source, game); return true; } diff --git a/Mage.Sets/src/mage/cards/d/DimirCharm.java b/Mage.Sets/src/mage/cards/d/DimirCharm.java index 9e7f3a91e02..5168958ec1c 100644 --- a/Mage.Sets/src/mage/cards/d/DimirCharm.java +++ b/Mage.Sets/src/mage/cards/d/DimirCharm.java @@ -55,18 +55,17 @@ import mage.target.common.TargetCreaturePermanent; * @author Plopman */ public class DimirCharm extends CardImpl { - + private static final FilterCreaturePermanent filterCreature = new FilterCreaturePermanent("creature with power 2 or less"); private static final FilterSpell filterSorcery = new FilterSpell("sorcery spell"); - + static { filterCreature.add(new PowerPredicate(ComparisonType.FEWER_THAN, 3)); filterSorcery.add(new CardTypePredicate(CardType.SORCERY)); } - public DimirCharm (UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{U}{B}"); - + public DimirCharm(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{U}{B}"); //Choose one - Counter target sorcery spell this.getSpellAbility().addEffect(new CounterTargetEffect()); @@ -90,47 +89,42 @@ public class DimirCharm extends CardImpl { } @Override - public DimirCharm copy() { + public DimirCharm copy() { return new DimirCharm(this); } } class DimirCharmEffect extends OneShotEffect { + public DimirCharmEffect() { - super(Outcome.Benefit); + super(Outcome.Benefit); } public DimirCharmEffect(final DimirCharmEffect effect) { super(effect); } - + @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getFirstTarget()); + Player player = game.getPlayer(getTargetPointer().getFirst(game, source)); Player controller = game.getPlayer(source.getControllerId()); - if(controller != null && player != null){ - Cards cards = new CardsImpl(); - for(int i = 0; i < 3; i++){ - Card card = player.getLibrary().removeFromTop(game); - if(card != null){ - cards.add(card); - } - } - if(!cards.isEmpty()){ + if (controller != null && player != null) { + Cards cards = new CardsImpl(player.getLibrary().getTopCards(game, 3)); + if (!cards.isEmpty()) { TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCard("Card to put back on top of library")); - if(controller.chooseTarget(Outcome.Benefit, cards, target, source, game)){ + if (controller.chooseTarget(Outcome.Benefit, cards, target, source, game)) { Card card = cards.get(target.getFirstTarget(), game); - if(card != null){ - card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); + if (card != null) { cards.remove(card); } - controller.moveCards(cards, Zone.GRAVEYARD, source, game); } + controller.moveCards(cards, Zone.GRAVEYARD, source, game); } + return true; } return false; } - + @Override public DimirCharmEffect copy() { return new DimirCharmEffect(this); @@ -139,5 +133,5 @@ class DimirCharmEffect extends OneShotEffect { @Override public String getText(Mode mode) { return "look at the top three cards of target player's library, then put one back and the rest into that player's graveyard"; - } + } } diff --git a/Mage.Sets/src/mage/cards/d/DimirMachinations.java b/Mage.Sets/src/mage/cards/d/DimirMachinations.java index 7493efb1906..54aa74a23f2 100644 --- a/Mage.Sets/src/mage/cards/d/DimirMachinations.java +++ b/Mage.Sets/src/mage/cards/d/DimirMachinations.java @@ -31,9 +31,9 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.abilities.keyword.TransmuteAbility; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.cards.Cards; import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Outcome; @@ -51,15 +51,15 @@ import mage.target.TargetPlayer; public class DimirMachinations extends CardImpl { public DimirMachinations(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{2}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{B}"); // Look at the top three cards of target player's library. Exile any number of those cards, then put the rest back in any order. this.getSpellAbility().addEffect(new DimirMachinationsEffect()); this.getSpellAbility().addTarget(new TargetPlayer()); - + // Transmute {1}{B}{B} this.addAbility(new TransmuteAbility("{1}{B}{B}")); - + } public DimirMachinations(final DimirMachinations card) { @@ -73,57 +73,36 @@ public class DimirMachinations extends CardImpl { } class DimirMachinationsEffect extends OneShotEffect { - + DimirMachinationsEffect() { super(Outcome.Neutral); this.staticText = "Look at the top three cards of target player's library. Exile any number of those cards, then put the rest back in any order"; } - + DimirMachinationsEffect(final DimirMachinationsEffect effect) { super(effect); } - + @Override public DimirMachinationsEffect copy() { return new DimirMachinationsEffect(this); } - + @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); Player targetPlayer = game.getPlayer(this.getTargetPointer().getFirst(game, source)); if (controller != null && targetPlayer != null) { - int numCardsToLookAt = Math.min(3, targetPlayer.getLibrary().size()); - if (numCardsToLookAt > 0) { - CardsImpl cards = new CardsImpl(); - for (int i = 0; i < numCardsToLookAt; i++) { - cards.add(targetPlayer.getLibrary().removeFromTop(game)); - } - TargetCard targetExile = new TargetCard(0, numCardsToLookAt, Zone.LIBRARY, new FilterCard("card to exile")); + CardsImpl cards = new CardsImpl(targetPlayer.getLibrary().getTopCards(game, 3)); + if (!cards.isEmpty()) { + controller.lookAtCards(source, null, cards, game); + TargetCard targetExile = new TargetCard(0, Integer.MAX_VALUE, Zone.LIBRARY, new FilterCard("cards to exile")); if (controller.choose(Outcome.Exile, cards, targetExile, game)) { - for (UUID cardId : targetExile.getTargets()) { - Card card = cards.get(cardId, game); - if (card != null) { - controller.moveCardToExileWithInfo(card, null, "", source.getSourceId(), game, Zone.LIBRARY, true); - cards.remove(card); - } - } - while (!cards.isEmpty()) { - if (cards.size() == 1) { - Card card = cards.get(cards.iterator().next(), game); - controller.moveCardToLibraryWithInfo(card, source.getSourceId(), game, Zone.LIBRARY, true, false); - cards.remove(card); - } - else { - TargetCard targetTop = new TargetCard(Zone.LIBRARY, new FilterCard("card to put on top of library")); - if (controller.choose(Outcome.Neutral, cards, targetTop, game)) { - Card card = cards.get(targetTop.getFirstTarget(), game); - controller.moveCardToLibraryWithInfo(card, source.getSourceId(), game, Zone.LIBRARY, true, false); - cards.remove(card); - } - } - } + Cards toExile = new CardsImpl(targetExile.getTargets()); + controller.moveCards(toExile, Zone.EXILED, source, game); + cards.removeAll(toExile); } + controller.putCardsOnTopOfLibrary(cards, game, source, true); } return true; } diff --git a/Mage.Sets/src/mage/cards/d/DivergentTransformations.java b/Mage.Sets/src/mage/cards/d/DivergentTransformations.java index 7815acb1ee7..6c8f3a1207a 100644 --- a/Mage.Sets/src/mage/cards/d/DivergentTransformations.java +++ b/Mage.Sets/src/mage/cards/d/DivergentTransformations.java @@ -105,23 +105,18 @@ class DivergentTransformationsEffect extends OneShotEffect { Player player = game.getPlayer(playerId); if (player != null) { if (player.getLibrary().hasCards()) { - Cards cards = new CardsImpl(); - Card card = player.getLibrary().removeFromTop(game); - cards.add(card); - while (!card.isCreature() && player.getLibrary().hasCards()) { - card = player.getLibrary().removeFromTop(game); - cards.add(card); + Cards toReveal = new CardsImpl(); + for (Card card : player.getLibrary().getCards(game)) { + toReveal.add(card); + if (card.isCreature()) { + player.revealCards(source, toReveal, game); + player.moveCards(card, Zone.BATTLEFIELD, source, game); + toReveal.remove(card); + break; + } } - - if (card.isCreature()) { - card.putOntoBattlefield(game, Zone.LIBRARY, source.getSourceId(), player.getId()); - } - - if (!cards.isEmpty()) { - player.revealCards(sourceObject.getIdName(), cards, game); - Set cardsToShuffle = cards.getCards(game); - cardsToShuffle.remove(card); - player.getLibrary().addAll(cardsToShuffle, game); + if (!toReveal.isEmpty()) { + player.shuffleLibrary(source, game); } } } diff --git a/Mage.Sets/src/mage/cards/d/DuskmantleSeer.java b/Mage.Sets/src/mage/cards/d/DuskmantleSeer.java index 7a3e93f5d2a..7fbfd9c5e53 100644 --- a/Mage.Sets/src/mage/cards/d/DuskmantleSeer.java +++ b/Mage.Sets/src/mage/cards/d/DuskmantleSeer.java @@ -35,8 +35,8 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.*; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.TargetController; import mage.constants.Zone; import mage.game.Game; @@ -98,13 +98,11 @@ class DuskmantleSeerEffect extends OneShotEffect { } for (Player player : game.getPlayers().values()) { if (player.getLibrary().hasCards()) { - Card card = player.getLibrary().removeFromTop(game); + Card card = player.getLibrary().getFromTop(game); if (card != null) { - Cards cards = new CardsImpl(); - cards.add(card); - player.revealCards(sourceCard.getName() + ": Revealed by " + player.getName(), cards, game); + player.revealCards(source, ": Revealed by " + player.getName(), new CardsImpl(card), game); player.loseLife(card.getConvertedManaCost(), game, false); - card.moveToZone(Zone.HAND, source.getSourceId(), game, true); + player.moveCards(card, Zone.HAND, source, game); } } } diff --git a/Mage.Sets/src/mage/cards/e/ElementalAugury.java b/Mage.Sets/src/mage/cards/e/ElementalAugury.java index 0562975ea0b..278dd06c11b 100644 --- a/Mage.Sets/src/mage/cards/e/ElementalAugury.java +++ b/Mage.Sets/src/mage/cards/e/ElementalAugury.java @@ -47,7 +47,7 @@ import mage.target.TargetPlayer; public class ElementalAugury extends CardImpl { public ElementalAugury(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{U}{B}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{U}{B}{R}"); // {3}: Look at the top three cards of target player's library, then put them back in any order. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ElementalAuguryEffect(), new ManaCostsImpl("3")); @@ -89,15 +89,8 @@ class ElementalAuguryEffect extends OneShotEffect { || controller == null) { return false; } - Cards cards = new CardsImpl(); - int count = Math.min(targetPlayer.getLibrary().size(), 3); - for (int i = 0; i < count; i++) { - Card card = targetPlayer.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - } - } - controller.lookAtCards("Elemental Augury", cards, game); + Cards cards = new CardsImpl(targetPlayer.getLibrary().getTopCards(game, 3)); + controller.lookAtCards(source, null, cards, game); controller.putCardsOnTopOfLibrary(cards, game, source, true); return true; } diff --git a/Mage.Sets/src/mage/cards/e/ElkinBottle.java b/Mage.Sets/src/mage/cards/e/ElkinBottle.java index 7fa8d73a16e..ee8b719cf93 100644 --- a/Mage.Sets/src/mage/cards/e/ElkinBottle.java +++ b/Mage.Sets/src/mage/cards/e/ElkinBottle.java @@ -40,13 +40,9 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; -import mage.game.permanent.Permanent; -import mage.game.turn.Step; -import mage.players.Library; import mage.players.Player; import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; /** * @@ -55,7 +51,7 @@ import mage.target.targetpointer.FixedTarget; public class ElkinBottle extends CardImpl { public ElkinBottle(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); // {3}, {tap}, Exile the top card of your library. Until the beginning of your next upkeep, you may play that card. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ElkinBottleExileEffect(), new GenericManaCost(3)); @@ -92,13 +88,10 @@ class ElkinBottleExileEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); - if (sourcePermanent != null && controller != null && controller.getLibrary().hasCards()) { - Library library = controller.getLibrary(); - Card card = library.removeFromTop(game); + if (controller != null) { + Card card = controller.getLibrary().getFromTop(game); if (card != null) { - String exileName = new StringBuilder(sourcePermanent.getIdName()).append(" ").toString(); - controller.moveCardToExileWithInfo(card, source.getSourceId(), exileName, source.getSourceId(), game, Zone.LIBRARY, true); + controller.moveCardsToExile(card, source, game, true, source.getSourceId(), CardUtil.createObjectRealtedWindowTitle(source, game, null)); ContinuousEffect effect = new ElkinBottleCastFromExileEffect(); effect.setTargetPointer(new FixedTarget(card.getId())); game.addEffect(effect, source); @@ -110,14 +103,14 @@ class ElkinBottleExileEffect extends OneShotEffect { } class ElkinBottleCastFromExileEffect extends AsThoughEffectImpl { - + private boolean sameStep = true; public ElkinBottleCastFromExileEffect() { super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.Custom, Outcome.Benefit); this.staticText = "Until the beginning of your next upkeep, you may play that card."; } - + public ElkinBottleCastFromExileEffect(final ElkinBottleCastFromExileEffect effect) { super(effect); } @@ -149,5 +142,5 @@ class ElkinBottleCastFromExileEffect extends AsThoughEffectImpl { return source.getControllerId().equals(affectedControllerId) && sourceId.equals(getTargetPointer().getFirst(game, source)); } - + } diff --git a/Mage.Sets/src/mage/cards/e/EnigmaSphinx.java b/Mage.Sets/src/mage/cards/e/EnigmaSphinx.java index 76c1ed45671..d693e7b5a6d 100644 --- a/Mage.Sets/src/mage/cards/e/EnigmaSphinx.java +++ b/Mage.Sets/src/mage/cards/e/EnigmaSphinx.java @@ -47,7 +47,6 @@ import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; import mage.game.events.ZoneChangeEvent; import mage.game.permanent.Permanent; -import mage.players.Library; import mage.players.Player; /** @@ -147,22 +146,14 @@ class EnigmaSphinxEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Card card = game.getCard(source.getSourceId()); - if (card != null && game.getState().getZone(source.getSourceId()) == Zone.GRAVEYARD) { - Player owner = game.getPlayer(card.getOwnerId()); - if (owner != null && card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true)) { - // Move Sphinx to third position - game.informPlayers(card.getLogName() + " is put into " + owner.getLogName() + "'s library third from the top"); - Library lib = owner.getLibrary(); - if (lib != null) { - Card card1 = lib.removeFromTop(game); - if (card1 != null && card1.getId().equals(source.getSourceId())) { - lib.putCardThirdFromTheTop(card1, game); - return true; - } - } - } + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { + return false; } - return false; + Card card = (Card) source.getSourceObjectIfItStillExists(game); + if (card != null) { + controller.putCardOnTopXOfLibrary(card, game, source, 3); + } + return true; } } diff --git a/Mage.Sets/src/mage/cards/e/ErraticExplosion.java b/Mage.Sets/src/mage/cards/e/ErraticExplosion.java index 97189b3d0fc..f2a2f8afd90 100644 --- a/Mage.Sets/src/mage/cards/e/ErraticExplosion.java +++ b/Mage.Sets/src/mage/cards/e/ErraticExplosion.java @@ -28,7 +28,6 @@ package mage.cards.e; import java.util.UUID; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; @@ -51,7 +50,7 @@ public class ErraticExplosion extends CardImpl { public ErraticExplosion(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{R}"); - // Choose any target. Reveal cards from the top of your library until you reveal a nonland card. Erratic Explosion deals damage equal to that card's converted mana cost to that creature or player. Put the revealed cards on the bottom of your library in any order. + // Choose any target. Reveal cards from the top of your library until you reveal a nonland card. Erratic Explosion deals damage equal to that card's converted mana cost to that permanent or player. Put the revealed cards on the bottom of your library in any order. this.getSpellAbility().addTarget(new TargetAnyTarget()); this.getSpellAbility().addEffect(new ErraticExplosionEffect()); } @@ -85,22 +84,17 @@ class ErraticExplosionEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = game.getObject(source.getSourceId()); - if (controller != null && sourceObject != null) { + if (controller != null) { CardsImpl toReveal = new CardsImpl(); Card nonLandCard = null; - - while (nonLandCard == null && controller.getLibrary().hasCards()) { - Card card = controller.getLibrary().removeFromTop(game); + for (Card card : controller.getLibrary().getCards(game)) { toReveal.add(card); if (!card.isLand()) { nonLandCard = card; + break; } } - // reveal cards - if (!toReveal.isEmpty()) { - controller.revealCards(sourceObject.getIdName(), toReveal, game); - } + controller.revealCards(source, toReveal, game); // the nonland card if (nonLandCard != null) { Permanent targetCreature = game.getPermanent(this.getTargetPointer().getFirst(game, source)); diff --git a/Mage.Sets/src/mage/cards/e/ErraticMutation.java b/Mage.Sets/src/mage/cards/e/ErraticMutation.java index a0d51b35997..f1fa29ca293 100644 --- a/Mage.Sets/src/mage/cards/e/ErraticMutation.java +++ b/Mage.Sets/src/mage/cards/e/ErraticMutation.java @@ -52,7 +52,7 @@ import mage.target.targetpointer.FixedTarget; public class ErraticMutation extends CardImpl { public ErraticMutation(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{2}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{U}"); // Choose target creature. Reveal cards from the top of your library until you reveal a nonland card. That creature gets +X/-X until end of turn, where X is that card's converted mana cost. Put all cards revealed this way on the bottom of your library in any order. this.getSpellAbility().addTarget(new TargetCreaturePermanent()); @@ -93,18 +93,16 @@ class ErraticMutationEffect extends OneShotEffect { if (controller != null && sourceObject != null) { CardsImpl toReveal = new CardsImpl(); Card nonLandCard = null; - - while (nonLandCard == null && controller.getLibrary().hasCards()) { - Card card = controller.getLibrary().removeFromTop(game); + for (Card card : controller.getLibrary().getCards(game)) { toReveal.add(card); if (!card.isLand()) { nonLandCard = card; + break; } } // reveal cards - if (!toReveal.isEmpty()) { - controller.revealCards(sourceObject.getIdName(), toReveal, game); - } + controller.revealCards(sourceObject.getIdName(), toReveal, game); + // the nonland card if (nonLandCard != null) { int boostValue = nonLandCard.getConvertedManaCost(); diff --git a/Mage.Sets/src/mage/cards/e/ExplosiveRevelation.java b/Mage.Sets/src/mage/cards/e/ExplosiveRevelation.java index 4d9796da4ab..2ac1ec42f38 100644 --- a/Mage.Sets/src/mage/cards/e/ExplosiveRevelation.java +++ b/Mage.Sets/src/mage/cards/e/ExplosiveRevelation.java @@ -90,22 +90,19 @@ class ExplosiveRevelationEffect extends OneShotEffect { MageObject sourceObject = source.getSourceObject(game); if (controller != null && sourceObject != null) { if (controller.getLibrary().hasCards()) { - - CardsImpl cards = new CardsImpl(); + CardsImpl toReveal = new CardsImpl(); Library library = controller.getLibrary(); - Card card = null; - do { - card = library.removeFromTop(game); - if (card != null) { - cards.add(card); + Card nonLandCard = null; + for (Card card : library.getCards(game)) { + toReveal.add(card); + if (!card.isLand()) { + nonLandCard = card; } - } while (library.hasCards() && card != null && card.isLand()); - // reveal cards - if (!cards.isEmpty()) { - controller.revealCards(sourceObject.getIdName(), cards, game); } + // reveal cards + controller.revealCards(sourceObject.getIdName(), toReveal, game); // the nonland card - int damage = card.getConvertedManaCost(); + int damage = nonLandCard == null ? 0 : nonLandCard.getConvertedManaCost(); // assign damage to target for (UUID targetId : targetPointer.getTargets(game, source)) { Permanent targetedCreature = game.getPermanent(targetId); @@ -118,12 +115,13 @@ class ExplosiveRevelationEffect extends OneShotEffect { } } } - // move nonland card to hand - card.moveToZone(Zone.HAND, source.getSourceId(), game, true); - // remove nonland card from revealed card list - cards.remove(card); + if (nonLandCard != null) { + // move nonland card to hand + controller.moveCards(nonLandCard, Zone.HAND, source, game); + toReveal.remove(nonLandCard); + } // put the rest of the cards on the bottom of the library in any order - return controller.putCardsOnBottomOfLibrary(cards, game, source, true); + return controller.putCardsOnBottomOfLibrary(toReveal, game, source, true); } return true; } diff --git a/Mage.Sets/src/mage/cards/e/EyeOfYawgmoth.java b/Mage.Sets/src/mage/cards/e/EyeOfYawgmoth.java index 54d281fddb8..86bf7f0328d 100644 --- a/Mage.Sets/src/mage/cards/e/EyeOfYawgmoth.java +++ b/Mage.Sets/src/mage/cards/e/EyeOfYawgmoth.java @@ -106,29 +106,17 @@ class EyeOfYawgmothEffect extends OneShotEffect { } } if (power > 0) { - Cards cards = new CardsImpl(); - int count = Math.min(controller.getLibrary().size(), power); - for (int i = 0; i < count; i++) { - Card card = controller.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - } - } - controller.revealCards(source.getSourceObject(game).getIdName(), cards, game); - + Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, power)); + controller.revealCards(source, cards, game); TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCard("card to put into your hand")); if (controller.choose(Outcome.DrawCard, cards, target, game)) { Card card = cards.get(target.getFirstTarget(), game); if (card != null) { + controller.moveCards(card, Zone.HAND, source, game); cards.remove(card); - card.moveToZone(Zone.HAND, source.getSourceId(), game, false); - game.informPlayers(source.getSourceObject(game).getIdName() + ": " + controller.getLogName() + " puts " + card.getIdName() + " into their hand"); } } - for (UUID cardId : cards) { - Card card = game.getCard(cardId); - card.moveToExile(null, "", source.getSourceId(), game); - } + controller.moveCards(cards, Zone.EXILED, source, game); } return true; } diff --git a/Mage.Sets/src/mage/cards/f/FlamesOfRemembrance.java b/Mage.Sets/src/mage/cards/f/FlamesOfRemembrance.java index 74191b0a869..53db4fdc90d 100644 --- a/Mage.Sets/src/mage/cards/f/FlamesOfRemembrance.java +++ b/Mage.Sets/src/mage/cards/f/FlamesOfRemembrance.java @@ -27,8 +27,6 @@ */ package mage.cards.f; -import java.util.ArrayList; -import java.util.List; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -37,18 +35,21 @@ import mage.abilities.costs.common.ExileFromGraveCost; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.dynamicvalue.common.CountersSourceCount; import mage.abilities.effects.AsThoughEffectImpl; +import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DoIfCostPaid; import mage.abilities.effects.common.counter.AddCountersSourceEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.cards.CardsImpl; import mage.constants.*; import mage.counters.CounterType; import mage.game.Game; -import mage.players.Library; import mage.players.Player; import mage.target.common.TargetCardInYourGraveyard; +import mage.target.targetpointer.FixedTargets; +import mage.util.CardUtil; /** * @@ -57,7 +58,7 @@ import mage.target.common.TargetCardInYourGraveyard; public class FlamesOfRemembrance extends CardImpl { public FlamesOfRemembrance(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{R}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{R}"); // At the beggining of your upkeep, you may exile a card from your graveyard. If you do, put a lore counter on Flames of Remembrance. this.addAbility(new BeginningOfUpkeepTriggeredAbility(new DoIfCostPaid(new AddCountersSourceEffect(CounterType.LORE.createInstance()), new ExileFromGraveCost(new TargetCardInYourGraveyard()), null, true), TargetController.YOU, false)); @@ -83,7 +84,7 @@ class FlamesOfRemembranceExileEffect extends OneShotEffect { public FlamesOfRemembranceExileEffect(CountersSourceCount amount) { super(Outcome.Benefit); this.amount = amount; - this.staticText = "Exile top X cards of your library, where X is the number of lore counters on Flames of Remembrance. Until end of turn you play cards exile this way"; + this.staticText = "Exile top X cards of your library, where X is the number of lore counters on {this}. Until end of turn you play cards exile this way"; } public FlamesOfRemembranceExileEffect(final FlamesOfRemembranceExileEffect effect) { @@ -100,23 +101,12 @@ class FlamesOfRemembranceExileEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - - Library library = controller.getLibrary(); - List cards = new ArrayList<>(); - int count = Math.min(amount.calculate(game, source, this), library.size()); - for (int i = 0; i < count; i++) { - Card card = library.removeFromTop(game); - if (card != null) { - cards.add(card); - } - } + Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, amount.calculate(game, source, this))); if (!cards.isEmpty()) { - List cardsId = new ArrayList<>(); - for (Card card : cards) { - card.moveToExile(source.getSourceId(), "Flames of Remembrance", source.getSourceId(), game); - cardsId.add(card.getId()); - } - game.addEffect(new FlamesOfRemembranceMayPlayExiledEffect(cardsId), source); + controller.moveCardsToExile(cards.getCards(game), source, game, true, source.getSourceId(), CardUtil.createObjectRealtedWindowTitle(source, game, "")); + ContinuousEffect effect = new FlamesOfRemembranceMayPlayExiledEffect(); + effect.setTargetPointer(new FixedTargets(cards, game)); + game.addEffect(effect, source); } return true; } @@ -127,16 +117,12 @@ class FlamesOfRemembranceExileEffect extends OneShotEffect { class FlamesOfRemembranceMayPlayExiledEffect extends AsThoughEffectImpl { - public List cards = new ArrayList<>(); - - public FlamesOfRemembranceMayPlayExiledEffect(List cards) { + public FlamesOfRemembranceMayPlayExiledEffect() { super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.EndOfTurn, Outcome.Benefit); - this.cards.addAll(cards); } public FlamesOfRemembranceMayPlayExiledEffect(final FlamesOfRemembranceMayPlayExiledEffect effect) { super(effect); - this.cards.addAll(effect.cards); } @Override @@ -150,15 +136,7 @@ class FlamesOfRemembranceMayPlayExiledEffect extends AsThoughEffectImpl { } @Override - public boolean applies(UUID sourceId, Ability source, UUID affectedControllerId, Game game) { - Card card = game.getCard(sourceId); - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null && card != null && game.getState().getZone(sourceId) == Zone.EXILED) { - if (cards.contains(sourceId)) { - return true; - } - } - return false; + public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { + return source.getControllerId().equals(affectedControllerId) && this.getTargetPointer().getTargets(game, source).contains(objectId); } - } diff --git a/Mage.Sets/src/mage/cards/l/LongTermPlans.java b/Mage.Sets/src/mage/cards/l/LongTermPlans.java index fab9bae3c12..d99d9c781a2 100644 --- a/Mage.Sets/src/mage/cards/l/LongTermPlans.java +++ b/Mage.Sets/src/mage/cards/l/LongTermPlans.java @@ -87,7 +87,7 @@ class LongTermPlansEffect extends OneShotEffect { Card card = player.getLibrary().remove(target.getFirstTarget(), game); if (card != null) { player.shuffleLibrary(source, game); - player.getLibrary().putCardThirdFromTheTop(card, game); + player.putCardOnTopXOfLibrary(card, game, source, 3); } } return true; diff --git a/Mage.Sets/src/mage/cards/o/OrochiSustainer.java b/Mage.Sets/src/mage/cards/o/OrochiSustainer.java index 5cddb8998f4..0358c117fa5 100644 --- a/Mage.Sets/src/mage/cards/o/OrochiSustainer.java +++ b/Mage.Sets/src/mage/cards/o/OrochiSustainer.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.cards.o; import java.util.UUID; @@ -42,12 +41,14 @@ import mage.constants.SubType; public class OrochiSustainer extends CardImpl { public OrochiSustainer(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}"); this.subtype.add(SubType.SNAKE); this.subtype.add(SubType.SHAMAN); this.power = new MageInt(1); this.toughness = new MageInt(2); + + // {T}: Add {G}. this.addAbility(new GreenManaAbility()); } diff --git a/Mage.Sets/src/mage/cards/t/TeferiHeroOfDominaria.java b/Mage.Sets/src/mage/cards/t/TeferiHeroOfDominaria.java index beb697571c7..fa839a925d4 100644 --- a/Mage.Sets/src/mage/cards/t/TeferiHeroOfDominaria.java +++ b/Mage.Sets/src/mage/cards/t/TeferiHeroOfDominaria.java @@ -38,14 +38,12 @@ import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.UntapLandsEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SubType; import mage.constants.SuperType; -import mage.constants.Zone; import mage.game.Game; import mage.game.command.emblems.TeferiHeroOfDominariaEmblem; import mage.game.permanent.Permanent; @@ -114,16 +112,7 @@ class TeferiHeroOfDominariaSecondEffect extends OneShotEffect { if (controller != null) { Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); if (permanent != null) { - Player owner = game.getPlayer(permanent.getOwnerId()); - if (owner == null) { - return false; - } - permanent.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); - Card card = owner.getLibrary().remove(permanent.getId(), game); - if (card != null) { - owner.getLibrary().putCardThirdFromTheTop(card, game); - game.informPlayers(card.getLogName() + " is put into " + owner.getLogName() + "'s library third from the top"); - } + controller.putCardOnTopXOfLibrary(permanent, game, source, 3); } return true; } 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 b81671cfc68..1f259160965 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 @@ -1403,6 +1403,11 @@ public class TestPlayer implements Player { return computerPlayer.putCardsOnBottomOfLibrary(cards, game, source, anyOrder); } + @Override + public boolean putCardOnTopXOfLibrary(Card card, Game game, Ability source, int xFromTheTop) { + return computerPlayer.putCardOnTopXOfLibrary(card, game, source, xFromTheTop); + } + @Override public boolean putCardsOnTopOfLibrary(Cards cards, Game game, Ability source, boolean anyOrder) { return computerPlayer.putCardsOnTopOfLibrary(cards, game, source, anyOrder); 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 ca01958cb61..e6cdc6f7bcc 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 @@ -908,6 +908,11 @@ public class PlayerStub implements Player { return false; } + @Override + public boolean putCardOnTopXOfLibrary(Card card, Game game, Ability source, int xFromTheTop) { + return true; + } + @Override public int announceXMana(int min, int max, String message, Game game, Ability ability) { return 0; diff --git a/Mage/src/main/java/mage/players/Library.java b/Mage/src/main/java/mage/players/Library.java index 77b816948f9..f928eea29a7 100644 --- a/Mage/src/main/java/mage/players/Library.java +++ b/Mage/src/main/java/mage/players/Library.java @@ -135,26 +135,17 @@ public class Library implements Serializable { } } - public void putCardThirdFromTheTop(Card card, Game game) { - if (card != null) { - if (card.getOwnerId().equals(playerId)) { - Card cardTop = null; - Card cardSecond = null; - if (hasCards()) { - cardTop = removeFromTop(game); - } - if (hasCards()) { - cardSecond = removeFromTop(game); - } - putOnTop(card, game); - if (cardSecond != null) { - putOnTop(cardSecond, game); - } - if (cardTop != null) { - putOnTop(cardTop, game); - } - } else { - game.getPlayer(card.getOwnerId()).getLibrary().putCardThirdFromTheTop(card, game); + public void putCardToTopXPos(Card card, int pos, Game game) { + if (card != null && pos > -1) { + LinkedList save = new LinkedList<>(); + int idx = 1; + while (hasCards() && idx < pos) { + idx++; + save.add(removeFromTop(game)); + } + putOnTop(card, game); + while (!save.isEmpty()) { + putOnTop(save.removeLast(), game); } } } diff --git a/Mage/src/main/java/mage/players/Player.java b/Mage/src/main/java/mage/players/Player.java index b08e8e8c410..efb73fff230 100644 --- a/Mage/src/main/java/mage/players/Player.java +++ b/Mage/src/main/java/mage/players/Player.java @@ -562,6 +562,17 @@ public interface Player extends MageItem, Copyable { */ boolean putCardsOnBottomOfLibrary(Cards cards, Game game, Ability source, boolean anyOrder); + /** + * Moves the card to the top x position of the library + * + * @param card + * @param game + * @param source + * @param xFromTheTop + * @return + */ + boolean putCardOnTopXOfLibrary(Card card, Game game, Ability source, int xFromTheTop); + /** * Moves the cards from cards to the top of players library. * diff --git a/Mage/src/main/java/mage/players/PlayerImpl.java b/Mage/src/main/java/mage/players/PlayerImpl.java index 9fd608468ca..6a0524ddc61 100644 --- a/Mage/src/main/java/mage/players/PlayerImpl.java +++ b/Mage/src/main/java/mage/players/PlayerImpl.java @@ -84,6 +84,7 @@ import mage.game.events.ZoneChangeEvent; import mage.game.match.MatchPlayer; import mage.game.permanent.Permanent; import mage.game.permanent.PermanentCard; +import mage.game.permanent.PermanentToken; import mage.game.permanent.token.SquirrelToken; import mage.game.stack.Spell; import mage.game.stack.StackAbility; @@ -894,6 +895,26 @@ public abstract class PlayerImpl implements Player, Serializable { return true; } + @Override + public boolean putCardOnTopXOfLibrary(Card card, Game game, Ability source, int xFromTheTop) { + if (card.getOwnerId().equals(getId())) { + if (library.size() + 1 < xFromTheTop) { + putCardsOnBottomOfLibrary(new CardsImpl(card), game, source, true); + } else { + if (card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true) && !(card instanceof PermanentToken) && !card.isCopy()) { + card = getLibrary().removeFromTop(game); + getLibrary().putCardToTopXPos(card, xFromTheTop, game); + game.informPlayers(card.getLogName() + " is put into " + getLogName() + "'s library " + CardUtil.numberToOrdinalText(xFromTheTop) + " from the top"); + } else { + return false; + } + } + } else { + return game.getPlayer(card.getOwnerId()).putCardOnTopXOfLibrary(card, game, source, xFromTheTop); + } + return true; + } + /** * Can be cards or permanents that go to library * @@ -1840,6 +1861,7 @@ public abstract class PlayerImpl implements Player, Serializable { return gainLife(amount, game, source.getSourceId()); } + @Override public int gainLife(int amount, Game game, UUID sourceId) { if (!canGainLife || amount == 0) { return 0; diff --git a/Mage/src/main/java/mage/util/CardUtil.java b/Mage/src/main/java/mage/util/CardUtil.java index 7c636d2afe4..beaeaafc54b 100644 --- a/Mage/src/main/java/mage/util/CardUtil.java +++ b/Mage/src/main/java/mage/util/CardUtil.java @@ -51,6 +51,9 @@ public final class CardUtil { static final String[] numberStrings = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty"}; + static final String[] ordinalStrings = {"first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eightth", "ninth", + "tenth", "eleventh", "twelfth", "thirteenth", "fourteenth", "fifteenth", "sixteenth", "seventeenth", "eighteenth", "nineteenth", "twentieth"}; + /** * Increase spell or ability cost to be paid. * @@ -363,6 +366,13 @@ public final class CardUtil { return number; } + public static String numberToOrdinalText(int number) { + if (number >= 1 && number < 21) { + return ordinalStrings[number - 1]; + } + return Integer.toString(number) + "th"; + } + public static String replaceSourceName(String message, String sourceName) { message = message.replace("{this}", sourceName); message = message.replace("{source}", sourceName); diff --git a/Utils/gen-list-unimplemented-cards-for-set.pl b/Utils/gen-list-unimplemented-cards-for-set.pl index 154f2ae8a6a..98a8da096ef 100755 --- a/Utils/gen-list-unimplemented-cards-for-set.pl +++ b/Utils/gen-list-unimplemented-cards-for-set.pl @@ -99,8 +99,10 @@ foreach my $card (sort cardSort @setCards) { $cardNames {@{$card}[0]} = 0; if ($toPrint) { $toPrint .= "\n"; - } - $toPrint .= "@{$card}[2]|@{$card}[0]"; + } + my $cardName = @{$card}[0]; + $cardName =~ s/ /+/g; + $toPrint .= "@{$card}[2]|[@{$card}[0]](https://magiccards.info/query?q=!$cardName)"; } } @@ -125,7 +127,7 @@ foreach $cn (sort keys (%cardNames)) } my $cn2 = $cn; $cn2 =~ s/ /+/g; - print ISSUE_TRACKER "- $x_or_not [$cn](https://www.google.com.au/search?q=$cn2+MTG&tbm=isch)\n"; + print ISSUE_TRACKER "- $x_or_not [$cn](https://magiccards.info/query?q=!$cn2)\n"; } close ISSUE_TRACKER; print ("Tracking Issue text for a new Github issue (similar to https://github.com/magefree/mage/issues/2215): " . lc($sets{$setName}) ."_issue_tracker.txt\n"); From 96748d230534464e27d60f6a6e810524b4ebf9dd Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Wed, 9 May 2018 02:58:17 +0400 Subject: [PATCH 094/158] Fixed card numbers in 5ED - Fifth Edition (#4628) --- Mage.Sets/src/mage/sets/FifthEdition.java | 487 +++++++++++----------- 1 file changed, 243 insertions(+), 244 deletions(-) diff --git a/Mage.Sets/src/mage/sets/FifthEdition.java b/Mage.Sets/src/mage/sets/FifthEdition.java index 2f46b3cb5d3..cc7edc5fc54 100644 --- a/Mage.Sets/src/mage/sets/FifthEdition.java +++ b/Mage.Sets/src/mage/sets/FifthEdition.java @@ -32,116 +32,116 @@ public class FifthEdition extends ExpansionSet { this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; - cards.add(new SetCardInfo("Aether Storm", 70, Rarity.UNCOMMON, mage.cards.a.AetherStorm.class)); - cards.add(new SetCardInfo("Abbey Gargoyles", 277, Rarity.UNCOMMON, mage.cards.a.AbbeyGargoyles.class)); - cards.add(new SetCardInfo("Abyssal Specter", 1, Rarity.UNCOMMON, mage.cards.a.AbyssalSpecter.class)); + cards.add(new SetCardInfo("Abbey Gargoyles", 1, Rarity.UNCOMMON, mage.cards.a.AbbeyGargoyles.class)); + cards.add(new SetCardInfo("Abyssal Specter", 139, Rarity.UNCOMMON, mage.cards.a.AbyssalSpecter.class)); cards.add(new SetCardInfo("Adarkar Wastes", 410, Rarity.RARE, mage.cards.a.AdarkarWastes.class)); + cards.add(new SetCardInfo("Aether Storm", 70, Rarity.UNCOMMON, mage.cards.a.AetherStorm.class)); cards.add(new SetCardInfo("Air Elemental", 71, Rarity.UNCOMMON, mage.cards.a.AirElemental.class)); - cards.add(new SetCardInfo("Akron Legionnaire", 278, Rarity.RARE, mage.cards.a.AkronLegionnaire.class)); - cards.add(new SetCardInfo("Alabaster Potion", 279, Rarity.COMMON, mage.cards.a.AlabasterPotion.class)); + cards.add(new SetCardInfo("Akron Legionnaire", 2, Rarity.RARE, mage.cards.a.AkronLegionnaire.class)); + cards.add(new SetCardInfo("Alabaster Potion", 3, Rarity.COMMON, mage.cards.a.AlabasterPotion.class)); cards.add(new SetCardInfo("Aladdin's Ring", 346, Rarity.RARE, mage.cards.a.AladdinsRing.class)); cards.add(new SetCardInfo("Ambush Party", 208, Rarity.COMMON, mage.cards.a.AmbushParty.class)); cards.add(new SetCardInfo("Amulet of Kroog", 347, Rarity.COMMON, mage.cards.a.AmuletOfKroog.class)); - cards.add(new SetCardInfo("An-Havva Constable", 139, Rarity.RARE, mage.cards.a.AnHavvaConstable.class)); - cards.add(new SetCardInfo("Anti-Magic Aura", 72, Rarity.UNCOMMON, mage.cards.a.AntiMagicAura.class)); - cards.add(new SetCardInfo("Angry Mob", 280, Rarity.UNCOMMON, mage.cards.a.AngryMob.class)); - cards.add(new SetCardInfo("Animate Dead", 2, Rarity.UNCOMMON, mage.cards.a.AnimateDead.class)); - cards.add(new SetCardInfo("Animate Wall", 281, Rarity.RARE, mage.cards.a.AnimateWall.class)); + cards.add(new SetCardInfo("An-Havva Constable", 277, Rarity.RARE, mage.cards.a.AnHavvaConstable.class)); + cards.add(new SetCardInfo("Angry Mob", 4, Rarity.UNCOMMON, mage.cards.a.AngryMob.class)); + cards.add(new SetCardInfo("Animate Dead", 140, Rarity.UNCOMMON, mage.cards.a.AnimateDead.class)); + cards.add(new SetCardInfo("Animate Wall", 5, Rarity.RARE, mage.cards.a.AnimateWall.class)); cards.add(new SetCardInfo("Ankh of Mishra", 348, Rarity.RARE, mage.cards.a.AnkhOfMishra.class)); - cards.add(new SetCardInfo("Arenson's Aura", 282, Rarity.UNCOMMON, mage.cards.a.ArensonsAura.class)); - cards.add(new SetCardInfo("Armageddon", 283, Rarity.RARE, mage.cards.a.Armageddon.class)); - cards.add(new SetCardInfo("Armor of Faith", 284, Rarity.COMMON, mage.cards.a.ArmorOfFaith.class)); - cards.add(new SetCardInfo("Ashes to Ashes", 3, Rarity.UNCOMMON, mage.cards.a.AshesToAshes.class)); + cards.add(new SetCardInfo("Anti-Magic Aura", 72, Rarity.UNCOMMON, mage.cards.a.AntiMagicAura.class)); + cards.add(new SetCardInfo("Arenson's Aura", 6, Rarity.UNCOMMON, mage.cards.a.ArensonsAura.class)); + cards.add(new SetCardInfo("Armageddon", 7, Rarity.RARE, mage.cards.a.Armageddon.class)); + cards.add(new SetCardInfo("Armor of Faith", 8, Rarity.COMMON, mage.cards.a.ArmorOfFaith.class)); + cards.add(new SetCardInfo("Ashes to Ashes", 141, Rarity.UNCOMMON, mage.cards.a.AshesToAshes.class)); cards.add(new SetCardInfo("Ashnod's Altar", 349, Rarity.UNCOMMON, mage.cards.a.AshnodsAltar.class)); cards.add(new SetCardInfo("Ashnod's Transmogrant", 350, Rarity.COMMON, mage.cards.a.AshnodsTransmogrant.class)); - cards.add(new SetCardInfo("Aspect of Wolf", 140, Rarity.RARE, mage.cards.a.AspectOfWolf.class)); + cards.add(new SetCardInfo("Aspect of Wolf", 278, Rarity.RARE, mage.cards.a.AspectOfWolf.class)); cards.add(new SetCardInfo("Atog", 209, Rarity.UNCOMMON, mage.cards.a.Atog.class)); - cards.add(new SetCardInfo("Aurochs", 141, Rarity.COMMON, mage.cards.a.Aurochs.class)); - cards.add(new SetCardInfo("Aysen Bureaucrats", 285, Rarity.COMMON, mage.cards.a.AysenBureaucrats.class)); + cards.add(new SetCardInfo("Aurochs", 279, Rarity.COMMON, mage.cards.a.Aurochs.class)); + cards.add(new SetCardInfo("Aysen Bureaucrats", 9, Rarity.COMMON, mage.cards.a.AysenBureaucrats.class)); cards.add(new SetCardInfo("Azure Drake", 73, Rarity.UNCOMMON, mage.cards.a.AzureDrake.class)); - cards.add(new SetCardInfo("Bad Moon", 4, Rarity.RARE, mage.cards.b.BadMoon.class)); + cards.add(new SetCardInfo("Bad Moon", 142, Rarity.RARE, mage.cards.b.BadMoon.class)); cards.add(new SetCardInfo("Ball Lightning", 210, Rarity.RARE, mage.cards.b.BallLightning.class)); cards.add(new SetCardInfo("Barbed Sextant", 351, Rarity.COMMON, mage.cards.b.BarbedSextant.class)); cards.add(new SetCardInfo("Barl's Cage", 352, Rarity.RARE, mage.cards.b.BarlsCage.class)); cards.add(new SetCardInfo("Battering Ram", 353, Rarity.COMMON, mage.cards.b.BatteringRam.class)); - cards.add(new SetCardInfo("Benalish Hero", 286, Rarity.COMMON, mage.cards.b.BenalishHero.class)); + cards.add(new SetCardInfo("Benalish Hero", 10, Rarity.COMMON, mage.cards.b.BenalishHero.class)); cards.add(new SetCardInfo("Binding Grasp", 74, Rarity.UNCOMMON, mage.cards.b.BindingGrasp.class)); cards.add(new SetCardInfo("Bird Maiden", 211, Rarity.COMMON, mage.cards.b.BirdMaiden.class)); - cards.add(new SetCardInfo("Birds of Paradise", 142, Rarity.RARE, mage.cards.b.BirdsOfParadise.class)); - cards.add(new SetCardInfo("Black Knight", 5, Rarity.UNCOMMON, mage.cards.b.BlackKnight.class)); - cards.add(new SetCardInfo("Blessed Wine", 287, Rarity.COMMON, mage.cards.b.BlessedWine.class)); - cards.add(new SetCardInfo("Blight", 6, Rarity.UNCOMMON, mage.cards.b.Blight.class)); - cards.add(new SetCardInfo("Blinking Spirit", 288, Rarity.RARE, mage.cards.b.BlinkingSpirit.class)); + cards.add(new SetCardInfo("Birds of Paradise", 280, Rarity.RARE, mage.cards.b.BirdsOfParadise.class)); + cards.add(new SetCardInfo("Black Knight", 143, Rarity.UNCOMMON, mage.cards.b.BlackKnight.class)); + cards.add(new SetCardInfo("Blessed Wine", 11, Rarity.COMMON, mage.cards.b.BlessedWine.class)); + cards.add(new SetCardInfo("Blight", 144, Rarity.UNCOMMON, mage.cards.b.Blight.class)); + cards.add(new SetCardInfo("Blinking Spirit", 12, Rarity.RARE, mage.cards.b.BlinkingSpirit.class)); cards.add(new SetCardInfo("Blood Lust", 212, Rarity.COMMON, mage.cards.b.BloodLust.class)); - cards.add(new SetCardInfo("Bog Imp", 7, Rarity.COMMON, mage.cards.b.BogImp.class)); - cards.add(new SetCardInfo("Bog Rats", 8, Rarity.COMMON, mage.cards.b.BogRats.class)); - cards.add(new SetCardInfo("Bog Wraith", 9, Rarity.UNCOMMON, mage.cards.b.BogWraith.class)); + cards.add(new SetCardInfo("Bog Imp", 145, Rarity.COMMON, mage.cards.b.BogImp.class)); + cards.add(new SetCardInfo("Bog Rats", 146, Rarity.COMMON, mage.cards.b.BogRats.class)); + cards.add(new SetCardInfo("Bog Wraith", 147, Rarity.UNCOMMON, mage.cards.b.BogWraith.class)); cards.add(new SetCardInfo("Boomerang", 75, Rarity.COMMON, mage.cards.b.Boomerang.class)); cards.add(new SetCardInfo("Bottle of Suleiman", 354, Rarity.RARE, mage.cards.b.BottleOfSuleiman.class)); cards.add(new SetCardInfo("Bottomless Vault", 411, Rarity.RARE, mage.cards.b.BottomlessVault.class)); cards.add(new SetCardInfo("Brainstorm", 76, Rarity.COMMON, mage.cards.b.Brainstorm.class)); - cards.add(new SetCardInfo("Brainwash", 289, Rarity.COMMON, mage.cards.b.Brainwash.class)); + cards.add(new SetCardInfo("Brainwash", 13, Rarity.COMMON, mage.cards.b.Brainwash.class)); cards.add(new SetCardInfo("Brassclaw Orcs", 213, Rarity.COMMON, BrassclawOrcs.class)); - cards.add(new SetCardInfo("Breeding Pit", 10, Rarity.UNCOMMON, mage.cards.b.BreedingPit.class)); - cards.add(new SetCardInfo("Broken Visage", 11, Rarity.RARE, mage.cards.b.BrokenVisage.class)); + cards.add(new SetCardInfo("Breeding Pit", 148, Rarity.UNCOMMON, mage.cards.b.BreedingPit.class)); + cards.add(new SetCardInfo("Broken Visage", 149, Rarity.RARE, mage.cards.b.BrokenVisage.class)); cards.add(new SetCardInfo("Brothers of Fire", 214, Rarity.COMMON, mage.cards.b.BrothersOfFire.class)); cards.add(new SetCardInfo("Brushland", 412, Rarity.RARE, mage.cards.b.Brushland.class)); - cards.add(new SetCardInfo("Carapace", 143, Rarity.COMMON, mage.cards.c.Carapace.class)); - cards.add(new SetCardInfo("Caribou Range", 290, Rarity.RARE, mage.cards.c.CaribouRange.class)); - cards.add(new SetCardInfo("Carrion Ants", 12, Rarity.UNCOMMON, mage.cards.c.CarrionAnts.class)); - cards.add(new SetCardInfo("Castle", 291, Rarity.UNCOMMON, mage.cards.c.Castle.class)); - cards.add(new SetCardInfo("Cat Warriors", 144, Rarity.COMMON, mage.cards.c.CatWarriors.class)); + cards.add(new SetCardInfo("Carapace", 281, Rarity.COMMON, mage.cards.c.Carapace.class)); + cards.add(new SetCardInfo("Caribou Range", 14, Rarity.RARE, mage.cards.c.CaribouRange.class)); + cards.add(new SetCardInfo("Carrion Ants", 150, Rarity.UNCOMMON, mage.cards.c.CarrionAnts.class)); + cards.add(new SetCardInfo("Castle", 15, Rarity.UNCOMMON, mage.cards.c.Castle.class)); + cards.add(new SetCardInfo("Cat Warriors", 282, Rarity.COMMON, mage.cards.c.CatWarriors.class)); cards.add(new SetCardInfo("Cave People", 215, Rarity.UNCOMMON, mage.cards.c.CavePeople.class)); - cards.add(new SetCardInfo("Chub Toad", 145, Rarity.COMMON, mage.cards.c.ChubToad.class)); - cards.add(new SetCardInfo("Circle of Protection: Artifacts", 292, Rarity.COMMON, mage.cards.c.CircleOfProtectionArtifacts.class)); - cards.add(new SetCardInfo("Circle of Protection: Black", 293, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlack.class)); - cards.add(new SetCardInfo("Circle of Protection: Blue", 294, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlue.class)); - cards.add(new SetCardInfo("Circle of Protection: Green", 295, Rarity.COMMON, mage.cards.c.CircleOfProtectionGreen.class)); - cards.add(new SetCardInfo("Circle of Protection: Red", 296, Rarity.COMMON, mage.cards.c.CircleOfProtectionRed.class)); - cards.add(new SetCardInfo("Circle of Protection: White", 297, Rarity.COMMON, mage.cards.c.CircleOfProtectionWhite.class)); + cards.add(new SetCardInfo("Chub Toad", 283, Rarity.COMMON, mage.cards.c.ChubToad.class)); + cards.add(new SetCardInfo("Circle of Protection: Artifacts", 16, Rarity.COMMON, mage.cards.c.CircleOfProtectionArtifacts.class)); + cards.add(new SetCardInfo("Circle of Protection: Black", 17, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlack.class)); + cards.add(new SetCardInfo("Circle of Protection: Blue", 18, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlue.class)); + cards.add(new SetCardInfo("Circle of Protection: Green", 19, Rarity.COMMON, mage.cards.c.CircleOfProtectionGreen.class)); + cards.add(new SetCardInfo("Circle of Protection: Red", 20, Rarity.COMMON, mage.cards.c.CircleOfProtectionRed.class)); + cards.add(new SetCardInfo("Circle of Protection: White", 21, Rarity.COMMON, mage.cards.c.CircleOfProtectionWhite.class)); cards.add(new SetCardInfo("City of Brass", 413, Rarity.RARE, mage.cards.c.CityOfBrass.class)); cards.add(new SetCardInfo("Clay Statue", 355, Rarity.COMMON, mage.cards.c.ClayStatue.class)); cards.add(new SetCardInfo("Clockwork Beast", 356, Rarity.RARE, mage.cards.c.ClockworkBeast.class)); cards.add(new SetCardInfo("Clockwork Steed", 357, Rarity.UNCOMMON, mage.cards.c.ClockworkSteed.class)); - cards.add(new SetCardInfo("Cockatrice", 146, Rarity.RARE, mage.cards.c.Cockatrice.class)); + cards.add(new SetCardInfo("Cockatrice", 284, Rarity.RARE, mage.cards.c.Cockatrice.class)); cards.add(new SetCardInfo("Colossus of Sardia", 358, Rarity.RARE, mage.cards.c.ColossusOfSardia.class)); cards.add(new SetCardInfo("Conquer", 216, Rarity.UNCOMMON, mage.cards.c.Conquer.class)); cards.add(new SetCardInfo("Coral Helm", 359, Rarity.RARE, mage.cards.c.CoralHelm.class)); cards.add(new SetCardInfo("Counterspell", 77, Rarity.COMMON, mage.cards.c.Counterspell.class)); - cards.add(new SetCardInfo("Craw Giant", 147, Rarity.UNCOMMON, mage.cards.c.CrawGiant.class)); - cards.add(new SetCardInfo("Craw Wurm", 148, Rarity.COMMON, mage.cards.c.CrawWurm.class)); + cards.add(new SetCardInfo("Craw Giant", 285, Rarity.UNCOMMON, mage.cards.c.CrawGiant.class)); + cards.add(new SetCardInfo("Craw Wurm", 286, Rarity.COMMON, mage.cards.c.CrawWurm.class)); cards.add(new SetCardInfo("Crimson Manticore", 217, Rarity.RARE, mage.cards.c.CrimsonManticore.class)); cards.add(new SetCardInfo("Crown of the Ages", 360, Rarity.RARE, mage.cards.c.CrownOfTheAges.class)); - cards.add(new SetCardInfo("Crumble", 149, Rarity.UNCOMMON, mage.cards.c.Crumble.class)); - cards.add(new SetCardInfo("Crusade", 298, Rarity.RARE, mage.cards.c.Crusade.class)); + cards.add(new SetCardInfo("Crumble", 287, Rarity.UNCOMMON, mage.cards.c.Crumble.class)); + cards.add(new SetCardInfo("Crusade", 22, Rarity.RARE, mage.cards.c.Crusade.class)); cards.add(new SetCardInfo("Crystal Rod", 361, Rarity.UNCOMMON, mage.cards.c.CrystalRod.class)); - cards.add(new SetCardInfo("Cursed Land", 14, Rarity.UNCOMMON, mage.cards.c.CursedLand.class)); + cards.add(new SetCardInfo("Cursed Land", 152, Rarity.UNCOMMON, mage.cards.c.CursedLand.class)); + cards.add(new SetCardInfo("D'Avenant Archer", 23, Rarity.COMMON, mage.cards.d.DAvenantArcher.class)); cards.add(new SetCardInfo("Dance of Many", 78, Rarity.RARE, mage.cards.d.DanceOfMany.class)); cards.add(new SetCardInfo("Dancing Scimitar", 362, Rarity.RARE, mage.cards.d.DancingScimitar.class)); cards.add(new SetCardInfo("Dandan", 79, Rarity.COMMON, mage.cards.d.Dandan.class)); cards.add(new SetCardInfo("Dark Maze", 80, Rarity.COMMON, mage.cards.d.DarkMaze.class)); - cards.add(new SetCardInfo("Dark Ritual", 15, Rarity.COMMON, mage.cards.d.DarkRitual.class)); - cards.add(new SetCardInfo("D'Avenant Archer", 299, Rarity.COMMON, mage.cards.d.DAvenantArcher.class)); - cards.add(new SetCardInfo("Deathgrip", 16, Rarity.UNCOMMON, mage.cards.d.Deathgrip.class)); - cards.add(new SetCardInfo("Death Speakers", 300, Rarity.COMMON, mage.cards.d.DeathSpeakers.class)); - cards.add(new SetCardInfo("Death Ward", 301, Rarity.COMMON, mage.cards.d.DeathWard.class)); + cards.add(new SetCardInfo("Dark Ritual", 153, Rarity.COMMON, mage.cards.d.DarkRitual.class)); + cards.add(new SetCardInfo("Death Speakers", 24, Rarity.COMMON, mage.cards.d.DeathSpeakers.class)); + cards.add(new SetCardInfo("Death Ward", 25, Rarity.COMMON, mage.cards.d.DeathWard.class)); + cards.add(new SetCardInfo("Deathgrip", 154, Rarity.UNCOMMON, mage.cards.d.Deathgrip.class)); cards.add(new SetCardInfo("Deflection", 81, Rarity.RARE, mage.cards.d.Deflection.class)); - cards.add(new SetCardInfo("Derelor", 17, Rarity.RARE, mage.cards.d.Derelor.class)); - cards.add(new SetCardInfo("Desert Twister", 150, Rarity.UNCOMMON, mage.cards.d.DesertTwister.class)); + cards.add(new SetCardInfo("Derelor", 155, Rarity.RARE, mage.cards.d.Derelor.class)); + cards.add(new SetCardInfo("Desert Twister", 288, Rarity.UNCOMMON, mage.cards.d.DesertTwister.class)); cards.add(new SetCardInfo("Detonate", 218, Rarity.UNCOMMON, mage.cards.d.Detonate.class)); cards.add(new SetCardInfo("Diabolic Machine", 363, Rarity.UNCOMMON, mage.cards.d.DiabolicMachine.class)); cards.add(new SetCardInfo("Dingus Egg", 364, Rarity.RARE, mage.cards.d.DingusEgg.class)); - cards.add(new SetCardInfo("Disenchant", 302, Rarity.COMMON, mage.cards.d.Disenchant.class)); + cards.add(new SetCardInfo("Disenchant", 26, Rarity.COMMON, mage.cards.d.Disenchant.class)); cards.add(new SetCardInfo("Disintegrate", 219, Rarity.COMMON, mage.cards.d.Disintegrate.class)); cards.add(new SetCardInfo("Disrupting Scepter", 365, Rarity.RARE, mage.cards.d.DisruptingScepter.class)); - cards.add(new SetCardInfo("Divine Offering", 303, Rarity.COMMON, mage.cards.d.DivineOffering.class)); - cards.add(new SetCardInfo("Divine Transformation", 304, Rarity.UNCOMMON, mage.cards.d.DivineTransformation.class)); + cards.add(new SetCardInfo("Divine Offering", 27, Rarity.COMMON, mage.cards.d.DivineOffering.class)); + cards.add(new SetCardInfo("Divine Transformation", 28, 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 Life", 156, 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)); + cards.add(new SetCardInfo("Drudge Skeletons", 157, Rarity.COMMON, mage.cards.d.DrudgeSkeletons.class)); + cards.add(new SetCardInfo("Durkwood Boars", 289, Rarity.COMMON, mage.cards.d.DurkwoodBoars.class)); + cards.add(new SetCardInfo("Dust to Dust", 29, Rarity.UNCOMMON, mage.cards.d.DustToDust.class)); cards.add(new SetCardInfo("Dwarven Catapult", 220, Rarity.UNCOMMON, mage.cards.d.DwarvenCatapult.class)); cards.add(new SetCardInfo("Dwarven Hold", 414, Rarity.RARE, mage.cards.d.DwarvenHold.class)); cards.add(new SetCardInfo("Dwarven Ruins", 415, Rarity.UNCOMMON, mage.cards.d.DwarvenRuins.class)); @@ -149,330 +149,329 @@ public class FifthEdition extends ExpansionSet { cards.add(new SetCardInfo("Dwarven Warriors", 222, Rarity.COMMON, mage.cards.d.DwarvenWarriors.class)); cards.add(new SetCardInfo("Earthquake", 223, Rarity.RARE, mage.cards.e.Earthquake.class)); cards.add(new SetCardInfo("Ebon Stronghold", 416, Rarity.UNCOMMON, mage.cards.e.EbonStronghold.class)); - cards.add(new SetCardInfo("Elder Druid", 152, Rarity.RARE, mage.cards.e.ElderDruid.class)); + cards.add(new SetCardInfo("Elder Druid", 290, Rarity.RARE, mage.cards.e.ElderDruid.class)); cards.add(new SetCardInfo("Elkin Bottle", 367, Rarity.RARE, mage.cards.e.ElkinBottle.class)); - cards.add(new SetCardInfo("Elven Riders", 153, Rarity.UNCOMMON, mage.cards.e.ElvenRiders.class)); - cards.add(new SetCardInfo("Elvish Archers", 154, Rarity.RARE, mage.cards.e.ElvishArchers.class)); + cards.add(new SetCardInfo("Elven Riders", 291, Rarity.UNCOMMON, mage.cards.e.ElvenRiders.class)); + cards.add(new SetCardInfo("Elvish Archers", 292, Rarity.RARE, mage.cards.e.ElvishArchers.class)); cards.add(new SetCardInfo("Energy Flux", 83, Rarity.UNCOMMON, mage.cards.e.EnergyFlux.class)); cards.add(new SetCardInfo("Enervate", 84, Rarity.COMMON, mage.cards.e.Enervate.class)); - cards.add(new SetCardInfo("Erg Raiders", 20, Rarity.COMMON, mage.cards.e.ErgRaiders.class)); + cards.add(new SetCardInfo("Erg Raiders", 158, Rarity.COMMON, mage.cards.e.ErgRaiders.class)); cards.add(new SetCardInfo("Errantry", 224, Rarity.COMMON, mage.cards.e.Errantry.class)); cards.add(new SetCardInfo("Eternal Warrior", 225, Rarity.COMMON, mage.cards.e.EternalWarrior.class)); - cards.add(new SetCardInfo("Evil Eye of Orms-by-Gore", 21, Rarity.UNCOMMON, mage.cards.e.EvilEyeOfOrmsByGore.class)); - cards.add(new SetCardInfo("Evil Presence", 22, Rarity.UNCOMMON, mage.cards.e.EvilPresence.class)); - cards.add(new SetCardInfo("Eye for an Eye", 306, Rarity.RARE, mage.cards.e.EyeForAnEye.class)); - cards.add(new SetCardInfo("Fallen Angel", 23, Rarity.UNCOMMON, mage.cards.f.FallenAngel.class)); - cards.add(new SetCardInfo("Fear", 24, Rarity.COMMON, mage.cards.f.Fear.class)); + cards.add(new SetCardInfo("Evil Eye of Orms-by-Gore", 159, Rarity.UNCOMMON, mage.cards.e.EvilEyeOfOrmsByGore.class)); + cards.add(new SetCardInfo("Evil Presence", 160, Rarity.UNCOMMON, mage.cards.e.EvilPresence.class)); + cards.add(new SetCardInfo("Eye for an Eye", 30, Rarity.RARE, mage.cards.e.EyeForAnEye.class)); + cards.add(new SetCardInfo("Fallen Angel", 161, Rarity.UNCOMMON, mage.cards.f.FallenAngel.class)); + cards.add(new SetCardInfo("Fear", 162, Rarity.COMMON, mage.cards.f.Fear.class)); cards.add(new SetCardInfo("Feedback", 85, Rarity.UNCOMMON, mage.cards.f.Feedback.class)); cards.add(new SetCardInfo("Feldon's Cane", 368, Rarity.UNCOMMON, mage.cards.f.FeldonsCane.class)); cards.add(new SetCardInfo("Fellwar Stone", 369, Rarity.UNCOMMON, mage.cards.f.FellwarStone.class)); cards.add(new SetCardInfo("Feroz's Ban", 370, Rarity.RARE, mage.cards.f.FerozsBan.class)); + cards.add(new SetCardInfo("Fire Drake", 226, Rarity.UNCOMMON, mage.cards.f.FireDrake.class)); cards.add(new SetCardInfo("Fireball", 227, Rarity.COMMON, mage.cards.f.Fireball.class)); cards.add(new SetCardInfo("Firebreathing", 228, Rarity.COMMON, mage.cards.f.Firebreathing.class)); - cards.add(new SetCardInfo("Fire Drake", 226, Rarity.UNCOMMON, mage.cards.f.FireDrake.class)); cards.add(new SetCardInfo("Flame Spirit", 229, Rarity.UNCOMMON, mage.cards.f.FlameSpirit.class)); cards.add(new SetCardInfo("Flare", 230, Rarity.COMMON, mage.cards.f.Flare.class)); cards.add(new SetCardInfo("Flashfires", 231, Rarity.UNCOMMON, mage.cards.f.Flashfires.class)); cards.add(new SetCardInfo("Flight", 86, Rarity.COMMON, mage.cards.f.Flight.class)); cards.add(new SetCardInfo("Flood", 87, Rarity.COMMON, mage.cards.f.Flood.class)); cards.add(new SetCardInfo("Flying Carpet", 371, Rarity.RARE, mage.cards.f.FlyingCarpet.class)); - cards.add(new SetCardInfo("Fog", 155, Rarity.COMMON, mage.cards.f.Fog.class)); - cards.add(new SetCardInfo("Force of Nature", 156, Rarity.RARE, mage.cards.f.ForceOfNature.class)); + cards.add(new SetCardInfo("Fog", 293, Rarity.COMMON, mage.cards.f.Fog.class)); + cards.add(new SetCardInfo("Force of Nature", 294, Rarity.RARE, mage.cards.f.ForceOfNature.class)); cards.add(new SetCardInfo("Force Spike", 88, Rarity.COMMON, mage.cards.f.ForceSpike.class)); - cards.add(new SetCardInfo("Forest", 417, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Forest", 418, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Forest", 419, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Forest", 420, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 446, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 447, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 448, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 449, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Forget", 89, Rarity.RARE, mage.cards.f.Forget.class)); - cards.add(new SetCardInfo("Foxfire", 157, Rarity.COMMON, mage.cards.f.Foxfire.class)); cards.add(new SetCardInfo("Fountain of Youth", 372, Rarity.UNCOMMON, mage.cards.f.FountainOfYouth.class)); - cards.add(new SetCardInfo("Frozen Shade", 25, Rarity.COMMON, mage.cards.f.FrozenShade.class)); - cards.add(new SetCardInfo("Funeral March", 26, Rarity.COMMON, mage.cards.f.FuneralMarch.class)); - cards.add(new SetCardInfo("Fungusaur", 158, Rarity.RARE, mage.cards.f.Fungusaur.class)); - cards.add(new SetCardInfo("Fyndhorn Elder", 159, Rarity.UNCOMMON, mage.cards.f.FyndhornElder.class)); + cards.add(new SetCardInfo("Foxfire", 295, Rarity.COMMON, mage.cards.f.Foxfire.class)); + cards.add(new SetCardInfo("Frozen Shade", 163, Rarity.COMMON, mage.cards.f.FrozenShade.class)); + cards.add(new SetCardInfo("Funeral March", 164, Rarity.COMMON, mage.cards.f.FuneralMarch.class)); + cards.add(new SetCardInfo("Fungusaur", 296, Rarity.RARE, mage.cards.f.Fungusaur.class)); + cards.add(new SetCardInfo("Fyndhorn Elder", 297, Rarity.UNCOMMON, mage.cards.f.FyndhornElder.class)); cards.add(new SetCardInfo("Game of Chaos", 232, Rarity.RARE, mage.cards.g.GameOfChaos.class)); cards.add(new SetCardInfo("Gaseous Form", 90, Rarity.COMMON, mage.cards.g.GaseousForm.class)); cards.add(new SetCardInfo("Gauntlets of Chaos", 373, Rarity.RARE, mage.cards.g.GauntletsOfChaos.class)); - cards.add(new SetCardInfo("Ghazban Ogre", 160, Rarity.COMMON, mage.cards.g.GhazbanOgre.class)); - cards.add(new SetCardInfo("Giant Growth", 161, Rarity.COMMON, mage.cards.g.GiantGrowth.class)); - cards.add(new SetCardInfo("Giant Spider", 162, Rarity.COMMON, mage.cards.g.GiantSpider.class)); + cards.add(new SetCardInfo("Ghazban Ogre", 298, Rarity.COMMON, mage.cards.g.GhazbanOgre.class)); + cards.add(new SetCardInfo("Giant Growth", 299, Rarity.COMMON, mage.cards.g.GiantGrowth.class)); + cards.add(new SetCardInfo("Giant Spider", 300, Rarity.COMMON, mage.cards.g.GiantSpider.class)); cards.add(new SetCardInfo("Giant Strength", 233, Rarity.COMMON, mage.cards.g.GiantStrength.class)); cards.add(new SetCardInfo("Glacial Wall", 91, Rarity.UNCOMMON, mage.cards.g.GlacialWall.class)); cards.add(new SetCardInfo("Glasses of Urza", 374, Rarity.UNCOMMON, mage.cards.g.GlassesOfUrza.class)); - cards.add(new SetCardInfo("Gloom", 27, Rarity.UNCOMMON, mage.cards.g.Gloom.class)); + cards.add(new SetCardInfo("Gloom", 165, Rarity.UNCOMMON, mage.cards.g.Gloom.class)); cards.add(new SetCardInfo("Goblin Digging Team", 234, Rarity.COMMON, mage.cards.g.GoblinDiggingTeam.class)); cards.add(new SetCardInfo("Goblin Hero", 235, Rarity.COMMON, mage.cards.g.GoblinHero.class)); cards.add(new SetCardInfo("Goblin King", 236, Rarity.RARE, mage.cards.g.GoblinKing.class)); cards.add(new SetCardInfo("Goblin War Drums", 237, Rarity.COMMON, GoblinWarDrums.class)); cards.add(new SetCardInfo("Goblin Warrens", 238, Rarity.RARE, mage.cards.g.GoblinWarrens.class)); cards.add(new SetCardInfo("Grapeshot Catapult", 375, Rarity.COMMON, mage.cards.g.GrapeshotCatapult.class)); - cards.add(new SetCardInfo("Greater Realm of Preservation", 307, Rarity.UNCOMMON, mage.cards.g.GreaterRealmOfPreservation.class)); - cards.add(new SetCardInfo("Greater Werewolf", 28, Rarity.UNCOMMON, mage.cards.g.GreaterWerewolf.class)); - cards.add(new SetCardInfo("Grizzly Bears", 163, Rarity.COMMON, mage.cards.g.GrizzlyBears.class)); - cards.add(new SetCardInfo("Havenwood Battleground", 421, Rarity.UNCOMMON, mage.cards.h.HavenwoodBattleground.class)); - cards.add(new SetCardInfo("Heal", 308, Rarity.COMMON, mage.cards.h.Heal.class)); - cards.add(new SetCardInfo("Healing Salve", 309, Rarity.COMMON, mage.cards.h.HealingSalve.class)); - cards.add(new SetCardInfo("Hecatomb", 29, Rarity.RARE, mage.cards.h.Hecatomb.class)); + cards.add(new SetCardInfo("Greater Realm of Preservation", 31, Rarity.UNCOMMON, mage.cards.g.GreaterRealmOfPreservation.class)); + cards.add(new SetCardInfo("Greater Werewolf", 166, Rarity.UNCOMMON, mage.cards.g.GreaterWerewolf.class)); + cards.add(new SetCardInfo("Grizzly Bears", 301, Rarity.COMMON, mage.cards.g.GrizzlyBears.class)); + cards.add(new SetCardInfo("Havenwood Battleground", 417, Rarity.UNCOMMON, mage.cards.h.HavenwoodBattleground.class)); + cards.add(new SetCardInfo("Heal", 32, Rarity.COMMON, mage.cards.h.Heal.class)); + cards.add(new SetCardInfo("Healing Salve", 33, Rarity.COMMON, mage.cards.h.HealingSalve.class)); + cards.add(new SetCardInfo("Hecatomb", 167, Rarity.RARE, mage.cards.h.Hecatomb.class)); cards.add(new SetCardInfo("Helm of Chatzuk", 376, Rarity.RARE, mage.cards.h.HelmOfChatzuk.class)); cards.add(new SetCardInfo("Hill Giant", 239, Rarity.COMMON, mage.cards.h.HillGiant.class)); - cards.add(new SetCardInfo("Hollow Trees", 422, Rarity.RARE, mage.cards.h.HollowTrees.class)); - cards.add(new SetCardInfo("Holy Strength", 311, Rarity.COMMON, mage.cards.h.HolyStrength.class)); + cards.add(new SetCardInfo("Hollow Trees", 418, Rarity.RARE, mage.cards.h.HollowTrees.class)); + cards.add(new SetCardInfo("Holy Strength", 35, Rarity.COMMON, mage.cards.h.HolyStrength.class)); cards.add(new SetCardInfo("Homarid Warrior", 92, Rarity.COMMON, HomaridWarrior.class)); - cards.add(new SetCardInfo("Howl from Beyond", 30, Rarity.COMMON, mage.cards.h.HowlFromBeyond.class)); + cards.add(new SetCardInfo("Howl from Beyond", 168, Rarity.COMMON, mage.cards.h.HowlFromBeyond.class)); cards.add(new SetCardInfo("Howling Mine", 377, Rarity.RARE, mage.cards.h.HowlingMine.class)); - cards.add(new SetCardInfo("Hungry Mist", 164, Rarity.COMMON, mage.cards.h.HungryMist.class)); + cards.add(new SetCardInfo("Hungry Mist", 302, Rarity.COMMON, mage.cards.h.HungryMist.class)); cards.add(new SetCardInfo("Hurkyl's Recall", 93, Rarity.RARE, mage.cards.h.HurkylsRecall.class)); cards.add(new SetCardInfo("Hurloon Minotaur", 240, Rarity.COMMON, mage.cards.h.HurloonMinotaur.class)); - cards.add(new SetCardInfo("Hurricane", 165, Rarity.UNCOMMON, mage.cards.h.Hurricane.class)); + cards.add(new SetCardInfo("Hurricane", 303, Rarity.UNCOMMON, mage.cards.h.Hurricane.class)); cards.add(new SetCardInfo("Hydroblast", 94, Rarity.UNCOMMON, mage.cards.h.Hydroblast.class)); - cards.add(new SetCardInfo("Icatian Phalanx", 312, Rarity.UNCOMMON, mage.cards.i.IcatianPhalanx.class)); - cards.add(new SetCardInfo("Icatian Scout", 313, Rarity.COMMON, IcatianScout.class)); - cards.add(new SetCardInfo("Icatian Store", 423, Rarity.RARE, mage.cards.i.IcatianStore.class)); - cards.add(new SetCardInfo("Icatian Town", 314, Rarity.RARE, mage.cards.i.IcatianTown.class)); - cards.add(new SetCardInfo("Ice Floe", 424, Rarity.UNCOMMON, mage.cards.i.IceFloe.class)); + cards.add(new SetCardInfo("Icatian Phalanx", 36, Rarity.UNCOMMON, mage.cards.i.IcatianPhalanx.class)); + cards.add(new SetCardInfo("Icatian Scout", 37, Rarity.COMMON, IcatianScout.class)); + cards.add(new SetCardInfo("Icatian Store", 419, Rarity.RARE, mage.cards.i.IcatianStore.class)); + cards.add(new SetCardInfo("Icatian Town", 38, Rarity.RARE, mage.cards.i.IcatianTown.class)); + cards.add(new SetCardInfo("Ice Floe", 420, Rarity.UNCOMMON, mage.cards.i.IceFloe.class)); cards.add(new SetCardInfo("Imposing Visage", 241, Rarity.COMMON, mage.cards.i.ImposingVisage.class)); cards.add(new SetCardInfo("Incinerate", 242, Rarity.COMMON, mage.cards.i.Incinerate.class)); cards.add(new SetCardInfo("Inferno", 243, Rarity.RARE, mage.cards.i.Inferno.class)); cards.add(new SetCardInfo("Infinite Hourglass", 378, Rarity.RARE, mage.cards.i.InfiniteHourglass.class)); - cards.add(new SetCardInfo("Initiates of the Ebon Hand", 31, Rarity.COMMON, InitiatesOfTheEbonHand.class)); - cards.add(new SetCardInfo("Instill Energy", 166, Rarity.UNCOMMON, mage.cards.i.InstillEnergy.class)); + cards.add(new SetCardInfo("Initiates of the Ebon Hand", 169, Rarity.COMMON, InitiatesOfTheEbonHand.class)); + cards.add(new SetCardInfo("Instill Energy", 304, Rarity.UNCOMMON, mage.cards.i.InstillEnergy.class)); + cards.add(new SetCardInfo("Iron Star", 379, Rarity.UNCOMMON, mage.cards.i.IronStar.class)); cards.add(new SetCardInfo("Ironclaw Curse", 244, Rarity.RARE, mage.cards.i.IronclawCurse.class)); cards.add(new SetCardInfo("Ironclaw Orcs", 245, Rarity.COMMON, mage.cards.i.IronclawOrcs.class)); - cards.add(new SetCardInfo("Ironroot Treefolk", 167, Rarity.COMMON, mage.cards.i.IronrootTreefolk.class)); - cards.add(new SetCardInfo("Iron Star", 379, Rarity.UNCOMMON, mage.cards.i.IronStar.class)); - cards.add(new SetCardInfo("Island", 425, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Island", 426, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Island", 427, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Island", 428, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Island Sanctuary", 315, Rarity.RARE, mage.cards.i.IslandSanctuary.class)); + cards.add(new SetCardInfo("Ironroot Treefolk", 305, Rarity.COMMON, mage.cards.i.IronrootTreefolk.class)); + cards.add(new SetCardInfo("Island Sanctuary", 39, Rarity.RARE, mage.cards.i.IslandSanctuary.class)); + cards.add(new SetCardInfo("Island", 434, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 435, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 436, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 437, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Ivory Cup", 380, Rarity.UNCOMMON, mage.cards.i.IvoryCup.class)); - cards.add(new SetCardInfo("Ivory Guardians", 316, Rarity.UNCOMMON, mage.cards.i.IvoryGuardians.class)); + cards.add(new SetCardInfo("Ivory Guardians", 40, Rarity.UNCOMMON, mage.cards.i.IvoryGuardians.class)); cards.add(new SetCardInfo("Jade Monolith", 381, Rarity.RARE, mage.cards.j.JadeMonolith.class)); cards.add(new SetCardInfo("Jalum Tome", 382, Rarity.RARE, mage.cards.j.JalumTome.class)); cards.add(new SetCardInfo("Jandor's Saddlebags", 383, Rarity.RARE, mage.cards.j.JandorsSaddlebags.class)); cards.add(new SetCardInfo("Jayemdae Tome", 384, Rarity.RARE, mage.cards.j.JayemdaeTome.class)); cards.add(new SetCardInfo("Jester's Cap", 385, Rarity.RARE, mage.cards.j.JestersCap.class)); - cards.add(new SetCardInfo("Johtull Wurm", 168, Rarity.UNCOMMON, mage.cards.j.JohtullWurm.class)); + cards.add(new SetCardInfo("Johtull Wurm", 306, Rarity.UNCOMMON, mage.cards.j.JohtullWurm.class)); cards.add(new SetCardInfo("Jokulhaups", 246, Rarity.RARE, mage.cards.j.Jokulhaups.class)); cards.add(new SetCardInfo("Joven's Tools", 386, Rarity.UNCOMMON, mage.cards.j.JovensTools.class)); - cards.add(new SetCardInfo("Justice", 317, Rarity.UNCOMMON, mage.cards.j.Justice.class)); + cards.add(new SetCardInfo("Justice", 41, Rarity.UNCOMMON, mage.cards.j.Justice.class)); cards.add(new SetCardInfo("Juxtapose", 95, Rarity.RARE, mage.cards.j.Juxtapose.class)); - cards.add(new SetCardInfo("Karma", 318, Rarity.UNCOMMON, mage.cards.k.Karma.class)); - cards.add(new SetCardInfo("Karplusan Forest", 429, Rarity.RARE, mage.cards.k.KarplusanForest.class)); + cards.add(new SetCardInfo("Karma", 42, Rarity.UNCOMMON, mage.cards.k.Karma.class)); + cards.add(new SetCardInfo("Karplusan Forest", 421, Rarity.RARE, mage.cards.k.KarplusanForest.class)); cards.add(new SetCardInfo("Keldon Warlord", 247, Rarity.UNCOMMON, mage.cards.k.KeldonWarlord.class)); - cards.add(new SetCardInfo("Killer Bees", 169, Rarity.UNCOMMON, mage.cards.k.KillerBees.class)); - cards.add(new SetCardInfo("Kismet", 319, Rarity.UNCOMMON, mage.cards.k.Kismet.class)); - cards.add(new SetCardInfo("Kjeldoran Dead", 32, Rarity.COMMON, mage.cards.k.KjeldoranDead.class)); - cards.add(new SetCardInfo("Kjeldoran Royal Guard", 320, Rarity.RARE, mage.cards.k.KjeldoranRoyalGuard.class)); - cards.add(new SetCardInfo("Kjeldoran Skycaptain", 321, Rarity.UNCOMMON, mage.cards.k.KjeldoranSkycaptain.class)); - cards.add(new SetCardInfo("Knight of Stromgald", 33, Rarity.UNCOMMON, mage.cards.k.KnightOfStromgald.class)); - cards.add(new SetCardInfo("Krovikan Fetish", 34, Rarity.COMMON, mage.cards.k.KrovikanFetish.class)); + cards.add(new SetCardInfo("Killer Bees", 307, Rarity.UNCOMMON, mage.cards.k.KillerBees.class)); + cards.add(new SetCardInfo("Kismet", 43, Rarity.UNCOMMON, mage.cards.k.Kismet.class)); + cards.add(new SetCardInfo("Kjeldoran Dead", 170, Rarity.COMMON, mage.cards.k.KjeldoranDead.class)); + cards.add(new SetCardInfo("Kjeldoran Royal Guard", 44, Rarity.RARE, mage.cards.k.KjeldoranRoyalGuard.class)); + cards.add(new SetCardInfo("Kjeldoran Skycaptain", 45, Rarity.UNCOMMON, mage.cards.k.KjeldoranSkycaptain.class)); + cards.add(new SetCardInfo("Knight of Stromgald", 171, Rarity.UNCOMMON, mage.cards.k.KnightOfStromgald.class)); + cards.add(new SetCardInfo("Krovikan Fetish", 172, Rarity.COMMON, mage.cards.k.KrovikanFetish.class)); cards.add(new SetCardInfo("Krovikan Sorcerer", 96, Rarity.COMMON, mage.cards.k.KrovikanSorcerer.class)); cards.add(new SetCardInfo("Labyrinth Minotaur", 97, Rarity.COMMON, mage.cards.l.LabyrinthMinotaur.class)); - cards.add(new SetCardInfo("Leshrac's Rite", 35, Rarity.UNCOMMON, mage.cards.l.LeshracsRite.class)); + cards.add(new SetCardInfo("Leshrac's Rite", 173, Rarity.UNCOMMON, mage.cards.l.LeshracsRite.class)); cards.add(new SetCardInfo("Leviathan", 98, Rarity.RARE, mage.cards.l.Leviathan.class)); - cards.add(new SetCardInfo("Ley Druid", 170, Rarity.COMMON, mage.cards.l.LeyDruid.class)); - cards.add(new SetCardInfo("Lhurgoyf", 171, Rarity.RARE, mage.cards.l.Lhurgoyf.class)); + cards.add(new SetCardInfo("Ley Druid", 308, Rarity.COMMON, mage.cards.l.LeyDruid.class)); + cards.add(new SetCardInfo("Lhurgoyf", 309, Rarity.RARE, mage.cards.l.Lhurgoyf.class)); cards.add(new SetCardInfo("Library of Leng", 387, Rarity.UNCOMMON, mage.cards.l.LibraryOfLeng.class)); - cards.add(new SetCardInfo("Lifeforce", 172, Rarity.UNCOMMON, mage.cards.l.Lifeforce.class)); + cards.add(new SetCardInfo("Lifeforce", 310, Rarity.UNCOMMON, mage.cards.l.Lifeforce.class)); cards.add(new SetCardInfo("Lifetap", 99, Rarity.UNCOMMON, mage.cards.l.Lifetap.class)); - cards.add(new SetCardInfo("Living Artifact", 173, Rarity.RARE, mage.cards.l.LivingArtifact.class)); - cards.add(new SetCardInfo("Living Lands", 174, Rarity.RARE, mage.cards.l.LivingLands.class)); - cards.add(new SetCardInfo("Llanowar Elves", 175, Rarity.COMMON, mage.cards.l.LlanowarElves.class)); + cards.add(new SetCardInfo("Living Artifact", 311, Rarity.RARE, mage.cards.l.LivingArtifact.class)); + cards.add(new SetCardInfo("Living Lands", 312, Rarity.RARE, mage.cards.l.LivingLands.class)); + cards.add(new SetCardInfo("Llanowar Elves", 313, Rarity.COMMON, mage.cards.l.LlanowarElves.class)); cards.add(new SetCardInfo("Lord of Atlantis", 100, Rarity.RARE, mage.cards.l.LordOfAtlantis.class)); - cards.add(new SetCardInfo("Lord of the Pit", 36, Rarity.RARE, mage.cards.l.LordOfThePit.class)); - cards.add(new SetCardInfo("Lost Soul", 37, Rarity.COMMON, mage.cards.l.LostSoul.class)); - cards.add(new SetCardInfo("Lure", 176, Rarity.UNCOMMON, mage.cards.l.Lure.class)); + cards.add(new SetCardInfo("Lord of the Pit", 174, Rarity.RARE, mage.cards.l.LordOfThePit.class)); + cards.add(new SetCardInfo("Lost Soul", 175, Rarity.COMMON, mage.cards.l.LostSoul.class)); + cards.add(new SetCardInfo("Lure", 314, Rarity.UNCOMMON, mage.cards.l.Lure.class)); cards.add(new SetCardInfo("Magus of the Unseen", 102, Rarity.RARE, mage.cards.m.MagusOfTheUnseen.class)); - cards.add(new SetCardInfo("Manabarbs", 250, Rarity.RARE, mage.cards.m.Manabarbs.class)); cards.add(new SetCardInfo("Mana Clash", 248, Rarity.RARE, mage.cards.m.ManaClash.class)); cards.add(new SetCardInfo("Mana Flare", 249, Rarity.RARE, mage.cards.m.ManaFlare.class)); cards.add(new SetCardInfo("Mana Vault", 388, Rarity.RARE, mage.cards.m.ManaVault.class)); - cards.add(new SetCardInfo("Marsh Viper", 177, Rarity.COMMON, mage.cards.m.MarshViper.class)); + cards.add(new SetCardInfo("Manabarbs", 250, Rarity.RARE, mage.cards.m.Manabarbs.class)); + cards.add(new SetCardInfo("Marsh Viper", 315, Rarity.COMMON, mage.cards.m.MarshViper.class)); cards.add(new SetCardInfo("Meekstone", 389, Rarity.RARE, mage.cards.m.Meekstone.class)); cards.add(new SetCardInfo("Memory Lapse", 103, Rarity.COMMON, mage.cards.m.MemoryLapse.class)); cards.add(new SetCardInfo("Merfolk of the Pearl Trident", 104, Rarity.COMMON, mage.cards.m.MerfolkOfThePearlTrident.class)); - cards.add(new SetCardInfo("Mesa Falcon", 322, Rarity.COMMON, MesaFalcon.class)); - cards.add(new SetCardInfo("Mesa Pegasus", 323, Rarity.COMMON, mage.cards.m.MesaPegasus.class)); + cards.add(new SetCardInfo("Mesa Falcon", 46, Rarity.COMMON, MesaFalcon.class)); + cards.add(new SetCardInfo("Mesa Pegasus", 47, Rarity.COMMON, mage.cards.m.MesaPegasus.class)); cards.add(new SetCardInfo("Millstone", 390, Rarity.RARE, mage.cards.m.Millstone.class)); cards.add(new SetCardInfo("Mind Bomb", 105, Rarity.UNCOMMON, mage.cards.m.MindBomb.class)); - cards.add(new SetCardInfo("Mind Ravel", 38, Rarity.COMMON, mage.cards.m.MindRavel.class)); - cards.add(new SetCardInfo("Mindstab Thrull", 40, Rarity.COMMON, MindstabThrull.class)); - cards.add(new SetCardInfo("Mind Warp", 39, Rarity.UNCOMMON, mage.cards.m.MindWarp.class)); - cards.add(new SetCardInfo("Mole Worms", 41, Rarity.UNCOMMON, mage.cards.m.MoleWorms.class)); + cards.add(new SetCardInfo("Mind Ravel", 176, Rarity.COMMON, mage.cards.m.MindRavel.class)); + cards.add(new SetCardInfo("Mind Warp", 177, Rarity.UNCOMMON, mage.cards.m.MindWarp.class)); + cards.add(new SetCardInfo("Mindstab Thrull", 178, Rarity.COMMON, MindstabThrull.class)); + cards.add(new SetCardInfo("Mole Worms", 179, Rarity.UNCOMMON, mage.cards.m.MoleWorms.class)); cards.add(new SetCardInfo("Mons's Goblin Raiders", 251, Rarity.COMMON, mage.cards.m.MonssGoblinRaiders.class)); - cards.add(new SetCardInfo("Mountain", 430, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mountain", 431, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mountain", 432, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mountain", 433, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mountain Goat", 252, Rarity.COMMON, mage.cards.m.MountainGoat.class)); - cards.add(new SetCardInfo("Murk Dwellers", 42, Rarity.COMMON, mage.cards.m.MurkDwellers.class)); - cards.add(new SetCardInfo("Nature's Lore", 178, Rarity.COMMON, mage.cards.n.NaturesLore.class)); - cards.add(new SetCardInfo("Necrite", 43, Rarity.COMMON, Necrite.class)); - cards.add(new SetCardInfo("Necropotence", 44, Rarity.RARE, mage.cards.n.Necropotence.class)); - cards.add(new SetCardInfo("Nether Shadow", 45, Rarity.RARE, mage.cards.n.NetherShadow.class)); + cards.add(new SetCardInfo("Mountain", 442, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 443, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 444, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 445, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Murk Dwellers", 180, Rarity.COMMON, mage.cards.m.MurkDwellers.class)); + cards.add(new SetCardInfo("Nature's Lore", 316, Rarity.COMMON, mage.cards.n.NaturesLore.class)); + cards.add(new SetCardInfo("Necrite", 181, Rarity.COMMON, Necrite.class)); + cards.add(new SetCardInfo("Necropotence", 182, Rarity.RARE, mage.cards.n.Necropotence.class)); + cards.add(new SetCardInfo("Nether Shadow", 183, Rarity.RARE, mage.cards.n.NetherShadow.class)); cards.add(new SetCardInfo("Nevinyrral's Disk", 391, Rarity.RARE, mage.cards.n.NevinyrralsDisk.class)); - cards.add(new SetCardInfo("Nightmare", 46, Rarity.RARE, mage.cards.n.Nightmare.class)); + cards.add(new SetCardInfo("Nightmare", 184, Rarity.RARE, mage.cards.n.Nightmare.class)); cards.add(new SetCardInfo("Obelisk of Undoing", 392, Rarity.RARE, mage.cards.o.ObeliskOfUndoing.class)); cards.add(new SetCardInfo("Orcish Artillery", 253, Rarity.UNCOMMON, mage.cards.o.OrcishArtillery.class)); cards.add(new SetCardInfo("Orcish Captain", 254, Rarity.UNCOMMON, mage.cards.o.OrcishCaptain.class)); cards.add(new SetCardInfo("Orcish Oriflamme", 257, Rarity.UNCOMMON, mage.cards.o.OrcishOriflamme.class)); cards.add(new SetCardInfo("Orcish Squatters", 258, Rarity.RARE, mage.cards.o.OrcishSquatters.class)); - cards.add(new SetCardInfo("Order of the Sacred Torch", 324, Rarity.RARE, mage.cards.o.OrderOfTheSacredTorch.class)); - cards.add(new SetCardInfo("Order of the White Shield", 325, Rarity.UNCOMMON, mage.cards.o.OrderOfTheWhiteShield.class)); + cards.add(new SetCardInfo("Order of the Sacred Torch", 48, Rarity.RARE, mage.cards.o.OrderOfTheSacredTorch.class)); + cards.add(new SetCardInfo("Order of the White Shield", 49, Rarity.UNCOMMON, mage.cards.o.OrderOfTheWhiteShield.class)); cards.add(new SetCardInfo("Orgg", 259, Rarity.RARE, mage.cards.o.Orgg.class)); cards.add(new SetCardInfo("Ornithopter", 393, Rarity.UNCOMMON, mage.cards.o.Ornithopter.class)); cards.add(new SetCardInfo("Panic", 260, Rarity.COMMON, mage.cards.p.Panic.class)); - cards.add(new SetCardInfo("Paralyze", 47, Rarity.COMMON, mage.cards.p.Paralyze.class)); - cards.add(new SetCardInfo("Pearled Unicorn", 326, Rarity.COMMON, mage.cards.p.PearledUnicorn.class)); + cards.add(new SetCardInfo("Paralyze", 185, Rarity.COMMON, mage.cards.p.Paralyze.class)); + cards.add(new SetCardInfo("Pearled Unicorn", 50, Rarity.COMMON, mage.cards.p.PearledUnicorn.class)); cards.add(new SetCardInfo("Pentagram of the Ages", 394, Rarity.RARE, mage.cards.p.PentagramOfTheAges.class)); - cards.add(new SetCardInfo("Personal Incarnation", 327, Rarity.RARE, mage.cards.p.PersonalIncarnation.class)); - cards.add(new SetCardInfo("Pestilence", 48, Rarity.COMMON, mage.cards.p.Pestilence.class)); + cards.add(new SetCardInfo("Personal Incarnation", 51, Rarity.RARE, mage.cards.p.PersonalIncarnation.class)); + cards.add(new SetCardInfo("Pestilence", 186, Rarity.COMMON, mage.cards.p.Pestilence.class)); cards.add(new SetCardInfo("Phantasmal Forces", 106, Rarity.UNCOMMON, mage.cards.p.PhantasmalForces.class)); cards.add(new SetCardInfo("Phantasmal Terrain", 107, Rarity.COMMON, mage.cards.p.PhantasmalTerrain.class)); cards.add(new SetCardInfo("Phantom Monster", 108, Rarity.UNCOMMON, mage.cards.p.PhantomMonster.class)); - cards.add(new SetCardInfo("Pikemen", 328, Rarity.COMMON, mage.cards.p.Pikemen.class)); + cards.add(new SetCardInfo("Pikemen", 52, Rarity.COMMON, mage.cards.p.Pikemen.class)); cards.add(new SetCardInfo("Pirate Ship", 109, Rarity.RARE, mage.cards.p.PirateShip.class)); - cards.add(new SetCardInfo("Pit Scorpion", 49, Rarity.COMMON, mage.cards.p.PitScorpion.class)); - cards.add(new SetCardInfo("Plague Rats", 50, Rarity.COMMON, mage.cards.p.PlagueRats.class)); - cards.add(new SetCardInfo("Plains", 434, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Plains", 435, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Plains", 436, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Plains", 437, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Pit Scorpion", 187, Rarity.COMMON, mage.cards.p.PitScorpion.class)); + cards.add(new SetCardInfo("Plague Rats", 188, Rarity.COMMON, mage.cards.p.PlagueRats.class)); + cards.add(new SetCardInfo("Plains", 430, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Plains", 431, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Plains", 432, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Plains", 433, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Portent", 110, Rarity.COMMON, mage.cards.p.Portent.class)); cards.add(new SetCardInfo("Power Sink", 111, Rarity.UNCOMMON, mage.cards.p.PowerSink.class)); - cards.add(new SetCardInfo("Pox", 51, Rarity.RARE, mage.cards.p.Pox.class)); - cards.add(new SetCardInfo("Pradesh Gypsies", 179, Rarity.COMMON, mage.cards.p.PradeshGypsies.class)); + cards.add(new SetCardInfo("Pox", 189, Rarity.RARE, mage.cards.p.Pox.class)); + cards.add(new SetCardInfo("Pradesh Gypsies", 317, Rarity.COMMON, mage.cards.p.PradeshGypsies.class)); cards.add(new SetCardInfo("Primal Clay", 395, Rarity.RARE, mage.cards.p.PrimalClay.class)); - cards.add(new SetCardInfo("Primal Order", 180, Rarity.RARE, mage.cards.p.PrimalOrder.class)); + cards.add(new SetCardInfo("Primal Order", 318, Rarity.RARE, mage.cards.p.PrimalOrder.class)); cards.add(new SetCardInfo("Primordial Ooze", 261, Rarity.UNCOMMON, mage.cards.p.PrimordialOoze.class)); - cards.add(new SetCardInfo("Prismatic Ward", 329, Rarity.COMMON, mage.cards.p.PrismaticWard.class)); + cards.add(new SetCardInfo("Prismatic Ward", 53, Rarity.COMMON, mage.cards.p.PrismaticWard.class)); cards.add(new SetCardInfo("Prodigal Sorcerer", 112, Rarity.COMMON, mage.cards.p.ProdigalSorcerer.class)); cards.add(new SetCardInfo("Psychic Venom", 113, Rarity.COMMON, mage.cards.p.PsychicVenom.class)); cards.add(new SetCardInfo("Pyroblast", 262, Rarity.UNCOMMON, mage.cards.p.Pyroblast.class)); cards.add(new SetCardInfo("Pyrotechnics", 263, Rarity.UNCOMMON, mage.cards.p.Pyrotechnics.class)); - cards.add(new SetCardInfo("Rabid Wombat", 181, Rarity.UNCOMMON, mage.cards.r.RabidWombat.class)); - cards.add(new SetCardInfo("Radjan Spirit", 182, Rarity.UNCOMMON, mage.cards.r.RadjanSpirit.class)); - cards.add(new SetCardInfo("Rag Man", 52, Rarity.RARE, mage.cards.r.RagMan.class)); - cards.add(new SetCardInfo("Raise Dead", 53, Rarity.COMMON, mage.cards.r.RaiseDead.class)); + cards.add(new SetCardInfo("Rabid Wombat", 319, Rarity.UNCOMMON, mage.cards.r.RabidWombat.class)); + cards.add(new SetCardInfo("Radjan Spirit", 320, Rarity.UNCOMMON, mage.cards.r.RadjanSpirit.class)); + cards.add(new SetCardInfo("Rag Man", 190, Rarity.RARE, mage.cards.r.RagMan.class)); + cards.add(new SetCardInfo("Raise Dead", 191, Rarity.COMMON, mage.cards.r.RaiseDead.class)); cards.add(new SetCardInfo("Ray of Command", 114, Rarity.COMMON, mage.cards.r.RayOfCommand.class)); cards.add(new SetCardInfo("Recall", 115, Rarity.RARE, mage.cards.r.Recall.class)); cards.add(new SetCardInfo("Reef Pirates", 116, Rarity.COMMON, ReefPirates.class)); - cards.add(new SetCardInfo("Regeneration", 183, Rarity.COMMON, mage.cards.r.Regeneration.class)); + cards.add(new SetCardInfo("Regeneration", 321, Rarity.COMMON, mage.cards.r.Regeneration.class)); cards.add(new SetCardInfo("Remove Soul", 117, Rarity.COMMON, mage.cards.r.RemoveSoul.class)); - cards.add(new SetCardInfo("Repentant Blacksmith", 330, Rarity.COMMON, mage.cards.r.RepentantBlacksmith.class)); - cards.add(new SetCardInfo("Reverse Damage", 331, Rarity.RARE, mage.cards.r.ReverseDamage.class)); - cards.add(new SetCardInfo("Righteousness", 332, Rarity.RARE, mage.cards.r.Righteousness.class)); + cards.add(new SetCardInfo("Repentant Blacksmith", 54, Rarity.COMMON, mage.cards.r.RepentantBlacksmith.class)); + cards.add(new SetCardInfo("Reverse Damage", 55, Rarity.RARE, mage.cards.r.ReverseDamage.class)); + cards.add(new SetCardInfo("Righteousness", 56, Rarity.RARE, mage.cards.r.Righteousness.class)); cards.add(new SetCardInfo("Rod of Ruin", 396, Rarity.UNCOMMON, mage.cards.r.RodOfRuin.class)); - cards.add(new SetCardInfo("Ruins of Trokair", 438, Rarity.UNCOMMON, mage.cards.r.RuinsOfTrokair.class)); + cards.add(new SetCardInfo("Ruins of Trokair", 422, Rarity.UNCOMMON, mage.cards.r.RuinsOfTrokair.class)); cards.add(new SetCardInfo("Sabretooth Tiger", 264, Rarity.COMMON, mage.cards.s.SabretoothTiger.class)); - cards.add(new SetCardInfo("Samite Healer", 334, Rarity.COMMON, mage.cards.s.SamiteHealer.class)); - cards.add(new SetCardInfo("Sand Silos", 439, Rarity.RARE, mage.cards.s.SandSilos.class)); - cards.add(new SetCardInfo("Scaled Wurm", 184, Rarity.COMMON, mage.cards.s.ScaledWurm.class)); - cards.add(new SetCardInfo("Scathe Zombies", 54, Rarity.COMMON, mage.cards.s.ScatheZombies.class)); - cards.add(new SetCardInfo("Scavenger Folk", 185, Rarity.COMMON, mage.cards.s.ScavengerFolk.class)); - cards.add(new SetCardInfo("Scryb Sprites", 186, Rarity.COMMON, mage.cards.s.ScrybSprites.class)); + cards.add(new SetCardInfo("Samite Healer", 58, Rarity.COMMON, mage.cards.s.SamiteHealer.class)); + cards.add(new SetCardInfo("Sand Silos", 423, Rarity.RARE, mage.cards.s.SandSilos.class)); + cards.add(new SetCardInfo("Scaled Wurm", 322, Rarity.COMMON, mage.cards.s.ScaledWurm.class)); + cards.add(new SetCardInfo("Scathe Zombies", 192, Rarity.COMMON, mage.cards.s.ScatheZombies.class)); + cards.add(new SetCardInfo("Scavenger Folk", 323, Rarity.COMMON, mage.cards.s.ScavengerFolk.class)); + cards.add(new SetCardInfo("Scryb Sprites", 324, Rarity.COMMON, mage.cards.s.ScrybSprites.class)); cards.add(new SetCardInfo("Sea Serpent", 118, Rarity.COMMON, mage.cards.s.SeaSerpent.class)); - cards.add(new SetCardInfo("Seasinger", 121, Rarity.UNCOMMON, mage.cards.s.Seasinger.class)); cards.add(new SetCardInfo("Sea Spirit", 119, Rarity.UNCOMMON, mage.cards.s.SeaSpirit.class)); cards.add(new SetCardInfo("Sea Sprite", 120, Rarity.UNCOMMON, mage.cards.s.SeaSprite.class)); + cards.add(new SetCardInfo("Seasinger", 121, Rarity.UNCOMMON, mage.cards.s.Seasinger.class)); cards.add(new SetCardInfo("Segovian Leviathan", 122, Rarity.UNCOMMON, mage.cards.s.SegovianLeviathan.class)); - cards.add(new SetCardInfo("Sengir Autocrat", 55, Rarity.RARE, mage.cards.s.SengirAutocrat.class)); + cards.add(new SetCardInfo("Sengir Autocrat", 193, Rarity.RARE, mage.cards.s.SengirAutocrat.class)); cards.add(new SetCardInfo("Serpent Generator", 397, Rarity.RARE, mage.cards.s.SerpentGenerator.class)); - cards.add(new SetCardInfo("Serra Bestiary", 336, Rarity.UNCOMMON, mage.cards.s.SerraBestiary.class)); - cards.add(new SetCardInfo("Serra Paladin", 337, Rarity.UNCOMMON, mage.cards.s.SerraPaladin.class)); - cards.add(new SetCardInfo("Shanodin Dryads", 187, Rarity.COMMON, mage.cards.s.ShanodinDryads.class)); + cards.add(new SetCardInfo("Serra Bestiary", 60, Rarity.UNCOMMON, mage.cards.s.SerraBestiary.class)); + cards.add(new SetCardInfo("Serra Paladin", 61, Rarity.UNCOMMON, mage.cards.s.SerraPaladin.class)); + cards.add(new SetCardInfo("Shanodin Dryads", 325, Rarity.COMMON, mage.cards.s.ShanodinDryads.class)); cards.add(new SetCardInfo("Shapeshifter", 398, Rarity.UNCOMMON, mage.cards.s.Shapeshifter.class)); cards.add(new SetCardInfo("Shatter", 265, Rarity.COMMON, mage.cards.s.Shatter.class)); cards.add(new SetCardInfo("Shatterstorm", 266, Rarity.UNCOMMON, mage.cards.s.Shatterstorm.class)); - cards.add(new SetCardInfo("Shield Bearer", 338, Rarity.COMMON, mage.cards.s.ShieldBearer.class)); - cards.add(new SetCardInfo("Shield Wall", 339, Rarity.COMMON, mage.cards.s.ShieldWall.class)); + cards.add(new SetCardInfo("Shield Bearer", 62, Rarity.COMMON, mage.cards.s.ShieldBearer.class)); + cards.add(new SetCardInfo("Shield Wall", 63, Rarity.COMMON, mage.cards.s.ShieldWall.class)); cards.add(new SetCardInfo("Shivan Dragon", 267, Rarity.RARE, mage.cards.s.ShivanDragon.class)); - cards.add(new SetCardInfo("Shrink", 188, Rarity.COMMON, mage.cards.s.Shrink.class)); + cards.add(new SetCardInfo("Shrink", 326, Rarity.COMMON, mage.cards.s.Shrink.class)); cards.add(new SetCardInfo("Sibilant Spirit", 123, Rarity.RARE, mage.cards.s.SibilantSpirit.class)); cards.add(new SetCardInfo("Skull Catapult", 399, Rarity.UNCOMMON, mage.cards.s.SkullCatapult.class)); cards.add(new SetCardInfo("Smoke", 268, Rarity.RARE, mage.cards.s.Smoke.class)); - cards.add(new SetCardInfo("Sorceress Queen", 56, Rarity.RARE, mage.cards.s.SorceressQueen.class)); + cards.add(new SetCardInfo("Sorceress Queen", 194, Rarity.RARE, mage.cards.s.SorceressQueen.class)); cards.add(new SetCardInfo("Soul Barrier", 125, Rarity.COMMON, mage.cards.s.SoulBarrier.class)); cards.add(new SetCardInfo("Soul Net", 400, Rarity.UNCOMMON, mage.cards.s.SoulNet.class)); cards.add(new SetCardInfo("Spell Blast", 126, Rarity.COMMON, mage.cards.s.SpellBlast.class)); - cards.add(new SetCardInfo("Spirit Link", 340, Rarity.UNCOMMON, mage.cards.s.SpiritLink.class)); - cards.add(new SetCardInfo("Stampede", 189, Rarity.RARE, mage.cards.s.Stampede.class)); + cards.add(new SetCardInfo("Spirit Link", 64, Rarity.UNCOMMON, mage.cards.s.SpiritLink.class)); + cards.add(new SetCardInfo("Stampede", 327, Rarity.RARE, mage.cards.s.Stampede.class)); cards.add(new SetCardInfo("Stasis", 127, Rarity.RARE, mage.cards.s.Stasis.class)); cards.add(new SetCardInfo("Steal Artifact", 128, Rarity.UNCOMMON, mage.cards.s.StealArtifact.class)); cards.add(new SetCardInfo("Stone Giant", 269, Rarity.UNCOMMON, mage.cards.s.StoneGiant.class)); cards.add(new SetCardInfo("Stone Rain", 270, Rarity.COMMON, mage.cards.s.StoneRain.class)); cards.add(new SetCardInfo("Stone Spirit", 271, Rarity.UNCOMMON, mage.cards.s.StoneSpirit.class)); - cards.add(new SetCardInfo("Stream of Life", 190, Rarity.COMMON, mage.cards.s.StreamOfLife.class)); - cards.add(new SetCardInfo("Stromgald Cabal", 57, Rarity.RARE, mage.cards.s.StromgaldCabal.class)); - cards.add(new SetCardInfo("Sulfurous Springs", 440, Rarity.RARE, mage.cards.s.SulfurousSprings.class)); - cards.add(new SetCardInfo("Svyelunite Temple", 441, Rarity.UNCOMMON, mage.cards.s.SvyeluniteTemple.class)); - cards.add(new SetCardInfo("Swamp", 442, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Swamp", 443, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Swamp", 444, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Swamp", 445, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Sylvan Library", 191, Rarity.RARE, mage.cards.s.SylvanLibrary.class)); - cards.add(new SetCardInfo("Tarpan", 192, Rarity.COMMON, mage.cards.t.Tarpan.class)); + cards.add(new SetCardInfo("Stream of Life", 328, Rarity.COMMON, mage.cards.s.StreamOfLife.class)); + cards.add(new SetCardInfo("Stromgald Cabal", 195, Rarity.RARE, mage.cards.s.StromgaldCabal.class)); + cards.add(new SetCardInfo("Sulfurous Springs", 424, Rarity.RARE, mage.cards.s.SulfurousSprings.class)); + cards.add(new SetCardInfo("Svyelunite Temple", 425, Rarity.UNCOMMON, mage.cards.s.SvyeluniteTemple.class)); + cards.add(new SetCardInfo("Swamp", 438, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 439, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 440, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 441, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Sylvan Library", 329, Rarity.RARE, mage.cards.s.SylvanLibrary.class)); + cards.add(new SetCardInfo("Tarpan", 330, Rarity.COMMON, mage.cards.t.Tarpan.class)); cards.add(new SetCardInfo("Tawnos's Weaponry", 401, Rarity.UNCOMMON, mage.cards.t.TawnossWeaponry.class)); - cards.add(new SetCardInfo("Terror", 58, Rarity.COMMON, mage.cards.t.Terror.class)); + cards.add(new SetCardInfo("Terror", 196, Rarity.COMMON, mage.cards.t.Terror.class)); cards.add(new SetCardInfo("The Brute", 272, Rarity.COMMON, mage.cards.t.TheBrute.class)); cards.add(new SetCardInfo("The Hive", 402, Rarity.RARE, mage.cards.t.TheHive.class)); - cards.add(new SetCardInfo("The Wretched", 59, Rarity.RARE, mage.cards.t.TheWretched.class)); - cards.add(new SetCardInfo("Thicket Basilisk", 193, Rarity.UNCOMMON, mage.cards.t.ThicketBasilisk.class)); + cards.add(new SetCardInfo("The Wretched", 197, Rarity.RARE, mage.cards.t.TheWretched.class)); + cards.add(new SetCardInfo("Thicket Basilisk", 331, Rarity.UNCOMMON, mage.cards.t.ThicketBasilisk.class)); cards.add(new SetCardInfo("Throne of Bone", 403, Rarity.UNCOMMON, mage.cards.t.ThroneOfBone.class)); - cards.add(new SetCardInfo("Thrull Retainer", 60, Rarity.UNCOMMON, mage.cards.t.ThrullRetainer.class)); + cards.add(new SetCardInfo("Thrull Retainer", 198, Rarity.UNCOMMON, mage.cards.t.ThrullRetainer.class)); cards.add(new SetCardInfo("Time Bomb", 404, Rarity.RARE, mage.cards.t.TimeBomb.class)); cards.add(new SetCardInfo("Time Elemental", 129, Rarity.RARE, mage.cards.t.TimeElemental.class)); - cards.add(new SetCardInfo("Titania's Song", 194, Rarity.RARE, mage.cards.t.TitaniasSong.class)); - cards.add(new SetCardInfo("Torture", 61, Rarity.COMMON, Torture.class)); - cards.add(new SetCardInfo("Touch of Death", 62, Rarity.COMMON, mage.cards.t.TouchOfDeath.class)); - cards.add(new SetCardInfo("Tranquility", 195, Rarity.COMMON, mage.cards.t.Tranquility.class)); - cards.add(new SetCardInfo("Truce", 341, Rarity.RARE, mage.cards.t.Truce.class)); - cards.add(new SetCardInfo("Tsunami", 196, Rarity.UNCOMMON, mage.cards.t.Tsunami.class)); - cards.add(new SetCardInfo("Tundra Wolves", 342, Rarity.COMMON, mage.cards.t.TundraWolves.class)); + cards.add(new SetCardInfo("Titania's Song", 332, Rarity.RARE, mage.cards.t.TitaniasSong.class)); + cards.add(new SetCardInfo("Torture", 199, Rarity.COMMON, Torture.class)); + cards.add(new SetCardInfo("Touch of Death", 200, Rarity.COMMON, mage.cards.t.TouchOfDeath.class)); + cards.add(new SetCardInfo("Tranquility", 333, Rarity.COMMON, mage.cards.t.Tranquility.class)); + cards.add(new SetCardInfo("Truce", 65, Rarity.RARE, mage.cards.t.Truce.class)); + cards.add(new SetCardInfo("Tsunami", 334, Rarity.UNCOMMON, mage.cards.t.Tsunami.class)); + cards.add(new SetCardInfo("Tundra Wolves", 66, Rarity.COMMON, mage.cards.t.TundraWolves.class)); cards.add(new SetCardInfo("Twiddle", 130, Rarity.COMMON, mage.cards.t.Twiddle.class)); - cards.add(new SetCardInfo("Underground River", 446, Rarity.RARE, mage.cards.u.UndergroundRiver.class)); - cards.add(new SetCardInfo("Unholy Strength", 63, Rarity.COMMON, mage.cards.u.UnholyStrength.class)); + cards.add(new SetCardInfo("Underground River", 426, Rarity.RARE, mage.cards.u.UndergroundRiver.class)); + cards.add(new SetCardInfo("Unholy Strength", 201, Rarity.COMMON, mage.cards.u.UnholyStrength.class)); cards.add(new SetCardInfo("Unstable Mutation", 131, Rarity.COMMON, mage.cards.u.UnstableMutation.class)); cards.add(new SetCardInfo("Unsummon", 132, Rarity.COMMON, mage.cards.u.Unsummon.class)); - cards.add(new SetCardInfo("Untamed Wilds", 197, Rarity.UNCOMMON, mage.cards.u.UntamedWilds.class)); + cards.add(new SetCardInfo("Untamed Wilds", 335, Rarity.UNCOMMON, mage.cards.u.UntamedWilds.class)); cards.add(new SetCardInfo("Updraft", 133, Rarity.COMMON, mage.cards.u.Updraft.class)); cards.add(new SetCardInfo("Urza's Avenger", 405, Rarity.RARE, mage.cards.u.UrzasAvenger.class)); cards.add(new SetCardInfo("Urza's Bauble", 406, Rarity.UNCOMMON, mage.cards.u.UrzasBauble.class)); - cards.add(new SetCardInfo("Urza's Mine", 447, Rarity.COMMON, mage.cards.u.UrzasMine.class)); - cards.add(new SetCardInfo("Urza's Power Plant", 448, Rarity.COMMON, mage.cards.u.UrzasPowerPlant.class)); - cards.add(new SetCardInfo("Urza's Tower", 449, Rarity.COMMON, mage.cards.u.UrzasTower.class)); - cards.add(new SetCardInfo("Vampire Bats", 64, Rarity.COMMON, mage.cards.v.VampireBats.class)); - cards.add(new SetCardInfo("Venom", 198, Rarity.COMMON, mage.cards.v.Venom.class)); - cards.add(new SetCardInfo("Verduran Enchantress", 199, Rarity.RARE, mage.cards.v.VerduranEnchantress.class)); + cards.add(new SetCardInfo("Urza's Mine", 427, Rarity.COMMON, mage.cards.u.UrzasMine.class)); + cards.add(new SetCardInfo("Urza's Power Plant", 428, Rarity.COMMON, mage.cards.u.UrzasPowerPlant.class)); + cards.add(new SetCardInfo("Urza's Tower", 429, Rarity.COMMON, mage.cards.u.UrzasTower.class)); + cards.add(new SetCardInfo("Vampire Bats", 202, Rarity.COMMON, mage.cards.v.VampireBats.class)); + cards.add(new SetCardInfo("Venom", 336, Rarity.COMMON, mage.cards.v.Venom.class)); + cards.add(new SetCardInfo("Verduran Enchantress", 337, Rarity.RARE, mage.cards.v.VerduranEnchantress.class)); cards.add(new SetCardInfo("Vodalian Soldiers", 134, Rarity.COMMON, VodalianSoldiers.class)); cards.add(new SetCardInfo("Wall of Air", 135, Rarity.UNCOMMON, mage.cards.w.WallOfAir.class)); - cards.add(new SetCardInfo("Wall of Bone", 65, Rarity.UNCOMMON, mage.cards.w.WallOfBone.class)); - cards.add(new SetCardInfo("Wall of Brambles", 200, Rarity.UNCOMMON, mage.cards.w.WallOfBrambles.class)); + cards.add(new SetCardInfo("Wall of Bone", 203, Rarity.UNCOMMON, mage.cards.w.WallOfBone.class)); + cards.add(new SetCardInfo("Wall of Brambles", 338, Rarity.UNCOMMON, mage.cards.w.WallOfBrambles.class)); cards.add(new SetCardInfo("Wall of Fire", 273, Rarity.UNCOMMON, mage.cards.w.WallOfFire.class)); cards.add(new SetCardInfo("Wall of Spears", 407, Rarity.COMMON, mage.cards.w.WallOfSpears.class)); cards.add(new SetCardInfo("Wall of Stone", 274, Rarity.UNCOMMON, mage.cards.w.WallOfStone.class)); - cards.add(new SetCardInfo("Wall of Swords", 343, Rarity.UNCOMMON, mage.cards.w.WallOfSwords.class)); - cards.add(new SetCardInfo("Wanderlust", 201, Rarity.UNCOMMON, mage.cards.w.Wanderlust.class)); - cards.add(new SetCardInfo("War Mammoth", 202, Rarity.COMMON, mage.cards.w.WarMammoth.class)); - cards.add(new SetCardInfo("Warp Artifact", 66, Rarity.RARE, mage.cards.w.WarpArtifact.class)); - cards.add(new SetCardInfo("Weakness", 67, Rarity.COMMON, mage.cards.w.Weakness.class)); - cards.add(new SetCardInfo("Whirling Dervish", 203, Rarity.UNCOMMON, mage.cards.w.WhirlingDervish.class)); - cards.add(new SetCardInfo("White Knight", 344, Rarity.UNCOMMON, mage.cards.w.WhiteKnight.class)); - cards.add(new SetCardInfo("Wild Growth", 204, Rarity.COMMON, mage.cards.w.WildGrowth.class)); - cards.add(new SetCardInfo("Winds of Change", 275, Rarity.RARE, mage.cards.w.WindsOfChange.class)); + cards.add(new SetCardInfo("Wall of Swords", 67, Rarity.UNCOMMON, mage.cards.w.WallOfSwords.class)); + cards.add(new SetCardInfo("Wanderlust", 339, Rarity.UNCOMMON, mage.cards.w.Wanderlust.class)); + cards.add(new SetCardInfo("War Mammoth", 340, Rarity.COMMON, mage.cards.w.WarMammoth.class)); + cards.add(new SetCardInfo("Warp Artifact", 204, Rarity.RARE, mage.cards.w.WarpArtifact.class)); + cards.add(new SetCardInfo("Weakness", 205, Rarity.COMMON, mage.cards.w.Weakness.class)); + cards.add(new SetCardInfo("Whirling Dervish", 341, Rarity.UNCOMMON, mage.cards.w.WhirlingDervish.class)); + cards.add(new SetCardInfo("White Knight", 68, Rarity.UNCOMMON, mage.cards.w.WhiteKnight.class)); + cards.add(new SetCardInfo("Wild Growth", 342, Rarity.COMMON, mage.cards.w.WildGrowth.class)); cards.add(new SetCardInfo("Wind Spirit", 136, Rarity.UNCOMMON, mage.cards.w.WindSpirit.class)); - cards.add(new SetCardInfo("Winter Blast", 205, Rarity.UNCOMMON, mage.cards.w.WinterBlast.class)); + cards.add(new SetCardInfo("Winds of Change", 275, Rarity.RARE, mage.cards.w.WindsOfChange.class)); + cards.add(new SetCardInfo("Winter Blast", 343, Rarity.UNCOMMON, mage.cards.w.WinterBlast.class)); cards.add(new SetCardInfo("Winter Orb", 408, Rarity.RARE, mage.cards.w.WinterOrb.class)); - cards.add(new SetCardInfo("Wolverine Pack", 206, Rarity.UNCOMMON, mage.cards.w.WolverinePack.class)); + cards.add(new SetCardInfo("Wolverine Pack", 344, Rarity.UNCOMMON, mage.cards.w.WolverinePack.class)); cards.add(new SetCardInfo("Wooden Sphere", 409, Rarity.UNCOMMON, mage.cards.w.WoodenSphere.class)); cards.add(new SetCardInfo("Word of Blasting", 276, Rarity.UNCOMMON, mage.cards.w.WordOfBlasting.class)); - cards.add(new SetCardInfo("Wrath of God", 345, Rarity.RARE, mage.cards.w.WrathOfGod.class)); - cards.add(new SetCardInfo("Wyluli Wolf", 207, Rarity.RARE, mage.cards.w.WyluliWolf.class)); - cards.add(new SetCardInfo("Xenic Poltergeist", 68, Rarity.RARE, mage.cards.x.XenicPoltergeist.class)); + cards.add(new SetCardInfo("Wrath of God", 69, Rarity.RARE, mage.cards.w.WrathOfGod.class)); + cards.add(new SetCardInfo("Wyluli Wolf", 345, Rarity.RARE, mage.cards.w.WyluliWolf.class)); + cards.add(new SetCardInfo("Xenic Poltergeist", 206, Rarity.RARE, mage.cards.x.XenicPoltergeist.class)); cards.add(new SetCardInfo("Zephyr Falcon", 137, Rarity.COMMON, mage.cards.z.ZephyrFalcon.class)); - cards.add(new SetCardInfo("Zombie Master", 69, Rarity.RARE, mage.cards.z.ZombieMaster.class)); + cards.add(new SetCardInfo("Zombie Master", 207, Rarity.RARE, mage.cards.z.ZombieMaster.class)); cards.add(new SetCardInfo("Zur's Weirding", 138, Rarity.RARE, mage.cards.z.ZursWeirding.class)); } - } From 47d7662e50421f04c0e29e34c7c17d0bb2b6c26b Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Wed, 9 May 2018 03:03:44 +0400 Subject: [PATCH 095/158] Fixed card numbers in LEA - Limited Edition Alpha (#4628) --- .../src/mage/sets/LimitedEditionAlpha.java | 474 +++++++++--------- 1 file changed, 237 insertions(+), 237 deletions(-) diff --git a/Mage.Sets/src/mage/sets/LimitedEditionAlpha.java b/Mage.Sets/src/mage/sets/LimitedEditionAlpha.java index 2b9c646a0e8..007bd43a99d 100644 --- a/Mage.Sets/src/mage/sets/LimitedEditionAlpha.java +++ b/Mage.Sets/src/mage/sets/LimitedEditionAlpha.java @@ -24,292 +24,292 @@ public class LimitedEditionAlpha extends ExpansionSet { this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; - cards.add(new SetCardInfo("Air Elemental", 47, Rarity.UNCOMMON, mage.cards.a.AirElemental.class)); - cards.add(new SetCardInfo("Ancestral Recall", 48, Rarity.RARE, mage.cards.a.AncestralRecall.class)); - cards.add(new SetCardInfo("Animate Artifact", 49, Rarity.UNCOMMON, mage.cards.a.AnimateArtifact.class)); - cards.add(new SetCardInfo("Animate Dead", 1, Rarity.UNCOMMON, mage.cards.a.AnimateDead.class)); - cards.add(new SetCardInfo("Animate Wall", 185, Rarity.RARE, mage.cards.a.AnimateWall.class)); + cards.add(new SetCardInfo("Air Elemental", 46, Rarity.UNCOMMON, mage.cards.a.AirElemental.class)); + cards.add(new SetCardInfo("Ancestral Recall", 47, Rarity.RARE, mage.cards.a.AncestralRecall.class)); + cards.add(new SetCardInfo("Animate Artifact", 48, Rarity.UNCOMMON, mage.cards.a.AnimateArtifact.class)); + cards.add(new SetCardInfo("Animate Dead", 92, Rarity.UNCOMMON, mage.cards.a.AnimateDead.class)); + cards.add(new SetCardInfo("Animate Wall", 1, Rarity.RARE, mage.cards.a.AnimateWall.class)); cards.add(new SetCardInfo("Ankh of Mishra", 230, Rarity.RARE, mage.cards.a.AnkhOfMishra.class)); - cards.add(new SetCardInfo("Armageddon", 186, Rarity.RARE, mage.cards.a.Armageddon.class)); - cards.add(new SetCardInfo("Aspect of Wolf", 93, Rarity.RARE, mage.cards.a.AspectOfWolf.class)); + cards.add(new SetCardInfo("Armageddon", 2, Rarity.RARE, mage.cards.a.Armageddon.class)); + cards.add(new SetCardInfo("Aspect of Wolf", 184, Rarity.RARE, mage.cards.a.AspectOfWolf.class)); + cards.add(new SetCardInfo("Bad Moon", 93, Rarity.RARE, mage.cards.b.BadMoon.class)); cards.add(new SetCardInfo("Badlands", 277, Rarity.RARE, mage.cards.b.Badlands.class)); - cards.add(new SetCardInfo("Bad Moon", 2, Rarity.RARE, mage.cards.b.BadMoon.class)); - cards.add(new SetCardInfo("Balance", 187, Rarity.RARE, mage.cards.b.Balance.class)); + cards.add(new SetCardInfo("Balance", 3, Rarity.RARE, mage.cards.b.Balance.class)); cards.add(new SetCardInfo("Basalt Monolith", 231, Rarity.UNCOMMON, mage.cards.b.BasaltMonolith.class)); cards.add(new SetCardInfo("Bayou", 278, Rarity.RARE, mage.cards.b.Bayou.class)); - cards.add(new SetCardInfo("Benalish Hero", 188, Rarity.COMMON, mage.cards.b.BenalishHero.class)); - cards.add(new SetCardInfo("Berserk", 94, Rarity.UNCOMMON, mage.cards.b.Berserk.class)); - cards.add(new SetCardInfo("Birds of Paradise", 95, Rarity.RARE, mage.cards.b.BirdsOfParadise.class)); - cards.add(new SetCardInfo("Black Knight", 3, Rarity.UNCOMMON, mage.cards.b.BlackKnight.class)); + cards.add(new SetCardInfo("Benalish Hero", 4, Rarity.COMMON, mage.cards.b.BenalishHero.class)); + cards.add(new SetCardInfo("Berserk", 185, Rarity.UNCOMMON, mage.cards.b.Berserk.class)); + cards.add(new SetCardInfo("Birds of Paradise", 186, Rarity.RARE, mage.cards.b.BirdsOfParadise.class)); + cards.add(new SetCardInfo("Black Knight", 94, Rarity.UNCOMMON, mage.cards.b.BlackKnight.class)); cards.add(new SetCardInfo("Black Lotus", 232, Rarity.RARE, mage.cards.b.BlackLotus.class)); cards.add(new SetCardInfo("Black Vise", 233, Rarity.UNCOMMON, mage.cards.b.BlackVise.class)); - cards.add(new SetCardInfo("Black Ward", 189, Rarity.UNCOMMON, mage.cards.b.BlackWard.class)); - cards.add(new SetCardInfo("Blaze of Glory", 190, Rarity.RARE, mage.cards.b.BlazeOfGlory.class)); - cards.add(new SetCardInfo("Blessing", 191, Rarity.RARE, mage.cards.b.Blessing.class)); - cards.add(new SetCardInfo("Blue Elemental Blast", 50, Rarity.COMMON, mage.cards.b.BlueElementalBlast.class)); - cards.add(new SetCardInfo("Blue Ward", 192, Rarity.UNCOMMON, mage.cards.b.BlueWard.class)); - cards.add(new SetCardInfo("Bog Wraith", 4, Rarity.UNCOMMON, mage.cards.b.BogWraith.class)); - cards.add(new SetCardInfo("Braingeyser", 51, Rarity.RARE, mage.cards.b.Braingeyser.class)); - cards.add(new SetCardInfo("Burrowing", 139, Rarity.UNCOMMON, mage.cards.b.Burrowing.class)); - cards.add(new SetCardInfo("Camouflage", 96, Rarity.UNCOMMON, mage.cards.c.Camouflage.class)); - cards.add(new SetCardInfo("Castle", 193, Rarity.UNCOMMON, mage.cards.c.Castle.class)); + cards.add(new SetCardInfo("Black Ward", 5, Rarity.UNCOMMON, mage.cards.b.BlackWard.class)); + cards.add(new SetCardInfo("Blaze of Glory", 6, Rarity.RARE, mage.cards.b.BlazeOfGlory.class)); + cards.add(new SetCardInfo("Blessing", 7, Rarity.RARE, mage.cards.b.Blessing.class)); + cards.add(new SetCardInfo("Blue Elemental Blast", 49, Rarity.COMMON, mage.cards.b.BlueElementalBlast.class)); + cards.add(new SetCardInfo("Blue Ward", 8, Rarity.UNCOMMON, mage.cards.b.BlueWard.class)); + cards.add(new SetCardInfo("Bog Wraith", 95, Rarity.UNCOMMON, mage.cards.b.BogWraith.class)); + cards.add(new SetCardInfo("Braingeyser", 50, Rarity.RARE, mage.cards.b.Braingeyser.class)); + cards.add(new SetCardInfo("Burrowing", 138, Rarity.UNCOMMON, mage.cards.b.Burrowing.class)); + cards.add(new SetCardInfo("Camouflage", 187, Rarity.UNCOMMON, mage.cards.c.Camouflage.class)); + cards.add(new SetCardInfo("Castle", 9, Rarity.UNCOMMON, mage.cards.c.Castle.class)); cards.add(new SetCardInfo("Celestial Prism", 234, Rarity.UNCOMMON, mage.cards.c.CelestialPrism.class)); - cards.add(new SetCardInfo("Channel", 97, Rarity.UNCOMMON, mage.cards.c.Channel.class)); - cards.add(new SetCardInfo("Chaoslace", 140, Rarity.RARE, mage.cards.c.Chaoslace.class)); - cards.add(new SetCardInfo("Circle of Protection: Blue", 194, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlue.class)); - cards.add(new SetCardInfo("Circle of Protection: Green", 195, Rarity.COMMON, mage.cards.c.CircleOfProtectionGreen.class)); - cards.add(new SetCardInfo("Circle of Protection: Red", 196, Rarity.COMMON, mage.cards.c.CircleOfProtectionRed.class)); - cards.add(new SetCardInfo("Circle of Protection: White", 197, Rarity.COMMON, mage.cards.c.CircleOfProtectionWhite.class)); + cards.add(new SetCardInfo("Channel", 188, Rarity.UNCOMMON, mage.cards.c.Channel.class)); + cards.add(new SetCardInfo("Chaoslace", 139, Rarity.RARE, mage.cards.c.Chaoslace.class)); + cards.add(new SetCardInfo("Circle of Protection: Blue", 10, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlue.class)); + cards.add(new SetCardInfo("Circle of Protection: Green", 11, Rarity.COMMON, mage.cards.c.CircleOfProtectionGreen.class)); + cards.add(new SetCardInfo("Circle of Protection: Red", 12, Rarity.COMMON, mage.cards.c.CircleOfProtectionRed.class)); + cards.add(new SetCardInfo("Circle of Protection: White", 13, Rarity.COMMON, mage.cards.c.CircleOfProtectionWhite.class)); cards.add(new SetCardInfo("Clockwork Beast", 236, Rarity.RARE, mage.cards.c.ClockworkBeast.class)); - cards.add(new SetCardInfo("Clone", 52, Rarity.UNCOMMON, mage.cards.c.Clone.class)); - cards.add(new SetCardInfo("Cockatrice", 98, Rarity.RARE, mage.cards.c.Cockatrice.class)); - cards.add(new SetCardInfo("Consecrate Land", 198, Rarity.UNCOMMON, mage.cards.c.ConsecrateLand.class)); + cards.add(new SetCardInfo("Clone", 51, Rarity.UNCOMMON, mage.cards.c.Clone.class)); + cards.add(new SetCardInfo("Cockatrice", 189, Rarity.RARE, mage.cards.c.Cockatrice.class)); + cards.add(new SetCardInfo("Consecrate Land", 14, Rarity.UNCOMMON, mage.cards.c.ConsecrateLand.class)); cards.add(new SetCardInfo("Conservator", 237, Rarity.UNCOMMON, mage.cards.c.Conservator.class)); - cards.add(new SetCardInfo("Control Magic", 53, Rarity.UNCOMMON, mage.cards.c.ControlMagic.class)); - cards.add(new SetCardInfo("Conversion", 199, Rarity.UNCOMMON, mage.cards.c.Conversion.class)); + cards.add(new SetCardInfo("Control Magic", 52, Rarity.UNCOMMON, mage.cards.c.ControlMagic.class)); + cards.add(new SetCardInfo("Conversion", 15, Rarity.UNCOMMON, mage.cards.c.Conversion.class)); cards.add(new SetCardInfo("Copper Tablet", 238, Rarity.UNCOMMON, mage.cards.c.CopperTablet.class)); - cards.add(new SetCardInfo("Copy Artifact", 54, Rarity.RARE, mage.cards.c.CopyArtifact.class)); - cards.add(new SetCardInfo("Counterspell", 55, Rarity.UNCOMMON, mage.cards.c.Counterspell.class)); - cards.add(new SetCardInfo("Craw Wurm", 99, Rarity.COMMON, mage.cards.c.CrawWurm.class)); - cards.add(new SetCardInfo("Creature Bond", 56, Rarity.COMMON, mage.cards.c.CreatureBond.class)); - cards.add(new SetCardInfo("Crusade", 200, Rarity.RARE, mage.cards.c.Crusade.class)); + cards.add(new SetCardInfo("Copy Artifact", 53, Rarity.RARE, mage.cards.c.CopyArtifact.class)); + cards.add(new SetCardInfo("Counterspell", 54, Rarity.UNCOMMON, mage.cards.c.Counterspell.class)); + cards.add(new SetCardInfo("Craw Wurm", 190, Rarity.COMMON, mage.cards.c.CrawWurm.class)); + cards.add(new SetCardInfo("Creature Bond", 55, Rarity.COMMON, mage.cards.c.CreatureBond.class)); + cards.add(new SetCardInfo("Crusade", 16, Rarity.RARE, mage.cards.c.Crusade.class)); cards.add(new SetCardInfo("Crystal Rod", 239, Rarity.UNCOMMON, mage.cards.c.CrystalRod.class)); - cards.add(new SetCardInfo("Cursed Land", 6, Rarity.UNCOMMON, mage.cards.c.CursedLand.class)); + cards.add(new SetCardInfo("Cursed Land", 97, Rarity.UNCOMMON, mage.cards.c.CursedLand.class)); cards.add(new SetCardInfo("Cyclopean Tomb", 240, Rarity.RARE, mage.cards.c.CyclopeanTomb.class)); - cards.add(new SetCardInfo("Dark Ritual", 7, Rarity.COMMON, mage.cards.d.DarkRitual.class)); - cards.add(new SetCardInfo("Deathgrip", 9, Rarity.UNCOMMON, mage.cards.d.Deathgrip.class)); - cards.add(new SetCardInfo("Deathlace", 10, Rarity.RARE, mage.cards.d.Deathlace.class)); - cards.add(new SetCardInfo("Death Ward", 201, Rarity.COMMON, mage.cards.d.DeathWard.class)); - cards.add(new SetCardInfo("Demonic Hordes", 12, Rarity.RARE, mage.cards.d.DemonicHordes.class)); - cards.add(new SetCardInfo("Demonic Tutor", 13, Rarity.UNCOMMON, mage.cards.d.DemonicTutor.class)); + cards.add(new SetCardInfo("Dark Ritual", 98, Rarity.COMMON, mage.cards.d.DarkRitual.class)); + cards.add(new SetCardInfo("Death Ward", 17, Rarity.COMMON, mage.cards.d.DeathWard.class)); + cards.add(new SetCardInfo("Deathgrip", 100, Rarity.UNCOMMON, mage.cards.d.Deathgrip.class)); + cards.add(new SetCardInfo("Deathlace", 101, Rarity.RARE, mage.cards.d.Deathlace.class)); + cards.add(new SetCardInfo("Demonic Hordes", 103, Rarity.RARE, mage.cards.d.DemonicHordes.class)); + cards.add(new SetCardInfo("Demonic Tutor", 104, Rarity.UNCOMMON, mage.cards.d.DemonicTutor.class)); cards.add(new SetCardInfo("Dingus Egg", 241, Rarity.RARE, mage.cards.d.DingusEgg.class)); - cards.add(new SetCardInfo("Disenchant", 202, Rarity.COMMON, mage.cards.d.Disenchant.class)); - cards.add(new SetCardInfo("Disintegrate", 141, Rarity.COMMON, mage.cards.d.Disintegrate.class)); + cards.add(new SetCardInfo("Disenchant", 18, Rarity.COMMON, mage.cards.d.Disenchant.class)); + cards.add(new SetCardInfo("Disintegrate", 140, Rarity.COMMON, mage.cards.d.Disintegrate.class)); 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)); - cards.add(new SetCardInfo("Earthbind", 146, Rarity.COMMON, mage.cards.e.Earthbind.class)); - cards.add(new SetCardInfo("Earth Elemental", 145, Rarity.UNCOMMON, mage.cards.e.EarthElemental.class)); - cards.add(new SetCardInfo("Earthquake", 147, Rarity.RARE, mage.cards.e.Earthquake.class)); - cards.add(new SetCardInfo("Elvish Archers", 100, Rarity.RARE, mage.cards.e.ElvishArchers.class)); - cards.add(new SetCardInfo("Evil Presence", 16, Rarity.UNCOMMON, mage.cards.e.EvilPresence.class)); - cards.add(new SetCardInfo("False Orders", 148, Rarity.COMMON, mage.cards.f.FalseOrders.class)); - cards.add(new SetCardInfo("Farmstead", 203, Rarity.RARE, mage.cards.f.Farmstead.class)); - cards.add(new SetCardInfo("Fastbond", 101, Rarity.RARE, mage.cards.f.Fastbond.class)); - cards.add(new SetCardInfo("Fear", 17, Rarity.COMMON, mage.cards.f.Fear.class)); - cards.add(new SetCardInfo("Feedback", 58, Rarity.UNCOMMON, mage.cards.f.Feedback.class)); - cards.add(new SetCardInfo("Fireball", 150, Rarity.COMMON, mage.cards.f.Fireball.class)); - cards.add(new SetCardInfo("Firebreathing", 151, Rarity.COMMON, mage.cards.f.Firebreathing.class)); - cards.add(new SetCardInfo("Fire Elemental", 149, Rarity.UNCOMMON, mage.cards.f.FireElemental.class)); - cards.add(new SetCardInfo("Flashfires", 152, Rarity.UNCOMMON, mage.cards.f.Flashfires.class)); - cards.add(new SetCardInfo("Flight", 59, Rarity.COMMON, mage.cards.f.Flight.class)); - cards.add(new SetCardInfo("Fog", 102, Rarity.COMMON, mage.cards.f.Fog.class)); + cards.add(new SetCardInfo("Dragon Whelp", 141, Rarity.UNCOMMON, mage.cards.d.DragonWhelp.class)); + cards.add(new SetCardInfo("Drain Life", 105, 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", 106, Rarity.COMMON, mage.cards.d.DrudgeSkeletons.class)); + cards.add(new SetCardInfo("Dwarven Demolition Team", 142, Rarity.UNCOMMON, mage.cards.d.DwarvenDemolitionTeam.class)); + cards.add(new SetCardInfo("Dwarven Warriors", 143, Rarity.COMMON, mage.cards.d.DwarvenWarriors.class)); + cards.add(new SetCardInfo("Earth Elemental", 144, Rarity.UNCOMMON, mage.cards.e.EarthElemental.class)); + cards.add(new SetCardInfo("Earthbind", 145, Rarity.COMMON, mage.cards.e.Earthbind.class)); + cards.add(new SetCardInfo("Earthquake", 146, Rarity.RARE, mage.cards.e.Earthquake.class)); + cards.add(new SetCardInfo("Elvish Archers", 191, Rarity.RARE, mage.cards.e.ElvishArchers.class)); + cards.add(new SetCardInfo("Evil Presence", 107, Rarity.UNCOMMON, mage.cards.e.EvilPresence.class)); + cards.add(new SetCardInfo("False Orders", 147, Rarity.COMMON, mage.cards.f.FalseOrders.class)); + cards.add(new SetCardInfo("Farmstead", 19, Rarity.RARE, mage.cards.f.Farmstead.class)); + cards.add(new SetCardInfo("Fastbond", 192, Rarity.RARE, mage.cards.f.Fastbond.class)); + cards.add(new SetCardInfo("Fear", 108, Rarity.COMMON, mage.cards.f.Fear.class)); + cards.add(new SetCardInfo("Feedback", 57, Rarity.UNCOMMON, mage.cards.f.Feedback.class)); + cards.add(new SetCardInfo("Fire Elemental", 148, Rarity.UNCOMMON, mage.cards.f.FireElemental.class)); + cards.add(new SetCardInfo("Fireball", 149, Rarity.COMMON, mage.cards.f.Fireball.class)); + cards.add(new SetCardInfo("Firebreathing", 150, Rarity.COMMON, mage.cards.f.Firebreathing.class)); + cards.add(new SetCardInfo("Flashfires", 151, Rarity.UNCOMMON, mage.cards.f.Flashfires.class)); + cards.add(new SetCardInfo("Flight", 58, Rarity.COMMON, mage.cards.f.Flight.class)); + cards.add(new SetCardInfo("Fog", 193, Rarity.COMMON, mage.cards.f.Fog.class)); + cards.add(new SetCardInfo("Force of Nature", 194, Rarity.RARE, mage.cards.f.ForceOfNature.class)); cards.add(new SetCardInfo("Forcefield", 243, Rarity.RARE, mage.cards.f.Forcefield.class)); - cards.add(new SetCardInfo("Force of Nature", 103, Rarity.RARE, mage.cards.f.ForceOfNature.class)); - cards.add(new SetCardInfo("Forest", 279, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Forest", 280, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Fork", 153, Rarity.RARE, mage.cards.f.Fork.class)); - cards.add(new SetCardInfo("Frozen Shade", 18, Rarity.COMMON, mage.cards.f.FrozenShade.class)); - cards.add(new SetCardInfo("Fungusaur", 104, Rarity.RARE, mage.cards.f.Fungusaur.class)); - cards.add(new SetCardInfo("Gaea's Liege", 105, Rarity.RARE, mage.cards.g.GaeasLiege.class)); + cards.add(new SetCardInfo("Forest", 294, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 295, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Fork", 152, Rarity.RARE, mage.cards.f.Fork.class)); + cards.add(new SetCardInfo("Frozen Shade", 109, Rarity.COMMON, mage.cards.f.FrozenShade.class)); + cards.add(new SetCardInfo("Fungusaur", 195, Rarity.RARE, mage.cards.f.Fungusaur.class)); + cards.add(new SetCardInfo("Gaea's Liege", 196, Rarity.RARE, mage.cards.g.GaeasLiege.class)); cards.add(new SetCardInfo("Gauntlet of Might", 244, Rarity.RARE, mage.cards.g.GauntletOfMight.class)); - cards.add(new SetCardInfo("Giant Growth", 106, Rarity.COMMON, mage.cards.g.GiantGrowth.class)); - cards.add(new SetCardInfo("Giant Spider", 107, Rarity.COMMON, mage.cards.g.GiantSpider.class)); + cards.add(new SetCardInfo("Giant Growth", 197, Rarity.COMMON, mage.cards.g.GiantGrowth.class)); + cards.add(new SetCardInfo("Giant Spider", 198, Rarity.COMMON, mage.cards.g.GiantSpider.class)); cards.add(new SetCardInfo("Glasses of Urza", 245, Rarity.UNCOMMON, mage.cards.g.GlassesOfUrza.class)); - cards.add(new SetCardInfo("Gloom", 19, Rarity.UNCOMMON, mage.cards.g.Gloom.class)); - cards.add(new SetCardInfo("Goblin Balloon Brigade", 154, Rarity.UNCOMMON, mage.cards.g.GoblinBalloonBrigade.class)); - cards.add(new SetCardInfo("Goblin King", 155, Rarity.RARE, mage.cards.g.GoblinKing.class)); - cards.add(new SetCardInfo("Granite Gargoyle", 156, Rarity.RARE, mage.cards.g.GraniteGargoyle.class)); - cards.add(new SetCardInfo("Gray Ogre", 157, Rarity.COMMON, mage.cards.g.GrayOgre.class)); - cards.add(new SetCardInfo("Green Ward", 204, Rarity.UNCOMMON, mage.cards.g.GreenWard.class)); - cards.add(new SetCardInfo("Grizzly Bears", 108, Rarity.COMMON, mage.cards.g.GrizzlyBears.class)); - cards.add(new SetCardInfo("Guardian Angel", 205, Rarity.COMMON, mage.cards.g.GuardianAngel.class)); - cards.add(new SetCardInfo("Healing Salve", 206, Rarity.COMMON, mage.cards.h.HealingSalve.class)); + cards.add(new SetCardInfo("Gloom", 110, Rarity.UNCOMMON, mage.cards.g.Gloom.class)); + cards.add(new SetCardInfo("Goblin Balloon Brigade", 153, Rarity.UNCOMMON, mage.cards.g.GoblinBalloonBrigade.class)); + cards.add(new SetCardInfo("Goblin King", 154, Rarity.RARE, mage.cards.g.GoblinKing.class)); + cards.add(new SetCardInfo("Granite Gargoyle", 155, Rarity.RARE, mage.cards.g.GraniteGargoyle.class)); + cards.add(new SetCardInfo("Gray Ogre", 156, Rarity.COMMON, mage.cards.g.GrayOgre.class)); + cards.add(new SetCardInfo("Green Ward", 20, Rarity.UNCOMMON, mage.cards.g.GreenWard.class)); + cards.add(new SetCardInfo("Grizzly Bears", 199, Rarity.COMMON, mage.cards.g.GrizzlyBears.class)); + cards.add(new SetCardInfo("Guardian Angel", 21, Rarity.COMMON, mage.cards.g.GuardianAngel.class)); + cards.add(new SetCardInfo("Healing Salve", 22, Rarity.COMMON, mage.cards.h.HealingSalve.class)); cards.add(new SetCardInfo("Helm of Chatzuk", 246, Rarity.RARE, mage.cards.h.HelmOfChatzuk.class)); - cards.add(new SetCardInfo("Hill Giant", 158, Rarity.COMMON, mage.cards.h.HillGiant.class)); - cards.add(new SetCardInfo("Holy Armor", 207, Rarity.COMMON, mage.cards.h.HolyArmor.class)); - cards.add(new SetCardInfo("Holy Strength", 208, Rarity.COMMON, mage.cards.h.HolyStrength.class)); - cards.add(new SetCardInfo("Howl from Beyond", 20, Rarity.COMMON, mage.cards.h.HowlFromBeyond.class)); + cards.add(new SetCardInfo("Hill Giant", 157, Rarity.COMMON, mage.cards.h.HillGiant.class)); + cards.add(new SetCardInfo("Holy Armor", 23, Rarity.COMMON, mage.cards.h.HolyArmor.class)); + cards.add(new SetCardInfo("Holy Strength", 24, Rarity.COMMON, mage.cards.h.HolyStrength.class)); + cards.add(new SetCardInfo("Howl from Beyond", 111, Rarity.COMMON, mage.cards.h.HowlFromBeyond.class)); cards.add(new SetCardInfo("Howling Mine", 247, Rarity.RARE, mage.cards.h.HowlingMine.class)); - cards.add(new SetCardInfo("Hurloon Minotaur", 159, Rarity.COMMON, mage.cards.h.HurloonMinotaur.class)); - cards.add(new SetCardInfo("Hurricane", 109, Rarity.UNCOMMON, mage.cards.h.Hurricane.class)); - cards.add(new SetCardInfo("Hypnotic Specter", 21, Rarity.UNCOMMON, mage.cards.h.HypnoticSpecter.class)); - cards.add(new SetCardInfo("Ice Storm", 110, Rarity.UNCOMMON, mage.cards.i.IceStorm.class)); + cards.add(new SetCardInfo("Hurloon Minotaur", 158, Rarity.COMMON, mage.cards.h.HurloonMinotaur.class)); + cards.add(new SetCardInfo("Hurricane", 200, Rarity.UNCOMMON, mage.cards.h.Hurricane.class)); + cards.add(new SetCardInfo("Hypnotic Specter", 112, Rarity.UNCOMMON, mage.cards.h.HypnoticSpecter.class)); + cards.add(new SetCardInfo("Ice Storm", 201, Rarity.UNCOMMON, mage.cards.i.IceStorm.class)); cards.add(new SetCardInfo("Icy Manipulator", 248, Rarity.UNCOMMON, mage.cards.i.IcyManipulator.class)); - cards.add(new SetCardInfo("Instill Energy", 111, Rarity.UNCOMMON, mage.cards.i.InstillEnergy.class)); - cards.add(new SetCardInfo("Invisibility", 60, Rarity.COMMON, mage.cards.i.Invisibility.class)); - cards.add(new SetCardInfo("Ironclaw Orcs", 160, Rarity.COMMON, mage.cards.i.IronclawOrcs.class)); - cards.add(new SetCardInfo("Ironroot Treefolk", 112, Rarity.COMMON, mage.cards.i.IronrootTreefolk.class)); + cards.add(new SetCardInfo("Instill Energy", 202, Rarity.UNCOMMON, mage.cards.i.InstillEnergy.class)); + cards.add(new SetCardInfo("Invisibility", 59, Rarity.COMMON, mage.cards.i.Invisibility.class)); cards.add(new SetCardInfo("Iron Star", 250, Rarity.UNCOMMON, mage.cards.i.IronStar.class)); - cards.add(new SetCardInfo("Island", 281, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Island", 282, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Island Sanctuary", 209, Rarity.RARE, mage.cards.i.IslandSanctuary.class)); + cards.add(new SetCardInfo("Ironclaw Orcs", 159, Rarity.COMMON, mage.cards.i.IronclawOrcs.class)); + cards.add(new SetCardInfo("Ironroot Treefolk", 203, Rarity.COMMON, mage.cards.i.IronrootTreefolk.class)); + cards.add(new SetCardInfo("Island Sanctuary", 25, Rarity.RARE, mage.cards.i.IslandSanctuary.class)); + cards.add(new SetCardInfo("Island", 288, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 289, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Ivory Cup", 251, Rarity.UNCOMMON, mage.cards.i.IvoryCup.class)); cards.add(new SetCardInfo("Jade Monolith", 252, Rarity.RARE, mage.cards.j.JadeMonolith.class)); cards.add(new SetCardInfo("Jade Statue", 253, Rarity.UNCOMMON, mage.cards.j.JadeStatue.class)); cards.add(new SetCardInfo("Jayemdae Tome", 254, Rarity.RARE, mage.cards.j.JayemdaeTome.class)); cards.add(new SetCardInfo("Juggernaut", 255, Rarity.UNCOMMON, mage.cards.j.Juggernaut.class)); - cards.add(new SetCardInfo("Jump", 61, Rarity.COMMON, mage.cards.j.Jump.class)); - cards.add(new SetCardInfo("Karma", 210, Rarity.UNCOMMON, mage.cards.k.Karma.class)); - cards.add(new SetCardInfo("Keldon Warlord", 161, Rarity.UNCOMMON, mage.cards.k.KeldonWarlord.class)); + cards.add(new SetCardInfo("Jump", 60, Rarity.COMMON, mage.cards.j.Jump.class)); + cards.add(new SetCardInfo("Karma", 26, Rarity.UNCOMMON, mage.cards.k.Karma.class)); + cards.add(new SetCardInfo("Keldon Warlord", 160, Rarity.UNCOMMON, mage.cards.k.KeldonWarlord.class)); cards.add(new SetCardInfo("Kormus Bell", 256, Rarity.RARE, mage.cards.k.KormusBell.class)); - cards.add(new SetCardInfo("Kudzu", 113, Rarity.RARE, mage.cards.k.Kudzu.class)); - cards.add(new SetCardInfo("Lance", 211, Rarity.UNCOMMON, mage.cards.l.Lance.class)); - cards.add(new SetCardInfo("Ley Druid", 114, Rarity.UNCOMMON, mage.cards.l.LeyDruid.class)); + cards.add(new SetCardInfo("Kudzu", 204, Rarity.RARE, mage.cards.k.Kudzu.class)); + cards.add(new SetCardInfo("Lance", 27, Rarity.UNCOMMON, mage.cards.l.Lance.class)); + cards.add(new SetCardInfo("Ley Druid", 205, Rarity.UNCOMMON, mage.cards.l.LeyDruid.class)); cards.add(new SetCardInfo("Library of Leng", 257, Rarity.UNCOMMON, mage.cards.l.LibraryOfLeng.class)); - cards.add(new SetCardInfo("Lich", 22, Rarity.RARE, mage.cards.l.Lich.class)); - cards.add(new SetCardInfo("Lifeforce", 115, Rarity.UNCOMMON, mage.cards.l.Lifeforce.class)); - cards.add(new SetCardInfo("Lifelace", 116, Rarity.RARE, mage.cards.l.Lifelace.class)); - cards.add(new SetCardInfo("Lifetap", 62, Rarity.UNCOMMON, mage.cards.l.Lifetap.class)); - cards.add(new SetCardInfo("Lightning Bolt", 162, Rarity.COMMON, mage.cards.l.LightningBolt.class)); - cards.add(new SetCardInfo("Living Artifact", 117, Rarity.RARE, mage.cards.l.LivingArtifact.class)); - cards.add(new SetCardInfo("Living Lands", 118, Rarity.RARE, mage.cards.l.LivingLands.class)); + cards.add(new SetCardInfo("Lich", 113, Rarity.RARE, mage.cards.l.Lich.class)); + cards.add(new SetCardInfo("Lifeforce", 206, Rarity.UNCOMMON, mage.cards.l.Lifeforce.class)); + cards.add(new SetCardInfo("Lifelace", 207, Rarity.RARE, mage.cards.l.Lifelace.class)); + cards.add(new SetCardInfo("Lifetap", 61, Rarity.UNCOMMON, mage.cards.l.Lifetap.class)); + cards.add(new SetCardInfo("Lightning Bolt", 161, Rarity.COMMON, mage.cards.l.LightningBolt.class)); + cards.add(new SetCardInfo("Living Artifact", 208, Rarity.RARE, mage.cards.l.LivingArtifact.class)); + cards.add(new SetCardInfo("Living Lands", 209, Rarity.RARE, mage.cards.l.LivingLands.class)); cards.add(new SetCardInfo("Living Wall", 258, Rarity.UNCOMMON, mage.cards.l.LivingWall.class)); - cards.add(new SetCardInfo("Llanowar Elves", 119, Rarity.COMMON, mage.cards.l.LlanowarElves.class)); - cards.add(new SetCardInfo("Lord of Atlantis", 63, Rarity.RARE, mage.cards.l.LordOfAtlantis.class)); - cards.add(new SetCardInfo("Lord of the Pit", 23, Rarity.RARE, mage.cards.l.LordOfThePit.class)); - cards.add(new SetCardInfo("Lure", 120, Rarity.UNCOMMON, mage.cards.l.Lure.class)); - cards.add(new SetCardInfo("Mahamoti Djinn", 65, Rarity.RARE, mage.cards.m.MahamotiDjinn.class)); - cards.add(new SetCardInfo("Manabarbs", 164, Rarity.RARE, mage.cards.m.Manabarbs.class)); - cards.add(new SetCardInfo("Mana Flare", 163, Rarity.RARE, mage.cards.m.ManaFlare.class)); - cards.add(new SetCardInfo("Mana Short", 66, Rarity.RARE, mage.cards.m.ManaShort.class)); + cards.add(new SetCardInfo("Llanowar Elves", 210, Rarity.COMMON, mage.cards.l.LlanowarElves.class)); + cards.add(new SetCardInfo("Lord of Atlantis", 62, Rarity.RARE, mage.cards.l.LordOfAtlantis.class)); + cards.add(new SetCardInfo("Lord of the Pit", 114, Rarity.RARE, mage.cards.l.LordOfThePit.class)); + cards.add(new SetCardInfo("Lure", 211, Rarity.UNCOMMON, mage.cards.l.Lure.class)); + cards.add(new SetCardInfo("Mahamoti Djinn", 64, Rarity.RARE, mage.cards.m.MahamotiDjinn.class)); + cards.add(new SetCardInfo("Mana Flare", 162, Rarity.RARE, mage.cards.m.ManaFlare.class)); + cards.add(new SetCardInfo("Mana Short", 65, Rarity.RARE, mage.cards.m.ManaShort.class)); cards.add(new SetCardInfo("Mana Vault", 259, Rarity.RARE, mage.cards.m.ManaVault.class)); + cards.add(new SetCardInfo("Manabarbs", 163, Rarity.RARE, mage.cards.m.Manabarbs.class)); cards.add(new SetCardInfo("Meekstone", 260, Rarity.RARE, mage.cards.m.Meekstone.class)); - cards.add(new SetCardInfo("Merfolk of the Pearl Trident", 67, Rarity.COMMON, mage.cards.m.MerfolkOfThePearlTrident.class)); - cards.add(new SetCardInfo("Mesa Pegasus", 212, Rarity.COMMON, mage.cards.m.MesaPegasus.class)); - cards.add(new SetCardInfo("Mind Twist", 24, Rarity.RARE, mage.cards.m.MindTwist.class)); - cards.add(new SetCardInfo("Mons's Goblin Raiders", 165, Rarity.COMMON, mage.cards.m.MonssGoblinRaiders.class)); - cards.add(new SetCardInfo("Mountain", 283, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mountain", 284, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Merfolk of the Pearl Trident", 66, Rarity.COMMON, mage.cards.m.MerfolkOfThePearlTrident.class)); + cards.add(new SetCardInfo("Mesa Pegasus", 28, Rarity.COMMON, mage.cards.m.MesaPegasus.class)); + cards.add(new SetCardInfo("Mind Twist", 115, Rarity.RARE, mage.cards.m.MindTwist.class)); + cards.add(new SetCardInfo("Mons's Goblin Raiders", 164, Rarity.COMMON, mage.cards.m.MonssGoblinRaiders.class)); + cards.add(new SetCardInfo("Mountain", 292, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 293, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mox Emerald", 261, Rarity.RARE, mage.cards.m.MoxEmerald.class)); cards.add(new SetCardInfo("Mox Jet", 262, Rarity.RARE, mage.cards.m.MoxJet.class)); cards.add(new SetCardInfo("Mox Pearl", 263, Rarity.RARE, mage.cards.m.MoxPearl.class)); cards.add(new SetCardInfo("Mox Ruby", 264, Rarity.RARE, mage.cards.m.MoxRuby.class)); cards.add(new SetCardInfo("Mox Sapphire", 265, Rarity.RARE, mage.cards.m.MoxSapphire.class)); - cards.add(new SetCardInfo("Natural Selection", 121, Rarity.RARE, mage.cards.n.NaturalSelection.class)); - cards.add(new SetCardInfo("Nether Shadow", 25, Rarity.RARE, mage.cards.n.NetherShadow.class)); - cards.add(new SetCardInfo("Nettling Imp", 26, Rarity.UNCOMMON, mage.cards.n.NettlingImp.class)); + cards.add(new SetCardInfo("Natural Selection", 212, Rarity.RARE, mage.cards.n.NaturalSelection.class)); + cards.add(new SetCardInfo("Nether Shadow", 116, Rarity.RARE, mage.cards.n.NetherShadow.class)); + cards.add(new SetCardInfo("Nettling Imp", 117, Rarity.UNCOMMON, mage.cards.n.NettlingImp.class)); cards.add(new SetCardInfo("Nevinyrral's Disk", 266, Rarity.RARE, mage.cards.n.NevinyrralsDisk.class)); - cards.add(new SetCardInfo("Nightmare", 27, Rarity.RARE, mage.cards.n.Nightmare.class)); - cards.add(new SetCardInfo("Northern Paladin", 213, Rarity.RARE, mage.cards.n.NorthernPaladin.class)); + cards.add(new SetCardInfo("Nightmare", 118, Rarity.RARE, mage.cards.n.Nightmare.class)); + cards.add(new SetCardInfo("Northern Paladin", 29, Rarity.RARE, mage.cards.n.NorthernPaladin.class)); cards.add(new SetCardInfo("Obsianus Golem", 267, Rarity.UNCOMMON, mage.cards.o.ObsianusGolem.class)); - cards.add(new SetCardInfo("Orcish Artillery", 166, Rarity.UNCOMMON, mage.cards.o.OrcishArtillery.class)); - cards.add(new SetCardInfo("Orcish Oriflamme", 167, Rarity.UNCOMMON, mage.cards.o.OrcishOriflamme.class)); - cards.add(new SetCardInfo("Paralyze", 28, Rarity.COMMON, mage.cards.p.Paralyze.class)); - cards.add(new SetCardInfo("Pearled Unicorn", 214, Rarity.COMMON, mage.cards.p.PearledUnicorn.class)); - cards.add(new SetCardInfo("Personal Incarnation", 215, Rarity.RARE, mage.cards.p.PersonalIncarnation.class)); - cards.add(new SetCardInfo("Pestilence", 29, Rarity.COMMON, mage.cards.p.Pestilence.class)); - cards.add(new SetCardInfo("Phantasmal Forces", 68, Rarity.UNCOMMON, mage.cards.p.PhantasmalForces.class)); - cards.add(new SetCardInfo("Phantasmal Terrain", 69, Rarity.COMMON, mage.cards.p.PhantasmalTerrain.class)); - cards.add(new SetCardInfo("Phantom Monster", 70, Rarity.UNCOMMON, mage.cards.p.PhantomMonster.class)); - cards.add(new SetCardInfo("Pirate Ship", 71, Rarity.RARE, mage.cards.p.PirateShip.class)); - cards.add(new SetCardInfo("Plague Rats", 30, Rarity.COMMON, mage.cards.p.PlagueRats.class)); - cards.add(new SetCardInfo("Plains", 285, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Orcish Artillery", 165, Rarity.UNCOMMON, mage.cards.o.OrcishArtillery.class)); + cards.add(new SetCardInfo("Orcish Oriflamme", 166, Rarity.UNCOMMON, mage.cards.o.OrcishOriflamme.class)); + cards.add(new SetCardInfo("Paralyze", 119, Rarity.COMMON, mage.cards.p.Paralyze.class)); + cards.add(new SetCardInfo("Pearled Unicorn", 30, Rarity.COMMON, mage.cards.p.PearledUnicorn.class)); + cards.add(new SetCardInfo("Personal Incarnation", 31, Rarity.RARE, mage.cards.p.PersonalIncarnation.class)); + cards.add(new SetCardInfo("Pestilence", 120, Rarity.COMMON, mage.cards.p.Pestilence.class)); + cards.add(new SetCardInfo("Phantasmal Forces", 67, Rarity.UNCOMMON, mage.cards.p.PhantasmalForces.class)); + cards.add(new SetCardInfo("Phantasmal Terrain", 68, Rarity.COMMON, mage.cards.p.PhantasmalTerrain.class)); + cards.add(new SetCardInfo("Phantom Monster", 69, Rarity.UNCOMMON, mage.cards.p.PhantomMonster.class)); + cards.add(new SetCardInfo("Pirate Ship", 70, Rarity.RARE, mage.cards.p.PirateShip.class)); + cards.add(new SetCardInfo("Plague Rats", 121, Rarity.COMMON, mage.cards.p.PlagueRats.class)); cards.add(new SetCardInfo("Plains", 286, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Plateau", 287, Rarity.RARE, mage.cards.p.Plateau.class)); - cards.add(new SetCardInfo("Power Leak", 72, Rarity.COMMON, mage.cards.p.PowerLeak.class)); - cards.add(new SetCardInfo("Power Sink", 73, Rarity.COMMON, mage.cards.p.PowerSink.class)); - cards.add(new SetCardInfo("Power Surge", 168, Rarity.RARE, mage.cards.p.PowerSurge.class)); - cards.add(new SetCardInfo("Prodigal Sorcerer", 74, Rarity.COMMON, mage.cards.p.ProdigalSorcerer.class)); - cards.add(new SetCardInfo("Psionic Blast", 75, Rarity.UNCOMMON, mage.cards.p.PsionicBlast.class)); - cards.add(new SetCardInfo("Psychic Venom", 76, Rarity.COMMON, mage.cards.p.PsychicVenom.class)); - cards.add(new SetCardInfo("Purelace", 216, Rarity.RARE, mage.cards.p.Purelace.class)); - cards.add(new SetCardInfo("Raging River", 169, Rarity.RARE, mage.cards.r.RagingRiver.class)); - cards.add(new SetCardInfo("Raise Dead", 31, Rarity.COMMON, mage.cards.r.RaiseDead.class)); - cards.add(new SetCardInfo("Red Elemental Blast", 170, Rarity.COMMON, mage.cards.r.RedElementalBlast.class)); - cards.add(new SetCardInfo("Red Ward", 217, Rarity.UNCOMMON, mage.cards.r.RedWard.class)); - cards.add(new SetCardInfo("Regeneration", 122, Rarity.COMMON, mage.cards.r.Regeneration.class)); - cards.add(new SetCardInfo("Regrowth", 123, Rarity.UNCOMMON, mage.cards.r.Regrowth.class)); - cards.add(new SetCardInfo("Resurrection", 218, Rarity.UNCOMMON, mage.cards.r.Resurrection.class)); - cards.add(new SetCardInfo("Reverse Damage", 219, Rarity.RARE, mage.cards.r.ReverseDamage.class)); - cards.add(new SetCardInfo("Righteousness", 220, Rarity.RARE, mage.cards.r.Righteousness.class)); - cards.add(new SetCardInfo("Roc of Kher Ridges", 171, Rarity.RARE, mage.cards.r.RocOfKherRidges.class)); - cards.add(new SetCardInfo("Rock Hydra", 172, Rarity.RARE, mage.cards.r.RockHydra.class)); + cards.add(new SetCardInfo("Plains", 287, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Plateau", 279, Rarity.RARE, mage.cards.p.Plateau.class)); + cards.add(new SetCardInfo("Power Leak", 71, Rarity.COMMON, mage.cards.p.PowerLeak.class)); + cards.add(new SetCardInfo("Power Sink", 72, Rarity.COMMON, mage.cards.p.PowerSink.class)); + cards.add(new SetCardInfo("Power Surge", 167, Rarity.RARE, mage.cards.p.PowerSurge.class)); + cards.add(new SetCardInfo("Prodigal Sorcerer", 73, Rarity.COMMON, mage.cards.p.ProdigalSorcerer.class)); + cards.add(new SetCardInfo("Psionic Blast", 74, Rarity.UNCOMMON, mage.cards.p.PsionicBlast.class)); + cards.add(new SetCardInfo("Psychic Venom", 75, Rarity.COMMON, mage.cards.p.PsychicVenom.class)); + cards.add(new SetCardInfo("Purelace", 32, Rarity.RARE, mage.cards.p.Purelace.class)); + cards.add(new SetCardInfo("Raging River", 168, Rarity.RARE, mage.cards.r.RagingRiver.class)); + cards.add(new SetCardInfo("Raise Dead", 122, Rarity.COMMON, mage.cards.r.RaiseDead.class)); + cards.add(new SetCardInfo("Red Elemental Blast", 169, Rarity.COMMON, mage.cards.r.RedElementalBlast.class)); + cards.add(new SetCardInfo("Red Ward", 33, Rarity.UNCOMMON, mage.cards.r.RedWard.class)); + cards.add(new SetCardInfo("Regeneration", 213, Rarity.COMMON, mage.cards.r.Regeneration.class)); + cards.add(new SetCardInfo("Regrowth", 214, Rarity.UNCOMMON, mage.cards.r.Regrowth.class)); + cards.add(new SetCardInfo("Resurrection", 34, Rarity.UNCOMMON, mage.cards.r.Resurrection.class)); + cards.add(new SetCardInfo("Reverse Damage", 35, Rarity.RARE, mage.cards.r.ReverseDamage.class)); + cards.add(new SetCardInfo("Righteousness", 36, Rarity.RARE, mage.cards.r.Righteousness.class)); + cards.add(new SetCardInfo("Roc of Kher Ridges", 170, Rarity.RARE, mage.cards.r.RocOfKherRidges.class)); + cards.add(new SetCardInfo("Rock Hydra", 171, Rarity.RARE, mage.cards.r.RockHydra.class)); cards.add(new SetCardInfo("Rod of Ruin", 268, Rarity.UNCOMMON, mage.cards.r.RodOfRuin.class)); - cards.add(new SetCardInfo("Royal Assassin", 32, Rarity.RARE, mage.cards.r.RoyalAssassin.class)); - cards.add(new SetCardInfo("Sacrifice", 33, Rarity.UNCOMMON, mage.cards.s.Sacrifice.class)); - cards.add(new SetCardInfo("Samite Healer", 221, Rarity.COMMON, mage.cards.s.SamiteHealer.class)); - cards.add(new SetCardInfo("Savannah", 288, Rarity.RARE, mage.cards.s.Savannah.class)); - cards.add(new SetCardInfo("Savannah Lions", 222, Rarity.RARE, mage.cards.s.SavannahLions.class)); - cards.add(new SetCardInfo("Scathe Zombies", 34, Rarity.COMMON, mage.cards.s.ScatheZombies.class)); - cards.add(new SetCardInfo("Scavenging Ghoul", 35, Rarity.UNCOMMON, mage.cards.s.ScavengingGhoul.class)); - cards.add(new SetCardInfo("Scrubland", 289, Rarity.RARE, mage.cards.s.Scrubland.class)); - cards.add(new SetCardInfo("Scryb Sprites", 124, Rarity.COMMON, mage.cards.s.ScrybSprites.class)); - cards.add(new SetCardInfo("Sea Serpent", 77, Rarity.COMMON, mage.cards.s.SeaSerpent.class)); - cards.add(new SetCardInfo("Sedge Troll", 173, Rarity.RARE, mage.cards.s.SedgeTroll.class)); - cards.add(new SetCardInfo("Sengir Vampire", 36, Rarity.UNCOMMON, mage.cards.s.SengirVampire.class)); - cards.add(new SetCardInfo("Serra Angel", 223, Rarity.UNCOMMON, mage.cards.s.SerraAngel.class)); - cards.add(new SetCardInfo("Shanodin Dryads", 125, Rarity.COMMON, mage.cards.s.ShanodinDryads.class)); - cards.add(new SetCardInfo("Shatter", 174, Rarity.COMMON, mage.cards.s.Shatter.class)); - cards.add(new SetCardInfo("Shivan Dragon", 175, Rarity.RARE, mage.cards.s.ShivanDragon.class)); - cards.add(new SetCardInfo("Simulacrum", 37, Rarity.UNCOMMON, mage.cards.s.Simulacrum.class)); - cards.add(new SetCardInfo("Sinkhole", 38, Rarity.COMMON, mage.cards.s.Sinkhole.class)); - cards.add(new SetCardInfo("Siren's Call", 78, Rarity.UNCOMMON, mage.cards.s.SirensCall.class)); - cards.add(new SetCardInfo("Smoke", 176, Rarity.RARE, mage.cards.s.Smoke.class)); + cards.add(new SetCardInfo("Royal Assassin", 123, Rarity.RARE, mage.cards.r.RoyalAssassin.class)); + cards.add(new SetCardInfo("Sacrifice", 124, Rarity.UNCOMMON, mage.cards.s.Sacrifice.class)); + cards.add(new SetCardInfo("Samite Healer", 37, Rarity.COMMON, mage.cards.s.SamiteHealer.class)); + cards.add(new SetCardInfo("Savannah Lions", 38, Rarity.RARE, mage.cards.s.SavannahLions.class)); + cards.add(new SetCardInfo("Savannah", 280, Rarity.RARE, mage.cards.s.Savannah.class)); + cards.add(new SetCardInfo("Scathe Zombies", 125, Rarity.COMMON, mage.cards.s.ScatheZombies.class)); + cards.add(new SetCardInfo("Scavenging Ghoul", 126, Rarity.UNCOMMON, mage.cards.s.ScavengingGhoul.class)); + cards.add(new SetCardInfo("Scrubland", 281, Rarity.RARE, mage.cards.s.Scrubland.class)); + cards.add(new SetCardInfo("Scryb Sprites", 215, Rarity.COMMON, mage.cards.s.ScrybSprites.class)); + cards.add(new SetCardInfo("Sea Serpent", 76, Rarity.COMMON, mage.cards.s.SeaSerpent.class)); + cards.add(new SetCardInfo("Sedge Troll", 172, Rarity.RARE, mage.cards.s.SedgeTroll.class)); + cards.add(new SetCardInfo("Sengir Vampire", 127, Rarity.UNCOMMON, mage.cards.s.SengirVampire.class)); + cards.add(new SetCardInfo("Serra Angel", 39, Rarity.UNCOMMON, mage.cards.s.SerraAngel.class)); + cards.add(new SetCardInfo("Shanodin Dryads", 216, Rarity.COMMON, mage.cards.s.ShanodinDryads.class)); + cards.add(new SetCardInfo("Shatter", 173, Rarity.COMMON, mage.cards.s.Shatter.class)); + cards.add(new SetCardInfo("Shivan Dragon", 174, Rarity.RARE, mage.cards.s.ShivanDragon.class)); + cards.add(new SetCardInfo("Simulacrum", 128, Rarity.UNCOMMON, mage.cards.s.Simulacrum.class)); + cards.add(new SetCardInfo("Sinkhole", 129, Rarity.COMMON, mage.cards.s.Sinkhole.class)); + cards.add(new SetCardInfo("Siren's Call", 77, Rarity.UNCOMMON, mage.cards.s.SirensCall.class)); + cards.add(new SetCardInfo("Smoke", 175, Rarity.RARE, mage.cards.s.Smoke.class)); cards.add(new SetCardInfo("Sol Ring", 269, Rarity.UNCOMMON, mage.cards.s.SolRing.class)); cards.add(new SetCardInfo("Soul Net", 270, Rarity.UNCOMMON, mage.cards.s.SoulNet.class)); - cards.add(new SetCardInfo("Spell Blast", 80, Rarity.COMMON, mage.cards.s.SpellBlast.class)); - cards.add(new SetCardInfo("Stasis", 81, Rarity.RARE, mage.cards.s.Stasis.class)); - cards.add(new SetCardInfo("Steal Artifact", 82, Rarity.UNCOMMON, mage.cards.s.StealArtifact.class)); - cards.add(new SetCardInfo("Stone Giant", 177, Rarity.UNCOMMON, mage.cards.s.StoneGiant.class)); - cards.add(new SetCardInfo("Stone Rain", 178, Rarity.COMMON, mage.cards.s.StoneRain.class)); - cards.add(new SetCardInfo("Stream of Life", 126, Rarity.COMMON, mage.cards.s.StreamOfLife.class)); + cards.add(new SetCardInfo("Spell Blast", 79, Rarity.COMMON, mage.cards.s.SpellBlast.class)); + cards.add(new SetCardInfo("Stasis", 80, Rarity.RARE, mage.cards.s.Stasis.class)); + cards.add(new SetCardInfo("Steal Artifact", 81, Rarity.UNCOMMON, mage.cards.s.StealArtifact.class)); + cards.add(new SetCardInfo("Stone Giant", 176, Rarity.UNCOMMON, mage.cards.s.StoneGiant.class)); + cards.add(new SetCardInfo("Stone Rain", 177, Rarity.COMMON, mage.cards.s.StoneRain.class)); + cards.add(new SetCardInfo("Stream of Life", 217, Rarity.COMMON, mage.cards.s.StreamOfLife.class)); cards.add(new SetCardInfo("Sunglasses of Urza", 271, Rarity.RARE, mage.cards.s.SunglassesOfUrza.class)); cards.add(new SetCardInfo("Swamp", 290, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Swamp", 291, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Swords to Plowshares", 224, Rarity.UNCOMMON, mage.cards.s.SwordsToPlowshares.class)); - cards.add(new SetCardInfo("Taiga", 292, Rarity.RARE, mage.cards.t.Taiga.class)); - cards.add(new SetCardInfo("Terror", 39, Rarity.COMMON, mage.cards.t.Terror.class)); + cards.add(new SetCardInfo("Swords to Plowshares", 40, Rarity.UNCOMMON, mage.cards.s.SwordsToPlowshares.class)); + cards.add(new SetCardInfo("Taiga", 282, Rarity.RARE, mage.cards.t.Taiga.class)); + cards.add(new SetCardInfo("Terror", 130, Rarity.COMMON, mage.cards.t.Terror.class)); cards.add(new SetCardInfo("The Hive", 272, Rarity.RARE, mage.cards.t.TheHive.class)); - cards.add(new SetCardInfo("Thicket Basilisk", 127, Rarity.UNCOMMON, mage.cards.t.ThicketBasilisk.class)); - cards.add(new SetCardInfo("Thoughtlace", 83, Rarity.RARE, mage.cards.t.Thoughtlace.class)); + cards.add(new SetCardInfo("Thicket Basilisk", 218, Rarity.UNCOMMON, mage.cards.t.ThicketBasilisk.class)); + cards.add(new SetCardInfo("Thoughtlace", 82, Rarity.RARE, mage.cards.t.Thoughtlace.class)); cards.add(new SetCardInfo("Throne of Bone", 273, Rarity.UNCOMMON, mage.cards.t.ThroneOfBone.class)); - cards.add(new SetCardInfo("Timber Wolves", 128, Rarity.RARE, mage.cards.t.TimberWolves.class)); - cards.add(new SetCardInfo("Timetwister", 85, Rarity.RARE, mage.cards.t.Timetwister.class)); + cards.add(new SetCardInfo("Timber Wolves", 219, Rarity.RARE, mage.cards.t.TimberWolves.class)); cards.add(new SetCardInfo("Time Vault", 274, Rarity.RARE, mage.cards.t.TimeVault.class)); - cards.add(new SetCardInfo("Time Walk", 84, Rarity.RARE, mage.cards.t.TimeWalk.class)); - cards.add(new SetCardInfo("Tranquility", 129, Rarity.COMMON, mage.cards.t.Tranquility.class)); - cards.add(new SetCardInfo("Tropical Island", 293, Rarity.RARE, mage.cards.t.TropicalIsland.class)); - cards.add(new SetCardInfo("Tsunami", 130, Rarity.UNCOMMON, mage.cards.t.Tsunami.class)); - cards.add(new SetCardInfo("Tundra", 294, Rarity.RARE, mage.cards.t.Tundra.class)); - cards.add(new SetCardInfo("Tunnel", 179, Rarity.UNCOMMON, mage.cards.t.Tunnel.class)); - cards.add(new SetCardInfo("Twiddle", 86, Rarity.COMMON, mage.cards.t.Twiddle.class)); - cards.add(new SetCardInfo("Two-Headed Giant of Foriys", 180, Rarity.RARE, mage.cards.t.TwoHeadedGiantOfForiys.class)); - cards.add(new SetCardInfo("Underground Sea", 295, Rarity.RARE, mage.cards.u.UndergroundSea.class)); - cards.add(new SetCardInfo("Unholy Strength", 40, Rarity.COMMON, mage.cards.u.UnholyStrength.class)); - cards.add(new SetCardInfo("Unsummon", 87, Rarity.COMMON, mage.cards.u.Unsummon.class)); - cards.add(new SetCardInfo("Uthden Troll", 181, Rarity.UNCOMMON, mage.cards.u.UthdenTroll.class)); - cards.add(new SetCardInfo("Verduran Enchantress", 131, Rarity.RARE, mage.cards.v.VerduranEnchantress.class)); - cards.add(new SetCardInfo("Vesuvan Doppelganger", 88, Rarity.RARE, mage.cards.v.VesuvanDoppelganger.class)); - cards.add(new SetCardInfo("Veteran Bodyguard", 225, Rarity.RARE, mage.cards.v.VeteranBodyguard.class)); - cards.add(new SetCardInfo("Volcanic Eruption", 89, Rarity.RARE, mage.cards.v.VolcanicEruption.class)); - cards.add(new SetCardInfo("Wall of Air", 90, Rarity.UNCOMMON, mage.cards.w.WallOfAir.class)); - cards.add(new SetCardInfo("Wall of Bone", 41, Rarity.UNCOMMON, mage.cards.w.WallOfBone.class)); - cards.add(new SetCardInfo("Wall of Brambles", 132, Rarity.UNCOMMON, mage.cards.w.WallOfBrambles.class)); - cards.add(new SetCardInfo("Wall of Fire", 182, Rarity.UNCOMMON, mage.cards.w.WallOfFire.class)); - cards.add(new SetCardInfo("Wall of Ice", 133, Rarity.UNCOMMON, mage.cards.w.WallOfIce.class)); - cards.add(new SetCardInfo("Wall of Stone", 183, Rarity.UNCOMMON, mage.cards.w.WallOfStone.class)); - cards.add(new SetCardInfo("Wall of Swords", 226, Rarity.UNCOMMON, mage.cards.w.WallOfSwords.class)); - cards.add(new SetCardInfo("Wall of Water", 91, Rarity.UNCOMMON, mage.cards.w.WallOfWater.class)); - cards.add(new SetCardInfo("Wall of Wood", 134, Rarity.COMMON, mage.cards.w.WallOfWood.class)); - cards.add(new SetCardInfo("Wanderlust", 135, Rarity.UNCOMMON, mage.cards.w.Wanderlust.class)); - cards.add(new SetCardInfo("War Mammoth", 136, Rarity.COMMON, mage.cards.w.WarMammoth.class)); - cards.add(new SetCardInfo("Warp Artifact", 42, Rarity.RARE, mage.cards.w.WarpArtifact.class)); - cards.add(new SetCardInfo("Water Elemental", 92, Rarity.UNCOMMON, mage.cards.w.WaterElemental.class)); - cards.add(new SetCardInfo("Weakness", 43, Rarity.COMMON, mage.cards.w.Weakness.class)); - cards.add(new SetCardInfo("Web", 137, Rarity.RARE, mage.cards.w.Web.class)); - cards.add(new SetCardInfo("Wheel of Fortune", 184, Rarity.RARE, mage.cards.w.WheelOfFortune.class)); - cards.add(new SetCardInfo("White Knight", 227, Rarity.UNCOMMON, mage.cards.w.WhiteKnight.class)); - cards.add(new SetCardInfo("White Ward", 228, Rarity.UNCOMMON, mage.cards.w.WhiteWard.class)); - cards.add(new SetCardInfo("Wild Growth", 138, Rarity.COMMON, mage.cards.w.WildGrowth.class)); - cards.add(new SetCardInfo("Will-o'-the-Wisp", 44, Rarity.RARE, mage.cards.w.WillOTheWisp.class)); + cards.add(new SetCardInfo("Time Walk", 83, Rarity.RARE, mage.cards.t.TimeWalk.class)); + cards.add(new SetCardInfo("Timetwister", 84, Rarity.RARE, mage.cards.t.Timetwister.class)); + cards.add(new SetCardInfo("Tranquility", 220, Rarity.COMMON, mage.cards.t.Tranquility.class)); + cards.add(new SetCardInfo("Tropical Island", 283, Rarity.RARE, mage.cards.t.TropicalIsland.class)); + cards.add(new SetCardInfo("Tsunami", 221, Rarity.UNCOMMON, mage.cards.t.Tsunami.class)); + cards.add(new SetCardInfo("Tundra", 284, Rarity.RARE, mage.cards.t.Tundra.class)); + cards.add(new SetCardInfo("Tunnel", 178, Rarity.UNCOMMON, mage.cards.t.Tunnel.class)); + cards.add(new SetCardInfo("Twiddle", 85, Rarity.COMMON, mage.cards.t.Twiddle.class)); + cards.add(new SetCardInfo("Two-Headed Giant of Foriys", 179, Rarity.RARE, mage.cards.t.TwoHeadedGiantOfForiys.class)); + cards.add(new SetCardInfo("Underground Sea", 285, Rarity.RARE, mage.cards.u.UndergroundSea.class)); + cards.add(new SetCardInfo("Unholy Strength", 131, Rarity.COMMON, mage.cards.u.UnholyStrength.class)); + cards.add(new SetCardInfo("Unsummon", 86, Rarity.COMMON, mage.cards.u.Unsummon.class)); + cards.add(new SetCardInfo("Uthden Troll", 180, Rarity.UNCOMMON, mage.cards.u.UthdenTroll.class)); + cards.add(new SetCardInfo("Verduran Enchantress", 222, Rarity.RARE, mage.cards.v.VerduranEnchantress.class)); + cards.add(new SetCardInfo("Vesuvan Doppelganger", 87, Rarity.RARE, mage.cards.v.VesuvanDoppelganger.class)); + cards.add(new SetCardInfo("Veteran Bodyguard", 41, Rarity.RARE, mage.cards.v.VeteranBodyguard.class)); + cards.add(new SetCardInfo("Volcanic Eruption", 88, Rarity.RARE, mage.cards.v.VolcanicEruption.class)); + cards.add(new SetCardInfo("Wall of Air", 89, Rarity.UNCOMMON, mage.cards.w.WallOfAir.class)); + cards.add(new SetCardInfo("Wall of Bone", 132, Rarity.UNCOMMON, mage.cards.w.WallOfBone.class)); + cards.add(new SetCardInfo("Wall of Brambles", 223, Rarity.UNCOMMON, mage.cards.w.WallOfBrambles.class)); + cards.add(new SetCardInfo("Wall of Fire", 181, Rarity.UNCOMMON, mage.cards.w.WallOfFire.class)); + cards.add(new SetCardInfo("Wall of Ice", 224, Rarity.UNCOMMON, mage.cards.w.WallOfIce.class)); + cards.add(new SetCardInfo("Wall of Stone", 182, Rarity.UNCOMMON, mage.cards.w.WallOfStone.class)); + cards.add(new SetCardInfo("Wall of Swords", 42, Rarity.UNCOMMON, mage.cards.w.WallOfSwords.class)); + cards.add(new SetCardInfo("Wall of Water", 90, Rarity.UNCOMMON, mage.cards.w.WallOfWater.class)); + cards.add(new SetCardInfo("Wall of Wood", 225, Rarity.COMMON, mage.cards.w.WallOfWood.class)); + cards.add(new SetCardInfo("Wanderlust", 226, Rarity.UNCOMMON, mage.cards.w.Wanderlust.class)); + cards.add(new SetCardInfo("War Mammoth", 227, Rarity.COMMON, mage.cards.w.WarMammoth.class)); + cards.add(new SetCardInfo("Warp Artifact", 133, Rarity.RARE, mage.cards.w.WarpArtifact.class)); + cards.add(new SetCardInfo("Water Elemental", 91, Rarity.UNCOMMON, mage.cards.w.WaterElemental.class)); + cards.add(new SetCardInfo("Weakness", 134, Rarity.COMMON, mage.cards.w.Weakness.class)); + cards.add(new SetCardInfo("Web", 228, Rarity.RARE, mage.cards.w.Web.class)); + cards.add(new SetCardInfo("Wheel of Fortune", 183, Rarity.RARE, mage.cards.w.WheelOfFortune.class)); + cards.add(new SetCardInfo("White Knight", 43, Rarity.UNCOMMON, mage.cards.w.WhiteKnight.class)); + cards.add(new SetCardInfo("White Ward", 44, Rarity.UNCOMMON, mage.cards.w.WhiteWard.class)); + cards.add(new SetCardInfo("Wild Growth", 229, Rarity.COMMON, mage.cards.w.WildGrowth.class)); + cards.add(new SetCardInfo("Will-o'-the-Wisp", 135, Rarity.RARE, mage.cards.w.WillOTheWisp.class)); cards.add(new SetCardInfo("Winter Orb", 275, Rarity.RARE, mage.cards.w.WinterOrb.class)); cards.add(new SetCardInfo("Wooden Sphere", 276, Rarity.UNCOMMON, mage.cards.w.WoodenSphere.class)); - cards.add(new SetCardInfo("Wrath of God", 229, Rarity.RARE, mage.cards.w.WrathOfGod.class)); - cards.add(new SetCardInfo("Zombie Master", 46, Rarity.RARE, mage.cards.z.ZombieMaster.class)); + cards.add(new SetCardInfo("Wrath of God", 45, Rarity.RARE, mage.cards.w.WrathOfGod.class)); + cards.add(new SetCardInfo("Zombie Master", 137, Rarity.RARE, mage.cards.z.ZombieMaster.class)); } } From ab66a6aceb475a937eb450e78b495a8f7bf44a1f Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Wed, 9 May 2018 03:07:07 +0400 Subject: [PATCH 096/158] Fixed card numbers in 2ED - Unlimited Edition (#4628) --- Mage.Sets/src/mage/sets/UnlimitedEdition.java | 316 +++++++++--------- 1 file changed, 158 insertions(+), 158 deletions(-) diff --git a/Mage.Sets/src/mage/sets/UnlimitedEdition.java b/Mage.Sets/src/mage/sets/UnlimitedEdition.java index ee5e51551d3..5fcfc293f2b 100644 --- a/Mage.Sets/src/mage/sets/UnlimitedEdition.java +++ b/Mage.Sets/src/mage/sets/UnlimitedEdition.java @@ -27,232 +27,232 @@ public class UnlimitedEdition extends ExpansionSet { cards.add(new SetCardInfo("Air Elemental", 47, Rarity.UNCOMMON, mage.cards.a.AirElemental.class)); cards.add(new SetCardInfo("Ancestral Recall", 48, Rarity.RARE, mage.cards.a.AncestralRecall.class)); cards.add(new SetCardInfo("Animate Artifact", 49, Rarity.UNCOMMON, mage.cards.a.AnimateArtifact.class)); - cards.add(new SetCardInfo("Animate Dead", 1, Rarity.UNCOMMON, mage.cards.a.AnimateDead.class)); - cards.add(new SetCardInfo("Animate Wall", 185, Rarity.RARE, mage.cards.a.AnimateWall.class)); + cards.add(new SetCardInfo("Animate Dead", 93, Rarity.UNCOMMON, mage.cards.a.AnimateDead.class)); + cards.add(new SetCardInfo("Animate Wall", 1, Rarity.RARE, mage.cards.a.AnimateWall.class)); cards.add(new SetCardInfo("Ankh of Mishra", 231, Rarity.RARE, mage.cards.a.AnkhOfMishra.class)); - cards.add(new SetCardInfo("Armageddon", 186, Rarity.RARE, mage.cards.a.Armageddon.class)); - cards.add(new SetCardInfo("Aspect of Wolf", 93, Rarity.RARE, mage.cards.a.AspectOfWolf.class)); + cards.add(new SetCardInfo("Armageddon", 2, Rarity.RARE, mage.cards.a.Armageddon.class)); + cards.add(new SetCardInfo("Aspect of Wolf", 185, Rarity.RARE, mage.cards.a.AspectOfWolf.class)); + cards.add(new SetCardInfo("Bad Moon", 94, Rarity.RARE, mage.cards.b.BadMoon.class)); cards.add(new SetCardInfo("Badlands", 278, Rarity.RARE, mage.cards.b.Badlands.class)); - cards.add(new SetCardInfo("Bad Moon", 2, Rarity.RARE, mage.cards.b.BadMoon.class)); - cards.add(new SetCardInfo("Balance", 187, Rarity.RARE, mage.cards.b.Balance.class)); + cards.add(new SetCardInfo("Balance", 3, Rarity.RARE, mage.cards.b.Balance.class)); cards.add(new SetCardInfo("Basalt Monolith", 232, Rarity.UNCOMMON, mage.cards.b.BasaltMonolith.class)); cards.add(new SetCardInfo("Bayou", 279, Rarity.RARE, mage.cards.b.Bayou.class)); - cards.add(new SetCardInfo("Benalish Hero", 188, Rarity.COMMON, mage.cards.b.BenalishHero.class)); - cards.add(new SetCardInfo("Berserk", 94, Rarity.UNCOMMON, mage.cards.b.Berserk.class)); - cards.add(new SetCardInfo("Birds of Paradise", 95, Rarity.RARE, mage.cards.b.BirdsOfParadise.class)); - cards.add(new SetCardInfo("Black Knight", 3, Rarity.UNCOMMON, mage.cards.b.BlackKnight.class)); + cards.add(new SetCardInfo("Benalish Hero", 4, Rarity.COMMON, mage.cards.b.BenalishHero.class)); + cards.add(new SetCardInfo("Berserk", 186, Rarity.UNCOMMON, mage.cards.b.Berserk.class)); + cards.add(new SetCardInfo("Birds of Paradise", 187, Rarity.RARE, mage.cards.b.BirdsOfParadise.class)); + cards.add(new SetCardInfo("Black Knight", 95, Rarity.UNCOMMON, mage.cards.b.BlackKnight.class)); cards.add(new SetCardInfo("Black Lotus", 233, Rarity.RARE, mage.cards.b.BlackLotus.class)); cards.add(new SetCardInfo("Black Vise", 234, Rarity.UNCOMMON, mage.cards.b.BlackVise.class)); - cards.add(new SetCardInfo("Black Ward", 189, Rarity.UNCOMMON, mage.cards.b.BlackWard.class)); - cards.add(new SetCardInfo("Blaze of Glory", 190, Rarity.RARE, mage.cards.b.BlazeOfGlory.class)); - cards.add(new SetCardInfo("Blessing", 191, Rarity.RARE, mage.cards.b.Blessing.class)); + cards.add(new SetCardInfo("Black Ward", 5, Rarity.UNCOMMON, mage.cards.b.BlackWard.class)); + cards.add(new SetCardInfo("Blaze of Glory", 6, Rarity.RARE, mage.cards.b.BlazeOfGlory.class)); + cards.add(new SetCardInfo("Blessing", 7, Rarity.RARE, mage.cards.b.Blessing.class)); cards.add(new SetCardInfo("Blue Elemental Blast", 50, Rarity.COMMON, mage.cards.b.BlueElementalBlast.class)); - cards.add(new SetCardInfo("Blue Ward", 192, Rarity.UNCOMMON, mage.cards.b.BlueWard.class)); - cards.add(new SetCardInfo("Bog Wraith", 4, Rarity.UNCOMMON, mage.cards.b.BogWraith.class)); + cards.add(new SetCardInfo("Blue Ward", 8, Rarity.UNCOMMON, mage.cards.b.BlueWard.class)); + cards.add(new SetCardInfo("Bog Wraith", 96, Rarity.UNCOMMON, mage.cards.b.BogWraith.class)); cards.add(new SetCardInfo("Braingeyser", 51, Rarity.RARE, mage.cards.b.Braingeyser.class)); cards.add(new SetCardInfo("Burrowing", 139, Rarity.UNCOMMON, mage.cards.b.Burrowing.class)); - cards.add(new SetCardInfo("Camouflage", 96, Rarity.UNCOMMON, mage.cards.c.Camouflage.class)); - cards.add(new SetCardInfo("Castle", 193, Rarity.UNCOMMON, mage.cards.c.Castle.class)); + cards.add(new SetCardInfo("Camouflage", 188, Rarity.UNCOMMON, mage.cards.c.Camouflage.class)); + cards.add(new SetCardInfo("Castle", 9, Rarity.UNCOMMON, mage.cards.c.Castle.class)); cards.add(new SetCardInfo("Celestial Prism", 235, Rarity.UNCOMMON, mage.cards.c.CelestialPrism.class)); - cards.add(new SetCardInfo("Channel", 97, Rarity.UNCOMMON, mage.cards.c.Channel.class)); + cards.add(new SetCardInfo("Channel", 189, Rarity.UNCOMMON, mage.cards.c.Channel.class)); cards.add(new SetCardInfo("Chaoslace", 140, Rarity.RARE, mage.cards.c.Chaoslace.class)); - cards.add(new SetCardInfo("Circle of Protection: Black", 194, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlack.class)); - cards.add(new SetCardInfo("Circle of Protection: Blue", 195, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlue.class)); - cards.add(new SetCardInfo("Circle of Protection: Green", 196, Rarity.COMMON, mage.cards.c.CircleOfProtectionGreen.class)); - cards.add(new SetCardInfo("Circle of Protection: Red", 197, Rarity.COMMON, mage.cards.c.CircleOfProtectionRed.class)); - cards.add(new SetCardInfo("Circle of Protection: White", 198, Rarity.COMMON, mage.cards.c.CircleOfProtectionWhite.class)); + cards.add(new SetCardInfo("Circle of Protection: Black", 10, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlack.class)); + cards.add(new SetCardInfo("Circle of Protection: Blue", 11, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlue.class)); + cards.add(new SetCardInfo("Circle of Protection: Green", 12, Rarity.COMMON, mage.cards.c.CircleOfProtectionGreen.class)); + cards.add(new SetCardInfo("Circle of Protection: Red", 13, Rarity.COMMON, mage.cards.c.CircleOfProtectionRed.class)); + cards.add(new SetCardInfo("Circle of Protection: White", 14, Rarity.COMMON, mage.cards.c.CircleOfProtectionWhite.class)); cards.add(new SetCardInfo("Clockwork Beast", 237, Rarity.RARE, mage.cards.c.ClockworkBeast.class)); cards.add(new SetCardInfo("Clone", 52, Rarity.UNCOMMON, mage.cards.c.Clone.class)); - cards.add(new SetCardInfo("Cockatrice", 98, Rarity.RARE, mage.cards.c.Cockatrice.class)); - cards.add(new SetCardInfo("Consecrate Land", 199, Rarity.UNCOMMON, mage.cards.c.ConsecrateLand.class)); + cards.add(new SetCardInfo("Cockatrice", 190, Rarity.RARE, mage.cards.c.Cockatrice.class)); + cards.add(new SetCardInfo("Consecrate Land", 15, Rarity.UNCOMMON, mage.cards.c.ConsecrateLand.class)); cards.add(new SetCardInfo("Conservator", 238, Rarity.UNCOMMON, mage.cards.c.Conservator.class)); cards.add(new SetCardInfo("Control Magic", 53, Rarity.UNCOMMON, mage.cards.c.ControlMagic.class)); - cards.add(new SetCardInfo("Conversion", 200, Rarity.UNCOMMON, mage.cards.c.Conversion.class)); + cards.add(new SetCardInfo("Conversion", 16, Rarity.UNCOMMON, mage.cards.c.Conversion.class)); cards.add(new SetCardInfo("Copper Tablet", 239, Rarity.UNCOMMON, mage.cards.c.CopperTablet.class)); cards.add(new SetCardInfo("Copy Artifact", 54, Rarity.RARE, mage.cards.c.CopyArtifact.class)); cards.add(new SetCardInfo("Counterspell", 55, Rarity.UNCOMMON, mage.cards.c.Counterspell.class)); - cards.add(new SetCardInfo("Craw Wurm", 99, Rarity.COMMON, mage.cards.c.CrawWurm.class)); + cards.add(new SetCardInfo("Craw Wurm", 191, Rarity.COMMON, mage.cards.c.CrawWurm.class)); cards.add(new SetCardInfo("Creature Bond", 56, Rarity.COMMON, mage.cards.c.CreatureBond.class)); - cards.add(new SetCardInfo("Crusade", 201, Rarity.RARE, mage.cards.c.Crusade.class)); + cards.add(new SetCardInfo("Crusade", 17, Rarity.RARE, mage.cards.c.Crusade.class)); cards.add(new SetCardInfo("Crystal Rod", 240, Rarity.UNCOMMON, mage.cards.c.CrystalRod.class)); - cards.add(new SetCardInfo("Cursed Land", 6, Rarity.UNCOMMON, mage.cards.c.CursedLand.class)); + cards.add(new SetCardInfo("Cursed Land", 98, Rarity.UNCOMMON, mage.cards.c.CursedLand.class)); cards.add(new SetCardInfo("Cyclopean Tomb", 241, Rarity.RARE, mage.cards.c.CyclopeanTomb.class)); - cards.add(new SetCardInfo("Dark Ritual", 7, Rarity.COMMON, mage.cards.d.DarkRitual.class)); - cards.add(new SetCardInfo("Deathgrip", 9, Rarity.UNCOMMON, mage.cards.d.Deathgrip.class)); - cards.add(new SetCardInfo("Deathlace", 10, Rarity.RARE, mage.cards.d.Deathlace.class)); - cards.add(new SetCardInfo("Death Ward", 202, Rarity.COMMON, mage.cards.d.DeathWard.class)); - cards.add(new SetCardInfo("Demonic Hordes", 12, Rarity.RARE, mage.cards.d.DemonicHordes.class)); - cards.add(new SetCardInfo("Demonic Tutor", 13, Rarity.UNCOMMON, mage.cards.d.DemonicTutor.class)); + cards.add(new SetCardInfo("Dark Ritual", 99, Rarity.COMMON, mage.cards.d.DarkRitual.class)); + cards.add(new SetCardInfo("Death Ward", 18, Rarity.COMMON, mage.cards.d.DeathWard.class)); + cards.add(new SetCardInfo("Deathgrip", 101, Rarity.UNCOMMON, mage.cards.d.Deathgrip.class)); + cards.add(new SetCardInfo("Deathlace", 102, Rarity.RARE, mage.cards.d.Deathlace.class)); + cards.add(new SetCardInfo("Demonic Hordes", 104, Rarity.RARE, mage.cards.d.DemonicHordes.class)); + cards.add(new SetCardInfo("Demonic Tutor", 105, Rarity.UNCOMMON, mage.cards.d.DemonicTutor.class)); cards.add(new SetCardInfo("Dingus Egg", 242, Rarity.RARE, mage.cards.d.DingusEgg.class)); - cards.add(new SetCardInfo("Disenchant", 203, Rarity.COMMON, mage.cards.d.Disenchant.class)); + cards.add(new SetCardInfo("Disenchant", 19, Rarity.COMMON, mage.cards.d.Disenchant.class)); cards.add(new SetCardInfo("Disintegrate", 141, Rarity.COMMON, mage.cards.d.Disintegrate.class)); 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 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", 15, Rarity.COMMON, mage.cards.d.DrudgeSkeletons.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)); - cards.add(new SetCardInfo("Earthbind", 146, Rarity.COMMON, mage.cards.e.Earthbind.class)); cards.add(new SetCardInfo("Earth Elemental", 145, Rarity.UNCOMMON, mage.cards.e.EarthElemental.class)); + cards.add(new SetCardInfo("Earthbind", 146, Rarity.COMMON, mage.cards.e.Earthbind.class)); cards.add(new SetCardInfo("Earthquake", 147, Rarity.RARE, mage.cards.e.Earthquake.class)); - cards.add(new SetCardInfo("Elvish Archers", 100, Rarity.RARE, mage.cards.e.ElvishArchers.class)); - cards.add(new SetCardInfo("Evil Presence", 16, Rarity.UNCOMMON, mage.cards.e.EvilPresence.class)); + cards.add(new SetCardInfo("Elvish Archers", 192, Rarity.RARE, mage.cards.e.ElvishArchers.class)); + cards.add(new SetCardInfo("Evil Presence", 108, Rarity.UNCOMMON, mage.cards.e.EvilPresence.class)); cards.add(new SetCardInfo("False Orders", 148, Rarity.COMMON, mage.cards.f.FalseOrders.class)); - cards.add(new SetCardInfo("Farmstead", 204, Rarity.RARE, mage.cards.f.Farmstead.class)); - cards.add(new SetCardInfo("Fastbond", 101, Rarity.RARE, mage.cards.f.Fastbond.class)); - cards.add(new SetCardInfo("Fear", 17, Rarity.COMMON, mage.cards.f.Fear.class)); + cards.add(new SetCardInfo("Farmstead", 20, Rarity.RARE, mage.cards.f.Farmstead.class)); + cards.add(new SetCardInfo("Fastbond", 193, Rarity.RARE, mage.cards.f.Fastbond.class)); + cards.add(new SetCardInfo("Fear", 109, Rarity.COMMON, mage.cards.f.Fear.class)); cards.add(new SetCardInfo("Feedback", 58, Rarity.UNCOMMON, mage.cards.f.Feedback.class)); + cards.add(new SetCardInfo("Fire Elemental", 149, Rarity.UNCOMMON, mage.cards.f.FireElemental.class)); cards.add(new SetCardInfo("Fireball", 150, Rarity.COMMON, mage.cards.f.Fireball.class)); cards.add(new SetCardInfo("Firebreathing", 151, Rarity.COMMON, mage.cards.f.Firebreathing.class)); - cards.add(new SetCardInfo("Fire Elemental", 149, Rarity.UNCOMMON, mage.cards.f.FireElemental.class)); cards.add(new SetCardInfo("Flashfires", 152, Rarity.UNCOMMON, mage.cards.f.Flashfires.class)); cards.add(new SetCardInfo("Flight", 59, Rarity.COMMON, mage.cards.f.Flight.class)); - cards.add(new SetCardInfo("Fog", 102, Rarity.COMMON, mage.cards.f.Fog.class)); + cards.add(new SetCardInfo("Fog", 194, Rarity.COMMON, mage.cards.f.Fog.class)); + cards.add(new SetCardInfo("Force of Nature", 195, Rarity.RARE, mage.cards.f.ForceOfNature.class)); cards.add(new SetCardInfo("Forcefield", 244, Rarity.RARE, mage.cards.f.Forcefield.class)); - cards.add(new SetCardInfo("Force of Nature", 103, Rarity.RARE, mage.cards.f.ForceOfNature.class)); - cards.add(new SetCardInfo("Forest", 280, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Forest", 281, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Forest", 282, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 300, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 301, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 302, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Fork", 153, Rarity.RARE, mage.cards.f.Fork.class)); - cards.add(new SetCardInfo("Frozen Shade", 18, Rarity.COMMON, mage.cards.f.FrozenShade.class)); - cards.add(new SetCardInfo("Fungusaur", 104, Rarity.RARE, mage.cards.f.Fungusaur.class)); - cards.add(new SetCardInfo("Gaea's Liege", 105, Rarity.RARE, mage.cards.g.GaeasLiege.class)); + cards.add(new SetCardInfo("Frozen Shade", 110, Rarity.COMMON, mage.cards.f.FrozenShade.class)); + cards.add(new SetCardInfo("Fungusaur", 196, Rarity.RARE, mage.cards.f.Fungusaur.class)); + cards.add(new SetCardInfo("Gaea's Liege", 197, Rarity.RARE, mage.cards.g.GaeasLiege.class)); cards.add(new SetCardInfo("Gauntlet of Might", 245, Rarity.RARE, mage.cards.g.GauntletOfMight.class)); - cards.add(new SetCardInfo("Giant Growth", 106, Rarity.COMMON, mage.cards.g.GiantGrowth.class)); - cards.add(new SetCardInfo("Giant Spider", 107, Rarity.COMMON, mage.cards.g.GiantSpider.class)); + cards.add(new SetCardInfo("Giant Growth", 198, Rarity.COMMON, mage.cards.g.GiantGrowth.class)); + cards.add(new SetCardInfo("Giant Spider", 199, Rarity.COMMON, mage.cards.g.GiantSpider.class)); cards.add(new SetCardInfo("Glasses of Urza", 246, Rarity.UNCOMMON, mage.cards.g.GlassesOfUrza.class)); - cards.add(new SetCardInfo("Gloom", 19, Rarity.UNCOMMON, mage.cards.g.Gloom.class)); + cards.add(new SetCardInfo("Gloom", 111, Rarity.UNCOMMON, mage.cards.g.Gloom.class)); cards.add(new SetCardInfo("Goblin Balloon Brigade", 154, Rarity.UNCOMMON, mage.cards.g.GoblinBalloonBrigade.class)); cards.add(new SetCardInfo("Goblin King", 155, Rarity.RARE, mage.cards.g.GoblinKing.class)); cards.add(new SetCardInfo("Granite Gargoyle", 156, Rarity.RARE, mage.cards.g.GraniteGargoyle.class)); cards.add(new SetCardInfo("Gray Ogre", 157, Rarity.COMMON, mage.cards.g.GrayOgre.class)); - cards.add(new SetCardInfo("Green Ward", 205, Rarity.UNCOMMON, mage.cards.g.GreenWard.class)); - cards.add(new SetCardInfo("Grizzly Bears", 108, Rarity.COMMON, mage.cards.g.GrizzlyBears.class)); - cards.add(new SetCardInfo("Guardian Angel", 206, Rarity.COMMON, mage.cards.g.GuardianAngel.class)); - cards.add(new SetCardInfo("Healing Salve", 207, Rarity.COMMON, mage.cards.h.HealingSalve.class)); + cards.add(new SetCardInfo("Green Ward", 21, Rarity.UNCOMMON, mage.cards.g.GreenWard.class)); + cards.add(new SetCardInfo("Grizzly Bears", 200, Rarity.COMMON, mage.cards.g.GrizzlyBears.class)); + cards.add(new SetCardInfo("Guardian Angel", 22, Rarity.COMMON, mage.cards.g.GuardianAngel.class)); + cards.add(new SetCardInfo("Healing Salve", 23, Rarity.COMMON, mage.cards.h.HealingSalve.class)); cards.add(new SetCardInfo("Helm of Chatzuk", 247, Rarity.RARE, mage.cards.h.HelmOfChatzuk.class)); cards.add(new SetCardInfo("Hill Giant", 158, Rarity.COMMON, mage.cards.h.HillGiant.class)); - cards.add(new SetCardInfo("Holy Armor", 208, Rarity.COMMON, mage.cards.h.HolyArmor.class)); - cards.add(new SetCardInfo("Holy Strength", 209, Rarity.COMMON, mage.cards.h.HolyStrength.class)); - cards.add(new SetCardInfo("Howl from Beyond", 20, Rarity.COMMON, mage.cards.h.HowlFromBeyond.class)); + cards.add(new SetCardInfo("Holy Armor", 24, Rarity.COMMON, mage.cards.h.HolyArmor.class)); + cards.add(new SetCardInfo("Holy Strength", 25, Rarity.COMMON, mage.cards.h.HolyStrength.class)); + cards.add(new SetCardInfo("Howl from Beyond", 112, Rarity.COMMON, mage.cards.h.HowlFromBeyond.class)); cards.add(new SetCardInfo("Howling Mine", 248, Rarity.RARE, mage.cards.h.HowlingMine.class)); cards.add(new SetCardInfo("Hurloon Minotaur", 159, Rarity.COMMON, mage.cards.h.HurloonMinotaur.class)); - cards.add(new SetCardInfo("Hurricane", 109, Rarity.UNCOMMON, mage.cards.h.Hurricane.class)); - cards.add(new SetCardInfo("Hypnotic Specter", 21, Rarity.UNCOMMON, mage.cards.h.HypnoticSpecter.class)); - cards.add(new SetCardInfo("Ice Storm", 110, Rarity.UNCOMMON, mage.cards.i.IceStorm.class)); + cards.add(new SetCardInfo("Hurricane", 201, Rarity.UNCOMMON, mage.cards.h.Hurricane.class)); + cards.add(new SetCardInfo("Hypnotic Specter", 113, Rarity.UNCOMMON, mage.cards.h.HypnoticSpecter.class)); + cards.add(new SetCardInfo("Ice Storm", 202, Rarity.UNCOMMON, mage.cards.i.IceStorm.class)); cards.add(new SetCardInfo("Icy Manipulator", 249, Rarity.UNCOMMON, mage.cards.i.IcyManipulator.class)); - cards.add(new SetCardInfo("Instill Energy", 111, Rarity.UNCOMMON, mage.cards.i.InstillEnergy.class)); + cards.add(new SetCardInfo("Instill Energy", 203, Rarity.UNCOMMON, mage.cards.i.InstillEnergy.class)); cards.add(new SetCardInfo("Invisibility", 60, Rarity.COMMON, mage.cards.i.Invisibility.class)); - cards.add(new SetCardInfo("Ironclaw Orcs", 160, Rarity.COMMON, mage.cards.i.IronclawOrcs.class)); - cards.add(new SetCardInfo("Ironroot Treefolk", 112, Rarity.COMMON, mage.cards.i.IronrootTreefolk.class)); cards.add(new SetCardInfo("Iron Star", 251, Rarity.UNCOMMON, mage.cards.i.IronStar.class)); - cards.add(new SetCardInfo("Island", 283, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Island", 284, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Island", 285, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Island Sanctuary", 210, Rarity.RARE, mage.cards.i.IslandSanctuary.class)); + cards.add(new SetCardInfo("Ironclaw Orcs", 160, Rarity.COMMON, mage.cards.i.IronclawOrcs.class)); + cards.add(new SetCardInfo("Ironroot Treefolk", 204, Rarity.COMMON, mage.cards.i.IronrootTreefolk.class)); + cards.add(new SetCardInfo("Island Sanctuary", 26, Rarity.RARE, mage.cards.i.IslandSanctuary.class)); + cards.add(new SetCardInfo("Island", 291, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 292, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 293, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Ivory Cup", 252, Rarity.UNCOMMON, mage.cards.i.IvoryCup.class)); cards.add(new SetCardInfo("Jade Monolith", 253, Rarity.RARE, mage.cards.j.JadeMonolith.class)); cards.add(new SetCardInfo("Jade Statue", 254, Rarity.UNCOMMON, mage.cards.j.JadeStatue.class)); cards.add(new SetCardInfo("Jayemdae Tome", 255, Rarity.RARE, mage.cards.j.JayemdaeTome.class)); cards.add(new SetCardInfo("Juggernaut", 256, Rarity.UNCOMMON, mage.cards.j.Juggernaut.class)); cards.add(new SetCardInfo("Jump", 61, Rarity.COMMON, mage.cards.j.Jump.class)); - cards.add(new SetCardInfo("Karma", 211, Rarity.UNCOMMON, mage.cards.k.Karma.class)); + cards.add(new SetCardInfo("Karma", 27, Rarity.UNCOMMON, mage.cards.k.Karma.class)); cards.add(new SetCardInfo("Keldon Warlord", 161, Rarity.UNCOMMON, mage.cards.k.KeldonWarlord.class)); cards.add(new SetCardInfo("Kormus Bell", 257, Rarity.RARE, mage.cards.k.KormusBell.class)); - cards.add(new SetCardInfo("Kudzu", 113, Rarity.RARE, mage.cards.k.Kudzu.class)); - cards.add(new SetCardInfo("Lance", 212, Rarity.UNCOMMON, mage.cards.l.Lance.class)); - cards.add(new SetCardInfo("Ley Druid", 114, Rarity.UNCOMMON, mage.cards.l.LeyDruid.class)); + cards.add(new SetCardInfo("Kudzu", 205, Rarity.RARE, mage.cards.k.Kudzu.class)); + cards.add(new SetCardInfo("Lance", 28, Rarity.UNCOMMON, mage.cards.l.Lance.class)); + cards.add(new SetCardInfo("Ley Druid", 206, Rarity.UNCOMMON, mage.cards.l.LeyDruid.class)); cards.add(new SetCardInfo("Library of Leng", 258, Rarity.UNCOMMON, mage.cards.l.LibraryOfLeng.class)); - cards.add(new SetCardInfo("Lich", 22, Rarity.RARE, mage.cards.l.Lich.class)); - cards.add(new SetCardInfo("Lifeforce", 115, Rarity.UNCOMMON, mage.cards.l.Lifeforce.class)); - cards.add(new SetCardInfo("Lifelace", 116, Rarity.RARE, mage.cards.l.Lifelace.class)); + cards.add(new SetCardInfo("Lich", 114, Rarity.RARE, mage.cards.l.Lich.class)); + cards.add(new SetCardInfo("Lifeforce", 207, Rarity.UNCOMMON, mage.cards.l.Lifeforce.class)); + cards.add(new SetCardInfo("Lifelace", 208, Rarity.RARE, mage.cards.l.Lifelace.class)); cards.add(new SetCardInfo("Lifetap", 62, Rarity.UNCOMMON, mage.cards.l.Lifetap.class)); cards.add(new SetCardInfo("Lightning Bolt", 162, Rarity.COMMON, mage.cards.l.LightningBolt.class)); - cards.add(new SetCardInfo("Living Artifact", 117, Rarity.RARE, mage.cards.l.LivingArtifact.class)); - cards.add(new SetCardInfo("Living Lands", 118, Rarity.RARE, mage.cards.l.LivingLands.class)); + cards.add(new SetCardInfo("Living Artifact", 209, Rarity.RARE, mage.cards.l.LivingArtifact.class)); + cards.add(new SetCardInfo("Living Lands", 210, Rarity.RARE, mage.cards.l.LivingLands.class)); cards.add(new SetCardInfo("Living Wall", 259, Rarity.UNCOMMON, mage.cards.l.LivingWall.class)); - cards.add(new SetCardInfo("Llanowar Elves", 119, Rarity.COMMON, mage.cards.l.LlanowarElves.class)); + cards.add(new SetCardInfo("Llanowar Elves", 211, Rarity.COMMON, mage.cards.l.LlanowarElves.class)); cards.add(new SetCardInfo("Lord of Atlantis", 63, Rarity.RARE, mage.cards.l.LordOfAtlantis.class)); - cards.add(new SetCardInfo("Lord of the Pit", 23, Rarity.RARE, mage.cards.l.LordOfThePit.class)); - cards.add(new SetCardInfo("Lure", 120, Rarity.UNCOMMON, mage.cards.l.Lure.class)); + cards.add(new SetCardInfo("Lord of the Pit", 115, Rarity.RARE, mage.cards.l.LordOfThePit.class)); + cards.add(new SetCardInfo("Lure", 212, Rarity.UNCOMMON, mage.cards.l.Lure.class)); cards.add(new SetCardInfo("Mahamoti Djinn", 65, Rarity.RARE, mage.cards.m.MahamotiDjinn.class)); - cards.add(new SetCardInfo("Manabarbs", 164, Rarity.RARE, mage.cards.m.Manabarbs.class)); cards.add(new SetCardInfo("Mana Flare", 163, Rarity.RARE, mage.cards.m.ManaFlare.class)); cards.add(new SetCardInfo("Mana Short", 66, Rarity.RARE, mage.cards.m.ManaShort.class)); cards.add(new SetCardInfo("Mana Vault", 260, Rarity.RARE, mage.cards.m.ManaVault.class)); + cards.add(new SetCardInfo("Manabarbs", 164, Rarity.RARE, mage.cards.m.Manabarbs.class)); cards.add(new SetCardInfo("Meekstone", 261, Rarity.RARE, mage.cards.m.Meekstone.class)); cards.add(new SetCardInfo("Merfolk of the Pearl Trident", 67, Rarity.COMMON, mage.cards.m.MerfolkOfThePearlTrident.class)); - cards.add(new SetCardInfo("Mesa Pegasus", 213, Rarity.COMMON, mage.cards.m.MesaPegasus.class)); - cards.add(new SetCardInfo("Mind Twist", 24, Rarity.RARE, mage.cards.m.MindTwist.class)); + cards.add(new SetCardInfo("Mesa Pegasus", 29, Rarity.COMMON, mage.cards.m.MesaPegasus.class)); + cards.add(new SetCardInfo("Mind Twist", 116, Rarity.RARE, mage.cards.m.MindTwist.class)); cards.add(new SetCardInfo("Mons's Goblin Raiders", 165, Rarity.COMMON, mage.cards.m.MonssGoblinRaiders.class)); - cards.add(new SetCardInfo("Mountain", 286, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mountain", 287, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mountain", 288, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 297, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 298, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 299, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mox Emerald", 262, Rarity.RARE, mage.cards.m.MoxEmerald.class)); cards.add(new SetCardInfo("Mox Jet", 263, Rarity.RARE, mage.cards.m.MoxJet.class)); cards.add(new SetCardInfo("Mox Pearl", 264, Rarity.RARE, mage.cards.m.MoxPearl.class)); cards.add(new SetCardInfo("Mox Ruby", 265, Rarity.RARE, mage.cards.m.MoxRuby.class)); cards.add(new SetCardInfo("Mox Sapphire", 266, Rarity.RARE, mage.cards.m.MoxSapphire.class)); - cards.add(new SetCardInfo("Natural Selection", 121, Rarity.RARE, mage.cards.n.NaturalSelection.class)); - cards.add(new SetCardInfo("Nether Shadow", 25, Rarity.RARE, mage.cards.n.NetherShadow.class)); - cards.add(new SetCardInfo("Nettling Imp", 26, Rarity.UNCOMMON, mage.cards.n.NettlingImp.class)); + cards.add(new SetCardInfo("Natural Selection", 213, Rarity.RARE, mage.cards.n.NaturalSelection.class)); + cards.add(new SetCardInfo("Nether Shadow", 117, Rarity.RARE, mage.cards.n.NetherShadow.class)); + cards.add(new SetCardInfo("Nettling Imp", 118, Rarity.UNCOMMON, mage.cards.n.NettlingImp.class)); cards.add(new SetCardInfo("Nevinyrral's Disk", 267, Rarity.RARE, mage.cards.n.NevinyrralsDisk.class)); - cards.add(new SetCardInfo("Nightmare", 27, Rarity.RARE, mage.cards.n.Nightmare.class)); - cards.add(new SetCardInfo("Northern Paladin", 214, Rarity.RARE, mage.cards.n.NorthernPaladin.class)); + cards.add(new SetCardInfo("Nightmare", 119, Rarity.RARE, mage.cards.n.Nightmare.class)); + cards.add(new SetCardInfo("Northern Paladin", 30, Rarity.RARE, mage.cards.n.NorthernPaladin.class)); cards.add(new SetCardInfo("Obsianus Golem", 268, Rarity.UNCOMMON, mage.cards.o.ObsianusGolem.class)); cards.add(new SetCardInfo("Orcish Artillery", 166, Rarity.UNCOMMON, mage.cards.o.OrcishArtillery.class)); cards.add(new SetCardInfo("Orcish Oriflamme", 167, Rarity.UNCOMMON, mage.cards.o.OrcishOriflamme.class)); - cards.add(new SetCardInfo("Paralyze", 28, Rarity.COMMON, mage.cards.p.Paralyze.class)); - cards.add(new SetCardInfo("Pearled Unicorn", 215, Rarity.COMMON, mage.cards.p.PearledUnicorn.class)); - cards.add(new SetCardInfo("Personal Incarnation", 216, Rarity.RARE, mage.cards.p.PersonalIncarnation.class)); - cards.add(new SetCardInfo("Pestilence", 29, Rarity.COMMON, mage.cards.p.Pestilence.class)); + cards.add(new SetCardInfo("Paralyze", 120, Rarity.COMMON, mage.cards.p.Paralyze.class)); + cards.add(new SetCardInfo("Pearled Unicorn", 31, Rarity.COMMON, mage.cards.p.PearledUnicorn.class)); + cards.add(new SetCardInfo("Personal Incarnation", 32, Rarity.RARE, mage.cards.p.PersonalIncarnation.class)); + cards.add(new SetCardInfo("Pestilence", 121, Rarity.COMMON, mage.cards.p.Pestilence.class)); cards.add(new SetCardInfo("Phantasmal Forces", 68, Rarity.UNCOMMON, mage.cards.p.PhantasmalForces.class)); cards.add(new SetCardInfo("Phantasmal Terrain", 69, Rarity.COMMON, mage.cards.p.PhantasmalTerrain.class)); cards.add(new SetCardInfo("Phantom Monster", 70, Rarity.UNCOMMON, mage.cards.p.PhantomMonster.class)); cards.add(new SetCardInfo("Pirate Ship", 71, Rarity.RARE, mage.cards.p.PirateShip.class)); - cards.add(new SetCardInfo("Plague Rats", 30, Rarity.COMMON, mage.cards.p.PlagueRats.class)); + cards.add(new SetCardInfo("Plague Rats", 122, Rarity.COMMON, mage.cards.p.PlagueRats.class)); + cards.add(new SetCardInfo("Plains", 288, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Plains", 289, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Plains", 290, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Plains", 291, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Plateau", 292, Rarity.RARE, mage.cards.p.Plateau.class)); + cards.add(new SetCardInfo("Plateau", 280, Rarity.RARE, mage.cards.p.Plateau.class)); cards.add(new SetCardInfo("Power Leak", 72, Rarity.COMMON, mage.cards.p.PowerLeak.class)); cards.add(new SetCardInfo("Power Sink", 73, Rarity.COMMON, mage.cards.p.PowerSink.class)); cards.add(new SetCardInfo("Power Surge", 168, Rarity.RARE, mage.cards.p.PowerSurge.class)); cards.add(new SetCardInfo("Prodigal Sorcerer", 74, Rarity.COMMON, mage.cards.p.ProdigalSorcerer.class)); cards.add(new SetCardInfo("Psionic Blast", 75, Rarity.UNCOMMON, mage.cards.p.PsionicBlast.class)); cards.add(new SetCardInfo("Psychic Venom", 76, Rarity.COMMON, mage.cards.p.PsychicVenom.class)); - cards.add(new SetCardInfo("Purelace", 217, Rarity.RARE, mage.cards.p.Purelace.class)); + cards.add(new SetCardInfo("Purelace", 33, Rarity.RARE, mage.cards.p.Purelace.class)); cards.add(new SetCardInfo("Raging River", 169, Rarity.RARE, mage.cards.r.RagingRiver.class)); - cards.add(new SetCardInfo("Raise Dead", 31, Rarity.COMMON, mage.cards.r.RaiseDead.class)); + cards.add(new SetCardInfo("Raise Dead", 123, Rarity.COMMON, mage.cards.r.RaiseDead.class)); cards.add(new SetCardInfo("Red Elemental Blast", 170, Rarity.COMMON, mage.cards.r.RedElementalBlast.class)); - cards.add(new SetCardInfo("Red Ward", 218, Rarity.UNCOMMON, mage.cards.r.RedWard.class)); - cards.add(new SetCardInfo("Regeneration", 122, Rarity.COMMON, mage.cards.r.Regeneration.class)); - cards.add(new SetCardInfo("Regrowth", 123, Rarity.UNCOMMON, mage.cards.r.Regrowth.class)); - cards.add(new SetCardInfo("Resurrection", 219, Rarity.UNCOMMON, mage.cards.r.Resurrection.class)); - cards.add(new SetCardInfo("Reverse Damage", 220, Rarity.RARE, mage.cards.r.ReverseDamage.class)); - cards.add(new SetCardInfo("Righteousness", 221, Rarity.RARE, mage.cards.r.Righteousness.class)); + cards.add(new SetCardInfo("Red Ward", 34, Rarity.UNCOMMON, mage.cards.r.RedWard.class)); + cards.add(new SetCardInfo("Regeneration", 214, Rarity.COMMON, mage.cards.r.Regeneration.class)); + cards.add(new SetCardInfo("Regrowth", 215, Rarity.UNCOMMON, mage.cards.r.Regrowth.class)); + cards.add(new SetCardInfo("Resurrection", 35, Rarity.UNCOMMON, mage.cards.r.Resurrection.class)); + cards.add(new SetCardInfo("Reverse Damage", 36, Rarity.RARE, mage.cards.r.ReverseDamage.class)); + cards.add(new SetCardInfo("Righteousness", 37, Rarity.RARE, mage.cards.r.Righteousness.class)); cards.add(new SetCardInfo("Roc of Kher Ridges", 171, Rarity.RARE, mage.cards.r.RocOfKherRidges.class)); cards.add(new SetCardInfo("Rock Hydra", 172, Rarity.RARE, mage.cards.r.RockHydra.class)); cards.add(new SetCardInfo("Rod of Ruin", 269, Rarity.UNCOMMON, mage.cards.r.RodOfRuin.class)); - cards.add(new SetCardInfo("Royal Assassin", 32, Rarity.RARE, mage.cards.r.RoyalAssassin.class)); - cards.add(new SetCardInfo("Sacrifice", 33, Rarity.UNCOMMON, mage.cards.s.Sacrifice.class)); - cards.add(new SetCardInfo("Samite Healer", 222, Rarity.COMMON, mage.cards.s.SamiteHealer.class)); - cards.add(new SetCardInfo("Savannah", 293, Rarity.RARE, mage.cards.s.Savannah.class)); - cards.add(new SetCardInfo("Savannah Lions", 223, Rarity.RARE, mage.cards.s.SavannahLions.class)); - cards.add(new SetCardInfo("Scathe Zombies", 34, Rarity.COMMON, mage.cards.s.ScatheZombies.class)); - cards.add(new SetCardInfo("Scavenging Ghoul", 35, Rarity.UNCOMMON, mage.cards.s.ScavengingGhoul.class)); - cards.add(new SetCardInfo("Scrubland", 294, Rarity.RARE, mage.cards.s.Scrubland.class)); - cards.add(new SetCardInfo("Scryb Sprites", 124, Rarity.COMMON, mage.cards.s.ScrybSprites.class)); + cards.add(new SetCardInfo("Royal Assassin", 124, Rarity.RARE, mage.cards.r.RoyalAssassin.class)); + cards.add(new SetCardInfo("Sacrifice", 125, Rarity.UNCOMMON, mage.cards.s.Sacrifice.class)); + cards.add(new SetCardInfo("Samite Healer", 38, Rarity.COMMON, mage.cards.s.SamiteHealer.class)); + cards.add(new SetCardInfo("Savannah Lions", 39, Rarity.RARE, mage.cards.s.SavannahLions.class)); + cards.add(new SetCardInfo("Savannah", 281, Rarity.RARE, mage.cards.s.Savannah.class)); + cards.add(new SetCardInfo("Scathe Zombies", 126, Rarity.COMMON, mage.cards.s.ScatheZombies.class)); + cards.add(new SetCardInfo("Scavenging Ghoul", 127, Rarity.UNCOMMON, mage.cards.s.ScavengingGhoul.class)); + cards.add(new SetCardInfo("Scrubland", 282, Rarity.RARE, mage.cards.s.Scrubland.class)); + cards.add(new SetCardInfo("Scryb Sprites", 216, Rarity.COMMON, mage.cards.s.ScrybSprites.class)); cards.add(new SetCardInfo("Sea Serpent", 77, Rarity.COMMON, mage.cards.s.SeaSerpent.class)); cards.add(new SetCardInfo("Sedge Troll", 173, Rarity.RARE, mage.cards.s.SedgeTroll.class)); - cards.add(new SetCardInfo("Sengir Vampire", 36, Rarity.UNCOMMON, mage.cards.s.SengirVampire.class)); - cards.add(new SetCardInfo("Serra Angel", 224, Rarity.UNCOMMON, mage.cards.s.SerraAngel.class)); - cards.add(new SetCardInfo("Shanodin Dryads", 125, Rarity.COMMON, mage.cards.s.ShanodinDryads.class)); + cards.add(new SetCardInfo("Sengir Vampire", 128, Rarity.UNCOMMON, mage.cards.s.SengirVampire.class)); + cards.add(new SetCardInfo("Serra Angel", 40, Rarity.UNCOMMON, mage.cards.s.SerraAngel.class)); + cards.add(new SetCardInfo("Shanodin Dryads", 217, Rarity.COMMON, mage.cards.s.ShanodinDryads.class)); cards.add(new SetCardInfo("Shatter", 174, Rarity.COMMON, mage.cards.s.Shatter.class)); cards.add(new SetCardInfo("Shivan Dragon", 175, Rarity.RARE, mage.cards.s.ShivanDragon.class)); - cards.add(new SetCardInfo("Simulacrum", 37, Rarity.UNCOMMON, mage.cards.s.Simulacrum.class)); - cards.add(new SetCardInfo("Sinkhole", 38, Rarity.COMMON, mage.cards.s.Sinkhole.class)); + cards.add(new SetCardInfo("Simulacrum", 129, Rarity.UNCOMMON, mage.cards.s.Simulacrum.class)); + cards.add(new SetCardInfo("Sinkhole", 130, Rarity.COMMON, mage.cards.s.Sinkhole.class)); cards.add(new SetCardInfo("Siren's Call", 78, Rarity.UNCOMMON, mage.cards.s.SirensCall.class)); cards.add(new SetCardInfo("Smoke", 176, Rarity.RARE, mage.cards.s.Smoke.class)); cards.add(new SetCardInfo("Sol Ring", 270, Rarity.UNCOMMON, mage.cards.s.SolRing.class)); @@ -262,61 +262,61 @@ public class UnlimitedEdition extends ExpansionSet { cards.add(new SetCardInfo("Steal Artifact", 82, Rarity.UNCOMMON, mage.cards.s.StealArtifact.class)); cards.add(new SetCardInfo("Stone Giant", 177, Rarity.UNCOMMON, mage.cards.s.StoneGiant.class)); cards.add(new SetCardInfo("Stone Rain", 178, Rarity.COMMON, mage.cards.s.StoneRain.class)); - cards.add(new SetCardInfo("Stream of Life", 126, Rarity.COMMON, mage.cards.s.StreamOfLife.class)); + cards.add(new SetCardInfo("Stream of Life", 218, Rarity.COMMON, mage.cards.s.StreamOfLife.class)); cards.add(new SetCardInfo("Sunglasses of Urza", 272, Rarity.RARE, mage.cards.s.SunglassesOfUrza.class)); + cards.add(new SetCardInfo("Swamp", 294, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Swamp", 295, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Swamp", 296, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Swamp", 297, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Swords to Plowshares", 225, Rarity.UNCOMMON, mage.cards.s.SwordsToPlowshares.class)); - cards.add(new SetCardInfo("Taiga", 298, Rarity.RARE, mage.cards.t.Taiga.class)); - cards.add(new SetCardInfo("Terror", 39, Rarity.COMMON, mage.cards.t.Terror.class)); + cards.add(new SetCardInfo("Swords to Plowshares", 41, Rarity.UNCOMMON, mage.cards.s.SwordsToPlowshares.class)); + cards.add(new SetCardInfo("Taiga", 283, Rarity.RARE, mage.cards.t.Taiga.class)); + cards.add(new SetCardInfo("Terror", 131, Rarity.COMMON, mage.cards.t.Terror.class)); cards.add(new SetCardInfo("The Hive", 273, Rarity.RARE, mage.cards.t.TheHive.class)); - cards.add(new SetCardInfo("Thicket Basilisk", 127, Rarity.UNCOMMON, mage.cards.t.ThicketBasilisk.class)); + cards.add(new SetCardInfo("Thicket Basilisk", 219, Rarity.UNCOMMON, mage.cards.t.ThicketBasilisk.class)); cards.add(new SetCardInfo("Thoughtlace", 83, Rarity.RARE, mage.cards.t.Thoughtlace.class)); cards.add(new SetCardInfo("Throne of Bone", 274, Rarity.UNCOMMON, mage.cards.t.ThroneOfBone.class)); - cards.add(new SetCardInfo("Timber Wolves", 128, Rarity.RARE, mage.cards.t.TimberWolves.class)); - cards.add(new SetCardInfo("Timetwister", 85, Rarity.RARE, mage.cards.t.Timetwister.class)); + cards.add(new SetCardInfo("Timber Wolves", 220, Rarity.RARE, mage.cards.t.TimberWolves.class)); cards.add(new SetCardInfo("Time Vault", 275, Rarity.RARE, mage.cards.t.TimeVault.class)); cards.add(new SetCardInfo("Time Walk", 84, Rarity.RARE, mage.cards.t.TimeWalk.class)); - cards.add(new SetCardInfo("Tranquility", 129, Rarity.COMMON, mage.cards.t.Tranquility.class)); - cards.add(new SetCardInfo("Tropical Island", 299, Rarity.RARE, mage.cards.t.TropicalIsland.class)); - cards.add(new SetCardInfo("Tsunami", 130, Rarity.UNCOMMON, mage.cards.t.Tsunami.class)); - cards.add(new SetCardInfo("Tundra", 300, Rarity.RARE, mage.cards.t.Tundra.class)); + cards.add(new SetCardInfo("Timetwister", 85, Rarity.RARE, mage.cards.t.Timetwister.class)); + cards.add(new SetCardInfo("Tranquility", 221, Rarity.COMMON, mage.cards.t.Tranquility.class)); + cards.add(new SetCardInfo("Tropical Island", 284, Rarity.RARE, mage.cards.t.TropicalIsland.class)); + cards.add(new SetCardInfo("Tsunami", 222, Rarity.UNCOMMON, mage.cards.t.Tsunami.class)); + cards.add(new SetCardInfo("Tundra", 285, Rarity.RARE, mage.cards.t.Tundra.class)); cards.add(new SetCardInfo("Tunnel", 179, Rarity.UNCOMMON, mage.cards.t.Tunnel.class)); cards.add(new SetCardInfo("Twiddle", 86, Rarity.COMMON, mage.cards.t.Twiddle.class)); cards.add(new SetCardInfo("Two-Headed Giant of Foriys", 180, Rarity.RARE, mage.cards.t.TwoHeadedGiantOfForiys.class)); - cards.add(new SetCardInfo("Underground Sea", 301, Rarity.RARE, mage.cards.u.UndergroundSea.class)); - cards.add(new SetCardInfo("Unholy Strength", 40, Rarity.COMMON, mage.cards.u.UnholyStrength.class)); + cards.add(new SetCardInfo("Underground Sea", 286, Rarity.RARE, mage.cards.u.UndergroundSea.class)); + cards.add(new SetCardInfo("Unholy Strength", 132, Rarity.COMMON, mage.cards.u.UnholyStrength.class)); cards.add(new SetCardInfo("Unsummon", 87, Rarity.COMMON, mage.cards.u.Unsummon.class)); cards.add(new SetCardInfo("Uthden Troll", 181, Rarity.UNCOMMON, mage.cards.u.UthdenTroll.class)); - cards.add(new SetCardInfo("Verduran Enchantress", 131, Rarity.RARE, mage.cards.v.VerduranEnchantress.class)); + cards.add(new SetCardInfo("Verduran Enchantress", 223, Rarity.RARE, mage.cards.v.VerduranEnchantress.class)); cards.add(new SetCardInfo("Vesuvan Doppelganger", 88, Rarity.RARE, mage.cards.v.VesuvanDoppelganger.class)); - cards.add(new SetCardInfo("Veteran Bodyguard", 226, Rarity.RARE, mage.cards.v.VeteranBodyguard.class)); + cards.add(new SetCardInfo("Veteran Bodyguard", 42, Rarity.RARE, mage.cards.v.VeteranBodyguard.class)); cards.add(new SetCardInfo("Volcanic Eruption", 89, Rarity.RARE, mage.cards.v.VolcanicEruption.class)); - cards.add(new SetCardInfo("Volcanic Island", 302, Rarity.RARE, mage.cards.v.VolcanicIsland.class)); + cards.add(new SetCardInfo("Volcanic Island", 287, Rarity.RARE, mage.cards.v.VolcanicIsland.class)); cards.add(new SetCardInfo("Wall of Air", 90, Rarity.UNCOMMON, mage.cards.w.WallOfAir.class)); - cards.add(new SetCardInfo("Wall of Bone", 41, Rarity.UNCOMMON, mage.cards.w.WallOfBone.class)); - cards.add(new SetCardInfo("Wall of Brambles", 132, Rarity.UNCOMMON, mage.cards.w.WallOfBrambles.class)); + cards.add(new SetCardInfo("Wall of Bone", 133, Rarity.UNCOMMON, mage.cards.w.WallOfBone.class)); + cards.add(new SetCardInfo("Wall of Brambles", 224, Rarity.UNCOMMON, mage.cards.w.WallOfBrambles.class)); cards.add(new SetCardInfo("Wall of Fire", 182, Rarity.UNCOMMON, mage.cards.w.WallOfFire.class)); - cards.add(new SetCardInfo("Wall of Ice", 133, Rarity.UNCOMMON, mage.cards.w.WallOfIce.class)); + cards.add(new SetCardInfo("Wall of Ice", 225, Rarity.UNCOMMON, mage.cards.w.WallOfIce.class)); cards.add(new SetCardInfo("Wall of Stone", 183, Rarity.UNCOMMON, mage.cards.w.WallOfStone.class)); - cards.add(new SetCardInfo("Wall of Swords", 227, Rarity.UNCOMMON, mage.cards.w.WallOfSwords.class)); + cards.add(new SetCardInfo("Wall of Swords", 43, Rarity.UNCOMMON, mage.cards.w.WallOfSwords.class)); cards.add(new SetCardInfo("Wall of Water", 91, Rarity.UNCOMMON, mage.cards.w.WallOfWater.class)); - cards.add(new SetCardInfo("Wall of Wood", 134, Rarity.COMMON, mage.cards.w.WallOfWood.class)); - cards.add(new SetCardInfo("Wanderlust", 135, Rarity.UNCOMMON, mage.cards.w.Wanderlust.class)); - cards.add(new SetCardInfo("War Mammoth", 136, Rarity.COMMON, mage.cards.w.WarMammoth.class)); - cards.add(new SetCardInfo("Warp Artifact", 42, Rarity.RARE, mage.cards.w.WarpArtifact.class)); + cards.add(new SetCardInfo("Wall of Wood", 226, Rarity.COMMON, mage.cards.w.WallOfWood.class)); + cards.add(new SetCardInfo("Wanderlust", 227, Rarity.UNCOMMON, mage.cards.w.Wanderlust.class)); + cards.add(new SetCardInfo("War Mammoth", 228, Rarity.COMMON, mage.cards.w.WarMammoth.class)); + cards.add(new SetCardInfo("Warp Artifact", 134, Rarity.RARE, mage.cards.w.WarpArtifact.class)); cards.add(new SetCardInfo("Water Elemental", 92, Rarity.UNCOMMON, mage.cards.w.WaterElemental.class)); - cards.add(new SetCardInfo("Weakness", 43, Rarity.COMMON, mage.cards.w.Weakness.class)); - cards.add(new SetCardInfo("Web", 137, Rarity.RARE, mage.cards.w.Web.class)); + cards.add(new SetCardInfo("Weakness", 135, Rarity.COMMON, mage.cards.w.Weakness.class)); + cards.add(new SetCardInfo("Web", 229, Rarity.RARE, mage.cards.w.Web.class)); cards.add(new SetCardInfo("Wheel of Fortune", 184, Rarity.RARE, mage.cards.w.WheelOfFortune.class)); - cards.add(new SetCardInfo("White Knight", 228, Rarity.UNCOMMON, mage.cards.w.WhiteKnight.class)); - cards.add(new SetCardInfo("White Ward", 229, Rarity.UNCOMMON, mage.cards.w.WhiteWard.class)); - cards.add(new SetCardInfo("Wild Growth", 138, Rarity.COMMON, mage.cards.w.WildGrowth.class)); - cards.add(new SetCardInfo("Will-o'-the-Wisp", 44, Rarity.RARE, mage.cards.w.WillOTheWisp.class)); + cards.add(new SetCardInfo("White Knight", 44, Rarity.UNCOMMON, mage.cards.w.WhiteKnight.class)); + cards.add(new SetCardInfo("White Ward", 45, Rarity.UNCOMMON, mage.cards.w.WhiteWard.class)); + cards.add(new SetCardInfo("Wild Growth", 230, Rarity.COMMON, mage.cards.w.WildGrowth.class)); + cards.add(new SetCardInfo("Will-o'-the-Wisp", 136, Rarity.RARE, mage.cards.w.WillOTheWisp.class)); cards.add(new SetCardInfo("Winter Orb", 276, Rarity.RARE, mage.cards.w.WinterOrb.class)); cards.add(new SetCardInfo("Wooden Sphere", 277, Rarity.UNCOMMON, mage.cards.w.WoodenSphere.class)); - cards.add(new SetCardInfo("Wrath of God", 230, Rarity.RARE, mage.cards.w.WrathOfGod.class)); - cards.add(new SetCardInfo("Zombie Master", 46, Rarity.RARE, mage.cards.z.ZombieMaster.class)); + cards.add(new SetCardInfo("Wrath of God", 46, Rarity.RARE, mage.cards.w.WrathOfGod.class)); + cards.add(new SetCardInfo("Zombie Master", 138, Rarity.RARE, mage.cards.z.ZombieMaster.class)); } } From 558e271dfe70d717f74a3ee1e27dc8318585fe93 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Wed, 9 May 2018 03:22:36 +0400 Subject: [PATCH 097/158] Fixed card numbers in ARN - Arabian Nights (#4628) --- Mage.Sets/src/mage/sets/ArabianNights.java | 180 ++++++++++----------- 1 file changed, 90 insertions(+), 90 deletions(-) diff --git a/Mage.Sets/src/mage/sets/ArabianNights.java b/Mage.Sets/src/mage/sets/ArabianNights.java index 6affa052bfa..9e9d3f2dc7e 100644 --- a/Mage.Sets/src/mage/sets/ArabianNights.java +++ b/Mage.Sets/src/mage/sets/ArabianNights.java @@ -59,95 +59,95 @@ public class ArabianNights extends ExpansionSet { this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; - cards.add(new SetCardInfo("Abu Ja'far", 55, Rarity.UNCOMMON, mage.cards.a.AbuJafar.class)); - cards.add(new SetCardInfo("Aladdin", 42, Rarity.RARE, mage.cards.a.Aladdin.class)); - cards.add(new SetCardInfo("Aladdin's Lamp", 70, Rarity.RARE, mage.cards.a.AladdinsLamp.class)); - cards.add(new SetCardInfo("Aladdin's Ring", 71, Rarity.RARE, mage.cards.a.AladdinsRing.class)); - cards.add(new SetCardInfo("Ali Baba", 43, Rarity.UNCOMMON, mage.cards.a.AliBaba.class)); - cards.add(new SetCardInfo("Ali from Cairo", 44, Rarity.RARE, mage.cards.a.AliFromCairo.class)); - cards.add(new SetCardInfo("Army of Allah", 56, Rarity.COMMON, ArmyOfAllah.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Army of Allah", 57, Rarity.COMMON, ArmyOfAllah.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Bazaar of Baghdad", 84, Rarity.UNCOMMON, mage.cards.b.BazaarOfBaghdad.class)); - cards.add(new SetCardInfo("Bird Maiden", 45, Rarity.COMMON, mage.cards.b.BirdMaiden.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Bird Maiden", 46, Rarity.COMMON, mage.cards.b.BirdMaiden.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Bottle of Suleiman", 72, Rarity.RARE, mage.cards.b.BottleOfSuleiman.class)); - cards.add(new SetCardInfo("Brass Man", 73, Rarity.UNCOMMON, mage.cards.b.BrassMan.class)); - cards.add(new SetCardInfo("Camel", 58, Rarity.COMMON, mage.cards.c.Camel.class)); - cards.add(new SetCardInfo("City in a Bottle", 74, Rarity.RARE, mage.cards.c.CityInABottle.class)); - cards.add(new SetCardInfo("City of Brass", 85, Rarity.UNCOMMON, mage.cards.c.CityOfBrass.class)); - cards.add(new SetCardInfo("Cuombajj Witches", 1, Rarity.COMMON, mage.cards.c.CuombajjWitches.class)); - cards.add(new SetCardInfo("Cyclone", 29, Rarity.UNCOMMON, mage.cards.c.Cyclone.class)); - cards.add(new SetCardInfo("Dancing Scimitar", 75, Rarity.RARE, mage.cards.d.DancingScimitar.class)); - cards.add(new SetCardInfo("Dandan", 16, Rarity.COMMON, mage.cards.d.Dandan.class)); - cards.add(new SetCardInfo("Desert", 86, Rarity.COMMON, mage.cards.d.Desert.class)); - cards.add(new SetCardInfo("Desert Nomads", 47, Rarity.COMMON, mage.cards.d.DesertNomads.class)); - cards.add(new SetCardInfo("Desert Twister", 30, Rarity.UNCOMMON, mage.cards.d.DesertTwister.class)); - cards.add(new SetCardInfo("Diamond Valley", 87, Rarity.UNCOMMON, mage.cards.d.DiamondValley.class)); - cards.add(new SetCardInfo("Drop of Honey", 31, Rarity.RARE, mage.cards.d.DropOfHoney.class)); - cards.add(new SetCardInfo("Ebony Horse", 76, Rarity.RARE, mage.cards.e.EbonyHorse.class)); - cards.add(new SetCardInfo("Elephant Graveyard", 88, Rarity.RARE, mage.cards.e.ElephantGraveyard.class)); - cards.add(new SetCardInfo("El-Hajjaj", 2, Rarity.RARE, mage.cards.e.ElHajjaj.class)); - cards.add(new SetCardInfo("Erg Raiders", 3, Rarity.COMMON, mage.cards.e.ErgRaiders.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Erg Raiders", 4, Rarity.COMMON, mage.cards.e.ErgRaiders.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Erhnam Djinn", 32, Rarity.RARE, mage.cards.e.ErhnamDjinn.class)); - cards.add(new SetCardInfo("Eye for an Eye", 59, Rarity.UNCOMMON, mage.cards.e.EyeForAnEye.class)); - cards.add(new SetCardInfo("Fishliver Oil", 17, Rarity.COMMON, FishliverOil.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Fishliver Oil", 18, Rarity.COMMON, FishliverOil.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Flying Carpet", 77, Rarity.UNCOMMON, mage.cards.f.FlyingCarpet.class)); - cards.add(new SetCardInfo("Flying Men", 19, Rarity.COMMON, mage.cards.f.FlyingMen.class)); - cards.add(new SetCardInfo("Ghazban Ogre", 33, Rarity.COMMON, mage.cards.g.GhazbanOgre.class)); - cards.add(new SetCardInfo("Giant Tortoise", 20, Rarity.COMMON, mage.cards.g.GiantTortoise.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Giant Tortoise", 21, Rarity.COMMON, mage.cards.g.GiantTortoise.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Guardian Beast", 5, Rarity.RARE, mage.cards.g.GuardianBeast.class)); - cards.add(new SetCardInfo("Hasran Ogress", 6, Rarity.COMMON, mage.cards.h.HasranOgress.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Hasran Ogress", 7, Rarity.COMMON, mage.cards.h.HasranOgress.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Hurr Jackal", 48, Rarity.COMMON, mage.cards.h.HurrJackal.class)); - cards.add(new SetCardInfo("Ifh-Biff Efreet", 34, Rarity.RARE, mage.cards.i.IfhBiffEfreet.class)); - cards.add(new SetCardInfo("Island Fish Jasconius", 22, Rarity.RARE, mage.cards.i.IslandFishJasconius.class)); - cards.add(new SetCardInfo("Island of Wak-Wak", 89, Rarity.RARE, mage.cards.i.IslandOfWakWak.class)); - cards.add(new SetCardInfo("Jandor's Ring", 78, Rarity.RARE, mage.cards.j.JandorsRing.class)); - cards.add(new SetCardInfo("Jandor's Saddlebags", 79, Rarity.RARE, mage.cards.j.JandorsSaddlebags.class)); - cards.add(new SetCardInfo("Jihad", 60, Rarity.RARE, mage.cards.j.Jihad.class)); - cards.add(new SetCardInfo("Junún Efreet", 8, Rarity.RARE, mage.cards.j.JununEfreet.class)); - cards.add(new SetCardInfo("Juzam Djinn", 9, Rarity.RARE, mage.cards.j.JuzamDjinn.class)); - cards.add(new SetCardInfo("Khabal Ghoul", 10, Rarity.UNCOMMON, mage.cards.k.KhabalGhoul.class)); - cards.add(new SetCardInfo("King Suleiman", 61, Rarity.RARE, mage.cards.k.KingSuleiman.class)); - cards.add(new SetCardInfo("Kird Ape", 49, Rarity.COMMON, mage.cards.k.KirdApe.class)); - cards.add(new SetCardInfo("Library of Alexandria", 90, Rarity.UNCOMMON, mage.cards.l.LibraryOfAlexandria.class)); - cards.add(new SetCardInfo("Magnetic Mountain", 50, Rarity.UNCOMMON, mage.cards.m.MagneticMountain.class)); - cards.add(new SetCardInfo("Merchant Ship", 23, Rarity.UNCOMMON, mage.cards.m.MerchantShip.class)); - cards.add(new SetCardInfo("Metamorphosis", 35, Rarity.COMMON, mage.cards.m.Metamorphosis.class)); - cards.add(new SetCardInfo("Mijae Djinn", 51, Rarity.RARE, mage.cards.m.MijaeDjinn.class)); - cards.add(new SetCardInfo("Moorish Cavalry", 62, Rarity.COMMON, mage.cards.m.MoorishCavalry.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Moorish Cavalry", 63, Rarity.COMMON, mage.cards.m.MoorishCavalry.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mountain", 91, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Nafs Asp", 36, Rarity.COMMON, NafsAsp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Nafs Asp", 37, Rarity.COMMON, NafsAsp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Oasis", 92, Rarity.UNCOMMON, mage.cards.o.Oasis.class)); - cards.add(new SetCardInfo("Old Man of the Sea", 24, Rarity.RARE, mage.cards.o.OldManOfTheSea.class)); - cards.add(new SetCardInfo("Oubliette", 11, Rarity.COMMON, Oubliette.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Oubliette", 12, Rarity.COMMON, Oubliette.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Piety", 64, Rarity.COMMON, Piety.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Piety", 65, Rarity.COMMON, Piety.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Pyramids", 81, Rarity.RARE, mage.cards.p.Pyramids.class)); - cards.add(new SetCardInfo("Repentant Blacksmith", 66, Rarity.RARE, mage.cards.r.RepentantBlacksmith.class)); - cards.add(new SetCardInfo("Ring of Ma'ruf", 82, Rarity.RARE, mage.cards.r.RingOfMaruf.class)); - cards.add(new SetCardInfo("Rukh Egg", 52, Rarity.COMMON, RukhEgg.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Rukh Egg", 53, Rarity.COMMON, RukhEgg.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Sandals of Abdallah", 83, Rarity.UNCOMMON, mage.cards.s.SandalsOfAbdallah.class)); - cards.add(new SetCardInfo("Sandstorm", 38, Rarity.COMMON, mage.cards.s.Sandstorm.class)); - cards.add(new SetCardInfo("Serendib Djinn", 25, Rarity.RARE, mage.cards.s.SerendibDjinn.class)); - cards.add(new SetCardInfo("Serendib Efreet", 26, Rarity.RARE, mage.cards.s.SerendibEfreet.class)); - cards.add(new SetCardInfo("Sindbad", 27, Rarity.UNCOMMON, mage.cards.s.Sindbad.class)); - cards.add(new SetCardInfo("Singing Tree", 39, Rarity.RARE, mage.cards.s.SingingTree.class)); - cards.add(new SetCardInfo("Sorceress Queen", 13, Rarity.UNCOMMON, mage.cards.s.SorceressQueen.class)); - cards.add(new SetCardInfo("Stone-Throwing Devils", 14, Rarity.COMMON, StoneThrowingDevils.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Stone-Throwing Devils", 15, Rarity.COMMON, StoneThrowingDevils.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Unstable Mutation", 28, Rarity.COMMON, mage.cards.u.UnstableMutation.class)); - cards.add(new SetCardInfo("War Elephant", 68, Rarity.COMMON, mage.cards.w.WarElephant.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("War Elephant", 69, Rarity.COMMON, mage.cards.w.WarElephant.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Wyluli Wolf", 40, Rarity.COMMON, mage.cards.w.WyluliWolf.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Wyluli Wolf", 41, Rarity.COMMON, mage.cards.w.WyluliWolf.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Ydwen Efreet", 54, Rarity.RARE, mage.cards.y.YdwenEfreet.class)); + cards.add(new SetCardInfo("Abu Ja'far", 1, Rarity.UNCOMMON, mage.cards.a.AbuJafar.class)); + cards.add(new SetCardInfo("Aladdin", 34, Rarity.RARE, mage.cards.a.Aladdin.class)); + cards.add(new SetCardInfo("Aladdin's Lamp", 56, Rarity.RARE, mage.cards.a.AladdinsLamp.class)); + cards.add(new SetCardInfo("Aladdin's Ring", 57, Rarity.RARE, mage.cards.a.AladdinsRing.class)); + cards.add(new SetCardInfo("Ali Baba", 35, Rarity.UNCOMMON, mage.cards.a.AliBaba.class)); + cards.add(new SetCardInfo("Ali from Cairo", 36, Rarity.RARE, mage.cards.a.AliFromCairo.class)); + cards.add(new SetCardInfo("Army of Allah", "2a", Rarity.COMMON, ArmyOfAllah.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Army of Allah", "2b", Rarity.COMMON, ArmyOfAllah.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Bazaar of Baghdad", 70, Rarity.UNCOMMON, mage.cards.b.BazaarOfBaghdad.class)); + cards.add(new SetCardInfo("Bird Maiden", "37a", Rarity.COMMON, mage.cards.b.BirdMaiden.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Bird Maiden", "37b", Rarity.COMMON, mage.cards.b.BirdMaiden.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Bottle of Suleiman", 58, Rarity.RARE, mage.cards.b.BottleOfSuleiman.class)); + cards.add(new SetCardInfo("Brass Man", 59, Rarity.UNCOMMON, mage.cards.b.BrassMan.class)); + cards.add(new SetCardInfo("Camel", 3, Rarity.COMMON, mage.cards.c.Camel.class)); + cards.add(new SetCardInfo("City in a Bottle", 60, Rarity.RARE, mage.cards.c.CityInABottle.class)); + cards.add(new SetCardInfo("City of Brass", 71, Rarity.UNCOMMON, mage.cards.c.CityOfBrass.class)); + cards.add(new SetCardInfo("Cuombajj Witches", 23, Rarity.COMMON, mage.cards.c.CuombajjWitches.class)); + cards.add(new SetCardInfo("Cyclone", 45, Rarity.UNCOMMON, mage.cards.c.Cyclone.class)); + cards.add(new SetCardInfo("Dancing Scimitar", 61, Rarity.RARE, mage.cards.d.DancingScimitar.class)); + cards.add(new SetCardInfo("Dandan", 12, Rarity.COMMON, mage.cards.d.Dandan.class)); + cards.add(new SetCardInfo("Desert Nomads", 38, Rarity.COMMON, mage.cards.d.DesertNomads.class)); + cards.add(new SetCardInfo("Desert Twister", 46, Rarity.UNCOMMON, mage.cards.d.DesertTwister.class)); + cards.add(new SetCardInfo("Desert", 72, Rarity.COMMON, mage.cards.d.Desert.class)); + cards.add(new SetCardInfo("Diamond Valley", 73, Rarity.UNCOMMON, mage.cards.d.DiamondValley.class)); + cards.add(new SetCardInfo("Drop of Honey", 47, Rarity.RARE, mage.cards.d.DropOfHoney.class)); + cards.add(new SetCardInfo("Ebony Horse", 62, Rarity.RARE, mage.cards.e.EbonyHorse.class)); + cards.add(new SetCardInfo("El-Hajjaj", 24, Rarity.RARE, mage.cards.e.ElHajjaj.class)); + cards.add(new SetCardInfo("Elephant Graveyard", 74, Rarity.RARE, mage.cards.e.ElephantGraveyard.class)); + cards.add(new SetCardInfo("Erg Raiders", "25a", Rarity.COMMON, mage.cards.e.ErgRaiders.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Erg Raiders", "25b", Rarity.COMMON, mage.cards.e.ErgRaiders.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Erhnam Djinn", 48, Rarity.RARE, mage.cards.e.ErhnamDjinn.class)); + cards.add(new SetCardInfo("Eye for an Eye", 4, Rarity.UNCOMMON, mage.cards.e.EyeForAnEye.class)); + cards.add(new SetCardInfo("Fishliver Oil", "13a", Rarity.COMMON, FishliverOil.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Fishliver Oil", "13b", Rarity.COMMON, FishliverOil.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Flying Carpet", 63, Rarity.UNCOMMON, mage.cards.f.FlyingCarpet.class)); + cards.add(new SetCardInfo("Flying Men", 14, Rarity.COMMON, mage.cards.f.FlyingMen.class)); + cards.add(new SetCardInfo("Ghazban Ogre", 49, Rarity.COMMON, mage.cards.g.GhazbanOgre.class)); + cards.add(new SetCardInfo("Giant Tortoise", "15a", Rarity.COMMON, mage.cards.g.GiantTortoise.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Giant Tortoise", "15b", Rarity.COMMON, mage.cards.g.GiantTortoise.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Guardian Beast", 26, Rarity.RARE, mage.cards.g.GuardianBeast.class)); + cards.add(new SetCardInfo("Hasran Ogress", "27a", Rarity.COMMON, mage.cards.h.HasranOgress.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Hasran Ogress", "27b", Rarity.COMMON, mage.cards.h.HasranOgress.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Hurr Jackal", 39, Rarity.COMMON, mage.cards.h.HurrJackal.class)); + cards.add(new SetCardInfo("Ifh-Biff Efreet", 50, Rarity.RARE, mage.cards.i.IfhBiffEfreet.class)); + cards.add(new SetCardInfo("Island Fish Jasconius", 16, Rarity.RARE, mage.cards.i.IslandFishJasconius.class)); + cards.add(new SetCardInfo("Island of Wak-Wak", 75, Rarity.RARE, mage.cards.i.IslandOfWakWak.class)); + cards.add(new SetCardInfo("Jandor's Ring", 64, Rarity.RARE, mage.cards.j.JandorsRing.class)); + cards.add(new SetCardInfo("Jandor's Saddlebags", 65, Rarity.RARE, mage.cards.j.JandorsSaddlebags.class)); + cards.add(new SetCardInfo("Jihad", 5, Rarity.RARE, mage.cards.j.Jihad.class)); + cards.add(new SetCardInfo("Junún Efreet", 28, Rarity.RARE, mage.cards.j.JununEfreet.class)); + cards.add(new SetCardInfo("Juzam Djinn", 29, Rarity.RARE, mage.cards.j.JuzamDjinn.class)); + cards.add(new SetCardInfo("Khabal Ghoul", 30, Rarity.UNCOMMON, mage.cards.k.KhabalGhoul.class)); + cards.add(new SetCardInfo("King Suleiman", 6, Rarity.RARE, mage.cards.k.KingSuleiman.class)); + cards.add(new SetCardInfo("Kird Ape", 40, Rarity.COMMON, mage.cards.k.KirdApe.class)); + cards.add(new SetCardInfo("Library of Alexandria", 76, Rarity.UNCOMMON, mage.cards.l.LibraryOfAlexandria.class)); + cards.add(new SetCardInfo("Magnetic Mountain", 41, Rarity.UNCOMMON, mage.cards.m.MagneticMountain.class)); + cards.add(new SetCardInfo("Merchant Ship", 17, Rarity.UNCOMMON, mage.cards.m.MerchantShip.class)); + cards.add(new SetCardInfo("Metamorphosis", 51, Rarity.COMMON, mage.cards.m.Metamorphosis.class)); + cards.add(new SetCardInfo("Mijae Djinn", 42, Rarity.RARE, mage.cards.m.MijaeDjinn.class)); + cards.add(new SetCardInfo("Moorish Cavalry", "7a", Rarity.COMMON, mage.cards.m.MoorishCavalry.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Moorish Cavalry", "7b", Rarity.COMMON, mage.cards.m.MoorishCavalry.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 77, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Nafs Asp", "52a", Rarity.COMMON, NafsAsp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Nafs Asp", "52b", Rarity.COMMON, NafsAsp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Oasis", 78, Rarity.UNCOMMON, mage.cards.o.Oasis.class)); + cards.add(new SetCardInfo("Old Man of the Sea", 18, Rarity.RARE, mage.cards.o.OldManOfTheSea.class)); + cards.add(new SetCardInfo("Oubliette", "31a", Rarity.COMMON, Oubliette.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Oubliette", "31b", Rarity.COMMON, Oubliette.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Piety", "8a", Rarity.COMMON, Piety.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Piety", "8b", Rarity.COMMON, Piety.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Pyramids", 67, Rarity.RARE, mage.cards.p.Pyramids.class)); + cards.add(new SetCardInfo("Repentant Blacksmith", 9, Rarity.RARE, mage.cards.r.RepentantBlacksmith.class)); + cards.add(new SetCardInfo("Ring of Ma'ruf", 68, Rarity.RARE, mage.cards.r.RingOfMaruf.class)); + cards.add(new SetCardInfo("Rukh Egg", "43a", Rarity.COMMON, RukhEgg.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Rukh Egg", "43b", Rarity.COMMON, RukhEgg.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Sandals of Abdallah", 69, Rarity.UNCOMMON, mage.cards.s.SandalsOfAbdallah.class)); + cards.add(new SetCardInfo("Sandstorm", 53, Rarity.COMMON, mage.cards.s.Sandstorm.class)); + cards.add(new SetCardInfo("Serendib Djinn", 19, Rarity.RARE, mage.cards.s.SerendibDjinn.class)); + cards.add(new SetCardInfo("Serendib Efreet", 20, Rarity.RARE, mage.cards.s.SerendibEfreet.class)); + cards.add(new SetCardInfo("Sindbad", 21, Rarity.UNCOMMON, mage.cards.s.Sindbad.class)); + cards.add(new SetCardInfo("Singing Tree", 54, Rarity.RARE, mage.cards.s.SingingTree.class)); + cards.add(new SetCardInfo("Sorceress Queen", 32, Rarity.UNCOMMON, mage.cards.s.SorceressQueen.class)); + cards.add(new SetCardInfo("Stone-Throwing Devils", "33a", Rarity.COMMON, StoneThrowingDevils.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Stone-Throwing Devils", "33b", Rarity.COMMON, StoneThrowingDevils.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Unstable Mutation", 22, Rarity.COMMON, mage.cards.u.UnstableMutation.class)); + cards.add(new SetCardInfo("War Elephant", "11a", Rarity.COMMON, mage.cards.w.WarElephant.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("War Elephant", "11b", Rarity.COMMON, mage.cards.w.WarElephant.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Wyluli Wolf", "55a", Rarity.COMMON, mage.cards.w.WyluliWolf.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Wyluli Wolf", "55b", Rarity.COMMON, mage.cards.w.WyluliWolf.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Ydwen Efreet", 44, Rarity.RARE, mage.cards.y.YdwenEfreet.class)); } } From 6673ca7d9e37fd37161a30c06f7bf3ca34261571 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Wed, 9 May 2018 03:24:11 +0400 Subject: [PATCH 098/158] Fixed card numbers in ATQ - Antiquities (#4628) --- Mage.Sets/src/mage/sets/Antiquities.java | 198 +++++++++++------------ 1 file changed, 99 insertions(+), 99 deletions(-) diff --git a/Mage.Sets/src/mage/sets/Antiquities.java b/Mage.Sets/src/mage/sets/Antiquities.java index 80b2acc03fe..6396acc95cc 100644 --- a/Mage.Sets/src/mage/sets/Antiquities.java +++ b/Mage.Sets/src/mage/sets/Antiquities.java @@ -52,104 +52,104 @@ public class Antiquities extends ExpansionSet { this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; - cards.add(new SetCardInfo("Amulet of Kroog", 1, Rarity.COMMON, mage.cards.a.AmuletOfKroog.class)); - cards.add(new SetCardInfo("Argivian Archaeologist", 94, Rarity.RARE, mage.cards.a.ArgivianArchaeologist.class)); - cards.add(new SetCardInfo("Argivian Blacksmith", 95, Rarity.COMMON, mage.cards.a.ArgivianBlacksmith.class)); - cards.add(new SetCardInfo("Argothian Pixies", 59, Rarity.COMMON, mage.cards.a.ArgothianPixies.class)); - cards.add(new SetCardInfo("Argothian Treefolk", 60, Rarity.COMMON, mage.cards.a.ArgothianTreefolk.class)); - cards.add(new SetCardInfo("Armageddon Clock", 2, Rarity.UNCOMMON, mage.cards.a.ArmageddonClock.class)); - cards.add(new SetCardInfo("Artifact Blast", 87, Rarity.COMMON, mage.cards.a.ArtifactBlast.class)); - cards.add(new SetCardInfo("Artifact Possession", 45, Rarity.COMMON, mage.cards.a.ArtifactPossession.class)); - cards.add(new SetCardInfo("Artifact Ward", 96, Rarity.COMMON, mage.cards.a.ArtifactWard.class)); - cards.add(new SetCardInfo("Ashnod's Altar", 3, Rarity.UNCOMMON, mage.cards.a.AshnodsAltar.class)); - cards.add(new SetCardInfo("Ashnod's Battle Gear", 4, Rarity.UNCOMMON, mage.cards.a.AshnodsBattleGear.class)); - cards.add(new SetCardInfo("Ashnod's Transmogrant", 5, Rarity.UNCOMMON, mage.cards.a.AshnodsTransmogrant.class)); - cards.add(new SetCardInfo("Atog", 88, Rarity.COMMON, mage.cards.a.Atog.class)); - cards.add(new SetCardInfo("Battering Ram", 6, Rarity.COMMON, mage.cards.b.BatteringRam.class)); - cards.add(new SetCardInfo("Candelabra of Tawnos", 8, Rarity.RARE, mage.cards.c.CandelabraOfTawnos.class)); - cards.add(new SetCardInfo("Circle of Protection: Artifacts", 97, Rarity.COMMON, mage.cards.c.CircleOfProtectionArtifacts.class)); - cards.add(new SetCardInfo("Citanul Druid", 61, Rarity.UNCOMMON, mage.cards.c.CitanulDruid.class)); - cards.add(new SetCardInfo("Clay Statue", 9, Rarity.COMMON, mage.cards.c.ClayStatue.class)); - cards.add(new SetCardInfo("Clockwork Avian", 10, Rarity.RARE, mage.cards.c.ClockworkAvian.class)); - cards.add(new SetCardInfo("Colossus of Sardia", 11, Rarity.RARE, mage.cards.c.ColossusOfSardia.class)); - cards.add(new SetCardInfo("Coral Helm", 12, Rarity.RARE, mage.cards.c.CoralHelm.class)); - cards.add(new SetCardInfo("Crumble", 62, Rarity.COMMON, mage.cards.c.Crumble.class)); - cards.add(new SetCardInfo("Cursed Rack", 13, Rarity.UNCOMMON, mage.cards.c.CursedRack.class)); - cards.add(new SetCardInfo("Damping Field", 98, Rarity.UNCOMMON, mage.cards.d.DampingField.class)); - cards.add(new SetCardInfo("Detonate", 89, Rarity.UNCOMMON, mage.cards.d.Detonate.class)); - cards.add(new SetCardInfo("Drafna's Restoration", 52, Rarity.COMMON, mage.cards.d.DrafnasRestoration.class)); - cards.add(new SetCardInfo("Dragon Engine", 14, Rarity.COMMON, mage.cards.d.DragonEngine.class)); - cards.add(new SetCardInfo("Dwarven Weaponsmith", 90, Rarity.UNCOMMON, mage.cards.d.DwarvenWeaponsmith.class)); - cards.add(new SetCardInfo("Energy Flux", 53, Rarity.UNCOMMON, mage.cards.e.EnergyFlux.class)); - cards.add(new SetCardInfo("Feldon's Cane", 15, Rarity.UNCOMMON, mage.cards.f.FeldonsCane.class)); - cards.add(new SetCardInfo("Gaea's Avenger", 63, Rarity.RARE, mage.cards.g.GaeasAvenger.class)); - cards.add(new SetCardInfo("Gate to Phyrexia", 46, Rarity.UNCOMMON, mage.cards.g.GateToPhyrexia.class)); - cards.add(new SetCardInfo("Goblin Artisans", 91, Rarity.UNCOMMON, mage.cards.g.GoblinArtisans.class)); - cards.add(new SetCardInfo("Golgothian Sylex", 16, Rarity.RARE, mage.cards.g.GolgothianSylex.class)); - cards.add(new SetCardInfo("Grapeshot Catapult", 17, Rarity.COMMON, mage.cards.g.GrapeshotCatapult.class)); - cards.add(new SetCardInfo("Haunting Wind", 47, Rarity.UNCOMMON, mage.cards.h.HauntingWind.class)); - cards.add(new SetCardInfo("Hurkyl's Recall", 54, Rarity.RARE, mage.cards.h.HurkylsRecall.class)); - cards.add(new SetCardInfo("Ivory Tower", 18, Rarity.UNCOMMON, mage.cards.i.IvoryTower.class)); - cards.add(new SetCardInfo("Jalum Tome", 19, Rarity.UNCOMMON, mage.cards.j.JalumTome.class)); - cards.add(new SetCardInfo("Martyrs of Korlis", 99, Rarity.UNCOMMON, mage.cards.m.MartyrsOfKorlis.class)); - cards.add(new SetCardInfo("Mightstone", 20, Rarity.UNCOMMON, mage.cards.m.Mightstone.class)); - cards.add(new SetCardInfo("Millstone", 21, Rarity.UNCOMMON, mage.cards.m.Millstone.class)); - cards.add(new SetCardInfo("Mishra's Factory", 66, Rarity.UNCOMMON, mage.cards.m.MishrasFactory.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mishra's Factory", 67, Rarity.UNCOMMON, mage.cards.m.MishrasFactory.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mishra's Factory", 68, Rarity.UNCOMMON, mage.cards.m.MishrasFactory.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mishra's Factory", 69, Rarity.UNCOMMON, mage.cards.m.MishrasFactory.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mishra's War Machine", 22, Rarity.RARE, mage.cards.m.MishrasWarMachine.class)); - cards.add(new SetCardInfo("Mishra's Workshop", 70, Rarity.RARE, mage.cards.m.MishrasWorkshop.class)); - cards.add(new SetCardInfo("Obelisk of Undoing", 23, Rarity.RARE, mage.cards.o.ObeliskOfUndoing.class)); - cards.add(new SetCardInfo("Onulet", 24, Rarity.UNCOMMON, mage.cards.o.Onulet.class)); - cards.add(new SetCardInfo("Orcish Mechanics", 92, Rarity.COMMON, mage.cards.o.OrcishMechanics.class)); - cards.add(new SetCardInfo("Ornithopter", 25, Rarity.COMMON, mage.cards.o.Ornithopter.class)); - cards.add(new SetCardInfo("Phyrexian Gremlins", 48, Rarity.COMMON, mage.cards.p.PhyrexianGremlins.class)); - cards.add(new SetCardInfo("Power Artifact", 55, Rarity.UNCOMMON, mage.cards.p.PowerArtifact.class)); - cards.add(new SetCardInfo("Powerleech", 64, Rarity.UNCOMMON, mage.cards.p.Powerleech.class)); - cards.add(new SetCardInfo("Priest of Yawgmoth", 49, Rarity.COMMON, mage.cards.p.PriestOfYawgmoth.class)); - cards.add(new SetCardInfo("Primal Clay", 26, Rarity.UNCOMMON, mage.cards.p.PrimalClay.class)); - cards.add(new SetCardInfo("Rakalite", 27, Rarity.UNCOMMON, mage.cards.r.Rakalite.class)); - cards.add(new SetCardInfo("Reconstruction", 56, Rarity.COMMON, mage.cards.r.Reconstruction.class)); - cards.add(new SetCardInfo("Reverse Polarity", 100, Rarity.COMMON, mage.cards.r.ReversePolarity.class)); - cards.add(new SetCardInfo("Rocket Launcher", 28, Rarity.UNCOMMON, mage.cards.r.RocketLauncher.class)); - cards.add(new SetCardInfo("Sage of Lat-Nam", 57, Rarity.COMMON, mage.cards.s.SageOfLatNam.class)); - cards.add(new SetCardInfo("Shapeshifter", 29, Rarity.RARE, mage.cards.s.Shapeshifter.class)); - cards.add(new SetCardInfo("Shatterstorm", 93, Rarity.RARE, mage.cards.s.Shatterstorm.class)); - cards.add(new SetCardInfo("Staff of Zegon", 30, Rarity.COMMON, mage.cards.s.StaffOfZegon.class)); - cards.add(new SetCardInfo("Strip Mine", 71, Rarity.UNCOMMON, mage.cards.s.StripMine.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Strip Mine", 72, Rarity.UNCOMMON, mage.cards.s.StripMine.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Strip Mine", 73, Rarity.UNCOMMON, mage.cards.s.StripMine.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Strip Mine", 74, Rarity.UNCOMMON, mage.cards.s.StripMine.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Su-Chi", 31, Rarity.UNCOMMON, mage.cards.s.SuChi.class)); - cards.add(new SetCardInfo("Tablet of Epityr", 32, Rarity.COMMON, mage.cards.t.TabletOfEpityr.class)); - cards.add(new SetCardInfo("Tawnos's Coffin", 33, Rarity.RARE, mage.cards.t.TawnossCoffin.class)); - cards.add(new SetCardInfo("Tawnos's Wand", 34, Rarity.UNCOMMON, mage.cards.t.TawnossWand.class)); - cards.add(new SetCardInfo("Tawnos's Weaponry", 35, Rarity.UNCOMMON, mage.cards.t.TawnossWeaponry.class)); - cards.add(new SetCardInfo("Tetravus", 36, Rarity.RARE, mage.cards.t.Tetravus.class)); - cards.add(new SetCardInfo("The Rack", 37, Rarity.UNCOMMON, mage.cards.t.TheRack.class)); - cards.add(new SetCardInfo("Titania's Song", 65, Rarity.UNCOMMON, mage.cards.t.TitaniasSong.class)); - cards.add(new SetCardInfo("Transmute Artifact", 58, Rarity.UNCOMMON, mage.cards.t.TransmuteArtifact.class)); - cards.add(new SetCardInfo("Triskelion", 38, Rarity.RARE, mage.cards.t.Triskelion.class)); - cards.add(new SetCardInfo("Urza's Avenger", 39, Rarity.RARE, mage.cards.u.UrzasAvenger.class)); - cards.add(new SetCardInfo("Urza's Chalice", 40, Rarity.COMMON, mage.cards.u.UrzasChalice.class)); - cards.add(new SetCardInfo("Urza's Mine", 75, Rarity.UNCOMMON, mage.cards.u.UrzasMine.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Urza's Mine", 76, Rarity.UNCOMMON, mage.cards.u.UrzasMine.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Urza's Mine", 77, Rarity.UNCOMMON, mage.cards.u.UrzasMine.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Urza's Mine", 78, Rarity.UNCOMMON, mage.cards.u.UrzasMine.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Urza's Miter", 41, Rarity.RARE, mage.cards.u.UrzasMiter.class)); - cards.add(new SetCardInfo("Urza's Power Plant", 79, Rarity.UNCOMMON, mage.cards.u.UrzasPowerPlant.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Urza's Power Plant", 80, Rarity.UNCOMMON, mage.cards.u.UrzasPowerPlant.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Urza's Power Plant", 81, Rarity.UNCOMMON, mage.cards.u.UrzasPowerPlant.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Urza's Power Plant", 82, Rarity.UNCOMMON, mage.cards.u.UrzasPowerPlant.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Urza's Tower", 83, Rarity.UNCOMMON, mage.cards.u.UrzasTower.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Urza's Tower", 84, Rarity.UNCOMMON, mage.cards.u.UrzasTower.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Urza's Tower", 85, Rarity.UNCOMMON, mage.cards.u.UrzasTower.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Urza's Tower", 86, Rarity.UNCOMMON, mage.cards.u.UrzasTower.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Wall of Spears", 42, Rarity.UNCOMMON, mage.cards.w.WallOfSpears.class)); - cards.add(new SetCardInfo("Weakstone", 43, Rarity.UNCOMMON, mage.cards.w.Weakstone.class)); - cards.add(new SetCardInfo("Xenic Poltergeist", 50, Rarity.UNCOMMON, mage.cards.x.XenicPoltergeist.class)); - cards.add(new SetCardInfo("Yawgmoth Demon", 51, Rarity.RARE, mage.cards.y.YawgmothDemon.class)); - cards.add(new SetCardInfo("Yotian Soldier", 44, Rarity.COMMON, mage.cards.y.YotianSoldier.class)); + cards.add(new SetCardInfo("Amulet of Kroog", 36, Rarity.COMMON, mage.cards.a.AmuletOfKroog.class)); + cards.add(new SetCardInfo("Argivian Archaeologist", 1, Rarity.RARE, mage.cards.a.ArgivianArchaeologist.class)); + cards.add(new SetCardInfo("Argivian Blacksmith", 2, Rarity.COMMON, mage.cards.a.ArgivianBlacksmith.class)); + cards.add(new SetCardInfo("Argothian Pixies", 29, Rarity.COMMON, mage.cards.a.ArgothianPixies.class)); + cards.add(new SetCardInfo("Argothian Treefolk", 30, Rarity.COMMON, mage.cards.a.ArgothianTreefolk.class)); + cards.add(new SetCardInfo("Armageddon Clock", 37, Rarity.UNCOMMON, mage.cards.a.ArmageddonClock.class)); + cards.add(new SetCardInfo("Artifact Blast", 22, Rarity.COMMON, mage.cards.a.ArtifactBlast.class)); + cards.add(new SetCardInfo("Artifact Possession", 15, Rarity.COMMON, mage.cards.a.ArtifactPossession.class)); + cards.add(new SetCardInfo("Artifact Ward", 3, Rarity.COMMON, mage.cards.a.ArtifactWard.class)); + cards.add(new SetCardInfo("Ashnod's Altar", 38, Rarity.UNCOMMON, mage.cards.a.AshnodsAltar.class)); + cards.add(new SetCardInfo("Ashnod's Battle Gear", 39, Rarity.UNCOMMON, mage.cards.a.AshnodsBattleGear.class)); + cards.add(new SetCardInfo("Ashnod's Transmogrant", 40, Rarity.UNCOMMON, mage.cards.a.AshnodsTransmogrant.class)); + cards.add(new SetCardInfo("Atog", 23, Rarity.COMMON, mage.cards.a.Atog.class)); + cards.add(new SetCardInfo("Battering Ram", 41, Rarity.COMMON, mage.cards.b.BatteringRam.class)); + cards.add(new SetCardInfo("Candelabra of Tawnos", 43, Rarity.RARE, mage.cards.c.CandelabraOfTawnos.class)); + cards.add(new SetCardInfo("Circle of Protection: Artifacts", 4, Rarity.COMMON, mage.cards.c.CircleOfProtectionArtifacts.class)); + cards.add(new SetCardInfo("Citanul Druid", 31, Rarity.UNCOMMON, mage.cards.c.CitanulDruid.class)); + cards.add(new SetCardInfo("Clay Statue", 44, Rarity.COMMON, mage.cards.c.ClayStatue.class)); + cards.add(new SetCardInfo("Clockwork Avian", 45, Rarity.RARE, mage.cards.c.ClockworkAvian.class)); + cards.add(new SetCardInfo("Colossus of Sardia", 46, Rarity.RARE, mage.cards.c.ColossusOfSardia.class)); + cards.add(new SetCardInfo("Coral Helm", 47, Rarity.RARE, mage.cards.c.CoralHelm.class)); + cards.add(new SetCardInfo("Crumble", 32, Rarity.COMMON, mage.cards.c.Crumble.class)); + cards.add(new SetCardInfo("Cursed Rack", 48, Rarity.UNCOMMON, mage.cards.c.CursedRack.class)); + cards.add(new SetCardInfo("Damping Field", 5, Rarity.UNCOMMON, mage.cards.d.DampingField.class)); + cards.add(new SetCardInfo("Detonate", 24, Rarity.UNCOMMON, mage.cards.d.Detonate.class)); + cards.add(new SetCardInfo("Drafna's Restoration", 8, Rarity.COMMON, mage.cards.d.DrafnasRestoration.class)); + cards.add(new SetCardInfo("Dragon Engine", 49, Rarity.COMMON, mage.cards.d.DragonEngine.class)); + cards.add(new SetCardInfo("Dwarven Weaponsmith", 25, Rarity.UNCOMMON, mage.cards.d.DwarvenWeaponsmith.class)); + cards.add(new SetCardInfo("Energy Flux", 9, Rarity.UNCOMMON, mage.cards.e.EnergyFlux.class)); + cards.add(new SetCardInfo("Feldon's Cane", 50, Rarity.UNCOMMON, mage.cards.f.FeldonsCane.class)); + cards.add(new SetCardInfo("Gaea's Avenger", 33, Rarity.RARE, mage.cards.g.GaeasAvenger.class)); + cards.add(new SetCardInfo("Gate to Phyrexia", 16, Rarity.UNCOMMON, mage.cards.g.GateToPhyrexia.class)); + cards.add(new SetCardInfo("Goblin Artisans", 26, Rarity.UNCOMMON, mage.cards.g.GoblinArtisans.class)); + cards.add(new SetCardInfo("Golgothian Sylex", 51, Rarity.RARE, mage.cards.g.GolgothianSylex.class)); + cards.add(new SetCardInfo("Grapeshot Catapult", 52, Rarity.COMMON, mage.cards.g.GrapeshotCatapult.class)); + cards.add(new SetCardInfo("Haunting Wind", 17, Rarity.UNCOMMON, mage.cards.h.HauntingWind.class)); + cards.add(new SetCardInfo("Hurkyl's Recall", 10, Rarity.RARE, mage.cards.h.HurkylsRecall.class)); + cards.add(new SetCardInfo("Ivory Tower", 53, Rarity.UNCOMMON, mage.cards.i.IvoryTower.class)); + cards.add(new SetCardInfo("Jalum Tome", 54, Rarity.UNCOMMON, mage.cards.j.JalumTome.class)); + cards.add(new SetCardInfo("Martyrs of Korlis", 6, Rarity.UNCOMMON, mage.cards.m.MartyrsOfKorlis.class)); + cards.add(new SetCardInfo("Mightstone", 55, Rarity.UNCOMMON, mage.cards.m.Mightstone.class)); + cards.add(new SetCardInfo("Millstone", 56, Rarity.UNCOMMON, mage.cards.m.Millstone.class)); + cards.add(new SetCardInfo("Mishra's Factory", "80a", Rarity.UNCOMMON, mage.cards.m.MishrasFactory.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mishra's Factory", "80b", Rarity.UNCOMMON, mage.cards.m.MishrasFactory.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mishra's Factory", "80c", Rarity.UNCOMMON, mage.cards.m.MishrasFactory.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mishra's Factory", "80d", Rarity.UNCOMMON, mage.cards.m.MishrasFactory.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mishra's War Machine", 57, Rarity.RARE, mage.cards.m.MishrasWarMachine.class)); + cards.add(new SetCardInfo("Mishra's Workshop", 81, Rarity.RARE, mage.cards.m.MishrasWorkshop.class)); + cards.add(new SetCardInfo("Obelisk of Undoing", 58, Rarity.RARE, mage.cards.o.ObeliskOfUndoing.class)); + cards.add(new SetCardInfo("Onulet", 59, Rarity.UNCOMMON, mage.cards.o.Onulet.class)); + cards.add(new SetCardInfo("Orcish Mechanics", 27, Rarity.COMMON, mage.cards.o.OrcishMechanics.class)); + cards.add(new SetCardInfo("Ornithopter", 60, Rarity.COMMON, mage.cards.o.Ornithopter.class)); + cards.add(new SetCardInfo("Phyrexian Gremlins", 18, Rarity.COMMON, mage.cards.p.PhyrexianGremlins.class)); + cards.add(new SetCardInfo("Power Artifact", 11, Rarity.UNCOMMON, mage.cards.p.PowerArtifact.class)); + cards.add(new SetCardInfo("Powerleech", 34, Rarity.UNCOMMON, mage.cards.p.Powerleech.class)); + cards.add(new SetCardInfo("Priest of Yawgmoth", 19, Rarity.COMMON, mage.cards.p.PriestOfYawgmoth.class)); + cards.add(new SetCardInfo("Primal Clay", 61, Rarity.UNCOMMON, mage.cards.p.PrimalClay.class)); + cards.add(new SetCardInfo("Rakalite", 62, Rarity.UNCOMMON, mage.cards.r.Rakalite.class)); + cards.add(new SetCardInfo("Reconstruction", 12, Rarity.COMMON, mage.cards.r.Reconstruction.class)); + cards.add(new SetCardInfo("Reverse Polarity", 7, Rarity.COMMON, mage.cards.r.ReversePolarity.class)); + cards.add(new SetCardInfo("Rocket Launcher", 63, Rarity.UNCOMMON, mage.cards.r.RocketLauncher.class)); + cards.add(new SetCardInfo("Sage of Lat-Nam", 13, Rarity.COMMON, mage.cards.s.SageOfLatNam.class)); + cards.add(new SetCardInfo("Shapeshifter", 64, Rarity.RARE, mage.cards.s.Shapeshifter.class)); + cards.add(new SetCardInfo("Shatterstorm", 28, Rarity.RARE, mage.cards.s.Shatterstorm.class)); + cards.add(new SetCardInfo("Staff of Zegon", 65, Rarity.COMMON, mage.cards.s.StaffOfZegon.class)); + cards.add(new SetCardInfo("Strip Mine", "82a", Rarity.UNCOMMON, mage.cards.s.StripMine.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Strip Mine", "82b", Rarity.UNCOMMON, mage.cards.s.StripMine.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Strip Mine", "82c", Rarity.UNCOMMON, mage.cards.s.StripMine.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Strip Mine", "82d", Rarity.UNCOMMON, mage.cards.s.StripMine.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Su-Chi", 66, Rarity.UNCOMMON, mage.cards.s.SuChi.class)); + cards.add(new SetCardInfo("Tablet of Epityr", 67, Rarity.COMMON, mage.cards.t.TabletOfEpityr.class)); + cards.add(new SetCardInfo("Tawnos's Coffin", 68, Rarity.RARE, mage.cards.t.TawnossCoffin.class)); + cards.add(new SetCardInfo("Tawnos's Wand", 69, Rarity.UNCOMMON, mage.cards.t.TawnossWand.class)); + cards.add(new SetCardInfo("Tawnos's Weaponry", 70, Rarity.UNCOMMON, mage.cards.t.TawnossWeaponry.class)); + cards.add(new SetCardInfo("Tetravus", 71, Rarity.RARE, mage.cards.t.Tetravus.class)); + cards.add(new SetCardInfo("The Rack", 72, Rarity.UNCOMMON, mage.cards.t.TheRack.class)); + cards.add(new SetCardInfo("Titania's Song", 35, Rarity.UNCOMMON, mage.cards.t.TitaniasSong.class)); + cards.add(new SetCardInfo("Transmute Artifact", 14, Rarity.UNCOMMON, mage.cards.t.TransmuteArtifact.class)); + cards.add(new SetCardInfo("Triskelion", 73, Rarity.RARE, mage.cards.t.Triskelion.class)); + cards.add(new SetCardInfo("Urza's Avenger", 74, Rarity.RARE, mage.cards.u.UrzasAvenger.class)); + cards.add(new SetCardInfo("Urza's Chalice", 75, Rarity.COMMON, mage.cards.u.UrzasChalice.class)); + cards.add(new SetCardInfo("Urza's Mine", "83a", Rarity.UNCOMMON, mage.cards.u.UrzasMine.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Urza's Mine", "83b", Rarity.UNCOMMON, mage.cards.u.UrzasMine.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Urza's Mine", "83c", Rarity.UNCOMMON, mage.cards.u.UrzasMine.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Urza's Mine", "83d", Rarity.UNCOMMON, mage.cards.u.UrzasMine.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Urza's Miter", 76, Rarity.RARE, mage.cards.u.UrzasMiter.class)); + cards.add(new SetCardInfo("Urza's Power Plant", "84a", Rarity.UNCOMMON, mage.cards.u.UrzasPowerPlant.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Urza's Power Plant", "84b", Rarity.UNCOMMON, mage.cards.u.UrzasPowerPlant.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Urza's Power Plant", "84c", Rarity.UNCOMMON, mage.cards.u.UrzasPowerPlant.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Urza's Power Plant", "84d", Rarity.UNCOMMON, mage.cards.u.UrzasPowerPlant.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Urza's Tower", "85a", Rarity.UNCOMMON, mage.cards.u.UrzasTower.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Urza's Tower", "85b", Rarity.UNCOMMON, mage.cards.u.UrzasTower.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Urza's Tower", "85c", Rarity.UNCOMMON, mage.cards.u.UrzasTower.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Urza's Tower", "85d", Rarity.UNCOMMON, mage.cards.u.UrzasTower.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Wall of Spears", 77, Rarity.UNCOMMON, mage.cards.w.WallOfSpears.class)); + cards.add(new SetCardInfo("Weakstone", 78, Rarity.UNCOMMON, mage.cards.w.Weakstone.class)); + cards.add(new SetCardInfo("Xenic Poltergeist", 20, Rarity.UNCOMMON, mage.cards.x.XenicPoltergeist.class)); + cards.add(new SetCardInfo("Yawgmoth Demon", 21, Rarity.RARE, mage.cards.y.YawgmothDemon.class)); + cards.add(new SetCardInfo("Yotian Soldier", 79, Rarity.COMMON, mage.cards.y.YotianSoldier.class)); } } From 09df0b7baad7b9231f471ccf9a6b76d59e14e737 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Wed, 9 May 2018 03:25:40 +0400 Subject: [PATCH 099/158] Fixed card numbers in 3ED - Revised Edition (#4628) --- Mage.Sets/src/mage/sets/RevisedEdition.java | 400 ++++++++++---------- 1 file changed, 200 insertions(+), 200 deletions(-) diff --git a/Mage.Sets/src/mage/sets/RevisedEdition.java b/Mage.Sets/src/mage/sets/RevisedEdition.java index e4e83cf7021..36950df6f41 100644 --- a/Mage.Sets/src/mage/sets/RevisedEdition.java +++ b/Mage.Sets/src/mage/sets/RevisedEdition.java @@ -28,132 +28,132 @@ public class RevisedEdition extends ExpansionSet { cards.add(new SetCardInfo("Aladdin's Lamp", 231, Rarity.RARE, mage.cards.a.AladdinsLamp.class)); cards.add(new SetCardInfo("Aladdin's Ring", 232, Rarity.RARE, mage.cards.a.AladdinsRing.class)); cards.add(new SetCardInfo("Animate Artifact", 48, Rarity.UNCOMMON, mage.cards.a.AnimateArtifact.class)); - cards.add(new SetCardInfo("Animate Dead", 1, Rarity.UNCOMMON, mage.cards.a.AnimateDead.class)); - cards.add(new SetCardInfo("Animate Wall", 185, Rarity.RARE, mage.cards.a.AnimateWall.class)); + cards.add(new SetCardInfo("Animate Dead", 93, Rarity.UNCOMMON, mage.cards.a.AnimateDead.class)); + cards.add(new SetCardInfo("Animate Wall", 1, Rarity.RARE, mage.cards.a.AnimateWall.class)); cards.add(new SetCardInfo("Ankh of Mishra", 233, Rarity.RARE, mage.cards.a.AnkhOfMishra.class)); - cards.add(new SetCardInfo("Armageddon", 186, Rarity.RARE, mage.cards.a.Armageddon.class)); cards.add(new SetCardInfo("Armageddon Clock", 234, Rarity.RARE, mage.cards.a.ArmageddonClock.class)); - cards.add(new SetCardInfo("Aspect of Wolf", 93, Rarity.RARE, mage.cards.a.AspectOfWolf.class)); - cards.add(new SetCardInfo("Atog", 138, Rarity.COMMON, mage.cards.a.Atog.class)); + cards.add(new SetCardInfo("Armageddon", 2, Rarity.RARE, mage.cards.a.Armageddon.class)); + cards.add(new SetCardInfo("Aspect of Wolf", 186, Rarity.RARE, mage.cards.a.AspectOfWolf.class)); + cards.add(new SetCardInfo("Atog", 139, Rarity.COMMON, mage.cards.a.Atog.class)); + cards.add(new SetCardInfo("Bad Moon", 94, Rarity.RARE, mage.cards.b.BadMoon.class)); cards.add(new SetCardInfo("Badlands", 282, Rarity.RARE, mage.cards.b.Badlands.class)); - cards.add(new SetCardInfo("Bad Moon", 2, Rarity.RARE, mage.cards.b.BadMoon.class)); - cards.add(new SetCardInfo("Balance", 187, Rarity.RARE, mage.cards.b.Balance.class)); + cards.add(new SetCardInfo("Balance", 3, Rarity.RARE, mage.cards.b.Balance.class)); cards.add(new SetCardInfo("Basalt Monolith", 235, Rarity.UNCOMMON, mage.cards.b.BasaltMonolith.class)); cards.add(new SetCardInfo("Bayou", 283, Rarity.RARE, mage.cards.b.Bayou.class)); - cards.add(new SetCardInfo("Benalish Hero", 188, Rarity.COMMON, mage.cards.b.BenalishHero.class)); - cards.add(new SetCardInfo("Birds of Paradise", 94, Rarity.RARE, mage.cards.b.BirdsOfParadise.class)); - cards.add(new SetCardInfo("Black Knight", 3, Rarity.UNCOMMON, mage.cards.b.BlackKnight.class)); + cards.add(new SetCardInfo("Benalish Hero", 4, Rarity.COMMON, mage.cards.b.BenalishHero.class)); + cards.add(new SetCardInfo("Birds of Paradise", 187, Rarity.RARE, mage.cards.b.BirdsOfParadise.class)); + cards.add(new SetCardInfo("Black Knight", 95, Rarity.UNCOMMON, mage.cards.b.BlackKnight.class)); cards.add(new SetCardInfo("Black Vise", 236, Rarity.UNCOMMON, mage.cards.b.BlackVise.class)); - cards.add(new SetCardInfo("Black Ward", 189, Rarity.UNCOMMON, mage.cards.b.BlackWard.class)); - cards.add(new SetCardInfo("Blessing", 190, Rarity.RARE, mage.cards.b.Blessing.class)); + cards.add(new SetCardInfo("Black Ward", 5, Rarity.UNCOMMON, mage.cards.b.BlackWard.class)); + cards.add(new SetCardInfo("Blessing", 6, Rarity.RARE, mage.cards.b.Blessing.class)); cards.add(new SetCardInfo("Blue Elemental Blast", 49, Rarity.COMMON, mage.cards.b.BlueElementalBlast.class)); - cards.add(new SetCardInfo("Blue Ward", 191, Rarity.UNCOMMON, mage.cards.b.BlueWard.class)); - cards.add(new SetCardInfo("Bog Wraith", 4, Rarity.UNCOMMON, mage.cards.b.BogWraith.class)); + cards.add(new SetCardInfo("Blue Ward", 7, Rarity.UNCOMMON, mage.cards.b.BlueWard.class)); + cards.add(new SetCardInfo("Bog Wraith", 96, Rarity.UNCOMMON, mage.cards.b.BogWraith.class)); cards.add(new SetCardInfo("Bottle of Suleiman", 237, Rarity.RARE, mage.cards.b.BottleOfSuleiman.class)); cards.add(new SetCardInfo("Braingeyser", 50, Rarity.RARE, mage.cards.b.Braingeyser.class)); cards.add(new SetCardInfo("Brass Man", 238, Rarity.UNCOMMON, mage.cards.b.BrassMan.class)); - cards.add(new SetCardInfo("Burrowing", 139, Rarity.UNCOMMON, mage.cards.b.Burrowing.class)); - cards.add(new SetCardInfo("Castle", 192, Rarity.UNCOMMON, mage.cards.c.Castle.class)); + cards.add(new SetCardInfo("Burrowing", 140, Rarity.UNCOMMON, mage.cards.b.Burrowing.class)); + cards.add(new SetCardInfo("Castle", 8, Rarity.UNCOMMON, mage.cards.c.Castle.class)); cards.add(new SetCardInfo("Celestial Prism", 239, Rarity.UNCOMMON, mage.cards.c.CelestialPrism.class)); - cards.add(new SetCardInfo("Channel", 95, Rarity.UNCOMMON, mage.cards.c.Channel.class)); - cards.add(new SetCardInfo("Chaoslace", 140, Rarity.RARE, mage.cards.c.Chaoslace.class)); - cards.add(new SetCardInfo("Circle of Protection: Black", 193, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlack.class)); - cards.add(new SetCardInfo("Circle of Protection: Blue", 194, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlue.class)); - cards.add(new SetCardInfo("Circle of Protection: Green", 195, Rarity.COMMON, mage.cards.c.CircleOfProtectionGreen.class)); - cards.add(new SetCardInfo("Circle of Protection: Red", 196, Rarity.COMMON, mage.cards.c.CircleOfProtectionRed.class)); - cards.add(new SetCardInfo("Circle of Protection: White", 197, Rarity.COMMON, mage.cards.c.CircleOfProtectionWhite.class)); + cards.add(new SetCardInfo("Channel", 188, Rarity.UNCOMMON, mage.cards.c.Channel.class)); + cards.add(new SetCardInfo("Chaoslace", 141, Rarity.RARE, mage.cards.c.Chaoslace.class)); + cards.add(new SetCardInfo("Circle of Protection: Black", 9, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlack.class)); + cards.add(new SetCardInfo("Circle of Protection: Blue", 10, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlue.class)); + cards.add(new SetCardInfo("Circle of Protection: Green", 11, Rarity.COMMON, mage.cards.c.CircleOfProtectionGreen.class)); + cards.add(new SetCardInfo("Circle of Protection: Red", 12, Rarity.COMMON, mage.cards.c.CircleOfProtectionRed.class)); + cards.add(new SetCardInfo("Circle of Protection: White", 13, Rarity.COMMON, mage.cards.c.CircleOfProtectionWhite.class)); cards.add(new SetCardInfo("Clockwork Beast", 240, Rarity.RARE, mage.cards.c.ClockworkBeast.class)); cards.add(new SetCardInfo("Clone", 51, Rarity.UNCOMMON, mage.cards.c.Clone.class)); - cards.add(new SetCardInfo("Cockatrice", 96, Rarity.RARE, mage.cards.c.Cockatrice.class)); + cards.add(new SetCardInfo("Cockatrice", 189, Rarity.RARE, mage.cards.c.Cockatrice.class)); cards.add(new SetCardInfo("Conservator", 241, Rarity.UNCOMMON, mage.cards.c.Conservator.class)); cards.add(new SetCardInfo("Control Magic", 52, Rarity.UNCOMMON, mage.cards.c.ControlMagic.class)); - cards.add(new SetCardInfo("Conversion", 198, Rarity.UNCOMMON, mage.cards.c.Conversion.class)); + cards.add(new SetCardInfo("Conversion", 14, Rarity.UNCOMMON, mage.cards.c.Conversion.class)); cards.add(new SetCardInfo("Copy Artifact", 53, Rarity.RARE, mage.cards.c.CopyArtifact.class)); cards.add(new SetCardInfo("Counterspell", 54, Rarity.UNCOMMON, mage.cards.c.Counterspell.class)); - cards.add(new SetCardInfo("Craw Wurm", 97, Rarity.COMMON, mage.cards.c.CrawWurm.class)); + cards.add(new SetCardInfo("Craw Wurm", 190, Rarity.COMMON, mage.cards.c.CrawWurm.class)); cards.add(new SetCardInfo("Creature Bond", 55, Rarity.COMMON, mage.cards.c.CreatureBond.class)); - cards.add(new SetCardInfo("Crumble", 98, Rarity.UNCOMMON, mage.cards.c.Crumble.class)); - cards.add(new SetCardInfo("Crusade", 199, Rarity.RARE, mage.cards.c.Crusade.class)); + cards.add(new SetCardInfo("Crumble", 191, Rarity.UNCOMMON, mage.cards.c.Crumble.class)); + cards.add(new SetCardInfo("Crusade", 15, Rarity.RARE, mage.cards.c.Crusade.class)); cards.add(new SetCardInfo("Crystal Rod", 242, Rarity.UNCOMMON, mage.cards.c.CrystalRod.class)); - cards.add(new SetCardInfo("Cursed Land", 6, Rarity.UNCOMMON, mage.cards.c.CursedLand.class)); + cards.add(new SetCardInfo("Cursed Land", 98, Rarity.UNCOMMON, mage.cards.c.CursedLand.class)); cards.add(new SetCardInfo("Dancing Scimitar", 243, Rarity.RARE, mage.cards.d.DancingScimitar.class)); - cards.add(new SetCardInfo("Dark Ritual", 7, Rarity.COMMON, mage.cards.d.DarkRitual.class)); - cards.add(new SetCardInfo("Deathgrip", 9, Rarity.UNCOMMON, mage.cards.d.Deathgrip.class)); - cards.add(new SetCardInfo("Deathlace", 10, Rarity.RARE, mage.cards.d.Deathlace.class)); - cards.add(new SetCardInfo("Death Ward", 200, Rarity.COMMON, mage.cards.d.DeathWard.class)); - cards.add(new SetCardInfo("Demonic Hordes", 12, Rarity.RARE, mage.cards.d.DemonicHordes.class)); - cards.add(new SetCardInfo("Demonic Tutor", 13, Rarity.UNCOMMON, mage.cards.d.DemonicTutor.class)); - cards.add(new SetCardInfo("Desert Twister", 99, Rarity.UNCOMMON, mage.cards.d.DesertTwister.class)); + cards.add(new SetCardInfo("Dark Ritual", 99, Rarity.COMMON, mage.cards.d.DarkRitual.class)); + cards.add(new SetCardInfo("Death Ward", 16, Rarity.COMMON, mage.cards.d.DeathWard.class)); + cards.add(new SetCardInfo("Deathgrip", 101, Rarity.UNCOMMON, mage.cards.d.Deathgrip.class)); + cards.add(new SetCardInfo("Deathlace", 102, Rarity.RARE, mage.cards.d.Deathlace.class)); + cards.add(new SetCardInfo("Demonic Hordes", 104, Rarity.RARE, mage.cards.d.DemonicHordes.class)); + cards.add(new SetCardInfo("Demonic Tutor", 105, Rarity.UNCOMMON, mage.cards.d.DemonicTutor.class)); + cards.add(new SetCardInfo("Desert Twister", 192, Rarity.UNCOMMON, mage.cards.d.DesertTwister.class)); cards.add(new SetCardInfo("Dingus Egg", 244, Rarity.RARE, mage.cards.d.DingusEgg.class)); - cards.add(new SetCardInfo("Disenchant", 201, Rarity.COMMON, mage.cards.d.Disenchant.class)); - cards.add(new SetCardInfo("Disintegrate", 141, Rarity.COMMON, mage.cards.d.Disintegrate.class)); + cards.add(new SetCardInfo("Disenchant", 17, Rarity.COMMON, mage.cards.d.Disenchant.class)); + cards.add(new SetCardInfo("Disintegrate", 142, Rarity.COMMON, mage.cards.d.Disintegrate.class)); cards.add(new SetCardInfo("Disrupting Scepter", 245, Rarity.RARE, mage.cards.d.DisruptingScepter.class)); 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("Dragon Whelp", 143, 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", 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)); - cards.add(new SetCardInfo("Earthbind", 146, Rarity.COMMON, mage.cards.e.Earthbind.class)); - cards.add(new SetCardInfo("Earth Elemental", 145, Rarity.UNCOMMON, mage.cards.e.EarthElemental.class)); - cards.add(new SetCardInfo("Earthquake", 147, Rarity.RARE, mage.cards.e.Earthquake.class)); + cards.add(new SetCardInfo("Drudge Skeletons", 107, Rarity.COMMON, mage.cards.d.DrudgeSkeletons.class)); + cards.add(new SetCardInfo("Dwarven Warriors", 144, Rarity.COMMON, mage.cards.d.DwarvenWarriors.class)); + cards.add(new SetCardInfo("Dwarven Weaponsmith", 145, Rarity.UNCOMMON, mage.cards.d.DwarvenWeaponsmith.class)); + cards.add(new SetCardInfo("Earth Elemental", 146, Rarity.UNCOMMON, mage.cards.e.EarthElemental.class)); + cards.add(new SetCardInfo("Earthbind", 147, Rarity.COMMON, mage.cards.e.Earthbind.class)); + cards.add(new SetCardInfo("Earthquake", 148, Rarity.RARE, mage.cards.e.Earthquake.class)); cards.add(new SetCardInfo("Ebony Horse", 247, Rarity.RARE, mage.cards.e.EbonyHorse.class)); - cards.add(new SetCardInfo("El-Hajjaj", 16, Rarity.RARE, mage.cards.e.ElHajjaj.class)); - cards.add(new SetCardInfo("Elvish Archers", 100, Rarity.RARE, mage.cards.e.ElvishArchers.class)); + cards.add(new SetCardInfo("El-Hajjaj", 108, Rarity.RARE, mage.cards.e.ElHajjaj.class)); + cards.add(new SetCardInfo("Elvish Archers", 193, Rarity.RARE, mage.cards.e.ElvishArchers.class)); cards.add(new SetCardInfo("Energy Flux", 57, Rarity.UNCOMMON, mage.cards.e.EnergyFlux.class)); - cards.add(new SetCardInfo("Erg Raiders", 17, Rarity.COMMON, mage.cards.e.ErgRaiders.class)); - cards.add(new SetCardInfo("Evil Presence", 18, Rarity.UNCOMMON, mage.cards.e.EvilPresence.class)); - cards.add(new SetCardInfo("Eye for an Eye", 202, Rarity.RARE, mage.cards.e.EyeForAnEye.class)); - cards.add(new SetCardInfo("Farmstead", 203, Rarity.RARE, mage.cards.f.Farmstead.class)); - cards.add(new SetCardInfo("Fastbond", 101, Rarity.RARE, mage.cards.f.Fastbond.class)); - cards.add(new SetCardInfo("Fear", 19, Rarity.COMMON, mage.cards.f.Fear.class)); + cards.add(new SetCardInfo("Erg Raiders", 109, Rarity.COMMON, mage.cards.e.ErgRaiders.class)); + cards.add(new SetCardInfo("Evil Presence", 110, Rarity.UNCOMMON, mage.cards.e.EvilPresence.class)); + cards.add(new SetCardInfo("Eye for an Eye", 18, Rarity.RARE, mage.cards.e.EyeForAnEye.class)); + cards.add(new SetCardInfo("Farmstead", 19, Rarity.RARE, mage.cards.f.Farmstead.class)); + cards.add(new SetCardInfo("Fastbond", 194, Rarity.RARE, mage.cards.f.Fastbond.class)); + cards.add(new SetCardInfo("Fear", 111, Rarity.COMMON, mage.cards.f.Fear.class)); cards.add(new SetCardInfo("Feedback", 58, Rarity.UNCOMMON, mage.cards.f.Feedback.class)); - cards.add(new SetCardInfo("Fireball", 149, Rarity.COMMON, mage.cards.f.Fireball.class)); - cards.add(new SetCardInfo("Firebreathing", 150, Rarity.COMMON, mage.cards.f.Firebreathing.class)); - cards.add(new SetCardInfo("Fire Elemental", 148, Rarity.UNCOMMON, mage.cards.f.FireElemental.class)); - cards.add(new SetCardInfo("Flashfires", 151, Rarity.UNCOMMON, mage.cards.f.Flashfires.class)); + cards.add(new SetCardInfo("Fire Elemental", 149, Rarity.UNCOMMON, mage.cards.f.FireElemental.class)); + cards.add(new SetCardInfo("Fireball", 150, Rarity.COMMON, mage.cards.f.Fireball.class)); + cards.add(new SetCardInfo("Firebreathing", 151, Rarity.COMMON, mage.cards.f.Firebreathing.class)); + cards.add(new SetCardInfo("Flashfires", 152, Rarity.UNCOMMON, mage.cards.f.Flashfires.class)); cards.add(new SetCardInfo("Flight", 59, Rarity.COMMON, mage.cards.f.Flight.class)); cards.add(new SetCardInfo("Flying Carpet", 248, Rarity.RARE, mage.cards.f.FlyingCarpet.class)); - cards.add(new SetCardInfo("Fog", 102, Rarity.COMMON, mage.cards.f.Fog.class)); - cards.add(new SetCardInfo("Force of Nature", 103, Rarity.RARE, mage.cards.f.ForceOfNature.class)); - cards.add(new SetCardInfo("Forest", 284, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Forest", 285, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Forest", 286, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Fork", 152, Rarity.RARE, mage.cards.f.Fork.class)); - cards.add(new SetCardInfo("Frozen Shade", 20, Rarity.COMMON, mage.cards.f.FrozenShade.class)); - cards.add(new SetCardInfo("Fungusaur", 104, Rarity.RARE, mage.cards.f.Fungusaur.class)); - cards.add(new SetCardInfo("Gaea's Liege", 105, Rarity.RARE, mage.cards.g.GaeasLiege.class)); - cards.add(new SetCardInfo("Giant Growth", 106, Rarity.COMMON, mage.cards.g.GiantGrowth.class)); - cards.add(new SetCardInfo("Giant Spider", 107, Rarity.COMMON, mage.cards.g.GiantSpider.class)); + cards.add(new SetCardInfo("Fog", 195, Rarity.COMMON, mage.cards.f.Fog.class)); + cards.add(new SetCardInfo("Force of Nature", 196, Rarity.RARE, mage.cards.f.ForceOfNature.class)); + cards.add(new SetCardInfo("Forest", 304, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 305, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 306, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Fork", 153, Rarity.RARE, mage.cards.f.Fork.class)); + cards.add(new SetCardInfo("Frozen Shade", 112, Rarity.COMMON, mage.cards.f.FrozenShade.class)); + cards.add(new SetCardInfo("Fungusaur", 197, Rarity.RARE, mage.cards.f.Fungusaur.class)); + cards.add(new SetCardInfo("Gaea's Liege", 198, Rarity.RARE, mage.cards.g.GaeasLiege.class)); + cards.add(new SetCardInfo("Giant Growth", 199, Rarity.COMMON, mage.cards.g.GiantGrowth.class)); + cards.add(new SetCardInfo("Giant Spider", 200, Rarity.COMMON, mage.cards.g.GiantSpider.class)); cards.add(new SetCardInfo("Glasses of Urza", 249, Rarity.UNCOMMON, mage.cards.g.GlassesOfUrza.class)); - cards.add(new SetCardInfo("Gloom", 21, Rarity.UNCOMMON, mage.cards.g.Gloom.class)); - cards.add(new SetCardInfo("Goblin Balloon Brigade", 153, Rarity.UNCOMMON, mage.cards.g.GoblinBalloonBrigade.class)); - cards.add(new SetCardInfo("Goblin King", 154, Rarity.RARE, mage.cards.g.GoblinKing.class)); - cards.add(new SetCardInfo("Granite Gargoyle", 155, Rarity.RARE, mage.cards.g.GraniteGargoyle.class)); - cards.add(new SetCardInfo("Gray Ogre", 156, Rarity.COMMON, mage.cards.g.GrayOgre.class)); - cards.add(new SetCardInfo("Green Ward", 204, Rarity.UNCOMMON, mage.cards.g.GreenWard.class)); - cards.add(new SetCardInfo("Grizzly Bears", 108, Rarity.COMMON, mage.cards.g.GrizzlyBears.class)); - cards.add(new SetCardInfo("Guardian Angel", 205, Rarity.COMMON, mage.cards.g.GuardianAngel.class)); - cards.add(new SetCardInfo("Healing Salve", 206, Rarity.COMMON, mage.cards.h.HealingSalve.class)); + cards.add(new SetCardInfo("Gloom", 113, Rarity.UNCOMMON, mage.cards.g.Gloom.class)); + cards.add(new SetCardInfo("Goblin Balloon Brigade", 154, Rarity.UNCOMMON, mage.cards.g.GoblinBalloonBrigade.class)); + cards.add(new SetCardInfo("Goblin King", 155, Rarity.RARE, mage.cards.g.GoblinKing.class)); + cards.add(new SetCardInfo("Granite Gargoyle", 156, Rarity.RARE, mage.cards.g.GraniteGargoyle.class)); + cards.add(new SetCardInfo("Gray Ogre", 157, Rarity.COMMON, mage.cards.g.GrayOgre.class)); + cards.add(new SetCardInfo("Green Ward", 20, Rarity.UNCOMMON, mage.cards.g.GreenWard.class)); + cards.add(new SetCardInfo("Grizzly Bears", 201, Rarity.COMMON, mage.cards.g.GrizzlyBears.class)); + cards.add(new SetCardInfo("Guardian Angel", 21, Rarity.COMMON, mage.cards.g.GuardianAngel.class)); + cards.add(new SetCardInfo("Healing Salve", 22, Rarity.COMMON, mage.cards.h.HealingSalve.class)); cards.add(new SetCardInfo("Helm of Chatzuk", 250, Rarity.RARE, mage.cards.h.HelmOfChatzuk.class)); - cards.add(new SetCardInfo("Hill Giant", 157, Rarity.COMMON, mage.cards.h.HillGiant.class)); - cards.add(new SetCardInfo("Holy Armor", 207, Rarity.COMMON, mage.cards.h.HolyArmor.class)); - cards.add(new SetCardInfo("Holy Strength", 208, Rarity.COMMON, mage.cards.h.HolyStrength.class)); - cards.add(new SetCardInfo("Howl from Beyond", 22, Rarity.COMMON, mage.cards.h.HowlFromBeyond.class)); + cards.add(new SetCardInfo("Hill Giant", 158, Rarity.COMMON, mage.cards.h.HillGiant.class)); + cards.add(new SetCardInfo("Holy Armor", 23, Rarity.COMMON, mage.cards.h.HolyArmor.class)); + cards.add(new SetCardInfo("Holy Strength", 24, Rarity.COMMON, mage.cards.h.HolyStrength.class)); + cards.add(new SetCardInfo("Howl from Beyond", 114, Rarity.COMMON, mage.cards.h.HowlFromBeyond.class)); cards.add(new SetCardInfo("Howling Mine", 251, Rarity.RARE, mage.cards.h.HowlingMine.class)); cards.add(new SetCardInfo("Hurkyl's Recall", 60, Rarity.RARE, mage.cards.h.HurkylsRecall.class)); - cards.add(new SetCardInfo("Hurloon Minotaur", 158, Rarity.COMMON, mage.cards.h.HurloonMinotaur.class)); - cards.add(new SetCardInfo("Hurricane", 109, Rarity.UNCOMMON, mage.cards.h.Hurricane.class)); - cards.add(new SetCardInfo("Hypnotic Specter", 23, Rarity.UNCOMMON, mage.cards.h.HypnoticSpecter.class)); - cards.add(new SetCardInfo("Instill Energy", 110, Rarity.UNCOMMON, mage.cards.i.InstillEnergy.class)); - cards.add(new SetCardInfo("Ironroot Treefolk", 111, Rarity.COMMON, mage.cards.i.IronrootTreefolk.class)); + cards.add(new SetCardInfo("Hurloon Minotaur", 159, Rarity.COMMON, mage.cards.h.HurloonMinotaur.class)); + cards.add(new SetCardInfo("Hurricane", 202, Rarity.UNCOMMON, mage.cards.h.Hurricane.class)); + cards.add(new SetCardInfo("Hypnotic Specter", 115, Rarity.UNCOMMON, mage.cards.h.HypnoticSpecter.class)); + cards.add(new SetCardInfo("Instill Energy", 203, Rarity.UNCOMMON, mage.cards.i.InstillEnergy.class)); cards.add(new SetCardInfo("Iron Star", 252, Rarity.UNCOMMON, mage.cards.i.IronStar.class)); - cards.add(new SetCardInfo("Island", 287, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Island", 288, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Island", 289, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Ironroot Treefolk", 204, Rarity.COMMON, mage.cards.i.IronrootTreefolk.class)); cards.add(new SetCardInfo("Island Fish Jasconius", 61, Rarity.RARE, mage.cards.i.IslandFishJasconius.class)); - cards.add(new SetCardInfo("Island Sanctuary", 209, Rarity.RARE, mage.cards.i.IslandSanctuary.class)); + cards.add(new SetCardInfo("Island Sanctuary", 25, Rarity.RARE, mage.cards.i.IslandSanctuary.class)); + cards.add(new SetCardInfo("Island", 295, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 296, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 297, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Ivory Cup", 253, Rarity.UNCOMMON, mage.cards.i.IvoryCup.class)); cards.add(new SetCardInfo("Ivory Tower", 254, Rarity.RARE, mage.cards.i.IvoryTower.class)); cards.add(new SetCardInfo("Jade Monolith", 255, Rarity.RARE, mage.cards.j.JadeMonolith.class)); @@ -162,168 +162,168 @@ public class RevisedEdition extends ExpansionSet { cards.add(new SetCardInfo("Jayemdae Tome", 258, Rarity.RARE, mage.cards.j.JayemdaeTome.class)); cards.add(new SetCardInfo("Juggernaut", 259, Rarity.UNCOMMON, mage.cards.j.Juggernaut.class)); cards.add(new SetCardInfo("Jump", 62, Rarity.COMMON, mage.cards.j.Jump.class)); - cards.add(new SetCardInfo("Karma", 210, Rarity.UNCOMMON, mage.cards.k.Karma.class)); - cards.add(new SetCardInfo("Keldon Warlord", 159, Rarity.UNCOMMON, mage.cards.k.KeldonWarlord.class)); - cards.add(new SetCardInfo("Kird Ape", 160, Rarity.COMMON, mage.cards.k.KirdApe.class)); + cards.add(new SetCardInfo("Karma", 26, Rarity.UNCOMMON, mage.cards.k.Karma.class)); + cards.add(new SetCardInfo("Keldon Warlord", 160, Rarity.UNCOMMON, mage.cards.k.KeldonWarlord.class)); + cards.add(new SetCardInfo("Kird Ape", 161, Rarity.COMMON, mage.cards.k.KirdApe.class)); cards.add(new SetCardInfo("Kormus Bell", 260, Rarity.RARE, mage.cards.k.KormusBell.class)); - cards.add(new SetCardInfo("Kudzu", 112, Rarity.RARE, mage.cards.k.Kudzu.class)); - cards.add(new SetCardInfo("Lance", 211, Rarity.UNCOMMON, mage.cards.l.Lance.class)); - cards.add(new SetCardInfo("Ley Druid", 113, Rarity.UNCOMMON, mage.cards.l.LeyDruid.class)); + cards.add(new SetCardInfo("Kudzu", 205, Rarity.RARE, mage.cards.k.Kudzu.class)); + cards.add(new SetCardInfo("Lance", 27, Rarity.UNCOMMON, mage.cards.l.Lance.class)); + cards.add(new SetCardInfo("Ley Druid", 206, Rarity.UNCOMMON, mage.cards.l.LeyDruid.class)); cards.add(new SetCardInfo("Library of Leng", 261, Rarity.UNCOMMON, mage.cards.l.LibraryOfLeng.class)); - cards.add(new SetCardInfo("Lifeforce", 114, Rarity.UNCOMMON, mage.cards.l.Lifeforce.class)); - cards.add(new SetCardInfo("Lifelace", 115, Rarity.RARE, mage.cards.l.Lifelace.class)); + cards.add(new SetCardInfo("Lifeforce", 207, Rarity.UNCOMMON, mage.cards.l.Lifeforce.class)); + cards.add(new SetCardInfo("Lifelace", 208, Rarity.RARE, mage.cards.l.Lifelace.class)); cards.add(new SetCardInfo("Lifetap", 63, Rarity.UNCOMMON, mage.cards.l.Lifetap.class)); - cards.add(new SetCardInfo("Lightning Bolt", 161, Rarity.COMMON, mage.cards.l.LightningBolt.class)); - cards.add(new SetCardInfo("Living Artifact", 116, Rarity.RARE, mage.cards.l.LivingArtifact.class)); - cards.add(new SetCardInfo("Living Lands", 117, Rarity.RARE, mage.cards.l.LivingLands.class)); + cards.add(new SetCardInfo("Lightning Bolt", 162, Rarity.COMMON, mage.cards.l.LightningBolt.class)); + cards.add(new SetCardInfo("Living Artifact", 209, Rarity.RARE, mage.cards.l.LivingArtifact.class)); + cards.add(new SetCardInfo("Living Lands", 210, Rarity.RARE, mage.cards.l.LivingLands.class)); cards.add(new SetCardInfo("Living Wall", 262, Rarity.UNCOMMON, mage.cards.l.LivingWall.class)); - cards.add(new SetCardInfo("Llanowar Elves", 118, Rarity.COMMON, mage.cards.l.LlanowarElves.class)); + cards.add(new SetCardInfo("Llanowar Elves", 211, Rarity.COMMON, mage.cards.l.LlanowarElves.class)); cards.add(new SetCardInfo("Lord of Atlantis", 64, Rarity.RARE, mage.cards.l.LordOfAtlantis.class)); - cards.add(new SetCardInfo("Lord of the Pit", 24, Rarity.RARE, mage.cards.l.LordOfThePit.class)); - cards.add(new SetCardInfo("Lure", 119, Rarity.UNCOMMON, mage.cards.l.Lure.class)); - cards.add(new SetCardInfo("Magnetic Mountain", 162, Rarity.RARE, mage.cards.m.MagneticMountain.class)); + cards.add(new SetCardInfo("Lord of the Pit", 116, Rarity.RARE, mage.cards.l.LordOfThePit.class)); + cards.add(new SetCardInfo("Lure", 212, Rarity.UNCOMMON, mage.cards.l.Lure.class)); + cards.add(new SetCardInfo("Magnetic Mountain", 163, Rarity.RARE, mage.cards.m.MagneticMountain.class)); cards.add(new SetCardInfo("Mahamoti Djinn", 66, Rarity.RARE, mage.cards.m.MahamotiDjinn.class)); - cards.add(new SetCardInfo("Manabarbs", 164, Rarity.RARE, mage.cards.m.Manabarbs.class)); - cards.add(new SetCardInfo("Mana Flare", 163, Rarity.RARE, mage.cards.m.ManaFlare.class)); + cards.add(new SetCardInfo("Mana Flare", 164, Rarity.RARE, mage.cards.m.ManaFlare.class)); cards.add(new SetCardInfo("Mana Short", 67, Rarity.RARE, mage.cards.m.ManaShort.class)); cards.add(new SetCardInfo("Mana Vault", 263, Rarity.RARE, mage.cards.m.ManaVault.class)); + cards.add(new SetCardInfo("Manabarbs", 165, Rarity.RARE, mage.cards.m.Manabarbs.class)); cards.add(new SetCardInfo("Meekstone", 264, Rarity.RARE, mage.cards.m.Meekstone.class)); cards.add(new SetCardInfo("Merfolk of the Pearl Trident", 68, Rarity.COMMON, mage.cards.m.MerfolkOfThePearlTrident.class)); - cards.add(new SetCardInfo("Mesa Pegasus", 212, Rarity.COMMON, mage.cards.m.MesaPegasus.class)); - cards.add(new SetCardInfo("Mijae Djinn", 165, Rarity.RARE, mage.cards.m.MijaeDjinn.class)); + cards.add(new SetCardInfo("Mesa Pegasus", 28, Rarity.COMMON, mage.cards.m.MesaPegasus.class)); + cards.add(new SetCardInfo("Mijae Djinn", 166, Rarity.RARE, mage.cards.m.MijaeDjinn.class)); cards.add(new SetCardInfo("Millstone", 265, Rarity.RARE, mage.cards.m.Millstone.class)); - cards.add(new SetCardInfo("Mind Twist", 25, Rarity.RARE, mage.cards.m.MindTwist.class)); + cards.add(new SetCardInfo("Mind Twist", 117, Rarity.RARE, mage.cards.m.MindTwist.class)); cards.add(new SetCardInfo("Mishra's War Machine", 266, Rarity.RARE, mage.cards.m.MishrasWarMachine.class)); - cards.add(new SetCardInfo("Mons's Goblin Raiders", 166, Rarity.COMMON, mage.cards.m.MonssGoblinRaiders.class)); - cards.add(new SetCardInfo("Mountain", 290, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mountain", 291, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mountain", 292, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Nether Shadow", 26, Rarity.RARE, mage.cards.n.NetherShadow.class)); - cards.add(new SetCardInfo("Nettling Imp", 27, Rarity.UNCOMMON, mage.cards.n.NettlingImp.class)); + cards.add(new SetCardInfo("Mons's Goblin Raiders", 167, Rarity.COMMON, mage.cards.m.MonssGoblinRaiders.class)); + cards.add(new SetCardInfo("Mountain", 301, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 302, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 303, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Nether Shadow", 118, Rarity.RARE, mage.cards.n.NetherShadow.class)); + cards.add(new SetCardInfo("Nettling Imp", 119, Rarity.UNCOMMON, mage.cards.n.NettlingImp.class)); cards.add(new SetCardInfo("Nevinyrral's Disk", 267, Rarity.RARE, mage.cards.n.NevinyrralsDisk.class)); - cards.add(new SetCardInfo("Nightmare", 28, Rarity.RARE, mage.cards.n.Nightmare.class)); - cards.add(new SetCardInfo("Northern Paladin", 213, Rarity.RARE, mage.cards.n.NorthernPaladin.class)); + cards.add(new SetCardInfo("Nightmare", 120, Rarity.RARE, mage.cards.n.Nightmare.class)); + cards.add(new SetCardInfo("Northern Paladin", 29, Rarity.RARE, mage.cards.n.NorthernPaladin.class)); cards.add(new SetCardInfo("Obsianus Golem", 268, Rarity.UNCOMMON, mage.cards.o.ObsianusGolem.class)); cards.add(new SetCardInfo("Onulet", 269, Rarity.RARE, mage.cards.o.Onulet.class)); - cards.add(new SetCardInfo("Orcish Artillery", 167, Rarity.UNCOMMON, mage.cards.o.OrcishArtillery.class)); - cards.add(new SetCardInfo("Orcish Oriflamme", 168, Rarity.UNCOMMON, mage.cards.o.OrcishOriflamme.class)); + cards.add(new SetCardInfo("Orcish Artillery", 168, Rarity.UNCOMMON, mage.cards.o.OrcishArtillery.class)); + cards.add(new SetCardInfo("Orcish Oriflamme", 169, Rarity.UNCOMMON, mage.cards.o.OrcishOriflamme.class)); cards.add(new SetCardInfo("Ornithopter", 270, Rarity.UNCOMMON, mage.cards.o.Ornithopter.class)); - cards.add(new SetCardInfo("Paralyze", 29, Rarity.COMMON, mage.cards.p.Paralyze.class)); - cards.add(new SetCardInfo("Pearled Unicorn", 214, Rarity.COMMON, mage.cards.p.PearledUnicorn.class)); - cards.add(new SetCardInfo("Personal Incarnation", 215, Rarity.RARE, mage.cards.p.PersonalIncarnation.class)); - cards.add(new SetCardInfo("Pestilence", 30, Rarity.COMMON, mage.cards.p.Pestilence.class)); + cards.add(new SetCardInfo("Paralyze", 121, Rarity.COMMON, mage.cards.p.Paralyze.class)); + cards.add(new SetCardInfo("Pearled Unicorn", 30, Rarity.COMMON, mage.cards.p.PearledUnicorn.class)); + cards.add(new SetCardInfo("Personal Incarnation", 31, Rarity.RARE, mage.cards.p.PersonalIncarnation.class)); + cards.add(new SetCardInfo("Pestilence", 122, Rarity.COMMON, mage.cards.p.Pestilence.class)); cards.add(new SetCardInfo("Phantasmal Forces", 69, Rarity.UNCOMMON, mage.cards.p.PhantasmalForces.class)); cards.add(new SetCardInfo("Phantasmal Terrain", 70, Rarity.COMMON, mage.cards.p.PhantasmalTerrain.class)); cards.add(new SetCardInfo("Phantom Monster", 71, Rarity.UNCOMMON, mage.cards.p.PhantomMonster.class)); cards.add(new SetCardInfo("Pirate Ship", 72, Rarity.RARE, mage.cards.p.PirateShip.class)); - cards.add(new SetCardInfo("Plague Rats", 31, Rarity.COMMON, mage.cards.p.PlagueRats.class)); + cards.add(new SetCardInfo("Plague Rats", 123, Rarity.COMMON, mage.cards.p.PlagueRats.class)); + cards.add(new SetCardInfo("Plains", 292, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Plains", 293, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Plains", 294, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Plains", 295, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Plateau", 296, Rarity.RARE, mage.cards.p.Plateau.class)); + cards.add(new SetCardInfo("Plateau", 284, Rarity.RARE, mage.cards.p.Plateau.class)); cards.add(new SetCardInfo("Power Leak", 73, Rarity.COMMON, mage.cards.p.PowerLeak.class)); cards.add(new SetCardInfo("Power Sink", 74, Rarity.COMMON, mage.cards.p.PowerSink.class)); - cards.add(new SetCardInfo("Power Surge", 169, Rarity.RARE, mage.cards.p.PowerSurge.class)); + cards.add(new SetCardInfo("Power Surge", 170, Rarity.RARE, mage.cards.p.PowerSurge.class)); cards.add(new SetCardInfo("Primal Clay", 271, Rarity.RARE, mage.cards.p.PrimalClay.class)); cards.add(new SetCardInfo("Prodigal Sorcerer", 75, Rarity.COMMON, mage.cards.p.ProdigalSorcerer.class)); cards.add(new SetCardInfo("Psychic Venom", 76, Rarity.COMMON, mage.cards.p.PsychicVenom.class)); - cards.add(new SetCardInfo("Purelace", 216, Rarity.RARE, mage.cards.p.Purelace.class)); - cards.add(new SetCardInfo("Raise Dead", 32, Rarity.COMMON, mage.cards.r.RaiseDead.class)); + cards.add(new SetCardInfo("Purelace", 32, Rarity.RARE, mage.cards.p.Purelace.class)); + cards.add(new SetCardInfo("Raise Dead", 124, Rarity.COMMON, mage.cards.r.RaiseDead.class)); cards.add(new SetCardInfo("Reconstruction", 77, Rarity.COMMON, mage.cards.r.Reconstruction.class)); - cards.add(new SetCardInfo("Red Elemental Blast", 170, Rarity.COMMON, mage.cards.r.RedElementalBlast.class)); - cards.add(new SetCardInfo("Red Ward", 217, Rarity.UNCOMMON, mage.cards.r.RedWard.class)); - cards.add(new SetCardInfo("Regeneration", 120, Rarity.COMMON, mage.cards.r.Regeneration.class)); - cards.add(new SetCardInfo("Regrowth", 121, Rarity.UNCOMMON, mage.cards.r.Regrowth.class)); - cards.add(new SetCardInfo("Resurrection", 218, Rarity.UNCOMMON, mage.cards.r.Resurrection.class)); - cards.add(new SetCardInfo("Reverse Damage", 219, Rarity.RARE, mage.cards.r.ReverseDamage.class)); - cards.add(new SetCardInfo("Reverse Polarity", 220, Rarity.UNCOMMON, mage.cards.r.ReversePolarity.class)); - cards.add(new SetCardInfo("Righteousness", 221, Rarity.RARE, mage.cards.r.Righteousness.class)); - cards.add(new SetCardInfo("Roc of Kher Ridges", 171, Rarity.RARE, mage.cards.r.RocOfKherRidges.class)); - cards.add(new SetCardInfo("Rock Hydra", 172, Rarity.RARE, mage.cards.r.RockHydra.class)); + cards.add(new SetCardInfo("Red Elemental Blast", 171, Rarity.COMMON, mage.cards.r.RedElementalBlast.class)); + cards.add(new SetCardInfo("Red Ward", 33, Rarity.UNCOMMON, mage.cards.r.RedWard.class)); + cards.add(new SetCardInfo("Regeneration", 213, Rarity.COMMON, mage.cards.r.Regeneration.class)); + cards.add(new SetCardInfo("Regrowth", 214, Rarity.UNCOMMON, mage.cards.r.Regrowth.class)); + cards.add(new SetCardInfo("Resurrection", 34, Rarity.UNCOMMON, mage.cards.r.Resurrection.class)); + cards.add(new SetCardInfo("Reverse Damage", 35, Rarity.RARE, mage.cards.r.ReverseDamage.class)); + cards.add(new SetCardInfo("Reverse Polarity", 36, Rarity.UNCOMMON, mage.cards.r.ReversePolarity.class)); + cards.add(new SetCardInfo("Righteousness", 37, Rarity.RARE, mage.cards.r.Righteousness.class)); + cards.add(new SetCardInfo("Roc of Kher Ridges", 172, Rarity.RARE, mage.cards.r.RocOfKherRidges.class)); + cards.add(new SetCardInfo("Rock Hydra", 173, Rarity.RARE, mage.cards.r.RockHydra.class)); cards.add(new SetCardInfo("Rocket Launcher", 272, Rarity.RARE, mage.cards.r.RocketLauncher.class)); cards.add(new SetCardInfo("Rod of Ruin", 273, Rarity.UNCOMMON, mage.cards.r.RodOfRuin.class)); - cards.add(new SetCardInfo("Royal Assassin", 33, Rarity.RARE, mage.cards.r.RoyalAssassin.class)); - cards.add(new SetCardInfo("Sacrifice", 34, Rarity.UNCOMMON, mage.cards.s.Sacrifice.class)); - cards.add(new SetCardInfo("Samite Healer", 222, Rarity.COMMON, mage.cards.s.SamiteHealer.class)); - cards.add(new SetCardInfo("Savannah", 297, Rarity.RARE, mage.cards.s.Savannah.class)); - cards.add(new SetCardInfo("Savannah Lions", 223, Rarity.RARE, mage.cards.s.SavannahLions.class)); - cards.add(new SetCardInfo("Scathe Zombies", 35, Rarity.COMMON, mage.cards.s.ScatheZombies.class)); - cards.add(new SetCardInfo("Scavenging Ghoul", 36, Rarity.UNCOMMON, mage.cards.s.ScavengingGhoul.class)); - cards.add(new SetCardInfo("Scrubland", 298, Rarity.RARE, mage.cards.s.Scrubland.class)); - cards.add(new SetCardInfo("Scryb Sprites", 122, Rarity.COMMON, mage.cards.s.ScrybSprites.class)); + cards.add(new SetCardInfo("Royal Assassin", 125, Rarity.RARE, mage.cards.r.RoyalAssassin.class)); + cards.add(new SetCardInfo("Sacrifice", 126, Rarity.UNCOMMON, mage.cards.s.Sacrifice.class)); + cards.add(new SetCardInfo("Samite Healer", 38, Rarity.COMMON, mage.cards.s.SamiteHealer.class)); + cards.add(new SetCardInfo("Savannah Lions", 39, Rarity.RARE, mage.cards.s.SavannahLions.class)); + cards.add(new SetCardInfo("Savannah", 285, Rarity.RARE, mage.cards.s.Savannah.class)); + cards.add(new SetCardInfo("Scathe Zombies", 127, Rarity.COMMON, mage.cards.s.ScatheZombies.class)); + cards.add(new SetCardInfo("Scavenging Ghoul", 128, Rarity.UNCOMMON, mage.cards.s.ScavengingGhoul.class)); + cards.add(new SetCardInfo("Scrubland", 286, Rarity.RARE, mage.cards.s.Scrubland.class)); + cards.add(new SetCardInfo("Scryb Sprites", 215, Rarity.COMMON, mage.cards.s.ScrybSprites.class)); cards.add(new SetCardInfo("Sea Serpent", 78, Rarity.COMMON, mage.cards.s.SeaSerpent.class)); - cards.add(new SetCardInfo("Sedge Troll", 173, Rarity.RARE, mage.cards.s.SedgeTroll.class)); - cards.add(new SetCardInfo("Sengir Vampire", 37, Rarity.UNCOMMON, mage.cards.s.SengirVampire.class)); + cards.add(new SetCardInfo("Sedge Troll", 174, Rarity.RARE, mage.cards.s.SedgeTroll.class)); + cards.add(new SetCardInfo("Sengir Vampire", 129, Rarity.UNCOMMON, mage.cards.s.SengirVampire.class)); cards.add(new SetCardInfo("Serendib Efreet", 79, Rarity.RARE, mage.cards.s.SerendibEfreet.class)); - cards.add(new SetCardInfo("Serra Angel", 224, Rarity.UNCOMMON, mage.cards.s.SerraAngel.class)); - cards.add(new SetCardInfo("Shanodin Dryads", 123, Rarity.COMMON, mage.cards.s.ShanodinDryads.class)); - cards.add(new SetCardInfo("Shatter", 174, Rarity.COMMON, mage.cards.s.Shatter.class)); - cards.add(new SetCardInfo("Shatterstorm", 175, Rarity.UNCOMMON, mage.cards.s.Shatterstorm.class)); - cards.add(new SetCardInfo("Shivan Dragon", 176, Rarity.RARE, mage.cards.s.ShivanDragon.class)); - cards.add(new SetCardInfo("Simulacrum", 38, Rarity.UNCOMMON, mage.cards.s.Simulacrum.class)); + cards.add(new SetCardInfo("Serra Angel", 40, Rarity.UNCOMMON, mage.cards.s.SerraAngel.class)); + cards.add(new SetCardInfo("Shanodin Dryads", 216, Rarity.COMMON, mage.cards.s.ShanodinDryads.class)); + cards.add(new SetCardInfo("Shatter", 175, Rarity.COMMON, mage.cards.s.Shatter.class)); + cards.add(new SetCardInfo("Shatterstorm", 176, Rarity.UNCOMMON, mage.cards.s.Shatterstorm.class)); + cards.add(new SetCardInfo("Shivan Dragon", 177, Rarity.RARE, mage.cards.s.ShivanDragon.class)); + cards.add(new SetCardInfo("Simulacrum", 130, Rarity.UNCOMMON, mage.cards.s.Simulacrum.class)); cards.add(new SetCardInfo("Siren's Call", 80, Rarity.UNCOMMON, mage.cards.s.SirensCall.class)); - cards.add(new SetCardInfo("Smoke", 177, Rarity.RARE, mage.cards.s.Smoke.class)); + cards.add(new SetCardInfo("Smoke", 178, Rarity.RARE, mage.cards.s.Smoke.class)); cards.add(new SetCardInfo("Sol Ring", 274, Rarity.UNCOMMON, mage.cards.s.SolRing.class)); - cards.add(new SetCardInfo("Sorceress Queen", 39, Rarity.RARE, mage.cards.s.SorceressQueen.class)); + cards.add(new SetCardInfo("Sorceress Queen", 131, Rarity.RARE, mage.cards.s.SorceressQueen.class)); cards.add(new SetCardInfo("Soul Net", 275, Rarity.UNCOMMON, mage.cards.s.SoulNet.class)); cards.add(new SetCardInfo("Spell Blast", 82, Rarity.COMMON, mage.cards.s.SpellBlast.class)); cards.add(new SetCardInfo("Stasis", 83, Rarity.RARE, mage.cards.s.Stasis.class)); cards.add(new SetCardInfo("Steal Artifact", 84, Rarity.UNCOMMON, mage.cards.s.StealArtifact.class)); - cards.add(new SetCardInfo("Stone Giant", 178, Rarity.UNCOMMON, mage.cards.s.StoneGiant.class)); - cards.add(new SetCardInfo("Stone Rain", 179, Rarity.COMMON, mage.cards.s.StoneRain.class)); - cards.add(new SetCardInfo("Stream of Life", 124, Rarity.COMMON, mage.cards.s.StreamOfLife.class)); + cards.add(new SetCardInfo("Stone Giant", 179, Rarity.UNCOMMON, mage.cards.s.StoneGiant.class)); + cards.add(new SetCardInfo("Stone Rain", 180, Rarity.COMMON, mage.cards.s.StoneRain.class)); + cards.add(new SetCardInfo("Stream of Life", 217, Rarity.COMMON, mage.cards.s.StreamOfLife.class)); cards.add(new SetCardInfo("Sunglasses of Urza", 276, Rarity.RARE, mage.cards.s.SunglassesOfUrza.class)); + cards.add(new SetCardInfo("Swamp", 298, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Swamp", 299, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Swamp", 300, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Swamp", 301, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Swords to Plowshares", 225, Rarity.UNCOMMON, mage.cards.s.SwordsToPlowshares.class)); - cards.add(new SetCardInfo("Taiga", 302, Rarity.RARE, mage.cards.t.Taiga.class)); - cards.add(new SetCardInfo("Terror", 40, Rarity.COMMON, mage.cards.t.Terror.class)); + cards.add(new SetCardInfo("Swords to Plowshares", 41, Rarity.UNCOMMON, mage.cards.s.SwordsToPlowshares.class)); + cards.add(new SetCardInfo("Taiga", 287, Rarity.RARE, mage.cards.t.Taiga.class)); + cards.add(new SetCardInfo("Terror", 132, Rarity.COMMON, mage.cards.t.Terror.class)); cards.add(new SetCardInfo("The Hive", 277, Rarity.RARE, mage.cards.t.TheHive.class)); cards.add(new SetCardInfo("The Rack", 278, Rarity.UNCOMMON, mage.cards.t.TheRack.class)); - cards.add(new SetCardInfo("Thicket Basilisk", 125, Rarity.UNCOMMON, mage.cards.t.ThicketBasilisk.class)); + cards.add(new SetCardInfo("Thicket Basilisk", 218, Rarity.UNCOMMON, mage.cards.t.ThicketBasilisk.class)); cards.add(new SetCardInfo("Thoughtlace", 85, Rarity.RARE, mage.cards.t.Thoughtlace.class)); cards.add(new SetCardInfo("Throne of Bone", 279, Rarity.UNCOMMON, mage.cards.t.ThroneOfBone.class)); - cards.add(new SetCardInfo("Timber Wolves", 126, Rarity.RARE, mage.cards.t.TimberWolves.class)); - cards.add(new SetCardInfo("Titania's Song", 127, Rarity.RARE, mage.cards.t.TitaniasSong.class)); - cards.add(new SetCardInfo("Tranquility", 128, Rarity.COMMON, mage.cards.t.Tranquility.class)); - cards.add(new SetCardInfo("Tropical Island", 303, Rarity.RARE, mage.cards.t.TropicalIsland.class)); - cards.add(new SetCardInfo("Tsunami", 129, Rarity.UNCOMMON, mage.cards.t.Tsunami.class)); - cards.add(new SetCardInfo("Tundra", 304, Rarity.RARE, mage.cards.t.Tundra.class)); - cards.add(new SetCardInfo("Tunnel", 180, Rarity.UNCOMMON, mage.cards.t.Tunnel.class)); - cards.add(new SetCardInfo("Underground Sea", 305, Rarity.RARE, mage.cards.u.UndergroundSea.class)); - cards.add(new SetCardInfo("Unholy Strength", 41, Rarity.COMMON, mage.cards.u.UnholyStrength.class)); + cards.add(new SetCardInfo("Timber Wolves", 219, Rarity.RARE, mage.cards.t.TimberWolves.class)); + cards.add(new SetCardInfo("Titania's Song", 220, Rarity.RARE, mage.cards.t.TitaniasSong.class)); + cards.add(new SetCardInfo("Tranquility", 221, Rarity.COMMON, mage.cards.t.Tranquility.class)); + cards.add(new SetCardInfo("Tropical Island", 288, Rarity.RARE, mage.cards.t.TropicalIsland.class)); + cards.add(new SetCardInfo("Tsunami", 222, Rarity.UNCOMMON, mage.cards.t.Tsunami.class)); + cards.add(new SetCardInfo("Tundra", 289, Rarity.RARE, mage.cards.t.Tundra.class)); + cards.add(new SetCardInfo("Tunnel", 181, Rarity.UNCOMMON, mage.cards.t.Tunnel.class)); + cards.add(new SetCardInfo("Underground Sea", 290, Rarity.RARE, mage.cards.u.UndergroundSea.class)); + cards.add(new SetCardInfo("Unholy Strength", 133, Rarity.COMMON, mage.cards.u.UnholyStrength.class)); cards.add(new SetCardInfo("Unstable Mutation", 86, Rarity.COMMON, mage.cards.u.UnstableMutation.class)); cards.add(new SetCardInfo("Unsummon", 87, Rarity.COMMON, mage.cards.u.Unsummon.class)); - cards.add(new SetCardInfo("Uthden Troll", 181, Rarity.UNCOMMON, mage.cards.u.UthdenTroll.class)); - cards.add(new SetCardInfo("Verduran Enchantress", 130, Rarity.RARE, mage.cards.v.VerduranEnchantress.class)); + cards.add(new SetCardInfo("Uthden Troll", 182, Rarity.UNCOMMON, mage.cards.u.UthdenTroll.class)); + cards.add(new SetCardInfo("Verduran Enchantress", 223, Rarity.RARE, mage.cards.v.VerduranEnchantress.class)); cards.add(new SetCardInfo("Vesuvan Doppelganger", 88, Rarity.RARE, mage.cards.v.VesuvanDoppelganger.class)); - cards.add(new SetCardInfo("Veteran Bodyguard", 226, Rarity.RARE, mage.cards.v.VeteranBodyguard.class)); + cards.add(new SetCardInfo("Veteran Bodyguard", 42, Rarity.RARE, mage.cards.v.VeteranBodyguard.class)); cards.add(new SetCardInfo("Volcanic Eruption", 89, Rarity.RARE, mage.cards.v.VolcanicEruption.class)); - cards.add(new SetCardInfo("Volcanic Island", 306, Rarity.RARE, mage.cards.v.VolcanicIsland.class)); + cards.add(new SetCardInfo("Volcanic Island", 291, Rarity.RARE, mage.cards.v.VolcanicIsland.class)); cards.add(new SetCardInfo("Wall of Air", 90, Rarity.UNCOMMON, mage.cards.w.WallOfAir.class)); - cards.add(new SetCardInfo("Wall of Bone", 42, Rarity.UNCOMMON, mage.cards.w.WallOfBone.class)); - cards.add(new SetCardInfo("Wall of Brambles", 131, Rarity.UNCOMMON, mage.cards.w.WallOfBrambles.class)); - cards.add(new SetCardInfo("Wall of Fire", 182, Rarity.UNCOMMON, mage.cards.w.WallOfFire.class)); - cards.add(new SetCardInfo("Wall of Ice", 132, Rarity.UNCOMMON, mage.cards.w.WallOfIce.class)); - cards.add(new SetCardInfo("Wall of Stone", 183, Rarity.UNCOMMON, mage.cards.w.WallOfStone.class)); - cards.add(new SetCardInfo("Wall of Swords", 227, Rarity.UNCOMMON, mage.cards.w.WallOfSwords.class)); + cards.add(new SetCardInfo("Wall of Bone", 134, Rarity.UNCOMMON, mage.cards.w.WallOfBone.class)); + cards.add(new SetCardInfo("Wall of Brambles", 224, Rarity.UNCOMMON, mage.cards.w.WallOfBrambles.class)); + cards.add(new SetCardInfo("Wall of Fire", 183, Rarity.UNCOMMON, mage.cards.w.WallOfFire.class)); + cards.add(new SetCardInfo("Wall of Ice", 225, Rarity.UNCOMMON, mage.cards.w.WallOfIce.class)); + cards.add(new SetCardInfo("Wall of Stone", 184, Rarity.UNCOMMON, mage.cards.w.WallOfStone.class)); + cards.add(new SetCardInfo("Wall of Swords", 43, Rarity.UNCOMMON, mage.cards.w.WallOfSwords.class)); cards.add(new SetCardInfo("Wall of Water", 91, Rarity.UNCOMMON, mage.cards.w.WallOfWater.class)); - cards.add(new SetCardInfo("Wall of Wood", 133, Rarity.COMMON, mage.cards.w.WallOfWood.class)); - cards.add(new SetCardInfo("Wanderlust", 134, Rarity.UNCOMMON, mage.cards.w.Wanderlust.class)); - cards.add(new SetCardInfo("War Mammoth", 135, Rarity.COMMON, mage.cards.w.WarMammoth.class)); - cards.add(new SetCardInfo("Warp Artifact", 43, Rarity.RARE, mage.cards.w.WarpArtifact.class)); + cards.add(new SetCardInfo("Wall of Wood", 226, Rarity.COMMON, mage.cards.w.WallOfWood.class)); + cards.add(new SetCardInfo("Wanderlust", 227, Rarity.UNCOMMON, mage.cards.w.Wanderlust.class)); + cards.add(new SetCardInfo("War Mammoth", 228, Rarity.COMMON, mage.cards.w.WarMammoth.class)); + cards.add(new SetCardInfo("Warp Artifact", 135, Rarity.RARE, mage.cards.w.WarpArtifact.class)); cards.add(new SetCardInfo("Water Elemental", 92, Rarity.UNCOMMON, mage.cards.w.WaterElemental.class)); - cards.add(new SetCardInfo("Weakness", 44, Rarity.COMMON, mage.cards.w.Weakness.class)); - cards.add(new SetCardInfo("Web", 136, Rarity.RARE, mage.cards.w.Web.class)); - cards.add(new SetCardInfo("Wheel of Fortune", 184, Rarity.RARE, mage.cards.w.WheelOfFortune.class)); - cards.add(new SetCardInfo("White Knight", 228, Rarity.UNCOMMON, mage.cards.w.WhiteKnight.class)); - cards.add(new SetCardInfo("White Ward", 229, Rarity.UNCOMMON, mage.cards.w.WhiteWard.class)); - cards.add(new SetCardInfo("Wild Growth", 137, Rarity.COMMON, mage.cards.w.WildGrowth.class)); - cards.add(new SetCardInfo("Will-o'-the-Wisp", 45, Rarity.RARE, mage.cards.w.WillOTheWisp.class)); + cards.add(new SetCardInfo("Weakness", 136, Rarity.COMMON, mage.cards.w.Weakness.class)); + cards.add(new SetCardInfo("Web", 229, Rarity.RARE, mage.cards.w.Web.class)); + cards.add(new SetCardInfo("Wheel of Fortune", 185, Rarity.RARE, mage.cards.w.WheelOfFortune.class)); + cards.add(new SetCardInfo("White Knight", 44, Rarity.UNCOMMON, mage.cards.w.WhiteKnight.class)); + cards.add(new SetCardInfo("White Ward", 45, Rarity.UNCOMMON, mage.cards.w.WhiteWard.class)); + cards.add(new SetCardInfo("Wild Growth", 230, Rarity.COMMON, mage.cards.w.WildGrowth.class)); + cards.add(new SetCardInfo("Will-o'-the-Wisp", 137, Rarity.RARE, mage.cards.w.WillOTheWisp.class)); cards.add(new SetCardInfo("Winter Orb", 280, Rarity.RARE, mage.cards.w.WinterOrb.class)); cards.add(new SetCardInfo("Wooden Sphere", 281, Rarity.UNCOMMON, mage.cards.w.WoodenSphere.class)); - cards.add(new SetCardInfo("Wrath of God", 230, Rarity.RARE, mage.cards.w.WrathOfGod.class)); - cards.add(new SetCardInfo("Zombie Master", 46, Rarity.RARE, mage.cards.z.ZombieMaster.class)); + cards.add(new SetCardInfo("Wrath of God", 46, Rarity.RARE, mage.cards.w.WrathOfGod.class)); + cards.add(new SetCardInfo("Zombie Master", 138, Rarity.RARE, mage.cards.z.ZombieMaster.class)); } } From 16b3a8b8e4f34c3b2a6503057b2a75a1abaea556 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Wed, 9 May 2018 03:27:21 +0400 Subject: [PATCH 100/158] Fixed card numbers in LEG - Legends (#4628) --- Mage.Sets/src/mage/sets/Legends.java | 444 +++++++++++++-------------- 1 file changed, 222 insertions(+), 222 deletions(-) diff --git a/Mage.Sets/src/mage/sets/Legends.java b/Mage.Sets/src/mage/sets/Legends.java index 982e71291f8..53af4fce9f1 100644 --- a/Mage.Sets/src/mage/sets/Legends.java +++ b/Mage.Sets/src/mage/sets/Legends.java @@ -52,269 +52,269 @@ public class Legends extends ExpansionSet { this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; - cards.add(new SetCardInfo("Abomination", 1, Rarity.UNCOMMON, mage.cards.a.Abomination.class)); + cards.add(new SetCardInfo("Abomination", 87, Rarity.UNCOMMON, mage.cards.a.Abomination.class)); cards.add(new SetCardInfo("Acid Rain", 44, Rarity.RARE, mage.cards.a.AcidRain.class)); cards.add(new SetCardInfo("Active Volcano", 130, Rarity.COMMON, mage.cards.a.ActiveVolcano.class)); - cards.add(new SetCardInfo("Adun Oakenshield", 256, Rarity.RARE, mage.cards.a.AdunOakenshield.class)); + cards.add(new SetCardInfo("Adun Oakenshield", 216, Rarity.RARE, mage.cards.a.AdunOakenshield.class)); cards.add(new SetCardInfo("Aerathi Berserker", 131, Rarity.UNCOMMON, mage.cards.a.AerathiBerserker.class)); - cards.add(new SetCardInfo("Aisling Leprechaun", 87, Rarity.COMMON, mage.cards.a.AislingLeprechaun.class)); - cards.add(new SetCardInfo("Akron Legionnaire", 170, Rarity.RARE, mage.cards.a.AkronLegionnaire.class)); - cards.add(new SetCardInfo("Al-abara's Carpet", 213, Rarity.RARE, mage.cards.a.AlAbarasCarpet.class)); - cards.add(new SetCardInfo("Alabaster Potion", 171, Rarity.COMMON, mage.cards.a.AlabasterPotion.class)); - cards.add(new SetCardInfo("Alchor's Tomb", 214, Rarity.RARE, mage.cards.a.AlchorsTomb.class)); - cards.add(new SetCardInfo("All Hallow's Eve", 2, Rarity.RARE, mage.cards.a.AllHallowsEve.class)); - cards.add(new SetCardInfo("Amrou Kithkin", 172, Rarity.COMMON, mage.cards.a.AmrouKithkin.class)); - cards.add(new SetCardInfo("Angelic Voices", 173, Rarity.RARE, mage.cards.a.AngelicVoices.class)); - cards.add(new SetCardInfo("Angus Mackenzie", 257, Rarity.RARE, mage.cards.a.AngusMackenzie.class)); + cards.add(new SetCardInfo("Aisling Leprechaun", 173, Rarity.COMMON, mage.cards.a.AislingLeprechaun.class)); + cards.add(new SetCardInfo("Akron Legionnaire", 1, Rarity.RARE, mage.cards.a.AkronLegionnaire.class)); + cards.add(new SetCardInfo("Al-abara's Carpet", 271, Rarity.RARE, mage.cards.a.AlAbarasCarpet.class)); + cards.add(new SetCardInfo("Alabaster Potion", 2, Rarity.COMMON, mage.cards.a.AlabasterPotion.class)); + cards.add(new SetCardInfo("Alchor's Tomb", 272, Rarity.RARE, mage.cards.a.AlchorsTomb.class)); + cards.add(new SetCardInfo("All Hallow's Eve", 88, Rarity.RARE, mage.cards.a.AllHallowsEve.class)); + cards.add(new SetCardInfo("Amrou Kithkin", 3, Rarity.COMMON, mage.cards.a.AmrouKithkin.class)); + cards.add(new SetCardInfo("Angelic Voices", 4, Rarity.RARE, mage.cards.a.AngelicVoices.class)); + cards.add(new SetCardInfo("Angus Mackenzie", 217, Rarity.RARE, mage.cards.a.AngusMackenzie.class)); cards.add(new SetCardInfo("Anti-Magic Aura", 45, Rarity.COMMON, mage.cards.a.AntiMagicAura.class)); - cards.add(new SetCardInfo("Arboria", 88, Rarity.UNCOMMON, mage.cards.a.Arboria.class)); - cards.add(new SetCardInfo("Arcades Sabboth", 258, Rarity.RARE, mage.cards.a.ArcadesSabboth.class)); - cards.add(new SetCardInfo("Arena of the Ancients", 215, Rarity.RARE, mage.cards.a.ArenaOfTheAncients.class)); - cards.add(new SetCardInfo("Avoid Fate", 89, Rarity.COMMON, mage.cards.a.AvoidFate.class)); - cards.add(new SetCardInfo("Axelrod Gunnarson", 259, Rarity.RARE, mage.cards.a.AxelrodGunnarson.class)); - cards.add(new SetCardInfo("Ayesha Tanaka", 260, Rarity.RARE, mage.cards.a.AyeshaTanaka.class)); + cards.add(new SetCardInfo("Arboria", 174, Rarity.UNCOMMON, mage.cards.a.Arboria.class)); + cards.add(new SetCardInfo("Arcades Sabboth", 218, Rarity.RARE, mage.cards.a.ArcadesSabboth.class)); + cards.add(new SetCardInfo("Arena of the Ancients", 273, Rarity.RARE, mage.cards.a.ArenaOfTheAncients.class)); + cards.add(new SetCardInfo("Avoid Fate", 175, Rarity.COMMON, mage.cards.a.AvoidFate.class)); + cards.add(new SetCardInfo("Axelrod Gunnarson", 219, Rarity.RARE, mage.cards.a.AxelrodGunnarson.class)); + cards.add(new SetCardInfo("Ayesha Tanaka", 220, Rarity.RARE, mage.cards.a.AyeshaTanaka.class)); cards.add(new SetCardInfo("Azure Drake", 46, Rarity.UNCOMMON, mage.cards.a.AzureDrake.class)); cards.add(new SetCardInfo("Backfire", 47, Rarity.UNCOMMON, mage.cards.b.Backfire.class)); - cards.add(new SetCardInfo("Barbary Apes", 90, Rarity.COMMON, mage.cards.b.BarbaryApes.class)); - cards.add(new SetCardInfo("Barktooth Warbeard", 261, Rarity.UNCOMMON, mage.cards.b.BarktoothWarbeard.class)); - cards.add(new SetCardInfo("Bartel Runeaxe", 262, Rarity.RARE, mage.cards.b.BartelRuneaxe.class)); + cards.add(new SetCardInfo("Barbary Apes", 176, Rarity.COMMON, mage.cards.b.BarbaryApes.class)); + cards.add(new SetCardInfo("Barktooth Warbeard", 221, Rarity.UNCOMMON, mage.cards.b.BarktoothWarbeard.class)); + cards.add(new SetCardInfo("Bartel Runeaxe", 222, Rarity.RARE, mage.cards.b.BartelRuneaxe.class)); cards.add(new SetCardInfo("Beasts of Bogardan", 133, Rarity.UNCOMMON, mage.cards.b.BeastsOfBogardan.class)); - cards.add(new SetCardInfo("Black Mana Battery", 216, Rarity.UNCOMMON, mage.cards.b.BlackManaBattery.class)); - cards.add(new SetCardInfo("Blight", 3, Rarity.UNCOMMON, mage.cards.b.Blight.class)); + cards.add(new SetCardInfo("Black Mana Battery", 274, Rarity.UNCOMMON, mage.cards.b.BlackManaBattery.class)); + cards.add(new SetCardInfo("Blight", 89, Rarity.UNCOMMON, mage.cards.b.Blight.class)); cards.add(new SetCardInfo("Blood Lust", 135, Rarity.UNCOMMON, mage.cards.b.BloodLust.class)); - cards.add(new SetCardInfo("Blue Mana Battery", 217, Rarity.UNCOMMON, mage.cards.b.BlueManaBattery.class)); + cards.add(new SetCardInfo("Blue Mana Battery", 275, Rarity.UNCOMMON, mage.cards.b.BlueManaBattery.class)); cards.add(new SetCardInfo("Boomerang", 48, Rarity.COMMON, mage.cards.b.Boomerang.class)); - cards.add(new SetCardInfo("Boris Devilboon", 263, Rarity.RARE, mage.cards.b.BorisDevilboon.class)); - cards.add(new SetCardInfo("Carrion Ants", 4, Rarity.RARE, mage.cards.c.CarrionAnts.class)); - cards.add(new SetCardInfo("Cat Warriors", 91, Rarity.COMMON, mage.cards.c.CatWarriors.class)); + cards.add(new SetCardInfo("Boris Devilboon", 223, Rarity.RARE, mage.cards.b.BorisDevilboon.class)); + cards.add(new SetCardInfo("Carrion Ants", 90, Rarity.RARE, mage.cards.c.CarrionAnts.class)); + cards.add(new SetCardInfo("Cat Warriors", 177, Rarity.COMMON, mage.cards.c.CatWarriors.class)); cards.add(new SetCardInfo("Caverns of Despair", 136, Rarity.RARE, mage.cards.c.CavernsOfDespair.class)); cards.add(new SetCardInfo("Chain Lightning", 137, Rarity.COMMON, mage.cards.c.ChainLightning.class)); - cards.add(new SetCardInfo("Chains of Mephistopheles", 5, Rarity.RARE, mage.cards.c.ChainsOfMephistopheles.class)); - cards.add(new SetCardInfo("Chromium", 264, Rarity.RARE, mage.cards.c.Chromium.class)); - cards.add(new SetCardInfo("Cleanse", 174, Rarity.RARE, mage.cards.c.Cleanse.class)); - cards.add(new SetCardInfo("Clergy of the Holy Nimbus", 175, Rarity.COMMON, mage.cards.c.ClergyOfTheHolyNimbus.class)); - cards.add(new SetCardInfo("Concordant Crossroads", 93, Rarity.RARE, mage.cards.c.ConcordantCrossroads.class)); - cards.add(new SetCardInfo("Cosmic Horror", 6, Rarity.RARE, mage.cards.c.CosmicHorror.class)); - cards.add(new SetCardInfo("Craw Giant", 94, Rarity.UNCOMMON, mage.cards.c.CrawGiant.class)); + cards.add(new SetCardInfo("Chains of Mephistopheles", 91, Rarity.RARE, mage.cards.c.ChainsOfMephistopheles.class)); + cards.add(new SetCardInfo("Chromium", 224, Rarity.RARE, mage.cards.c.Chromium.class)); + cards.add(new SetCardInfo("Cleanse", 5, Rarity.RARE, mage.cards.c.Cleanse.class)); + cards.add(new SetCardInfo("Clergy of the Holy Nimbus", 6, Rarity.COMMON, mage.cards.c.ClergyOfTheHolyNimbus.class)); + cards.add(new SetCardInfo("Concordant Crossroads", 179, Rarity.RARE, mage.cards.c.ConcordantCrossroads.class)); + cards.add(new SetCardInfo("Cosmic Horror", 92, Rarity.RARE, mage.cards.c.CosmicHorror.class)); + cards.add(new SetCardInfo("Craw Giant", 180, Rarity.UNCOMMON, mage.cards.c.CrawGiant.class)); cards.add(new SetCardInfo("Crevasse", 138, Rarity.UNCOMMON, mage.cards.c.Crevasse.class)); - cards.add(new SetCardInfo("Crimson Kobolds", 219, Rarity.COMMON, mage.cards.c.CrimsonKobolds.class)); - cards.add(new SetCardInfo("Crimson Manticore", 139, Rarity.RARE, mage.cards.c.CrimsonManticore.class)); - cards.add(new SetCardInfo("Crookshank Kobolds", 220, Rarity.COMMON, mage.cards.c.CrookshankKobolds.class)); - cards.add(new SetCardInfo("Cyclopean Mummy", 7, Rarity.COMMON, mage.cards.c.CyclopeanMummy.class)); - cards.add(new SetCardInfo("Dakkon Blackblade", 265, Rarity.RARE, mage.cards.d.DakkonBlackblade.class)); - cards.add(new SetCardInfo("Darkness", 8, Rarity.COMMON, mage.cards.d.Darkness.class)); - cards.add(new SetCardInfo("D'Avenant Archer", 176, Rarity.COMMON, mage.cards.d.DAvenantArcher.class)); - cards.add(new SetCardInfo("Deadfall", 95, Rarity.UNCOMMON, mage.cards.d.Deadfall.class)); - cards.add(new SetCardInfo("Demonic Torment", 9, Rarity.UNCOMMON, mage.cards.d.DemonicTorment.class)); + cards.add(new SetCardInfo("Crimson Kobolds", 139, Rarity.COMMON, mage.cards.c.CrimsonKobolds.class)); + cards.add(new SetCardInfo("Crimson Manticore", 140, Rarity.RARE, mage.cards.c.CrimsonManticore.class)); + cards.add(new SetCardInfo("Crookshank Kobolds", 141, Rarity.COMMON, mage.cards.c.CrookshankKobolds.class)); + cards.add(new SetCardInfo("Cyclopean Mummy", 93, Rarity.COMMON, mage.cards.c.CyclopeanMummy.class)); + cards.add(new SetCardInfo("D'Avenant Archer", 7, Rarity.COMMON, mage.cards.d.DAvenantArcher.class)); + cards.add(new SetCardInfo("Dakkon Blackblade", 225, Rarity.RARE, mage.cards.d.DakkonBlackblade.class)); + cards.add(new SetCardInfo("Darkness", 94, Rarity.COMMON, mage.cards.d.Darkness.class)); + cards.add(new SetCardInfo("Deadfall", 181, Rarity.UNCOMMON, mage.cards.d.Deadfall.class)); + cards.add(new SetCardInfo("Demonic Torment", 95, Rarity.UNCOMMON, mage.cards.d.DemonicTorment.class)); cards.add(new SetCardInfo("Devouring Deep", 50, Rarity.COMMON, mage.cards.d.DevouringDeep.class)); - cards.add(new SetCardInfo("Disharmony", 140, Rarity.RARE, mage.cards.d.Disharmony.class)); - cards.add(new SetCardInfo("Divine Intervention", 177, Rarity.RARE, mage.cards.d.DivineIntervention.class)); - cards.add(new SetCardInfo("Divine Offering", 178, Rarity.COMMON, mage.cards.d.DivineOffering.class)); - cards.add(new SetCardInfo("Divine Transformation", 179, Rarity.RARE, mage.cards.d.DivineTransformation.class)); + cards.add(new SetCardInfo("Disharmony", 142, Rarity.RARE, mage.cards.d.Disharmony.class)); + cards.add(new SetCardInfo("Divine Intervention", 8, Rarity.RARE, mage.cards.d.DivineIntervention.class)); + cards.add(new SetCardInfo("Divine Offering", 9, Rarity.COMMON, mage.cards.d.DivineOffering.class)); + cards.add(new SetCardInfo("Divine Transformation", 10, Rarity.RARE, mage.cards.d.DivineTransformation.class)); cards.add(new SetCardInfo("Dream Coat", 51, Rarity.UNCOMMON, mage.cards.d.DreamCoat.class)); - cards.add(new SetCardInfo("Durkwood Boars", 96, Rarity.COMMON, mage.cards.d.DurkwoodBoars.class)); - cards.add(new SetCardInfo("Dwarven Song", 141, Rarity.UNCOMMON, mage.cards.d.DwarvenSong.class)); - cards.add(new SetCardInfo("Elder Land Wurm", 180, Rarity.RARE, mage.cards.e.ElderLandWurm.class)); - cards.add(new SetCardInfo("Elven Riders", 97, Rarity.RARE, mage.cards.e.ElvenRiders.class)); - cards.add(new SetCardInfo("Emerald Dragonfly", 98, Rarity.COMMON, mage.cards.e.EmeraldDragonfly.class)); + cards.add(new SetCardInfo("Durkwood Boars", 182, Rarity.COMMON, mage.cards.d.DurkwoodBoars.class)); + cards.add(new SetCardInfo("Dwarven Song", 143, Rarity.UNCOMMON, mage.cards.d.DwarvenSong.class)); + cards.add(new SetCardInfo("Elder Land Wurm", 11, Rarity.RARE, mage.cards.e.ElderLandWurm.class)); + cards.add(new SetCardInfo("Elven Riders", 183, Rarity.RARE, mage.cards.e.ElvenRiders.class)); + cards.add(new SetCardInfo("Emerald Dragonfly", 184, Rarity.COMMON, mage.cards.e.EmeraldDragonfly.class)); cards.add(new SetCardInfo("Energy Tap", 54, Rarity.COMMON, mage.cards.e.EnergyTap.class)); - cards.add(new SetCardInfo("Eternal Warrior", 142, Rarity.UNCOMMON, mage.cards.e.EternalWarrior.class)); - cards.add(new SetCardInfo("Eureka", 99, Rarity.RARE, mage.cards.e.Eureka.class)); - cards.add(new SetCardInfo("Evil Eye of Orms-by-Gore", 10, Rarity.UNCOMMON, mage.cards.e.EvilEyeOfOrmsByGore.class)); - cards.add(new SetCardInfo("Fallen Angel", 11, Rarity.UNCOMMON, mage.cards.f.FallenAngel.class)); + cards.add(new SetCardInfo("Eternal Warrior", 144, Rarity.UNCOMMON, mage.cards.e.EternalWarrior.class)); + cards.add(new SetCardInfo("Eureka", 185, Rarity.RARE, mage.cards.e.Eureka.class)); + cards.add(new SetCardInfo("Evil Eye of Orms-by-Gore", 96, Rarity.UNCOMMON, mage.cards.e.EvilEyeOfOrmsByGore.class)); + cards.add(new SetCardInfo("Fallen Angel", 97, Rarity.UNCOMMON, mage.cards.f.FallenAngel.class)); cards.add(new SetCardInfo("Field of Dreams", 55, Rarity.RARE, mage.cards.f.FieldOfDreams.class)); - cards.add(new SetCardInfo("Fire Sprites", 100, Rarity.COMMON, mage.cards.f.FireSprites.class)); + cards.add(new SetCardInfo("Fire Sprites", 186, Rarity.COMMON, mage.cards.f.FireSprites.class)); cards.add(new SetCardInfo("Flash Counter", 56, Rarity.COMMON, mage.cards.f.FlashCounter.class)); cards.add(new SetCardInfo("Flash Flood", 57, Rarity.COMMON, mage.cards.f.FlashFlood.class)); - cards.add(new SetCardInfo("Floral Spuzzem", 101, Rarity.UNCOMMON, mage.cards.f.FloralSpuzzem.class)); + cards.add(new SetCardInfo("Floral Spuzzem", 187, Rarity.UNCOMMON, mage.cards.f.FloralSpuzzem.class)); cards.add(new SetCardInfo("Force Spike", 58, Rarity.COMMON, mage.cards.f.ForceSpike.class)); - cards.add(new SetCardInfo("Fortified Area", 183, Rarity.UNCOMMON, mage.cards.f.FortifiedArea.class)); - cards.add(new SetCardInfo("Frost Giant", 146, Rarity.UNCOMMON, mage.cards.f.FrostGiant.class)); - cards.add(new SetCardInfo("Gabriel Angelfire", 266, Rarity.RARE, mage.cards.g.GabrielAngelfire.class)); + cards.add(new SetCardInfo("Fortified Area", 14, Rarity.UNCOMMON, mage.cards.f.FortifiedArea.class)); + cards.add(new SetCardInfo("Frost Giant", 148, Rarity.UNCOMMON, mage.cards.f.FrostGiant.class)); + cards.add(new SetCardInfo("Gabriel Angelfire", 226, Rarity.RARE, mage.cards.g.GabrielAngelfire.class)); cards.add(new SetCardInfo("Gaseous Form", 59, Rarity.COMMON, mage.cards.g.GaseousForm.class)); - cards.add(new SetCardInfo("Gauntlets of Chaos", 222, Rarity.RARE, mage.cards.g.GauntletsOfChaos.class)); - cards.add(new SetCardInfo("Ghosts of the Damned", 12, Rarity.COMMON, mage.cards.g.GhostsOfTheDamned.class)); - cards.add(new SetCardInfo("Giant Strength", 147, Rarity.COMMON, mage.cards.g.GiantStrength.class)); - cards.add(new SetCardInfo("Giant Turtle", 102, Rarity.COMMON, mage.cards.g.GiantTurtle.class)); - cards.add(new SetCardInfo("Glyph of Destruction", 148, Rarity.COMMON, mage.cards.g.GlyphOfDestruction.class)); - cards.add(new SetCardInfo("Glyph of Doom", 14, Rarity.COMMON, mage.cards.g.GlyphOfDoom.class)); - cards.add(new SetCardInfo("Glyph of Life", 184, Rarity.COMMON, mage.cards.g.GlyphOfLife.class)); - cards.add(new SetCardInfo("Gosta Dirk", 267, Rarity.RARE, mage.cards.g.GostaDirk.class)); - cards.add(new SetCardInfo("Gravity Sphere", 149, Rarity.RARE, mage.cards.g.GravitySphere.class)); - cards.add(new SetCardInfo("Great Defender", 185, Rarity.UNCOMMON, mage.cards.g.GreatDefender.class)); - cards.add(new SetCardInfo("Great Wall", 186, Rarity.UNCOMMON, mage.cards.g.GreatWall.class)); - cards.add(new SetCardInfo("Greater Realm of Preservation", 187, Rarity.UNCOMMON, mage.cards.g.GreaterRealmOfPreservation.class)); - cards.add(new SetCardInfo("Greed", 15, Rarity.RARE, mage.cards.g.Greed.class)); - cards.add(new SetCardInfo("Green Mana Battery", 223, Rarity.UNCOMMON, mage.cards.g.GreenManaBattery.class)); - cards.add(new SetCardInfo("Gwendlyn Di Corci", 268, Rarity.RARE, mage.cards.g.GwendlynDiCorci.class)); - cards.add(new SetCardInfo("Halfdane", 269, Rarity.RARE, mage.cards.h.Halfdane.class)); - cards.add(new SetCardInfo("Hammerheim", 247, Rarity.UNCOMMON, mage.cards.h.Hammerheim.class)); - cards.add(new SetCardInfo("Hazezon Tamar", 270, Rarity.RARE, mage.cards.h.HazezonTamar.class)); - cards.add(new SetCardInfo("Headless Horseman", 16, Rarity.COMMON, mage.cards.h.HeadlessHorseman.class)); - cards.add(new SetCardInfo("Heaven's Gate", 188, Rarity.UNCOMMON, mage.cards.h.HeavensGate.class)); - cards.add(new SetCardInfo("Hell Swarm", 17, Rarity.COMMON, mage.cards.h.HellSwarm.class)); - cards.add(new SetCardInfo("Hellfire", 18, Rarity.RARE, mage.cards.h.Hellfire.class)); - cards.add(new SetCardInfo("Hell's Caretaker", 19, Rarity.RARE, mage.cards.h.HellsCaretaker.class)); - cards.add(new SetCardInfo("Holy Day", 189, Rarity.COMMON, mage.cards.h.HolyDay.class)); - cards.add(new SetCardInfo("Hornet Cobra", 104, Rarity.COMMON, mage.cards.h.HornetCobra.class)); - cards.add(new SetCardInfo("Horn of Deafening", 224, Rarity.RARE, mage.cards.h.HornOfDeafening.class)); - cards.add(new SetCardInfo("Horror of Horrors", 20, Rarity.UNCOMMON, mage.cards.h.HorrorOfHorrors.class)); - cards.add(new SetCardInfo("Hunding Gjornersen", 271, Rarity.UNCOMMON, mage.cards.h.HundingGjornersen.class)); - cards.add(new SetCardInfo("Hyperion Blacksmith", 150, Rarity.UNCOMMON, mage.cards.h.HyperionBlacksmith.class)); - cards.add(new SetCardInfo("Immolation", 151, Rarity.COMMON, mage.cards.i.Immolation.class)); - cards.add(new SetCardInfo("Imprison", 21, Rarity.RARE, mage.cards.i.Imprison.class)); + cards.add(new SetCardInfo("Gauntlets of Chaos", 278, Rarity.RARE, mage.cards.g.GauntletsOfChaos.class)); + cards.add(new SetCardInfo("Ghosts of the Damned", 98, Rarity.COMMON, mage.cards.g.GhostsOfTheDamned.class)); + cards.add(new SetCardInfo("Giant Strength", 149, Rarity.COMMON, mage.cards.g.GiantStrength.class)); + cards.add(new SetCardInfo("Giant Turtle", 188, Rarity.COMMON, mage.cards.g.GiantTurtle.class)); + cards.add(new SetCardInfo("Glyph of Destruction", 150, Rarity.COMMON, mage.cards.g.GlyphOfDestruction.class)); + cards.add(new SetCardInfo("Glyph of Doom", 100, Rarity.COMMON, mage.cards.g.GlyphOfDoom.class)); + cards.add(new SetCardInfo("Glyph of Life", 15, Rarity.COMMON, mage.cards.g.GlyphOfLife.class)); + cards.add(new SetCardInfo("Gosta Dirk", 227, Rarity.RARE, mage.cards.g.GostaDirk.class)); + cards.add(new SetCardInfo("Gravity Sphere", 151, Rarity.RARE, mage.cards.g.GravitySphere.class)); + cards.add(new SetCardInfo("Great Defender", 16, Rarity.UNCOMMON, mage.cards.g.GreatDefender.class)); + cards.add(new SetCardInfo("Great Wall", 17, Rarity.UNCOMMON, mage.cards.g.GreatWall.class)); + cards.add(new SetCardInfo("Greater Realm of Preservation", 18, Rarity.UNCOMMON, mage.cards.g.GreaterRealmOfPreservation.class)); + cards.add(new SetCardInfo("Greed", 101, Rarity.RARE, mage.cards.g.Greed.class)); + cards.add(new SetCardInfo("Green Mana Battery", 279, Rarity.UNCOMMON, mage.cards.g.GreenManaBattery.class)); + cards.add(new SetCardInfo("Gwendlyn Di Corci", 228, Rarity.RARE, mage.cards.g.GwendlynDiCorci.class)); + cards.add(new SetCardInfo("Halfdane", 229, Rarity.RARE, mage.cards.h.Halfdane.class)); + cards.add(new SetCardInfo("Hammerheim", 302, Rarity.UNCOMMON, mage.cards.h.Hammerheim.class)); + cards.add(new SetCardInfo("Hazezon Tamar", 230, Rarity.RARE, mage.cards.h.HazezonTamar.class)); + cards.add(new SetCardInfo("Headless Horseman", 102, Rarity.COMMON, mage.cards.h.HeadlessHorseman.class)); + cards.add(new SetCardInfo("Heaven's Gate", 19, Rarity.UNCOMMON, mage.cards.h.HeavensGate.class)); + cards.add(new SetCardInfo("Hell Swarm", 103, Rarity.COMMON, mage.cards.h.HellSwarm.class)); + cards.add(new SetCardInfo("Hell's Caretaker", 104, Rarity.RARE, mage.cards.h.HellsCaretaker.class)); + cards.add(new SetCardInfo("Hellfire", 105, Rarity.RARE, mage.cards.h.Hellfire.class)); + cards.add(new SetCardInfo("Holy Day", 20, Rarity.COMMON, mage.cards.h.HolyDay.class)); + cards.add(new SetCardInfo("Horn of Deafening", 280, Rarity.RARE, mage.cards.h.HornOfDeafening.class)); + cards.add(new SetCardInfo("Hornet Cobra", 190, Rarity.COMMON, mage.cards.h.HornetCobra.class)); + cards.add(new SetCardInfo("Horror of Horrors", 106, Rarity.UNCOMMON, mage.cards.h.HorrorOfHorrors.class)); + cards.add(new SetCardInfo("Hunding Gjornersen", 231, Rarity.UNCOMMON, mage.cards.h.HundingGjornersen.class)); + cards.add(new SetCardInfo("Hyperion Blacksmith", 152, Rarity.UNCOMMON, mage.cards.h.HyperionBlacksmith.class)); + cards.add(new SetCardInfo("Immolation", 153, Rarity.COMMON, mage.cards.i.Immolation.class)); + cards.add(new SetCardInfo("Imprison", 107, Rarity.RARE, mage.cards.i.Imprison.class)); cards.add(new SetCardInfo("In the Eye of Chaos", 61, Rarity.RARE, mage.cards.i.InTheEyeOfChaos.class)); - cards.add(new SetCardInfo("Indestructible Aura", 190, Rarity.COMMON, mage.cards.i.IndestructibleAura.class)); - cards.add(new SetCardInfo("Infernal Medusa", 22, Rarity.UNCOMMON, mage.cards.i.InfernalMedusa.class)); + cards.add(new SetCardInfo("Indestructible Aura", 21, Rarity.COMMON, mage.cards.i.IndestructibleAura.class)); + cards.add(new SetCardInfo("Infernal Medusa", 108, Rarity.UNCOMMON, mage.cards.i.InfernalMedusa.class)); cards.add(new SetCardInfo("Invoke Prejudice", 62, Rarity.RARE, mage.cards.i.InvokePrejudice.class)); - cards.add(new SetCardInfo("Ivory Guardians", 192, Rarity.UNCOMMON, mage.cards.i.IvoryGuardians.class)); - cards.add(new SetCardInfo("Jacques le Vert", 272, Rarity.RARE, mage.cards.j.JacquesLeVert.class)); - cards.add(new SetCardInfo("Jasmine Boreal", 273, Rarity.UNCOMMON, mage.cards.j.JasmineBoreal.class)); - cards.add(new SetCardInfo("Jedit Ojanen", 274, Rarity.UNCOMMON, mage.cards.j.JeditOjanen.class)); - cards.add(new SetCardInfo("Jerrard of the Closed Fist", 275, Rarity.UNCOMMON, mage.cards.j.JerrardOfTheClosedFist.class)); - cards.add(new SetCardInfo("Johan", 276, Rarity.RARE, mage.cards.j.Johan.class)); - cards.add(new SetCardInfo("Jovial Evil", 23, Rarity.RARE, mage.cards.j.JovialEvil.class)); + cards.add(new SetCardInfo("Ivory Guardians", 23, Rarity.UNCOMMON, mage.cards.i.IvoryGuardians.class)); + cards.add(new SetCardInfo("Jacques le Vert", 232, Rarity.RARE, mage.cards.j.JacquesLeVert.class)); + cards.add(new SetCardInfo("Jasmine Boreal", 233, Rarity.UNCOMMON, mage.cards.j.JasmineBoreal.class)); + cards.add(new SetCardInfo("Jedit Ojanen", 234, Rarity.UNCOMMON, mage.cards.j.JeditOjanen.class)); + cards.add(new SetCardInfo("Jerrard of the Closed Fist", 235, Rarity.UNCOMMON, mage.cards.j.JerrardOfTheClosedFist.class)); + cards.add(new SetCardInfo("Johan", 236, Rarity.RARE, mage.cards.j.Johan.class)); + cards.add(new SetCardInfo("Jovial Evil", 109, Rarity.RARE, mage.cards.j.JovialEvil.class)); cards.add(new SetCardInfo("Juxtapose", 63, Rarity.RARE, mage.cards.j.Juxtapose.class)); - cards.add(new SetCardInfo("Karakas", 248, Rarity.UNCOMMON, mage.cards.k.Karakas.class)); - cards.add(new SetCardInfo("Kasimir the Lone Wolf", 277, Rarity.UNCOMMON, mage.cards.k.KasimirTheLoneWolf.class)); - cards.add(new SetCardInfo("Keepers of the Faith", 193, Rarity.COMMON, mage.cards.k.KeepersOfTheFaith.class)); - cards.add(new SetCardInfo("Kei Takahashi", 278, Rarity.RARE, mage.cards.k.KeiTakahashi.class)); - cards.add(new SetCardInfo("Killer Bees", 106, Rarity.RARE, mage.cards.k.KillerBees.class)); - cards.add(new SetCardInfo("Kismet", 194, Rarity.UNCOMMON, mage.cards.k.Kismet.class)); - cards.add(new SetCardInfo("Kobold Drill Sergeant", 152, Rarity.UNCOMMON, mage.cards.k.KoboldDrillSergeant.class)); - cards.add(new SetCardInfo("Kobold Overlord", 153, Rarity.RARE, mage.cards.k.KoboldOverlord.class)); - cards.add(new SetCardInfo("Kobolds of Kher Keep", 226, Rarity.COMMON, mage.cards.k.KoboldsOfKherKeep.class)); - cards.add(new SetCardInfo("Kobold Taskmaster", 154, Rarity.UNCOMMON, mage.cards.k.KoboldTaskmaster.class)); - cards.add(new SetCardInfo("Lady Caleria", 279, Rarity.RARE, mage.cards.l.LadyCaleria.class)); - cards.add(new SetCardInfo("Lady Evangela", 280, Rarity.RARE, mage.cards.l.LadyEvangela.class)); - cards.add(new SetCardInfo("Lady Orca", 281, Rarity.UNCOMMON, mage.cards.l.LadyOrca.class)); + cards.add(new SetCardInfo("Karakas", 303, Rarity.UNCOMMON, mage.cards.k.Karakas.class)); + cards.add(new SetCardInfo("Kasimir the Lone Wolf", 237, Rarity.UNCOMMON, mage.cards.k.KasimirTheLoneWolf.class)); + cards.add(new SetCardInfo("Keepers of the Faith", 24, Rarity.COMMON, mage.cards.k.KeepersOfTheFaith.class)); + cards.add(new SetCardInfo("Kei Takahashi", 238, Rarity.RARE, mage.cards.k.KeiTakahashi.class)); + cards.add(new SetCardInfo("Killer Bees", 192, Rarity.RARE, mage.cards.k.KillerBees.class)); + cards.add(new SetCardInfo("Kismet", 25, Rarity.UNCOMMON, mage.cards.k.Kismet.class)); + cards.add(new SetCardInfo("Kobold Drill Sergeant", 154, Rarity.UNCOMMON, mage.cards.k.KoboldDrillSergeant.class)); + cards.add(new SetCardInfo("Kobold Overlord", 155, Rarity.RARE, mage.cards.k.KoboldOverlord.class)); + cards.add(new SetCardInfo("Kobold Taskmaster", 156, Rarity.UNCOMMON, mage.cards.k.KoboldTaskmaster.class)); + cards.add(new SetCardInfo("Kobolds of Kher Keep", 157, Rarity.COMMON, mage.cards.k.KoboldsOfKherKeep.class)); + cards.add(new SetCardInfo("Lady Caleria", 239, Rarity.RARE, mage.cards.l.LadyCaleria.class)); + cards.add(new SetCardInfo("Lady Evangela", 240, Rarity.RARE, mage.cards.l.LadyEvangela.class)); + cards.add(new SetCardInfo("Lady Orca", 241, Rarity.UNCOMMON, mage.cards.l.LadyOrca.class)); cards.add(new SetCardInfo("Land Equilibrium", 64, Rarity.RARE, mage.cards.l.LandEquilibrium.class)); - cards.add(new SetCardInfo("Land Tax", 195, Rarity.UNCOMMON, mage.cards.l.LandTax.class)); - cards.add(new SetCardInfo("Land's Edge", 155, Rarity.RARE, mage.cards.l.LandsEdge.class)); - cards.add(new SetCardInfo("Life Chisel", 228, Rarity.UNCOMMON, mage.cards.l.LifeChisel.class)); - cards.add(new SetCardInfo("Lifeblood", 196, Rarity.RARE, mage.cards.l.Lifeblood.class)); - cards.add(new SetCardInfo("Living Plane", 107, Rarity.RARE, mage.cards.l.LivingPlane.class)); - cards.add(new SetCardInfo("Livonya Silone", 282, Rarity.RARE, mage.cards.l.LivonyaSilone.class)); - cards.add(new SetCardInfo("Lord Magnus", 283, Rarity.UNCOMMON, mage.cards.l.LordMagnus.class)); - cards.add(new SetCardInfo("Lost Soul", 25, Rarity.COMMON, mage.cards.l.LostSoul.class)); + cards.add(new SetCardInfo("Land Tax", 26, Rarity.UNCOMMON, mage.cards.l.LandTax.class)); + cards.add(new SetCardInfo("Land's Edge", 158, Rarity.RARE, mage.cards.l.LandsEdge.class)); + cards.add(new SetCardInfo("Life Chisel", 283, Rarity.UNCOMMON, mage.cards.l.LifeChisel.class)); + cards.add(new SetCardInfo("Lifeblood", 27, Rarity.RARE, mage.cards.l.Lifeblood.class)); + cards.add(new SetCardInfo("Living Plane", 193, Rarity.RARE, mage.cards.l.LivingPlane.class)); + cards.add(new SetCardInfo("Livonya Silone", 242, Rarity.RARE, mage.cards.l.LivonyaSilone.class)); + cards.add(new SetCardInfo("Lord Magnus", 243, Rarity.UNCOMMON, mage.cards.l.LordMagnus.class)); + cards.add(new SetCardInfo("Lost Soul", 111, Rarity.COMMON, mage.cards.l.LostSoul.class)); cards.add(new SetCardInfo("Mana Drain", 65, Rarity.UNCOMMON, mage.cards.m.ManaDrain.class)); - cards.add(new SetCardInfo("Mana Matrix", 230, Rarity.RARE, mage.cards.m.ManaMatrix.class)); - cards.add(new SetCardInfo("Marhault Elsdragon", 284, Rarity.UNCOMMON, mage.cards.m.MarhaultElsdragon.class)); - cards.add(new SetCardInfo("Mirror Universe", 232, Rarity.RARE, mage.cards.m.MirrorUniverse.class)); - cards.add(new SetCardInfo("Moat", 197, Rarity.RARE, mage.cards.m.Moat.class)); - cards.add(new SetCardInfo("Mold Demon", 26, Rarity.RARE, mage.cards.m.MoldDemon.class)); - cards.add(new SetCardInfo("Moss Monster", 109, Rarity.COMMON, mage.cards.m.MossMonster.class)); - cards.add(new SetCardInfo("Mountain Yeti", 156, Rarity.UNCOMMON, mage.cards.m.MountainYeti.class)); - cards.add(new SetCardInfo("Nebuchadnezzar", 285, Rarity.RARE, mage.cards.n.Nebuchadnezzar.class)); - cards.add(new SetCardInfo("Nether Void", 27, Rarity.RARE, mage.cards.n.NetherVoid.class)); - cards.add(new SetCardInfo("Nicol Bolas", 286, Rarity.RARE, mage.cards.n.NicolBolas.class)); - cards.add(new SetCardInfo("Nova Pentacle", 234, Rarity.RARE, mage.cards.n.NovaPentacle.class)); - cards.add(new SetCardInfo("Osai Vultures", 198, Rarity.COMMON, mage.cards.o.OsaiVultures.class)); - cards.add(new SetCardInfo("Palladia-Mors", 287, Rarity.RARE, mage.cards.p.PalladiaMors.class)); + cards.add(new SetCardInfo("Mana Matrix", 285, Rarity.RARE, mage.cards.m.ManaMatrix.class)); + cards.add(new SetCardInfo("Marhault Elsdragon", 244, Rarity.UNCOMMON, mage.cards.m.MarhaultElsdragon.class)); + cards.add(new SetCardInfo("Mirror Universe", 287, Rarity.RARE, mage.cards.m.MirrorUniverse.class)); + cards.add(new SetCardInfo("Moat", 28, Rarity.RARE, mage.cards.m.Moat.class)); + cards.add(new SetCardInfo("Mold Demon", 112, Rarity.RARE, mage.cards.m.MoldDemon.class)); + cards.add(new SetCardInfo("Moss Monster", 195, Rarity.COMMON, mage.cards.m.MossMonster.class)); + cards.add(new SetCardInfo("Mountain Yeti", 159, Rarity.UNCOMMON, mage.cards.m.MountainYeti.class)); + cards.add(new SetCardInfo("Nebuchadnezzar", 245, Rarity.RARE, mage.cards.n.Nebuchadnezzar.class)); + cards.add(new SetCardInfo("Nether Void", 113, Rarity.RARE, mage.cards.n.NetherVoid.class)); + cards.add(new SetCardInfo("Nicol Bolas", 246, Rarity.RARE, mage.cards.n.NicolBolas.class)); + cards.add(new SetCardInfo("Nova Pentacle", 289, Rarity.RARE, mage.cards.n.NovaPentacle.class)); + cards.add(new SetCardInfo("Osai Vultures", 29, Rarity.COMMON, mage.cards.o.OsaiVultures.class)); + cards.add(new SetCardInfo("Palladia-Mors", 247, Rarity.RARE, mage.cards.p.PalladiaMors.class)); cards.add(new SetCardInfo("Part Water", 66, Rarity.UNCOMMON, mage.cards.p.PartWater.class)); - cards.add(new SetCardInfo("Pavel Maliki", 288, Rarity.UNCOMMON, mage.cards.p.PavelMaliki.class)); - cards.add(new SetCardInfo("Pendelhaven", 250, Rarity.UNCOMMON, mage.cards.p.Pendelhaven.class)); - cards.add(new SetCardInfo("Petra Sphinx", 199, Rarity.RARE, mage.cards.p.PetraSphinx.class)); - cards.add(new SetCardInfo("Pit Scorpion", 28, Rarity.COMMON, mage.cards.p.PitScorpion.class)); - cards.add(new SetCardInfo("Pixie Queen", 110, Rarity.RARE, mage.cards.p.PixieQueen.class)); - cards.add(new SetCardInfo("Planar Gate", 235, Rarity.RARE, mage.cards.p.PlanarGate.class)); - cards.add(new SetCardInfo("Pradesh Gypsies", 111, Rarity.UNCOMMON, mage.cards.p.PradeshGypsies.class)); - cards.add(new SetCardInfo("Presence of the Master", 200, Rarity.UNCOMMON, mage.cards.p.PresenceOfTheMaster.class)); - cards.add(new SetCardInfo("Primordial Ooze", 157, Rarity.UNCOMMON, mage.cards.p.PrimordialOoze.class)); - cards.add(new SetCardInfo("Princess Lucrezia", 289, Rarity.UNCOMMON, mage.cards.p.PrincessLucrezia.class)); + cards.add(new SetCardInfo("Pavel Maliki", 248, Rarity.UNCOMMON, mage.cards.p.PavelMaliki.class)); + cards.add(new SetCardInfo("Pendelhaven", 305, Rarity.UNCOMMON, mage.cards.p.Pendelhaven.class)); + cards.add(new SetCardInfo("Petra Sphinx", 30, Rarity.RARE, mage.cards.p.PetraSphinx.class)); + cards.add(new SetCardInfo("Pit Scorpion", 114, Rarity.COMMON, mage.cards.p.PitScorpion.class)); + cards.add(new SetCardInfo("Pixie Queen", 196, Rarity.RARE, mage.cards.p.PixieQueen.class)); + cards.add(new SetCardInfo("Planar Gate", 290, Rarity.RARE, mage.cards.p.PlanarGate.class)); + cards.add(new SetCardInfo("Pradesh Gypsies", 197, Rarity.UNCOMMON, mage.cards.p.PradeshGypsies.class)); + cards.add(new SetCardInfo("Presence of the Master", 31, Rarity.UNCOMMON, mage.cards.p.PresenceOfTheMaster.class)); + cards.add(new SetCardInfo("Primordial Ooze", 160, Rarity.UNCOMMON, mage.cards.p.PrimordialOoze.class)); + cards.add(new SetCardInfo("Princess Lucrezia", 249, Rarity.UNCOMMON, mage.cards.p.PrincessLucrezia.class)); cards.add(new SetCardInfo("Psionic Entity", 67, Rarity.RARE, mage.cards.p.PsionicEntity.class)); cards.add(new SetCardInfo("Psychic Purge", 68, Rarity.COMMON, mage.cards.p.PsychicPurge.class)); - cards.add(new SetCardInfo("Pyrotechnics", 158, Rarity.COMMON, mage.cards.p.Pyrotechnics.class)); - cards.add(new SetCardInfo("Quagmire", 29, Rarity.UNCOMMON, mage.cards.q.Quagmire.class)); - cards.add(new SetCardInfo("Rabid Wombat", 112, Rarity.UNCOMMON, mage.cards.r.RabidWombat.class)); - cards.add(new SetCardInfo("Radjan Spirit", 113, Rarity.UNCOMMON, mage.cards.r.RadjanSpirit.class)); - cards.add(new SetCardInfo("Raging Bull", 160, Rarity.COMMON, mage.cards.r.RagingBull.class)); - cards.add(new SetCardInfo("Ragnar", 290, Rarity.RARE, mage.cards.r.Ragnar.class)); - cards.add(new SetCardInfo("Ramirez DePietro", 291, Rarity.UNCOMMON, mage.cards.r.RamirezDePietro.class)); - cards.add(new SetCardInfo("Ramses Overdark", 292, Rarity.RARE, mage.cards.r.RamsesOverdark.class)); - cards.add(new SetCardInfo("Rasputin Dreamweaver", 293, Rarity.RARE, mage.cards.r.RasputinDreamweaver.class)); + cards.add(new SetCardInfo("Pyrotechnics", 161, Rarity.COMMON, mage.cards.p.Pyrotechnics.class)); + cards.add(new SetCardInfo("Quagmire", 115, Rarity.UNCOMMON, mage.cards.q.Quagmire.class)); + cards.add(new SetCardInfo("Rabid Wombat", 198, Rarity.UNCOMMON, mage.cards.r.RabidWombat.class)); + cards.add(new SetCardInfo("Radjan Spirit", 199, Rarity.UNCOMMON, mage.cards.r.RadjanSpirit.class)); + cards.add(new SetCardInfo("Raging Bull", 163, Rarity.COMMON, mage.cards.r.RagingBull.class)); + cards.add(new SetCardInfo("Ragnar", 250, Rarity.RARE, mage.cards.r.Ragnar.class)); + cards.add(new SetCardInfo("Ramirez DePietro", 251, Rarity.UNCOMMON, mage.cards.r.RamirezDePietro.class)); + cards.add(new SetCardInfo("Ramses Overdark", 252, Rarity.RARE, mage.cards.r.RamsesOverdark.class)); + cards.add(new SetCardInfo("Rasputin Dreamweaver", 253, Rarity.RARE, mage.cards.r.RasputinDreamweaver.class)); cards.add(new SetCardInfo("Recall", 70, Rarity.RARE, mage.cards.r.Recall.class)); - cards.add(new SetCardInfo("Red Mana Battery", 236, Rarity.UNCOMMON, mage.cards.r.RedManaBattery.class)); - cards.add(new SetCardInfo("Reincarnation", 115, Rarity.UNCOMMON, mage.cards.r.Reincarnation.class)); - cards.add(new SetCardInfo("Relic Barrier", 237, Rarity.UNCOMMON, mage.cards.r.RelicBarrier.class)); + cards.add(new SetCardInfo("Red Mana Battery", 291, Rarity.UNCOMMON, mage.cards.r.RedManaBattery.class)); + cards.add(new SetCardInfo("Reincarnation", 201, Rarity.UNCOMMON, mage.cards.r.Reincarnation.class)); + cards.add(new SetCardInfo("Relic Barrier", 292, Rarity.UNCOMMON, mage.cards.r.RelicBarrier.class)); cards.add(new SetCardInfo("Relic Bind", 71, Rarity.UNCOMMON, mage.cards.r.RelicBind.class)); - cards.add(new SetCardInfo("Remove Enchantments", 202, Rarity.COMMON, mage.cards.r.RemoveEnchantments.class)); + cards.add(new SetCardInfo("Remove Enchantments", 33, Rarity.COMMON, mage.cards.r.RemoveEnchantments.class)); cards.add(new SetCardInfo("Remove Soul", 72, Rarity.COMMON, mage.cards.r.RemoveSoul.class)); cards.add(new SetCardInfo("Reset", 73, Rarity.UNCOMMON, mage.cards.r.Reset.class)); - cards.add(new SetCardInfo("Revelation", 116, Rarity.RARE, mage.cards.r.Revelation.class)); - cards.add(new SetCardInfo("Righteous Avengers", 203, Rarity.UNCOMMON, mage.cards.r.RighteousAvengers.class)); - cards.add(new SetCardInfo("Ring of Immortals", 238, Rarity.RARE, mage.cards.r.RingOfImmortals.class)); - cards.add(new SetCardInfo("Riven Turnbull", 294, Rarity.UNCOMMON, mage.cards.r.RivenTurnbull.class)); - cards.add(new SetCardInfo("Rohgahh of Kher Keep", 295, Rarity.RARE, mage.cards.r.RohgahhOfKherKeep.class)); - cards.add(new SetCardInfo("Rubinia Soulsinger", 296, Rarity.RARE, mage.cards.r.RubiniaSoulsinger.class)); - cards.add(new SetCardInfo("Rust", 117, Rarity.COMMON, mage.cards.r.Rust.class)); + cards.add(new SetCardInfo("Revelation", 202, Rarity.RARE, mage.cards.r.Revelation.class)); + cards.add(new SetCardInfo("Righteous Avengers", 34, Rarity.UNCOMMON, mage.cards.r.RighteousAvengers.class)); + cards.add(new SetCardInfo("Ring of Immortals", 293, Rarity.RARE, mage.cards.r.RingOfImmortals.class)); + cards.add(new SetCardInfo("Riven Turnbull", 254, Rarity.UNCOMMON, mage.cards.r.RivenTurnbull.class)); + cards.add(new SetCardInfo("Rohgahh of Kher Keep", 255, Rarity.RARE, mage.cards.r.RohgahhOfKherKeep.class)); + cards.add(new SetCardInfo("Rubinia Soulsinger", 256, Rarity.RARE, mage.cards.r.RubiniaSoulsinger.class)); + cards.add(new SetCardInfo("Rust", 203, Rarity.COMMON, mage.cards.r.Rust.class)); cards.add(new SetCardInfo("Sea Kings' Blessing", 75, Rarity.UNCOMMON, mage.cards.s.SeaKingsBlessing.class)); - cards.add(new SetCardInfo("Seeker", 204, Rarity.UNCOMMON, mage.cards.s.Seeker.class)); + cards.add(new SetCardInfo("Seeker", 35, Rarity.UNCOMMON, mage.cards.s.Seeker.class)); cards.add(new SetCardInfo("Segovian Leviathan", 76, Rarity.UNCOMMON, mage.cards.s.SegovianLeviathan.class)); - cards.add(new SetCardInfo("Sentinel", 239, Rarity.RARE, mage.cards.s.Sentinel.class)); - cards.add(new SetCardInfo("Serpent Generator", 240, Rarity.RARE, mage.cards.s.SerpentGenerator.class)); - cards.add(new SetCardInfo("Shield Wall", 205, Rarity.UNCOMMON, mage.cards.s.ShieldWall.class)); - cards.add(new SetCardInfo("Shimian Night Stalker", 30, Rarity.UNCOMMON, mage.cards.s.ShimianNightStalker.class)); - cards.add(new SetCardInfo("Sir Shandlar of Eberyn", 297, Rarity.UNCOMMON, mage.cards.s.SirShandlarOfEberyn.class)); - cards.add(new SetCardInfo("Sivitri Scarzam", 298, Rarity.UNCOMMON, mage.cards.s.SivitriScarzam.class)); - cards.add(new SetCardInfo("Sol'kanar the Swamp King", 299, Rarity.RARE, mage.cards.s.SolkanarTheSwampKing.class)); + cards.add(new SetCardInfo("Sentinel", 294, Rarity.RARE, mage.cards.s.Sentinel.class)); + cards.add(new SetCardInfo("Serpent Generator", 295, Rarity.RARE, mage.cards.s.SerpentGenerator.class)); + cards.add(new SetCardInfo("Shield Wall", 36, Rarity.UNCOMMON, mage.cards.s.ShieldWall.class)); + cards.add(new SetCardInfo("Shimian Night Stalker", 116, Rarity.UNCOMMON, mage.cards.s.ShimianNightStalker.class)); + cards.add(new SetCardInfo("Sir Shandlar of Eberyn", 257, Rarity.UNCOMMON, mage.cards.s.SirShandlarOfEberyn.class)); + cards.add(new SetCardInfo("Sivitri Scarzam", 258, Rarity.UNCOMMON, mage.cards.s.SivitriScarzam.class)); + cards.add(new SetCardInfo("Sol'kanar the Swamp King", 259, Rarity.RARE, mage.cards.s.SolkanarTheSwampKing.class)); cards.add(new SetCardInfo("Spectral Cloak", 78, Rarity.UNCOMMON, mage.cards.s.SpectralCloak.class)); - cards.add(new SetCardInfo("Spinal Villain", 161, Rarity.RARE, mage.cards.s.SpinalVillain.class)); - cards.add(new SetCardInfo("Spirit Link", 206, Rarity.UNCOMMON, mage.cards.s.SpiritLink.class)); - cards.add(new SetCardInfo("Spirit Shackle", 31, Rarity.COMMON, mage.cards.s.SpiritShackle.class)); - cards.add(new SetCardInfo("Stangg", 300, Rarity.RARE, mage.cards.s.Stangg.class)); - cards.add(new SetCardInfo("Storm Seeker", 119, Rarity.UNCOMMON, mage.cards.s.StormSeeker.class)); - cards.add(new SetCardInfo("Storm World", 162, Rarity.RARE, mage.cards.s.StormWorld.class)); - cards.add(new SetCardInfo("Sunastian Falconer", 301, Rarity.UNCOMMON, mage.cards.s.SunastianFalconer.class)); - cards.add(new SetCardInfo("Sword of the Ages", 241, Rarity.RARE, mage.cards.s.SwordOfTheAges.class)); - cards.add(new SetCardInfo("Sylvan Library", 121, Rarity.UNCOMMON, mage.cards.s.SylvanLibrary.class)); - cards.add(new SetCardInfo("Sylvan Paradise", 122, Rarity.UNCOMMON, mage.cards.s.SylvanParadise.class)); - cards.add(new SetCardInfo("Syphon Soul", 32, Rarity.COMMON, mage.cards.s.SyphonSoul.class)); + cards.add(new SetCardInfo("Spinal Villain", 164, Rarity.RARE, mage.cards.s.SpinalVillain.class)); + cards.add(new SetCardInfo("Spirit Link", 37, Rarity.UNCOMMON, mage.cards.s.SpiritLink.class)); + cards.add(new SetCardInfo("Spirit Shackle", 117, Rarity.COMMON, mage.cards.s.SpiritShackle.class)); + cards.add(new SetCardInfo("Stangg", 260, Rarity.RARE, mage.cards.s.Stangg.class)); + cards.add(new SetCardInfo("Storm Seeker", 205, Rarity.UNCOMMON, mage.cards.s.StormSeeker.class)); + cards.add(new SetCardInfo("Storm World", 165, Rarity.RARE, mage.cards.s.StormWorld.class)); + cards.add(new SetCardInfo("Sunastian Falconer", 261, Rarity.UNCOMMON, mage.cards.s.SunastianFalconer.class)); + cards.add(new SetCardInfo("Sword of the Ages", 296, Rarity.RARE, mage.cards.s.SwordOfTheAges.class)); + cards.add(new SetCardInfo("Sylvan Library", 207, Rarity.UNCOMMON, mage.cards.s.SylvanLibrary.class)); + cards.add(new SetCardInfo("Sylvan Paradise", 208, Rarity.UNCOMMON, mage.cards.s.SylvanParadise.class)); + cards.add(new SetCardInfo("Syphon Soul", 118, Rarity.COMMON, mage.cards.s.SyphonSoul.class)); cards.add(new SetCardInfo("Telekinesis", 79, Rarity.RARE, mage.cards.t.Telekinesis.class)); cards.add(new SetCardInfo("Teleport", 80, Rarity.RARE, mage.cards.t.Teleport.class)); - cards.add(new SetCardInfo("Tetsuo Umezawa", 302, Rarity.RARE, mage.cards.t.TetsuoUmezawa.class)); - cards.add(new SetCardInfo("The Abyss", 34, Rarity.RARE, mage.cards.t.TheAbyss.class)); - cards.add(new SetCardInfo("The Brute", 164, Rarity.COMMON, mage.cards.t.TheBrute.class)); - cards.add(new SetCardInfo("The Lady of the Mountain", 303, Rarity.UNCOMMON, mage.cards.t.TheLadyOfTheMountain.class)); - cards.add(new SetCardInfo("The Tabernacle at Pendrell Vale", 252, Rarity.RARE, mage.cards.t.TheTabernacleAtPendrellVale.class)); - cards.add(new SetCardInfo("The Wretched", 35, Rarity.RARE, mage.cards.t.TheWretched.class)); - cards.add(new SetCardInfo("Thunder Spirit", 208, Rarity.RARE, mage.cards.t.ThunderSpirit.class)); + cards.add(new SetCardInfo("Tetsuo Umezawa", 262, Rarity.RARE, mage.cards.t.TetsuoUmezawa.class)); + cards.add(new SetCardInfo("The Abyss", 120, Rarity.RARE, mage.cards.t.TheAbyss.class)); + cards.add(new SetCardInfo("The Brute", 167, Rarity.COMMON, mage.cards.t.TheBrute.class)); + cards.add(new SetCardInfo("The Lady of the Mountain", 263, Rarity.UNCOMMON, mage.cards.t.TheLadyOfTheMountain.class)); + cards.add(new SetCardInfo("The Tabernacle at Pendrell Vale", 307, Rarity.RARE, mage.cards.t.TheTabernacleAtPendrellVale.class)); + cards.add(new SetCardInfo("The Wretched", 121, Rarity.RARE, mage.cards.t.TheWretched.class)); + cards.add(new SetCardInfo("Thunder Spirit", 39, Rarity.RARE, mage.cards.t.ThunderSpirit.class)); cards.add(new SetCardInfo("Time Elemental", 81, Rarity.RARE, mage.cards.t.TimeElemental.class)); - cards.add(new SetCardInfo("Tobias Andrion", 304, Rarity.UNCOMMON, mage.cards.t.TobiasAndrion.class)); - cards.add(new SetCardInfo("Torsten Von Ursus", 306, Rarity.UNCOMMON, mage.cards.t.TorstenVonUrsus.class)); - cards.add(new SetCardInfo("Tor Wauki", 305, Rarity.UNCOMMON, mage.cards.t.TorWauki.class)); - cards.add(new SetCardInfo("Touch of Darkness", 36, Rarity.UNCOMMON, mage.cards.t.TouchOfDarkness.class)); - cards.add(new SetCardInfo("Transmutation", 37, Rarity.COMMON, mage.cards.t.Transmutation.class)); - cards.add(new SetCardInfo("Triassic Egg", 242, Rarity.RARE, mage.cards.t.TriassicEgg.class)); - cards.add(new SetCardInfo("Tuknir Deathlock", 307, Rarity.RARE, mage.cards.t.TuknirDeathlock.class)); - cards.add(new SetCardInfo("Tundra Wolves", 209, Rarity.COMMON, mage.cards.t.TundraWolves.class)); - cards.add(new SetCardInfo("Typhoon", 123, Rarity.RARE, mage.cards.t.Typhoon.class)); + cards.add(new SetCardInfo("Tobias Andrion", 264, Rarity.UNCOMMON, mage.cards.t.TobiasAndrion.class)); + cards.add(new SetCardInfo("Tor Wauki", 265, Rarity.UNCOMMON, mage.cards.t.TorWauki.class)); + cards.add(new SetCardInfo("Torsten Von Ursus", 266, Rarity.UNCOMMON, mage.cards.t.TorstenVonUrsus.class)); + cards.add(new SetCardInfo("Touch of Darkness", 122, Rarity.UNCOMMON, mage.cards.t.TouchOfDarkness.class)); + cards.add(new SetCardInfo("Transmutation", 123, Rarity.COMMON, mage.cards.t.Transmutation.class)); + cards.add(new SetCardInfo("Triassic Egg", 297, Rarity.RARE, mage.cards.t.TriassicEgg.class)); + cards.add(new SetCardInfo("Tuknir Deathlock", 267, Rarity.RARE, mage.cards.t.TuknirDeathlock.class)); + cards.add(new SetCardInfo("Tundra Wolves", 40, Rarity.COMMON, mage.cards.t.TundraWolves.class)); + cards.add(new SetCardInfo("Typhoon", 209, Rarity.RARE, mage.cards.t.Typhoon.class)); cards.add(new SetCardInfo("Undertow", 82, Rarity.UNCOMMON, mage.cards.u.Undertow.class)); - cards.add(new SetCardInfo("Underworld Dreams", 38, Rarity.UNCOMMON, mage.cards.u.UnderworldDreams.class)); - cards.add(new SetCardInfo("Untamed Wilds", 124, Rarity.UNCOMMON, mage.cards.u.UntamedWilds.class)); - cards.add(new SetCardInfo("Ur-Drago", 308, Rarity.RARE, mage.cards.u.UrDrago.class)); - cards.add(new SetCardInfo("Urborg", 255, Rarity.UNCOMMON, mage.cards.u.Urborg.class)); - cards.add(new SetCardInfo("Vaevictis Asmadi", 309, Rarity.RARE, mage.cards.v.VaevictisAsmadi.class)); - cards.add(new SetCardInfo("Vampire Bats", 39, Rarity.COMMON, mage.cards.v.VampireBats.class)); - cards.add(new SetCardInfo("Visions", 210, Rarity.UNCOMMON, mage.cards.v.Visions.class)); - cards.add(new SetCardInfo("Walking Dead", 40, Rarity.COMMON, mage.cards.w.WalkingDead.class)); - cards.add(new SetCardInfo("Wall of Caltrops", 211, Rarity.COMMON, mage.cards.w.WallOfCaltrops.class)); - cards.add(new SetCardInfo("Wall of Dust", 165, Rarity.UNCOMMON, mage.cards.w.WallOfDust.class)); - cards.add(new SetCardInfo("Wall of Earth", 166, Rarity.COMMON, mage.cards.w.WallOfEarth.class)); - cards.add(new SetCardInfo("Wall of Heat", 167, Rarity.COMMON, mage.cards.w.WallOfHeat.class)); - cards.add(new SetCardInfo("Wall of Light", 212, Rarity.UNCOMMON, mage.cards.w.WallOfLight.class)); - cards.add(new SetCardInfo("Wall of Opposition", 168, Rarity.RARE, mage.cards.w.WallOfOpposition.class)); - cards.add(new SetCardInfo("Wall of Putrid Flesh", 41, Rarity.UNCOMMON, mage.cards.w.WallOfPutridFlesh.class)); + cards.add(new SetCardInfo("Underworld Dreams", 124, Rarity.UNCOMMON, mage.cards.u.UnderworldDreams.class)); + cards.add(new SetCardInfo("Untamed Wilds", 210, Rarity.UNCOMMON, mage.cards.u.UntamedWilds.class)); + cards.add(new SetCardInfo("Ur-Drago", 268, Rarity.RARE, mage.cards.u.UrDrago.class)); + cards.add(new SetCardInfo("Urborg", 310, Rarity.UNCOMMON, mage.cards.u.Urborg.class)); + cards.add(new SetCardInfo("Vaevictis Asmadi", 269, Rarity.RARE, mage.cards.v.VaevictisAsmadi.class)); + cards.add(new SetCardInfo("Vampire Bats", 125, Rarity.COMMON, mage.cards.v.VampireBats.class)); + cards.add(new SetCardInfo("Visions", 41, Rarity.UNCOMMON, mage.cards.v.Visions.class)); + cards.add(new SetCardInfo("Walking Dead", 126, Rarity.COMMON, mage.cards.w.WalkingDead.class)); + cards.add(new SetCardInfo("Wall of Caltrops", 42, Rarity.COMMON, mage.cards.w.WallOfCaltrops.class)); + cards.add(new SetCardInfo("Wall of Dust", 168, Rarity.UNCOMMON, mage.cards.w.WallOfDust.class)); + cards.add(new SetCardInfo("Wall of Earth", 169, Rarity.COMMON, mage.cards.w.WallOfEarth.class)); + cards.add(new SetCardInfo("Wall of Heat", 170, Rarity.COMMON, mage.cards.w.WallOfHeat.class)); + cards.add(new SetCardInfo("Wall of Light", 43, Rarity.UNCOMMON, mage.cards.w.WallOfLight.class)); + cards.add(new SetCardInfo("Wall of Opposition", 171, Rarity.RARE, mage.cards.w.WallOfOpposition.class)); + cards.add(new SetCardInfo("Wall of Putrid Flesh", 127, Rarity.UNCOMMON, mage.cards.w.WallOfPutridFlesh.class)); cards.add(new SetCardInfo("Wall of Vapor", 84, Rarity.COMMON, mage.cards.w.WallOfVapor.class)); cards.add(new SetCardInfo("Wall of Wonder", 85, Rarity.UNCOMMON, mage.cards.w.WallOfWonder.class)); - cards.add(new SetCardInfo("Whirling Dervish", 125, Rarity.UNCOMMON, mage.cards.w.WhirlingDervish.class)); - cards.add(new SetCardInfo("White Mana Battery", 244, Rarity.UNCOMMON, mage.cards.w.WhiteManaBattery.class)); - cards.add(new SetCardInfo("Willow Satyr", 126, Rarity.RARE, mage.cards.w.WillowSatyr.class)); - cards.add(new SetCardInfo("Winds of Change", 169, Rarity.UNCOMMON, mage.cards.w.WindsOfChange.class)); - cards.add(new SetCardInfo("Winter Blast", 127, Rarity.RARE, mage.cards.w.WinterBlast.class)); - cards.add(new SetCardInfo("Wolverine Pack", 128, Rarity.COMMON, mage.cards.w.WolverinePack.class)); - cards.add(new SetCardInfo("Wood Elemental", 129, Rarity.RARE, mage.cards.w.WoodElemental.class)); - cards.add(new SetCardInfo("Xira Arien", 310, Rarity.RARE, mage.cards.x.XiraArien.class)); + cards.add(new SetCardInfo("Whirling Dervish", 211, Rarity.UNCOMMON, mage.cards.w.WhirlingDervish.class)); + cards.add(new SetCardInfo("White Mana Battery", 299, Rarity.UNCOMMON, mage.cards.w.WhiteManaBattery.class)); + cards.add(new SetCardInfo("Willow Satyr", 212, Rarity.RARE, mage.cards.w.WillowSatyr.class)); + cards.add(new SetCardInfo("Winds of Change", 172, Rarity.UNCOMMON, mage.cards.w.WindsOfChange.class)); + cards.add(new SetCardInfo("Winter Blast", 213, Rarity.RARE, mage.cards.w.WinterBlast.class)); + cards.add(new SetCardInfo("Wolverine Pack", 214, Rarity.COMMON, mage.cards.w.WolverinePack.class)); + cards.add(new SetCardInfo("Wood Elemental", 215, Rarity.RARE, mage.cards.w.WoodElemental.class)); + cards.add(new SetCardInfo("Xira Arien", 270, Rarity.RARE, mage.cards.x.XiraArien.class)); cards.add(new SetCardInfo("Zephyr Falcon", 86, Rarity.COMMON, mage.cards.z.ZephyrFalcon.class)); } } From fe1bc0fa1ab787f5316e7ea0077d713cae24b30b Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Wed, 9 May 2018 02:15:05 -0400 Subject: [PATCH 101/158] Added remaining 2011 Commander pre-constructed decks --- .../Commander 2011/Devour for Power.dck | 87 ++++++++++++++++++ .../Commander 2011/Heavenly Inferno.dck | 90 +++++++++++++++++++ .../Commander 2011/Political Puppets.dck | 86 ++++++++++++++++++ 3 files changed, 263 insertions(+) create mode 100644 Mage.Client/release/sample-decks/Commander/Commander 2011/Devour for Power.dck create mode 100644 Mage.Client/release/sample-decks/Commander/Commander 2011/Heavenly Inferno.dck create mode 100644 Mage.Client/release/sample-decks/Commander/Commander 2011/Political Puppets.dck diff --git a/Mage.Client/release/sample-decks/Commander/Commander 2011/Devour for Power.dck b/Mage.Client/release/sample-decks/Commander/Commander 2011/Devour for Power.dck new file mode 100644 index 00000000000..876f112e0f3 --- /dev/null +++ b/Mage.Client/release/sample-decks/Commander/Commander 2011/Devour for Power.dck @@ -0,0 +1,87 @@ +1 [CMD:193] Desecrator Hag +1 [CMD:270] Dimir Aqueduct +1 [CMD:62] Slipstream Eel +1 [CMD:63] Spell Crumple +1 [CMD:271] Dreadship Reef +1 [CMD:152] Eternal Witness +1 [CMD:275] Golgari Rot Farm +1 [CMD:68] Vow of Flight +2 [CMD:310] Swamp +1 [CMD:236] Vulturous Zombie +1 [CMD:235] Vorosh, the Hunter +1 [CMD:279] Jwar Isle Refuge +2 [CMD:315] Forest +2 [CMD:317] Forest +1 [CMD:239] Wrexial, the Risen Deep +2 [CMD:316] Forest +3 [CMD:308] Swamp +3 [CMD:307] Swamp +3 [CMD:309] Swamp +1 [CMD:191] Damia, Sage of Stone +1 [CMD:71] Wonder +1 [CMD:140] Acidic Slime +1 [CMD:73] Avatar of Woe +1 [CMD:261] Sol Ring +1 [CMD:74] Buried Alive +1 [CMD:263] Triskelavus +1 [CMD:262] Solemn Simulacrum +1 [CMD:70] Windfall +1 [CMD:102] Stitch Together +1 [CMD:145] Brawn +1 [CMD:101] Sign in Blood +1 [CMD:266] Barren Moor +1 [CMD:148] Cultivate +1 [CMD:104] Syphon Mind +1 [CMD:269] Command Tower +1 [CMD:103] Syphon Flesh +1 [CMD:75] Butcher of Malakir +1 [CMD:227] Skullbriar, the Walking Grave +2 [CMD:304] Island +1 [CMD:76] Dark Hatchling +1 [CMD:105] Unnerve +2 [CMD:303] Island +2 [CMD:306] Island +1 [CMD:228] Szadek, Lord of Secrets +1 [CMD:107] Vow of Malice +2 [CMD:305] Island +1 [CMD:292] Tranquil Thicket +1 [CMD:83] Fleshbag Marauder +1 [CMD:291] Terramorphic Expanse +1 [CMD:85] Grave Pact +1 [CMD:175] Tribute to the Wild +1 [CMD:254] Oblivion Stone +1 [CMD:81] Extractor Demon +1 [CMD:176] Troll Ascetic +1 [CMD:253] Lightning Greaves +1 [CMD:1] Artisan of Kozilek +1 [CMD:179] Yavimaya Elder +1 [CMD:178] Vow of Wildness +1 [CMD:86] Gravedigger +1 [CMD:259] Simic Signet +1 [CMD:44] Dreamborn Muse +1 [CMD:88] Living Death +1 [CMD:89] Mortivore +1 [CMD:45] Fact or Fiction +1 [CMD:290] Temple of the False God +1 [CMD:93] Patron of the Nezumi +1 [CMD:281] Lonely Sandbar +1 [CMD:50] Memory Erosion +1 [CMD:51] Minds Aglow +1 [CMD:52] Mulldrifter +1 [CMD:96] Rise from the Grave +1 [CMD:285] Rupture Spire +1 [CMD:165] Lhurgoyf +1 [CMD:92] Nezumi Graverobber +1 [CMD:168] Relic Crush +1 [CMD:289] Svogthos, the Restless Tomb +1 [CMD:288] Simic Growth Chamber +1 [CMD:59] Riddlekeeper +1 [CMD:246] Dimir Signet +1 [CMD:97] Scythe Specter +1 [CMD:249] Golgari Signet +1 [CMD:98] Sewer Nemesis +1 [CMD:99] Shared Trauma +2 [CMD:318] Forest +SB: 1 [CMD:210] The Mimeoplasm +LAYOUT MAIN:(2,10)(CMC,true,50)|()()([CMD:92],[CMD:227])([CMD:152],[CMD:83],[CMD:59],[CMD:176],[CMD:179])([CMD:145],[CMD:193],[CMD:44],[CMD:86],[CMD:165],[CMD:89],[CMD:98],[CMD:262],[CMD:71])([CMD:140],[CMD:52],[CMD:236])([CMD:76],[CMD:81],[CMD:97],[CMD:235],[CMD:239])([CMD:75],[CMD:191],[CMD:93],[CMD:62],[CMD:228],[CMD:263])([CMD:73])([CMD:1])([CMD:266],[CMD:269],[CMD:270],[CMD:271],[CMD:315],[CMD:315],[CMD:316],[CMD:316],[CMD:317],[CMD:317],[CMD:318],[CMD:318],[CMD:275],[CMD:303],[CMD:303],[CMD:304],[CMD:304],[CMD:305],[CMD:305],[CMD:306],[CMD:306],[CMD:279],[CMD:281],[CMD:285],[CMD:288],[CMD:289],[CMD:307],[CMD:307],[CMD:307],[CMD:308],[CMD:308],[CMD:308],[CMD:309],[CMD:309],[CMD:309],[CMD:310],[CMD:310],[CMD:290],[CMD:291],[CMD:292])([CMD:51],[CMD:99],[CMD:261])([CMD:101],[CMD:102],[CMD:175],[CMD:246],[CMD:249],[CMD:253],[CMD:259])([CMD:74],[CMD:148],[CMD:70],[CMD:63],[CMD:254],[CMD:50],[CMD:68],[CMD:107],[CMD:178])([CMD:104],[CMD:105],[CMD:45],[CMD:85])([CMD:88],[CMD:96],[CMD:103],[CMD:168])()()()() +LAYOUT SIDEBOARD:(1,1)(NONE,false,50)|([CMD:210]) diff --git a/Mage.Client/release/sample-decks/Commander/Commander 2011/Heavenly Inferno.dck b/Mage.Client/release/sample-decks/Commander/Commander 2011/Heavenly Inferno.dck new file mode 100644 index 00000000000..483818ee5fd --- /dev/null +++ b/Mage.Client/release/sample-decks/Commander/Commander 2011/Heavenly Inferno.dck @@ -0,0 +1,90 @@ +1 [CMD:272] Evolving Wilds +1 [CMD:195] Duergar Hedge-Mage +1 [CMD:273] Forgotten Cave +1 [CMD:111] Avatar of Slaughter +1 [CMD:231] Terminate +2 [CMD:311] Mountain +1 [CMD:24] Orim's Thunder +2 [CMD:310] Swamp +1 [CMD:25] Path to Exile +2 [CMD:313] Mountain +2 [CMD:312] Mountain +1 [CMD:117] Comet Storm +1 [CMD:238] Wrecking Ball +2 [CMD:314] Mountain +1 [CMD:21] Mother of Runes +1 [CMD:116] Cleansing Beam +1 [CMD:118] Death by Dragons +2 [CMD:308] Swamp +2 [CMD:307] Swamp +1 [CMD:109] Anger +2 [CMD:309] Swamp +1 [CMD:18] Lightkeeper of Emeria +1 [CMD:184] Basandra, Battle Seraph +1 [CMD:261] Sol Ring +1 [CMD:30] Serra Angel +1 [CMD:186] Boros Guildmage +1 [CMD:185] Bladewing the Risen +1 [CMD:264] Akoum Refuge +1 [CMD:267] Bojuka Bog +2 [CMD:300] Plains +1 [CMD:79] Dread Cacodemon +1 [CMD:35] Voice of All +1 [CMD:266] Barren Moor +1 [CMD:36] Vow of Duty +1 [CMD:269] Command Tower +2 [CMD:302] Plains +1 [CMD:104] Syphon Mind +1 [CMD:268] Boros Garrison +2 [CMD:301] Plains +1 [CMD:103] Syphon Flesh +1 [CMD:31] Shattered Angel +1 [CMD:32] Soul Snare +1 [CMD:108] Akroma, Angel of Fury +1 [CMD:229] Tariel, Reckoner of Souls +1 [CMD:77] Diabolic Tutor +1 [CMD:107] Vow of Malice +1 [CMD:28] Return to Dust +1 [CMD:29] Righteous Cause +1 [CMD:180] Angel of Despair +1 [CMD:82] Fallen Angel +1 [CMD:9] Bathe in Light +1 [CMD:7] Archangel of Strife +1 [CMD:5] Angelic Arbiter +1 [CMD:130] Oni of Wild Places +1 [CMD:298] Zoetic Cavern +1 [CMD:3] Akroma's Vengeance +1 [CMD:80] Evincar's Justice +1 [CMD:297] Vivid Meadow +1 [CMD:253] Lightning Greaves +1 [CMD:132] Pyrohemia +2 [CMD:299] Plains +1 [CMD:211] Mortify +1 [CMD:255] Orzhov Signet +1 [CMD:137] Sulfurous Blast +1 [CMD:257] Rakdos Signet +1 [CMD:136] Stranglehold +1 [CMD:216] Oros, the Avenger +1 [CMD:138] Vow of Lightning +1 [CMD:217] Orzhov Guildmage +1 [CMD:209] Master Warcraft +1 [CMD:208] Malfegor +1 [CMD:94] Razorjaw Oni +1 [CMD:283] Orzhov Basilica +1 [CMD:95] Reiver Demon +1 [CMD:282] Molten Slagheap +1 [CMD:285] Rupture Spire +1 [CMD:120] Dragon Whelp +1 [CMD:284] Rakdos Carnarium +1 [CMD:243] Boros Signet +1 [CMD:286] Secluded Steppe +1 [CMD:242] Armillary Sphere +1 [CMD:121] Earthquake +1 [CMD:124] Furnace Whelp +1 [CMD:245] Darksteel Ingot +1 [CMD:202] Gwyllion Hedge-Mage +1 [CMD:11] Congregate +1 [CMD:129] Mana-Charged Dragon +SB: 1 [CMD:206] Kaalia of the Vast +LAYOUT MAIN:(2,10)(CMC,true,50)|()([CMD:21])([CMD:186],[CMD:217])([CMD:195],[CMD:202])([CMD:109],[CMD:120],[CMD:124],[CMD:18],[CMD:94],[CMD:35])([CMD:184],[CMD:82],[CMD:30],[CMD:31])([CMD:208],[CMD:129],[CMD:130],[CMD:216])([CMD:180],[CMD:5],[CMD:7],[CMD:185],[CMD:229])([CMD:108],[CMD:111],[CMD:95])([CMD:79])([CMD:264],[CMD:266],[CMD:267],[CMD:268],[CMD:269],[CMD:272],[CMD:273],[CMD:282],[CMD:311],[CMD:311],[CMD:312],[CMD:312],[CMD:313],[CMD:313],[CMD:314],[CMD:314],[CMD:283],[CMD:299],[CMD:299],[CMD:300],[CMD:300],[CMD:301],[CMD:301],[CMD:302],[CMD:302],[CMD:284],[CMD:285],[CMD:286],[CMD:307],[CMD:307],[CMD:308],[CMD:308],[CMD:309],[CMD:309],[CMD:310],[CMD:310],[CMD:297],[CMD:298])([CMD:121],[CMD:25],[CMD:261],[CMD:32])([CMD:242],[CMD:9],[CMD:243],[CMD:117],[CMD:253],[CMD:255],[CMD:257],[CMD:231])([CMD:245],[CMD:211],[CMD:24],[CMD:36],[CMD:138],[CMD:107])([CMD:11],[CMD:77],[CMD:80],[CMD:209],[CMD:132],[CMD:28],[CMD:136],[CMD:137],[CMD:104],[CMD:238])([CMD:116],[CMD:29],[CMD:103])([CMD:3],[CMD:118])()()() +LAYOUT SIDEBOARD:(1,1)(NONE,false,50)|([CMD:206]) diff --git a/Mage.Client/release/sample-decks/Commander/Commander 2011/Political Puppets.dck b/Mage.Client/release/sample-decks/Commander/Commander 2011/Political Puppets.dck new file mode 100644 index 00000000000..7ee8f0b4927 --- /dev/null +++ b/Mage.Client/release/sample-decks/Commander/Commander 2011/Political Puppets.dck @@ -0,0 +1,86 @@ +1 [CMD:60] Scattering Stroke +1 [CMD:61] Skyscribing +1 [CMD:272] Evolving Wilds +1 [CMD:194] Dominus of Fealty +1 [CMD:63] Spell Crumple +1 [CMD:278] Izzet Boilerworks +2 [CMD:311] Mountain +1 [CMD:68] Vow of Flight +1 [CMD:112] Breath of Darigaaz +1 [CMD:69] Whirlpool Whelm +2 [CMD:313] Mountain +1 [CMD:26] Pollen Lullaby +2 [CMD:312] Mountain +1 [CMD:114] Chaos Warp +1 [CMD:27] Prison Term +1 [CMD:64] Trade Secrets +2 [CMD:314] Mountain +1 [CMD:237] Wall of Denial +1 [CMD:66] Vedalken Plotter +1 [CMD:22] Oblation +1 [CMD:118] Death by Dragons +1 [CMD:67] Vision Skeins +1 [CMD:17] Journey to Nowhere +1 [CMD:19] Martyr's Bond +1 [CMD:261] Sol Ring +1 [CMD:183] Azorius Guildmage +1 [CMD:265] Azorius Chancery +1 [CMD:221] Ruhan of the Fomori +1 [CMD:187] Brion Stoutarm +2 [CMD:300] Plains +1 [CMD:36] Vow of Duty +1 [CMD:269] Command Tower +2 [CMD:302] Plains +1 [CMD:37] Wall of Omens +1 [CMD:268] Boros Garrison +2 [CMD:301] Plains +1 [CMD:38] Windborn Muse +3 [CMD:304] Island +3 [CMD:303] Island +1 [CMD:32] Soul Snare +3 [CMD:306] Island +1 [CMD:33] Spurnmage Advocate +3 [CMD:305] Island +1 [CMD:291] Terramorphic Expanse +1 [CMD:8] Austere Command +1 [CMD:40] Brainstorm +1 [CMD:6] Arbiter of Knollridge +1 [CMD:41] Chromeshell Crab +1 [CMD:131] Punishing Fire +1 [CMD:251] Howling Mine +1 [CMD:133] Rapacious One +1 [CMD:253] Lightning Greaves +1 [CMD:46] Flusterstorm +1 [CMD:256] Prophetic Prism +2 [CMD:299] Plains +1 [CMD:47] Fog Bank +1 [CMD:48] Gomazoa +1 [CMD:49] Guard Gomazoa +1 [CMD:213] Nin, the Pain Artist +1 [CMD:139] Wild Ricochet +1 [CMD:43] Court Hussar +1 [CMD:215] Numot, the Devastator +1 [CMD:138] Vow of Lightning +1 [CMD:218] Plumeveil +1 [CMD:242] Armillary Sphere +1 [CMD:13] False Prophet +1 [CMD:245] Darksteel Ingot +1 [CMD:57] Reins of Power +1 [CMD:123] Flametongue Kavu +1 [CMD:244] Champion's Helm +1 [CMD:14] Ghostly Prison +1 [CMD:58] Repulse +1 [CMD:247] Dreamstone Hedron +1 [CMD:126] Insurrection +1 [CMD:125] Goblin Cadets +1 [CMD:16] Jotun Grunt +1 [CMD:205] Izzet Chronarch +1 [CMD:53] Murmurs from Beyond +1 [CMD:248] Fellwar Stone +1 [CMD:127] Lash Out +1 [CMD:54] Perilous Research +1 [CMD:55] Propaganda +1 [CMD:12] Crescendo of War +SB: 1 [CMD:240] Zedruu the Greathearted +LAYOUT MAIN:(2,9)(CMC,true,50)|()([CMD:125],[CMD:33])([CMD:183],[CMD:47],[CMD:16],[CMD:213],[CMD:37])([CMD:43],[CMD:48],[CMD:49],[CMD:218],[CMD:66],[CMD:237])([CMD:187],[CMD:13],[CMD:123],[CMD:221],[CMD:38])([CMD:41],[CMD:194],[CMD:205])([CMD:215],[CMD:133])([CMD:6])()([CMD:265],[CMD:268],[CMD:269],[CMD:272],[CMD:303],[CMD:303],[CMD:303],[CMD:304],[CMD:304],[CMD:304],[CMD:305],[CMD:305],[CMD:305],[CMD:306],[CMD:306],[CMD:306],[CMD:278],[CMD:311],[CMD:311],[CMD:312],[CMD:312],[CMD:313],[CMD:313],[CMD:314],[CMD:314],[CMD:299],[CMD:299],[CMD:300],[CMD:300],[CMD:301],[CMD:301],[CMD:302],[CMD:302],[CMD:291])([CMD:40],[CMD:46],[CMD:261],[CMD:32])([CMD:242],[CMD:112],[CMD:248],[CMD:251],[CMD:17],[CMD:127],[CMD:253],[CMD:54],[CMD:26],[CMD:256],[CMD:131],[CMD:61],[CMD:67],[CMD:69])([CMD:244],[CMD:114],[CMD:245],[CMD:14],[CMD:53],[CMD:22],[CMD:27],[CMD:55],[CMD:58],[CMD:63],[CMD:64],[CMD:36],[CMD:68],[CMD:138])([CMD:12],[CMD:57],[CMD:60],[CMD:139])()([CMD:8],[CMD:118],[CMD:247],[CMD:19])()([CMD:126]) +LAYOUT SIDEBOARD:(1,1)(NONE,false,50)|([CMD:240]) From e6d56999e8ee6c9b1f8f130f0d5d1af6561b39b6 Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Wed, 9 May 2018 02:17:23 -0400 Subject: [PATCH 102/158] Added Chandra Bold Pyromancer planeswalker deck from Dominaria --- .../Chandra, Bold Pyromancer.dck | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 Mage.Client/release/sample-decks/Planeswalk Decks/Chandra, Bold Pyromancer.dck diff --git a/Mage.Client/release/sample-decks/Planeswalk Decks/Chandra, Bold Pyromancer.dck b/Mage.Client/release/sample-decks/Planeswalk Decks/Chandra, Bold Pyromancer.dck new file mode 100644 index 00000000000..546e2d4634f --- /dev/null +++ b/Mage.Client/release/sample-decks/Planeswalk Decks/Chandra, Bold Pyromancer.dck @@ -0,0 +1,31 @@ +1 [DOM:165] Grunn, the Lonely King +3 [DOM:264] Mountain +2 [DOM:265] Mountain +3 [DOM:262] Mountain +2 [DOM:163] Gift of Growth +3 [DOM:120] Fire Elemental +3 [DOM:263] Mountain +2 [DOM:142] Shivan Fire +1 [DOM:162] Gaea's Protector +1 [DOM:125] Ghitu Chronicler +3 [DOM:268] Forest +2 [DOM:269] Forest +1 [DOM:167] Krosan Druid +3 [DOM:266] Forest +2 [DOM:168] Llanowar Elves +3 [DOM:267] Forest +1 [DOM:176] Pierce the Sky +1 [DOM:275] Chandra, Bold Pyromancer +2 [DOM:276] Chandra's Outburst +1 [DOM:177] Primordial Wurm +1 [DOM:172] Marwyn, the Nurturer +1 [DOM:118] Fiery Intervention +1 [DOM:119] Fight with Fire +1 [DOM:215] Gilded Lotus +4 [DOM:279] Timber Gorge +3 [DOM:159] Elfhame Druid +3 [DOM:277] Karplusan Hound +2 [DOM:156] Baloth Gorger +4 [DOM:278] Pyromantic Pilgrim +LAYOUT MAIN:(2,7)(CMC,true,50)|()([DOM:168],[DOM:168])([DOM:159],[DOM:159],[DOM:159],[DOM:125])([DOM:172],[DOM:278],[DOM:278],[DOM:278],[DOM:278],[DOM:167])([DOM:277],[DOM:277],[DOM:277],[DOM:162],[DOM:156],[DOM:156])([DOM:120],[DOM:120],[DOM:120])([DOM:165],[DOM:177])([DOM:262],[DOM:262],[DOM:262],[DOM:263],[DOM:263],[DOM:263],[DOM:264],[DOM:264],[DOM:264],[DOM:265],[DOM:265],[DOM:266],[DOM:266],[DOM:266],[DOM:267],[DOM:267],[DOM:267],[DOM:268],[DOM:268],[DOM:268],[DOM:269],[DOM:269],[DOM:279],[DOM:279],[DOM:279],[DOM:279])([DOM:142],[DOM:142])([DOM:163],[DOM:163],[DOM:176])([DOM:119])()([DOM:276],[DOM:276],[DOM:215],[DOM:118])([DOM:275]) +LAYOUT SIDEBOARD:(0,0)(NONE,false,50)| From fde9b1cda5cce041379214326b42128c3b0d25af Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Wed, 9 May 2018 22:11:40 -0400 Subject: [PATCH 103/158] Token changes for C17 --- .../mage/game/permanent/token/DeathtouchRatToken.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Mage/src/main/java/mage/game/permanent/token/DeathtouchRatToken.java b/Mage/src/main/java/mage/game/permanent/token/DeathtouchRatToken.java index 91cf8cf3d79..385cf063456 100644 --- a/Mage/src/main/java/mage/game/permanent/token/DeathtouchRatToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/DeathtouchRatToken.java @@ -27,6 +27,9 @@ */ package mage.game.permanent.token; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import mage.constants.CardType; import mage.MageInt; import mage.abilities.keyword.DeathtouchAbility; @@ -37,10 +40,16 @@ import mage.constants.SubType; * @author Saga */ public class DeathtouchRatToken extends TokenImpl { + + final static private List tokenImageSets = new ArrayList<>(); + static { + tokenImageSets.addAll(Arrays.asList("C17")); + } public DeathtouchRatToken() { super("Rat", "1/1 black Rat creature token with deathtouch"); this.setExpansionSetCodeForImage("C17"); + availableImageSetCodes = tokenImageSets; this.cardType.add(CardType.CREATURE); this.color.setBlack(true); this.subtype.add(SubType.RAT); From 849fb5a14a979c5ae72d5288ea6db2fc94dcd32d Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Wed, 9 May 2018 22:11:50 -0400 Subject: [PATCH 104/158] Token changes for C17 --- .../mage/game/permanent/token/EdgarMarkovToken.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Mage/src/main/java/mage/game/permanent/token/EdgarMarkovToken.java b/Mage/src/main/java/mage/game/permanent/token/EdgarMarkovToken.java index fb84b3ddac0..ac8b587e67f 100644 --- a/Mage/src/main/java/mage/game/permanent/token/EdgarMarkovToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/EdgarMarkovToken.java @@ -27,6 +27,9 @@ */ package mage.game.permanent.token; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import mage.constants.CardType; import mage.constants.SubType; import mage.MageInt; @@ -37,8 +40,15 @@ import mage.MageInt; */ public class EdgarMarkovToken extends TokenImpl { + final static private List tokenImageSets = new ArrayList<>(); + static { + tokenImageSets.addAll(Arrays.asList("C17")); + } + public EdgarMarkovToken() { super("Vampire", "1/1 black Vampire creature token"); + availableImageSetCodes = tokenImageSets; + setExpansionSetCodeForImage("C17"); cardType.add(CardType.CREATURE); color.setBlack(true); subtype.add(SubType.VAMPIRE); From b93bbb6e3c5b7a8922df18ccb957b35bbc29aeb7 Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Wed, 9 May 2018 22:11:56 -0400 Subject: [PATCH 105/158] Token changes for C17 --- .../permanent/token/UtvaraHellkiteDragonToken.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Mage/src/main/java/mage/game/permanent/token/UtvaraHellkiteDragonToken.java b/Mage/src/main/java/mage/game/permanent/token/UtvaraHellkiteDragonToken.java index b2a74140ff4..73c4fe7a90b 100644 --- a/Mage/src/main/java/mage/game/permanent/token/UtvaraHellkiteDragonToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/UtvaraHellkiteDragonToken.java @@ -27,6 +27,9 @@ */ package mage.game.permanent.token; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import mage.constants.CardType; import mage.constants.SubType; import mage.MageInt; @@ -37,9 +40,16 @@ import mage.abilities.keyword.FlyingAbility; * @author spjspj */ public class UtvaraHellkiteDragonToken extends TokenImpl { + + final static private List tokenImageSets = new ArrayList<>(); + static { + tokenImageSets.addAll(Arrays.asList("C17")); + } public UtvaraHellkiteDragonToken() { super("Dragon", "6/6 red Dragon creature token with flying"); + availableImageSetCodes = tokenImageSets; + setExpansionSetCodeForImage("C17"); cardType.add(CardType.CREATURE); color.setRed(true); subtype.add(SubType.DRAGON); From ba57aeb82072961ddcdb20def7093ccfb5eb7b96 Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Wed, 9 May 2018 22:12:06 -0400 Subject: [PATCH 106/158] Token changes for C17 --- .../java/mage/game/permanent/token/EldraziSpawnToken.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Mage/src/main/java/mage/game/permanent/token/EldraziSpawnToken.java b/Mage/src/main/java/mage/game/permanent/token/EldraziSpawnToken.java index 59d0162ef25..50be9805b2a 100644 --- a/Mage/src/main/java/mage/game/permanent/token/EldraziSpawnToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/EldraziSpawnToken.java @@ -49,7 +49,7 @@ public class EldraziSpawnToken extends TokenImpl { final static private List tokenImageSets = new ArrayList<>(); static { - tokenImageSets.addAll(Arrays.asList("ROE", "MM2", "DDP")); + tokenImageSets.addAll(Arrays.asList("ROE", "MM2", "DDP", "C17")); } public EldraziSpawnToken() { @@ -62,8 +62,8 @@ public class EldraziSpawnToken extends TokenImpl { addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, Mana.ColorlessMana(1), new SacrificeSourceCost())); availableImageSetCodes = tokenImageSets; - // Get one of the three possible token images - this.setTokenType(RandomUtil.nextInt(3) + 1); + // Get one of the four possible token images + this.setTokenType(RandomUtil.nextInt(4) + 1); } public EldraziSpawnToken(final EldraziSpawnToken token) { From 4a6cdbe560ba1a807a1fa796ba1060a2a090e9a7 Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Wed, 9 May 2018 22:12:13 -0400 Subject: [PATCH 107/158] Token changes for C17 --- Mage/src/main/java/mage/game/permanent/token/DragonToken.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage/src/main/java/mage/game/permanent/token/DragonToken.java b/Mage/src/main/java/mage/game/permanent/token/DragonToken.java index 125243d346b..9d6473f30be 100644 --- a/Mage/src/main/java/mage/game/permanent/token/DragonToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/DragonToken.java @@ -45,7 +45,7 @@ public class DragonToken extends TokenImpl { final static private List tokenImageSets = new ArrayList<>(); static { - tokenImageSets.addAll(Arrays.asList("DTK", "MMA", "ALA", "MM3")); + tokenImageSets.addAll(Arrays.asList("DTK", "MMA", "ALA", "MM3", "C17")); } public DragonToken() { From 31419dbc766364250cef8f037f479a24bd324320 Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Wed, 9 May 2018 22:12:23 -0400 Subject: [PATCH 108/158] Token changes for C17 --- .../mage/game/permanent/token/CatWarriorToken.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Mage/src/main/java/mage/game/permanent/token/CatWarriorToken.java b/Mage/src/main/java/mage/game/permanent/token/CatWarriorToken.java index 147b1ab6206..0e526afe6ac 100644 --- a/Mage/src/main/java/mage/game/permanent/token/CatWarriorToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/CatWarriorToken.java @@ -27,6 +27,9 @@ */ package mage.game.permanent.token; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import mage.constants.CardType; import mage.abilities.keyword.ForestwalkAbility; import mage.constants.SubType; @@ -37,8 +40,15 @@ import mage.constants.SubType; */ public class CatWarriorToken extends TokenImpl { + final static private List tokenImageSets = new ArrayList<>(); + + static { + tokenImageSets.addAll(Arrays.asList("PLC", "C17")); + } + public CatWarriorToken() { super("Cat Warrior", "2/2 green Cat Warrior creature token with forestwalk"); + availableImageSetCodes = tokenImageSets; this.setOriginalExpansionSetCode("PLC"); this.getPower().modifyBaseValue(2); this.getToughness().modifyBaseValue(2); From d73b1c298761ffcb51b476956be84c9449e462bf Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Wed, 9 May 2018 22:12:40 -0400 Subject: [PATCH 109/158] Token changes for C17 --- .../game/permanent/token/WasitoraCatDragonToken.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Mage/src/main/java/mage/game/permanent/token/WasitoraCatDragonToken.java b/Mage/src/main/java/mage/game/permanent/token/WasitoraCatDragonToken.java index eeb7623d960..2db41d82e35 100644 --- a/Mage/src/main/java/mage/game/permanent/token/WasitoraCatDragonToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/WasitoraCatDragonToken.java @@ -27,6 +27,9 @@ */ package mage.game.permanent.token; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import mage.constants.CardType; import mage.constants.SubType; import mage.MageInt; @@ -38,8 +41,17 @@ import mage.abilities.keyword.FlyingAbility; */ public class WasitoraCatDragonToken extends TokenImpl { + final static private List tokenImageSets = new ArrayList<>(); + + static { + tokenImageSets.addAll(Arrays.asList("C17")); + } + public WasitoraCatDragonToken() { super("Cat Dragon", "3/3 black, red, and green Cat Dragon creature token with flying"); + + availableImageSetCodes = tokenImageSets; + setOriginalExpansionSetCode("C17"); cardType.add(CardType.CREATURE); this.subtype.add(SubType.CAT); From 5274436938c6a2ab4aa446dd2a8ad089a111979e Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Wed, 9 May 2018 22:12:46 -0400 Subject: [PATCH 110/158] Token changes for C17 --- Mage/src/main/java/mage/game/permanent/token/CatToken.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage/src/main/java/mage/game/permanent/token/CatToken.java b/Mage/src/main/java/mage/game/permanent/token/CatToken.java index 52c5ff44b79..5af06d60428 100644 --- a/Mage/src/main/java/mage/game/permanent/token/CatToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/CatToken.java @@ -44,7 +44,7 @@ public class CatToken extends TokenImpl { final static private List tokenImageSets = new ArrayList<>(); static { - tokenImageSets.addAll(Arrays.asList("SOM", "M13", "M14", "C14", "C15")); + tokenImageSets.addAll(Arrays.asList("SOM", "M13", "M14", "C14", "C15", "C17")); } public CatToken() { From c8d2c2f25f44ed003988b1bc6f36fcc5447c8e34 Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Wed, 9 May 2018 22:12:56 -0400 Subject: [PATCH 111/158] Token changes for C17 --- .../main/java/mage/game/permanent/token/BatToken.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Mage/src/main/java/mage/game/permanent/token/BatToken.java b/Mage/src/main/java/mage/game/permanent/token/BatToken.java index a62ecd7c7bc..68059eb78ff 100644 --- a/Mage/src/main/java/mage/game/permanent/token/BatToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/BatToken.java @@ -1,14 +1,24 @@ package mage.game.permanent.token; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import mage.MageInt; import mage.abilities.keyword.FlyingAbility; import mage.constants.CardType; import mage.constants.SubType; public class BatToken extends TokenImpl { + + final static private List tokenImageSets = new ArrayList<>(); + + static { + tokenImageSets.addAll(Arrays.asList("MMA", "C17")); + } public BatToken() { super("Bat", "1/1 black Bat creature token with flying"); + availableImageSetCodes = tokenImageSets; cardType.add(CardType.CREATURE); color.setBlack(true); subtype.add(SubType.BAT); From e6546352118793bf5918b1a931069387a1c2d9ec Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Wed, 9 May 2018 22:13:30 -0400 Subject: [PATCH 112/158] Token changes for C17 --- Mage.Client/src/main/resources/card-pictures-tok.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Mage.Client/src/main/resources/card-pictures-tok.txt b/Mage.Client/src/main/resources/card-pictures-tok.txt index 270ecc6e7ed..8d12f5895ba 100644 --- a/Mage.Client/src/main/resources/card-pictures-tok.txt +++ b/Mage.Client/src/main/resources/card-pictures-tok.txt @@ -343,6 +343,17 @@ |Generate|TOK:C16|Thopter|| |Generate|TOK:C16|Worm|| |Generate|TOK:C16|Zombie|| +|Generate|TOK:C17|Bat|| +|Generate|TOK:C17|Cat|| +|Generate|TOK:C17|Cat Dragon|||WasitoraCatDragonToken| +|Generate|TOK:C17|Cat Warrior|| +|Generate|TOK:C17|Dragon|1||DragonToken| +|Generate|TOK:C17|Dragon|2||UtavaraHellkiteDragonToken| +|Generate|TOK:C17|Eldrazi Spawn|| +|Generate|TOK:C17|Gold|| +|Generate|TOK:C17|Rat|||DeathtouchRatToken| +|Generate|TOK:C17|Vampire|||EdgarMarkovToken| +|Generate|TOK:C17|Zombie|| |Generate|TOK:CHK|Dragon Spirit|||TatsumaDragonToken| |Generate|TOK:CHK|Elemental|||SeedGuardianToken| |Generate|TOK:CHK|Illusion|||MelokuTheCloudedMirrorToken| From 15c72f6d8d688455ccaab282b72875810d034abc Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Thu, 10 May 2018 00:25:49 -0400 Subject: [PATCH 113/158] Token image changes for DOM --- .../src/main/resources/card-pictures-tok.txt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Mage.Client/src/main/resources/card-pictures-tok.txt b/Mage.Client/src/main/resources/card-pictures-tok.txt index 92e8911e182..83df7a8e29a 100644 --- a/Mage.Client/src/main/resources/card-pictures-tok.txt +++ b/Mage.Client/src/main/resources/card-pictures-tok.txt @@ -513,6 +513,20 @@ |Generate|TOK:DKA|Vampire|||SorinLordOfInnistradVampireToken| |Generate|TOK:DKA|Wolf|||WolfToken| |Generate|TOK:DKA|Zombie|||ZombieToken| +|Generate|TOK:DOM|Cleric|||BelzenlokClericToken| +|Generate|TOK:DOM|Construct|||KarnConstructToken| +|Generate|TOK:DOM|Demon|||BelzenlokDemonToken| +|Generate|TOK:DOM|Elemental|||ValdukElementalToken| +|Gererate|TOK:DOM|Goblin|| +|Generate|TOK:DOM|Karox Bladewing|||KaroxBladewingDragonToken| +|Generate|TOK:DOM|Knight|1| +|Generate|TOK:DOM|Knight|2| +|Generate|TOK:DOM|Nightmare Horror|||ChainersTormentNightmareToken| +|Generate|TOK:DOM|Saproling|1| +|Generate|TOK:DOM|Saproling|2| +|Generate|TOK:DOM|Saproling|3| +|Generate|TOK:DOM|Soldier|| +|Generate|TOK:DOM|Zombie Knight|| |Generate|TOK:DRB|Saproling|||SaprolingToken| |Generate|TOK:DST|Beast|||BeastToken| |Generate|TOK:DST|Elemental|1||WandOfTheElementsFirstToken| From b773599614813a6f3c60ed748f24a58aa4681c9d Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Thu, 10 May 2018 00:27:26 -0400 Subject: [PATCH 114/158] Token image changes for DOM --- .../permanent/token/ZombieKnightToken.java | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/Mage/src/main/java/mage/game/permanent/token/ZombieKnightToken.java b/Mage/src/main/java/mage/game/permanent/token/ZombieKnightToken.java index 136850dab42..ae28f573f43 100644 --- a/Mage/src/main/java/mage/game/permanent/token/ZombieKnightToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/ZombieKnightToken.java @@ -1,5 +1,35 @@ +/* + * 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.game.permanent.token; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import mage.MageInt; import mage.ObjectColor; import mage.abilities.keyword.MenaceAbility; @@ -8,9 +38,16 @@ import mage.constants.SubType; public class ZombieKnightToken extends TokenImpl { + final static private List tokenImageSets = new ArrayList<>(); + static { + tokenImageSets.addAll(Arrays.asList("DOM")); + } + public ZombieKnightToken(){ super("Zombie Knight", "a 2/2 black Zombie Knight creature token with menace"); - color.addColor(ObjectColor.BLACK); + availableImageSetCodes = tokenImageSets; + setOriginalExpansionSetCode("DOM"); + color.setBlack(true); cardType.add(CardType.CREATURE); subtype.add(SubType.ZOMBIE, SubType.KNIGHT); addAbility(new MenaceAbility()); From bc70a5e4ad4f89645e030260c9046f923f0f8f73 Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Thu, 10 May 2018 00:27:53 -0400 Subject: [PATCH 115/158] Token image changes for DOM --- Mage/src/main/java/mage/game/permanent/token/SoldierToken.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage/src/main/java/mage/game/permanent/token/SoldierToken.java b/Mage/src/main/java/mage/game/permanent/token/SoldierToken.java index 5960e940258..33e18b779c9 100644 --- a/Mage/src/main/java/mage/game/permanent/token/SoldierToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/SoldierToken.java @@ -45,7 +45,7 @@ public class SoldierToken extends TokenImpl { static { tokenImageSets.addAll(Arrays.asList("10E", "M15", "C14", "ORI", "ALA", "DDF", "THS", "M12", "M13", "MM2", "MMA", "RTR", - "SOM", "DDO", "M10", "ORI", "EMN", "EMA", "CN2", "C16", "MM3", "E01")); + "SOM", "DDO", "M10", "ORI", "EMN", "EMA", "CN2", "C16", "MM3", "E01", "DOM")); } public SoldierToken() { From 43d99b5caa235b504a651515c396f13654969d02 Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Thu, 10 May 2018 00:28:17 -0400 Subject: [PATCH 116/158] Token image changes for DOM --- .../java/mage/game/permanent/token/SaprolingToken.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Mage/src/main/java/mage/game/permanent/token/SaprolingToken.java b/Mage/src/main/java/mage/game/permanent/token/SaprolingToken.java index 8837db22f47..ecb3a41b2c0 100644 --- a/Mage/src/main/java/mage/game/permanent/token/SaprolingToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/SaprolingToken.java @@ -64,7 +64,9 @@ public class SaprolingToken extends TokenImpl { "CMA", "VMA", // 2 different token, one with DIFFERENT stats, "Saproling Burst" create different token, see https://scryfall.com/card/tvma/12 "E02", - "RIX")); + "RIX", + "DOM" // 3 different token images + )); } public SaprolingToken() { @@ -82,6 +84,9 @@ public class SaprolingToken extends TokenImpl { if (getOriginalExpansionSetCode() != null && getOriginalExpansionSetCode().equals("C16")) { this.setTokenType(RandomUtil.nextInt(2) + 1); } + if (getOriginalExpansionSetCode() != null && getOriginalExpansionSetCode().equals("DOM")) { + this.setTokenType(RandomUtil.nextInt(3) + 1); + } cardType.add(CardType.CREATURE); color.setGreen(true); subtype.add(SubType.SAPROLING); From af31f86b10f13b47f252dece87e25c718a8012cb Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Thu, 10 May 2018 00:29:12 -0400 Subject: [PATCH 117/158] Token image changes for DOM --- .../token/ChainersTormentNightmareToken.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/Mage/src/main/java/mage/game/permanent/token/ChainersTormentNightmareToken.java b/Mage/src/main/java/mage/game/permanent/token/ChainersTormentNightmareToken.java index 4306280617f..c4042149cf9 100644 --- a/Mage/src/main/java/mage/game/permanent/token/ChainersTormentNightmareToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/ChainersTormentNightmareToken.java @@ -27,6 +27,9 @@ */ package mage.game.permanent.token; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import mage.constants.CardType; import mage.constants.SubType; import mage.MageInt; @@ -37,12 +40,23 @@ import mage.MageInt; */ public class ChainersTormentNightmareToken extends TokenImpl { + final static private List tokenImageSets = new ArrayList<>(); + static { + tokenImageSets.addAll(Arrays.asList("DOM")); + } + public ChainersTormentNightmareToken() { this(0); }; public ChainersTormentNightmareToken(int xValue) { - super("Nightmare", "X/X black Nightmare artifact creature token"); + super("Nightmare Horror", "X/X black Nightmare Horror creature token"); + + availableImageSetCodes = tokenImageSets; + setOriginalExpansionSetCode("DOM"); + cardType.add(CardType.CREATURE); subtype.add(SubType.NIGHTMARE); + subtype.add(SubType.HORROR); + color.setBlack(true); power = new MageInt(xValue); toughness = new MageInt(xValue); } From 801d2c39a43c2bfb0df4663acaa7b19662fcf696 Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Thu, 10 May 2018 00:29:51 -0400 Subject: [PATCH 118/158] Token image changes for DOM --- Mage/src/main/java/mage/game/permanent/token/KnightToken.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Mage/src/main/java/mage/game/permanent/token/KnightToken.java b/Mage/src/main/java/mage/game/permanent/token/KnightToken.java index 4e716341372..5ad8c1f7237 100644 --- a/Mage/src/main/java/mage/game/permanent/token/KnightToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/KnightToken.java @@ -7,6 +7,7 @@ import mage.MageInt; import mage.abilities.keyword.VigilanceAbility; import mage.constants.CardType; import mage.constants.SubType; +import mage.util.RandomUtil; /** * @@ -25,6 +26,9 @@ public class KnightToken extends TokenImpl { if (getOriginalExpansionSetCode() != null && getOriginalExpansionSetCode().equals("C15")) { setTokenType(2); } + if (getOriginalExpansionSetCode() != null && getOriginalExpansionSetCode().equals("DOM")) { + this.setTokenType(RandomUtil.nextInt(2) + 1); + } cardType.add(CardType.CREATURE); color.setWhite(true); subtype.add(SubType.KNIGHT); From 8477a56c54ff19dc359439a2f2492d7c34b90a25 Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Thu, 10 May 2018 00:30:27 -0400 Subject: [PATCH 119/158] Token image changes for DOM --- .../permanent/token/KaroxBladewingDragonToken.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Mage/src/main/java/mage/game/permanent/token/KaroxBladewingDragonToken.java b/Mage/src/main/java/mage/game/permanent/token/KaroxBladewingDragonToken.java index 5830be0b35d..cd212caa88f 100644 --- a/Mage/src/main/java/mage/game/permanent/token/KaroxBladewingDragonToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/KaroxBladewingDragonToken.java @@ -27,6 +27,9 @@ */ package mage.game.permanent.token; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import mage.abilities.keyword.FlyingAbility; import mage.constants.CardType; import mage.constants.SubType; @@ -38,14 +41,21 @@ import mage.constants.SuperType; */ public class KaroxBladewingDragonToken extends TokenImpl { + final static private List tokenImageSets = new ArrayList<>(); + static { + tokenImageSets.addAll(Arrays.asList("DOM")); + } + public KaroxBladewingDragonToken() { super("Karox Bladewing", "legendary 4/4 red Dragon creature token with flying", 4, 4); + availableImageSetCodes = tokenImageSets; this.setOriginalExpansionSetCode("DOM"); this.addSuperType(SuperType.LEGENDARY); this.cardType.add(CardType.CREATURE); this.subtype.add(SubType.DRAGON); + this.color.setRed(true); this.addAbility(FlyingAbility.getInstance()); } From 63df28668076f899e9fe4ef0b7f90ffe92181b64 Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Thu, 10 May 2018 00:30:50 -0400 Subject: [PATCH 120/158] Token image changes for DOM --- Mage/src/main/java/mage/game/permanent/token/GoblinToken.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage/src/main/java/mage/game/permanent/token/GoblinToken.java b/Mage/src/main/java/mage/game/permanent/token/GoblinToken.java index 52f5a2a3bd1..6134019de3e 100644 --- a/Mage/src/main/java/mage/game/permanent/token/GoblinToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/GoblinToken.java @@ -44,7 +44,8 @@ public class GoblinToken extends TokenImpl { static { tokenImageSets.addAll(Arrays.asList("10E", "ALA", "SOM", "M10", "NPH", "M13", "RTR", - "MMA", "M15", "C14", "KTK", "EVG", "DTK", "ORI", "DDG", "DDN", "DD3EVG", "MM2", "MM3", "EMA", "C16")); + "MMA", "M15", "C14", "KTK", "EVG", "DTK", "ORI", "DDG", "DDN", "DD3EVG", "MM2", + "MM3", "EMA", "C16", "DOM")); } public GoblinToken() { From fc488e63a311cba60422c560397f881a0b3bd413 Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Thu, 10 May 2018 00:31:25 -0400 Subject: [PATCH 121/158] Token image changes for DOM --- .../mage/game/permanent/token/ValdukElementalToken.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Mage/src/main/java/mage/game/permanent/token/ValdukElementalToken.java b/Mage/src/main/java/mage/game/permanent/token/ValdukElementalToken.java index 193c8a999af..364ecc45a1c 100644 --- a/Mage/src/main/java/mage/game/permanent/token/ValdukElementalToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/ValdukElementalToken.java @@ -27,6 +27,9 @@ */ package mage.game.permanent.token; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import mage.constants.CardType; import mage.constants.SubType; import mage.MageInt; @@ -39,12 +42,18 @@ import mage.abilities.keyword.TrampleAbility; */ public class ValdukElementalToken extends TokenImpl { + final static private List tokenImageSets = new ArrayList<>(); + static { + tokenImageSets.addAll(Arrays.asList("DOM")); + } + public ValdukElementalToken() { this("DOM"); } public ValdukElementalToken(String setCode) { super("Elemental", "3/1 red Elemental creature token with trample and haste"); + availableImageSetCodes = tokenImageSets; cardType.add(CardType.CREATURE); color.setRed(true); subtype.add(SubType.ELEMENTAL); From ae69f3ea699b2e4051aeb98f02c4fb412f7aef53 Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Thu, 10 May 2018 00:31:47 -0400 Subject: [PATCH 122/158] Token image changes for DOM --- .../mage/game/permanent/token/KarnConstructToken.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Mage/src/main/java/mage/game/permanent/token/KarnConstructToken.java b/Mage/src/main/java/mage/game/permanent/token/KarnConstructToken.java index a4a3aaee441..8c265f1de33 100644 --- a/Mage/src/main/java/mage/game/permanent/token/KarnConstructToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/KarnConstructToken.java @@ -27,6 +27,9 @@ */ package mage.game.permanent.token; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import static javax.management.Query.value; import mage.constants.CardType; import mage.constants.SubType; @@ -52,12 +55,18 @@ public class KarnConstructToken extends TokenImpl { filter.add(new CardTypePredicate(CardType.ARTIFACT)); } + final static private List tokenImageSets = new ArrayList<>(); + static { + tokenImageSets.addAll(Arrays.asList("DOM")); + } + public KarnConstructToken() { this("DOM"); } public KarnConstructToken(String setCode) { super("Construct", "0/0 colorless Construct artifact creature token with \"This creature gets +1/+1 for each artifact you control.\""); + availableImageSetCodes = tokenImageSets; this.setOriginalExpansionSetCode(setCode); cardType.add(CardType.ARTIFACT); cardType.add(CardType.CREATURE); From 09e0877c1b0d58423d417ce99e0377f0a86385eb Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Thu, 10 May 2018 00:32:31 -0400 Subject: [PATCH 123/158] Token image changes for DOM --- .../mage/game/permanent/token/BelzenlokDemonToken.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Mage/src/main/java/mage/game/permanent/token/BelzenlokDemonToken.java b/Mage/src/main/java/mage/game/permanent/token/BelzenlokDemonToken.java index c2b128189be..e7d194041d9 100644 --- a/Mage/src/main/java/mage/game/permanent/token/BelzenlokDemonToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/BelzenlokDemonToken.java @@ -27,6 +27,9 @@ */ package mage.game.permanent.token; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -51,9 +54,15 @@ import mage.game.permanent.Permanent; */ public class BelzenlokDemonToken extends TokenImpl { + final static private List tokenImageSets = new ArrayList<>(); + static { + tokenImageSets.addAll(Arrays.asList("DOM")); + } + public BelzenlokDemonToken() { super("Demon", "6/6 black Demon creature token with flying, trample, and " + "\"At the beginning of your upkeep, sacrifice another creature. If you can't, this creature deals 6 damage to you.\""); + availableImageSetCodes = tokenImageSets; cardType.add(CardType.CREATURE); color.setBlack(true); subtype.add(SubType.DEMON); From f2f9661a91a482952327639784c5608c53e63d07 Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Thu, 10 May 2018 00:32:53 -0400 Subject: [PATCH 124/158] Token image changes for DOM --- .../mage/game/permanent/token/BelzenlokClericToken.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Mage/src/main/java/mage/game/permanent/token/BelzenlokClericToken.java b/Mage/src/main/java/mage/game/permanent/token/BelzenlokClericToken.java index f6b6a787eef..00eee821106 100644 --- a/Mage/src/main/java/mage/game/permanent/token/BelzenlokClericToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/BelzenlokClericToken.java @@ -27,6 +27,9 @@ */ package mage.game.permanent.token; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import mage.MageInt; import mage.constants.CardType; import mage.constants.SubType; @@ -37,8 +40,14 @@ import mage.constants.SubType; */ public class BelzenlokClericToken extends TokenImpl { + final static private List tokenImageSets = new ArrayList<>(); + static { + tokenImageSets.addAll(Arrays.asList("DOM")); + } + public BelzenlokClericToken() { super("Cleric", "0/1 black Cleric creature token"); + availableImageSetCodes = tokenImageSets; cardType.add(CardType.CREATURE); subtype.add(SubType.CLERIC); color.setBlack(true); From 74f05d438fea5079b64b98ec6efb1d74f76ec6a0 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 10 May 2018 08:55:10 +0200 Subject: [PATCH 125/158] * Fixed that cast conditions of legendary sorceries were checked correctly if you cast a card owned by another player e.g. from exile (fixes #4921). --- .../conditional/LegendarySorceryTest.java | 146 ++++++++++++++++++ .../common/LegendarySpellAbility.java | 62 +++++++- .../condition/common/LegendaryCondition.java | 46 ------ 3 files changed, 203 insertions(+), 51 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/conditional/LegendarySorceryTest.java delete mode 100644 Mage/src/main/java/mage/abilities/condition/common/LegendaryCondition.java diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/conditional/LegendarySorceryTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/conditional/LegendarySorceryTest.java new file mode 100644 index 00000000000..ea68ba67bb5 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/conditional/LegendarySorceryTest.java @@ -0,0 +1,146 @@ +/* + * 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 org.mage.test.cards.conditional; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ +public class LegendarySorceryTest extends CardTestPlayerBase { + + @Test + public void testCastSuccessful() { + // (You may cast a legendary sorcery only if you control a legendary creature or planeswalker.) + // Exile all nonland permanents that aren’t legendary. + addCard(Zone.HAND, playerA, "Urza's Ruinous Blast"); // Sorcery Legendary {4}{W} + addCard(Zone.BATTLEFIELD, playerA, "Plains", 5); + addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion", 1); // non Legendary + // Flying, first strike, vigilance, trample, haste, protection from black and from red + addCard(Zone.BATTLEFIELD, playerA, "Akroma, Angel of Wrath", 1); // Legendary + + addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1); // non Legendary + // Flying, first strike, vigilance, trample, haste, protection from black and from red + addCard(Zone.BATTLEFIELD, playerB, "Akroma, Angel of Wrath", 1); // Legendary + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Urza's Ruinous Blast"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertGraveyardCount(playerA, "Urza's Ruinous Blast", 1); + + assertPermanentCount(playerA, "Plains", 5); + + assertPermanentCount(playerA, "Silvercoat Lion", 0); + assertPermanentCount(playerB, "Silvercoat Lion", 0); + + assertPermanentCount(playerA, "Akroma, Angel of Wrath", 1); + assertPermanentCount(playerB, "Akroma, Angel of Wrath", 1); + + } + + @Test + public void testCastNotSuccessful() { + // (You may cast a legendary sorcery only if you control a legendary creature or planeswalker.) + // Exile all nonland permanents that aren’t legendary. + addCard(Zone.HAND, playerA, "Urza's Ruinous Blast"); // Sorcery Legendary {4}{W} + addCard(Zone.BATTLEFIELD, playerA, "Plains", 5); + addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion", 1); // non Legendary + + addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1); // non Legendary + // Flying, first strike, vigilance, trample, haste, protection from black and from red + addCard(Zone.BATTLEFIELD, playerB, "Akroma, Angel of Wrath", 1); // Legendary + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Urza's Ruinous Blast"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertGraveyardCount(playerA, "Urza's Ruinous Blast", 0); + + assertPermanentCount(playerA, "Plains", 5); + + assertPermanentCount(playerA, "Silvercoat Lion", 1); + assertPermanentCount(playerB, "Silvercoat Lion", 1); + + assertPermanentCount(playerA, "Akroma, Angel of Wrath", 0); + assertPermanentCount(playerB, "Akroma, Angel of Wrath", 1); + + } + + @Test + public void testCastSuccessfulFromExile() { + // First strike + // When this enters the battlefield, exile target instant or sorcery card from an opponent's graveyard. + // You may cast that card this turn and you may spend mana as though it were mana of any color. + // If that card would be put into a graveyard this turn, exile it instead. + addCard(Zone.HAND, playerA, "Dire Fleet Daredevil"); // Creature {1}{R} + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 2); + addCard(Zone.BATTLEFIELD, playerA, "Plains", 5); + addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion", 1); // non Legendary + addCard(Zone.BATTLEFIELD, playerA, "Akroma, Angel of Wrath", 1); // Legendary + + addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1); // non Legendary + // Flying, first strike, vigilance, trample, haste, protection from black and from red + addCard(Zone.BATTLEFIELD, playerB, "Akroma, Angel of Wrath", 1); // Legendary + // (You may cast a legendary sorcery only if you control a legendary creature or planeswalker.) + // Exile all nonland permanents that aren’t legendary. + addCard(Zone.GRAVEYARD, playerB, "Urza's Ruinous Blast"); // Sorcery Legendary {4}{W} + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Dire Fleet Daredevil"); + addTarget(playerA, "Urza's Ruinous Blast"); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Urza's Ruinous Blast"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertExileCount(playerB, "Urza's Ruinous Blast", 1); + + assertHandCount(playerA, "Dire Fleet Daredevil", 0); + assertPermanentCount(playerA, "Dire Fleet Daredevil", 0); + + assertExileCount(playerA, "Dire Fleet Daredevil", 1); + assertExileCount(playerA, "Silvercoat Lion", 1); + assertExileCount(playerB, "Silvercoat Lion", 1); + + assertPermanentCount(playerA, "Plains", 5); + + assertPermanentCount(playerA, "Silvercoat Lion", 0); + assertPermanentCount(playerB, "Silvercoat Lion", 0); + + assertPermanentCount(playerA, "Akroma, Angel of Wrath", 1); + assertPermanentCount(playerB, "Akroma, Angel of Wrath", 1); + + } +} diff --git a/Mage/src/main/java/mage/abilities/common/LegendarySpellAbility.java b/Mage/src/main/java/mage/abilities/common/LegendarySpellAbility.java index ca0604d8469..d0ee3f7d0c1 100644 --- a/Mage/src/main/java/mage/abilities/common/LegendarySpellAbility.java +++ b/Mage/src/main/java/mage/abilities/common/LegendarySpellAbility.java @@ -1,18 +1,27 @@ package mage.abilities.common; -import mage.abilities.condition.common.LegendaryCondition; +import mage.abilities.Ability; +import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.SuperType; import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.predicate.mageobject.SupertypePredicate; +import mage.game.Game; +import mage.game.events.GameEvent; /** - * @author JRHerlehy - * Created on 4/8/18. + * @author JRHerlehy Created on 4/8/18. */ public class LegendarySpellAbility extends SimpleStaticAbility { public LegendarySpellAbility() { - super(Zone.ALL, new CastOnlyIfConditionIsTrueEffect(LegendaryCondition.instance)); + super(Zone.ALL, new LegendarySpellAbilityCheckEffect()); this.setRuleAtTheTop(true); - this.getEffects().get(0).setText("(You may cast a legendary sorcery only if you control a legendary creature or planeswalker.)"); } private LegendarySpellAbility(final LegendarySpellAbility ability) { @@ -24,3 +33,46 @@ public class LegendarySpellAbility extends SimpleStaticAbility { return new LegendarySpellAbility(this); } } + +class LegendarySpellAbilityCheckEffect extends ContinuousRuleModifyingEffectImpl { + + private static final FilterPermanent filter = new FilterPermanent("legendary creature or planeswalker"); + + static { + filter.add( + Predicates.and( + new SupertypePredicate(SuperType.LEGENDARY), + Predicates.or( + new CardTypePredicate(CardType.CREATURE), + new CardTypePredicate(CardType.PLANESWALKER) + ) + ) + ); + } + + public LegendarySpellAbilityCheckEffect() { + super(Duration.EndOfGame, Outcome.Detriment); + staticText = "(You may cast a legendary sorcery only if you control a legendary creature or planeswalker.)"; + } + + private LegendarySpellAbilityCheckEffect(final LegendarySpellAbilityCheckEffect effect) { + super(effect); + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.CAST_SPELL; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + return event.getSourceId().equals(source.getSourceId()) + && !game.getBattlefield().contains(filter, event.getPlayerId(), 1, game); + } + + @Override + public LegendarySpellAbilityCheckEffect copy() { + return new LegendarySpellAbilityCheckEffect(this); + } + +} diff --git a/Mage/src/main/java/mage/abilities/condition/common/LegendaryCondition.java b/Mage/src/main/java/mage/abilities/condition/common/LegendaryCondition.java deleted file mode 100644 index 1dc607643d7..00000000000 --- a/Mage/src/main/java/mage/abilities/condition/common/LegendaryCondition.java +++ /dev/null @@ -1,46 +0,0 @@ -package mage.abilities.condition.common; - -import mage.abilities.Ability; -import mage.abilities.condition.Condition; -import mage.constants.CardType; -import mage.constants.SuperType; -import mage.filter.FilterPermanent; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; -import mage.filter.predicate.mageobject.SupertypePredicate; -import mage.game.Game; - -/** - * @author JRHerlehy - * Created on 4/7/18. - */ -public enum LegendaryCondition implements Condition { - - instance; - - private static final FilterPermanent filter = new FilterPermanent("legendary creature or planeswalker"); - - static { - filter.add( - Predicates.and( - new SupertypePredicate(SuperType.LEGENDARY), - Predicates.or( - new CardTypePredicate(CardType.CREATURE), - new CardTypePredicate(CardType.PLANESWALKER) - ) - ) - ); - } - - - @Override - public boolean apply(Game game, Ability source) { - return game.getBattlefield().contains(filter, source.getControllerId(), 1, game); - } - - - @Override - public String toString() { - return super.toString(); - } -} From 506db51649bc89f63efc5099af6fb5234f8c6fbe Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Thu, 10 May 2018 11:14:17 +0400 Subject: [PATCH 126/158] Fixed card numbers in DRK - The Dark (#4628) --- Mage.Sets/src/mage/sets/TheDark.java | 232 +++++++++++++-------------- 1 file changed, 116 insertions(+), 116 deletions(-) diff --git a/Mage.Sets/src/mage/sets/TheDark.java b/Mage.Sets/src/mage/sets/TheDark.java index f67cff2be9c..c1f910b772e 100644 --- a/Mage.Sets/src/mage/sets/TheDark.java +++ b/Mage.Sets/src/mage/sets/TheDark.java @@ -52,121 +52,121 @@ public class TheDark extends ExpansionSet { this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; - cards.add(new SetCardInfo("Amnesia", 19, Rarity.UNCOMMON, mage.cards.a.Amnesia.class)); - cards.add(new SetCardInfo("Angry Mob", 74, Rarity.UNCOMMON, mage.cards.a.AngryMob.class)); - cards.add(new SetCardInfo("Apprentice Wizard", 20, Rarity.RARE, mage.cards.a.ApprenticeWizard.class)); - cards.add(new SetCardInfo("Ashes to Ashes", 1, Rarity.COMMON, mage.cards.a.AshesToAshes.class)); - cards.add(new SetCardInfo("Ball Lightning", 56, Rarity.RARE, mage.cards.b.BallLightning.class)); - cards.add(new SetCardInfo("Banshee", 2, Rarity.RARE, mage.cards.b.Banshee.class)); - cards.add(new SetCardInfo("Barl's Cage", 93, Rarity.RARE, mage.cards.b.BarlsCage.class)); - cards.add(new SetCardInfo("Blood Moon", 57, Rarity.RARE, mage.cards.b.BloodMoon.class)); - cards.add(new SetCardInfo("Blood of the Martyr", 75, Rarity.RARE, mage.cards.b.BloodOfTheMartyr.class)); - cards.add(new SetCardInfo("Bog Imp", 3, Rarity.COMMON, mage.cards.b.BogImp.class)); - cards.add(new SetCardInfo("Bog Rats", 4, Rarity.COMMON, mage.cards.b.BogRats.class)); - cards.add(new SetCardInfo("Bone Flute", 94, Rarity.UNCOMMON, mage.cards.b.BoneFlute.class)); - cards.add(new SetCardInfo("Book of Rass", 95, Rarity.UNCOMMON, mage.cards.b.BookOfRass.class)); - cards.add(new SetCardInfo("Brainwash", 76, Rarity.COMMON, mage.cards.b.Brainwash.class)); - cards.add(new SetCardInfo("Brothers of Fire", 58, Rarity.UNCOMMON, mage.cards.b.BrothersOfFire.class)); - cards.add(new SetCardInfo("Carnivorous Plant", 38, Rarity.COMMON, mage.cards.c.CarnivorousPlant.class)); - cards.add(new SetCardInfo("Cave People", 59, Rarity.UNCOMMON, mage.cards.c.CavePeople.class)); - cards.add(new SetCardInfo("City of Shadows", 113, Rarity.RARE, mage.cards.c.CityOfShadows.class)); - cards.add(new SetCardInfo("Cleansing", 77, Rarity.RARE, mage.cards.c.Cleansing.class)); - cards.add(new SetCardInfo("Coal Golem", 96, Rarity.UNCOMMON, mage.cards.c.CoalGolem.class)); - cards.add(new SetCardInfo("Curse Artifact", 5, Rarity.RARE, mage.cards.c.CurseArtifact.class)); - cards.add(new SetCardInfo("Dance of Many", 21, Rarity.RARE, mage.cards.d.DanceOfMany.class)); - cards.add(new SetCardInfo("Dark Heart of the Wood", 117, Rarity.COMMON, mage.cards.d.DarkHeartOfTheWood.class)); - cards.add(new SetCardInfo("Dark Sphere", 97, Rarity.RARE, mage.cards.d.DarkSphere.class)); - cards.add(new SetCardInfo("Deep Water", 22, Rarity.COMMON, mage.cards.d.DeepWater.class)); - cards.add(new SetCardInfo("Diabolic Machine", 98, Rarity.UNCOMMON, mage.cards.d.DiabolicMachine.class)); - cards.add(new SetCardInfo("Drowned", 23, Rarity.COMMON, mage.cards.d.Drowned.class)); - cards.add(new SetCardInfo("Dust to Dust", 78, Rarity.COMMON, mage.cards.d.DustToDust.class)); - cards.add(new SetCardInfo("Eater of the Dead", 6, Rarity.UNCOMMON, mage.cards.e.EaterOfTheDead.class)); - cards.add(new SetCardInfo("Electric Eel", 24, Rarity.UNCOMMON, mage.cards.e.ElectricEel.class)); - cards.add(new SetCardInfo("Elves of Deep Shadow", 39, Rarity.UNCOMMON, mage.cards.e.ElvesOfDeepShadow.class)); - cards.add(new SetCardInfo("Erosion", 25, Rarity.COMMON, mage.cards.e.Erosion.class)); - cards.add(new SetCardInfo("Eternal Flame", 60, Rarity.RARE, mage.cards.e.EternalFlame.class)); - cards.add(new SetCardInfo("Exorcist", 79, Rarity.RARE, mage.cards.e.Exorcist.class)); - cards.add(new SetCardInfo("Fasting", 80, Rarity.RARE, mage.cards.f.Fasting.class)); - cards.add(new SetCardInfo("Fellwar Stone", 99, Rarity.UNCOMMON, mage.cards.f.FellwarStone.class)); - cards.add(new SetCardInfo("Festival", 81, Rarity.COMMON, mage.cards.f.Festival.class)); - cards.add(new SetCardInfo("Fire and Brimstone", 82, Rarity.RARE, mage.cards.f.FireAndBrimstone.class)); - cards.add(new SetCardInfo("Fire Drake", 61, Rarity.UNCOMMON, mage.cards.f.FireDrake.class)); - cards.add(new SetCardInfo("Fissure", 62, Rarity.COMMON, mage.cards.f.Fissure.class)); - cards.add(new SetCardInfo("Flood", 26, Rarity.UNCOMMON, mage.cards.f.Flood.class)); - cards.add(new SetCardInfo("Fountain of Youth", 100, Rarity.UNCOMMON, mage.cards.f.FountainOfYouth.class)); - cards.add(new SetCardInfo("Gaea's Touch", 40, Rarity.COMMON, mage.cards.g.GaeasTouch.class)); - cards.add(new SetCardInfo("Giant Shark", 28, Rarity.COMMON, mage.cards.g.GiantShark.class)); - cards.add(new SetCardInfo("Ghost Ship", 27, Rarity.COMMON, mage.cards.g.GhostShip.class)); - cards.add(new SetCardInfo("Goblin Caves", 63, Rarity.COMMON, mage.cards.g.GoblinCaves.class)); - cards.add(new SetCardInfo("Goblin Digging Team", 64, Rarity.COMMON, mage.cards.g.GoblinDiggingTeam.class)); - cards.add(new SetCardInfo("Goblin Hero", 65, Rarity.COMMON, mage.cards.g.GoblinHero.class)); - cards.add(new SetCardInfo("Goblin Rock Sled", 66, Rarity.COMMON, mage.cards.g.GoblinRockSled.class)); - cards.add(new SetCardInfo("Goblin Shrine", 67, Rarity.COMMON, mage.cards.g.GoblinShrine.class)); - cards.add(new SetCardInfo("Goblin Wizard", 68, Rarity.RARE, mage.cards.g.GoblinWizard.class)); - cards.add(new SetCardInfo("Goblins of the Flarg", 69, Rarity.COMMON, mage.cards.g.GoblinsOfTheFlarg.class)); - cards.add(new SetCardInfo("Grave Robbers", 8, Rarity.RARE, mage.cards.g.GraveRobbers.class)); - cards.add(new SetCardInfo("Hidden Path", 41, Rarity.RARE, mage.cards.h.HiddenPath.class)); - cards.add(new SetCardInfo("Holy Light", 83, Rarity.COMMON, mage.cards.h.HolyLight.class)); - cards.add(new SetCardInfo("Inferno", 70, Rarity.RARE, mage.cards.i.Inferno.class)); - cards.add(new SetCardInfo("Inquisition", 9, Rarity.COMMON, mage.cards.i.Inquisition.class)); - cards.add(new SetCardInfo("Knights of Thorn", 84, Rarity.RARE, mage.cards.k.KnightsOfThorn.class)); - cards.add(new SetCardInfo("Land Leeches", 42, Rarity.COMMON, mage.cards.l.LandLeeches.class)); - cards.add(new SetCardInfo("Leviathan", 29, Rarity.RARE, mage.cards.l.Leviathan.class)); - cards.add(new SetCardInfo("Living Armor", 101, Rarity.UNCOMMON, mage.cards.l.LivingArmor.class)); - cards.add(new SetCardInfo("Lurker", 43, Rarity.RARE, mage.cards.l.Lurker.class)); - cards.add(new SetCardInfo("Mana Clash", 71, Rarity.RARE, mage.cards.m.ManaClash.class)); - cards.add(new SetCardInfo("Mana Vortex", 30, Rarity.RARE, mage.cards.m.ManaVortex.class)); - cards.add(new SetCardInfo("Marsh Gas", 10, Rarity.COMMON, mage.cards.m.MarshGas.class)); - cards.add(new SetCardInfo("Marsh Goblins", 118, Rarity.COMMON, mage.cards.m.MarshGoblins.class)); - cards.add(new SetCardInfo("Marsh Viper", 44, Rarity.COMMON, mage.cards.m.MarshViper.class)); - cards.add(new SetCardInfo("Martyr's Cry", 85, Rarity.RARE, mage.cards.m.MartyrsCry.class)); - cards.add(new SetCardInfo("Maze of Ith", 114, Rarity.UNCOMMON, mage.cards.m.MazeOfIth.class)); - cards.add(new SetCardInfo("Merfolk Assassin", 31, Rarity.UNCOMMON, mage.cards.m.MerfolkAssassin.class)); - cards.add(new SetCardInfo("Mind Bomb", 32, Rarity.RARE, mage.cards.m.MindBomb.class)); - cards.add(new SetCardInfo("Miracle Worker", 86, Rarity.COMMON, mage.cards.m.MiracleWorker.class)); - cards.add(new SetCardInfo("Morale", 87, Rarity.COMMON, mage.cards.m.Morale.class)); - cards.add(new SetCardInfo("Murk Dwellers", 11, Rarity.COMMON, mage.cards.m.MurkDwellers.class)); - cards.add(new SetCardInfo("Nameless Race", 12, Rarity.RARE, mage.cards.n.NamelessRace.class)); - cards.add(new SetCardInfo("Necropolis", 102, Rarity.RARE, mage.cards.n.Necropolis.class)); - cards.add(new SetCardInfo("Niall Silvain", 45, Rarity.RARE, mage.cards.n.NiallSilvain.class)); - cards.add(new SetCardInfo("Orc General", 72, Rarity.UNCOMMON, mage.cards.o.OrcGeneral.class)); - cards.add(new SetCardInfo("People of the Woods", 46, Rarity.UNCOMMON, mage.cards.p.PeopleOfTheWoods.class)); - cards.add(new SetCardInfo("Pikemen", 88, Rarity.COMMON, mage.cards.p.Pikemen.class)); - cards.add(new SetCardInfo("Preacher", 89, Rarity.RARE, mage.cards.p.Preacher.class)); - cards.add(new SetCardInfo("Psychic Allergy", 33, Rarity.RARE, mage.cards.p.PsychicAllergy.class)); - cards.add(new SetCardInfo("Rag Man", 13, Rarity.RARE, mage.cards.r.RagMan.class)); - cards.add(new SetCardInfo("Riptide", 34, Rarity.COMMON, mage.cards.r.Riptide.class)); - cards.add(new SetCardInfo("Runesword", 104, Rarity.RARE, mage.cards.r.Runesword.class)); - cards.add(new SetCardInfo("Safe Haven", 115, Rarity.RARE, mage.cards.s.SafeHaven.class)); - cards.add(new SetCardInfo("Savaen Elves", 47, Rarity.COMMON, mage.cards.s.SavaenElves.class)); - cards.add(new SetCardInfo("Scarecrow", 105, Rarity.RARE, mage.cards.s.Scarecrow.class)); - cards.add(new SetCardInfo("Scarwood Bandits", 48, Rarity.RARE, mage.cards.s.ScarwoodBandits.class)); - cards.add(new SetCardInfo("Scarwood Goblins", 119, Rarity.COMMON, mage.cards.s.ScarwoodGoblins.class)); - cards.add(new SetCardInfo("Scarwood Hag", 49, Rarity.UNCOMMON, mage.cards.s.ScarwoodHag.class)); - cards.add(new SetCardInfo("Scavenger Folk", 50, Rarity.COMMON, mage.cards.s.ScavengerFolk.class)); - cards.add(new SetCardInfo("Season of the Witch", 14, Rarity.RARE, mage.cards.s.SeasonOfTheWitch.class)); - cards.add(new SetCardInfo("Sisters of the Flame", 73, Rarity.UNCOMMON, mage.cards.s.SistersOfTheFlame.class)); - cards.add(new SetCardInfo("Skull of Orm", 106, Rarity.UNCOMMON, mage.cards.s.SkullOfOrm.class)); - cards.add(new SetCardInfo("Sorrow's Path", 116, Rarity.RARE, mage.cards.s.SorrowsPath.class)); - cards.add(new SetCardInfo("Spitting Slug", 51, Rarity.RARE, mage.cards.s.SpittingSlug.class)); - cards.add(new SetCardInfo("Squire", 90, Rarity.COMMON, mage.cards.s.Squire.class)); - cards.add(new SetCardInfo("Standing Stones", 107, Rarity.UNCOMMON, mage.cards.s.StandingStones.class)); - cards.add(new SetCardInfo("Stone Calendar", 108, Rarity.RARE, mage.cards.s.StoneCalendar.class)); - cards.add(new SetCardInfo("Sunken City", 35, Rarity.COMMON, mage.cards.s.SunkenCity.class)); - cards.add(new SetCardInfo("Tangle Kelp", 36, Rarity.RARE, mage.cards.t.TangleKelp.class)); - cards.add(new SetCardInfo("The Fallen", 15, Rarity.RARE, mage.cards.t.TheFallen.class)); - cards.add(new SetCardInfo("Tivadar's Crusade", 91, Rarity.UNCOMMON, mage.cards.t.TivadarsCrusade.class)); - cards.add(new SetCardInfo("Tormod's Crypt", 109, Rarity.UNCOMMON, mage.cards.t.TormodsCrypt.class)); - cards.add(new SetCardInfo("Tower of Coireall", 110, Rarity.RARE, mage.cards.t.TowerOfCoireall.class)); - cards.add(new SetCardInfo("Tracker", 52, Rarity.RARE, mage.cards.t.Tracker.class)); - cards.add(new SetCardInfo("Uncle Istvan", 16, Rarity.UNCOMMON, mage.cards.u.UncleIstvan.class)); - cards.add(new SetCardInfo("Venom", 53, Rarity.COMMON, mage.cards.v.Venom.class)); - cards.add(new SetCardInfo("Wand of Ith", 111, Rarity.RARE, mage.cards.w.WandOfIth.class)); - cards.add(new SetCardInfo("War Barge", 112, Rarity.RARE, mage.cards.w.WarBarge.class)); - cards.add(new SetCardInfo("Water Wurm", 37, Rarity.COMMON, mage.cards.w.WaterWurm.class)); - cards.add(new SetCardInfo("Witch Hunter", 92, Rarity.RARE, mage.cards.w.WitchHunter.class)); - cards.add(new SetCardInfo("Word of Binding", 17, Rarity.COMMON, mage.cards.w.WordOfBinding.class)); - cards.add(new SetCardInfo("Wormwood Treefolk", 55, Rarity.RARE, mage.cards.w.WormwoodTreefolk.class)); - cards.add(new SetCardInfo("Worms of the Earth", 18, Rarity.RARE, mage.cards.w.WormsOfTheEarth.class)); + cards.add(new SetCardInfo("Amnesia", 20, Rarity.UNCOMMON, mage.cards.a.Amnesia.class)); + cards.add(new SetCardInfo("Angry Mob", 1, Rarity.UNCOMMON, mage.cards.a.AngryMob.class)); + cards.add(new SetCardInfo("Apprentice Wizard", 21, Rarity.RARE, mage.cards.a.ApprenticeWizard.class)); + cards.add(new SetCardInfo("Ashes to Ashes", 39, Rarity.COMMON, mage.cards.a.AshesToAshes.class)); + cards.add(new SetCardInfo("Ball Lightning", 57, Rarity.RARE, mage.cards.b.BallLightning.class)); + cards.add(new SetCardInfo("Banshee", 40, Rarity.RARE, mage.cards.b.Banshee.class)); + cards.add(new SetCardInfo("Barl's Cage", 96, Rarity.RARE, mage.cards.b.BarlsCage.class)); + cards.add(new SetCardInfo("Blood Moon", 58, Rarity.RARE, mage.cards.b.BloodMoon.class)); + cards.add(new SetCardInfo("Blood of the Martyr", 2, Rarity.RARE, mage.cards.b.BloodOfTheMartyr.class)); + cards.add(new SetCardInfo("Bog Imp", 41, Rarity.COMMON, mage.cards.b.BogImp.class)); + cards.add(new SetCardInfo("Bog Rats", 42, Rarity.COMMON, mage.cards.b.BogRats.class)); + cards.add(new SetCardInfo("Bone Flute", 97, Rarity.UNCOMMON, mage.cards.b.BoneFlute.class)); + cards.add(new SetCardInfo("Book of Rass", 98, Rarity.UNCOMMON, mage.cards.b.BookOfRass.class)); + cards.add(new SetCardInfo("Brainwash", 3, Rarity.COMMON, mage.cards.b.Brainwash.class)); + cards.add(new SetCardInfo("Brothers of Fire", 59, Rarity.UNCOMMON, mage.cards.b.BrothersOfFire.class)); + cards.add(new SetCardInfo("Carnivorous Plant", 75, Rarity.COMMON, mage.cards.c.CarnivorousPlant.class)); + cards.add(new SetCardInfo("Cave People", 60, Rarity.UNCOMMON, mage.cards.c.CavePeople.class)); + cards.add(new SetCardInfo("City of Shadows", 116, Rarity.RARE, mage.cards.c.CityOfShadows.class)); + cards.add(new SetCardInfo("Cleansing", 4, Rarity.RARE, mage.cards.c.Cleansing.class)); + cards.add(new SetCardInfo("Coal Golem", 99, Rarity.UNCOMMON, mage.cards.c.CoalGolem.class)); + cards.add(new SetCardInfo("Curse Artifact", 43, Rarity.RARE, mage.cards.c.CurseArtifact.class)); + cards.add(new SetCardInfo("Dance of Many", 22, Rarity.RARE, mage.cards.d.DanceOfMany.class)); + cards.add(new SetCardInfo("Dark Heart of the Wood", 95, Rarity.COMMON, mage.cards.d.DarkHeartOfTheWood.class)); + cards.add(new SetCardInfo("Dark Sphere", 100, Rarity.RARE, mage.cards.d.DarkSphere.class)); + cards.add(new SetCardInfo("Deep Water", 23, Rarity.COMMON, mage.cards.d.DeepWater.class)); + cards.add(new SetCardInfo("Diabolic Machine", 101, Rarity.UNCOMMON, mage.cards.d.DiabolicMachine.class)); + cards.add(new SetCardInfo("Drowned", 24, Rarity.COMMON, mage.cards.d.Drowned.class)); + cards.add(new SetCardInfo("Dust to Dust", 5, Rarity.COMMON, mage.cards.d.DustToDust.class)); + cards.add(new SetCardInfo("Eater of the Dead", 44, Rarity.UNCOMMON, mage.cards.e.EaterOfTheDead.class)); + cards.add(new SetCardInfo("Electric Eel", 25, Rarity.UNCOMMON, mage.cards.e.ElectricEel.class)); + cards.add(new SetCardInfo("Elves of Deep Shadow", 76, Rarity.UNCOMMON, mage.cards.e.ElvesOfDeepShadow.class)); + cards.add(new SetCardInfo("Erosion", 26, Rarity.COMMON, mage.cards.e.Erosion.class)); + cards.add(new SetCardInfo("Eternal Flame", 61, Rarity.RARE, mage.cards.e.EternalFlame.class)); + cards.add(new SetCardInfo("Exorcist", 6, Rarity.RARE, mage.cards.e.Exorcist.class)); + cards.add(new SetCardInfo("Fasting", 7, Rarity.RARE, mage.cards.f.Fasting.class)); + cards.add(new SetCardInfo("Fellwar Stone", 102, Rarity.UNCOMMON, mage.cards.f.FellwarStone.class)); + cards.add(new SetCardInfo("Festival", 8, Rarity.COMMON, mage.cards.f.Festival.class)); + cards.add(new SetCardInfo("Fire and Brimstone", 9, Rarity.RARE, mage.cards.f.FireAndBrimstone.class)); + cards.add(new SetCardInfo("Fire Drake", 62, Rarity.UNCOMMON, mage.cards.f.FireDrake.class)); + cards.add(new SetCardInfo("Fissure", 63, Rarity.COMMON, mage.cards.f.Fissure.class)); + cards.add(new SetCardInfo("Flood", 27, Rarity.UNCOMMON, mage.cards.f.Flood.class)); + cards.add(new SetCardInfo("Fountain of Youth", 103, Rarity.UNCOMMON, mage.cards.f.FountainOfYouth.class)); + cards.add(new SetCardInfo("Gaea's Touch", 77, Rarity.COMMON, mage.cards.g.GaeasTouch.class)); + cards.add(new SetCardInfo("Ghost Ship", 28, Rarity.COMMON, mage.cards.g.GhostShip.class)); + cards.add(new SetCardInfo("Giant Shark", 29, Rarity.COMMON, mage.cards.g.GiantShark.class)); + cards.add(new SetCardInfo("Goblin Caves", 64, Rarity.COMMON, mage.cards.g.GoblinCaves.class)); + cards.add(new SetCardInfo("Goblin Digging Team", 65, Rarity.COMMON, mage.cards.g.GoblinDiggingTeam.class)); + cards.add(new SetCardInfo("Goblin Hero", 66, Rarity.COMMON, mage.cards.g.GoblinHero.class)); + cards.add(new SetCardInfo("Goblin Rock Sled", 67, Rarity.COMMON, mage.cards.g.GoblinRockSled.class)); + cards.add(new SetCardInfo("Goblin Shrine", 68, Rarity.COMMON, mage.cards.g.GoblinShrine.class)); + cards.add(new SetCardInfo("Goblin Wizard", 69, Rarity.RARE, mage.cards.g.GoblinWizard.class)); + cards.add(new SetCardInfo("Goblins of the Flarg", 70, Rarity.COMMON, mage.cards.g.GoblinsOfTheFlarg.class)); + cards.add(new SetCardInfo("Grave Robbers", 46, Rarity.RARE, mage.cards.g.GraveRobbers.class)); + cards.add(new SetCardInfo("Hidden Path", 78, Rarity.RARE, mage.cards.h.HiddenPath.class)); + cards.add(new SetCardInfo("Holy Light", 10, Rarity.COMMON, mage.cards.h.HolyLight.class)); + cards.add(new SetCardInfo("Inferno", 71, Rarity.RARE, mage.cards.i.Inferno.class)); + cards.add(new SetCardInfo("Inquisition", 47, Rarity.COMMON, mage.cards.i.Inquisition.class)); + cards.add(new SetCardInfo("Knights of Thorn", 11, Rarity.RARE, mage.cards.k.KnightsOfThorn.class)); + cards.add(new SetCardInfo("Land Leeches", 79, Rarity.COMMON, mage.cards.l.LandLeeches.class)); + cards.add(new SetCardInfo("Leviathan", 30, Rarity.RARE, mage.cards.l.Leviathan.class)); + cards.add(new SetCardInfo("Living Armor", 104, Rarity.UNCOMMON, mage.cards.l.LivingArmor.class)); + cards.add(new SetCardInfo("Lurker", 80, Rarity.RARE, mage.cards.l.Lurker.class)); + cards.add(new SetCardInfo("Mana Clash", 72, Rarity.RARE, mage.cards.m.ManaClash.class)); + cards.add(new SetCardInfo("Mana Vortex", 31, Rarity.RARE, mage.cards.m.ManaVortex.class)); + cards.add(new SetCardInfo("Marsh Gas", 48, Rarity.COMMON, mage.cards.m.MarshGas.class)); + cards.add(new SetCardInfo("Marsh Goblins", 93, Rarity.COMMON, mage.cards.m.MarshGoblins.class)); + cards.add(new SetCardInfo("Marsh Viper", 81, Rarity.COMMON, mage.cards.m.MarshViper.class)); + cards.add(new SetCardInfo("Martyr's Cry", 12, Rarity.RARE, mage.cards.m.MartyrsCry.class)); + cards.add(new SetCardInfo("Maze of Ith", 117, Rarity.UNCOMMON, mage.cards.m.MazeOfIth.class)); + cards.add(new SetCardInfo("Merfolk Assassin", 32, Rarity.UNCOMMON, mage.cards.m.MerfolkAssassin.class)); + cards.add(new SetCardInfo("Mind Bomb", 33, Rarity.RARE, mage.cards.m.MindBomb.class)); + cards.add(new SetCardInfo("Miracle Worker", 13, Rarity.COMMON, mage.cards.m.MiracleWorker.class)); + cards.add(new SetCardInfo("Morale", 14, Rarity.COMMON, mage.cards.m.Morale.class)); + cards.add(new SetCardInfo("Murk Dwellers", 49, Rarity.COMMON, mage.cards.m.MurkDwellers.class)); + cards.add(new SetCardInfo("Nameless Race", 50, Rarity.RARE, mage.cards.n.NamelessRace.class)); + cards.add(new SetCardInfo("Necropolis", 105, Rarity.RARE, mage.cards.n.Necropolis.class)); + cards.add(new SetCardInfo("Niall Silvain", 82, Rarity.RARE, mage.cards.n.NiallSilvain.class)); + cards.add(new SetCardInfo("Orc General", 73, Rarity.UNCOMMON, mage.cards.o.OrcGeneral.class)); + cards.add(new SetCardInfo("People of the Woods", 83, Rarity.UNCOMMON, mage.cards.p.PeopleOfTheWoods.class)); + cards.add(new SetCardInfo("Pikemen", 15, Rarity.COMMON, mage.cards.p.Pikemen.class)); + cards.add(new SetCardInfo("Preacher", 16, Rarity.RARE, mage.cards.p.Preacher.class)); + cards.add(new SetCardInfo("Psychic Allergy", 34, Rarity.RARE, mage.cards.p.PsychicAllergy.class)); + cards.add(new SetCardInfo("Rag Man", 51, Rarity.RARE, mage.cards.r.RagMan.class)); + cards.add(new SetCardInfo("Riptide", 35, Rarity.COMMON, mage.cards.r.Riptide.class)); + cards.add(new SetCardInfo("Runesword", 107, Rarity.RARE, mage.cards.r.Runesword.class)); + cards.add(new SetCardInfo("Safe Haven", 118, Rarity.RARE, mage.cards.s.SafeHaven.class)); + cards.add(new SetCardInfo("Savaen Elves", 84, Rarity.COMMON, mage.cards.s.SavaenElves.class)); + cards.add(new SetCardInfo("Scarecrow", 108, Rarity.RARE, mage.cards.s.Scarecrow.class)); + cards.add(new SetCardInfo("Scarwood Bandits", 85, Rarity.RARE, mage.cards.s.ScarwoodBandits.class)); + cards.add(new SetCardInfo("Scarwood Goblins", 94, Rarity.COMMON, mage.cards.s.ScarwoodGoblins.class)); + cards.add(new SetCardInfo("Scarwood Hag", 86, Rarity.UNCOMMON, mage.cards.s.ScarwoodHag.class)); + cards.add(new SetCardInfo("Scavenger Folk", 87, Rarity.COMMON, mage.cards.s.ScavengerFolk.class)); + cards.add(new SetCardInfo("Season of the Witch", 52, Rarity.RARE, mage.cards.s.SeasonOfTheWitch.class)); + cards.add(new SetCardInfo("Sisters of the Flame", 74, Rarity.UNCOMMON, mage.cards.s.SistersOfTheFlame.class)); + cards.add(new SetCardInfo("Skull of Orm", 109, Rarity.UNCOMMON, mage.cards.s.SkullOfOrm.class)); + cards.add(new SetCardInfo("Sorrow's Path", 119, Rarity.RARE, mage.cards.s.SorrowsPath.class)); + cards.add(new SetCardInfo("Spitting Slug", 88, Rarity.RARE, mage.cards.s.SpittingSlug.class)); + cards.add(new SetCardInfo("Squire", 17, Rarity.COMMON, mage.cards.s.Squire.class)); + cards.add(new SetCardInfo("Standing Stones", 110, Rarity.UNCOMMON, mage.cards.s.StandingStones.class)); + cards.add(new SetCardInfo("Stone Calendar", 111, Rarity.RARE, mage.cards.s.StoneCalendar.class)); + cards.add(new SetCardInfo("Sunken City", 36, Rarity.COMMON, mage.cards.s.SunkenCity.class)); + cards.add(new SetCardInfo("Tangle Kelp", 37, Rarity.RARE, mage.cards.t.TangleKelp.class)); + cards.add(new SetCardInfo("The Fallen", 53, Rarity.RARE, mage.cards.t.TheFallen.class)); + cards.add(new SetCardInfo("Tivadar's Crusade", 18, Rarity.UNCOMMON, mage.cards.t.TivadarsCrusade.class)); + cards.add(new SetCardInfo("Tormod's Crypt", 112, Rarity.UNCOMMON, mage.cards.t.TormodsCrypt.class)); + cards.add(new SetCardInfo("Tower of Coireall", 113, Rarity.RARE, mage.cards.t.TowerOfCoireall.class)); + cards.add(new SetCardInfo("Tracker", 89, Rarity.RARE, mage.cards.t.Tracker.class)); + cards.add(new SetCardInfo("Uncle Istvan", 54, Rarity.UNCOMMON, mage.cards.u.UncleIstvan.class)); + cards.add(new SetCardInfo("Venom", 90, Rarity.COMMON, mage.cards.v.Venom.class)); + cards.add(new SetCardInfo("Wand of Ith", 114, Rarity.RARE, mage.cards.w.WandOfIth.class)); + cards.add(new SetCardInfo("War Barge", 115, Rarity.RARE, mage.cards.w.WarBarge.class)); + cards.add(new SetCardInfo("Water Wurm", 38, Rarity.COMMON, mage.cards.w.WaterWurm.class)); + cards.add(new SetCardInfo("Witch Hunter", 19, Rarity.RARE, mage.cards.w.WitchHunter.class)); + cards.add(new SetCardInfo("Word of Binding", 55, Rarity.COMMON, mage.cards.w.WordOfBinding.class)); + cards.add(new SetCardInfo("Worms of the Earth", 56, Rarity.RARE, mage.cards.w.WormsOfTheEarth.class)); + cards.add(new SetCardInfo("Wormwood Treefolk", 92, Rarity.RARE, mage.cards.w.WormwoodTreefolk.class)); } } From 6207f65b0da7bc906b6137e18bd2ab74109f01ca Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Thu, 10 May 2018 11:20:23 +0400 Subject: [PATCH 127/158] Fixed card numbers in FEM - Fallen Empires (#4628) --- Mage.Sets/src/mage/sets/FallenEmpires.java | 374 ++++++++++----------- 1 file changed, 187 insertions(+), 187 deletions(-) diff --git a/Mage.Sets/src/mage/sets/FallenEmpires.java b/Mage.Sets/src/mage/sets/FallenEmpires.java index a6a5870493a..cd08318f457 100644 --- a/Mage.Sets/src/mage/sets/FallenEmpires.java +++ b/Mage.Sets/src/mage/sets/FallenEmpires.java @@ -83,192 +83,192 @@ public class FallenEmpires extends ExpansionSet { this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; - cards.add(new SetCardInfo("Aeolipile", 166, Rarity.RARE, mage.cards.a.Aeolipile.class)); - cards.add(new SetCardInfo("Armor Thrull", 1, Rarity.COMMON, ArmorThrull.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Armor Thrull", 2, Rarity.COMMON, ArmorThrull.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Armor Thrull", 3, Rarity.COMMON, ArmorThrull.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Armor Thrull", 4, Rarity.COMMON, ArmorThrull.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Balm of Restoration", 167, Rarity.RARE, mage.cards.b.BalmOfRestoration.class)); - cards.add(new SetCardInfo("Basal Thrull", 5, Rarity.COMMON, BasalThrull.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Basal Thrull", 6, Rarity.COMMON, BasalThrull.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Basal Thrull", 7, Rarity.COMMON, BasalThrull.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Basal Thrull", 8, Rarity.COMMON, BasalThrull.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Bottomless Vault", 177, Rarity.RARE, mage.cards.b.BottomlessVault.class)); - cards.add(new SetCardInfo("Brassclaw Orcs", 100, Rarity.COMMON, BrassclawOrcs.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Brassclaw Orcs", 101, Rarity.COMMON, BrassclawOrcs.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Brassclaw Orcs", 102, Rarity.COMMON, BrassclawOrcs.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Brassclaw Orcs", 103, Rarity.COMMON, BrassclawOrcs.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Breeding Pit", 9, Rarity.UNCOMMON, mage.cards.b.BreedingPit.class)); - cards.add(new SetCardInfo("Combat Medic", 133, Rarity.COMMON, CombatMedic.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Combat Medic", 134, Rarity.COMMON, CombatMedic.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Combat Medic", 135, Rarity.COMMON, CombatMedic.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Combat Medic", 136, Rarity.COMMON, CombatMedic.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Conch Horn", 168, Rarity.RARE, mage.cards.c.ConchHorn.class)); - cards.add(new SetCardInfo("Deep Spawn", 34, Rarity.UNCOMMON, mage.cards.d.DeepSpawn.class)); - cards.add(new SetCardInfo("Delif's Cone", 169, Rarity.COMMON, mage.cards.d.DelifsCone.class)); - cards.add(new SetCardInfo("Delif's Cube", 170, Rarity.RARE, mage.cards.d.DelifsCube.class)); - cards.add(new SetCardInfo("Derelor", 10, Rarity.RARE, mage.cards.d.Derelor.class)); - cards.add(new SetCardInfo("Draconian Cylix", 171, Rarity.RARE, mage.cards.d.DraconianCylix.class)); - cards.add(new SetCardInfo("Dwarven Armorer", 104, Rarity.RARE, mage.cards.d.DwarvenArmorer.class)); - cards.add(new SetCardInfo("Dwarven Catapult", 105, Rarity.UNCOMMON, mage.cards.d.DwarvenCatapult.class)); - cards.add(new SetCardInfo("Dwarven Hold", 178, Rarity.RARE, mage.cards.d.DwarvenHold.class)); - cards.add(new SetCardInfo("Dwarven Lieutenant", 106, Rarity.UNCOMMON, mage.cards.d.DwarvenLieutenant.class)); - cards.add(new SetCardInfo("Dwarven Ruins", 179, Rarity.UNCOMMON, mage.cards.d.DwarvenRuins.class)); - cards.add(new SetCardInfo("Dwarven Soldier", 107, Rarity.COMMON, DwarvenSoldier.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Dwarven Soldier", 108, Rarity.COMMON, DwarvenSoldier.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Dwarven Soldier", 109, Rarity.COMMON, DwarvenSoldier.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Ebon Praetor", 11, Rarity.RARE, mage.cards.e.EbonPraetor.class)); - cards.add(new SetCardInfo("Ebon Stronghold", 180, Rarity.UNCOMMON, mage.cards.e.EbonStronghold.class)); - cards.add(new SetCardInfo("Elven Fortress", 67, Rarity.COMMON, ElvenFortress.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Elven Fortress", 68, Rarity.COMMON, ElvenFortress.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Elven Fortress", 69, Rarity.COMMON, ElvenFortress.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Elven Fortress", 70, Rarity.COMMON, ElvenFortress.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Elven Lyre", 172, Rarity.RARE, mage.cards.e.ElvenLyre.class)); - cards.add(new SetCardInfo("Elvish Farmer", 71, Rarity.RARE, mage.cards.e.ElvishFarmer.class)); - cards.add(new SetCardInfo("Elvish Hunter", 72, Rarity.COMMON, ElvishHunter.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Elvish Hunter", 73, Rarity.COMMON, ElvishHunter.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Elvish Hunter", 74, Rarity.COMMON, ElvishHunter.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Elvish Scout", 75, Rarity.COMMON, ElvishScout.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Elvish Scout", 76, Rarity.COMMON, ElvishScout.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Elvish Scout", 77, Rarity.COMMON, ElvishScout.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Farrelite Priest", 137, Rarity.UNCOMMON, mage.cards.f.FarrelitePriest.class)); - cards.add(new SetCardInfo("Farrel's Mantle", 138, Rarity.UNCOMMON, mage.cards.f.FarrelsMantle.class)); - cards.add(new SetCardInfo("Farrel's Zealot", 139, Rarity.COMMON, FarrelsZealot.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Farrel's Zealot", 140, Rarity.COMMON, FarrelsZealot.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Farrel's Zealot", 141, Rarity.COMMON, FarrelsZealot.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Feral Thallid", 78, Rarity.UNCOMMON, mage.cards.f.FeralThallid.class)); - cards.add(new SetCardInfo("Fungal Bloom", 79, Rarity.RARE, mage.cards.f.FungalBloom.class)); - cards.add(new SetCardInfo("Goblin Chirurgeon", 110, Rarity.COMMON, GoblinChirurgeon.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Goblin Chirurgeon", 111, Rarity.COMMON, GoblinChirurgeon.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Goblin Chirurgeon", 112, Rarity.COMMON, GoblinChirurgeon.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Goblin Flotilla", 113, Rarity.RARE, mage.cards.g.GoblinFlotilla.class)); - cards.add(new SetCardInfo("Goblin Grenade", 114, Rarity.COMMON, GoblinGrenade.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Goblin Grenade", 115, Rarity.COMMON, GoblinGrenade.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Goblin Grenade", 116, Rarity.COMMON, GoblinGrenade.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Goblin Kites", 117, Rarity.UNCOMMON, mage.cards.g.GoblinKites.class)); - cards.add(new SetCardInfo("Goblin War Drums", 118, Rarity.COMMON, GoblinWarDrums.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Goblin War Drums", 119, Rarity.COMMON, GoblinWarDrums.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Goblin War Drums", 120, Rarity.COMMON, GoblinWarDrums.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Goblin War Drums", 121, Rarity.COMMON, GoblinWarDrums.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Goblin Warrens", 122, Rarity.RARE, mage.cards.g.GoblinWarrens.class)); - cards.add(new SetCardInfo("Hand of Justice", 142, Rarity.RARE, mage.cards.h.HandOfJustice.class)); - cards.add(new SetCardInfo("Havenwood Battleground", 181, Rarity.UNCOMMON, mage.cards.h.HavenwoodBattleground.class)); - cards.add(new SetCardInfo("Heroism", 143, Rarity.UNCOMMON, mage.cards.h.Heroism.class)); - cards.add(new SetCardInfo("High Tide", 35, Rarity.COMMON, HighTide.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("High Tide", 36, Rarity.COMMON, HighTide.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("High Tide", 37, Rarity.COMMON, HighTide.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Hollow Trees", 182, Rarity.RARE, mage.cards.h.HollowTrees.class)); - cards.add(new SetCardInfo("Homarid", 38, Rarity.COMMON, Homarid.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Homarid", 39, Rarity.COMMON, Homarid.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Homarid", 40, Rarity.COMMON, Homarid.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Homarid", 41, Rarity.COMMON, Homarid.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Homarid Shaman", 42, Rarity.RARE, mage.cards.h.HomaridShaman.class)); - cards.add(new SetCardInfo("Homarid Spawning Bed", 43, Rarity.UNCOMMON, mage.cards.h.HomaridSpawningBed.class)); - cards.add(new SetCardInfo("Homarid Warrior", 44, Rarity.COMMON, HomaridWarrior.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Homarid Warrior", 45, Rarity.COMMON, HomaridWarrior.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Homarid Warrior", 46, Rarity.COMMON, HomaridWarrior.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Hymn to Tourach", 12, Rarity.COMMON, HymnToTourach.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Hymn to Tourach", 13, Rarity.COMMON, HymnToTourach.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Hymn to Tourach", 14, Rarity.COMMON, HymnToTourach.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Hymn to Tourach", 15, Rarity.COMMON, HymnToTourach.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Icatian Infantry", 144, Rarity.COMMON, IcatianInfantry.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Icatian Infantry", 145, Rarity.COMMON, IcatianInfantry.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Icatian Infantry", 146, Rarity.COMMON, IcatianInfantry.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Icatian Infantry", 147, Rarity.COMMON, IcatianInfantry.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Icatian Javelineers", 148, Rarity.COMMON, IcatianJavelineers.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Icatian Javelineers", 149, Rarity.COMMON, IcatianJavelineers.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Icatian Javelineers", 150, Rarity.COMMON, IcatianJavelineers.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Icatian Lieutenant", 151, Rarity.RARE, mage.cards.i.IcatianLieutenant.class)); - cards.add(new SetCardInfo("Icatian Moneychanger", 152, Rarity.COMMON, IcatianMoneychanger.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Icatian Moneychanger", 153, Rarity.COMMON, IcatianMoneychanger.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Icatian Moneychanger", 154, Rarity.COMMON, IcatianMoneychanger.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Icatian Phalanx", 155, Rarity.UNCOMMON, mage.cards.i.IcatianPhalanx.class)); - cards.add(new SetCardInfo("Icatian Priest", 156, Rarity.UNCOMMON, mage.cards.i.IcatianPriest.class)); - cards.add(new SetCardInfo("Icatian Scout", 157, Rarity.COMMON, IcatianScout.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Icatian Scout", 158, Rarity.COMMON, IcatianScout.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Icatian Scout", 159, Rarity.COMMON, IcatianScout.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Icatian Scout", 160, Rarity.COMMON, IcatianScout.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Icatian Skirmishers", 161, Rarity.RARE, mage.cards.i.IcatianSkirmishers.class)); - cards.add(new SetCardInfo("Icatian Store", 183, Rarity.RARE, mage.cards.i.IcatianStore.class)); - cards.add(new SetCardInfo("Icatian Town", 162, Rarity.RARE, mage.cards.i.IcatianTown.class)); - cards.add(new SetCardInfo("Implements of Sacrifice", 173, Rarity.RARE, mage.cards.i.ImplementsOfSacrifice.class)); - cards.add(new SetCardInfo("Initiates of the Ebon Hand", 16, Rarity.COMMON, InitiatesOfTheEbonHand.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Initiates of the Ebon Hand", 17, Rarity.COMMON, InitiatesOfTheEbonHand.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Initiates of the Ebon Hand", 18, Rarity.COMMON, InitiatesOfTheEbonHand.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Merseine", 47, Rarity.COMMON, mage.cards.m.Merseine.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Merseine", 48, Rarity.COMMON, mage.cards.m.Merseine.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Merseine", 49, Rarity.COMMON, mage.cards.m.Merseine.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Merseine", 50, Rarity.COMMON, mage.cards.m.Merseine.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mindstab Thrull", 19, Rarity.COMMON, MindstabThrull.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mindstab Thrull", 20, Rarity.COMMON, MindstabThrull.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mindstab Thrull", 21, Rarity.COMMON, MindstabThrull.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Necrite", 22, Rarity.COMMON, Necrite.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Necrite", 23, Rarity.COMMON, Necrite.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Necrite", 24, Rarity.COMMON, Necrite.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Night Soil", 80, Rarity.COMMON, NightSoil.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Night Soil", 81, Rarity.COMMON, NightSoil.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Night Soil", 82, Rarity.COMMON, NightSoil.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Orcish Captain", 123, Rarity.UNCOMMON, mage.cards.o.OrcishCaptain.class)); - cards.add(new SetCardInfo("Orcish Spy", 124, Rarity.COMMON, OrcishSpy.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Orcish Spy", 125, Rarity.COMMON, OrcishSpy.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Orcish Spy", 126, Rarity.COMMON, OrcishSpy.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Orcish Veteran", 127, Rarity.COMMON, OrcishVeteran.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Orcish Veteran", 128, Rarity.COMMON, OrcishVeteran.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Orcish Veteran", 129, Rarity.COMMON, OrcishVeteran.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Orcish Veteran", 130, Rarity.COMMON, OrcishVeteran.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Order of Leitbur", 163, Rarity.COMMON, OrderOfLeitbur.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Order of Leitbur", 164, Rarity.COMMON, OrderOfLeitbur.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Order of Leitbur", 165, Rarity.COMMON, OrderOfLeitbur.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Order of the Ebon Hand", 25, Rarity.COMMON, OrderOfTheEbonHand.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Order of the Ebon Hand", 26, Rarity.COMMON, OrderOfTheEbonHand.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Order of the Ebon Hand", 27, Rarity.COMMON, OrderOfTheEbonHand.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Orgg", 131, Rarity.RARE, mage.cards.o.Orgg.class)); - cards.add(new SetCardInfo("Raiding Party", 132, Rarity.UNCOMMON, mage.cards.r.RaidingParty.class)); - cards.add(new SetCardInfo("Rainbow Vale", 184, Rarity.RARE, mage.cards.r.RainbowVale.class)); - cards.add(new SetCardInfo("Ring of Renewal", 174, Rarity.RARE, mage.cards.r.RingOfRenewal.class)); - cards.add(new SetCardInfo("River Merfolk", 51, Rarity.RARE, mage.cards.r.RiverMerfolk.class)); - cards.add(new SetCardInfo("Ruins of Trokair", 185, Rarity.UNCOMMON, mage.cards.r.RuinsOfTrokair.class)); - cards.add(new SetCardInfo("Sand Silos", 186, Rarity.RARE, mage.cards.s.SandSilos.class)); - cards.add(new SetCardInfo("Seasinger", 52, Rarity.UNCOMMON, mage.cards.s.Seasinger.class)); - cards.add(new SetCardInfo("Soul Exchange", 28, Rarity.UNCOMMON, mage.cards.s.SoulExchange.class)); - cards.add(new SetCardInfo("Spirit Shield", 175, Rarity.RARE, mage.cards.s.SpiritShield.class)); - cards.add(new SetCardInfo("Spore Cloud", 83, Rarity.COMMON, mage.cards.s.SporeCloud.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Spore Cloud", 84, Rarity.COMMON, mage.cards.s.SporeCloud.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Spore Cloud", 85, Rarity.COMMON, mage.cards.s.SporeCloud.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Spore Flower", 86, Rarity.UNCOMMON, mage.cards.s.SporeFlower.class)); - cards.add(new SetCardInfo("Svyelunite Priest", 53, Rarity.UNCOMMON, mage.cards.s.SvyelunitePriest.class)); - cards.add(new SetCardInfo("Svyelunite Temple", 187, Rarity.UNCOMMON, mage.cards.s.SvyeluniteTemple.class)); - cards.add(new SetCardInfo("Thallid", 87, Rarity.COMMON, mage.cards.t.Thallid.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Thallid", 88, Rarity.COMMON, mage.cards.t.Thallid.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Thallid", 89, Rarity.COMMON, mage.cards.t.Thallid.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Thallid", 90, Rarity.COMMON, mage.cards.t.Thallid.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Thallid Devourer", 91, Rarity.UNCOMMON, mage.cards.t.ThallidDevourer.class)); - cards.add(new SetCardInfo("Thelonite Druid", 92, Rarity.UNCOMMON, mage.cards.t.TheloniteDruid.class)); - cards.add(new SetCardInfo("Thelonite Monk", 93, Rarity.RARE, mage.cards.t.TheloniteMonk.class)); - cards.add(new SetCardInfo("Thelon's Chant", 94, Rarity.UNCOMMON, mage.cards.t.ThelonsChant.class)); - cards.add(new SetCardInfo("Thelon's Curse", 95, Rarity.RARE, mage.cards.t.ThelonsCurse.class)); - cards.add(new SetCardInfo("Thorn Thallid", 96, Rarity.COMMON, ThornThallid.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Thorn Thallid", 97, Rarity.COMMON, ThornThallid.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Thorn Thallid", 98, Rarity.COMMON, ThornThallid.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Thorn Thallid", 99, Rarity.COMMON, ThornThallid.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Thrull Champion", 29, Rarity.RARE, mage.cards.t.ThrullChampion.class)); - cards.add(new SetCardInfo("Thrull Retainer", 30, Rarity.UNCOMMON, mage.cards.t.ThrullRetainer.class)); - cards.add(new SetCardInfo("Thrull Wizard", 31, Rarity.UNCOMMON, mage.cards.t.ThrullWizard.class)); - cards.add(new SetCardInfo("Tidal Flats", 54, Rarity.COMMON, mage.cards.t.TidalFlats.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Tidal Flats", 55, Rarity.COMMON, mage.cards.t.TidalFlats.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Tidal Flats", 56, Rarity.COMMON, mage.cards.t.TidalFlats.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Tidal Influence", 57, Rarity.UNCOMMON, mage.cards.t.TidalInfluence.class)); - cards.add(new SetCardInfo("Tourach's Chant", 32, Rarity.UNCOMMON, mage.cards.t.TourachsChant.class)); - cards.add(new SetCardInfo("Tourach's Gate", 33, Rarity.RARE, mage.cards.t.TourachsGate.class)); - cards.add(new SetCardInfo("Vodalian Knights", 58, Rarity.RARE, mage.cards.v.VodalianKnights.class)); - cards.add(new SetCardInfo("Vodalian Mage", 59, Rarity.COMMON, VodalianMage.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Vodalian Mage", 60, Rarity.COMMON, VodalianMage.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Vodalian Mage", 61, Rarity.COMMON, VodalianMage.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Vodalian Soldiers", 62, Rarity.COMMON, VodalianSoldiers.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Vodalian Soldiers", 63, Rarity.COMMON, VodalianSoldiers.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Vodalian Soldiers", 64, Rarity.COMMON, VodalianSoldiers.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Vodalian Soldiers", 65, Rarity.COMMON, VodalianSoldiers.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Vodalian War Machine", 66, Rarity.RARE, mage.cards.v.VodalianWarMachine.class)); - cards.add(new SetCardInfo("Zelyon Sword", 176, Rarity.RARE, mage.cards.z.ZelyonSword.class)); + cards.add(new SetCardInfo("Aeolipile", 81, Rarity.RARE, mage.cards.a.Aeolipile.class)); + cards.add(new SetCardInfo("Armor Thrull", "33a", Rarity.COMMON, ArmorThrull.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Armor Thrull", "33b", Rarity.COMMON, ArmorThrull.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Armor Thrull", "33c", Rarity.COMMON, ArmorThrull.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Armor Thrull", "33d", Rarity.COMMON, ArmorThrull.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Balm of Restoration", 82, Rarity.RARE, mage.cards.b.BalmOfRestoration.class)); + cards.add(new SetCardInfo("Basal Thrull", "34a", Rarity.COMMON, BasalThrull.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Basal Thrull", "34b", Rarity.COMMON, BasalThrull.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Basal Thrull", "34c", Rarity.COMMON, BasalThrull.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Basal Thrull", "34d", Rarity.COMMON, BasalThrull.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Bottomless Vault", 92, Rarity.RARE, mage.cards.b.BottomlessVault.class)); + cards.add(new SetCardInfo("Brassclaw Orcs", "49a", Rarity.COMMON, BrassclawOrcs.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Brassclaw Orcs", "49b", Rarity.COMMON, BrassclawOrcs.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Brassclaw Orcs", "49c", Rarity.COMMON, BrassclawOrcs.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Brassclaw Orcs", "49d", Rarity.COMMON, BrassclawOrcs.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Breeding Pit", 35, Rarity.UNCOMMON, mage.cards.b.BreedingPit.class)); + cards.add(new SetCardInfo("Combat Medic", "1a", Rarity.COMMON, CombatMedic.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Combat Medic", "1b", Rarity.COMMON, CombatMedic.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Combat Medic", "1c", Rarity.COMMON, CombatMedic.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Combat Medic", "1d", Rarity.COMMON, CombatMedic.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Conch Horn", 83, Rarity.RARE, mage.cards.c.ConchHorn.class)); + cards.add(new SetCardInfo("Deep Spawn", 17, Rarity.UNCOMMON, mage.cards.d.DeepSpawn.class)); + cards.add(new SetCardInfo("Delif's Cone", 84, Rarity.COMMON, mage.cards.d.DelifsCone.class)); + cards.add(new SetCardInfo("Delif's Cube", 85, Rarity.RARE, mage.cards.d.DelifsCube.class)); + cards.add(new SetCardInfo("Derelor", 36, Rarity.RARE, mage.cards.d.Derelor.class)); + cards.add(new SetCardInfo("Draconian Cylix", 86, Rarity.RARE, mage.cards.d.DraconianCylix.class)); + cards.add(new SetCardInfo("Dwarven Armorer", 50, Rarity.RARE, mage.cards.d.DwarvenArmorer.class)); + cards.add(new SetCardInfo("Dwarven Catapult", 51, Rarity.UNCOMMON, mage.cards.d.DwarvenCatapult.class)); + cards.add(new SetCardInfo("Dwarven Hold", 93, Rarity.RARE, mage.cards.d.DwarvenHold.class)); + cards.add(new SetCardInfo("Dwarven Lieutenant", 52, Rarity.UNCOMMON, mage.cards.d.DwarvenLieutenant.class)); + cards.add(new SetCardInfo("Dwarven Ruins", 94, Rarity.UNCOMMON, mage.cards.d.DwarvenRuins.class)); + cards.add(new SetCardInfo("Dwarven Soldier", "53a", Rarity.COMMON, DwarvenSoldier.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Dwarven Soldier", "53b", Rarity.COMMON, DwarvenSoldier.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Dwarven Soldier", "53c", Rarity.COMMON, DwarvenSoldier.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Ebon Praetor", 37, Rarity.RARE, mage.cards.e.EbonPraetor.class)); + cards.add(new SetCardInfo("Ebon Stronghold", 95, Rarity.UNCOMMON, mage.cards.e.EbonStronghold.class)); + cards.add(new SetCardInfo("Elven Fortress", "65a", Rarity.COMMON, ElvenFortress.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Elven Fortress", "65b", Rarity.COMMON, ElvenFortress.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Elven Fortress", "65c", Rarity.COMMON, ElvenFortress.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Elven Fortress", "65d", Rarity.COMMON, ElvenFortress.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Elven Lyre", 87, Rarity.RARE, mage.cards.e.ElvenLyre.class)); + cards.add(new SetCardInfo("Elvish Farmer", 66, Rarity.RARE, mage.cards.e.ElvishFarmer.class)); + cards.add(new SetCardInfo("Elvish Hunter", "67a", Rarity.COMMON, ElvishHunter.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Elvish Hunter", "67b", Rarity.COMMON, ElvishHunter.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Elvish Hunter", "67c", Rarity.COMMON, ElvishHunter.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Elvish Scout", "68a", Rarity.COMMON, ElvishScout.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Elvish Scout", "68b", Rarity.COMMON, ElvishScout.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Elvish Scout", "68c", Rarity.COMMON, ElvishScout.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Farrel's Mantle", 2, Rarity.UNCOMMON, mage.cards.f.FarrelsMantle.class)); + cards.add(new SetCardInfo("Farrel's Zealot", "3a", Rarity.COMMON, FarrelsZealot.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Farrel's Zealot", "3b", Rarity.COMMON, FarrelsZealot.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Farrel's Zealot", "3c", Rarity.COMMON, FarrelsZealot.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Farrelite Priest", 4, Rarity.UNCOMMON, mage.cards.f.FarrelitePriest.class)); + cards.add(new SetCardInfo("Feral Thallid", 69, Rarity.UNCOMMON, mage.cards.f.FeralThallid.class)); + cards.add(new SetCardInfo("Fungal Bloom", 70, Rarity.RARE, mage.cards.f.FungalBloom.class)); + cards.add(new SetCardInfo("Goblin Chirurgeon", "54a", Rarity.COMMON, GoblinChirurgeon.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Goblin Chirurgeon", "54b", Rarity.COMMON, GoblinChirurgeon.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Goblin Chirurgeon", "54c", Rarity.COMMON, GoblinChirurgeon.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Goblin Flotilla", 55, Rarity.RARE, mage.cards.g.GoblinFlotilla.class)); + cards.add(new SetCardInfo("Goblin Grenade", "56a", Rarity.COMMON, GoblinGrenade.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Goblin Grenade", "56b", Rarity.COMMON, GoblinGrenade.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Goblin Grenade", "56c", Rarity.COMMON, GoblinGrenade.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Goblin Kites", 57, Rarity.UNCOMMON, mage.cards.g.GoblinKites.class)); + cards.add(new SetCardInfo("Goblin War Drums", "58a", Rarity.COMMON, GoblinWarDrums.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Goblin War Drums", "58b", Rarity.COMMON, GoblinWarDrums.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Goblin War Drums", "58c", Rarity.COMMON, GoblinWarDrums.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Goblin War Drums", "58d", Rarity.COMMON, GoblinWarDrums.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Goblin Warrens", 59, Rarity.RARE, mage.cards.g.GoblinWarrens.class)); + cards.add(new SetCardInfo("Hand of Justice", 5, Rarity.RARE, mage.cards.h.HandOfJustice.class)); + cards.add(new SetCardInfo("Havenwood Battleground", 96, Rarity.UNCOMMON, mage.cards.h.HavenwoodBattleground.class)); + cards.add(new SetCardInfo("Heroism", 6, Rarity.UNCOMMON, mage.cards.h.Heroism.class)); + cards.add(new SetCardInfo("High Tide", "18a", Rarity.COMMON, HighTide.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("High Tide", "18b", Rarity.COMMON, HighTide.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("High Tide", "18c", Rarity.COMMON, HighTide.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Hollow Trees", 97, Rarity.RARE, mage.cards.h.HollowTrees.class)); + cards.add(new SetCardInfo("Homarid Shaman", 20, Rarity.RARE, mage.cards.h.HomaridShaman.class)); + cards.add(new SetCardInfo("Homarid Spawning Bed", 21, Rarity.UNCOMMON, mage.cards.h.HomaridSpawningBed.class)); + cards.add(new SetCardInfo("Homarid Warrior", "22a", Rarity.COMMON, HomaridWarrior.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Homarid Warrior", "22b", Rarity.COMMON, HomaridWarrior.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Homarid Warrior", "22c", Rarity.COMMON, HomaridWarrior.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Homarid", "19a", Rarity.COMMON, Homarid.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Homarid", "19b", Rarity.COMMON, Homarid.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Homarid", "19c", Rarity.COMMON, Homarid.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Homarid", "19d", Rarity.COMMON, Homarid.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Hymn to Tourach", "38a", Rarity.COMMON, HymnToTourach.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Hymn to Tourach", "38b", Rarity.COMMON, HymnToTourach.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Hymn to Tourach", "38c", Rarity.COMMON, HymnToTourach.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Hymn to Tourach", "38d", Rarity.COMMON, HymnToTourach.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Icatian Infantry", "7a", Rarity.COMMON, IcatianInfantry.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Icatian Infantry", "7b", Rarity.COMMON, IcatianInfantry.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Icatian Infantry", "7c", Rarity.COMMON, IcatianInfantry.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Icatian Infantry", "7d", Rarity.COMMON, IcatianInfantry.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Icatian Javelineers", "8a", Rarity.COMMON, IcatianJavelineers.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Icatian Javelineers", "8b", Rarity.COMMON, IcatianJavelineers.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Icatian Javelineers", "8c", Rarity.COMMON, IcatianJavelineers.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Icatian Lieutenant", 9, Rarity.RARE, mage.cards.i.IcatianLieutenant.class)); + cards.add(new SetCardInfo("Icatian Moneychanger", "10a", Rarity.COMMON, IcatianMoneychanger.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Icatian Moneychanger", "10b", Rarity.COMMON, IcatianMoneychanger.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Icatian Moneychanger", "10c", Rarity.COMMON, IcatianMoneychanger.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Icatian Phalanx", 11, Rarity.UNCOMMON, mage.cards.i.IcatianPhalanx.class)); + cards.add(new SetCardInfo("Icatian Priest", 12, Rarity.UNCOMMON, mage.cards.i.IcatianPriest.class)); + cards.add(new SetCardInfo("Icatian Scout", "13a", Rarity.COMMON, IcatianScout.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Icatian Scout", "13b", Rarity.COMMON, IcatianScout.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Icatian Scout", "13c", Rarity.COMMON, IcatianScout.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Icatian Scout", "13d", Rarity.COMMON, IcatianScout.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Icatian Skirmishers", 14, Rarity.RARE, mage.cards.i.IcatianSkirmishers.class)); + cards.add(new SetCardInfo("Icatian Store", 98, Rarity.RARE, mage.cards.i.IcatianStore.class)); + cards.add(new SetCardInfo("Icatian Town", 15, Rarity.RARE, mage.cards.i.IcatianTown.class)); + cards.add(new SetCardInfo("Implements of Sacrifice", 88, Rarity.RARE, mage.cards.i.ImplementsOfSacrifice.class)); + cards.add(new SetCardInfo("Initiates of the Ebon Hand", "39a", Rarity.COMMON, InitiatesOfTheEbonHand.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Initiates of the Ebon Hand", "39b", Rarity.COMMON, InitiatesOfTheEbonHand.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Initiates of the Ebon Hand", "39c", Rarity.COMMON, InitiatesOfTheEbonHand.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Merseine", "23a", Rarity.COMMON, mage.cards.m.Merseine.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Merseine", "23b", Rarity.COMMON, mage.cards.m.Merseine.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Merseine", "23c", Rarity.COMMON, mage.cards.m.Merseine.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Merseine", "23d", Rarity.COMMON, mage.cards.m.Merseine.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mindstab Thrull", "40a", Rarity.COMMON, MindstabThrull.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mindstab Thrull", "40b", Rarity.COMMON, MindstabThrull.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mindstab Thrull", "40c", Rarity.COMMON, MindstabThrull.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Necrite", "41a", Rarity.COMMON, Necrite.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Necrite", "41b", Rarity.COMMON, Necrite.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Necrite", "41c", Rarity.COMMON, Necrite.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Night Soil", "71a", Rarity.COMMON, NightSoil.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Night Soil", "71b", Rarity.COMMON, NightSoil.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Night Soil", "71c", Rarity.COMMON, NightSoil.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Orcish Captain", 60, Rarity.UNCOMMON, mage.cards.o.OrcishCaptain.class)); + cards.add(new SetCardInfo("Orcish Spy", "61a", Rarity.COMMON, OrcishSpy.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Orcish Spy", "61b", Rarity.COMMON, OrcishSpy.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Orcish Spy", "61c", Rarity.COMMON, OrcishSpy.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Orcish Veteran", "62a", Rarity.COMMON, OrcishVeteran.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Orcish Veteran", "62b", Rarity.COMMON, OrcishVeteran.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Orcish Veteran", "62c", Rarity.COMMON, OrcishVeteran.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Orcish Veteran", "62d", Rarity.COMMON, OrcishVeteran.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Order of Leitbur", "16a", Rarity.COMMON, OrderOfLeitbur.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Order of Leitbur", "16b", Rarity.COMMON, OrderOfLeitbur.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Order of Leitbur", "16c", Rarity.COMMON, OrderOfLeitbur.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Order of the Ebon Hand", "42a", Rarity.COMMON, OrderOfTheEbonHand.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Order of the Ebon Hand", "42b", Rarity.COMMON, OrderOfTheEbonHand.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Order of the Ebon Hand", "42c", Rarity.COMMON, OrderOfTheEbonHand.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Orgg", 63, Rarity.RARE, mage.cards.o.Orgg.class)); + cards.add(new SetCardInfo("Raiding Party", 64, Rarity.UNCOMMON, mage.cards.r.RaidingParty.class)); + cards.add(new SetCardInfo("Rainbow Vale", 99, Rarity.RARE, mage.cards.r.RainbowVale.class)); + cards.add(new SetCardInfo("Ring of Renewal", 89, Rarity.RARE, mage.cards.r.RingOfRenewal.class)); + cards.add(new SetCardInfo("River Merfolk", 24, Rarity.RARE, mage.cards.r.RiverMerfolk.class)); + cards.add(new SetCardInfo("Ruins of Trokair", 100, Rarity.UNCOMMON, mage.cards.r.RuinsOfTrokair.class)); + cards.add(new SetCardInfo("Sand Silos", 101, Rarity.RARE, mage.cards.s.SandSilos.class)); + cards.add(new SetCardInfo("Seasinger", 25, Rarity.UNCOMMON, mage.cards.s.Seasinger.class)); + cards.add(new SetCardInfo("Soul Exchange", 43, Rarity.UNCOMMON, mage.cards.s.SoulExchange.class)); + cards.add(new SetCardInfo("Spirit Shield", 90, Rarity.RARE, mage.cards.s.SpiritShield.class)); + cards.add(new SetCardInfo("Spore Cloud", "72a", Rarity.COMMON, mage.cards.s.SporeCloud.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Spore Cloud", "72b", Rarity.COMMON, mage.cards.s.SporeCloud.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Spore Cloud", "72c", Rarity.COMMON, mage.cards.s.SporeCloud.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Spore Flower", 73, Rarity.UNCOMMON, mage.cards.s.SporeFlower.class)); + cards.add(new SetCardInfo("Svyelunite Priest", 26, Rarity.UNCOMMON, mage.cards.s.SvyelunitePriest.class)); + cards.add(new SetCardInfo("Svyelunite Temple", 102, Rarity.UNCOMMON, mage.cards.s.SvyeluniteTemple.class)); + cards.add(new SetCardInfo("Thallid Devourer", 75, Rarity.UNCOMMON, mage.cards.t.ThallidDevourer.class)); + cards.add(new SetCardInfo("Thallid", "74a", Rarity.COMMON, mage.cards.t.Thallid.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Thallid", "74b", Rarity.COMMON, mage.cards.t.Thallid.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Thallid", "74c", Rarity.COMMON, mage.cards.t.Thallid.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Thallid", "74d", Rarity.COMMON, mage.cards.t.Thallid.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Thelon's Chant", 76, Rarity.UNCOMMON, mage.cards.t.ThelonsChant.class)); + cards.add(new SetCardInfo("Thelon's Curse", 77, Rarity.RARE, mage.cards.t.ThelonsCurse.class)); + cards.add(new SetCardInfo("Thelonite Druid", 78, Rarity.UNCOMMON, mage.cards.t.TheloniteDruid.class)); + cards.add(new SetCardInfo("Thelonite Monk", 79, Rarity.RARE, mage.cards.t.TheloniteMonk.class)); + cards.add(new SetCardInfo("Thorn Thallid", "80a", Rarity.COMMON, ThornThallid.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Thorn Thallid", "80b", Rarity.COMMON, ThornThallid.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Thorn Thallid", "80c", Rarity.COMMON, ThornThallid.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Thorn Thallid", "80d", Rarity.COMMON, ThornThallid.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Thrull Champion", 44, Rarity.RARE, mage.cards.t.ThrullChampion.class)); + cards.add(new SetCardInfo("Thrull Retainer", 45, Rarity.UNCOMMON, mage.cards.t.ThrullRetainer.class)); + cards.add(new SetCardInfo("Thrull Wizard", 46, Rarity.UNCOMMON, mage.cards.t.ThrullWizard.class)); + cards.add(new SetCardInfo("Tidal Flats", "27a", Rarity.COMMON, mage.cards.t.TidalFlats.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Tidal Flats", "27b", Rarity.COMMON, mage.cards.t.TidalFlats.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Tidal Flats", "27c", Rarity.COMMON, mage.cards.t.TidalFlats.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Tidal Influence", 28, Rarity.UNCOMMON, mage.cards.t.TidalInfluence.class)); + cards.add(new SetCardInfo("Tourach's Chant", 47, Rarity.UNCOMMON, mage.cards.t.TourachsChant.class)); + cards.add(new SetCardInfo("Tourach's Gate", 48, Rarity.RARE, mage.cards.t.TourachsGate.class)); + cards.add(new SetCardInfo("Vodalian Knights", 29, Rarity.RARE, mage.cards.v.VodalianKnights.class)); + cards.add(new SetCardInfo("Vodalian Mage", "30a", Rarity.COMMON, VodalianMage.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Vodalian Mage", "30b", Rarity.COMMON, VodalianMage.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Vodalian Mage", "30c", Rarity.COMMON, VodalianMage.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Vodalian Soldiers", "31a", Rarity.COMMON, VodalianSoldiers.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Vodalian Soldiers", "31b", Rarity.COMMON, VodalianSoldiers.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Vodalian Soldiers", "31c", Rarity.COMMON, VodalianSoldiers.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Vodalian Soldiers", "31d", Rarity.COMMON, VodalianSoldiers.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Vodalian War Machine", 32, Rarity.RARE, mage.cards.v.VodalianWarMachine.class)); + cards.add(new SetCardInfo("Zelyon Sword", 91, Rarity.RARE, mage.cards.z.ZelyonSword.class)); } } From 103d5c5f22645dd868b5331be71aa12431278f00 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Thu, 10 May 2018 11:21:47 +0400 Subject: [PATCH 128/158] Fixed card numbers in ICE - Ice Age (#4628) --- Mage.Sets/src/mage/sets/IceAge.java | 474 ++++++++++++++-------------- 1 file changed, 237 insertions(+), 237 deletions(-) diff --git a/Mage.Sets/src/mage/sets/IceAge.java b/Mage.Sets/src/mage/sets/IceAge.java index 892a4931b37..745eefad6f1 100644 --- a/Mage.Sets/src/mage/sets/IceAge.java +++ b/Mage.Sets/src/mage/sets/IceAge.java @@ -52,325 +52,325 @@ public class IceAge extends ExpansionSet { this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; - cards.add(new SetCardInfo("Abyssal Specter", 1, Rarity.UNCOMMON, mage.cards.a.AbyssalSpecter.class)); - cards.add(new SetCardInfo("Adarkar Sentinel", 281, Rarity.UNCOMMON, mage.cards.a.AdarkarSentinel.class)); - cards.add(new SetCardInfo("Adarkar Wastes", 326, Rarity.RARE, mage.cards.a.AdarkarWastes.class)); - cards.add(new SetCardInfo("Aegis of the Meek", 282, Rarity.RARE, mage.cards.a.AegisOfTheMeek.class)); - cards.add(new SetCardInfo("Altar of Bone", 359, Rarity.RARE, mage.cards.a.AltarOfBone.class)); + cards.add(new SetCardInfo("Abyssal Specter", 113, Rarity.UNCOMMON, mage.cards.a.AbyssalSpecter.class)); + cards.add(new SetCardInfo("Adarkar Sentinel", 306, Rarity.UNCOMMON, mage.cards.a.AdarkarSentinel.class)); + cards.add(new SetCardInfo("Adarkar Wastes", 351, Rarity.RARE, mage.cards.a.AdarkarWastes.class)); + cards.add(new SetCardInfo("Aegis of the Meek", 307, Rarity.RARE, mage.cards.a.AegisOfTheMeek.class)); + cards.add(new SetCardInfo("Altar of Bone", 281, Rarity.RARE, mage.cards.a.AltarOfBone.class)); cards.add(new SetCardInfo("Anarchy", 170, Rarity.UNCOMMON, mage.cards.a.Anarchy.class)); - cards.add(new SetCardInfo("Arenson's Aura", 227, Rarity.COMMON, mage.cards.a.ArensonsAura.class)); - cards.add(new SetCardInfo("Armor of Faith", 228, Rarity.COMMON, mage.cards.a.ArmorOfFaith.class)); + cards.add(new SetCardInfo("Arenson's Aura", 3, Rarity.COMMON, mage.cards.a.ArensonsAura.class)); + cards.add(new SetCardInfo("Armor of Faith", 4, Rarity.COMMON, mage.cards.a.ArmorOfFaith.class)); cards.add(new SetCardInfo("Arnjlot's Ascent", 57, Rarity.COMMON, mage.cards.a.ArnjlotsAscent.class)); - cards.add(new SetCardInfo("Ashen Ghoul", 2, Rarity.UNCOMMON, mage.cards.a.AshenGhoul.class)); - cards.add(new SetCardInfo("Aurochs", 113, Rarity.COMMON, mage.cards.a.Aurochs.class)); + cards.add(new SetCardInfo("Ashen Ghoul", 114, Rarity.UNCOMMON, mage.cards.a.AshenGhoul.class)); + cards.add(new SetCardInfo("Aurochs", 225, Rarity.COMMON, mage.cards.a.Aurochs.class)); cards.add(new SetCardInfo("Avalanche", 171, Rarity.UNCOMMON, mage.cards.a.Avalanche.class)); cards.add(new SetCardInfo("Balduvian Barbarians", 172, Rarity.COMMON, mage.cards.b.BalduvianBarbarians.class)); - cards.add(new SetCardInfo("Balduvian Bears", 114, Rarity.COMMON, mage.cards.b.BalduvianBears.class)); + cards.add(new SetCardInfo("Balduvian Bears", 226, Rarity.COMMON, mage.cards.b.BalduvianBears.class)); cards.add(new SetCardInfo("Balduvian Conjurer", 58, Rarity.UNCOMMON, mage.cards.b.BalduvianConjurer.class)); cards.add(new SetCardInfo("Balduvian Hydra", 173, Rarity.RARE, mage.cards.b.BalduvianHydra.class)); - cards.add(new SetCardInfo("Barbed Sextant", 287, Rarity.COMMON, mage.cards.b.BarbedSextant.class)); - cards.add(new SetCardInfo("Baton of Morale", 288, Rarity.UNCOMMON, mage.cards.b.BatonOfMorale.class)); + cards.add(new SetCardInfo("Barbed Sextant", 312, Rarity.COMMON, mage.cards.b.BarbedSextant.class)); + cards.add(new SetCardInfo("Baton of Morale", 313, Rarity.UNCOMMON, mage.cards.b.BatonOfMorale.class)); cards.add(new SetCardInfo("Battle Frenzy", 175, Rarity.COMMON, mage.cards.b.BattleFrenzy.class)); cards.add(new SetCardInfo("Binding Grasp", 60, Rarity.UNCOMMON, mage.cards.b.BindingGrasp.class)); - cards.add(new SetCardInfo("Black Scarab", 230, Rarity.UNCOMMON, mage.cards.b.BlackScarab.class)); - cards.add(new SetCardInfo("Blessed Wine", 231, Rarity.COMMON, mage.cards.b.BlessedWine.class)); - cards.add(new SetCardInfo("Blinking Spirit", 232, Rarity.RARE, mage.cards.b.BlinkingSpirit.class)); - cards.add(new SetCardInfo("Blue Scarab", 233, Rarity.UNCOMMON, mage.cards.b.BlueScarab.class)); + cards.add(new SetCardInfo("Black Scarab", 6, Rarity.UNCOMMON, mage.cards.b.BlackScarab.class)); + cards.add(new SetCardInfo("Blessed Wine", 7, Rarity.COMMON, mage.cards.b.BlessedWine.class)); + cards.add(new SetCardInfo("Blinking Spirit", 8, Rarity.RARE, mage.cards.b.BlinkingSpirit.class)); + cards.add(new SetCardInfo("Blue Scarab", 9, Rarity.UNCOMMON, mage.cards.b.BlueScarab.class)); cards.add(new SetCardInfo("Brainstorm", 61, Rarity.COMMON, mage.cards.b.Brainstorm.class)); cards.add(new SetCardInfo("Brand of Ill Omen", 177, Rarity.RARE, mage.cards.b.BrandOfIllOmen.class)); cards.add(new SetCardInfo("Breath of Dreams", 62, Rarity.UNCOMMON, mage.cards.b.BreathOfDreams.class)); - cards.add(new SetCardInfo("Brine Shaman", 3, Rarity.COMMON, mage.cards.b.BrineShaman.class)); - cards.add(new SetCardInfo("Brown Ouphe", 116, Rarity.COMMON, mage.cards.b.BrownOuphe.class)); - cards.add(new SetCardInfo("Brushland", 327, Rarity.RARE, mage.cards.b.Brushland.class)); - cards.add(new SetCardInfo("Burnt Offering", 4, Rarity.COMMON, mage.cards.b.BurntOffering.class)); - cards.add(new SetCardInfo("Call to Arms", 234, Rarity.RARE, mage.cards.c.CallToArms.class)); - cards.add(new SetCardInfo("Caribou Range", 235, Rarity.RARE, mage.cards.c.CaribouRange.class)); - cards.add(new SetCardInfo("Celestial Sword", 289, Rarity.RARE, mage.cards.c.CelestialSword.class)); - cards.add(new SetCardInfo("Centaur Archer", 360, Rarity.UNCOMMON, mage.cards.c.CentaurArcher.class)); + cards.add(new SetCardInfo("Brine Shaman", 115, Rarity.COMMON, mage.cards.b.BrineShaman.class)); + cards.add(new SetCardInfo("Brown Ouphe", 228, Rarity.COMMON, mage.cards.b.BrownOuphe.class)); + cards.add(new SetCardInfo("Brushland", 352, Rarity.RARE, mage.cards.b.Brushland.class)); + cards.add(new SetCardInfo("Burnt Offering", 116, Rarity.COMMON, mage.cards.b.BurntOffering.class)); + cards.add(new SetCardInfo("Call to Arms", 10, Rarity.RARE, mage.cards.c.CallToArms.class)); + cards.add(new SetCardInfo("Caribou Range", 11, Rarity.RARE, mage.cards.c.CaribouRange.class)); + cards.add(new SetCardInfo("Celestial Sword", 314, Rarity.RARE, mage.cards.c.CelestialSword.class)); + cards.add(new SetCardInfo("Centaur Archer", 282, Rarity.UNCOMMON, mage.cards.c.CentaurArcher.class)); cards.add(new SetCardInfo("Chaos Moon", 179, Rarity.RARE, mage.cards.c.ChaosMoon.class)); - cards.add(new SetCardInfo("Chub Toad", 117, Rarity.COMMON, mage.cards.c.ChubToad.class)); - cards.add(new SetCardInfo("Circle of Protection: Black", 236, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlack.class)); - cards.add(new SetCardInfo("Circle of Protection: Blue", 237, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlue.class)); - cards.add(new SetCardInfo("Circle of Protection: Green", 238, Rarity.COMMON, mage.cards.c.CircleOfProtectionGreen.class)); - cards.add(new SetCardInfo("Circle of Protection: Red", 239, Rarity.COMMON, mage.cards.c.CircleOfProtectionRed.class)); - cards.add(new SetCardInfo("Circle of Protection: White", 240, Rarity.COMMON, mage.cards.c.CircleOfProtectionWhite.class)); + cards.add(new SetCardInfo("Chub Toad", 229, Rarity.COMMON, mage.cards.c.ChubToad.class)); + cards.add(new SetCardInfo("Circle of Protection: Black", 12, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlack.class)); + cards.add(new SetCardInfo("Circle of Protection: Blue", 13, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlue.class)); + cards.add(new SetCardInfo("Circle of Protection: Green", 14, Rarity.COMMON, mage.cards.c.CircleOfProtectionGreen.class)); + cards.add(new SetCardInfo("Circle of Protection: Red", 15, Rarity.COMMON, mage.cards.c.CircleOfProtectionRed.class)); + cards.add(new SetCardInfo("Circle of Protection: White", 16, Rarity.COMMON, mage.cards.c.CircleOfProtectionWhite.class)); cards.add(new SetCardInfo("Clairvoyance", 63, Rarity.COMMON, mage.cards.c.Clairvoyance.class)); - cards.add(new SetCardInfo("Cold Snap", 241, Rarity.UNCOMMON, mage.cards.c.ColdSnap.class)); + cards.add(new SetCardInfo("Cold Snap", 17, Rarity.UNCOMMON, mage.cards.c.ColdSnap.class)); cards.add(new SetCardInfo("Conquer", 180, Rarity.UNCOMMON, mage.cards.c.Conquer.class)); - cards.add(new SetCardInfo("Cooperation", 242, Rarity.COMMON, mage.cards.c.Cooperation.class)); + cards.add(new SetCardInfo("Cooperation", 18, Rarity.COMMON, mage.cards.c.Cooperation.class)); cards.add(new SetCardInfo("Counterspell", 64, Rarity.COMMON, mage.cards.c.Counterspell.class)); - cards.add(new SetCardInfo("Crown of the Ages", 290, Rarity.RARE, mage.cards.c.CrownOfTheAges.class)); + cards.add(new SetCardInfo("Crown of the Ages", 315, Rarity.RARE, mage.cards.c.CrownOfTheAges.class)); cards.add(new SetCardInfo("Curse of Marit Lage", 181, Rarity.RARE, mage.cards.c.CurseOfMaritLage.class)); - cards.add(new SetCardInfo("Dance of the Dead", 6, Rarity.UNCOMMON, mage.cards.d.DanceOfTheDead.class)); - cards.add(new SetCardInfo("Dark Banishing", 7, Rarity.COMMON, mage.cards.d.DarkBanishing.class)); - cards.add(new SetCardInfo("Dark Ritual", 8, Rarity.COMMON, mage.cards.d.DarkRitual.class)); - cards.add(new SetCardInfo("Death Ward", 243, Rarity.COMMON, mage.cards.d.DeathWard.class)); + cards.add(new SetCardInfo("Dance of the Dead", 118, Rarity.UNCOMMON, mage.cards.d.DanceOfTheDead.class)); + cards.add(new SetCardInfo("Dark Banishing", 119, Rarity.COMMON, mage.cards.d.DarkBanishing.class)); + cards.add(new SetCardInfo("Dark Ritual", 120, Rarity.COMMON, mage.cards.d.DarkRitual.class)); + cards.add(new SetCardInfo("Death Ward", 19, Rarity.COMMON, mage.cards.d.DeathWard.class)); cards.add(new SetCardInfo("Deflection", 65, Rarity.RARE, mage.cards.d.Deflection.class)); - cards.add(new SetCardInfo("Demonic Consultation", 9, Rarity.UNCOMMON, mage.cards.d.DemonicConsultation.class)); - cards.add(new SetCardInfo("Despotic Scepter", 291, Rarity.RARE, mage.cards.d.DespoticScepter.class)); - cards.add(new SetCardInfo("Diabolic Vision", 362, Rarity.UNCOMMON, mage.cards.d.DiabolicVision.class)); - cards.add(new SetCardInfo("Dire Wolves", 118, Rarity.COMMON, mage.cards.d.DireWolves.class)); - cards.add(new SetCardInfo("Disenchant", 244, Rarity.COMMON, mage.cards.d.Disenchant.class)); - cards.add(new SetCardInfo("Drift of the Dead", 11, Rarity.UNCOMMON, mage.cards.d.DriftOfTheDead.class)); - cards.add(new SetCardInfo("Drought", 245, Rarity.UNCOMMON, mage.cards.d.Drought.class)); + cards.add(new SetCardInfo("Demonic Consultation", 121, Rarity.UNCOMMON, mage.cards.d.DemonicConsultation.class)); + cards.add(new SetCardInfo("Despotic Scepter", 316, Rarity.RARE, mage.cards.d.DespoticScepter.class)); + cards.add(new SetCardInfo("Diabolic Vision", 284, Rarity.UNCOMMON, mage.cards.d.DiabolicVision.class)); + cards.add(new SetCardInfo("Dire Wolves", 230, Rarity.COMMON, mage.cards.d.DireWolves.class)); + cards.add(new SetCardInfo("Disenchant", 20, Rarity.COMMON, mage.cards.d.Disenchant.class)); + cards.add(new SetCardInfo("Drift of the Dead", 123, Rarity.UNCOMMON, mage.cards.d.DriftOfTheDead.class)); + cards.add(new SetCardInfo("Drought", 21, Rarity.UNCOMMON, mage.cards.d.Drought.class)); cards.add(new SetCardInfo("Dwarven Armory", 182, Rarity.RARE, mage.cards.d.DwarvenArmory.class)); - cards.add(new SetCardInfo("Earthlore", 119, Rarity.COMMON, mage.cards.e.Earthlore.class)); - cards.add(new SetCardInfo("Earthlink", 363, Rarity.RARE, mage.cards.e.Earthlink.class)); - cards.add(new SetCardInfo("Elder Druid", 120, Rarity.RARE, mage.cards.e.ElderDruid.class)); - cards.add(new SetCardInfo("Elemental Augury", 364, Rarity.RARE, mage.cards.e.ElementalAugury.class)); - cards.add(new SetCardInfo("Elkin Bottle", 292, Rarity.RARE, mage.cards.e.ElkinBottle.class)); - cards.add(new SetCardInfo("Enduring Renewal", 247, Rarity.RARE, mage.cards.e.EnduringRenewal.class)); - cards.add(new SetCardInfo("Energy Storm", 248, Rarity.RARE, mage.cards.e.EnergyStorm.class)); + cards.add(new SetCardInfo("Earthlink", 285, Rarity.RARE, mage.cards.e.Earthlink.class)); + cards.add(new SetCardInfo("Earthlore", 231, Rarity.COMMON, mage.cards.e.Earthlore.class)); + cards.add(new SetCardInfo("Elder Druid", 232, Rarity.RARE, mage.cards.e.ElderDruid.class)); + cards.add(new SetCardInfo("Elemental Augury", 286, Rarity.RARE, mage.cards.e.ElementalAugury.class)); + cards.add(new SetCardInfo("Elkin Bottle", 317, Rarity.RARE, mage.cards.e.ElkinBottle.class)); + cards.add(new SetCardInfo("Enduring Renewal", 23, Rarity.RARE, mage.cards.e.EnduringRenewal.class)); + cards.add(new SetCardInfo("Energy Storm", 24, Rarity.RARE, mage.cards.e.EnergyStorm.class)); cards.add(new SetCardInfo("Enervate", 67, Rarity.COMMON, mage.cards.e.Enervate.class)); cards.add(new SetCardInfo("Errantry", 183, Rarity.COMMON, mage.cards.e.Errantry.class)); - cards.add(new SetCardInfo("Essence Filter", 121, Rarity.COMMON, mage.cards.e.EssenceFilter.class)); + cards.add(new SetCardInfo("Essence Filter", 233, Rarity.COMMON, mage.cards.e.EssenceFilter.class)); cards.add(new SetCardInfo("Essence Flare", 69, Rarity.COMMON, mage.cards.e.EssenceFlare.class)); - cards.add(new SetCardInfo("Fanatical Fever", 122, Rarity.UNCOMMON, mage.cards.f.FanaticalFever.class)); - cards.add(new SetCardInfo("Fear", 12, Rarity.COMMON, mage.cards.f.Fear.class)); - cards.add(new SetCardInfo("Fiery Justice", 366, Rarity.RARE, mage.cards.f.FieryJustice.class)); - cards.add(new SetCardInfo("Fire Covenant", 367, Rarity.UNCOMMON, mage.cards.f.FireCovenant.class)); + cards.add(new SetCardInfo("Fanatical Fever", 234, Rarity.UNCOMMON, mage.cards.f.FanaticalFever.class)); + cards.add(new SetCardInfo("Fear", 124, Rarity.COMMON, mage.cards.f.Fear.class)); + cards.add(new SetCardInfo("Fiery Justice", 288, Rarity.RARE, mage.cards.f.FieryJustice.class)); + cards.add(new SetCardInfo("Fire Covenant", 289, Rarity.UNCOMMON, mage.cards.f.FireCovenant.class)); cards.add(new SetCardInfo("Flame Spirit", 184, Rarity.UNCOMMON, mage.cards.f.FlameSpirit.class)); cards.add(new SetCardInfo("Flare", 185, Rarity.COMMON, mage.cards.f.Flare.class)); - cards.add(new SetCardInfo("Flooded Woodlands", 368, Rarity.RARE, mage.cards.f.FloodedWoodlands.class)); - cards.add(new SetCardInfo("Flow of Maggots", 13, Rarity.RARE, mage.cards.f.FlowOfMaggots.class)); - cards.add(new SetCardInfo("Folk of the Pines", 123, Rarity.COMMON, mage.cards.f.FolkOfThePines.class)); - cards.add(new SetCardInfo("Forbidden Lore", 124, Rarity.RARE, mage.cards.f.ForbiddenLore.class)); + cards.add(new SetCardInfo("Flooded Woodlands", 290, Rarity.RARE, mage.cards.f.FloodedWoodlands.class)); + cards.add(new SetCardInfo("Flow of Maggots", 125, Rarity.RARE, mage.cards.f.FlowOfMaggots.class)); + cards.add(new SetCardInfo("Folk of the Pines", 235, Rarity.COMMON, mage.cards.f.FolkOfThePines.class)); + cards.add(new SetCardInfo("Forbidden Lore", 236, Rarity.RARE, mage.cards.f.ForbiddenLore.class)); cards.add(new SetCardInfo("Force Void", 70, Rarity.UNCOMMON, mage.cards.f.ForceVoid.class)); - cards.add(new SetCardInfo("Forest", 328, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Forest", 329, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Forest", 330, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Forgotten Lore", 125, Rarity.UNCOMMON, mage.cards.f.ForgottenLore.class)); - cards.add(new SetCardInfo("Formation", 249, Rarity.RARE, mage.cards.f.Formation.class)); - cards.add(new SetCardInfo("Foul Familiar", 14, Rarity.COMMON, mage.cards.f.FoulFamiliar.class)); - cards.add(new SetCardInfo("Freyalise's Charm", 128, Rarity.UNCOMMON, mage.cards.f.FreyalisesCharm.class)); - cards.add(new SetCardInfo("Foxfire", 126, Rarity.COMMON, mage.cards.f.Foxfire.class)); - cards.add(new SetCardInfo("Fumarole", 369, Rarity.UNCOMMON, mage.cards.f.Fumarole.class)); - cards.add(new SetCardInfo("Fyndhorn Bow", 293, Rarity.UNCOMMON, mage.cards.f.FyndhornBow.class)); - cards.add(new SetCardInfo("Fyndhorn Brownie", 130, Rarity.COMMON, mage.cards.f.FyndhornBrownie.class)); - cards.add(new SetCardInfo("Fyndhorn Elder", 131, Rarity.UNCOMMON, mage.cards.f.FyndhornElder.class)); - cards.add(new SetCardInfo("Fyndhorn Elves", 132, Rarity.COMMON, mage.cards.f.FyndhornElves.class)); - cards.add(new SetCardInfo("Fyndhorn Pollen", 133, Rarity.RARE, mage.cards.f.FyndhornPollen.class)); + cards.add(new SetCardInfo("Forest", 380, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 381, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 382, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forgotten Lore", 237, Rarity.UNCOMMON, mage.cards.f.ForgottenLore.class)); + cards.add(new SetCardInfo("Formation", 25, Rarity.RARE, mage.cards.f.Formation.class)); + cards.add(new SetCardInfo("Foul Familiar", 126, Rarity.COMMON, mage.cards.f.FoulFamiliar.class)); + cards.add(new SetCardInfo("Foxfire", 238, Rarity.COMMON, mage.cards.f.Foxfire.class)); + cards.add(new SetCardInfo("Freyalise's Charm", 240, Rarity.UNCOMMON, mage.cards.f.FreyalisesCharm.class)); + cards.add(new SetCardInfo("Fumarole", 291, Rarity.UNCOMMON, mage.cards.f.Fumarole.class)); + cards.add(new SetCardInfo("Fyndhorn Bow", 318, Rarity.UNCOMMON, mage.cards.f.FyndhornBow.class)); + cards.add(new SetCardInfo("Fyndhorn Brownie", 242, Rarity.COMMON, mage.cards.f.FyndhornBrownie.class)); + cards.add(new SetCardInfo("Fyndhorn Elder", 243, Rarity.UNCOMMON, mage.cards.f.FyndhornElder.class)); + cards.add(new SetCardInfo("Fyndhorn Elves", 244, Rarity.COMMON, mage.cards.f.FyndhornElves.class)); + cards.add(new SetCardInfo("Fyndhorn Pollen", 245, Rarity.RARE, mage.cards.f.FyndhornPollen.class)); cards.add(new SetCardInfo("Game of Chaos", 186, Rarity.RARE, mage.cards.g.GameOfChaos.class)); - cards.add(new SetCardInfo("Gangrenous Zombies", 15, Rarity.COMMON, mage.cards.g.GangrenousZombies.class)); - cards.add(new SetCardInfo("General Jarkeld", 251, Rarity.RARE, mage.cards.g.GeneralJarkeld.class)); - cards.add(new SetCardInfo("Giant Growth", 134, Rarity.COMMON, mage.cards.g.GiantGrowth.class)); - cards.add(new SetCardInfo("Giant Trap Door Spider", 371, Rarity.UNCOMMON, mage.cards.g.GiantTrapDoorSpider.class)); - cards.add(new SetCardInfo("Glacial Chasm", 331, Rarity.UNCOMMON, mage.cards.g.GlacialChasm.class)); + cards.add(new SetCardInfo("Gangrenous Zombies", 127, Rarity.COMMON, mage.cards.g.GangrenousZombies.class)); + cards.add(new SetCardInfo("General Jarkeld", 27, Rarity.RARE, mage.cards.g.GeneralJarkeld.class)); + cards.add(new SetCardInfo("Giant Growth", 246, Rarity.COMMON, mage.cards.g.GiantGrowth.class)); + cards.add(new SetCardInfo("Giant Trap Door Spider", 293, Rarity.UNCOMMON, mage.cards.g.GiantTrapDoorSpider.class)); + cards.add(new SetCardInfo("Glacial Chasm", 353, Rarity.UNCOMMON, mage.cards.g.GlacialChasm.class)); cards.add(new SetCardInfo("Glacial Crevasses", 187, Rarity.RARE, mage.cards.g.GlacialCrevasses.class)); cards.add(new SetCardInfo("Glacial Wall", 71, Rarity.UNCOMMON, mage.cards.g.GlacialWall.class)); - cards.add(new SetCardInfo("Goblin Lyre", 294, Rarity.RARE, mage.cards.g.GoblinLyre.class)); + cards.add(new SetCardInfo("Goblin Lyre", 319, Rarity.RARE, mage.cards.g.GoblinLyre.class)); cards.add(new SetCardInfo("Goblin Mutant", 188, Rarity.UNCOMMON, mage.cards.g.GoblinMutant.class)); cards.add(new SetCardInfo("Goblin Snowman", 191, Rarity.UNCOMMON, mage.cards.g.GoblinSnowman.class)); - cards.add(new SetCardInfo("Gorilla Pack", 135, Rarity.COMMON, mage.cards.g.GorillaPack.class)); - cards.add(new SetCardInfo("Gravebind", 17, Rarity.RARE, mage.cards.g.Gravebind.class)); - cards.add(new SetCardInfo("Green Scarab", 252, Rarity.UNCOMMON, mage.cards.g.GreenScarab.class)); - cards.add(new SetCardInfo("Hallowed Ground", 253, Rarity.UNCOMMON, mage.cards.h.HallowedGround.class)); - cards.add(new SetCardInfo("Halls of Mist", 332, Rarity.RARE, mage.cards.h.HallsOfMist.class)); - cards.add(new SetCardInfo("Heal", 254, Rarity.COMMON, mage.cards.h.Heal.class)); - cards.add(new SetCardInfo("Hecatomb", 18, Rarity.RARE, mage.cards.h.Hecatomb.class)); - cards.add(new SetCardInfo("Hematite Talisman", 295, Rarity.UNCOMMON, mage.cards.h.HematiteTalisman.class)); - cards.add(new SetCardInfo("Hoar Shade", 19, Rarity.COMMON, mage.cards.h.HoarShade.class)); - cards.add(new SetCardInfo("Hot Springs", 136, Rarity.RARE, mage.cards.h.HotSprings.class)); - cards.add(new SetCardInfo("Howl from Beyond", 20, Rarity.COMMON, mage.cards.h.HowlFromBeyond.class)); - cards.add(new SetCardInfo("Hurricane", 137, Rarity.UNCOMMON, mage.cards.h.Hurricane.class)); - cards.add(new SetCardInfo("Hyalopterous Lemure", 21, Rarity.UNCOMMON, mage.cards.h.HyalopterousLemure.class)); + cards.add(new SetCardInfo("Gorilla Pack", 247, Rarity.COMMON, mage.cards.g.GorillaPack.class)); + cards.add(new SetCardInfo("Gravebind", 129, Rarity.RARE, mage.cards.g.Gravebind.class)); + cards.add(new SetCardInfo("Green Scarab", 28, Rarity.UNCOMMON, mage.cards.g.GreenScarab.class)); + cards.add(new SetCardInfo("Hallowed Ground", 29, Rarity.UNCOMMON, mage.cards.h.HallowedGround.class)); + cards.add(new SetCardInfo("Halls of Mist", 354, Rarity.RARE, mage.cards.h.HallsOfMist.class)); + cards.add(new SetCardInfo("Heal", 30, Rarity.COMMON, mage.cards.h.Heal.class)); + cards.add(new SetCardInfo("Hecatomb", 130, Rarity.RARE, mage.cards.h.Hecatomb.class)); + cards.add(new SetCardInfo("Hematite Talisman", 320, Rarity.UNCOMMON, mage.cards.h.HematiteTalisman.class)); + cards.add(new SetCardInfo("Hoar Shade", 131, Rarity.COMMON, mage.cards.h.HoarShade.class)); + cards.add(new SetCardInfo("Hot Springs", 248, Rarity.RARE, mage.cards.h.HotSprings.class)); + cards.add(new SetCardInfo("Howl from Beyond", 132, Rarity.COMMON, mage.cards.h.HowlFromBeyond.class)); + cards.add(new SetCardInfo("Hurricane", 249, Rarity.UNCOMMON, mage.cards.h.Hurricane.class)); + cards.add(new SetCardInfo("Hyalopterous Lemure", 133, 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("Hymn of Rebirth", 295, Rarity.UNCOMMON, mage.cards.h.HymnOfRebirth.class)); + cards.add(new SetCardInfo("Ice Cauldron", 321, Rarity.RARE, mage.cards.i.IceCauldron.class)); + cards.add(new SetCardInfo("Ice Floe", 355, 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)); - cards.add(new SetCardInfo("Icy Manipulator", 297, Rarity.UNCOMMON, mage.cards.i.IcyManipulator.class)); + cards.add(new SetCardInfo("Icequake", 134, Rarity.UNCOMMON, mage.cards.i.Icequake.class)); + cards.add(new SetCardInfo("Icy Manipulator", 322, Rarity.UNCOMMON, mage.cards.i.IcyManipulator.class)); cards.add(new SetCardInfo("Icy Prison", 74, Rarity.RARE, mage.cards.i.IcyPrison.class)); cards.add(new SetCardInfo("Illusionary Forces", 75, Rarity.COMMON, mage.cards.i.IllusionaryForces.class)); cards.add(new SetCardInfo("Illusionary Wall", 78, Rarity.COMMON, mage.cards.i.IllusionaryWall.class)); cards.add(new SetCardInfo("Illusions of Grandeur", 79, Rarity.RARE, mage.cards.i.IllusionsOfGrandeur.class)); cards.add(new SetCardInfo("Imposing Visage", 193, Rarity.COMMON, mage.cards.i.ImposingVisage.class)); cards.add(new SetCardInfo("Incinerate", 194, Rarity.COMMON, mage.cards.i.Incinerate.class)); - cards.add(new SetCardInfo("Infernal Darkness", 23, Rarity.RARE, mage.cards.i.InfernalDarkness.class)); - cards.add(new SetCardInfo("Infernal Denizen", 24, Rarity.RARE, mage.cards.i.InfernalDenizen.class)); - cards.add(new SetCardInfo("Infinite Hourglass", 298, Rarity.RARE, mage.cards.i.InfiniteHourglass.class)); + cards.add(new SetCardInfo("Infernal Darkness", 135, Rarity.RARE, mage.cards.i.InfernalDarkness.class)); + cards.add(new SetCardInfo("Infernal Denizen", 136, Rarity.RARE, mage.cards.i.InfernalDenizen.class)); + cards.add(new SetCardInfo("Infinite Hourglass", 323, Rarity.RARE, mage.cards.i.InfiniteHourglass.class)); cards.add(new SetCardInfo("Infuse", 80, Rarity.COMMON, mage.cards.i.Infuse.class)); - cards.add(new SetCardInfo("Island", 334, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Island", 335, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Island", 336, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Jester's Cap", 299, Rarity.RARE, mage.cards.j.JestersCap.class)); - cards.add(new SetCardInfo("Jester's Mask", 300, Rarity.RARE, mage.cards.j.JestersMask.class)); - cards.add(new SetCardInfo("Jeweled Amulet", 301, Rarity.UNCOMMON, mage.cards.j.JeweledAmulet.class)); - cards.add(new SetCardInfo("Johtull Wurm", 138, Rarity.UNCOMMON, mage.cards.j.JohtullWurm.class)); + cards.add(new SetCardInfo("Island", 368, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 369, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 370, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Jester's Cap", 324, Rarity.RARE, mage.cards.j.JestersCap.class)); + cards.add(new SetCardInfo("Jester's Mask", 325, Rarity.RARE, mage.cards.j.JestersMask.class)); + cards.add(new SetCardInfo("Jeweled Amulet", 326, Rarity.UNCOMMON, mage.cards.j.JeweledAmulet.class)); + cards.add(new SetCardInfo("Johtull Wurm", 250, Rarity.UNCOMMON, mage.cards.j.JohtullWurm.class)); cards.add(new SetCardInfo("Jokulhaups", 195, Rarity.RARE, mage.cards.j.Jokulhaups.class)); - cards.add(new SetCardInfo("Juniper Order Druid", 139, Rarity.COMMON, mage.cards.j.JuniperOrderDruid.class)); - cards.add(new SetCardInfo("Justice", 256, Rarity.UNCOMMON, mage.cards.j.Justice.class)); - cards.add(new SetCardInfo("Karplusan Forest", 337, Rarity.RARE, mage.cards.k.KarplusanForest.class)); + cards.add(new SetCardInfo("Juniper Order Druid", 251, Rarity.COMMON, mage.cards.j.JuniperOrderDruid.class)); + cards.add(new SetCardInfo("Justice", 32, Rarity.UNCOMMON, mage.cards.j.Justice.class)); + cards.add(new SetCardInfo("Karplusan Forest", 356, Rarity.RARE, mage.cards.k.KarplusanForest.class)); cards.add(new SetCardInfo("Karplusan Giant", 196, Rarity.UNCOMMON, mage.cards.k.KarplusanGiant.class)); cards.add(new SetCardInfo("Karplusan Yeti", 197, Rarity.RARE, mage.cards.k.KarplusanYeti.class)); - cards.add(new SetCardInfo("Kelsinko Ranger", 257, Rarity.COMMON, mage.cards.k.KelsinkoRanger.class)); - cards.add(new SetCardInfo("Kjeldoran Dead", 25, Rarity.COMMON, mage.cards.k.KjeldoranDead.class)); - cards.add(new SetCardInfo("Kjeldoran Frostbeast", 374, Rarity.UNCOMMON, mage.cards.k.KjeldoranFrostbeast.class)); - cards.add(new SetCardInfo("Kjeldoran Knight", 260, Rarity.RARE, mage.cards.k.KjeldoranKnight.class)); - cards.add(new SetCardInfo("Kjeldoran Phalanx", 261, Rarity.RARE, mage.cards.k.KjeldoranPhalanx.class)); - cards.add(new SetCardInfo("Kjeldoran Royal Guard", 262, Rarity.RARE, mage.cards.k.KjeldoranRoyalGuard.class)); - cards.add(new SetCardInfo("Kjeldoran Skycaptain", 263, Rarity.UNCOMMON, mage.cards.k.KjeldoranSkycaptain.class)); - cards.add(new SetCardInfo("Kjeldoran Skyknight", 264, Rarity.COMMON, mage.cards.k.KjeldoranSkyknight.class)); - cards.add(new SetCardInfo("Kjeldoran Warrior", 265, Rarity.COMMON, mage.cards.k.KjeldoranWarrior.class)); - cards.add(new SetCardInfo("Knight of Stromgald", 26, Rarity.UNCOMMON, mage.cards.k.KnightOfStromgald.class)); - cards.add(new SetCardInfo("Krovikan Fetish", 28, Rarity.COMMON, mage.cards.k.KrovikanFetish.class)); + cards.add(new SetCardInfo("Kelsinko Ranger", 33, Rarity.COMMON, mage.cards.k.KelsinkoRanger.class)); + cards.add(new SetCardInfo("Kjeldoran Dead", 137, Rarity.COMMON, mage.cards.k.KjeldoranDead.class)); + cards.add(new SetCardInfo("Kjeldoran Frostbeast", 296, Rarity.UNCOMMON, mage.cards.k.KjeldoranFrostbeast.class)); + cards.add(new SetCardInfo("Kjeldoran Knight", 36, Rarity.RARE, mage.cards.k.KjeldoranKnight.class)); + cards.add(new SetCardInfo("Kjeldoran Phalanx", 37, Rarity.RARE, mage.cards.k.KjeldoranPhalanx.class)); + cards.add(new SetCardInfo("Kjeldoran Royal Guard", 38, Rarity.RARE, mage.cards.k.KjeldoranRoyalGuard.class)); + cards.add(new SetCardInfo("Kjeldoran Skycaptain", 39, Rarity.UNCOMMON, mage.cards.k.KjeldoranSkycaptain.class)); + cards.add(new SetCardInfo("Kjeldoran Skyknight", 40, Rarity.COMMON, mage.cards.k.KjeldoranSkyknight.class)); + cards.add(new SetCardInfo("Kjeldoran Warrior", 41, Rarity.COMMON, mage.cards.k.KjeldoranWarrior.class)); + cards.add(new SetCardInfo("Knight of Stromgald", 138, Rarity.UNCOMMON, mage.cards.k.KnightOfStromgald.class)); + cards.add(new SetCardInfo("Krovikan Fetish", 140, Rarity.COMMON, mage.cards.k.KrovikanFetish.class)); cards.add(new SetCardInfo("Krovikan Sorcerer", 81, Rarity.COMMON, mage.cards.k.KrovikanSorcerer.class)); - cards.add(new SetCardInfo("Land Cap", 338, Rarity.RARE, mage.cards.l.LandCap.class)); - cards.add(new SetCardInfo("Lapis Lazuli Talisman", 302, Rarity.UNCOMMON, mage.cards.l.LapisLazuliTalisman.class)); - cards.add(new SetCardInfo("Lava Tubes", 339, Rarity.RARE, mage.cards.l.LavaTubes.class)); - cards.add(new SetCardInfo("Legions of Lim-Dul", 30, Rarity.COMMON, mage.cards.l.LegionsOfLimDul.class)); - cards.add(new SetCardInfo("Leshrac's Rite", 31, Rarity.UNCOMMON, mage.cards.l.LeshracsRite.class)); - cards.add(new SetCardInfo("Leshrac's Sigil", 32, Rarity.UNCOMMON, mage.cards.l.LeshracsSigil.class)); - cards.add(new SetCardInfo("Lim-Dul's Hex", 34, Rarity.UNCOMMON, mage.cards.l.LimDulsHex.class)); - cards.add(new SetCardInfo("Lhurgoyf", 140, Rarity.RARE, mage.cards.l.Lhurgoyf.class)); - cards.add(new SetCardInfo("Lightning Blow", 266, Rarity.RARE, mage.cards.l.LightningBlow.class)); - cards.add(new SetCardInfo("Lure", 141, Rarity.UNCOMMON, mage.cards.l.Lure.class)); + cards.add(new SetCardInfo("Land Cap", 357, Rarity.RARE, mage.cards.l.LandCap.class)); + cards.add(new SetCardInfo("Lapis Lazuli Talisman", 327, Rarity.UNCOMMON, mage.cards.l.LapisLazuliTalisman.class)); + cards.add(new SetCardInfo("Lava Tubes", 358, Rarity.RARE, mage.cards.l.LavaTubes.class)); + cards.add(new SetCardInfo("Legions of Lim-Dul", 142, Rarity.COMMON, mage.cards.l.LegionsOfLimDul.class)); + cards.add(new SetCardInfo("Leshrac's Rite", 143, Rarity.UNCOMMON, mage.cards.l.LeshracsRite.class)); + cards.add(new SetCardInfo("Leshrac's Sigil", 144, Rarity.UNCOMMON, mage.cards.l.LeshracsSigil.class)); + cards.add(new SetCardInfo("Lhurgoyf", 252, Rarity.RARE, mage.cards.l.Lhurgoyf.class)); + cards.add(new SetCardInfo("Lightning Blow", 42, Rarity.RARE, mage.cards.l.LightningBlow.class)); + cards.add(new SetCardInfo("Lim-Dul's Hex", 146, Rarity.UNCOMMON, mage.cards.l.LimDulsHex.class)); + cards.add(new SetCardInfo("Lure", 253, Rarity.UNCOMMON, mage.cards.l.Lure.class)); cards.add(new SetCardInfo("Magus of the Unseen", 82, Rarity.RARE, mage.cards.m.MagusOfTheUnseen.class)); - cards.add(new SetCardInfo("Malachite Talisman", 303, Rarity.UNCOMMON, mage.cards.m.MalachiteTalisman.class)); - cards.add(new SetCardInfo("Marton Stromgald", 199, Rarity.RARE, mage.cards.m.MartonStromgald.class)); - cards.add(new SetCardInfo("Melee", 200, Rarity.UNCOMMON, mage.cards.m.Melee.class)); - cards.add(new SetCardInfo("Melting", 201, Rarity.UNCOMMON, mage.cards.m.Melting.class)); - cards.add(new SetCardInfo("Merieke Ri Berit", 375, Rarity.RARE, mage.cards.m.MeriekeRiBerit.class)); + cards.add(new SetCardInfo("Malachite Talisman", 328, Rarity.UNCOMMON, mage.cards.m.MalachiteTalisman.class)); + cards.add(new SetCardInfo("Marton Stromgald", 204, Rarity.RARE, mage.cards.m.MartonStromgald.class)); + cards.add(new SetCardInfo("Melee", 199, Rarity.UNCOMMON, mage.cards.m.Melee.class)); + cards.add(new SetCardInfo("Melting", 200, Rarity.UNCOMMON, mage.cards.m.Melting.class)); + cards.add(new SetCardInfo("Merieke Ri Berit", 297, Rarity.RARE, mage.cards.m.MeriekeRiBerit.class)); cards.add(new SetCardInfo("Mesmeric Trance", 83, Rarity.RARE, mage.cards.m.MesmericTrance.class)); - cards.add(new SetCardInfo("Meteor Shower", 202, Rarity.COMMON, mage.cards.m.MeteorShower.class)); - cards.add(new SetCardInfo("Mind Ravel", 35, Rarity.COMMON, mage.cards.m.MindRavel.class)); - cards.add(new SetCardInfo("Mind Warp", 36, Rarity.UNCOMMON, mage.cards.m.MindWarp.class)); - cards.add(new SetCardInfo("Minion of Leshrac", 38, Rarity.RARE, mage.cards.m.MinionOfLeshrac.class)); - cards.add(new SetCardInfo("Minion of Tevesh Szat", 39, Rarity.RARE, mage.cards.m.MinionOfTeveshSzat.class)); - cards.add(new SetCardInfo("Mole Worms", 40, Rarity.UNCOMMON, mage.cards.m.MoleWorms.class)); - cards.add(new SetCardInfo("Monsoon", 376, Rarity.RARE, mage.cards.m.Monsoon.class)); - cards.add(new SetCardInfo("Moor Fiend", 41, Rarity.COMMON, mage.cards.m.MoorFiend.class)); - cards.add(new SetCardInfo("Mountain", 340, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mountain", 341, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mountain", 342, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mountain Goat", 203, Rarity.COMMON, mage.cards.m.MountainGoat.class)); - cards.add(new SetCardInfo("Mudslide", 204, Rarity.RARE, mage.cards.m.Mudslide.class)); + cards.add(new SetCardInfo("Meteor Shower", 201, Rarity.COMMON, mage.cards.m.MeteorShower.class)); + cards.add(new SetCardInfo("Mind Ravel", 147, Rarity.COMMON, mage.cards.m.MindRavel.class)); + cards.add(new SetCardInfo("Mind Warp", 148, Rarity.UNCOMMON, mage.cards.m.MindWarp.class)); + cards.add(new SetCardInfo("Minion of Leshrac", 150, Rarity.RARE, mage.cards.m.MinionOfLeshrac.class)); + cards.add(new SetCardInfo("Minion of Tevesh Szat", 151, Rarity.RARE, mage.cards.m.MinionOfTeveshSzat.class)); + cards.add(new SetCardInfo("Mole Worms", 152, Rarity.UNCOMMON, mage.cards.m.MoleWorms.class)); + cards.add(new SetCardInfo("Monsoon", 298, Rarity.RARE, mage.cards.m.Monsoon.class)); + cards.add(new SetCardInfo("Moor Fiend", 153, Rarity.COMMON, mage.cards.m.MoorFiend.class)); + cards.add(new SetCardInfo("Mountain Goat", 202, Rarity.COMMON, mage.cards.m.MountainGoat.class)); + cards.add(new SetCardInfo("Mountain", 376, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 377, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 378, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mudslide", 203, Rarity.RARE, mage.cards.m.Mudslide.class)); cards.add(new SetCardInfo("Mystic Might", 86, Rarity.RARE, mage.cards.m.MysticMight.class)); cards.add(new SetCardInfo("Mystic Remora", 87, Rarity.COMMON, mage.cards.m.MysticRemora.class)); - cards.add(new SetCardInfo("Nacre Talisman", 304, Rarity.UNCOMMON, mage.cards.n.NacreTalisman.class)); - cards.add(new SetCardInfo("Naked Singularity", 305, Rarity.RARE, mage.cards.n.NakedSingularity.class)); - cards.add(new SetCardInfo("Nature's Lore", 143, Rarity.UNCOMMON, mage.cards.n.NaturesLore.class)); - cards.add(new SetCardInfo("Necropotence", 42, Rarity.RARE, mage.cards.n.Necropotence.class)); - cards.add(new SetCardInfo("Norritt", 43, Rarity.COMMON, mage.cards.n.Norritt.class)); - cards.add(new SetCardInfo("Onyx Talisman", 306, Rarity.UNCOMMON, mage.cards.o.OnyxTalisman.class)); + cards.add(new SetCardInfo("Nacre Talisman", 329, Rarity.UNCOMMON, mage.cards.n.NacreTalisman.class)); + cards.add(new SetCardInfo("Naked Singularity", 330, Rarity.RARE, mage.cards.n.NakedSingularity.class)); + cards.add(new SetCardInfo("Nature's Lore", 255, Rarity.UNCOMMON, mage.cards.n.NaturesLore.class)); + cards.add(new SetCardInfo("Necropotence", 154, Rarity.RARE, mage.cards.n.Necropotence.class)); + cards.add(new SetCardInfo("Norritt", 155, Rarity.COMMON, mage.cards.n.Norritt.class)); + cards.add(new SetCardInfo("Onyx Talisman", 331, Rarity.UNCOMMON, mage.cards.o.OnyxTalisman.class)); cards.add(new SetCardInfo("Orcish Cannoneers", 205, Rarity.UNCOMMON, mage.cards.o.OrcishCannoneers.class)); cards.add(new SetCardInfo("Orcish Healer", 208, Rarity.UNCOMMON, mage.cards.o.OrcishHealer.class)); cards.add(new SetCardInfo("Orcish Librarian", 209, Rarity.RARE, mage.cards.o.OrcishLibrarian.class)); cards.add(new SetCardInfo("Orcish Lumberjack", 210, Rarity.COMMON, mage.cards.o.OrcishLumberjack.class)); cards.add(new SetCardInfo("Orcish Squatters", 211, Rarity.RARE, mage.cards.o.OrcishSquatters.class)); - cards.add(new SetCardInfo("Order of the Sacred Torch", 269, Rarity.RARE, mage.cards.o.OrderOfTheSacredTorch.class)); - cards.add(new SetCardInfo("Order of the White Shield", 270, Rarity.UNCOMMON, mage.cards.o.OrderOfTheWhiteShield.class)); - cards.add(new SetCardInfo("Pale Bears", 144, Rarity.RARE, mage.cards.p.PaleBears.class)); + cards.add(new SetCardInfo("Order of the Sacred Torch", 45, Rarity.RARE, mage.cards.o.OrderOfTheSacredTorch.class)); + cards.add(new SetCardInfo("Order of the White Shield", 46, Rarity.UNCOMMON, mage.cards.o.OrderOfTheWhiteShield.class)); + cards.add(new SetCardInfo("Pale Bears", 256, Rarity.RARE, mage.cards.p.PaleBears.class)); cards.add(new SetCardInfo("Panic", 212, Rarity.COMMON, mage.cards.p.Panic.class)); - cards.add(new SetCardInfo("Pentagram of the Ages", 307, Rarity.RARE, mage.cards.p.PentagramOfTheAges.class)); - cards.add(new SetCardInfo("Pestilence Rats", 45, Rarity.COMMON, mage.cards.p.PestilenceRats.class)); - cards.add(new SetCardInfo("Pit Trap", 308, Rarity.UNCOMMON, mage.cards.p.PitTrap.class)); - cards.add(new SetCardInfo("Plains", 343, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Plains", 344, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Plains", 345, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Pentagram of the Ages", 332, Rarity.RARE, mage.cards.p.PentagramOfTheAges.class)); + cards.add(new SetCardInfo("Pestilence Rats", 157, Rarity.COMMON, mage.cards.p.PestilenceRats.class)); + cards.add(new SetCardInfo("Pit Trap", 333, Rarity.UNCOMMON, mage.cards.p.PitTrap.class)); + cards.add(new SetCardInfo("Plains", 364, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Plains", 365, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Plains", 366, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Polar Kraken", 89, Rarity.RARE, mage.cards.p.PolarKraken.class)); cards.add(new SetCardInfo("Portent", 90, Rarity.COMMON, mage.cards.p.Portent.class)); cards.add(new SetCardInfo("Power Sink", 91, Rarity.COMMON, mage.cards.p.PowerSink.class)); - cards.add(new SetCardInfo("Pox", 46, Rarity.RARE, mage.cards.p.Pox.class)); - cards.add(new SetCardInfo("Prismatic Ward", 271, Rarity.COMMON, mage.cards.p.PrismaticWard.class)); - cards.add(new SetCardInfo("Pygmy Allosaurus", 145, Rarity.RARE, mage.cards.p.PygmyAllosaurus.class)); - cards.add(new SetCardInfo("Pyknite", 146, Rarity.COMMON, mage.cards.p.Pyknite.class)); + cards.add(new SetCardInfo("Pox", 158, Rarity.RARE, mage.cards.p.Pox.class)); + cards.add(new SetCardInfo("Prismatic Ward", 47, Rarity.COMMON, mage.cards.p.PrismaticWard.class)); + cards.add(new SetCardInfo("Pygmy Allosaurus", 257, Rarity.RARE, mage.cards.p.PygmyAllosaurus.class)); + cards.add(new SetCardInfo("Pyknite", 258, Rarity.COMMON, mage.cards.p.Pyknite.class)); cards.add(new SetCardInfo("Pyroblast", 213, Rarity.COMMON, mage.cards.p.Pyroblast.class)); cards.add(new SetCardInfo("Pyroclasm", 214, Rarity.UNCOMMON, mage.cards.p.Pyroclasm.class)); - cards.add(new SetCardInfo("Rally", 272, Rarity.COMMON, mage.cards.r.Rally.class)); + cards.add(new SetCardInfo("Rally", 48, Rarity.COMMON, mage.cards.r.Rally.class)); cards.add(new SetCardInfo("Ray of Command", 92, Rarity.COMMON, mage.cards.r.RayOfCommand.class)); cards.add(new SetCardInfo("Ray of Erasure", 93, Rarity.COMMON, mage.cards.r.RayOfErasure.class)); cards.add(new SetCardInfo("Reality Twist", 94, Rarity.RARE, mage.cards.r.RealityTwist.class)); - cards.add(new SetCardInfo("Reclamation", 378, Rarity.RARE, mage.cards.r.Reclamation.class)); - cards.add(new SetCardInfo("Red Scarab", 273, Rarity.UNCOMMON, mage.cards.r.RedScarab.class)); - cards.add(new SetCardInfo("Regeneration", 147, Rarity.COMMON, mage.cards.r.Regeneration.class)); - cards.add(new SetCardInfo("Rime Dryad", 148, Rarity.COMMON, mage.cards.r.RimeDryad.class)); - cards.add(new SetCardInfo("Ritual of Subdual", 149, Rarity.RARE, mage.cards.r.RitualOfSubdual.class)); - cards.add(new SetCardInfo("River Delta", 346, Rarity.RARE, mage.cards.r.RiverDelta.class)); + cards.add(new SetCardInfo("Reclamation", 300, Rarity.RARE, mage.cards.r.Reclamation.class)); + cards.add(new SetCardInfo("Red Scarab", 49, Rarity.UNCOMMON, mage.cards.r.RedScarab.class)); + cards.add(new SetCardInfo("Regeneration", 259, Rarity.COMMON, mage.cards.r.Regeneration.class)); + cards.add(new SetCardInfo("Rime Dryad", 260, Rarity.COMMON, mage.cards.r.RimeDryad.class)); + cards.add(new SetCardInfo("Ritual of Subdual", 261, Rarity.RARE, mage.cards.r.RitualOfSubdual.class)); + cards.add(new SetCardInfo("River Delta", 359, Rarity.RARE, mage.cards.r.RiverDelta.class)); cards.add(new SetCardInfo("Sabretooth Tiger", 215, Rarity.COMMON, mage.cards.s.SabretoothTiger.class)); - cards.add(new SetCardInfo("Scaled Wurm", 150, Rarity.COMMON, mage.cards.s.ScaledWurm.class)); + cards.add(new SetCardInfo("Scaled Wurm", 262, Rarity.COMMON, mage.cards.s.ScaledWurm.class)); cards.add(new SetCardInfo("Sea Spirit", 95, Rarity.UNCOMMON, mage.cards.s.SeaSpirit.class)); - cards.add(new SetCardInfo("Seizures", 47, Rarity.COMMON, mage.cards.s.Seizures.class)); - cards.add(new SetCardInfo("Shambling Strider", 151, Rarity.COMMON, mage.cards.s.ShamblingStrider.class)); + cards.add(new SetCardInfo("Seizures", 159, Rarity.COMMON, mage.cards.s.Seizures.class)); + cards.add(new SetCardInfo("Shambling Strider", 263, Rarity.COMMON, mage.cards.s.ShamblingStrider.class)); cards.add(new SetCardInfo("Shatter", 216, Rarity.COMMON, mage.cards.s.Shatter.class)); - cards.add(new SetCardInfo("Shield Bearer", 276, Rarity.COMMON, mage.cards.s.ShieldBearer.class)); - cards.add(new SetCardInfo("Shield of the Ages", 310, Rarity.UNCOMMON, mage.cards.s.ShieldOfTheAges.class)); + cards.add(new SetCardInfo("Shield Bearer", 52, Rarity.COMMON, mage.cards.s.ShieldBearer.class)); + cards.add(new SetCardInfo("Shield of the Ages", 335, Rarity.UNCOMMON, mage.cards.s.ShieldOfTheAges.class)); cards.add(new SetCardInfo("Shyft", 96, Rarity.RARE, mage.cards.s.Shyft.class)); cards.add(new SetCardInfo("Sibilant Spirit", 97, Rarity.RARE, mage.cards.s.SibilantSpirit.class)); cards.add(new SetCardInfo("Silver Erne", 98, Rarity.UNCOMMON, mage.cards.s.SilverErne.class)); - cards.add(new SetCardInfo("Skeleton Ship", 379, Rarity.RARE, mage.cards.s.SkeletonShip.class)); - cards.add(new SetCardInfo("Skull Catapult", 311, Rarity.UNCOMMON, mage.cards.s.SkullCatapult.class)); - cards.add(new SetCardInfo("Snow Fortress", 312, Rarity.RARE, mage.cards.s.SnowFortress.class)); - cards.add(new SetCardInfo("Snow-Covered Forest", 347, Rarity.LAND, mage.cards.s.SnowCoveredForest.class)); - cards.add(new SetCardInfo("Snow-Covered Island", 348, Rarity.LAND, mage.cards.s.SnowCoveredIsland.class)); - cards.add(new SetCardInfo("Snow-Covered Mountain", 349, Rarity.LAND, mage.cards.s.SnowCoveredMountain.class)); - cards.add(new SetCardInfo("Snow-Covered Plains", 350, Rarity.LAND, mage.cards.s.SnowCoveredPlains.class)); - cards.add(new SetCardInfo("Snow-Covered Swamp", 351, Rarity.LAND, mage.cards.s.SnowCoveredSwamp.class)); - cards.add(new SetCardInfo("Snow Hound", 277, Rarity.UNCOMMON, mage.cards.s.SnowHound.class)); - cards.add(new SetCardInfo("Soldevi Golem", 313, Rarity.RARE, mage.cards.s.SoldeviGolem.class)); + cards.add(new SetCardInfo("Skeleton Ship", 301, Rarity.RARE, mage.cards.s.SkeletonShip.class)); + cards.add(new SetCardInfo("Skull Catapult", 336, Rarity.UNCOMMON, mage.cards.s.SkullCatapult.class)); + cards.add(new SetCardInfo("Snow Fortress", 337, Rarity.RARE, mage.cards.s.SnowFortress.class)); + cards.add(new SetCardInfo("Snow Hound", 53, Rarity.UNCOMMON, mage.cards.s.SnowHound.class)); + cards.add(new SetCardInfo("Snow-Covered Forest", 383, Rarity.LAND, mage.cards.s.SnowCoveredForest.class)); + cards.add(new SetCardInfo("Snow-Covered Island", 371, Rarity.LAND, mage.cards.s.SnowCoveredIsland.class)); + cards.add(new SetCardInfo("Snow-Covered Mountain", 379, Rarity.LAND, mage.cards.s.SnowCoveredMountain.class)); + cards.add(new SetCardInfo("Snow-Covered Plains", 367, Rarity.LAND, mage.cards.s.SnowCoveredPlains.class)); + cards.add(new SetCardInfo("Snow-Covered Swamp", 372, Rarity.LAND, mage.cards.s.SnowCoveredSwamp.class)); + cards.add(new SetCardInfo("Soldevi Golem", 338, Rarity.RARE, mage.cards.s.SoldeviGolem.class)); cards.add(new SetCardInfo("Soldevi Machinist", 102, Rarity.UNCOMMON, mage.cards.s.SoldeviMachinist.class)); - cards.add(new SetCardInfo("Soldevi Simulacrum", 314, Rarity.UNCOMMON, mage.cards.s.SoldeviSimulacrum.class)); - cards.add(new SetCardInfo("Songs of the Damned", 48, Rarity.COMMON, mage.cards.s.SongsOfTheDamned.class)); + cards.add(new SetCardInfo("Soldevi Simulacrum", 339, Rarity.UNCOMMON, mage.cards.s.SoldeviSimulacrum.class)); + cards.add(new SetCardInfo("Songs of the Damned", 160, Rarity.COMMON, mage.cards.s.SongsOfTheDamned.class)); cards.add(new SetCardInfo("Soul Barrier", 103, Rarity.UNCOMMON, mage.cards.s.SoulBarrier.class)); - cards.add(new SetCardInfo("Soul Burn", 49, Rarity.COMMON, mage.cards.s.SoulBurn.class)); - cards.add(new SetCardInfo("Soul Kiss", 50, Rarity.COMMON, mage.cards.s.SoulKiss.class)); - cards.add(new SetCardInfo("Spoils of Evil", 51, Rarity.RARE, mage.cards.s.SpoilsOfEvil.class)); - cards.add(new SetCardInfo("Staff of the Ages", 315, Rarity.RARE, mage.cards.s.StaffOfTheAges.class)); - cards.add(new SetCardInfo("Stampede", 153, Rarity.RARE, mage.cards.s.Stampede.class)); - cards.add(new SetCardInfo("Stonehands", 219, Rarity.COMMON, mage.cards.s.Stonehands.class)); + cards.add(new SetCardInfo("Soul Burn", 161, Rarity.COMMON, mage.cards.s.SoulBurn.class)); + cards.add(new SetCardInfo("Soul Kiss", 162, Rarity.COMMON, mage.cards.s.SoulKiss.class)); + cards.add(new SetCardInfo("Spoils of Evil", 163, Rarity.RARE, mage.cards.s.SpoilsOfEvil.class)); + cards.add(new SetCardInfo("Staff of the Ages", 340, Rarity.RARE, mage.cards.s.StaffOfTheAges.class)); + cards.add(new SetCardInfo("Stampede", 265, Rarity.RARE, mage.cards.s.Stampede.class)); cards.add(new SetCardInfo("Stone Rain", 217, Rarity.COMMON, mage.cards.s.StoneRain.class)); cards.add(new SetCardInfo("Stone Spirit", 218, Rarity.UNCOMMON, mage.cards.s.StoneSpirit.class)); - cards.add(new SetCardInfo("Stormbind", 382, Rarity.RARE, mage.cards.s.Stormbind.class)); - cards.add(new SetCardInfo("Storm Spirit", 381, Rarity.RARE, mage.cards.s.StormSpirit.class)); - cards.add(new SetCardInfo("Stromgald Cabal", 54, Rarity.RARE, mage.cards.s.StromgaldCabal.class)); - cards.add(new SetCardInfo("Stunted Growth", 154, Rarity.RARE, mage.cards.s.StuntedGrowth.class)); - cards.add(new SetCardInfo("Sulfurous Springs", 352, Rarity.RARE, mage.cards.s.SulfurousSprings.class)); - cards.add(new SetCardInfo("Sunstone", 316, Rarity.UNCOMMON, mage.cards.s.Sunstone.class)); - cards.add(new SetCardInfo("Swamp", 353, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Swamp", 354, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Swamp", 355, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Swords to Plowshares", 278, Rarity.UNCOMMON, mage.cards.s.SwordsToPlowshares.class)); - cards.add(new SetCardInfo("Tarpan", 155, Rarity.COMMON, mage.cards.t.Tarpan.class)); - cards.add(new SetCardInfo("Thermokarst", 156, Rarity.UNCOMMON, mage.cards.t.Thermokarst.class)); - cards.add(new SetCardInfo("Thoughtleech", 157, Rarity.UNCOMMON, mage.cards.t.Thoughtleech.class)); + cards.add(new SetCardInfo("Stonehands", 219, Rarity.COMMON, mage.cards.s.Stonehands.class)); + cards.add(new SetCardInfo("Storm Spirit", 303, Rarity.RARE, mage.cards.s.StormSpirit.class)); + cards.add(new SetCardInfo("Stormbind", 304, Rarity.RARE, mage.cards.s.Stormbind.class)); + cards.add(new SetCardInfo("Stromgald Cabal", 166, Rarity.RARE, mage.cards.s.StromgaldCabal.class)); + cards.add(new SetCardInfo("Stunted Growth", 266, Rarity.RARE, mage.cards.s.StuntedGrowth.class)); + cards.add(new SetCardInfo("Sulfurous Springs", 360, Rarity.RARE, mage.cards.s.SulfurousSprings.class)); + cards.add(new SetCardInfo("Sunstone", 341, Rarity.UNCOMMON, mage.cards.s.Sunstone.class)); + cards.add(new SetCardInfo("Swamp", 373, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 374, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 375, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swords to Plowshares", 54, Rarity.UNCOMMON, mage.cards.s.SwordsToPlowshares.class)); + cards.add(new SetCardInfo("Tarpan", 267, Rarity.COMMON, mage.cards.t.Tarpan.class)); + cards.add(new SetCardInfo("Thermokarst", 268, Rarity.UNCOMMON, mage.cards.t.Thermokarst.class)); + cards.add(new SetCardInfo("Thoughtleech", 269, Rarity.UNCOMMON, mage.cards.t.Thoughtleech.class)); cards.add(new SetCardInfo("Thunder Wall", 104, Rarity.UNCOMMON, mage.cards.t.ThunderWall.class)); - cards.add(new SetCardInfo("Timberline Ridge", 356, Rarity.RARE, mage.cards.t.TimberlineRidge.class)); - cards.add(new SetCardInfo("Time Bomb", 317, Rarity.RARE, mage.cards.t.TimeBomb.class)); - cards.add(new SetCardInfo("Tinder Wall", 158, Rarity.COMMON, mage.cards.t.TinderWall.class)); + cards.add(new SetCardInfo("Timberline Ridge", 361, Rarity.RARE, mage.cards.t.TimberlineRidge.class)); + cards.add(new SetCardInfo("Time Bomb", 342, Rarity.RARE, mage.cards.t.TimeBomb.class)); + cards.add(new SetCardInfo("Tinder Wall", 270, Rarity.COMMON, mage.cards.t.TinderWall.class)); cards.add(new SetCardInfo("Tor Giant", 220, Rarity.COMMON, mage.cards.t.TorGiant.class)); cards.add(new SetCardInfo("Total War", 221, Rarity.RARE, mage.cards.t.TotalWar.class)); cards.add(new SetCardInfo("Touch of Death", 167, Rarity.COMMON, mage.cards.t.TouchOfDeath.class)); - cards.add(new SetCardInfo("Trailblazer", 160, Rarity.RARE, mage.cards.t.Trailblazer.class)); - cards.add(new SetCardInfo("Underground River", 357, Rarity.RARE, mage.cards.u.UndergroundRiver.class)); + cards.add(new SetCardInfo("Trailblazer", 272, Rarity.RARE, mage.cards.t.Trailblazer.class)); + cards.add(new SetCardInfo("Underground River", 362, Rarity.RARE, mage.cards.u.UndergroundRiver.class)); cards.add(new SetCardInfo("Updraft", 105, Rarity.UNCOMMON, mage.cards.u.Updraft.class)); - cards.add(new SetCardInfo("Urza's Bauble", 318, Rarity.UNCOMMON, mage.cards.u.UrzasBauble.class)); - cards.add(new SetCardInfo("Veldt", 358, Rarity.RARE, mage.cards.v.Veldt.class)); - cards.add(new SetCardInfo("Venomous Breath", 161, Rarity.UNCOMMON, mage.cards.v.VenomousBreath.class)); + cards.add(new SetCardInfo("Urza's Bauble", 343, Rarity.UNCOMMON, mage.cards.u.UrzasBauble.class)); + cards.add(new SetCardInfo("Veldt", 363, Rarity.RARE, mage.cards.v.Veldt.class)); + cards.add(new SetCardInfo("Venomous Breath", 273, Rarity.UNCOMMON, mage.cards.v.VenomousBreath.class)); cards.add(new SetCardInfo("Vertigo", 222, Rarity.UNCOMMON, mage.cards.v.Vertigo.class)); - cards.add(new SetCardInfo("Vexing Arcanix", 319, Rarity.RARE, mage.cards.v.VexingArcanix.class)); - cards.add(new SetCardInfo("Vibrating Sphere", 320, Rarity.RARE, mage.cards.v.VibratingSphere.class)); - cards.add(new SetCardInfo("Walking Wall", 321, Rarity.UNCOMMON, mage.cards.w.WalkingWall.class)); + cards.add(new SetCardInfo("Vexing Arcanix", 344, Rarity.RARE, mage.cards.v.VexingArcanix.class)); + cards.add(new SetCardInfo("Vibrating Sphere", 345, Rarity.RARE, mage.cards.v.VibratingSphere.class)); + cards.add(new SetCardInfo("Walking Wall", 346, Rarity.UNCOMMON, mage.cards.w.WalkingWall.class)); cards.add(new SetCardInfo("Wall of Lava", 223, Rarity.UNCOMMON, mage.cards.w.WallOfLava.class)); - cards.add(new SetCardInfo("Wall of Pine Needles", 162, Rarity.UNCOMMON, mage.cards.w.WallOfPineNeedles.class)); - cards.add(new SetCardInfo("Wall of Shields", 322, Rarity.UNCOMMON, mage.cards.w.WallOfShields.class)); - cards.add(new SetCardInfo("War Chariot", 323, Rarity.UNCOMMON, mage.cards.w.WarChariot.class)); + cards.add(new SetCardInfo("Wall of Pine Needles", 274, Rarity.UNCOMMON, mage.cards.w.WallOfPineNeedles.class)); + cards.add(new SetCardInfo("Wall of Shields", 347, Rarity.UNCOMMON, mage.cards.w.WallOfShields.class)); + cards.add(new SetCardInfo("War Chariot", 348, Rarity.UNCOMMON, mage.cards.w.WarChariot.class)); cards.add(new SetCardInfo("Warning", 55, Rarity.COMMON, mage.cards.w.Warning.class)); - cards.add(new SetCardInfo("Whiteout", 163, Rarity.UNCOMMON, mage.cards.w.Whiteout.class)); - cards.add(new SetCardInfo("White Scarab", 280, Rarity.UNCOMMON, mage.cards.w.WhiteScarab.class)); - cards.add(new SetCardInfo("Wild Growth", 165, Rarity.COMMON, mage.cards.w.WildGrowth.class)); + cards.add(new SetCardInfo("White Scarab", 56, Rarity.UNCOMMON, mage.cards.w.WhiteScarab.class)); + cards.add(new SetCardInfo("Whiteout", 275, Rarity.UNCOMMON, mage.cards.w.Whiteout.class)); + cards.add(new SetCardInfo("Wild Growth", 277, Rarity.COMMON, mage.cards.w.WildGrowth.class)); cards.add(new SetCardInfo("Wind Spirit", 106, Rarity.UNCOMMON, mage.cards.w.WindSpirit.class)); - cards.add(new SetCardInfo("Wings of Aesthir", 383, Rarity.UNCOMMON, mage.cards.w.WingsOfAesthir.class)); - cards.add(new SetCardInfo("Withering Wisps", 56, Rarity.UNCOMMON, mage.cards.w.WitheringWisps.class)); - cards.add(new SetCardInfo("Woolly Mammoths", 166, Rarity.COMMON, mage.cards.w.WoollyMammoths.class)); + cards.add(new SetCardInfo("Wings of Aesthir", 305, Rarity.UNCOMMON, mage.cards.w.WingsOfAesthir.class)); + cards.add(new SetCardInfo("Withering Wisps", 168, Rarity.UNCOMMON, mage.cards.w.WitheringWisps.class)); + cards.add(new SetCardInfo("Woolly Mammoths", 278, Rarity.COMMON, mage.cards.w.WoollyMammoths.class)); cards.add(new SetCardInfo("Woolly Spider", 279, Rarity.COMMON, mage.cards.w.WoollySpider.class)); cards.add(new SetCardInfo("Word of Blasting", 224, Rarity.UNCOMMON, mage.cards.w.WordOfBlasting.class)); cards.add(new SetCardInfo("Word of Undoing", 108, Rarity.COMMON, mage.cards.w.WordOfUndoing.class)); cards.add(new SetCardInfo("Wrath of Marit Lage", 109, Rarity.RARE, mage.cards.w.WrathOfMaritLage.class)); - cards.add(new SetCardInfo("Yavimaya Gnats", 168, Rarity.UNCOMMON, mage.cards.y.YavimayaGnats.class)); - cards.add(new SetCardInfo("Zuran Enchanter", 110, Rarity.COMMON, mage.cards.z.ZuranEnchanter.class)); - cards.add(new SetCardInfo("Zuran Orb", 325, Rarity.UNCOMMON, mage.cards.z.ZuranOrb.class)); - cards.add(new SetCardInfo("Zuran Spellcaster", 111, Rarity.COMMON, mage.cards.z.ZuranSpellcaster.class)); - cards.add(new SetCardInfo("Zur's Weirding", 112, Rarity.RARE, mage.cards.z.ZursWeirding.class)); + cards.add(new SetCardInfo("Yavimaya Gnats", 280, Rarity.UNCOMMON, mage.cards.y.YavimayaGnats.class)); + cards.add(new SetCardInfo("Zur's Weirding", 110, Rarity.RARE, mage.cards.z.ZursWeirding.class)); + cards.add(new SetCardInfo("Zuran Enchanter", 111, Rarity.COMMON, mage.cards.z.ZuranEnchanter.class)); + cards.add(new SetCardInfo("Zuran Orb", 350, Rarity.UNCOMMON, mage.cards.z.ZuranOrb.class)); + cards.add(new SetCardInfo("Zuran Spellcaster", 112, Rarity.COMMON, mage.cards.z.ZuranSpellcaster.class)); } } From 9f7482bdf730396338a473742ebd98fcbc342c9e Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Thu, 10 May 2018 11:23:55 +0400 Subject: [PATCH 129/158] Fixed card numbers in HML - Homelands (#4628) --- Mage.Sets/src/mage/sets/Homelands.java | 250 ++++++++++++------------- 1 file changed, 125 insertions(+), 125 deletions(-) diff --git a/Mage.Sets/src/mage/sets/Homelands.java b/Mage.Sets/src/mage/sets/Homelands.java index 7439c7568c6..28a764fa8ea 100644 --- a/Mage.Sets/src/mage/sets/Homelands.java +++ b/Mage.Sets/src/mage/sets/Homelands.java @@ -64,130 +64,130 @@ public class Homelands extends ExpansionSet { this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; - cards.add(new SetCardInfo("Aether Storm", 26, Rarity.UNCOMMON, mage.cards.a.AetherStorm.class)); - cards.add(new SetCardInfo("Abbey Gargoyles", 101, Rarity.UNCOMMON, mage.cards.a.AbbeyGargoyles.class)); - cards.add(new SetCardInfo("Abbey Matron", 102, Rarity.COMMON, AbbeyMatron.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Abbey Matron", 103, Rarity.COMMON, AbbeyMatron.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Aliban's Tower", 76, Rarity.COMMON, AlibansTower.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Aliban's Tower", 77, Rarity.COMMON, AlibansTower.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Ambush", 78, Rarity.COMMON, mage.cards.a.Ambush.class)); - cards.add(new SetCardInfo("Ambush Party", 79, Rarity.COMMON, mage.cards.a.AmbushParty.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Ambush Party", 80, Rarity.COMMON, mage.cards.a.AmbushParty.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Anaba Ancestor", 81, Rarity.RARE, mage.cards.a.AnabaAncestor.class)); - cards.add(new SetCardInfo("Anaba Bodyguard", 82, Rarity.COMMON, mage.cards.a.AnabaBodyguard.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Anaba Bodyguard", 83, Rarity.COMMON, mage.cards.a.AnabaBodyguard.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Anaba Shaman", 84, Rarity.COMMON, mage.cards.a.AnabaShaman.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Anaba Shaman", 85, Rarity.COMMON, mage.cards.a.AnabaShaman.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Anaba Spirit Crafter", 86, Rarity.RARE, mage.cards.a.AnabaSpiritCrafter.class)); - cards.add(new SetCardInfo("An-Havva Constable", 51, Rarity.RARE, mage.cards.a.AnHavvaConstable.class)); - cards.add(new SetCardInfo("An-Havva Inn", 52, Rarity.UNCOMMON, mage.cards.a.AnHavvaInn.class)); - cards.add(new SetCardInfo("An-Havva Township", 136, Rarity.UNCOMMON, mage.cards.a.AnHavvaTownship.class)); - cards.add(new SetCardInfo("An-Zerrin Ruins", 87, Rarity.RARE, mage.cards.a.AnZerrinRuins.class)); - cards.add(new SetCardInfo("Apocalypse Chime", 126, Rarity.RARE, mage.cards.a.ApocalypseChime.class)); - cards.add(new SetCardInfo("Autumn Willow", 53, Rarity.RARE, mage.cards.a.AutumnWillow.class)); - cards.add(new SetCardInfo("Aysen Abbey", 137, Rarity.UNCOMMON, mage.cards.a.AysenAbbey.class)); - cards.add(new SetCardInfo("Aysen Bureaucrats", 104, Rarity.COMMON, mage.cards.a.AysenBureaucrats.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Aysen Bureaucrats", 105, Rarity.COMMON, mage.cards.a.AysenBureaucrats.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Aysen Crusader", 106, Rarity.RARE, mage.cards.a.AysenCrusader.class)); - cards.add(new SetCardInfo("Aysen Highway", 107, Rarity.RARE, mage.cards.a.AysenHighway.class)); - cards.add(new SetCardInfo("Baki's Curse", 27, Rarity.RARE, mage.cards.b.BakisCurse.class)); - cards.add(new SetCardInfo("Baron Sengir", 1, Rarity.RARE, mage.cards.b.BaronSengir.class)); - cards.add(new SetCardInfo("Beast Walkers", 108, Rarity.RARE, mage.cards.b.BeastWalkers.class)); - cards.add(new SetCardInfo("Black Carriage", 2, Rarity.RARE, mage.cards.b.BlackCarriage.class)); - cards.add(new SetCardInfo("Broken Visage", 3, Rarity.RARE, mage.cards.b.BrokenVisage.class)); - cards.add(new SetCardInfo("Carapace", 54, Rarity.COMMON, mage.cards.c.Carapace.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Carapace", 55, Rarity.COMMON, mage.cards.c.Carapace.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Castle Sengir", 138, Rarity.UNCOMMON, mage.cards.c.CastleSengir.class)); - cards.add(new SetCardInfo("Cemetery Gate", 4, Rarity.COMMON, CemeteryGate.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Cemetery Gate", 5, Rarity.COMMON, CemeteryGate.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Chain Stasis", 28, Rarity.RARE, mage.cards.c.ChainStasis.class)); - cards.add(new SetCardInfo("Chandler", 88, Rarity.COMMON, mage.cards.c.Chandler.class)); - cards.add(new SetCardInfo("Clockwork Gnomes", 127, Rarity.COMMON, mage.cards.c.ClockworkGnomes.class)); - cards.add(new SetCardInfo("Clockwork Steed", 128, Rarity.UNCOMMON, mage.cards.c.ClockworkSteed.class)); - cards.add(new SetCardInfo("Clockwork Swarm", 129, Rarity.COMMON, mage.cards.c.ClockworkSwarm.class)); - cards.add(new SetCardInfo("Coral Reef", 29, Rarity.COMMON, mage.cards.c.CoralReef.class)); - cards.add(new SetCardInfo("Dark Maze", 30, Rarity.COMMON, mage.cards.d.DarkMaze.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Dark Maze", 31, Rarity.COMMON, mage.cards.d.DarkMaze.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Daughter of Autumn", 56, Rarity.RARE, mage.cards.d.DaughterOfAutumn.class)); - cards.add(new SetCardInfo("Death Speakers", 109, Rarity.UNCOMMON, mage.cards.d.DeathSpeakers.class)); - cards.add(new SetCardInfo("Didgeridoo", 130, Rarity.RARE, mage.cards.d.Didgeridoo.class)); - cards.add(new SetCardInfo("Drudge Spell", 6, Rarity.UNCOMMON, mage.cards.d.DrudgeSpell.class)); - cards.add(new SetCardInfo("Dry Spell", 7, Rarity.COMMON, DrySpell.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Dry Spell", 8, Rarity.COMMON, DrySpell.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Dwarven Pony", 89, Rarity.RARE, mage.cards.d.DwarvenPony.class)); - cards.add(new SetCardInfo("Dwarven Trader", 91, Rarity.COMMON, DwarvenTrader.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Dwarven Trader", 92, Rarity.COMMON, DwarvenTrader.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Ebony Rhino", 131, Rarity.COMMON, mage.cards.e.EbonyRhino.class)); - cards.add(new SetCardInfo("Eron the Relentless", 93, Rarity.UNCOMMON, mage.cards.e.EronTheRelentless.class)); - cards.add(new SetCardInfo("Evaporate", 94, Rarity.UNCOMMON, mage.cards.e.Evaporate.class)); - cards.add(new SetCardInfo("Faerie Noble", 57, Rarity.RARE, mage.cards.f.FaerieNoble.class)); - cards.add(new SetCardInfo("Feast of the Unicorn", 9, Rarity.COMMON, FeastOfTheUnicorn.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Feast of the Unicorn", 10, Rarity.COMMON, FeastOfTheUnicorn.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Feroz's Ban", 132, Rarity.RARE, mage.cards.f.FerozsBan.class)); - cards.add(new SetCardInfo("Folk of An-Havva", 58, Rarity.COMMON, FolkOfAnHavva.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Folk of An-Havva", 59, Rarity.COMMON, FolkOfAnHavva.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Forget", 32, Rarity.RARE, mage.cards.f.Forget.class)); - cards.add(new SetCardInfo("Funeral March", 11, Rarity.UNCOMMON, mage.cards.f.FuneralMarch.class)); - cards.add(new SetCardInfo("Ghost Hounds", 12, Rarity.UNCOMMON, mage.cards.g.GhostHounds.class)); - cards.add(new SetCardInfo("Grandmother Sengir", 13, Rarity.RARE, mage.cards.g.GrandmotherSengir.class)); - cards.add(new SetCardInfo("Greater Werewolf", 14, Rarity.UNCOMMON, mage.cards.g.GreaterWerewolf.class)); - cards.add(new SetCardInfo("Hazduhr the Abbot", 110, Rarity.RARE, mage.cards.h.HazduhrTheAbbot.class)); - cards.add(new SetCardInfo("Headstone", 15, Rarity.COMMON, mage.cards.h.Headstone.class)); - cards.add(new SetCardInfo("Hungry Mist", 60, Rarity.COMMON, mage.cards.h.HungryMist.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Hungry Mist", 61, Rarity.COMMON, mage.cards.h.HungryMist.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Ihsan's Shade", 16, Rarity.UNCOMMON, mage.cards.i.IhsansShade.class)); - cards.add(new SetCardInfo("Irini Sengir", 17, Rarity.UNCOMMON, mage.cards.i.IriniSengir.class)); - cards.add(new SetCardInfo("Ironclaw Curse", 96, Rarity.RARE, mage.cards.i.IronclawCurse.class)); - cards.add(new SetCardInfo("Jinx", 36, Rarity.COMMON, mage.cards.j.Jinx.class)); - cards.add(new SetCardInfo("Joven", 97, Rarity.COMMON, mage.cards.j.Joven.class)); - cards.add(new SetCardInfo("Joven's Tools", 133, Rarity.UNCOMMON, mage.cards.j.JovensTools.class)); - cards.add(new SetCardInfo("Koskun Falls", 18, Rarity.RARE, mage.cards.k.KoskunFalls.class)); - cards.add(new SetCardInfo("Koskun Keep", 139, Rarity.UNCOMMON, mage.cards.k.KoskunKeep.class)); - cards.add(new SetCardInfo("Labyrinth Minotaur", 38, Rarity.COMMON, mage.cards.l.LabyrinthMinotaur.class)); - cards.add(new SetCardInfo("Leaping Lizard", 63, Rarity.COMMON, mage.cards.l.LeapingLizard.class)); - cards.add(new SetCardInfo("Leeches", 111, Rarity.RARE, mage.cards.l.Leeches.class)); - cards.add(new SetCardInfo("Mammoth Harness", 64, Rarity.RARE, mage.cards.m.MammothHarness.class)); - cards.add(new SetCardInfo("Marjhan", 39, Rarity.RARE, mage.cards.m.Marjhan.class)); - cards.add(new SetCardInfo("Memory Lapse", 40, Rarity.COMMON, mage.cards.m.MemoryLapse.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Memory Lapse", 41, Rarity.COMMON, mage.cards.m.MemoryLapse.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Merchant Scroll", 42, Rarity.COMMON, mage.cards.m.MerchantScroll.class)); - cards.add(new SetCardInfo("Mesa Falcon", 112, Rarity.COMMON, MesaFalcon.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mesa Falcon", 113, Rarity.COMMON, MesaFalcon.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mystic Decree", 43, Rarity.RARE, mage.cards.m.MysticDecree.class)); - cards.add(new SetCardInfo("Narwhal", 44, Rarity.RARE, mage.cards.n.Narwhal.class)); - cards.add(new SetCardInfo("Primal Order", 65, Rarity.RARE, mage.cards.p.PrimalOrder.class)); - cards.add(new SetCardInfo("Rashka the Slayer", 115, Rarity.RARE, mage.cards.r.RashkaTheSlayer.class)); - cards.add(new SetCardInfo("Reef Pirates", 45, Rarity.COMMON, ReefPirates.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Reef Pirates", 46, Rarity.COMMON, ReefPirates.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Renewal", 66, Rarity.COMMON, mage.cards.r.Renewal.class)); - cards.add(new SetCardInfo("Retribution", 99, Rarity.UNCOMMON, mage.cards.r.Retribution.class)); - cards.add(new SetCardInfo("Reveka, Wizard Savant", 47, Rarity.RARE, mage.cards.r.RevekaWizardSavant.class)); - cards.add(new SetCardInfo("Roots", 68, Rarity.UNCOMMON, mage.cards.r.Roots.class)); - cards.add(new SetCardInfo("Root Spider", 67, Rarity.UNCOMMON, mage.cards.r.RootSpider.class)); - cards.add(new SetCardInfo("Roterothopter", 134, Rarity.COMMON, mage.cards.r.Roterothopter.class)); - cards.add(new SetCardInfo("Sea Sprite", 48, Rarity.UNCOMMON, mage.cards.s.SeaSprite.class)); - cards.add(new SetCardInfo("Sengir Autocrat", 19, Rarity.UNCOMMON, mage.cards.s.SengirAutocrat.class)); - cards.add(new SetCardInfo("Sengir Bats", 20, Rarity.COMMON, SengirBats.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Sengir Bats", 21, Rarity.COMMON, SengirBats.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Serra Aviary", 118, Rarity.RARE, mage.cards.s.SerraAviary.class)); - cards.add(new SetCardInfo("Serra Bestiary", 119, Rarity.UNCOMMON, mage.cards.s.SerraBestiary.class)); - cards.add(new SetCardInfo("Serra Paladin", 121, Rarity.COMMON, mage.cards.s.SerraPaladin.class)); - cards.add(new SetCardInfo("Serrated Arrows", 135, Rarity.COMMON, mage.cards.s.SerratedArrows.class)); - cards.add(new SetCardInfo("Shrink", 70, Rarity.COMMON, mage.cards.s.Shrink.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Shrink", 71, Rarity.COMMON, mage.cards.s.Shrink.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Soraya the Falconer", 122, Rarity.RARE, mage.cards.s.SorayaTheFalconer.class)); - cards.add(new SetCardInfo("Spectral Bears", 72, Rarity.UNCOMMON, mage.cards.s.SpectralBears.class)); - cards.add(new SetCardInfo("Torture", 23, Rarity.COMMON, Torture.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Torture", 24, Rarity.COMMON, Torture.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Trade Caravan", 123, Rarity.COMMON, mage.cards.t.TradeCaravan.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Trade Caravan", 124, Rarity.COMMON, mage.cards.t.TradeCaravan.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Truce", 125, Rarity.RARE, mage.cards.t.Truce.class)); - cards.add(new SetCardInfo("Veldrane of Sengir", 25, Rarity.RARE, mage.cards.v.VeldraneOfSengir.class)); - cards.add(new SetCardInfo("Wall of Kelp", 50, Rarity.RARE, mage.cards.w.WallOfKelp.class)); - cards.add(new SetCardInfo("Willow Faerie", 73, Rarity.COMMON, WillowFaerie.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Willow Faerie", 74, Rarity.COMMON, WillowFaerie.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Willow Priestess", 75, Rarity.RARE, mage.cards.w.WillowPriestess.class)); - cards.add(new SetCardInfo("Winter Sky", 100, Rarity.RARE, mage.cards.w.WinterSky.class)); - cards.add(new SetCardInfo("Wizards' School", 140, Rarity.UNCOMMON, mage.cards.w.WizardsSchool.class)); + cards.add(new SetCardInfo("Abbey Gargoyles", 1, Rarity.UNCOMMON, mage.cards.a.AbbeyGargoyles.class)); + cards.add(new SetCardInfo("Abbey Matron", "2a", Rarity.COMMON, AbbeyMatron.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Abbey Matron", "2b", Rarity.COMMON, AbbeyMatron.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Aether Storm", 21, Rarity.UNCOMMON, mage.cards.a.AetherStorm.class)); + cards.add(new SetCardInfo("Aliban's Tower", "61a", Rarity.COMMON, AlibansTower.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Aliban's Tower", "61b", Rarity.COMMON, AlibansTower.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Ambush Party", "63a", Rarity.COMMON, mage.cards.a.AmbushParty.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Ambush Party", "63b", Rarity.COMMON, mage.cards.a.AmbushParty.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Ambush", 62, Rarity.COMMON, mage.cards.a.Ambush.class)); + cards.add(new SetCardInfo("An-Havva Constable", 81, Rarity.RARE, mage.cards.a.AnHavvaConstable.class)); + cards.add(new SetCardInfo("An-Havva Inn", 82, Rarity.UNCOMMON, mage.cards.a.AnHavvaInn.class)); + cards.add(new SetCardInfo("An-Havva Township", 111, Rarity.UNCOMMON, mage.cards.a.AnHavvaTownship.class)); + cards.add(new SetCardInfo("An-Zerrin Ruins", 64, Rarity.RARE, mage.cards.a.AnZerrinRuins.class)); + cards.add(new SetCardInfo("Anaba Ancestor", 65, Rarity.RARE, mage.cards.a.AnabaAncestor.class)); + cards.add(new SetCardInfo("Anaba Bodyguard", "66a", Rarity.COMMON, mage.cards.a.AnabaBodyguard.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Anaba Bodyguard", "66b", Rarity.COMMON, mage.cards.a.AnabaBodyguard.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Anaba Shaman", "67a", Rarity.COMMON, mage.cards.a.AnabaShaman.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Anaba Shaman", "67b", Rarity.COMMON, mage.cards.a.AnabaShaman.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Anaba Spirit Crafter", 68, Rarity.RARE, mage.cards.a.AnabaSpiritCrafter.class)); + cards.add(new SetCardInfo("Apocalypse Chime", 101, Rarity.RARE, mage.cards.a.ApocalypseChime.class)); + cards.add(new SetCardInfo("Autumn Willow", 83, Rarity.RARE, mage.cards.a.AutumnWillow.class)); + cards.add(new SetCardInfo("Aysen Abbey", 112, Rarity.UNCOMMON, mage.cards.a.AysenAbbey.class)); + cards.add(new SetCardInfo("Aysen Bureaucrats", "3a", Rarity.COMMON, mage.cards.a.AysenBureaucrats.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Aysen Bureaucrats", "3b", Rarity.COMMON, mage.cards.a.AysenBureaucrats.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Aysen Crusader", 4, Rarity.RARE, mage.cards.a.AysenCrusader.class)); + cards.add(new SetCardInfo("Aysen Highway", 5, Rarity.RARE, mage.cards.a.AysenHighway.class)); + cards.add(new SetCardInfo("Baki's Curse", 22, Rarity.RARE, mage.cards.b.BakisCurse.class)); + cards.add(new SetCardInfo("Baron Sengir", 41, Rarity.RARE, mage.cards.b.BaronSengir.class)); + cards.add(new SetCardInfo("Beast Walkers", 6, Rarity.RARE, mage.cards.b.BeastWalkers.class)); + cards.add(new SetCardInfo("Black Carriage", 42, Rarity.RARE, mage.cards.b.BlackCarriage.class)); + cards.add(new SetCardInfo("Broken Visage", 43, Rarity.RARE, mage.cards.b.BrokenVisage.class)); + cards.add(new SetCardInfo("Carapace", "84a", Rarity.COMMON, mage.cards.c.Carapace.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Carapace", "84b", Rarity.COMMON, mage.cards.c.Carapace.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Castle Sengir", 113, Rarity.UNCOMMON, mage.cards.c.CastleSengir.class)); + cards.add(new SetCardInfo("Cemetery Gate", "44a", Rarity.COMMON, CemeteryGate.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Cemetery Gate", "44b", Rarity.COMMON, CemeteryGate.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Chain Stasis", 23, Rarity.RARE, mage.cards.c.ChainStasis.class)); + cards.add(new SetCardInfo("Chandler", 69, Rarity.COMMON, mage.cards.c.Chandler.class)); + cards.add(new SetCardInfo("Clockwork Gnomes", 102, Rarity.COMMON, mage.cards.c.ClockworkGnomes.class)); + cards.add(new SetCardInfo("Clockwork Steed", 103, Rarity.UNCOMMON, mage.cards.c.ClockworkSteed.class)); + cards.add(new SetCardInfo("Clockwork Swarm", 104, Rarity.COMMON, mage.cards.c.ClockworkSwarm.class)); + cards.add(new SetCardInfo("Coral Reef", 24, Rarity.COMMON, mage.cards.c.CoralReef.class)); + cards.add(new SetCardInfo("Dark Maze", "25a", Rarity.COMMON, mage.cards.d.DarkMaze.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Dark Maze", "25b", Rarity.COMMON, mage.cards.d.DarkMaze.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Daughter of Autumn", 85, Rarity.RARE, mage.cards.d.DaughterOfAutumn.class)); + cards.add(new SetCardInfo("Death Speakers", 7, Rarity.UNCOMMON, mage.cards.d.DeathSpeakers.class)); + cards.add(new SetCardInfo("Didgeridoo", 105, Rarity.RARE, mage.cards.d.Didgeridoo.class)); + cards.add(new SetCardInfo("Drudge Spell", 45, Rarity.UNCOMMON, mage.cards.d.DrudgeSpell.class)); + cards.add(new SetCardInfo("Dry Spell", "46a", Rarity.COMMON, DrySpell.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Dry Spell", "46b", Rarity.COMMON, DrySpell.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Dwarven Pony", 70, Rarity.RARE, mage.cards.d.DwarvenPony.class)); + cards.add(new SetCardInfo("Dwarven Trader", "72a", Rarity.COMMON, DwarvenTrader.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Dwarven Trader", "72b", Rarity.COMMON, DwarvenTrader.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Ebony Rhino", 106, Rarity.COMMON, mage.cards.e.EbonyRhino.class)); + cards.add(new SetCardInfo("Eron the Relentless", 73, Rarity.UNCOMMON, mage.cards.e.EronTheRelentless.class)); + cards.add(new SetCardInfo("Evaporate", 74, Rarity.UNCOMMON, mage.cards.e.Evaporate.class)); + cards.add(new SetCardInfo("Faerie Noble", 86, Rarity.RARE, mage.cards.f.FaerieNoble.class)); + cards.add(new SetCardInfo("Feast of the Unicorn", "47a", Rarity.COMMON, FeastOfTheUnicorn.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Feast of the Unicorn", "47b", Rarity.COMMON, FeastOfTheUnicorn.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Feroz's Ban", 107, Rarity.RARE, mage.cards.f.FerozsBan.class)); + cards.add(new SetCardInfo("Folk of An-Havva", "87a", Rarity.COMMON, FolkOfAnHavva.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Folk of An-Havva", "87b", Rarity.COMMON, FolkOfAnHavva.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forget", 26, Rarity.RARE, mage.cards.f.Forget.class)); + cards.add(new SetCardInfo("Funeral March", 48, Rarity.UNCOMMON, mage.cards.f.FuneralMarch.class)); + cards.add(new SetCardInfo("Ghost Hounds", 49, Rarity.UNCOMMON, mage.cards.g.GhostHounds.class)); + cards.add(new SetCardInfo("Grandmother Sengir", 50, Rarity.RARE, mage.cards.g.GrandmotherSengir.class)); + cards.add(new SetCardInfo("Greater Werewolf", 51, Rarity.UNCOMMON, mage.cards.g.GreaterWerewolf.class)); + cards.add(new SetCardInfo("Hazduhr the Abbot", 8, Rarity.RARE, mage.cards.h.HazduhrTheAbbot.class)); + cards.add(new SetCardInfo("Headstone", 52, Rarity.COMMON, mage.cards.h.Headstone.class)); + cards.add(new SetCardInfo("Hungry Mist", "88a", Rarity.COMMON, mage.cards.h.HungryMist.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Hungry Mist", "88b", Rarity.COMMON, mage.cards.h.HungryMist.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Ihsan's Shade", 53, Rarity.UNCOMMON, mage.cards.i.IhsansShade.class)); + cards.add(new SetCardInfo("Irini Sengir", 54, Rarity.UNCOMMON, mage.cards.i.IriniSengir.class)); + cards.add(new SetCardInfo("Ironclaw Curse", 76, Rarity.RARE, mage.cards.i.IronclawCurse.class)); + cards.add(new SetCardInfo("Jinx", 29, Rarity.COMMON, mage.cards.j.Jinx.class)); + cards.add(new SetCardInfo("Joven", 77, Rarity.COMMON, mage.cards.j.Joven.class)); + cards.add(new SetCardInfo("Joven's Tools", 108, Rarity.UNCOMMON, mage.cards.j.JovensTools.class)); + cards.add(new SetCardInfo("Koskun Falls", 55, Rarity.RARE, mage.cards.k.KoskunFalls.class)); + cards.add(new SetCardInfo("Koskun Keep", 114, Rarity.UNCOMMON, mage.cards.k.KoskunKeep.class)); + cards.add(new SetCardInfo("Labyrinth Minotaur", "30a", Rarity.COMMON, mage.cards.l.LabyrinthMinotaur.class)); + cards.add(new SetCardInfo("Leaping Lizard", 90, Rarity.COMMON, mage.cards.l.LeapingLizard.class)); + cards.add(new SetCardInfo("Leeches", 9, Rarity.RARE, mage.cards.l.Leeches.class)); + cards.add(new SetCardInfo("Mammoth Harness", 91, Rarity.RARE, mage.cards.m.MammothHarness.class)); + cards.add(new SetCardInfo("Marjhan", 31, Rarity.RARE, mage.cards.m.Marjhan.class)); + cards.add(new SetCardInfo("Memory Lapse", "32a", Rarity.COMMON, mage.cards.m.MemoryLapse.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Memory Lapse", "32b", Rarity.COMMON, mage.cards.m.MemoryLapse.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Merchant Scroll", 33, Rarity.COMMON, mage.cards.m.MerchantScroll.class)); + cards.add(new SetCardInfo("Mesa Falcon", "10a", Rarity.COMMON, MesaFalcon.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mesa Falcon", "10b", Rarity.COMMON, MesaFalcon.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mystic Decree", 34, Rarity.RARE, mage.cards.m.MysticDecree.class)); + cards.add(new SetCardInfo("Narwhal", 35, Rarity.RARE, mage.cards.n.Narwhal.class)); + cards.add(new SetCardInfo("Primal Order", 92, Rarity.RARE, mage.cards.p.PrimalOrder.class)); + cards.add(new SetCardInfo("Rashka the Slayer", 12, Rarity.RARE, mage.cards.r.RashkaTheSlayer.class)); + cards.add(new SetCardInfo("Reef Pirates", "36a", Rarity.COMMON, ReefPirates.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Reef Pirates", "36b", Rarity.COMMON, ReefPirates.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Renewal", 93, Rarity.COMMON, mage.cards.r.Renewal.class)); + cards.add(new SetCardInfo("Retribution", 79, Rarity.UNCOMMON, mage.cards.r.Retribution.class)); + cards.add(new SetCardInfo("Reveka, Wizard Savant", 37, Rarity.RARE, mage.cards.r.RevekaWizardSavant.class)); + cards.add(new SetCardInfo("Root Spider", 94, Rarity.UNCOMMON, mage.cards.r.RootSpider.class)); + cards.add(new SetCardInfo("Roots", 95, Rarity.UNCOMMON, mage.cards.r.Roots.class)); + cards.add(new SetCardInfo("Roterothopter", 109, Rarity.COMMON, mage.cards.r.Roterothopter.class)); + cards.add(new SetCardInfo("Sea Sprite", 38, Rarity.UNCOMMON, mage.cards.s.SeaSprite.class)); + cards.add(new SetCardInfo("Sengir Autocrat", 56, Rarity.UNCOMMON, mage.cards.s.SengirAutocrat.class)); + cards.add(new SetCardInfo("Sengir Bats", "57a", Rarity.COMMON, SengirBats.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Sengir Bats", "57b", Rarity.COMMON, SengirBats.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Serra Aviary", 14, Rarity.RARE, mage.cards.s.SerraAviary.class)); + cards.add(new SetCardInfo("Serra Bestiary", 15, Rarity.UNCOMMON, mage.cards.s.SerraBestiary.class)); + cards.add(new SetCardInfo("Serra Paladin", 17, Rarity.COMMON, mage.cards.s.SerraPaladin.class)); + cards.add(new SetCardInfo("Serrated Arrows", 110, Rarity.COMMON, mage.cards.s.SerratedArrows.class)); + cards.add(new SetCardInfo("Shrink", "97a", Rarity.COMMON, mage.cards.s.Shrink.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Shrink", "97b", Rarity.COMMON, mage.cards.s.Shrink.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Soraya the Falconer", 18, Rarity.RARE, mage.cards.s.SorayaTheFalconer.class)); + cards.add(new SetCardInfo("Spectral Bears", 98, Rarity.UNCOMMON, mage.cards.s.SpectralBears.class)); + cards.add(new SetCardInfo("Torture", "59a", Rarity.COMMON, Torture.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Torture", "59b", Rarity.COMMON, Torture.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Trade Caravan", "19a", Rarity.COMMON, mage.cards.t.TradeCaravan.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Trade Caravan", "19b", Rarity.COMMON, mage.cards.t.TradeCaravan.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Truce", 20, Rarity.RARE, mage.cards.t.Truce.class)); + cards.add(new SetCardInfo("Veldrane of Sengir", 60, Rarity.RARE, mage.cards.v.VeldraneOfSengir.class)); + cards.add(new SetCardInfo("Wall of Kelp", 40, Rarity.RARE, mage.cards.w.WallOfKelp.class)); + cards.add(new SetCardInfo("Willow Faerie", "99a", Rarity.COMMON, WillowFaerie.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Willow Faerie", "99b", Rarity.COMMON, WillowFaerie.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Willow Priestess", 100, Rarity.RARE, mage.cards.w.WillowPriestess.class)); + cards.add(new SetCardInfo("Winter Sky", 80, Rarity.RARE, mage.cards.w.WinterSky.class)); + cards.add(new SetCardInfo("Wizards' School", 115, Rarity.UNCOMMON, mage.cards.w.WizardsSchool.class)); } } From 4a55d4740f9bfaa919d0f2674894073aba6ca5b7 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Thu, 10 May 2018 11:25:01 +0400 Subject: [PATCH 130/158] Fixed card numbers in MIR - Mirage (#4628) --- Mage.Sets/src/mage/sets/Mirage.java | 408 ++++++++++++++-------------- 1 file changed, 204 insertions(+), 204 deletions(-) diff --git a/Mage.Sets/src/mage/sets/Mirage.java b/Mage.Sets/src/mage/sets/Mirage.java index b41bfb20dc2..227f64009a1 100644 --- a/Mage.Sets/src/mage/sets/Mirage.java +++ b/Mage.Sets/src/mage/sets/Mirage.java @@ -52,295 +52,295 @@ public class Mirage extends ExpansionSet { this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; - cards.add(new SetCardInfo("Abyssal Hunter", 1, Rarity.RARE, mage.cards.a.AbyssalHunter.class)); - cards.add(new SetCardInfo("Afiya Grove", 103, Rarity.RARE, mage.cards.a.AfiyaGrove.class)); - cards.add(new SetCardInfo("Afterlife", 205, Rarity.UNCOMMON, mage.cards.a.Afterlife.class)); + cards.add(new SetCardInfo("Abyssal Hunter", 103, Rarity.RARE, mage.cards.a.AbyssalHunter.class)); + cards.add(new SetCardInfo("Afiya Grove", 205, Rarity.RARE, mage.cards.a.AfiyaGrove.class)); + cards.add(new SetCardInfo("Afterlife", 1, Rarity.UNCOMMON, mage.cards.a.Afterlife.class)); cards.add(new SetCardInfo("Agility", 154, Rarity.COMMON, mage.cards.a.Agility.class)); - cards.add(new SetCardInfo("Alarum", 206, Rarity.COMMON, mage.cards.a.Alarum.class)); + cards.add(new SetCardInfo("Alarum", 2, Rarity.COMMON, mage.cards.a.Alarum.class)); cards.add(new SetCardInfo("Aleatory", 155, Rarity.UNCOMMON, mage.cards.a.Aleatory.class)); - cards.add(new SetCardInfo("Amber Prison", 257, Rarity.RARE, mage.cards.a.AmberPrison.class)); - cards.add(new SetCardInfo("Amulet of Unmaking", 258, Rarity.RARE, mage.cards.a.AmuletOfUnmaking.class)); + cards.add(new SetCardInfo("Amber Prison", 292, Rarity.RARE, mage.cards.a.AmberPrison.class)); + cards.add(new SetCardInfo("Amulet of Unmaking", 293, Rarity.RARE, mage.cards.a.AmuletOfUnmaking.class)); cards.add(new SetCardInfo("Ancestral Memories", 52, Rarity.RARE, mage.cards.a.AncestralMemories.class)); + cards.add(new SetCardInfo("Armor of Thorns", 206, Rarity.COMMON, mage.cards.a.ArmorOfThorns.class)); cards.add(new SetCardInfo("Armorer Guildmage", 156, Rarity.COMMON, mage.cards.a.ArmorerGuildmage.class)); - cards.add(new SetCardInfo("Armor of Thorns", 104, Rarity.COMMON, mage.cards.a.ArmorOfThorns.class)); - cards.add(new SetCardInfo("Ashen Powder", 2, Rarity.RARE, mage.cards.a.AshenPowder.class)); - cards.add(new SetCardInfo("Asmira, Holy Avenger", 316, Rarity.RARE, mage.cards.a.AsmiraHolyAvenger.class)); - cards.add(new SetCardInfo("Auspicious Ancestor", 207, Rarity.RARE, mage.cards.a.AuspiciousAncestor.class)); + cards.add(new SetCardInfo("Ashen Powder", 104, Rarity.RARE, mage.cards.a.AshenPowder.class)); + cards.add(new SetCardInfo("Asmira, Holy Avenger", 256, Rarity.RARE, mage.cards.a.AsmiraHolyAvenger.class)); + cards.add(new SetCardInfo("Auspicious Ancestor", 3, Rarity.RARE, mage.cards.a.AuspiciousAncestor.class)); cards.add(new SetCardInfo("Azimaet Drake", 53, Rarity.COMMON, mage.cards.a.AzimaetDrake.class)); - cards.add(new SetCardInfo("Bad River", 289, Rarity.UNCOMMON, mage.cards.b.BadRiver.class)); - cards.add(new SetCardInfo("Barbed-Back Wurm", 3, Rarity.UNCOMMON, mage.cards.b.BarbedBackWurm.class)); + cards.add(new SetCardInfo("Bad River", 324, Rarity.UNCOMMON, mage.cards.b.BadRiver.class)); + cards.add(new SetCardInfo("Barbed-Back Wurm", 105, Rarity.UNCOMMON, mage.cards.b.BarbedBackWurm.class)); cards.add(new SetCardInfo("Bay Falcon", 54, Rarity.COMMON, mage.cards.b.BayFalcon.class)); - cards.add(new SetCardInfo("Benthic Djinn", 317, Rarity.RARE, mage.cards.b.BenthicDjinn.class)); - cards.add(new SetCardInfo("Binding Agony", 4, Rarity.COMMON, mage.cards.b.BindingAgony.class)); - cards.add(new SetCardInfo("Blighted Shaman", 5, Rarity.UNCOMMON, mage.cards.b.BlightedShaman.class)); - cards.add(new SetCardInfo("Blinding Light", 209, Rarity.UNCOMMON, mage.cards.b.BlindingLight.class)); + cards.add(new SetCardInfo("Benthic Djinn", 257, Rarity.RARE, mage.cards.b.BenthicDjinn.class)); + cards.add(new SetCardInfo("Binding Agony", 106, Rarity.COMMON, mage.cards.b.BindingAgony.class)); + cards.add(new SetCardInfo("Blighted Shaman", 107, Rarity.UNCOMMON, mage.cards.b.BlightedShaman.class)); + cards.add(new SetCardInfo("Blinding Light", 5, Rarity.UNCOMMON, mage.cards.b.BlindingLight.class)); cards.add(new SetCardInfo("Blistering Barrier", 159, Rarity.COMMON, mage.cards.b.BlisteringBarrier.class)); - cards.add(new SetCardInfo("Bone Harvest", 6, Rarity.COMMON, mage.cards.b.BoneHarvest.class)); + cards.add(new SetCardInfo("Bone Harvest", 108, Rarity.COMMON, mage.cards.b.BoneHarvest.class)); cards.add(new SetCardInfo("Boomerang", 56, Rarity.COMMON, mage.cards.b.Boomerang.class)); - cards.add(new SetCardInfo("Breathstealer", 7, Rarity.COMMON, mage.cards.b.Breathstealer.class)); - cards.add(new SetCardInfo("Brushwagg", 106, Rarity.RARE, mage.cards.b.Brushwagg.class)); + cards.add(new SetCardInfo("Breathstealer", 109, Rarity.COMMON, mage.cards.b.Breathstealer.class)); + cards.add(new SetCardInfo("Brushwagg", 208, Rarity.RARE, mage.cards.b.Brushwagg.class)); cards.add(new SetCardInfo("Builder's Bane", 160, Rarity.COMMON, mage.cards.b.BuildersBane.class)); cards.add(new SetCardInfo("Burning Palm Efreet", 161, Rarity.UNCOMMON, mage.cards.b.BurningPalmEfreet.class)); cards.add(new SetCardInfo("Burning Shield Askari", 162, Rarity.COMMON, mage.cards.b.BurningShieldAskari.class)); - cards.add(new SetCardInfo("Cadaverous Bloom", 318, Rarity.RARE, mage.cards.c.CadaverousBloom.class)); - cards.add(new SetCardInfo("Cadaverous Knight", 8, Rarity.COMMON, mage.cards.c.CadaverousKnight.class)); - cards.add(new SetCardInfo("Canopy Dragon", 107, Rarity.RARE, mage.cards.c.CanopyDragon.class)); - cards.add(new SetCardInfo("Carrion", 9, Rarity.RARE, mage.cards.c.Carrion.class)); - cards.add(new SetCardInfo("Celestial Dawn", 210, Rarity.RARE, mage.cards.c.CelestialDawn.class)); + cards.add(new SetCardInfo("Cadaverous Bloom", 258, Rarity.RARE, mage.cards.c.CadaverousBloom.class)); + cards.add(new SetCardInfo("Cadaverous Knight", 110, Rarity.COMMON, mage.cards.c.CadaverousKnight.class)); + cards.add(new SetCardInfo("Canopy Dragon", 209, Rarity.RARE, mage.cards.c.CanopyDragon.class)); + cards.add(new SetCardInfo("Carrion", 111, Rarity.RARE, mage.cards.c.Carrion.class)); + cards.add(new SetCardInfo("Celestial Dawn", 6, Rarity.RARE, mage.cards.c.CelestialDawn.class)); cards.add(new SetCardInfo("Cerulean Wyvern", 57, Rarity.UNCOMMON, mage.cards.c.CeruleanWyvern.class)); cards.add(new SetCardInfo("Chaos Charm", 163, Rarity.COMMON, mage.cards.c.ChaosCharm.class)); cards.add(new SetCardInfo("Chaosphere", 164, Rarity.RARE, mage.cards.c.Chaosphere.class)); - cards.add(new SetCardInfo("Charcoal Diamond", 261, Rarity.UNCOMMON, mage.cards.c.CharcoalDiamond.class)); - cards.add(new SetCardInfo("Choking Sands", 11, Rarity.COMMON, mage.cards.c.ChokingSands.class)); + cards.add(new SetCardInfo("Charcoal Diamond", 296, Rarity.UNCOMMON, mage.cards.c.CharcoalDiamond.class)); + cards.add(new SetCardInfo("Choking Sands", 113, Rarity.COMMON, mage.cards.c.ChokingSands.class)); cards.add(new SetCardInfo("Cinder Cloud", 165, Rarity.UNCOMMON, mage.cards.c.CinderCloud.class)); - cards.add(new SetCardInfo("Civic Guildmage", 211, Rarity.COMMON, mage.cards.c.CivicGuildmage.class)); + cards.add(new SetCardInfo("Civic Guildmage", 7, Rarity.COMMON, mage.cards.c.CivicGuildmage.class)); cards.add(new SetCardInfo("Cloak of Invisibility", 58, Rarity.COMMON, mage.cards.c.CloakOfInvisibility.class)); cards.add(new SetCardInfo("Consuming Ferocity", 166, Rarity.UNCOMMON, mage.cards.c.ConsumingFerocity.class)); cards.add(new SetCardInfo("Coral Fighters", 59, Rarity.UNCOMMON, mage.cards.c.CoralFighters.class)); - cards.add(new SetCardInfo("Crash of Rhinos", 108, Rarity.COMMON, mage.cards.c.CrashOfRhinos.class)); + cards.add(new SetCardInfo("Crash of Rhinos", 210, Rarity.COMMON, mage.cards.c.CrashOfRhinos.class)); cards.add(new SetCardInfo("Crimson Hellkite", 167, Rarity.RARE, mage.cards.c.CrimsonHellkite.class)); - cards.add(new SetCardInfo("Crypt Cobra", 12, Rarity.UNCOMMON, mage.cards.c.CryptCobra.class)); - cards.add(new SetCardInfo("Crystal Golem", 263, Rarity.UNCOMMON, mage.cards.c.CrystalGolem.class)); - cards.add(new SetCardInfo("Crystal Vein", 290, Rarity.UNCOMMON, mage.cards.c.CrystalVein.class)); - cards.add(new SetCardInfo("Cursed Totem", 264, Rarity.RARE, mage.cards.c.CursedTotem.class)); + cards.add(new SetCardInfo("Crypt Cobra", 114, Rarity.UNCOMMON, mage.cards.c.CryptCobra.class)); + cards.add(new SetCardInfo("Crystal Golem", 298, Rarity.UNCOMMON, mage.cards.c.CrystalGolem.class)); + cards.add(new SetCardInfo("Crystal Vein", 325, Rarity.UNCOMMON, mage.cards.c.CrystalVein.class)); + cards.add(new SetCardInfo("Cursed Totem", 299, Rarity.RARE, mage.cards.c.CursedTotem.class)); cards.add(new SetCardInfo("Daring Apprentice", 60, Rarity.RARE, mage.cards.d.DaringApprentice.class)); - cards.add(new SetCardInfo("Dark Banishing", 13, Rarity.COMMON, mage.cards.d.DarkBanishing.class)); - cards.add(new SetCardInfo("Dark Ritual", 14, Rarity.COMMON, mage.cards.d.DarkRitual.class)); - cards.add(new SetCardInfo("Dazzling Beauty", 212, Rarity.COMMON, mage.cards.d.DazzlingBeauty.class)); - cards.add(new SetCardInfo("Dirtwater Wraith", 15, Rarity.COMMON, mage.cards.d.DirtwaterWraith.class)); - cards.add(new SetCardInfo("Disempower", 213, Rarity.COMMON, mage.cards.d.Disempower.class)); - cards.add(new SetCardInfo("Disenchant", 214, Rarity.COMMON, mage.cards.d.Disenchant.class)); + cards.add(new SetCardInfo("Dark Banishing", 115, Rarity.COMMON, mage.cards.d.DarkBanishing.class)); + cards.add(new SetCardInfo("Dark Ritual", 116, Rarity.COMMON, mage.cards.d.DarkRitual.class)); + cards.add(new SetCardInfo("Dazzling Beauty", 8, Rarity.COMMON, mage.cards.d.DazzlingBeauty.class)); + cards.add(new SetCardInfo("Dirtwater Wraith", 117, Rarity.COMMON, mage.cards.d.DirtwaterWraith.class)); + cards.add(new SetCardInfo("Disempower", 9, Rarity.COMMON, mage.cards.d.Disempower.class)); + cards.add(new SetCardInfo("Disenchant", 10, Rarity.COMMON, mage.cards.d.Disenchant.class)); cards.add(new SetCardInfo("Dissipate", 61, Rarity.UNCOMMON, mage.cards.d.Dissipate.class)); - cards.add(new SetCardInfo("Divine Offering", 215, Rarity.COMMON, mage.cards.d.DivineOffering.class)); - cards.add(new SetCardInfo("Divine Retribution", 216, Rarity.RARE, mage.cards.d.DivineRetribution.class)); - cards.add(new SetCardInfo("Drain Life", 16, Rarity.COMMON, mage.cards.d.DrainLife.class)); - cards.add(new SetCardInfo("Dread Specter", 17, Rarity.UNCOMMON, mage.cards.d.DreadSpecter.class)); + cards.add(new SetCardInfo("Divine Offering", 11, Rarity.COMMON, mage.cards.d.DivineOffering.class)); + cards.add(new SetCardInfo("Divine Retribution", 12, Rarity.RARE, mage.cards.d.DivineRetribution.class)); + cards.add(new SetCardInfo("Drain Life", 118, Rarity.COMMON, mage.cards.d.DrainLife.class)); + cards.add(new SetCardInfo("Dread Specter", 119, Rarity.UNCOMMON, mage.cards.d.DreadSpecter.class)); cards.add(new SetCardInfo("Dream Cache", 62, Rarity.COMMON, mage.cards.d.DreamCache.class)); cards.add(new SetCardInfo("Dwarven Miner", 169, Rarity.UNCOMMON, mage.cards.d.DwarvenMiner.class)); cards.add(new SetCardInfo("Dwarven Nomad", 170, Rarity.COMMON, mage.cards.d.DwarvenNomad.class)); - cards.add(new SetCardInfo("Early Harvest", 111, Rarity.RARE, mage.cards.e.EarlyHarvest.class)); - cards.add(new SetCardInfo("Ebony Charm", 18, Rarity.COMMON, mage.cards.e.EbonyCharm.class)); - cards.add(new SetCardInfo("Ekundu Griffin", 217, Rarity.COMMON, mage.cards.e.EkunduGriffin.class)); - cards.add(new SetCardInfo("Elixir of Vitality", 265, Rarity.UNCOMMON, mage.cards.e.ElixirOfVitality.class)); + cards.add(new SetCardInfo("Early Harvest", 213, Rarity.RARE, mage.cards.e.EarlyHarvest.class)); + cards.add(new SetCardInfo("Ebony Charm", 120, Rarity.COMMON, mage.cards.e.EbonyCharm.class)); + cards.add(new SetCardInfo("Ekundu Griffin", 13, Rarity.COMMON, mage.cards.e.EkunduGriffin.class)); + cards.add(new SetCardInfo("Elixir of Vitality", 300, Rarity.UNCOMMON, mage.cards.e.ElixirOfVitality.class)); cards.add(new SetCardInfo("Emberwilde Djinn", 172, Rarity.RARE, mage.cards.e.EmberwildeDjinn.class)); - cards.add(new SetCardInfo("Energy Bolt", 323, Rarity.RARE, mage.cards.e.EnergyBolt.class)); - cards.add(new SetCardInfo("Enfeeblement", 19, Rarity.COMMON, mage.cards.e.Enfeeblement.class)); - cards.add(new SetCardInfo("Enlightened Tutor", 218, Rarity.UNCOMMON, mage.cards.e.EnlightenedTutor.class)); - cards.add(new SetCardInfo("Ersatz Gnomes", 266, Rarity.UNCOMMON, mage.cards.e.ErsatzGnomes.class)); - cards.add(new SetCardInfo("Ethereal Champion", 219, Rarity.RARE, mage.cards.e.EtherealChampion.class)); - cards.add(new SetCardInfo("Fallow Earth", 112, Rarity.UNCOMMON, mage.cards.f.FallowEarth.class)); - cards.add(new SetCardInfo("Favorable Destiny", 220, Rarity.UNCOMMON, mage.cards.f.FavorableDestiny.class)); - cards.add(new SetCardInfo("Femeref Archers", 113, Rarity.UNCOMMON, mage.cards.f.FemerefArchers.class)); - cards.add(new SetCardInfo("Femeref Healer", 221, Rarity.COMMON, mage.cards.f.FemerefHealer.class)); - cards.add(new SetCardInfo("Femeref Knight", 222, Rarity.COMMON, mage.cards.f.FemerefKnight.class)); - cards.add(new SetCardInfo("Femeref Scouts", 223, Rarity.COMMON, mage.cards.f.FemerefScouts.class)); - cards.add(new SetCardInfo("Feral Shadow", 20, Rarity.COMMON, mage.cards.f.FeralShadow.class)); - cards.add(new SetCardInfo("Fetid Horror", 21, Rarity.COMMON, mage.cards.f.FetidHorror.class)); + cards.add(new SetCardInfo("Energy Bolt", 263, Rarity.RARE, mage.cards.e.EnergyBolt.class)); + cards.add(new SetCardInfo("Enfeeblement", 121, Rarity.COMMON, mage.cards.e.Enfeeblement.class)); + cards.add(new SetCardInfo("Enlightened Tutor", 14, Rarity.UNCOMMON, mage.cards.e.EnlightenedTutor.class)); + cards.add(new SetCardInfo("Ersatz Gnomes", 301, Rarity.UNCOMMON, mage.cards.e.ErsatzGnomes.class)); + cards.add(new SetCardInfo("Ethereal Champion", 15, Rarity.RARE, mage.cards.e.EtherealChampion.class)); + cards.add(new SetCardInfo("Fallow Earth", 214, Rarity.UNCOMMON, mage.cards.f.FallowEarth.class)); + cards.add(new SetCardInfo("Favorable Destiny", 16, Rarity.UNCOMMON, mage.cards.f.FavorableDestiny.class)); + cards.add(new SetCardInfo("Femeref Archers", 215, Rarity.UNCOMMON, mage.cards.f.FemerefArchers.class)); + cards.add(new SetCardInfo("Femeref Healer", 17, Rarity.COMMON, mage.cards.f.FemerefHealer.class)); + cards.add(new SetCardInfo("Femeref Knight", 18, Rarity.COMMON, mage.cards.f.FemerefKnight.class)); + cards.add(new SetCardInfo("Femeref Scouts", 19, Rarity.COMMON, mage.cards.f.FemerefScouts.class)); + cards.add(new SetCardInfo("Feral Shadow", 122, Rarity.COMMON, mage.cards.f.FeralShadow.class)); + cards.add(new SetCardInfo("Fetid Horror", 123, Rarity.COMMON, mage.cards.f.FetidHorror.class)); cards.add(new SetCardInfo("Final Fortune", 173, Rarity.RARE, mage.cards.f.FinalFortune.class)); + cards.add(new SetCardInfo("Fire Diamond", 302, Rarity.UNCOMMON, mage.cards.f.FireDiamond.class)); cards.add(new SetCardInfo("Firebreathing", 174, Rarity.COMMON, mage.cards.f.Firebreathing.class)); - cards.add(new SetCardInfo("Fire Diamond", 267, Rarity.UNCOMMON, mage.cards.f.FireDiamond.class)); cards.add(new SetCardInfo("Flame Elemental", 175, Rarity.UNCOMMON, mage.cards.f.FlameElemental.class)); cards.add(new SetCardInfo("Flare", 176, Rarity.COMMON, mage.cards.f.Flare.class)); cards.add(new SetCardInfo("Flash", 66, Rarity.RARE, mage.cards.f.Flash.class)); - cards.add(new SetCardInfo("Flood Plain", 291, Rarity.UNCOMMON, mage.cards.f.FloodPlain.class)); - cards.add(new SetCardInfo("Fog", 114, Rarity.COMMON, mage.cards.f.Fog.class)); - cards.add(new SetCardInfo("Foratog", 115, Rarity.UNCOMMON, mage.cards.f.Foratog.class)); - cards.add(new SetCardInfo("Forbidden Crypt", 22, Rarity.RARE, mage.cards.f.ForbiddenCrypt.class)); - cards.add(new SetCardInfo("Forest", 292, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Forest", 293, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Forest", 294, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Forest", 295, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Forsaken Wastes", 23, Rarity.RARE, mage.cards.f.ForsakenWastes.class)); - cards.add(new SetCardInfo("Frenetic Efreet", 324, Rarity.RARE, mage.cards.f.FreneticEfreet.class)); - cards.add(new SetCardInfo("Giant Mantis", 116, Rarity.COMMON, mage.cards.g.GiantMantis.class)); - cards.add(new SetCardInfo("Gibbering Hyenas", 117, Rarity.COMMON, mage.cards.g.GibberingHyenas.class)); + cards.add(new SetCardInfo("Flood Plain", 326, Rarity.UNCOMMON, mage.cards.f.FloodPlain.class)); + cards.add(new SetCardInfo("Fog", 216, Rarity.COMMON, mage.cards.f.Fog.class)); + cards.add(new SetCardInfo("Foratog", 217, Rarity.UNCOMMON, mage.cards.f.Foratog.class)); + cards.add(new SetCardInfo("Forbidden Crypt", 124, Rarity.RARE, mage.cards.f.ForbiddenCrypt.class)); + cards.add(new SetCardInfo("Forest", 347, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 348, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 349, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 350, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forsaken Wastes", 125, Rarity.RARE, mage.cards.f.ForsakenWastes.class)); + cards.add(new SetCardInfo("Frenetic Efreet", 264, Rarity.RARE, mage.cards.f.FreneticEfreet.class)); + cards.add(new SetCardInfo("Giant Mantis", 218, Rarity.COMMON, mage.cards.g.GiantMantis.class)); + cards.add(new SetCardInfo("Gibbering Hyenas", 219, Rarity.COMMON, mage.cards.g.GibberingHyenas.class)); cards.add(new SetCardInfo("Goblin Elite Infantry", 177, Rarity.COMMON, mage.cards.g.GoblinEliteInfantry.class)); cards.add(new SetCardInfo("Goblin Scouts", 178, Rarity.UNCOMMON, mage.cards.g.GoblinScouts.class)); cards.add(new SetCardInfo("Goblin Soothsayer", 179, Rarity.COMMON, mage.cards.g.GoblinSoothsayer.class)); cards.add(new SetCardInfo("Goblin Tinkerer", 180, Rarity.COMMON, mage.cards.g.GoblinTinkerer.class)); - cards.add(new SetCardInfo("Granger Guildmage", 118, Rarity.COMMON, mage.cards.g.GrangerGuildmage.class)); - cards.add(new SetCardInfo("Grasslands", 296, Rarity.UNCOMMON, mage.cards.g.Grasslands.class)); - cards.add(new SetCardInfo("Gravebane Zombie", 25, Rarity.COMMON, mage.cards.g.GravebaneZombie.class)); - cards.add(new SetCardInfo("Grave Servitude", 24, Rarity.COMMON, mage.cards.g.GraveServitude.class)); - cards.add(new SetCardInfo("Grinning Totem", 268, Rarity.RARE, mage.cards.g.GrinningTotem.class)); + cards.add(new SetCardInfo("Granger Guildmage", 220, Rarity.COMMON, mage.cards.g.GrangerGuildmage.class)); + cards.add(new SetCardInfo("Grasslands", 327, Rarity.UNCOMMON, mage.cards.g.Grasslands.class)); + cards.add(new SetCardInfo("Grave Servitude", 126, Rarity.COMMON, mage.cards.g.GraveServitude.class)); + cards.add(new SetCardInfo("Gravebane Zombie", 127, Rarity.COMMON, mage.cards.g.GravebaneZombie.class)); + cards.add(new SetCardInfo("Grinning Totem", 303, Rarity.RARE, mage.cards.g.GrinningTotem.class)); cards.add(new SetCardInfo("Hakim, Loreweaver", 68, Rarity.RARE, mage.cards.h.HakimLoreweaver.class)); - cards.add(new SetCardInfo("Hall of Gemstone", 119, Rarity.RARE, mage.cards.h.HallOfGemstone.class)); + cards.add(new SetCardInfo("Hall of Gemstone", 221, Rarity.RARE, mage.cards.h.HallOfGemstone.class)); cards.add(new SetCardInfo("Hammer of Bogardan", 181, Rarity.RARE, mage.cards.h.HammerOfBogardan.class)); - cards.add(new SetCardInfo("Harbinger of Night", 26, Rarity.RARE, mage.cards.h.HarbingerOfNight.class)); - cards.add(new SetCardInfo("Harbor Guardian", 326, Rarity.UNCOMMON, mage.cards.h.HarborGuardian.class)); + cards.add(new SetCardInfo("Harbinger of Night", 128, Rarity.RARE, mage.cards.h.HarbingerOfNight.class)); + cards.add(new SetCardInfo("Harbor Guardian", 266, Rarity.UNCOMMON, mage.cards.h.HarborGuardian.class)); cards.add(new SetCardInfo("Harmattan Efreet", 69, Rarity.UNCOMMON, mage.cards.h.HarmattanEfreet.class)); - cards.add(new SetCardInfo("Hazerider Drake", 328, Rarity.UNCOMMON, mage.cards.h.HazeriderDrake.class)); - cards.add(new SetCardInfo("Healing Salve", 224, Rarity.COMMON, mage.cards.h.HealingSalve.class)); + cards.add(new SetCardInfo("Hazerider Drake", 268, Rarity.UNCOMMON, mage.cards.h.HazeriderDrake.class)); + cards.add(new SetCardInfo("Healing Salve", 20, Rarity.COMMON, mage.cards.h.HealingSalve.class)); cards.add(new SetCardInfo("Hivis of the Scale", 182, Rarity.RARE, mage.cards.h.HivisOfTheScale.class)); - cards.add(new SetCardInfo("Horrible Hordes", 269, Rarity.UNCOMMON, mage.cards.h.HorribleHordes.class)); - cards.add(new SetCardInfo("Igneous Golem", 270, Rarity.UNCOMMON, mage.cards.i.IgneousGolem.class)); + cards.add(new SetCardInfo("Horrible Hordes", 304, Rarity.UNCOMMON, mage.cards.h.HorribleHordes.class)); + cards.add(new SetCardInfo("Igneous Golem", 305, Rarity.UNCOMMON, mage.cards.i.IgneousGolem.class)); cards.add(new SetCardInfo("Illicit Auction", 183, Rarity.RARE, mage.cards.i.IllicitAuction.class)); - cards.add(new SetCardInfo("Illumination", 225, Rarity.UNCOMMON, mage.cards.i.Illumination.class)); + cards.add(new SetCardInfo("Illumination", 21, Rarity.UNCOMMON, mage.cards.i.Illumination.class)); cards.add(new SetCardInfo("Incinerate", 184, Rarity.COMMON, mage.cards.i.Incinerate.class)); - cards.add(new SetCardInfo("Infernal Contract", 27, Rarity.RARE, mage.cards.i.InfernalContract.class)); - cards.add(new SetCardInfo("Iron Tusk Elephant", 226, Rarity.UNCOMMON, mage.cards.i.IronTuskElephant.class)); - cards.add(new SetCardInfo("Island", 297, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Island", 298, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Island", 299, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Island", 300, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Ivory Charm", 227, Rarity.COMMON, mage.cards.i.IvoryCharm.class)); - cards.add(new SetCardInfo("Jolrael's Centaur", 120, Rarity.COMMON, mage.cards.j.JolraelsCentaur.class)); + cards.add(new SetCardInfo("Infernal Contract", 129, Rarity.RARE, mage.cards.i.InfernalContract.class)); + cards.add(new SetCardInfo("Iron Tusk Elephant", 22, Rarity.UNCOMMON, mage.cards.i.IronTuskElephant.class)); + cards.add(new SetCardInfo("Island", 335, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 336, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 337, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 338, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Ivory Charm", 23, Rarity.COMMON, mage.cards.i.IvoryCharm.class)); + cards.add(new SetCardInfo("Jolrael's Centaur", 222, Rarity.COMMON, mage.cards.j.JolraelsCentaur.class)); cards.add(new SetCardInfo("Jolt", 70, Rarity.COMMON, mage.cards.j.Jolt.class)); - cards.add(new SetCardInfo("Jungle Patrol", 121, Rarity.RARE, mage.cards.j.JunglePatrol.class)); - cards.add(new SetCardInfo("Jungle Troll", 329, Rarity.UNCOMMON, mage.cards.j.JungleTroll.class)); - cards.add(new SetCardInfo("Jungle Wurm", 122, Rarity.COMMON, mage.cards.j.JungleWurm.class)); - cards.add(new SetCardInfo("Kaervek's Hex", 28, Rarity.UNCOMMON, mage.cards.k.KaerveksHex.class)); - cards.add(new SetCardInfo("Kaervek's Purge", 330, Rarity.UNCOMMON, mage.cards.k.KaerveksPurge.class)); + cards.add(new SetCardInfo("Jungle Patrol", 223, Rarity.RARE, mage.cards.j.JunglePatrol.class)); + cards.add(new SetCardInfo("Jungle Troll", 269, Rarity.UNCOMMON, mage.cards.j.JungleTroll.class)); + cards.add(new SetCardInfo("Jungle Wurm", 224, Rarity.COMMON, mage.cards.j.JungleWurm.class)); + cards.add(new SetCardInfo("Kaervek's Hex", 130, Rarity.UNCOMMON, mage.cards.k.KaerveksHex.class)); + cards.add(new SetCardInfo("Kaervek's Purge", 270, Rarity.UNCOMMON, mage.cards.k.KaerveksPurge.class)); cards.add(new SetCardInfo("Kaervek's Torch", 185, Rarity.COMMON, mage.cards.k.KaerveksTorch.class)); - cards.add(new SetCardInfo("Karoo Meerkat", 123, Rarity.UNCOMMON, mage.cards.k.KarooMeerkat.class)); + cards.add(new SetCardInfo("Karoo Meerkat", 225, Rarity.UNCOMMON, mage.cards.k.KarooMeerkat.class)); cards.add(new SetCardInfo("Kukemssa Pirates", 71, Rarity.RARE, mage.cards.k.KukemssaPirates.class)); cards.add(new SetCardInfo("Kukemssa Serpent", 72, Rarity.COMMON, mage.cards.k.KukemssaSerpent.class)); - cards.add(new SetCardInfo("Lead Golem", 271, Rarity.UNCOMMON, mage.cards.l.LeadGolem.class)); - cards.add(new SetCardInfo("Leering Gargoyle", 331, Rarity.RARE, mage.cards.l.LeeringGargoyle.class)); + cards.add(new SetCardInfo("Lead Golem", 306, Rarity.UNCOMMON, mage.cards.l.LeadGolem.class)); + cards.add(new SetCardInfo("Leering Gargoyle", 271, Rarity.RARE, mage.cards.l.LeeringGargoyle.class)); cards.add(new SetCardInfo("Lightning Reflexes", 186, Rarity.COMMON, mage.cards.l.LightningReflexes.class)); - cards.add(new SetCardInfo("Lion's Eye Diamond", 272, Rarity.RARE, mage.cards.l.LionsEyeDiamond.class)); - cards.add(new SetCardInfo("Locust Swarm", 124, Rarity.UNCOMMON, mage.cards.l.LocustSwarm.class)); - cards.add(new SetCardInfo("Mana Prism", 273, Rarity.UNCOMMON, mage.cards.m.ManaPrism.class)); - cards.add(new SetCardInfo("Mangara's Tome", 274, Rarity.RARE, mage.cards.m.MangarasTome.class)); - cards.add(new SetCardInfo("Marble Diamond", 275, Rarity.UNCOMMON, mage.cards.m.MarbleDiamond.class)); - cards.add(new SetCardInfo("Maro", 126, Rarity.RARE, mage.cards.m.Maro.class)); - cards.add(new SetCardInfo("Melesse Spirit", 231, Rarity.UNCOMMON, mage.cards.m.MelesseSpirit.class)); + cards.add(new SetCardInfo("Lion's Eye Diamond", 307, Rarity.RARE, mage.cards.l.LionsEyeDiamond.class)); + cards.add(new SetCardInfo("Locust Swarm", 226, Rarity.UNCOMMON, mage.cards.l.LocustSwarm.class)); + cards.add(new SetCardInfo("Mana Prism", 308, Rarity.UNCOMMON, mage.cards.m.ManaPrism.class)); + cards.add(new SetCardInfo("Mangara's Tome", 309, Rarity.RARE, mage.cards.m.MangarasTome.class)); + cards.add(new SetCardInfo("Marble Diamond", 310, Rarity.UNCOMMON, mage.cards.m.MarbleDiamond.class)); + cards.add(new SetCardInfo("Maro", 228, Rarity.RARE, mage.cards.m.Maro.class)); + cards.add(new SetCardInfo("Melesse Spirit", 27, Rarity.UNCOMMON, mage.cards.m.MelesseSpirit.class)); cards.add(new SetCardInfo("Memory Lapse", 74, Rarity.COMMON, mage.cards.m.MemoryLapse.class)); cards.add(new SetCardInfo("Merfolk Raiders", 75, Rarity.COMMON, mage.cards.m.MerfolkRaiders.class)); cards.add(new SetCardInfo("Merfolk Seer", 76, Rarity.COMMON, mage.cards.m.MerfolkSeer.class)); cards.add(new SetCardInfo("Mind Harness", 78, Rarity.UNCOMMON, mage.cards.m.MindHarness.class)); - cards.add(new SetCardInfo("Mire Shade", 29, Rarity.UNCOMMON, mage.cards.m.MireShade.class)); + cards.add(new SetCardInfo("Mire Shade", 131, Rarity.UNCOMMON, mage.cards.m.MireShade.class)); cards.add(new SetCardInfo("Mist Dragon", 79, Rarity.RARE, mage.cards.m.MistDragon.class)); - cards.add(new SetCardInfo("Moss Diamond", 277, Rarity.UNCOMMON, mage.cards.m.MossDiamond.class)); - cards.add(new SetCardInfo("Mountain", 301, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mountain", 302, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mountain", 303, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mountain", 304, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mountain Valley", 305, Rarity.UNCOMMON, mage.cards.m.MountainValley.class)); - cards.add(new SetCardInfo("Mtenda Griffin", 232, Rarity.UNCOMMON, mage.cards.m.MtendaGriffin.class)); - cards.add(new SetCardInfo("Mtenda Herder", 233, Rarity.COMMON, mage.cards.m.MtendaHerder.class)); + cards.add(new SetCardInfo("Moss Diamond", 312, Rarity.UNCOMMON, mage.cards.m.MossDiamond.class)); + cards.add(new SetCardInfo("Mountain Valley", 328, Rarity.UNCOMMON, mage.cards.m.MountainValley.class)); + cards.add(new SetCardInfo("Mountain", 343, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 344, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 345, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 346, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mtenda Griffin", 28, Rarity.UNCOMMON, mage.cards.m.MtendaGriffin.class)); + cards.add(new SetCardInfo("Mtenda Herder", 29, Rarity.COMMON, mage.cards.m.MtendaHerder.class)); cards.add(new SetCardInfo("Mystical Tutor", 80, Rarity.UNCOMMON, mage.cards.m.MysticalTutor.class)); - cards.add(new SetCardInfo("Natural Balance", 129, Rarity.RARE, mage.cards.n.NaturalBalance.class)); - cards.add(new SetCardInfo("Nettletooth Djinn", 130, Rarity.UNCOMMON, mage.cards.n.NettletoothDjinn.class)); - cards.add(new SetCardInfo("Noble Elephant", 234, Rarity.COMMON, mage.cards.n.NobleElephant.class)); - cards.add(new SetCardInfo("Nocturnal Raid", 30, Rarity.UNCOMMON, mage.cards.n.NocturnalRaid.class)); - cards.add(new SetCardInfo("Pacifism", 236, Rarity.COMMON, mage.cards.p.Pacifism.class)); - cards.add(new SetCardInfo("Painful Memories", 31, Rarity.UNCOMMON, mage.cards.p.PainfulMemories.class)); - cards.add(new SetCardInfo("Patagia Golem", 278, Rarity.UNCOMMON, mage.cards.p.PatagiaGolem.class)); - cards.add(new SetCardInfo("Paupers' Cage", 279, Rarity.RARE, mage.cards.p.PaupersCage.class)); - cards.add(new SetCardInfo("Pearl Dragon", 237, Rarity.RARE, mage.cards.p.PearlDragon.class)); - cards.add(new SetCardInfo("Phyrexian Dreadnought", 280, Rarity.RARE, mage.cards.p.PhyrexianDreadnought.class)); - cards.add(new SetCardInfo("Phyrexian Purge", 333, Rarity.RARE, mage.cards.p.PhyrexianPurge.class)); - cards.add(new SetCardInfo("Phyrexian Tribute", 32, Rarity.RARE, mage.cards.p.PhyrexianTribute.class)); - cards.add(new SetCardInfo("Phyrexian Vault", 281, Rarity.UNCOMMON, mage.cards.p.PhyrexianVault.class)); - cards.add(new SetCardInfo("Plains", 306, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Plains", 307, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Plains", 308, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Plains", 309, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Natural Balance", 231, Rarity.RARE, mage.cards.n.NaturalBalance.class)); + cards.add(new SetCardInfo("Nettletooth Djinn", 232, Rarity.UNCOMMON, mage.cards.n.NettletoothDjinn.class)); + cards.add(new SetCardInfo("Noble Elephant", 30, Rarity.COMMON, mage.cards.n.NobleElephant.class)); + cards.add(new SetCardInfo("Nocturnal Raid", 132, Rarity.UNCOMMON, mage.cards.n.NocturnalRaid.class)); + cards.add(new SetCardInfo("Pacifism", 32, Rarity.COMMON, mage.cards.p.Pacifism.class)); + cards.add(new SetCardInfo("Painful Memories", 133, Rarity.UNCOMMON, mage.cards.p.PainfulMemories.class)); + cards.add(new SetCardInfo("Patagia Golem", 313, Rarity.UNCOMMON, mage.cards.p.PatagiaGolem.class)); + cards.add(new SetCardInfo("Paupers' Cage", 314, Rarity.RARE, mage.cards.p.PaupersCage.class)); + cards.add(new SetCardInfo("Pearl Dragon", 33, Rarity.RARE, mage.cards.p.PearlDragon.class)); + cards.add(new SetCardInfo("Phyrexian Dreadnought", 315, Rarity.RARE, mage.cards.p.PhyrexianDreadnought.class)); + cards.add(new SetCardInfo("Phyrexian Purge", 273, Rarity.RARE, mage.cards.p.PhyrexianPurge.class)); + cards.add(new SetCardInfo("Phyrexian Tribute", 134, Rarity.RARE, mage.cards.p.PhyrexianTribute.class)); + cards.add(new SetCardInfo("Phyrexian Vault", 316, Rarity.UNCOMMON, mage.cards.p.PhyrexianVault.class)); + cards.add(new SetCardInfo("Plains", 331, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Plains", 332, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Plains", 333, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Plains", 334, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Political Trickery", 81, Rarity.RARE, mage.cards.p.PoliticalTrickery.class)); cards.add(new SetCardInfo("Polymorph", 82, Rarity.RARE, mage.cards.p.Polymorph.class)); cards.add(new SetCardInfo("Power Sink", 83, Rarity.COMMON, mage.cards.p.PowerSink.class)); - cards.add(new SetCardInfo("Prismatic Circle", 238, Rarity.COMMON, mage.cards.p.PrismaticCircle.class)); + cards.add(new SetCardInfo("Prismatic Circle", 34, Rarity.COMMON, mage.cards.p.PrismaticCircle.class)); cards.add(new SetCardInfo("Prismatic Lace", 84, Rarity.RARE, mage.cards.p.PrismaticLace.class)); cards.add(new SetCardInfo("Psychic Transfer", 85, Rarity.RARE, mage.cards.p.PsychicTransfer.class)); - cards.add(new SetCardInfo("Purgatory", 335, Rarity.RARE, mage.cards.p.Purgatory.class)); - cards.add(new SetCardInfo("Purraj of Urborg", 33, Rarity.RARE, mage.cards.p.PurrajOfUrborg.class)); - cards.add(new SetCardInfo("Quirion Elves", 132, Rarity.COMMON, mage.cards.q.QuirionElves.class)); - cards.add(new SetCardInfo("Radiant Essence", 336, Rarity.UNCOMMON, mage.cards.r.RadiantEssence.class)); + cards.add(new SetCardInfo("Purgatory", 275, Rarity.RARE, mage.cards.p.Purgatory.class)); + cards.add(new SetCardInfo("Purraj of Urborg", 135, Rarity.RARE, mage.cards.p.PurrajOfUrborg.class)); + cards.add(new SetCardInfo("Quirion Elves", 234, Rarity.COMMON, mage.cards.q.QuirionElves.class)); + cards.add(new SetCardInfo("Radiant Essence", 276, Rarity.UNCOMMON, mage.cards.r.RadiantEssence.class)); cards.add(new SetCardInfo("Raging Spirit", 188, Rarity.COMMON, mage.cards.r.RagingSpirit.class)); - cards.add(new SetCardInfo("Rampant Growth", 133, Rarity.COMMON, mage.cards.r.RampantGrowth.class)); - cards.add(new SetCardInfo("Rashida Scalebane", 239, Rarity.RARE, mage.cards.r.RashidaScalebane.class)); + cards.add(new SetCardInfo("Rampant Growth", 235, Rarity.COMMON, mage.cards.r.RampantGrowth.class)); + cards.add(new SetCardInfo("Rashida Scalebane", 35, Rarity.RARE, mage.cards.r.RashidaScalebane.class)); cards.add(new SetCardInfo("Ray of Command", 86, Rarity.COMMON, mage.cards.r.RayOfCommand.class)); cards.add(new SetCardInfo("Reality Ripple", 87, Rarity.COMMON, mage.cards.r.RealityRipple.class)); cards.add(new SetCardInfo("Reckless Embermage", 189, Rarity.RARE, mage.cards.r.RecklessEmbermage.class)); - cards.add(new SetCardInfo("Regeneration", 134, Rarity.COMMON, mage.cards.r.Regeneration.class)); + cards.add(new SetCardInfo("Regeneration", 236, Rarity.COMMON, mage.cards.r.Regeneration.class)); cards.add(new SetCardInfo("Reign of Chaos", 190, Rarity.UNCOMMON, mage.cards.r.ReignOfChaos.class)); - cards.add(new SetCardInfo("Reparations", 338, Rarity.RARE, mage.cards.r.Reparations.class)); - cards.add(new SetCardInfo("Restless Dead", 36, Rarity.COMMON, mage.cards.r.RestlessDead.class)); - cards.add(new SetCardInfo("Ritual of Steel", 240, Rarity.COMMON, mage.cards.r.RitualOfSteel.class)); - cards.add(new SetCardInfo("Rock Basilisk", 339, Rarity.RARE, mage.cards.r.RockBasilisk.class)); - cards.add(new SetCardInfo("Rocky Tar Pit", 310, Rarity.UNCOMMON, mage.cards.r.RockyTarPit.class)); - cards.add(new SetCardInfo("Sabertooth Cobra", 136, Rarity.COMMON, mage.cards.s.SabertoothCobra.class)); - cards.add(new SetCardInfo("Sacred Mesa", 241, Rarity.RARE, mage.cards.s.SacredMesa.class)); + cards.add(new SetCardInfo("Reparations", 278, Rarity.RARE, mage.cards.r.Reparations.class)); + cards.add(new SetCardInfo("Restless Dead", 138, Rarity.COMMON, mage.cards.r.RestlessDead.class)); + cards.add(new SetCardInfo("Ritual of Steel", 36, Rarity.COMMON, mage.cards.r.RitualOfSteel.class)); + cards.add(new SetCardInfo("Rock Basilisk", 279, Rarity.RARE, mage.cards.r.RockBasilisk.class)); + cards.add(new SetCardInfo("Rocky Tar Pit", 329, Rarity.UNCOMMON, mage.cards.r.RockyTarPit.class)); + cards.add(new SetCardInfo("Sabertooth Cobra", 238, Rarity.COMMON, mage.cards.s.SabertoothCobra.class)); + cards.add(new SetCardInfo("Sacred Mesa", 37, Rarity.RARE, mage.cards.s.SacredMesa.class)); cards.add(new SetCardInfo("Sandbar Crocodile", 88, Rarity.COMMON, mage.cards.s.SandbarCrocodile.class)); - cards.add(new SetCardInfo("Sandstorm", 137, Rarity.COMMON, mage.cards.s.Sandstorm.class)); + cards.add(new SetCardInfo("Sandstorm", 239, Rarity.COMMON, mage.cards.s.Sandstorm.class)); cards.add(new SetCardInfo("Sapphire Charm", 89, Rarity.COMMON, mage.cards.s.SapphireCharm.class)); - cards.add(new SetCardInfo("Savage Twister", 340, Rarity.UNCOMMON, mage.cards.s.SavageTwister.class)); - cards.add(new SetCardInfo("Sawback Manticore", 341, Rarity.RARE, mage.cards.s.SawbackManticore.class)); - cards.add(new SetCardInfo("Searing Spear Askari", 191, Rarity.COMMON, mage.cards.s.SearingSpearAskari.class)); + cards.add(new SetCardInfo("Savage Twister", 280, Rarity.UNCOMMON, mage.cards.s.SavageTwister.class)); + cards.add(new SetCardInfo("Sawback Manticore", 281, Rarity.RARE, mage.cards.s.SawbackManticore.class)); cards.add(new SetCardInfo("Sea Scryer", 90, Rarity.COMMON, mage.cards.s.SeaScryer.class)); - cards.add(new SetCardInfo("Seedling Charm", 138, Rarity.COMMON, mage.cards.s.SeedlingCharm.class)); - cards.add(new SetCardInfo("Seeds of Innocence", 139, Rarity.RARE, mage.cards.s.SeedsOfInnocence.class)); - cards.add(new SetCardInfo("Serene Heart", 140, Rarity.COMMON, mage.cards.s.SereneHeart.class)); - cards.add(new SetCardInfo("Sewer Rats", 37, Rarity.COMMON, mage.cards.s.SewerRats.class)); - cards.add(new SetCardInfo("Shadow Guildmage", 38, Rarity.COMMON, mage.cards.s.ShadowGuildmage.class)); - cards.add(new SetCardInfo("Shallow Grave", 39, Rarity.RARE, mage.cards.s.ShallowGrave.class)); + cards.add(new SetCardInfo("Searing Spear Askari", 191, Rarity.COMMON, mage.cards.s.SearingSpearAskari.class)); + cards.add(new SetCardInfo("Seedling Charm", 240, Rarity.COMMON, mage.cards.s.SeedlingCharm.class)); + cards.add(new SetCardInfo("Seeds of Innocence", 241, Rarity.RARE, mage.cards.s.SeedsOfInnocence.class)); + cards.add(new SetCardInfo("Serene Heart", 242, Rarity.COMMON, mage.cards.s.SereneHeart.class)); + cards.add(new SetCardInfo("Sewer Rats", 139, Rarity.COMMON, mage.cards.s.SewerRats.class)); + cards.add(new SetCardInfo("Shadow Guildmage", 140, Rarity.COMMON, mage.cards.s.ShadowGuildmage.class)); + cards.add(new SetCardInfo("Shallow Grave", 141, Rarity.RARE, mage.cards.s.ShallowGrave.class)); cards.add(new SetCardInfo("Shaper Guildmage", 91, Rarity.COMMON, mage.cards.s.ShaperGuildmage.class)); - cards.add(new SetCardInfo("Shauku's Minion", 343, Rarity.UNCOMMON, mage.cards.s.ShaukusMinion.class)); - cards.add(new SetCardInfo("Shauku, Endbringer", 40, Rarity.RARE, mage.cards.s.ShaukuEndbringer.class)); + cards.add(new SetCardInfo("Shauku's Minion", 283, Rarity.UNCOMMON, mage.cards.s.ShaukusMinion.class)); + cards.add(new SetCardInfo("Shauku, Endbringer", 142, Rarity.RARE, mage.cards.s.ShaukuEndbringer.class)); cards.add(new SetCardInfo("Shimmer", 92, Rarity.RARE, mage.cards.s.Shimmer.class)); - cards.add(new SetCardInfo("Sidar Jabari", 243, Rarity.RARE, mage.cards.s.SidarJabari.class)); - cards.add(new SetCardInfo("Skulking Ghost", 41, Rarity.COMMON, mage.cards.s.SkulkingGhost.class)); - cards.add(new SetCardInfo("Sky Diamond", 284, Rarity.UNCOMMON, mage.cards.s.SkyDiamond.class)); + cards.add(new SetCardInfo("Sidar Jabari", 39, Rarity.RARE, mage.cards.s.SidarJabari.class)); + cards.add(new SetCardInfo("Skulking Ghost", 143, Rarity.COMMON, mage.cards.s.SkulkingGhost.class)); + cards.add(new SetCardInfo("Sky Diamond", 319, Rarity.UNCOMMON, mage.cards.s.SkyDiamond.class)); cards.add(new SetCardInfo("Soar", 93, Rarity.COMMON, mage.cards.s.Soar.class)); - cards.add(new SetCardInfo("Soul Echo", 244, Rarity.RARE, mage.cards.s.SoulEcho.class)); - cards.add(new SetCardInfo("Soul Rend", 42, Rarity.UNCOMMON, mage.cards.s.SoulRend.class)); - cards.add(new SetCardInfo("Spectral Guardian", 245, Rarity.RARE, mage.cards.s.SpectralGuardian.class)); - cards.add(new SetCardInfo("Spirit of the Night", 44, Rarity.RARE, mage.cards.s.SpiritOfTheNight.class)); + cards.add(new SetCardInfo("Soul Echo", 40, Rarity.RARE, mage.cards.s.SoulEcho.class)); + cards.add(new SetCardInfo("Soul Rend", 144, Rarity.UNCOMMON, mage.cards.s.SoulRend.class)); + cards.add(new SetCardInfo("Spectral Guardian", 41, Rarity.RARE, mage.cards.s.SpectralGuardian.class)); + cards.add(new SetCardInfo("Spirit of the Night", 146, Rarity.RARE, mage.cards.s.SpiritOfTheNight.class)); cards.add(new SetCardInfo("Spitting Earth", 193, Rarity.COMMON, mage.cards.s.SpittingEarth.class)); - cards.add(new SetCardInfo("Stalking Tiger", 141, Rarity.COMMON, mage.cards.s.StalkingTiger.class)); + cards.add(new SetCardInfo("Stalking Tiger", 243, Rarity.COMMON, mage.cards.s.StalkingTiger.class)); cards.add(new SetCardInfo("Stone Rain", 194, Rarity.COMMON, mage.cards.s.StoneRain.class)); - cards.add(new SetCardInfo("Stupor", 45, Rarity.UNCOMMON, mage.cards.s.Stupor.class)); + cards.add(new SetCardInfo("Stupor", 147, Rarity.UNCOMMON, mage.cards.s.Stupor.class)); cards.add(new SetCardInfo("Subterranean Spirit", 195, Rarity.RARE, mage.cards.s.SubterraneanSpirit.class)); - cards.add(new SetCardInfo("Sunweb", 246, Rarity.RARE, mage.cards.s.Sunweb.class)); + cards.add(new SetCardInfo("Sunweb", 42, Rarity.RARE, mage.cards.s.Sunweb.class)); cards.add(new SetCardInfo("Suq'Ata Firewalker", 94, Rarity.UNCOMMON, mage.cards.s.SuqAtaFirewalker.class)); - cards.add(new SetCardInfo("Swamp", 311, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Swamp", 312, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Swamp", 313, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Swamp", 314, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 339, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 340, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 341, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 342, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Talruum Minotaur", 196, Rarity.COMMON, mage.cards.t.TalruumMinotaur.class)); cards.add(new SetCardInfo("Taniwha", 95, Rarity.RARE, mage.cards.t.Taniwha.class)); - cards.add(new SetCardInfo("Teeka's Dragon", 285, Rarity.RARE, mage.cards.t.TeekasDragon.class)); + cards.add(new SetCardInfo("Teeka's Dragon", 320, Rarity.RARE, mage.cards.t.TeekasDragon.class)); cards.add(new SetCardInfo("Teferi's Curse", 96, Rarity.COMMON, mage.cards.t.TeferisCurse.class)); cards.add(new SetCardInfo("Teferi's Drake", 97, Rarity.COMMON, mage.cards.t.TeferisDrake.class)); - cards.add(new SetCardInfo("Teferi's Isle", 315, Rarity.RARE, mage.cards.t.TeferisIsle.class)); + cards.add(new SetCardInfo("Teferi's Isle", 330, Rarity.RARE, mage.cards.t.TeferisIsle.class)); cards.add(new SetCardInfo("Telim'Tor", 197, Rarity.RARE, mage.cards.t.TelimTor.class)); - cards.add(new SetCardInfo("Telim'Tor's Darts", 286, Rarity.UNCOMMON, mage.cards.t.TelimTorsDarts.class)); + cards.add(new SetCardInfo("Telim'Tor's Darts", 321, Rarity.UNCOMMON, mage.cards.t.TelimTorsDarts.class)); cards.add(new SetCardInfo("Telim'Tor's Edict", 198, Rarity.RARE, mage.cards.t.TelimTorsEdict.class)); - cards.add(new SetCardInfo("Teremko Griffin", 247, Rarity.COMMON, mage.cards.t.TeremkoGriffin.class)); + cards.add(new SetCardInfo("Teremko Griffin", 43, Rarity.COMMON, mage.cards.t.TeremkoGriffin.class)); cards.add(new SetCardInfo("Thirst", 99, Rarity.COMMON, mage.cards.t.Thirst.class)); cards.add(new SetCardInfo("Tidal Wave", 100, Rarity.UNCOMMON, mage.cards.t.TidalWave.class)); - cards.add(new SetCardInfo("Tombstone Stairwell", 47, Rarity.RARE, mage.cards.t.TombstoneStairwell.class)); - cards.add(new SetCardInfo("Tranquil Domain", 143, Rarity.COMMON, mage.cards.t.TranquilDomain.class)); - cards.add(new SetCardInfo("Tropical Storm", 144, Rarity.UNCOMMON, mage.cards.t.TropicalStorm.class)); - cards.add(new SetCardInfo("Uktabi Faerie", 145, Rarity.COMMON, mage.cards.u.UktabiFaerie.class)); - cards.add(new SetCardInfo("Uktabi Wildcats", 146, Rarity.RARE, mage.cards.u.UktabiWildcats.class)); - cards.add(new SetCardInfo("Unfulfilled Desires", 345, Rarity.RARE, mage.cards.u.UnfulfilledDesires.class)); - cards.add(new SetCardInfo("Unseen Walker", 147, Rarity.UNCOMMON, mage.cards.u.UnseenWalker.class)); - cards.add(new SetCardInfo("Unyaro Bee Sting", 148, Rarity.UNCOMMON, mage.cards.u.UnyaroBeeSting.class)); - cards.add(new SetCardInfo("Unyaro Griffin", 248, Rarity.UNCOMMON, mage.cards.u.UnyaroGriffin.class)); + cards.add(new SetCardInfo("Tombstone Stairwell", 149, Rarity.RARE, mage.cards.t.TombstoneStairwell.class)); + cards.add(new SetCardInfo("Tranquil Domain", 245, Rarity.COMMON, mage.cards.t.TranquilDomain.class)); + cards.add(new SetCardInfo("Tropical Storm", 246, Rarity.UNCOMMON, mage.cards.t.TropicalStorm.class)); + cards.add(new SetCardInfo("Uktabi Faerie", 247, Rarity.COMMON, mage.cards.u.UktabiFaerie.class)); + cards.add(new SetCardInfo("Uktabi Wildcats", 248, Rarity.RARE, mage.cards.u.UktabiWildcats.class)); + cards.add(new SetCardInfo("Unfulfilled Desires", 285, Rarity.RARE, mage.cards.u.UnfulfilledDesires.class)); + cards.add(new SetCardInfo("Unseen Walker", 249, Rarity.UNCOMMON, mage.cards.u.UnseenWalker.class)); + cards.add(new SetCardInfo("Unyaro Bee Sting", 250, Rarity.UNCOMMON, mage.cards.u.UnyaroBeeSting.class)); + cards.add(new SetCardInfo("Unyaro Griffin", 44, Rarity.UNCOMMON, mage.cards.u.UnyaroGriffin.class)); cards.add(new SetCardInfo("Vaporous Djinn", 101, Rarity.UNCOMMON, mage.cards.v.VaporousDjinn.class)); - cards.add(new SetCardInfo("Ventifact Bottle", 288, Rarity.RARE, mage.cards.v.VentifactBottle.class)); + cards.add(new SetCardInfo("Ventifact Bottle", 323, Rarity.RARE, mage.cards.v.VentifactBottle.class)); cards.add(new SetCardInfo("Viashino Warrior", 200, Rarity.COMMON, mage.cards.v.ViashinoWarrior.class)); - cards.add(new SetCardInfo("Vigilant Martyr", 249, Rarity.UNCOMMON, mage.cards.v.VigilantMartyr.class)); - cards.add(new SetCardInfo("Village Elder", 149, Rarity.COMMON, mage.cards.v.VillageElder.class)); - cards.add(new SetCardInfo("Vitalizing Cascade", 346, Rarity.UNCOMMON, mage.cards.v.VitalizingCascade.class)); + cards.add(new SetCardInfo("Vigilant Martyr", 45, Rarity.UNCOMMON, mage.cards.v.VigilantMartyr.class)); + cards.add(new SetCardInfo("Village Elder", 251, Rarity.COMMON, mage.cards.v.VillageElder.class)); + cards.add(new SetCardInfo("Vitalizing Cascade", 286, Rarity.UNCOMMON, mage.cards.v.VitalizingCascade.class)); cards.add(new SetCardInfo("Volcanic Dragon", 201, Rarity.RARE, mage.cards.v.VolcanicDragon.class)); cards.add(new SetCardInfo("Volcanic Geyser", 202, Rarity.UNCOMMON, mage.cards.v.VolcanicGeyser.class)); - cards.add(new SetCardInfo("Waiting in the Weeds", 150, Rarity.RARE, mage.cards.w.WaitingInTheWeeds.class)); - cards.add(new SetCardInfo("Wall of Roots", 151, Rarity.COMMON, mage.cards.w.WallOfRoots.class)); - cards.add(new SetCardInfo("Ward of Lights", 251, Rarity.COMMON, mage.cards.w.WardOfLights.class)); + cards.add(new SetCardInfo("Waiting in the Weeds", 252, Rarity.RARE, mage.cards.w.WaitingInTheWeeds.class)); + cards.add(new SetCardInfo("Wall of Roots", 253, Rarity.COMMON, mage.cards.w.WallOfRoots.class)); + cards.add(new SetCardInfo("Ward of Lights", 47, Rarity.COMMON, mage.cards.w.WardOfLights.class)); cards.add(new SetCardInfo("Wave Elemental", 102, Rarity.UNCOMMON, mage.cards.w.WaveElemental.class)); - cards.add(new SetCardInfo("Wild Elephant", 152, Rarity.COMMON, mage.cards.w.WildElephant.class)); + cards.add(new SetCardInfo("Wild Elephant", 254, Rarity.COMMON, mage.cards.w.WildElephant.class)); cards.add(new SetCardInfo("Wildfire Emissary", 203, Rarity.UNCOMMON, mage.cards.w.WildfireEmissary.class)); - cards.add(new SetCardInfo("Windreaper Falcon", 349, Rarity.UNCOMMON, mage.cards.w.WindreaperFalcon.class)); - cards.add(new SetCardInfo("Withering Boon", 50, Rarity.UNCOMMON, mage.cards.w.WitheringBoon.class)); - cards.add(new SetCardInfo("Worldly Tutor", 153, Rarity.UNCOMMON, mage.cards.w.WorldlyTutor.class)); - cards.add(new SetCardInfo("Zebra Unicorn", 350, Rarity.UNCOMMON, mage.cards.z.ZebraUnicorn.class)); - cards.add(new SetCardInfo("Zhalfirin Commander", 253, Rarity.UNCOMMON, mage.cards.z.ZhalfirinCommander.class)); - cards.add(new SetCardInfo("Zhalfirin Knight", 254, Rarity.COMMON, mage.cards.z.ZhalfirinKnight.class)); + cards.add(new SetCardInfo("Windreaper Falcon", 289, Rarity.UNCOMMON, mage.cards.w.WindreaperFalcon.class)); + cards.add(new SetCardInfo("Withering Boon", 152, Rarity.UNCOMMON, mage.cards.w.WitheringBoon.class)); + cards.add(new SetCardInfo("Worldly Tutor", 255, Rarity.UNCOMMON, mage.cards.w.WorldlyTutor.class)); + cards.add(new SetCardInfo("Zebra Unicorn", 290, Rarity.UNCOMMON, mage.cards.z.ZebraUnicorn.class)); + cards.add(new SetCardInfo("Zhalfirin Commander", 49, Rarity.UNCOMMON, mage.cards.z.ZhalfirinCommander.class)); + cards.add(new SetCardInfo("Zhalfirin Knight", 50, Rarity.COMMON, mage.cards.z.ZhalfirinKnight.class)); cards.add(new SetCardInfo("Zirilan of the Claw", 204, Rarity.RARE, mage.cards.z.ZirilanOfTheClaw.class)); - cards.add(new SetCardInfo("Zombie Mob", 51, Rarity.UNCOMMON, mage.cards.z.ZombieMob.class)); - cards.add(new SetCardInfo("Zuberi, Golden Feather", 255, Rarity.RARE, mage.cards.z.ZuberiGoldenFeather.class)); + cards.add(new SetCardInfo("Zombie Mob", 153, Rarity.UNCOMMON, mage.cards.z.ZombieMob.class)); + cards.add(new SetCardInfo("Zuberi, Golden Feather", 51, Rarity.RARE, mage.cards.z.ZuberiGoldenFeather.class)); } } From 681eb0616ba0c8929117833376e97b305db172a8 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Thu, 10 May 2018 11:26:13 +0400 Subject: [PATCH 131/158] Fixed card numbers in VIS - Visions (#4628) --- Mage.Sets/src/mage/sets/Visions.java | 132 +++++++++++++-------------- 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/Mage.Sets/src/mage/sets/Visions.java b/Mage.Sets/src/mage/sets/Visions.java index dd91e41c306..cb753ada3f1 100644 --- a/Mage.Sets/src/mage/sets/Visions.java +++ b/Mage.Sets/src/mage/sets/Visions.java @@ -54,110 +54,110 @@ public class Visions extends ExpansionSet { this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; - cards.add(new SetCardInfo("Aku Djinn", 1, Rarity.RARE, mage.cards.a.AkuDjinn.class)); + cards.add(new SetCardInfo("Aku Djinn", 51, Rarity.RARE, mage.cards.a.AkuDjinn.class)); cards.add(new SetCardInfo("Anvil of Bogardan", 141, Rarity.RARE, mage.cards.a.AnvilOfBogardan.class)); - cards.add(new SetCardInfo("Archangel", 101, Rarity.RARE, mage.cards.a.Archangel.class)); + cards.add(new SetCardInfo("Archangel", 1, Rarity.RARE, mage.cards.a.Archangel.class)); cards.add(new SetCardInfo("Army Ants", 126, Rarity.UNCOMMON, mage.cards.a.ArmyAnts.class)); cards.add(new SetCardInfo("Betrayal", 26, Rarity.COMMON, mage.cards.b.Betrayal.class)); - cards.add(new SetCardInfo("Blanket of Night", 2, Rarity.UNCOMMON, mage.cards.b.BlanketOfNight.class)); + cards.add(new SetCardInfo("Blanket of Night", 52, Rarity.UNCOMMON, mage.cards.b.BlanketOfNight.class)); cards.add(new SetCardInfo("Brass-Talon Chimera", 142, Rarity.UNCOMMON, mage.cards.b.BrassTalonChimera.class)); cards.add(new SetCardInfo("Breathstealer's Crypt", 127, Rarity.RARE, mage.cards.b.BreathstealersCrypt.class)); cards.add(new SetCardInfo("Breezekeeper", 27, Rarity.COMMON, mage.cards.b.Breezekeeper.class)); - cards.add(new SetCardInfo("Brood of Cockroaches", 3, Rarity.UNCOMMON, mage.cards.b.BroodOfCockroaches.class)); - cards.add(new SetCardInfo("Bull Elephant", 51, Rarity.COMMON, mage.cards.b.BullElephant.class)); + cards.add(new SetCardInfo("Brood of Cockroaches", 53, Rarity.UNCOMMON, mage.cards.b.BroodOfCockroaches.class)); + cards.add(new SetCardInfo("Bull Elephant", 101, Rarity.COMMON, mage.cards.b.BullElephant.class)); cards.add(new SetCardInfo("Chronatog", 28, Rarity.RARE, mage.cards.c.Chronatog.class)); - cards.add(new SetCardInfo("City of Solitude", 52, Rarity.RARE, mage.cards.c.CityOfSolitude.class)); + cards.add(new SetCardInfo("City of Solitude", 102, Rarity.RARE, mage.cards.c.CityOfSolitude.class)); cards.add(new SetCardInfo("Cloud Elemental", 29, Rarity.COMMON, mage.cards.c.CloudElemental.class)); - cards.add(new SetCardInfo("Coercion", 4, Rarity.COMMON, mage.cards.c.Coercion.class)); + cards.add(new SetCardInfo("Coercion", 54, Rarity.COMMON, mage.cards.c.Coercion.class)); cards.add(new SetCardInfo("Coral Atoll", 160, Rarity.UNCOMMON, mage.cards.c.CoralAtoll.class)); cards.add(new SetCardInfo("Corrosion", 128, Rarity.RARE, mage.cards.c.Corrosion.class)); - cards.add(new SetCardInfo("Creeping Mold", 53, Rarity.UNCOMMON, mage.cards.c.CreepingMold.class)); - cards.add(new SetCardInfo("Crypt Rats", 5, Rarity.COMMON, mage.cards.c.CryptRats.class)); - cards.add(new SetCardInfo("Daraja Griffin", 102, Rarity.UNCOMMON, mage.cards.d.DarajaGriffin.class)); - cards.add(new SetCardInfo("Dark Privilege", 6, Rarity.COMMON, mage.cards.d.DarkPrivilege.class)); - cards.add(new SetCardInfo("Death Watch", 7, Rarity.COMMON, mage.cards.d.DeathWatch.class)); + cards.add(new SetCardInfo("Creeping Mold", 103, Rarity.UNCOMMON, mage.cards.c.CreepingMold.class)); + cards.add(new SetCardInfo("Crypt Rats", 55, Rarity.COMMON, mage.cards.c.CryptRats.class)); + cards.add(new SetCardInfo("Daraja Griffin", 2, Rarity.UNCOMMON, mage.cards.d.DarajaGriffin.class)); + cards.add(new SetCardInfo("Dark Privilege", 56, Rarity.COMMON, mage.cards.d.DarkPrivilege.class)); + cards.add(new SetCardInfo("Death Watch", 57, Rarity.COMMON, mage.cards.d.DeathWatch.class)); cards.add(new SetCardInfo("Desertion", 30, Rarity.RARE, mage.cards.d.Desertion.class)); - cards.add(new SetCardInfo("Desolation", 8, Rarity.UNCOMMON, mage.cards.d.Desolation.class)); + cards.add(new SetCardInfo("Desolation", 58, Rarity.UNCOMMON, mage.cards.d.Desolation.class)); cards.add(new SetCardInfo("Diamond Kaleidoscope", 143, Rarity.RARE, mage.cards.d.DiamondKaleidoscope.class)); cards.add(new SetCardInfo("Dormant Volcano", 161, Rarity.UNCOMMON, mage.cards.d.DormantVolcano.class)); cards.add(new SetCardInfo("Dragon Mask", 144, Rarity.UNCOMMON, mage.cards.d.DragonMask.class)); cards.add(new SetCardInfo("Dream Tides", 31, Rarity.UNCOMMON, mage.cards.d.DreamTides.class)); cards.add(new SetCardInfo("Dwarven Vigilantes", 77, Rarity.COMMON, mage.cards.d.DwarvenVigilantes.class)); - cards.add(new SetCardInfo("Elephant Grass", 54, Rarity.UNCOMMON, mage.cards.e.ElephantGrass.class)); + cards.add(new SetCardInfo("Elephant Grass", 104, Rarity.UNCOMMON, mage.cards.e.ElephantGrass.class)); cards.add(new SetCardInfo("Elkin Lair", 78, Rarity.RARE, mage.cards.e.ElkinLair.class)); - cards.add(new SetCardInfo("Elven Cache", 55, Rarity.COMMON, mage.cards.e.ElvenCache.class)); - cards.add(new SetCardInfo("Emerald Charm", 56, Rarity.COMMON, mage.cards.e.EmeraldCharm.class)); - cards.add(new SetCardInfo("Equipoise", 103, Rarity.RARE, mage.cards.e.Equipoise.class)); + cards.add(new SetCardInfo("Elven Cache", 105, Rarity.COMMON, mage.cards.e.ElvenCache.class)); + cards.add(new SetCardInfo("Emerald Charm", 106, Rarity.COMMON, mage.cards.e.EmeraldCharm.class)); + cards.add(new SetCardInfo("Equipoise", 3, Rarity.RARE, mage.cards.e.Equipoise.class)); cards.add(new SetCardInfo("Everglades", 162, Rarity.UNCOMMON, mage.cards.e.Everglades.class)); - cards.add(new SetCardInfo("Eye of Singularity", 104, Rarity.RARE, mage.cards.e.EyeOfSingularity.class)); - cards.add(new SetCardInfo("Fallen Askari", 9, Rarity.COMMON, mage.cards.f.FallenAskari.class)); + cards.add(new SetCardInfo("Eye of Singularity", 4, Rarity.RARE, mage.cards.e.EyeOfSingularity.class)); + cards.add(new SetCardInfo("Fallen Askari", 59, Rarity.COMMON, mage.cards.f.FallenAskari.class)); cards.add(new SetCardInfo("Femeref Enchantress", 129, Rarity.RARE, mage.cards.f.FemerefEnchantress.class)); - cards.add(new SetCardInfo("Feral Instinct", 57, Rarity.COMMON, mage.cards.f.FeralInstinct.class)); + cards.add(new SetCardInfo("Feral Instinct", 107, Rarity.COMMON, mage.cards.f.FeralInstinct.class)); cards.add(new SetCardInfo("Fireblast", 79, Rarity.COMMON, mage.cards.f.Fireblast.class)); cards.add(new SetCardInfo("Firestorm Hellkite", 130, Rarity.RARE, mage.cards.f.FirestormHellkite.class)); cards.add(new SetCardInfo("Flooded Shoreline", 32, Rarity.RARE, mage.cards.f.FloodedShoreline.class)); cards.add(new SetCardInfo("Foreshadow", 33, Rarity.UNCOMMON, mage.cards.f.Foreshadow.class)); - cards.add(new SetCardInfo("Freewind Falcon", 105, Rarity.COMMON, mage.cards.f.FreewindFalcon.class)); - cards.add(new SetCardInfo("Funeral Charm", 11, Rarity.COMMON, mage.cards.f.FuneralCharm.class)); - cards.add(new SetCardInfo("Giant Caterpillar", 58, Rarity.COMMON, mage.cards.g.GiantCaterpillar.class)); + cards.add(new SetCardInfo("Freewind Falcon", 5, Rarity.COMMON, mage.cards.f.FreewindFalcon.class)); + cards.add(new SetCardInfo("Funeral Charm", 61, Rarity.COMMON, mage.cards.f.FuneralCharm.class)); + cards.add(new SetCardInfo("Giant Caterpillar", 108, Rarity.COMMON, mage.cards.g.GiantCaterpillar.class)); cards.add(new SetCardInfo("Goblin Recruiter", 80, Rarity.UNCOMMON, mage.cards.g.GoblinRecruiter.class)); cards.add(new SetCardInfo("Goblin Swine-Rider", 81, Rarity.COMMON, mage.cards.g.GoblinSwineRider.class)); - cards.add(new SetCardInfo("Gossamer Chains", 106, Rarity.COMMON, mage.cards.g.GossamerChains.class)); + cards.add(new SetCardInfo("Gossamer Chains", 6, Rarity.COMMON, mage.cards.g.GossamerChains.class)); cards.add(new SetCardInfo("Griffin Canyon", 163, Rarity.RARE, mage.cards.g.GriffinCanyon.class)); cards.add(new SetCardInfo("Hearth Charm", 82, Rarity.COMMON, mage.cards.h.HearthCharm.class)); cards.add(new SetCardInfo("Helm of Awakening", 145, Rarity.UNCOMMON, mage.cards.h.HelmOfAwakening.class)); - cards.add(new SetCardInfo("Honorable Passage", 107, Rarity.UNCOMMON, mage.cards.h.HonorablePassage.class)); - cards.add(new SetCardInfo("Hope Charm", 108, Rarity.COMMON, mage.cards.h.HopeCharm.class)); + cards.add(new SetCardInfo("Honorable Passage", 7, Rarity.UNCOMMON, mage.cards.h.HonorablePassage.class)); + cards.add(new SetCardInfo("Hope Charm", 8, Rarity.COMMON, mage.cards.h.HopeCharm.class)); cards.add(new SetCardInfo("Hulking Cyclops", 84, Rarity.UNCOMMON, mage.cards.h.HulkingCyclops.class)); cards.add(new SetCardInfo("Impulse", 34, Rarity.COMMON, mage.cards.i.Impulse.class)); - cards.add(new SetCardInfo("Infantry Veteran", 109, Rarity.COMMON, mage.cards.i.InfantryVeteran.class)); + cards.add(new SetCardInfo("Infantry Veteran", 9, Rarity.COMMON, mage.cards.i.InfantryVeteran.class)); cards.add(new SetCardInfo("Inspiration", 35, Rarity.COMMON, mage.cards.i.Inspiration.class)); cards.add(new SetCardInfo("Iron-Heart Chimera", 146, Rarity.UNCOMMON, mage.cards.i.IronHeartChimera.class)); - cards.add(new SetCardInfo("Jamuraan Lion", 110, Rarity.COMMON, mage.cards.j.JamuraanLion.class)); + cards.add(new SetCardInfo("Jamuraan Lion", 10, Rarity.COMMON, mage.cards.j.JamuraanLion.class)); cards.add(new SetCardInfo("Jungle Basin", 164, Rarity.UNCOMMON, mage.cards.j.JungleBasin.class)); - cards.add(new SetCardInfo("Kaervek's Spite", 13, Rarity.RARE, mage.cards.k.KaerveksSpite.class)); + cards.add(new SetCardInfo("Kaervek's Spite", 63, Rarity.RARE, mage.cards.k.KaerveksSpite.class)); cards.add(new SetCardInfo("Karoo", 165, Rarity.UNCOMMON, mage.cards.k.Karoo.class)); - cards.add(new SetCardInfo("Katabatic Winds", 59, Rarity.RARE, mage.cards.k.KatabaticWinds.class)); + cards.add(new SetCardInfo("Katabatic Winds", 109, Rarity.RARE, mage.cards.k.KatabaticWinds.class)); cards.add(new SetCardInfo("Keeper of Kookus", 85, Rarity.COMMON, mage.cards.k.KeeperOfKookus.class)); - cards.add(new SetCardInfo("King Cheetah", 60, Rarity.COMMON, mage.cards.k.KingCheetah.class)); - cards.add(new SetCardInfo("Knight of Valor", 111, Rarity.COMMON, mage.cards.k.KnightOfValor.class)); + cards.add(new SetCardInfo("King Cheetah", 110, Rarity.COMMON, mage.cards.k.KingCheetah.class)); cards.add(new SetCardInfo("Knight of the Mists", 36, Rarity.COMMON, mage.cards.k.KnightOfTheMists.class)); + cards.add(new SetCardInfo("Knight of Valor", 11, Rarity.COMMON, mage.cards.k.KnightOfValor.class)); cards.add(new SetCardInfo("Kookus", 86, Rarity.RARE, mage.cards.k.Kookus.class)); cards.add(new SetCardInfo("Lead-Belly Chimera", 148, Rarity.UNCOMMON, mage.cards.l.LeadBellyChimera.class)); - cards.add(new SetCardInfo("Lichenthrope", 62, Rarity.RARE, mage.cards.l.Lichenthrope.class)); + cards.add(new SetCardInfo("Lichenthrope", 112, Rarity.RARE, mage.cards.l.Lichenthrope.class)); cards.add(new SetCardInfo("Lightning Cloud", 87, Rarity.RARE, mage.cards.l.LightningCloud.class)); - cards.add(new SetCardInfo("Longbow Archer", 112, Rarity.UNCOMMON, mage.cards.l.LongbowArcher.class)); + cards.add(new SetCardInfo("Longbow Archer", 12, Rarity.UNCOMMON, mage.cards.l.LongbowArcher.class)); cards.add(new SetCardInfo("Magma Mine", 149, Rarity.UNCOMMON, mage.cards.m.MagmaMine.class)); cards.add(new SetCardInfo("Man-o'-War", 37, Rarity.COMMON, mage.cards.m.ManOWar.class)); - cards.add(new SetCardInfo("Miraculous Recovery", 113, Rarity.UNCOMMON, mage.cards.m.MiraculousRecovery.class)); - cards.add(new SetCardInfo("Mortal Wound", 63, Rarity.COMMON, mage.cards.m.MortalWound.class)); + cards.add(new SetCardInfo("Miraculous Recovery", 13, Rarity.UNCOMMON, mage.cards.m.MiraculousRecovery.class)); + cards.add(new SetCardInfo("Mortal Wound", 113, Rarity.COMMON, mage.cards.m.MortalWound.class)); cards.add(new SetCardInfo("Mundungu", 132, Rarity.UNCOMMON, mage.cards.m.Mundungu.class)); cards.add(new SetCardInfo("Mystic Veil", 38, Rarity.COMMON, mage.cards.m.MysticVeil.class)); - cards.add(new SetCardInfo("Natural Order", 64, Rarity.RARE, mage.cards.n.NaturalOrder.class)); - cards.add(new SetCardInfo("Necromancy", 14, Rarity.UNCOMMON, mage.cards.n.Necromancy.class)); - cards.add(new SetCardInfo("Necrosavant", 15, Rarity.RARE, mage.cards.n.Necrosavant.class)); - cards.add(new SetCardInfo("Nekrataal", 16, Rarity.UNCOMMON, mage.cards.n.Nekrataal.class)); + cards.add(new SetCardInfo("Natural Order", 114, Rarity.RARE, mage.cards.n.NaturalOrder.class)); + cards.add(new SetCardInfo("Necromancy", 64, Rarity.UNCOMMON, mage.cards.n.Necromancy.class)); + cards.add(new SetCardInfo("Necrosavant", 65, Rarity.RARE, mage.cards.n.Necrosavant.class)); + cards.add(new SetCardInfo("Nekrataal", 66, Rarity.UNCOMMON, mage.cards.n.Nekrataal.class)); cards.add(new SetCardInfo("Ovinomancer", 39, Rarity.UNCOMMON, mage.cards.o.Ovinomancer.class)); - cards.add(new SetCardInfo("Panther Warriors", 65, Rarity.COMMON, mage.cards.p.PantherWarriors.class)); - cards.add(new SetCardInfo("Parapet", 114, Rarity.COMMON, mage.cards.p.Parapet.class)); + cards.add(new SetCardInfo("Panther Warriors", 115, Rarity.COMMON, mage.cards.p.PantherWarriors.class)); + cards.add(new SetCardInfo("Parapet", 14, Rarity.COMMON, mage.cards.p.Parapet.class)); cards.add(new SetCardInfo("Phyrexian Marauder", 151, Rarity.RARE, mage.cards.p.PhyrexianMarauder.class)); cards.add(new SetCardInfo("Phyrexian Walker", 152, Rarity.COMMON, mage.cards.p.PhyrexianWalker.class)); cards.add(new SetCardInfo("Prosperity", 40, Rarity.UNCOMMON, mage.cards.p.Prosperity.class)); - cards.add(new SetCardInfo("Python", 18, Rarity.COMMON, mage.cards.p.Python.class)); + cards.add(new SetCardInfo("Python", 68, Rarity.COMMON, mage.cards.p.Python.class)); cards.add(new SetCardInfo("Quicksand", 166, Rarity.UNCOMMON, mage.cards.q.Quicksand.class)); - cards.add(new SetCardInfo("Quirion Ranger", 67, Rarity.COMMON, mage.cards.q.QuirionRanger.class)); + cards.add(new SetCardInfo("Quirion Ranger", 117, Rarity.COMMON, mage.cards.q.QuirionRanger.class)); cards.add(new SetCardInfo("Raging Gorilla", 90, Rarity.COMMON, mage.cards.r.RagingGorilla.class)); cards.add(new SetCardInfo("Rainbow Efreet", 41, Rarity.RARE, mage.cards.r.RainbowEfreet.class)); cards.add(new SetCardInfo("Relentless Assault", 91, Rarity.RARE, mage.cards.r.RelentlessAssault.class)); - cards.add(new SetCardInfo("Relic Ward", 116, Rarity.UNCOMMON, mage.cards.r.RelicWard.class)); - cards.add(new SetCardInfo("Remedy", 117, Rarity.COMMON, mage.cards.r.Remedy.class)); - cards.add(new SetCardInfo("Resistance Fighter", 118, Rarity.COMMON, mage.cards.r.ResistanceFighter.class)); - cards.add(new SetCardInfo("Retribution of the Meek", 119, Rarity.RARE, mage.cards.r.RetributionOfTheMeek.class)); - cards.add(new SetCardInfo("Righteous Aura", 120, Rarity.COMMON, mage.cards.r.RighteousAura.class)); + cards.add(new SetCardInfo("Relic Ward", 16, Rarity.UNCOMMON, mage.cards.r.RelicWard.class)); + cards.add(new SetCardInfo("Remedy", 17, Rarity.COMMON, mage.cards.r.Remedy.class)); + cards.add(new SetCardInfo("Resistance Fighter", 18, Rarity.COMMON, mage.cards.r.ResistanceFighter.class)); + cards.add(new SetCardInfo("Retribution of the Meek", 19, Rarity.RARE, mage.cards.r.RetributionOfTheMeek.class)); + cards.add(new SetCardInfo("Righteous Aura", 20, Rarity.COMMON, mage.cards.r.RighteousAura.class)); cards.add(new SetCardInfo("Righteous War", 134, Rarity.RARE, mage.cards.r.RighteousWar.class)); - cards.add(new SetCardInfo("River Boa", 68, Rarity.COMMON, mage.cards.r.RiverBoa.class)); + cards.add(new SetCardInfo("River Boa", 118, Rarity.COMMON, mage.cards.r.RiverBoa.class)); cards.add(new SetCardInfo("Rock Slide", 92, Rarity.COMMON, mage.cards.r.RockSlide.class)); - cards.add(new SetCardInfo("Rowen", 69, Rarity.RARE, mage.cards.r.Rowen.class)); + cards.add(new SetCardInfo("Rowen", 119, Rarity.RARE, mage.cards.r.Rowen.class)); cards.add(new SetCardInfo("Sands of Time", 153, Rarity.RARE, mage.cards.s.SandsOfTime.class)); cards.add(new SetCardInfo("Scalebane's Elite", 135, Rarity.UNCOMMON, mage.cards.s.ScalebanesElite.class)); cards.add(new SetCardInfo("Shrieking Drake", 43, Rarity.COMMON, mage.cards.s.ShriekingDrake.class)); @@ -166,19 +166,19 @@ public class Visions extends ExpansionSet { cards.add(new SetCardInfo("Snake Basket", 155, Rarity.RARE, mage.cards.s.SnakeBasket.class)); cards.add(new SetCardInfo("Solfatara", 93, Rarity.COMMON, mage.cards.s.Solfatara.class)); cards.add(new SetCardInfo("Song of Blood", 94, Rarity.COMMON, mage.cards.s.SongOfBlood.class)); - cards.add(new SetCardInfo("Spider Climb", 70, Rarity.COMMON, mage.cards.s.SpiderClimb.class)); + cards.add(new SetCardInfo("Spider Climb", 120, Rarity.COMMON, mage.cards.s.SpiderClimb.class)); cards.add(new SetCardInfo("Spitting Drake", 95, Rarity.UNCOMMON, mage.cards.s.SpittingDrake.class)); cards.add(new SetCardInfo("Squandered Resources", 137, Rarity.RARE, mage.cards.s.SquanderedResources.class)); - cards.add(new SetCardInfo("Stampeding Wildebeests", 71, Rarity.UNCOMMON, mage.cards.s.StampedingWildebeests.class)); + cards.add(new SetCardInfo("Stampeding Wildebeests", 121, Rarity.UNCOMMON, mage.cards.s.StampedingWildebeests.class)); cards.add(new SetCardInfo("Suleiman's Legacy", 138, Rarity.RARE, mage.cards.s.SuleimansLegacy.class)); - cards.add(new SetCardInfo("Summer Bloom", 72, Rarity.UNCOMMON, mage.cards.s.SummerBloom.class)); - cards.add(new SetCardInfo("Sun Clasp", 121, Rarity.COMMON, mage.cards.s.SunClasp.class)); - cards.add(new SetCardInfo("Suq'Ata Assassin", 19, Rarity.UNCOMMON, mage.cards.s.SuqAtaAssassin.class)); + cards.add(new SetCardInfo("Summer Bloom", 122, Rarity.UNCOMMON, mage.cards.s.SummerBloom.class)); + cards.add(new SetCardInfo("Sun Clasp", 21, Rarity.COMMON, mage.cards.s.SunClasp.class)); + cards.add(new SetCardInfo("Suq'Ata Assassin", 69, Rarity.UNCOMMON, mage.cards.s.SuqAtaAssassin.class)); cards.add(new SetCardInfo("Suq'Ata Lancer", 96, Rarity.COMMON, mage.cards.s.SuqAtaLancer.class)); cards.add(new SetCardInfo("Talruum Champion", 97, Rarity.COMMON, mage.cards.t.TalruumChampion.class)); cards.add(new SetCardInfo("Talruum Piper", 98, Rarity.UNCOMMON, mage.cards.t.TalruumPiper.class)); - cards.add(new SetCardInfo("Tar Pit Warrior", 20, Rarity.COMMON, mage.cards.t.TarPitWarrior.class)); - cards.add(new SetCardInfo("Teferi's Honor Guard", 122, Rarity.UNCOMMON, mage.cards.t.TeferisHonorGuard.class)); + cards.add(new SetCardInfo("Tar Pit Warrior", 70, Rarity.COMMON, mage.cards.t.TarPitWarrior.class)); + cards.add(new SetCardInfo("Teferi's Honor Guard", 22, Rarity.UNCOMMON, mage.cards.t.TeferisHonorGuard.class)); cards.add(new SetCardInfo("Teferi's Puzzle Box", 156, Rarity.RARE, mage.cards.t.TeferisPuzzleBox.class)); cards.add(new SetCardInfo("Teferi's Realm", 44, Rarity.RARE, mage.cards.t.TeferisRealm.class)); cards.add(new SetCardInfo("Tempest Drake", 139, Rarity.UNCOMMON, mage.cards.t.TempestDrake.class)); @@ -190,20 +190,20 @@ public class Visions extends ExpansionSet { cards.add(new SetCardInfo("Uktabi Orangutan", 123, Rarity.UNCOMMON, mage.cards.u.UktabiOrangutan.class)); cards.add(new SetCardInfo("Undiscovered Paradise", 167, Rarity.RARE, mage.cards.u.UndiscoveredParadise.class)); cards.add(new SetCardInfo("Undo", 47, Rarity.COMMON, mage.cards.u.Undo.class)); - cards.add(new SetCardInfo("Urborg Mindsucker", 21, Rarity.COMMON, mage.cards.u.UrborgMindsucker.class)); - cards.add(new SetCardInfo("Vampiric Tutor", 22, Rarity.RARE, mage.cards.v.VampiricTutor.class)); + cards.add(new SetCardInfo("Urborg Mindsucker", 71, Rarity.COMMON, mage.cards.u.UrborgMindsucker.class)); + cards.add(new SetCardInfo("Vampiric Tutor", 72, Rarity.RARE, mage.cards.v.VampiricTutor.class)); cards.add(new SetCardInfo("Vampirism", 73, Rarity.UNCOMMON, mage.cards.v.Vampirism.class)); cards.add(new SetCardInfo("Vanishing", 48, Rarity.COMMON, mage.cards.v.Vanishing.class)); cards.add(new SetCardInfo("Viashino Sandstalker", 100, Rarity.UNCOMMON, mage.cards.v.ViashinoSandstalker.class)); cards.add(new SetCardInfo("Viashivan Dragon", 140, Rarity.RARE, mage.cards.v.ViashivanDragon.class)); cards.add(new SetCardInfo("Vision Charm", 49, Rarity.COMMON, mage.cards.v.VisionCharm.class)); - cards.add(new SetCardInfo("Wake of Vultures", 24, Rarity.COMMON, mage.cards.w.WakeOfVultures.class)); + cards.add(new SetCardInfo("Wake of Vultures", 74, Rarity.COMMON, mage.cards.w.WakeOfVultures.class)); cards.add(new SetCardInfo("Wand of Denial", 159, Rarity.RARE, mage.cards.w.WandOfDenial.class)); - cards.add(new SetCardInfo("Warrior's Honor", 124, Rarity.COMMON, mage.cards.w.WarriorsHonor.class)); - cards.add(new SetCardInfo("Warthog", 74, Rarity.COMMON, mage.cards.w.Warthog.class)); + cards.add(new SetCardInfo("Warrior's Honor", 24, Rarity.COMMON, mage.cards.w.WarriorsHonor.class)); + cards.add(new SetCardInfo("Warthog", 124, Rarity.COMMON, mage.cards.w.Warthog.class)); cards.add(new SetCardInfo("Waterspout Djinn", 50, Rarity.UNCOMMON, mage.cards.w.WaterspoutDjinn.class)); - cards.add(new SetCardInfo("Wicked Reward", 25, Rarity.COMMON, mage.cards.w.WickedReward.class)); - cards.add(new SetCardInfo("Wind Shear", 75, Rarity.UNCOMMON, mage.cards.w.WindShear.class)); - cards.add(new SetCardInfo("Zhalfirin Crusader", 125, Rarity.RARE, mage.cards.z.ZhalfirinCrusader.class)); + cards.add(new SetCardInfo("Wicked Reward", 75, Rarity.COMMON, mage.cards.w.WickedReward.class)); + cards.add(new SetCardInfo("Wind Shear", 125, Rarity.UNCOMMON, mage.cards.w.WindShear.class)); + cards.add(new SetCardInfo("Zhalfirin Crusader", 25, Rarity.RARE, mage.cards.z.ZhalfirinCrusader.class)); } } From 79e5997f63381befb2de73cfc0f3f915626347cd Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Thu, 10 May 2018 11:27:15 +0400 Subject: [PATCH 132/158] Fixed card numbers in WTH - Weatherlight (#4628) --- Mage.Sets/src/mage/sets/Weatherlight.java | 163 +++++++++++----------- 1 file changed, 81 insertions(+), 82 deletions(-) diff --git a/Mage.Sets/src/mage/sets/Weatherlight.java b/Mage.Sets/src/mage/sets/Weatherlight.java index eafb35eba8d..3aa398fdc05 100644 --- a/Mage.Sets/src/mage/sets/Weatherlight.java +++ b/Mage.Sets/src/mage/sets/Weatherlight.java @@ -55,135 +55,135 @@ public class Weatherlight extends ExpansionSet { this.numBoosterRare = 1; this.ratioBoosterMythic = 0; cards.add(new SetCardInfo("Abduction", 30, Rarity.UNCOMMON, mage.cards.a.Abduction.class)); - cards.add(new SetCardInfo("Abeyance", 117, Rarity.RARE, mage.cards.a.Abeyance.class)); + cards.add(new SetCardInfo("Abeyance", 1, Rarity.RARE, mage.cards.a.Abeyance.class)); cards.add(new SetCardInfo("Abjure", 31, Rarity.COMMON, mage.cards.a.Abjure.class)); - cards.add(new SetCardInfo("Aboroth", 59, Rarity.RARE, mage.cards.a.Aboroth.class)); - cards.add(new SetCardInfo("Abyssal Gatekeeper", 1, Rarity.COMMON, mage.cards.a.AbyssalGatekeeper.class)); + cards.add(new SetCardInfo("Aboroth", 117, Rarity.RARE, mage.cards.a.Aboroth.class)); + cards.add(new SetCardInfo("Abyssal Gatekeeper", 59, Rarity.COMMON, mage.cards.a.AbyssalGatekeeper.class)); cards.add(new SetCardInfo("Aether Flash", 88, Rarity.UNCOMMON, mage.cards.a.AetherFlash.class)); - cards.add(new SetCardInfo("Agonizing Memories", 2, Rarity.UNCOMMON, mage.cards.a.AgonizingMemories.class)); - cards.add(new SetCardInfo("Alabaster Dragon", 118, Rarity.RARE, mage.cards.a.AlabasterDragon.class)); - cards.add(new SetCardInfo("Alms", 119, Rarity.COMMON, mage.cards.a.Alms.class)); + cards.add(new SetCardInfo("Agonizing Memories", 60, Rarity.UNCOMMON, mage.cards.a.AgonizingMemories.class)); + cards.add(new SetCardInfo("Alabaster Dragon", 2, Rarity.RARE, mage.cards.a.AlabasterDragon.class)); + cards.add(new SetCardInfo("Alms", 3, Rarity.COMMON, mage.cards.a.Alms.class)); cards.add(new SetCardInfo("Ancestral Knowledge", 32, Rarity.RARE, mage.cards.a.AncestralKnowledge.class)); - cards.add(new SetCardInfo("Angelic Renewal", 120, Rarity.COMMON, mage.cards.a.AngelicRenewal.class)); - cards.add(new SetCardInfo("Arctic Wolves", 60, Rarity.UNCOMMON, mage.cards.a.ArcticWolves.class)); - cards.add(new SetCardInfo("Ardent Militia", 121, Rarity.COMMON, mage.cards.a.ArdentMilitia.class)); - cards.add(new SetCardInfo("Argivian Find", 122, Rarity.UNCOMMON, mage.cards.a.ArgivianFind.class)); + cards.add(new SetCardInfo("Angelic Renewal", 4, Rarity.COMMON, mage.cards.a.AngelicRenewal.class)); + cards.add(new SetCardInfo("Arctic Wolves", 118, Rarity.UNCOMMON, mage.cards.a.ArcticWolves.class)); + cards.add(new SetCardInfo("Ardent Militia", 5, Rarity.COMMON, mage.cards.a.ArdentMilitia.class)); + cards.add(new SetCardInfo("Argivian Find", 6, Rarity.UNCOMMON, mage.cards.a.ArgivianFind.class)); cards.add(new SetCardInfo("Argivian Restoration", 34, Rarity.UNCOMMON, mage.cards.a.ArgivianRestoration.class)); - cards.add(new SetCardInfo("Aura of Silence", 123, Rarity.UNCOMMON, mage.cards.a.AuraOfSilence.class)); + cards.add(new SetCardInfo("Aura of Silence", 7, Rarity.UNCOMMON, mage.cards.a.AuraOfSilence.class)); cards.add(new SetCardInfo("Avizoa", 35, Rarity.RARE, mage.cards.a.Avizoa.class)); - cards.add(new SetCardInfo("Barrow Ghoul", 3, Rarity.COMMON, mage.cards.b.BarrowGhoul.class)); - cards.add(new SetCardInfo("Benalish Infantry", 124, Rarity.COMMON, mage.cards.b.BenalishInfantry.class)); - cards.add(new SetCardInfo("Benalish Knight", 125, Rarity.COMMON, mage.cards.b.BenalishKnight.class)); - cards.add(new SetCardInfo("Benalish Missionary", 126, Rarity.COMMON, mage.cards.b.BenalishMissionary.class)); + cards.add(new SetCardInfo("Barrow Ghoul", 61, Rarity.COMMON, mage.cards.b.BarrowGhoul.class)); + cards.add(new SetCardInfo("Benalish Infantry", 8, Rarity.COMMON, mage.cards.b.BenalishInfantry.class)); + cards.add(new SetCardInfo("Benalish Knight", 9, Rarity.COMMON, mage.cards.b.BenalishKnight.class)); + cards.add(new SetCardInfo("Benalish Missionary", 10, Rarity.COMMON, mage.cards.b.BenalishMissionary.class)); cards.add(new SetCardInfo("Bloodrock Cyclops", 90, Rarity.COMMON, mage.cards.b.BloodrockCyclops.class)); - cards.add(new SetCardInfo("Blossoming Wreath", 62, Rarity.COMMON, mage.cards.b.BlossomingWreath.class)); + cards.add(new SetCardInfo("Blossoming Wreath", 120, Rarity.COMMON, mage.cards.b.BlossomingWreath.class)); cards.add(new SetCardInfo("Bogardan Firefiend", 91, Rarity.COMMON, mage.cards.b.BogardanFirefiend.class)); cards.add(new SetCardInfo("Boiling Blood", 92, Rarity.COMMON, mage.cards.b.BoilingBlood.class)); - cards.add(new SetCardInfo("Bone Dancer", 4, Rarity.RARE, mage.cards.b.BoneDancer.class)); - cards.add(new SetCardInfo("Briar Shield", 63, Rarity.COMMON, mage.cards.b.BriarShield.class)); - cards.add(new SetCardInfo("Bubble Matrix", 147, Rarity.RARE, mage.cards.b.BubbleMatrix.class)); - cards.add(new SetCardInfo("Buried Alive", 5, Rarity.UNCOMMON, mage.cards.b.BuriedAlive.class)); - cards.add(new SetCardInfo("Call of the Wild", 64, Rarity.RARE, mage.cards.c.CallOfTheWild.class)); + cards.add(new SetCardInfo("Bone Dancer", 62, Rarity.RARE, mage.cards.b.BoneDancer.class)); + cards.add(new SetCardInfo("Briar Shield", 121, Rarity.COMMON, mage.cards.b.BriarShield.class)); + cards.add(new SetCardInfo("Bubble Matrix", 146, Rarity.RARE, mage.cards.b.BubbleMatrix.class)); + cards.add(new SetCardInfo("Buried Alive", 63, Rarity.UNCOMMON, mage.cards.b.BuriedAlive.class)); + cards.add(new SetCardInfo("Call of the Wild", 122, Rarity.RARE, mage.cards.c.CallOfTheWild.class)); cards.add(new SetCardInfo("Chimeric Sphere", 148, Rarity.UNCOMMON, mage.cards.c.ChimericSphere.class)); cards.add(new SetCardInfo("Cinder Giant", 93, Rarity.UNCOMMON, mage.cards.c.CinderGiant.class)); cards.add(new SetCardInfo("Cinder Wall", 94, Rarity.COMMON, mage.cards.c.CinderWall.class)); cards.add(new SetCardInfo("Cloud Djinn", 36, Rarity.UNCOMMON, mage.cards.c.CloudDjinn.class)); cards.add(new SetCardInfo("Cone of Flame", 95, Rarity.UNCOMMON, mage.cards.c.ConeOfFlame.class)); - cards.add(new SetCardInfo("Debt of Loyalty", 127, Rarity.RARE, mage.cards.d.DebtOfLoyalty.class)); - cards.add(new SetCardInfo("Dense Foliage", 66, Rarity.RARE, mage.cards.d.DenseFoliage.class)); + cards.add(new SetCardInfo("Debt of Loyalty", 11, Rarity.RARE, mage.cards.d.DebtOfLoyalty.class)); + cards.add(new SetCardInfo("Dense Foliage", 124, Rarity.RARE, mage.cards.d.DenseFoliage.class)); cards.add(new SetCardInfo("Desperate Gambit", 96, Rarity.UNCOMMON, mage.cards.d.DesperateGambit.class)); cards.add(new SetCardInfo("Dingus Staff", 149, Rarity.UNCOMMON, mage.cards.d.DingusStaff.class)); cards.add(new SetCardInfo("Disrupt", 37, Rarity.COMMON, mage.cards.d.Disrupt.class)); - cards.add(new SetCardInfo("Doomsday", 8, Rarity.RARE, mage.cards.d.Doomsday.class)); - cards.add(new SetCardInfo("Downdraft", 67, Rarity.UNCOMMON, mage.cards.d.Downdraft.class)); - cards.add(new SetCardInfo("Duskrider Falcon", 128, Rarity.COMMON, mage.cards.d.DuskriderFalcon.class)); + cards.add(new SetCardInfo("Doomsday", 66, Rarity.RARE, mage.cards.d.Doomsday.class)); + cards.add(new SetCardInfo("Downdraft", 125, Rarity.UNCOMMON, mage.cards.d.Downdraft.class)); + cards.add(new SetCardInfo("Duskrider Falcon", 12, Rarity.COMMON, mage.cards.d.DuskriderFalcon.class)); cards.add(new SetCardInfo("Dwarven Berserker", 97, Rarity.COMMON, mage.cards.d.DwarvenBerserker.class)); cards.add(new SetCardInfo("Dwarven Thaumaturgist", 98, Rarity.RARE, mage.cards.d.DwarvenThaumaturgist.class)); - cards.add(new SetCardInfo("Empyrial Armor", 129, Rarity.COMMON, mage.cards.e.EmpyrialArmor.class)); - cards.add(new SetCardInfo("Fallow Wurm", 68, Rarity.UNCOMMON, mage.cards.f.FallowWurm.class)); - cards.add(new SetCardInfo("Familiar Ground", 69, Rarity.UNCOMMON, mage.cards.f.FamiliarGround.class)); - cards.add(new SetCardInfo("Fatal Blow", 9, Rarity.COMMON, mage.cards.f.FatalBlow.class)); + cards.add(new SetCardInfo("Empyrial Armor", 13, Rarity.COMMON, mage.cards.e.EmpyrialArmor.class)); + cards.add(new SetCardInfo("Fallow Wurm", 126, Rarity.UNCOMMON, mage.cards.f.FallowWurm.class)); + cards.add(new SetCardInfo("Familiar Ground", 127, Rarity.UNCOMMON, mage.cards.f.FamiliarGround.class)); + cards.add(new SetCardInfo("Fatal Blow", 67, Rarity.COMMON, mage.cards.f.FatalBlow.class)); cards.add(new SetCardInfo("Fervor", 99, Rarity.RARE, mage.cards.f.Fervor.class)); - cards.add(new SetCardInfo("Festering Evil", 10, Rarity.UNCOMMON, mage.cards.f.FesteringEvil.class)); - cards.add(new SetCardInfo("Firestorm", 101, Rarity.RARE, mage.cards.f.Firestorm.class)); + cards.add(new SetCardInfo("Festering Evil", 68, Rarity.UNCOMMON, mage.cards.f.FesteringEvil.class)); cards.add(new SetCardInfo("Fire Whip", 100, Rarity.COMMON, mage.cards.f.FireWhip.class)); + cards.add(new SetCardInfo("Firestorm", 101, Rarity.RARE, mage.cards.f.Firestorm.class)); cards.add(new SetCardInfo("Fit of Rage", 102, Rarity.COMMON, mage.cards.f.FitOfRage.class)); - cards.add(new SetCardInfo("Fledgling Djinn", 11, Rarity.COMMON, mage.cards.f.FledglingDjinn.class)); + cards.add(new SetCardInfo("Fledgling Djinn", 69, Rarity.COMMON, mage.cards.f.FledglingDjinn.class)); cards.add(new SetCardInfo("Flux", 39, Rarity.COMMON, mage.cards.f.Flux.class)); cards.add(new SetCardInfo("Fog Elemental", 40, Rarity.COMMON, mage.cards.f.FogElemental.class)); - cards.add(new SetCardInfo("Foriysian Brigade", 130, Rarity.UNCOMMON, mage.cards.f.ForiysianBrigade.class)); - cards.add(new SetCardInfo("Gaea's Blessing", 71, Rarity.UNCOMMON, mage.cards.g.GaeasBlessing.class)); - cards.add(new SetCardInfo("Gallowbraid", 12, Rarity.RARE, mage.cards.g.Gallowbraid.class)); + cards.add(new SetCardInfo("Foriysian Brigade", 14, Rarity.UNCOMMON, mage.cards.f.ForiysianBrigade.class)); + cards.add(new SetCardInfo("Gaea's Blessing", 129, Rarity.UNCOMMON, mage.cards.g.GaeasBlessing.class)); + cards.add(new SetCardInfo("Gallowbraid", 70, Rarity.RARE, mage.cards.g.Gallowbraid.class)); cards.add(new SetCardInfo("Gemstone Mine", 164, Rarity.UNCOMMON, mage.cards.g.GemstoneMine.class)); - cards.add(new SetCardInfo("Gerrard's Wisdom", 131, Rarity.UNCOMMON, mage.cards.g.GerrardsWisdom.class)); + cards.add(new SetCardInfo("Gerrard's Wisdom", 15, Rarity.UNCOMMON, mage.cards.g.GerrardsWisdom.class)); cards.add(new SetCardInfo("Goblin Bomb", 103, Rarity.RARE, mage.cards.g.GoblinBomb.class)); cards.add(new SetCardInfo("Goblin Grenadiers", 104, Rarity.UNCOMMON, mage.cards.g.GoblinGrenadiers.class)); cards.add(new SetCardInfo("Goblin Vandal", 105, Rarity.COMMON, mage.cards.g.GoblinVandal.class)); - cards.add(new SetCardInfo("Guided Strike", 132, Rarity.COMMON, mage.cards.g.GuidedStrike.class)); - cards.add(new SetCardInfo("Harvest Wurm", 72, Rarity.COMMON, mage.cards.h.HarvestWurm.class)); - cards.add(new SetCardInfo("Haunting Misery", 13, Rarity.COMMON, mage.cards.h.HauntingMisery.class)); + cards.add(new SetCardInfo("Guided Strike", 16, Rarity.COMMON, mage.cards.g.GuidedStrike.class)); + cards.add(new SetCardInfo("Harvest Wurm", 130, Rarity.COMMON, mage.cards.h.HarvestWurm.class)); + cards.add(new SetCardInfo("Haunting Misery", 71, Rarity.COMMON, mage.cards.h.HauntingMisery.class)); cards.add(new SetCardInfo("Heart of Bogardan", 106, Rarity.RARE, mage.cards.h.HeartOfBogardan.class)); cards.add(new SetCardInfo("Heat Stroke", 107, Rarity.RARE, mage.cards.h.HeatStroke.class)); - cards.add(new SetCardInfo("Heavy Ballista", 133, Rarity.COMMON, mage.cards.h.HeavyBallista.class)); - cards.add(new SetCardInfo("Hidden Horror", 14, Rarity.UNCOMMON, mage.cards.h.HiddenHorror.class)); + cards.add(new SetCardInfo("Heavy Ballista", 17, Rarity.COMMON, mage.cards.h.HeavyBallista.class)); + cards.add(new SetCardInfo("Hidden Horror", 72, Rarity.UNCOMMON, mage.cards.h.HiddenHorror.class)); cards.add(new SetCardInfo("Hurloon Shaman", 108, Rarity.UNCOMMON, mage.cards.h.HurloonShaman.class)); - cards.add(new SetCardInfo("Infernal Tribute", 15, Rarity.RARE, mage.cards.i.InfernalTribute.class)); - cards.add(new SetCardInfo("Inner Sanctum", 134, Rarity.RARE, mage.cards.i.InnerSanctum.class)); + cards.add(new SetCardInfo("Infernal Tribute", 73, Rarity.RARE, mage.cards.i.InfernalTribute.class)); + cards.add(new SetCardInfo("Inner Sanctum", 18, Rarity.RARE, mage.cards.i.InnerSanctum.class)); cards.add(new SetCardInfo("Jabari's Banner", 150, Rarity.UNCOMMON, mage.cards.j.JabarisBanner.class)); cards.add(new SetCardInfo("Lava Hounds", 109, Rarity.UNCOMMON, mage.cards.l.LavaHounds.class)); - cards.add(new SetCardInfo("Llanowar Behemoth", 74, Rarity.UNCOMMON, mage.cards.l.LlanowarBehemoth.class)); - cards.add(new SetCardInfo("Llanowar Druid", 75, Rarity.COMMON, mage.cards.l.LlanowarDruid.class)); - cards.add(new SetCardInfo("Llanowar Sentinel", 76, Rarity.COMMON, mage.cards.l.LlanowarSentinel.class)); + cards.add(new SetCardInfo("Llanowar Behemoth", 132, Rarity.UNCOMMON, mage.cards.l.LlanowarBehemoth.class)); + cards.add(new SetCardInfo("Llanowar Druid", 133, Rarity.COMMON, mage.cards.l.LlanowarDruid.class)); + cards.add(new SetCardInfo("Llanowar Sentinel", 134, Rarity.COMMON, mage.cards.l.LlanowarSentinel.class)); cards.add(new SetCardInfo("Lotus Vale", 165, Rarity.RARE, mage.cards.l.LotusVale.class)); cards.add(new SetCardInfo("Mana Chains", 41, Rarity.COMMON, mage.cards.m.ManaChains.class)); cards.add(new SetCardInfo("Mana Web", 152, Rarity.RARE, mage.cards.m.ManaWeb.class)); cards.add(new SetCardInfo("Manta Ray", 42, Rarity.COMMON, mage.cards.m.MantaRay.class)); cards.add(new SetCardInfo("Maraxus of Keld", 111, Rarity.RARE, mage.cards.m.MaraxusOfKeld.class)); - cards.add(new SetCardInfo("Master of Arms", 136, Rarity.UNCOMMON, mage.cards.m.MasterOfArms.class)); + cards.add(new SetCardInfo("Master of Arms", 20, Rarity.UNCOMMON, mage.cards.m.MasterOfArms.class)); cards.add(new SetCardInfo("Merfolk Traders", 43, Rarity.COMMON, mage.cards.m.MerfolkTraders.class)); cards.add(new SetCardInfo("Mind Stone", 153, Rarity.COMMON, mage.cards.m.MindStone.class)); - cards.add(new SetCardInfo("Mischievous Poltergeist", 16, Rarity.UNCOMMON, mage.cards.m.MischievousPoltergeist.class)); - cards.add(new SetCardInfo("Mistmoon Griffin", 137, Rarity.UNCOMMON, mage.cards.m.MistmoonGriffin.class)); - cards.add(new SetCardInfo("Morinfen", 17, Rarity.RARE, mage.cards.m.Morinfen.class)); - cards.add(new SetCardInfo("Mwonvuli Ooze", 77, Rarity.RARE, mage.cards.m.MwonvuliOoze.class)); - cards.add(new SetCardInfo("Nature's Kiss", 78, Rarity.COMMON, mage.cards.n.NaturesKiss.class)); - cards.add(new SetCardInfo("Nature's Resurgence", 79, Rarity.RARE, mage.cards.n.NaturesResurgence.class)); - cards.add(new SetCardInfo("Necratog", 18, Rarity.UNCOMMON, mage.cards.n.Necratog.class)); + cards.add(new SetCardInfo("Mischievous Poltergeist", 74, Rarity.UNCOMMON, mage.cards.m.MischievousPoltergeist.class)); + cards.add(new SetCardInfo("Mistmoon Griffin", 21, Rarity.UNCOMMON, mage.cards.m.MistmoonGriffin.class)); + cards.add(new SetCardInfo("Morinfen", 75, Rarity.RARE, mage.cards.m.Morinfen.class)); + cards.add(new SetCardInfo("Mwonvuli Ooze", 135, Rarity.RARE, mage.cards.m.MwonvuliOoze.class)); + cards.add(new SetCardInfo("Nature's Kiss", 136, Rarity.COMMON, mage.cards.n.NaturesKiss.class)); + cards.add(new SetCardInfo("Nature's Resurgence", 137, Rarity.RARE, mage.cards.n.NaturesResurgence.class)); + cards.add(new SetCardInfo("Necratog", 76, Rarity.UNCOMMON, mage.cards.n.Necratog.class)); cards.add(new SetCardInfo("Noble Benefactor", 44, Rarity.UNCOMMON, mage.cards.n.NobleBenefactor.class)); cards.add(new SetCardInfo("Null Rod", 154, Rarity.RARE, mage.cards.n.NullRod.class)); - cards.add(new SetCardInfo("Odylic Wraith", 19, Rarity.UNCOMMON, mage.cards.o.OdylicWraith.class)); + cards.add(new SetCardInfo("Odylic Wraith", 77, Rarity.UNCOMMON, mage.cards.o.OdylicWraith.class)); cards.add(new SetCardInfo("Ophidian", 45, Rarity.COMMON, mage.cards.o.Ophidian.class)); cards.add(new SetCardInfo("Orcish Settlers", 112, Rarity.UNCOMMON, mage.cards.o.OrcishSettlers.class)); cards.add(new SetCardInfo("Paradigm Shift", 46, Rarity.RARE, mage.cards.p.ParadigmShift.class)); - cards.add(new SetCardInfo("Peacekeeper", 138, Rarity.RARE, mage.cards.p.Peacekeeper.class)); + cards.add(new SetCardInfo("Peacekeeper", 22, Rarity.RARE, mage.cards.p.Peacekeeper.class)); cards.add(new SetCardInfo("Pendrell Mists", 47, Rarity.RARE, mage.cards.p.PendrellMists.class)); cards.add(new SetCardInfo("Phantom Warrior", 48, Rarity.UNCOMMON, mage.cards.p.PhantomWarrior.class)); cards.add(new SetCardInfo("Phantom Wings", 49, Rarity.COMMON, mage.cards.p.PhantomWings.class)); cards.add(new SetCardInfo("Phyrexian Furnace", 155, Rarity.UNCOMMON, mage.cards.p.PhyrexianFurnace.class)); cards.add(new SetCardInfo("Psychic Vortex", 50, Rarity.RARE, mage.cards.p.PsychicVortex.class)); - cards.add(new SetCardInfo("Razortooth Rats", 20, Rarity.COMMON, mage.cards.r.RazortoothRats.class)); - cards.add(new SetCardInfo("Redwood Treefolk", 80, Rarity.COMMON, mage.cards.r.RedwoodTreefolk.class)); + cards.add(new SetCardInfo("Razortooth Rats", 78, Rarity.COMMON, mage.cards.r.RazortoothRats.class)); + cards.add(new SetCardInfo("Redwood Treefolk", 138, Rarity.COMMON, mage.cards.r.RedwoodTreefolk.class)); cards.add(new SetCardInfo("Relearn", 51, Rarity.UNCOMMON, mage.cards.r.Relearn.class)); - cards.add(new SetCardInfo("Revered Unicorn", 139, Rarity.UNCOMMON, mage.cards.r.ReveredUnicorn.class)); + cards.add(new SetCardInfo("Revered Unicorn", 23, Rarity.UNCOMMON, mage.cards.r.ReveredUnicorn.class)); cards.add(new SetCardInfo("Roc Hatchling", 113, Rarity.UNCOMMON, mage.cards.r.RocHatchling.class)); - cards.add(new SetCardInfo("Rogue Elephant", 81, Rarity.COMMON, mage.cards.r.RogueElephant.class)); + cards.add(new SetCardInfo("Rogue Elephant", 139, Rarity.COMMON, mage.cards.r.RogueElephant.class)); cards.add(new SetCardInfo("Sage Owl", 52, Rarity.COMMON, mage.cards.s.SageOwl.class)); cards.add(new SetCardInfo("Scorched Ruins", 166, Rarity.RARE, mage.cards.s.ScorchedRuins.class)); - cards.add(new SetCardInfo("Serenity", 140, Rarity.RARE, mage.cards.s.Serenity.class)); - cards.add(new SetCardInfo("Serra's Blessing", 141, Rarity.UNCOMMON, mage.cards.s.SerrasBlessing.class)); + cards.add(new SetCardInfo("Serenity", 24, Rarity.RARE, mage.cards.s.Serenity.class)); + cards.add(new SetCardInfo("Serra's Blessing", 25, Rarity.UNCOMMON, mage.cards.s.SerrasBlessing.class)); cards.add(new SetCardInfo("Serrated Biskelion", 156, Rarity.UNCOMMON, mage.cards.s.SerratedBiskelion.class)); - cards.add(new SetCardInfo("Shadow Rider", 21, Rarity.COMMON, mage.cards.s.ShadowRider.class)); - cards.add(new SetCardInfo("Shattered Crypt", 22, Rarity.COMMON, mage.cards.s.ShatteredCrypt.class)); - cards.add(new SetCardInfo("Soul Shepherd", 142, Rarity.COMMON, mage.cards.s.SoulShepherd.class)); - cards.add(new SetCardInfo("Southern Paladin", 143, Rarity.RARE, mage.cards.s.SouthernPaladin.class)); - cards.add(new SetCardInfo("Spinning Darkness", 23, Rarity.COMMON, mage.cards.s.SpinningDarkness.class)); + cards.add(new SetCardInfo("Shadow Rider", 79, Rarity.COMMON, mage.cards.s.ShadowRider.class)); + cards.add(new SetCardInfo("Shattered Crypt", 80, Rarity.COMMON, mage.cards.s.ShatteredCrypt.class)); + cards.add(new SetCardInfo("Soul Shepherd", 26, Rarity.COMMON, mage.cards.s.SoulShepherd.class)); + cards.add(new SetCardInfo("Southern Paladin", 27, Rarity.RARE, mage.cards.s.SouthernPaladin.class)); + cards.add(new SetCardInfo("Spinning Darkness", 81, Rarity.COMMON, mage.cards.s.SpinningDarkness.class)); cards.add(new SetCardInfo("Steel Golem", 157, Rarity.UNCOMMON, mage.cards.s.SteelGolem.class)); - cards.add(new SetCardInfo("Strands of Night", 24, Rarity.UNCOMMON, mage.cards.s.StrandsOfNight.class)); + cards.add(new SetCardInfo("Strands of Night", 82, Rarity.UNCOMMON, mage.cards.s.StrandsOfNight.class)); cards.add(new SetCardInfo("Straw Golem", 158, Rarity.UNCOMMON, mage.cards.s.StrawGolem.class)); - cards.add(new SetCardInfo("Striped Bears", 82, Rarity.COMMON, mage.cards.s.StripedBears.class)); - cards.add(new SetCardInfo("Tariff", 144, Rarity.RARE, mage.cards.t.Tariff.class)); + cards.add(new SetCardInfo("Striped Bears", 140, Rarity.COMMON, mage.cards.s.StripedBears.class)); + cards.add(new SetCardInfo("Tariff", 28, Rarity.RARE, mage.cards.t.Tariff.class)); cards.add(new SetCardInfo("Teferi's Veil", 53, Rarity.UNCOMMON, mage.cards.t.TeferisVeil.class)); - cards.add(new SetCardInfo("Tendrils of Despair", 25, Rarity.COMMON, mage.cards.t.TendrilsOfDespair.class)); + cards.add(new SetCardInfo("Tendrils of Despair", 83, Rarity.COMMON, mage.cards.t.TendrilsOfDespair.class)); cards.add(new SetCardInfo("Thran Forge", 159, Rarity.UNCOMMON, mage.cards.t.ThranForge.class)); cards.add(new SetCardInfo("Thunderbolt", 115, Rarity.COMMON, mage.cards.t.Thunderbolt.class)); cards.add(new SetCardInfo("Thundermare", 116, Rarity.RARE, mage.cards.t.Thundermare.class)); @@ -192,19 +192,18 @@ public class Weatherlight extends ExpansionSet { cards.add(new SetCardInfo("Tolarian Entrancer", 56, Rarity.RARE, mage.cards.t.TolarianEntrancer.class)); cards.add(new SetCardInfo("Tolarian Serpent", 57, Rarity.RARE, mage.cards.t.TolarianSerpent.class)); cards.add(new SetCardInfo("Touchstone", 161, Rarity.UNCOMMON, mage.cards.t.Touchstone.class)); - cards.add(new SetCardInfo("Tranquil Grove", 84, Rarity.RARE, mage.cards.t.TranquilGrove.class)); - cards.add(new SetCardInfo("Uktabi Efreet", 85, Rarity.COMMON, mage.cards.u.UktabiEfreet.class)); - cards.add(new SetCardInfo("Urborg Justice", 26, Rarity.RARE, mage.cards.u.UrborgJustice.class)); - cards.add(new SetCardInfo("Urborg Stalker", 27, Rarity.RARE, mage.cards.u.UrborgStalker.class)); - cards.add(new SetCardInfo("Veteran Explorer", 86, Rarity.UNCOMMON, mage.cards.v.VeteranExplorer.class)); - cards.add(new SetCardInfo("Vitalize", 87, Rarity.COMMON, mage.cards.v.Vitalize.class)); + cards.add(new SetCardInfo("Tranquil Grove", 142, Rarity.RARE, mage.cards.t.TranquilGrove.class)); + cards.add(new SetCardInfo("Uktabi Efreet", 143, Rarity.COMMON, mage.cards.u.UktabiEfreet.class)); + cards.add(new SetCardInfo("Urborg Justice", 84, Rarity.RARE, mage.cards.u.UrborgJustice.class)); + cards.add(new SetCardInfo("Urborg Stalker", 85, Rarity.RARE, mage.cards.u.UrborgStalker.class)); + cards.add(new SetCardInfo("Veteran Explorer", 144, Rarity.UNCOMMON, mage.cards.v.VeteranExplorer.class)); + cards.add(new SetCardInfo("Vitalize", 145, Rarity.COMMON, mage.cards.v.Vitalize.class)); cards.add(new SetCardInfo("Vodalian Illusionist", 58, Rarity.UNCOMMON, mage.cards.v.VodalianIllusionist.class)); - cards.add(new SetCardInfo("Volunteer Reserves", 145, Rarity.UNCOMMON, mage.cards.v.VolunteerReserves.class)); - cards.add(new SetCardInfo("Wave of Terror", 28, Rarity.RARE, mage.cards.w.WaveOfTerror.class)); + cards.add(new SetCardInfo("Volunteer Reserves", 29, Rarity.UNCOMMON, mage.cards.v.VolunteerReserves.class)); + cards.add(new SetCardInfo("Wave of Terror", 86, Rarity.RARE, mage.cards.w.WaveOfTerror.class)); cards.add(new SetCardInfo("Well of Knowledge", 162, Rarity.RARE, mage.cards.w.WellOfKnowledge.class)); cards.add(new SetCardInfo("Winding Canyons", 167, Rarity.RARE, mage.cards.w.WindingCanyons.class)); cards.add(new SetCardInfo("Xanthic Statue", 163, Rarity.RARE, mage.cards.x.XanthicStatue.class)); - cards.add(new SetCardInfo("Zombie Scavengers", 29, Rarity.COMMON, mage.cards.z.ZombieScavengers.class)); + cards.add(new SetCardInfo("Zombie Scavengers", 87, Rarity.COMMON, mage.cards.z.ZombieScavengers.class)); } - } From f3bef1c1bcb8b8a05d81afd034acd67308492159 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Thu, 10 May 2018 11:28:30 +0400 Subject: [PATCH 133/158] Fixed card numbers in TMP - Tempest (#4628) --- Mage.Sets/src/mage/sets/Tempest.java | 482 +++++++++++++-------------- 1 file changed, 241 insertions(+), 241 deletions(-) diff --git a/Mage.Sets/src/mage/sets/Tempest.java b/Mage.Sets/src/mage/sets/Tempest.java index 26a956063fb..91069bf74a6 100644 --- a/Mage.Sets/src/mage/sets/Tempest.java +++ b/Mage.Sets/src/mage/sets/Tempest.java @@ -21,347 +21,347 @@ public class Tempest extends ExpansionSet { this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; - cards.add(new SetCardInfo("Abandon Hope", 1, Rarity.UNCOMMON, mage.cards.a.AbandonHope.class)); - cards.add(new SetCardInfo("Advance Scout", 213, Rarity.COMMON, mage.cards.a.AdvanceScout.class)); + cards.add(new SetCardInfo("Abandon Hope", 107, Rarity.UNCOMMON, mage.cards.a.AbandonHope.class)); + cards.add(new SetCardInfo("Advance Scout", 1, Rarity.COMMON, mage.cards.a.AdvanceScout.class)); cards.add(new SetCardInfo("Aftershock", 160, Rarity.COMMON, mage.cards.a.Aftershock.class)); - cards.add(new SetCardInfo("Altar of Dementia", 266, Rarity.RARE, mage.cards.a.AltarOfDementia.class)); - cards.add(new SetCardInfo("Aluren", 107, Rarity.RARE, mage.cards.a.Aluren.class)); + cards.add(new SetCardInfo("Altar of Dementia", 276, Rarity.RARE, mage.cards.a.AltarOfDementia.class)); + cards.add(new SetCardInfo("Aluren", 213, Rarity.RARE, mage.cards.a.Aluren.class)); cards.add(new SetCardInfo("Ancient Runes", 161, Rarity.UNCOMMON, mage.cards.a.AncientRunes.class)); - cards.add(new SetCardInfo("Ancient Tomb", 305, Rarity.UNCOMMON, mage.cards.a.AncientTomb.class)); - cards.add(new SetCardInfo("Angelic Protector", 214, Rarity.UNCOMMON, mage.cards.a.AngelicProtector.class)); - cards.add(new SetCardInfo("Anoint", 215, Rarity.COMMON, mage.cards.a.Anoint.class)); - cards.add(new SetCardInfo("Apes of Rath", 108, Rarity.UNCOMMON, mage.cards.a.ApesOfRath.class)); + cards.add(new SetCardInfo("Ancient Tomb", 315, Rarity.UNCOMMON, mage.cards.a.AncientTomb.class)); + cards.add(new SetCardInfo("Angelic Protector", 2, Rarity.UNCOMMON, mage.cards.a.AngelicProtector.class)); + cards.add(new SetCardInfo("Anoint", 3, Rarity.COMMON, mage.cards.a.Anoint.class)); + cards.add(new SetCardInfo("Apes of Rath", 214, Rarity.UNCOMMON, mage.cards.a.ApesOfRath.class)); cards.add(new SetCardInfo("Apocalypse", 162, Rarity.RARE, mage.cards.a.Apocalypse.class)); - cards.add(new SetCardInfo("Armored Pegasus", 217, Rarity.COMMON, mage.cards.a.ArmoredPegasus.class)); - cards.add(new SetCardInfo("Armor Sliver", 216, Rarity.UNCOMMON, mage.cards.a.ArmorSliver.class)); - cards.add(new SetCardInfo("Auratog", 218, Rarity.RARE, mage.cards.a.Auratog.class)); - cards.add(new SetCardInfo("Avenging Angel", 219, Rarity.RARE, mage.cards.a.AvengingAngel.class)); + cards.add(new SetCardInfo("Armor Sliver", 4, Rarity.UNCOMMON, mage.cards.a.ArmorSliver.class)); + cards.add(new SetCardInfo("Armored Pegasus", 5, Rarity.COMMON, mage.cards.a.ArmoredPegasus.class)); + cards.add(new SetCardInfo("Auratog", 6, Rarity.RARE, mage.cards.a.Auratog.class)); + cards.add(new SetCardInfo("Avenging Angel", 7, Rarity.RARE, mage.cards.a.AvengingAngel.class)); cards.add(new SetCardInfo("Barbed Sliver", 163, Rarity.UNCOMMON, mage.cards.b.BarbedSliver.class)); - cards.add(new SetCardInfo("Bayou Dragonfly", 109, Rarity.COMMON, mage.cards.b.BayouDragonfly.class)); - cards.add(new SetCardInfo("Bellowing Fiend", 2, Rarity.RARE, mage.cards.b.BellowingFiend.class)); + cards.add(new SetCardInfo("Bayou Dragonfly", 215, Rarity.COMMON, mage.cards.b.BayouDragonfly.class)); + cards.add(new SetCardInfo("Bellowing Fiend", 108, Rarity.RARE, mage.cards.b.BellowingFiend.class)); cards.add(new SetCardInfo("Benthic Behemoth", 54, Rarity.RARE, mage.cards.b.BenthicBehemoth.class)); cards.add(new SetCardInfo("Blood Frenzy", 164, Rarity.COMMON, mage.cards.b.BloodFrenzy.class)); - cards.add(new SetCardInfo("Blood Pet", 3, Rarity.COMMON, mage.cards.b.BloodPet.class)); + cards.add(new SetCardInfo("Blood Pet", 109, Rarity.COMMON, mage.cards.b.BloodPet.class)); cards.add(new SetCardInfo("Boil", 165, Rarity.UNCOMMON, mage.cards.b.Boil.class)); - cards.add(new SetCardInfo("Bottle Gnomes", 268, Rarity.UNCOMMON, mage.cards.b.BottleGnomes.class)); - cards.add(new SetCardInfo("Bounty Hunter", 4, Rarity.RARE, mage.cards.b.BountyHunter.class)); - cards.add(new SetCardInfo("Broken Fall", 110, Rarity.COMMON, mage.cards.b.BrokenFall.class)); - cards.add(new SetCardInfo("Caldera Lake", 306, Rarity.RARE, mage.cards.c.CalderaLake.class)); - cards.add(new SetCardInfo("Canopy Spider", 111, Rarity.COMMON, mage.cards.c.CanopySpider.class)); + cards.add(new SetCardInfo("Bottle Gnomes", 278, Rarity.UNCOMMON, mage.cards.b.BottleGnomes.class)); + cards.add(new SetCardInfo("Bounty Hunter", 110, Rarity.RARE, mage.cards.b.BountyHunter.class)); + cards.add(new SetCardInfo("Broken Fall", 216, Rarity.COMMON, mage.cards.b.BrokenFall.class)); + cards.add(new SetCardInfo("Caldera Lake", 316, Rarity.RARE, mage.cards.c.CalderaLake.class)); + cards.add(new SetCardInfo("Canopy Spider", 217, Rarity.COMMON, mage.cards.c.CanopySpider.class)); cards.add(new SetCardInfo("Canyon Drake", 166, Rarity.RARE, mage.cards.c.CanyonDrake.class)); cards.add(new SetCardInfo("Canyon Wildcat", 167, Rarity.COMMON, mage.cards.c.CanyonWildcat.class)); cards.add(new SetCardInfo("Capsize", 55, Rarity.COMMON, mage.cards.c.Capsize.class)); - cards.add(new SetCardInfo("Carrionette", 5, Rarity.RARE, mage.cards.c.Carrionette.class)); + cards.add(new SetCardInfo("Carrionette", 111, Rarity.RARE, mage.cards.c.Carrionette.class)); cards.add(new SetCardInfo("Chaotic Goo", 168, Rarity.RARE, mage.cards.c.ChaoticGoo.class)); - cards.add(new SetCardInfo("Charging Rhino", 112, Rarity.UNCOMMON, mage.cards.c.ChargingRhino.class)); + cards.add(new SetCardInfo("Charging Rhino", 218, Rarity.UNCOMMON, mage.cards.c.ChargingRhino.class)); cards.add(new SetCardInfo("Chill", 56, Rarity.UNCOMMON, mage.cards.c.Chill.class)); - cards.add(new SetCardInfo("Choke", 113, Rarity.UNCOMMON, mage.cards.c.Choke.class)); - cards.add(new SetCardInfo("Cinder Marsh", 307, Rarity.UNCOMMON, mage.cards.c.CinderMarsh.class)); - cards.add(new SetCardInfo("Circle of Protection: Black", 220, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlack.class)); - cards.add(new SetCardInfo("Circle of Protection: Blue", 221, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlue.class)); - cards.add(new SetCardInfo("Circle of Protection: Green", 222, Rarity.COMMON, mage.cards.c.CircleOfProtectionGreen.class)); - cards.add(new SetCardInfo("Circle of Protection: Red", 223, Rarity.COMMON, mage.cards.c.CircleOfProtectionRed.class)); - cards.add(new SetCardInfo("Circle of Protection: Shadow", 224, Rarity.COMMON, mage.cards.c.CircleOfProtectionShadow.class)); - cards.add(new SetCardInfo("Circle of Protection: White", 225, Rarity.COMMON, mage.cards.c.CircleOfProtectionWhite.class)); - cards.add(new SetCardInfo("Clergy en-Vec", 226, Rarity.COMMON, mage.cards.c.ClergyEnVec.class)); - cards.add(new SetCardInfo("Clot Sliver", 6, Rarity.COMMON, mage.cards.c.ClotSliver.class)); - cards.add(new SetCardInfo("Cloudchaser Eagle", 227, Rarity.COMMON, mage.cards.c.CloudchaserEagle.class)); - cards.add(new SetCardInfo("Coercion", 7, Rarity.COMMON, mage.cards.c.Coercion.class)); - cards.add(new SetCardInfo("Coffin Queen", 8, Rarity.RARE, mage.cards.c.CoffinQueen.class)); - cards.add(new SetCardInfo("Coiled Tinviper", 269, Rarity.COMMON, mage.cards.c.CoiledTinviper.class)); - cards.add(new SetCardInfo("Cold Storage", 270, Rarity.RARE, mage.cards.c.ColdStorage.class)); - cards.add(new SetCardInfo("Commander Greven il-Vec", 9, Rarity.RARE, mage.cards.c.CommanderGrevenIlVec.class)); - cards.add(new SetCardInfo("Corpse Dance", 10, Rarity.RARE, mage.cards.c.CorpseDance.class)); + cards.add(new SetCardInfo("Choke", 219, Rarity.UNCOMMON, mage.cards.c.Choke.class)); + cards.add(new SetCardInfo("Cinder Marsh", 317, Rarity.UNCOMMON, mage.cards.c.CinderMarsh.class)); + cards.add(new SetCardInfo("Circle of Protection: Black", 8, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlack.class)); + cards.add(new SetCardInfo("Circle of Protection: Blue", 9, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlue.class)); + cards.add(new SetCardInfo("Circle of Protection: Green", 10, Rarity.COMMON, mage.cards.c.CircleOfProtectionGreen.class)); + cards.add(new SetCardInfo("Circle of Protection: Red", 11, Rarity.COMMON, mage.cards.c.CircleOfProtectionRed.class)); + cards.add(new SetCardInfo("Circle of Protection: Shadow", 12, Rarity.COMMON, mage.cards.c.CircleOfProtectionShadow.class)); + cards.add(new SetCardInfo("Circle of Protection: White", 13, Rarity.COMMON, mage.cards.c.CircleOfProtectionWhite.class)); + cards.add(new SetCardInfo("Clergy en-Vec", 14, Rarity.COMMON, mage.cards.c.ClergyEnVec.class)); + cards.add(new SetCardInfo("Clot Sliver", 112, Rarity.COMMON, mage.cards.c.ClotSliver.class)); + cards.add(new SetCardInfo("Cloudchaser Eagle", 15, Rarity.COMMON, mage.cards.c.CloudchaserEagle.class)); + cards.add(new SetCardInfo("Coercion", 113, Rarity.COMMON, mage.cards.c.Coercion.class)); + cards.add(new SetCardInfo("Coffin Queen", 114, Rarity.RARE, mage.cards.c.CoffinQueen.class)); + cards.add(new SetCardInfo("Coiled Tinviper", 279, Rarity.COMMON, mage.cards.c.CoiledTinviper.class)); + cards.add(new SetCardInfo("Cold Storage", 280, Rarity.RARE, mage.cards.c.ColdStorage.class)); + cards.add(new SetCardInfo("Commander Greven il-Vec", 115, Rarity.RARE, mage.cards.c.CommanderGrevenIlVec.class)); + cards.add(new SetCardInfo("Corpse Dance", 116, Rarity.RARE, mage.cards.c.CorpseDance.class)); cards.add(new SetCardInfo("Counterspell", 57, Rarity.COMMON, mage.cards.c.Counterspell.class)); - cards.add(new SetCardInfo("Crazed Armodon", 114, Rarity.RARE, mage.cards.c.CrazedArmodon.class)); + cards.add(new SetCardInfo("Crazed Armodon", 220, Rarity.RARE, mage.cards.c.CrazedArmodon.class)); cards.add(new SetCardInfo("Crown of Flames", 169, Rarity.COMMON, mage.cards.c.CrownOfFlames.class)); - cards.add(new SetCardInfo("Cursed Scroll", 271, Rarity.RARE, mage.cards.c.CursedScroll.class)); - cards.add(new SetCardInfo("Dark Banishing", 11, Rarity.COMMON, mage.cards.d.DarkBanishing.class)); - cards.add(new SetCardInfo("Darkling Stalker", 13, Rarity.COMMON, mage.cards.d.DarklingStalker.class)); - cards.add(new SetCardInfo("Dark Ritual", 12, Rarity.COMMON, mage.cards.d.DarkRitual.class)); - cards.add(new SetCardInfo("Dauthi Embrace", 14, Rarity.UNCOMMON, mage.cards.d.DauthiEmbrace.class)); - cards.add(new SetCardInfo("Dauthi Ghoul", 15, Rarity.UNCOMMON, mage.cards.d.DauthiGhoul.class)); - cards.add(new SetCardInfo("Dauthi Horror", 16, Rarity.COMMON, mage.cards.d.DauthiHorror.class)); - cards.add(new SetCardInfo("Dauthi Marauder", 17, Rarity.COMMON, mage.cards.d.DauthiMarauder.class)); - cards.add(new SetCardInfo("Dauthi Mercenary", 18, Rarity.UNCOMMON, mage.cards.d.DauthiMercenary.class)); - cards.add(new SetCardInfo("Dauthi Mindripper", 19, Rarity.UNCOMMON, mage.cards.d.DauthiMindripper.class)); - cards.add(new SetCardInfo("Dauthi Slayer", 20, Rarity.COMMON, mage.cards.d.DauthiSlayer.class)); + cards.add(new SetCardInfo("Cursed Scroll", 281, Rarity.RARE, mage.cards.c.CursedScroll.class)); + cards.add(new SetCardInfo("Dark Banishing", 117, Rarity.COMMON, mage.cards.d.DarkBanishing.class)); + cards.add(new SetCardInfo("Dark Ritual", 118, Rarity.COMMON, mage.cards.d.DarkRitual.class)); + cards.add(new SetCardInfo("Darkling Stalker", 119, Rarity.COMMON, mage.cards.d.DarklingStalker.class)); + cards.add(new SetCardInfo("Dauthi Embrace", 120, Rarity.UNCOMMON, mage.cards.d.DauthiEmbrace.class)); + cards.add(new SetCardInfo("Dauthi Ghoul", 121, Rarity.UNCOMMON, mage.cards.d.DauthiGhoul.class)); + cards.add(new SetCardInfo("Dauthi Horror", 122, Rarity.COMMON, mage.cards.d.DauthiHorror.class)); + cards.add(new SetCardInfo("Dauthi Marauder", 123, Rarity.COMMON, mage.cards.d.DauthiMarauder.class)); + cards.add(new SetCardInfo("Dauthi Mercenary", 124, Rarity.UNCOMMON, mage.cards.d.DauthiMercenary.class)); + cards.add(new SetCardInfo("Dauthi Mindripper", 125, Rarity.UNCOMMON, mage.cards.d.DauthiMindripper.class)); + cards.add(new SetCardInfo("Dauthi Slayer", 126, Rarity.COMMON, mage.cards.d.DauthiSlayer.class)); cards.add(new SetCardInfo("Deadshot", 170, Rarity.RARE, mage.cards.d.Deadshot.class)); - cards.add(new SetCardInfo("Death Pits of Rath", 21, Rarity.RARE, mage.cards.d.DeathPitsOfRath.class)); - cards.add(new SetCardInfo("Diabolic Edict", 22, Rarity.COMMON, mage.cards.d.DiabolicEdict.class)); - cards.add(new SetCardInfo("Dirtcowl Wurm", 115, Rarity.RARE, mage.cards.d.DirtcowlWurm.class)); - cards.add(new SetCardInfo("Disenchant", 228, Rarity.COMMON, mage.cards.d.Disenchant.class)); + cards.add(new SetCardInfo("Death Pits of Rath", 127, Rarity.RARE, mage.cards.d.DeathPitsOfRath.class)); + cards.add(new SetCardInfo("Diabolic Edict", 128, Rarity.COMMON, mage.cards.d.DiabolicEdict.class)); + cards.add(new SetCardInfo("Dirtcowl Wurm", 221, Rarity.RARE, mage.cards.d.DirtcowlWurm.class)); + cards.add(new SetCardInfo("Disenchant", 16, Rarity.COMMON, mage.cards.d.Disenchant.class)); cards.add(new SetCardInfo("Dismiss", 58, Rarity.UNCOMMON, mage.cards.d.Dismiss.class)); - cards.add(new SetCardInfo("Disturbed Burial", 23, Rarity.COMMON, mage.cards.d.DisturbedBurial.class)); - cards.add(new SetCardInfo("Dracoplasm", 341, Rarity.RARE, mage.cards.d.Dracoplasm.class)); - cards.add(new SetCardInfo("Dread of Night", 24, Rarity.UNCOMMON, mage.cards.d.DreadOfNight.class)); + cards.add(new SetCardInfo("Disturbed Burial", 129, Rarity.COMMON, mage.cards.d.DisturbedBurial.class)); + cards.add(new SetCardInfo("Dracoplasm", 266, Rarity.RARE, mage.cards.d.Dracoplasm.class)); + cards.add(new SetCardInfo("Dread of Night", 130, Rarity.UNCOMMON, mage.cards.d.DreadOfNight.class)); cards.add(new SetCardInfo("Dream Cache", 59, Rarity.COMMON, mage.cards.d.DreamCache.class)); - cards.add(new SetCardInfo("Dregs of Sorrow", 25, Rarity.RARE, mage.cards.d.DregsOfSorrow.class)); - cards.add(new SetCardInfo("Earthcraft", 116, Rarity.RARE, mage.cards.e.Earthcraft.class)); - cards.add(new SetCardInfo("Echo Chamber", 272, Rarity.RARE, mage.cards.e.EchoChamber.class)); - cards.add(new SetCardInfo("Eladamri, Lord of Leaves", 117, Rarity.RARE, mage.cards.e.EladamriLordOfLeaves.class)); - cards.add(new SetCardInfo("Eladamri's Vineyard", 118, Rarity.RARE, mage.cards.e.EladamrisVineyard.class)); - cards.add(new SetCardInfo("Elite Javelineer", 229, Rarity.COMMON, mage.cards.e.EliteJavelineer.class)); - cards.add(new SetCardInfo("Elven Warhounds", 119, Rarity.RARE, mage.cards.e.ElvenWarhounds.class)); - cards.add(new SetCardInfo("Elvish Fury", 120, Rarity.UNCOMMON, mage.cards.e.ElvishFury.class)); - cards.add(new SetCardInfo("Emerald Medallion", 273, Rarity.RARE, mage.cards.e.EmeraldMedallion.class)); - cards.add(new SetCardInfo("Emmessi Tome", 274, Rarity.RARE, mage.cards.e.EmmessiTome.class)); - cards.add(new SetCardInfo("Endless Scream", 26, Rarity.COMMON, mage.cards.e.EndlessScream.class)); - cards.add(new SetCardInfo("Energizer", 275, Rarity.RARE, mage.cards.e.Energizer.class)); - cards.add(new SetCardInfo("Enfeeblement", 27, Rarity.COMMON, mage.cards.e.Enfeeblement.class)); + cards.add(new SetCardInfo("Dregs of Sorrow", 131, Rarity.RARE, mage.cards.d.DregsOfSorrow.class)); + cards.add(new SetCardInfo("Earthcraft", 222, Rarity.RARE, mage.cards.e.Earthcraft.class)); + cards.add(new SetCardInfo("Echo Chamber", 282, Rarity.RARE, mage.cards.e.EchoChamber.class)); + cards.add(new SetCardInfo("Eladamri's Vineyard", 223, Rarity.RARE, mage.cards.e.EladamrisVineyard.class)); + cards.add(new SetCardInfo("Eladamri, Lord of Leaves", 224, Rarity.RARE, mage.cards.e.EladamriLordOfLeaves.class)); + cards.add(new SetCardInfo("Elite Javelineer", 17, Rarity.COMMON, mage.cards.e.EliteJavelineer.class)); + cards.add(new SetCardInfo("Elven Warhounds", 225, Rarity.RARE, mage.cards.e.ElvenWarhounds.class)); + cards.add(new SetCardInfo("Elvish Fury", 226, Rarity.UNCOMMON, mage.cards.e.ElvishFury.class)); + cards.add(new SetCardInfo("Emerald Medallion", 283, Rarity.RARE, mage.cards.e.EmeraldMedallion.class)); + cards.add(new SetCardInfo("Emmessi Tome", 284, Rarity.RARE, mage.cards.e.EmmessiTome.class)); + cards.add(new SetCardInfo("Endless Scream", 132, Rarity.COMMON, mage.cards.e.EndlessScream.class)); + cards.add(new SetCardInfo("Energizer", 285, Rarity.RARE, mage.cards.e.Energizer.class)); + cards.add(new SetCardInfo("Enfeeblement", 133, Rarity.COMMON, mage.cards.e.Enfeeblement.class)); cards.add(new SetCardInfo("Enraging Licid", 171, Rarity.UNCOMMON, mage.cards.e.EnragingLicid.class)); - cards.add(new SetCardInfo("Essence Bottle", 276, Rarity.UNCOMMON, mage.cards.e.EssenceBottle.class)); - cards.add(new SetCardInfo("Evincar's Justice", 28, Rarity.COMMON, mage.cards.e.EvincarsJustice.class)); - cards.add(new SetCardInfo("Excavator", 277, Rarity.UNCOMMON, mage.cards.e.Excavator.class)); - cards.add(new SetCardInfo("Extinction", 29, Rarity.RARE, mage.cards.e.Extinction.class)); - cards.add(new SetCardInfo("Fevered Convulsions", 30, Rarity.RARE, mage.cards.f.FeveredConvulsions.class)); - cards.add(new SetCardInfo("Field of Souls", 230, Rarity.RARE, mage.cards.f.FieldOfSouls.class)); + cards.add(new SetCardInfo("Essence Bottle", 286, Rarity.UNCOMMON, mage.cards.e.EssenceBottle.class)); + cards.add(new SetCardInfo("Evincar's Justice", 134, Rarity.COMMON, mage.cards.e.EvincarsJustice.class)); + cards.add(new SetCardInfo("Excavator", 287, Rarity.UNCOMMON, mage.cards.e.Excavator.class)); + cards.add(new SetCardInfo("Extinction", 135, Rarity.RARE, mage.cards.e.Extinction.class)); + cards.add(new SetCardInfo("Fevered Convulsions", 136, Rarity.RARE, mage.cards.f.FeveredConvulsions.class)); + cards.add(new SetCardInfo("Field of Souls", 18, Rarity.RARE, mage.cards.f.FieldOfSouls.class)); cards.add(new SetCardInfo("Fighting Drake", 63, Rarity.UNCOMMON, mage.cards.f.FightingDrake.class)); cards.add(new SetCardInfo("Firefly", 172, Rarity.UNCOMMON, mage.cards.f.Firefly.class)); cards.add(new SetCardInfo("Fireslinger", 173, Rarity.COMMON, mage.cards.f.Fireslinger.class)); - cards.add(new SetCardInfo("Flailing Drake", 121, Rarity.UNCOMMON, mage.cards.f.FlailingDrake.class)); - cards.add(new SetCardInfo("Flickering Ward", 231, Rarity.UNCOMMON, mage.cards.f.FlickeringWard.class)); + cards.add(new SetCardInfo("Flailing Drake", 227, Rarity.UNCOMMON, mage.cards.f.FlailingDrake.class)); + cards.add(new SetCardInfo("Flickering Ward", 19, Rarity.UNCOMMON, mage.cards.f.FlickeringWard.class)); cards.add(new SetCardInfo("Flowstone Giant", 174, Rarity.COMMON, mage.cards.f.FlowstoneGiant.class)); cards.add(new SetCardInfo("Flowstone Salamander", 175, Rarity.UNCOMMON, mage.cards.f.FlowstoneSalamander.class)); - cards.add(new SetCardInfo("Flowstone Sculpture", 278, Rarity.RARE, mage.cards.f.FlowstoneSculpture.class)); + cards.add(new SetCardInfo("Flowstone Sculpture", 288, Rarity.RARE, mage.cards.f.FlowstoneSculpture.class)); cards.add(new SetCardInfo("Flowstone Wyvern", 176, Rarity.RARE, mage.cards.f.FlowstoneWyvern.class)); - cards.add(new SetCardInfo("Fool's Tome", 279, Rarity.RARE, mage.cards.f.FoolsTome.class)); - cards.add(new SetCardInfo("Forest", 308, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Forest", 309, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Forest", 310, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Forest", 311, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Frog Tongue", 122, Rarity.COMMON, mage.cards.f.FrogTongue.class)); - cards.add(new SetCardInfo("Fugitive Druid", 123, Rarity.RARE, mage.cards.f.FugitiveDruid.class)); + cards.add(new SetCardInfo("Fool's Tome", 289, Rarity.RARE, mage.cards.f.FoolsTome.class)); + cards.add(new SetCardInfo("Forest", 347, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 348, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 349, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 350, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Frog Tongue", 228, Rarity.COMMON, mage.cards.f.FrogTongue.class)); + cards.add(new SetCardInfo("Fugitive Druid", 229, Rarity.RARE, mage.cards.f.FugitiveDruid.class)); cards.add(new SetCardInfo("Furnace of Rath", 177, Rarity.RARE, mage.cards.f.FurnaceOfRath.class)); cards.add(new SetCardInfo("Fylamarid", 64, Rarity.UNCOMMON, mage.cards.f.Fylamarid.class)); - cards.add(new SetCardInfo("Gallantry", 232, Rarity.UNCOMMON, mage.cards.g.Gallantry.class)); + cards.add(new SetCardInfo("Gallantry", 20, Rarity.UNCOMMON, mage.cards.g.Gallantry.class)); cards.add(new SetCardInfo("Gaseous Form", 65, Rarity.COMMON, mage.cards.g.GaseousForm.class)); - cards.add(new SetCardInfo("Gerrard's Battle Cry", 233, Rarity.RARE, mage.cards.g.GerrardsBattleCry.class)); - cards.add(new SetCardInfo("Ghost Town", 312, Rarity.UNCOMMON, mage.cards.g.GhostTown.class)); + cards.add(new SetCardInfo("Gerrard's Battle Cry", 21, Rarity.RARE, mage.cards.g.GerrardsBattleCry.class)); + cards.add(new SetCardInfo("Ghost Town", 318, Rarity.UNCOMMON, mage.cards.g.GhostTown.class)); cards.add(new SetCardInfo("Giant Crab", 66, Rarity.COMMON, mage.cards.g.GiantCrab.class)); cards.add(new SetCardInfo("Giant Strength", 178, Rarity.COMMON, mage.cards.g.GiantStrength.class)); cards.add(new SetCardInfo("Goblin Bombardment", 179, Rarity.UNCOMMON, mage.cards.g.GoblinBombardment.class)); - cards.add(new SetCardInfo("Gravedigger", 31, Rarity.COMMON, mage.cards.g.Gravedigger.class)); - cards.add(new SetCardInfo("Grindstone", 280, Rarity.RARE, mage.cards.g.Grindstone.class)); + cards.add(new SetCardInfo("Gravedigger", 137, Rarity.COMMON, mage.cards.g.Gravedigger.class)); + cards.add(new SetCardInfo("Grindstone", 290, Rarity.RARE, mage.cards.g.Grindstone.class)); cards.add(new SetCardInfo("Hand to Hand", 180, Rarity.RARE, mage.cards.h.HandToHand.class)); - cards.add(new SetCardInfo("Hanna's Custody", 234, Rarity.RARE, mage.cards.h.HannasCustody.class)); - cards.add(new SetCardInfo("Harrow", 124, Rarity.UNCOMMON, mage.cards.h.Harrow.class)); + cards.add(new SetCardInfo("Hanna's Custody", 22, Rarity.RARE, mage.cards.h.HannasCustody.class)); + cards.add(new SetCardInfo("Harrow", 230, Rarity.UNCOMMON, mage.cards.h.Harrow.class)); cards.add(new SetCardInfo("Havoc", 181, Rarity.UNCOMMON, mage.cards.h.Havoc.class)); cards.add(new SetCardInfo("Heart Sliver", 182, Rarity.COMMON, mage.cards.h.HeartSliver.class)); - cards.add(new SetCardInfo("Heartwood Dryad", 125, Rarity.COMMON, mage.cards.h.HeartwoodDryad.class)); - cards.add(new SetCardInfo("Heartwood Giant", 126, Rarity.RARE, mage.cards.h.HeartwoodGiant.class)); - cards.add(new SetCardInfo("Heartwood Treefolk", 127, Rarity.UNCOMMON, mage.cards.h.HeartwoodTreefolk.class)); - cards.add(new SetCardInfo("Helm of Possession", 281, Rarity.RARE, mage.cards.h.HelmOfPossession.class)); - cards.add(new SetCardInfo("Hero's Resolve", 235, Rarity.COMMON, mage.cards.h.HerosResolve.class)); - cards.add(new SetCardInfo("Horned Sliver", 128, Rarity.UNCOMMON, mage.cards.h.HornedSliver.class)); + cards.add(new SetCardInfo("Heartwood Dryad", 231, Rarity.COMMON, mage.cards.h.HeartwoodDryad.class)); + cards.add(new SetCardInfo("Heartwood Giant", 232, Rarity.RARE, mage.cards.h.HeartwoodGiant.class)); + cards.add(new SetCardInfo("Heartwood Treefolk", 233, Rarity.UNCOMMON, mage.cards.h.HeartwoodTreefolk.class)); + cards.add(new SetCardInfo("Helm of Possession", 291, Rarity.RARE, mage.cards.h.HelmOfPossession.class)); + cards.add(new SetCardInfo("Hero's Resolve", 23, Rarity.COMMON, mage.cards.h.HerosResolve.class)); + cards.add(new SetCardInfo("Horned Sliver", 234, Rarity.UNCOMMON, mage.cards.h.HornedSliver.class)); cards.add(new SetCardInfo("Horned Turtle", 67, Rarity.COMMON, mage.cards.h.HornedTurtle.class)); - cards.add(new SetCardInfo("Humility", 236, Rarity.RARE, mage.cards.h.Humility.class)); - cards.add(new SetCardInfo("Imps' Taunt", 32, Rarity.UNCOMMON, mage.cards.i.ImpsTaunt.class)); + cards.add(new SetCardInfo("Humility", 24, Rarity.RARE, mage.cards.h.Humility.class)); + cards.add(new SetCardInfo("Imps' Taunt", 138, Rarity.UNCOMMON, mage.cards.i.ImpsTaunt.class)); cards.add(new SetCardInfo("Insight", 68, Rarity.UNCOMMON, mage.cards.i.Insight.class)); cards.add(new SetCardInfo("Interdict", 69, Rarity.UNCOMMON, mage.cards.i.Interdict.class)); cards.add(new SetCardInfo("Intuition", 70, Rarity.RARE, mage.cards.i.Intuition.class)); - cards.add(new SetCardInfo("Invulnerability", 237, Rarity.UNCOMMON, mage.cards.i.Invulnerability.class)); - cards.add(new SetCardInfo("Island", 313, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Island", 314, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Island", 315, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Island", 316, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Invulnerability", 25, Rarity.UNCOMMON, mage.cards.i.Invulnerability.class)); + cards.add(new SetCardInfo("Island", 335, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 336, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 337, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 338, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Jackal Pup", 183, Rarity.UNCOMMON, mage.cards.j.JackalPup.class)); - cards.add(new SetCardInfo("Jet Medallion", 282, Rarity.RARE, mage.cards.j.JetMedallion.class)); - cards.add(new SetCardInfo("Jinxed Idol", 283, Rarity.RARE, mage.cards.j.JinxedIdol.class)); - cards.add(new SetCardInfo("Kezzerdrix", 33, Rarity.RARE, mage.cards.k.Kezzerdrix.class)); + cards.add(new SetCardInfo("Jet Medallion", 292, Rarity.RARE, mage.cards.j.JetMedallion.class)); + cards.add(new SetCardInfo("Jinxed Idol", 293, Rarity.RARE, mage.cards.j.JinxedIdol.class)); + cards.add(new SetCardInfo("Kezzerdrix", 139, Rarity.RARE, mage.cards.k.Kezzerdrix.class)); cards.add(new SetCardInfo("Kindle", 184, Rarity.COMMON, mage.cards.k.Kindle.class)); - cards.add(new SetCardInfo("Knight of Dawn", 238, Rarity.UNCOMMON, mage.cards.k.KnightOfDawn.class)); - cards.add(new SetCardInfo("Knight of Dusk", 34, Rarity.UNCOMMON, mage.cards.k.KnightOfDusk.class)); - cards.add(new SetCardInfo("Krakilin", 129, Rarity.UNCOMMON, mage.cards.k.Krakilin.class)); - cards.add(new SetCardInfo("Leeching Licid", 35, Rarity.UNCOMMON, mage.cards.l.LeechingLicid.class)); + cards.add(new SetCardInfo("Knight of Dawn", 26, Rarity.UNCOMMON, mage.cards.k.KnightOfDawn.class)); + cards.add(new SetCardInfo("Knight of Dusk", 140, Rarity.UNCOMMON, mage.cards.k.KnightOfDusk.class)); + cards.add(new SetCardInfo("Krakilin", 235, Rarity.UNCOMMON, mage.cards.k.Krakilin.class)); + cards.add(new SetCardInfo("Leeching Licid", 141, Rarity.UNCOMMON, mage.cards.l.LeechingLicid.class)); cards.add(new SetCardInfo("Legacy's Allure", 71, Rarity.UNCOMMON, mage.cards.l.LegacysAllure.class)); cards.add(new SetCardInfo("Legerdemain", 72, Rarity.UNCOMMON, mage.cards.l.Legerdemain.class)); + cards.add(new SetCardInfo("Light of Day", 27, Rarity.UNCOMMON, mage.cards.l.LightOfDay.class)); cards.add(new SetCardInfo("Lightning Blast", 185, Rarity.COMMON, mage.cards.l.LightningBlast.class)); cards.add(new SetCardInfo("Lightning Elemental", 186, Rarity.COMMON, mage.cards.l.LightningElemental.class)); - cards.add(new SetCardInfo("Light of Day", 239, Rarity.UNCOMMON, mage.cards.l.LightOfDay.class)); - cards.add(new SetCardInfo("Living Death", 36, Rarity.RARE, mage.cards.l.LivingDeath.class)); - cards.add(new SetCardInfo("Lobotomy", 342, Rarity.UNCOMMON, mage.cards.l.Lobotomy.class)); - cards.add(new SetCardInfo("Lotus Petal", 284, Rarity.COMMON, mage.cards.l.LotusPetal.class)); + cards.add(new SetCardInfo("Living Death", 142, Rarity.RARE, mage.cards.l.LivingDeath.class)); + cards.add(new SetCardInfo("Lobotomy", 267, Rarity.UNCOMMON, mage.cards.l.Lobotomy.class)); + cards.add(new SetCardInfo("Lotus Petal", 294, Rarity.COMMON, mage.cards.l.LotusPetal.class)); cards.add(new SetCardInfo("Lowland Giant", 187, Rarity.COMMON, mage.cards.l.LowlandGiant.class)); - cards.add(new SetCardInfo("Maddening Imp", 37, Rarity.RARE, mage.cards.m.MaddeningImp.class)); + cards.add(new SetCardInfo("Maddening Imp", 143, Rarity.RARE, mage.cards.m.MaddeningImp.class)); cards.add(new SetCardInfo("Magmasaur", 188, Rarity.RARE, mage.cards.m.Magmasaur.class)); - cards.add(new SetCardInfo("Manakin", 286, Rarity.COMMON, mage.cards.m.Manakin.class)); cards.add(new SetCardInfo("Mana Severance", 73, Rarity.RARE, mage.cards.m.ManaSeverance.class)); + cards.add(new SetCardInfo("Manakin", 296, Rarity.COMMON, mage.cards.m.Manakin.class)); cards.add(new SetCardInfo("Manta Riders", 74, Rarity.COMMON, mage.cards.m.MantaRiders.class)); - cards.add(new SetCardInfo("Marble Titan", 240, Rarity.RARE, mage.cards.m.MarbleTitan.class)); - cards.add(new SetCardInfo("Marsh Lurker", 38, Rarity.COMMON, mage.cards.m.MarshLurker.class)); - cards.add(new SetCardInfo("Master Decoy", 241, Rarity.COMMON, mage.cards.m.MasterDecoy.class)); + cards.add(new SetCardInfo("Marble Titan", 28, Rarity.RARE, mage.cards.m.MarbleTitan.class)); + cards.add(new SetCardInfo("Marsh Lurker", 144, Rarity.COMMON, mage.cards.m.MarshLurker.class)); + cards.add(new SetCardInfo("Master Decoy", 29, Rarity.COMMON, mage.cards.m.MasterDecoy.class)); cards.add(new SetCardInfo("Mawcor", 75, Rarity.RARE, mage.cards.m.Mawcor.class)); - cards.add(new SetCardInfo("Maze of Shadows", 317, Rarity.UNCOMMON, mage.cards.m.MazeOfShadows.class)); + cards.add(new SetCardInfo("Maze of Shadows", 319, Rarity.UNCOMMON, mage.cards.m.MazeOfShadows.class)); cards.add(new SetCardInfo("Meditate", 76, Rarity.RARE, mage.cards.m.Meditate.class)); - cards.add(new SetCardInfo("Metallic Sliver", 287, Rarity.COMMON, mage.cards.m.MetallicSliver.class)); - cards.add(new SetCardInfo("Mindwhip Sliver", 39, Rarity.UNCOMMON, mage.cards.m.MindwhipSliver.class)); - cards.add(new SetCardInfo("Minion of the Wastes", 40, Rarity.RARE, mage.cards.m.MinionOfTheWastes.class)); - cards.add(new SetCardInfo("Mirri's Guile", 130, Rarity.RARE, mage.cards.m.MirrisGuile.class)); + cards.add(new SetCardInfo("Metallic Sliver", 297, Rarity.COMMON, mage.cards.m.MetallicSliver.class)); + cards.add(new SetCardInfo("Mindwhip Sliver", 145, Rarity.UNCOMMON, mage.cards.m.MindwhipSliver.class)); + cards.add(new SetCardInfo("Minion of the Wastes", 146, Rarity.RARE, mage.cards.m.MinionOfTheWastes.class)); + cards.add(new SetCardInfo("Mirri's Guile", 236, Rarity.RARE, mage.cards.m.MirrisGuile.class)); cards.add(new SetCardInfo("Mnemonic Sliver", 77, Rarity.UNCOMMON, mage.cards.m.MnemonicSliver.class)); - cards.add(new SetCardInfo("Mogg Cannon", 288, Rarity.UNCOMMON, mage.cards.m.MoggCannon.class)); + cards.add(new SetCardInfo("Mogg Cannon", 298, Rarity.UNCOMMON, mage.cards.m.MoggCannon.class)); cards.add(new SetCardInfo("Mogg Conscripts", 189, Rarity.COMMON, mage.cards.m.MoggConscripts.class)); cards.add(new SetCardInfo("Mogg Fanatic", 190, Rarity.COMMON, mage.cards.m.MoggFanatic.class)); - cards.add(new SetCardInfo("Mogg Hollows", 318, Rarity.UNCOMMON, mage.cards.m.MoggHollows.class)); + cards.add(new SetCardInfo("Mogg Hollows", 320, Rarity.UNCOMMON, mage.cards.m.MoggHollows.class)); cards.add(new SetCardInfo("Mogg Raider", 191, Rarity.COMMON, mage.cards.m.MoggRaider.class)); cards.add(new SetCardInfo("Mogg Squad", 192, Rarity.COMMON, mage.cards.m.MoggSquad.class)); - cards.add(new SetCardInfo("Mongrel Pack", 131, Rarity.RARE, mage.cards.m.MongrelPack.class)); - cards.add(new SetCardInfo("Mountain", 319, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mountain", 320, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mountain", 321, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mountain", 322, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mounted Archers", 242, Rarity.COMMON, mage.cards.m.MountedArchers.class)); - cards.add(new SetCardInfo("Muscle Sliver", 132, Rarity.COMMON, mage.cards.m.MuscleSliver.class)); - cards.add(new SetCardInfo("Natural Spring", 133, Rarity.COMMON, mage.cards.n.NaturalSpring.class)); - cards.add(new SetCardInfo("Nature's Revolt", 134, Rarity.RARE, mage.cards.n.NaturesRevolt.class)); - cards.add(new SetCardInfo("Needle Storm", 135, Rarity.UNCOMMON, mage.cards.n.NeedleStorm.class)); - cards.add(new SetCardInfo("Nurturing Licid", 136, Rarity.UNCOMMON, mage.cards.n.NurturingLicid.class)); + cards.add(new SetCardInfo("Mongrel Pack", 237, Rarity.RARE, mage.cards.m.MongrelPack.class)); + cards.add(new SetCardInfo("Mountain", 343, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 344, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 345, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 346, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mounted Archers", 30, Rarity.COMMON, mage.cards.m.MountedArchers.class)); + cards.add(new SetCardInfo("Muscle Sliver", 238, Rarity.COMMON, mage.cards.m.MuscleSliver.class)); + cards.add(new SetCardInfo("Natural Spring", 239, Rarity.COMMON, mage.cards.n.NaturalSpring.class)); + cards.add(new SetCardInfo("Nature's Revolt", 240, Rarity.RARE, mage.cards.n.NaturesRevolt.class)); + cards.add(new SetCardInfo("Needle Storm", 241, Rarity.UNCOMMON, mage.cards.n.NeedleStorm.class)); + cards.add(new SetCardInfo("Nurturing Licid", 242, Rarity.UNCOMMON, mage.cards.n.NurturingLicid.class)); cards.add(new SetCardInfo("Opportunist", 194, Rarity.UNCOMMON, mage.cards.o.Opportunist.class)); - cards.add(new SetCardInfo("Oracle en-Vec", 243, Rarity.RARE, mage.cards.o.OracleEnVec.class)); - cards.add(new SetCardInfo("Orim, Samite Healer", 244, Rarity.RARE, mage.cards.o.OrimSamiteHealer.class)); - cards.add(new SetCardInfo("Orim's Prayer", 245, Rarity.UNCOMMON, mage.cards.o.OrimsPrayer.class)); - cards.add(new SetCardInfo("Overrun", 137, Rarity.UNCOMMON, mage.cards.o.Overrun.class)); - cards.add(new SetCardInfo("Pacifism", 246, Rarity.COMMON, mage.cards.p.Pacifism.class)); + cards.add(new SetCardInfo("Oracle en-Vec", 31, Rarity.RARE, mage.cards.o.OracleEnVec.class)); + cards.add(new SetCardInfo("Orim's Prayer", 32, Rarity.UNCOMMON, mage.cards.o.OrimsPrayer.class)); + cards.add(new SetCardInfo("Orim, Samite Healer", 33, Rarity.RARE, mage.cards.o.OrimSamiteHealer.class)); + cards.add(new SetCardInfo("Overrun", 243, Rarity.UNCOMMON, mage.cards.o.Overrun.class)); + cards.add(new SetCardInfo("Pacifism", 34, Rarity.COMMON, mage.cards.p.Pacifism.class)); cards.add(new SetCardInfo("Pallimud", 195, Rarity.RARE, mage.cards.p.Pallimud.class)); - cards.add(new SetCardInfo("Patchwork Gnomes", 289, Rarity.UNCOMMON, mage.cards.p.PatchworkGnomes.class)); - cards.add(new SetCardInfo("Pearl Medallion", 290, Rarity.RARE, mage.cards.p.PearlMedallion.class)); - cards.add(new SetCardInfo("Pegasus Refuge", 247, Rarity.RARE, mage.cards.p.PegasusRefuge.class)); - cards.add(new SetCardInfo("Perish", 41, Rarity.UNCOMMON, mage.cards.p.Perish.class)); - cards.add(new SetCardInfo("Phyrexian Grimoire", 291, Rarity.RARE, mage.cards.p.PhyrexianGrimoire.class)); - cards.add(new SetCardInfo("Phyrexian Hulk", 292, Rarity.UNCOMMON, mage.cards.p.PhyrexianHulk.class)); - cards.add(new SetCardInfo("Pincher Beetles", 138, Rarity.COMMON, mage.cards.p.PincherBeetles.class)); - cards.add(new SetCardInfo("Pine Barrens", 323, Rarity.RARE, mage.cards.p.PineBarrens.class)); - cards.add(new SetCardInfo("Pit Imp", 42, Rarity.COMMON, mage.cards.p.PitImp.class)); - cards.add(new SetCardInfo("Plains", 324, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Plains", 325, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Plains", 326, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Plains", 327, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Patchwork Gnomes", 299, Rarity.UNCOMMON, mage.cards.p.PatchworkGnomes.class)); + cards.add(new SetCardInfo("Pearl Medallion", 300, Rarity.RARE, mage.cards.p.PearlMedallion.class)); + cards.add(new SetCardInfo("Pegasus Refuge", 35, Rarity.RARE, mage.cards.p.PegasusRefuge.class)); + cards.add(new SetCardInfo("Perish", 147, Rarity.UNCOMMON, mage.cards.p.Perish.class)); + cards.add(new SetCardInfo("Phyrexian Grimoire", 301, Rarity.RARE, mage.cards.p.PhyrexianGrimoire.class)); + cards.add(new SetCardInfo("Phyrexian Hulk", 302, Rarity.UNCOMMON, mage.cards.p.PhyrexianHulk.class)); + cards.add(new SetCardInfo("Pincher Beetles", 244, Rarity.COMMON, mage.cards.p.PincherBeetles.class)); + cards.add(new SetCardInfo("Pine Barrens", 321, Rarity.RARE, mage.cards.p.PineBarrens.class)); + cards.add(new SetCardInfo("Pit Imp", 148, Rarity.COMMON, mage.cards.p.PitImp.class)); + cards.add(new SetCardInfo("Plains", 331, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Plains", 332, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Plains", 333, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Plains", 334, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Power Sink", 78, Rarity.COMMON, mage.cards.p.PowerSink.class)); cards.add(new SetCardInfo("Precognition", 79, Rarity.RARE, mage.cards.p.Precognition.class)); cards.add(new SetCardInfo("Propaganda", 80, Rarity.UNCOMMON, mage.cards.p.Propaganda.class)); - cards.add(new SetCardInfo("Puppet Strings", 294, Rarity.UNCOMMON, mage.cards.p.PuppetStrings.class)); - cards.add(new SetCardInfo("Quickening Licid", 248, Rarity.UNCOMMON, mage.cards.q.QuickeningLicid.class)); - cards.add(new SetCardInfo("Rain of Tears", 43, Rarity.UNCOMMON, mage.cards.r.RainOfTears.class)); - cards.add(new SetCardInfo("Rampant Growth", 139, Rarity.COMMON, mage.cards.r.RampantGrowth.class)); - cards.add(new SetCardInfo("Ranger en-Vec", 343, Rarity.UNCOMMON, mage.cards.r.RangerEnVec.class)); + cards.add(new SetCardInfo("Puppet Strings", 304, Rarity.UNCOMMON, mage.cards.p.PuppetStrings.class)); + cards.add(new SetCardInfo("Quickening Licid", 36, Rarity.UNCOMMON, mage.cards.q.QuickeningLicid.class)); + cards.add(new SetCardInfo("Rain of Tears", 149, Rarity.UNCOMMON, mage.cards.r.RainOfTears.class)); + cards.add(new SetCardInfo("Rampant Growth", 245, Rarity.COMMON, mage.cards.r.RampantGrowth.class)); + cards.add(new SetCardInfo("Ranger en-Vec", 268, Rarity.UNCOMMON, mage.cards.r.RangerEnVec.class)); cards.add(new SetCardInfo("Rathi Dragon", 196, Rarity.RARE, mage.cards.r.RathiDragon.class)); - cards.add(new SetCardInfo("Rats of Rath", 44, Rarity.COMMON, mage.cards.r.RatsOfRath.class)); - cards.add(new SetCardInfo("Reality Anchor", 140, Rarity.COMMON, mage.cards.r.RealityAnchor.class)); - cards.add(new SetCardInfo("Reanimate", 45, Rarity.UNCOMMON, mage.cards.r.Reanimate.class)); - cards.add(new SetCardInfo("Reap", 141, Rarity.UNCOMMON, mage.cards.r.Reap.class)); - cards.add(new SetCardInfo("Reckless Spite", 46, Rarity.UNCOMMON, mage.cards.r.RecklessSpite.class)); - cards.add(new SetCardInfo("Recycle", 142, Rarity.RARE, mage.cards.r.Recycle.class)); - cards.add(new SetCardInfo("Reflecting Pool", 328, Rarity.RARE, mage.cards.r.ReflectingPool.class)); + cards.add(new SetCardInfo("Rats of Rath", 150, Rarity.COMMON, mage.cards.r.RatsOfRath.class)); + cards.add(new SetCardInfo("Reality Anchor", 246, Rarity.COMMON, mage.cards.r.RealityAnchor.class)); + cards.add(new SetCardInfo("Reanimate", 151, Rarity.UNCOMMON, mage.cards.r.Reanimate.class)); + cards.add(new SetCardInfo("Reap", 247, Rarity.UNCOMMON, mage.cards.r.Reap.class)); + cards.add(new SetCardInfo("Reckless Spite", 152, Rarity.UNCOMMON, mage.cards.r.RecklessSpite.class)); + cards.add(new SetCardInfo("Recycle", 248, Rarity.RARE, mage.cards.r.Recycle.class)); + cards.add(new SetCardInfo("Reflecting Pool", 322, Rarity.RARE, mage.cards.r.ReflectingPool.class)); cards.add(new SetCardInfo("Renegade Warlord", 197, Rarity.UNCOMMON, mage.cards.r.RenegadeWarlord.class)); - cards.add(new SetCardInfo("Repentance", 249, Rarity.UNCOMMON, mage.cards.r.Repentance.class)); - cards.add(new SetCardInfo("Respite", 143, Rarity.COMMON, mage.cards.r.Respite.class)); + cards.add(new SetCardInfo("Repentance", 37, Rarity.UNCOMMON, mage.cards.r.Repentance.class)); + cards.add(new SetCardInfo("Respite", 249, Rarity.COMMON, mage.cards.r.Respite.class)); cards.add(new SetCardInfo("Rolling Thunder", 198, Rarity.COMMON, mage.cards.r.RollingThunder.class)); - cards.add(new SetCardInfo("Rootbreaker Wurm", 145, Rarity.COMMON, mage.cards.r.RootbreakerWurm.class)); - cards.add(new SetCardInfo("Root Maze", 144, Rarity.RARE, mage.cards.r.RootMaze.class)); - cards.add(new SetCardInfo("Rootwalla", 146, Rarity.COMMON, mage.cards.r.Rootwalla.class)); - cards.add(new SetCardInfo("Rootwater Depths", 329, Rarity.UNCOMMON, mage.cards.r.RootwaterDepths.class)); + cards.add(new SetCardInfo("Root Maze", 250, Rarity.RARE, mage.cards.r.RootMaze.class)); + cards.add(new SetCardInfo("Rootbreaker Wurm", 251, Rarity.COMMON, mage.cards.r.RootbreakerWurm.class)); + cards.add(new SetCardInfo("Rootwalla", 252, Rarity.COMMON, mage.cards.r.Rootwalla.class)); + cards.add(new SetCardInfo("Rootwater Depths", 323, Rarity.UNCOMMON, mage.cards.r.RootwaterDepths.class)); cards.add(new SetCardInfo("Rootwater Diver", 81, Rarity.UNCOMMON, mage.cards.r.RootwaterDiver.class)); cards.add(new SetCardInfo("Rootwater Hunter", 82, Rarity.COMMON, mage.cards.r.RootwaterHunter.class)); cards.add(new SetCardInfo("Rootwater Matriarch", 83, Rarity.RARE, mage.cards.r.RootwaterMatriarch.class)); cards.add(new SetCardInfo("Rootwater Shaman", 84, Rarity.RARE, mage.cards.r.RootwaterShaman.class)); - cards.add(new SetCardInfo("Ruby Medallion", 295, Rarity.RARE, mage.cards.r.RubyMedallion.class)); - cards.add(new SetCardInfo("Sacred Guide", 250, Rarity.RARE, mage.cards.s.SacredGuide.class)); - cards.add(new SetCardInfo("Sadistic Glee", 47, Rarity.COMMON, mage.cards.s.SadisticGlee.class)); - cards.add(new SetCardInfo("Safeguard", 251, Rarity.RARE, mage.cards.s.Safeguard.class)); - cards.add(new SetCardInfo("Salt Flats", 330, Rarity.RARE, mage.cards.s.SaltFlats.class)); + cards.add(new SetCardInfo("Ruby Medallion", 305, Rarity.RARE, mage.cards.r.RubyMedallion.class)); + cards.add(new SetCardInfo("Sacred Guide", 38, Rarity.RARE, mage.cards.s.SacredGuide.class)); + cards.add(new SetCardInfo("Sadistic Glee", 153, Rarity.COMMON, mage.cards.s.SadisticGlee.class)); + cards.add(new SetCardInfo("Safeguard", 39, Rarity.RARE, mage.cards.s.Safeguard.class)); + cards.add(new SetCardInfo("Salt Flats", 324, Rarity.RARE, mage.cards.s.SaltFlats.class)); cards.add(new SetCardInfo("Sandstone Warrior", 199, Rarity.COMMON, mage.cards.s.SandstoneWarrior.class)); - cards.add(new SetCardInfo("Sapphire Medallion", 296, Rarity.RARE, mage.cards.s.SapphireMedallion.class)); - cards.add(new SetCardInfo("Sarcomancy", 48, Rarity.RARE, mage.cards.s.Sarcomancy.class)); - cards.add(new SetCardInfo("Scabland", 331, Rarity.RARE, mage.cards.s.Scabland.class)); - cards.add(new SetCardInfo("Scalding Tongs", 297, Rarity.RARE, mage.cards.s.ScaldingTongs.class)); + cards.add(new SetCardInfo("Sapphire Medallion", 306, Rarity.RARE, mage.cards.s.SapphireMedallion.class)); + cards.add(new SetCardInfo("Sarcomancy", 154, Rarity.RARE, mage.cards.s.Sarcomancy.class)); + cards.add(new SetCardInfo("Scabland", 325, Rarity.RARE, mage.cards.s.Scabland.class)); + cards.add(new SetCardInfo("Scalding Tongs", 307, Rarity.RARE, mage.cards.s.ScaldingTongs.class)); cards.add(new SetCardInfo("Scorched Earth", 200, Rarity.RARE, mage.cards.s.ScorchedEarth.class)); - cards.add(new SetCardInfo("Scragnoth", 147, Rarity.UNCOMMON, mage.cards.s.Scragnoth.class)); - cards.add(new SetCardInfo("Screeching Harpy", 49, Rarity.UNCOMMON, mage.cards.s.ScreechingHarpy.class)); - cards.add(new SetCardInfo("Scroll Rack", 298, Rarity.RARE, mage.cards.s.ScrollRack.class)); + cards.add(new SetCardInfo("Scragnoth", 253, Rarity.UNCOMMON, mage.cards.s.Scragnoth.class)); + cards.add(new SetCardInfo("Screeching Harpy", 155, Rarity.UNCOMMON, mage.cards.s.ScreechingHarpy.class)); + cards.add(new SetCardInfo("Scroll Rack", 308, Rarity.RARE, mage.cards.s.ScrollRack.class)); cards.add(new SetCardInfo("Sea Monster", 85, Rarity.COMMON, mage.cards.s.SeaMonster.class)); cards.add(new SetCardInfo("Searing Touch", 201, Rarity.UNCOMMON, mage.cards.s.SearingTouch.class)); - cards.add(new SetCardInfo("Seeker of Skybreak", 148, Rarity.COMMON, mage.cards.s.SeekerOfSkybreak.class)); - cards.add(new SetCardInfo("Segmented Wurm", 344, Rarity.UNCOMMON, mage.cards.s.SegmentedWurm.class)); - cards.add(new SetCardInfo("Selenia, Dark Angel", 345, Rarity.RARE, mage.cards.s.SeleniaDarkAngel.class)); - cards.add(new SetCardInfo("Serene Offering", 252, Rarity.UNCOMMON, mage.cards.s.SereneOffering.class)); - cards.add(new SetCardInfo("Servant of Volrath", 50, Rarity.COMMON, mage.cards.s.ServantOfVolrath.class)); + cards.add(new SetCardInfo("Seeker of Skybreak", 254, Rarity.COMMON, mage.cards.s.SeekerOfSkybreak.class)); + cards.add(new SetCardInfo("Segmented Wurm", 269, Rarity.UNCOMMON, mage.cards.s.SegmentedWurm.class)); + cards.add(new SetCardInfo("Selenia, Dark Angel", 270, Rarity.RARE, mage.cards.s.SeleniaDarkAngel.class)); + cards.add(new SetCardInfo("Serene Offering", 40, Rarity.UNCOMMON, mage.cards.s.SereneOffering.class)); + cards.add(new SetCardInfo("Servant of Volrath", 156, Rarity.COMMON, mage.cards.s.ServantOfVolrath.class)); cards.add(new SetCardInfo("Shadow Rift", 86, Rarity.COMMON, mage.cards.s.ShadowRift.class)); cards.add(new SetCardInfo("Shadowstorm", 202, Rarity.UNCOMMON, mage.cards.s.Shadowstorm.class)); cards.add(new SetCardInfo("Shatter", 203, Rarity.COMMON, mage.cards.s.Shatter.class)); cards.add(new SetCardInfo("Shimmering Wings", 87, Rarity.COMMON, mage.cards.s.ShimmeringWings.class)); cards.add(new SetCardInfo("Shocker", 204, Rarity.RARE, mage.cards.s.Shocker.class)); + cards.add(new SetCardInfo("Sky Spirit", 271, Rarity.UNCOMMON, mage.cards.s.SkySpirit.class)); cards.add(new SetCardInfo("Skyshroud Condor", 88, Rarity.UNCOMMON, mage.cards.s.SkyshroudCondor.class)); - cards.add(new SetCardInfo("Skyshroud Elf", 149, Rarity.COMMON, mage.cards.s.SkyshroudElf.class)); - cards.add(new SetCardInfo("Skyshroud Forest", 332, Rarity.RARE, mage.cards.s.SkyshroudForest.class)); - cards.add(new SetCardInfo("Skyshroud Ranger", 150, Rarity.COMMON, mage.cards.s.SkyshroudRanger.class)); - cards.add(new SetCardInfo("Skyshroud Troll", 151, Rarity.COMMON, mage.cards.s.SkyshroudTroll.class)); - cards.add(new SetCardInfo("Skyshroud Vampire", 51, Rarity.UNCOMMON, mage.cards.s.SkyshroudVampire.class)); - cards.add(new SetCardInfo("Sky Spirit", 346, Rarity.UNCOMMON, mage.cards.s.SkySpirit.class)); - cards.add(new SetCardInfo("Soltari Crusader", 253, Rarity.UNCOMMON, mage.cards.s.SoltariCrusader.class)); - cards.add(new SetCardInfo("Soltari Emissary", 254, Rarity.RARE, mage.cards.s.SoltariEmissary.class)); - cards.add(new SetCardInfo("Soltari Foot Soldier", 255, Rarity.COMMON, mage.cards.s.SoltariFootSoldier.class)); - cards.add(new SetCardInfo("Soltari Guerrillas", 347, Rarity.RARE, mage.cards.s.SoltariGuerrillas.class)); - cards.add(new SetCardInfo("Soltari Lancer", 256, Rarity.COMMON, mage.cards.s.SoltariLancer.class)); - cards.add(new SetCardInfo("Soltari Monk", 257, Rarity.UNCOMMON, mage.cards.s.SoltariMonk.class)); - cards.add(new SetCardInfo("Soltari Priest", 258, Rarity.UNCOMMON, mage.cards.s.SoltariPriest.class)); - cards.add(new SetCardInfo("Soltari Trooper", 259, Rarity.COMMON, mage.cards.s.SoltariTrooper.class)); - cards.add(new SetCardInfo("Souldrinker", 52, Rarity.UNCOMMON, mage.cards.s.Souldrinker.class)); + cards.add(new SetCardInfo("Skyshroud Elf", 255, Rarity.COMMON, mage.cards.s.SkyshroudElf.class)); + cards.add(new SetCardInfo("Skyshroud Forest", 326, Rarity.RARE, mage.cards.s.SkyshroudForest.class)); + cards.add(new SetCardInfo("Skyshroud Ranger", 256, Rarity.COMMON, mage.cards.s.SkyshroudRanger.class)); + cards.add(new SetCardInfo("Skyshroud Troll", 257, Rarity.COMMON, mage.cards.s.SkyshroudTroll.class)); + cards.add(new SetCardInfo("Skyshroud Vampire", 157, Rarity.UNCOMMON, mage.cards.s.SkyshroudVampire.class)); + cards.add(new SetCardInfo("Soltari Crusader", 41, Rarity.UNCOMMON, mage.cards.s.SoltariCrusader.class)); + cards.add(new SetCardInfo("Soltari Emissary", 42, Rarity.RARE, mage.cards.s.SoltariEmissary.class)); + cards.add(new SetCardInfo("Soltari Foot Soldier", 43, Rarity.COMMON, mage.cards.s.SoltariFootSoldier.class)); + cards.add(new SetCardInfo("Soltari Guerrillas", 272, Rarity.RARE, mage.cards.s.SoltariGuerrillas.class)); + cards.add(new SetCardInfo("Soltari Lancer", 44, Rarity.COMMON, mage.cards.s.SoltariLancer.class)); + cards.add(new SetCardInfo("Soltari Monk", 45, Rarity.UNCOMMON, mage.cards.s.SoltariMonk.class)); + cards.add(new SetCardInfo("Soltari Priest", 46, Rarity.UNCOMMON, mage.cards.s.SoltariPriest.class)); + cards.add(new SetCardInfo("Soltari Trooper", 47, Rarity.COMMON, mage.cards.s.SoltariTrooper.class)); + cards.add(new SetCardInfo("Souldrinker", 158, Rarity.UNCOMMON, mage.cards.s.Souldrinker.class)); cards.add(new SetCardInfo("Spell Blast", 89, Rarity.COMMON, mage.cards.s.SpellBlast.class)); - cards.add(new SetCardInfo("Spike Drone", 152, Rarity.COMMON, mage.cards.s.SpikeDrone.class)); - cards.add(new SetCardInfo("Spinal Graft", 53, Rarity.COMMON, mage.cards.s.SpinalGraft.class)); - cards.add(new SetCardInfo("Spirit Mirror", 260, Rarity.RARE, mage.cards.s.SpiritMirror.class)); - cards.add(new SetCardInfo("Spontaneous Combustion", 348, Rarity.UNCOMMON, mage.cards.s.SpontaneousCombustion.class)); - cards.add(new SetCardInfo("Squee's Toy", 299, Rarity.COMMON, mage.cards.s.SqueesToy.class)); - cards.add(new SetCardInfo("Stalking Stones", 333, Rarity.UNCOMMON, mage.cards.s.StalkingStones.class)); + cards.add(new SetCardInfo("Spike Drone", 258, Rarity.COMMON, mage.cards.s.SpikeDrone.class)); + cards.add(new SetCardInfo("Spinal Graft", 159, Rarity.COMMON, mage.cards.s.SpinalGraft.class)); + cards.add(new SetCardInfo("Spirit Mirror", 48, Rarity.RARE, mage.cards.s.SpiritMirror.class)); + cards.add(new SetCardInfo("Spontaneous Combustion", 273, Rarity.UNCOMMON, mage.cards.s.SpontaneousCombustion.class)); + cards.add(new SetCardInfo("Squee's Toy", 309, Rarity.COMMON, mage.cards.s.SqueesToy.class)); + cards.add(new SetCardInfo("Stalking Stones", 327, Rarity.UNCOMMON, mage.cards.s.StalkingStones.class)); cards.add(new SetCardInfo("Starke of Rath", 205, Rarity.RARE, mage.cards.s.StarkeOfRath.class)); - cards.add(new SetCardInfo("Static Orb", 300, Rarity.RARE, mage.cards.s.StaticOrb.class)); - cards.add(new SetCardInfo("Staunch Defenders", 261, Rarity.UNCOMMON, mage.cards.s.StaunchDefenders.class)); + cards.add(new SetCardInfo("Static Orb", 310, Rarity.RARE, mage.cards.s.StaticOrb.class)); + cards.add(new SetCardInfo("Staunch Defenders", 49, Rarity.UNCOMMON, mage.cards.s.StaunchDefenders.class)); cards.add(new SetCardInfo("Steal Enchantment", 90, Rarity.UNCOMMON, mage.cards.s.StealEnchantment.class)); cards.add(new SetCardInfo("Stinging Licid", 91, Rarity.UNCOMMON, mage.cards.s.StingingLicid.class)); cards.add(new SetCardInfo("Stone Rain", 206, Rarity.COMMON, mage.cards.s.StoneRain.class)); - cards.add(new SetCardInfo("Storm Front", 153, Rarity.UNCOMMON, mage.cards.s.StormFront.class)); + cards.add(new SetCardInfo("Storm Front", 259, Rarity.UNCOMMON, mage.cards.s.StormFront.class)); cards.add(new SetCardInfo("Stun", 207, Rarity.COMMON, mage.cards.s.Stun.class)); cards.add(new SetCardInfo("Sudden Impact", 208, Rarity.UNCOMMON, mage.cards.s.SuddenImpact.class)); - cards.add(new SetCardInfo("Swamp", 334, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Swamp", 335, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Swamp", 336, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Swamp", 337, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 339, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 340, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 341, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 342, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Tahngarth's Rage", 209, Rarity.UNCOMMON, mage.cards.t.TahngarthsRage.class)); - cards.add(new SetCardInfo("Talon Sliver", 262, Rarity.COMMON, mage.cards.t.TalonSliver.class)); - cards.add(new SetCardInfo("Telethopter", 301, Rarity.UNCOMMON, mage.cards.t.Telethopter.class)); + cards.add(new SetCardInfo("Talon Sliver", 50, Rarity.COMMON, mage.cards.t.TalonSliver.class)); + cards.add(new SetCardInfo("Telethopter", 311, Rarity.UNCOMMON, mage.cards.t.Telethopter.class)); cards.add(new SetCardInfo("Thalakos Dreamsower", 92, Rarity.UNCOMMON, mage.cards.t.ThalakosDreamsower.class)); - cards.add(new SetCardInfo("Thalakos Lowlands", 338, Rarity.UNCOMMON, mage.cards.t.ThalakosLowlands.class)); + cards.add(new SetCardInfo("Thalakos Lowlands", 328, Rarity.UNCOMMON, mage.cards.t.ThalakosLowlands.class)); cards.add(new SetCardInfo("Thalakos Mistfolk", 93, Rarity.COMMON, mage.cards.t.ThalakosMistfolk.class)); cards.add(new SetCardInfo("Thalakos Seer", 94, Rarity.COMMON, mage.cards.t.ThalakosSeer.class)); cards.add(new SetCardInfo("Thalakos Sentry", 95, Rarity.COMMON, mage.cards.t.ThalakosSentry.class)); - cards.add(new SetCardInfo("Thumbscrews", 302, Rarity.RARE, mage.cards.t.Thumbscrews.class)); + cards.add(new SetCardInfo("Thumbscrews", 312, Rarity.RARE, mage.cards.t.Thumbscrews.class)); cards.add(new SetCardInfo("Time Ebb", 96, Rarity.COMMON, mage.cards.t.TimeEbb.class)); cards.add(new SetCardInfo("Time Warp", 97, Rarity.RARE, mage.cards.t.TimeWarp.class)); cards.add(new SetCardInfo("Tooth and Claw", 210, Rarity.RARE, mage.cards.t.ToothAndClaw.class)); - cards.add(new SetCardInfo("Torture Chamber", 303, Rarity.RARE, mage.cards.t.TortureChamber.class)); + cards.add(new SetCardInfo("Torture Chamber", 313, Rarity.RARE, mage.cards.t.TortureChamber.class)); cards.add(new SetCardInfo("Tradewind Rider", 98, Rarity.RARE, mage.cards.t.TradewindRider.class)); - cards.add(new SetCardInfo("Trained Armodon", 154, Rarity.COMMON, mage.cards.t.TrainedArmodon.class)); - cards.add(new SetCardInfo("Tranquility", 155, Rarity.COMMON, mage.cards.t.Tranquility.class)); - cards.add(new SetCardInfo("Trumpeting Armodon", 156, Rarity.UNCOMMON, mage.cards.t.TrumpetingArmodon.class)); + cards.add(new SetCardInfo("Trained Armodon", 260, Rarity.COMMON, mage.cards.t.TrainedArmodon.class)); + cards.add(new SetCardInfo("Tranquility", 261, Rarity.COMMON, mage.cards.t.Tranquility.class)); + cards.add(new SetCardInfo("Trumpeting Armodon", 262, Rarity.UNCOMMON, mage.cards.t.TrumpetingArmodon.class)); cards.add(new SetCardInfo("Twitch", 99, Rarity.COMMON, mage.cards.t.Twitch.class)); cards.add(new SetCardInfo("Unstable Shapeshifter", 100, Rarity.RARE, mage.cards.u.UnstableShapeshifter.class)); - cards.add(new SetCardInfo("Vec Townships", 339, Rarity.UNCOMMON, mage.cards.v.VecTownships.class)); - cards.add(new SetCardInfo("Verdant Force", 157, Rarity.RARE, mage.cards.v.VerdantForce.class)); - cards.add(new SetCardInfo("Verdigris", 158, Rarity.UNCOMMON, mage.cards.v.Verdigris.class)); - cards.add(new SetCardInfo("Vhati il-Dal", 349, Rarity.RARE, mage.cards.v.VhatiIlDal.class)); + cards.add(new SetCardInfo("Vec Townships", 329, Rarity.UNCOMMON, mage.cards.v.VecTownships.class)); + cards.add(new SetCardInfo("Verdant Force", 263, Rarity.RARE, mage.cards.v.VerdantForce.class)); + cards.add(new SetCardInfo("Verdigris", 264, Rarity.UNCOMMON, mage.cards.v.Verdigris.class)); + cards.add(new SetCardInfo("Vhati il-Dal", 274, Rarity.RARE, mage.cards.v.VhatiIlDal.class)); cards.add(new SetCardInfo("Volrath's Curse", 101, Rarity.COMMON, mage.cards.v.VolrathsCurse.class)); cards.add(new SetCardInfo("Wall of Diffusion", 211, Rarity.COMMON, mage.cards.w.WallOfDiffusion.class)); - cards.add(new SetCardInfo("Warmth", 263, Rarity.UNCOMMON, mage.cards.w.Warmth.class)); - cards.add(new SetCardInfo("Wasteland", 340, Rarity.UNCOMMON, mage.cards.w.Wasteland.class)); - cards.add(new SetCardInfo("Watchdog", 304, Rarity.UNCOMMON, mage.cards.w.Watchdog.class)); + cards.add(new SetCardInfo("Warmth", 51, Rarity.UNCOMMON, mage.cards.w.Warmth.class)); + cards.add(new SetCardInfo("Wasteland", 330, Rarity.UNCOMMON, mage.cards.w.Wasteland.class)); + cards.add(new SetCardInfo("Watchdog", 314, Rarity.UNCOMMON, mage.cards.w.Watchdog.class)); cards.add(new SetCardInfo("Whispers of the Muse", 103, Rarity.UNCOMMON, mage.cards.w.WhispersOfTheMuse.class)); cards.add(new SetCardInfo("Wild Wurm", 212, Rarity.UNCOMMON, mage.cards.w.WildWurm.class)); cards.add(new SetCardInfo("Wind Dancer", 104, Rarity.UNCOMMON, mage.cards.w.WindDancer.class)); cards.add(new SetCardInfo("Wind Drake", 105, Rarity.COMMON, mage.cards.w.WindDrake.class)); - cards.add(new SetCardInfo("Winds of Rath", 264, Rarity.RARE, mage.cards.w.WindsOfRath.class)); + cards.add(new SetCardInfo("Winds of Rath", 52, Rarity.RARE, mage.cards.w.WindsOfRath.class)); cards.add(new SetCardInfo("Winged Sliver", 106, Rarity.COMMON, mage.cards.w.WingedSliver.class)); - cards.add(new SetCardInfo("Winter's Grasp", 159, Rarity.UNCOMMON, mage.cards.w.WintersGrasp.class)); - cards.add(new SetCardInfo("Wood Sage", 350, Rarity.RARE, mage.cards.w.WoodSage.class)); - cards.add(new SetCardInfo("Worthy Cause", 265, Rarity.UNCOMMON, mage.cards.w.WorthyCause.class)); + cards.add(new SetCardInfo("Winter's Grasp", 265, Rarity.UNCOMMON, mage.cards.w.WintersGrasp.class)); + cards.add(new SetCardInfo("Wood Sage", 275, Rarity.RARE, mage.cards.w.WoodSage.class)); + cards.add(new SetCardInfo("Worthy Cause", 53, Rarity.UNCOMMON, mage.cards.w.WorthyCause.class)); } } From 0e4a9925163e132f99d7d9284a1e6b26d1a9fb87 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Thu, 10 May 2018 11:29:27 +0400 Subject: [PATCH 134/158] Fixed card numbers in STH - Stronghold (#4628) --- Mage.Sets/src/mage/sets/Stronghold.java | 180 ++++++++++++------------ 1 file changed, 90 insertions(+), 90 deletions(-) diff --git a/Mage.Sets/src/mage/sets/Stronghold.java b/Mage.Sets/src/mage/sets/Stronghold.java index e4da198867a..7b765308c20 100644 --- a/Mage.Sets/src/mage/sets/Stronghold.java +++ b/Mage.Sets/src/mage/sets/Stronghold.java @@ -53,37 +53,37 @@ public class Stronghold extends ExpansionSet { this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; - cards.add(new SetCardInfo("Acidic Sliver", 138, Rarity.UNCOMMON, mage.cards.a.AcidicSliver.class)); + cards.add(new SetCardInfo("Acidic Sliver", 126, Rarity.UNCOMMON, mage.cards.a.AcidicSliver.class)); cards.add(new SetCardInfo("Amok", 76, Rarity.RARE, mage.cards.a.Amok.class)); - cards.add(new SetCardInfo("Awakening", 51, Rarity.RARE, mage.cards.a.Awakening.class)); - cards.add(new SetCardInfo("Bandage", 101, Rarity.COMMON, mage.cards.b.Bandage.class)); - cards.add(new SetCardInfo("Bottomless Pit", 1, Rarity.UNCOMMON, mage.cards.b.BottomlessPit.class)); - cards.add(new SetCardInfo("Brush with Death", 2, Rarity.COMMON, mage.cards.b.BrushWithDeath.class)); - cards.add(new SetCardInfo("Bullwhip", 126, Rarity.UNCOMMON, mage.cards.b.Bullwhip.class)); - cards.add(new SetCardInfo("Burgeoning", 52, Rarity.RARE, mage.cards.b.Burgeoning.class)); - cards.add(new SetCardInfo("Calming Licid", 102, Rarity.UNCOMMON, mage.cards.c.CalmingLicid.class)); - cards.add(new SetCardInfo("Cannibalize", 3, Rarity.COMMON, mage.cards.c.Cannibalize.class)); - cards.add(new SetCardInfo("Carnassid", 53, Rarity.RARE, mage.cards.c.Carnassid.class)); - cards.add(new SetCardInfo("Change of Heart", 103, Rarity.COMMON, mage.cards.c.ChangeOfHeart.class)); + cards.add(new SetCardInfo("Awakening", 101, Rarity.RARE, mage.cards.a.Awakening.class)); + cards.add(new SetCardInfo("Bandage", 1, Rarity.COMMON, mage.cards.b.Bandage.class)); + cards.add(new SetCardInfo("Bottomless Pit", 51, Rarity.UNCOMMON, mage.cards.b.BottomlessPit.class)); + cards.add(new SetCardInfo("Brush with Death", 52, Rarity.COMMON, mage.cards.b.BrushWithDeath.class)); + cards.add(new SetCardInfo("Bullwhip", 132, Rarity.UNCOMMON, mage.cards.b.Bullwhip.class)); + cards.add(new SetCardInfo("Burgeoning", 102, Rarity.RARE, mage.cards.b.Burgeoning.class)); + cards.add(new SetCardInfo("Calming Licid", 2, Rarity.UNCOMMON, mage.cards.c.CalmingLicid.class)); + cards.add(new SetCardInfo("Cannibalize", 53, Rarity.COMMON, mage.cards.c.Cannibalize.class)); + cards.add(new SetCardInfo("Carnassid", 103, Rarity.RARE, mage.cards.c.Carnassid.class)); + cards.add(new SetCardInfo("Change of Heart", 3, Rarity.COMMON, mage.cards.c.ChangeOfHeart.class)); cards.add(new SetCardInfo("Cloud Spirit", 26, Rarity.COMMON, mage.cards.c.CloudSpirit.class)); - cards.add(new SetCardInfo("Constant Mists", 54, Rarity.UNCOMMON, mage.cards.c.ConstantMists.class)); - cards.add(new SetCardInfo("Contemplation", 104, Rarity.UNCOMMON, mage.cards.c.Contemplation.class)); - cards.add(new SetCardInfo("Conviction", 105, Rarity.COMMON, mage.cards.c.Conviction.class)); + cards.add(new SetCardInfo("Constant Mists", 104, Rarity.UNCOMMON, mage.cards.c.ConstantMists.class)); + cards.add(new SetCardInfo("Contemplation", 4, Rarity.UNCOMMON, mage.cards.c.Contemplation.class)); + cards.add(new SetCardInfo("Conviction", 5, Rarity.COMMON, mage.cards.c.Conviction.class)); cards.add(new SetCardInfo("Convulsing Licid", 77, Rarity.UNCOMMON, mage.cards.c.ConvulsingLicid.class)); - cards.add(new SetCardInfo("Corrupting Licid", 4, Rarity.UNCOMMON, mage.cards.c.CorruptingLicid.class)); + cards.add(new SetCardInfo("Corrupting Licid", 54, Rarity.UNCOMMON, mage.cards.c.CorruptingLicid.class)); cards.add(new SetCardInfo("Craven Giant", 78, Rarity.COMMON, mage.cards.c.CravenGiant.class)); - cards.add(new SetCardInfo("Crossbow Ambush", 55, Rarity.COMMON, mage.cards.c.CrossbowAmbush.class)); - cards.add(new SetCardInfo("Crovax the Cursed", 5, Rarity.RARE, mage.cards.c.CrovaxTheCursed.class)); - cards.add(new SetCardInfo("Crystalline Sliver", 139, Rarity.UNCOMMON, mage.cards.c.CrystallineSliver.class)); - cards.add(new SetCardInfo("Dauthi Trapper", 6, Rarity.UNCOMMON, mage.cards.d.DauthiTrapper.class)); - cards.add(new SetCardInfo("Death Stroke", 7, Rarity.COMMON, mage.cards.d.DeathStroke.class)); + cards.add(new SetCardInfo("Crossbow Ambush", 105, Rarity.COMMON, mage.cards.c.CrossbowAmbush.class)); + cards.add(new SetCardInfo("Crovax the Cursed", 55, Rarity.RARE, mage.cards.c.CrovaxTheCursed.class)); + cards.add(new SetCardInfo("Crystalline Sliver", 127, Rarity.UNCOMMON, mage.cards.c.CrystallineSliver.class)); + cards.add(new SetCardInfo("Dauthi Trapper", 56, Rarity.UNCOMMON, mage.cards.d.DauthiTrapper.class)); + cards.add(new SetCardInfo("Death Stroke", 57, Rarity.COMMON, mage.cards.d.DeathStroke.class)); cards.add(new SetCardInfo("Dream Halls", 28, Rarity.RARE, mage.cards.d.DreamHalls.class)); cards.add(new SetCardInfo("Dream Prowler", 29, Rarity.COMMON, mage.cards.d.DreamProwler.class)); cards.add(new SetCardInfo("Duct Crawler", 79, Rarity.COMMON, mage.cards.d.DuctCrawler.class)); - cards.add(new SetCardInfo("Dungeon Shade", 8, Rarity.COMMON, mage.cards.d.DungeonShade.class)); - cards.add(new SetCardInfo("Elven Rite", 56, Rarity.UNCOMMON, mage.cards.e.ElvenRite.class)); - cards.add(new SetCardInfo("Endangered Armodon", 57, Rarity.COMMON, mage.cards.e.EndangeredArmodon.class)); - cards.add(new SetCardInfo("Ensnaring Bridge", 127, Rarity.RARE, mage.cards.e.EnsnaringBridge.class)); + cards.add(new SetCardInfo("Dungeon Shade", 58, Rarity.COMMON, mage.cards.d.DungeonShade.class)); + cards.add(new SetCardInfo("Elven Rite", 106, Rarity.UNCOMMON, mage.cards.e.ElvenRite.class)); + cards.add(new SetCardInfo("Endangered Armodon", 107, Rarity.COMMON, mage.cards.e.EndangeredArmodon.class)); + cards.add(new SetCardInfo("Ensnaring Bridge", 133, Rarity.RARE, mage.cards.e.EnsnaringBridge.class)); cards.add(new SetCardInfo("Evacuation", 30, Rarity.RARE, mage.cards.e.Evacuation.class)); cards.add(new SetCardInfo("Fanning the Flames", 80, Rarity.UNCOMMON, mage.cards.f.FanningTheFlames.class)); cards.add(new SetCardInfo("Flame Wave", 81, Rarity.UNCOMMON, mage.cards.f.FlameWave.class)); @@ -92,101 +92,101 @@ public class Stronghold extends ExpansionSet { cards.add(new SetCardInfo("Flowstone Hellion", 84, Rarity.UNCOMMON, mage.cards.f.FlowstoneHellion.class)); cards.add(new SetCardInfo("Flowstone Mauler", 85, Rarity.RARE, mage.cards.f.FlowstoneMauler.class)); cards.add(new SetCardInfo("Flowstone Shambler", 86, Rarity.COMMON, mage.cards.f.FlowstoneShambler.class)); - cards.add(new SetCardInfo("Foul Imp", 9, Rarity.COMMON, mage.cards.f.FoulImp.class)); + cards.add(new SetCardInfo("Foul Imp", 59, Rarity.COMMON, mage.cards.f.FoulImp.class)); cards.add(new SetCardInfo("Furnace Spirit", 87, Rarity.COMMON, mage.cards.f.FurnaceSpirit.class)); cards.add(new SetCardInfo("Gliding Licid", 31, Rarity.UNCOMMON, mage.cards.g.GlidingLicid.class)); - cards.add(new SetCardInfo("Grave Pact", 10, Rarity.RARE, mage.cards.g.GravePact.class)); + cards.add(new SetCardInfo("Grave Pact", 60, Rarity.RARE, mage.cards.g.GravePact.class)); cards.add(new SetCardInfo("Hammerhead Shark", 32, Rarity.COMMON, mage.cards.h.HammerheadShark.class)); - cards.add(new SetCardInfo("Heartstone", 128, Rarity.UNCOMMON, mage.cards.h.Heartstone.class)); + cards.add(new SetCardInfo("Heartstone", 134, Rarity.UNCOMMON, mage.cards.h.Heartstone.class)); cards.add(new SetCardInfo("Heat of Battle", 88, Rarity.UNCOMMON, mage.cards.h.HeatOfBattle.class)); - cards.add(new SetCardInfo("Hermit Druid", 58, Rarity.RARE, mage.cards.h.HermitDruid.class)); + cards.add(new SetCardInfo("Hermit Druid", 108, Rarity.RARE, mage.cards.h.HermitDruid.class)); cards.add(new SetCardInfo("Hesitation", 33, Rarity.UNCOMMON, mage.cards.h.Hesitation.class)); - cards.add(new SetCardInfo("Hibernation Sliver", 140, Rarity.UNCOMMON, mage.cards.h.HibernationSliver.class)); - cards.add(new SetCardInfo("Honor Guard", 107, Rarity.COMMON, mage.cards.h.HonorGuard.class)); - cards.add(new SetCardInfo("Hornet Cannon", 130, Rarity.UNCOMMON, mage.cards.h.HornetCannon.class)); - cards.add(new SetCardInfo("Horn of Greed", 129, Rarity.RARE, mage.cards.h.HornOfGreed.class)); + cards.add(new SetCardInfo("Hibernation Sliver", 128, Rarity.UNCOMMON, mage.cards.h.HibernationSliver.class)); + cards.add(new SetCardInfo("Honor Guard", 7, Rarity.COMMON, mage.cards.h.HonorGuard.class)); + cards.add(new SetCardInfo("Horn of Greed", 135, Rarity.RARE, mage.cards.h.HornOfGreed.class)); + cards.add(new SetCardInfo("Hornet Cannon", 136, Rarity.UNCOMMON, mage.cards.h.HornetCannon.class)); cards.add(new SetCardInfo("Intruder Alarm", 34, Rarity.RARE, mage.cards.i.IntruderAlarm.class)); cards.add(new SetCardInfo("Invasion Plans", 89, Rarity.RARE, mage.cards.i.InvasionPlans.class)); - cards.add(new SetCardInfo("Jinxed Ring", 131, Rarity.RARE, mage.cards.j.JinxedRing.class)); - cards.add(new SetCardInfo("Lab Rats", 11, Rarity.COMMON, mage.cards.l.LabRats.class)); - cards.add(new SetCardInfo("Lancers en-Kor", 108, Rarity.UNCOMMON, mage.cards.l.LancersEnKor.class)); + cards.add(new SetCardInfo("Jinxed Ring", 137, Rarity.RARE, mage.cards.j.JinxedRing.class)); + cards.add(new SetCardInfo("Lab Rats", 61, Rarity.COMMON, mage.cards.l.LabRats.class)); + cards.add(new SetCardInfo("Lancers en-Kor", 8, Rarity.UNCOMMON, mage.cards.l.LancersEnKor.class)); cards.add(new SetCardInfo("Leap", 35, Rarity.COMMON, mage.cards.l.Leap.class)); - cards.add(new SetCardInfo("Lowland Basilisk", 59, Rarity.COMMON, mage.cards.l.LowlandBasilisk.class)); + cards.add(new SetCardInfo("Lowland Basilisk", 109, Rarity.COMMON, mage.cards.l.LowlandBasilisk.class)); cards.add(new SetCardInfo("Mana Leak", 36, Rarity.COMMON, mage.cards.m.ManaLeak.class)); cards.add(new SetCardInfo("Mask of the Mimic", 37, Rarity.UNCOMMON, mage.cards.m.MaskOfTheMimic.class)); - cards.add(new SetCardInfo("Megrim", 12, Rarity.UNCOMMON, mage.cards.m.Megrim.class)); + cards.add(new SetCardInfo("Megrim", 62, Rarity.UNCOMMON, mage.cards.m.Megrim.class)); cards.add(new SetCardInfo("Mind Games", 38, Rarity.COMMON, mage.cards.m.MindGames.class)); - cards.add(new SetCardInfo("Mind Peel", 13, Rarity.UNCOMMON, mage.cards.m.MindPeel.class)); - cards.add(new SetCardInfo("Mindwarper", 14, Rarity.RARE, mage.cards.m.Mindwarper.class)); + cards.add(new SetCardInfo("Mind Peel", 63, Rarity.UNCOMMON, mage.cards.m.MindPeel.class)); + cards.add(new SetCardInfo("Mindwarper", 64, Rarity.RARE, mage.cards.m.Mindwarper.class)); cards.add(new SetCardInfo("Mob Justice", 90, Rarity.COMMON, mage.cards.m.MobJustice.class)); cards.add(new SetCardInfo("Mogg Flunkies", 92, Rarity.COMMON, mage.cards.m.MoggFlunkies.class)); cards.add(new SetCardInfo("Mogg Infestation", 93, Rarity.RARE, mage.cards.m.MoggInfestation.class)); cards.add(new SetCardInfo("Mogg Maniac", 94, Rarity.UNCOMMON, mage.cards.m.MoggManiac.class)); - cards.add(new SetCardInfo("Morgue Thrull", 15, Rarity.COMMON, mage.cards.m.MorgueThrull.class)); - cards.add(new SetCardInfo("Mortuary", 16, Rarity.RARE, mage.cards.m.Mortuary.class)); - cards.add(new SetCardInfo("Mox Diamond", 132, Rarity.RARE, mage.cards.m.MoxDiamond.class)); - cards.add(new SetCardInfo("Mulch", 60, Rarity.COMMON, mage.cards.m.Mulch.class)); - cards.add(new SetCardInfo("Nomads en-Kor", 109, Rarity.COMMON, mage.cards.n.NomadsEnKor.class)); - cards.add(new SetCardInfo("Overgrowth", 61, Rarity.COMMON, mage.cards.o.Overgrowth.class)); - cards.add(new SetCardInfo("Portcullis", 133, Rarity.RARE, mage.cards.p.Portcullis.class)); - cards.add(new SetCardInfo("Primal Rage", 62, Rarity.UNCOMMON, mage.cards.p.PrimalRage.class)); - cards.add(new SetCardInfo("Provoke", 63, Rarity.COMMON, mage.cards.p.Provoke.class)); - cards.add(new SetCardInfo("Pursuit of Knowledge", 110, Rarity.RARE, mage.cards.p.PursuitOfKnowledge.class)); - cards.add(new SetCardInfo("Rabid Rats", 17, Rarity.COMMON, mage.cards.r.RabidRats.class)); + cards.add(new SetCardInfo("Morgue Thrull", 65, Rarity.COMMON, mage.cards.m.MorgueThrull.class)); + cards.add(new SetCardInfo("Mortuary", 66, Rarity.RARE, mage.cards.m.Mortuary.class)); + cards.add(new SetCardInfo("Mox Diamond", 138, Rarity.RARE, mage.cards.m.MoxDiamond.class)); + cards.add(new SetCardInfo("Mulch", 110, Rarity.COMMON, mage.cards.m.Mulch.class)); + cards.add(new SetCardInfo("Nomads en-Kor", 9, Rarity.COMMON, mage.cards.n.NomadsEnKor.class)); + cards.add(new SetCardInfo("Overgrowth", 111, Rarity.COMMON, mage.cards.o.Overgrowth.class)); + cards.add(new SetCardInfo("Portcullis", 139, Rarity.RARE, mage.cards.p.Portcullis.class)); + cards.add(new SetCardInfo("Primal Rage", 112, Rarity.UNCOMMON, mage.cards.p.PrimalRage.class)); + cards.add(new SetCardInfo("Provoke", 113, Rarity.COMMON, mage.cards.p.Provoke.class)); + cards.add(new SetCardInfo("Pursuit of Knowledge", 10, Rarity.RARE, mage.cards.p.PursuitOfKnowledge.class)); + cards.add(new SetCardInfo("Rabid Rats", 67, Rarity.COMMON, mage.cards.r.RabidRats.class)); cards.add(new SetCardInfo("Reins of Power", 41, Rarity.RARE, mage.cards.r.ReinsOfPower.class)); - cards.add(new SetCardInfo("Revenant", 18, Rarity.RARE, mage.cards.r.Revenant.class)); - cards.add(new SetCardInfo("Rolling Stones", 111, Rarity.RARE, mage.cards.r.RollingStones.class)); + cards.add(new SetCardInfo("Revenant", 68, Rarity.RARE, mage.cards.r.Revenant.class)); + cards.add(new SetCardInfo("Rolling Stones", 11, Rarity.RARE, mage.cards.r.RollingStones.class)); cards.add(new SetCardInfo("Ruination", 95, Rarity.RARE, mage.cards.r.Ruination.class)); - cards.add(new SetCardInfo("Sacred Ground", 112, Rarity.RARE, mage.cards.s.SacredGround.class)); - cards.add(new SetCardInfo("Scapegoat", 114, Rarity.UNCOMMON, mage.cards.s.Scapegoat.class)); + cards.add(new SetCardInfo("Sacred Ground", 12, Rarity.RARE, mage.cards.s.SacredGround.class)); + cards.add(new SetCardInfo("Scapegoat", 14, Rarity.UNCOMMON, mage.cards.s.Scapegoat.class)); cards.add(new SetCardInfo("Seething Anger", 96, Rarity.COMMON, mage.cards.s.SeethingAnger.class)); - cards.add(new SetCardInfo("Serpent Warrior", 19, Rarity.COMMON, mage.cards.s.SerpentWarrior.class)); - cards.add(new SetCardInfo("Shaman en-Kor", 115, Rarity.RARE, mage.cards.s.ShamanEnKor.class)); + cards.add(new SetCardInfo("Serpent Warrior", 69, Rarity.COMMON, mage.cards.s.SerpentWarrior.class)); + cards.add(new SetCardInfo("Shaman en-Kor", 15, Rarity.RARE, mage.cards.s.ShamanEnKor.class)); cards.add(new SetCardInfo("Shard Phoenix", 97, Rarity.RARE, mage.cards.s.ShardPhoenix.class)); - cards.add(new SetCardInfo("Shifting Wall", 134, Rarity.UNCOMMON, mage.cards.s.ShiftingWall.class)); + cards.add(new SetCardInfo("Shifting Wall", 140, Rarity.UNCOMMON, mage.cards.s.ShiftingWall.class)); cards.add(new SetCardInfo("Shock", 98, Rarity.COMMON, mage.cards.s.Shock.class)); cards.add(new SetCardInfo("Sift", 42, Rarity.COMMON, mage.cards.s.Sift.class)); cards.add(new SetCardInfo("Silver Wyvern", 43, Rarity.RARE, mage.cards.s.SilverWyvern.class)); - cards.add(new SetCardInfo("Skyshroud Archer", 64, Rarity.COMMON, mage.cards.s.SkyshroudArcher.class)); - cards.add(new SetCardInfo("Skyshroud Falcon", 116, Rarity.COMMON, mage.cards.s.SkyshroudFalcon.class)); - cards.add(new SetCardInfo("Skyshroud Troopers", 65, Rarity.COMMON, mage.cards.s.SkyshroudTroopers.class)); - cards.add(new SetCardInfo("Sliver Queen", 141, Rarity.RARE, mage.cards.s.SliverQueen.class)); - cards.add(new SetCardInfo("Smite", 117, Rarity.COMMON, mage.cards.s.Smite.class)); - cards.add(new SetCardInfo("Soltari Champion", 118, Rarity.RARE, mage.cards.s.SoltariChampion.class)); - cards.add(new SetCardInfo("Spike Breeder", 66, Rarity.RARE, mage.cards.s.SpikeBreeder.class)); - cards.add(new SetCardInfo("Spike Colony", 67, Rarity.COMMON, mage.cards.s.SpikeColony.class)); - cards.add(new SetCardInfo("Spike Feeder", 68, Rarity.UNCOMMON, mage.cards.s.SpikeFeeder.class)); - cards.add(new SetCardInfo("Spike Soldier", 69, Rarity.UNCOMMON, mage.cards.s.SpikeSoldier.class)); - cards.add(new SetCardInfo("Spike Worker", 70, Rarity.COMMON, mage.cards.s.SpikeWorker.class)); + cards.add(new SetCardInfo("Skyshroud Archer", 114, Rarity.COMMON, mage.cards.s.SkyshroudArcher.class)); + cards.add(new SetCardInfo("Skyshroud Falcon", 16, Rarity.COMMON, mage.cards.s.SkyshroudFalcon.class)); + cards.add(new SetCardInfo("Skyshroud Troopers", 115, Rarity.COMMON, mage.cards.s.SkyshroudTroopers.class)); + cards.add(new SetCardInfo("Sliver Queen", 129, Rarity.RARE, mage.cards.s.SliverQueen.class)); + cards.add(new SetCardInfo("Smite", 17, Rarity.COMMON, mage.cards.s.Smite.class)); + cards.add(new SetCardInfo("Soltari Champion", 18, Rarity.RARE, mage.cards.s.SoltariChampion.class)); + cards.add(new SetCardInfo("Spike Breeder", 116, Rarity.RARE, mage.cards.s.SpikeBreeder.class)); + cards.add(new SetCardInfo("Spike Colony", 117, Rarity.COMMON, mage.cards.s.SpikeColony.class)); + cards.add(new SetCardInfo("Spike Feeder", 118, Rarity.UNCOMMON, mage.cards.s.SpikeFeeder.class)); + cards.add(new SetCardInfo("Spike Soldier", 119, Rarity.UNCOMMON, mage.cards.s.SpikeSoldier.class)); + cards.add(new SetCardInfo("Spike Worker", 120, Rarity.COMMON, mage.cards.s.SpikeWorker.class)); cards.add(new SetCardInfo("Spindrift Drake", 44, Rarity.COMMON, mage.cards.s.SpindriftDrake.class)); - cards.add(new SetCardInfo("Spined Sliver", 142, Rarity.UNCOMMON, mage.cards.s.SpinedSliver.class)); - cards.add(new SetCardInfo("Spined Wurm", 71, Rarity.COMMON, mage.cards.s.SpinedWurm.class)); - cards.add(new SetCardInfo("Spirit en-Kor", 119, Rarity.COMMON, mage.cards.s.SpiritEnKor.class)); + cards.add(new SetCardInfo("Spined Sliver", 130, Rarity.UNCOMMON, mage.cards.s.SpinedSliver.class)); + cards.add(new SetCardInfo("Spined Wurm", 121, Rarity.COMMON, mage.cards.s.SpinedWurm.class)); + cards.add(new SetCardInfo("Spirit en-Kor", 19, Rarity.COMMON, mage.cards.s.SpiritEnKor.class)); cards.add(new SetCardInfo("Spitting Hydra", 99, Rarity.RARE, mage.cards.s.SpittingHydra.class)); - cards.add(new SetCardInfo("Stronghold Assassin", 21, Rarity.RARE, mage.cards.s.StrongholdAssassin.class)); - cards.add(new SetCardInfo("Stronghold Taskmaster", 22, Rarity.UNCOMMON, mage.cards.s.StrongholdTaskmaster.class)); - cards.add(new SetCardInfo("Sword of the Chosen", 135, Rarity.RARE, mage.cards.s.SwordOfTheChosen.class)); - cards.add(new SetCardInfo("Temper", 120, Rarity.UNCOMMON, mage.cards.t.Temper.class)); - cards.add(new SetCardInfo("Tempting Licid", 72, Rarity.UNCOMMON, mage.cards.t.TemptingLicid.class)); + cards.add(new SetCardInfo("Stronghold Assassin", 71, Rarity.RARE, mage.cards.s.StrongholdAssassin.class)); + cards.add(new SetCardInfo("Stronghold Taskmaster", 72, Rarity.UNCOMMON, mage.cards.s.StrongholdTaskmaster.class)); + cards.add(new SetCardInfo("Sword of the Chosen", 141, Rarity.RARE, mage.cards.s.SwordOfTheChosen.class)); + cards.add(new SetCardInfo("Temper", 20, Rarity.UNCOMMON, mage.cards.t.Temper.class)); + cards.add(new SetCardInfo("Tempting Licid", 122, Rarity.UNCOMMON, mage.cards.t.TemptingLicid.class)); cards.add(new SetCardInfo("Thalakos Deceiver", 45, Rarity.RARE, mage.cards.t.ThalakosDeceiver.class)); cards.add(new SetCardInfo("Tidal Surge", 46, Rarity.COMMON, mage.cards.t.TidalSurge.class)); cards.add(new SetCardInfo("Tidal Warrior", 47, Rarity.COMMON, mage.cards.t.TidalWarrior.class)); - cards.add(new SetCardInfo("Torment", 23, Rarity.COMMON, mage.cards.t.Torment.class)); - cards.add(new SetCardInfo("Tortured Existence", 24, Rarity.COMMON, mage.cards.t.TorturedExistence.class)); - cards.add(new SetCardInfo("Venerable Monk", 121, Rarity.COMMON, mage.cards.v.VenerableMonk.class)); - cards.add(new SetCardInfo("Verdant Touch", 73, Rarity.RARE, mage.cards.v.VerdantTouch.class)); - cards.add(new SetCardInfo("Victual Sliver", 143, Rarity.UNCOMMON, mage.cards.v.VictualSliver.class)); - cards.add(new SetCardInfo("Volrath's Gardens", 74, Rarity.RARE, mage.cards.v.VolrathsGardens.class)); - cards.add(new SetCardInfo("Volrath's Laboratory", 136, Rarity.RARE, mage.cards.v.VolrathsLaboratory.class)); + cards.add(new SetCardInfo("Torment", 73, Rarity.COMMON, mage.cards.t.Torment.class)); + cards.add(new SetCardInfo("Tortured Existence", 74, Rarity.COMMON, mage.cards.t.TorturedExistence.class)); + cards.add(new SetCardInfo("Venerable Monk", 21, Rarity.COMMON, mage.cards.v.VenerableMonk.class)); + cards.add(new SetCardInfo("Verdant Touch", 123, Rarity.RARE, mage.cards.v.VerdantTouch.class)); + cards.add(new SetCardInfo("Victual Sliver", 131, Rarity.UNCOMMON, mage.cards.v.VictualSliver.class)); + cards.add(new SetCardInfo("Volrath's Gardens", 124, Rarity.RARE, mage.cards.v.VolrathsGardens.class)); + cards.add(new SetCardInfo("Volrath's Laboratory", 142, Rarity.RARE, mage.cards.v.VolrathsLaboratory.class)); cards.add(new SetCardInfo("Volrath's Shapeshifter", 48, Rarity.RARE, mage.cards.v.VolrathsShapeshifter.class)); - cards.add(new SetCardInfo("Volrath's Stronghold", 137, Rarity.RARE, mage.cards.v.VolrathsStronghold.class)); - cards.add(new SetCardInfo("Wall of Blossoms", 75, Rarity.UNCOMMON, mage.cards.w.WallOfBlossoms.class)); - cards.add(new SetCardInfo("Wall of Essence", 122, Rarity.UNCOMMON, mage.cards.w.WallOfEssence.class)); + cards.add(new SetCardInfo("Volrath's Stronghold", 143, Rarity.RARE, mage.cards.v.VolrathsStronghold.class)); + cards.add(new SetCardInfo("Wall of Blossoms", 125, Rarity.UNCOMMON, mage.cards.w.WallOfBlossoms.class)); + cards.add(new SetCardInfo("Wall of Essence", 22, Rarity.UNCOMMON, mage.cards.w.WallOfEssence.class)); cards.add(new SetCardInfo("Wall of Razors", 100, Rarity.UNCOMMON, mage.cards.w.WallOfRazors.class)); - cards.add(new SetCardInfo("Wall of Souls", 25, Rarity.UNCOMMON, mage.cards.w.WallOfSouls.class)); + cards.add(new SetCardInfo("Wall of Souls", 75, Rarity.UNCOMMON, mage.cards.w.WallOfSouls.class)); cards.add(new SetCardInfo("Wall of Tears", 50, Rarity.UNCOMMON, mage.cards.w.WallOfTears.class)); - cards.add(new SetCardInfo("Warrior Angel", 123, Rarity.RARE, mage.cards.w.WarriorAngel.class)); - cards.add(new SetCardInfo("Warrior en-Kor", 124, Rarity.UNCOMMON, mage.cards.w.WarriorEnKor.class)); - cards.add(new SetCardInfo("Youthful Knight", 125, Rarity.COMMON, mage.cards.y.YouthfulKnight.class)); + cards.add(new SetCardInfo("Warrior Angel", 24, Rarity.RARE, mage.cards.w.WarriorAngel.class)); + cards.add(new SetCardInfo("Warrior en-Kor", 23, Rarity.UNCOMMON, mage.cards.w.WarriorEnKor.class)); + cards.add(new SetCardInfo("Youthful Knight", 25, Rarity.COMMON, mage.cards.y.YouthfulKnight.class)); } } From 05d5f53c2912f79d6f63f975d97c97c8e99fc523 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Thu, 10 May 2018 11:42:22 +0400 Subject: [PATCH 135/158] * City in a Bottle - fixed that ability doesn't apply for some cards with umlauts in name; --- Mage.Sets/src/mage/cards/c/CityInABottle.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Mage.Sets/src/mage/cards/c/CityInABottle.java b/Mage.Sets/src/mage/cards/c/CityInABottle.java index 191999b8c02..ffe24d8c97a 100644 --- a/Mage.Sets/src/mage/cards/c/CityInABottle.java +++ b/Mage.Sets/src/mage/cards/c/CityInABottle.java @@ -96,14 +96,14 @@ public class CityInABottle extends CardImpl { namePredicatesArabianNights.add(new NamePredicate("Cuombajj Witches")); namePredicatesArabianNights.add(new NamePredicate("Cyclone")); namePredicatesArabianNights.add(new NamePredicate("Dancing Scimitar")); - namePredicatesArabianNights.add(new NamePredicate("Dandân")); + namePredicatesArabianNights.add(new NamePredicate("Dandan")); namePredicatesArabianNights.add(new NamePredicate("Desert")); namePredicatesArabianNights.add(new NamePredicate("Desert Nomads")); namePredicatesArabianNights.add(new NamePredicate("Desert Twister")); namePredicatesArabianNights.add(new NamePredicate("Diamond Valley")); namePredicatesArabianNights.add(new NamePredicate("Drop of Honey")); namePredicatesArabianNights.add(new NamePredicate("Ebony Horse")); - namePredicatesArabianNights.add(new NamePredicate("El-Hajjâj")); + namePredicatesArabianNights.add(new NamePredicate("El-Hajjaj")); namePredicatesArabianNights.add(new NamePredicate("Elephant Graveyard")); namePredicatesArabianNights.add(new NamePredicate("Erg Raiders")); namePredicatesArabianNights.add(new NamePredicate("Erhnam Djinn")); @@ -111,12 +111,12 @@ public class CityInABottle extends CardImpl { namePredicatesArabianNights.add(new NamePredicate("Fishliver Oil")); namePredicatesArabianNights.add(new NamePredicate("Flying Carpet")); namePredicatesArabianNights.add(new NamePredicate("Flying Men")); - namePredicatesArabianNights.add(new NamePredicate("Ghazbán Ogre")); + namePredicatesArabianNights.add(new NamePredicate("Ghazban Ogre")); namePredicatesArabianNights.add(new NamePredicate("Giant Tortoise")); namePredicatesArabianNights.add(new NamePredicate("Guardian Beast")); namePredicatesArabianNights.add(new NamePredicate("Hasran Ogress")); namePredicatesArabianNights.add(new NamePredicate("Hurr Jackal")); - namePredicatesArabianNights.add(new NamePredicate("Ifh-Bíff Efreet")); + namePredicatesArabianNights.add(new NamePredicate("Ifh-Biff Efreet")); namePredicatesArabianNights.add(new NamePredicate("Island Fish Jasconius")); namePredicatesArabianNights.add(new NamePredicate("Island of Wak-Wak")); namePredicatesArabianNights.add(new NamePredicate("Jandor's Ring")); @@ -124,8 +124,8 @@ public class CityInABottle extends CardImpl { namePredicatesArabianNights.add(new NamePredicate("Jeweled Bird")); namePredicatesArabianNights.add(new NamePredicate("Jihad")); namePredicatesArabianNights.add(new NamePredicate("Junún Efreet")); - namePredicatesArabianNights.add(new NamePredicate("Juzám Djinn")); - namePredicatesArabianNights.add(new NamePredicate("Khabál Ghoul")); + namePredicatesArabianNights.add(new NamePredicate("Juzam Djinn")); + namePredicatesArabianNights.add(new NamePredicate("Khabal Ghoul")); namePredicatesArabianNights.add(new NamePredicate("King Suleiman")); namePredicatesArabianNights.add(new NamePredicate("Kird Ape")); namePredicatesArabianNights.add(new NamePredicate("Library of Alexandria")); From cf421aba227ef47a6eb0127d75ed049722db7409 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Thu, 10 May 2018 11:46:21 +0400 Subject: [PATCH 136/158] * Fixed deck import that can't recognize some cards with umlauts in name; --- .../mage/cards/decks/importer/TxtDeckImporter.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Mage/src/main/java/mage/cards/decks/importer/TxtDeckImporter.java b/Mage/src/main/java/mage/cards/decks/importer/TxtDeckImporter.java index c1f490e833f..8689428734d 100644 --- a/Mage/src/main/java/mage/cards/decks/importer/TxtDeckImporter.java +++ b/Mage/src/main/java/mage/cards/decks/importer/TxtDeckImporter.java @@ -110,7 +110,15 @@ public class TxtDeckImporter extends DeckImporter { } String lineNum = line.substring(0, delim).trim(); String lineName = line.substring(delim).replace("’", "\'").trim(); - lineName = lineName.replace("&", "//").replace("Æ", "Ae").replace("ö", "ö").replace("û", "u").replace("\"", "'"); + lineName = lineName + .replace("&", "//") + .replace("Æ", "Ae") + .replace("ö", "o") + .replace("û", "u") + .replace("í", "i") + .replace("â", "a") + .replace("á", "a") + .replace("\"", "'"); if (lineName.contains("//") && !lineName.contains(" // ")) { lineName = lineName.replace("//", " // "); } From 256dc94c809ee9e96a111da781d0b3621c7025a2 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Thu, 10 May 2018 13:41:05 +0400 Subject: [PATCH 137/158] * Fixed 10 cards with "all permanents becomes" effect that it revoke colors instead doesn't change that; * Affected cards: Jolrael, Empress of Beasts, Life // Death, Living Lands, Living Plane, Natural Affinity, Natural Emergence, Nature's Revolt, Rude Awakening, Sylvan Awakening, Thelonite Druid --- .../mage/cards/j/JolraelEmpressOfBeasts.java | 2 +- Mage.Sets/src/mage/cards/l/LifeDeath.java | 2 +- Mage.Sets/src/mage/cards/l/LivingLands.java | 2 +- Mage.Sets/src/mage/cards/l/LivingPlane.java | 2 +- .../src/mage/cards/n/NaturalAffinity.java | 2 +- .../src/mage/cards/n/NaturalEmergence.java | 27 +++++-------------- Mage.Sets/src/mage/cards/n/NaturesRevolt.java | 2 +- Mage.Sets/src/mage/cards/r/RudeAwakening.java | 2 +- .../src/mage/cards/s/SylvanAwakening.java | 3 ++- .../src/mage/cards/t/TheloniteDruid.java | 2 +- .../continuous/BecomesCreatureAllEffect.java | 23 +++++++++++++--- 11 files changed, 35 insertions(+), 34 deletions(-) diff --git a/Mage.Sets/src/mage/cards/j/JolraelEmpressOfBeasts.java b/Mage.Sets/src/mage/cards/j/JolraelEmpressOfBeasts.java index fbc5958cd4a..e87ed17bfc1 100644 --- a/Mage.Sets/src/mage/cards/j/JolraelEmpressOfBeasts.java +++ b/Mage.Sets/src/mage/cards/j/JolraelEmpressOfBeasts.java @@ -105,7 +105,7 @@ class JolraelEmpressOfBeastsEffect extends OneShotEffect { if (targetPlayer != null) { FilterPermanent filter = new FilterLandPermanent(); filter.add(new ControllerIdPredicate(targetPlayer.getId())); - game.addEffect(new BecomesCreatureAllEffect(new CreatureToken(3, 3), "lands", filter, Duration.EndOfTurn), source); + game.addEffect(new BecomesCreatureAllEffect(new CreatureToken(3, 3), "lands", filter, Duration.EndOfTurn, false), source); return true; } return false; diff --git a/Mage.Sets/src/mage/cards/l/LifeDeath.java b/Mage.Sets/src/mage/cards/l/LifeDeath.java index 12555e30b0e..09ac7fd7104 100644 --- a/Mage.Sets/src/mage/cards/l/LifeDeath.java +++ b/Mage.Sets/src/mage/cards/l/LifeDeath.java @@ -62,7 +62,7 @@ public class LifeDeath extends SplitCard { // Life // All lands you control become 1/1 creatures until end of turn. They're still lands. getLeftHalfCard().getSpellAbility().addEffect(new BecomesCreatureAllEffect(new CreatureToken(1, 1), "lands", - new FilterControlledLandPermanent("lands you control"), Duration.EndOfTurn)); + new FilterControlledLandPermanent("lands you control"), Duration.EndOfTurn, false)); // Death // Return target creature card from your graveyard to the battlefield. You lose life equal to its converted mana cost. diff --git a/Mage.Sets/src/mage/cards/l/LivingLands.java b/Mage.Sets/src/mage/cards/l/LivingLands.java index 6c4d52f64ae..cad2c48b2f5 100644 --- a/Mage.Sets/src/mage/cards/l/LivingLands.java +++ b/Mage.Sets/src/mage/cards/l/LivingLands.java @@ -58,7 +58,7 @@ public class LivingLands extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{G}"); // All Forests are 1/1 creatures that are still lands. - ContinuousEffect effect = new BecomesCreatureAllEffect(new CreatureToken(1, 1), "lands", filter, Duration.WhileOnBattlefield); + ContinuousEffect effect = new BecomesCreatureAllEffect(new CreatureToken(1, 1), "lands", filter, Duration.WhileOnBattlefield, false); effect.getDependencyTypes().add(DependencyType.BecomeForest); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); } diff --git a/Mage.Sets/src/mage/cards/l/LivingPlane.java b/Mage.Sets/src/mage/cards/l/LivingPlane.java index a35d681a0e0..6eb10ce1cdd 100644 --- a/Mage.Sets/src/mage/cards/l/LivingPlane.java +++ b/Mage.Sets/src/mage/cards/l/LivingPlane.java @@ -53,7 +53,7 @@ public class LivingPlane extends CardImpl { this.addSuperType(SuperType.WORLD); // All lands are 1/1 creatures that are still lands. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesCreatureAllEffect(new CreatureToken(1, 1), "lands", StaticFilters.FILTER_LANDS, Duration.WhileOnBattlefield))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesCreatureAllEffect(new CreatureToken(1, 1), "lands", StaticFilters.FILTER_LANDS, Duration.WhileOnBattlefield, false))); } public LivingPlane(final LivingPlane card) { diff --git a/Mage.Sets/src/mage/cards/n/NaturalAffinity.java b/Mage.Sets/src/mage/cards/n/NaturalAffinity.java index 1f021b3f9fc..54f15726540 100644 --- a/Mage.Sets/src/mage/cards/n/NaturalAffinity.java +++ b/Mage.Sets/src/mage/cards/n/NaturalAffinity.java @@ -53,7 +53,7 @@ public class NaturalAffinity extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{2}{G}"); // All lands become 2/2 creatures until end of turn. They're still lands. - this.getSpellAbility().addEffect(new BecomesCreatureAllEffect(new CreatureToken(2, 2), "lands", StaticFilters.FILTER_LANDS, Duration.EndOfTurn)); + this.getSpellAbility().addEffect(new BecomesCreatureAllEffect(new CreatureToken(2, 2), "lands", StaticFilters.FILTER_LANDS, Duration.EndOfTurn, false)); } public NaturalAffinity(final NaturalAffinity card) { diff --git a/Mage.Sets/src/mage/cards/n/NaturalEmergence.java b/Mage.Sets/src/mage/cards/n/NaturalEmergence.java index ecb5fcd5a0c..691a110888c 100644 --- a/Mage.Sets/src/mage/cards/n/NaturalEmergence.java +++ b/Mage.Sets/src/mage/cards/n/NaturalEmergence.java @@ -47,6 +47,7 @@ import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.ColorPredicate; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; /** * @@ -68,9 +69,11 @@ public class NaturalEmergence extends CardImpl { Effect effect = new ReturnToHandChosenControlledPermanentEffect(filter); effect.setText("return a red or green enchantment you control to its owner's hand"); this.addAbility(new EntersBattlefieldTriggeredAbility(effect, false)); + // Lands you control are 2/2 creatures with first strike. They're still lands. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesCreatureAllEffect(new NaturalEmergenceToken(), - "lands", new FilterControlledLandPermanent("lands you control"), Duration.WhileOnBattlefield))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesCreatureAllEffect( + new CreatureToken(2, 2, "2/2 creatures with first strike").withAbility(FirstStrikeAbility.getInstance()), + "lands", new FilterControlledLandPermanent("lands you control"), Duration.WhileOnBattlefield, false))); } public NaturalEmergence(final NaturalEmergence card) { @@ -81,22 +84,4 @@ public class NaturalEmergence extends CardImpl { public NaturalEmergence copy() { return new NaturalEmergence(this); } -} - -class NaturalEmergenceToken extends TokenImpl { - - public NaturalEmergenceToken() { - super("Land", "2/2 creatures with first strike"); - cardType.add(CardType.CREATURE); - power = new MageInt(2); - toughness = new MageInt(2); - this.addAbility(FirstStrikeAbility.getInstance()); - } - public NaturalEmergenceToken(final NaturalEmergenceToken token) { - super(token); - } - - public NaturalEmergenceToken copy() { - return new NaturalEmergenceToken(this); - } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/n/NaturesRevolt.java b/Mage.Sets/src/mage/cards/n/NaturesRevolt.java index a9445feb0a3..8520a39f4ad 100644 --- a/Mage.Sets/src/mage/cards/n/NaturesRevolt.java +++ b/Mage.Sets/src/mage/cards/n/NaturesRevolt.java @@ -53,7 +53,7 @@ public class NaturesRevolt extends CardImpl { // All lands are 2/2 creatures that are still lands. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesCreatureAllEffect(new CreatureToken(2, 2), - "lands", new FilterLandPermanent(), Duration.WhileOnBattlefield))); + "lands", new FilterLandPermanent(), Duration.WhileOnBattlefield, false))); } public NaturesRevolt(final NaturesRevolt card) { diff --git a/Mage.Sets/src/mage/cards/r/RudeAwakening.java b/Mage.Sets/src/mage/cards/r/RudeAwakening.java index 1b21de2ffb4..8a3c0dda106 100644 --- a/Mage.Sets/src/mage/cards/r/RudeAwakening.java +++ b/Mage.Sets/src/mage/cards/r/RudeAwakening.java @@ -58,7 +58,7 @@ public class RudeAwakening extends CardImpl { this.getSpellAbility().addEffect(new UntapAllLandsControllerEffect()); // or until end of turn, lands you control become 2/2 creatures that are still lands. Mode mode = new Mode(); - mode.getEffects().add(new BecomesCreatureAllEffect(new CreatureToken(2, 2), "lands", new FilterControlledLandPermanent("lands you control"), Duration.EndOfTurn)); + mode.getEffects().add(new BecomesCreatureAllEffect(new CreatureToken(2, 2), "lands", new FilterControlledLandPermanent("lands you control"), Duration.EndOfTurn, false)); this.getSpellAbility().getModes().addMode(mode); // Entwine {2}{G} diff --git a/Mage.Sets/src/mage/cards/s/SylvanAwakening.java b/Mage.Sets/src/mage/cards/s/SylvanAwakening.java index fdd30fdd2d4..cdecc5c2f5d 100644 --- a/Mage.Sets/src/mage/cards/s/SylvanAwakening.java +++ b/Mage.Sets/src/mage/cards/s/SylvanAwakening.java @@ -55,7 +55,8 @@ public class SylvanAwakening extends CardImpl { new SylvanAwakeningToken(), "lands", new FilterControlledLandPermanent("all lands you control"), - Duration.UntilYourNextTurn) + Duration.UntilYourNextTurn, + false) ); } diff --git a/Mage.Sets/src/mage/cards/t/TheloniteDruid.java b/Mage.Sets/src/mage/cards/t/TheloniteDruid.java index 01f8b0c052d..31accefe2f4 100644 --- a/Mage.Sets/src/mage/cards/t/TheloniteDruid.java +++ b/Mage.Sets/src/mage/cards/t/TheloniteDruid.java @@ -68,7 +68,7 @@ public class TheloniteDruid extends CardImpl { this.toughness = new MageInt(1); // {1}{G}, {tap}, Sacrifice a creature: Forests you control become 2/3 creatures until end of turn. They're still lands. - ContinuousEffect effect = new BecomesCreatureAllEffect(new CreatureToken(2, 3), "Forests", filter, Duration.EndOfTurn); + ContinuousEffect effect = new BecomesCreatureAllEffect(new CreatureToken(2, 3), "Forests", filter, Duration.EndOfTurn, false); effect.getDependencyTypes().add(DependencyType.BecomeForest); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAllEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAllEffect.java index 9eb451177d1..acafb0666af 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAllEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAllEffect.java @@ -54,19 +54,22 @@ public class BecomesCreatureAllEffect extends ContinuousEffectImpl { protected Token token; protected String type; private final FilterPermanent filter; + private boolean loseColor = true; - public BecomesCreatureAllEffect(Token token, String type, FilterPermanent filter, Duration duration) { + public BecomesCreatureAllEffect(Token token, String type, FilterPermanent filter, Duration duration, boolean loseColor) { super(duration, Outcome.BecomeCreature); this.token = token; this.type = type; this.filter = filter; + this.loseColor = loseColor; } public BecomesCreatureAllEffect(final BecomesCreatureAllEffect effect) { super(effect); - token = effect.token.copy(); - type = effect.type; + this.token = effect.token.copy(); + this.type = effect.type; this.filter = effect.filter.copy(); + this.loseColor = effect.loseColor; } @Override @@ -94,6 +97,7 @@ public class BecomesCreatureAllEffect extends ContinuousEffectImpl { } else { affectedPermanents = new HashSet<>(game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game)); } + for(Permanent permanent : affectedPermanents) { if (permanent != null) { switch (layer) { @@ -114,13 +118,22 @@ public class BecomesCreatureAllEffect extends ContinuousEffectImpl { } } break; + case ColorChangingEffects_5: if (sublayer == SubLayer.NA) { + if (this.loseColor) { + permanent.getColor(game).setBlack(false); + permanent.getColor(game).setGreen(false); + permanent.getColor(game).setBlue(false); + permanent.getColor(game).setWhite(false); + permanent.getColor(game).setRed(false); + } if (token.getColor(game).hasColor()) { - permanent.getColor(game).setColor(token.getColor(game)); + permanent.getColor(game).addColor(token.getColor(game)); } } break; + case AbilityAddingRemovingEffects_6: if (sublayer == SubLayer.NA) { if (!token.getAbilities().isEmpty()) { @@ -130,6 +143,7 @@ public class BecomesCreatureAllEffect extends ContinuousEffectImpl { } } break; + case PTChangingEffects_7: if (sublayer == SubLayer.SetPT_7b) { int power = token.getPower().getValue(); @@ -139,6 +153,7 @@ public class BecomesCreatureAllEffect extends ContinuousEffectImpl { permanent.getToughness().setValue(toughness); } } + break; } } } From 591de4d4686c1feb31e4a95e627ddc194ad3ec9b Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Thu, 10 May 2018 14:03:44 +0400 Subject: [PATCH 138/158] Refactoring: replace custom creature tokens with basic class (4 cards) --- .../src/mage/cards/a/AmbushCommander.java | 26 +++--------- Mage.Sets/src/mage/cards/d/Dragonshift.java | 40 +++++++------------ Mage.Sets/src/mage/cards/k/KormusBell.java | 23 ++--------- Mage.Sets/src/mage/cards/l/LifeDeath.java | 5 ++- Mage.Sets/src/mage/cards/l/LivingLands.java | 4 +- Mage.Sets/src/mage/cards/l/LivingPlane.java | 4 +- .../src/mage/cards/n/NaturalAffinity.java | 4 +- Mage.Sets/src/mage/cards/n/NaturesRevolt.java | 3 +- Mage.Sets/src/mage/cards/r/RudeAwakening.java | 4 +- .../src/mage/cards/s/SylvanAwakening.java | 30 +++----------- .../src/mage/cards/t/TheloniteDruid.java | 4 +- .../continuous/BecomesCreatureAllEffect.java | 14 +++---- .../permanent/token/custom/CreatureToken.java | 27 +++++++++++++ 13 files changed, 83 insertions(+), 105 deletions(-) diff --git a/Mage.Sets/src/mage/cards/a/AmbushCommander.java b/Mage.Sets/src/mage/cards/a/AmbushCommander.java index 54851fb9b33..f5a03b89350 100644 --- a/Mage.Sets/src/mage/cards/a/AmbushCommander.java +++ b/Mage.Sets/src/mage/cards/a/AmbushCommander.java @@ -45,6 +45,7 @@ import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetCreaturePermanent; @@ -69,9 +70,12 @@ public class AmbushCommander extends CardImpl { this.toughness = new MageInt(2); // Forests you control are 1/1 green Elf creatures that are still lands. - ContinuousEffect effect = new BecomesCreatureAllEffect(new AmbushCommanderToken(), "lands", filter2, Duration.WhileOnBattlefield); + ContinuousEffect effect = new BecomesCreatureAllEffect( + new CreatureToken(1, 1, "1/1 green Elf creature").withColor("G").withSubType(SubType.ELF), + "lands", filter2, Duration.WhileOnBattlefield, true); effect.getDependencyTypes().add(DependencyType.BecomeForest); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); + // {1}{G}, Sacrifice an Elf: Target creature gets +3/+3 until end of turn. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(3, 3, Duration.EndOfTurn), new ManaCostsImpl("{1}{G}")); @@ -89,23 +93,3 @@ public class AmbushCommander extends CardImpl { return new AmbushCommander(this); } } - -class AmbushCommanderToken extends TokenImpl { - - public AmbushCommanderToken() { - super("Elf", "1/1 green Elf creatures"); - subtype.add(SubType.ELF); - cardType.add(CardType.CREATURE); - power = new MageInt(1); - toughness = new MageInt(1); - color.setGreen(true); - } - public AmbushCommanderToken(final AmbushCommanderToken token) { - super(token); - } - - public AmbushCommanderToken copy() { - return new AmbushCommanderToken(this); - } - -} diff --git a/Mage.Sets/src/mage/cards/d/Dragonshift.java b/Mage.Sets/src/mage/cards/d/Dragonshift.java index 8f6c7036df5..f83827191e4 100644 --- a/Mage.Sets/src/mage/cards/d/Dragonshift.java +++ b/Mage.Sets/src/mage/cards/d/Dragonshift.java @@ -48,6 +48,7 @@ import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.permanent.ControllerPredicate; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; import mage.target.common.TargetControlledCreaturePermanent; /** @@ -64,16 +65,25 @@ public class Dragonshift extends CardImpl { public Dragonshift(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{1}{U}{R}"); - // Until end of turn, target creature you control becomes a blue and red Dragon with base power and toughness 4/4, loses all abilities, and gains flying. - Effect effect = new BecomesCreatureTargetEffect(new DragonToken(), true, false, Duration.EndOfTurn); + Effect effect = new BecomesCreatureTargetEffect( + new CreatureToken(4, 4, "blue and red Dragon with base power and toughness 4/4") + .withSubType(SubType.DRAGON) + .withColor("UR") + .withAbility(FlyingAbility.getInstance()), + true, false, Duration.EndOfTurn); effect.setText("Until end of turn, target creature you control becomes a blue and red Dragon with base power and toughness 4/4, loses all abilities, and gains flying."); this.getSpellAbility().addEffect(effect); this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent()); // Overload {3}{U}{U}{R}{R} Ability ability = new OverloadAbility(this, new LoseAllAbilitiesAllEffect(new FilterControlledCreaturePermanent(""), Duration.EndOfTurn), new ManaCostsImpl("{3}{U}{U}{R}{R}")); - ability.addEffect(new BecomesCreatureAllEffect(new DragonToken(), null, filter, Duration.EndOfTurn)); + ability.addEffect(new BecomesCreatureAllEffect( + new CreatureToken(4, 4, "blue and red Dragon with base power and toughness 4/4 and with flying") + .withColor("UR") + .withSubType(SubType.DRAGON) + .withAbility(FlyingAbility.getInstance()), + null, filter, Duration.EndOfTurn, true)); this.addAbility(ability); } @@ -85,26 +95,4 @@ public class Dragonshift extends CardImpl { public Dragonshift copy() { return new Dragonshift(this); } - - private class DragonToken extends TokenImpl { - - public DragonToken() { - super("Dragon", "blue and red Dragon with base power and toughness 4/4 and with flying"); - cardType.add(CardType.CREATURE); - color.setBlue(true); - color.setRed(true); - subtype.add(SubType.DRAGON); - power = new MageInt(4); - toughness = new MageInt(4); - this.addAbility(FlyingAbility.getInstance()); - } - public DragonToken(final DragonToken token) { - super(token); - } - - public DragonToken copy() { - return new DragonToken(this); - } - - } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/k/KormusBell.java b/Mage.Sets/src/mage/cards/k/KormusBell.java index db2597e79c0..df3b4a5520f 100644 --- a/Mage.Sets/src/mage/cards/k/KormusBell.java +++ b/Mage.Sets/src/mage/cards/k/KormusBell.java @@ -38,6 +38,7 @@ import mage.constants.*; import mage.filter.FilterPermanent; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; /** * @@ -50,7 +51,9 @@ public class KormusBell extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}"); // All Swamps are 1/1 black creatures that are still lands. - ContinuousEffect effect = new BecomesCreatureAllEffect(new KormusBellToken(), "lands", new FilterPermanent(SubType.SWAMP, "Swamps"), Duration.WhileOnBattlefield); + ContinuousEffect effect = new BecomesCreatureAllEffect( + new CreatureToken(1, 1, "1/1 black creature").withColor("B"), + "lands", new FilterPermanent(SubType.SWAMP, "Swamps"), Duration.WhileOnBattlefield, true); effect.setDependedToType(DependencyType.BecomeSwamp); effect.addDependedToType(DependencyType.BecomeIsland); effect.addDependedToType(DependencyType.BecomeMountain); @@ -66,21 +69,3 @@ public class KormusBell extends CardImpl { return new KormusBell(this); } } - -class KormusBellToken extends TokenImpl { - - public KormusBellToken() { - super("", "1/1 black creatures"); - cardType.add(CardType.CREATURE); - power = new MageInt(1); - toughness = new MageInt(1); - color.setBlack(true); // black creatures - } - public KormusBellToken(final KormusBellToken token) { - super(token); - } - - public KormusBellToken copy() { - return new KormusBellToken(this); - } -} diff --git a/Mage.Sets/src/mage/cards/l/LifeDeath.java b/Mage.Sets/src/mage/cards/l/LifeDeath.java index 09ac7fd7104..6e8c8018e25 100644 --- a/Mage.Sets/src/mage/cards/l/LifeDeath.java +++ b/Mage.Sets/src/mage/cards/l/LifeDeath.java @@ -61,8 +61,9 @@ public class LifeDeath extends SplitCard { // Life // All lands you control become 1/1 creatures until end of turn. They're still lands. - getLeftHalfCard().getSpellAbility().addEffect(new BecomesCreatureAllEffect(new CreatureToken(1, 1), "lands", - new FilterControlledLandPermanent("lands you control"), Duration.EndOfTurn, false)); + getLeftHalfCard().getSpellAbility().addEffect(new BecomesCreatureAllEffect( + new CreatureToken(1, 1), + "lands", new FilterControlledLandPermanent("lands you control"), Duration.EndOfTurn, false)); // Death // Return target creature card from your graveyard to the battlefield. You lose life equal to its converted mana cost. diff --git a/Mage.Sets/src/mage/cards/l/LivingLands.java b/Mage.Sets/src/mage/cards/l/LivingLands.java index cad2c48b2f5..08b25821847 100644 --- a/Mage.Sets/src/mage/cards/l/LivingLands.java +++ b/Mage.Sets/src/mage/cards/l/LivingLands.java @@ -58,7 +58,9 @@ public class LivingLands extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{G}"); // All Forests are 1/1 creatures that are still lands. - ContinuousEffect effect = new BecomesCreatureAllEffect(new CreatureToken(1, 1), "lands", filter, Duration.WhileOnBattlefield, false); + ContinuousEffect effect = new BecomesCreatureAllEffect( + new CreatureToken(1, 1), + "lands", filter, Duration.WhileOnBattlefield, false); effect.getDependencyTypes().add(DependencyType.BecomeForest); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); } diff --git a/Mage.Sets/src/mage/cards/l/LivingPlane.java b/Mage.Sets/src/mage/cards/l/LivingPlane.java index 6eb10ce1cdd..86694ca1811 100644 --- a/Mage.Sets/src/mage/cards/l/LivingPlane.java +++ b/Mage.Sets/src/mage/cards/l/LivingPlane.java @@ -53,7 +53,9 @@ public class LivingPlane extends CardImpl { this.addSuperType(SuperType.WORLD); // All lands are 1/1 creatures that are still lands. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesCreatureAllEffect(new CreatureToken(1, 1), "lands", StaticFilters.FILTER_LANDS, Duration.WhileOnBattlefield, false))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesCreatureAllEffect( + new CreatureToken(1, 1), + "lands", StaticFilters.FILTER_LANDS, Duration.WhileOnBattlefield, false))); } public LivingPlane(final LivingPlane card) { diff --git a/Mage.Sets/src/mage/cards/n/NaturalAffinity.java b/Mage.Sets/src/mage/cards/n/NaturalAffinity.java index 54f15726540..ab338324804 100644 --- a/Mage.Sets/src/mage/cards/n/NaturalAffinity.java +++ b/Mage.Sets/src/mage/cards/n/NaturalAffinity.java @@ -53,7 +53,9 @@ public class NaturalAffinity extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{2}{G}"); // All lands become 2/2 creatures until end of turn. They're still lands. - this.getSpellAbility().addEffect(new BecomesCreatureAllEffect(new CreatureToken(2, 2), "lands", StaticFilters.FILTER_LANDS, Duration.EndOfTurn, false)); + this.getSpellAbility().addEffect(new BecomesCreatureAllEffect( + new CreatureToken(2, 2), + "lands", StaticFilters.FILTER_LANDS, Duration.EndOfTurn, false)); } public NaturalAffinity(final NaturalAffinity card) { diff --git a/Mage.Sets/src/mage/cards/n/NaturesRevolt.java b/Mage.Sets/src/mage/cards/n/NaturesRevolt.java index 8520a39f4ad..510992dce1a 100644 --- a/Mage.Sets/src/mage/cards/n/NaturesRevolt.java +++ b/Mage.Sets/src/mage/cards/n/NaturesRevolt.java @@ -52,7 +52,8 @@ public class NaturesRevolt extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{G}{G}"); // All lands are 2/2 creatures that are still lands. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesCreatureAllEffect(new CreatureToken(2, 2), + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesCreatureAllEffect( + new CreatureToken(2, 2), "lands", new FilterLandPermanent(), Duration.WhileOnBattlefield, false))); } diff --git a/Mage.Sets/src/mage/cards/r/RudeAwakening.java b/Mage.Sets/src/mage/cards/r/RudeAwakening.java index 8a3c0dda106..90ac29b8bcf 100644 --- a/Mage.Sets/src/mage/cards/r/RudeAwakening.java +++ b/Mage.Sets/src/mage/cards/r/RudeAwakening.java @@ -58,7 +58,9 @@ public class RudeAwakening extends CardImpl { this.getSpellAbility().addEffect(new UntapAllLandsControllerEffect()); // or until end of turn, lands you control become 2/2 creatures that are still lands. Mode mode = new Mode(); - mode.getEffects().add(new BecomesCreatureAllEffect(new CreatureToken(2, 2), "lands", new FilterControlledLandPermanent("lands you control"), Duration.EndOfTurn, false)); + mode.getEffects().add(new BecomesCreatureAllEffect( + new CreatureToken(2, 2), + "lands", new FilterControlledLandPermanent("lands you control"), Duration.EndOfTurn, false)); this.getSpellAbility().getModes().addMode(mode); // Entwine {2}{G} diff --git a/Mage.Sets/src/mage/cards/s/SylvanAwakening.java b/Mage.Sets/src/mage/cards/s/SylvanAwakening.java index cdecc5c2f5d..8fd3fc6f81d 100644 --- a/Mage.Sets/src/mage/cards/s/SylvanAwakening.java +++ b/Mage.Sets/src/mage/cards/s/SylvanAwakening.java @@ -40,6 +40,7 @@ import mage.constants.Duration; import mage.constants.SubType; import mage.filter.common.FilterControlledLandPermanent; import mage.game.permanent.token.TokenImpl; +import mage.game.permanent.token.custom.CreatureToken; /** * @@ -52,7 +53,11 @@ public class SylvanAwakening extends CardImpl { // Until your next turn, all lands you control become 2/2 Elemental creatures with reach, indestructible, and haste. They're still lands. this.getSpellAbility().addEffect(new BecomesCreatureAllEffect( - new SylvanAwakeningToken(), + new CreatureToken(2, 2, "2/2 Elemental creatures with reach, indestructible, and haste") + .withSubType(SubType.ELEMENTAL) + .withAbility(ReachAbility.getInstance()) + .withAbility(IndestructibleAbility.getInstance()) + .withAbility(HasteAbility.getInstance()), "lands", new FilterControlledLandPermanent("all lands you control"), Duration.UntilYourNextTurn, @@ -69,26 +74,3 @@ public class SylvanAwakening extends CardImpl { return new SylvanAwakening(this); } } - -class SylvanAwakeningToken extends TokenImpl { - - public SylvanAwakeningToken() { - super("", "2/2 Elemental creatures with reach, indestructible, and haste"); - cardType.add(CardType.CREATURE); - this.subtype.add(SubType.ELEMENTAL); - power = new MageInt(2); - toughness = new MageInt(2); - this.addAbility(ReachAbility.getInstance()); - this.addAbility(IndestructibleAbility.getInstance()); - this.addAbility(HasteAbility.getInstance()); - } - - public SylvanAwakeningToken(final SylvanAwakeningToken token) { - super(token); - } - - public SylvanAwakeningToken copy() { - return new SylvanAwakeningToken(this); - } - -} diff --git a/Mage.Sets/src/mage/cards/t/TheloniteDruid.java b/Mage.Sets/src/mage/cards/t/TheloniteDruid.java index 31accefe2f4..1bec2cecff1 100644 --- a/Mage.Sets/src/mage/cards/t/TheloniteDruid.java +++ b/Mage.Sets/src/mage/cards/t/TheloniteDruid.java @@ -68,7 +68,9 @@ public class TheloniteDruid extends CardImpl { this.toughness = new MageInt(1); // {1}{G}, {tap}, Sacrifice a creature: Forests you control become 2/3 creatures until end of turn. They're still lands. - ContinuousEffect effect = new BecomesCreatureAllEffect(new CreatureToken(2, 3), "Forests", filter, Duration.EndOfTurn, false); + ContinuousEffect effect = new BecomesCreatureAllEffect( + new CreatureToken(2, 3), + "Forests", filter, Duration.EndOfTurn, false); effect.getDependencyTypes().add(DependencyType.BecomeForest); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAllEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAllEffect.java index acafb0666af..bf405711521 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAllEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAllEffect.java @@ -52,14 +52,14 @@ import java.util.Set; public class BecomesCreatureAllEffect extends ContinuousEffectImpl { protected Token token; - protected String type; + protected String theyAreStillType; private final FilterPermanent filter; private boolean loseColor = true; - public BecomesCreatureAllEffect(Token token, String type, FilterPermanent filter, Duration duration, boolean loseColor) { + public BecomesCreatureAllEffect(Token token, String theyAreStillType, FilterPermanent filter, Duration duration, boolean loseColor) { super(duration, Outcome.BecomeCreature); this.token = token; - this.type = type; + this.theyAreStillType = theyAreStillType; this.filter = filter; this.loseColor = loseColor; } @@ -67,7 +67,7 @@ public class BecomesCreatureAllEffect extends ContinuousEffectImpl { public BecomesCreatureAllEffect(final BecomesCreatureAllEffect effect) { super(effect); this.token = effect.token.copy(); - this.type = effect.type; + this.theyAreStillType = effect.theyAreStillType; this.filter = effect.filter.copy(); this.loseColor = effect.loseColor; } @@ -110,7 +110,7 @@ public class BecomesCreatureAllEffect extends ContinuousEffectImpl { } } } - if (type == null) { + if (theyAreStillType == null) { permanent.getSubtype(game).clear(); } if (!token.getSubtype(game).isEmpty()) { @@ -183,8 +183,8 @@ public class BecomesCreatureAllEffect extends ContinuousEffectImpl { sb.append(" become "); } sb.append(token.getDescription()); - if (type != null && !type.isEmpty()) { - sb.append(". They're still ").append(type); + if (theyAreStillType != null && !theyAreStillType.isEmpty()) { + sb.append(". They're still ").append(theyAreStillType); } return sb.toString(); } diff --git a/Mage/src/main/java/mage/game/permanent/token/custom/CreatureToken.java b/Mage/src/main/java/mage/game/permanent/token/custom/CreatureToken.java index ed54559d736..bad6c840a1b 100644 --- a/Mage/src/main/java/mage/game/permanent/token/custom/CreatureToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/custom/CreatureToken.java @@ -1,6 +1,8 @@ package mage.game.permanent.token.custom; import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.Ability; import mage.constants.CardType; import mage.constants.SubType; import mage.game.permanent.token.TokenImpl; @@ -39,6 +41,31 @@ public class CreatureToken extends TokenImpl { } } + public CreatureToken withAbility(Ability ability) { + this.addAbility(ability); + return this; + } + + public CreatureToken withColor(String extraColors) { + ObjectColor extraColorsList = new ObjectColor(extraColors); + this.getColor(null).addColor(extraColorsList); + return this; + } + + public CreatureToken withType(CardType extraType) { + if (!this.cardType.contains(extraType)) { + this.cardType.add(extraType); + } + return this; + } + + public CreatureToken withSubType(SubType extraSubType) { + if (!this.subtype.contains(extraSubType)) { + this.subtype.add(extraSubType); + } + return this; + } + public CreatureToken(final CreatureToken token) { super(token); } From 7d7b13d5ddaf6627832c03efebe3774378203b36 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 11 May 2018 00:51:47 +0200 Subject: [PATCH 139/158] * Updated decks from test project after change of collectors numbers. --- Mage.Tests/CMDNorinTheWary.dck | 152 ++++++++--------- Mage.Tests/CommanderAnafenza_WBG.dck | 178 ++++++++++---------- Mage.Tests/CommanderDuel_Karador_BGW.dck | 202 ++++++++++++----------- Mage.Tests/RB Aggro.dck | 125 +++++++------- 4 files changed, 331 insertions(+), 326 deletions(-) diff --git a/Mage.Tests/CMDNorinTheWary.dck b/Mage.Tests/CMDNorinTheWary.dck index 74c3bd1c172..0d468d5dc32 100644 --- a/Mage.Tests/CMDNorinTheWary.dck +++ b/Mage.Tests/CMDNorinTheWary.dck @@ -1,75 +1,77 @@ -1 [BOK:108] In the Web of War -1 [7ED:319] Static Orb -1 [ALA:101] Goblin Assault -1 [8ED:204] Obliterate -1 [ORI:149] Ghirapur Gearcrafter -1 [SCG:85] Decree of Annihilation -1 [ONS:317] Forgotten Cave -1 [MRD:282] Great Furnace -1 [EVE:179] Springjack Pasture -1 [VIS:141] Anvil of Bogardan -1 [JOU:89] Bearer of the Heavens -1 [ODY:214] Price of Glory -1 [9ED:176] Blood Moon -1 [M10:212] Howling Mine -1 [CMD:114] Chaos Warp -1 [M12:153] Scrambleverse -1 [10E:204] Furnace of Rath -1 [ZEN:228] Valakut, the Molten Pinnacle -1 [M12:160] Warstorm Surge -1 [AVR:126] Archwing Dragon -1 [M15:149] Hoarding Dragon -1 [4ED:189] Strip Mine -1 [ORI:145] Fiery Impulse -1 [CSP:149] Scrying Sheets -1 [ORI:142] Enthralling Victor -1 [ORI:144] Fiery Conclusion -1 [ORI:139] Demolish -1 [MMQ:320] High Market -1 [M12:224] Buried Ruin -1 [TOR:113] Radiate -1 [M10:163] Warp World -1 [TSP:188] Word of Seizing -1 [DST:122] Genesis Chamber -1 [TSP:275] Kher Keep -1 [ORI:134] Call of the Full Moon -1 [ORI:136] Chandra's Fury -26 [CSP:154] Snow-Covered Mountain -1 [ONS:212] Gratuitous Violence -1 [ORI:133] Boggart Brute -1 [ONS:213] Insurrection -1 [TMP:210] Tooth and Claw -1 [ORI:129] Act of Treason -1 [BOK:120] Twist Allegiance -1 [CMD:136] Stranglehold -1 [M13:145] Reverberate -1 [EXO:102] Shattering Pulse -1 [9ED:312] Teferi's Puzzle Box -1 [M14:162] Wild Ricochet -1 [3ED:274] Sol Ring -1 [3ED:152] Fork -1 [DGM:34] Possibility Storm -1 [USG:188] Gamble -1 [5ED:64] Smoke -1 [STH:93] Mogg Infestation -1 [ULG:80] Goblin Welder -1 [ALA:119] Vicious Shadows -1 [ORI:163] Smash to Smithereens -1 [THS:135] Purphoros, God of the Forge -1 [CON:136] Font of Mythos -1 [7ED:307] Meekstone -1 [TSB:68] Pandemonium -1 [GTC:248] Thespian's Stage -1 [3ED:184] Wheel of Fortune -1 [M15:242] Darksteel Citadel -1 [M11:160] Wild Evocation -1 [RTR:111] Vandalblast -1 [TSP:175] Reiterate -1 [M14:148] Ogre Battledriver -1 [ORI:156] Molten Vortex -1 [MIR:183] Illicit Auction -1 [ULG:123] Crawlspace -1 [5ED:246] Jokulhaups -1 [JOU:93] Dictate of the Twin Gods -1 [5ED:249] Mana Flare -SB: 1 [TSP:171] Norin the Wary +1 [BOK:108] In the Web of War +1 [7ED:319] Static Orb +1 [ALA:101] Goblin Assault +1 [8ED:204] Obliterate +1 [ORI:149] Ghirapur Gearcrafter +1 [SCG:85] Decree of Annihilation +1 [ONS:317] Forgotten Cave +1 [MRD:282] Great Furnace +1 [EVE:179] Springjack Pasture +1 [VIS:141] Anvil of Bogardan +1 [JOU:89] Bearer of the Heavens +1 [ODY:214] Price of Glory +1 [9ED:176] Blood Moon +1 [M10:212] Howling Mine +1 [CMD:114] Chaos Warp +1 [M12:153] Scrambleverse +1 [10E:204] Furnace of Rath +1 [ZEN:228] Valakut, the Molten Pinnacle +1 [M12:160] Warstorm Surge +1 [AVR:126] Archwing Dragon +1 [M15:149] Hoarding Dragon +1 [ORI:145] Fiery Impulse +1 [CSP:149] Scrying Sheets +1 [ORI:142] Enthralling Victor +1 [ORI:144] Fiery Conclusion +1 [ORI:139] Demolish +1 [MMQ:320] High Market +1 [M12:224] Buried Ruin +1 [TOR:113] Radiate +1 [M10:163] Warp World +1 [TSP:188] Word of Seizing +1 [DST:122] Genesis Chamber +1 [TSP:275] Kher Keep +1 [ORI:134] Call of the Full Moon +1 [ORI:136] Chandra's Fury +26 [CSP:154] Snow-Covered Mountain +1 [5ED:268] Smoke +1 [ONS:212] Gratuitous Violence +1 [ORI:133] Boggart Brute +1 [ONS:213] Insurrection +1 [TMP:210] Tooth and Claw +1 [ORI:129] Act of Treason +1 [BOK:120] Twist Allegiance +1 [CMD:136] Stranglehold +1 [M13:145] Reverberate +1 [EXO:102] Shattering Pulse +1 [9ED:312] Teferi's Puzzle Box +1 [M14:162] Wild Ricochet +1 [3ED:274] Sol Ring +1 [3ED:153] Fork +1 [DGM:34] Possibility Storm +1 [4ED:363] Strip Mine +1 [USG:188] Gamble +1 [STH:93] Mogg Infestation +1 [ULG:80] Goblin Welder +1 [ALA:119] Vicious Shadows +1 [ORI:163] Smash to Smithereens +1 [THS:135] Purphoros, God of the Forge +1 [CON:136] Font of Mythos +1 [7ED:307] Meekstone +1 [TSB:68] Pandemonium +1 [GTC:248] Thespian's Stage +1 [3ED:185] Wheel of Fortune +1 [M15:242] Darksteel Citadel +1 [M11:160] Wild Evocation +1 [RTR:111] Vandalblast +1 [TSP:175] Reiterate +1 [M14:148] Ogre Battledriver +1 [ORI:156] Molten Vortex +1 [MIR:183] Illicit Auction +1 [ULG:123] Crawlspace +1 [5ED:246] Jokulhaups +1 [JOU:93] Dictate of the Twin Gods +1 [5ED:249] Mana Flare +SB: 1 [TSP:171] Norin the Wary +LAYOUT MAIN:(2,10)(CMC,true,5)|()([ULG:80])()([ORI:149],[ORI:133])([AVR:126],[ORI:142],[THS:135],[M14:148])([M15:149])()()([JOU:89])()([ONS:317],[MRD:282],[EVE:179],[ZEN:228],[4ED:363],[CSP:149],[MMQ:320],[M12:224],[TSP:275],[CSP:154],[CSP:154],[CSP:154],[CSP:154],[CSP:154],[CSP:154],[CSP:154],[CSP:154],[CSP:154],[CSP:154],[CSP:154],[CSP:154],[CSP:154],[CSP:154],[CSP:154],[CSP:154],[CSP:154],[CSP:154],[CSP:154],[CSP:154],[CSP:154],[CSP:154],[CSP:154],[CSP:154],[CSP:154],[CSP:154],[GTC:248],[M15:242])([ORI:145],[3ED:274],[USG:188],[7ED:307],[RTR:111],[ORI:156])([VIS:141],[M10:212],[ORI:144],[DST:122],[ORI:134],[M13:145],[EXO:102],[3ED:153],[5ED:268],[ORI:163])([7ED:319],[ALA:101],[ODY:214],[9ED:176],[CMD:114],[ORI:129],[3ED:185],[TSP:175],[ULG:123],[5ED:249])([10E:204],[ORI:139],[TMP:210],[CMD:136],[9ED:312],[M14:162],[CON:136],[TSB:68])([BOK:108],[TOR:113],[TSP:188],[ORI:136],[ONS:212],[DGM:34],[STH:93],[MIR:183],[JOU:93])([M12:160],[M11:160],[5ED:246])([BOK:120],[ALA:119])([8ED:204],[M12:153],[M10:163],[ONS:213])([SCG:85]) +LAYOUT SIDEBOARD:(1,1)(COLOR_IDENTITY,true,5)|([TSP:171]) diff --git a/Mage.Tests/CommanderAnafenza_WBG.dck b/Mage.Tests/CommanderAnafenza_WBG.dck index 0c8db1eb734..04860ce9af6 100644 --- a/Mage.Tests/CommanderAnafenza_WBG.dck +++ b/Mage.Tests/CommanderAnafenza_WBG.dck @@ -1,88 +1,90 @@ -1 [RTR:71] Necropolis Regent -1 [FUT:171] Llanowar Reborn -1 [RAV:158] Doubling Season -1 [RAV:33] Twilight Drover -1 [RAV:278] Golgari Rot Farm -1 [8ED:247] Fecundity -1 [M11:221] Whispersilk Cloak -1 [6ED:274] Ashnod's Altar -1 [ZEN:182] Scute Mob -1 [RTR:152] Corpsejack Menace -1 [ALA:140] Mycoloth -1 [RTR:150] Collective Blessing -1 [RTR:194] Selesnya Charm -1 [M13:170] Farseek -1 [BNG:148] Karametra, God of Harvests -7 [BFZ:270] Forest -1 [FUT:138] Sprout Swarm -1 [DKA:76] Tragic Slip -1 [DGM:149] Golgari Guildgate -1 [GTC:123] Gyre Sage -1 [DGM:93] Putrefy -1 [GTC:242] Godless Shrine -1 [AVR:10] Cathars' Crusade -1 [AVR:171] Champion of Lambholt -1 [M14:1] Ajani, Caller of the Pride -1 [THS:153] Bow of Nylea -1 [INV:233] Aura Shards -1 [RTR:63] Desecration Demon -1 [MOR:72] Oona's Blackguard -1 [KTK:215] Abzan Banner -1 [KTK:79] Mer-Ek Nightblade -1 [KTK:179] Ivorytusk Fortress -1 [M15:177] Hornet Nest -1 [DGM:153] Orzhov Guildgate -1 [KTK:133] Hardened Scales -1 [KTK:210] Utter End -1 [DGM:155] Selesnya Guildgate -1 [RTR:176] Korozda Guildmage -1 [VMA:255] Magister of Worth -1 [ISD:199] Parallel Lives -4 [BFZ:260] Swamp -1 [M12:190] Rampant Growth -1 [KTK:85] Retribution of the Ancients -1 [DGM:63] Deadbridge Chant -1 [CHK:239] Sakura-Tribe Elder -1 [ISD:239] Gavony Township -1 [DGM:114] Voice of Resurgence -1 [VMA:250] Deathreap Ritual -1 [CHK:225] Kodama's Reach -1 [M13:229] Sunpetal Grove -1 [M13:227] Reliquary Tower -1 [SCG:25] Wing Shards -1 [KTK:1] Abzan Battle Priest -1 [M11:120] Viscera Seer -1 [THS:227] Temple of Silence -1 [RTR:174] Jarad, Golgari Lich Lord -1 [RAV:251] Privileged Position -1 [KTK:3] Ainok Bond-Kin -1 [NPH:73] Sheoldred, Whispering One -1 [KTK:2] Abzan Falconer -1 [GTC:182] Obzedat, Ghost Council -1 [KTK:241] Sandsteppe Citadel -1 [RTR:121] Death's Presence -4 [BFZ:250] Plains -1 [KTK:161] Abzan Charm -1 [ISD:242] Isolated Chapel -1 [RTR:248] Temple Garden -1 [KTK:160] Abzan Ascendancy -1 [JOU:65] Dictate of Erebos -1 [TMP:36] Living Death -1 [M11:11] Condemn -1 [ORI:246] Evolving Wilds -1 [RAV:218] Phytohydra -1 [ISD:249] Woodland Cemetery -1 [M15:93] Cruel Sadist -1 [CSP:130] Juniper Order Ranger -1 [WWK:132] Bojuka Bog -1 [FUT:169] Dakmor Salvage -1 [CMD:200] Ghave, Guru of Spores -1 [DIS:95] Sprouting Phytohydra -1 [RAV:281] Selesnya Sanctuary -1 [KTK:156] Tuskguard Captain -1 [DKA:156] Grim Backwoods -1 [GPT:122] Mortify -1 [GPT:161] Orzhov Basilica -1 [C13:281] Command Tower -1 [RAV:207] Glare of Subdual -SB: 1 [KTK:163] Anafenza, the Foremost +1 [RTR:71] Necropolis Regent +1 [FUT:171] Llanowar Reborn +1 [RAV:158] Doubling Season +1 [RAV:33] Twilight Drover +1 [RAV:278] Golgari Rot Farm +1 [8ED:247] Fecundity +1 [M11:221] Whispersilk Cloak +1 [6ED:274] Ashnod's Altar +1 [ZEN:182] Scute Mob +1 [RTR:152] Corpsejack Menace +1 [ALA:140] Mycoloth +1 [RTR:150] Collective Blessing +1 [RTR:194] Selesnya Charm +4 [BFZ:250a] Plains +1 [M13:170] Farseek +1 [BNG:148] Karametra, God of Harvests +7 [BFZ:270a] Forest +1 [FUT:138] Sprout Swarm +1 [DKA:76] Tragic Slip +1 [DGM:149] Golgari Guildgate +1 [GTC:123] Gyre Sage +1 [DGM:93] Putrefy +1 [GTC:242] Godless Shrine +1 [AVR:10] Cathars' Crusade +1 [TMP:142] Living Death +1 [AVR:171] Champion of Lambholt +1 [M14:1] Ajani, Caller of the Pride +1 [THS:153] Bow of Nylea +1 [INV:233] Aura Shards +1 [RTR:63] Desecration Demon +1 [MOR:72] Oona's Blackguard +1 [KTK:215] Abzan Banner +1 [KTK:79] Mer-Ek Nightblade +1 [KTK:179] Ivorytusk Fortress +1 [M15:177] Hornet Nest +1 [DGM:153] Orzhov Guildgate +1 [KTK:133] Hardened Scales +1 [KTK:210] Utter End +1 [DGM:155] Selesnya Guildgate +1 [RTR:176] Korozda Guildmage +1 [VMA:255] Magister of Worth +1 [ISD:199] Parallel Lives +1 [M12:190] Rampant Growth +1 [KTK:85] Retribution of the Ancients +1 [DGM:63] Deadbridge Chant +1 [CHK:239] Sakura-Tribe Elder +1 [ISD:239] Gavony Township +1 [DGM:114] Voice of Resurgence +1 [VMA:250] Deathreap Ritual +1 [CHK:225] Kodama's Reach +1 [M13:229] Sunpetal Grove +1 [M13:227] Reliquary Tower +1 [SCG:25] Wing Shards +1 [KTK:1] Abzan Battle Priest +1 [M11:120] Viscera Seer +1 [THS:227] Temple of Silence +1 [RTR:174] Jarad, Golgari Lich Lord +1 [RAV:251] Privileged Position +4 [BFZ:260a] Swamp +1 [KTK:3] Ainok Bond-Kin +1 [NPH:73] Sheoldred, Whispering One +1 [KTK:2] Abzan Falconer +1 [GTC:182] Obzedat, Ghost Council +1 [KTK:241] Sandsteppe Citadel +1 [RTR:121] Death's Presence +1 [KTK:161] Abzan Charm +1 [ISD:242] Isolated Chapel +1 [RTR:248] Temple Garden +1 [KTK:160] Abzan Ascendancy +1 [JOU:65] Dictate of Erebos +1 [M11:11] Condemn +1 [ORI:246] Evolving Wilds +1 [RAV:218] Phytohydra +1 [ISD:249] Woodland Cemetery +1 [M15:93] Cruel Sadist +1 [CSP:130] Juniper Order Ranger +1 [WWK:132] Bojuka Bog +1 [FUT:169] Dakmor Salvage +1 [CMD:200] Ghave, Guru of Spores +1 [DIS:95] Sprouting Phytohydra +1 [RAV:281] Selesnya Sanctuary +1 [KTK:156] Tuskguard Captain +1 [DKA:156] Grim Backwoods +1 [GPT:122] Mortify +1 [GPT:161] Orzhov Basilica +1 [C13:281] Command Tower +1 [RAV:207] Glare of Subdual +SB: 1 [KTK:163] Anafenza, the Foremost +LAYOUT MAIN:(2,8)(CMC,true,5)|()([ZEN:182],[M11:120],[M15:93])([GTC:123],[MOR:72],[RTR:176],[CHK:239],[DGM:114],[KTK:3])([RAV:33],[AVR:171],[M15:177],[KTK:2],[KTK:156])([RTR:152],[RTR:63],[KTK:79],[KTK:1],[RTR:174])([ALA:140],[BNG:148],[KTK:179],[GTC:182],[RAV:218],[CSP:130],[CMD:200],[DIS:95])([RTR:71],[VMA:255])([NPH:73])([FUT:171],[RAV:278],[BFZ:270a],[BFZ:270a],[BFZ:270a],[BFZ:270a],[BFZ:270a],[BFZ:270a],[BFZ:270a],[DGM:149],[GTC:242],[DGM:153],[DGM:155],[BFZ:260a],[BFZ:260a],[BFZ:260a],[BFZ:260a],[ISD:239],[M13:229],[M13:227],[THS:227],[KTK:241],[BFZ:250a],[BFZ:250a],[BFZ:250a],[BFZ:250a],[ISD:242],[RTR:248],[ORI:246],[ISD:249],[WWK:132],[FUT:169],[RAV:281],[DKA:156],[GPT:161],[C13:281])([DKA:76],[KTK:133],[KTK:85],[M11:11])([RTR:194],[M13:170],[FUT:138],[M12:190])([8ED:247],[M11:221],[6ED:274],[DGM:93],[M14:1],[THS:153],[INV:233],[KTK:215],[CHK:225],[SCG:25],[KTK:161],[KTK:160],[GPT:122])([KTK:210],[ISD:199],[VMA:250],[RAV:207])([RAV:158],[AVR:10],[RAV:251],[JOU:65],[TMP:142])([RTR:150],[DGM:63],[RTR:121])() +LAYOUT SIDEBOARD:(1,1)(COLOR_IDENTITY,true,5)|([KTK:163]) diff --git a/Mage.Tests/CommanderDuel_Karador_BGW.dck b/Mage.Tests/CommanderDuel_Karador_BGW.dck index e0ea3d96a1d..946df2e3d01 100644 --- a/Mage.Tests/CommanderDuel_Karador_BGW.dck +++ b/Mage.Tests/CommanderDuel_Karador_BGW.dck @@ -1,100 +1,102 @@ -1 [M15:108] Necromancer's Stockpile -1 [FRF:76] Merciless Executioner -1 [9ED:283] Wood Elves -1 [M11:172] Fauna Shaman -1 [CMD:140] Acidic Slime -1 [PLS:42] Diabolic Intent -1 [AVR:226] Cavern of Souls -1 [TOR:77] Putrid Imp -1 [M15:194] Reclamation Sage -1 [RAV:230] Shambling Shell -1 [ISD:105] Liliana of the Veil -1 [M15:198] Satyr Wayfinder -1 [UDS:115] Pattern of Rebirth -1 [JOU:163] Mana Confluence -1 [ARB:75] Qasali Pridemage -1 [BFZ:250] Plains -1 [ZEN:172] Oracle of Mul Daya -1 [M13:229] Sunpetal Grove -1 [WWK:20] Stoneforge Mystic -1 [8ED:322] City of Brass -1 [ZEN:83] Bloodghast -1 [TSP:104] Dread Return -1 [ICE:278] Swords to Plowshares -1 [USG:230] Acridian -1 [RAV:107] Stinkweed Imp -1 [CON:113] Knight of the Reliquary -1 [AVR:106] Griselbrand -1 [10E:137] Doomed Necromancer -1 [M12:39] Sun Titan -1 [NPH:104] Birthing Pod -1 [M12:165] Birds of Paradise -1 [ORI:245] Caves of Koilos -1 [ZEN:211] Arid Mesa -1 [SOM:72] Necrotic Ooze -1 [M13:83] Bloodthrone Vampire -1 [ZEN:219] Marsh Flats -1 [TMP:340] Wasteland -1 [RAV:81] Dark Confidant -1 [TOR:69] Mesmeric Fiend -1 [RAV:87] Golgari Thug -1 [ISD:15] Fiend Hunter -1 [M15:248] Urborg, Tomb of Yawgmoth -1 [ORI:248] Llanowar Wastes -1 [KTK:248] Windswept Heath -1 [KTK:249] Wooded Foothills -1 [WWK:132] Bojuka Bog -1 [ALL:167] Phyrexian Devourer -1 [EVE:180] Twilight Mire -1 [5DN:86] Eternal Witness -1 [ZEN:220] Misty Rainforest -1 [MOR:22] Reveillark -1 [RAV:167] Golgari Grave-Troll -1 [ZEN:229] Verdant Catacombs -1 [KTK:239] Polluted Delta -1 [10E:349] Brushland -1 [RTR:243] Overgrown Tomb -1 [WWK:144] Stirring Wildwood -1 [C15:281] Command Tower -1 [SCG:59] Carrion Feeder -1 [ISD:249] Woodland Cemetery -1 [RTR:248] Temple Garden -1 [KTK:233] Flooded Strand -1 [ROE:33] Linvala, Keeper of Silence -1 [NPH:9] Elesh Norn, Grand Cenobite -1 [ISD:242] Isolated Chapel -1 [FUT:169] Dakmor Salvage -1 [M15:5] Boonweaver Giant -1 [LRW:248] Gaddock Teeg -1 [KTK:230] Bloodstained Mire -1 [RAV:172] Life from the Loam -1 [M12:188] Primeval Titan -1 [CHK:239] Sakura-Tribe Elder -1 [USG:321] Gaea's Cradle -1 [RTR:213] Deathrite Shaman -1 [USG:322] Phyrexian Tower -1 [BFZ:270] Forest -1 [FUT:174] Dryad Arbor -1 [3ED:297] Savannah -1 [ULG:11] Karmic Guide -1 [3ED:298] Scrubland -1 [UDS:1] Academy Rector -1 [5ED:191] Sylvan Library -1 [M11:218] Triskelion -1 [9ED:54] Weathered Wayfarer -1 [5ED:2] Animate Dead -1 [3ED:13] Demonic Tutor -1 [ARN:84] Bazaar of Baghdad -1 [ISD:122] Unburial Rites -1 [GTC:242] Godless Shrine -1 [ME3:69] Grim Tutor -1 [SHM:110] Devoted Druid -1 [EXO:129] Survival of the Fittest -1 [BFZ:260] Swamp -1 [DST:140] Skullclamp -1 [ALA:202] Tidehollow Sculler -1 [3ED:283] Bayou -1 [10E:361] Treetop Village -1 [TSP:245] Saffi Eriksdotter -1 [M11:120] Viscera Seer -SB: 1 [CMD:207] Karador, Ghost Chieftain +1 [RAV:230] Shambling Shell +1 [UDS:115] Pattern of Rebirth +1 [5ED:140] Animate Dead +1 [8ED:322] City of Brass +1 [M15:5] Boonweaver Giant +1 [EXO:129] Survival of the Fittest +1 [ZEN:220] Misty Rainforest +1 [10E:361] Treetop Village +1 [M15:194] Reclamation Sage +1 [FUT:174] Dryad Arbor +1 [M15:198] Satyr Wayfinder +1 [ZEN:229] Verdant Catacombs +1 [USG:322] Phyrexian Tower +1 [BFZ:270a] Forest +1 [NPH:9] Elesh Norn, Grand Cenobite +1 [USG:321] Gaea's Cradle +1 [M15:108] Necromancer's Stockpile +1 [WWK:20] Stoneforge Mystic +1 [PLS:42] Diabolic Intent +1 [ISD:105] Liliana of the Veil +1 [9ED:283] Wood Elves +1 [UDS:1] Academy Rector +1 [M12:188] Primeval Titan +1 [ALL:125] Phyrexian Devourer +1 [EVE:180] Twilight Mire +1 [RTR:213] Deathrite Shaman +1 [RAV:107] Stinkweed Imp +1 [JOU:163] Mana Confluence +1 [M13:83] Bloodthrone Vampire +1 [M12:39] Sun Titan +1 [WWK:144] Stirring Wildwood +1 [M13:229] Sunpetal Grove +1 [ALA:202] Tidehollow Sculler +1 [KTK:248] Windswept Heath +1 [KTK:249] Wooded Foothills +1 [10E:349] Brushland +1 [M11:172] Fauna Shaman +1 [MOR:22] Reveillark +1 [RTR:243] Overgrown Tomb +1 [M15:248] Urborg, Tomb of Yawgmoth +1 [RTR:248] Temple Garden +1 [3ED:105] Demonic Tutor +1 [FRF:76] Merciless Executioner +1 [LRW:248] Gaddock Teeg +1 [ULG:11] Karmic Guide +1 [WWK:132] Bojuka Bog +1 [KTK:239] Polluted Delta +1 [FUT:169] Dakmor Salvage +1 [SCG:59] Carrion Feeder +1 [DST:140] Skullclamp +1 [ARN:70] Bazaar of Baghdad +1 [ICE:54] Swords to Plowshares +1 [KTK:233] Flooded Strand +1 [KTK:230] Bloodstained Mire +1 [9ED:54] Weathered Wayfarer +1 [ARB:75] Qasali Pridemage +1 [C15:281] Command Tower +1 [BFZ:250a] Plains +1 [TOR:77] Putrid Imp +1 [GTC:242] Godless Shrine +1 [ROE:33] Linvala, Keeper of Silence +1 [CMD:140] Acidic Slime +1 [M11:218] Triskelion +1 [CON:113] Knight of the Reliquary +1 [3ED:283] Bayou +1 [TSP:104] Dread Return +1 [ZEN:83] Bloodghast +1 [3ED:286] Scrubland +1 [3ED:285] Savannah +1 [5DN:86] Eternal Witness +1 [USG:230] Acridian +1 [SOM:72] Necrotic Ooze +1 [CHK:239] Sakura-Tribe Elder +1 [TMP:330] Wasteland +1 [ME3:69] Grim Tutor +1 [ORI:248] Llanowar Wastes +1 [SHM:110] Devoted Druid +1 [RAV:172] Life from the Loam +1 [M11:120] Viscera Seer +1 [NPH:104] Birthing Pod +1 [BFZ:260a] Swamp +1 [ISD:122] Unburial Rites +1 [AVR:226] Cavern of Souls +1 [ISD:15] Fiend Hunter +1 [ISD:242] Isolated Chapel +1 [AVR:106] Griselbrand +1 [ORI:245] Caves of Koilos +1 [ISD:249] Woodland Cemetery +1 [RAV:81] Dark Confidant +1 [RAV:167] Golgari Grave-Troll +1 [RAV:87] Golgari Thug +1 [ZEN:211] Arid Mesa +1 [ZEN:172] Oracle of Mul Daya +1 [M12:165] Birds of Paradise +1 [10E:137] Doomed Necromancer +1 [TSP:245] Saffi Eriksdotter +1 [ZEN:219] Marsh Flats +1 [5ED:329] Sylvan Library +1 [TOR:69] Mesmeric Fiend +SB: 1 [CMD:207] Karador, Ghost Chieftain +LAYOUT MAIN:(2,9)(CMC,true,5)|([FUT:174])([TOR:77],[M12:165],[SCG:59],[RTR:213],[9ED:54],[M11:120])([M11:172],[M15:198],[ARB:75],[WWK:20],[ZEN:83],[USG:230],[M13:83],[RAV:81],[TOR:69],[RAV:87],[LRW:248],[CHK:239],[SHM:110],[ALA:202],[TSP:245])([FRF:76],[9ED:283],[M15:194],[RAV:230],[RAV:107],[CON:113],[10E:137],[ISD:15],[5DN:86])([ZEN:172],[SOM:72],[ROE:33],[UDS:1])([CMD:140],[MOR:22],[RAV:167],[ULG:11])([M12:39],[ALL:125],[M12:188],[M11:218])([NPH:9],[M15:5])([AVR:106])([AVR:226],[JOU:163],[BFZ:250a],[M13:229],[8ED:322],[ORI:245],[ZEN:211],[ZEN:219],[TMP:330],[M15:248],[ORI:248],[KTK:248],[KTK:249],[WWK:132],[EVE:180],[ZEN:220],[ZEN:229],[KTK:239],[10E:349],[RTR:243],[WWK:144],[C15:281],[ISD:249],[RTR:248],[KTK:233],[ISD:242],[FUT:169],[KTK:230],[USG:321],[USG:322],[BFZ:270a],[3ED:285],[3ED:286],[ARN:70],[GTC:242],[BFZ:260a],[3ED:283],[10E:361])([ICE:54],[DST:140])([M15:108],[PLS:42],[RAV:172],[5ED:329],[5ED:140],[3ED:105],[EXO:129])([ISD:105],[ME3:69])([UDS:115],[TSP:104],[NPH:104])([ISD:122])()()() +LAYOUT SIDEBOARD:(1,1)(COLOR_IDENTITY,true,5)|([CMD:207]) diff --git a/Mage.Tests/RB Aggro.dck b/Mage.Tests/RB Aggro.dck index fc6cc06bba1..649d436fe18 100644 --- a/Mage.Tests/RB Aggro.dck +++ b/Mage.Tests/RB Aggro.dck @@ -1,72 +1,71 @@ NAME:RB Aggro -1 [GUR:3] Mountain -1 [SHM:296] Mountain -1 [AVR:240] Mountain -1 [SHM:295] Mountain -1 [SHM:294] Mountain -1 [TSP:295] Mountain -1 [TSP:294] Mountain -1 [10E:379] Mountain -1 [SOM:245] Mountain -1 [ZEN:262] Mountain -1 [ZEN:245] Mountain -1 [10E:378] Mountain -1 [SOM:244] Mountain -1 [SOM:243] Mountain -1 [ZEN:244] Mountain 1 [SOM:242] Mountain -1 [ZEN:243] Mountain -1 [ZEN:242] Mountain -1 [ALA:243] Mountain -1 [ALA:242] Mountain -1 [M12:245] Mountain -1 [CHK:299] Mountain -1 [M12:243] Mountain -1 [M12:244] Mountain -1 [CHK:300] Mountain -1 [CHK:301] Mountain -1 [M12:242] Mountain -1 [CHK:302] Mountain -1 [10E:376] Mountain -1 [M11:243] Mountain -1 [M11:242] Mountain -1 [M11:245] Mountain -1 [M11:244] Mountain -1 [MBS:152] Mountain -1 [ALA:244] Mountain -1 [ALA:245] Mountain +1 [INV:344] Mountain +1 [INV:345] Mountain 1 [ZEN:263] Mountain +1 [SHM:294] Mountain 1 [ZEN:264] Mountain -1 [RAV:301] Mountain -1 [RAV:300] Mountain -1 [RAV:299] Mountain -1 [USG:345] Mountain -1 [USG:346] Mountain -1 [M10:242] Mountain -1 [RAV:302] Mountain -1 [USG:343] Mountain -1 [USG:344] Mountain -1 [ISD:259] Mountain -1 [ROE:244] Mountain +1 [SHM:295] Mountain +1 [SHM:296] Mountain +1 [ZEN:262] Mountain 1 [ISD:261] Mountain 1 [ISD:260] Mountain +1 [AVR:240] Mountain +4 [TMP:343] Mountain +1 [RAV:301] Mountain +1 [RAV:300] Mountain +1 [RAV:302] Mountain +1 [M10:244] Mountain +1 [M10:245] Mountain +1 [M10:242] Mountain +1 [M10:243] Mountain +1 [GUR:3] Mountain +1 [MRD:299] Mountain +1 [SOM:245] Mountain +1 [SOM:244] Mountain +1 [SOM:243] Mountain +1 [CHK:301] Mountain +1 [LRW:294] Mountain +1 [CHK:302] Mountain +1 [LRW:295] Mountain +1 [ALA:242] Mountain +1 [RAV:299] Mountain +1 [LRW:296] Mountain +1 [ALA:243] Mountain +1 [CHK:300] Mountain +1 [LRW:297] Mountain +1 [ALA:244] Mountain +1 [ALA:245] Mountain +1 [M11:245] Mountain +1 [ZEN:242] Mountain +1 [ZEN:243] Mountain +1 [M11:243] Mountain +1 [ZEN:244] Mountain +1 [M11:244] Mountain +1 [M11:242] Mountain +1 [USG:346] Mountain +1 [ZEN:245] Mountain +1 [USG:344] Mountain +1 [USG:345] Mountain +1 [USG:343] Mountain +1 [MRD:300] Mountain +1 [MBS:152] Mountain +1 [MRD:301] Mountain +1 [MRD:302] Mountain 1 [ROE:241] Mountain +1 [CHK:299] Mountain +1 [M12:245] Mountain +1 [M12:244] Mountain +1 [10E:378] Mountain +1 [M12:243] Mountain +1 [ROE:244] Mountain +1 [10E:379] Mountain +1 [M12:242] Mountain +1 [10E:376] Mountain 1 [ROE:242] Mountain 1 [ROE:243] Mountain -1 [MRD:301] Mountain -1 [MRD:300] Mountain -1 [MRD:299] Mountain -1 [M10:244] Mountain -1 [M10:243] Mountain -1 [M10:245] Mountain -1 [LRW:294] Mountain -1 [TMP:319] Mountain -1 [LRW:295] Mountain -1 [LRW:296] Mountain -1 [LRW:297] Mountain -1 [TMP:322] Mountain -1 [MRD:302] Mountain -1 [TMP:320] Mountain -1 [TMP:321] Mountain -1 [INV:345] Mountain -1 [INV:344] Mountain +1 [TSP:295] Mountain +1 [TSP:294] Mountain +1 [ISD:259] Mountain +LAYOUT MAIN:(2,1)(CMC,true,5)|()([GUR:3],[SHM:296],[AVR:240],[SHM:295],[SHM:294],[TSP:295],[TSP:294],[10E:379],[SOM:245],[ZEN:262],[ZEN:245],[10E:378],[SOM:244],[SOM:243],[ZEN:244],[SOM:242],[ZEN:243],[ZEN:242],[ALA:243],[ALA:242],[M12:245],[CHK:299],[M12:243],[M12:244],[CHK:300],[CHK:301],[M12:242],[CHK:302],[10E:376],[M11:243],[M11:242],[M11:245],[M11:244],[MBS:152],[ALA:244],[ALA:245],[ZEN:263],[ZEN:264],[RAV:301],[RAV:300],[RAV:299],[USG:345],[USG:346],[M10:242],[RAV:302],[USG:343],[USG:344],[ISD:259],[ROE:244],[ISD:261],[ISD:260],[ROE:241],[ROE:242],[ROE:243],[MRD:301],[MRD:300],[MRD:299],[M10:244],[M10:243],[M10:245],[LRW:294],[TMP:343],[LRW:295],[LRW:296],[LRW:297],[TMP:343],[MRD:302],[TMP:343],[TMP:343],[INV:345],[INV:344]) +LAYOUT SIDEBOARD:(0,0)(COLOR_IDENTITY,true,5)| From 75c8ee35f61ba27ba53b4f2cc276c1c5e52d2993 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 11 May 2018 00:52:09 +0200 Subject: [PATCH 140/158] * Some more fixed/reworked card movement handling. --- .../src/mage/cards/a/AncestralMemories.java | 6 +- .../src/mage/cards/b/BitterRevelation.java | 50 ++--------- .../src/mage/cards/c/CrownOfConvergence.java | 9 +- .../src/mage/cards/f/ForbiddenAlchemy.java | 69 ++------------- Mage.Sets/src/mage/cards/f/ForceMastery.java | 21 ++--- Mage.Sets/src/mage/cards/g/Galvanoth.java | 18 ++-- Mage.Sets/src/mage/cards/g/GamePreserve.java | 41 +++++---- Mage.Sets/src/mage/cards/g/GenesisHydra.java | 72 +++++++--------- Mage.Sets/src/mage/cards/g/GenesisWave.java | 32 ++----- .../src/mage/cards/g/GhoulcallersBell.java | 13 ++- .../src/mage/cards/g/GiftOfTheGargantuan.java | 65 +++++---------- .../src/mage/cards/g/GishathSunsAvatar.java | 38 ++------- .../src/mage/cards/g/GlimpseTheFuture.java | 66 ++------------- .../src/mage/cards/g/GoblinMachinist.java | 35 +++----- Mage.Sets/src/mage/cards/g/Grindstone.java | 24 +++--- Mage.Sets/src/mage/cards/g/GrislySalvage.java | 24 ++---- Mage.Sets/src/mage/cards/g/GurmagDrowner.java | 59 ++----------- Mage.Sets/src/mage/cards/h/HeedTheMists.java | 7 +- .../src/mage/cards/h/HelmOfObedience.java | 54 +++++------- .../mage/cards/i/IndomitableCreativity.java | 36 ++------ .../mage/cards/j/JaceArchitectOfThought.java | 69 ++++----------- .../src/mage/cards/j/JaceTheMindSculptor.java | 25 ++---- Mage.Sets/src/mage/cards/j/JarOfEyeballs.java | 37 +++------ .../src/mage/cards/j/JeskaiInfiltrator.java | 40 ++++----- .../src/mage/cards/k/KamahlsDruidicVow.java | 35 ++------ .../src/mage/cards/k/KindredSummons.java | 18 ++-- Mage.Sets/src/mage/cards/l/LimDulsVault.java | 44 ++-------- Mage.Sets/src/mage/cards/l/LostHours.java | 53 +++--------- .../src/mage/cards/m/MadcapExperiment.java | 42 ++++------ Mage.Sets/src/mage/cards/m/MassPolymorph.java | 25 ++---- Mage.Sets/src/mage/cards/m/MindFuneral.java | 19 ++--- Mage.Sets/src/mage/cards/m/MindGrind.java | 26 ++---- Mage.Sets/src/mage/cards/m/MindsDesire.java | 41 ++++----- Mage.Sets/src/mage/cards/m/Mindshrieker.java | 8 +- .../mage/cards/m/MirkoVoskMindDrinker.java | 28 ++----- .../src/mage/cards/m/MirrorMadPhantasm.java | 38 +++++---- .../cards/m/MuzzioVisionaryArchitect.java | 22 ++--- .../src/mage/cards/n/NaturalSelection.java | 59 ++++--------- Mage.Sets/src/mage/cards/n/Necropotence.java | 24 +++--- .../mage/cards/n/NicolBolasGodPharaoh.java | 29 +++---- .../src/mage/cards/n/NightveilSpecter.java | 13 ++- .../mage/cards/n/NivixAerieOfTheFiremind.java | 25 +++--- Mage.Sets/src/mage/cards/o/OmenMachine.java | 4 +- Mage.Sets/src/mage/cards/o/OraclesVault.java | 21 +++-- .../src/mage/cards/o/OrcishLibrarian.java | 35 +++----- Mage.Sets/src/mage/cards/o/Oust.java | 22 +---- Mage.Sets/src/mage/cards/p/PetraSphinx.java | 12 ++- .../src/mage/cards/p/PlungeIntoDarkness.java | 49 ++++------- Mage.Sets/src/mage/cards/p/Polymorph.java | 26 +++--- Mage.Sets/src/mage/cards/p/Portent.java | 54 ++++-------- Mage.Sets/src/mage/cards/p/PrimalSurge.java | 33 +++----- .../mage/cards/p/PropheticFlamespeaker.java | 23 +++-- .../src/mage/cards/p/PsychicSurgery.java | 33 +++----- .../src/mage/cards/q/QuarryColossus.java | 30 +------ Mage.Sets/src/mage/cards/r/RavenFamiliar.java | 55 +----------- Mage.Sets/src/mage/cards/r/Reweave.java | 42 ++++------ Mage.Sets/src/mage/cards/r/RuinRaider.java | 9 +- .../src/mage/cards/s/SagesOfTheAnima.java | 52 +++--------- .../src/mage/cards/s/SaprazzanBreaker.java | 8 +- Mage.Sets/src/mage/cards/s/Scalpelexis.java | 59 ++++++------- .../src/mage/cards/s/ScoutTheBorders.java | 38 +++------ Mage.Sets/src/mage/cards/s/SecondSight.java | 38 ++------- .../src/mage/cards/s/SeeTheUnwritten.java | 42 +++------- .../src/mage/cards/s/SelvalasStampede.java | 37 +++++---- Mage.Sets/src/mage/cards/s/ShapeAnew.java | 38 +++------ .../mage/cards/s/ShrineOfPiercingVision.java | 21 ++--- Mage.Sets/src/mage/cards/s/SinProdder.java | 52 ++++++------ Mage.Sets/src/mage/cards/s/Spellshift.java | 36 +++----- .../src/mage/cards/s/SphinxOfUthuun.java | 52 ++++-------- .../src/mage/cards/s/SphinxsTutelage.java | 23 ++--- Mage.Sets/src/mage/cards/s/StolenGoods.java | 15 ++-- .../src/mage/cards/s/StrategicPlanning.java | 60 ++------------ .../src/mage/cards/s/SultaiSoothsayer.java | 60 ++------------ Mage.Sets/src/mage/cards/s/SupremeWill.java | 4 +- .../src/mage/cards/s/SyntheticDestiny.java | 18 ++-- .../src/mage/cards/t/TaigamSidisisHand.java | 53 ++---------- .../src/mage/cards/t/TeleminPerformance.java | 33 +++----- .../src/mage/cards/t/ThievesFortune.java | 8 +- Mage.Sets/src/mage/cards/t/TimeOut.java | 35 ++------ .../src/mage/cards/t/TrackersInstincts.java | 25 ++---- Mage.Sets/src/mage/cards/t/TreasureHunt.java | 25 ++---- .../src/mage/cards/t/TreasureKeeper.java | 19 ++--- .../src/mage/cards/t/TrepanationBlade.java | 83 +++++-------------- Mage.Sets/src/mage/cards/t/TunnelVision.java | 37 +++------ .../cards/u/UlamogTheCeaselessHunger.java | 13 +-- .../src/mage/cards/u/UndercityInformer.java | 14 ++-- Mage.Sets/src/mage/cards/u/UndyingFlames.java | 43 ++++------ .../src/mage/cards/u/UnexpectedlyAbsent.java | 47 ++--------- Mage.Sets/src/mage/cards/v/VexingArcanix.java | 40 ++++----- .../src/mage/cards/w/WorldlyCounsel.java | 31 +++---- .../src/mage/cards/w/WriteIntoBeing.java | 10 +-- .../LookLibraryAndPickControllerEffect.java | 25 +++--- .../common/LookLibraryControllerEffect.java | 51 +++--------- .../CantBeBlockedByAllSourceEffect.java | 2 +- .../main/java/mage/filter/StaticFilters.java | 7 ++ 95 files changed, 969 insertions(+), 2192 deletions(-) diff --git a/Mage.Sets/src/mage/cards/a/AncestralMemories.java b/Mage.Sets/src/mage/cards/a/AncestralMemories.java index f3511c3542f..ae4ed209c1a 100644 --- a/Mage.Sets/src/mage/cards/a/AncestralMemories.java +++ b/Mage.Sets/src/mage/cards/a/AncestralMemories.java @@ -29,12 +29,15 @@ package mage.cards.a; import java.util.UUID; import mage.abilities.Ability; +import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; import mage.cards.*; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; import mage.filter.FilterCard; +import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; import mage.target.TargetCard; @@ -49,7 +52,8 @@ public class AncestralMemories extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{U}{U}{U}"); // Look at the top seven cards of your library. Put two of them into your hand and the rest into your graveyard. - this.getSpellAbility().addEffect(new AncestralMemoriesEffect()); + this.getSpellAbility().addEffect(new LookLibraryAndPickControllerEffect(new StaticValue(7), false, new StaticValue(2), + StaticFilters.FILTER_CARD, Zone.GRAVEYARD, false, false, false, Zone.HAND, false)); } public AncestralMemories(final AncestralMemories card) { diff --git a/Mage.Sets/src/mage/cards/b/BitterRevelation.java b/Mage.Sets/src/mage/cards/b/BitterRevelation.java index 230b15fb400..7bcc7db0b0b 100644 --- a/Mage.Sets/src/mage/cards/b/BitterRevelation.java +++ b/Mage.Sets/src/mage/cards/b/BitterRevelation.java @@ -28,17 +28,13 @@ package mage.cards.b; import java.util.UUID; -import mage.abilities.Ability; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; import mage.abilities.effects.common.LoseLifeSourceControllerEffect; import mage.cards.*; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.FilterCard; -import mage.game.Game; -import mage.players.Player; -import mage.target.TargetCard; +import mage.filter.StaticFilters; /** * @@ -50,7 +46,8 @@ public class BitterRevelation extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{B}"); // Look at the top four cards of your library. Put two of them into your hand and the rest into your graveyard. You lose 2 life. - this.getSpellAbility().addEffect(new BitterRevelationEffect()); + this.getSpellAbility().addEffect(new LookLibraryAndPickControllerEffect(new StaticValue(4), false, new StaticValue(2), + StaticFilters.FILTER_CARD, Zone.GRAVEYARD, false, false, false, Zone.HAND, false)); this.getSpellAbility().addEffect(new LoseLifeSourceControllerEffect(2)); } @@ -63,40 +60,3 @@ public class BitterRevelation extends CardImpl { return new BitterRevelation(this); } } - -class BitterRevelationEffect extends OneShotEffect { - - BitterRevelationEffect() { - super(Outcome.Benefit); - this.staticText = "Look at the top four cards of your library. Put two of them into your hand and the rest into your graveyard"; - } - - BitterRevelationEffect(final BitterRevelationEffect effect) { - super(effect); - } - - @Override - public BitterRevelationEffect copy() { - return new BitterRevelationEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, 4)); - if (!cards.isEmpty()) { - controller.lookAtCards(source, null, cards, game); - TargetCard target = new TargetCard(Math.min(2, cards.size()), Zone.LIBRARY, new FilterCard("two cards to put in your hand")); - if (controller.choose(Outcome.DrawCard, cards, target, game)) { - Cards toHand = new CardsImpl(target.getTargets()); - controller.moveCards(toHand, Zone.HAND, source, game); - cards.removeAll(toHand); - } - controller.moveCards(cards, Zone.GRAVEYARD, source, game); - } - return true; - } - return false; - } -} diff --git a/Mage.Sets/src/mage/cards/c/CrownOfConvergence.java b/Mage.Sets/src/mage/cards/c/CrownOfConvergence.java index e11572ba247..56b06cc4d5e 100644 --- a/Mage.Sets/src/mage/cards/c/CrownOfConvergence.java +++ b/Mage.Sets/src/mage/cards/c/CrownOfConvergence.java @@ -40,6 +40,7 @@ import mage.abilities.effects.common.continuous.PlayWithTheTopCardRevealedEffect import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; @@ -138,11 +139,11 @@ class CrownOfConvergenceEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player you = game.getPlayer(source.getControllerId()); - if (you != null) { - Card card = you.getLibrary().removeFromTop(game); + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + Card card = controller.getLibrary().getFromTop(game); if (card != null) { - card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, false); + controller.putCardsOnBottomOfLibrary(new CardsImpl(card), game, source, true); } return true; } diff --git a/Mage.Sets/src/mage/cards/f/ForbiddenAlchemy.java b/Mage.Sets/src/mage/cards/f/ForbiddenAlchemy.java index 60389cb563c..13114556af9 100644 --- a/Mage.Sets/src/mage/cards/f/ForbiddenAlchemy.java +++ b/Mage.Sets/src/mage/cards/f/ForbiddenAlchemy.java @@ -28,19 +28,15 @@ package mage.cards.f; import java.util.UUID; -import mage.abilities.Ability; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; import mage.abilities.keyword.FlashbackAbility; import mage.cards.*; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.TimingRule; import mage.constants.Zone; -import mage.filter.FilterCard; -import mage.game.Game; -import mage.players.Player; -import mage.target.TargetCard; +import mage.filter.StaticFilters; /** * @@ -49,11 +45,12 @@ import mage.target.TargetCard; public class ForbiddenAlchemy extends CardImpl { public ForbiddenAlchemy(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{2}{U}"); - + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{U}"); // Look at the top four cards of your library. Put one of them into your hand and the rest into your graveyard. - this.getSpellAbility().addEffect(new ForbiddenAlchemyEffect()); + this.getSpellAbility().addEffect(new LookLibraryAndPickControllerEffect(new StaticValue(4), false, new StaticValue(1), + StaticFilters.FILTER_CARD, Zone.GRAVEYARD, false, false, false, Zone.HAND, false)); + // Flashback {6}{B} this.addAbility(new FlashbackAbility(new ManaCostsImpl("{6}{B}"), TimingRule.INSTANT)); } @@ -67,55 +64,3 @@ public class ForbiddenAlchemy extends CardImpl { return new ForbiddenAlchemy(this); } } - -class ForbiddenAlchemyEffect extends OneShotEffect { - - public ForbiddenAlchemyEffect() { - super(Outcome.DrawCard); - this.staticText = "Look at the top four cards of your library. Put one of them into your hand and the rest into your graveyard"; - } - - public ForbiddenAlchemyEffect(final ForbiddenAlchemyEffect effect) { - super(effect); - } - - @Override - public ForbiddenAlchemyEffect copy() { - return new ForbiddenAlchemyEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - - if (player != null) { - Cards cards = new CardsImpl(); - int cardsCount = Math.min(4, player.getLibrary().size()); - for (int i = 0; i < cardsCount; i++) { - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - } - } - - if (!cards.isEmpty()) { - player.lookAtCards("Forbidden Alchemy", cards, game); - - TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCard("card to put in your hand")); - if (player.choose(Outcome.Benefit, cards, target, game)) { - Card card = cards.get(target.getFirstTarget(), game); - if (card != null) { - card.moveToZone(Zone.HAND, source.getSourceId(), game, false); - cards.remove(card); - } - } - - for (Card card : cards.getCards(game)) { - card.moveToZone(Zone.GRAVEYARD, source.getSourceId(), game, true); - } - } - return true; - } - return false; - } -} diff --git a/Mage.Sets/src/mage/cards/f/ForceMastery.java b/Mage.Sets/src/mage/cards/f/ForceMastery.java index 8730a1fd5b4..feaeb3a4a39 100644 --- a/Mage.Sets/src/mage/cards/f/ForceMastery.java +++ b/Mage.Sets/src/mage/cards/f/ForceMastery.java @@ -37,7 +37,6 @@ import mage.constants.Outcome; import mage.constants.TargetController; import mage.constants.Zone; import mage.game.Game; -import mage.game.permanent.Permanent; import mage.players.Player; /** @@ -47,7 +46,7 @@ import mage.players.Player; public class ForceMastery extends CardImpl { public ForceMastery(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{3}{G}{U}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{G}{U}{W}"); // At the beggining of your upkeep, reveal the top card of your library and put that card into your hand. You gain life equal to its converted mana cost. this.addAbility(new BeginningOfUpkeepTriggeredAbility(new ForceMasteryEffect(), TargetController.YOU, false)); @@ -78,18 +77,14 @@ class ForceMasteryEffect extends OneShotEffect { @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.getLibrary().hasCards()) { - Card card = controller.getLibrary().removeFromTop(game); - if (card != null) { - Cards cards = new CardsImpl(card); - controller.revealCards(sourcePermanent.getIdName(), cards, game); - controller.moveCards(card, Zone.HAND, source, game); - controller.gainLife(card.getConvertedManaCost(), game, source); - } - return true; + if (controller != null) { + Card card = controller.getLibrary().getFromTop(game); + if (card != null) { + controller.revealCards(source, new CardsImpl(card), game); + controller.moveCards(card, Zone.HAND, source, game); + controller.gainLife(card.getConvertedManaCost(), game, source); } + return true; } return false; } diff --git a/Mage.Sets/src/mage/cards/g/Galvanoth.java b/Mage.Sets/src/mage/cards/g/Galvanoth.java index 0885c89ff7a..a8f996d0e40 100644 --- a/Mage.Sets/src/mage/cards/g/Galvanoth.java +++ b/Mage.Sets/src/mage/cards/g/Galvanoth.java @@ -34,8 +34,8 @@ import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.cards.*; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.TargetController; import mage.game.Game; import mage.players.Player; @@ -80,16 +80,14 @@ class GalvanothEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller != null && controller.getLibrary().hasCards()) { + if (controller != null) { Card card = controller.getLibrary().getFromTop(game); - Cards cards = new CardsImpl(card); - controller.lookAtCards("Galvanoth", cards, game); - - if (card.isInstant() || card.isSorcery()) { - StringBuilder message = new StringBuilder("Cast ").append(card.getName()).append(" without paying its mana cost?"); - if (controller.chooseUse(Outcome.PlayForFree, message.toString(), source, game)) { - controller.getLibrary().removeFromTop(game); - controller.cast(card.getSpellAbility(), game, true); + if (card != null) { + controller.lookAtCards(source, null, new CardsImpl(card), game); + if (card.isInstant() || card.isSorcery()) { + if (controller.chooseUse(Outcome.PlayForFree, "Cast " + card.getName() + " without paying its mana cost?", source, game)) { + controller.cast(card.getSpellAbility(), game, true); + } } } return true; diff --git a/Mage.Sets/src/mage/cards/g/GamePreserve.java b/Mage.Sets/src/mage/cards/g/GamePreserve.java index dac389ec190..5af76581a0d 100644 --- a/Mage.Sets/src/mage/cards/g/GamePreserve.java +++ b/Mage.Sets/src/mage/cards/g/GamePreserve.java @@ -41,7 +41,6 @@ import mage.constants.Outcome; import mage.constants.TargetController; import mage.constants.Zone; import mage.game.Game; -import mage.game.permanent.Permanent; import mage.players.Player; /** @@ -85,29 +84,29 @@ class DuskmarEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Permanent sourceCard = game.getPermanentOrLKIBattlefield(source.getSourceId()); - if (sourceCard == null) { - return false; - } - boolean putToPlay = true; - Cards cards = new CardsImpl(); - for (Player player : game.getPlayers().values()) { - if (player.getLibrary().hasCards()) { - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - if (!card.isCreature()) { - putToPlay = false; + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + boolean putToPlay = true; + Cards cards = new CardsImpl(); + for (Player player : game.getPlayers().values()) { + if (player.getLibrary().hasCards()) { + Card card = player.getLibrary().removeFromTop(game); + if (card != null) { + cards.add(card); + if (!card.isCreature()) { + putToPlay = false; + } + player.revealCards(source, "- Revealed by " + player.getName(), cards, game); } - player.revealCards(sourceCard.getName() + ": Revealed by " + player.getName(), cards, game); + } else { + putToPlay = false; } - } else { - putToPlay = false; } + if (putToPlay) { + controller.moveCards(cards.getCards(game), Zone.BATTLEFIELD, source, game, false, false, true, null); + } + return true; } - if (putToPlay) { - game.getPlayers().values().iterator().next().moveCards(cards.getCards(game), Zone.BATTLEFIELD, source, game, false, false, true, null); - } - return true; + return false; } } diff --git a/Mage.Sets/src/mage/cards/g/GenesisHydra.java b/Mage.Sets/src/mage/cards/g/GenesisHydra.java index 4eccc30e838..85ffbe57c0e 100644 --- a/Mage.Sets/src/mage/cards/g/GenesisHydra.java +++ b/Mage.Sets/src/mage/cards/g/GenesisHydra.java @@ -37,9 +37,9 @@ import mage.abilities.effects.common.CastSourceTriggeredAbility; import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect; import mage.cards.*; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.ComparisonType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.Zone; import mage.counters.CounterType; import mage.filter.FilterCard; @@ -58,7 +58,7 @@ import mage.target.TargetCard; public class GenesisHydra extends CardImpl { public GenesisHydra(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{X}{G}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{X}{G}{G}"); this.subtype.add(SubType.PLANT); this.subtype.add(SubType.HYDRA); @@ -96,49 +96,39 @@ class GenesisHydraPutOntoBattlefieldEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { - return false; - } - Cards cards = new CardsImpl(); - Object obj = getValue(CastSourceTriggeredAbility.SOURCE_CAST_SPELL_ABILITY); - int count = 0; - if (obj != null && obj instanceof SpellAbility) { - count = ((SpellAbility) obj).getManaCostsToPay().getX(); - // using other var because of tooltip - int size = Math.min(controller.getLibrary().size(), count); - for (int i = 0; i < size; i++) { - Card card = controller.getLibrary().removeFromTop(game); - cards.add(card); - } - } - - if (!cards.isEmpty()) { - controller.revealCards("Genesis Hydra", cards, game); - } - - FilterCard filter = new FilterPermanentCard("a nonland permanent card with converted mana cost " + count + " or less to put onto the battlefield"); - filter.add(Predicates.not(new CardTypePredicate(CardType.LAND))); - filter.add(new ConvertedManaCostPredicate(ComparisonType.FEWER_THAN, count + 1)); - TargetCard target1 = new TargetCard(Zone.LIBRARY, filter); - target1.setRequired(false); - if (cards.count(filter, controller.getId(), source.getSourceId(), game) > 0) { - if (controller.choose(Outcome.PutCardInPlay, cards, target1, game)) { - Card card = cards.get(target1.getFirstTarget(), game); - if (card != null) { - cards.remove(card); - controller.moveCards(card, Zone.BATTLEFIELD, source, game); + if (controller != null && obj != null && obj instanceof SpellAbility) { + int count = ((SpellAbility) obj).getManaCostsToPay().getX(); + if (count > 0) { + Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, count)); + controller.revealCards(source, cards, game); + FilterCard filter = new FilterPermanentCard("a nonland permanent card with converted mana cost " + count + " or less to put onto the battlefield"); + filter.add(Predicates.not(new CardTypePredicate(CardType.LAND))); + filter.add(new ConvertedManaCostPredicate(ComparisonType.FEWER_THAN, count + 1)); + TargetCard target1 = new TargetCard(Zone.LIBRARY, filter); + target1.setRequired(false); + if (cards.count(filter, controller.getId(), source.getSourceId(), game) > 0) { + if (controller.choose(Outcome.PutCardInPlay, cards, target1, game)) { + Card card = cards.get(target1.getFirstTarget(), game); + if (card != null) { + cards.remove(card); + controller.moveCards(card, Zone.BATTLEFIELD, source, game); + } + target1.clearChosen(); + } else { + game.informPlayers(controller.getLogName() + " didn't choose anything"); + } + } else { + game.informPlayers("No nonland permanent card with converted mana cost " + count + " or less to choose."); + } + if (!cards.isEmpty()) { + controller.moveCards(cards, Zone.LIBRARY, source, game); + controller.shuffleLibrary(source, game); } - target1.clearChosen(); - } else { - game.informPlayers(controller.getLogName() + " didn't choose anything"); } - } else { - game.informPlayers("No nonland permanent card with converted mana cost " + count + " or less to choose."); + return true; } - controller.moveCards(cards, Zone.LIBRARY, source, game); - controller.shuffleLibrary(source, game); - return true; + return false; } @Override diff --git a/Mage.Sets/src/mage/cards/g/GenesisWave.java b/Mage.Sets/src/mage/cards/g/GenesisWave.java index 5fe9bc7693d..6af54bf6921 100644 --- a/Mage.Sets/src/mage/cards/g/GenesisWave.java +++ b/Mage.Sets/src/mage/cards/g/GenesisWave.java @@ -25,14 +25,10 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.cards.g; -import java.util.LinkedHashSet; -import java.util.Set; import java.util.UUID; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.*; @@ -86,35 +82,21 @@ class GenesisWaveEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = game.getObject(source.getSourceId()); - if (controller == null || sourceObject == null) { + if (controller == null) { return false; } - Cards cards = new CardsImpl(); int xValue = source.getManaCostsToPay().getX(); - int numberCards = Math.min(controller.getLibrary().size(), xValue); - for (int i = 0; i < numberCards; i++) { - Card card = controller.getLibrary().removeFromTop(game); - cards.add(card); - } + Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, xValue)); if (!cards.isEmpty()) { - controller.revealCards(sourceObject.getIdName(), cards, game); + controller.revealCards(source, cards, game); FilterCard filter = new FilterPermanentCard("cards with converted mana cost " + xValue + " or less to put onto the battlefield"); filter.add(new ConvertedManaCostPredicate(ComparisonType.FEWER_THAN, xValue + 1)); - TargetCard target1 = new TargetCard(0, Integer.MAX_VALUE, Zone.LIBRARY, filter); - target1.setRequired(false); - + target1.setNotTarget(true); controller.choose(Outcome.PutCardInPlay, cards, target1, game); - Set toBattlefield = new LinkedHashSet<>(); - for (UUID cardId : target1.getTargets()) { - Card card = cards.get(cardId, game); - if (card != null) { - cards.remove(card); - toBattlefield.add(card); - } - } - controller.moveCards(toBattlefield, Zone.BATTLEFIELD, source, game, false, false, false, null); + Cards toBattlefield = new CardsImpl(target1.getTargets()); + cards.removeAll(toBattlefield); + controller.moveCards(toBattlefield.getCards(game), Zone.BATTLEFIELD, source, game, false, false, false, null); controller.moveCards(cards, Zone.GRAVEYARD, source, game); } return true; diff --git a/Mage.Sets/src/mage/cards/g/GhoulcallersBell.java b/Mage.Sets/src/mage/cards/g/GhoulcallersBell.java index b8660e8464a..c88f2df7d98 100644 --- a/Mage.Sets/src/mage/cards/g/GhoulcallersBell.java +++ b/Mage.Sets/src/mage/cards/g/GhoulcallersBell.java @@ -27,7 +27,6 @@ */ package mage.cards.g; -import java.util.Collection; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -49,9 +48,9 @@ import mage.players.Player; public class GhoulcallersBell extends CardImpl { public GhoulcallersBell(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{1}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}"); - // {tap}: Each player puts the top card of their library into their graveyard. + // {T}: Each player puts the top card of their library into their graveyard. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new GhoulcallersBellEffect(), new TapSourceCost())); } @@ -83,10 +82,10 @@ class GhoulcallersBellEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Collection players = game.getPlayers().values(); - for (Player player : players) { - if (player.getLibrary().hasCards()) { - Card card = player.getLibrary().removeFromTop(game); + for (UUID playerId : game.getState().getPlayersInRange(source.getControllerId(), game)) { + Player player = game.getPlayer(playerId); + if (player != null) { + Card card = player.getLibrary().getFromTop(game); if (card != null) { player.moveCards(card, Zone.GRAVEYARD, source, game); } diff --git a/Mage.Sets/src/mage/cards/g/GiftOfTheGargantuan.java b/Mage.Sets/src/mage/cards/g/GiftOfTheGargantuan.java index fc791ae8a4c..50aa77ec022 100644 --- a/Mage.Sets/src/mage/cards/g/GiftOfTheGargantuan.java +++ b/Mage.Sets/src/mage/cards/g/GiftOfTheGargantuan.java @@ -47,8 +47,7 @@ import mage.target.TargetCard; public class GiftOfTheGargantuan extends CardImpl { public GiftOfTheGargantuan(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{2}{G}"); - + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{G}"); // Look at the top four cards of your library. You may reveal a creature card and/or a land card from among them and put the revealed cards into your hand. Put the rest on the bottom of your library in any order. this.getSpellAbility().addEffect(new GiftOfTheGargantuanEffect()); @@ -86,52 +85,32 @@ class GiftOfTheGargantuanEffect extends OneShotEffect { if (player == null) { return false; } - - Cards cards = new CardsImpl(); - boolean creatureCardFound = false; - boolean landCardFound = false; - int count = Math.min(player.getLibrary().size(), 4); - for (int i = 0; i < count; i++) { - Card card = player.getLibrary().removeFromTop(game); + Cards cards = new CardsImpl(player.getLibrary().getTopCards(game, 4)); + player.lookAtCards(source, null, cards, game); + Cards revealedCards = new CardsImpl(); + TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCreatureCard("creature card to reveal and put into your hand")); + if (target.canChoose(source.getControllerId(), game) + && player.choose(Outcome.DrawCard, cards, target, game)) { + Card card = cards.get(target.getFirstTarget(), game); if (card != null) { - cards.add(card); - if (card.isCreature()) { - creatureCardFound = true; - } - if (card.isLand()) { - landCardFound = true; - } + cards.remove(card); + card.moveToZone(Zone.HAND, source.getSourceId(), game, false); + revealedCards.add(card); } } - player.lookAtCards("Gift of the Gargantuan", cards, game); - - if ((creatureCardFound || landCardFound) && player.chooseUse(Outcome.DrawCard, "Do you wish to reveal a creature card and/or a land card and put them into your hand?", source, game)) { - Cards revealedCards = new CardsImpl(); - - TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCreatureCard("creature card to reveal and put into your hand")); - if (creatureCardFound && player.choose(Outcome.DrawCard, cards, target, game)) { - Card card = cards.get(target.getFirstTarget(), game); - if (card != null) { - cards.remove(card); - card.moveToZone(Zone.HAND, source.getSourceId(), game, false); - revealedCards.add(card); - } - } - - target = new TargetCard(Zone.LIBRARY, new FilterLandCard("land card to reveal and put into your hand")); - if (landCardFound && player.choose(Outcome.DrawCard, cards, target, game)) { - Card card = cards.get(target.getFirstTarget(), game); - if (card != null) { - cards.remove(card); - card.moveToZone(Zone.HAND, source.getSourceId(), game, false); - revealedCards.add(card); - } - } - - if (!revealedCards.isEmpty()) { - player.revealCards("Gift of the Gargantuan", revealedCards, game); + target = new TargetCard(Zone.LIBRARY, new FilterLandCard("land card to reveal and put into your hand")); + if (target.canChoose(source.getControllerId(), game) + && player.choose(Outcome.DrawCard, cards, target, game)) { + Card card = cards.get(target.getFirstTarget(), game); + if (card != null) { + cards.remove(card); + card.moveToZone(Zone.HAND, source.getSourceId(), game, false); + revealedCards.add(card); } } + if (!revealedCards.isEmpty()) { + player.revealCards(source, revealedCards, game); + } player.putCardsOnBottomOfLibrary(cards, game, source, true); return true; } diff --git a/Mage.Sets/src/mage/cards/g/GishathSunsAvatar.java b/Mage.Sets/src/mage/cards/g/GishathSunsAvatar.java index 8fbb575e149..58476d563b4 100644 --- a/Mage.Sets/src/mage/cards/g/GishathSunsAvatar.java +++ b/Mage.Sets/src/mage/cards/g/GishathSunsAvatar.java @@ -27,18 +27,14 @@ */ package mage.cards.g; -import java.util.LinkedHashSet; -import java.util.Set; import java.util.UUID; import mage.MageInt; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.keyword.TrampleAbility; import mage.abilities.keyword.VigilanceAbility; import mage.abilities.keyword.HasteAbility; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.cards.Cards; @@ -94,12 +90,6 @@ public class GishathSunsAvatar extends CardImpl { class GishathSunsAvatarEffect extends OneShotEffect { - private static final FilterCreatureCard filter = new FilterCreatureCard("Dinosaur creature cards"); - - static { - filter.add(new SubtypePredicate(SubType.DINOSAUR)); - } - GishathSunsAvatarEffect() { super(Outcome.Benefit); this.staticText = "reveal that many cards from the top of your library. Put any number of Dinosaur creature cards from among them onto the battlefield and the rest on the bottom of your library in a random order"; @@ -117,31 +107,21 @@ class GishathSunsAvatarEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = game.getObject(source.getSourceId()); - if (controller == null || sourceObject == null) { + if (controller == null) { return false; } - Cards cards = new CardsImpl(); int xValue = (Integer) getValue("damage"); - int numberCards = Math.min(controller.getLibrary().size(), xValue); - for (int i = 0; i < numberCards; i++) { - Card card = controller.getLibrary().removeFromTop(game); - cards.add(card); - } + Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, xValue)); if (!cards.isEmpty()) { - controller.revealCards(sourceObject.getIdName(), cards, game); + controller.revealCards(source, cards, game); + FilterCreatureCard filter = new FilterCreatureCard("Dinosaur creature cards"); + filter.add(new SubtypePredicate(SubType.DINOSAUR)); TargetCard target1 = new TargetCard(0, Integer.MAX_VALUE, Zone.LIBRARY, filter); - target1.setRequired(false); + target1.setNotTarget(true); controller.choose(Outcome.PutCardInPlay, cards, target1, game); - Set toBattlefield = new LinkedHashSet<>(); - for (UUID cardId : target1.getTargets()) { - Card card = cards.get(cardId, game); - if (card != null) { - cards.remove(card); - toBattlefield.add(card); - } - } - controller.moveCards(toBattlefield, Zone.BATTLEFIELD, source, game, false, false, false, null); + Cards toBattlefield = new CardsImpl(target1.getTargets()); + cards.removeAll(toBattlefield); + controller.moveCards(toBattlefield.getCards(game), Zone.BATTLEFIELD, source, game, false, false, false, null); controller.putCardsOnBottomOfLibrary(cards, game, source, false); } return true; diff --git a/Mage.Sets/src/mage/cards/g/GlimpseTheFuture.java b/Mage.Sets/src/mage/cards/g/GlimpseTheFuture.java index e1ef992a48a..2b847347239 100644 --- a/Mage.Sets/src/mage/cards/g/GlimpseTheFuture.java +++ b/Mage.Sets/src/mage/cards/g/GlimpseTheFuture.java @@ -28,16 +28,12 @@ package mage.cards.g; import java.util.UUID; -import mage.abilities.Ability; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; import mage.cards.*; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.FilterCard; -import mage.game.Game; -import mage.players.Player; -import mage.target.TargetCard; +import mage.filter.StaticFilters; /** * @@ -46,11 +42,11 @@ import mage.target.TargetCard; public class GlimpseTheFuture extends CardImpl { public GlimpseTheFuture(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{2}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{U}"); - - // Look at the top three cards of your library. Put one of them into your hand and the rest into your graveyard. - this.getSpellAbility().addEffect(new GlimpseTheFutureEffect()); + // Look at the top three cards of your library. Put one of them into your hand and the rest into your graveyard. + this.getSpellAbility().addEffect(new LookLibraryAndPickControllerEffect(new StaticValue(3), false, new StaticValue(1), + StaticFilters.FILTER_CARD, Zone.GRAVEYARD, false, false, false, Zone.HAND, false)); } @@ -63,51 +59,3 @@ public class GlimpseTheFuture extends CardImpl { return new GlimpseTheFuture(this); } } -class GlimpseTheFutureEffect extends OneShotEffect { - - public GlimpseTheFutureEffect() { - super(Outcome.DrawCard); - this.staticText = "Look at the top three cards of your library. Put one of them into your hand and the rest into your graveyard"; - } - - public GlimpseTheFutureEffect(final GlimpseTheFutureEffect effect) { - super(effect); - } - - @Override - public GlimpseTheFutureEffect copy() { - return new GlimpseTheFutureEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - - if (controller != null) { - Cards cards = new CardsImpl(); - int cardsCount = Math.min(3, controller.getLibrary().size()); - for (int i = 0; i < cardsCount; i++) { - Card card = controller.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - } - } - - if (!cards.isEmpty()) { - controller.lookAtCards("Glimpse the Future", cards, game); - - TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCard("card to put in your hand")); - if (controller.choose(Outcome.Benefit, cards, target, game)) { - Card card = cards.get(target.getFirstTarget(), game); - if (card != null) { - card.moveToZone(Zone.HAND, source.getSourceId(), game, false); - cards.remove(card); - } - } - controller.moveCards(cards, Zone.GRAVEYARD, source, game); - } - return true; - } - return false; - } -} diff --git a/Mage.Sets/src/mage/cards/g/GoblinMachinist.java b/Mage.Sets/src/mage/cards/g/GoblinMachinist.java index 4253d92c1bc..f6cd85a68b3 100644 --- a/Mage.Sets/src/mage/cards/g/GoblinMachinist.java +++ b/Mage.Sets/src/mage/cards/g/GoblinMachinist.java @@ -29,22 +29,20 @@ package mage.cards.g; import java.util.UUID; import mage.MageInt; -import mage.MageObject; 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.BoostSourceEffect; import mage.cards.Card; -import mage.constants.SubType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; +import mage.constants.SubType; import mage.game.Game; -import mage.players.Library; import mage.players.Player; /** @@ -93,27 +91,20 @@ class GoblinMachinistEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = source.getSourceObject(game); - if (controller != null && sourceObject != null) { - if (controller.getLibrary().hasCards()) { - - CardsImpl cards = new CardsImpl(); - Library library = controller.getLibrary(); - Card card = null; - do { - card = library.removeFromTop(game); - if (card != null) { - cards.add(card); - } - } while (library.hasCards() && card != null && card.isLand()); - if (!cards.isEmpty()) { - controller.revealCards(sourceObject.getIdName(), cards, game); - } - boolean retVal = false; + if (controller != null) { + CardsImpl cards = new CardsImpl(); + for (Card card : controller.getLibrary().getCards(game)) { if (card != null) { - retVal = new BoostSourceEffect(card.getConvertedManaCost(), 0, Duration.EndOfTurn).apply(game, source); + cards.add(card); + if (!card.isLand()) { + if (card.getConvertedManaCost() > 0) { + game.addEffect(new BoostSourceEffect(card.getConvertedManaCost(), 0, Duration.EndOfTurn), source); + } + break; + } } - return controller.putCardsOnBottomOfLibrary(cards, game, source, true) && retVal; + controller.revealCards(source, cards, game); + controller.putCardsOnBottomOfLibrary(cards, game, source, true); } return true; } diff --git a/Mage.Sets/src/mage/cards/g/Grindstone.java b/Mage.Sets/src/mage/cards/g/Grindstone.java index 71721e12284..accfc5ee856 100644 --- a/Mage.Sets/src/mage/cards/g/Grindstone.java +++ b/Mage.Sets/src/mage/cards/g/Grindstone.java @@ -48,7 +48,7 @@ import mage.target.TargetPlayer; public class Grindstone extends CardImpl { public Grindstone(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{1}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}"); // {3}, {T}: Target player puts the top two cards of their library into their graveyard. If both cards share a color, repeat this process. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GrindstoneEffect(), new ManaCostsImpl("{3}")); @@ -87,10 +87,11 @@ class GrindstoneEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player targetPlayer = game.getPlayer(this.getTargetPointer().getFirst(game, source)); - boolean colorShared; + if (targetPlayer != null) { int possibleIterations = targetPlayer.getLibrary().size() / 2; int iteration = 0; + boolean colorShared; do { iteration++; if (iteration > possibleIterations + 20) { @@ -102,16 +103,19 @@ class GrindstoneEffect extends OneShotEffect { return true; } colorShared = false; - Cards cards = new CardsImpl(); - cards.addAll(targetPlayer.getLibrary().getTopCards(game, 2)); - if (!cards.isEmpty()) { - Card card1 = targetPlayer.getLibrary().removeFromTop(game); - if (targetPlayer.getLibrary().hasCards()) { - colorShared = card1.getColor(game).shares(targetPlayer.getLibrary().removeFromTop(game).getColor(game)); + Card card1 = null; + Cards toGraveyard = new CardsImpl(); + for (Card card : targetPlayer.getLibrary().getCards(game)) { + toGraveyard.add(card); + if (card1 == null) { + card1 = card; + } else { + colorShared = card1.getColor(game).shares(card.getColor(game)); + break; } } - targetPlayer.moveCards(cards, Zone.GRAVEYARD, source, game); - } while (colorShared && targetPlayer.canRespond()); + targetPlayer.moveCards(toGraveyard, Zone.GRAVEYARD, source, game); + } while (colorShared); return true; } return false; diff --git a/Mage.Sets/src/mage/cards/g/GrislySalvage.java b/Mage.Sets/src/mage/cards/g/GrislySalvage.java index 295f23830bc..0fe3c540a54 100644 --- a/Mage.Sets/src/mage/cards/g/GrislySalvage.java +++ b/Mage.Sets/src/mage/cards/g/GrislySalvage.java @@ -28,7 +28,6 @@ package mage.cards.g; import java.util.UUID; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.*; @@ -49,7 +48,7 @@ import mage.target.TargetCard; public class GrislySalvage extends CardImpl { public GrislySalvage(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{B}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{B}{G}"); // Reveal the top five cards of your library. You may put a creature or land card from among them into your hand. Put the rest into your graveyard. this.getSpellAbility().addEffect(new GrislySalvageEffect()); @@ -68,6 +67,7 @@ public class GrislySalvage extends CardImpl { class GrislySalvageEffect extends OneShotEffect { private static final FilterCard filterPutInHand = new FilterCard("creature or land card to put in hand"); + static { filterPutInHand.add(Predicates.or(new CardTypePredicate(CardType.CREATURE), new CardTypePredicate(CardType.LAND))); } @@ -89,22 +89,14 @@ class GrislySalvageEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = game.getObject(source.getSourceId()); - if (sourceObject != null && controller != null) { - Cards cards = new CardsImpl(); - cards.addAll(controller.getLibrary().getTopCards(game, 5)); - boolean properCardFound = false; - for (Card card: cards.getCards(game)) { - if (filterPutInHand.match(card, source.getSourceId(), source.getControllerId(), game)) { - properCardFound = true; - } - } - + if (controller != null) { + Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, 5)); + boolean properCardFound = cards.count(filterPutInHand, game) > 0; if (!cards.isEmpty()) { - controller.revealCards(sourceObject.getName(), cards, game); + controller.revealCards(source, cards, game); TargetCard target = new TargetCard(Zone.LIBRARY, filterPutInHand); - if (properCardFound && controller.chooseUse(outcome, "Put a creature or land card from the revealed cards into your hand?", source, game) && - controller.choose(Outcome.DrawCard, cards, target, game)) { + if (properCardFound && controller.chooseUse(outcome, "Put a creature or land card from the revealed cards into your hand?", source, game) + && controller.choose(Outcome.DrawCard, cards, target, game)) { Card card = game.getCard(target.getFirstTarget()); if (card != null) { controller.moveCards(card, Zone.HAND, source, game); diff --git a/Mage.Sets/src/mage/cards/g/GurmagDrowner.java b/Mage.Sets/src/mage/cards/g/GurmagDrowner.java index e7bd738fa80..28ab5d3d60b 100644 --- a/Mage.Sets/src/mage/cards/g/GurmagDrowner.java +++ b/Mage.Sets/src/mage/cards/g/GurmagDrowner.java @@ -29,20 +29,15 @@ package mage.cards.g; import java.util.UUID; import mage.MageInt; -import mage.MageObject; -import mage.abilities.Ability; import mage.abilities.common.ExploitCreatureTriggeredAbility; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; import mage.abilities.keyword.ExploitAbility; import mage.cards.*; import mage.constants.CardType; import mage.constants.SubType; -import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.FilterCard; -import mage.game.Game; -import mage.players.Player; -import mage.target.TargetCard; +import mage.filter.StaticFilters; /** * @@ -51,7 +46,7 @@ import mage.target.TargetCard; public class GurmagDrowner extends CardImpl { public GurmagDrowner(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}"); this.subtype.add(SubType.NAGA); this.subtype.add(SubType.WIZARD); this.power = new MageInt(2); @@ -59,9 +54,10 @@ public class GurmagDrowner extends CardImpl { // Exploit this.addAbility(new ExploitAbility()); - + // When Gurmag Drowner exploits a creature, look at the top four cards of your library. Put one of them into your hand and the rest into your graveyard. - this.addAbility(new ExploitCreatureTriggeredAbility(new GurmagDrownerEffect(), false)); + this.addAbility(new ExploitCreatureTriggeredAbility(new LookLibraryAndPickControllerEffect(new StaticValue(4), false, new StaticValue(1), + StaticFilters.FILTER_CARD, Zone.GRAVEYARD, false, false, false, Zone.HAND, false), false)); } public GurmagDrowner(final GurmagDrowner card) { @@ -73,44 +69,3 @@ public class GurmagDrowner extends CardImpl { return new GurmagDrowner(this); } } - -class GurmagDrownerEffect extends OneShotEffect { - - public GurmagDrownerEffect() { - super(Outcome.DrawCard); - this.staticText = "look at the top four cards of your library. Put one of them into your hand and the rest into your graveyard"; - } - - public GurmagDrownerEffect(final GurmagDrownerEffect effect) { - super(effect); - } - - @Override - public GurmagDrownerEffect copy() { - return new GurmagDrownerEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = game.getObject(source.getSourceId()); - if (controller != null && sourceObject != null) { - Cards cards = new CardsImpl(); - cards.addAll(controller.getLibrary().getTopCards(game, 4)); - if (!cards.isEmpty()) { - controller.lookAtCards(sourceObject.getName(), cards, game); - TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCard("card to put in your hand")); - if (controller.choose(Outcome.Benefit, cards, target, game)) { - Card card = cards.get(target.getFirstTarget(), game); - if (card != null) { - controller.moveCards(card, Zone.HAND, source, game); - cards.remove(card); - } - } - controller.moveCards(cards, Zone.GRAVEYARD, source, game); - } - return true; - } - return false; - } -} diff --git a/Mage.Sets/src/mage/cards/h/HeedTheMists.java b/Mage.Sets/src/mage/cards/h/HeedTheMists.java index 5134c17ca4c..c6de2d363d8 100644 --- a/Mage.Sets/src/mage/cards/h/HeedTheMists.java +++ b/Mage.Sets/src/mage/cards/h/HeedTheMists.java @@ -34,8 +34,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.game.Game; import mage.players.Player; @@ -47,10 +47,9 @@ import mage.players.Player; public class HeedTheMists extends CardImpl { public HeedTheMists(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{3}{U}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{U}{U}"); this.subtype.add(SubType.ARCANE); - // Put the top card of your library into your graveyard, then draw cards equal to that card's converted mana cost. this.getSpellAbility().addEffect(new HeedTheMistsEffect()); } @@ -80,7 +79,7 @@ public class HeedTheMists extends CardImpl { boolean result = false; Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - Card card = controller.getLibrary().removeFromTop(game); + Card card = controller.getLibrary().getFromTop(game); if (card != null) { int cmc = card.getConvertedManaCost(); controller.moveCards(card, Zone.GRAVEYARD, source, game); diff --git a/Mage.Sets/src/mage/cards/h/HelmOfObedience.java b/Mage.Sets/src/mage/cards/h/HelmOfObedience.java index 161590b4423..3c4816aa415 100644 --- a/Mage.Sets/src/mage/cards/h/HelmOfObedience.java +++ b/Mage.Sets/src/mage/cards/h/HelmOfObedience.java @@ -52,7 +52,7 @@ import mage.target.common.TargetOpponent; public class HelmOfObedience extends CardImpl { public HelmOfObedience(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{4}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}"); // {X}, {T}: Target opponent puts cards from the top of their library into their graveyard until a creature card or X cards are put into that graveyard this way, whichever comes first. If a creature card is put into that graveyard this way, sacrifice Helm of Obedience and put that card onto the battlefield under your control. X can't be 0. VariableManaCost xCosts = new VariableManaCost(); @@ -73,22 +73,19 @@ public class HelmOfObedience extends CardImpl { } } - class HelmOfObedienceEffect extends OneShotEffect { - private static final ManacostVariableValue amount = new ManacostVariableValue(); - + public HelmOfObedienceEffect() { super(Outcome.Detriment); - staticText = "Target opponent puts cards from the top of their library into their graveyard until a creature card or X cards are put into that graveyard this way, whichever comes first. If a creature card is put into that graveyard this way, sacrifice Helm of Obedience and put that card onto the battlefield under your control. X can't be 0"; + staticText = "Target opponent puts cards from the top of their library into their graveyard until a creature card or X cards are put into that graveyard this way, whichever comes first. If a creature card is put into that graveyard this way, sacrifice {this} and put that card onto the battlefield under your control. X can't be 0"; } public HelmOfObedienceEffect(final HelmOfObedienceEffect effect) { super(effect); } - @Override public HelmOfObedienceEffect copy() { return new HelmOfObedienceEffect(this); @@ -96,36 +93,29 @@ class HelmOfObedienceEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); Player targetOpponent = game.getPlayer(targetPointer.getFirst(game, source)); - if (targetOpponent != null) { - int max = amount.calculate(game, source, this); - if(max != 0){ - int numberOfCard = 0; - - while(targetOpponent.getLibrary().hasCards()) { - Card card = targetOpponent.getLibrary().removeFromTop(game); - if (card != null){ - if (targetOpponent.moveCards(card, Zone.GRAVEYARD, source, game)) { - if(card.isCreature()){ - // If a creature card is put into that graveyard this way, sacrifice Helm of Obedience - // and put that card onto the battlefield under your control. - Permanent sourcePermanent = game.getPermanent(source.getSourceId()); - if (sourcePermanent != null) { - sourcePermanent.sacrifice(source.getSourceId(), game); - } - if (game.getState().getZone(card.getId()) == Zone.GRAVEYARD) { - card.putOntoBattlefield(game, Zone.GRAVEYARD, source.getSourceId(), source.getControllerId()); - } + int max = amount.calculate(game, source, this); + if (targetOpponent != null && controller != null && max > 0) { + int numberOfCard = 0; + for (Card card : targetOpponent.getLibrary().getCards(game)) { + if (card != null) { + if (targetOpponent.moveCards(card, Zone.GRAVEYARD, source, game)) { + if (card.isCreature()) { + // If a creature card is put into that graveyard this way, sacrifice Helm of Obedience + // and put that card onto the battlefield under your control. + Permanent sourcePermanent = source.getSourcePermanentIfItStillExists(game); + if (sourcePermanent != null) { + sourcePermanent.sacrifice(source.getSourceId(), game); + } + controller.moveCards(card, Zone.BATTLEFIELD, source, game); + break; + } else { + numberOfCard++; + if (numberOfCard >= max) { break; - } else{ - numberOfCard++; - if(numberOfCard >= max){ - break; - } } } - } else{ - return false; } } } diff --git a/Mage.Sets/src/mage/cards/i/IndomitableCreativity.java b/Mage.Sets/src/mage/cards/i/IndomitableCreativity.java index 9f5b9235440..95528a9e996 100644 --- a/Mage.Sets/src/mage/cards/i/IndomitableCreativity.java +++ b/Mage.Sets/src/mage/cards/i/IndomitableCreativity.java @@ -27,7 +27,6 @@ */ package mage.cards.i; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.SpellAbility; import mage.abilities.effects.OneShotEffect; @@ -104,8 +103,7 @@ class IndomitableCreativityEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = source.getSourceObject(game); - if (controller != null && sourceObject != null) { + if (controller != null) { List destroyedPermanents = new ArrayList<>(); for (UUID targetId : getTargetPointer().getTargets(game, source)) { Permanent target = game.getPermanent(targetId); @@ -115,47 +113,25 @@ class IndomitableCreativityEffect extends OneShotEffect { } } } - Map cardsToReveal = new HashMap<>(); - for (Permanent permanent : destroyedPermanents) { Player controllerOfDestroyedCreature = game.getPlayer(permanent.getControllerId()); if (controllerOfDestroyedCreature != null) { Library library = controllerOfDestroyedCreature.getLibrary(); if (library.hasCards()) { - Cards cards = new CardsImpl(); - Cards revealCards; - if (cardsToReveal.containsKey(controllerOfDestroyedCreature)) { - revealCards = cardsToReveal.get(controllerOfDestroyedCreature); - } else { - revealCards = new CardsImpl(); - cardsToReveal.put(controllerOfDestroyedCreature, revealCards); - } - Card card = library.removeFromTop(game); - cards.add(card); - while (!card.isCreature() && !card.isArtifact() && library.hasCards()) { - card = library.removeFromTop(game); - cards.add(card); - } - - if (!cards.isEmpty()) { - revealCards.addAll(cards); + Cards cardsToReaveal = new CardsImpl(); + for (Card card : library.getCards(game)) { + cardsToReaveal.add(card); if (card.isCreature() || card.isArtifact()) { controllerOfDestroyedCreature.moveCards(card, Zone.EXILED, source, game); controllerOfDestroyedCreature.moveCards(card, Zone.BATTLEFIELD, source, game); + break; } - Set cardsToShuffle = cards.getCards(game); - cardsToShuffle.remove(card); - library.addAll(cardsToShuffle, game); - } + controllerOfDestroyedCreature.revealCards(source, " for destroyed " + permanent.getIdName(), cardsToReaveal, game); controllerOfDestroyedCreature.shuffleLibrary(source, game); } } } - // reveal cards at the end (because a player can have x permanents to be destroyed - for (Player player : cardsToReveal.keySet()) { - player.revealCards(sourceObject.getIdName(), cardsToReveal.get(player), game); - } return true; } return false; diff --git a/Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java b/Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java index 2928ca8ea6f..c8fddaa7ac4 100644 --- a/Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java +++ b/Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java @@ -28,7 +28,6 @@ package mage.cards.j; import java.util.ArrayList; -import java.util.List; import java.util.Set; import java.util.UUID; import mage.abilities.Ability; @@ -72,7 +71,7 @@ import mage.util.CardUtil; public class JaceArchitectOfThought extends CardImpl { public JaceArchitectOfThought(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{2}{U}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{U}{U}"); this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.JACE); @@ -192,16 +191,8 @@ class JaceArchitectOfThoughtEffect2 extends OneShotEffect { return false; } - Cards cards = new CardsImpl(); - int count = Math.min(player.getLibrary().size(), 3); - for (int i = 0; i < count; i++) { - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - } - } - player.revealCards("Jace, Architect of Thought", cards, game); - + Cards allCards = new CardsImpl(player.getLibrary().getTopCards(game, 3)); + player.revealCards(source, allCards, game); Set opponents = game.getOpponents(source.getControllerId()); if (!opponents.isEmpty()) { Player opponent = null; @@ -215,50 +206,24 @@ class JaceArchitectOfThoughtEffect2 extends OneShotEffect { opponent = game.getPlayer(opponents.iterator().next()); } - TargetCard target = new TargetCard(0, cards.size(), Zone.LIBRARY, new FilterCard("cards to put in the first pile")); - target.setRequired(false); - Cards pile1 = new CardsImpl(); - if (opponent.choose(Outcome.Neutral, cards, target, game)) { - for (UUID targetId : (List) target.getTargets()) { - Card card = cards.get(targetId, game); - if (card != null) { - pile1.add(card); - cards.remove(card); - } - } - } - player.revealCards("Pile 1 (Jace, Architect of Thought)", pile1, game); - player.revealCards("Pile 2 (Jace, Architect of Thought)", cards, game); + TargetCard target = new TargetCard(0, allCards.size(), Zone.LIBRARY, new FilterCard("cards to put in the first pile")); + target.setNotTarget(true); + opponent.choose(Outcome.Neutral, allCards, target, game); + Cards pile1 = new CardsImpl(target.getTargets()); + Cards pile2 = new CardsImpl(allCards); + pile2.removeAll(pile1); + player.revealCards(source, "Pile 1", pile1, game); + player.revealCards(source, "Pile 2", pile2, game); postPileToLog("Pile 1", pile1.getCards(game), game); - postPileToLog("Pile 2", cards.getCards(game), game); + postPileToLog("Pile 2", pile2.getCards(game), game); - Cards cardsToHand = cards; - Cards cardsToLibrary = pile1; - List cardPile1 = new ArrayList<>(); - List cardPile2 = new ArrayList<>(); - for (UUID cardId : pile1) { - cardPile1.add(game.getCard(cardId)); - } - for (UUID cardId : cards) { - cardPile2.add(game.getCard(cardId)); - } - - boolean pileChoice = player.choosePile(Outcome.Neutral, "Choose a pile to to put into your hand.", cardPile1, cardPile2, game); - if (pileChoice) { - cardsToHand = pile1; - cardsToLibrary = cards; - } + boolean pileChoice = player.choosePile(Outcome.Neutral, "Choose a pile to to put into your hand.", + new ArrayList<>(pile1.getCards(game)), + new ArrayList<>(allCards.getCards(game)), game); game.informPlayers(player.getLogName() + " chose pile" + (pileChoice ? "1" : "2")); - - for (UUID cardUuid : cardsToHand) { - Card card = cardsToHand.get(cardUuid, game); - if (card != null) { - player.moveCards(card, Zone.HAND, source, game); - } - } - - player.putCardsOnBottomOfLibrary(cardsToLibrary, game, source, true); + player.moveCards(pileChoice ? pile1 : pile2, Zone.HAND, source, game); + player.putCardsOnBottomOfLibrary(pileChoice ? pile2 : pile1, game, source, true); return true; } return false; diff --git a/Mage.Sets/src/mage/cards/j/JaceTheMindSculptor.java b/Mage.Sets/src/mage/cards/j/JaceTheMindSculptor.java index beb6aa3e55b..61a784f0842 100644 --- a/Mage.Sets/src/mage/cards/j/JaceTheMindSculptor.java +++ b/Mage.Sets/src/mage/cards/j/JaceTheMindSculptor.java @@ -40,8 +40,8 @@ import mage.cards.CardSetInfo; import mage.cards.Cards; import mage.cards.CardsImpl; 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.game.Game; @@ -55,7 +55,7 @@ import mage.target.common.TargetCreaturePermanent; public class JaceTheMindSculptor extends CardImpl { public JaceTheMindSculptor(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{2}{U}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{U}{U}"); this.addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.JACE); @@ -150,21 +150,12 @@ class JaceTheMindSculptorEffect2 extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getFirstTarget()); - if (player != null) { - while (true) { - if (player.getLibrary().getFromTop(game) == null) { - break; - } - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - card.moveToExile(null, "", source.getSourceId(), game); - } - } - for (Card card : player.getHand().getCards(game)) { - card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, false); - } - player.shuffleLibrary(source, game); + Player controller = game.getPlayer(source.getControllerId()); + Player targetPlayer = game.getPlayer(source.getFirstTarget()); + if (controller != null && targetPlayer != null) { + controller.moveCards(targetPlayer.getLibrary().getTopCards(game, targetPlayer.getLibrary().size()), Zone.EXILED, source, game); + targetPlayer.moveCards(targetPlayer.getHand(), Zone.LIBRARY, source, game); + targetPlayer.shuffleLibrary(source, game); return true; } return false; diff --git a/Mage.Sets/src/mage/cards/j/JarOfEyeballs.java b/Mage.Sets/src/mage/cards/j/JarOfEyeballs.java index 2d8f5999728..d52c3d76667 100644 --- a/Mage.Sets/src/mage/cards/j/JarOfEyeballs.java +++ b/Mage.Sets/src/mage/cards/j/JarOfEyeballs.java @@ -37,7 +37,6 @@ import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.cards.Cards; @@ -62,7 +61,7 @@ import mage.target.TargetCard; public class JarOfEyeballs extends CardImpl { public JarOfEyeballs(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); // Whenever a creature you control dies, put two eyeball counters on Jar of Eyeballs. this.addAbility(new JarOfEyeballsTriggeredAbility()); @@ -184,37 +183,25 @@ class JarOfEyeballsEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { + return false; + } int countersRemoved = 0; for (Cost cost : source.getCosts()) { if (cost instanceof JarOfEyeballsCost) { countersRemoved = ((JarOfEyeballsCost) cost).getRemovedCounters(); } } - - Player player = game.getPlayer(source.getControllerId()); - if (player == null) { - return false; - } - - Cards cards = new CardsImpl(); - int count = Math.min(player.getLibrary().size(), countersRemoved); - for (int i = 0; i < count; i++) { - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - } - } - player.lookAtCards("Jar of Eyeballs", cards, game); - + Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, countersRemoved)); + controller.lookAtCards(source, null, cards, game); TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCard("card to put into your hand")); - if (player.choose(Outcome.DrawCard, cards, target, game)) { - Card card = cards.get(target.getFirstTarget(), game); - if (card != null) { - cards.remove(card); - card.moveToZone(Zone.HAND, source.getSourceId(), game, false); - } + if (controller.choose(Outcome.DrawCard, cards, target, game)) { + Cards targetCards = new CardsImpl(target.getTargets()); + controller.moveCards(targetCards, Zone.HAND, source, game); + cards.removeAll(targetCards); } - player.putCardsOnBottomOfLibrary(cards, game, source, true); + controller.putCardsOnBottomOfLibrary(cards, game, source, true); return true; } } diff --git a/Mage.Sets/src/mage/cards/j/JeskaiInfiltrator.java b/Mage.Sets/src/mage/cards/j/JeskaiInfiltrator.java index ca33fc5076f..8df0690deb2 100644 --- a/Mage.Sets/src/mage/cards/j/JeskaiInfiltrator.java +++ b/Mage.Sets/src/mage/cards/j/JeskaiInfiltrator.java @@ -27,11 +27,7 @@ */ package mage.cards.j; -import java.util.ArrayList; -import java.util.Collections; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; +import java.util.HashSet; import java.util.UUID; import mage.MageInt; import mage.MageObjectReference; @@ -51,13 +47,13 @@ import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.TargetController; import mage.constants.Zone; +import mage.game.ExileZone; import mage.game.Game; -import mage.game.permanent.Permanent; import mage.players.Player; /** @@ -67,7 +63,7 @@ import mage.players.Player; public class JeskaiInfiltrator extends CardImpl { public JeskaiInfiltrator(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.MONK); this.power = new MageInt(2); @@ -112,23 +108,21 @@ class JeskaiInfiltratorEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - List cardsToManifest = new ArrayList<>(2); - Permanent sourcePermanent = game.getPermanent(source.getSourceId()); - Card sourceCard = game.getCard(source.getSourceId()); - if (sourcePermanent != null && sourceCard != null) { - controller.moveCardToExileWithInfo(sourcePermanent, sourcePermanent.getId(), sourcePermanent.getIdName(), source.getSourceId(), game, Zone.BATTLEFIELD, true); - cardsToManifest.add(sourceCard); + HashSet cardsToManifest = new HashSet<>(); + cardsToManifest.add(source.getSourcePermanentIfItStillExists(game)); + cardsToManifest.add(controller.getLibrary().getFromTop(game)); + UUID exileId = UUID.randomUUID(); + controller.moveCardsToExile(cardsToManifest, source, game, false, exileId, ""); + ExileZone exileZone = game.getExile().getExileZone(exileId); + for (Card card : exileZone.getCards(game)) { + card.setFaceDown(true, game); } - if (sourcePermanent != null && controller.getLibrary().hasCards()) { - Card cardFromLibrary = controller.getLibrary().removeFromTop(game); - controller.moveCardToExileWithInfo(cardFromLibrary, sourcePermanent.getId(), sourcePermanent.getIdName(), source.getSourceId(), game, Zone.LIBRARY, true); - cardsToManifest.add(cardFromLibrary); - } - Collections.shuffle(cardsToManifest); game.fireUpdatePlayersEvent(); // removes Jeskai from Battlefield, so he returns as a fresh permanent to the battlefield with new position + Ability newSource = source.copy(); newSource.setWorksFaceDown(true); - for (Card card : cardsToManifest) { + while (!exileZone.isEmpty()) { + Card card = exileZone.getRandom(game); ManaCosts manaCosts = null; if (card.isCreature()) { manaCosts = card.getSpellAbility().getManaCosts(); @@ -139,9 +133,7 @@ class JeskaiInfiltratorEffect extends OneShotEffect { MageObjectReference objectReference = new MageObjectReference(card.getId(), card.getZoneChangeCounter(game) + 1, game); game.addEffect(new BecomesFaceDownCreatureEffect(manaCosts, objectReference, Duration.Custom, FaceDownType.MANIFESTED), newSource); } - Set toBattlefield = new LinkedHashSet(); - toBattlefield.addAll(cardsToManifest); - controller.moveCards(toBattlefield, Zone.BATTLEFIELD, source, game, false, true, false, null); + controller.moveCards(exileZone.getCards(game), Zone.BATTLEFIELD, source, game, false, true, false, null); return true; } return false; diff --git a/Mage.Sets/src/mage/cards/k/KamahlsDruidicVow.java b/Mage.Sets/src/mage/cards/k/KamahlsDruidicVow.java index 198624e5bd3..1cb1a97158f 100644 --- a/Mage.Sets/src/mage/cards/k/KamahlsDruidicVow.java +++ b/Mage.Sets/src/mage/cards/k/KamahlsDruidicVow.java @@ -1,14 +1,9 @@ package mage.cards.k; -import java.util.LinkedHashSet; -import java.util.Set; import java.util.UUID; - -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.LegendarySpellAbility; import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.cards.Cards; @@ -29,8 +24,7 @@ import mage.players.Player; import mage.target.TargetCard; /** - * @author JRHerlehy - * Created on 4/8/18. + * @author JRHerlehy Created on 4/8/18. */ public class KamahlsDruidicVow extends CardImpl { @@ -72,18 +66,12 @@ class KamahlsDruidicVowEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = game.getObject(source.getSourceId()); - if (controller == null || sourceObject == null) { + if (controller == null) { return false; } - - Cards cards = new CardsImpl(); int xValue = source.getManaCostsToPay().getX(); - int numCards = Math.min(controller.getLibrary().size(), xValue); - for (int i = 0; i < numCards; i++) { - Card card = controller.getLibrary().removeFromTop(game); - cards.add(card); - } + Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, xValue)); + controller.lookAtCards(source, null, cards, game); if (!cards.isEmpty()) { FilterCard filter = new FilterPermanentCard("land and/or legendary permanent cards with converted mana cost " + xValue + " or less to put onto the battlefield"); filter.add(new ConvertedManaCostPredicate(ComparisonType.FEWER_THAN, xValue + 1)); @@ -93,18 +81,11 @@ class KamahlsDruidicVowEffect extends OneShotEffect { new SupertypePredicate(SuperType.LEGENDARY) )); TargetCard target1 = new TargetCard(0, Integer.MAX_VALUE, Zone.LIBRARY, filter); - target1.setRequired(false); - + target1.setNotTarget(true); controller.choose(Outcome.PutCardInPlay, cards, target1, game); - Set toBattlefield = new LinkedHashSet<>(); - for (UUID cardId : target1.getTargets()) { - Card card = cards.get(cardId, game); - if (card != null) { - cards.remove(card); - toBattlefield.add(card); - } - } - controller.moveCards(toBattlefield, Zone.BATTLEFIELD, source, game, false, false, false, null); + Cards toBattlefield = new CardsImpl(target1.getTargets()); + cards.removeAll(toBattlefield); + controller.moveCards(toBattlefield.getCards(game), Zone.BATTLEFIELD, source, game, false, false, false, null); controller.moveCards(cards, Zone.GRAVEYARD, source, game); } return true; diff --git a/Mage.Sets/src/mage/cards/k/KindredSummons.java b/Mage.Sets/src/mage/cards/k/KindredSummons.java index 096eb729b80..c72c121e6eb 100644 --- a/Mage.Sets/src/mage/cards/k/KindredSummons.java +++ b/Mage.Sets/src/mage/cards/k/KindredSummons.java @@ -30,7 +30,6 @@ package mage.cards.k; import java.util.LinkedHashSet; import java.util.Set; import java.util.UUID; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.ChooseCreatureTypeEffect; @@ -96,8 +95,7 @@ class KindredSummonsEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = source.getSourceObject(game); - if (controller != null && sourceObject != null) { + if (controller != null) { SubType subType = ChooseCreatureTypeEffect.getChoosenCreatureType(source.getSourceId(), game); if (subType == null) { return false; @@ -110,19 +108,23 @@ class KindredSummonsEffect extends OneShotEffect { Cards otherCards = new CardsImpl(); FilterCreatureCard filterCard = new FilterCreatureCard("creature card of the chosen type"); filterCard.add(new SubtypePredicate(subType)); - while (chosenSubtypeCreatureCards.size() < numberOfCards && controller.getLibrary().hasCards()) { - Card card = controller.getLibrary().removeFromTop(game); + for (Card card : controller.getLibrary().getCards(game)) { revealed.add(card); if (card != null && filterCard.match(card, game)) { chosenSubtypeCreatureCards.add(card); + if (chosenSubtypeCreatureCards.size() == numberOfCards) { + break; + } } else { otherCards.add(card); } } - controller.revealCards(sourceObject.getIdName(), revealed, game); + controller.revealCards(source, revealed, game); controller.moveCards(chosenSubtypeCreatureCards, Zone.BATTLEFIELD, source, game); - controller.putCardsOnTopOfLibrary(otherCards, game, source, false); - controller.shuffleLibrary(source, game); + if (!otherCards.isEmpty()) { + controller.putCardsOnTopOfLibrary(otherCards, game, source, false); + controller.shuffleLibrary(source, game); + } return true; } return false; diff --git a/Mage.Sets/src/mage/cards/l/LimDulsVault.java b/Mage.Sets/src/mage/cards/l/LimDulsVault.java index 182c92ce18f..e930d9f1cd2 100644 --- a/Mage.Sets/src/mage/cards/l/LimDulsVault.java +++ b/Mage.Sets/src/mage/cards/l/LimDulsVault.java @@ -30,18 +30,14 @@ package mage.cards.l; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.cards.Cards; import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Outcome; -import mage.constants.Zone; -import mage.filter.FilterCard; import mage.game.Game; import mage.players.Player; -import mage.target.TargetCard; /** * @@ -50,8 +46,7 @@ import mage.target.TargetCard; public class LimDulsVault extends CardImpl { public LimDulsVault(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{U}{B}"); - + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{U}{B}"); // Look at the top five cards of your library. As many times as you choose, you may pay 1 life, put those cards on the bottom of your library in any order, then look at the top five cards of your library. Then shuffle your library and put the last cards you looked at this way on top of it in any order. this.getSpellAbility().addEffect(new LimDulsVaultEffect()); @@ -68,12 +63,12 @@ public class LimDulsVault extends CardImpl { } class LimDulsVaultEffect extends OneShotEffect { - static final private String textTop = "card to put on your library (last chosen will be on top)"; - static final private String textBottom = "card to put on bottom of your library (last chosen will be on bottom)"; public LimDulsVaultEffect() { super(Outcome.Benefit); - this.staticText = "Look at the top five cards of your library. As many times as you choose, you may pay 1 life, put those cards on the bottom of your library in any order, then look at the top five cards of your library. Then shuffle your library and put the last cards you looked at this way on top of it in any order"; + this.staticText = "Look at the top five cards of your library. As many times as you choose, " + + "you may pay 1 life, put those cards on the bottom of your library in any order, then look at the top five cards of your library. " + + "Then shuffle your library and put the last cards you looked at this way on top of it in any order"; } public LimDulsVaultEffect(final LimDulsVaultEffect effect) { @@ -93,38 +88,17 @@ class LimDulsVaultEffect extends OneShotEffect { } boolean doAgain; - do { - Cards cards = new CardsImpl(); - int count = Math.min(player.getLibrary().size(), 5); - for (int i = 0; i < count; i++) { - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - } - } - player.lookAtCards("Lim-Dul's Vault", cards, game); + do { + Cards cards = new CardsImpl(player.getLibrary().getTopCards(game, 5)); + player.lookAtCards(source, null, cards, game); doAgain = player.chooseUse(outcome, "Pay 1 life and look at the next 5 cards?", source, game); if (doAgain) { player.loseLife(1, game, false); + player.putCardsOnBottomOfLibrary(cards, game, source, true); } else { player.shuffleLibrary(source, game); + player.putCardsOnTopOfLibrary(cards, game, source, true); } - - TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCard(doAgain ? textBottom : textTop)); - while (player.canRespond() && cards.size() > 1) { - player.choose(Outcome.Neutral, cards, target, game); - Card card = cards.get(target.getFirstTarget(), game); - if (card != null) { - cards.remove(card); - card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, !doAgain); - } - target.clearChosen(); - } - if (cards.size() == 1) { - Card card = cards.get(cards.iterator().next(), game); - card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, !doAgain); - } - } while (doAgain); return true; diff --git a/Mage.Sets/src/mage/cards/l/LostHours.java b/Mage.Sets/src/mage/cards/l/LostHours.java index eeeaa9e983f..c06d84c38d3 100644 --- a/Mage.Sets/src/mage/cards/l/LostHours.java +++ b/Mage.Sets/src/mage/cards/l/LostHours.java @@ -33,13 +33,11 @@ import mage.abilities.effects.OneShotEffect; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; import mage.filter.FilterCard; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; import mage.target.TargetCard; @@ -52,7 +50,7 @@ import mage.target.TargetPlayer; public class LostHours extends CardImpl { public LostHours(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{1}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{B}"); // Target player reveals their hand. You choose a nonland card from it. That player puts that card into their library third from the top. this.getSpellAbility().addEffect(new LostHoursEffect()); @@ -71,17 +69,11 @@ public class LostHours extends CardImpl { class LostHoursEffect extends OneShotEffect { - private static final FilterCard filter = new FilterCard("nonland card"); - - static { - filter.add(Predicates.not(new CardTypePredicate(CardType.LAND))); - } - public LostHoursEffect() { super(Outcome.Discard); - this.staticText = "Target player reveals their hand. You choose a nonland card from it. That player puts that card into their library third from the top."; + this.staticText = "Target player reveals their hand. You choose a nonland card from it. That player puts that card into their library third from the top"; } - + public LostHoursEffect(final LostHoursEffect effect) { super(effect); } @@ -90,38 +82,19 @@ class LostHoursEffect extends OneShotEffect { public LostHoursEffect copy() { return new LostHoursEffect(this); } - + @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(targetPointer.getFirst(game, source)); + Player targetPlayer = game.getPlayer(targetPointer.getFirst(game, source)); Player controller = game.getPlayer(source.getControllerId()); - if (player != null && controller != null) { - player.revealCards("Lost Hours", player.getHand(), game); - - if (player.getHand().size() > 0) { - TargetCard target = new TargetCard(Zone.HAND, new FilterCard(filter)); - if (controller.choose(Outcome.Discard, player.getHand(), target, game)) { + if (targetPlayer != null && controller != null) { + targetPlayer.revealCards(source, targetPlayer.getHand(), game); + if (targetPlayer.getHand().size() > 0) { + TargetCard target = new TargetCard(Zone.HAND, new FilterCard(StaticFilters.FILTER_CARD_A_NON_LAND)); + if (controller.choose(Outcome.Discard, targetPlayer.getHand(), target, game)) { Card card = game.getCard(target.getFirstTarget()); if (card != null) { - // Move card to third position - CardsImpl cards = new CardsImpl(); - cards.add(card); - Card cardTop = null; - Card cardSecond = null; - if (player.getLibrary().hasCards()) { - cardTop = player.getLibrary().removeFromTop(game); - } - if (player.getLibrary().hasCards()) { - cardSecond = player.getLibrary().removeFromTop(game); - } - player.putCardsOnTopOfLibrary(cards, game, source, true); - if (cardSecond != null) { - player.getLibrary().putOnTop(cardSecond, game); - } - if (cardTop != null) { - player.getLibrary().putOnTop(cardTop, game); - } - game.informPlayers(card.getLogName() + " is put into " + player.getLogName() +"'s library " + (cardTop != null ? (cardSecond != null ? "third" : "second") : "first") + " from the top"); + targetPlayer.putCardOnTopXOfLibrary(card, game, source, 3); } } } @@ -129,5 +102,5 @@ class LostHoursEffect extends OneShotEffect { } return false; } - + } diff --git a/Mage.Sets/src/mage/cards/m/MadcapExperiment.java b/Mage.Sets/src/mage/cards/m/MadcapExperiment.java index 7d5acba730b..049759a9b79 100644 --- a/Mage.Sets/src/mage/cards/m/MadcapExperiment.java +++ b/Mage.Sets/src/mage/cards/m/MadcapExperiment.java @@ -28,7 +28,6 @@ package mage.cards.m; import java.util.UUID; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; @@ -39,7 +38,6 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; import mage.game.Game; -import mage.players.Library; import mage.players.Player; /** @@ -84,31 +82,25 @@ class MadcapExperimentEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = game.getObject(source.getSourceId()); - if (controller != null && controller.getLibrary().hasCards()) { - CardsImpl cards = new CardsImpl(); - Library library = controller.getLibrary(); - Card card = null; - do { - card = library.removeFromTop(game); - if (card != null) { - cards.add(card); + if (controller != null) { + CardsImpl toReveal = new CardsImpl(); + Card toBattlefield = null; + for (Card card : controller.getLibrary().getCards(game)) { + toReveal.add(card); + game.fireUpdatePlayersEvent(); + if (card.isArtifact()) { + toBattlefield = card; + + break; } - } while (library.hasCards() && card != null && !card.isArtifact()); - // reveal cards - if (!cards.isEmpty()) { - controller.revealCards(sourceObject.getIdName(), cards, game); } - int revealed = cards.size(); - if (card != null && card.isArtifact()) { - // put artifact card to battlefield - controller.moveCards(card, Zone.BATTLEFIELD, source, game); - // remove it from revealed card list - cards.remove(card); - } - // Put the rest on the bottom of your library in a random order - controller.putCardsOnBottomOfLibrary(cards, game, source, false); - controller.damage(revealed, source.getSourceId(), game, false, true); + controller.revealCards(source, toReveal, game); + controller.moveCards(toBattlefield, Zone.BATTLEFIELD, source, game); + int damage = toReveal.size(); + toReveal.remove(toBattlefield); + controller.putCardsOnBottomOfLibrary(toReveal, game, source, false); + controller.damage(damage, source.getSourceId(), game, false, true); + return true; } return false; diff --git a/Mage.Sets/src/mage/cards/m/MassPolymorph.java b/Mage.Sets/src/mage/cards/m/MassPolymorph.java index cea4e1819f6..5b160012e05 100644 --- a/Mage.Sets/src/mage/cards/m/MassPolymorph.java +++ b/Mage.Sets/src/mage/cards/m/MassPolymorph.java @@ -29,10 +29,8 @@ package mage.cards.m; import java.util.HashSet; import java.util.LinkedHashSet; -import java.util.List; import java.util.Set; import java.util.UUID; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; @@ -45,7 +43,6 @@ import mage.constants.Outcome; import mage.constants.Zone; import mage.filter.StaticFilters; import mage.game.Game; -import mage.game.permanent.Permanent; import mage.players.Player; /** @@ -86,31 +83,25 @@ class MassPolymorphEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = source.getSourceObject(game); - if (controller != null && sourceObject != null) { - int count; + if (controller != null) { // Cards creatures = new CardsImpl(); - List creatures = game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURE, source.getControllerId(), game); - Set creaturesToExile = new HashSet<>(); - creaturesToExile.addAll(creatures); - count = creatures.size(); + Set creaturesToExile = new HashSet<>(game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURE, source.getControllerId(), game)); + int count = creaturesToExile.size(); controller.moveCards(creaturesToExile, Zone.EXILED, source, game); Cards revealed = new CardsImpl(); Set creatureCards = new LinkedHashSet<>(); - Cards nonCreatureCards = new CardsImpl(); - while (creatureCards.size() < count && controller.getLibrary().hasCards()) { - Card card = controller.getLibrary().removeFromTop(game); + for (Card card : controller.getLibrary().getCards(game)) { revealed.add(card); if (card.isCreature()) { creatureCards.add(card); - } else { - nonCreatureCards.add(card); + if (creatureCards.size() == count) { + break; + } } } - controller.revealCards(sourceObject.getIdName(), revealed, game); + controller.revealCards(source, revealed, game); controller.moveCards(creatureCards, Zone.BATTLEFIELD, source, game, false, false, true, null); - controller.putCardsOnTopOfLibrary(nonCreatureCards, game, source, false); controller.shuffleLibrary(source, game); return true; } diff --git a/Mage.Sets/src/mage/cards/m/MindFuneral.java b/Mage.Sets/src/mage/cards/m/MindFuneral.java index c43a3c1119d..ce58aaa1d8b 100644 --- a/Mage.Sets/src/mage/cards/m/MindFuneral.java +++ b/Mage.Sets/src/mage/cards/m/MindFuneral.java @@ -49,15 +49,12 @@ import mage.target.common.TargetOpponent; public class MindFuneral extends CardImpl { public MindFuneral(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{1}{U}{B}"); - - - + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{U}{B}"); // Target opponent reveals cards from the top of their library until four land cards are revealed. That player puts all cards revealed this way into their graveyard. this.getSpellAbility().addEffect(new MindFuneralEffect()); this.getSpellAbility().addTarget(new TargetOpponent()); - + } public MindFuneral(final MindFuneral card) { @@ -92,17 +89,13 @@ class MindFuneralEffect extends OneShotEffect { if (opponent != null) { Cards cards = new CardsImpl(); int landsFound = 0; - while (landsFound < 4 && opponent.getLibrary().hasCards()) { - Card card = opponent.getLibrary().removeFromTop(game); - if (card == null) { + for (Card card : opponent.getLibrary().getCards(game)) { + cards.add(card); + if (card.isLand() && ++landsFound == 4) { break; } - if (card.isLand()) { - landsFound++; - } - cards.add(card); } - opponent.revealCards("Mind Funeral", cards, game); + opponent.revealCards(source, cards, game); opponent.moveCards(cards, Zone.GRAVEYARD, source, game); return true; } diff --git a/Mage.Sets/src/mage/cards/m/MindGrind.java b/Mage.Sets/src/mage/cards/m/MindGrind.java index afbe5b7ec0a..e72d436e20b 100644 --- a/Mage.Sets/src/mage/cards/m/MindGrind.java +++ b/Mage.Sets/src/mage/cards/m/MindGrind.java @@ -50,18 +50,17 @@ import mage.players.Player; public class MindGrind extends CardImpl { public MindGrind(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{U}{B}"); - + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{U}{B}"); // Each opponent reveals cards from the top of their library until he or she reveals X land cards, then puts all cards revealed this way into their graveyard. X can't be 0. this.getSpellAbility().addEffect(new MindGrindEffect()); - for (VariableCost cost: this.getSpellAbility().getManaCosts().getVariableCosts()) { + for (VariableCost cost : this.getSpellAbility().getManaCosts().getVariableCosts()) { if (cost instanceof VariableManaCost) { ((VariableManaCost) cost).setMinX(1); break; - } } } + } public MindGrind(final MindGrind card) { super(card); @@ -92,8 +91,7 @@ class MindGrindEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { int xValue = source.getManaCostsToPay().getX(); - Card sourceCard = game.getCard(source.getSourceId()); - if (xValue < 1 || sourceCard == null) { + if (xValue < 1) { return false; } for (UUID opponentId : game.getOpponents(source.getControllerId())) { @@ -103,19 +101,13 @@ class MindGrindEffect extends OneShotEffect { } int landsToReveal = xValue; Cards cards = new CardsImpl(); - while(player.getLibrary().hasCards()){ - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - if(card.isLand()){ - --landsToReveal; - if (landsToReveal < 1) { - break; - } - } + for (Card card : player.getLibrary().getCards(game)) { + cards.add(card); + if (card.isLand() && --landsToReveal == 0) { + break; } } - player.revealCards("by " + sourceCard.getName() + " from " + player.getName(), cards, game); + player.revealCards(source, "from " + player.getName(), cards, game); player.moveCards(cards, Zone.GRAVEYARD, source, game); } return true; diff --git a/Mage.Sets/src/mage/cards/m/MindsDesire.java b/Mage.Sets/src/mage/cards/m/MindsDesire.java index 1a239f6538f..e6a209d4f7b 100644 --- a/Mage.Sets/src/mage/cards/m/MindsDesire.java +++ b/Mage.Sets/src/mage/cards/m/MindsDesire.java @@ -28,7 +28,6 @@ package mage.cards.m; import java.util.UUID; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.AsThoughEffectImpl; import mage.abilities.effects.ContinuousEffect; @@ -41,10 +40,10 @@ import mage.constants.AsThoughEffectType; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; -import mage.constants.Zone; import mage.game.Game; import mage.players.Player; -import mage.target.targetpointer.FixedTarget; +import mage.target.targetpointer.FixedTargets; +import mage.util.CardUtil; /** * @@ -91,17 +90,15 @@ class MindsDesireEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = source.getSourceObject(game); - if (controller != null && sourceObject != null) { + if (controller != null) { controller.shuffleLibrary(source, game); - if (controller.getLibrary().hasCards()) { - Card card = controller.getLibrary().removeFromTop(game); - if (card != null) { - controller.moveCardToExileWithInfo(card, source.getSourceId(), sourceObject.getIdName(), source.getSourceId(), game, Zone.LIBRARY, true); - ContinuousEffect effect = new MindsDesireCastFromExileEffect(); - effect.setTargetPointer(new FixedTarget(card.getId())); - game.addEffect(effect, source); - } + Card card = controller.getLibrary().getFromTop(game); + if (card != null) { + UUID exileId = UUID.randomUUID(); + controller.moveCardsToExile(card, source, game, true, exileId, CardUtil.createObjectRealtedWindowTitle(source, game, null)); + ContinuousEffect effect = new MindsDesireCastFromExileEffect(); + effect.setTargetPointer(new FixedTargets(game.getExile().getExileZone(exileId).getCards(game), game)); + game.addEffect(effect, source); } return true; } @@ -132,19 +129,15 @@ class MindsDesireCastFromExileEffect extends AsThoughEffectImpl { @Override public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { - if (objectId != null && objectId.equals(getTargetPointer().getFirst(game, source))) { - if (affectedControllerId.equals(source.getControllerId())) { - Card card = game.getCard(objectId); - if (card != null && game.getState().getZone(objectId) == Zone.EXILED) { - if (!card.isLand() && card.getSpellAbility().getCosts() != null) { - Player player = game.getPlayer(affectedControllerId); - if (player != null) { - player.setCastSourceIdWithAlternateMana(objectId, null, card.getSpellAbility().getCosts()); - } - } - return true; + if (affectedControllerId.equals(source.getControllerId()) && getTargetPointer().getTargets(game, source).contains(objectId)) { + Card card = game.getCard(objectId); + if (card != null && !card.isLand() && card.getSpellAbility().getCosts() != null) { + Player player = game.getPlayer(affectedControllerId); + if (player != null) { + player.setCastSourceIdWithAlternateMana(objectId, null, card.getSpellAbility().getCosts()); } } + return true; } return false; } diff --git a/Mage.Sets/src/mage/cards/m/Mindshrieker.java b/Mage.Sets/src/mage/cards/m/Mindshrieker.java index 05a7fe31e0b..f07786d3b5b 100644 --- a/Mage.Sets/src/mage/cards/m/Mindshrieker.java +++ b/Mage.Sets/src/mage/cards/m/Mindshrieker.java @@ -39,9 +39,9 @@ import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.Zone; import mage.game.Game; import mage.players.Player; @@ -54,7 +54,7 @@ import mage.target.TargetPlayer; public class Mindshrieker extends CardImpl { public Mindshrieker(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}"); this.subtype.add(SubType.SPIRIT); this.subtype.add(SubType.BIRD); @@ -95,7 +95,7 @@ class MindshriekerEffect extends OneShotEffect { Player targetPlayer = game.getPlayer(source.getFirstTarget()); if (targetPlayer != null) { if (targetPlayer.getLibrary().hasCards()) { - Card card = targetPlayer.getLibrary().removeFromTop(game); + Card card = targetPlayer.getLibrary().getFromTop(game); if (card != null) { targetPlayer.moveCards(card, Zone.GRAVEYARD, source, game); int amount = card.getConvertedManaCost(); @@ -114,4 +114,4 @@ class MindshriekerEffect extends OneShotEffect { return new MindshriekerEffect(this); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/m/MirkoVoskMindDrinker.java b/Mage.Sets/src/mage/cards/m/MirkoVoskMindDrinker.java index 0ada7b25cc8..107202de6df 100644 --- a/Mage.Sets/src/mage/cards/m/MirkoVoskMindDrinker.java +++ b/Mage.Sets/src/mage/cards/m/MirkoVoskMindDrinker.java @@ -25,20 +25,18 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.cards.m; import java.util.UUID; import mage.MageInt; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.*; 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.game.Game; @@ -48,16 +46,13 @@ import mage.players.Player; * * @author LevelX2 */ - - public class MirkoVoskMindDrinker extends CardImpl { - public MirkoVoskMindDrinker (UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{U}{B}"); + public MirkoVoskMindDrinker(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}{B}"); this.subtype.add(SubType.VAMPIRE); addSuperType(SuperType.LEGENDARY); - this.power = new MageInt(2); this.toughness = new MageInt(4); @@ -67,7 +62,7 @@ public class MirkoVoskMindDrinker extends CardImpl { this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new MirkoVoskMindDrinkerEffect(), false, true)); } - public MirkoVoskMindDrinker (final MirkoVoskMindDrinker card) { + public MirkoVoskMindDrinker(final MirkoVoskMindDrinker card) { super(card); } @@ -97,25 +92,20 @@ class MirkoVoskMindDrinkerEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(getTargetPointer().getFirst(game, source)); - MageObject sourceObject = source.getSourceObject(game); - if (player == null || sourceObject == null) { + if (player == null) { return false; } int landsToReveal = 4; Cards cards = new CardsImpl(); - while(player.getLibrary().hasCards()){ - Card card = player.getLibrary().removeFromTop(game); + for (Card card : player.getLibrary().getCards(game)) { if (card != null) { cards.add(card); - if(card.isLand()){ - --landsToReveal; - if (landsToReveal < 1) { - break; - } + if (card.isLand() && --landsToReveal < 1) { + break; } } } - player.revealCards("by " + sourceObject.getName() + " from " + player.getName(), cards, game); + player.revealCards(source, "from " + player.getName(), cards, game); player.moveCards(cards, Zone.GRAVEYARD, source, game); return true; } diff --git a/Mage.Sets/src/mage/cards/m/MirrorMadPhantasm.java b/Mage.Sets/src/mage/cards/m/MirrorMadPhantasm.java index 8322d2d9992..f2f478fd50b 100644 --- a/Mage.Sets/src/mage/cards/m/MirrorMadPhantasm.java +++ b/Mage.Sets/src/mage/cards/m/MirrorMadPhantasm.java @@ -89,32 +89,34 @@ class MirrorMadPhantasmEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Permanent perm = game.getPermanent(source.getSourceId()); + Permanent perm = source.getSourcePermanentIfItStillExists(game); if (perm != null) { - Player player = game.getPlayer(perm.getOwnerId()); - if (player != null) { + Player owner = game.getPlayer(perm.getOwnerId()); + if (owner == null) { + return false; + } + if (owner.moveCards(perm, Zone.LIBRARY, source, game)) { + owner.shuffleLibrary(source, game); perm.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); - player.shuffleLibrary(source, game); + owner.shuffleLibrary(source, game); Cards cards = new CardsImpl(); - while (player.getLibrary().hasCards()) { - Card card = player.getLibrary().removeFromTop(game); - if (card == null) { - break; - } - if (card.getName().equals("Mirror-Mad Phantasm")) { - player.moveCards(card, Zone.BATTLEFIELD, source, game); - break; - } + Card phantasmCard = null; + for (Card card : owner.getLibrary().getCards(game)) { cards.add(card); + if (card.getName().equals("Mirror-Mad Phantasm")) { + phantasmCard = card; + break; + } } - if (!cards.isEmpty()) { - player.revealCards("Mirror-Mad Phantasm", cards, game); - player.moveCards(cards, Zone.GRAVEYARD, source, game); + owner.revealCards(source, cards, game); + if (phantasmCard != null) { + owner.moveCards(phantasmCard, Zone.BATTLEFIELD, source, game); + cards.remove(phantasmCard); } - return true; + owner.moveCards(cards, Zone.GRAVEYARD, source, game); } } - return false; + return true; } @Override diff --git a/Mage.Sets/src/mage/cards/m/MuzzioVisionaryArchitect.java b/Mage.Sets/src/mage/cards/m/MuzzioVisionaryArchitect.java index 14539941a3e..89e91c106d6 100644 --- a/Mage.Sets/src/mage/cards/m/MuzzioVisionaryArchitect.java +++ b/Mage.Sets/src/mage/cards/m/MuzzioVisionaryArchitect.java @@ -37,8 +37,8 @@ import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.OneShotEffect; import mage.cards.*; 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.common.FilterArtifactCard; @@ -55,7 +55,7 @@ import mage.target.TargetCard; public class MuzzioVisionaryArchitect extends CardImpl { public MuzzioVisionaryArchitect(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{U}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}{U}"); addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.ARTIFICER); @@ -97,8 +97,7 @@ class MuzzioVisionaryArchitectEffect extends OneShotEffect { @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 == null) { return false; } @@ -113,28 +112,19 @@ class MuzzioVisionaryArchitectEffect extends OneShotEffect { } } - Cards cards = new CardsImpl(); - - for (int i = 0; i < highCMC; i++) { - Card card = controller.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - } - } - controller.lookAtCards(sourcePermanent.getIdName(), cards, game); - + Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, highCMC)); + controller.lookAtCards(source, null, cards, game); if (!cards.isEmpty()) { TargetCard target = new TargetCard(Zone.LIBRARY, new FilterArtifactCard("artifact card to put onto the battlefield")); if (target.canChoose(source.getSourceId(), controller.getId(), game) && controller.choose(Outcome.Benefit, cards, target, game)) { Card card = cards.get(target.getFirstTarget(), game); if (card != null) { - controller.revealCards(sourcePermanent.getIdName(), new CardsImpl(card), game); + controller.revealCards(source, new CardsImpl(card), game); cards.remove(card); controller.moveCards(card, Zone.BATTLEFIELD, source, game); } } } - controller.putCardsOnBottomOfLibrary(cards, game, source, true); return true; } diff --git a/Mage.Sets/src/mage/cards/n/NaturalSelection.java b/Mage.Sets/src/mage/cards/n/NaturalSelection.java index 604130d7d40..6235b9a7ef7 100644 --- a/Mage.Sets/src/mage/cards/n/NaturalSelection.java +++ b/Mage.Sets/src/mage/cards/n/NaturalSelection.java @@ -30,30 +30,25 @@ package mage.cards.n; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.cards.Cards; import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Outcome; -import mage.constants.Zone; -import mage.filter.FilterCard; import mage.game.Game; import mage.players.Player; -import mage.target.TargetCard; import mage.target.TargetPlayer; /** * * @author KholdFuzion - + * */ public class NaturalSelection extends CardImpl { public NaturalSelection(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{G}"); - + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{G}"); // Look at the top three cards of target player's library, then put them back in any order. You may have that player shuffle their library. this.getSpellAbility().addEffect(new NaturalSelectionEffect()); @@ -70,57 +65,35 @@ public class NaturalSelection extends CardImpl { } } -class NaturalSelectionEffect extends OneShotEffect { +class NaturalSelectionEffect extends OneShotEffect { - public NaturalSelectionEffect() { + public NaturalSelectionEffect() { super(Outcome.DrawCard); this.staticText = "look at the top three cards of target player's library, then put them back in any order. You may have that player shuffle their library."; } - public NaturalSelectionEffect(final NaturalSelectionEffect effect) { + public NaturalSelectionEffect(final NaturalSelectionEffect effect) { super(effect); } @Override - public NaturalSelectionEffect copy() { - return new NaturalSelectionEffect(this); + public NaturalSelectionEffect copy() { + return new NaturalSelectionEffect(this); } @Override public boolean apply(Game game, Ability source) { - Player you = game.getPlayer(source.getControllerId()); - Player player = game.getPlayer(source.getFirstTarget()); - if (player == null || you == null) { + Player controller = game.getPlayer(source.getControllerId()); + Player targetPlayer = game.getPlayer(source.getFirstTarget()); + if (targetPlayer == null || controller == null) { return false; } - Cards cards = new CardsImpl(); - int count = Math.min(player.getLibrary().size(), 3); - for (int i = 0; i < count; i++) { - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - } - } - - you.lookAtCards("Natural Selection", cards, game); - - TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCard("card to put on the top of target player's library")); - while (player.canRespond() && cards.size() > 1) { - you.choose(Outcome.Neutral, cards, target, game); - Card card = cards.get(target.getFirstTarget(), game); - if (card != null) { - cards.remove(card); - card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); - } - target.clearChosen(); - } - if (cards.size() == 1) { - Card card = cards.get(cards.iterator().next(), game); - card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); - } - if (you.chooseUse(Outcome.Neutral, "You may have that player shuffle their library", source, game)){ - player.shuffleLibrary(source, game); + Cards cards = new CardsImpl(targetPlayer.getLibrary().getTopCards(game, 3)); + controller.lookAtCards(source, null, cards, game); + controller.putCardsOnTopOfLibrary(cards, game, source, true); + if (controller.chooseUse(Outcome.Neutral, "You may have that player shuffle their library", source, game)) { + targetPlayer.shuffleLibrary(source, game); } return true; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/n/Necropotence.java b/Mage.Sets/src/mage/cards/n/Necropotence.java index 180b17fce08..c5df8339320 100644 --- a/Mage.Sets/src/mage/cards/n/Necropotence.java +++ b/Mage.Sets/src/mage/cards/n/Necropotence.java @@ -51,6 +51,7 @@ import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; import mage.players.Player; import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; /** * @@ -59,7 +60,7 @@ import mage.target.targetpointer.FixedTarget; public class Necropotence extends CardImpl { public Necropotence(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{B}{B}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{B}{B}{B}"); // Skip your draw step. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SkipDrawStepEffect())); @@ -137,17 +138,16 @@ class NecropotenceEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - if (controller.getLibrary().hasCards()) { - Card card = controller.getLibrary().removeFromTop(game); - if (controller.moveCardToExileWithInfo(card, null, "", source.getSourceId(), game, Zone.LIBRARY, false)) { - card.setFaceDown(true, game); - Effect returnToHandEffect = new ReturnToHandTargetEffect(); - returnToHandEffect.setText("put that face down card into your hand"); - returnToHandEffect.setTargetPointer(new FixedTarget(card.getId(), card.getZoneChangeCounter(game))); - game.addDelayedTriggeredAbility(new AtTheBeginOfNextEndStepDelayedTriggeredAbility(returnToHandEffect, TargetController.YOU), source); - return true; - } - return false; + Card card = controller.getLibrary().getFromTop(game); + if (card != null && controller.moveCardsToExile(card, source, game, false, + CardUtil.getCardExileZoneId(game, source), + CardUtil.createObjectRealtedWindowTitle(source, game, null))) { + card.setFaceDown(true, game); + Effect returnToHandEffect = new ReturnToHandTargetEffect(); + returnToHandEffect.setText("put that face down card into your hand"); + returnToHandEffect.setTargetPointer(new FixedTarget(card.getId(), card.getZoneChangeCounter(game))); + game.addDelayedTriggeredAbility(new AtTheBeginOfNextEndStepDelayedTriggeredAbility(returnToHandEffect, TargetController.YOU), source); + return true; } return true; } diff --git a/Mage.Sets/src/mage/cards/n/NicolBolasGodPharaoh.java b/Mage.Sets/src/mage/cards/n/NicolBolasGodPharaoh.java index 4d0412b7b61..5bd3a375aab 100644 --- a/Mage.Sets/src/mage/cards/n/NicolBolasGodPharaoh.java +++ b/Mage.Sets/src/mage/cards/n/NicolBolasGodPharaoh.java @@ -27,7 +27,9 @@ */ package mage.cards.n; -import mage.MageObject; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; @@ -46,15 +48,11 @@ import mage.game.Game; import mage.players.Library; import mage.players.Player; import mage.target.Target; -import mage.target.common.TargetCardInHand; import mage.target.common.TargetAnyTarget; +import mage.target.common.TargetCardInHand; import mage.target.common.TargetOpponent; import mage.target.targetpointer.FixedTarget; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - /** * * @author Will @@ -172,22 +170,21 @@ class NicolBolasGodPharaohPlusTwoEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player opponent = game.getPlayer(targetPointer.getFirst(game, source)); - MageObject sourceObject = source.getSourceObject(game); - if (opponent != null && opponent.getLibrary().hasCards() && sourceObject != null) { + if (opponent != null) { Library library = opponent.getLibrary(); Card card; do { - card = library.removeFromTop(game); + card = library.getFromTop(game); if (card != null) { opponent.moveCards(card, Zone.EXILED, source, game); + if (!card.isLand()) { + ContinuousEffect effect = new NicolBolasGodPharaohFromExileEffect(); + effect.setTargetPointer(new FixedTarget(card.getId(), game.getState().getZoneChangeCounter(card.getId()))); + game.addEffect(effect, source); + break; + } } - } while (library.hasCards() && card != null && card.isLand()); - - if (card != null) { - ContinuousEffect effect = new NicolBolasGodPharaohFromExileEffect(); - effect.setTargetPointer(new FixedTarget(card.getId(), card.getZoneChangeCounter(game))); - game.addEffect(effect, source); - } + } while (library.hasCards() && card != null); return true; } return false; diff --git a/Mage.Sets/src/mage/cards/n/NightveilSpecter.java b/Mage.Sets/src/mage/cards/n/NightveilSpecter.java index 8d31e951361..42061a3773d 100644 --- a/Mage.Sets/src/mage/cards/n/NightveilSpecter.java +++ b/Mage.Sets/src/mage/cards/n/NightveilSpecter.java @@ -29,7 +29,6 @@ package mage.cards.n; import java.util.UUID; import mage.MageInt; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; @@ -108,10 +107,9 @@ class NightveilSpecterExileEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player player = game.getPlayer(targetPointer.getFirst(game, source)); if (player != null) { - Card card = player.getLibrary().removeFromTop(game); - MageObject sourceObject = game.getObject(source.getSourceId()); - if (card != null && sourceObject != null) { - player.moveCardToExileWithInfo(card, CardUtil.getCardExileZoneId(game, source), sourceObject.getIdName(), source.getSourceId(), game, Zone.LIBRARY, true); + Card card = player.getLibrary().getFromTop(game); + if (card != null) { + player.moveCardsToExile(card, source, game, true, CardUtil.getCardExileZoneId(game, source), CardUtil.createObjectRealtedWindowTitle(source, game, null)); return true; } } @@ -147,10 +145,9 @@ class NightveilSpecterEffect extends AsThoughEffectImpl { @Override public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { - Card card = game.getCard(objectId); - if (affectedControllerId.equals(source.getControllerId()) && card != null && game.getState().getZone(card.getId()) == Zone.EXILED) { + if (affectedControllerId.equals(source.getControllerId()) && game.getState().getZone(objectId) == Zone.EXILED) { ExileZone zone = game.getExile().getExileZone(CardUtil.getCardExileZoneId(game, source)); - return zone != null && zone.contains(card.getId()); + return zone != null && zone.contains(objectId); } return false; } diff --git a/Mage.Sets/src/mage/cards/n/NivixAerieOfTheFiremind.java b/Mage.Sets/src/mage/cards/n/NivixAerieOfTheFiremind.java index aba2abe1447..dd0524d304d 100644 --- a/Mage.Sets/src/mage/cards/n/NivixAerieOfTheFiremind.java +++ b/Mage.Sets/src/mage/cards/n/NivixAerieOfTheFiremind.java @@ -48,6 +48,7 @@ import mage.game.Game; import mage.players.Library; import mage.players.Player; import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; /** * @@ -56,11 +57,11 @@ import mage.target.targetpointer.FixedTarget; public class NivixAerieOfTheFiremind extends CardImpl { public NivixAerieOfTheFiremind(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.LAND},""); + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // {tap}: Add {C}. this.addAbility(new ColorlessManaAbility()); - + // {2}{U}{R}, {tap}: Exile the top card of your library. Until your next turn, you may cast that card if it's an instant or sorcery card. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new NivixAerieOfTheFiremindEffect(), new ManaCostsImpl<>("{2}{U}{R}")); ability.addCost(new TapSourceCost()); @@ -78,30 +79,30 @@ public class NivixAerieOfTheFiremind extends CardImpl { } class NivixAerieOfTheFiremindEffect extends OneShotEffect { - + NivixAerieOfTheFiremindEffect() { super(Outcome.Benefit); this.staticText = "Exile the top card of your library. Until your next turn, you may cast that card if it's an instant or sorcery card"; } - + NivixAerieOfTheFiremindEffect(final NivixAerieOfTheFiremindEffect effect) { super(effect); } - + @Override public NivixAerieOfTheFiremindEffect copy() { return new NivixAerieOfTheFiremindEffect(this); } - + @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { Library library = controller.getLibrary(); if (library.hasCards()) { - Card card = library.removeFromTop(game); + Card card = library.getFromTop(game); if (card != null - && controller.moveCardsToExile(card, source, game, true, source.getSourceId(), "Nivix, Aerie of the Firemind") + && controller.moveCardsToExile(card, source, game, true, source.getSourceId(), CardUtil.createObjectRealtedWindowTitle(source, game, null)) && (card.isInstant() || card.isSorcery())) { ContinuousEffect effect = new NivixAerieOfTheFiremindCanCastEffect(); effect.setTargetPointer(new FixedTarget(card.getId())); @@ -136,10 +137,8 @@ class NivixAerieOfTheFiremindCanCastEffect extends AsThoughEffectImpl { } @Override - public boolean applies(UUID sourceId, Ability source, UUID affectedControllerId, Game game) { - return this.getTargetPointer().getFirst(game, source) != null - && this.getTargetPointer().getFirst(game, source).equals(sourceId) - && source.getControllerId().equals(affectedControllerId) - && game.getState().getZone(sourceId) == Zone.EXILED; + public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { + return source.getControllerId().equals(affectedControllerId) + && objectId.equals(this.getTargetPointer().getFirst(game, source)); } } diff --git a/Mage.Sets/src/mage/cards/o/OmenMachine.java b/Mage.Sets/src/mage/cards/o/OmenMachine.java index 3d16258df18..c8928fce4a7 100644 --- a/Mage.Sets/src/mage/cards/o/OmenMachine.java +++ b/Mage.Sets/src/mage/cards/o/OmenMachine.java @@ -120,9 +120,9 @@ class OmenMachineEffect2 extends OneShotEffect { public boolean apply(Game game, Ability source) { Player player = game.getPlayer(targetPointer.getFirst(game, source)); if (player != null) { - Card card = player.getLibrary().removeFromTop(game); + Card card = player.getLibrary().getFromTop(game); if (card != null) { - player.moveCardToExileWithInfo(card, null, "", source.getSourceId(), game, Zone.LIBRARY, true); + player.moveCards(card, Zone.EXILED, source, game); if (card.isLand()) { player.moveCards(card, Zone.BATTLEFIELD, source, game); } else { diff --git a/Mage.Sets/src/mage/cards/o/OraclesVault.java b/Mage.Sets/src/mage/cards/o/OraclesVault.java index a3a9dc00668..10d66e9a517 100644 --- a/Mage.Sets/src/mage/cards/o/OraclesVault.java +++ b/Mage.Sets/src/mage/cards/o/OraclesVault.java @@ -52,6 +52,7 @@ import mage.counters.CounterType; import mage.game.Game; import mage.players.Library; import mage.players.Player; +import mage.util.CardUtil; /** * @@ -77,7 +78,7 @@ public class OraclesVault extends CardImpl { this.addAbility(new ConditionalActivatedAbility(Zone.BATTLEFIELD, new OraclesVaultFreeEffect(), new TapSourceCost(), new SourceHasCounterCondition(CounterType.BRICK, 3, Integer.MAX_VALUE), "{T}: Exile the top card of your library. Until end of turn, you may play that card without paying its mana cost. " - + "Activate this ability only if there are three or more brick counters on {this}")); + + "Activate this ability only if there are three or more brick counters on {this}")); } public OraclesVault(final OraclesVault card) { @@ -108,12 +109,11 @@ class OraclesVaultEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = source.getSourceObject(game); - if (controller != null && sourceObject != null && controller.getLibrary().hasCards()) { - Library library = controller.getLibrary(); - Card card = library.removeFromTop(game); + if (controller != null) { + Card card = controller.getLibrary().getFromTop(game); if (card != null) { - controller.moveCardToExileWithInfo(card, source.getSourceId(), sourceObject.getIdName() + " ", source.getSourceId(), game, Zone.LIBRARY, true); + controller.moveCardsToExile(card, source, game, true, source.getSourceId(), + CardUtil.createObjectRealtedWindowTitle(source, game, "")); game.addEffect(new OraclesVaultPlayEffect(new MageObjectReference(card, game)), source); } return true; @@ -121,6 +121,7 @@ class OraclesVaultEffect extends OneShotEffect { return false; } } + class OraclesVaultFreeEffect extends OneShotEffect { public OraclesVaultFreeEffect() { @@ -142,9 +143,10 @@ class OraclesVaultFreeEffect extends OneShotEffect { MageObject sourceObject = source.getSourceObject(game); if (controller != null && sourceObject != null && controller.getLibrary().hasCards()) { Library library = controller.getLibrary(); - Card card = library.removeFromTop(game); + Card card = library.getFromTop(game); if (card != null) { - controller.moveCardToExileWithInfo(card, source.getSourceId(), sourceObject.getIdName() + " ", source.getSourceId(), game, Zone.LIBRARY, true); + controller.moveCardsToExile(card, source, game, true, source.getSourceId(), + CardUtil.createObjectRealtedWindowTitle(source, game, " ")); game.addEffect(new OraclesVaultPlayForFreeEffect(new MageObjectReference(card, game)), source); } return true; @@ -191,6 +193,7 @@ class OraclesVaultPlayEffect extends AsThoughEffectImpl { return false; } } + class OraclesVaultPlayForFreeEffect extends AsThoughEffectImpl { private final MageObjectReference objectReference; @@ -229,4 +232,4 @@ class OraclesVaultPlayForFreeEffect extends AsThoughEffectImpl { } return false; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/o/OrcishLibrarian.java b/Mage.Sets/src/mage/cards/o/OrcishLibrarian.java index e804d80f323..66b17cf1273 100644 --- a/Mage.Sets/src/mage/cards/o/OrcishLibrarian.java +++ b/Mage.Sets/src/mage/cards/o/OrcishLibrarian.java @@ -45,10 +45,8 @@ import mage.constants.ColoredManaSymbol; import mage.constants.Outcome; import mage.constants.SubType; import mage.constants.Zone; -import mage.filter.FilterCard; import mage.game.Game; import mage.players.Player; -import mage.target.TargetCard; /** * @@ -83,7 +81,7 @@ class OrcishLibrarianEffect extends OneShotEffect { public OrcishLibrarianEffect() { super(Outcome.Neutral); - this.staticText = "Look at the top eight cards of your library. Exile four of them at random, then put the rest on top of your library in any order."; + this.staticText = "Look at the top eight cards of your library. Exile four of them at random, then put the rest on top of your library in any order"; } public OrcishLibrarianEffect(final OrcishLibrarianEffect effect) { @@ -100,34 +98,21 @@ class OrcishLibrarianEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); MageObject sourceObject = source.getSourceObject(game); if (controller != null && sourceObject != null) { - Cards cards = new CardsImpl(); - int cardsCount = Math.min(8, controller.getLibrary().size()); - for (int i = 0; i < cardsCount; i++) { - Card card = controller.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - } - } - + Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, 8)); if (!cards.isEmpty()) { + Cards randomExit = new CardsImpl(); for (int i = 0; i < 4; i++) { if (!cards.isEmpty()) { Card card = cards.getRandom(game); - controller.moveCardToExileWithInfo(card, null, null, source.getId(), game, Zone.LIBRARY, true); - cards.remove(card); + if (card != null) { + randomExit.add(card); + cards.remove(card); + } } } - controller.lookAtCards(sourceObject.getIdName(), cards, game); - TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCard("card to put on the top of target player's library")); - while (controller.canRespond() && !cards.isEmpty()) { - controller.choose(Outcome.Neutral, cards, target, game); - Card card = cards.get(target.getFirstTarget(), game); - if (card != null) { - cards.remove(card); - card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); - } - target.clearChosen(); - } + controller.moveCards(randomExit, Zone.EXILED, source, game); + controller.lookAtCards(source, null, cards, game); + controller.putCardsOnTopOfLibrary(cards, game, source, true); } return true; } diff --git a/Mage.Sets/src/mage/cards/o/Oust.java b/Mage.Sets/src/mage/cards/o/Oust.java index 70be68c67a2..31d5190f069 100644 --- a/Mage.Sets/src/mage/cards/o/Oust.java +++ b/Mage.Sets/src/mage/cards/o/Oust.java @@ -30,12 +30,10 @@ package mage.cards.o; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; -import mage.constants.Zone; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; @@ -48,8 +46,7 @@ import mage.target.common.TargetCreaturePermanent; public class Oust extends CardImpl { public Oust(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{W}"); - + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{W}"); // Put target creature into its owner's library second from the top. Its controller gains 3 life. this.getSpellAbility().addEffect(new OustEffect()); @@ -84,27 +81,16 @@ class OustEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(source.getFirstTarget()); + Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); if (permanent != null) { Player owner = game.getPlayer(permanent.getOwnerId()); Player controller = game.getPlayer(permanent.getControllerId()); if (owner == null || controller == null) { return false; } - - Card card = null; - if (owner.getLibrary().hasCards()) { - card = owner.getLibrary().removeFromTop(game); - } - - permanent.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); - if (card != null) { - owner.getLibrary().putOnTop(card, game); - } + owner.getLibrary().putCardToTopXPos(permanent, 2, game); controller.gainLife(3, game, source); - - return true; } - return false; + return true; } } diff --git a/Mage.Sets/src/mage/cards/p/PetraSphinx.java b/Mage.Sets/src/mage/cards/p/PetraSphinx.java index 968a6474129..0ffe6be2ae5 100644 --- a/Mage.Sets/src/mage/cards/p/PetraSphinx.java +++ b/Mage.Sets/src/mage/cards/p/PetraSphinx.java @@ -29,7 +29,6 @@ package mage.cards.p; import java.util.UUID; import mage.MageInt; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; @@ -45,6 +44,7 @@ import mage.constants.Zone; import mage.game.Game; import mage.players.Player; import mage.target.TargetPlayer; +import mage.util.CardUtil; /** * @@ -89,11 +89,9 @@ class PetraSphinxEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - MageObject sourceObject = source.getSourceObject(game); Player controller = game.getPlayer(source.getControllerId()); Player player = game.getPlayer(targetPointer.getFirst(game, source)); - if (controller != null && sourceObject != null && player != null) { - + if (controller != null && player != null) { if (player.getLibrary().hasCards()) { Choice cardChoice = new ChoiceImpl(); cardChoice.setChoices(CardRepository.instance.getNames()); @@ -102,11 +100,11 @@ class PetraSphinxEffect extends OneShotEffect { return false; } String cardName = cardChoice.getChoice(); - game.informPlayers(sourceObject.getLogName() + ", player: " + player.getLogName() + ", named: [" + cardName + ']'); - Card card = player.getLibrary().removeFromTop(game); + game.informPlayers(CardUtil.createObjectRealtedWindowTitle(source, game, null) + ", player: " + player.getLogName() + ", named: [" + cardName + ']'); + Card card = player.getLibrary().getFromTop(game); if (card != null) { Cards cards = new CardsImpl(card); - player.revealCards(sourceObject.getIdName(), cards, game); + player.revealCards(source, cards, game); if (card.getName().equals(cardName)) { player.moveCards(cards, Zone.HAND, source, game); } else { diff --git a/Mage.Sets/src/mage/cards/p/PlungeIntoDarkness.java b/Mage.Sets/src/mage/cards/p/PlungeIntoDarkness.java index 3101982e90f..7ae2b0b39bd 100644 --- a/Mage.Sets/src/mage/cards/p/PlungeIntoDarkness.java +++ b/Mage.Sets/src/mage/cards/p/PlungeIntoDarkness.java @@ -58,10 +58,9 @@ import mage.target.common.TargetControlledCreaturePermanent; public class PlungeIntoDarkness extends CardImpl { public PlungeIntoDarkness(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{1}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{B}"); - - // Choose one - + // Choose one - this.getSpellAbility().getModes().setMinModes(1); this.getSpellAbility().getModes().setMaxModes(1); // Sacrifice any number of creatures, then you gain 3 life for each sacrificed creature; @@ -70,7 +69,7 @@ public class PlungeIntoDarkness extends CardImpl { Mode mode = new Mode(); mode.getEffects().add(new PlungeIntoDarknessSearchEffect()); this.getSpellAbility().getModes().addMode(mode); - + // Entwine {B} this.addAbility(new EntwineAbility("{B}")); } @@ -86,21 +85,21 @@ public class PlungeIntoDarkness extends CardImpl { } class PlungeIntoDarknessLifeEffect extends OneShotEffect { - + PlungeIntoDarknessLifeEffect() { super(Outcome.GainLife); this.staticText = "Sacrifice any number of creatures, then you gain 3 life for each sacrificed creature"; } - + PlungeIntoDarknessLifeEffect(final PlungeIntoDarknessLifeEffect effect) { super(effect); } - + @Override public PlungeIntoDarknessLifeEffect copy() { return new PlungeIntoDarknessLifeEffect(this); } - + @Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); @@ -126,52 +125,40 @@ class PlungeIntoDarknessLifeEffect extends OneShotEffect { } class PlungeIntoDarknessSearchEffect extends OneShotEffect { - + PlungeIntoDarknessSearchEffect() { super(Outcome.Benefit); this.staticText = "pay X life, then look at the top X cards of your library, put one of those cards into your hand, and exile the rest."; } - + PlungeIntoDarknessSearchEffect(final PlungeIntoDarknessSearchEffect effect) { super(effect); } - + @Override public PlungeIntoDarknessSearchEffect copy() { return new PlungeIntoDarknessSearchEffect(this); } - + @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) { VariableCost cost = new PayVariableLifeCost(); int xValue = cost.announceXValue(source, game); cost.getFixedCostsFromAnnouncedValue(xValue).pay(source, game, source.getSourceId(), source.getControllerId(), false, null); - - Cards cards = new CardsImpl(); - int count = Math.min(player.getLibrary().size(), xValue); - for (int i = 0; i < count; i++) { - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - } - } - player.lookAtCards("Plunge into Darkness", cards, game); + Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, xValue)); + controller.lookAtCards(source, null, cards, game); TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCard("card to put into your hand")); - if (player.choose(Outcome.DrawCard, cards, target, game)) { + if (controller.choose(Outcome.DrawCard, cards, target, game)) { Card card = cards.get(target.getFirstTarget(), game); if (card != null) { cards.remove(card); - card.moveToZone(Zone.HAND, source.getSourceId(), game, false); - game.informPlayers("Plunge into Darkness: " + player.getLogName() + " puts a card into their hand"); + controller.moveCards(card, Zone.HAND, source, game); } } - for (UUID cardId : cards) { - Card card = game.getCard(cardId); - card.moveToExile(null, "", source.getSourceId(), game); - } + controller.moveCards(cards, Zone.EXILED, source, game); return true; } return false; diff --git a/Mage.Sets/src/mage/cards/p/Polymorph.java b/Mage.Sets/src/mage/cards/p/Polymorph.java index 64839348b74..a054a54c279 100644 --- a/Mage.Sets/src/mage/cards/p/Polymorph.java +++ b/Mage.Sets/src/mage/cards/p/Polymorph.java @@ -27,7 +27,6 @@ */ package mage.cards.p; -import java.util.Set; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; @@ -53,7 +52,7 @@ import mage.target.common.TargetCreaturePermanent; public class Polymorph extends CardImpl { public Polymorph(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{3}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{U}"); // Destroy target creature. It can't be regenerated. this.getSpellAbility().addTarget(new TargetCreaturePermanent()); @@ -98,22 +97,21 @@ class PolymorphEffect extends OneShotEffect { Library library = player.getLibrary(); if (library.hasCards()) { Cards cards = new CardsImpl(); - Card card = library.removeFromTop(game); - cards.add(card); - while (!card.isCreature() && library.hasCards()) { - card = library.removeFromTop(game); + Card toBattlefield = null; + for (Card card : library.getCards(game)) { cards.add(card); + if (card.isCreature()) { + toBattlefield = card; + break; + } } - - if (card.isCreature()) { - card.putOntoBattlefield(game, Zone.LIBRARY, source.getSourceId(), player.getId()); + if (toBattlefield != null) { + player.moveCards(toBattlefield, Zone.BATTLEFIELD, source, game); } - + player.revealCards(source, cards, game); + cards.remove(toBattlefield); if (!cards.isEmpty()) { - player.revealCards("Polymorph", cards, game); - Set cardsToShuffle = cards.getCards(game); - cardsToShuffle.remove(card); - library.addAll(cardsToShuffle, game); + player.shuffleLibrary(source, game); } } return true; diff --git a/Mage.Sets/src/mage/cards/p/Portent.java b/Mage.Sets/src/mage/cards/p/Portent.java index b935c52e672..9dce1d79a26 100644 --- a/Mage.Sets/src/mage/cards/p/Portent.java +++ b/Mage.Sets/src/mage/cards/p/Portent.java @@ -33,18 +33,14 @@ import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbili import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.cards.Cards; import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Outcome; -import mage.constants.Zone; -import mage.filter.FilterCard; import mage.game.Game; import mage.players.Player; -import mage.target.TargetCard; import mage.target.TargetPlayer; /** @@ -54,7 +50,7 @@ import mage.target.TargetPlayer; public class Portent extends CardImpl { public Portent(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{U}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{U}"); // Look at the top three cards of target player's library, then put them back in any order. You may have that player shuffle their library. this.getSpellAbility().addEffect(new PortentEffect()); @@ -73,57 +69,35 @@ public class Portent extends CardImpl { } } -class PortentEffect extends OneShotEffect { +class PortentEffect extends OneShotEffect { - public PortentEffect() { + public PortentEffect() { super(Outcome.DrawCard); this.staticText = "look at the top three cards of target player's library, then put them back in any order. You may have that player shuffle their library."; } - public PortentEffect(final PortentEffect effect) { + public PortentEffect(final PortentEffect effect) { super(effect); } @Override - public PortentEffect copy() { - return new PortentEffect(this); + public PortentEffect copy() { + return new PortentEffect(this); } @Override public boolean apply(Game game, Ability source) { - Player you = game.getPlayer(source.getControllerId()); - Player player = game.getPlayer(source.getFirstTarget()); - if (player == null || you == null) { + Player controller = game.getPlayer(source.getControllerId()); + Player player = game.getPlayer(getTargetPointer().getFirst(game, source)); + if (player == null || controller == null) { return false; } - Cards cards = new CardsImpl(); - int count = Math.min(player.getLibrary().size(), 3); - for (int i = 0; i < count; i++) { - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - } - } - - you.lookAtCards("Portent", cards, game); - - TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCard("card to put on the top of target player's library")); - while (player.canRespond() && cards.size() > 1) { - you.choose(Outcome.Neutral, cards, target, game); - Card card = cards.get(target.getFirstTarget(), game); - if (card != null) { - cards.remove(card); - card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); - } - target.clearChosen(); - } - if (cards.size() == 1) { - Card card = cards.get(cards.iterator().next(), game); - card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); - } - if (you.chooseUse(Outcome.Neutral, "You may have that player shuffle their library", source, game)){ + Cards cards = new CardsImpl(player.getLibrary().getTopCards(game, 3)); + controller.lookAtCards(source, null, cards, game); + controller.putCardsOnTopOfLibrary(cards, game, source, true); + if (controller.chooseUse(Outcome.Neutral, "You may have that player shuffle their library", source, game)) { player.shuffleLibrary(source, game); } return true; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/p/PrimalSurge.java b/Mage.Sets/src/mage/cards/p/PrimalSurge.java index 713a96de8a2..e34c3424675 100644 --- a/Mage.Sets/src/mage/cards/p/PrimalSurge.java +++ b/Mage.Sets/src/mage/cards/p/PrimalSurge.java @@ -37,7 +37,6 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; import mage.game.Game; -import mage.game.permanent.Permanent; import mage.players.Player; /** @@ -47,8 +46,7 @@ import mage.players.Player; public class PrimalSurge extends CardImpl { public PrimalSurge(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{8}{G}{G}"); - + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{8}{G}{G}"); // Exile the top card of your library. If it's a permanent card, you may put it onto the battlefield. If you do, repeat this process. this.getSpellAbility().addEffect(new PrimalSurgeEffect()); @@ -82,33 +80,24 @@ class PrimalSurgeEffect 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; } boolean repeat; do { repeat = false; - if (player.getLibrary().hasCards()) { - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - card.moveToExile(null, "", source.getSourceId(), game); - if (card.isPermanent() - && player.chooseUse(Outcome.PutCardInPlay, "Put " + card.getName() + " onto the battlefield?", source, game)) { - card.moveToZone(Zone.BATTLEFIELD, source.getSourceId(), game, false); - - Permanent permanent = game.getPermanent(card.getId()); - if (permanent == null) { - permanent = (Permanent) game.getLastKnownInformation(card.getId(), Zone.BATTLEFIELD); - } - if (permanent != null) { - repeat = true; - } - } + Card card = controller.getLibrary().getFromTop(game); + if (card != null) { + controller.moveCards(card, Zone.EXILED, source, game); + if (card.isPermanent() + && controller.chooseUse(Outcome.PutCardInPlay, "Put " + card.getName() + " onto the battlefield?", source, game)) { + controller.moveCards(card, Zone.BATTLEFIELD, source, game); + repeat = true; } } - } while (player.canRespond() && repeat); + } while (controller.canRespond() && repeat); return true; } diff --git a/Mage.Sets/src/mage/cards/p/PropheticFlamespeaker.java b/Mage.Sets/src/mage/cards/p/PropheticFlamespeaker.java index 437e494cebb..9fb7393e04b 100644 --- a/Mage.Sets/src/mage/cards/p/PropheticFlamespeaker.java +++ b/Mage.Sets/src/mage/cards/p/PropheticFlamespeaker.java @@ -41,15 +41,13 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.AsThoughEffectType; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; import mage.constants.Outcome; -import mage.constants.Zone; +import mage.constants.SubType; import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Library; import mage.players.Player; import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; /** * @@ -102,16 +100,15 @@ class PropheticFlamespeakerExileEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); - if (sourcePermanent != null && controller != null && controller.getLibrary().hasCards()) { - Library library = controller.getLibrary(); - Card card = library.removeFromTop(game); + if (controller != null) { + Card card = controller.getLibrary().getFromTop(game); if (card != null) { - String exileName = new StringBuilder(sourcePermanent.getIdName()).append(" ").toString(); - controller.moveCardToExileWithInfo(card, source.getSourceId(), exileName, source.getSourceId(), game, Zone.LIBRARY, true); - ContinuousEffect effect = new PropheticFlamespeakerCastFromExileEffect(); - effect.setTargetPointer(new FixedTarget(card.getId())); - game.addEffect(effect, source); + if (controller.moveCardsToExile(card, source, game, true, source.getSourceId(), + CardUtil.createObjectRealtedWindowTitle(source, game, ""))) { + ContinuousEffect effect = new PropheticFlamespeakerCastFromExileEffect(); + effect.setTargetPointer(new FixedTarget(card.getId())); + game.addEffect(effect, source); + } } return true; } diff --git a/Mage.Sets/src/mage/cards/p/PsychicSurgery.java b/Mage.Sets/src/mage/cards/p/PsychicSurgery.java index a8045272494..e58d46a1bf1 100644 --- a/Mage.Sets/src/mage/cards/p/PsychicSurgery.java +++ b/Mage.Sets/src/mage/cards/p/PsychicSurgery.java @@ -53,9 +53,10 @@ import mage.target.TargetCard; public class PsychicSurgery extends CardImpl { public PsychicSurgery(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{U}"); - + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}"); + // Whenever an opponent shuffles his or her library, you may look at the top two cards of that library. + // You may exile one of those cards. Then put the rest on top of that library in any order. this.addAbility(new PsychicSurgeryTriggeredAbility()); } @@ -100,7 +101,7 @@ class PsychicSurgeryTriggeredAbility extends TriggeredAbilityImpl { @Override public String getRule() { - return "Whenever an opponent shuffles their library, you may look at the top two cards of that library. You may exile one of those cards. Then put the rest on top of that library in any order."; + return "Whenever an opponent shuffles their library, " + super.getRule(); } } @@ -108,7 +109,7 @@ class PsychicSurgeryEffect extends OneShotEffect { public PsychicSurgeryEffect() { super(Outcome.Exile); - this.staticText = "look at the top two cards of that library. You may exile one of those cards. Then put the rest on top of that library in any order"; + this.staticText = "you may look at the top two cards of that library. You may exile one of those cards. Then put the rest on top of that library in any order"; } public PsychicSurgeryEffect(final PsychicSurgeryEffect effect) { @@ -123,31 +124,23 @@ class PsychicSurgeryEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { UUID opponentId = (UUID) this.getValue("PsychicSurgeryOpponent"); - Player player = game.getPlayer(source.getControllerId()); + Player controller = game.getPlayer(source.getControllerId()); Player opponent = game.getPlayer(opponentId); - if (player != null && opponent != null) { - Cards cards = new CardsImpl(); - int count = Math.min(player.getLibrary().size(), 2); - for (int i = 0; i < count; i++) { - Card card = opponent.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - } - } - player.lookAtCards("Psychic Surgery", cards, game); - - if (!cards.isEmpty() && player.chooseUse(Outcome.Exile, "Do you wish to exile a card?", source, game)) { + if (controller != null && opponent != null) { + Cards cards = new CardsImpl(opponent.getLibrary().getTopCards(game, 2)); + controller.lookAtCards(source, null, cards, game); + if (!cards.isEmpty() && controller.chooseUse(Outcome.Exile, "Do you wish to exile a card?", source, game)) { TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCard("card to exile")); - if (player.choose(Outcome.Exile, cards, target, game)) { + if (controller.choose(Outcome.Exile, cards, target, game)) { Card card = cards.get(target.getFirstTarget(), game); if (card != null) { + controller.moveCards(card, Zone.EXILED, source, game); cards.remove(card); - card.moveToZone(Zone.EXILED, source.getSourceId(), game, false); } } } - player.putCardsOnBottomOfLibrary(cards, game, source, true); + controller.putCardsOnBottomOfLibrary(cards, game, source, true); return true; } return false; diff --git a/Mage.Sets/src/mage/cards/q/QuarryColossus.java b/Mage.Sets/src/mage/cards/q/QuarryColossus.java index d2d00304fb9..3f8b2d7d1d0 100644 --- a/Mage.Sets/src/mage/cards/q/QuarryColossus.java +++ b/Mage.Sets/src/mage/cards/q/QuarryColossus.java @@ -27,22 +27,16 @@ */ package mage.cards.q; -import java.util.Deque; -import java.util.LinkedList; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.Cards; -import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SubType; -import mage.constants.Zone; import mage.filter.FilterPermanent; import mage.game.Game; import mage.game.permanent.Permanent; @@ -56,7 +50,7 @@ import mage.target.common.TargetCreaturePermanent; public class QuarryColossus extends CardImpl { public QuarryColossus(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{5}{W}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{W}{W}"); this.subtype.add(SubType.GIANT); this.power = new MageInt(5); @@ -102,27 +96,7 @@ class QuarryColossusReturnLibraryEffect extends OneShotEffect { Player owner = game.getPlayer(permanent.getOwnerId()); if (owner != null) { int plains = game.getBattlefield().countAll(new FilterPermanent(SubType.PLAINS, "Plains you control"), source.getControllerId(), game); - int xValue = Math.min(plains, owner.getLibrary().size()); - Cards cards = new CardsImpl(); - Deque cardIds = new LinkedList<>(); - for (int i = 0; i < xValue; i++) { - Card card = owner.getLibrary().removeFromTop(game); - cards.add(card); - cardIds.push(card.getId()); - } - // return cards back to library - permanent.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); - game.informPlayers(new StringBuilder(controller.getLogName()) - .append(" puts ").append(permanent.getName()) - .append(" beneath the top ").append(xValue) - .append(" cards of ").append(owner.getLogName()).append("'s library").toString()); - while(!cardIds.isEmpty()) { - UUID cardId = cardIds.poll(); - Card card = cards.get(cardId, game); - if (card != null) { - card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); - } - } + controller.putCardOnTopXOfLibrary(permanent, game, source, plains); return true; } } diff --git a/Mage.Sets/src/mage/cards/r/RavenFamiliar.java b/Mage.Sets/src/mage/cards/r/RavenFamiliar.java index 6a3092707e0..e1cd6777f76 100644 --- a/Mage.Sets/src/mage/cards/r/RavenFamiliar.java +++ b/Mage.Sets/src/mage/cards/r/RavenFamiliar.java @@ -29,22 +29,16 @@ package mage.cards.r; import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.dynamicvalue.common.StaticValue; -import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; import mage.abilities.keyword.EchoAbility; import mage.abilities.keyword.FlyingAbility; import mage.cards.*; import mage.constants.CardType; import mage.constants.SubType; -import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.FilterCard; -import mage.game.Game; -import mage.players.Player; -import mage.target.TargetCard; +import mage.filter.StaticFilters; /** * @@ -53,7 +47,7 @@ import mage.target.TargetCard; public class RavenFamiliar extends CardImpl { public RavenFamiliar(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}"); this.subtype.add(SubType.BIRD); this.power = new MageInt(1); @@ -65,7 +59,7 @@ public class RavenFamiliar extends CardImpl { this.addAbility(new EchoAbility("{2}{U}")); // When Raven Familiar enters the battlefield, look at the top three cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order. this.addAbility(new EntersBattlefieldTriggeredAbility( - new LookLibraryAndPickControllerEffect(new StaticValue(3), false, new StaticValue(1), new FilterCard(), Zone.LIBRARY, false, false), + new LookLibraryAndPickControllerEffect(new StaticValue(3), false, new StaticValue(1), StaticFilters.FILTER_CARD, Zone.LIBRARY, false, false), false)); } @@ -77,47 +71,4 @@ public class RavenFamiliar extends CardImpl { public RavenFamiliar copy() { return new RavenFamiliar(this); } - - - static class RavenFamiliarEffect extends OneShotEffect { - - public RavenFamiliarEffect() { - super(Outcome.DrawCard); - this.staticText = "look at the top three cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order"; - } - - public RavenFamiliarEffect(final RavenFamiliarEffect effect) { - super(effect); - } - - @Override - public RavenFamiliarEffect copy() { - return new RavenFamiliarEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - Cards cards = new CardsImpl(); - int count = Math.min(player.getLibrary().size(), 3); - for (int i = 0; i < count; i++) { - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - } - } - player.lookAtCards("Raven Familiar", cards, game); - - TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCard("card to put into your hand")); - if (player.choose(Outcome.DrawCard, cards, target, game)) { - Card card = cards.get(target.getFirstTarget(), game); - if (card != null) { - cards.remove(card); - card.moveToZone(Zone.HAND, source.getSourceId(), game, false); - } - } - player.putCardsOnBottomOfLibrary(cards, game, source, true); - return true; - } - } } diff --git a/Mage.Sets/src/mage/cards/r/Reweave.java b/Mage.Sets/src/mage/cards/r/Reweave.java index 4ae43bb19fe..5e48f513913 100644 --- a/Mage.Sets/src/mage/cards/r/Reweave.java +++ b/Mage.Sets/src/mage/cards/r/Reweave.java @@ -27,6 +27,7 @@ */ package mage.cards.r; +import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; @@ -44,8 +45,6 @@ import mage.players.Player; import mage.target.Target; import mage.target.TargetPermanent; -import java.util.UUID; - /** * * @author LevelX2 @@ -53,7 +52,7 @@ import java.util.UUID; public class Reweave extends CardImpl { public Reweave(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{5}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{5}{U}"); this.subtype.add(SubType.ARCANE); // Target permanent's controller sacrifices it. If he or she does, that player reveals cards from the top of their library until he or she reveals a permanent card that shares a card type with the sacrificed permanent, puts that card onto the battlefield, then shuffles their library. @@ -104,33 +103,24 @@ class ReweaveEffect extends OneShotEffect { Library library = permanentController.getLibrary(); if (library.hasCards()) { Cards cards = new CardsImpl(); - Card card = null; - boolean cardFound = false; - if (library.hasCards()) { - do { - card = library.removeFromTop(game); - cards.add(card); - if (filter.match(card, game)) { - for (CardType cardType : permanent.getCardType()) { - if (card.getCardType().contains(cardType)) { - // a permanent card - cardFound = true; - break; - } + Card permanentCard = null; + for (Card card : permanentController.getLibrary().getCards(game)) { + cards.add(card); + if (card.isPermanent()) { + for (CardType cardType : permanent.getCardType()) { + if (card.getCardType().contains(cardType)) { + permanentCard = card; + break; } } - } while (!cardFound && library.hasCards()); - permanentController.moveCards(card, Zone.BATTLEFIELD, source, game); - } - - if (!cards.isEmpty()) { - permanentController.revealCards(sourceObject.getIdName(), cards, game); - if (cardFound && card != null) { - cards.remove(card); } - library.addAll(cards.getCards(game), game); - permanentController.shuffleLibrary(source, game); } + permanentController.revealCards(source, cards, game); + if (permanentCard != null) { + permanentController.moveCards(permanentCard, Zone.BATTLEFIELD, source, game); + } + permanentController.shuffleLibrary(source, game); + } return true; } diff --git a/Mage.Sets/src/mage/cards/r/RuinRaider.java b/Mage.Sets/src/mage/cards/r/RuinRaider.java index 9b7f7e76075..cd0536b7f8b 100644 --- a/Mage.Sets/src/mage/cards/r/RuinRaider.java +++ b/Mage.Sets/src/mage/cards/r/RuinRaider.java @@ -45,7 +45,6 @@ import mage.constants.Outcome; import mage.constants.TargetController; import mage.constants.Zone; import mage.game.Game; -import mage.game.permanent.Permanent; import mage.players.Player; import mage.watchers.common.PlayerAttackedWatcher; @@ -97,16 +96,14 @@ class RuinRaiderEffect extends OneShotEffect { @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 != null) { if (controller.getLibrary().hasCards()) { - Card card = controller.getLibrary().removeFromTop(game); + Card card = controller.getLibrary().getFromTop(game); if (card != null) { Cards cards = new CardsImpl(card); - controller.revealCards(sourcePermanent.getIdName(), cards, game); + controller.revealCards(source, cards, game); controller.moveCards(card, Zone.HAND, source, game); controller.loseLife(card.getConvertedManaCost(), game, false); - } return true; } diff --git a/Mage.Sets/src/mage/cards/s/SagesOfTheAnima.java b/Mage.Sets/src/mage/cards/s/SagesOfTheAnima.java index 32e5191c0a0..d08292c9a2d 100644 --- a/Mage.Sets/src/mage/cards/s/SagesOfTheAnima.java +++ b/Mage.Sets/src/mage/cards/s/SagesOfTheAnima.java @@ -32,7 +32,6 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ReplacementEffectImpl; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.cards.Cards; @@ -42,12 +41,10 @@ import mage.constants.SubType; import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.FilterCard; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.events.GameEvent; import mage.players.Player; -import mage.target.TargetCard; /** * @@ -56,7 +53,7 @@ import mage.target.TargetCard; public class SagesOfTheAnima extends CardImpl { public SagesOfTheAnima(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{G}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}{U}"); this.subtype.add(SubType.ELF); this.subtype.add(SubType.WIZARD); @@ -101,47 +98,24 @@ class SagesOfTheAnimaReplacementEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - FilterCard filter = new FilterCard(); - filter.add(new CardTypePredicate(CardType.CREATURE)); Player player = game.getPlayer(event.getPlayerId()); - Cards cards = new CardsImpl(); if (player != null) { - for (int i = 0; i < 3; i++) { - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - } - } - player.revealCards("Top three cards of library revealed", cards, game); - for (Card revealedCard : cards.getCards(game)) { - if (revealedCard.isCreature()) { - revealedCard.moveToZone(Zone.HAND, source.getSourceId(), game, false); - cards.remove(revealedCard); - } - } - TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCard()); - while (player.canRespond() && cards.size() > 1) { - player.choose(Outcome.Neutral, cards, target, game); - Card card = cards.get(target.getFirstTarget(), game); - if (card != null) { - cards.remove(card); - card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, false); - } - target.clearChosen(); - } - if (cards.size() == 1) { - Card card = cards.get(cards.iterator().next(), game); - card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, false); - } + Cards revealedCards = new CardsImpl(player.getLibrary().getTopCards(game, 3)); + player.revealCards(source, revealedCards, game); + Cards creatures = new CardsImpl(revealedCards.getCards(StaticFilters.FILTER_CARD_CREATURE, game)); + player.moveCards(creatures, Zone.BATTLEFIELD, source, game); + revealedCards.removeAll(creatures); + player.putCardsOnBottomOfLibrary(revealedCards, game, source, true); + return true; } - return true; + return false; } - + @Override public boolean checksEventType(GameEvent event, Game game) { return event.getType() == GameEvent.EventType.DRAW_CARD; - } - + } + @Override public boolean applies(GameEvent event, Ability source, Game game) { return event.getPlayerId().equals(source.getControllerId()); diff --git a/Mage.Sets/src/mage/cards/s/SaprazzanBreaker.java b/Mage.Sets/src/mage/cards/s/SaprazzanBreaker.java index d69e733e2a0..b79f49ae906 100644 --- a/Mage.Sets/src/mage/cards/s/SaprazzanBreaker.java +++ b/Mage.Sets/src/mage/cards/s/SaprazzanBreaker.java @@ -42,7 +42,7 @@ import mage.constants.SubType; import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; @@ -53,7 +53,7 @@ import mage.players.Player; public class SaprazzanBreaker extends CardImpl { public SaprazzanBreaker(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{U}"); this.subtype.add(SubType.BEAST); this.power = new MageInt(3); this.toughness = new MageInt(3); @@ -92,11 +92,11 @@ class SaprazzanBreakerEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); if (player != null) { - Card card = player.getLibrary().removeFromTop(game); + Card card = player.getLibrary().getFromTop(game); if (card != null) { player.moveCards(card, Zone.GRAVEYARD, source, game); if (card.isLand()) { - game.addEffect(new CantBeBlockedByAllSourceEffect(new FilterCreaturePermanent(), Duration.EndOfCombat), source); + game.addEffect(new CantBeBlockedByAllSourceEffect(StaticFilters.FILTER_PERMANENT_CREATURES, Duration.EndOfTurn), source); } } return true; diff --git a/Mage.Sets/src/mage/cards/s/Scalpelexis.java b/Mage.Sets/src/mage/cards/s/Scalpelexis.java index 111e7964a82..6e1750665eb 100644 --- a/Mage.Sets/src/mage/cards/s/Scalpelexis.java +++ b/Mage.Sets/src/mage/cards/s/Scalpelexis.java @@ -27,8 +27,8 @@ */ package mage.cards.s; -import java.util.ArrayList; -import java.util.List; +import java.util.HashSet; +import java.util.Set; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; @@ -38,9 +38,12 @@ import mage.abilities.keyword.FlyingAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Outcome; +import mage.constants.Zone; import mage.game.Game; import mage.players.Player; @@ -51,7 +54,7 @@ import mage.players.Player; public class Scalpelexis extends CardImpl { public Scalpelexis(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{U}"); this.subtype.add(SubType.BEAST); this.power = new MageInt(1); @@ -92,38 +95,26 @@ class ScalpelexisEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(targetPointer.getFirst(game, source)); - List namesFiltered = new ArrayList<>(); - boolean doneOnce = false; - - while (checkDuplicatedNames(namesFiltered) || !doneOnce) { - doneOnce = true; - namesFiltered.clear(); - int count = Math.min(player.getLibrary().size(), 4); - for (int i = 0; i < count; i++) { - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - namesFiltered.add(card.getName()); - card.moveToExile(id, "Moved these cards to exile", source.getSourceId(), game); + Player targetPlayer = game.getPlayer(getTargetPointer().getFirst(game, source)); + if (targetPlayer == null) { + return false; + } + Set cardNames = new HashSet<>(); + boolean doubleName; + do { + doubleName = false; + Cards toExile = new CardsImpl(targetPlayer.getLibrary().getTopCards(game, 4)); + cardNames.clear(); + for (Card card : toExile.getCards(game)) { + if (cardNames.contains(card.getName())) { + doubleName = true; + break; + } else { + cardNames.add(card.getName()); } } - } + targetPlayer.moveCards(toExile, Zone.EXILED, source, game); + } while (doubleName); return true; } - - public boolean checkDuplicatedNames(List string) { - for (int i = 0; i < string.size() - 1; i++) { - String stringToCheck = string.get(i); - if (stringToCheck == null) { - continue; //empty ignore - } - for (int j = i + 1; j < string.size(); j++) { - String stringToCompare = string.get(j); - if (stringToCheck.equals(stringToCompare)) { - return true; - } - } - } - return false; - } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/s/ScoutTheBorders.java b/Mage.Sets/src/mage/cards/s/ScoutTheBorders.java index b1e75a78d72..b3187104328 100644 --- a/Mage.Sets/src/mage/cards/s/ScoutTheBorders.java +++ b/Mage.Sets/src/mage/cards/s/ScoutTheBorders.java @@ -28,7 +28,6 @@ package mage.cards.s; import java.util.UUID; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; @@ -53,11 +52,10 @@ import mage.target.TargetCard; public class ScoutTheBorders extends CardImpl { public ScoutTheBorders(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{2}{G}"); - + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{G}"); // Reveal the top five cards of your library. You may put a creature or land card from among them into your hand. Put the rest into your graveyard. - this.getSpellAbility().addEffect(new ScoutTheBordersEffect()); + this.getSpellAbility().addEffect(new ScoutTheBordersEffect()); } public ScoutTheBorders(final ScoutTheBorders card) { @@ -70,48 +68,36 @@ public class ScoutTheBorders extends CardImpl { } } -class ScoutTheBordersEffect extends OneShotEffect { +class ScoutTheBordersEffect extends OneShotEffect { private static final FilterCard filterPutInHand = new FilterCard("creature or land card to put in hand"); + static { filterPutInHand.add(Predicates.or(new CardTypePredicate(CardType.CREATURE), new CardTypePredicate(CardType.LAND))); } - public ScoutTheBordersEffect() { + public ScoutTheBordersEffect() { super(Outcome.DrawCard); this.staticText = "Reveal the top five cards of your library. You may put a creature or land card from among them into your hand. Put the rest into your graveyard"; } - public ScoutTheBordersEffect(final ScoutTheBordersEffect effect) { + public ScoutTheBordersEffect(final ScoutTheBordersEffect effect) { super(effect); } @Override - public ScoutTheBordersEffect copy() { - return new ScoutTheBordersEffect(this); + public ScoutTheBordersEffect copy() { + return new ScoutTheBordersEffect(this); } @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = game.getObject(source.getSourceId()); - if (controller != null && sourceObject != null) { - Cards cards = new CardsImpl(); - - boolean properCardFound = false; - int count = Math.min(controller.getLibrary().size(), 5); - for (int i = 0; i < count; i++) { - Card card = controller.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - if (filterPutInHand.match(card, source.getSourceId(), source.getControllerId(), game)) { - properCardFound = true; - } - } - } - + if (controller != null) { + Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, 5)); + boolean properCardFound = cards.count(filterPutInHand, game) > 0; if (!cards.isEmpty()) { - controller.revealCards(sourceObject.getName(), cards, game); + controller.revealCards(source, cards, game); TargetCard target = new TargetCard(Zone.LIBRARY, filterPutInHand); if (properCardFound && controller.choose(Outcome.DrawCard, cards, target, game)) { Card card = game.getCard(target.getFirstTarget()); diff --git a/Mage.Sets/src/mage/cards/s/SecondSight.java b/Mage.Sets/src/mage/cards/s/SecondSight.java index 3d9c6ae5a83..70d8b86a285 100644 --- a/Mage.Sets/src/mage/cards/s/SecondSight.java +++ b/Mage.Sets/src/mage/cards/s/SecondSight.java @@ -34,18 +34,14 @@ import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.LookLibraryControllerEffect; import mage.abilities.keyword.EntwineAbility; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.cards.Cards; import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Outcome; -import mage.constants.Zone; -import mage.filter.FilterCard; import mage.game.Game; import mage.players.Player; -import mage.target.TargetCard; import mage.target.common.TargetOpponent; /** @@ -91,7 +87,7 @@ class SecondSightEffect extends OneShotEffect { public SecondSightEffect() { super(Outcome.DrawCard); - this.staticText = "look at the top five cards of target opponent's library, then put them back in any order."; + this.staticText = "look at the top five cards of target opponent's library, then put them back in any order"; } public SecondSightEffect(final SecondSightEffect effect) { @@ -105,36 +101,14 @@ class SecondSightEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player you = game.getPlayer(source.getControllerId()); + Player controller = game.getPlayer(source.getControllerId()); Player player = game.getPlayer(source.getFirstTarget()); - if (player == null || you == null) { + if (player == null || controller == null) { return false; } - Cards cards = new CardsImpl(); - int count = Math.min(player.getLibrary().size(), 5); - for (int i = 0; i < count; i++) { - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - } - } - - you.lookAtCards("Second Sight", cards, game); - - TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCard("card to put on the top of target player's library")); - while (player.canRespond() && cards.size() > 1) { - you.choose(Outcome.Neutral, cards, target, game); - Card card = cards.get(target.getFirstTarget(), game); - if (card != null) { - cards.remove(card); - card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); - } - target.clearChosen(); - } - if (cards.size() == 1) { - Card card = cards.get(cards.iterator().next(), game); - card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); - } + Cards cards = new CardsImpl(player.getLibrary().getTopCards(game, 5)); + controller.lookAtCards(source, null, cards, game); + controller.putCardsOnTopOfLibrary(cards, game, source, true); return true; } } diff --git a/Mage.Sets/src/mage/cards/s/SeeTheUnwritten.java b/Mage.Sets/src/mage/cards/s/SeeTheUnwritten.java index ebb62766750..e92b15ca91f 100644 --- a/Mage.Sets/src/mage/cards/s/SeeTheUnwritten.java +++ b/Mage.Sets/src/mage/cards/s/SeeTheUnwritten.java @@ -28,13 +28,11 @@ package mage.cards.s; import java.util.UUID; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.condition.InvertCondition; import mage.abilities.condition.common.FerociousCondition; import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.cards.Cards; @@ -42,7 +40,7 @@ import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.common.FilterCreatureCard; +import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; import mage.target.TargetCard; @@ -54,7 +52,7 @@ import mage.target.TargetCard; public class SeeTheUnwritten extends CardImpl { public SeeTheUnwritten(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{4}{G}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{G}{G}"); // Reveal the top eight cards of your library. You may put a creature card from among them onto the battlefield. Put the rest into your graveyard. // Ferocious — If you control a creature with power 4 or greater, you may put two creature cards onto the battlefield instead of one. @@ -78,8 +76,6 @@ public class SeeTheUnwritten extends CardImpl { class SeeTheUnwrittenEffect extends OneShotEffect { - private static final FilterCreatureCard filter = new FilterCreatureCard("creature card"); - private final int numberOfCardsToPutIntoPlay; public SeeTheUnwrittenEffect(int numberOfCardsToPutIntoPlay) { @@ -103,36 +99,18 @@ class SeeTheUnwrittenEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = game.getObject(source.getSourceId()); - if (controller != null && sourceObject != null) { - Cards cards = new CardsImpl(); - - int creatureCardsFound = 0; - int count = Math.min(controller.getLibrary().size(), 8); - for (int i = 0; i < count; i++) { - Card card = controller.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - if (filter.match(card, source.getSourceId(), source.getControllerId(), game)) { - creatureCardsFound++; - } - } - } - + if (controller != null) { + Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, 8)); + int creatureCardsFound = cards.count(StaticFilters.FILTER_CARD_CREATURE, game); if (!cards.isEmpty()) { - controller.revealCards(sourceObject.getName(), cards, game); + controller.revealCards(source, cards, game); if (creatureCardsFound > 0 && controller.chooseUse(outcome, "Put creature(s) into play?", source, game)) { int cardsToChoose = Math.min(numberOfCardsToPutIntoPlay, creatureCardsFound); - TargetCard target = new TargetCard(cardsToChoose, cardsToChoose, Zone.LIBRARY, filter); + TargetCard target = new TargetCard(cardsToChoose, cardsToChoose, Zone.LIBRARY, StaticFilters.FILTER_CARD_CREATURE); if (controller.choose(Outcome.PutCreatureInPlay, cards, target, game)) { - for (UUID creatureId : target.getTargets()) { - Card card = game.getCard(creatureId); - if (card != null) { - cards.remove(card); - controller.moveCards(card, Zone.BATTLEFIELD, source, game); - } - } - + Cards toBattlefield = new CardsImpl(target.getTargets()); + controller.moveCards(toBattlefield, Zone.BATTLEFIELD, source, game); + cards.removeAll(toBattlefield); } } controller.moveCards(cards, Zone.GRAVEYARD, source, game); diff --git a/Mage.Sets/src/mage/cards/s/SelvalasStampede.java b/Mage.Sets/src/mage/cards/s/SelvalasStampede.java index fd4fce00948..0218792c1a1 100644 --- a/Mage.Sets/src/mage/cards/s/SelvalasStampede.java +++ b/Mage.Sets/src/mage/cards/s/SelvalasStampede.java @@ -47,7 +47,6 @@ public class SelvalasStampede extends CardImpl { public SelvalasStampede(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{G}{G}"); - // Council's dilemma &mdash Starting with you, each player votes for wild or free. Reveal cards from the top of your library until you reveal a creature card for each wild vote. Put those creature cards onto the battlefield, then shuffle the rest into your library. You may put a permanent card from your hand onto the battlefield for each free vote. this.getSpellAbility().addEffect(new SelvalasStampedeDilemmaEffect()); @@ -66,8 +65,9 @@ public class SelvalasStampede extends CardImpl { class SelvalasStampedeDilemmaEffect extends CouncilsDilemmaVoteEffect { public SelvalasStampedeDilemmaEffect() { - super(Outcome.Benefit); - this.staticText = "Council's dilemma — Starting with you, each player votes for wild or free. Reveal cards from the top of your library until you reveal a creature card for each wild vote. Put those creature cards onto the battlefield, then shuffle the rest into your library. You may put a permanent card from your hand onto the battlefield for each free vote"; + super(Outcome.PutCardInPlay); + this.staticText = "Council's dilemma — Starting with you, each player votes for wild or free. Reveal cards from the top of your library until you reveal a creature card for each wild vote. Put those creature cards onto the battlefield, then shuffle the rest into your library. " + + "You may put a permanent card from your hand onto the battlefield for each free vote"; } public SelvalasStampedeDilemmaEffect(final SelvalasStampedeDilemmaEffect effect) { @@ -79,34 +79,37 @@ class SelvalasStampedeDilemmaEffect extends CouncilsDilemmaVoteEffect { Player controller = game.getPlayer(source.getControllerId()); //If no controller, exit here and do not vote. - if (controller == null) return false; + if (controller == null) { + return false; + } this.vote("wild", "free", controller, game, source); //Wild Votes if (voteOneCount > 0) { Cards revealedCards = new CardsImpl(); - int cardsToReveal = voteOneCount; - - while (cardsToReveal > 0 && controller.getLibrary().hasCards()) { - Card card = controller.getLibrary().removeFromTop(game); + Cards toBattlefield = new CardsImpl(); + for (Card card : controller.getLibrary().getCards(game)) { + revealedCards.add(card); if (card.isCreature()) { - controller.moveCards(card, Zone.BATTLEFIELD, source, game); - cardsToReveal--; - } else { - revealedCards.add(card); + toBattlefield.add(card); + if (toBattlefield.size() == voteOneCount) { + break; + } } } - - controller.revealCards("Selvala's Stampede", revealedCards, game); - controller.moveCards(revealedCards, Zone.LIBRARY, source, game); - controller.shuffleLibrary(source, game); + controller.revealCards(source, revealedCards, game); + controller.moveCards(toBattlefield, Zone.BATTLEFIELD, source, game); + revealedCards.removeAll(toBattlefield); + if (!revealedCards.isEmpty()) { + controller.shuffleLibrary(source, game); + } } //Free Votes if (voteTwoCount > 0) { TargetCardInHand target = new TargetCardInHand(0, voteTwoCount, new FilterPermanentCard("permanent cards")); - if (controller.choose(Outcome.PutCardInPlay, target, source.getSourceId(), game)) { + if (controller.choose(outcome, target, source.getSourceId(), game)) { controller.moveCards(new CardsImpl(target.getTargets()), Zone.BATTLEFIELD, source, game); } } diff --git a/Mage.Sets/src/mage/cards/s/ShapeAnew.java b/Mage.Sets/src/mage/cards/s/ShapeAnew.java index 8db084704af..27956d24561 100644 --- a/Mage.Sets/src/mage/cards/s/ShapeAnew.java +++ b/Mage.Sets/src/mage/cards/s/ShapeAnew.java @@ -30,13 +30,11 @@ package mage.cards.s; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.SacrificeTargetEffect; import mage.cards.*; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.FilterPermanent; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; @@ -48,21 +46,14 @@ import mage.target.TargetPermanent; */ public class ShapeAnew extends CardImpl { - private static final FilterPermanent filter = new FilterPermanent("an artifact"); - - static { - filter.add(new CardTypePredicate(CardType.ARTIFACT)); - } - public ShapeAnew(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{3}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{U}"); // The controller of target artifact sacrifices it, then reveals cards from the top // of their library until he or she reveals an artifact card. That player puts // that card onto the battlefield, then shuffles all other cards revealed this way into their library. - this.getSpellAbility().addEffect(new SacrificeTargetEffect("The controller of target artifact sacrifices it")); - this.getSpellAbility().addTarget(new TargetPermanent(filter)); this.getSpellAbility().addEffect(new ShapeAnewEffect()); + this.getSpellAbility().addTarget(new TargetPermanent(StaticFilters.FILTER_PERMANENT_ARTIFACT_AN)); } public ShapeAnew(final ShapeAnew card) { @@ -78,7 +69,7 @@ public class ShapeAnew extends CardImpl { public ShapeAnewEffect() { super(Outcome.PutCardInPlay); - staticText = ", then reveals cards from the top of their library until he or she reveals an artifact card. That player puts that card onto the battlefield, then shuffles all other cards revealed this way into their library"; + staticText = "The controller of target artifact sacrifices it, then reveals cards from the top of their library until he or she reveals an artifact card. That player puts that card onto the battlefield, then shuffles all other cards revealed this way into their library"; } public ShapeAnewEffect(ShapeAnewEffect effect) { @@ -87,32 +78,29 @@ public class ShapeAnew extends CardImpl { @Override public boolean apply(Game game, Ability source) { - Permanent sourcePermanent = (Permanent) game.getLastKnownInformation(targetPointer.getFirst(game, source), Zone.BATTLEFIELD); - if (sourcePermanent == null) { + Permanent targetPermanent = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (targetPermanent == null) { return false; } - Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { + targetPermanent.sacrifice(source.getSourceId(), game); + Player targetController = game.getPlayer(targetPermanent.getControllerId()); + if (targetController == null) { return false; } Cards revealed = new CardsImpl(); Card artifactCard = null; - Cards nonArtifactCards = new CardsImpl(); - Player targetController = game.getPlayer(sourcePermanent.getControllerId()); - while (artifactCard == null && targetController.getLibrary().hasCards()) { - Card card = targetController.getLibrary().removeFromTop(game); + for (Card card : targetController.getLibrary().getCards(game)) { revealed.add(card); if (card.isArtifact()) { artifactCard = card; - } else { - nonArtifactCards.add(card); + break; } } - targetController.revealCards(sourcePermanent.getIdName(), revealed, game); + targetController.revealCards(source, revealed, game); if (artifactCard != null) { targetController.moveCards(artifactCard, Zone.BATTLEFIELD, source, game); } - targetController.putCardsOnTopOfLibrary(nonArtifactCards, game, source, false); + // 1/1/2011: If the first card the player reveals is an artifact card, he or she will still have to shuffle his or her library even though no other cards were revealed this way. targetController.shuffleLibrary(source, game); return true; } diff --git a/Mage.Sets/src/mage/cards/s/ShrineOfPiercingVision.java b/Mage.Sets/src/mage/cards/s/ShrineOfPiercingVision.java index 0c1473be850..99e9b01ac6c 100644 --- a/Mage.Sets/src/mage/cards/s/ShrineOfPiercingVision.java +++ b/Mage.Sets/src/mage/cards/s/ShrineOfPiercingVision.java @@ -68,7 +68,7 @@ public class ShrineOfPiercingVision extends CardImpl { } public ShrineOfPiercingVision(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{2}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}"); // At the beginning of your upkeep or whenever you cast a blue spell, put a charge counter on Shrine of Piercing Vision. this.addAbility(new BeginningOfUpkeepTriggeredAbility(new AddCountersSourceEffect(CounterType.CHARGE.createInstance()), TargetController.YOU, false)); @@ -113,30 +113,19 @@ class ShrineOfPiercingVisionEffect extends OneShotEffect { if (player == null || permanent == null) { return false; } - int count = permanent.getCounters(game).getCount(CounterType.CHARGE); - - Cards cards = new CardsImpl(); - count = Math.min(player.getLibrary().size(), count); - for (int i = 0; i < count; i++) { - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - } - } - player.lookAtCards("Shrine of Piercing Vision", cards, game); - + Cards cards = new CardsImpl(player.getLibrary().getTopCards(game, permanent.getCounters(game).getCount(CounterType.CHARGE))); if (!cards.isEmpty()) { + player.lookAtCards(source, null, cards, game); TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCard("card to put into your hand")); - if (player.choose(Outcome.DrawCard, cards, target, game)) { Card card = cards.get(target.getFirstTarget(), game); if (card != null) { cards.remove(card); - card.moveToZone(Zone.HAND, source.getSourceId(), game, false); + player.moveCards(card, Zone.HAND, source, game); } } + player.putCardsOnBottomOfLibrary(cards, game, source, true); } - player.putCardsOnBottomOfLibrary(cards, game, source, true); return true; } } diff --git a/Mage.Sets/src/mage/cards/s/SinProdder.java b/Mage.Sets/src/mage/cards/s/SinProdder.java index bae067a022c..0454e19d78f 100644 --- a/Mage.Sets/src/mage/cards/s/SinProdder.java +++ b/Mage.Sets/src/mage/cards/s/SinProdder.java @@ -27,7 +27,6 @@ */ package mage.cards.s; -import java.util.Set; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; @@ -37,15 +36,13 @@ import mage.abilities.keyword.MenaceAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.Cards; import mage.cards.CardsImpl; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.TargetController; import mage.constants.Zone; import mage.game.Game; -import mage.game.permanent.Permanent; import mage.players.Player; /** @@ -55,7 +52,7 @@ import mage.players.Player; public class SinProdder extends CardImpl { public SinProdder(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}"); this.subtype.add(SubType.DEVIL); this.power = new MageInt(3); this.toughness = new MageInt(2); @@ -98,32 +95,31 @@ class SinProdderEffect extends OneShotEffect { @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.getLibrary().hasCards()) { - Card card = controller.getLibrary().removeFromTop(game); - if (card != null) { - Cards cards = new CardsImpl(card); - controller.revealCards(sourcePermanent.getIdName(), cards, game); - StringBuilder sb = new StringBuilder(); - sb.append("Put ").append(card.getName()).append(" in ").append(controller.getLogName()).append("'s graveyard?"); - boolean putInGraveyard = false; - Set opponents = game.getOpponents(source.getControllerId()); - for (UUID opponentUuid : opponents) { - Player opponent = game.getPlayer(opponentUuid); - if (opponent != null && !putInGraveyard && opponent.chooseUse(Outcome.Damage, sb.toString(), source, game)) { - putInGraveyard = true; - opponent.damage(card.getConvertedManaCost(), source.getSourceId(), game, false, true); - } + if (controller != null) { + Card card = controller.getLibrary().getFromTop(game); + if (card != null) { + controller.revealCards(source, new CardsImpl(card), game); + String message = "Put " + card.getName() + " in " + controller.getName() + "'s graveyard?"; + boolean putInGraveyard = false; + for (UUID opponentUuid : game.getOpponents(source.getControllerId())) { + Player opponent = game.getPlayer(opponentUuid); + if (opponent != null && !putInGraveyard && opponent.chooseUse(Outcome.Damage, message, source, game)) { + putInGraveyard = true; + opponent.damage(card.getConvertedManaCost(), source.getSourceId(), game, false, true); + // 4/8/2016: Each opponent in turn order, starting with the one after you in turn order, may choose to have you put that card into your graveyard. + // Once a player does so, Sin Prodder deals damage equal to that card's converted mana cost to that player immediately + // and Sin Prodder's trigger has no further action. + break; } - if (putInGraveyard) { - controller.moveCards(card, Zone.GRAVEYARD, source, game); - } else { - controller.moveCards(card, Zone.HAND, source, game); - } - return true; + } + if (putInGraveyard) { + controller.moveCards(card, Zone.GRAVEYARD, source, game); + } else { + controller.moveCards(card, Zone.HAND, source, game); } } + return true; + } return false; } diff --git a/Mage.Sets/src/mage/cards/s/Spellshift.java b/Mage.Sets/src/mage/cards/s/Spellshift.java index a84d1eae980..bf93afa11cc 100644 --- a/Mage.Sets/src/mage/cards/s/Spellshift.java +++ b/Mage.Sets/src/mage/cards/s/Spellshift.java @@ -42,7 +42,6 @@ import mage.constants.Zone; import mage.filter.common.FilterInstantOrSorcerySpell; import mage.game.Game; import mage.game.stack.Spell; -import mage.players.Library; import mage.players.Player; import mage.target.TargetSpell; @@ -91,31 +90,22 @@ class SpellshiftEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(((Spell) game.getLastKnownInformation(targetPointer.getFirst(game, source), Zone.STACK)).getControllerId()); - if (player != null) { - Library library = player.getLibrary(); - if (library.hasCards()) { - Cards cards = new CardsImpl(); - Card card = library.removeFromTop(game); - cards.add(card); - while (!(card.isSorcery() || card.isInstant()) && library.hasCards()) { - card = library.removeFromTop(game); - cards.add(card); - } - + Player spellController = game.getPlayer(((Spell) game.getLastKnownInformation(targetPointer.getFirst(game, source), Zone.STACK)).getControllerId()); + if (spellController != null) { + Cards cardsToReveal = new CardsImpl(); + Card toCast = null; + for (Card card : spellController.getLibrary().getCards(game)) { + cardsToReveal.add(card); if (card.isSorcery() || card.isInstant()) { - if (player.chooseUse(outcome, "Cast " + card.getLogName() + " ?", source, game)) { - if (player.cast(card.getSpellAbility(), game, true)) { - cards.remove(card.getId()); - } - } - } - - if (!cards.isEmpty()) { - library.addAll(cards.getCards(game), game); + toCast = card; + break; } } - player.shuffleLibrary(source, game); + spellController.revealCards(source, cardsToReveal, game); + if (toCast != null && spellController.chooseUse(outcome, "Cast " + toCast.getLogName() + " without paying its mana cost?", source, game)) { + spellController.cast(toCast.getSpellAbility(), game, true); + } + spellController.shuffleLibrary(source, game); return true; } return false; diff --git a/Mage.Sets/src/mage/cards/s/SphinxOfUthuun.java b/Mage.Sets/src/mage/cards/s/SphinxOfUthuun.java index bb98ced1ab6..c799d47b1cb 100644 --- a/Mage.Sets/src/mage/cards/s/SphinxOfUthuun.java +++ b/Mage.Sets/src/mage/cards/s/SphinxOfUthuun.java @@ -43,8 +43,8 @@ import mage.cards.CardSetInfo; import mage.cards.Cards; import mage.cards.CardsImpl; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.Zone; import mage.filter.FilterCard; import mage.game.Game; @@ -58,7 +58,7 @@ import mage.target.TargetCard; public class SphinxOfUthuun extends CardImpl { public SphinxOfUthuun(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{5}{U}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{U}{U}"); this.subtype.add(SubType.SPHINX); this.power = new MageInt(5); @@ -96,21 +96,13 @@ class SphinxOfUthuunEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); + Player controller = game.getPlayer(source.getControllerId()); MageObject sourceObject = source.getSourceObject(game); - if (player == null || sourceObject == null) { + if (controller == null || sourceObject == null) { return false; } - - Cards cards = new CardsImpl(); - int count = Math.min(player.getLibrary().size(), 5); - for (int i = 0; i < count; i++) { - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - } - } - player.revealCards(sourceObject.getName(), cards, game); + Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, 5)); + controller.revealCards(source, cards, game); Set opponents = game.getOpponents(source.getControllerId()); if (!opponents.isEmpty()) { @@ -121,25 +113,15 @@ class SphinxOfUthuunEffect extends OneShotEffect { List pile1 = new ArrayList<>(); Cards pile1CardsIds = new CardsImpl(); if (opponent.choose(Outcome.Neutral, cards, target, game)) { - List targets = target.getTargets(); - for (UUID targetId : targets) { - Card card = game.getCard(targetId); - if (card != null) { - pile1.add(card); - pile1CardsIds.add(card.getId()); - } - } + pile1CardsIds.addAll(target.getTargets()); + pile1.addAll(pile1CardsIds.getCards(game)); } List pile2 = new ArrayList<>(); - Cards pile2CardsIds = new CardsImpl(); - for (UUID cardId :cards) { - Card card = game.getCard(cardId); - if (card != null && !pile1.contains(card)) { - pile2.add(card); - pile2CardsIds.add(card.getId()); - } - } - boolean choice = player.choosePile(Outcome.DestroyPermanent, "Choose a pile to put into hand.", pile1, pile2, game); + Cards pile2CardsIds = new CardsImpl(cards); + pile2CardsIds.removeAll(pile1CardsIds); + pile2.addAll(pile2CardsIds.getCards(game)); + + boolean choice = controller.choosePile(Outcome.DestroyPermanent, "Choose a pile to put into hand.", pile1, pile2, game); Zone pile1Zone = Zone.GRAVEYARD; Zone pile2Zone = Zone.HAND; @@ -148,7 +130,7 @@ class SphinxOfUthuunEffect extends OneShotEffect { pile2Zone = Zone.GRAVEYARD; } - StringBuilder sb = new StringBuilder(sourceObject.getLogName()).append(": Pile 1, going to ").append(pile1Zone == Zone.HAND ?"Hand":"Graveyard").append (": "); + StringBuilder sb = new StringBuilder(sourceObject.getLogName()).append(": Pile 1, going to ").append(pile1Zone == Zone.HAND ? "Hand" : "Graveyard").append(": "); int i = 0; for (UUID cardUuid : pile1CardsIds) { i++; @@ -158,12 +140,12 @@ class SphinxOfUthuunEffect extends OneShotEffect { if (i < pile1CardsIds.size()) { sb.append(", "); } - card.moveToZone(pile1Zone, source.getSourceId(), game, false); } } + controller.moveCards(pile1CardsIds, pile1Zone, source, game); game.informPlayers(sb.toString()); - sb = new StringBuilder(sourceObject.getLogName()).append(": Pile 2, going to ").append(pile2Zone == Zone.HAND ?"Hand":"Graveyard").append (':'); + sb = new StringBuilder(sourceObject.getLogName()).append(": Pile 2, going to ").append(pile2Zone == Zone.HAND ? "Hand" : "Graveyard").append(':'); i = 0; for (UUID cardUuid : pile2CardsIds) { Card card = game.getCard(cardUuid); @@ -173,9 +155,9 @@ class SphinxOfUthuunEffect extends OneShotEffect { if (i < pile2CardsIds.size()) { sb.append(", "); } - card.moveToZone(pile2Zone, source.getSourceId(), game, false); } } + controller.moveCards(pile2CardsIds, pile2Zone, source, game); game.informPlayers(sb.toString()); } diff --git a/Mage.Sets/src/mage/cards/s/SphinxsTutelage.java b/Mage.Sets/src/mage/cards/s/SphinxsTutelage.java index 7a764567fca..db7975b50bf 100644 --- a/Mage.Sets/src/mage/cards/s/SphinxsTutelage.java +++ b/Mage.Sets/src/mage/cards/s/SphinxsTutelage.java @@ -53,7 +53,7 @@ import mage.target.common.TargetOpponent; public class SphinxsTutelage extends CardImpl { public SphinxsTutelage(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}"); // Whenever you draw a card, target opponent puts the top two cards of their library into their graveyard. If they're both nonland cards that share a color, repeat this process. Ability ability = new DrawCardControllerTriggeredAbility(new SphinxsTutelageEffect(), false); @@ -108,19 +108,20 @@ class SphinxsTutelageEffect extends OneShotEffect { return true; } colorShared = false; - Cards cards = new CardsImpl(); - cards.addAll(targetPlayer.getLibrary().getTopCards(game, 2)); - if (!cards.isEmpty()) { - Card card1 = targetPlayer.getLibrary().removeFromTop(game); - if (!card1.isLand() && targetPlayer.getLibrary().hasCards()) { - Card card2 = targetPlayer.getLibrary().removeFromTop(game); - if (!card2.isLand()) { - colorShared = card1.getColor(game).shares(card2.getColor(game)); - } + Cards cards = new CardsImpl(targetPlayer.getLibrary().getTopCards(game, 2)); + Card card1 = null; + for (Card card : cards.getCards(game)) { + if (card.isLand()) { + break; + } + if (card1 == null) { + card1 = card; + } else { + colorShared = card1.getColor(game).shares(card.getColor(game)); } } targetPlayer.moveCards(cards, Zone.GRAVEYARD, source, game); - } while (colorShared && targetPlayer.canRespond()); + } while (colorShared && targetPlayer.isInGame()); return true; } return false; diff --git a/Mage.Sets/src/mage/cards/s/StolenGoods.java b/Mage.Sets/src/mage/cards/s/StolenGoods.java index 4f059d40388..6004d759bea 100644 --- a/Mage.Sets/src/mage/cards/s/StolenGoods.java +++ b/Mage.Sets/src/mage/cards/s/StolenGoods.java @@ -28,7 +28,6 @@ package mage.cards.s; import java.util.UUID; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.AsThoughEffectImpl; import mage.abilities.effects.ContinuousEffect; @@ -42,10 +41,10 @@ import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Zone; import mage.game.Game; -import mage.players.Library; import mage.players.Player; import mage.target.common.TargetOpponent; import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; /** * @@ -54,7 +53,7 @@ import mage.target.targetpointer.FixedTarget; public class StolenGoods extends CardImpl { public StolenGoods(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{3}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{U}"); // Target opponent exiles cards from the top of their library until he or she exiles a nonland card. Until end of turn, you may cast that card without paying its mana cost. this.getSpellAbility().addEffect(new StolenGoodsEffect()); @@ -90,16 +89,14 @@ class StolenGoodsEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player opponent = game.getPlayer(targetPointer.getFirst(game, source)); - MageObject sourceObject = source.getSourceObject(game); - if (opponent != null && opponent.getLibrary().hasCards() && sourceObject != null) { - Library library = opponent.getLibrary(); + if (opponent != null) { Card card; do { - card = library.removeFromTop(game); + card = opponent.getLibrary().getFromTop(game); if (card != null) { - opponent.moveCardsToExile(card, source, game, true, source.getSourceId(), sourceObject.getIdName()); + opponent.moveCardsToExile(card, source, game, true, source.getSourceId(), CardUtil.createObjectRealtedWindowTitle(source, game, null)); } - } while (library.hasCards() && card != null && card.isLand()); + } while (card != null && card.isLand()); if (card != null) { ContinuousEffect effect = new StolenGoodsCastFromExileEffect(); diff --git a/Mage.Sets/src/mage/cards/s/StrategicPlanning.java b/Mage.Sets/src/mage/cards/s/StrategicPlanning.java index 3318cba98ed..cc0d6fe8a5a 100644 --- a/Mage.Sets/src/mage/cards/s/StrategicPlanning.java +++ b/Mage.Sets/src/mage/cards/s/StrategicPlanning.java @@ -28,20 +28,13 @@ package mage.cards.s; import java.util.UUID; -import mage.abilities.Ability; -import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; +import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.Cards; -import mage.cards.CardsImpl; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.FilterCard; -import mage.game.Game; -import mage.players.Player; -import mage.target.TargetCard; +import mage.filter.StaticFilters; /** * @@ -50,11 +43,11 @@ import mage.target.TargetCard; public class StrategicPlanning extends CardImpl { public StrategicPlanning(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{1}{U}"); - + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{U}"); // Look at the top three cards of your library. Put one of them into your hand and the rest into your graveyard. - this.getSpellAbility().addEffect(new StrategicPlanningEffect()); + this.getSpellAbility().addEffect(new LookLibraryAndPickControllerEffect(new StaticValue(3), false, new StaticValue(1), + StaticFilters.FILTER_CARD, Zone.GRAVEYARD, false, false, false, Zone.HAND, false)); } public StrategicPlanning(final StrategicPlanning card) { @@ -66,44 +59,3 @@ public class StrategicPlanning extends CardImpl { return new StrategicPlanning(this); } } - -class StrategicPlanningEffect extends OneShotEffect { - - public StrategicPlanningEffect() { - super(Outcome.DrawCard); - this.staticText = "Look at the top three cards of your library. Put one of them into your hand and the rest into your graveyard"; - } - - public StrategicPlanningEffect(final StrategicPlanningEffect effect) { - super(effect); - } - - @Override - public StrategicPlanningEffect copy() { - return new StrategicPlanningEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - - if (controller != null) { - Cards cards = new CardsImpl(); - cards.addAll(controller.getLibrary().getTopCards(game, 3)); - if (!cards.isEmpty()) { - controller.lookAtCards("Strategic Planning", cards, game); - TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCard("card to put in your hand")); - if (controller.choose(Outcome.Benefit, cards, target, game)) { - Card card = cards.get(target.getFirstTarget(), game); - if (card != null) { - controller.moveCards(card, Zone.HAND, source, game); - cards.remove(card); - } - } - controller.moveCards(cards, Zone.GRAVEYARD, source, game); - } - return true; - } - return false; - } -} diff --git a/Mage.Sets/src/mage/cards/s/SultaiSoothsayer.java b/Mage.Sets/src/mage/cards/s/SultaiSoothsayer.java index bea2d5f0c10..b327aa6dbc2 100644 --- a/Mage.Sets/src/mage/cards/s/SultaiSoothsayer.java +++ b/Mage.Sets/src/mage/cards/s/SultaiSoothsayer.java @@ -29,23 +29,15 @@ package mage.cards.s; import java.util.UUID; import mage.MageInt; -import mage.MageObject; -import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; +import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.Cards; -import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.SubType; -import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.FilterCard; -import mage.game.Game; -import mage.players.Player; -import mage.target.TargetCard; +import mage.filter.StaticFilters; /** * @@ -54,7 +46,7 @@ import mage.target.TargetCard; public class SultaiSoothsayer extends CardImpl { public SultaiSoothsayer(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{B}{G}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}{G}{U}"); this.subtype.add(SubType.NAGA); this.subtype.add(SubType.SHAMAN); @@ -62,7 +54,8 @@ public class SultaiSoothsayer extends CardImpl { this.toughness = new MageInt(5); // When Sultai Soothsayer enters the battlefield, look at the top four cards of your library. Put one of them into your hand and the rest into your graveyard. - this.addAbility(new EntersBattlefieldTriggeredAbility(new SultaiSoothsayerEffect(), false)); + this.addAbility(new EntersBattlefieldTriggeredAbility(new LookLibraryAndPickControllerEffect(new StaticValue(4), false, new StaticValue(1), + StaticFilters.FILTER_CARD, Zone.GRAVEYARD, false, false, false, Zone.HAND, false), false)); } public SultaiSoothsayer(final SultaiSoothsayer card) { @@ -74,44 +67,3 @@ public class SultaiSoothsayer extends CardImpl { return new SultaiSoothsayer(this); } } - -class SultaiSoothsayerEffect extends OneShotEffect { - - public SultaiSoothsayerEffect() { - super(Outcome.DrawCard); - this.staticText = "look at the top four cards of your library. Put one of them into your hand and the rest into your graveyard"; - } - - public SultaiSoothsayerEffect(final SultaiSoothsayerEffect effect) { - super(effect); - } - - @Override - public SultaiSoothsayerEffect copy() { - return new SultaiSoothsayerEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = game.getObject(source.getSourceId()); - if (controller != null && sourceObject != null) { - Cards cards = new CardsImpl(); - cards.addAll(controller.getLibrary().getTopCards(game, 4)); - if (!cards.isEmpty()) { - controller.lookAtCards(sourceObject.getName(), cards, game); - TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCard("card to put in your hand")); - if (controller.choose(Outcome.Benefit, cards, target, game)) { - Card card = cards.get(target.getFirstTarget(), game); - if (card != null) { - controller.moveCards(card, Zone.HAND, source, game); - cards.remove(card); - } - } - controller.moveCards(cards, Zone.GRAVEYARD, source, game); - } - return true; - } - return false; - } -} diff --git a/Mage.Sets/src/mage/cards/s/SupremeWill.java b/Mage.Sets/src/mage/cards/s/SupremeWill.java index 45cb4bf6390..6dde684f4c9 100644 --- a/Mage.Sets/src/mage/cards/s/SupremeWill.java +++ b/Mage.Sets/src/mage/cards/s/SupremeWill.java @@ -37,7 +37,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; -import mage.filter.FilterCard; +import mage.filter.StaticFilters; import mage.target.TargetSpell; /** @@ -55,7 +55,7 @@ public class SupremeWill extends CardImpl { // or Look at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order. Mode mode = new Mode(); - mode.getEffects().add(new LookLibraryAndPickControllerEffect(new StaticValue(4), false, new StaticValue(1), new FilterCard(), Zone.LIBRARY, false, false)); + mode.getEffects().add(new LookLibraryAndPickControllerEffect(new StaticValue(4), false, new StaticValue(1), StaticFilters.FILTER_CARD, Zone.LIBRARY, false, false)); this.getSpellAbility().addMode(mode); } diff --git a/Mage.Sets/src/mage/cards/s/SyntheticDestiny.java b/Mage.Sets/src/mage/cards/s/SyntheticDestiny.java index d34fee6145f..aec13c2ac17 100644 --- a/Mage.Sets/src/mage/cards/s/SyntheticDestiny.java +++ b/Mage.Sets/src/mage/cards/s/SyntheticDestiny.java @@ -31,7 +31,6 @@ import java.util.HashSet; import java.util.LinkedHashSet; import java.util.Set; import java.util.UUID; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; import mage.abilities.effects.OneShotEffect; @@ -126,23 +125,20 @@ class SyntheticDestinyDelayedEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = source.getSourceObject(game); - if (controller != null && sourceObject != null) { + if (controller != null) { Cards revealed = new CardsImpl(); Set creatureCards = new LinkedHashSet<>(); - Cards nonCreatureCards = new CardsImpl(); - while (creatureCards.size() < numberOfCards && controller.getLibrary().hasCards()) { - Card card = controller.getLibrary().removeFromTop(game); + for (Card card : controller.getLibrary().getCards(game)) { revealed.add(card); if (card.isCreature()) { creatureCards.add(card); - } else { - nonCreatureCards.add(card); + } + if (creatureCards.size() >= numberOfCards) { + break; } } - controller.revealCards(sourceObject.getIdName(), revealed, game); - controller.moveCards(creatureCards, Zone.BATTLEFIELD, source, game, false, false, true, null); - controller.putCardsOnTopOfLibrary(nonCreatureCards, game, source, false); + controller.revealCards(source, revealed, game); + controller.moveCards(creatureCards, Zone.BATTLEFIELD, source, game); controller.shuffleLibrary(source, game); return true; } diff --git a/Mage.Sets/src/mage/cards/t/TaigamSidisisHand.java b/Mage.Sets/src/mage/cards/t/TaigamSidisisHand.java index ffa0797bd35..6dda3167c4c 100644 --- a/Mage.Sets/src/mage/cards/t/TaigamSidisisHand.java +++ b/Mage.Sets/src/mage/cards/t/TaigamSidisisHand.java @@ -37,27 +37,26 @@ import mage.abilities.costs.Cost; import mage.abilities.costs.common.ExileFromGraveCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; import mage.abilities.effects.common.SkipDrawStepEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.Cards; -import mage.cards.CardsImpl; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.SuperType; import mage.constants.TargetController; import mage.constants.Zone; import mage.filter.FilterCard; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; -import mage.target.TargetCard; import mage.target.common.TargetCardInYourGraveyard; import mage.target.common.TargetCreaturePermanent; import mage.target.targetpointer.FixedTarget; @@ -81,7 +80,8 @@ public class TaigamSidisisHand extends CardImpl { this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SkipDrawStepEffect())); // At the beginning of your upkeep, look at the top three cards of your library. Put one of them into your hand and the rest into your graveyard. - this.addAbility(new BeginningOfUpkeepTriggeredAbility(new TaigamSidisisHandDrawEffect(), TargetController.YOU, false)); + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new LookLibraryAndPickControllerEffect(new StaticValue(4), false, new StaticValue(1), + StaticFilters.FILTER_CARD, Zone.GRAVEYARD, false, false, false, Zone.HAND, false), TargetController.YOU, false)); // {B}, {T}, Exile X cards from your graveyard: Target creature gets -X/-X until end of turn. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new TaigamSidisisHandEffect(), new ManaCostsImpl("{B}")); @@ -138,44 +138,3 @@ class TaigamSidisisHandEffect extends OneShotEffect { return false; } } - -class TaigamSidisisHandDrawEffect extends OneShotEffect { - - public TaigamSidisisHandDrawEffect() { - super(Outcome.DrawCard); - this.staticText = "Look at the top three cards of your library. Put one of them into your hand and the rest into your graveyard"; - } - - public TaigamSidisisHandDrawEffect(final TaigamSidisisHandDrawEffect effect) { - super(effect); - } - - @Override - public TaigamSidisisHandDrawEffect copy() { - return new TaigamSidisisHandDrawEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - - if (controller != null) { - Cards cards = new CardsImpl(); - cards.addAll(controller.getLibrary().getTopCards(game, 3)); - if (!cards.isEmpty()) { - controller.lookAtCards("Taigam, Sidisi's Hand", cards, game); - TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCard("card to put in your hand")); - if (controller.choose(Outcome.Benefit, cards, target, game)) { - Card card = cards.get(target.getFirstTarget(), game); - if (card != null) { - controller.moveCards(card, Zone.HAND, source, game); - cards.remove(card); - } - } - controller.moveCards(cards, Zone.GRAVEYARD, source, game); - } - return true; - } - return false; - } -} diff --git a/Mage.Sets/src/mage/cards/t/TeleminPerformance.java b/Mage.Sets/src/mage/cards/t/TeleminPerformance.java index 6be3dbef0be..c26b298da20 100644 --- a/Mage.Sets/src/mage/cards/t/TeleminPerformance.java +++ b/Mage.Sets/src/mage/cards/t/TeleminPerformance.java @@ -28,7 +28,6 @@ package mage.cards.t; import java.util.UUID; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; @@ -86,31 +85,25 @@ class TeleminPerformanceEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = game.getObject(source.getSourceId()); - if (controller != null && sourceObject != null) { + if (controller != null) { Player opponent = game.getPlayer(getTargetPointer().getFirst(game, source)); if (opponent != null) { Card creature = null; - CardsImpl cards = new CardsImpl(); - boolean creatureFound = false; - while (opponent.getLibrary().hasCards() && !creatureFound) { - Card card = opponent.getLibrary().removeFromTop(game); - if (card != null) { - if (card.isCreature()) { - creature = card; - creatureFound = true; - } - if (!creatureFound) { - cards.add(card); - } + CardsImpl nonCreatures = new CardsImpl(); + CardsImpl reveal = new CardsImpl(); + for (Card card : opponent.getLibrary().getCards(game)) { + reveal.add(card); + if (card.isCreature()) { + creature = card; + break; + } else { + nonCreatures.add(card); } } - if (!cards.isEmpty()) { - opponent.revealCards(sourceObject.getIdName(), cards, game); - opponent.moveCards(cards, Zone.GRAVEYARD, source, game); - } - game.applyEffects(); + opponent.revealCards(source, reveal, game); + opponent.moveCards(nonCreatures, Zone.GRAVEYARD, source, game); if (creature != null) { + game.applyEffects(); controller.moveCards(creature, Zone.BATTLEFIELD, source, game); } } diff --git a/Mage.Sets/src/mage/cards/t/ThievesFortune.java b/Mage.Sets/src/mage/cards/t/ThievesFortune.java index 8b681bcd61b..98194006923 100644 --- a/Mage.Sets/src/mage/cards/t/ThievesFortune.java +++ b/Mage.Sets/src/mage/cards/t/ThievesFortune.java @@ -36,7 +36,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; -import mage.filter.FilterCard; +import mage.filter.StaticFilters; /** * @@ -45,14 +45,14 @@ import mage.filter.FilterCard; public class ThievesFortune extends CardImpl { public ThievesFortune(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.TRIBAL,CardType.INSTANT},"{2}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.TRIBAL, CardType.INSTANT}, "{2}{U}"); this.subtype.add(SubType.ROGUE); - // Prowl {U} this.addAbility(new ProwlAbility(this, "{U}")); + // Look at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order. - this.getSpellAbility().addEffect(new LookLibraryAndPickControllerEffect(new StaticValue(4), false, new StaticValue(1), new FilterCard(), Zone.LIBRARY, false, false)); + this.getSpellAbility().addEffect(new LookLibraryAndPickControllerEffect(new StaticValue(4), false, new StaticValue(1), StaticFilters.FILTER_CARD, Zone.LIBRARY, false, false)); } public ThievesFortune(final ThievesFortune card) { diff --git a/Mage.Sets/src/mage/cards/t/TimeOut.java b/Mage.Sets/src/mage/cards/t/TimeOut.java index 2907d764fce..3e4dd1a9094 100644 --- a/Mage.Sets/src/mage/cards/t/TimeOut.java +++ b/Mage.Sets/src/mage/cards/t/TimeOut.java @@ -27,19 +27,13 @@ */ package mage.cards.t; -import java.util.Deque; -import java.util.LinkedList; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.Cards; -import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Outcome; -import mage.constants.Zone; import mage.filter.FilterPermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; @@ -102,33 +96,14 @@ class TimeOutEffect extends OneShotEffect { Permanent permanent = game.getPermanent(this.getTargetPointer().getFirst(game, source)); if (permanent != null) { Player owner = game.getPlayer(permanent.getOwnerId()); - if (owner != null) { - int amount = controller.rollDice(game, 6); - Cards cards = new CardsImpl(); - Deque cardIds = new LinkedList<>(); - for (int i = 0; i < amount; i++) { - Card card = owner.getLibrary().removeFromTop(game); - cards.add(card); - cardIds.push(card.getId()); - } - // return cards back to library - game.informPlayers(new StringBuilder(controller.getLogName()) - .append(" puts ").append(permanent.getName()) - .append(" beneath the top ").append(amount) - .append(" cards of ").append(owner.getLogName()).append("'s library").toString()); - permanent.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); - while (!cardIds.isEmpty()) { - UUID cardId = cardIds.poll(); - Card card = cards.get(cardId, game); - if (card != null) { - card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); - } - } - return true; + if (owner == null) { + return false; } + int amount = controller.rollDice(game, 6); + controller.putCardOnTopXOfLibrary(permanent, game, source, amount); + return true; } } - return false; } } diff --git a/Mage.Sets/src/mage/cards/t/TrackersInstincts.java b/Mage.Sets/src/mage/cards/t/TrackersInstincts.java index 7d281e50df9..672273f436d 100644 --- a/Mage.Sets/src/mage/cards/t/TrackersInstincts.java +++ b/Mage.Sets/src/mage/cards/t/TrackersInstincts.java @@ -41,6 +41,7 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.TimingRule; import mage.constants.Zone; +import mage.filter.StaticFilters; import mage.filter.common.FilterCreatureCard; import mage.game.Game; import mage.players.Player; @@ -53,8 +54,7 @@ import mage.target.TargetCard; public class TrackersInstincts extends CardImpl { public TrackersInstincts(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{1}{G}"); - + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{G}"); // Reveal the top four cards of your library. Put a creature card from among them into your hand and the rest into your graveyard. this.getSpellAbility().addEffect(new TrackersInstinctsEffect()); @@ -92,30 +92,17 @@ class TrackersInstinctsEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - Cards cards = new CardsImpl(); - - boolean creaturesFound = false; - int count = Math.min(controller.getLibrary().size(), 4); - for (int i = 0; i < count; i++) { - Card card = controller.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - if (card.isCreature()) { - creaturesFound = true; - } - } - } - + Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, 4)); + boolean creaturesFound = cards.count(StaticFilters.FILTER_CARD_CREATURE, game) > 0; if (!cards.isEmpty()) { - controller.revealCards("Tracker's Instincts", cards, game); + controller.revealCards(source, cards, game); TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCreatureCard("creature card to put in hand")); if (creaturesFound && controller.choose(Outcome.DrawCard, cards, target, game)) { Card card = game.getCard(target.getFirstTarget()); if (card != null) { + controller.moveCards(card, Zone.HAND, source, game); cards.remove(card); - card.moveToZone(Zone.HAND, source.getSourceId(), game, false); } - } controller.moveCards(cards, Zone.GRAVEYARD, source, game); } diff --git a/Mage.Sets/src/mage/cards/t/TreasureHunt.java b/Mage.Sets/src/mage/cards/t/TreasureHunt.java index d53b7e1a8b8..5f7bf636025 100644 --- a/Mage.Sets/src/mage/cards/t/TreasureHunt.java +++ b/Mage.Sets/src/mage/cards/t/TreasureHunt.java @@ -38,7 +38,6 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; import mage.game.Game; -import mage.players.Library; import mage.players.Player; /** @@ -48,8 +47,7 @@ import mage.players.Player; public class TreasureHunt extends CardImpl { public TreasureHunt(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{1}{U}"); - + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{U}"); // Reveal cards from the top of your library until you reveal a nonland card, then put all cards revealed this way into your hand. this.getSpellAbility().addEffect(new TreasureHuntEffect()); @@ -83,22 +81,17 @@ class TreasureHuntEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player != null && player.getLibrary().hasCards()) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null && controller.getLibrary().hasCards()) { CardsImpl cards = new CardsImpl(); - Library library = player.getLibrary(); - Card card = null; - do { - card = library.removeFromTop(game); - if (card != null) { - cards.add(card); - card.moveToZone(Zone.HAND, source.getSourceId(), game, false); + for (Card card : controller.getLibrary().getCards(game)) { + cards.add(card); + if (!card.isLand()) { + break; } - } while (library.hasCards() && card != null && card.isLand()); - - if (!cards.isEmpty()) { - player.revealCards("Treasure Hunt", cards, game); } + controller.revealCards(source, cards, game); + controller.moveCards(cards, Zone.HAND, source, game); return true; } return false; diff --git a/Mage.Sets/src/mage/cards/t/TreasureKeeper.java b/Mage.Sets/src/mage/cards/t/TreasureKeeper.java index 97cbadded90..ada27fe5b99 100644 --- a/Mage.Sets/src/mage/cards/t/TreasureKeeper.java +++ b/Mage.Sets/src/mage/cards/t/TreasureKeeper.java @@ -29,7 +29,6 @@ package mage.cards.t; import java.util.UUID; import mage.MageInt; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.DiesTriggeredAbility; import mage.abilities.effects.OneShotEffect; @@ -38,8 +37,8 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.cards.CardsImpl; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.game.Game; import mage.players.Player; @@ -85,22 +84,18 @@ class TreasureKeeperEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - CardsImpl toReveal = new CardsImpl(); - Card nonLandCard = null; Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = game.getObject(source.getSourceId()); - if (controller != null && sourceObject != null) { - while (nonLandCard == null && controller.getLibrary().hasCards()) { - Card card = controller.getLibrary().removeFromTop(game); + if (controller != null) { + CardsImpl toReveal = new CardsImpl(); + Card nonLandCard = null; + for (Card card : controller.getLibrary().getCards(game)) { toReveal.add(card); if (!card.isLand() && card.getConvertedManaCost() < 4) { nonLandCard = card; + break; } } - // reveal cards - if (!toReveal.isEmpty()) { - controller.revealCards(sourceObject.getIdName(), toReveal, game); - } + controller.revealCards(source, toReveal, game); if (nonLandCard != null && controller.chooseUse(outcome, "Cast " + nonLandCard.getLogName() + "without paying its mana cost?", source, game)) { controller.cast(nonLandCard.getSpellAbility(), game, true); toReveal.remove(nonLandCard); diff --git a/Mage.Sets/src/mage/cards/t/TrepanationBlade.java b/Mage.Sets/src/mage/cards/t/TrepanationBlade.java index dad9896a3dc..40079a8cd1e 100644 --- a/Mage.Sets/src/mage/cards/t/TrepanationBlade.java +++ b/Mage.Sets/src/mage/cards/t/TrepanationBlade.java @@ -29,26 +29,25 @@ package mage.cards.t; import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.Mode; import mage.abilities.common.AttacksAttachedTriggeredAbility; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.abilities.keyword.EquipAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.cards.CardsImpl; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; -import mage.constants.Layer; import mage.constants.Outcome; -import mage.constants.SubLayer; +import mage.constants.SubType; import mage.constants.Zone; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; +import mage.target.targetpointer.FixedTarget; /** * @@ -57,14 +56,13 @@ import mage.players.Player; public class TrepanationBlade extends CardImpl { public TrepanationBlade(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); this.subtype.add(SubType.EQUIPMENT); // Whenever equipped creature attacks, defending player reveals cards from the top of their library until he or she reveals a land card. // The creature gets +1/+0 until end of turn for each card revealed this way. That player puts the revealed cards into their graveyard. - Ability ability = new AttacksAttachedTriggeredAbility(new TrepanationBladeDiscardEffect()); - ability.addEffect(new TrepanationBladeBoostEffect()); - this.addAbility(ability); + this.addAbility(new AttacksAttachedTriggeredAbility(new TrepanationBladeDiscardEffect())); + // Equip {2} this.addAbility(new EquipAbility(Outcome.BoostCreature, new GenericManaCost(2))); } @@ -104,69 +102,26 @@ class TrepanationBladeDiscardEffect extends OneShotEffect { return false; } UUID defenderId = game.getCombat().getDefenderId(creature.getId()); - Player player = game.getPlayer(defenderId); - if (player == null) { + Player defendingPlayer = game.getPlayer(defenderId); + if (defendingPlayer == null) { return false; } - CardsImpl cards = new CardsImpl(); - boolean landFound = false; - while (player.getLibrary().hasCards() && !landFound) { - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - if (card.isLand()) { - landFound = true; - } + for (Card card : defendingPlayer.getLibrary().getCards(game)) { + cards.add(card); + if (card.isLand()) { + break; } } - player.moveCards(cards, Zone.GRAVEYARD, source, game); + defendingPlayer.revealCards(equipment.getName(), cards, game); + defendingPlayer.moveCards(cards, Zone.GRAVEYARD, source, game); if (!cards.isEmpty()) { - player.revealCards(equipment.getName(), cards, game); - game.getState().setValue(source.getSourceId().toString() + "_TrepanationBlade", cards.size()); - return true; + ContinuousEffect effect = new BoostTargetEffect(cards.size(), 0, Duration.EndOfTurn); + effect.setTargetPointer(new FixedTarget(creature, game)); + game.addEffect(effect, source); } + return true; } - - game.getState().setValue(source.getSourceId().toString() + "_TrepanationBlade", null); - return false; - } - - @Override - public String getText(Mode mode) { - return super.getText(mode); //To change body of overridden methods use File | Settings | File Templates. - } -} - -class TrepanationBladeBoostEffect extends ContinuousEffectImpl { - - public TrepanationBladeBoostEffect() { - super(Duration.EndOfTurn, Layer.PTChangingEffects_7, SubLayer.ModifyPT_7c, Outcome.BoostCreature); - staticText = null; - } - - public TrepanationBladeBoostEffect(final TrepanationBladeBoostEffect effect) { - super(effect); - } - - @Override - public TrepanationBladeBoostEffect copy() { - return new TrepanationBladeBoostEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Integer amount = (Integer) game.getState().getValue(source.getSourceId().toString() + "_TrepanationBlade"); - - Permanent equipment = game.getPermanent(source.getSourceId()); - if (amount != null && amount > 0 && equipment != null && equipment.getAttachedTo() != null) { - Permanent creature = game.getPermanent(equipment.getAttachedTo()); - if (creature != null) { - creature.addPower(amount); - return true; - } - } - return false; } } diff --git a/Mage.Sets/src/mage/cards/t/TunnelVision.java b/Mage.Sets/src/mage/cards/t/TunnelVision.java index d67f374179b..0c603e99bef 100644 --- a/Mage.Sets/src/mage/cards/t/TunnelVision.java +++ b/Mage.Sets/src/mage/cards/t/TunnelVision.java @@ -27,10 +27,7 @@ */ package mage.cards.t; -import java.util.HashSet; -import java.util.Set; import java.util.UUID; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.NameACardEffect; @@ -91,41 +88,29 @@ class TunnelVisionEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - MageObject sourceObject = game.getObject(source.getSourceId()); Player targetPlayer = game.getPlayer(getTargetPointer().getFirst(game, source)); String cardName = (String) game.getState().getValue(source.getSourceId().toString() + NameACardEffect.INFO_KEY); - if (sourceObject == null || targetPlayer == null || cardName == null || cardName.isEmpty()) { + if (targetPlayer == null || cardName == null || cardName.isEmpty()) { return false; } Cards cardsToReveal = new CardsImpl(); - Set cardsToBury = new HashSet<>(); Card namedCard = null; - // reveal until named card found - // if named card found, put all revealed cards in grave and put named card on top of library - // if named card not found, shuffle library - boolean namedCardFound = false; - while (targetPlayer.getLibrary().hasCards()) { - Card card = targetPlayer.getLibrary().removeFromTop(game); - if (card != null) { - cardsToReveal.add(card); - if (card.getName().equals(cardName)) { - namedCardFound = true; - namedCard = card; - break; - } else { - cardsToBury.add(card); - } + for (Card card : targetPlayer.getLibrary().getCards(game)) { + cardsToReveal.add(card); + if (card.getName().equals(cardName)) { + namedCard = card; + break; } } - targetPlayer.revealCards(sourceObject.getIdName(), cardsToReveal, game); - if (namedCardFound) { - targetPlayer.moveCards(cardsToBury, Zone.GRAVEYARD, source, game); - targetPlayer.moveCards(namedCard, Zone.LIBRARY, source, game); + targetPlayer.revealCards(source, cardsToReveal, game); + if (namedCard != null) { + cardsToReveal.remove(namedCard); + targetPlayer.moveCards(cardsToReveal, Zone.GRAVEYARD, source, game); + targetPlayer.putCardsOnTopOfLibrary(new CardsImpl(namedCard), game, source, true); } else { - targetPlayer.getLibrary().addAll(cardsToBury, game); targetPlayer.shuffleLibrary(source, game); } return true; diff --git a/Mage.Sets/src/mage/cards/u/UlamogTheCeaselessHunger.java b/Mage.Sets/src/mage/cards/u/UlamogTheCeaselessHunger.java index 3d57a531d62..d6e75a5b58e 100644 --- a/Mage.Sets/src/mage/cards/u/UlamogTheCeaselessHunger.java +++ b/Mage.Sets/src/mage/cards/u/UlamogTheCeaselessHunger.java @@ -35,7 +35,6 @@ import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.ExileTargetEffect; import mage.abilities.keyword.IndestructibleAbility; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -60,7 +59,7 @@ import mage.target.targetpointer.FixedTarget; public class UlamogTheCeaselessHunger extends CardImpl { public UlamogTheCeaselessHunger(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{10}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{10}"); addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.ELDRAZI); this.power = new MageInt(10); @@ -156,7 +155,7 @@ class UlamogAttackTriggeredAbility extends TriggeredAbilityImpl { @Override public String getRule() { - return new StringBuilder("Whenever {this} attacks, ").append(super.getRule()).toString(); + return "Whenever {this} attacks, " + super.getRule(); } } @@ -180,13 +179,7 @@ class UlamogExileLibraryEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player defender = game.getPlayer(targetPointer.getFirst(game, source)); if (defender != null) { - int count = Math.min(defender.getLibrary().size(), 20); - for (int i = 0; i < count; i++) { - Card card = defender.getLibrary().removeFromTop(game); - if (card != null) { - card.moveToExile(null, null, source.getSourceId(), game); - } - } + defender.moveCards(defender.getLibrary().getTopCards(game, 20), Zone.EXILED, source, game); return true; } return false; diff --git a/Mage.Sets/src/mage/cards/u/UndercityInformer.java b/Mage.Sets/src/mage/cards/u/UndercityInformer.java index 127e1c14d81..f822c8fadd8 100644 --- a/Mage.Sets/src/mage/cards/u/UndercityInformer.java +++ b/Mage.Sets/src/mage/cards/u/UndercityInformer.java @@ -104,18 +104,14 @@ class UndercityInformerEffect extends OneShotEffect { if (player == null) { return false; } - Cards cards = new CardsImpl(); - while (player.getLibrary().hasCards()) { - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - if (card.isLand()) { - break; - } + for (Card card : player.getLibrary().getCards(game)) { + cards.add(card); + if (card.isLand()) { + break; } } - player.revealCards("Undercity Informer", cards, game); + player.revealCards(source, cards, game); player.moveCards(cards, Zone.GRAVEYARD, source, game); return true; } diff --git a/Mage.Sets/src/mage/cards/u/UndyingFlames.java b/Mage.Sets/src/mage/cards/u/UndyingFlames.java index 69508a43672..f3ed2782377 100644 --- a/Mage.Sets/src/mage/cards/u/UndyingFlames.java +++ b/Mage.Sets/src/mage/cards/u/UndyingFlames.java @@ -30,6 +30,7 @@ package mage.cards.u; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.EpicEffect; import mage.cards.Card; import mage.cards.CardImpl; @@ -38,7 +39,6 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; import mage.game.Game; -import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetAnyTarget; @@ -50,8 +50,7 @@ import mage.target.common.TargetAnyTarget; public class UndyingFlames extends CardImpl { public UndyingFlames(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{4}{R}{R}"); - + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{R}{R}"); // Exile cards from the top of your library until you exile a nonland card. Undying Flames deals damage to any target equal to that card's converted mana cost. this.getSpellAbility().addEffect(new UndyingFlamesEffect()); @@ -85,36 +84,22 @@ class UndyingFlamesEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - boolean applied = false; - Player you = game.getPlayer(source.getControllerId()); - Card sourceCard = game.getCard(source.getSourceId()); - while (you != null && sourceCard != null - && you.getLibrary().hasCards() && you.canRespond()) { - Card card = you.getLibrary().removeFromTop(game); - if (card != null) { - you.moveCardToExileWithInfo(card, null, null, source.getSourceId(), game, Zone.LIBRARY, true); - if (!card.isLand()) { - int damage = card.getConvertedManaCost(); - if (damage > 0) { - Permanent creature = game.getPermanent(this.getTargetPointer().getFirst(game, source)); - if (creature != null) { - creature.damage(damage, source.getSourceId(), game, false, true); - game.informPlayers(new StringBuilder(sourceCard.getName()).append(" deals ").append(damage).append(" damage to ").append(creature.getName()).toString()); - applied = true; - break; - } - Player player = game.getPlayer(this.getTargetPointer().getFirst(game, source)); - if (player != null) { - player.damage(card.getConvertedManaCost(), source.getSourceId(), game, false, true); - game.informPlayers(new StringBuilder(sourceCard.getName()).append(" deals ").append(damage).append(" damage to ").append(player.getLogName()).toString()); - applied = true; - break; - } + + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + while (controller.getLibrary().hasCards() && controller.isInGame()) { + Card card = controller.getLibrary().getFromTop(game); + if (card != null) { + controller.moveCards(card, Zone.LIBRARY, source, game); + if (!card.isLand()) { + new DamageTargetEffect(card.getConvertedManaCost()).apply(game, source); + break; } } } + return true; } - return applied; + return false; } @Override diff --git a/Mage.Sets/src/mage/cards/u/UnexpectedlyAbsent.java b/Mage.Sets/src/mage/cards/u/UnexpectedlyAbsent.java index 8ad40442cb8..a02769e819e 100644 --- a/Mage.Sets/src/mage/cards/u/UnexpectedlyAbsent.java +++ b/Mage.Sets/src/mage/cards/u/UnexpectedlyAbsent.java @@ -27,22 +27,14 @@ */ package mage.cards.u; -import java.util.Deque; -import java.util.LinkedList; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.Cards; -import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Outcome; -import mage.constants.Zone; -import mage.filter.FilterPermanent; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; @@ -54,18 +46,12 @@ import mage.target.TargetPermanent; */ public class UnexpectedlyAbsent extends CardImpl { - private static final FilterPermanent filter = new FilterPermanent("nonland permanent"); - static { - filter.add(Predicates.not(new CardTypePredicate(CardType.LAND))); - } - public UnexpectedlyAbsent(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{X}{W}{W}"); - + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{W}{W}"); // Put target nonland permanent into its owner's library just beneath the top X cards of that library. this.getSpellAbility().addEffect(new UnexpectedlyAbsentEffect()); - this.getSpellAbility().addTarget(new TargetPermanent(filter)); + this.getSpellAbility().addTarget(new TargetPermanent(StaticFilters.FILTER_PERMANENT_NON_LAND)); } @@ -101,31 +87,8 @@ class UnexpectedlyAbsentEffect extends OneShotEffect { if (controller != null) { Permanent permanent = game.getPermanent(this.getTargetPointer().getFirst(game, source)); if (permanent != null) { - Player owner = game.getPlayer(permanent.getOwnerId()); - if (owner != null) { - int xValue = Math.min(source.getManaCostsToPay().getX(), owner.getLibrary().size()); - Cards cards = new CardsImpl(); - Deque cardIds = new LinkedList<>(); - for (int i = 0; i < xValue; i++) { - Card card = owner.getLibrary().removeFromTop(game); - cards.add(card); - cardIds.push(card.getId()); - } - // return cards back to library - game.informPlayers(new StringBuilder(controller.getLogName()) - .append(" puts ").append(permanent.getName()) - .append(" beneath the top ").append(xValue) - .append(" cards of ").append(owner.getLogName()).append("'s library").toString()); - permanent.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); - while(!cardIds.isEmpty()) { - UUID cardId = cardIds.poll(); - Card card = cards.get(cardId, game); - if (card != null) { - card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); - } - } - return true; - } + controller.putCardOnTopXOfLibrary(permanent, game, source, source.getManaCostsToPay().getX()); + return true; } } diff --git a/Mage.Sets/src/mage/cards/v/VexingArcanix.java b/Mage.Sets/src/mage/cards/v/VexingArcanix.java index 3d62aeffdce..4181d5c85c0 100644 --- a/Mage.Sets/src/mage/cards/v/VexingArcanix.java +++ b/Mage.Sets/src/mage/cards/v/VexingArcanix.java @@ -86,29 +86,25 @@ class VexingArcanixEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { MageObject sourceObject = source.getSourceObject(game); - Player controller = game.getPlayer(source.getControllerId()); Player player = game.getPlayer(targetPointer.getFirst(game, source)); - if (controller != null && sourceObject != null && player != null) { - - if (player.getLibrary().hasCards()) { - Choice cardChoice = new ChoiceImpl(); - cardChoice.setChoices(CardRepository.instance.getNames()); - cardChoice.setMessage("Name a card"); - if (!player.choose(Outcome.DrawCard, cardChoice, game)) { - return false; - } - String cardName = cardChoice.getChoice(); - game.informPlayers(sourceObject.getLogName() + ", player: " + player.getLogName() + ", named: [" + cardName + ']'); - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - Cards cards = new CardsImpl(card); - player.revealCards(sourceObject.getIdName(), cards, game); - if (card.getName().equals(cardName)) { - player.moveCards(cards, Zone.HAND, source, game); - } else { - player.moveCards(cards, Zone.GRAVEYARD, source, game); - player.damage(2, source.getSourceId(), game, false, true); - } + if (sourceObject != null && player != null) { + Choice cardChoice = new ChoiceImpl(); + cardChoice.setChoices(CardRepository.instance.getNames()); + cardChoice.setMessage("Name a card"); + if (!player.choose(Outcome.DrawCard, cardChoice, game)) { + return false; + } + String cardName = cardChoice.getChoice(); + game.informPlayers(sourceObject.getLogName() + ", player: " + player.getLogName() + ", named: [" + cardName + ']'); + Card card = player.getLibrary().getFromTop(game); + if (card != null) { + Cards cards = new CardsImpl(card); + player.revealCards(sourceObject.getIdName(), cards, game); + if (card.getName().equals(cardName)) { + player.moveCards(cards, Zone.HAND, source, game); + } else { + player.moveCards(cards, Zone.GRAVEYARD, source, game); + player.damage(2, source.getSourceId(), game, false, true); } } return true; diff --git a/Mage.Sets/src/mage/cards/w/WorldlyCounsel.java b/Mage.Sets/src/mage/cards/w/WorldlyCounsel.java index 634748da29c..0e9ad0bd045 100644 --- a/Mage.Sets/src/mage/cards/w/WorldlyCounsel.java +++ b/Mage.Sets/src/mage/cards/w/WorldlyCounsel.java @@ -51,8 +51,7 @@ import mage.target.TargetCard; public class WorldlyCounsel extends CardImpl { public WorldlyCounsel(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{1}{U}"); - + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{U}"); // Domain - Look at the top X cards of your library, where X is the number of basic land types among lands you control. Put one of those cards into your hand and the rest on the bottom of your library in any order. this.getSpellAbility().addEffect(new WorldlyCounselEffect()); @@ -86,40 +85,30 @@ class WorldlyCounselEffect 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; } - Cards cards = new CardsImpl(); - int count = (new DomainValue()).calculate(game, source, this); - count = Math.min(player.getLibrary().size(), count); - for (int i = 0; i < count; i++) { - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - } - } - player.lookAtCards("Worldly Counsel", cards, game); + Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, (new DomainValue()).calculate(game, source, this))); + controller.lookAtCards(source, null, cards, game); if (!cards.isEmpty()) { if (cards.size() == 1) { - Card card = cards.getRandom(game); - cards.remove(card); - card.moveToZone(Zone.HAND, source.getSourceId(), game, false); - return true; + controller.moveCards(cards, Zone.HAND, source, game); } else { TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCard("card to put into your hand")); - if (player.choose(Outcome.DrawCard, cards, target, game)) { + if (controller.choose(Outcome.DrawCard, cards, target, game)) { Card card = cards.get(target.getFirstTarget(), game); if (card != null) { cards.remove(card); - card.moveToZone(Zone.HAND, source.getSourceId(), game, false); + controller.moveCards(card, Zone.HAND, source, game); } } + controller.putCardsOnBottomOfLibrary(cards, game, source, true); } } - player.putCardsOnBottomOfLibrary(cards, game, source, true); + return true; } } diff --git a/Mage.Sets/src/mage/cards/w/WriteIntoBeing.java b/Mage.Sets/src/mage/cards/w/WriteIntoBeing.java index 24cd65f28a3..60732a32fec 100644 --- a/Mage.Sets/src/mage/cards/w/WriteIntoBeing.java +++ b/Mage.Sets/src/mage/cards/w/WriteIntoBeing.java @@ -52,7 +52,7 @@ import mage.target.TargetCard; public class WriteIntoBeing extends CardImpl { public WriteIntoBeing(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{2}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{U}"); // Look at the top two cards of your library. Manifest one of those cards, then put the other on the top or bottom of your library. this.getSpellAbility().addEffect(new WriteIntoBeingEffect()); @@ -72,7 +72,8 @@ class WriteIntoBeingEffect extends OneShotEffect { public WriteIntoBeingEffect() { super(Outcome.PutCreatureInPlay); - this.staticText = "Look at the top two cards of your library. Manifest one of those cards, then put the other on the top or bottom of your library. (To manifest a card, put it onto the battlefield face down as a 2/2 creature. Turn it face up any time for its mana cost if it's a creature card.)"; + this.staticText = "Look at the top two cards of your library. Manifest one of those cards, then put the other on the top or bottom of your library. " + + "(To manifest a card, put it onto the battlefield face down as a 2/2 creature. Turn it face up any time for its mana cost if it's a creature card.)"; } public WriteIntoBeingEffect(final WriteIntoBeingEffect effect) { @@ -89,9 +90,8 @@ class WriteIntoBeingEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); MageObject sourceObject = game.getObject(source.getSourceId()); if (sourceObject != null && controller != null) { - Cards cards = new CardsImpl(); - cards.addAll(controller.getLibrary().getTopCards(game, 2)); - controller.lookAtCards(sourceObject.getName(), cards, game); + Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, 2)); + controller.lookAtCards(source, null, cards, game); Card cardToManifest = null; if (cards.size() > 1) { TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCard("card to manifest")); diff --git a/Mage/src/main/java/mage/abilities/effects/common/LookLibraryAndPickControllerEffect.java b/Mage/src/main/java/mage/abilities/effects/common/LookLibraryAndPickControllerEffect.java index ef9cb95b64d..d27e8f43208 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/LookLibraryAndPickControllerEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/LookLibraryAndPickControllerEffect.java @@ -35,7 +35,6 @@ import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.StaticValue; -import mage.cards.Card; import mage.cards.Cards; import mage.cards.CardsImpl; import mage.constants.Outcome; @@ -150,6 +149,7 @@ public class LookLibraryAndPickControllerEffect extends LookLibraryControllerEff FilterCard pickFilter, Zone targetZoneLookedCards, boolean putOnTop, boolean reveal, boolean upTo, Zone targetZonePickedCards, boolean optional) { + this(numberOfCards, mayShuffleAfter, numberToPick, pickFilter, targetZoneLookedCards, putOnTop, reveal, upTo, targetZonePickedCards, optional, true, true); @@ -207,16 +207,10 @@ public class LookLibraryAndPickControllerEffect extends LookLibraryControllerEff } @Override - protected void cardLooked(Card card, Game game, Ability source) { - if (numberToPick.calculate(game, source, this) > 0 && filter.match(card, game)) { - ++foundCardsToPick; - } - } - - @Override - protected void actionWithSelectedCards(Cards cards, Game game, Ability source, String windowName) { + protected void actionWithSelectedCards(Cards cards, Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); - if (player != null && foundCardsToPick > 0) { + if (player != null && numberToPick.calculate(game, source, this) > 0 + && cards.count(filter, source.getSourceId(), source.getControllerId(), game) > 0) { if (!optional || player.chooseUse(Outcome.DrawCard, getMayText(), source, game)) { FilterCard pickFilter = filter.copy(); pickFilter.setMessage(getPickText()); @@ -231,7 +225,7 @@ public class LookLibraryAndPickControllerEffect extends LookLibraryControllerEff player.moveCards(pickedCards.getCards(game), targetPickedCards, source, game); } if (revealPickedCards) { - player.revealCards(windowName, pickedCards, game); + player.revealCards(source, pickedCards, game); } } @@ -346,7 +340,14 @@ public class LookLibraryAndPickControllerEffect extends LookLibraryControllerEff } sb.append(" order"); } else if (targetZoneLookedCards == Zone.GRAVEYARD) { - sb.append(" and the other into your graveyard"); + sb.append(" and the"); + if (numberOfCards instanceof StaticValue && numberToPick instanceof StaticValue + && ((StaticValue) numberToPick).getValue() + 1 == ((StaticValue) numberOfCards).getValue()) { + sb.append(" other"); + } else { + sb.append(" rest"); + } + sb.append(" into your graveyard"); } } // get text frame from super class and inject action text diff --git a/Mage/src/main/java/mage/abilities/effects/common/LookLibraryControllerEffect.java b/Mage/src/main/java/mage/abilities/effects/common/LookLibraryControllerEffect.java index 93f260874f6..105f7b7151e 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/LookLibraryControllerEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/LookLibraryControllerEffect.java @@ -29,18 +29,15 @@ package mage.abilities.effects.common; import mage.abilities.Ability; import mage.abilities.Mode; -import mage.abilities.SpellAbility; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; import mage.cards.Cards; import mage.cards.CardsImpl; import mage.constants.Outcome; import mage.constants.Zone; import mage.game.Game; -import mage.game.permanent.Permanent; import mage.players.Player; import mage.util.CardUtil; @@ -105,46 +102,25 @@ public class LookLibraryControllerEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - String windowName = "Reveal"; - - if (source instanceof SpellAbility) { - Card sourceCard = game.getCard(source.getSourceId()); - if (sourceCard != null) { - windowName = sourceCard.getIdName(); - } - } else { - Permanent sourcePermanent = game.getPermanent(source.getSourceId()); - if (sourcePermanent != null) { - windowName = sourcePermanent.getIdName(); - } - } - - Player player = game.getPlayer(source.getControllerId()); - if (player == null) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { return false; } // take cards from library and look at them - boolean topCardRevealed = player.isTopCardRevealed(); - player.setTopCardRevealed(false); - Cards cards = new CardsImpl(); - int count = Math.min(player.getLibrary().size(), this.numberOfCards.calculate(game, source, this)); - for (int i = 0; i < count; i++) { - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - this.cardLooked(card, game, source); - } - } - player.lookAtCards(windowName, cards, game); + boolean topCardRevealed = controller.isTopCardRevealed(); + controller.setTopCardRevealed(false); + Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, this.numberOfCards.calculate(game, source, this))); - this.actionWithSelectedCards(cards, game, source, windowName); + controller.lookAtCards(source, null, cards, game); - this.putCardsBack(source, player, cards, game); + this.actionWithSelectedCards(cards, game, source); - player.setTopCardRevealed(topCardRevealed); + this.putCardsBack(source, controller, cards, game); - this.mayShuffle(player, source, game); + controller.setTopCardRevealed(topCardRevealed); + + this.mayShuffle(controller, source, game); return true; } @@ -158,10 +134,7 @@ public class LookLibraryControllerEffect extends OneShotEffect { return this; } - protected void cardLooked(Card card, Game game, Ability source) { - } - - protected void actionWithSelectedCards(Cards cards, Game game, Ability source, String windowName) { + protected void actionWithSelectedCards(Cards cards, Game game, Ability source) { } /** diff --git a/Mage/src/main/java/mage/abilities/effects/common/combat/CantBeBlockedByAllSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/combat/CantBeBlockedByAllSourceEffect.java index 442a7744264..59f0e2aef0a 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/combat/CantBeBlockedByAllSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/combat/CantBeBlockedByAllSourceEffect.java @@ -58,7 +58,7 @@ public class CantBeBlockedByAllSourceEffect extends RestrictionEffect { @Override public boolean applies(Permanent permanent, Ability source, Game game) { - return source.getSourceId().equals(permanent.getId()); + return permanent.equals(source.getSourcePermanentIfItStillExists(game)); } @Override diff --git a/Mage/src/main/java/mage/filter/StaticFilters.java b/Mage/src/main/java/mage/filter/StaticFilters.java index 6e30403677e..032ba232680 100644 --- a/Mage/src/main/java/mage/filter/StaticFilters.java +++ b/Mage/src/main/java/mage/filter/StaticFilters.java @@ -109,6 +109,13 @@ public final class StaticFilters { static { FILTER_PERMANENT.setLockedFilter(true); } + + public static final FilterPermanent FILTER_PERMANENT_ARTIFACT_AN = new FilterArtifactPermanent("an artifact"); + + static { + FILTER_PERMANENT_ARTIFACT_AN.setLockedFilter(true); + } + public static final FilterArtifactOrEnchantmentPermanent FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT = new FilterArtifactOrEnchantmentPermanent(); static { From d6ff7f851d50077a4714b1937e86ff5a6c737591 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 10 May 2018 20:40:52 -0400 Subject: [PATCH 141/158] updated Brawl banlist, color identity rules, and 1v1 starting life total (closes #4931) --- .../src/mage/deck/Brawl.java | 22 +++++++++++++------ .../src/mage/game/BrawlDuelMatch.java | 2 +- 2 files changed, 16 insertions(+), 8 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 227f788d4fa..846221fd23a 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,13 +74,9 @@ public class Brawl extends Constructed { } } } - banned.add("Attune with Aether"); // since 2018-01-15 - banned.add("Aetherworks Marvel"); - banned.add("Felidar Guardian"); - 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("Baral, Chief of Compliance"); banned.add("Smuggler's Copter"); + banned.add("Sorcerers' Spyglass"); } private static boolean isFallBlock(ExpansionSet set) { @@ -155,8 +151,20 @@ public class Brawl extends Constructed { } } } + + List basicsInDeck = new ArrayList<>(); + if (colorIdentity.isColorless()) { + for (Card card : deck.getCards()) { + if (basicLandNames.contains(card.getName())) { + basicsInDeck.add(card.getName()); + } + } + } for (Card card : deck.getCards()) { - if (!cardHasValidColor(colorIdentity, card)) { + if (!cardHasValidColor(colorIdentity, card) + && !(colorIdentity.isColorless() + && basicsInDeck.size() == 1 + && basicsInDeck.contains(card.getName()))) { invalid.put(card.getName(), "Invalid color (" + colorIdentity.toString() + ')'); valid = false; } diff --git a/Mage.Server.Plugins/Mage.Game.BrawlDuel/src/mage/game/BrawlDuelMatch.java b/Mage.Server.Plugins/Mage.Game.BrawlDuel/src/mage/game/BrawlDuelMatch.java index 1fee95c5e2c..f24fdd1259a 100644 --- a/Mage.Server.Plugins/Mage.Game.BrawlDuel/src/mage/game/BrawlDuelMatch.java +++ b/Mage.Server.Plugins/Mage.Game.BrawlDuel/src/mage/game/BrawlDuelMatch.java @@ -42,7 +42,7 @@ public class BrawlDuelMatch extends MatchImpl { @Override public void startGame() throws GameException { - int startLife = 30; + int startLife = 20; boolean alsoHand = true; BrawlDuel game = new BrawlDuel(options.getAttackOption(), options.getRange(), options.getFreeMulligans(), startLife); game.setCheckCommanderDamage(false); From 25b10c4d671d08e7e0e25b5f94dd759c1314d54b Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Fri, 11 May 2018 11:24:50 -0400 Subject: [PATCH 142/158] fixed Tyrant's Familiar not targeting correctly --- .../src/mage/cards/t/TyrantsFamiliar.java | 33 +++++++------------ 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/Mage.Sets/src/mage/cards/t/TyrantsFamiliar.java b/Mage.Sets/src/mage/cards/t/TyrantsFamiliar.java index 41f1a0a6419..ef98077cfce 100644 --- a/Mage.Sets/src/mage/cards/t/TyrantsFamiliar.java +++ b/Mage.Sets/src/mage/cards/t/TyrantsFamiliar.java @@ -41,10 +41,10 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.permanent.ControllerIdPredicate; -import mage.game.Game; -import mage.target.common.TargetCreaturePermanent; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.predicate.permanent.DefendingPlayerControlsPredicate; +import mage.target.TargetPermanent; /** * @@ -52,10 +52,15 @@ import mage.target.common.TargetCreaturePermanent; */ public class TyrantsFamiliar extends CardImpl { - private final UUID originalId; + private static final FilterPermanent filter = new FilterPermanent("creature defending player controls"); + + static { + filter.add(new CardTypePredicate(CardType.CREATURE)); + filter.add(new DefendingPlayerControlsPredicate()); + } public TyrantsFamiliar(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{5}{R}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{R}{R}"); this.subtype.add(SubType.DRAGON); this.power = new MageInt(5); @@ -69,32 +74,18 @@ public class TyrantsFamiliar extends CardImpl { // Lieutenant - As long as you control your commander, Tyrant's Familiar gets +2/+2 and has "Whenever Tyrant's Familiar attacks, it deals 7 damage to target creature defending player controls." Ability gainedAbility = new AttacksTriggeredAbility(new DamageTargetEffect(7, "it"), false); - gainedAbility.addTarget(new TargetCreaturePermanent()); + gainedAbility.addTarget(new TargetPermanent(filter)); ContinuousEffect effect = new GainAbilitySourceEffect(gainedAbility); effect.setText("and has \"Whenever {this} attacks, it deals 7 damage to target creature defending player controls\""); - originalId = gainedAbility.getOriginalId(); this.addAbility(new LieutenantAbility(effect)); } public TyrantsFamiliar(final TyrantsFamiliar card) { super(card); - this.originalId = card.originalId; } @Override public TyrantsFamiliar copy() { return new TyrantsFamiliar(this); } - - @Override - public void adjustTargets(Ability ability, Game game) { - if (ability.getOriginalId().equals(originalId)) { - ability.getTargets().clear(); - FilterCreaturePermanent filter = new FilterCreaturePermanent("creature defending player controls"); - UUID defenderId = game.getCombat().getDefenderId(ability.getSourceId()); - filter.add(new ControllerIdPredicate(defenderId)); - TargetCreaturePermanent target = new TargetCreaturePermanent(filter); - ability.addTarget(target); - } - } } From 321f82a3810369751ae41c3c6e618fad6b2ea518 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Fri, 11 May 2018 21:58:45 +0400 Subject: [PATCH 143/158] Refactoring: replace custom creature tokens with basic class (9 cards) --- Mage.Sets/src/mage/cards/a/AngelsTomb.java | 36 +++++----------- .../src/mage/cards/a/AtarkaMonument.java | 37 +++++----------- .../src/mage/cards/a/AzoriusKeyrune.java | 33 +++++--------- .../src/mage/cards/b/BlinkmothNexus.java | 36 ++++++---------- Mage.Sets/src/mage/cards/b/BorosKeyrune.java | 34 +++++---------- .../src/mage/cards/c/CelestialColonnade.java | 43 +++++++------------ Mage.Sets/src/mage/cards/c/ChimericEgg.java | 33 ++++---------- Mage.Sets/src/mage/cards/c/ChimericIdol.java | 32 ++++---------- Mage.Sets/src/mage/cards/c/ChimericMass.java | 32 +++++--------- .../BecomesCreatureSourceEffect.java | 32 ++++++++------ 10 files changed, 116 insertions(+), 232 deletions(-) diff --git a/Mage.Sets/src/mage/cards/a/AngelsTomb.java b/Mage.Sets/src/mage/cards/a/AngelsTomb.java index 9cfa070e560..f3be463600b 100644 --- a/Mage.Sets/src/mage/cards/a/AngelsTomb.java +++ b/Mage.Sets/src/mage/cards/a/AngelsTomb.java @@ -28,6 +28,7 @@ package mage.cards.a; import java.util.UUID; + import mage.MageInt; import mage.abilities.common.CreatureEntersBattlefieldTriggeredAbility; import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect; @@ -39,18 +40,23 @@ import mage.constants.Duration; import mage.constants.SubType; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; /** - * * @author Loki */ public class AngelsTomb extends CardImpl { public AngelsTomb(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); // Whenever a creature enters the battlefield under your control, you may have Angel's Tomb become a 3/3 white Angel artifact creature with flying until end of turn. - this.addAbility(new CreatureEntersBattlefieldTriggeredAbility(new BecomesCreatureSourceEffect(new AngelTombToken(), "", Duration.EndOfTurn), true)); + this.addAbility(new CreatureEntersBattlefieldTriggeredAbility(new BecomesCreatureSourceEffect( + new CreatureToken(3, 3, "3/3 white Angel artifact creature with flying") + .withColor("W") + .withSubType(SubType.ANGEL) + .withAbility(FlyingAbility.getInstance()), + "", Duration.EndOfTurn), true)); } public AngelsTomb(final AngelsTomb card) { @@ -61,26 +67,4 @@ public class AngelsTomb extends CardImpl { public AngelsTomb copy() { return new AngelsTomb(this); } -} - -class AngelTombToken extends TokenImpl { - - public AngelTombToken() { - super("", "3/3 white Angel artifact creature with flying"); - cardType.add(CardType.ARTIFACT); - cardType.add(CardType.CREATURE); - color.setWhite(true); - - subtype.add(SubType.ANGEL); - power = new MageInt(3); - toughness = new MageInt(3); - addAbility(FlyingAbility.getInstance()); - } - public AngelTombToken(final AngelTombToken token) { - super(token); - } - - public AngelTombToken copy() { - return new AngelTombToken(this); - } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/a/AtarkaMonument.java b/Mage.Sets/src/mage/cards/a/AtarkaMonument.java index 10f2d52cebb..6d35ee10a1d 100644 --- a/Mage.Sets/src/mage/cards/a/AtarkaMonument.java +++ b/Mage.Sets/src/mage/cards/a/AtarkaMonument.java @@ -28,6 +28,7 @@ package mage.cards.a; import java.util.UUID; + import mage.MageInt; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; @@ -43,23 +44,28 @@ import mage.constants.SubType; import mage.constants.Zone; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; /** - * * @author fireshoes */ public class AtarkaMonument extends CardImpl { public AtarkaMonument(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); // {T}: Add {R} or {G}. this.addAbility(new RedManaAbility()); this.addAbility(new GreenManaAbility()); - + // {4}{R}{G}: Atarka Monument becomes a 4/4 red and green Dragon artifact creature with flying until end of turn. - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureSourceEffect - (new AtarkaMonumentToken(), "", Duration.EndOfTurn), new ManaCostsImpl("{4}{R}{G}"))); + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureSourceEffect( + new CreatureToken(4, 4, "4/4 red and green Dragon artifact creature with flying") + .withColor("RG") + .withSubType(SubType.DRAGON) + .withType(CardType.ARTIFACT) + .withAbility(FlyingAbility.getInstance()), + "", Duration.EndOfTurn), new ManaCostsImpl("{4}{R}{G}"))); } public AtarkaMonument(final AtarkaMonument card) { @@ -70,25 +76,4 @@ public class AtarkaMonument extends CardImpl { public AtarkaMonument copy() { return new AtarkaMonument(this); } - - private static class AtarkaMonumentToken extends TokenImpl { - AtarkaMonumentToken() { - super("", "4/4 red and green Dragon artifact creature with flying"); - this.cardType.add(CardType.ARTIFACT); - this.cardType.add(CardType.CREATURE); - this.color.setRed(true); - this.color.setGreen(true); - this.subtype.add(SubType.DRAGON); - this.power = new MageInt(4); - this.toughness = new MageInt(4); - this.addAbility(FlyingAbility.getInstance()); - } - public AtarkaMonumentToken(final AtarkaMonumentToken token) { - super(token); - } - - public AtarkaMonumentToken copy() { - return new AtarkaMonumentToken(this); - } - } } diff --git a/Mage.Sets/src/mage/cards/a/AzoriusKeyrune.java b/Mage.Sets/src/mage/cards/a/AzoriusKeyrune.java index c2944228124..6338b5cf6ca 100644 --- a/Mage.Sets/src/mage/cards/a/AzoriusKeyrune.java +++ b/Mage.Sets/src/mage/cards/a/AzoriusKeyrune.java @@ -28,6 +28,7 @@ package mage.cards.a; import java.util.UUID; + import mage.MageInt; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; @@ -43,6 +44,7 @@ import mage.constants.SubType; import mage.constants.Zone; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; /** * @author LevelX2 @@ -50,14 +52,20 @@ import mage.game.permanent.token.Token; public class AzoriusKeyrune extends CardImpl { public AzoriusKeyrune(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); // {T}: Add {W} or {U}. this.addAbility(new WhiteManaAbility()); this.addAbility(new BlueManaAbility()); // {W}{U}: Azorius Keyrune becomes a 2/2 white and blue Bird artifact creature with flying until end of turn. - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureSourceEffect(new AzoriusKeyruneToken(), "", Duration.EndOfTurn), new ManaCostsImpl("{W}{U}"))); + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureSourceEffect( + new CreatureToken(2, 2, "2/2 white and blue Bird artifact creature with flying") + .withColor("WU") + .withSubType(SubType.BIRD) + .withType(CardType.ARTIFACT) + .withAbility(FlyingAbility.getInstance()), + "", Duration.EndOfTurn), new ManaCostsImpl("{W}{U}"))); } public AzoriusKeyrune(final AzoriusKeyrune card) { @@ -68,25 +76,4 @@ public class AzoriusKeyrune extends CardImpl { public AzoriusKeyrune copy() { return new AzoriusKeyrune(this); } - - private static class AzoriusKeyruneToken extends TokenImpl { - AzoriusKeyruneToken() { - super("", "2/2 white and blue Bird artifact creature with flying"); - cardType.add(CardType.ARTIFACT); - cardType.add(CardType.CREATURE); - color.setWhite(true); - color.setBlue(true); - this.subtype.add(SubType.BIRD); - power = new MageInt(2); - toughness = new MageInt(2); - this.addAbility(FlyingAbility.getInstance()); - } - public AzoriusKeyruneToken(final AzoriusKeyruneToken token) { - super(token); - } - - public AzoriusKeyruneToken copy() { - return new AzoriusKeyruneToken(this); - } - } } diff --git a/Mage.Sets/src/mage/cards/b/BlinkmothNexus.java b/Mage.Sets/src/mage/cards/b/BlinkmothNexus.java index 0a5aed5fed8..ddb504a800c 100644 --- a/Mage.Sets/src/mage/cards/b/BlinkmothNexus.java +++ b/Mage.Sets/src/mage/cards/b/BlinkmothNexus.java @@ -29,6 +29,7 @@ package mage.cards.b; import java.util.UUID; + import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -48,6 +49,7 @@ import mage.filter.FilterPermanent; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; import mage.target.TargetPermanent; /** @@ -62,14 +64,19 @@ public class BlinkmothNexus extends CardImpl { } public BlinkmothNexus(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.LAND},null); - + super(ownerId, setInfo, new CardType[]{CardType.LAND}, null); + // {T}: Add {C}to your mana pool. this.addAbility(new ColorlessManaAbility()); - + // {1}: Blinkmoth Nexus becomes a 1/1 Blinkmoth artifact creature with flying until end of turn. It's still a land. - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureSourceEffect(new BlinkmothNexusToken(), "land", Duration.EndOfTurn), new GenericManaCost(1))); - + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureSourceEffect( + new CreatureToken(1, 1, "1/1 Blinkmoth artifact creature with flying") + .withSubType(SubType.BLINKMOTH) + .withType(CardType.ARTIFACT) + .withAbility(FlyingAbility.getInstance()), + "land", Duration.EndOfTurn), new GenericManaCost(1))); + // {1}, {T}: Target Blinkmoth creature gets +1/+1 until end of turn. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(1, 1, Duration.EndOfTurn), new GenericManaCost(1)); ability.addCost(new TapSourceCost()); @@ -88,22 +95,3 @@ public class BlinkmothNexus extends CardImpl { } } - -class BlinkmothNexusToken extends TokenImpl { - public BlinkmothNexusToken() { - super("Blinkmoth", "1/1 Blinkmoth artifact creature with flying"); - cardType.add(CardType.ARTIFACT); - cardType.add(CardType.CREATURE); - this.subtype.add(SubType.BLINKMOTH); - power = new MageInt(1); - toughness = new MageInt(1); - this.addAbility(FlyingAbility.getInstance()); - } - public BlinkmothNexusToken(final BlinkmothNexusToken token) { - super(token); - } - - public BlinkmothNexusToken copy() { - return new BlinkmothNexusToken(this); - } -} diff --git a/Mage.Sets/src/mage/cards/b/BorosKeyrune.java b/Mage.Sets/src/mage/cards/b/BorosKeyrune.java index 8cb37bd545c..7d1a77dd836 100644 --- a/Mage.Sets/src/mage/cards/b/BorosKeyrune.java +++ b/Mage.Sets/src/mage/cards/b/BorosKeyrune.java @@ -28,6 +28,7 @@ package mage.cards.b; import java.util.UUID; + import mage.MageInt; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; @@ -43,22 +44,28 @@ import mage.constants.SubType; import mage.constants.Zone; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; /** - * * @author LevelX2 */ public class BorosKeyrune extends CardImpl { public BorosKeyrune(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); // {T}: Add {R} or {W}. this.addAbility(new RedManaAbility()); this.addAbility(new WhiteManaAbility()); // {R}{W}: Boros Keyrune becomes a 1/1 red and white Soldier artifact creature with double strike until end of turn. - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureSourceEffect(new BorosKeyruneToken(), "", Duration.EndOfTurn), new ManaCostsImpl("{R}{W}"))); + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureSourceEffect( + new CreatureToken(1, 1, "1/1 red and white Soldier artifact creature with double strike") + .withColor("RW") + .withSubType(SubType.SOLDIER) + .withType(CardType.ARTIFACT) + .withAbility(DoubleStrikeAbility.getInstance()), + "", Duration.EndOfTurn), new ManaCostsImpl("{R}{W}"))); } public BorosKeyrune(final BorosKeyrune card) { @@ -69,25 +76,4 @@ public class BorosKeyrune extends CardImpl { public BorosKeyrune copy() { return new BorosKeyrune(this); } - - private static class BorosKeyruneToken extends TokenImpl { - BorosKeyruneToken() { - super("Soldier", "1/1 red and white Soldier artifact creature with double strike"); - cardType.add(CardType.ARTIFACT); - cardType.add(CardType.CREATURE); - color.setRed(true); - color.setWhite(true); - subtype.add(SubType.SOLDIER); - power = new MageInt(1); - toughness = new MageInt(1); - this.addAbility(DoubleStrikeAbility.getInstance()); - } - public BorosKeyruneToken(final BorosKeyruneToken token) { - super(token); - } - - public BorosKeyruneToken copy() { - return new BorosKeyruneToken(this); - } - } } diff --git a/Mage.Sets/src/mage/cards/c/CelestialColonnade.java b/Mage.Sets/src/mage/cards/c/CelestialColonnade.java index 982ba8a0580..99b2a16486c 100644 --- a/Mage.Sets/src/mage/cards/c/CelestialColonnade.java +++ b/Mage.Sets/src/mage/cards/c/CelestialColonnade.java @@ -28,6 +28,7 @@ package mage.cards.c; import java.util.UUID; + import mage.MageInt; import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.common.SimpleActivatedAbility; @@ -45,20 +46,31 @@ import mage.constants.Duration; import mage.constants.Zone; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; /** - * * @author BetaSteward_at_googlemail.com */ public class CelestialColonnade extends CardImpl { public CelestialColonnade(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.LAND},null); + super(ownerId, setInfo, new CardType[]{CardType.LAND}, null); + + // Celestial Colonnade enters the battlefield tapped. this.addAbility(new EntersBattlefieldTappedAbility()); + + // {T}: Add {W} or {U] this.addAbility(new BlueManaAbility()); this.addAbility(new WhiteManaAbility()); - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureSourceEffect(new CelestialColonnadeToken(), "land", Duration.EndOfTurn), new ManaCostsImpl("{3}{W}{U}"))); + // {3}{W}{U}: Until end of turn, Celestial Colonnade becomes a 4/4 white and blue Elemental creature with flying and vigilance. It’s still a land. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureSourceEffect( + new CreatureToken(4, 4, "4/4 white and blue Elemental creature with flying and vigilance") + .withColor("WU") + .withSubType(SubType.ELEMENTAL) + .withAbility(FlyingAbility.getInstance()) + .withAbility(VigilanceAbility.getInstance()), + "land", Duration.EndOfTurn), new ManaCostsImpl("{3}{W}{U}"))); } public CelestialColonnade(final CelestialColonnade card) { @@ -70,27 +82,4 @@ public class CelestialColonnade extends CardImpl { return new CelestialColonnade(this); } -} - -class CelestialColonnadeToken extends TokenImpl { - - public CelestialColonnadeToken() { - super("", "4/4 white and blue Elemental creature with flying and vigilance"); - cardType.add(CardType.CREATURE); - subtype.add(SubType.ELEMENTAL); - color.setBlue(true); - color.setWhite(true); - power = new MageInt(4); - toughness = new MageInt(4); - addAbility(FlyingAbility.getInstance()); - addAbility(VigilanceAbility.getInstance()); - } - public CelestialColonnadeToken(final CelestialColonnadeToken token) { - super(token); - } - - public CelestialColonnadeToken copy() { - return new CelestialColonnadeToken(this); - } - -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/c/ChimericEgg.java b/Mage.Sets/src/mage/cards/c/ChimericEgg.java index 6430539440b..0630e258e3b 100644 --- a/Mage.Sets/src/mage/cards/c/ChimericEgg.java +++ b/Mage.Sets/src/mage/cards/c/ChimericEgg.java @@ -28,6 +28,7 @@ package mage.cards.c; import java.util.UUID; + import mage.MageInt; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SpellCastOpponentTriggeredAbility; @@ -48,11 +49,10 @@ import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; - +import mage.game.permanent.token.custom.CreatureToken; /** - * * @author Pete Rossi */ public class ChimericEgg extends CardImpl { @@ -65,13 +65,17 @@ public class ChimericEgg extends CardImpl { public ChimericEgg(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); - + // Whenever an opponent casts a nonartifact spell, put a charge counter on Chimeric Egg. this.addAbility(new SpellCastOpponentTriggeredAbility(new AddCountersSourceEffect(CounterType.CHARGE.createInstance()), nonArtifactFilter, false)); // Remove three charge counters from Chimeric Egg: Chimeric Egg becomes a 6/6 Construct artifact creature with trample until end of turn. - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureSourceEffect - (new ChimericEggToken(), "", Duration.EndOfTurn), new RemoveCountersSourceCost(new Counter(CounterType.CHARGE.getName(), 3)))); + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureSourceEffect( + new CreatureToken(6, 6, "6/6 Construct artifact creature with trample") + .withSubType(SubType.CONSTRUCT) + .withType(CardType.ARTIFACT) + .withAbility(TrampleAbility.getInstance()), + "", Duration.EndOfTurn), new RemoveCountersSourceCost(new Counter(CounterType.CHARGE.getName(), 3)))); } public ChimericEgg(final ChimericEgg card) { @@ -82,23 +86,4 @@ public class ChimericEgg extends CardImpl { public ChimericEgg copy() { return new ChimericEgg(this); } - - private static class ChimericEggToken extends TokenImpl { - ChimericEggToken() { - super("", "6/6 Construct artifact creature with trample"); - cardType.add(CardType.ARTIFACT); - cardType.add(CardType.CREATURE); - this.subtype.add(SubType.CONSTRUCT); - power = new MageInt(6); - toughness = new MageInt(6); - this.addAbility(TrampleAbility.getInstance()); - } - public ChimericEggToken(final ChimericEggToken token) { - super(token); - } - - public ChimericEggToken copy() { - return new ChimericEggToken(this); - } - } } diff --git a/Mage.Sets/src/mage/cards/c/ChimericIdol.java b/Mage.Sets/src/mage/cards/c/ChimericIdol.java index 9b4e6b0f79b..b8db34d7b14 100644 --- a/Mage.Sets/src/mage/cards/c/ChimericIdol.java +++ b/Mage.Sets/src/mage/cards/c/ChimericIdol.java @@ -28,6 +28,7 @@ package mage.cards.c; import java.util.UUID; + import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -43,19 +44,23 @@ import mage.constants.Zone; import mage.filter.common.FilterControlledLandPermanent; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; /** - * * @author LevelX2 */ public class ChimericIdol extends CardImpl { public ChimericIdol(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); // {0}: Tap all lands you control. Chimeric Idol becomes a 3/3 Turtle artifact creature until end of turn. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new TapAllEffect(new FilterControlledLandPermanent("lands you control")), new ManaCostsImpl("{0}")); - ability.addEffect(new BecomesCreatureSourceEffect(new ChimericIdolToken(), "", Duration.EndOfTurn)); + ability.addEffect(new BecomesCreatureSourceEffect( + new CreatureToken(3, 3, "3/3 Turtle artifact creature") + .withSubType(SubType.TURTLE) + .withType(CardType.ARTIFACT), + "", Duration.EndOfTurn)); this.addAbility(ability); } @@ -68,23 +73,4 @@ public class ChimericIdol extends CardImpl { public ChimericIdol copy() { return new ChimericIdol(this); } -} - -class ChimericIdolToken extends TokenImpl { - - public ChimericIdolToken() { - super("Turtle", "3/3 Turtle artifact creature token"); - cardType.add(CardType.ARTIFACT); - cardType.add(CardType.CREATURE); - subtype.add(SubType.TURTLE); - power = new MageInt(3); - toughness = new MageInt(3); - } - public ChimericIdolToken(final ChimericIdolToken token) { - super(token); - } - - public ChimericIdolToken copy() { - return new ChimericIdolToken(this); - } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/c/ChimericMass.java b/Mage.Sets/src/mage/cards/c/ChimericMass.java index 115efb12669..3c47fffbb33 100644 --- a/Mage.Sets/src/mage/cards/c/ChimericMass.java +++ b/Mage.Sets/src/mage/cards/c/ChimericMass.java @@ -28,6 +28,7 @@ package mage.cards.c; import java.util.UUID; + import mage.MageInt; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.SimpleActivatedAbility; @@ -46,6 +47,7 @@ import mage.constants.Zone; import mage.counters.CounterType; import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; +import mage.game.permanent.token.custom.CreatureToken; /** * @author BetaSteward_at_googlemail.com @@ -53,14 +55,19 @@ import mage.game.permanent.token.Token; public class ChimericMass extends CardImpl { public ChimericMass(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{X}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{X}"); // Chimeric Mass enters the battlefield with X charge counters on it. this.addAbility(new EntersBattlefieldAbility(new EntersBattlefieldWithXCountersEffect(CounterType.CHARGE.createInstance()))); // {1}: Until end of turn, Chimeric Mass becomes a Construct artifact creature with "This creature's power and toughness are each equal to the number of charge counters on it." // set to character defining to prevent setting P/T again to 0 becuase already set by CDA of the token - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureSourceEffect(new ChimericMassToken(), "", Duration.EndOfTurn, false, true), new GenericManaCost(1))); + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureSourceEffect( + new CreatureToken(0, 0, "Construct artifact creature with \"This creature's power and toughness are each equal to the number of charge counters on it.\"") + .withType(CardType.ARTIFACT) + .withSubType(SubType.CONSTRUCT) + .withAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SetPowerToughnessSourceEffect(new CountersSourceCount(CounterType.CHARGE), Duration.WhileOnBattlefield))), + "", Duration.EndOfTurn, false, true), new GenericManaCost(1))); } public ChimericMass(final ChimericMass card) { @@ -72,23 +79,4 @@ public class ChimericMass extends CardImpl { return new ChimericMass(this); } -} - -class ChimericMassToken extends TokenImpl { - - public ChimericMassToken() { - super("", "Construct artifact creature with \"This creature's power and toughness are each equal to the number of charge counters on it.\""); - cardType.add(CardType.CREATURE); - subtype.add(SubType.CONSTRUCT); - power = new MageInt(0); - toughness = new MageInt(0); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SetPowerToughnessSourceEffect(new CountersSourceCount(CounterType.CHARGE), Duration.WhileOnBattlefield))); - } - public ChimericMassToken(final ChimericMassToken token) { - super(token); - } - - public ChimericMassToken copy() { - return new ChimericMassToken(this); - } -} +} \ No newline at end of file diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureSourceEffect.java index 377f649a94e..55c68421124 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureSourceEffect.java @@ -42,24 +42,24 @@ import mage.game.permanent.token.Token; public class BecomesCreatureSourceEffect extends ContinuousEffectImpl implements SourceEffect { protected Token token; - protected String type; + protected String theyAreStillType; protected boolean losePreviousTypes; protected DynamicValue power = null; protected DynamicValue toughness = null; - public BecomesCreatureSourceEffect(Token token, String type, Duration duration) { - this(token, type, duration, false, false); + public BecomesCreatureSourceEffect(Token token, String theyAreStillType, Duration duration) { + this(token, theyAreStillType, duration, false, false); } - public BecomesCreatureSourceEffect(Token token, String type, Duration duration, boolean losePreviousTypes, boolean characterDefining) { - this(token, type, duration, losePreviousTypes, characterDefining, null, null); + public BecomesCreatureSourceEffect(Token token, String theyAreStillType, Duration duration, boolean losePreviousTypes, boolean characterDefining) { + this(token, theyAreStillType, duration, losePreviousTypes, characterDefining, null, null); } - public BecomesCreatureSourceEffect(Token token, String type, Duration duration, boolean losePreviousTypes, boolean characterDefining, DynamicValue power, DynamicValue toughness) { + public BecomesCreatureSourceEffect(Token token, String theyAreStillType, Duration duration, boolean losePreviousTypes, boolean characterDefining, DynamicValue power, DynamicValue toughness) { super(duration, Outcome.BecomeCreature); this.characterDefining = characterDefining; this.token = token; - this.type = type; + this.theyAreStillType = theyAreStillType; this.losePreviousTypes = losePreviousTypes; this.power = power; this.toughness = toughness; @@ -69,7 +69,7 @@ public class BecomesCreatureSourceEffect extends ContinuousEffectImpl implements public BecomesCreatureSourceEffect(final BecomesCreatureSourceEffect effect) { super(effect); this.token = effect.token.copy(); - this.type = effect.type; + this.theyAreStillType = effect.theyAreStillType; this.losePreviousTypes = effect.losePreviousTypes; if (effect.power != null) { this.power = effect.power.copy(); @@ -110,7 +110,7 @@ public class BecomesCreatureSourceEffect extends ContinuousEffectImpl implements for (CardType cardType : token.getCardType()) { permanent.addCardType(cardType); } - if (type != null && type.isEmpty() || type == null && permanent.isLand()) { + if (theyAreStillType != null && theyAreStillType.isEmpty() || theyAreStillType == null && permanent.isLand()) { permanent.getSubtype(game).retainAll(SubType.getLandTypes(false)); } if (!token.getSubtype(game).isEmpty()) { @@ -119,6 +119,7 @@ public class BecomesCreatureSourceEffect extends ContinuousEffectImpl implements permanent.setIsAllCreatureTypes(token.isAllCreatureTypes()); } break; + case ColorChangingEffects_5: if (sublayer == SubLayer.NA) { if (token.getColor(game).hasColor()) { @@ -126,19 +127,20 @@ public class BecomesCreatureSourceEffect extends ContinuousEffectImpl implements } } break; + case AbilityAddingRemovingEffects_6: if (sublayer == SubLayer.NA) { for (Ability ability : token.getAbilities()) { permanent.addAbility(ability, source.getSourceId(), game); } - } break; + case PTChangingEffects_7: if ((sublayer == SubLayer.CharacteristicDefining_7a && isCharacterDefining()) || (sublayer == SubLayer.SetPT_7b && !isCharacterDefining())) { if (power != null) { - permanent.getPower().setValue(power.calculate(game, source, this)); + permanent.getPower().setValue(power.calculate(game, source, this)); // check all other becomes to use calculate? } else if (token.getPower() != null) { permanent.getPower().setValue(token.getPower().getValue()); } @@ -148,11 +150,15 @@ public class BecomesCreatureSourceEffect extends ContinuousEffectImpl implements permanent.getToughness().setValue(token.getToughness().getValue()); } } + break; } + return true; + } else if (duration == Duration.Custom) { this.discard(); } + return false; } @@ -162,8 +168,8 @@ public class BecomesCreatureSourceEffect extends ContinuousEffectImpl implements } private void setText() { - if (type != null && !type.isEmpty()) { - staticText = duration.toString() + " {this} becomes a " + token.getDescription() + " that's still a " + this.type; + if (theyAreStillType != null && !theyAreStillType.isEmpty()) { + staticText = duration.toString() + " {this} becomes a " + token.getDescription() + " that's still a " + this.theyAreStillType; } else { staticText = duration.toString() + " {this} becomes a " + token.getDescription(); } From f0219515789918c07a853b0b3e8e844c129c68c2 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Fri, 11 May 2018 22:22:02 +0400 Subject: [PATCH 144/158] Tests: added tokens tests in mage-verify (ignored until massive fixes, run it manually): * check token class name convention (must ends with Token); * check token package (must be in mage.game.permanent.token); * check private tokens (must be replaced with CreateToken); * check missing data from tok-file; --- Mage.Verify/pom.xml | 11 ++ .../java/mage/verify/VerifyCardDataTest.java | 147 ++++++++++++++++++ 2 files changed, 158 insertions(+) diff --git a/Mage.Verify/pom.xml b/Mage.Verify/pom.xml index e5fa977a770..c0cc0aae2b2 100644 --- a/Mage.Verify/pom.xml +++ b/Mage.Verify/pom.xml @@ -41,6 +41,17 @@ jar + + org.reflections + reflections + 0.9.11 + + + org.mage + mage-client + 1.4.29 + + diff --git a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java index 79b88f1110e..fda71e4f3eb 100644 --- a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java +++ b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java @@ -1,15 +1,25 @@ package mage.verify; +import javassist.bytecode.SignatureAttribute; import mage.ObjectColor; import mage.cards.*; import mage.cards.basiclands.BasicLand; import mage.constants.CardType; import mage.constants.Rarity; import mage.constants.SuperType; +import mage.game.permanent.token.Token; +import mage.game.permanent.token.TokenImpl; import org.junit.Assert; +import org.junit.Ignore; import org.junit.Test; +import org.mage.plugins.card.images.CardDownloadData; +import org.mage.plugins.card.images.DownloadPictures; +import org.reflections.Reflections; import java.io.IOException; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Modifier; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.NoSuchFileException; @@ -19,6 +29,10 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; +/** + * + * @author JayDi85 + */ public class VerifyCardDataTest { // right now this is very noisy, and not useful enough to make any assertions on @@ -241,6 +255,139 @@ public class VerifyCardDataTest { } } + private Object createNewObject(Class clazz) { + try { + Constructor cons = clazz.getConstructor(); + return cons.newInstance(); + } catch (InvocationTargetException ex) { + Throwable e = ex.getTargetException(); + e.printStackTrace(); + return null; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + private void printMessages(Collection list) { + for (String mes : list) { + System.out.println(mes); + } + } + + private String extractShortClass(Class tokenClass) { + String origin = tokenClass.getName(); + if (origin.contains("$")) { + // inner classes, example: mage.cards.f.FigureOfDestiny$FigureOfDestinyToken3 + return origin.replaceAll(".+\\$(.+)", "$1"); + } else { + // public classes, example: mage.game.permanent.token.FigureOfDestinyToken + return origin.replaceAll(".+\\.(.+)", "$1"); + } + } + + @Test + @Ignore // TODO: enable test after massive token fixes + public void checkMissingTokenData() { + + Collection errorsList = new ArrayList<>(); + Collection warningsList = new ArrayList<>(); + + // all tokens must be stores in card-pictures-tok.txt (if not then viewer and image downloader are missing token images) + // https://github.com/ronmamo/reflections + Reflections reflections = new Reflections("mage."); + Set> tokenClassesList = reflections.getSubTypesOf(TokenImpl.class); + + // xmage tokens + Set> privateTokens = new HashSet<>(); + Set> publicTokens = new HashSet<>(); + for (Class tokenClass : tokenClassesList) { + if (Modifier.isPublic(tokenClass.getModifiers())) { + publicTokens.add(tokenClass); + } else { + privateTokens.add(tokenClass); + } + } + + // tok file's data + ArrayList tokFileTokens = DownloadPictures.getTokenCardUrls(); + LinkedHashMap tokDataClassesIndex = new LinkedHashMap<>(); + LinkedHashMap tokDataNamesIndex = new LinkedHashMap<>(); + for (CardDownloadData tokData : tokFileTokens) { + + String searchName; + String setsList; + + // by class + searchName = tokData.getTokenClassName(); + setsList = tokDataClassesIndex.getOrDefault(searchName, ""); + if (!setsList.isEmpty()) { + setsList += ","; + } + setsList += tokData.getSet(); + tokDataClassesIndex.put(searchName, setsList); + + // by name + searchName = tokData.getName(); + setsList = tokDataNamesIndex.getOrDefault(searchName, ""); + if (!setsList.isEmpty()) { + setsList += ","; + } + setsList += tokData.getSet(); + tokDataNamesIndex.put(searchName, setsList); + } + + // 1. check token name convention + for (Class tokenClass : tokenClassesList) { + if (!tokenClass.getName().endsWith("Token")) { + String className = extractShortClass(tokenClass); + warningsList.add("warning, token class must ends with Token: " + className + " from " + tokenClass.getName()); + } + } + + // 2. check store file for public + for (Class tokenClass : publicTokens) { + String fullClass = tokenClass.getName(); + if (!fullClass.startsWith("mage.game.permanent.token.")) { + String className = extractShortClass(tokenClass); + errorsList.add("error, public token must stores in mage.game.permanent.token package: " + className + " from " + tokenClass.getName()); + } + } + + // 3. check private tokens (they aren't need at all) + for (Class tokenClass : privateTokens) { + String className = extractShortClass(tokenClass); + errorsList.add("error, no needs in private tokens, replace it with CreatureToken: " + className + " from " + tokenClass.getName()); + } + + // 4. all public tokens must have tok-data (private tokens uses for innner abilities -- no need images for it) + for (Class tokenClass : publicTokens) { + String className = extractShortClass(tokenClass); + Token token = (Token) createNewObject(tokenClass); + //Assert.assertNotNull("Can't create token by default constructor", token); + if (token == null) { + Assert.fail("Can't create token by default constructor: " + className); + } + + if (tokDataNamesIndex.getOrDefault(token.getName(), "").isEmpty()) { + errorsList.add("error, can't find data in card-pictures-tok.txt for token: " + tokenClass.getName() + " -> " + token.getName()); + } + } + + // TODO: all sets must have full tokens data in tok file (token in every set) + // 1. Download scryfall tokens list: https://api.scryfall.com/cards/search?q=t:token + // 2. Proccess each token with all prints: read "prints_search_uri" field from token data and go to link like + // https://api.scryfall.com/cards/search?order=set&q=%21%E2%80%9CAngel%E2%80%9D&unique=prints + // 3. Collect all strings in "set@name" + // 4. Proccess tokens data and find missing strings from "set@name" list + + printMessages(warningsList); + printMessages(errorsList); + if(errorsList.size() > 0){ + Assert.fail("Founded token errors: " + errorsList.size()); + } + } + private static final Pattern SHORT_JAVA_STRING = Pattern.compile("(?<=\")[A-Z][a-z]+(?=\")"); private Set findSourceTokens(Class c) throws IOException { From 21e5591e297a0e87785563aeb8a5b5e5d746b6c5 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 13 May 2018 22:52:14 +0200 Subject: [PATCH 145/158] * Some rework of handling of mana effects. --- .../java/mage/player/ai/ComputerPlayer.java | 2 +- .../src/mage/cards/a/AkkiRockspeaker.java | 2 +- .../src/mage/cards/a/AncientHolocron.java | 2 +- .../src/mage/cards/a/AstralCornucopia.java | 111 ++++------ Mage.Sets/src/mage/cards/a/Astrolabe.java | 2 +- Mage.Sets/src/mage/cards/a/AuroraEidolon.java | 13 +- Mage.Sets/src/mage/cards/b/BattleHymn.java | 2 +- Mage.Sets/src/mage/cards/b/BlackLotus.java | 2 +- Mage.Sets/src/mage/cards/b/BloomTender.java | 46 ++-- .../src/mage/cards/b/BoundDetermined.java | 8 - .../src/mage/cards/b/BrightstoneRitual.java | 2 +- Mage.Sets/src/mage/cards/b/BubblingMuck.java | 2 +- .../src/mage/cards/b/BurningTreeEmissary.java | 2 +- Mage.Sets/src/mage/cards/c/CabalRitual.java | 2 +- Mage.Sets/src/mage/cards/c/CagedSun.java | 2 +- .../src/mage/cards/c/CalciformPools.java | 2 +- Mage.Sets/src/mage/cards/c/Capture.java | 2 +- .../src/mage/cards/c/CarnivalOfSouls.java | 2 +- .../src/mage/cards/c/CarpetOfFlowers.java | 24 ++- .../src/mage/cards/c/CascadingCataracts.java | 2 +- Mage.Sets/src/mage/cards/c/Cathodion.java | 2 +- .../mage/cards/c/ChancellorOfTheTangle.java | 2 +- .../mage/cards/c/ChandraBoldPyromancer.java | 2 +- .../mage/cards/c/ChandraTorchOfDefiance.java | 2 +- Mage.Sets/src/mage/cards/c/Channel.java | 2 +- .../src/mage/cards/c/ChannelTheSuns.java | 2 +- Mage.Sets/src/mage/cards/c/ChaosMoon.java | 2 +- .../src/mage/cards/c/CharmedPendant.java | 39 ++-- Mage.Sets/src/mage/cards/c/ChromeMox.java | 27 ++- .../src/mage/cards/c/CircleOfElders.java | 2 +- Mage.Sets/src/mage/cards/c/CoalStoker.java | 2 +- .../src/mage/cards/c/ColdsteelHeart.java | 48 +---- .../src/mage/cards/c/ConduitOfEmrakul.java | 2 +- .../src/mage/cards/c/ConduitOfStorms.java | 2 +- .../src/mage/cards/c/CorruptedGrafstone.java | 22 +- .../src/mage/cards/c/CrumblingVestige.java | 2 +- Mage.Sets/src/mage/cards/c/CryptGhast.java | 2 +- .../src/mage/cards/c/CullingTheWeak.java | 2 +- Mage.Sets/src/mage/cards/d/DarkPetition.java | 2 +- Mage.Sets/src/mage/cards/d/DarkRitual.java | 2 +- .../src/mage/cards/d/DawnsReflection.java | 20 +- .../src/mage/cards/d/DeathriteShaman.java | 2 +- Mage.Sets/src/mage/cards/d/Deconstruct.java | 2 +- .../src/mage/cards/d/DesperateRitual.java | 2 +- .../src/mage/cards/d/DictateOfKarametra.java | 2 +- Mage.Sets/src/mage/cards/d/DoublingCube.java | 25 ++- Mage.Sets/src/mage/cards/d/Dragonrage.java | 2 +- Mage.Sets/src/mage/cards/d/DreadshipReef.java | 2 +- Mage.Sets/src/mage/cards/d/DroidFoundry.java | 2 +- .../src/mage/cards/d/DruidsRepository.java | 2 +- .../src/mage/cards/e/EladamrisVineyard.java | 2 +- .../src/mage/cards/e/ElvishGuidance.java | 2 +- Mage.Sets/src/mage/cards/e/EnigmaEidolon.java | 14 +- .../src/mage/cards/e/EntropicEidolon.java | 14 +- Mage.Sets/src/mage/cards/e/EwokVillage.java | 2 +- .../src/mage/cards/e/ExtraplanarLens.java | 2 +- Mage.Sets/src/mage/cards/f/FertileGround.java | 2 +- Mage.Sets/src/mage/cards/f/FoodChain.java | 29 +-- Mage.Sets/src/mage/cards/f/FrontierSiege.java | 2 +- Mage.Sets/src/mage/cards/f/FungalReaches.java | 2 +- .../src/mage/cards/g/GauntletOfMight.java | 2 +- .../src/mage/cards/g/GauntletOfPower.java | 20 +- .../src/mage/cards/g/GemstoneCaverns.java | 4 +- Mage.Sets/src/mage/cards/g/Geosurge.java | 2 +- .../src/mage/cards/g/GiftOfParadise.java | 2 +- Mage.Sets/src/mage/cards/g/GildedLotus.java | 2 +- .../src/mage/cards/g/GloryscaleViashino.java | 20 +- .../src/mage/cards/g/GoldForgeGarrison.java | 2 +- .../src/mage/cards/g/GrandArchitect.java | 2 +- .../src/mage/cards/h/HallOfTheBanditLord.java | 2 +- Mage.Sets/src/mage/cards/h/HarvestMage.java | 2 +- .../src/mage/cards/h/HeartbeatOfSpring.java | 2 +- .../src/mage/cards/h/HiddenHerbalists.java | 2 +- Mage.Sets/src/mage/cards/h/HighTide.java | 2 +- Mage.Sets/src/mage/cards/h/HuttPalace.java | 2 +- Mage.Sets/src/mage/cards/i/IceCauldron.java | 42 ++-- Mage.Sets/src/mage/cards/i/IceCave.java | 2 +- .../mage/cards/i/ImplementsOfSacrifice.java | 2 +- .../src/mage/cards/i/InfernalPlunge.java | 2 +- Mage.Sets/src/mage/cards/i/InnerFire.java | 2 +- Mage.Sets/src/mage/cards/j/JackInTheMox.java | 66 +++--- Mage.Sets/src/mage/cards/j/JayaBallard.java | 2 +- Mage.Sets/src/mage/cards/j/JediTemple.java | 2 +- Mage.Sets/src/mage/cards/j/JeweledAmulet.java | 29 +-- Mage.Sets/src/mage/cards/j/JunglePatrol.java | 2 +- .../src/mage/cards/k/KeeperOfProgenitus.java | 2 +- Mage.Sets/src/mage/cards/k/KhalniGem.java | 2 +- .../src/mage/cards/k/KothOfTheHammer.java | 2 +- .../src/mage/cards/k/KozileksTranslator.java | 2 +- Mage.Sets/src/mage/cards/k/KyrenToy.java | 30 ++- .../src/mage/cards/l/LionsEyeDiamond.java | 4 +- .../src/mage/cards/l/LiturgyOfBlood.java | 2 +- Mage.Sets/src/mage/cards/l/LobberCrew.java | 19 +- Mage.Sets/src/mage/cards/l/LostVale.java | 2 +- Mage.Sets/src/mage/cards/l/LotusBloom.java | 2 +- Mage.Sets/src/mage/cards/l/LotusCobra.java | 2 +- Mage.Sets/src/mage/cards/l/LotusVale.java | 2 +- .../mage/cards/m/MadScienceFairProject.java | 60 +++--- .../src/mage/cards/m/MagusOfTheVineyard.java | 2 +- Mage.Sets/src/mage/cards/m/ManaBloom.java | 2 +- Mage.Sets/src/mage/cards/m/ManaCache.java | 2 +- Mage.Sets/src/mage/cards/m/ManaDrain.java | 2 +- Mage.Sets/src/mage/cards/m/ManaFlare.java | 2 +- Mage.Sets/src/mage/cards/m/ManaGeyser.java | 2 +- Mage.Sets/src/mage/cards/m/Manamorphose.java | 2 +- .../src/mage/cards/m/MarduWarshrieker.java | 2 +- Mage.Sets/src/mage/cards/m/MarkOfSakiko.java | 2 +- .../src/mage/cards/m/MarketFestival.java | 24 ++- Mage.Sets/src/mage/cards/m/Metalworker.java | 47 ++-- Mage.Sets/src/mage/cards/m/Metamorphosis.java | 5 +- Mage.Sets/src/mage/cards/m/MeteorCrater.java | 24 ++- Mage.Sets/src/mage/cards/m/MirarisWake.java | 2 +- Mage.Sets/src/mage/cards/m/MoistureFarm.java | 2 +- .../src/mage/cards/m/MoltenSlagheap.java | 2 +- Mage.Sets/src/mage/cards/m/Morselhoarder.java | 2 +- Mage.Sets/src/mage/cards/m/MoxLotus.java | 2 +- Mage.Sets/src/mage/cards/m/MoxOpal.java | 2 +- .../src/mage/cards/m/MulDayaChannelers.java | 2 +- Mage.Sets/src/mage/cards/m/MyrMoonvessel.java | 2 +- Mage.Sets/src/mage/cards/m/MyrReservoir.java | 2 +- .../src/mage/cards/n/NehebTheEternal.java | 14 +- Mage.Sets/src/mage/cards/n/NewHorizons.java | 2 +- Mage.Sets/src/mage/cards/n/NimbusMaze.java | 2 +- .../src/mage/cards/n/NirkanaRevenant.java | 2 +- .../src/mage/cards/n/NykthosShrineToNyx.java | 55 ++--- .../src/mage/cards/o/OasisRitualist.java | 2 +- .../src/mage/cards/o/OrcishLumberjack.java | 36 +++- Mage.Sets/src/mage/cards/o/Overabundance.java | 2 +- Mage.Sets/src/mage/cards/o/Overgrowth.java | 2 +- .../src/mage/cards/o/OverlaidTerrain.java | 2 +- Mage.Sets/src/mage/cards/p/ParadisePlume.java | 44 +--- .../src/mage/cards/p/PillarOfTheParuns.java | 13 +- Mage.Sets/src/mage/cards/p/PlasmCapture.java | 22 +- Mage.Sets/src/mage/cards/p/PriestOfGix.java | 2 +- .../src/mage/cards/p/PriestOfUrabrask.java | 2 +- .../mage/cards/p/PyramidOfThePantheon.java | 2 +- Mage.Sets/src/mage/cards/p/PyreticRitual.java | 2 +- .../src/mage/cards/p/Pyroconvergence.java | 15 +- Mage.Sets/src/mage/cards/q/QuirionElves.java | 52 +---- .../src/mage/cards/q/QuirionSentinel.java | 2 +- .../src/mage/cards/r/RadhaHeirToKeld.java | 2 +- .../src/mage/cards/r/RamosDragonEngine.java | 2 +- .../src/mage/cards/r/RattleclawMystic.java | 2 +- Mage.Sets/src/mage/cards/r/RegalBehemoth.java | 2 +- .../src/mage/cards/r/RewardsOfDiversity.java | 3 +- Mage.Sets/src/mage/cards/r/RhysticCave.java | 31 +-- Mage.Sets/src/mage/cards/r/RiteOfFlame.java | 25 +-- Mage.Sets/src/mage/cards/r/RiverOfTears.java | 2 +- .../src/mage/cards/r/RosheenMeanderer.java | 2 +- .../src/mage/cards/s/SacellumGodspeaker.java | 25 ++- Mage.Sets/src/mage/cards/s/Sacrifice.java | 2 +- .../mage/cards/s/SakikoMotherOfSummer.java | 2 +- .../mage/cards/s/SakuraTribeSpringcaller.java | 2 +- .../src/mage/cards/s/SaltcrustedSteppe.java | 2 +- .../src/mage/cards/s/SandstormEidolon.java | 16 +- .../mage/cards/s/SasayaOrochiAscendant.java | 30 ++- Mage.Sets/src/mage/cards/s/SavageVentmaw.java | 14 +- .../src/mage/cards/s/ScatteringStroke.java | 2 +- Mage.Sets/src/mage/cards/s/SeethingSong.java | 2 +- Mage.Sets/src/mage/cards/s/SeismicSpike.java | 2 +- .../mage/cards/s/SelvalaExplorerReturned.java | 14 +- .../mage/cards/s/SelvalaHeartOfTheWilds.java | 6 +- .../src/mage/cards/s/ShelteredAerie.java | 2 +- .../mage/cards/s/ShizukoCallerOfAutumn.java | 2 +- .../mage/cards/s/ShrineOfTheForsakenGods.java | 2 +- .../src/mage/cards/s/SilhanaStarfletcher.java | 58 +---- Mage.Sets/src/mage/cards/s/SithCitadel.java | 2 +- Mage.Sets/src/mage/cards/s/SolGrail.java | 50 +---- .../mage/cards/s/SoldierOfThePantheon.java | 9 +- .../src/mage/cards/s/SongsOfTheDamned.java | 2 +- .../src/mage/cards/s/SpectralSearchlight.java | 50 ++++- .../src/mage/cards/s/SpireOfIndustry.java | 2 +- .../src/mage/cards/s/SquanderedResources.java | 32 ++- Mage.Sets/src/mage/cards/s/StarCompass.java | 99 ++++++--- Mage.Sets/src/mage/cards/s/SuChi.java | 2 +- Mage.Sets/src/mage/cards/t/TaintedField.java | 2 +- Mage.Sets/src/mage/cards/t/TaintedIsle.java | 2 +- Mage.Sets/src/mage/cards/t/TaintedPeak.java | 2 +- Mage.Sets/src/mage/cards/t/TaintedWood.java | 2 +- Mage.Sets/src/mage/cards/t/Tangleroot.java | 2 +- .../src/mage/cards/t/TempleOfTheFalseGod.java | 2 +- Mage.Sets/src/mage/cards/t/Terrarion.java | 2 +- .../src/mage/cards/t/TheFirstEruption.java | 2 +- Mage.Sets/src/mage/cards/t/ThranTurbine.java | 2 +- .../src/mage/cards/t/TraceOfAbundance.java | 2 +- Mage.Sets/src/mage/cards/t/TurnToDust.java | 2 +- Mage.Sets/src/mage/cards/u/UrzasFilter.java | 11 +- Mage.Sets/src/mage/cards/u/UtopiaSprawl.java | 4 +- Mage.Sets/src/mage/cards/v/Valleymaker.java | 2 +- .../src/mage/cards/v/VaultOfCatlacan.java | 2 +- .../src/mage/cards/v/VedalkenEngineer.java | 40 ++-- .../src/mage/cards/v/VerdantEidolon.java | 16 +- Mage.Sets/src/mage/cards/v/VerdantHaven.java | 2 +- Mage.Sets/src/mage/cards/v/VernalBloom.java | 2 +- Mage.Sets/src/mage/cards/v/VesperGhoul.java | 2 +- .../mage/cards/v/VorinclexVoiceOfHunger.java | 2 +- Mage.Sets/src/mage/cards/w/WallOfRoots.java | 2 +- Mage.Sets/src/mage/cards/w/WasteNot.java | 2 +- Mage.Sets/src/mage/cards/w/WeirdingWood.java | 2 +- .../src/mage/cards/w/WhispererOfTheWilds.java | 2 +- Mage.Sets/src/mage/cards/w/WildGrowth.java | 2 +- Mage.Sets/src/mage/cards/w/WintersNight.java | 2 +- Mage.Sets/src/mage/cards/w/WitchEngine.java | 2 +- Mage.Sets/src/mage/cards/w/WookieeMystic.java | 2 +- .../src/mage/cards/z/ZendikarResurgent.java | 2 +- .../src/mage/cards/z/ZhurTaaAncient.java | 2 +- .../test/cards/mana/ConditionalManaTest.java | 1 - .../cards/mana/NykthosShrineToNyxTest.java | 4 +- .../mana/VorinclexVoiceOfHungerTest.java | 1 + .../triggers/SelvalaHeartOfTheWildsTest.java | 202 +++++++++--------- .../java/org/mage/test/player/TestPlayer.java | 2 +- .../main/java/mage/abilities/AbilityImpl.java | 2 +- .../decorator/ConditionalManaEffect.java | 49 ++--- .../common/OpponentsLostLifeCount.java | 2 +- ...fAnyColorToManaPoolTargetPlayerEffect.java | 49 ----- .../abilities/effects/common/ManaEffect.java | 61 +++++- .../AddConditionalColorlessManaEffect.java | 11 +- .../AddConditionalManaEffect.java | 6 +- .../AddConditionalManaOfAnyColorEffect.java | 51 +++-- ...dManaAnyColorAttachedControllerEffect.java | 45 +++- .../mana/AddManaChosenColorEffect.java | 54 +++++ .../AddManaInAnyCombinationEffect.java | 28 ++- .../AddManaOfAnyColorEffect.java | 4 +- .../AddManaOfAnyTypeProducedEffect.java | 37 ++-- ...dManaToManaPoolSourceControllerEffect.java | 2 +- ...dManaToManaPoolTargetControllerEffect.java | 32 +-- .../{common => mana}/BasicManaEffect.java | 25 ++- .../DoUnlessAnyPlayerPaysManaEffect.java | 28 ++- .../{common => mana}/DynamicManaEffect.java | 35 ++- .../mana/ActivateIfConditionManaAbility.java | 6 +- .../mana/ActivateOncePerTurnManaAbility.java | 6 +- .../mana/ActivatedManaAbilityImpl.java | 8 + .../mana/AnyColorLandsProduceManaAbility.java | 27 ++- .../abilities/mana/AnyColorManaAbility.java | 2 +- .../AnyColorPermanentTypesManaAbility.java | 38 ++-- .../mage/abilities/mana/BlackManaAbility.java | 2 +- .../mage/abilities/mana/BlueManaAbility.java | 2 +- .../abilities/mana/ColorlessManaAbility.java | 2 +- .../CommanderColorIdentityManaAbility.java | 26 ++- .../mana/ConditionalAnyColorManaAbility.java | 2 +- .../mana/ConditionalColoredManaAbility.java | 2 +- .../mana/ConditionalColorlessManaAbility.java | 2 +- .../abilities/mana/DynamicManaAbility.java | 4 +- .../mage/abilities/mana/GreenManaAbility.java | 2 +- .../mage/abilities/mana/RedManaAbility.java | 2 +- .../abilities/mana/SimpleManaAbility.java | 14 +- .../abilities/mana/TriggeredManaAbility.java | 19 +- .../mage/abilities/mana/WhiteManaAbility.java | 2 +- .../main/java/mage/filter/StaticFilters.java | 13 +- Mage/src/main/java/mage/game/GameImpl.java | 2 +- .../permanent/token/EtheriumCellToken.java | 2 +- .../mage/game/permanent/token/GoldToken.java | 2 +- .../game/permanent/token/TreasureToken.java | 2 +- .../common/PlayerLostLifeWatcher.java | 8 +- 254 files changed, 1449 insertions(+), 1399 deletions(-) delete mode 100644 Mage/src/main/java/mage/abilities/effects/common/AddManaOfAnyColorToManaPoolTargetPlayerEffect.java rename Mage/src/main/java/mage/abilities/effects/{common => mana}/AddConditionalColorlessManaEffect.java (81%) rename Mage/src/main/java/mage/abilities/effects/{common => mana}/AddConditionalManaEffect.java (90%) rename Mage/src/main/java/mage/abilities/effects/{common => mana}/AddConditionalManaOfAnyColorEffect.java (78%) rename Mage/src/main/java/mage/abilities/effects/{common => mana}/AddManaAnyColorAttachedControllerEffect.java (70%) create mode 100644 Mage/src/main/java/mage/abilities/effects/mana/AddManaChosenColorEffect.java rename Mage/src/main/java/mage/abilities/effects/{common => mana}/AddManaInAnyCombinationEffect.java (88%) rename Mage/src/main/java/mage/abilities/effects/{common => mana}/AddManaOfAnyColorEffect.java (98%) rename Mage/src/main/java/mage/abilities/effects/{common => mana}/AddManaOfAnyTypeProducedEffect.java (85%) rename Mage/src/main/java/mage/abilities/effects/{common => mana}/AddManaToManaPoolSourceControllerEffect.java (97%) rename Mage/src/main/java/mage/abilities/effects/{common => mana}/AddManaToManaPoolTargetControllerEffect.java (74%) rename Mage/src/main/java/mage/abilities/effects/{common => mana}/BasicManaEffect.java (56%) rename Mage/src/main/java/mage/abilities/effects/{common => mana}/DoUnlessAnyPlayerPaysManaEffect.java (84%) rename Mage/src/main/java/mage/abilities/effects/{common => mana}/DynamicManaEffect.java (85%) 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 bb2fe8d5452..7059fe715e3 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 @@ -1763,7 +1763,7 @@ public class ComputerPlayer extends PlayerImpl implements Player { } //TODO: improve this if (min < max && min == 0) { - return RandomUtil.nextInt(max); + return RandomUtil.nextInt(max + 1); } return min; } diff --git a/Mage.Sets/src/mage/cards/a/AkkiRockspeaker.java b/Mage.Sets/src/mage/cards/a/AkkiRockspeaker.java index b29e43a6ce3..d0e8dbb0b8e 100644 --- a/Mage.Sets/src/mage/cards/a/AkkiRockspeaker.java +++ b/Mage.Sets/src/mage/cards/a/AkkiRockspeaker.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.MageInt; import mage.Mana; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/a/AncientHolocron.java b/Mage.Sets/src/mage/cards/a/AncientHolocron.java index 7a667899a03..6a979c525d5 100644 --- a/Mage.Sets/src/mage/cards/a/AncientHolocron.java +++ b/Mage.Sets/src/mage/cards/a/AncientHolocron.java @@ -29,7 +29,7 @@ package mage.cards.a; import java.util.UUID; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.mana.ConditionalAnyColorManaAbility; import mage.abilities.mana.SimpleManaAbility; import mage.abilities.mana.conditional.ConditionalSpellManaBuilder; diff --git a/Mage.Sets/src/mage/cards/a/AstralCornucopia.java b/Mage.Sets/src/mage/cards/a/AstralCornucopia.java index 1581512d27e..54fab582230 100644 --- a/Mage.Sets/src/mage/cards/a/AstralCornucopia.java +++ b/Mage.Sets/src/mage/cards/a/AstralCornucopia.java @@ -27,7 +27,6 @@ */ package mage.cards.a; -import java.util.List; import java.util.UUID; import mage.Mana; import mage.abilities.Ability; @@ -35,7 +34,7 @@ import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect; import mage.abilities.effects.common.ManaEffect; -import mage.abilities.mana.ActivatedManaAbilityImpl; +import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.choices.ChoiceColor; @@ -53,13 +52,13 @@ import mage.players.Player; public class AstralCornucopia extends CardImpl { public AstralCornucopia(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{X}{X}{X}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{X}{X}{X}"); // Astral Cornucopia enters the battlefield with X charge counters on it. this.addAbility(new EntersBattlefieldAbility(new EntersBattlefieldWithXCountersEffect(CounterType.CHARGE.createInstance()))); // {T}: Choose a color. Add one mana of that color for each charge counter on Astral Cornucopia. - this.addAbility(new AstralCornucopiaManaAbility()); + this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new AstralCornucopiaManaEffect(), new TapSourceCost())); } public AstralCornucopia(final AstralCornucopia card) { @@ -72,35 +71,6 @@ public class AstralCornucopia extends CardImpl { } } -class AstralCornucopiaManaAbility extends ActivatedManaAbilityImpl { - - public AstralCornucopiaManaAbility() { - super(Zone.BATTLEFIELD, new AstralCornucopiaManaEffect(), new TapSourceCost()); - } - - public AstralCornucopiaManaAbility(final AstralCornucopiaManaAbility ability) { - super(ability); - } - - @Override - public AstralCornucopiaManaAbility copy() { - return new AstralCornucopiaManaAbility(this); - } - - @Override - public List getNetMana(Game game) { - netMana.clear(); - Permanent sourcePermanent = game.getPermanent(getSourceId()); - if (sourcePermanent != null) { - int counters = sourcePermanent.getCounters(game).getCount(CounterType.CHARGE.getName()); - if (counters > 0) { - netMana.add(new Mana(0, 0, 0, 0, 0, 0, counters, 0)); - } - } - return netMana; - } -} - class AstralCornucopiaManaEffect extends ManaEffect { private final Mana computedMana; @@ -125,42 +95,55 @@ class AstralCornucopiaManaEffect extends ManaEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - ChoiceColor choice = new ChoiceColor(); - choice.setMessage("Choose a color to add mana of that color"); - if (controller.choose(outcome, choice, game)) { - Permanent sourcePermanent = game.getPermanent(source.getSourceId()); - if (choice.getChoice() != null) { - String color = choice.getChoice(); - int counters = sourcePermanent.getCounters(game).getCount(CounterType.CHARGE.getName()); - switch (color) { - case "Red": - computedMana.setRed(counters); - break; - case "Blue": - computedMana.setBlue(counters); - break; - case "White": - computedMana.setWhite(counters); - break; - case "Black": - computedMana.setBlack(counters); - break; - case "Green": - computedMana.setGreen(counters); - break; - } - } - checkToFirePossibleEvents(computedMana, game, source); - controller.getManaPool().addMana(computedMana, game, source); - return true; - } + checkToFirePossibleEvents(getMana(game, source), game, source); + controller.getManaPool().addMana(getMana(game, source), game, source); + return true; + } return false; } @Override - public Mana getMana(Game game, Ability source) { - return null; + public Mana produceMana(boolean netMana, Game game, Ability source) { + Mana mana = new Mana(); + Permanent sourcePermanent = game.getPermanent(source.getSourceId()); + if (sourcePermanent != null) { + int counters = sourcePermanent.getCounters(game).getCount(CounterType.CHARGE.getName()); + if (counters > 0) { + if (netMana) { + return new Mana(0, 0, 0, 0, 0, 0, counters, 0); + } + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + ChoiceColor choice = new ChoiceColor(); + choice.setMessage("Choose a color to add mana of that color"); + if (controller.choose(outcome, choice, game)) { + if (choice.getChoice() != null) { + String color = choice.getChoice(); + switch (color) { + case "Red": + mana.setRed(counters); + break; + case "Blue": + mana.setBlue(counters); + break; + case "White": + mana.setWhite(counters); + break; + case "Black": + mana.setBlack(counters); + break; + case "Green": + mana.setGreen(counters); + break; + } + } + } + } + } + } + + return mana; } } diff --git a/Mage.Sets/src/mage/cards/a/Astrolabe.java b/Mage.Sets/src/mage/cards/a/Astrolabe.java index 9ce14687094..b83f8a65c71 100644 --- a/Mage.Sets/src/mage/cards/a/Astrolabe.java +++ b/Mage.Sets/src/mage/cards/a/Astrolabe.java @@ -32,7 +32,7 @@ import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbili import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.mana.SimpleManaAbility; diff --git a/Mage.Sets/src/mage/cards/a/AuroraEidolon.java b/Mage.Sets/src/mage/cards/a/AuroraEidolon.java index d97af296314..5f855d86715 100644 --- a/Mage.Sets/src/mage/cards/a/AuroraEidolon.java +++ b/Mage.Sets/src/mage/cards/a/AuroraEidolon.java @@ -42,8 +42,7 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SubType; import mage.constants.Zone; -import mage.filter.FilterSpell; -import mage.filter.predicate.mageobject.MulticoloredPredicate; +import mage.filter.StaticFilters; import mage.target.common.TargetAnyTarget; /** @@ -52,14 +51,8 @@ import mage.target.common.TargetAnyTarget; */ public class AuroraEidolon extends CardImpl { - private static final FilterSpell filter = new FilterSpell("a multicolored spell"); - - static { - filter.add(new MulticoloredPredicate()); - } - public AuroraEidolon(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}"); this.subtype.add(SubType.SPIRIT); this.power = new MageInt(2); this.toughness = new MageInt(2); @@ -70,7 +63,7 @@ public class AuroraEidolon extends CardImpl { ability.addTarget(new TargetAnyTarget()); this.addAbility(ability); // Whenever you cast a multicolored spell, you may return Aurora Eidolon from your graveyard to your hand. - this.addAbility(new SpellCastControllerTriggeredAbility(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(), filter, true, false)); + this.addAbility(new SpellCastControllerTriggeredAbility(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(), StaticFilters.FILTER_SPELL_A_MULTICOLORED, true, false)); } public AuroraEidolon(final AuroraEidolon card) { diff --git a/Mage.Sets/src/mage/cards/b/BattleHymn.java b/Mage.Sets/src/mage/cards/b/BattleHymn.java index 58193aee9fa..b69a1f805eb 100644 --- a/Mage.Sets/src/mage/cards/b/BattleHymn.java +++ b/Mage.Sets/src/mage/cards/b/BattleHymn.java @@ -30,7 +30,7 @@ package mage.cards.b; import java.util.UUID; import mage.Mana; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; -import mage.abilities.effects.common.DynamicManaEffect; +import mage.abilities.effects.mana.DynamicManaEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/b/BlackLotus.java b/Mage.Sets/src/mage/cards/b/BlackLotus.java index 19008faf0c8..8bfaa4be4b4 100644 --- a/Mage.Sets/src/mage/cards/b/BlackLotus.java +++ b/Mage.Sets/src/mage/cards/b/BlackLotus.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; diff --git a/Mage.Sets/src/mage/cards/b/BloomTender.java b/Mage.Sets/src/mage/cards/b/BloomTender.java index b7f64eaf967..b217242a358 100644 --- a/Mage.Sets/src/mage/cards/b/BloomTender.java +++ b/Mage.Sets/src/mage/cards/b/BloomTender.java @@ -50,7 +50,7 @@ import mage.players.Player; public class BloomTender extends CardImpl { public BloomTender(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}"); this.subtype.add(SubType.ELF, SubType.DRUID); this.power = new MageInt(1); @@ -93,38 +93,32 @@ class BloomTenderEffect extends ManaEffect { if (controller != null) { Mana mana = getMana(game, source); checkToFirePossibleEvents(mana, game, source); - controller.getManaPool().addMana(mana, game, source); + controller.getManaPool().addMana(mana, game, source); return true; } return false; } @Override - public Mana getMana(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - Mana mana = new Mana(); - for (Permanent permanent : game.getBattlefield().getAllActivePermanents(controller.getId())) { - if (mana.getBlack() == 0 && permanent.getColor(game).isBlack()) { - mana.increaseBlack(); - } - if (mana.getBlue() == 0 && permanent.getColor(game).isBlue()) { - mana.increaseBlue(); - } - if (mana.getRed() == 0 && permanent.getColor(game).isRed()) { - mana.increaseRed(); - } - if (mana.getGreen() == 0 && permanent.getColor(game).isGreen()) { - mana.increaseGreen(); - } - if (mana.getWhite() == 0 && permanent.getColor(game).isWhite()) { - mana.increaseWhite(); - } + public Mana produceMana(boolean netMana, Game game, Ability source) { + Mana mana = new Mana(); + for (Permanent permanent : game.getBattlefield().getAllActivePermanents(source.getControllerId())) { + if (mana.getBlack() == 0 && permanent.getColor(game).isBlack()) { + mana.increaseBlack(); + } + if (mana.getBlue() == 0 && permanent.getColor(game).isBlue()) { + mana.increaseBlue(); + } + if (mana.getRed() == 0 && permanent.getColor(game).isRed()) { + mana.increaseRed(); + } + if (mana.getGreen() == 0 && permanent.getColor(game).isGreen()) { + mana.increaseGreen(); + } + if (mana.getWhite() == 0 && permanent.getColor(game).isWhite()) { + mana.increaseWhite(); } - return mana; } - return null; + return mana; } - - } diff --git a/Mage.Sets/src/mage/cards/b/BoundDetermined.java b/Mage.Sets/src/mage/cards/b/BoundDetermined.java index 2889105d90d..cc5e126e42a 100644 --- a/Mage.Sets/src/mage/cards/b/BoundDetermined.java +++ b/Mage.Sets/src/mage/cards/b/BoundDetermined.java @@ -44,9 +44,7 @@ import mage.constants.Outcome; import mage.constants.SpellAbilityType; import mage.constants.Zone; import mage.filter.FilterCard; -import mage.filter.FilterSpell; import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.predicate.mageobject.MulticoloredPredicate; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; @@ -61,12 +59,6 @@ import mage.target.common.TargetControlledPermanent; */ public class BoundDetermined extends SplitCard { - private static final FilterSpell filter = new FilterSpell("multicolored spell"); - - static { - filter.add(new MulticoloredPredicate()); - } - public BoundDetermined(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{B}{G}", "{G}{U}", SpellAbilityType.SPLIT); diff --git a/Mage.Sets/src/mage/cards/b/BrightstoneRitual.java b/Mage.Sets/src/mage/cards/b/BrightstoneRitual.java index 4daa146badb..da6cd91c884 100644 --- a/Mage.Sets/src/mage/cards/b/BrightstoneRitual.java +++ b/Mage.Sets/src/mage/cards/b/BrightstoneRitual.java @@ -30,7 +30,7 @@ package mage.cards.b; import java.util.UUID; import mage.Mana; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; -import mage.abilities.effects.common.DynamicManaEffect; +import mage.abilities.effects.mana.DynamicManaEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/b/BubblingMuck.java b/Mage.Sets/src/mage/cards/b/BubblingMuck.java index 3e51347338b..fd6acd31e93 100644 --- a/Mage.Sets/src/mage/cards/b/BubblingMuck.java +++ b/Mage.Sets/src/mage/cards/b/BubblingMuck.java @@ -30,7 +30,7 @@ package mage.cards.b; import java.util.UUID; import mage.Mana; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.AddManaToManaPoolTargetControllerEffect; +import mage.abilities.effects.mana.AddManaToManaPoolTargetControllerEffect; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; import mage.abilities.mana.DelayedTriggeredManaAbility; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/b/BurningTreeEmissary.java b/Mage.Sets/src/mage/cards/b/BurningTreeEmissary.java index c57247dbb64..037f87f9634 100644 --- a/Mage.Sets/src/mage/cards/b/BurningTreeEmissary.java +++ b/Mage.Sets/src/mage/cards/b/BurningTreeEmissary.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.MageInt; import mage.Mana; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/c/CabalRitual.java b/Mage.Sets/src/mage/cards/c/CabalRitual.java index 9068db8d4d2..99f17461812 100644 --- a/Mage.Sets/src/mage/cards/c/CabalRitual.java +++ b/Mage.Sets/src/mage/cards/c/CabalRitual.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.Mana; import mage.abilities.condition.common.CardsInControllerGraveCondition; import mage.abilities.decorator.ConditionalManaEffect; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/c/CagedSun.java b/Mage.Sets/src/mage/cards/c/CagedSun.java index eb1ccd6296e..d29b4726002 100644 --- a/Mage.Sets/src/mage/cards/c/CagedSun.java +++ b/Mage.Sets/src/mage/cards/c/CagedSun.java @@ -176,7 +176,7 @@ class CagedSunEffect extends ManaEffect { } @Override - public Mana getMana(Game game, Ability source) { + public Mana produceMana(boolean netMana, Game game, Ability source) { ObjectColor color = (ObjectColor) game.getState().getValue(source.getSourceId() + "_color"); if (color != null) { return new Mana(ColoredManaSymbol.lookup(color.toString().charAt(0))); diff --git a/Mage.Sets/src/mage/cards/c/CalciformPools.java b/Mage.Sets/src/mage/cards/c/CalciformPools.java index e43efe4ecf7..a5333ef9e9e 100644 --- a/Mage.Sets/src/mage/cards/c/CalciformPools.java +++ b/Mage.Sets/src/mage/cards/c/CalciformPools.java @@ -34,7 +34,7 @@ import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; -import mage.abilities.effects.common.AddManaInAnyCombinationEffect; +import mage.abilities.effects.mana.AddManaInAnyCombinationEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.mana.ColorlessManaAbility; import mage.abilities.mana.SimpleManaAbility; diff --git a/Mage.Sets/src/mage/cards/c/Capture.java b/Mage.Sets/src/mage/cards/c/Capture.java index 8322e91050c..b791a281e53 100644 --- a/Mage.Sets/src/mage/cards/c/Capture.java +++ b/Mage.Sets/src/mage/cards/c/Capture.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.Mana; import mage.abilities.condition.common.TargetHasCounterCondition; import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.effects.common.UntapTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.effects.common.continuous.GainControlTargetEffect; diff --git a/Mage.Sets/src/mage/cards/c/CarnivalOfSouls.java b/Mage.Sets/src/mage/cards/c/CarnivalOfSouls.java index 9b41e741fae..edd9eacaf8a 100644 --- a/Mage.Sets/src/mage/cards/c/CarnivalOfSouls.java +++ b/Mage.Sets/src/mage/cards/c/CarnivalOfSouls.java @@ -32,7 +32,7 @@ import mage.Mana; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.AddManaToManaPoolSourceControllerEffect; +import mage.abilities.effects.mana.AddManaToManaPoolSourceControllerEffect; import mage.abilities.effects.common.LoseLifeSourceControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; diff --git a/Mage.Sets/src/mage/cards/c/CarpetOfFlowers.java b/Mage.Sets/src/mage/cards/c/CarpetOfFlowers.java index e775ff0cfc4..7d9da21db24 100644 --- a/Mage.Sets/src/mage/cards/c/CarpetOfFlowers.java +++ b/Mage.Sets/src/mage/cards/c/CarpetOfFlowers.java @@ -124,7 +124,7 @@ class CarpetOfFlowersTriggeredAbility extends TriggeredAbilityImpl { @Override public String getRule() { - StringBuilder sb = new StringBuilder("At the beginning of each of your main phases, if you haven't added mana with this ability this turn"); + StringBuilder sb = new StringBuilder("At the beginning of each of your main phases, if you haven't added mana with this ability this turn, "); return sb.append(super.getRule()).toString(); } @@ -150,12 +150,23 @@ class CarpetOfFlowersEffect extends ManaEffect { @Override public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + checkToFirePossibleEvents(getMana(game, source), game, source); + controller.getManaPool().addMana(getMana(game, source), game, source); + return true; + } + return false; + } + + @Override + public Mana produceMana(boolean netMana, Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); ChoiceColor choice = new ChoiceColor(); if (controller != null && controller.choose(Outcome.Benefit, choice, game)) { + Mana mana = new Mana(); int count = game.getBattlefield().count(filter, source.getSourceId(), source.getTargets().getFirstTarget(), game); if (count > 0) { - Mana mana = new Mana(); switch (choice.getChoice()) { case "Black": mana.setBlack(count); @@ -175,16 +186,9 @@ class CarpetOfFlowersEffect extends ManaEffect { default: break; } - checkToFirePossibleEvents(mana, game, source); - controller.getManaPool().addMana(mana, game, source); } - return true; + return mana; } - return false; - } - - @Override - public Mana getMana(Game game, Ability source) { return null; } diff --git a/Mage.Sets/src/mage/cards/c/CascadingCataracts.java b/Mage.Sets/src/mage/cards/c/CascadingCataracts.java index 9aca3735943..cb6d9925f28 100644 --- a/Mage.Sets/src/mage/cards/c/CascadingCataracts.java +++ b/Mage.Sets/src/mage/cards/c/CascadingCataracts.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.effects.common.AddManaInAnyCombinationEffect; +import mage.abilities.effects.mana.AddManaInAnyCombinationEffect; import mage.abilities.keyword.IndestructibleAbility; import mage.abilities.mana.ColorlessManaAbility; import mage.abilities.mana.SimpleManaAbility; diff --git a/Mage.Sets/src/mage/cards/c/Cathodion.java b/Mage.Sets/src/mage/cards/c/Cathodion.java index f6c2368f37e..39e7c0079a5 100644 --- a/Mage.Sets/src/mage/cards/c/Cathodion.java +++ b/Mage.Sets/src/mage/cards/c/Cathodion.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.MageInt; import mage.Mana; import mage.abilities.common.DiesTriggeredAbility; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/c/ChancellorOfTheTangle.java b/Mage.Sets/src/mage/cards/c/ChancellorOfTheTangle.java index 9ef68bafdfc..50dbd593ed8 100644 --- a/Mage.Sets/src/mage/cards/c/ChancellorOfTheTangle.java +++ b/Mage.Sets/src/mage/cards/c/ChancellorOfTheTangle.java @@ -32,7 +32,7 @@ import mage.MageInt; import mage.Mana; import mage.abilities.DelayedTriggeredAbility; import mage.abilities.common.ChancellorAbility; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.keyword.ReachAbility; import mage.abilities.keyword.VigilanceAbility; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/c/ChandraBoldPyromancer.java b/Mage.Sets/src/mage/cards/c/ChandraBoldPyromancer.java index 1aec07ca717..210b5e525a3 100644 --- a/Mage.Sets/src/mage/cards/c/ChandraBoldPyromancer.java +++ b/Mage.Sets/src/mage/cards/c/ChandraBoldPyromancer.java @@ -33,7 +33,7 @@ import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; import mage.abilities.effects.Effects; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.effects.common.DamageAllControlledTargetEffect; import mage.abilities.effects.common.DamageTargetEffect; import mage.constants.SubType; diff --git a/Mage.Sets/src/mage/cards/c/ChandraTorchOfDefiance.java b/Mage.Sets/src/mage/cards/c/ChandraTorchOfDefiance.java index 182452c4f31..3b8f4c0adbb 100644 --- a/Mage.Sets/src/mage/cards/c/ChandraTorchOfDefiance.java +++ b/Mage.Sets/src/mage/cards/c/ChandraTorchOfDefiance.java @@ -35,7 +35,7 @@ import mage.abilities.LoyaltyAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.effects.common.DamagePlayersEffect; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.GetEmblemEffect; diff --git a/Mage.Sets/src/mage/cards/c/Channel.java b/Mage.Sets/src/mage/cards/c/Channel.java index 20570985427..ceefa9df0bb 100644 --- a/Mage.Sets/src/mage/cards/c/Channel.java +++ b/Mage.Sets/src/mage/cards/c/Channel.java @@ -34,7 +34,7 @@ import mage.abilities.DelayedTriggeredAbility; import mage.abilities.SpecialAction; import mage.abilities.costs.common.PayLifeCost; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; import mage.abilities.effects.common.CreateSpecialActionEffect; import mage.abilities.effects.common.RemoveSpecialActionEffect; diff --git a/Mage.Sets/src/mage/cards/c/ChannelTheSuns.java b/Mage.Sets/src/mage/cards/c/ChannelTheSuns.java index c39d292e5c0..9e5dfd63d5c 100644 --- a/Mage.Sets/src/mage/cards/c/ChannelTheSuns.java +++ b/Mage.Sets/src/mage/cards/c/ChannelTheSuns.java @@ -30,7 +30,7 @@ package mage.cards.c; import java.util.UUID; import mage.Mana; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.AddManaToManaPoolSourceControllerEffect; +import mage.abilities.effects.mana.AddManaToManaPoolSourceControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/c/ChaosMoon.java b/Mage.Sets/src/mage/cards/c/ChaosMoon.java index a613e22d23f..8ece9bb8ee3 100644 --- a/Mage.Sets/src/mage/cards/c/ChaosMoon.java +++ b/Mage.Sets/src/mage/cards/c/ChaosMoon.java @@ -37,7 +37,7 @@ import mage.abilities.common.TapForManaAllTriggeredManaAbility; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.AddManaToManaPoolTargetControllerEffect; +import mage.abilities.effects.mana.AddManaToManaPoolTargetControllerEffect; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; import mage.abilities.effects.common.ManaEffect; import mage.abilities.effects.common.continuous.BoostAllEffect; diff --git a/Mage.Sets/src/mage/cards/c/CharmedPendant.java b/Mage.Sets/src/mage/cards/c/CharmedPendant.java index f3bf83392b6..325086fe560 100644 --- a/Mage.Sets/src/mage/cards/c/CharmedPendant.java +++ b/Mage.Sets/src/mage/cards/c/CharmedPendant.java @@ -27,6 +27,7 @@ */ package mage.cards.c; +import java.util.List; import java.util.Set; import java.util.UUID; import mage.Mana; @@ -42,8 +43,8 @@ import mage.abilities.costs.mana.ManaCosts; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.MonoHybridManaCost; import mage.abilities.costs.mana.VariableManaCost; -import mage.abilities.effects.common.BasicManaEffect; import mage.abilities.effects.common.ManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.abilities.mana.ManaOptions; import mage.cards.Card; @@ -84,8 +85,7 @@ class CharmedPendantAbility extends ActivatedManaAbilityImpl { public CharmedPendantAbility() { super(Zone.BATTLEFIELD, new CharmedPendantManaEffect(), new TapSourceCost()); this.addCost(new PutTopCardOfYourLibraryToGraveyardCost()); - this.netMana.add(new Mana(0, 0, 0, 0, 0, 0, 0, 0)); - this.setUndoPossible(false); // Otherwise you could retunrn the card from graveyard + this.setUndoPossible(false); // Otherwise you could return the card from graveyard } public CharmedPendantAbility(Zone zone, Mana mana, Cost cost) { @@ -135,6 +135,18 @@ class CharmedPendantManaEffect extends ManaEffect { @Override public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + checkToFirePossibleEvents(getMana(game, source), game, source); + controller.getManaPool().addMana(getMana(game, source), game, source); + return true; + } + + return false; + } + + @Override + public Mana produceMana(boolean netMana, Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { Mana mana = new Mana(); @@ -178,29 +190,28 @@ class CharmedPendantManaEffect extends ManaEffect { } } - checkToFirePossibleEvents(mana, game, source); - controller.getManaPool().addMana(mana, game, source); - return true; + return mana; } - return false; + return null; } @Override - public Mana getMana(Game game, Ability source) { + public List getNetMana(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { if (controller.isTopCardRevealed()) { Card card = controller.getLibrary().getFromTop(game); if (card != null) { - Mana mana = card.getManaCost().getMana().copy(); - mana.setColorless(0); - mana.setGeneric(0); - return mana; + List netMana = card.getManaCost().getManaOptions(); + for (Mana mana : netMana) { + mana.setColorless(0); + mana.setGeneric(0); + } + return netMana; } } } - return null; // You don't know if and which amount or color of mana you get + return null; } - } diff --git a/Mage.Sets/src/mage/cards/c/ChromeMox.java b/Mage.Sets/src/mage/cards/c/ChromeMox.java index 92e666f78cd..b560592dc7b 100644 --- a/Mage.Sets/src/mage/cards/c/ChromeMox.java +++ b/Mage.Sets/src/mage/cards/c/ChromeMox.java @@ -150,6 +150,18 @@ class ChromeMoxManaEffect extends ManaEffect { @Override public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + checkToFirePossibleEvents(getMana(game, source), game, source); + player.getManaPool().addMana(getMana(game, source), game, source); + return true; + + } + return false; + } + + @Override + public Mana produceMana(boolean netMana, Game game, Ability source) { Permanent permanent = game.getPermanent(source.getSourceId()); Player player = game.getPlayer(source.getControllerId()); if (permanent != null && player != null) { @@ -176,14 +188,14 @@ class ChromeMoxManaEffect extends ManaEffect { if (color.isWhite()) { choice.getChoices().add("White"); } - + Mana mana = new Mana(); if (!choice.getChoices().isEmpty()) { - Mana mana = new Mana(); + if (choice.getChoices().size() == 1) { choice.setChoice(choice.getChoices().iterator().next()); } else { if (!player.choose(outcome, choice, game)) { - return false; + return null; } } switch (choice.getChoice()) { @@ -208,17 +220,12 @@ class ChromeMoxManaEffect extends ManaEffect { default: break; } - checkToFirePossibleEvents(mana, game, source); - player.getManaPool().addMana(mana, game, source); + } + return mana; } } } - return true; - } - - @Override - public Mana getMana(Game game, Ability source) { return null; } diff --git a/Mage.Sets/src/mage/cards/c/CircleOfElders.java b/Mage.Sets/src/mage/cards/c/CircleOfElders.java index e63ba43655c..839ea3748dc 100644 --- a/Mage.Sets/src/mage/cards/c/CircleOfElders.java +++ b/Mage.Sets/src/mage/cards/c/CircleOfElders.java @@ -33,7 +33,7 @@ import mage.Mana; import mage.abilities.Ability; import mage.abilities.condition.common.FormidableCondition; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.keyword.VigilanceAbility; import mage.abilities.mana.ActivateIfConditionManaAbility; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/c/CoalStoker.java b/Mage.Sets/src/mage/cards/c/CoalStoker.java index cc619944a9c..3423694d1c5 100644 --- a/Mage.Sets/src/mage/cards/c/CoalStoker.java +++ b/Mage.Sets/src/mage/cards/c/CoalStoker.java @@ -33,7 +33,7 @@ import mage.Mana; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.common.CastFromHandSourceCondition; import mage.abilities.decorator.ConditionalTriggeredAbility; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/c/ColdsteelHeart.java b/Mage.Sets/src/mage/cards/c/ColdsteelHeart.java index 22bf54079ee..adbe418cbf4 100644 --- a/Mage.Sets/src/mage/cards/c/ColdsteelHeart.java +++ b/Mage.Sets/src/mage/cards/c/ColdsteelHeart.java @@ -28,20 +28,15 @@ package mage.cards.c; import java.util.UUID; -import mage.Mana; -import mage.ObjectColor; -import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.common.ChooseColorEffect; -import mage.abilities.effects.common.ManaEffect; +import mage.abilities.effects.mana.AddManaChosenColorEffect; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; -import mage.game.Game; -import mage.players.Player; /** * @@ -50,7 +45,7 @@ import mage.players.Player; public class ColdsteelHeart extends CardImpl { public ColdsteelHeart(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{2}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}"); this.addSuperType(SuperType.SNOW); // Coldsteel Heart enters the battlefield tapped. @@ -58,7 +53,8 @@ public class ColdsteelHeart extends CardImpl { // As Coldsteel Heart enters the battlefield, choose a color. this.addAbility(new EntersBattlefieldAbility(new ChooseColorEffect(Outcome.Neutral), null, "As {this} enters the battlefield, choose a color.", null)); // {T}: Add one mana of the chosen color. - this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new ColdsteelHeartManaEffect(), new TapSourceCost())); + this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new AddManaChosenColorEffect(), new TapSourceCost())); + } public ColdsteelHeart(final ColdsteelHeart card) { @@ -70,39 +66,3 @@ public class ColdsteelHeart extends CardImpl { return new ColdsteelHeart(this); } } - -class ColdsteelHeartManaEffect extends ManaEffect { - - public ColdsteelHeartManaEffect() { - super(); - staticText = "Add one mana of the chosen color"; - } - - public ColdsteelHeartManaEffect(final ColdsteelHeartManaEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player != null) { - player.getManaPool().addMana(getMana(game, source), game, source); - } - return true; - } - - @Override - public Mana getMana(Game game, Ability source) { - ObjectColor color = (ObjectColor) game.getState().getValue(source.getSourceId() + "_color"); - if (color != null) { - return new Mana(ColoredManaSymbol.lookup(color.toString().charAt(0))); - } else { - return null; - } - } - - @Override - public ColdsteelHeartManaEffect copy() { - return new ColdsteelHeartManaEffect(this); - } -} diff --git a/Mage.Sets/src/mage/cards/c/ConduitOfEmrakul.java b/Mage.Sets/src/mage/cards/c/ConduitOfEmrakul.java index 7b51fc84bb5..2f82ca81465 100644 --- a/Mage.Sets/src/mage/cards/c/ConduitOfEmrakul.java +++ b/Mage.Sets/src/mage/cards/c/ConduitOfEmrakul.java @@ -33,7 +33,7 @@ import mage.Mana; import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.common.delayed.AtTheBeginOfMainPhaseDelayedTriggeredAbility; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.AddManaToManaPoolSourceControllerEffect; +import mage.abilities.effects.mana.AddManaToManaPoolSourceControllerEffect; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; diff --git a/Mage.Sets/src/mage/cards/c/ConduitOfStorms.java b/Mage.Sets/src/mage/cards/c/ConduitOfStorms.java index ac6436b9953..8cec71805c5 100644 --- a/Mage.Sets/src/mage/cards/c/ConduitOfStorms.java +++ b/Mage.Sets/src/mage/cards/c/ConduitOfStorms.java @@ -35,7 +35,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.delayed.AtTheBeginOfMainPhaseDelayedTriggeredAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.AddManaToManaPoolSourceControllerEffect; +import mage.abilities.effects.mana.AddManaToManaPoolSourceControllerEffect; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.keyword.TransformAbility; diff --git a/Mage.Sets/src/mage/cards/c/CorruptedGrafstone.java b/Mage.Sets/src/mage/cards/c/CorruptedGrafstone.java index eb2d518b14c..ba041701219 100644 --- a/Mage.Sets/src/mage/cards/c/CorruptedGrafstone.java +++ b/Mage.Sets/src/mage/cards/c/CorruptedGrafstone.java @@ -117,6 +117,17 @@ class CorruptedGrafstoneManaEffect extends ManaEffect { @Override public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + checkToFirePossibleEvents(getMana(game, source), game, source); + player.getManaPool().addMana(getMana(game, source), game, source); + return true; + } + return false; + } + + @Override + public Mana produceMana(boolean netMana, Game game, Ability source) { Mana types = getManaTypesInGraveyard(game, source); Choice choice = new ChoiceColor(true); choice.getChoices().clear(); @@ -143,7 +154,7 @@ class CorruptedGrafstoneManaEffect extends ManaEffect { choice.setChoice(choice.getChoices().iterator().next()); } else { if (!player.choose(outcome, choice, game)) { - return false; + return null; } } Mana computedManaHere = new Mana(); @@ -164,18 +175,13 @@ class CorruptedGrafstoneManaEffect extends ManaEffect { computedManaHere.setWhite(1); break; } - checkToFirePossibleEvents(computedManaHere, game, source); - player.getManaPool().addMana(computedManaHere, game, source); + return computedManaHere; } } - return true; - } - - @Override - public Mana getMana(Game game, Ability source) { return null; } + @Override public List getNetMana(Game game, Ability source) { List netManas = new ArrayList<>(); Mana types = getManaTypesInGraveyard(game, source); diff --git a/Mage.Sets/src/mage/cards/c/CrumblingVestige.java b/Mage.Sets/src/mage/cards/c/CrumblingVestige.java index 34a30716c76..30532961f26 100644 --- a/Mage.Sets/src/mage/cards/c/CrumblingVestige.java +++ b/Mage.Sets/src/mage/cards/c/CrumblingVestige.java @@ -30,7 +30,7 @@ package mage.cards.c; import java.util.UUID; import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.mana.ColorlessManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; diff --git a/Mage.Sets/src/mage/cards/c/CryptGhast.java b/Mage.Sets/src/mage/cards/c/CryptGhast.java index 5210deb9d76..9e537678332 100644 --- a/Mage.Sets/src/mage/cards/c/CryptGhast.java +++ b/Mage.Sets/src/mage/cards/c/CryptGhast.java @@ -31,7 +31,7 @@ package mage.cards.c; import java.util.UUID; import mage.MageInt; import mage.Mana; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.keyword.ExtortAbility; import mage.abilities.mana.TriggeredManaAbility; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/c/CullingTheWeak.java b/Mage.Sets/src/mage/cards/c/CullingTheWeak.java index 3be44a0500d..1c38f88dc9c 100644 --- a/Mage.Sets/src/mage/cards/c/CullingTheWeak.java +++ b/Mage.Sets/src/mage/cards/c/CullingTheWeak.java @@ -30,7 +30,7 @@ package mage.cards.c; import java.util.UUID; import mage.Mana; import mage.abilities.costs.common.SacrificeTargetCost; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/d/DarkPetition.java b/Mage.Sets/src/mage/cards/d/DarkPetition.java index ac7af3209be..0d83e697152 100644 --- a/Mage.Sets/src/mage/cards/d/DarkPetition.java +++ b/Mage.Sets/src/mage/cards/d/DarkPetition.java @@ -32,7 +32,7 @@ import mage.Mana; import mage.abilities.condition.common.SpellMasteryCondition; import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.AddManaToManaPoolSourceControllerEffect; +import mage.abilities.effects.mana.AddManaToManaPoolSourceControllerEffect; import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; diff --git a/Mage.Sets/src/mage/cards/d/DarkRitual.java b/Mage.Sets/src/mage/cards/d/DarkRitual.java index 375778e947d..e42ae231adf 100644 --- a/Mage.Sets/src/mage/cards/d/DarkRitual.java +++ b/Mage.Sets/src/mage/cards/d/DarkRitual.java @@ -29,7 +29,7 @@ package mage.cards.d; import java.util.UUID; import mage.Mana; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/d/DawnsReflection.java b/Mage.Sets/src/mage/cards/d/DawnsReflection.java index 11769c1d794..8c428f547a4 100644 --- a/Mage.Sets/src/mage/cards/d/DawnsReflection.java +++ b/Mage.Sets/src/mage/cards/d/DawnsReflection.java @@ -148,7 +148,25 @@ class DawnsReflectionManaEffect extends ManaEffect { } @Override - public Mana getMana(Game game, Ability source) { + public Mana produceMana(boolean netMana, Game game, Ability source) { + if (netMana) { + return new Mana(0, 0, 0, 0, 0, 0, 2, 0); + } + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + int x = 2; + Mana mana = new Mana(); + for (int i = 0; i < x; i++) { + ChoiceColor choiceColor = new ChoiceColor(); + if (!controller.choose(Outcome.Benefit, choiceColor, game)) { + return null; + } + choiceColor.increaseMana(mana); + } + controller.getManaPool().addMana(mana, game, source); + return mana; + + } return null; } diff --git a/Mage.Sets/src/mage/cards/d/DeathriteShaman.java b/Mage.Sets/src/mage/cards/d/DeathriteShaman.java index 360555fdb3d..9bc8f9d89df 100644 --- a/Mage.Sets/src/mage/cards/d/DeathriteShaman.java +++ b/Mage.Sets/src/mage/cards/d/DeathriteShaman.java @@ -33,7 +33,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.effects.common.ExileTargetEffect; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.LoseLifeOpponentsEffect; diff --git a/Mage.Sets/src/mage/cards/d/Deconstruct.java b/Mage.Sets/src/mage/cards/d/Deconstruct.java index c4dc9e423c4..a503f8468b8 100644 --- a/Mage.Sets/src/mage/cards/d/Deconstruct.java +++ b/Mage.Sets/src/mage/cards/d/Deconstruct.java @@ -29,7 +29,7 @@ package mage.cards.d; import java.util.UUID; import mage.Mana; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.effects.common.DestroyTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; diff --git a/Mage.Sets/src/mage/cards/d/DesperateRitual.java b/Mage.Sets/src/mage/cards/d/DesperateRitual.java index fde598afad9..70fe01ee57a 100644 --- a/Mage.Sets/src/mage/cards/d/DesperateRitual.java +++ b/Mage.Sets/src/mage/cards/d/DesperateRitual.java @@ -29,7 +29,7 @@ package mage.cards.d; import java.util.UUID; import mage.Mana; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.keyword.SpliceOntoArcaneAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; diff --git a/Mage.Sets/src/mage/cards/d/DictateOfKarametra.java b/Mage.Sets/src/mage/cards/d/DictateOfKarametra.java index 5154880c910..a1e16a54df6 100644 --- a/Mage.Sets/src/mage/cards/d/DictateOfKarametra.java +++ b/Mage.Sets/src/mage/cards/d/DictateOfKarametra.java @@ -29,7 +29,7 @@ package mage.cards.d; import java.util.UUID; import mage.abilities.common.TapForManaAllTriggeredManaAbility; -import mage.abilities.effects.common.AddManaOfAnyTypeProducedEffect; +import mage.abilities.effects.mana.AddManaOfAnyTypeProducedEffect; import mage.abilities.keyword.FlashAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; diff --git a/Mage.Sets/src/mage/cards/d/DoublingCube.java b/Mage.Sets/src/mage/cards/d/DoublingCube.java index 0d4f1080301..5a67189ce66 100644 --- a/Mage.Sets/src/mage/cards/d/DoublingCube.java +++ b/Mage.Sets/src/mage/cards/d/DoublingCube.java @@ -50,7 +50,7 @@ import mage.players.Player; public class DoublingCube extends CardImpl { public DoublingCube(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{2}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}"); // {3}, {T}: Double the amount of each type of mana in your mana pool. Ability ability = new SimpleManaAbility(Zone.BATTLEFIELD, new DoublingCubeEffect(), new ManaCostsImpl("{3}")); @@ -86,6 +86,17 @@ class DoublingCubeEffect extends ManaEffect { if (controller == null) { return false; } + checkToFirePossibleEvents(getMana(game, source), game, source); + controller.getManaPool().addMana(getMana(game, source), game, source); + return true; + } + + @Override + public Mana produceMana(boolean netMana, Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { + return null; + } ManaPool pool = controller.getManaPool(); int blackMana = pool.getBlack(); int whiteMana = pool.getWhite(); @@ -94,7 +105,7 @@ class DoublingCubeEffect extends ManaEffect { int redMana = pool.getRed(); int colorlessMana = pool.getColorless(); - for(ConditionalMana conditionalMana : pool.getConditionalMana()){ + for (ConditionalMana conditionalMana : pool.getConditionalMana()) { blackMana += conditionalMana.getBlack(); whiteMana += conditionalMana.getWhite(); blueMana += conditionalMana.getBlue(); @@ -102,15 +113,7 @@ class DoublingCubeEffect extends ManaEffect { redMana += conditionalMana.getRed(); colorlessMana += conditionalMana.getColorless(); } - Mana mana = new Mana(redMana, greenMana, blueMana, whiteMana, blackMana, 0, 0, colorlessMana); - checkToFirePossibleEvents(mana, game, source); - pool.addMana(mana, game, source); - return true; - } - - @Override - public Mana getMana(Game game, Ability source) { - return null; + return new Mana(redMana, greenMana, blueMana, whiteMana, blackMana, 0, 0, colorlessMana); } @Override diff --git a/Mage.Sets/src/mage/cards/d/Dragonrage.java b/Mage.Sets/src/mage/cards/d/Dragonrage.java index f500fb2d008..a9fc96860b1 100644 --- a/Mage.Sets/src/mage/cards/d/Dragonrage.java +++ b/Mage.Sets/src/mage/cards/d/Dragonrage.java @@ -34,7 +34,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.DynamicManaEffect; +import mage.abilities.effects.mana.DynamicManaEffect; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.effects.common.continuous.GainAbilityAllEffect; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/d/DreadshipReef.java b/Mage.Sets/src/mage/cards/d/DreadshipReef.java index e95d26e4b35..61590b0b361 100644 --- a/Mage.Sets/src/mage/cards/d/DreadshipReef.java +++ b/Mage.Sets/src/mage/cards/d/DreadshipReef.java @@ -34,7 +34,7 @@ import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; -import mage.abilities.effects.common.AddManaInAnyCombinationEffect; +import mage.abilities.effects.mana.AddManaInAnyCombinationEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.mana.ColorlessManaAbility; import mage.abilities.mana.SimpleManaAbility; diff --git a/Mage.Sets/src/mage/cards/d/DroidFoundry.java b/Mage.Sets/src/mage/cards/d/DroidFoundry.java index 546a775705f..492600c0262 100644 --- a/Mage.Sets/src/mage/cards/d/DroidFoundry.java +++ b/Mage.Sets/src/mage/cards/d/DroidFoundry.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.Mana; import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.common.AddManaToManaPoolSourceControllerEffect; +import mage.abilities.effects.mana.AddManaToManaPoolSourceControllerEffect; import mage.abilities.mana.BlackManaAbility; import mage.abilities.mana.WhiteManaAbility; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/d/DruidsRepository.java b/Mage.Sets/src/mage/cards/d/DruidsRepository.java index ad6a16b8086..4a60337b010 100644 --- a/Mage.Sets/src/mage/cards/d/DruidsRepository.java +++ b/Mage.Sets/src/mage/cards/d/DruidsRepository.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.AttacksCreatureYouControlTriggeredAbility; import mage.abilities.costs.common.RemoveCountersSourceCost; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/e/EladamrisVineyard.java b/Mage.Sets/src/mage/cards/e/EladamrisVineyard.java index 0935274126b..62830b567fb 100644 --- a/Mage.Sets/src/mage/cards/e/EladamrisVineyard.java +++ b/Mage.Sets/src/mage/cards/e/EladamrisVineyard.java @@ -30,7 +30,7 @@ package mage.cards.e; import java.util.UUID; import mage.Mana; import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; -import mage.abilities.effects.common.AddManaToManaPoolTargetControllerEffect; +import mage.abilities.effects.mana.AddManaToManaPoolTargetControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/e/ElvishGuidance.java b/Mage.Sets/src/mage/cards/e/ElvishGuidance.java index 5e13ab5535b..0b40d130621 100644 --- a/Mage.Sets/src/mage/cards/e/ElvishGuidance.java +++ b/Mage.Sets/src/mage/cards/e/ElvishGuidance.java @@ -32,7 +32,7 @@ import mage.Mana; import mage.abilities.Ability; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; import mage.abilities.effects.common.AttachEffect; -import mage.abilities.effects.common.DynamicManaEffect; +import mage.abilities.effects.mana.DynamicManaEffect; import mage.abilities.keyword.EnchantAbility; import mage.abilities.mana.TriggeredManaAbility; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/e/EnigmaEidolon.java b/Mage.Sets/src/mage/cards/e/EnigmaEidolon.java index fe1ad071126..e42a0c13bfa 100644 --- a/Mage.Sets/src/mage/cards/e/EnigmaEidolon.java +++ b/Mage.Sets/src/mage/cards/e/EnigmaEidolon.java @@ -41,8 +41,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; -import mage.filter.FilterSpell; -import mage.filter.predicate.mageobject.MulticoloredPredicate; +import mage.filter.StaticFilters; import mage.target.TargetPlayer; /** @@ -51,14 +50,8 @@ import mage.target.TargetPlayer; */ public class EnigmaEidolon extends CardImpl { - private static final FilterSpell filter = new FilterSpell("a multicolored spell"); - - static { - filter.add(new MulticoloredPredicate()); - } - public EnigmaEidolon(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}"); this.subtype.add(SubType.SPIRIT); this.power = new MageInt(2); this.toughness = new MageInt(2); @@ -69,7 +62,8 @@ public class EnigmaEidolon extends CardImpl { ability.addTarget(new TargetPlayer()); this.addAbility(ability); // Whenever you cast a multicolored spell, you may return Enigma Eidolon from your graveyard to your hand. - this.addAbility(new SpellCastControllerTriggeredAbility(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(), filter, true, false)); + this.addAbility(new SpellCastControllerTriggeredAbility(Zone.GRAVEYARD, + new ReturnSourceFromGraveyardToHandEffect(), StaticFilters.FILTER_SPELL_A_MULTICOLORED, true, false)); } public EnigmaEidolon(final EnigmaEidolon card) { diff --git a/Mage.Sets/src/mage/cards/e/EntropicEidolon.java b/Mage.Sets/src/mage/cards/e/EntropicEidolon.java index 519fb197f8c..4b67e012ecf 100644 --- a/Mage.Sets/src/mage/cards/e/EntropicEidolon.java +++ b/Mage.Sets/src/mage/cards/e/EntropicEidolon.java @@ -43,8 +43,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; -import mage.filter.FilterSpell; -import mage.filter.predicate.mageobject.MulticoloredPredicate; +import mage.filter.StaticFilters; import mage.target.TargetPlayer; /** @@ -53,14 +52,8 @@ import mage.target.TargetPlayer; */ public class EntropicEidolon extends CardImpl { - private static final FilterSpell filter = new FilterSpell("a multicolored spell"); - - static { - filter.add(new MulticoloredPredicate()); - } - public EntropicEidolon(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}"); this.subtype.add(SubType.SPIRIT); this.power = new MageInt(2); this.toughness = new MageInt(2); @@ -74,7 +67,8 @@ public class EntropicEidolon extends CardImpl { ability.addTarget(new TargetPlayer()); this.addAbility(ability); // Whenever you cast a multicolored spell, you may return Entropic Eidolon from your graveyard to your hand. - this.addAbility(new SpellCastControllerTriggeredAbility(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(), filter, true, false)); + this.addAbility(new SpellCastControllerTriggeredAbility(Zone.GRAVEYARD, + new ReturnSourceFromGraveyardToHandEffect(), StaticFilters.FILTER_SPELL_A_MULTICOLORED, true, false)); } public EntropicEidolon(final EntropicEidolon card) { diff --git a/Mage.Sets/src/mage/cards/e/EwokVillage.java b/Mage.Sets/src/mage/cards/e/EwokVillage.java index f7a7c80bce2..0acc9e4f282 100644 --- a/Mage.Sets/src/mage/cards/e/EwokVillage.java +++ b/Mage.Sets/src/mage/cards/e/EwokVillage.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.Mana; import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.common.AddManaToManaPoolSourceControllerEffect; +import mage.abilities.effects.mana.AddManaToManaPoolSourceControllerEffect; import mage.abilities.mana.RedManaAbility; import mage.abilities.mana.WhiteManaAbility; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/e/ExtraplanarLens.java b/Mage.Sets/src/mage/cards/e/ExtraplanarLens.java index 41353ab4af6..404c886f3dd 100644 --- a/Mage.Sets/src/mage/cards/e/ExtraplanarLens.java +++ b/Mage.Sets/src/mage/cards/e/ExtraplanarLens.java @@ -32,7 +32,7 @@ import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.AddManaOfAnyTypeProducedEffect; +import mage.abilities.effects.mana.AddManaOfAnyTypeProducedEffect; import mage.abilities.mana.TriggeredManaAbility; import mage.cards.Card; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/f/FertileGround.java b/Mage.Sets/src/mage/cards/f/FertileGround.java index 0ffc34f7ddc..7b98035eed0 100644 --- a/Mage.Sets/src/mage/cards/f/FertileGround.java +++ b/Mage.Sets/src/mage/cards/f/FertileGround.java @@ -29,7 +29,7 @@ package mage.cards.f; import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.effects.common.AddManaAnyColorAttachedControllerEffect; +import mage.abilities.effects.mana.AddManaAnyColorAttachedControllerEffect; import mage.abilities.effects.common.AttachEffect; import mage.abilities.keyword.EnchantAbility; import mage.abilities.mana.TriggeredManaAbility; diff --git a/Mage.Sets/src/mage/cards/f/FoodChain.java b/Mage.Sets/src/mage/cards/f/FoodChain.java index 97a833d9ad3..d08e07eb497 100644 --- a/Mage.Sets/src/mage/cards/f/FoodChain.java +++ b/Mage.Sets/src/mage/cards/f/FoodChain.java @@ -103,6 +103,21 @@ class FoodChainManaEffect extends ManaEffect { @Override public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + checkToFirePossibleEvents(getMana(game, source), game, source); + controller.getManaPool().addMana(getMana(game, source), game, source); + return true; + } + + return false; + } + + @Override + public Mana produceMana(boolean netMana, Game game, Ability source) { + if (netMana) { + return null; + } Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { int manaCostExiled = 0; @@ -115,22 +130,12 @@ class FoodChainManaEffect extends ManaEffect { } ChoiceColor choice = new ChoiceColor(); if (!controller.choose(Outcome.PutManaInPool, choice, game)) { - return false; + return null; } Mana chosen = choice.getMana(manaCostExiled + 1); - Mana mana = new FoodChainManaBuilder().setMana(chosen, source, game).build(); - if (mana != null) { - checkToFirePossibleEvents(mana, game, source); - controller.getManaPool().addMana(mana, game, source); - return true; - } + return new FoodChainManaBuilder().setMana(chosen, source, game).build(); } - return false; - } - - @Override - public Mana getMana(Game game, Ability source) { return null; } diff --git a/Mage.Sets/src/mage/cards/f/FrontierSiege.java b/Mage.Sets/src/mage/cards/f/FrontierSiege.java index ae2a1c5e02e..8c6c3c6c420 100644 --- a/Mage.Sets/src/mage/cards/f/FrontierSiege.java +++ b/Mage.Sets/src/mage/cards/f/FrontierSiege.java @@ -36,7 +36,7 @@ import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; import mage.abilities.condition.common.ModeChoiceSourceCondition; import mage.abilities.decorator.ConditionalTriggeredAbility; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.AddManaToManaPoolSourceControllerEffect; +import mage.abilities.effects.mana.AddManaToManaPoolSourceControllerEffect; import mage.abilities.effects.common.ChooseModeEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/f/FungalReaches.java b/Mage.Sets/src/mage/cards/f/FungalReaches.java index d689dd8a6d1..783c9909fa8 100644 --- a/Mage.Sets/src/mage/cards/f/FungalReaches.java +++ b/Mage.Sets/src/mage/cards/f/FungalReaches.java @@ -34,7 +34,7 @@ import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; -import mage.abilities.effects.common.AddManaInAnyCombinationEffect; +import mage.abilities.effects.mana.AddManaInAnyCombinationEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.mana.ColorlessManaAbility; import mage.abilities.mana.SimpleManaAbility; diff --git a/Mage.Sets/src/mage/cards/g/GauntletOfMight.java b/Mage.Sets/src/mage/cards/g/GauntletOfMight.java index 71015c0bd1a..d167731847b 100644 --- a/Mage.Sets/src/mage/cards/g/GauntletOfMight.java +++ b/Mage.Sets/src/mage/cards/g/GauntletOfMight.java @@ -32,7 +32,7 @@ import mage.Mana; import mage.ObjectColor; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.TapForManaAllTriggeredManaAbility; -import mage.abilities.effects.common.AddManaToManaPoolTargetControllerEffect; +import mage.abilities.effects.mana.AddManaToManaPoolTargetControllerEffect; import mage.abilities.effects.common.ManaEffect; import mage.abilities.effects.common.continuous.BoostAllEffect; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/g/GauntletOfPower.java b/Mage.Sets/src/mage/cards/g/GauntletOfPower.java index 16aefb95014..dbe64da15d4 100644 --- a/Mage.Sets/src/mage/cards/g/GauntletOfPower.java +++ b/Mage.Sets/src/mage/cards/g/GauntletOfPower.java @@ -66,7 +66,7 @@ public class GauntletOfPower extends CardImpl { } public GauntletOfPower(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{5}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{5}"); // As Gauntlet of Power enters the battlefield, choose a color. this.addAbility(new EntersBattlefieldAbility(new ChooseColorEffect(Outcome.Neutral))); @@ -109,7 +109,7 @@ class GauntletOfPowerEffect1 extends ContinuousEffectImpl { public boolean apply(Game game, Ability source) { ObjectColor color = (ObjectColor) game.getState().getValue(source.getSourceId() + "_color"); if (color != null) { - for (Permanent perm: game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game)) { + for (Permanent perm : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game)) { if (perm.getColor(game).contains(color)) { perm.addPower(1); perm.addToughness(1); @@ -208,11 +208,10 @@ class GauntletOfPowerEffectEffect2 extends ManaEffect { @Override public boolean apply(Game game, Ability source) { Permanent land = game.getPermanentOrLKIBattlefield(getTargetPointer().getFirst(game, source)); - if(land != null){ + if (land != null) { Player player = game.getPlayer(land.getControllerId()); - Mana mana = (Mana) getValue("mana"); - if (player != null && mana != null) { - player.getManaPool().addMana(mana, game, source); + if (player != null) { + player.getManaPool().addMana(getMana(game, source), game, source); return true; } } @@ -220,7 +219,14 @@ class GauntletOfPowerEffectEffect2 extends ManaEffect { } @Override - public Mana getMana(Game game, Ability source) { + public Mana produceMana(boolean netMana, Game game, Ability source) { + Permanent land = game.getPermanentOrLKIBattlefield(getTargetPointer().getFirst(game, source)); + if (land != null) { + Mana mana = (Mana) getValue("mana"); + if (mana != null) { + return mana.copy(); + } + } return null; } diff --git a/Mage.Sets/src/mage/cards/g/GemstoneCaverns.java b/Mage.Sets/src/mage/cards/g/GemstoneCaverns.java index b8e3a089469..ef6a00309f4 100644 --- a/Mage.Sets/src/mage/cards/g/GemstoneCaverns.java +++ b/Mage.Sets/src/mage/cards/g/GemstoneCaverns.java @@ -38,8 +38,8 @@ import mage.abilities.costs.common.ExileFromHandCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.decorator.ConditionalManaEffect; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.mana.ConditionalManaAbility; import mage.cards.Card; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/g/Geosurge.java b/Mage.Sets/src/mage/cards/g/Geosurge.java index d6804bee482..32a025ce4a7 100644 --- a/Mage.Sets/src/mage/cards/g/Geosurge.java +++ b/Mage.Sets/src/mage/cards/g/Geosurge.java @@ -33,7 +33,7 @@ import mage.Mana; import mage.abilities.Ability; import mage.abilities.SpellAbility; import mage.abilities.condition.Condition; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; diff --git a/Mage.Sets/src/mage/cards/g/GiftOfParadise.java b/Mage.Sets/src/mage/cards/g/GiftOfParadise.java index 449129159ba..85c7cb92d90 100644 --- a/Mage.Sets/src/mage/cards/g/GiftOfParadise.java +++ b/Mage.Sets/src/mage/cards/g/GiftOfParadise.java @@ -33,7 +33,7 @@ import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; diff --git a/Mage.Sets/src/mage/cards/g/GildedLotus.java b/Mage.Sets/src/mage/cards/g/GildedLotus.java index c2dbc8d634f..91b84f37735 100644 --- a/Mage.Sets/src/mage/cards/g/GildedLotus.java +++ b/Mage.Sets/src/mage/cards/g/GildedLotus.java @@ -30,7 +30,7 @@ package mage.cards.g; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; diff --git a/Mage.Sets/src/mage/cards/g/GloryscaleViashino.java b/Mage.Sets/src/mage/cards/g/GloryscaleViashino.java index 1c05281808f..5702409be81 100644 --- a/Mage.Sets/src/mage/cards/g/GloryscaleViashino.java +++ b/Mage.Sets/src/mage/cards/g/GloryscaleViashino.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.cards.g; import java.util.UUID; @@ -35,10 +34,9 @@ import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; -import mage.filter.FilterSpell; -import mage.filter.predicate.mageobject.MulticoloredPredicate; +import mage.constants.SubType; +import mage.filter.StaticFilters; /** * @@ -46,14 +44,8 @@ import mage.filter.predicate.mageobject.MulticoloredPredicate; */ public class GloryscaleViashino extends CardImpl { - private static final FilterSpell filter = new FilterSpell("a multicolored spell"); - - static { - filter.add(new MulticoloredPredicate()); - } - - public GloryscaleViashino (UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{R}{G}{W}"); + public GloryscaleViashino(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{G}{W}"); this.subtype.add(SubType.VIASHINO); this.subtype.add(SubType.SOLDIER); @@ -61,10 +53,10 @@ public class GloryscaleViashino extends CardImpl { this.toughness = new MageInt(3); // Whenever you cast a multicolored spell, Gloryscale Viashino gets +3/+3 until end of turn. - this.addAbility(new SpellCastControllerTriggeredAbility(new BoostSourceEffect(3, 3, Duration.EndOfTurn), filter, false)); + this.addAbility(new SpellCastControllerTriggeredAbility(new BoostSourceEffect(3, 3, Duration.EndOfTurn), StaticFilters.FILTER_SPELL_A_MULTICOLORED, false)); } - public GloryscaleViashino (final GloryscaleViashino card) { + public GloryscaleViashino(final GloryscaleViashino card) { super(card); } diff --git a/Mage.Sets/src/mage/cards/g/GoldForgeGarrison.java b/Mage.Sets/src/mage/cards/g/GoldForgeGarrison.java index 3c6bc004781..90f1e96bedf 100644 --- a/Mage.Sets/src/mage/cards/g/GoldForgeGarrison.java +++ b/Mage.Sets/src/mage/cards/g/GoldForgeGarrison.java @@ -33,7 +33,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.InfoEffect; import mage.abilities.mana.SimpleManaAbility; diff --git a/Mage.Sets/src/mage/cards/g/GrandArchitect.java b/Mage.Sets/src/mage/cards/g/GrandArchitect.java index 8432486c0ab..b1fcbad133f 100644 --- a/Mage.Sets/src/mage/cards/g/GrandArchitect.java +++ b/Mage.Sets/src/mage/cards/g/GrandArchitect.java @@ -36,7 +36,7 @@ import mage.abilities.condition.Condition; import mage.abilities.costs.common.TapTargetCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.ContinuousEffectImpl; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.effects.common.continuous.BoostControlledEffect; import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/h/HallOfTheBanditLord.java b/Mage.Sets/src/mage/cards/h/HallOfTheBanditLord.java index a1067aebfe2..edb7ad34723 100644 --- a/Mage.Sets/src/mage/cards/h/HallOfTheBanditLord.java +++ b/Mage.Sets/src/mage/cards/h/HallOfTheBanditLord.java @@ -37,7 +37,7 @@ import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.costs.common.PayLifeCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.ContinuousEffect; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.effects.common.ManaEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.keyword.HasteAbility; diff --git a/Mage.Sets/src/mage/cards/h/HarvestMage.java b/Mage.Sets/src/mage/cards/h/HarvestMage.java index 8c0aee8aaf6..be48f3dd415 100644 --- a/Mage.Sets/src/mage/cards/h/HarvestMage.java +++ b/Mage.Sets/src/mage/cards/h/HarvestMage.java @@ -37,7 +37,7 @@ import mage.abilities.costs.common.DiscardTargetCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.ReplacementEffectImpl; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/h/HeartbeatOfSpring.java b/Mage.Sets/src/mage/cards/h/HeartbeatOfSpring.java index 02f620d69ff..82a298b4760 100644 --- a/Mage.Sets/src/mage/cards/h/HeartbeatOfSpring.java +++ b/Mage.Sets/src/mage/cards/h/HeartbeatOfSpring.java @@ -29,7 +29,7 @@ package mage.cards.h; import java.util.UUID; import mage.abilities.common.TapForManaAllTriggeredManaAbility; -import mage.abilities.effects.common.AddManaOfAnyTypeProducedEffect; +import mage.abilities.effects.mana.AddManaOfAnyTypeProducedEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/h/HiddenHerbalists.java b/Mage.Sets/src/mage/cards/h/HiddenHerbalists.java index 6186c298ab6..321e1b169b9 100644 --- a/Mage.Sets/src/mage/cards/h/HiddenHerbalists.java +++ b/Mage.Sets/src/mage/cards/h/HiddenHerbalists.java @@ -33,7 +33,7 @@ import mage.Mana; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.common.RevoltCondition; import mage.abilities.decorator.ConditionalTriggeredAbility; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/h/HighTide.java b/Mage.Sets/src/mage/cards/h/HighTide.java index 6eb596d5c62..dddbcd588d5 100644 --- a/Mage.Sets/src/mage/cards/h/HighTide.java +++ b/Mage.Sets/src/mage/cards/h/HighTide.java @@ -30,7 +30,7 @@ package mage.cards.h; import java.util.UUID; import mage.Mana; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.AddManaToManaPoolTargetControllerEffect; +import mage.abilities.effects.mana.AddManaToManaPoolTargetControllerEffect; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; import mage.abilities.mana.DelayedTriggeredManaAbility; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/h/HuttPalace.java b/Mage.Sets/src/mage/cards/h/HuttPalace.java index 65a98dfba77..530b22b2fb4 100644 --- a/Mage.Sets/src/mage/cards/h/HuttPalace.java +++ b/Mage.Sets/src/mage/cards/h/HuttPalace.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.Mana; import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.common.AddManaToManaPoolSourceControllerEffect; +import mage.abilities.effects.mana.AddManaToManaPoolSourceControllerEffect; import mage.abilities.mana.BlackManaAbility; import mage.abilities.mana.GreenManaAbility; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/i/IceCauldron.java b/Mage.Sets/src/mage/cards/i/IceCauldron.java index 4ee0fe74ff7..9c7555d4a45 100644 --- a/Mage.Sets/src/mage/cards/i/IceCauldron.java +++ b/Mage.Sets/src/mage/cards/i/IceCauldron.java @@ -29,8 +29,8 @@ package mage.cards.i; import java.util.UUID; import mage.ConditionalMana; -import mage.Mana; import mage.MageObjectReference; +import mage.Mana; import mage.abilities.Ability; import mage.abilities.SpellAbility; import mage.abilities.condition.Condition; @@ -48,8 +48,8 @@ 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.CardType; import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Zone; @@ -69,7 +69,7 @@ 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}"); @@ -183,7 +183,7 @@ class IceCauldronCastFromExileEffect extends AsThoughEffectImpl { } class IceCauldronNoteManaEffect extends OneShotEffect { - + private static String manaUsedString; public IceCauldronNoteManaEffect() { @@ -215,7 +215,7 @@ class IceCauldronNoteManaEffect extends OneShotEffect { } class IceCauldronAddManaEffect extends ManaEffect { - + private static Mana storedMana; private static MageObjectReference exiledCardMor; @@ -235,14 +235,23 @@ class IceCauldronAddManaEffect extends ManaEffect { @Override public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + checkToFirePossibleEvents(getMana(game, source), game, source); + controller.getManaPool().addMana(getMana(game, source), game, source); + return true; + } + return false; + } + + @Override + public Mana produceMana(boolean netMana, Game game, Ability source) { Permanent iceCauldron = game.getPermanent(source.getSourceId()); Player controller = game.getPlayer(source.getControllerId()); if (iceCauldron != null && controller != null) { storedMana = (Mana) game.getState().getValue("IceCauldronMana" + source.getSourceId().toString()); exiledCardMor = (MageObjectReference) game.getState().getValue("IceCauldronCard" + source.getSourceId().toString()); if (storedMana != null) { // should be adding the mana even if exiled card is null - checkToFirePossibleEvents(storedMana, game, source); - Card card = exiledCardMor.getCard(game); if (card == null) { card = game.getCard(exiledCardMor.getSourceId()); @@ -250,20 +259,15 @@ class IceCauldronAddManaEffect extends ManaEffect { card = null; } } - IceCauldronConditionalMana iceCauldronMana = new IceCauldronConditionalMana(storedMana, card); - if (iceCauldronMana != null) { - controller.getManaPool().addMana(iceCauldronMana, game, source); - return true; + if (card != null) { + return new IceCauldronConditionalMana(storedMana, card); } } } - return false; + return null; + } - @Override - public Mana getMana(Game game, Ability source) { - return null; - } } class IceCauldronConditionalMana extends ConditionalMana { @@ -276,9 +280,9 @@ class IceCauldronConditionalMana extends ConditionalMana { } class IceCauldronManaCondition implements Condition { - - private static Card exiledCard; - + + private final Card exiledCard; + public IceCauldronManaCondition(Card exiledCard) { this.exiledCard = exiledCard; } diff --git a/Mage.Sets/src/mage/cards/i/IceCave.java b/Mage.Sets/src/mage/cards/i/IceCave.java index 42594825f93..bd0a45b7e1a 100644 --- a/Mage.Sets/src/mage/cards/i/IceCave.java +++ b/Mage.Sets/src/mage/cards/i/IceCave.java @@ -55,7 +55,7 @@ public class IceCave extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{U}{U}"); // Whenever a player casts a spell, any other player may pay that spell's mana cost. If a player does, counter the spell. (Mana cost includes color.) - this.addAbility(new SpellCastAllTriggeredAbility(Zone.BATTLEFIELD, new IceCaveEffect(), StaticFilters.FILTER_A_SPELL, false, SetTargetPointer.SPELL)); + this.addAbility(new SpellCastAllTriggeredAbility(Zone.BATTLEFIELD, new IceCaveEffect(), StaticFilters.FILTER_SPELL_A, false, SetTargetPointer.SPELL)); } public IceCave(final IceCave card) { diff --git a/Mage.Sets/src/mage/cards/i/ImplementsOfSacrifice.java b/Mage.Sets/src/mage/cards/i/ImplementsOfSacrifice.java index 42c6dc3597e..14edd1def85 100644 --- a/Mage.Sets/src/mage/cards/i/ImplementsOfSacrifice.java +++ b/Mage.Sets/src/mage/cards/i/ImplementsOfSacrifice.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; diff --git a/Mage.Sets/src/mage/cards/i/InfernalPlunge.java b/Mage.Sets/src/mage/cards/i/InfernalPlunge.java index 8cfed1470c6..039b374c8bc 100644 --- a/Mage.Sets/src/mage/cards/i/InfernalPlunge.java +++ b/Mage.Sets/src/mage/cards/i/InfernalPlunge.java @@ -30,7 +30,7 @@ package mage.cards.i; import java.util.UUID; import mage.Mana; import mage.abilities.costs.common.SacrificeTargetCost; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/i/InnerFire.java b/Mage.Sets/src/mage/cards/i/InnerFire.java index 699c652cb47..cd2140e7133 100644 --- a/Mage.Sets/src/mage/cards/i/InnerFire.java +++ b/Mage.Sets/src/mage/cards/i/InnerFire.java @@ -30,7 +30,7 @@ package mage.cards.i; import java.util.UUID; import mage.Mana; import mage.abilities.dynamicvalue.common.CardsInControllerHandCount; -import mage.abilities.effects.common.DynamicManaEffect; +import mage.abilities.effects.mana.DynamicManaEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/j/JackInTheMox.java b/Mage.Sets/src/mage/cards/j/JackInTheMox.java index 3da8e1d3dba..9742dc5c6df 100644 --- a/Mage.Sets/src/mage/cards/j/JackInTheMox.java +++ b/Mage.Sets/src/mage/cards/j/JackInTheMox.java @@ -91,44 +91,50 @@ class JackInTheMoxManaEffect extends ManaEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - Permanent permanent = game.getPermanent(source.getSourceId()); - if (controller != null && permanent != null) { - int amount = controller.rollDice(game, 6); - switch (amount) { - case 1: - permanent.sacrifice(source.getSourceId(), game); - controller.loseLife(5, game, false); - break; - case 2: - controller.getManaPool().addMana(Mana.WhiteMana(1), game, source); - break; - case 3: - controller.getManaPool().addMana(Mana.BlueMana(1), game, source); - break; - case 4: - controller.getManaPool().addMana(Mana.BlackMana(1), game, source); - break; - case 5: - controller.getManaPool().addMana(Mana.RedMana(1), game, source); - break; - case 6: - controller.getManaPool().addMana(Mana.GreenMana(1), game, source); - break; - default: - break; - } + if (controller != null) { + controller.getManaPool().addMana(getMana(game, source), game, source); return true; } return false; } @Override - public JackInTheMoxManaEffect copy() { - return new JackInTheMoxManaEffect(this); + public Mana produceMana(boolean netMana, Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Permanent permanent = game.getPermanent(source.getSourceId()); + if (controller != null && permanent != null) { + int amount = controller.rollDice(game, 6); + Mana mana = new Mana(); + switch (amount) { + case 1: + permanent.sacrifice(source.getSourceId(), game); + controller.loseLife(5, game, false); + break; + case 2: + mana.add(Mana.WhiteMana(1)); + break; + case 3: + mana.add(Mana.BlueMana(1)); + break; + case 4: + mana.add(Mana.BlackMana(1)); + break; + case 5: + mana.add(Mana.RedMana(1)); + break; + case 6: + mana.add(Mana.GreenMana(1)); + break; + default: + break; + } + return mana; + } + return null; } @Override - public Mana getMana(Game game, Ability source) { - return null; + public JackInTheMoxManaEffect copy() { + return new JackInTheMoxManaEffect(this); } } diff --git a/Mage.Sets/src/mage/cards/j/JayaBallard.java b/Mage.Sets/src/mage/cards/j/JayaBallard.java index c1594bd0a50..7a6340b9ba7 100644 --- a/Mage.Sets/src/mage/cards/j/JayaBallard.java +++ b/Mage.Sets/src/mage/cards/j/JayaBallard.java @@ -33,7 +33,7 @@ import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.AddConditionalManaEffect; +import mage.abilities.effects.mana.AddConditionalManaEffect; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.mana.builder.common.InstantOrSorcerySpellManaBuilder; import mage.cards.Card; diff --git a/Mage.Sets/src/mage/cards/j/JediTemple.java b/Mage.Sets/src/mage/cards/j/JediTemple.java index d26600d0410..f40b8197043 100644 --- a/Mage.Sets/src/mage/cards/j/JediTemple.java +++ b/Mage.Sets/src/mage/cards/j/JediTemple.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.Mana; import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.common.AddManaToManaPoolSourceControllerEffect; +import mage.abilities.effects.mana.AddManaToManaPoolSourceControllerEffect; import mage.abilities.mana.BlueManaAbility; import mage.abilities.mana.GreenManaAbility; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/j/JeweledAmulet.java b/Mage.Sets/src/mage/cards/j/JeweledAmulet.java index e1210cece5a..386602ce31c 100644 --- a/Mage.Sets/src/mage/cards/j/JeweledAmulet.java +++ b/Mage.Sets/src/mage/cards/j/JeweledAmulet.java @@ -55,7 +55,7 @@ import mage.util.CardUtil; * @author jeffwadsworth */ public class JeweledAmulet extends CardImpl { - + private static final String rule = "{1}, {T}: Put a charge counter on {this}. Note the type of mana spent to pay this activation cost. Activate this ability only if there are no charge counters on {this}"; public JeweledAmulet(UUID ownerId, CardSetInfo setInfo) { @@ -85,7 +85,7 @@ public class JeweledAmulet extends CardImpl { } class JeweledAmuletAddCounterEffect extends OneShotEffect { - + private static String manaUsedString; public JeweledAmuletAddCounterEffect() { @@ -118,7 +118,7 @@ class JeweledAmuletAddCounterEffect extends OneShotEffect { } class JeweledAmuletAddManaEffect extends ManaEffect { - + private static Mana storedMana; JeweledAmuletAddManaEffect() { @@ -137,22 +137,25 @@ class JeweledAmuletAddManaEffect extends ManaEffect { @Override public boolean apply(Game game, Ability source) { - Permanent jeweledAmulet = game.getPermanent(source.getSourceId()); Player controller = game.getPlayer(source.getControllerId()); - if (jeweledAmulet != null - && controller != null) { - storedMana = (Mana) game.getState().getValue("JeweledAmulet" + source.getSourceId().toString()); - if (storedMana != null) { - checkToFirePossibleEvents(storedMana, game, source); - controller.getManaPool().addMana(storedMana, game, source); - return true; - } + if (controller != null) { + checkToFirePossibleEvents(getMana(game, source), game, source); + controller.getManaPool().addMana(getMana(game, source), game, source); + return true; } return false; } @Override - public Mana getMana(Game game, Ability source) { + public Mana produceMana(boolean netMana, Game game, Ability source) { + Permanent jeweledAmulet = game.getPermanent(source.getSourceId()); + Player controller = game.getPlayer(source.getControllerId()); + if (jeweledAmulet != null && controller != null) { + storedMana = (Mana) game.getState().getValue("JeweledAmulet" + source.getSourceId().toString()); + if (storedMana != null) { + return storedMana.copy(); + } + } return null; } diff --git a/Mage.Sets/src/mage/cards/j/JunglePatrol.java b/Mage.Sets/src/mage/cards/j/JunglePatrol.java index 5529bcb966f..958908df754 100644 --- a/Mage.Sets/src/mage/cards/j/JunglePatrol.java +++ b/Mage.Sets/src/mage/cards/j/JunglePatrol.java @@ -35,7 +35,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; diff --git a/Mage.Sets/src/mage/cards/k/KeeperOfProgenitus.java b/Mage.Sets/src/mage/cards/k/KeeperOfProgenitus.java index f42be52ece7..faaf4ad35b9 100644 --- a/Mage.Sets/src/mage/cards/k/KeeperOfProgenitus.java +++ b/Mage.Sets/src/mage/cards/k/KeeperOfProgenitus.java @@ -30,7 +30,7 @@ package mage.cards.k; import java.util.UUID; import mage.MageInt; import mage.abilities.common.TapForManaAllTriggeredManaAbility; -import mage.abilities.effects.common.AddManaOfAnyTypeProducedEffect; +import mage.abilities.effects.mana.AddManaOfAnyTypeProducedEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/k/KhalniGem.java b/Mage.Sets/src/mage/cards/k/KhalniGem.java index ce143e9eba4..ab6a2edb64a 100644 --- a/Mage.Sets/src/mage/cards/k/KhalniGem.java +++ b/Mage.Sets/src/mage/cards/k/KhalniGem.java @@ -33,7 +33,7 @@ import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; diff --git a/Mage.Sets/src/mage/cards/k/KothOfTheHammer.java b/Mage.Sets/src/mage/cards/k/KothOfTheHammer.java index 06a821a7fa2..59e3b3ea7c1 100644 --- a/Mage.Sets/src/mage/cards/k/KothOfTheHammer.java +++ b/Mage.Sets/src/mage/cards/k/KothOfTheHammer.java @@ -34,7 +34,7 @@ import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; -import mage.abilities.effects.common.DynamicManaEffect; +import mage.abilities.effects.mana.DynamicManaEffect; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.UntapTargetEffect; import mage.abilities.effects.common.continuous.BecomesCreatureTargetEffect; diff --git a/Mage.Sets/src/mage/cards/k/KozileksTranslator.java b/Mage.Sets/src/mage/cards/k/KozileksTranslator.java index e996108e659..38c84f83502 100644 --- a/Mage.Sets/src/mage/cards/k/KozileksTranslator.java +++ b/Mage.Sets/src/mage/cards/k/KozileksTranslator.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.MageInt; import mage.Mana; import mage.abilities.costs.common.PayLifeCost; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.keyword.DevoidAbility; import mage.abilities.mana.ActivateOncePerTurnManaAbility; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/k/KyrenToy.java b/Mage.Sets/src/mage/cards/k/KyrenToy.java index 67321a8f0d9..16474e4457d 100644 --- a/Mage.Sets/src/mage/cards/k/KyrenToy.java +++ b/Mage.Sets/src/mage/cards/k/KyrenToy.java @@ -44,6 +44,7 @@ import mage.constants.CardType; import mage.constants.Zone; import mage.counters.CounterType; import mage.game.Game; +import mage.game.permanent.Permanent; import mage.players.Player; /** @@ -104,8 +105,25 @@ public class KyrenToy extends CardImpl { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + checkToFirePossibleEvents(getMana(game, source), game, source); + controller.getManaPool().addMana(getMana(game, source), game, source); + return true; + } + return false; + } + @Override + public Mana produceMana(boolean netMana, Game game, Ability source) { + if (netMana) { + Permanent sourceObject = game.getPermanent(source.getSourceId()); + if (sourceObject != null) { + return new Mana(0, 0, 0, 0, 0, 0, 0, sourceObject.getCounters(game).getCount(CounterType.CHARGE) + 1); + } + return null; + } + Player player = game.getPlayer(source.getControllerId()); if (player != null) { int numberOfMana = 0; for (Cost cost : source.getCosts()) { @@ -113,16 +131,8 @@ public class KyrenToy extends CardImpl { numberOfMana = ((RemoveVariableCountersSourceCost) cost).getAmount(); } } - Mana mana = new Mana(0, 0, 0, 0, 0, 0, 0, numberOfMana + 1); - checkToFirePossibleEvents(mana, game, source); - player.getManaPool().addMana(mana, game, source); - return true; + return new Mana(0, 0, 0, 0, 0, 0, 0, numberOfMana + 1); } - return false; - } - - @Override - public Mana getMana(Game game, Ability source) { return null; } diff --git a/Mage.Sets/src/mage/cards/l/LionsEyeDiamond.java b/Mage.Sets/src/mage/cards/l/LionsEyeDiamond.java index 123ddb8aa3c..d979ec7ba12 100644 --- a/Mage.Sets/src/mage/cards/l/LionsEyeDiamond.java +++ b/Mage.Sets/src/mage/cards/l/LionsEyeDiamond.java @@ -32,8 +32,8 @@ import mage.Mana; import mage.abilities.costs.Cost; import mage.abilities.costs.common.DiscardHandCost; import mage.abilities.costs.common.SacrificeSourceCost; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.cards.CardImpl; import mage.cards.CardSetInfo; diff --git a/Mage.Sets/src/mage/cards/l/LiturgyOfBlood.java b/Mage.Sets/src/mage/cards/l/LiturgyOfBlood.java index 6bd346b2b7e..16beeb18e4c 100644 --- a/Mage.Sets/src/mage/cards/l/LiturgyOfBlood.java +++ b/Mage.Sets/src/mage/cards/l/LiturgyOfBlood.java @@ -29,7 +29,7 @@ package mage.cards.l; import java.util.UUID; import mage.Mana; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.effects.common.DestroyTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; diff --git a/Mage.Sets/src/mage/cards/l/LobberCrew.java b/Mage.Sets/src/mage/cards/l/LobberCrew.java index f2f6ea09b75..09d298e3c61 100644 --- a/Mage.Sets/src/mage/cards/l/LobberCrew.java +++ b/Mage.Sets/src/mage/cards/l/LobberCrew.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.cards.l; import java.util.UUID; @@ -42,8 +41,7 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.constants.TargetController; import mage.constants.Zone; -import mage.filter.FilterSpell; -import mage.filter.predicate.mageobject.MulticoloredPredicate; +import mage.filter.StaticFilters; /** * @@ -51,14 +49,8 @@ import mage.filter.predicate.mageobject.MulticoloredPredicate; */ public class LobberCrew extends CardImpl { - private static final FilterSpell filter = new FilterSpell("a multicolored spell"); - - static { - filter.add(new MulticoloredPredicate()); - } - - public LobberCrew (UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{R}"); + public LobberCrew(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}"); this.subtype.add(SubType.GOBLIN); this.subtype.add(SubType.WARRIOR); @@ -70,10 +62,11 @@ public class LobberCrew extends CardImpl { // {T}: Lobber Crew deals 1 damage to each opponent. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamagePlayersEffect(1, TargetController.OPPONENT), new TapSourceCost())); // Whenever you cast a multicolored spell, untap Lobber Crew. - this.addAbility(new SpellCastControllerTriggeredAbility(new UntapSourceEffect(), filter, false)); + this.addAbility(new SpellCastControllerTriggeredAbility( + new UntapSourceEffect(), StaticFilters.FILTER_SPELL_A_MULTICOLORED, false)); } - public LobberCrew (final LobberCrew card) { + public LobberCrew(final LobberCrew card) { super(card); } diff --git a/Mage.Sets/src/mage/cards/l/LostVale.java b/Mage.Sets/src/mage/cards/l/LostVale.java index 217dcbea31f..722e02ea3f2 100644 --- a/Mage.Sets/src/mage/cards/l/LostVale.java +++ b/Mage.Sets/src/mage/cards/l/LostVale.java @@ -29,7 +29,7 @@ package mage.cards.l; import java.util.UUID; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; diff --git a/Mage.Sets/src/mage/cards/l/LotusBloom.java b/Mage.Sets/src/mage/cards/l/LotusBloom.java index b372d3ec0ca..c0eeb44a7c2 100644 --- a/Mage.Sets/src/mage/cards/l/LotusBloom.java +++ b/Mage.Sets/src/mage/cards/l/LotusBloom.java @@ -32,7 +32,7 @@ import mage.abilities.Ability; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.keyword.SuspendAbility; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/l/LotusCobra.java b/Mage.Sets/src/mage/cards/l/LotusCobra.java index 672523d1a90..5e68ed4261f 100644 --- a/Mage.Sets/src/mage/cards/l/LotusCobra.java +++ b/Mage.Sets/src/mage/cards/l/LotusCobra.java @@ -31,7 +31,7 @@ package mage.cards.l; import java.util.UUID; import mage.MageInt; import mage.abilities.common.LandfallAbility; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/l/LotusVale.java b/Mage.Sets/src/mage/cards/l/LotusVale.java index de9bf428229..55bb1180429 100644 --- a/Mage.Sets/src/mage/cards/l/LotusVale.java +++ b/Mage.Sets/src/mage/cards/l/LotusVale.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.effects.common.EnterBattlefieldPayCostOrPutGraveyardEffect; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/m/MadScienceFairProject.java b/Mage.Sets/src/mage/cards/m/MadScienceFairProject.java index a877f684ae9..bc79e82ec01 100644 --- a/Mage.Sets/src/mage/cards/m/MadScienceFairProject.java +++ b/Mage.Sets/src/mage/cards/m/MadScienceFairProject.java @@ -32,7 +32,7 @@ import mage.Mana; import mage.abilities.Ability; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.common.ManaEffect; -import mage.abilities.mana.ActivatedManaAbilityImpl; +import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.choices.ChoiceColor; @@ -40,7 +40,6 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; import mage.game.Game; -import mage.game.permanent.Permanent; import mage.players.Player; /** @@ -53,7 +52,7 @@ public class MadScienceFairProject extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); // {tap}: Roll a six-sided die. On a 3 or lower, target player adds {C} to their mana pool. Otherwise, that player adds one mana of any color he or she chooses to their mana pool. - this.addAbility(new MadScienceFairProjectManaAbility()); + this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new MadScienceFairManaEffect(), new TapSourceCost())); } public MadScienceFairProject(final MadScienceFairProject card) { @@ -66,22 +65,6 @@ public class MadScienceFairProject extends CardImpl { } } -class MadScienceFairProjectManaAbility extends ActivatedManaAbilityImpl { - - public MadScienceFairProjectManaAbility() { - super(Zone.BATTLEFIELD, new MadScienceFairManaEffect(), new TapSourceCost()); - } - - public MadScienceFairProjectManaAbility(final MadScienceFairProjectManaAbility ability) { - super(ability); - } - - @Override - public MadScienceFairProjectManaAbility copy() { - return new MadScienceFairProjectManaAbility(this); - } -} - class MadScienceFairManaEffect extends ManaEffect { public MadScienceFairManaEffect() { @@ -101,28 +84,33 @@ class MadScienceFairManaEffect extends ManaEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - Permanent permanent = game.getPermanent(source.getSourceId()); - if (controller != null && permanent != null) { - int amount = controller.rollDice(game, 6); - if (amount <= 3) { - controller.getManaPool().addMana(Mana.ColorlessMana(1), game, source); - } else { - ChoiceColor choice = new ChoiceColor(); - if (controller.choose(Outcome.PutManaInPool, choice, game)) { - Mana chosen = choice.getMana(1); - checkToFirePossibleEvents(chosen, game, source); - controller.getManaPool().addMana(chosen, game, source); - } else { - return false; - } - } - return true; + if (controller != null) { + checkToFirePossibleEvents(getMana(game, source), game, source); + controller.getManaPool().addMana(getMana(game, source), game, source); } return false; } @Override - public Mana getMana(Game game, Ability source) { + public Mana produceMana(boolean netMana, Game game, Ability source) { + if (netMana) { + return null; + } + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + int amount = controller.rollDice(game, 6); + if (amount <= 3) { + return Mana.ColorlessMana(1); + } else { + ChoiceColor choice = new ChoiceColor(); + if (controller.choose(Outcome.PutManaInPool, choice, game)) { + Mana chosen = choice.getMana(1); + checkToFirePossibleEvents(chosen, game, source); + return chosen; + } + } + } return null; } + } diff --git a/Mage.Sets/src/mage/cards/m/MagusOfTheVineyard.java b/Mage.Sets/src/mage/cards/m/MagusOfTheVineyard.java index 3a6cc09124f..903f92c9f77 100644 --- a/Mage.Sets/src/mage/cards/m/MagusOfTheVineyard.java +++ b/Mage.Sets/src/mage/cards/m/MagusOfTheVineyard.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.MageInt; import mage.Mana; import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; -import mage.abilities.effects.common.AddManaToManaPoolTargetControllerEffect; +import mage.abilities.effects.mana.AddManaToManaPoolTargetControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/m/ManaBloom.java b/Mage.Sets/src/mage/cards/m/ManaBloom.java index 3a2f290b028..7494cc4a0c2 100644 --- a/Mage.Sets/src/mage/cards/m/ManaBloom.java +++ b/Mage.Sets/src/mage/cards/m/ManaBloom.java @@ -35,7 +35,7 @@ import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.costs.common.RemoveCountersSourceCost; import mage.abilities.decorator.ConditionalTriggeredAbility; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect; import mage.abilities.effects.common.ReturnToHandSourceEffect; import mage.abilities.mana.ActivateOncePerTurnManaAbility; diff --git a/Mage.Sets/src/mage/cards/m/ManaCache.java b/Mage.Sets/src/mage/cards/m/ManaCache.java index 49b964be2f7..de03d528f3a 100644 --- a/Mage.Sets/src/mage/cards/m/ManaCache.java +++ b/Mage.Sets/src/mage/cards/m/ManaCache.java @@ -35,7 +35,7 @@ import mage.abilities.common.OnEventTriggeredAbility; import mage.abilities.costs.common.RemoveCountersSourceCost; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.cards.CardImpl; import mage.cards.CardSetInfo; diff --git a/Mage.Sets/src/mage/cards/m/ManaDrain.java b/Mage.Sets/src/mage/cards/m/ManaDrain.java index f045929d932..69008e49cd3 100644 --- a/Mage.Sets/src/mage/cards/m/ManaDrain.java +++ b/Mage.Sets/src/mage/cards/m/ManaDrain.java @@ -34,7 +34,7 @@ import mage.abilities.common.delayed.AtTheBeginOfMainPhaseDelayedTriggeredAbilit import mage.abilities.common.delayed.AtTheBeginOfMainPhaseDelayedTriggeredAbility.PhaseSelection; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.AddManaToManaPoolTargetControllerEffect; +import mage.abilities.effects.mana.AddManaToManaPoolTargetControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/m/ManaFlare.java b/Mage.Sets/src/mage/cards/m/ManaFlare.java index ba0283d1331..ecaa9aa01b7 100644 --- a/Mage.Sets/src/mage/cards/m/ManaFlare.java +++ b/Mage.Sets/src/mage/cards/m/ManaFlare.java @@ -29,7 +29,7 @@ package mage.cards.m; import java.util.UUID; import mage.abilities.common.TapForManaAllTriggeredManaAbility; -import mage.abilities.effects.common.AddManaOfAnyTypeProducedEffect; +import mage.abilities.effects.mana.AddManaOfAnyTypeProducedEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/m/ManaGeyser.java b/Mage.Sets/src/mage/cards/m/ManaGeyser.java index 419a657ca39..8ca66243bc5 100644 --- a/Mage.Sets/src/mage/cards/m/ManaGeyser.java +++ b/Mage.Sets/src/mage/cards/m/ManaGeyser.java @@ -30,7 +30,7 @@ package mage.cards.m; import java.util.UUID; import mage.Mana; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; -import mage.abilities.effects.common.DynamicManaEffect; +import mage.abilities.effects.mana.DynamicManaEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/m/Manamorphose.java b/Mage.Sets/src/mage/cards/m/Manamorphose.java index 19841739986..3b85630a60b 100644 --- a/Mage.Sets/src/mage/cards/m/Manamorphose.java +++ b/Mage.Sets/src/mage/cards/m/Manamorphose.java @@ -28,7 +28,7 @@ package mage.cards.m; import java.util.UUID; -import mage.abilities.effects.common.AddManaInAnyCombinationEffect; +import mage.abilities.effects.mana.AddManaInAnyCombinationEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; diff --git a/Mage.Sets/src/mage/cards/m/MarduWarshrieker.java b/Mage.Sets/src/mage/cards/m/MarduWarshrieker.java index 51d95236d36..c36018fa529 100644 --- a/Mage.Sets/src/mage/cards/m/MarduWarshrieker.java +++ b/Mage.Sets/src/mage/cards/m/MarduWarshrieker.java @@ -33,7 +33,7 @@ import mage.Mana; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.common.RaidCondition; import mage.abilities.decorator.ConditionalTriggeredAbility; -import mage.abilities.effects.common.AddManaToManaPoolSourceControllerEffect; +import mage.abilities.effects.mana.AddManaToManaPoolSourceControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/m/MarkOfSakiko.java b/Mage.Sets/src/mage/cards/m/MarkOfSakiko.java index 90138bb47fd..d68731b7ec8 100644 --- a/Mage.Sets/src/mage/cards/m/MarkOfSakiko.java +++ b/Mage.Sets/src/mage/cards/m/MarkOfSakiko.java @@ -33,7 +33,7 @@ import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.AddManaToManaPoolTargetControllerEffect; +import mage.abilities.effects.mana.AddManaToManaPoolTargetControllerEffect; import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; import mage.abilities.keyword.EnchantAbility; diff --git a/Mage.Sets/src/mage/cards/m/MarketFestival.java b/Mage.Sets/src/mage/cards/m/MarketFestival.java index 5c82800ca61..441c57cff81 100644 --- a/Mage.Sets/src/mage/cards/m/MarketFestival.java +++ b/Mage.Sets/src/mage/cards/m/MarketFestival.java @@ -131,6 +131,17 @@ class MarketFestivalManaEffect extends ManaEffect { @Override public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + checkToFirePossibleEvents(getMana(game, source), game, source); + controller.getManaPool().addMana(getMana(game, source), game, source); + return true; + } + return false; + } + + @Override + public Mana produceMana(boolean netMana, Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); MageObject sourceObject = game.getObject(source.getSourceId()); if (controller != null && sourceObject != null) { @@ -145,22 +156,15 @@ class MarketFestivalManaEffect extends ManaEffect { choiceColor.setMessage("Second mana color for " + sourceObject.getLogName()); } if (!controller.choose(Outcome.Benefit, choiceColor, game)) { - return false; + return null; } if (choiceColor.getChoice() == null) { // Possible after reconnect? - return false; + return null; } choiceColor.increaseMana(mana); } - checkToFirePossibleEvents(mana, game, source); - controller.getManaPool().addMana(mana, game, source); - return true; + return mana; } - return false; - } - - @Override - public Mana getMana(Game game, Ability source) { return null; } diff --git a/Mage.Sets/src/mage/cards/m/Metalworker.java b/Mage.Sets/src/mage/cards/m/Metalworker.java index b64796a1930..a164ed76302 100644 --- a/Mage.Sets/src/mage/cards/m/Metalworker.java +++ b/Mage.Sets/src/mage/cards/m/Metalworker.java @@ -29,7 +29,6 @@ package mage.cards.m; import java.util.UUID; import mage.MageInt; -import mage.MageObject; import mage.Mana; import mage.abilities.Ability; import mage.abilities.costs.common.TapSourceCost; @@ -40,11 +39,10 @@ import mage.cards.CardSetInfo; import mage.cards.Cards; import mage.cards.CardsImpl; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.Zone; -import mage.filter.FilterCard; -import mage.filter.common.FilterArtifactCard; +import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCardInHand; @@ -56,7 +54,7 @@ import mage.target.common.TargetCardInHand; public class Metalworker extends CardImpl { public Metalworker(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{3}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{3}"); this.subtype.add(SubType.CONSTRUCT); this.power = new MageInt(1); @@ -78,8 +76,6 @@ public class Metalworker extends CardImpl { class MetalworkerManaEffect extends ManaEffect { - private static final FilterCard filter = new FilterArtifactCard(); - public MetalworkerManaEffect() { super(); staticText = "Reveal any number of artifact cards in your hand. Add {C}{C} for each card revealed this way"; @@ -97,34 +93,33 @@ class MetalworkerManaEffect extends ManaEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = source.getSourceObject(game); - if (controller == null || sourceObject == null) { + if (controller == null) { return false; } - - if (controller.getHand().count(filter, game) > 0) { - TargetCardInHand target = new TargetCardInHand(0, Integer.MAX_VALUE, filter); - if (controller.choose(Outcome.Benefit, target, source.getSourceId(), game)) { - Cards cards = new CardsImpl(target.getTargets()); - controller.revealCards(sourceObject.getIdName(), cards, game); - Mana mana = Mana.ColorlessMana(target.getTargets().size() * 2); - checkToFirePossibleEvents(mana, game, source); - controller.getManaPool().addMana(mana, game, source); - } - } + checkToFirePossibleEvents(getMana(game, source), game, source); + controller.getManaPool().addMana(getMana(game, source), game, source); return true; } @Override - public Mana getMana(Game game, Ability source) { + public Mana produceMana(boolean netMana, Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - int artifactsHand = controller.getHand().count(filter, game); - if (artifactsHand > 0) { - return Mana.ColorlessMana(artifactsHand * 2); + if (controller == null) { + return null; + } + int artifacts = controller.getHand().count(StaticFilters.FILTER_CARD_ARTIFACT, game); + if (netMana) { + return Mana.ColorlessMana(artifacts * 2); + } + if (artifacts > 0) { + TargetCardInHand target = new TargetCardInHand(0, Integer.MAX_VALUE, StaticFilters.FILTER_CARD_ARTIFACT); + if (controller.choose(Outcome.Benefit, target, source.getSourceId(), game)) { + Cards cards = new CardsImpl(target.getTargets()); + controller.revealCards(source, cards, game); + return Mana.ColorlessMana(target.getTargets().size() * 2); } } - return null; + return new Mana(); } } diff --git a/Mage.Sets/src/mage/cards/m/Metamorphosis.java b/Mage.Sets/src/mage/cards/m/Metamorphosis.java index eadf6fa2956..39f3000092d 100644 --- a/Mage.Sets/src/mage/cards/m/Metamorphosis.java +++ b/Mage.Sets/src/mage/cards/m/Metamorphosis.java @@ -33,7 +33,7 @@ import mage.abilities.Ability; import mage.abilities.costs.Cost; import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.AddConditionalManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddConditionalManaOfAnyColorEffect; import mage.abilities.mana.builder.ConditionalManaBuilder; import mage.abilities.mana.conditional.CreatureCastConditionalMana; import mage.cards.CardImpl; @@ -90,8 +90,7 @@ class MetamorphosisEffect extends OneShotEffect { } } if (amount > 0) { - AddConditionalManaOfAnyColorEffect anyMana = new AddConditionalManaOfAnyColorEffect(amount, new MetamorphosisManaBuilder()); - anyMana.apply(game, source); //There probably is a more elegant way of doing this but.. I'm still learning :p + new AddConditionalManaOfAnyColorEffect(amount, new MetamorphosisManaBuilder()).apply(game, source); } return false; } diff --git a/Mage.Sets/src/mage/cards/m/MeteorCrater.java b/Mage.Sets/src/mage/cards/m/MeteorCrater.java index 23e14591492..fc148cc6397 100644 --- a/Mage.Sets/src/mage/cards/m/MeteorCrater.java +++ b/Mage.Sets/src/mage/cards/m/MeteorCrater.java @@ -91,6 +91,17 @@ class MeteorCraterEffect extends ManaEffect { @Override public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + checkToFirePossibleEvents(getMana(game, source), game, source); + controller.getManaPool().addMana(getMana(game, source), game, source); + return true; + } + return false; + } + + @Override + public Mana produceMana(boolean netMana, Game game, Ability source) { Mana types = getManaTypes(game, source); Choice choice = new ChoiceColor(true); choice.getChoices().clear(); @@ -144,15 +155,13 @@ class MeteorCraterEffect extends ManaEffect { mana.setWhite(1); break; } - checkToFirePossibleEvents(mana, game, source); - player.getManaPool().addMana(mana, game, source); - return true; + return mana; } - return false; } - return true; + return null; } + @Override public List getNetMana(Game game, Ability source) { List netManas = new ArrayList<>(); Mana types = getManaTypes(game, source); @@ -198,11 +207,6 @@ class MeteorCraterEffect extends ManaEffect { return types; } - @Override - public Mana getMana(Game game, Ability source) { - return null; - } - @Override public MeteorCraterEffect copy() { return new MeteorCraterEffect(this); diff --git a/Mage.Sets/src/mage/cards/m/MirarisWake.java b/Mage.Sets/src/mage/cards/m/MirarisWake.java index b5bb672119a..b88540e0747 100644 --- a/Mage.Sets/src/mage/cards/m/MirarisWake.java +++ b/Mage.Sets/src/mage/cards/m/MirarisWake.java @@ -30,7 +30,7 @@ package mage.cards.m; import java.util.UUID; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.TapForManaAllTriggeredManaAbility; -import mage.abilities.effects.common.AddManaOfAnyTypeProducedEffect; +import mage.abilities.effects.mana.AddManaOfAnyTypeProducedEffect; import mage.abilities.effects.common.continuous.BoostControlledEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; diff --git a/Mage.Sets/src/mage/cards/m/MoistureFarm.java b/Mage.Sets/src/mage/cards/m/MoistureFarm.java index 4ca5b4d5510..8d5d20d448c 100644 --- a/Mage.Sets/src/mage/cards/m/MoistureFarm.java +++ b/Mage.Sets/src/mage/cards/m/MoistureFarm.java @@ -32,7 +32,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.RemoveCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.mana.ColorlessManaAbility; import mage.abilities.mana.SimpleManaAbility; diff --git a/Mage.Sets/src/mage/cards/m/MoltenSlagheap.java b/Mage.Sets/src/mage/cards/m/MoltenSlagheap.java index 94c3969be43..2b6e998f516 100644 --- a/Mage.Sets/src/mage/cards/m/MoltenSlagheap.java +++ b/Mage.Sets/src/mage/cards/m/MoltenSlagheap.java @@ -34,7 +34,7 @@ import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; -import mage.abilities.effects.common.AddManaInAnyCombinationEffect; +import mage.abilities.effects.mana.AddManaInAnyCombinationEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.mana.ColorlessManaAbility; import mage.abilities.mana.SimpleManaAbility; diff --git a/Mage.Sets/src/mage/cards/m/Morselhoarder.java b/Mage.Sets/src/mage/cards/m/Morselhoarder.java index b67a47750b3..712f76898de 100644 --- a/Mage.Sets/src/mage/cards/m/Morselhoarder.java +++ b/Mage.Sets/src/mage/cards/m/Morselhoarder.java @@ -33,7 +33,7 @@ import mage.Mana; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.costs.Cost; import mage.abilities.costs.common.RemoveCountersSourceCost; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/m/MoxLotus.java b/Mage.Sets/src/mage/cards/m/MoxLotus.java index deee68c629e..643c0c2dc2a 100644 --- a/Mage.Sets/src/mage/cards/m/MoxLotus.java +++ b/Mage.Sets/src/mage/cards/m/MoxLotus.java @@ -32,7 +32,7 @@ import mage.Mana; import mage.abilities.Ability; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; diff --git a/Mage.Sets/src/mage/cards/m/MoxOpal.java b/Mage.Sets/src/mage/cards/m/MoxOpal.java index 6421c71096f..c24b6c225ce 100644 --- a/Mage.Sets/src/mage/cards/m/MoxOpal.java +++ b/Mage.Sets/src/mage/cards/m/MoxOpal.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.condition.common.MetalcraftCondition; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.mana.ActivateIfConditionManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; diff --git a/Mage.Sets/src/mage/cards/m/MulDayaChannelers.java b/Mage.Sets/src/mage/cards/m/MulDayaChannelers.java index 8d4eb20e139..ad2691af71c 100644 --- a/Mage.Sets/src/mage/cards/m/MulDayaChannelers.java +++ b/Mage.Sets/src/mage/cards/m/MulDayaChannelers.java @@ -33,7 +33,7 @@ import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.common.TopLibraryCardTypeCondition; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.decorator.ConditionalContinuousEffect; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.effects.common.continuous.PlayWithTheTopCardRevealedEffect; diff --git a/Mage.Sets/src/mage/cards/m/MyrMoonvessel.java b/Mage.Sets/src/mage/cards/m/MyrMoonvessel.java index e062059faf8..d40b2812464 100644 --- a/Mage.Sets/src/mage/cards/m/MyrMoonvessel.java +++ b/Mage.Sets/src/mage/cards/m/MyrMoonvessel.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.MageInt; import mage.Mana; import mage.abilities.common.DiesTriggeredAbility; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/m/MyrReservoir.java b/Mage.Sets/src/mage/cards/m/MyrReservoir.java index d9ba4165e5c..5d4c37b95e7 100644 --- a/Mage.Sets/src/mage/cards/m/MyrReservoir.java +++ b/Mage.Sets/src/mage/cards/m/MyrReservoir.java @@ -36,7 +36,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.condition.Condition; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.effects.common.ReturnToHandTargetEffect; import mage.abilities.mana.BasicManaAbility; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/n/NehebTheEternal.java b/Mage.Sets/src/mage/cards/n/NehebTheEternal.java index a0a28e0cc5b..92dfef4f598 100644 --- a/Mage.Sets/src/mage/cards/n/NehebTheEternal.java +++ b/Mage.Sets/src/mage/cards/n/NehebTheEternal.java @@ -92,23 +92,19 @@ class NehebTheEternalManaEffect extends ManaEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - OpponentsLostLifeCount dynamicValue = new OpponentsLostLifeCount(); - int amount = dynamicValue.calculate(game, source, this); - if (amount > 0) { - controller.getManaPool().addMana(Mana.RedMana(amount), game, source); - } + controller.getManaPool().addMana(getMana(game, source), game, source); return true; } return false; } @Override - public NehebTheEternalManaEffect copy() { - return new NehebTheEternalManaEffect(this); + public Mana produceMana(boolean netMana, Game game, Ability source) { + return Mana.RedMana(new OpponentsLostLifeCount().calculate(game, source, this)); } @Override - public Mana getMana(Game game, Ability source) { - return null; + public NehebTheEternalManaEffect copy() { + return new NehebTheEternalManaEffect(this); } } diff --git a/Mage.Sets/src/mage/cards/n/NewHorizons.java b/Mage.Sets/src/mage/cards/n/NewHorizons.java index 7254f4f328e..5193c4876d9 100644 --- a/Mage.Sets/src/mage/cards/n/NewHorizons.java +++ b/Mage.Sets/src/mage/cards/n/NewHorizons.java @@ -33,7 +33,7 @@ import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect; diff --git a/Mage.Sets/src/mage/cards/n/NimbusMaze.java b/Mage.Sets/src/mage/cards/n/NimbusMaze.java index 23126a5ad59..790d6c886dc 100644 --- a/Mage.Sets/src/mage/cards/n/NimbusMaze.java +++ b/Mage.Sets/src/mage/cards/n/NimbusMaze.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.Mana; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.mana.ActivateIfConditionManaAbility; import mage.abilities.mana.ColorlessManaAbility; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/n/NirkanaRevenant.java b/Mage.Sets/src/mage/cards/n/NirkanaRevenant.java index cb6e3e1bcb2..2e16ec36568 100644 --- a/Mage.Sets/src/mage/cards/n/NirkanaRevenant.java +++ b/Mage.Sets/src/mage/cards/n/NirkanaRevenant.java @@ -32,7 +32,7 @@ import mage.MageInt; import mage.Mana; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.mana.TriggeredManaAbility; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/n/NykthosShrineToNyx.java b/Mage.Sets/src/mage/cards/n/NykthosShrineToNyx.java index 73868dd785b..b652f688ea8 100644 --- a/Mage.Sets/src/mage/cards/n/NykthosShrineToNyx.java +++ b/Mage.Sets/src/mage/cards/n/NykthosShrineToNyx.java @@ -27,6 +27,7 @@ */ package mage.cards.n; +import java.util.ArrayList; import java.util.List; import java.util.UUID; import mage.Mana; @@ -54,7 +55,7 @@ import mage.players.Player; public class NykthosShrineToNyx extends CardImpl { public NykthosShrineToNyx(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.LAND},""); + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); addSuperType(SuperType.LEGENDARY); // {T}: Add {C}. @@ -94,9 +95,7 @@ class NykthosShrineToNyxManaAbility extends ActivatedManaAbilityImpl { public List getNetMana(Game game) { netMana.clear(); if (game != null) { - for (String colorChoice : ChoiceColor.getBaseColors()) { - netMana.add(((NykthosDynamicManaEffect) this.getEffects().get(0)).computeMana(colorChoice, game, this)); - } + netMana.addAll(((ManaEffect) this.getEffects().get(0)).getNetMana(game, this)); } return netMana; } @@ -104,17 +103,13 @@ class NykthosShrineToNyxManaAbility extends ActivatedManaAbilityImpl { class NykthosDynamicManaEffect extends ManaEffect { - private final Mana computedMana; - public NykthosDynamicManaEffect() { super(); - computedMana = new Mana(); this.staticText = "Choose a color. Add an amount of mana of that color equal to your devotion to that color. (Your devotion to a color is the number of mana symbols of that color in the mana costs of permanents you control.)"; } public NykthosDynamicManaEffect(final NykthosDynamicManaEffect effect) { super(effect); - this.computedMana = effect.computedMana.copy(); } @Override @@ -126,45 +121,57 @@ class NykthosDynamicManaEffect extends ManaEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - ChoiceColor choice = new ChoiceColor(); - choice.setMessage("Choose a color for devotion of Nykthos"); - if (controller.choose(outcome, choice, game)) { - computeMana(choice.getChoice(), game, source); - checkToFirePossibleEvents(computedMana, game, source); - controller.getManaPool().addMana(computedMana, game, source); - return true; - } + checkToFirePossibleEvents(getMana(game, source), game, source); + controller.getManaPool().addMana(getMana(game, source), game, source); + return true; } return false; } @Override - public Mana getMana(Game game, Ability source) { + public List getNetMana(Game game, Ability source) { + List netMana = new ArrayList<>(); + for (String colorChoice : ChoiceColor.getBaseColors()) { + netMana.add(computeMana(colorChoice, game, source)); + } + return netMana; + } + + @Override + public Mana produceMana(boolean netMana, Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + ChoiceColor choice = new ChoiceColor(); + choice.setMessage("Choose a color for devotion of Nykthos"); + if (controller.choose(outcome, choice, game)) { + return computeMana(choice.getChoice(), game, source); + } + } return null; } public Mana computeMana(String color, Game game, Ability source) { - this.computedMana.clear(); + Mana mana = new Mana(); if (color != null && !color.isEmpty()) { switch (color) { case "Red": - computedMana.setRed(new DevotionCount(ColoredManaSymbol.R).calculate(game, source, this)); + mana.setRed(new DevotionCount(ColoredManaSymbol.R).calculate(game, source, this)); break; case "Blue": - computedMana.setBlue(new DevotionCount(ColoredManaSymbol.U).calculate(game, source, this)); + mana.setBlue(new DevotionCount(ColoredManaSymbol.U).calculate(game, source, this)); break; case "White": - computedMana.setWhite(new DevotionCount(ColoredManaSymbol.W).calculate(game, source, this)); + mana.setWhite(new DevotionCount(ColoredManaSymbol.W).calculate(game, source, this)); break; case "Black": - computedMana.setBlack(new DevotionCount(ColoredManaSymbol.B).calculate(game, source, this)); + mana.setBlack(new DevotionCount(ColoredManaSymbol.B).calculate(game, source, this)); break; case "Green": - computedMana.setGreen(new DevotionCount(ColoredManaSymbol.G).calculate(game, source, this)); + mana.setGreen(new DevotionCount(ColoredManaSymbol.G).calculate(game, source, this)); break; } } - return computedMana.copy(); + return mana; } } diff --git a/Mage.Sets/src/mage/cards/o/OasisRitualist.java b/Mage.Sets/src/mage/cards/o/OasisRitualist.java index e23c259a789..ab1e9d509ed 100644 --- a/Mage.Sets/src/mage/cards/o/OasisRitualist.java +++ b/Mage.Sets/src/mage/cards/o/OasisRitualist.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.costs.common.ExertSourceCost; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.effects.common.ManaEffect; import mage.abilities.mana.AnyColorManaAbility; import mage.abilities.mana.SimpleManaAbility; diff --git a/Mage.Sets/src/mage/cards/o/OrcishLumberjack.java b/Mage.Sets/src/mage/cards/o/OrcishLumberjack.java index 4adf7acf12f..8f64a5bd9ef 100644 --- a/Mage.Sets/src/mage/cards/o/OrcishLumberjack.java +++ b/Mage.Sets/src/mage/cards/o/OrcishLumberjack.java @@ -27,7 +27,9 @@ */ package mage.cards.o; +import java.util.ArrayList; import java.util.LinkedHashSet; +import java.util.List; import java.util.Set; import java.util.UUID; import mage.MageInt; @@ -89,9 +91,15 @@ public class OrcishLumberjack extends CardImpl { class OrcishLumberjackManaEffect extends ManaEffect { + private List netMana = new ArrayList(); + public OrcishLumberjackManaEffect() { super(); this.staticText = "Add three mana in any combination of {R} and/or {G}"; + netMana.add(new Mana(0, 3, 0, 0, 0, 0, 0, 0)); + netMana.add(new Mana(1, 2, 0, 0, 0, 0, 0, 0)); + netMana.add(new Mana(2, 1, 0, 0, 0, 0, 0, 0)); + netMana.add(new Mana(3, 0, 0, 0, 0, 0, 0, 0)); } public OrcishLumberjackManaEffect(final OrcishLumberjackManaEffect effect) { @@ -105,6 +113,22 @@ class OrcishLumberjackManaEffect extends ManaEffect { @Override public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + checkToFirePossibleEvents(getMana(game, source), game, source); + controller.getManaPool().addMana(getMana(game, source), game, source); + return true; + } + return false; + } + + @Override + public List getNetMana(Game game, Ability source) { + return netMana; + } + + @Override + public Mana produceMana(boolean netMana, Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); if (player != null) { Choice manaChoice = new ChoiceImpl(); @@ -117,7 +141,7 @@ class OrcishLumberjackManaEffect extends ManaEffect { Mana mana = new Mana(); for (int i = 0; i < 3; i++) { if (!player.choose(Outcome.Benefit, manaChoice, game)) { - return false; + return null; } switch (manaChoice.getChoice()) { case "Green": @@ -127,17 +151,9 @@ class OrcishLumberjackManaEffect extends ManaEffect { mana.increaseRed(); break; } - } - checkToFirePossibleEvents(mana, game, source); - player.getManaPool().addMana(mana, game, source); - return true; + return mana; } - return false; - } - - @Override - public Mana getMana(Game game, Ability source) { return null; } diff --git a/Mage.Sets/src/mage/cards/o/Overabundance.java b/Mage.Sets/src/mage/cards/o/Overabundance.java index cf0670223b0..b6fb9b281d6 100644 --- a/Mage.Sets/src/mage/cards/o/Overabundance.java +++ b/Mage.Sets/src/mage/cards/o/Overabundance.java @@ -30,7 +30,7 @@ package mage.cards.o; import java.util.UUID; import mage.abilities.common.TapForManaAllTriggeredAbility; import mage.abilities.common.TapForManaAllTriggeredManaAbility; -import mage.abilities.effects.common.AddManaOfAnyTypeProducedEffect; +import mage.abilities.effects.mana.AddManaOfAnyTypeProducedEffect; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; diff --git a/Mage.Sets/src/mage/cards/o/Overgrowth.java b/Mage.Sets/src/mage/cards/o/Overgrowth.java index 2182b818d60..26bf28bb892 100644 --- a/Mage.Sets/src/mage/cards/o/Overgrowth.java +++ b/Mage.Sets/src/mage/cards/o/Overgrowth.java @@ -30,7 +30,7 @@ package mage.cards.o; import java.util.UUID; import mage.Mana; import mage.abilities.Ability; -import mage.abilities.effects.common.AddManaToManaPoolTargetControllerEffect; +import mage.abilities.effects.mana.AddManaToManaPoolTargetControllerEffect; import mage.abilities.effects.common.AttachEffect; import mage.abilities.keyword.EnchantAbility; import mage.abilities.mana.TriggeredManaAbility; diff --git a/Mage.Sets/src/mage/cards/o/OverlaidTerrain.java b/Mage.Sets/src/mage/cards/o/OverlaidTerrain.java index 43783dec465..6b78d6f8a13 100644 --- a/Mage.Sets/src/mage/cards/o/OverlaidTerrain.java +++ b/Mage.Sets/src/mage/cards/o/OverlaidTerrain.java @@ -33,7 +33,7 @@ import mage.abilities.common.AsEntersBattlefieldAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/p/ParadisePlume.java b/Mage.Sets/src/mage/cards/p/ParadisePlume.java index c6d7ac2a84f..6aba1aaa379 100644 --- a/Mage.Sets/src/mage/cards/p/ParadisePlume.java +++ b/Mage.Sets/src/mage/cards/p/ParadisePlume.java @@ -28,20 +28,17 @@ package mage.cards.p; import java.util.UUID; -import mage.Mana; import mage.ObjectColor; -import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.AsEntersBattlefieldAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.common.ChooseColorEffect; import mage.abilities.effects.common.GainLifeEffect; -import mage.abilities.effects.common.ManaEffect; +import mage.abilities.effects.mana.AddManaChosenColorEffect; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.ColoredManaSymbol; import mage.constants.Outcome; import mage.constants.Zone; import mage.filter.FilterSpell; @@ -49,7 +46,6 @@ import mage.filter.predicate.mageobject.ColorPredicate; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.stack.Spell; -import mage.players.Player; /** * @@ -67,7 +63,7 @@ public class ParadisePlume extends CardImpl { this.addAbility(new ParadisePlumeSpellCastTriggeredAbility()); // {tap}: Add one mana of the chosen color. - this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new ParadisePlumeManaEffect(), new TapSourceCost())); + this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new AddManaChosenColorEffect(), new TapSourceCost())); } @@ -81,42 +77,6 @@ public class ParadisePlume extends CardImpl { } } -class ParadisePlumeManaEffect extends ManaEffect { - - public ParadisePlumeManaEffect() { - super(); - staticText = "Add one mana of the chosen color"; - } - - public ParadisePlumeManaEffect(final ParadisePlumeManaEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player != null) { - player.getManaPool().addMana(getMana(game, source), game, source); - } - return true; - } - - @Override - public Mana getMana(Game game, Ability source) { - ObjectColor color = (ObjectColor) game.getState().getValue(source.getSourceId() + "_color"); - if (color != null) { - return new Mana(ColoredManaSymbol.lookup(color.toString().charAt(0))); - } else { - return null; - } - } - - @Override - public ParadisePlumeManaEffect copy() { - return new ParadisePlumeManaEffect(this); - } -} - class ParadisePlumeSpellCastTriggeredAbility extends TriggeredAbilityImpl { public ParadisePlumeSpellCastTriggeredAbility() { diff --git a/Mage.Sets/src/mage/cards/p/PillarOfTheParuns.java b/Mage.Sets/src/mage/cards/p/PillarOfTheParuns.java index 680349f7f7d..b241fe13d20 100644 --- a/Mage.Sets/src/mage/cards/p/PillarOfTheParuns.java +++ b/Mage.Sets/src/mage/cards/p/PillarOfTheParuns.java @@ -33,8 +33,7 @@ import mage.abilities.mana.conditional.ConditionalSpellManaBuilder; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.FilterSpell; -import mage.filter.predicate.mageobject.MulticoloredPredicate; +import mage.filter.StaticFilters; /** * @@ -42,17 +41,11 @@ import mage.filter.predicate.mageobject.MulticoloredPredicate; */ public class PillarOfTheParuns extends CardImpl { - private static final FilterSpell filter = new FilterSpell("a multicolored spell"); - - static { - filter.add(new MulticoloredPredicate()); - } - public PillarOfTheParuns(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.LAND},""); + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // {T}: Add one mana of any color. Spend this mana only to cast a multicolored spell. - this.addAbility(new ConditionalAnyColorManaAbility(1, new ConditionalSpellManaBuilder(filter))); + this.addAbility(new ConditionalAnyColorManaAbility(1, new ConditionalSpellManaBuilder(StaticFilters.FILTER_SPELL_A_MULTICOLORED))); } public PillarOfTheParuns(final PillarOfTheParuns card) { diff --git a/Mage.Sets/src/mage/cards/p/PlasmCapture.java b/Mage.Sets/src/mage/cards/p/PlasmCapture.java index 83ad53be506..990479248d7 100644 --- a/Mage.Sets/src/mage/cards/p/PlasmCapture.java +++ b/Mage.Sets/src/mage/cards/p/PlasmCapture.java @@ -123,25 +123,33 @@ class PlasmCaptureManaEffect extends ManaEffect { @Override public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + controller.getManaPool().addMana(getMana(game, source), game, source); + return true; + } + return false; + } + + @Override + public Mana produceMana(boolean netMana, Game game, Ability source) { + if (netMana) { + return new Mana(0, 0, 0, 0, 0, 0, amountOfMana, 0); + } Player player = game.getPlayer(source.getControllerId()); if (player != null) { Mana mana = new Mana(); for (int i = 0; i < amountOfMana; i++) { ChoiceColor choiceColor = new ChoiceColor(); if (!player.choose(Outcome.Benefit, choiceColor, game)) { - return false; + return null; } choiceColor.increaseMana(mana); } player.getManaPool().addMana(mana, game, source); - return true; + return mana; } - return false; - } - - @Override - public Mana getMana(Game game, Ability source) { return null; } diff --git a/Mage.Sets/src/mage/cards/p/PriestOfGix.java b/Mage.Sets/src/mage/cards/p/PriestOfGix.java index 5442756a88f..f33308b59dc 100644 --- a/Mage.Sets/src/mage/cards/p/PriestOfGix.java +++ b/Mage.Sets/src/mage/cards/p/PriestOfGix.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.MageInt; import mage.Mana; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/p/PriestOfUrabrask.java b/Mage.Sets/src/mage/cards/p/PriestOfUrabrask.java index 18dc6536030..7cde7a13709 100644 --- a/Mage.Sets/src/mage/cards/p/PriestOfUrabrask.java +++ b/Mage.Sets/src/mage/cards/p/PriestOfUrabrask.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.MageInt; import mage.Mana; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/p/PyramidOfThePantheon.java b/Mage.Sets/src/mage/cards/p/PyramidOfThePantheon.java index 7ad93e523ff..b851c4c1c97 100644 --- a/Mage.Sets/src/mage/cards/p/PyramidOfThePantheon.java +++ b/Mage.Sets/src/mage/cards/p/PyramidOfThePantheon.java @@ -32,7 +32,7 @@ import mage.abilities.Ability; import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.mana.ActivateIfConditionManaAbility; import mage.abilities.mana.AnyColorManaAbility; diff --git a/Mage.Sets/src/mage/cards/p/PyreticRitual.java b/Mage.Sets/src/mage/cards/p/PyreticRitual.java index dc9e4311b63..c98b63be947 100644 --- a/Mage.Sets/src/mage/cards/p/PyreticRitual.java +++ b/Mage.Sets/src/mage/cards/p/PyreticRitual.java @@ -29,7 +29,7 @@ package mage.cards.p; import java.util.UUID; import mage.Mana; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/p/Pyroconvergence.java b/Mage.Sets/src/mage/cards/p/Pyroconvergence.java index 48681f1456c..85e498b7230 100644 --- a/Mage.Sets/src/mage/cards/p/Pyroconvergence.java +++ b/Mage.Sets/src/mage/cards/p/Pyroconvergence.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.cards.p; import java.util.UUID; @@ -35,8 +34,7 @@ import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.FilterSpell; -import mage.filter.predicate.mageobject.MulticoloredPredicate; +import mage.filter.StaticFilters; import mage.target.common.TargetAnyTarget; /** @@ -45,17 +43,12 @@ import mage.target.common.TargetAnyTarget; */ public class Pyroconvergence extends CardImpl { - private static final FilterSpell filter = new FilterSpell("a multicolored spell"); - - static { - filter.add(new MulticoloredPredicate()); - } - public Pyroconvergence(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{4}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{R}"); // Whenever you cast a multicolored spell, Pyroconvergence deals 2 damage to any target. - Ability ability = new SpellCastControllerTriggeredAbility(new DamageTargetEffect(2), filter, false); + Ability ability = new SpellCastControllerTriggeredAbility( + new DamageTargetEffect(2), StaticFilters.FILTER_SPELL_A_MULTICOLORED, false); ability.addTarget(new TargetAnyTarget()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/q/QuirionElves.java b/Mage.Sets/src/mage/cards/q/QuirionElves.java index 1bb03c702fe..5135ea30472 100644 --- a/Mage.Sets/src/mage/cards/q/QuirionElves.java +++ b/Mage.Sets/src/mage/cards/q/QuirionElves.java @@ -29,24 +29,18 @@ package mage.cards.q; import java.util.UUID; import mage.MageInt; -import mage.Mana; -import mage.ObjectColor; -import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.common.ChooseColorEffect; -import mage.abilities.effects.common.ManaEffect; +import mage.abilities.effects.mana.AddManaChosenColorEffect; import mage.abilities.mana.GreenManaAbility; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; -import mage.constants.ColoredManaSymbol; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.Zone; -import mage.game.Game; -import mage.players.Player; /** * @@ -55,7 +49,7 @@ import mage.players.Player; public class QuirionElves extends CardImpl { public QuirionElves(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}"); this.subtype.add(SubType.ELF); this.subtype.add(SubType.DRUID); this.power = new MageInt(1); @@ -66,9 +60,9 @@ public class QuirionElves extends CardImpl { // {tap}: Add {G}. this.addAbility(new GreenManaAbility()); - + // {tap}: Add one mana of the chosen color. - this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new QuirionElvesManaEffect(), new TapSourceCost())); + this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new AddManaChosenColorEffect(), new TapSourceCost())); } @@ -81,39 +75,3 @@ public class QuirionElves extends CardImpl { return new QuirionElves(this); } } - -class QuirionElvesManaEffect extends ManaEffect { - - public QuirionElvesManaEffect() { - super(); - staticText = "Add one mana of the chosen color"; - } - - public QuirionElvesManaEffect(final QuirionElvesManaEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player != null) { - player.getManaPool().addMana(getMana(game, source), game, source); - } - return true; - } - - @Override - public Mana getMana(Game game, Ability source) { - ObjectColor color = (ObjectColor) game.getState().getValue(source.getSourceId() + "_color"); - if (color != null) { - return new Mana(ColoredManaSymbol.lookup(color.toString().charAt(0))); - } else { - return null; - } - } - - @Override - public QuirionElvesManaEffect copy() { - return new QuirionElvesManaEffect(this); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/q/QuirionSentinel.java b/Mage.Sets/src/mage/cards/q/QuirionSentinel.java index 9ef04a171f6..2d9fba93720 100644 --- a/Mage.Sets/src/mage/cards/q/QuirionSentinel.java +++ b/Mage.Sets/src/mage/cards/q/QuirionSentinel.java @@ -30,7 +30,7 @@ package mage.cards.q; import java.util.UUID; import mage.MageInt; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/r/RadhaHeirToKeld.java b/Mage.Sets/src/mage/cards/r/RadhaHeirToKeld.java index d4fe2358420..a2c2655e59e 100644 --- a/Mage.Sets/src/mage/cards/r/RadhaHeirToKeld.java +++ b/Mage.Sets/src/mage/cards/r/RadhaHeirToKeld.java @@ -32,7 +32,7 @@ import mage.MageInt; import mage.Mana; import mage.abilities.Ability; import mage.abilities.common.AttacksTriggeredAbility; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.mana.GreenManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; diff --git a/Mage.Sets/src/mage/cards/r/RamosDragonEngine.java b/Mage.Sets/src/mage/cards/r/RamosDragonEngine.java index e72f3387e9f..174ab5c963f 100644 --- a/Mage.Sets/src/mage/cards/r/RamosDragonEngine.java +++ b/Mage.Sets/src/mage/cards/r/RamosDragonEngine.java @@ -34,7 +34,7 @@ import mage.abilities.Ability; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.costs.common.RemoveCountersSourceCost; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.keyword.FlyingAbility; import mage.abilities.mana.ActivateOncePerTurnManaAbility; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/r/RattleclawMystic.java b/Mage.Sets/src/mage/cards/r/RattleclawMystic.java index e08cfca204b..e7612431c45 100644 --- a/Mage.Sets/src/mage/cards/r/RattleclawMystic.java +++ b/Mage.Sets/src/mage/cards/r/RattleclawMystic.java @@ -32,7 +32,7 @@ import mage.MageInt; import mage.Mana; import mage.abilities.common.TurnedFaceUpSourceTriggeredAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.AddManaToManaPoolSourceControllerEffect; +import mage.abilities.effects.mana.AddManaToManaPoolSourceControllerEffect; import mage.abilities.keyword.MorphAbility; import mage.abilities.mana.BlueManaAbility; import mage.abilities.mana.GreenManaAbility; diff --git a/Mage.Sets/src/mage/cards/r/RegalBehemoth.java b/Mage.Sets/src/mage/cards/r/RegalBehemoth.java index 3640835cadd..a98335138b3 100644 --- a/Mage.Sets/src/mage/cards/r/RegalBehemoth.java +++ b/Mage.Sets/src/mage/cards/r/RegalBehemoth.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.effects.common.BecomesMonarchSourceEffect; import mage.abilities.effects.common.ManaEffect; import mage.abilities.keyword.TrampleAbility; diff --git a/Mage.Sets/src/mage/cards/r/RewardsOfDiversity.java b/Mage.Sets/src/mage/cards/r/RewardsOfDiversity.java index 48c4854bb8f..cf5701e8cd5 100644 --- a/Mage.Sets/src/mage/cards/r/RewardsOfDiversity.java +++ b/Mage.Sets/src/mage/cards/r/RewardsOfDiversity.java @@ -55,7 +55,8 @@ public class RewardsOfDiversity extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}"); // Whenever an opponent casts a multicolored spell, you gain 4 life. - this.addAbility(new SpellCastOpponentTriggeredAbility(new GainLifeEffect(4), filter, false)); + this.addAbility(new SpellCastOpponentTriggeredAbility( + new GainLifeEffect(4), filter, false)); } public RewardsOfDiversity(final RewardsOfDiversity card) { diff --git a/Mage.Sets/src/mage/cards/r/RhysticCave.java b/Mage.Sets/src/mage/cards/r/RhysticCave.java index 0f9b1a85876..bca1ff1151d 100644 --- a/Mage.Sets/src/mage/cards/r/RhysticCave.java +++ b/Mage.Sets/src/mage/cards/r/RhysticCave.java @@ -34,9 +34,9 @@ import mage.abilities.costs.Cost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.BasicManaEffect; -import mage.abilities.effects.common.DoUnlessAnyPlayerPaysManaEffect; import mage.abilities.effects.common.ManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; +import mage.abilities.effects.mana.DoUnlessAnyPlayerPaysManaEffect; import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -108,29 +108,32 @@ class RhysticCaveManaAbility extends ActivatedManaAbilityImpl { class RhysticCaveManaEffect extends ManaEffect { - private final Mana chosenMana; - public RhysticCaveManaEffect() { super(); - chosenMana = new Mana(); this.staticText = "Choose a color. Add one mana of that color "; } public RhysticCaveManaEffect(final RhysticCaveManaEffect effect) { super(effect); - this.chosenMana = effect.chosenMana.copy(); - } - - @Override - public Mana getMana(Game game, Ability source) { - return null; } @Override public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + checkToFirePossibleEvents(getMana(game, source), game, source); + controller.getManaPool().addMana(getMana(game, source), game, source); + return true; + } + return false; + } + + @Override + public Mana produceMana(boolean netMana, Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); ChoiceColor choice = new ChoiceColor(true); if (controller != null && controller.choose(outcome, choice, game)) { + Mana chosenMana = new Mana(); switch (choice.getColor().toString()) { case "R": chosenMana.setRed(1); @@ -148,11 +151,9 @@ class RhysticCaveManaEffect extends ManaEffect { chosenMana.setGreen(1); break; } - checkToFirePossibleEvents(chosenMana, game, source); - controller.getManaPool().addMana(chosenMana, game, source); - return true; + return chosenMana; } - return false; + return null; } @Override diff --git a/Mage.Sets/src/mage/cards/r/RiteOfFlame.java b/Mage.Sets/src/mage/cards/r/RiteOfFlame.java index c0f8030092d..a06556c9524 100644 --- a/Mage.Sets/src/mage/cards/r/RiteOfFlame.java +++ b/Mage.Sets/src/mage/cards/r/RiteOfFlame.java @@ -83,26 +83,27 @@ class RiteOfFlameManaEffect extends ManaEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - int count = 0; - for (Player player : game.getPlayers().values()) { - if (player != null) { - count += player.getGraveyard().count(filter, game); - } - } - controller.getManaPool().addMana(Mana.RedMana(count + 2), game, source); + controller.getManaPool().addMana(getMana(game, source), game, source); return true; } return false; } + @Override + public Mana produceMana(boolean netMana, Game game, Ability source) { + int count = 0; + for (UUID playerId : game.getState().getPlayersInRange(source.getControllerId(), game)) { + Player player = game.getPlayer(playerId); + if (player != null) { + count += player.getGraveyard().count(filter, game); + } + } + return Mana.RedMana(count + 2); + } + @Override public RiteOfFlameManaEffect copy() { return new RiteOfFlameManaEffect(this); } - @Override - public Mana getMana(Game game, Ability source) { - return null; - } - } diff --git a/Mage.Sets/src/mage/cards/r/RiverOfTears.java b/Mage.Sets/src/mage/cards/r/RiverOfTears.java index be9dc444f40..42ffaf26a1d 100644 --- a/Mage.Sets/src/mage/cards/r/RiverOfTears.java +++ b/Mage.Sets/src/mage/cards/r/RiverOfTears.java @@ -32,7 +32,7 @@ import mage.Mana; import mage.abilities.condition.common.PlayLandCondition; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.decorator.ConditionalManaEffect; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.mana.ConditionalManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; diff --git a/Mage.Sets/src/mage/cards/r/RosheenMeanderer.java b/Mage.Sets/src/mage/cards/r/RosheenMeanderer.java index 588f48fd450..deac422121a 100644 --- a/Mage.Sets/src/mage/cards/r/RosheenMeanderer.java +++ b/Mage.Sets/src/mage/cards/r/RosheenMeanderer.java @@ -34,7 +34,7 @@ import mage.MageObject; import mage.Mana; import mage.abilities.Ability; import mage.abilities.condition.Condition; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.mana.BasicManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; diff --git a/Mage.Sets/src/mage/cards/s/SacellumGodspeaker.java b/Mage.Sets/src/mage/cards/s/SacellumGodspeaker.java index fe93b83404d..347e7af4ef6 100644 --- a/Mage.Sets/src/mage/cards/s/SacellumGodspeaker.java +++ b/Mage.Sets/src/mage/cards/s/SacellumGodspeaker.java @@ -37,13 +37,14 @@ import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.ComparisonType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.Zone; import mage.filter.common.FilterCreatureCard; import mage.filter.predicate.mageobject.PowerPredicate; import mage.game.Game; +import mage.players.Player; import mage.target.common.TargetCardInHand; /** @@ -73,10 +74,8 @@ public class SacellumGodspeaker extends CardImpl { } } - class SacellumGodspeakerEffect extends ManaEffect { - private static final FilterCreatureCard filter = new FilterCreatureCard("creature cards with power 5 or greater from your hand"); static { @@ -101,18 +100,26 @@ class SacellumGodspeakerEffect extends ManaEffect { public boolean apply(Game game, Ability source) { TargetCardInHand target = new TargetCardInHand(0, Integer.MAX_VALUE, filter); if (target.choose(Outcome.Benefit, source.getControllerId(), source.getSourceId(), game)) { - Mana mana = Mana.GreenMana(target.getTargets().size()); - checkToFirePossibleEvents(mana, game, source); - game.getPlayer(source.getControllerId()).getManaPool().addMana(mana, game, source); + checkToFirePossibleEvents(getMana(game, source), game, source); + game.getPlayer(source.getControllerId()).getManaPool().addMana(getMana(game, source), game, source); return true; } return false; } @Override - public Mana getMana(Game game, Ability source) { + public Mana produceMana(boolean netMana, Game game, Ability source) { + if (netMana) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + return Mana.GreenMana(controller.getHand().count(filter, game)); + } + } + TargetCardInHand target = new TargetCardInHand(0, Integer.MAX_VALUE, filter); + if (target.choose(Outcome.Benefit, source.getControllerId(), source.getSourceId(), game)) { + return Mana.GreenMana(target.getTargets().size()); + } return null; } - -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/s/Sacrifice.java b/Mage.Sets/src/mage/cards/s/Sacrifice.java index 86bd3085fad..2c6365742b9 100644 --- a/Mage.Sets/src/mage/cards/s/Sacrifice.java +++ b/Mage.Sets/src/mage/cards/s/Sacrifice.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.Mana; import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.dynamicvalue.common.SacrificeCostConvertedMana; -import mage.abilities.effects.common.DynamicManaEffect; +import mage.abilities.effects.mana.DynamicManaEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/s/SakikoMotherOfSummer.java b/Mage.Sets/src/mage/cards/s/SakikoMotherOfSummer.java index 7dc4a260727..628c24b5194 100644 --- a/Mage.Sets/src/mage/cards/s/SakikoMotherOfSummer.java +++ b/Mage.Sets/src/mage/cards/s/SakikoMotherOfSummer.java @@ -32,7 +32,7 @@ import mage.MageInt; import mage.Mana; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.AddManaToManaPoolTargetControllerEffect; +import mage.abilities.effects.mana.AddManaToManaPoolTargetControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/s/SakuraTribeSpringcaller.java b/Mage.Sets/src/mage/cards/s/SakuraTribeSpringcaller.java index cea0cc1784f..65ade8f8c36 100644 --- a/Mage.Sets/src/mage/cards/s/SakuraTribeSpringcaller.java +++ b/Mage.Sets/src/mage/cards/s/SakuraTribeSpringcaller.java @@ -32,7 +32,7 @@ import mage.MageInt; import mage.Mana; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.AddManaToManaPoolTargetControllerEffect; +import mage.abilities.effects.mana.AddManaToManaPoolTargetControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/s/SaltcrustedSteppe.java b/Mage.Sets/src/mage/cards/s/SaltcrustedSteppe.java index fa1de00302f..be0582a92f5 100644 --- a/Mage.Sets/src/mage/cards/s/SaltcrustedSteppe.java +++ b/Mage.Sets/src/mage/cards/s/SaltcrustedSteppe.java @@ -34,7 +34,7 @@ import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; -import mage.abilities.effects.common.AddManaInAnyCombinationEffect; +import mage.abilities.effects.mana.AddManaInAnyCombinationEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.mana.ColorlessManaAbility; import mage.abilities.mana.SimpleManaAbility; diff --git a/Mage.Sets/src/mage/cards/s/SandstormEidolon.java b/Mage.Sets/src/mage/cards/s/SandstormEidolon.java index 262f5036800..8cd03085b06 100644 --- a/Mage.Sets/src/mage/cards/s/SandstormEidolon.java +++ b/Mage.Sets/src/mage/cards/s/SandstormEidolon.java @@ -39,11 +39,10 @@ import mage.abilities.effects.common.combat.CantBlockTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; +import mage.constants.SubType; import mage.constants.Zone; -import mage.filter.FilterSpell; -import mage.filter.predicate.mageobject.MulticoloredPredicate; +import mage.filter.StaticFilters; import mage.target.common.TargetCreaturePermanent; /** @@ -52,14 +51,8 @@ import mage.target.common.TargetCreaturePermanent; */ public class SandstormEidolon extends CardImpl { - private static final FilterSpell filter = new FilterSpell("a multicolored spell"); - - static { - filter.add(new MulticoloredPredicate()); - } - public SandstormEidolon(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}"); this.subtype.add(SubType.SPIRIT); this.power = new MageInt(2); this.toughness = new MageInt(2); @@ -70,7 +63,8 @@ public class SandstormEidolon extends CardImpl { ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); // Whenever you cast a multicolored spell, you may return Sandstorm Eidolon from your graveyard to your hand. - this.addAbility(new SpellCastControllerTriggeredAbility(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(), filter, true, false)); + this.addAbility(new SpellCastControllerTriggeredAbility(Zone.GRAVEYARD, + new ReturnSourceFromGraveyardToHandEffect(), StaticFilters.FILTER_SPELL_A_MULTICOLORED, true, false)); } public SandstormEidolon(final SandstormEidolon card) { diff --git a/Mage.Sets/src/mage/cards/s/SasayaOrochiAscendant.java b/Mage.Sets/src/mage/cards/s/SasayaOrochiAscendant.java index 282326c1b71..87ebdf1e940 100644 --- a/Mage.Sets/src/mage/cards/s/SasayaOrochiAscendant.java +++ b/Mage.Sets/src/mage/cards/s/SasayaOrochiAscendant.java @@ -52,7 +52,6 @@ import mage.filter.predicate.permanent.PermanentIdPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.token.TokenImpl; -import mage.game.permanent.token.Token; import mage.players.Player; /** @@ -130,10 +129,12 @@ class SasayasEssence extends TokenImpl { new SasayasEssenceManaEffectEffect(), new FilterControlledLandPermanent(), SetTargetPointer.PERMANENT)); } + public SasayasEssence(final SasayasEssence token) { super(token); } + @Override public SasayasEssence copy() { return new SasayasEssence(this); } @@ -157,10 +158,23 @@ class SasayasEssenceManaEffectEffect extends ManaEffect { @Override public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + controller.getManaPool().addMana(getMana(game, source), game, source); + checkToFirePossibleEvents(getMana(game, source), game, source); + return true; + + } + return false; + } + + @Override + public Mana produceMana(boolean netMana, Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); Mana mana = (Mana) this.getValue("mana"); Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); if (controller != null && mana != null && permanent != null) { + Mana newMana = new Mana(); FilterPermanent filter = new FilterLandPermanent(); filter.add(Predicates.not(new PermanentIdPredicate(permanent.getId()))); filter.add(new NamePredicate(permanent.getName())); @@ -189,14 +203,14 @@ class SasayasEssenceManaEffectEffect extends ManaEffect { } if (!choice.getChoices().isEmpty()) { - Mana newMana = new Mana(); + for (int i = 0; i < count; i++) { choice.clearChoice(); if (choice.getChoices().size() == 1) { choice.setChoice(choice.getChoices().iterator().next()); } else { if (!controller.choose(outcome, choice, game)) { - return false; + return null; } } switch (choice.getChoice()) { @@ -220,17 +234,11 @@ class SasayasEssenceManaEffectEffect extends ManaEffect { break; } } - controller.getManaPool().addMana(newMana, game, source); - checkToFirePossibleEvents(newMana, game, source); + } } - return true; + return mana; } - return false; - } - - @Override - public Mana getMana(Game game, Ability source) { return null; } diff --git a/Mage.Sets/src/mage/cards/s/SavageVentmaw.java b/Mage.Sets/src/mage/cards/s/SavageVentmaw.java index 256f806a402..3f0427cbdd5 100644 --- a/Mage.Sets/src/mage/cards/s/SavageVentmaw.java +++ b/Mage.Sets/src/mage/cards/s/SavageVentmaw.java @@ -49,7 +49,7 @@ import mage.players.Player; public class SavageVentmaw extends CardImpl { public SavageVentmaw(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{R}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{R}{G}"); this.subtype.add(SubType.DRAGON); this.power = new MageInt(4); this.toughness = new MageInt(4); @@ -75,15 +75,15 @@ public class SavageVentmaw extends CardImpl { } class SavageVentmawManaEffect extends ManaEffect { - + protected Mana mana; protected boolean emptyOnlyOnTurnsEnd; - + public SavageVentmawManaEffect(Mana mana, String textManaPoolOwner, boolean emptyOnTurnsEnd) { super(); this.mana = mana; this.emptyOnlyOnTurnsEnd = emptyOnTurnsEnd; - this.staticText = (textManaPoolOwner.equals("their")?"that player adds ":"add ") + mana.toString() + " to " + textManaPoolOwner + " mana pool"; + this.staticText = (textManaPoolOwner.equals("their") ? "that player adds " : "add ") + mana.toString() + " to " + textManaPoolOwner + " mana pool"; } public SavageVentmawManaEffect(final SavageVentmawManaEffect effect) { @@ -101,15 +101,15 @@ class SavageVentmawManaEffect extends ManaEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - controller.getManaPool().addMana(mana, game, source, emptyOnlyOnTurnsEnd); + controller.getManaPool().addMana(getMana(game, source), game, source, emptyOnlyOnTurnsEnd); return true; } return false; } @Override - public Mana getMana(Game game, Ability source) { - return mana; + public Mana produceMana(boolean netMana, Game game, Ability source) { + return mana.copy(); } } diff --git a/Mage.Sets/src/mage/cards/s/ScatteringStroke.java b/Mage.Sets/src/mage/cards/s/ScatteringStroke.java index 5530dc30467..fe49585c504 100644 --- a/Mage.Sets/src/mage/cards/s/ScatteringStroke.java +++ b/Mage.Sets/src/mage/cards/s/ScatteringStroke.java @@ -33,7 +33,7 @@ import mage.abilities.Ability; import mage.abilities.common.delayed.AtTheBeginOfMainPhaseDelayedTriggeredAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.AddManaToManaPoolSourceControllerEffect; +import mage.abilities.effects.mana.AddManaToManaPoolSourceControllerEffect; import mage.abilities.effects.common.ClashEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; diff --git a/Mage.Sets/src/mage/cards/s/SeethingSong.java b/Mage.Sets/src/mage/cards/s/SeethingSong.java index c915b2832b7..dc4aa3607e6 100644 --- a/Mage.Sets/src/mage/cards/s/SeethingSong.java +++ b/Mage.Sets/src/mage/cards/s/SeethingSong.java @@ -29,7 +29,7 @@ package mage.cards.s; import java.util.UUID; import mage.Mana; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/s/SeismicSpike.java b/Mage.Sets/src/mage/cards/s/SeismicSpike.java index 230234770c6..c3278b1d6f6 100644 --- a/Mage.Sets/src/mage/cards/s/SeismicSpike.java +++ b/Mage.Sets/src/mage/cards/s/SeismicSpike.java @@ -29,7 +29,7 @@ package mage.cards.s; import java.util.UUID; import mage.Mana; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.effects.common.DestroyTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; diff --git a/Mage.Sets/src/mage/cards/s/SelvalaExplorerReturned.java b/Mage.Sets/src/mage/cards/s/SelvalaExplorerReturned.java index 0b5b7e20433..a8a55e21ff7 100644 --- a/Mage.Sets/src/mage/cards/s/SelvalaExplorerReturned.java +++ b/Mage.Sets/src/mage/cards/s/SelvalaExplorerReturned.java @@ -101,10 +101,10 @@ class SelvalaExplorerReturnedEffect extends ManaEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - Mana parley = getMana(game, source); - if (parley.getGreen() > 0) { - controller.getManaPool().addMana(parley, game, source); - controller.gainLife(parley.getGreen(), game, source); + Mana mana = getMana(game, source); + if (mana.getGreen() > 0) { + controller.getManaPool().addMana(mana, game, source); + controller.gainLife(mana.getGreen(), game, source); } return true; } @@ -112,7 +112,11 @@ class SelvalaExplorerReturnedEffect extends ManaEffect { } @Override - public Mana getMana(Game game, Ability source) { + public Mana produceMana(boolean netMana, Game game, Ability source) { + if (netMana) { + + } return Mana.GreenMana(ParleyCount.getInstance().calculate(game, source, this)); } + } diff --git a/Mage.Sets/src/mage/cards/s/SelvalaHeartOfTheWilds.java b/Mage.Sets/src/mage/cards/s/SelvalaHeartOfTheWilds.java index 902d6b6783e..afc41bb48d4 100644 --- a/Mage.Sets/src/mage/cards/s/SelvalaHeartOfTheWilds.java +++ b/Mage.Sets/src/mage/cards/s/SelvalaHeartOfTheWilds.java @@ -37,8 +37,8 @@ import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.GreatestPowerAmongControlledCreaturesValue; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.AddManaInAnyCombinationEffect; import mage.abilities.effects.common.ManaEffect; +import mage.abilities.effects.mana.AddManaInAnyCombinationEffect; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -79,7 +79,9 @@ public class SelvalaHeartOfTheWilds extends CardImpl { this.addAbility(new EntersBattlefieldAllTriggeredAbility(Zone.BATTLEFIELD, new SelvalaHeartOfTheWildsEffect(), filter, false, SetTargetPointer.PERMANENT, rule)); // {G}, {T}: Add X mana in any combination of colors, where X is the greatest power among creatures you control. - ManaEffect manaEffect = new AddManaInAnyCombinationEffect(new GreatestPowerAmongControlledCreaturesValue(), rule2, ColoredManaSymbol.B, ColoredManaSymbol.U, ColoredManaSymbol.R, ColoredManaSymbol.W, ColoredManaSymbol.G); + ManaEffect manaEffect = new AddManaInAnyCombinationEffect( + new GreatestPowerAmongControlledCreaturesValue(), rule2, + ColoredManaSymbol.B, ColoredManaSymbol.U, ColoredManaSymbol.R, ColoredManaSymbol.W, ColoredManaSymbol.G); Ability ability = new SimpleManaAbility(Zone.BATTLEFIELD, manaEffect, new ManaCostsImpl("{G}")); ability.addCost(new TapSourceCost()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/s/ShelteredAerie.java b/Mage.Sets/src/mage/cards/s/ShelteredAerie.java index 50474c03437..44bbcc08f22 100644 --- a/Mage.Sets/src/mage/cards/s/ShelteredAerie.java +++ b/Mage.Sets/src/mage/cards/s/ShelteredAerie.java @@ -32,7 +32,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; import mage.abilities.keyword.EnchantAbility; diff --git a/Mage.Sets/src/mage/cards/s/ShizukoCallerOfAutumn.java b/Mage.Sets/src/mage/cards/s/ShizukoCallerOfAutumn.java index 1ef8495c694..358a169aa44 100644 --- a/Mage.Sets/src/mage/cards/s/ShizukoCallerOfAutumn.java +++ b/Mage.Sets/src/mage/cards/s/ShizukoCallerOfAutumn.java @@ -32,7 +32,7 @@ import mage.MageInt; import mage.Mana; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.AddManaToManaPoolTargetControllerEffect; +import mage.abilities.effects.mana.AddManaToManaPoolTargetControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/s/ShrineOfTheForsakenGods.java b/Mage.Sets/src/mage/cards/s/ShrineOfTheForsakenGods.java index c5979571d88..962960e40cd 100644 --- a/Mage.Sets/src/mage/cards/s/ShrineOfTheForsakenGods.java +++ b/Mage.Sets/src/mage/cards/s/ShrineOfTheForsakenGods.java @@ -30,7 +30,7 @@ package mage.cards.s; import java.util.UUID; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.AddConditionalColorlessManaEffect; +import mage.abilities.effects.mana.AddConditionalColorlessManaEffect; import mage.abilities.mana.ActivateIfConditionManaAbility; import mage.abilities.mana.ColorlessManaAbility; import mage.abilities.mana.conditional.ConditionalSpellManaBuilder; diff --git a/Mage.Sets/src/mage/cards/s/SilhanaStarfletcher.java b/Mage.Sets/src/mage/cards/s/SilhanaStarfletcher.java index b2791b389eb..04e5c726245 100644 --- a/Mage.Sets/src/mage/cards/s/SilhanaStarfletcher.java +++ b/Mage.Sets/src/mage/cards/s/SilhanaStarfletcher.java @@ -29,24 +29,18 @@ package mage.cards.s; import java.util.UUID; import mage.MageInt; -import mage.Mana; -import mage.ObjectColor; -import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.common.ChooseColorEffect; -import mage.abilities.effects.common.ManaEffect; +import mage.abilities.effects.mana.AddManaChosenColorEffect; import mage.abilities.keyword.ReachAbility; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; -import mage.constants.ColoredManaSymbol; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.Zone; -import mage.game.Game; -import mage.players.Player; /** * @@ -55,7 +49,7 @@ import mage.players.Player; public class SilhanaStarfletcher extends CardImpl { public SilhanaStarfletcher(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); this.subtype.add(SubType.ELF); this.subtype.add(SubType.DRUID); this.subtype.add(SubType.ARCHER); @@ -64,13 +58,13 @@ public class SilhanaStarfletcher extends CardImpl { // Reach this.addAbility(ReachAbility.getInstance()); - - // As Silhana Starfletcher enters the battlefield, choose a color. + + // As Silhana Starfletcher enters the battlefield, choose a color. this.addAbility(new EntersBattlefieldAbility(new ChooseColorEffect(Outcome.Neutral))); - + // {tap}: Add one mana of the chosen color. - this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new SilhanaStarfletcherManaEffect(), new TapSourceCost())); - + this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new AddManaChosenColorEffect(), new TapSourceCost())); + } public SilhanaStarfletcher(final SilhanaStarfletcher card) { @@ -82,39 +76,3 @@ public class SilhanaStarfletcher extends CardImpl { return new SilhanaStarfletcher(this); } } - -class SilhanaStarfletcherManaEffect extends ManaEffect { - - public SilhanaStarfletcherManaEffect() { - super(); - staticText = "Add one mana of the chosen color"; - } - - public SilhanaStarfletcherManaEffect(final SilhanaStarfletcherManaEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player != null) { - player.getManaPool().addMana(getMana(game, source), game, source); - } - return true; - } - - @Override - public Mana getMana(Game game, Ability source) { - ObjectColor color = (ObjectColor) game.getState().getValue(source.getSourceId() + "_color"); - if (color != null) { - return new Mana(ColoredManaSymbol.lookup(color.toString().charAt(0))); - } else { - return null; - } - } - - @Override - public SilhanaStarfletcherManaEffect copy() { - return new SilhanaStarfletcherManaEffect(this); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/s/SithCitadel.java b/Mage.Sets/src/mage/cards/s/SithCitadel.java index e6df5302963..1594330baeb 100644 --- a/Mage.Sets/src/mage/cards/s/SithCitadel.java +++ b/Mage.Sets/src/mage/cards/s/SithCitadel.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.Mana; import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.common.AddManaToManaPoolSourceControllerEffect; +import mage.abilities.effects.mana.AddManaToManaPoolSourceControllerEffect; import mage.abilities.mana.BlueManaAbility; import mage.abilities.mana.RedManaAbility; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/s/SolGrail.java b/Mage.Sets/src/mage/cards/s/SolGrail.java index 3333e579f1f..ccdb80ba900 100644 --- a/Mage.Sets/src/mage/cards/s/SolGrail.java +++ b/Mage.Sets/src/mage/cards/s/SolGrail.java @@ -28,22 +28,16 @@ package mage.cards.s; import java.util.UUID; -import mage.Mana; -import mage.ObjectColor; -import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.common.ChooseColorEffect; -import mage.abilities.effects.common.ManaEffect; +import mage.abilities.effects.mana.AddManaChosenColorEffect; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.ColoredManaSymbol; import mage.constants.Outcome; import mage.constants.Zone; -import mage.game.Game; -import mage.players.Player; /** * @@ -52,13 +46,13 @@ import mage.players.Player; public class SolGrail extends CardImpl { public SolGrail(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); // As Sol Grail enters the battlefield, choose a color. this.addAbility(new EntersBattlefieldAbility(new ChooseColorEffect(Outcome.Neutral))); - // {tap}: Add one mana of the chosen color. - this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new SolGrailManaEffect(), new TapSourceCost())); + // {T}: Add one mana of the chosen color. + this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new AddManaChosenColorEffect(), new TapSourceCost())); } @@ -71,39 +65,3 @@ public class SolGrail extends CardImpl { return new SolGrail(this); } } - -class SolGrailManaEffect extends ManaEffect { - - public SolGrailManaEffect() { - super(); - staticText = "Add one mana of the chosen color"; - } - - public SolGrailManaEffect(final SolGrailManaEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player != null) { - player.getManaPool().addMana(getMana(game, source), game, source); - } - return true; - } - - @Override - public Mana getMana(Game game, Ability source) { - ObjectColor color = (ObjectColor) game.getState().getValue(source.getSourceId() + "_color"); - if (color != null) { - return new Mana(ColoredManaSymbol.lookup(color.toString().charAt(0))); - } else { - return null; - } - } - - @Override - public SolGrailManaEffect copy() { - return new SolGrailManaEffect(this); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/s/SoldierOfThePantheon.java b/Mage.Sets/src/mage/cards/s/SoldierOfThePantheon.java index 1a08844833c..d361524e780 100644 --- a/Mage.Sets/src/mage/cards/s/SoldierOfThePantheon.java +++ b/Mage.Sets/src/mage/cards/s/SoldierOfThePantheon.java @@ -38,7 +38,7 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; import mage.filter.FilterObject; -import mage.filter.FilterSpell; +import mage.filter.StaticFilters; import mage.filter.predicate.mageobject.MulticoloredPredicate; /** @@ -47,15 +47,14 @@ import mage.filter.predicate.mageobject.MulticoloredPredicate; */ public class SoldierOfThePantheon extends CardImpl { - private static final FilterSpell filterSpell = new FilterSpell("multicolored spell"); private static final FilterObject filter = new FilterObject("multicolored"); + static { filter.add(new MulticoloredPredicate()); - filterSpell.add(new MulticoloredPredicate()); } public SoldierOfThePantheon(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.SOLDIER); @@ -65,7 +64,7 @@ public class SoldierOfThePantheon extends CardImpl { // Protection from multicolored this.addAbility(new ProtectionAbility(filter)); // Whenever an opponent casts a multicolored spell, you gain 1 life. - this.addAbility(new SpellCastOpponentTriggeredAbility(Zone.BATTLEFIELD, new GainLifeEffect(1), filterSpell, false)); + this.addAbility(new SpellCastOpponentTriggeredAbility(Zone.BATTLEFIELD, new GainLifeEffect(1), StaticFilters.FILTER_SPELL_A_MULTICOLORED, false)); } diff --git a/Mage.Sets/src/mage/cards/s/SongsOfTheDamned.java b/Mage.Sets/src/mage/cards/s/SongsOfTheDamned.java index 4f50e692403..c0f134028ca 100644 --- a/Mage.Sets/src/mage/cards/s/SongsOfTheDamned.java +++ b/Mage.Sets/src/mage/cards/s/SongsOfTheDamned.java @@ -30,7 +30,7 @@ package mage.cards.s; import java.util.UUID; import mage.Mana; import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount; -import mage.abilities.effects.common.DynamicManaEffect; +import mage.abilities.effects.mana.DynamicManaEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/s/SpectralSearchlight.java b/Mage.Sets/src/mage/cards/s/SpectralSearchlight.java index 9878aa09327..05878cda7a7 100644 --- a/Mage.Sets/src/mage/cards/s/SpectralSearchlight.java +++ b/Mage.Sets/src/mage/cards/s/SpectralSearchlight.java @@ -28,17 +28,20 @@ package mage.cards.s; import java.util.UUID; +import mage.Mana; import mage.abilities.Ability; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.AddManaOfAnyColorToManaPoolTargetPlayerEffect; import mage.abilities.effects.common.ChoosePlayerEffect; import mage.abilities.effects.common.ManaEffect; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.choices.ChoiceColor; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; +import mage.game.Game; +import mage.players.Player; /** * @@ -50,7 +53,7 @@ public class SpectralSearchlight extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); // {T}: Choose a player. That player adds one mana of any color he or she chooses to their mana pool. - ManaEffect effect = new AddManaOfAnyColorToManaPoolTargetPlayerEffect("chosen player"); + ManaEffect effect = new SpectralSearchlightManaEffect("chosen player"); effect.setText("That player adds one mana of any color he or she chooses to their mana pool"); Ability ability = new SimpleManaAbility(Zone.BATTLEFIELD, effect, new TapSourceCost()); // choosing player as first effect, before adding mana effect @@ -67,3 +70,46 @@ public class SpectralSearchlight extends CardImpl { return new SpectralSearchlight(this); } } + +class SpectralSearchlightManaEffect extends ManaEffect { + + public SpectralSearchlightManaEffect(String textManaPoolOwner) { + super(); + this.staticText = (textManaPoolOwner.equals("their") ? "that player adds " : "add ") + "one mana of any color" + " to " + textManaPoolOwner + " mana pool"; + } + + public SpectralSearchlightManaEffect(final SpectralSearchlightManaEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer((UUID) game.getState().getValue(source.getSourceId() + "_player")); + if (player != null) { + checkToFirePossibleEvents(getMana(game, source), game, source); + player.getManaPool().addMana(getMana(game, source), game, source); + return true; + } + return false; + } + + @Override + public Mana produceMana(boolean netMana, Game game, Ability source) { + if (netMana) { + return null; + } + UUID playerId = (UUID) game.getState().getValue(source.getSourceId() + "_player"); + Player player = game.getPlayer(playerId); + ChoiceColor choice = new ChoiceColor(); + if (player != null && player.choose(outcome, choice, game)) { + return choice.getMana(1); + } + return new Mana(); + } + + @Override + public SpectralSearchlightManaEffect copy() { + return new SpectralSearchlightManaEffect(this); + } + +} diff --git a/Mage.Sets/src/mage/cards/s/SpireOfIndustry.java b/Mage.Sets/src/mage/cards/s/SpireOfIndustry.java index 1c9b2658579..6bc4a96235f 100644 --- a/Mage.Sets/src/mage/cards/s/SpireOfIndustry.java +++ b/Mage.Sets/src/mage/cards/s/SpireOfIndustry.java @@ -32,7 +32,7 @@ import mage.abilities.Ability; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; import mage.abilities.costs.common.PayLifeCost; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.mana.ActivateIfConditionManaAbility; import mage.abilities.mana.ColorlessManaAbility; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/s/SquanderedResources.java b/Mage.Sets/src/mage/cards/s/SquanderedResources.java index bea07cd8423..1bb3ae6e09b 100644 --- a/Mage.Sets/src/mage/cards/s/SquanderedResources.java +++ b/Mage.Sets/src/mage/cards/s/SquanderedResources.java @@ -44,11 +44,9 @@ import mage.choices.Choice; import mage.choices.ChoiceColor; import mage.constants.CardType; import mage.constants.ColoredManaSymbol; -import mage.constants.SuperType; import mage.constants.Zone; import mage.filter.common.FilterControlledLandPermanent; import mage.filter.common.FilterControlledPermanent; -import mage.filter.predicate.mageobject.SupertypePredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; @@ -81,12 +79,6 @@ public class SquanderedResources extends CardImpl { class SquanderedResourcesEffect extends ManaEffect { - private static final FilterControlledPermanent filter = new FilterControlledLandPermanent(); - - static { - filter.add(new SupertypePredicate(SuperType.BASIC)); - } - public SquanderedResourcesEffect() { super(); staticText = "Add one mana of any type the sacrificed land could produce"; @@ -98,7 +90,17 @@ class SquanderedResourcesEffect extends ManaEffect { @Override public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + checkToFirePossibleEvents(getMana(game, source), game, source); + controller.getManaPool().addMana(getMana(game, source), game, source); + return true; + } + return false; + } + @Override + public Mana produceMana(boolean netMana, Game game, Ability source) { Mana types = getManaTypes(game, source); Choice choice = new ChoiceColor(true); choice.getChoices().clear(); @@ -129,16 +131,16 @@ class SquanderedResourcesEffect extends ManaEffect { choice.getChoices().add("White"); choice.getChoices().add("Colorless"); } + Mana mana = new Mana(); if (!choice.getChoices().isEmpty()) { Player player = game.getPlayer(source.getControllerId()); if (choice.getChoices().size() == 1) { choice.setChoice(choice.getChoices().iterator().next()); } else { if (!player.choose(outcome, choice, game)) { - return false; + return null; } } - Mana mana = new Mana(); switch (choice.getChoice()) { case "Black": mana.setBlack(1); @@ -159,13 +161,12 @@ class SquanderedResourcesEffect extends ManaEffect { mana.setColorless(1); break; } - checkToFirePossibleEvents(mana, game, source); - player.getManaPool().addMana(mana, game, source); } - return true; + return mana; } + @Override public List getNetMana(Game game, Ability source) { List netManas = new ArrayList<>(); Mana types = getManaTypes(game, source); @@ -211,11 +212,6 @@ class SquanderedResourcesEffect extends ManaEffect { return types; } - @Override - public Mana getMana(Game game, Ability source) { - return null; - } - @Override public SquanderedResourcesEffect copy() { return new SquanderedResourcesEffect(this); diff --git a/Mage.Sets/src/mage/cards/s/StarCompass.java b/Mage.Sets/src/mage/cards/s/StarCompass.java index 7b370f453f0..04670106944 100644 --- a/Mage.Sets/src/mage/cards/s/StarCompass.java +++ b/Mage.Sets/src/mage/cards/s/StarCompass.java @@ -37,6 +37,7 @@ import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.common.ManaEffect; import mage.abilities.mana.ActivatedManaAbilityImpl; +import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.choices.Choice; @@ -64,7 +65,7 @@ public class StarCompass extends CardImpl { // Star Compass enters the battlefield tapped. this.addAbility(new EntersBattlefieldTappedAbility()); // {tap}: Add one mana of any color that a basic land you control could produce. - this.addAbility(new StarCompassManaAbility()); + this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new StarCompassManaEffect(), new TapSourceCost())); } public StarCompass(final StarCompass card) { @@ -77,27 +78,6 @@ public class StarCompass extends CardImpl { } } -class StarCompassManaAbility extends ActivatedManaAbilityImpl { - - public StarCompassManaAbility() { - super(Zone.BATTLEFIELD, new StarCompassManaEffect(), new TapSourceCost()); - } - - public StarCompassManaAbility(final StarCompassManaAbility ability) { - super(ability); - } - - @Override - public StarCompassManaAbility copy() { - return new StarCompassManaAbility(this); - } - - @Override - public List getNetMana(Game game) { - return ((StarCompassManaEffect) getEffects().get(0)).getNetMana(game, this); - } -} - class StarCompassManaEffect extends ManaEffect { private static final FilterControlledPermanent filter = new FilterControlledLandPermanent(); @@ -187,6 +167,76 @@ class StarCompassManaEffect extends ManaEffect { return true; } + @Override + public Mana produceMana(boolean netMana, Game game, Ability source) { + Mana types = getManaTypes(game, source); + Choice choice = new ChoiceColor(true); + choice.getChoices().clear(); + choice.setMessage("Pick a mana color"); + if (types.getBlack() > 0) { + choice.getChoices().add("Black"); + } + if (types.getRed() > 0) { + choice.getChoices().add("Red"); + } + if (types.getBlue() > 0) { + choice.getChoices().add("Blue"); + } + if (types.getGreen() > 0) { + choice.getChoices().add("Green"); + } + if (types.getWhite() > 0) { + choice.getChoices().add("White"); + } + if (types.getColorless() > 0) { + choice.getChoices().add("Colorless"); + } + if (types.getAny() > 0) { + choice.getChoices().add("Black"); + choice.getChoices().add("Red"); + choice.getChoices().add("Blue"); + choice.getChoices().add("Green"); + choice.getChoices().add("White"); + choice.getChoices().add("Colorless"); + } + if (!choice.getChoices().isEmpty()) { + Player player = game.getPlayer(source.getControllerId()); + if (choice.getChoices().size() == 1) { + choice.setChoice(choice.getChoices().iterator().next()); + } else { + if (!player.choose(outcome, choice, game)) { + return null; + } + } + if (choice.getChoice() != null) { + Mana mana = new Mana(); + switch (choice.getChoice()) { + case "Black": + mana.setBlack(1); + break; + case "Blue": + mana.setBlue(1); + break; + case "Red": + mana.setRed(1); + break; + case "Green": + mana.setGreen(1); + break; + case "White": + mana.setWhite(1); + break; + case "Colorless": + mana.setColorless(1); + break; + } + return mana; + } + } + return null; + } + + @Override public List getNetMana(Game game, Ability source) { List netManas = new ArrayList<>(); Mana types = getManaTypes(game, source); @@ -227,11 +277,6 @@ class StarCompassManaEffect extends ManaEffect { return types; } - @Override - public Mana getMana(Game game, Ability source) { - return null; - } - @Override public StarCompassManaEffect copy() { return new StarCompassManaEffect(this); diff --git a/Mage.Sets/src/mage/cards/s/SuChi.java b/Mage.Sets/src/mage/cards/s/SuChi.java index f7fabf609fd..2506b367621 100644 --- a/Mage.Sets/src/mage/cards/s/SuChi.java +++ b/Mage.Sets/src/mage/cards/s/SuChi.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.MageInt; import mage.Mana; import mage.abilities.common.DiesTriggeredAbility; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/t/TaintedField.java b/Mage.Sets/src/mage/cards/t/TaintedField.java index c94ec32386f..bff0990d448 100644 --- a/Mage.Sets/src/mage/cards/t/TaintedField.java +++ b/Mage.Sets/src/mage/cards/t/TaintedField.java @@ -30,7 +30,7 @@ package mage.cards.t; import mage.Mana; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.mana.ActivateIfConditionManaAbility; import mage.abilities.mana.ColorlessManaAbility; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/t/TaintedIsle.java b/Mage.Sets/src/mage/cards/t/TaintedIsle.java index 54010a60564..61d0aaaae9e 100644 --- a/Mage.Sets/src/mage/cards/t/TaintedIsle.java +++ b/Mage.Sets/src/mage/cards/t/TaintedIsle.java @@ -30,7 +30,7 @@ package mage.cards.t; import mage.Mana; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.mana.ActivateIfConditionManaAbility; import mage.abilities.mana.ColorlessManaAbility; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/t/TaintedPeak.java b/Mage.Sets/src/mage/cards/t/TaintedPeak.java index c44b5d05497..75827528a9f 100644 --- a/Mage.Sets/src/mage/cards/t/TaintedPeak.java +++ b/Mage.Sets/src/mage/cards/t/TaintedPeak.java @@ -30,7 +30,7 @@ package mage.cards.t; import mage.Mana; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.mana.ActivateIfConditionManaAbility; import mage.abilities.mana.ColorlessManaAbility; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/t/TaintedWood.java b/Mage.Sets/src/mage/cards/t/TaintedWood.java index 668b7564cb7..a95a9f86b46 100644 --- a/Mage.Sets/src/mage/cards/t/TaintedWood.java +++ b/Mage.Sets/src/mage/cards/t/TaintedWood.java @@ -30,7 +30,7 @@ package mage.cards.t; import mage.Mana; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.mana.ActivateIfConditionManaAbility; import mage.abilities.mana.ColorlessManaAbility; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/t/Tangleroot.java b/Mage.Sets/src/mage/cards/t/Tangleroot.java index bb2d2c1c9fb..2268edc948c 100644 --- a/Mage.Sets/src/mage/cards/t/Tangleroot.java +++ b/Mage.Sets/src/mage/cards/t/Tangleroot.java @@ -30,7 +30,7 @@ package mage.cards.t; import java.util.UUID; import mage.Mana; import mage.abilities.common.SpellCastAllTriggeredAbility; -import mage.abilities.effects.common.AddManaToManaPoolTargetControllerEffect; +import mage.abilities.effects.mana.AddManaToManaPoolTargetControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/t/TempleOfTheFalseGod.java b/Mage.Sets/src/mage/cards/t/TempleOfTheFalseGod.java index e6690f60bda..f84c19b486c 100644 --- a/Mage.Sets/src/mage/cards/t/TempleOfTheFalseGod.java +++ b/Mage.Sets/src/mage/cards/t/TempleOfTheFalseGod.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.Mana; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.mana.ActivateIfConditionManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; diff --git a/Mage.Sets/src/mage/cards/t/Terrarion.java b/Mage.Sets/src/mage/cards/t/Terrarion.java index 71d429cdcb2..a7153c8ad8e 100644 --- a/Mage.Sets/src/mage/cards/t/Terrarion.java +++ b/Mage.Sets/src/mage/cards/t/Terrarion.java @@ -34,7 +34,7 @@ import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.effects.common.AddManaInAnyCombinationEffect; +import mage.abilities.effects.mana.AddManaInAnyCombinationEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/t/TheFirstEruption.java b/Mage.Sets/src/mage/cards/t/TheFirstEruption.java index d456f607cdb..1b3a03a68fe 100644 --- a/Mage.Sets/src/mage/cards/t/TheFirstEruption.java +++ b/Mage.Sets/src/mage/cards/t/TheFirstEruption.java @@ -32,7 +32,7 @@ import mage.Mana; import mage.abilities.Ability; import mage.abilities.common.SagaAbility; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.effects.common.DamageAllEffect; import mage.abilities.keyword.FlyingAbility; import mage.constants.SubType; diff --git a/Mage.Sets/src/mage/cards/t/ThranTurbine.java b/Mage.Sets/src/mage/cards/t/ThranTurbine.java index 27c57f40bb5..c63e5765cb3 100644 --- a/Mage.Sets/src/mage/cards/t/ThranTurbine.java +++ b/Mage.Sets/src/mage/cards/t/ThranTurbine.java @@ -34,7 +34,7 @@ import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.condition.Condition; import mage.abilities.costs.Cost; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.AddConditionalColorlessManaEffect; +import mage.abilities.effects.mana.AddConditionalColorlessManaEffect; import mage.abilities.mana.builder.ConditionalManaBuilder; import mage.abilities.mana.conditional.ManaCondition; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/t/TraceOfAbundance.java b/Mage.Sets/src/mage/cards/t/TraceOfAbundance.java index c3ec37655e5..099a6c57b14 100644 --- a/Mage.Sets/src/mage/cards/t/TraceOfAbundance.java +++ b/Mage.Sets/src/mage/cards/t/TraceOfAbundance.java @@ -30,7 +30,7 @@ package mage.cards.t; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.common.AddManaAnyColorAttachedControllerEffect; +import mage.abilities.effects.mana.AddManaAnyColorAttachedControllerEffect; import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; import mage.abilities.keyword.EnchantAbility; diff --git a/Mage.Sets/src/mage/cards/t/TurnToDust.java b/Mage.Sets/src/mage/cards/t/TurnToDust.java index dc41b7695e3..2debb0e20c7 100644 --- a/Mage.Sets/src/mage/cards/t/TurnToDust.java +++ b/Mage.Sets/src/mage/cards/t/TurnToDust.java @@ -29,7 +29,7 @@ package mage.cards.t; import java.util.UUID; import mage.Mana; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.effects.common.DestroyTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; diff --git a/Mage.Sets/src/mage/cards/u/UrzasFilter.java b/Mage.Sets/src/mage/cards/u/UrzasFilter.java index d54586d2bc6..631a522980e 100644 --- a/Mage.Sets/src/mage/cards/u/UrzasFilter.java +++ b/Mage.Sets/src/mage/cards/u/UrzasFilter.java @@ -42,17 +42,18 @@ import mage.filter.predicate.mageobject.MulticoloredPredicate; * @author LevelX2 */ public class UrzasFilter extends CardImpl { + private static final FilterCard filter = new FilterCard("multicolored spells"); - + static { - filter.add(new MulticoloredPredicate()); + filter.add(new MulticoloredPredicate()); } - + public UrzasFilter(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{4}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}"); // Multicolored spells cost up to {2} less to cast. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SpellsCostReductionAllEffect(filter, 2, true))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SpellsCostReductionAllEffect(filter, 2, true))); } public UrzasFilter(final UrzasFilter card) { diff --git a/Mage.Sets/src/mage/cards/u/UtopiaSprawl.java b/Mage.Sets/src/mage/cards/u/UtopiaSprawl.java index 37e436f6af2..441f29cfc38 100644 --- a/Mage.Sets/src/mage/cards/u/UtopiaSprawl.java +++ b/Mage.Sets/src/mage/cards/u/UtopiaSprawl.java @@ -58,7 +58,7 @@ public class UtopiaSprawl extends CardImpl { private static final FilterLandPermanent filter = new FilterLandPermanent(SubType.FOREST, "Forest"); public UtopiaSprawl(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{G}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{G}"); this.subtype.add(SubType.AURA); // Enchant Forest @@ -143,7 +143,7 @@ class UtopiaSprawlEffect extends ManaEffect { } @Override - public Mana getMana(Game game, Ability source) { + public Mana produceMana(boolean netMana, Game game, Ability source) { ObjectColor color = (ObjectColor) game.getState().getValue(source.getSourceId() + "_color"); if (color != null) { return new Mana(ColoredManaSymbol.lookup(color.toString().charAt(0))); diff --git a/Mage.Sets/src/mage/cards/v/Valleymaker.java b/Mage.Sets/src/mage/cards/v/Valleymaker.java index e85761ff7c5..93283100403 100644 --- a/Mage.Sets/src/mage/cards/v/Valleymaker.java +++ b/Mage.Sets/src/mage/cards/v/Valleymaker.java @@ -34,7 +34,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.AddManaToManaPoolTargetControllerEffect; +import mage.abilities.effects.mana.AddManaToManaPoolTargetControllerEffect; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/v/VaultOfCatlacan.java b/Mage.Sets/src/mage/cards/v/VaultOfCatlacan.java index d20f73742ec..6c85a1477fe 100644 --- a/Mage.Sets/src/mage/cards/v/VaultOfCatlacan.java +++ b/Mage.Sets/src/mage/cards/v/VaultOfCatlacan.java @@ -33,7 +33,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; -import mage.abilities.effects.common.DynamicManaEffect; +import mage.abilities.effects.mana.DynamicManaEffect; import mage.abilities.effects.common.InfoEffect; import mage.abilities.mana.AnyColorManaAbility; import mage.abilities.mana.SimpleManaAbility; diff --git a/Mage.Sets/src/mage/cards/v/VedalkenEngineer.java b/Mage.Sets/src/mage/cards/v/VedalkenEngineer.java index d4e99bab291..3e5ae32ce11 100644 --- a/Mage.Sets/src/mage/cards/v/VedalkenEngineer.java +++ b/Mage.Sets/src/mage/cards/v/VedalkenEngineer.java @@ -34,10 +34,9 @@ import mage.MageObject; import mage.Mana; import mage.abilities.Ability; import mage.abilities.condition.Condition; -import mage.abilities.costs.Cost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.common.ManaEffect; -import mage.abilities.mana.ActivatedManaAbilityImpl; +import mage.abilities.mana.SimpleManaAbility; import mage.abilities.mana.builder.ConditionalManaBuilder; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -64,7 +63,7 @@ public class VedalkenEngineer extends CardImpl { this.toughness = new MageInt(1); // {tap}: Add two mana of any one color. Spend this mana only to cast artifact spells or activate abilities of artifacts. - this.addAbility(new VedalkenEngineerAbility(new TapSourceCost(), 2, new VedalkenEngineerManaBuilder())); + this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new VedalkenEngineerEffect(2, new VedalkenEngineerManaBuilder()), new TapSourceCost())); } public VedalkenEngineer(final VedalkenEngineer card) { @@ -110,23 +109,6 @@ class VedalkenEngineerManaCondition implements Condition { } } -class VedalkenEngineerAbility extends ActivatedManaAbilityImpl { - - public VedalkenEngineerAbility(Cost cost, int amount, ConditionalManaBuilder manaBuilder) { - super(Zone.BATTLEFIELD, new VedalkenEngineerEffect(amount, manaBuilder), cost); - this.netMana.add(new Mana(0, 0, 0, 0, 0, 0, amount, 0)); - } - - public VedalkenEngineerAbility(final VedalkenEngineerAbility ability) { - super(ability); - } - - @Override - public VedalkenEngineerAbility copy() { - return new VedalkenEngineerAbility(this); - } -} - class VedalkenEngineerEffect extends ManaEffect { private final int amount; @@ -153,19 +135,23 @@ class VedalkenEngineerEffect extends ManaEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - ChoiceColor choiceColor = new ChoiceColor(true); - if (controller != null && controller.choose(Outcome.Benefit, choiceColor, game)) { - Mana mana = choiceColor.getMana(amount); - Mana condMana = manaBuilder.setMana(mana, source, game).build(); - checkToFirePossibleEvents(condMana, game, source); - controller.getManaPool().addMana(condMana, game, source); + if (controller != null) { + checkToFirePossibleEvents(getMana(game, source), game, source); + controller.getManaPool().addMana(getMana(game, source), game, source); return true; } return false; } @Override - public Mana getMana(Game game, Ability source) { + public Mana produceMana(boolean netMana, Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + ChoiceColor choiceColor = new ChoiceColor(true); + if (controller != null && controller.choose(Outcome.Benefit, choiceColor, game)) { + + Mana condMana = manaBuilder.setMana(choiceColor.getMana(amount), source, game).build(); + return condMana; + } return null; } diff --git a/Mage.Sets/src/mage/cards/v/VerdantEidolon.java b/Mage.Sets/src/mage/cards/v/VerdantEidolon.java index 80768cf9522..f17d2300379 100644 --- a/Mage.Sets/src/mage/cards/v/VerdantEidolon.java +++ b/Mage.Sets/src/mage/cards/v/VerdantEidolon.java @@ -33,16 +33,15 @@ import mage.abilities.Ability; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; import mage.abilities.effects.common.ReturnSourceFromGraveyardToHandEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; -import mage.filter.FilterSpell; -import mage.filter.predicate.mageobject.MulticoloredPredicate; +import mage.filter.StaticFilters; /** * @@ -50,14 +49,8 @@ import mage.filter.predicate.mageobject.MulticoloredPredicate; */ public class VerdantEidolon extends CardImpl { - private static final FilterSpell filter = new FilterSpell("a multicolored spell"); - - static { - filter.add(new MulticoloredPredicate()); - } - public VerdantEidolon(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}"); this.subtype.add(SubType.SPIRIT); this.power = new MageInt(2); this.toughness = new MageInt(2); @@ -67,7 +60,8 @@ public class VerdantEidolon extends CardImpl { ability.addCost(new SacrificeSourceCost()); this.addAbility(ability); // Whenever you cast a multicolored spell, you may return Verdant Eidolon from your graveyard to your hand. - this.addAbility(new SpellCastControllerTriggeredAbility(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(), filter, true, false)); + this.addAbility(new SpellCastControllerTriggeredAbility(Zone.GRAVEYARD, + new ReturnSourceFromGraveyardToHandEffect(), StaticFilters.FILTER_SPELL_A_MULTICOLORED, true, false)); } public VerdantEidolon(final VerdantEidolon card) { diff --git a/Mage.Sets/src/mage/cards/v/VerdantHaven.java b/Mage.Sets/src/mage/cards/v/VerdantHaven.java index ff4b2a1098e..301124c5411 100644 --- a/Mage.Sets/src/mage/cards/v/VerdantHaven.java +++ b/Mage.Sets/src/mage/cards/v/VerdantHaven.java @@ -30,7 +30,7 @@ package mage.cards.v; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.common.AddManaAnyColorAttachedControllerEffect; +import mage.abilities.effects.mana.AddManaAnyColorAttachedControllerEffect; import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.keyword.EnchantAbility; diff --git a/Mage.Sets/src/mage/cards/v/VernalBloom.java b/Mage.Sets/src/mage/cards/v/VernalBloom.java index 5f7e6bbd2c4..3420d2fdc40 100644 --- a/Mage.Sets/src/mage/cards/v/VernalBloom.java +++ b/Mage.Sets/src/mage/cards/v/VernalBloom.java @@ -30,7 +30,7 @@ package mage.cards.v; import java.util.UUID; import mage.Mana; import mage.abilities.common.TapForManaAllTriggeredManaAbility; -import mage.abilities.effects.common.AddManaToManaPoolTargetControllerEffect; +import mage.abilities.effects.mana.AddManaToManaPoolTargetControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Sets/src/mage/cards/v/VesperGhoul.java b/Mage.Sets/src/mage/cards/v/VesperGhoul.java index cf62024ae64..b90e964984d 100644 --- a/Mage.Sets/src/mage/cards/v/VesperGhoul.java +++ b/Mage.Sets/src/mage/cards/v/VesperGhoul.java @@ -32,7 +32,7 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.costs.common.PayLifeCost; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; diff --git a/Mage.Sets/src/mage/cards/v/VorinclexVoiceOfHunger.java b/Mage.Sets/src/mage/cards/v/VorinclexVoiceOfHunger.java index cb4be6ad30a..6ad34256621 100644 --- a/Mage.Sets/src/mage/cards/v/VorinclexVoiceOfHunger.java +++ b/Mage.Sets/src/mage/cards/v/VorinclexVoiceOfHunger.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.TapForManaAllTriggeredManaAbility; -import mage.abilities.effects.common.AddManaOfAnyTypeProducedEffect; +import mage.abilities.effects.mana.AddManaOfAnyTypeProducedEffect; import mage.abilities.effects.common.DontUntapInControllersNextUntapStepTargetEffect; import mage.abilities.effects.common.ManaEffect; import mage.abilities.keyword.TrampleAbility; diff --git a/Mage.Sets/src/mage/cards/w/WallOfRoots.java b/Mage.Sets/src/mage/cards/w/WallOfRoots.java index 5c943041178..2c56adb9a1b 100644 --- a/Mage.Sets/src/mage/cards/w/WallOfRoots.java +++ b/Mage.Sets/src/mage/cards/w/WallOfRoots.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.MageInt; import mage.Mana; import mage.abilities.costs.common.PutCountersSourceCost; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.keyword.DefenderAbility; import mage.abilities.mana.ActivateOncePerTurnManaAbility; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/w/WasteNot.java b/Mage.Sets/src/mage/cards/w/WasteNot.java index 0dec58c5ab2..58e7eabcfdb 100644 --- a/Mage.Sets/src/mage/cards/w/WasteNot.java +++ b/Mage.Sets/src/mage/cards/w/WasteNot.java @@ -30,7 +30,7 @@ package mage.cards.w; import java.util.UUID; import mage.Mana; import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.cards.Card; diff --git a/Mage.Sets/src/mage/cards/w/WeirdingWood.java b/Mage.Sets/src/mage/cards/w/WeirdingWood.java index a1c1725fc88..70d1e57d78f 100644 --- a/Mage.Sets/src/mage/cards/w/WeirdingWood.java +++ b/Mage.Sets/src/mage/cards/w/WeirdingWood.java @@ -33,7 +33,7 @@ import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; import mage.abilities.effects.keyword.InvestigateEffect; diff --git a/Mage.Sets/src/mage/cards/w/WhispererOfTheWilds.java b/Mage.Sets/src/mage/cards/w/WhispererOfTheWilds.java index d8e407f8dd3..7934f4c6a04 100644 --- a/Mage.Sets/src/mage/cards/w/WhispererOfTheWilds.java +++ b/Mage.Sets/src/mage/cards/w/WhispererOfTheWilds.java @@ -33,7 +33,7 @@ import mage.Mana; import mage.abilities.Ability; import mage.abilities.condition.common.FerociousCondition; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.mana.ActivateIfConditionManaAbility; import mage.abilities.mana.GreenManaAbility; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/w/WildGrowth.java b/Mage.Sets/src/mage/cards/w/WildGrowth.java index 2ef466c63ad..2893922d83c 100644 --- a/Mage.Sets/src/mage/cards/w/WildGrowth.java +++ b/Mage.Sets/src/mage/cards/w/WildGrowth.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.Mana; import mage.abilities.Ability; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.AddManaToManaPoolTargetControllerEffect; +import mage.abilities.effects.mana.AddManaToManaPoolTargetControllerEffect; import mage.abilities.effects.common.AttachEffect; import mage.abilities.keyword.EnchantAbility; import mage.abilities.mana.TriggeredManaAbility; diff --git a/Mage.Sets/src/mage/cards/w/WintersNight.java b/Mage.Sets/src/mage/cards/w/WintersNight.java index d5ad0d931b5..2b6b78cb341 100644 --- a/Mage.Sets/src/mage/cards/w/WintersNight.java +++ b/Mage.Sets/src/mage/cards/w/WintersNight.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.TapForManaAllTriggeredManaAbility; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.AddManaOfAnyTypeProducedEffect; +import mage.abilities.effects.mana.AddManaOfAnyTypeProducedEffect; import mage.abilities.effects.common.DontUntapInControllersNextUntapStepTargetEffect; import mage.abilities.effects.common.ManaEffect; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/w/WitchEngine.java b/Mage.Sets/src/mage/cards/w/WitchEngine.java index b71a1f9afe7..fec2da33c56 100644 --- a/Mage.Sets/src/mage/cards/w/WitchEngine.java +++ b/Mage.Sets/src/mage/cards/w/WitchEngine.java @@ -34,7 +34,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.ContinuousEffectImpl; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.keyword.SwampwalkAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; diff --git a/Mage.Sets/src/mage/cards/w/WookieeMystic.java b/Mage.Sets/src/mage/cards/w/WookieeMystic.java index c85360a9782..522ce66bdc5 100644 --- a/Mage.Sets/src/mage/cards/w/WookieeMystic.java +++ b/Mage.Sets/src/mage/cards/w/WookieeMystic.java @@ -35,7 +35,7 @@ import mage.MageObject; import mage.Mana; import mage.abilities.Ability; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.effects.common.ManaEffect; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/z/ZendikarResurgent.java b/Mage.Sets/src/mage/cards/z/ZendikarResurgent.java index 332884711e5..4964c44498b 100644 --- a/Mage.Sets/src/mage/cards/z/ZendikarResurgent.java +++ b/Mage.Sets/src/mage/cards/z/ZendikarResurgent.java @@ -30,7 +30,7 @@ package mage.cards.z; import java.util.UUID; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.common.TapForManaAllTriggeredManaAbility; -import mage.abilities.effects.common.AddManaOfAnyTypeProducedEffect; +import mage.abilities.effects.mana.AddManaOfAnyTypeProducedEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; diff --git a/Mage.Sets/src/mage/cards/z/ZhurTaaAncient.java b/Mage.Sets/src/mage/cards/z/ZhurTaaAncient.java index d9d17351b7f..cc9cfa39d05 100644 --- a/Mage.Sets/src/mage/cards/z/ZhurTaaAncient.java +++ b/Mage.Sets/src/mage/cards/z/ZhurTaaAncient.java @@ -30,7 +30,7 @@ package mage.cards.z; import java.util.UUID; import mage.MageInt; import mage.abilities.common.TapForManaAllTriggeredManaAbility; -import mage.abilities.effects.common.AddManaOfAnyTypeProducedEffect; +import mage.abilities.effects.mana.AddManaOfAnyTypeProducedEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/mana/ConditionalManaTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/mana/ConditionalManaTest.java index 3a76a003f31..6ce25ad7121 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/mana/ConditionalManaTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/mana/ConditionalManaTest.java @@ -30,7 +30,6 @@ package org.mage.test.cards.mana; import mage.abilities.keyword.FlyingAbility; import mage.constants.PhaseStep; import mage.constants.Zone; -import org.junit.Assert; import org.junit.Test; import org.mage.test.serverside.base.CardTestPlayerBase; diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/mana/NykthosShrineToNyxTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/mana/NykthosShrineToNyxTest.java index 0913ee9e024..2ab11d0dca7 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/mana/NykthosShrineToNyxTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/mana/NykthosShrineToNyxTest.java @@ -125,6 +125,8 @@ public class NykthosShrineToNyxTest extends CardTestPlayerBase { public void testNormalUseWithTokens() { addCard(Zone.BATTLEFIELD, playerA, "Forest", 2); addCard(Zone.BATTLEFIELD, playerA, "Island", 3); + // {T}: Add {C}. + // {2}, {T}: Choose a color. Add an amount of mana of that color equal to your devotion to that color. addCard(Zone.BATTLEFIELD, playerA, "Nykthos, Shrine to Nyx", 1); // Green mana doesn't empty from your mana pool as steps and phases end. // Omnath, Locus of Mana gets +1/+1 for each green mana in your mana pool. @@ -150,7 +152,7 @@ public class NykthosShrineToNyxTest extends CardTestPlayerBase { execute(); assertPermanentCount(playerA, "Simic Guildmage", 2); - Assert.assertEquals("amount of green mana", 5, playerA.getManaPool().getGreen()); // 6 green mana + Assert.assertEquals("amount of green mana", 5, playerA.getManaPool().getGreen()); // 5 green mana assertPowerToughness(playerA, "Omnath, Locus of Mana", 6, 6); } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/mana/VorinclexVoiceOfHungerTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/mana/VorinclexVoiceOfHungerTest.java index 91af35eb82d..d4250193112 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/mana/VorinclexVoiceOfHungerTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/mana/VorinclexVoiceOfHungerTest.java @@ -69,6 +69,7 @@ public class VorinclexVoiceOfHungerTest extends CardTestPlayerBase { @Test // @Ignore // TODO: need to fix Vorinclex, Voice of Hunger -- it's double fireup mana tap event public void testVorinclexVoiceofHungerRiverOfTearsManaMultiplier() { + // Mana pools don't empty as steps and phases end. addCard(Zone.BATTLEFIELD, playerA, "Upwelling", 1); addCard(Zone.HAND, playerA, "River of Tears", 1); // Trample diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/SelvalaHeartOfTheWildsTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/SelvalaHeartOfTheWildsTest.java index 8cb2b111999..7b394d4484f 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/SelvalaHeartOfTheWildsTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/SelvalaHeartOfTheWildsTest.java @@ -1,96 +1,106 @@ -/* - * 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 org.mage.test.cards.triggers; - -import mage.constants.PhaseStep; -import mage.constants.Zone; -import org.junit.Test; -import org.mage.test.serverside.base.CardTestPlayerBase; - -/** - * - * @author jeffwadsworth - */ -/** - * Selvala, Heart of the Wilds {1}{G}{G} Whenever another creature enters the - * battlefield, its controller may draw a card if its power is greater than each - * other creature's power Add X mana in any combination of colors to your mana - * pool, where X is the greatest power among creatures you control - */ - -public class SelvalaHeartOfTheWildsTest extends CardTestPlayerBase { - - @Test - public void testTrigger() { - // No card will be drawn due to the Memnite having a lower power than any other permanent on the battlefield - addCard(Zone.LIBRARY, playerA, "Island", 2); - addCard(Zone.BATTLEFIELD, playerA, "Selvala, Heart of the Wilds", 1); // 2/3 - addCard(Zone.BATTLEFIELD, playerA, "Shivan Dragon", 1); // 5/5 - addCard(Zone.HAND, playerA, "Memnite"); // 1/1 - addCard(Zone.BATTLEFIELD, playerB, "Blinking Spirit", 1); // 2/2 - addCard(Zone.BATTLEFIELD, playerB, "Nightmare", 1); // 4/4 - addCard(Zone.BATTLEFIELD, playerB, "Swamp", 4); - - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Memnite"); - - setStopAt(1, PhaseStep.BEGIN_COMBAT); - - execute(); - - assertHandCount(playerA, 0); // no cards drawn - - } - - @Test - public void testTriggerWithGiantGrowth() { - // After Memnite enters the battlefield, the trigger fires. In response, 2 Giant Growths targeting the Memnite - // pumps its power to the highest on the battlefield allowing the controller to draw a card. - addCard(Zone.LIBRARY, playerA, "Island", 2); - addCard(Zone.BATTLEFIELD, playerA, "Selvala, Heart of the Wilds", 1); // 2/3 - addCard(Zone.BATTLEFIELD, playerA, "Shivan Dragon", 1); // 5/5 - addCard(Zone.BATTLEFIELD, playerA, "Forest", 2); - addCard(Zone.HAND, playerA, "Memnite"); // 1/1 - addCard(Zone.HAND, playerA, "Giant Growth", 2); - addCard(Zone.BATTLEFIELD, playerB, "Blinking Spirit", 1); // 2/2 - addCard(Zone.BATTLEFIELD, playerB, "Nightmare", 1); // 4/4 - addCard(Zone.BATTLEFIELD, playerB, "Swamp", 4); - - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Memnite"); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Giant Growth", "Memnite"); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Giant Growth", "Memnite"); // a whopping 7/7 - - setChoice(playerA, "Yes"); - - setStopAt(1, PhaseStep.BEGIN_COMBAT); - - execute(); - - assertHandCount(playerA, 2); // 2 cards drawn - - } -} +/* + * 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 org.mage.test.cards.triggers; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author jeffwadsworth + */ +/** + * Selvala, Heart of the Wilds {1}{G}{G} Whenever another creature enters the + * battlefield, its controller may draw a card if its power is greater than each + * other creature's power Add X mana in any combination of colors to your mana + * pool, where X is the greatest power among creatures you control + */ +public class SelvalaHeartOfTheWildsTest extends CardTestPlayerBase { + + @Test + public void testTrigger() { + // No card will be drawn due to the Memnite having a lower power than any other permanent on the battlefield + addCard(Zone.LIBRARY, playerA, "Island", 2); + addCard(Zone.BATTLEFIELD, playerA, "Selvala, Heart of the Wilds", 1); // 2/3 + addCard(Zone.BATTLEFIELD, playerA, "Shivan Dragon", 1); // 5/5 + addCard(Zone.HAND, playerA, "Memnite"); // 1/1 + addCard(Zone.BATTLEFIELD, playerB, "Blinking Spirit", 1); // 2/2 + addCard(Zone.BATTLEFIELD, playerB, "Nightmare", 1); // 4/4 + addCard(Zone.BATTLEFIELD, playerB, "Swamp", 4); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Memnite"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + + execute(); + + assertHandCount(playerA, 0); // no cards drawn + + } + + @Test + public void testTriggerWithGiantGrowth() { + // After Memnite enters the battlefield, the trigger fires. In response, 2 Giant Growths targeting the Memnite + // pumps its power to the highest on the battlefield allowing the controller to draw a card. + addCard(Zone.LIBRARY, playerA, "Island", 2); + // Whenever another creature enters the battlefield, its controller may draw a card if its power is greater than each other creature's power. + // {G}, {T}: Add X mana in any combination of colors, where X is the greatest power among creatures you control. + addCard(Zone.BATTLEFIELD, playerA, "Selvala, Heart of the Wilds", 1); // 2/3 + addCard(Zone.BATTLEFIELD, playerA, "Shivan Dragon", 1); // 5/5 + addCard(Zone.BATTLEFIELD, playerA, "Forest", 2); + addCard(Zone.HAND, playerA, "Memnite"); // 1/1 + addCard(Zone.HAND, playerA, "Giant Growth", 2); + addCard(Zone.BATTLEFIELD, playerB, "Blinking Spirit", 1); // 2/2 + // Flying + // Nightmare's power and toughness are each equal to the number of Swamps you control. + addCard(Zone.BATTLEFIELD, playerB, "Nightmare", 1); // 4/4 + addCard(Zone.BATTLEFIELD, playerB, "Swamp", 4); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Memnite"); + setChoice(playerA, "X=0"); + setChoice(playerA, "X=0"); + setChoice(playerA, "X=0"); + setChoice(playerA, "X=0"); + setChoice(playerA, "X=5"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Giant Growth", "Memnite"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Giant Growth", "Memnite"); // a whopping 7/7 + + setChoice(playerA, "Yes"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + + execute(); + + assertPowerToughness(playerA, "Memnite", 7, 7); + assertGraveyardCount(playerA, "Giant Growth", 2); + assertHandCount(playerA, 1); // 2 cards drawn + + } +} 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 1f259160965..543fafdbeda 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 @@ -445,7 +445,7 @@ public class TestPlayer implements Player { } else { game.restoreState(bookmark, ability.getRule()); } - + groupsForTargetHandling = null; } } } else if (action.getAction().startsWith("manaActivate:")) { diff --git a/Mage/src/main/java/mage/abilities/AbilityImpl.java b/Mage/src/main/java/mage/abilities/AbilityImpl.java index 94694570623..276d47930b5 100644 --- a/Mage/src/main/java/mage/abilities/AbilityImpl.java +++ b/Mage/src/main/java/mage/abilities/AbilityImpl.java @@ -42,7 +42,7 @@ import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.Effect; import mage.abilities.effects.Effects; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.DynamicManaEffect; +import mage.abilities.effects.mana.DynamicManaEffect; import mage.abilities.effects.common.ManaEffect; import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.cards.Card; diff --git a/Mage/src/main/java/mage/abilities/decorator/ConditionalManaEffect.java b/Mage/src/main/java/mage/abilities/decorator/ConditionalManaEffect.java index ba692a491d1..085dcafcedd 100644 --- a/Mage/src/main/java/mage/abilities/decorator/ConditionalManaEffect.java +++ b/Mage/src/main/java/mage/abilities/decorator/ConditionalManaEffect.java @@ -30,8 +30,8 @@ package mage.abilities.decorator; import mage.Mana; import mage.abilities.Ability; import mage.abilities.condition.Condition; -import mage.abilities.effects.common.BasicManaEffect; import mage.abilities.effects.common.ManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.choices.ChoiceColor; import mage.game.Game; import mage.players.Player; @@ -73,31 +73,7 @@ public class ConditionalManaEffect extends ManaEffect { if (controller == null) { return false; } - if (condition.apply(game, source)) { - effect.setTargetPointer(this.targetPointer); - } else if (otherwiseEffect != null) { - otherwiseEffect.setTargetPointer(this.targetPointer); - } - Mana mana = getMana(game, source); - if (mana == null) { - return false; - } - if (mana.getAny() > 0) { - int amount = mana.getAny(); - - ChoiceColor choice = new ChoiceColor(true); - Mana createdMana = null; - if (controller.choose(outcome, choice, game)) { - createdMana = choice.getMana(amount); - } - if (createdMana == null) { - return false; - } - mana = createdMana; - // because the mana type is now choosen, fire the event with the mana information - checkToFirePossibleEvents(mana, game, source); - } - controller.getManaPool().addMana(mana, game, source); + controller.getManaPool().addMana(getMana(game, source), game, source); return true; } @@ -107,12 +83,25 @@ public class ConditionalManaEffect extends ManaEffect { } @Override - public Mana getMana(Game game, Ability source) { - Mana mana = null; + public Mana produceMana(boolean netMana, Game game, Ability source) { + Mana mana = new Mana(); if (condition.apply(game, source)) { - mana = effect.getMana(); + mana = effect.getManaTemplate().copy(); } else if (otherwiseEffect != null) { - mana = otherwiseEffect.getMana(); + mana = otherwiseEffect.getManaTemplate().copy(); + } + if (mana.getAny() > 0) { + int amount = mana.getAny(); + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { + return mana; + } + ChoiceColor choice = new ChoiceColor(true); + if (controller.choose(outcome, choice, game)) { + mana.setAny(0); + mana.add(choice.getMana(amount)); + } + checkToFirePossibleEvents(mana, game, source); } return mana; } diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/OpponentsLostLifeCount.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/OpponentsLostLifeCount.java index 131609a7c21..994feb59f83 100644 --- a/Mage/src/main/java/mage/abilities/dynamicvalue/common/OpponentsLostLifeCount.java +++ b/Mage/src/main/java/mage/abilities/dynamicvalue/common/OpponentsLostLifeCount.java @@ -48,7 +48,7 @@ public class OpponentsLostLifeCount implements DynamicValue { public int calculate(Game game, UUID controllerId) { PlayerLostLifeWatcher watcher = (PlayerLostLifeWatcher) game.getState().getWatchers().get(PlayerLostLifeWatcher.class.getSimpleName()); if (watcher != null) { - return watcher.getAllOppLifeLost(controllerId); + return watcher.getAllOppLifeLost(controllerId, game); } return 0; } diff --git a/Mage/src/main/java/mage/abilities/effects/common/AddManaOfAnyColorToManaPoolTargetPlayerEffect.java b/Mage/src/main/java/mage/abilities/effects/common/AddManaOfAnyColorToManaPoolTargetPlayerEffect.java deleted file mode 100644 index 1f8c6c229be..00000000000 --- a/Mage/src/main/java/mage/abilities/effects/common/AddManaOfAnyColorToManaPoolTargetPlayerEffect.java +++ /dev/null @@ -1,49 +0,0 @@ -package mage.abilities.effects.common; - -import java.util.UUID; -import mage.Mana; -import mage.abilities.Ability; -import mage.choices.ChoiceColor; -import mage.game.Game; -import mage.players.Player; - -/** - * - * Created by Galatolol - */ -public class AddManaOfAnyColorToManaPoolTargetPlayerEffect extends ManaEffect { - - public AddManaOfAnyColorToManaPoolTargetPlayerEffect(String textManaPoolOwner) { - super(); - this.staticText = (textManaPoolOwner.equals("their") ? "that player adds " : "add ") + "one mana of any color" + " to " + textManaPoolOwner + " mana pool"; - } - - public AddManaOfAnyColorToManaPoolTargetPlayerEffect(final AddManaOfAnyColorToManaPoolTargetPlayerEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - UUID playerId = (UUID) game.getState().getValue(source.getSourceId() + "_player"); - Player player = game.getPlayer(playerId); - ChoiceColor choice = new ChoiceColor(); - if (player != null && player.choose(outcome, choice, game)) { - Mana mana = choice.getMana(1); - checkToFirePossibleEvents(mana, game, source); - player.getManaPool().addMana(mana, game, source); - return true; - } - return false; - } - - @Override - public AddManaOfAnyColorToManaPoolTargetPlayerEffect copy() { - return new AddManaOfAnyColorToManaPoolTargetPlayerEffect(this); - } - - @Override - public Mana getMana(Game game, Ability source) { - return null; - } - -} diff --git a/Mage/src/main/java/mage/abilities/effects/common/ManaEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ManaEffect.java index e489056436b..368d3d9a9c8 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ManaEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ManaEffect.java @@ -24,10 +24,11 @@ * 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.abilities.effects.common; +import java.util.ArrayList; +import java.util.List; import mage.Mana; import mage.abilities.Ability; import mage.abilities.costs.Cost; @@ -45,26 +46,72 @@ import mage.game.events.ManaEvent; */ public abstract class ManaEffect extends OneShotEffect { + protected Mana createdMana; + public ManaEffect() { super(Outcome.PutManaInPool); + createdMana = null; } public ManaEffect(final ManaEffect effect) { super(effect); + this.createdMana = effect.createdMana == null ? null : effect.createdMana.copy(); } - public abstract Mana getMana(Game game, Ability source); + /** + * Creates the mana the effect can produce or if that already has happened + * returns the mana the effect has created during its process of resolving + * + * @param game + * @param source + * @return + */ + public Mana getMana(Game game, Ability source) { + if (createdMana == null) { + return createdMana = produceMana(false, game, source); + } + return createdMana; + } /** - * Only used for mana effects that decide which kind of mana is produced during resolution of the effect. - * + * Returns the currently available max mana variations the effect can + * produce + * + * @param game + * @param source + * @return + */ + public List getNetMana(Game game, Ability source) { + List netMana = new ArrayList<>(); + Mana mana = produceMana(true, game, source); + if (mana != null) { + netMana.add(mana); + } + return netMana; + } + + /** + * Produced the mana the effect can produce + * + * @param netMana true - produce the hypotetical possible mana for check of + * possible castable spells + * @param game + * @param source + * @return + */ + public abstract Mana produceMana(boolean netMana, Game game, Ability source); + + /** + * Only used for mana effects that decide which kind of mana is produced + * during resolution of the effect. + * * @param mana * @param game * @param source */ public void checkToFirePossibleEvents(Mana mana, Game game, Ability source) { - if (source.getAbilityType()==AbilityType.MANA) { - for (Cost cost: source.getCosts()) { + if (source.getAbilityType() == AbilityType.MANA) { + for (Cost cost : source.getCosts()) { if (cost instanceof TapSourceCost) { ManaEvent event = new ManaEvent(GameEvent.EventType.TAPPED_FOR_MANA, source.getSourceId(), source.getSourceId(), source.getControllerId(), mana); if (!game.replaceEvent(event)) { diff --git a/Mage/src/main/java/mage/abilities/effects/common/AddConditionalColorlessManaEffect.java b/Mage/src/main/java/mage/abilities/effects/mana/AddConditionalColorlessManaEffect.java similarity index 81% rename from Mage/src/main/java/mage/abilities/effects/common/AddConditionalColorlessManaEffect.java rename to Mage/src/main/java/mage/abilities/effects/mana/AddConditionalColorlessManaEffect.java index 596b447002b..057985a45b9 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/AddConditionalColorlessManaEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/mana/AddConditionalColorlessManaEffect.java @@ -3,10 +3,11 @@ * To change this template file, choose Tools | Templates * and open the template in the editor. */ -package mage.abilities.effects.common; +package mage.abilities.effects.mana; import mage.Mana; import mage.abilities.Ability; +import mage.abilities.effects.common.ManaEffect; import mage.abilities.mana.builder.ConditionalManaBuilder; import mage.game.Game; import mage.players.Player; @@ -42,16 +43,16 @@ public class AddConditionalColorlessManaEffect extends ManaEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player != null) { - player.getManaPool().addMana(getMana(game, source), game, source); + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + controller.getManaPool().addMana(getMana(game, source), game, source); return true; } return false; } @Override - public Mana getMana(Game game, Ability source) { + public Mana produceMana(boolean netMana, Game game, Ability source) { return manaBuilder.setMana(Mana.ColorlessMana(amount), source, game).build(); } diff --git a/Mage/src/main/java/mage/abilities/effects/common/AddConditionalManaEffect.java b/Mage/src/main/java/mage/abilities/effects/mana/AddConditionalManaEffect.java similarity index 90% rename from Mage/src/main/java/mage/abilities/effects/common/AddConditionalManaEffect.java rename to Mage/src/main/java/mage/abilities/effects/mana/AddConditionalManaEffect.java index b3dedd8d6c5..d8e4bca5884 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/AddConditionalManaEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/mana/AddConditionalManaEffect.java @@ -3,10 +3,11 @@ * To change this template file, choose Tools | Templates * and open the template in the editor. */ -package mage.abilities.effects.common; +package mage.abilities.effects.mana; import mage.Mana; import mage.abilities.Ability; +import mage.abilities.effects.common.ManaEffect; import mage.abilities.mana.builder.ConditionalManaBuilder; import mage.game.Game; import mage.players.Player; @@ -49,7 +50,8 @@ public class AddConditionalManaEffect extends ManaEffect { } @Override - public Mana getMana(Game game, Ability source) { + public Mana produceMana(boolean netMana, Game game, Ability source) { return manaBuilder.setMana(mana, source, game).build(); } + } diff --git a/Mage/src/main/java/mage/abilities/effects/common/AddConditionalManaOfAnyColorEffect.java b/Mage/src/main/java/mage/abilities/effects/mana/AddConditionalManaOfAnyColorEffect.java similarity index 78% rename from Mage/src/main/java/mage/abilities/effects/common/AddConditionalManaOfAnyColorEffect.java rename to Mage/src/main/java/mage/abilities/effects/mana/AddConditionalManaOfAnyColorEffect.java index 02964f7426a..8cdb5f50276 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/AddConditionalManaOfAnyColorEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/mana/AddConditionalManaOfAnyColorEffect.java @@ -25,12 +25,14 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ -package mage.abilities.effects.common; +package mage.abilities.effects.mana; +import mage.ConditionalMana; import mage.Mana; import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.common.ManaEffect; import mage.abilities.mana.builder.ConditionalManaBuilder; import mage.choices.ChoiceColor; import mage.game.Game; @@ -84,39 +86,44 @@ public class AddConditionalManaOfAnyColorEffect extends ManaEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { - return false; + if (controller != null) { + checkToFirePossibleEvents(getMana(game, source), game, source); + controller.getManaPool().addMana(getMana(game, source), game, source); + return true; } + return false; + } + @Override + public Mana produceMana(boolean netMana, Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { + return null; + } + ConditionalMana mana = null; int value = amount.calculate(game, source, this); - boolean result = false; ChoiceColor choice = new ChoiceColor(true); - for (int i = 0; i < value; i++) { - controller.choose(outcome, choice, game); if (choice.getChoice() == null) { - return false; + controller.choose(outcome, choice, game); } - Mana mana = choice.getMana(1); - if (mana != null) { - mana = manaBuilder.setMana(mana, source, game).build(); + if (choice.getChoice() == null) { + return null; } - if (mana != null) { - checkToFirePossibleEvents(mana, game, source); - controller.getManaPool().addMana(mana, game, source); - result = true; - } - if (!oneChoice) { + if (oneChoice) { + mana = new ConditionalMana(manaBuilder.setMana(choice.getMana(value), source, game).build()); + break; + } else { + if (mana == null) { + mana = new ConditionalMana(manaBuilder.setMana(choice.getMana(1), source, game).build()); + } else { + mana.add(choice.getMana(1)); + } choice.clearChoice(); } } - return result; - } + return mana; - @Override - public Mana getMana(Game game, Ability source) { - //TODO: TAP_FOR_MANA Event does not support currently to get an amount > 1 of conditional mana - return null; } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/AddManaAnyColorAttachedControllerEffect.java b/Mage/src/main/java/mage/abilities/effects/mana/AddManaAnyColorAttachedControllerEffect.java similarity index 70% rename from Mage/src/main/java/mage/abilities/effects/common/AddManaAnyColorAttachedControllerEffect.java rename to Mage/src/main/java/mage/abilities/effects/mana/AddManaAnyColorAttachedControllerEffect.java index 0e3e6d05d6b..2fdf2db8076 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/AddManaAnyColorAttachedControllerEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/mana/AddManaAnyColorAttachedControllerEffect.java @@ -25,10 +25,13 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ -package mage.abilities.effects.common; +package mage.abilities.effects.mana; +import java.util.ArrayList; +import java.util.List; import mage.Mana; import mage.abilities.Ability; +import mage.abilities.effects.common.ManaEffect; import mage.choices.ChoiceColor; import mage.game.Game; import mage.game.permanent.Permanent; @@ -53,14 +56,12 @@ public class AddManaAnyColorAttachedControllerEffect extends ManaEffect { public boolean apply(Game game, Ability source) { Permanent enchantment = game.getPermanent(source.getSourceId()); if (enchantment != null) { - Permanent land = game.getPermanent(enchantment.getAttachedTo()); - if (land != null) { - Player player = game.getPlayer(land.getControllerId()); - ChoiceColor choice = new ChoiceColor(); - if (player != null && player.choose(outcome, choice, game)) { - Mana mana = choice.getMana(1); - checkToFirePossibleEvents(mana, game, source); - player.getManaPool().addMana(mana, game, source); + Permanent permanentattachedTo = game.getPermanent(enchantment.getAttachedTo()); + if (permanentattachedTo != null) { + Player player = game.getPlayer(permanentattachedTo.getControllerId()); + if (player != null) { + checkToFirePossibleEvents(getMana(game, source), game, source); + player.getManaPool().addMana(getMana(game, source), game, source); return true; } } @@ -74,8 +75,30 @@ public class AddManaAnyColorAttachedControllerEffect extends ManaEffect { } @Override - public Mana getMana(Game game, Ability source) { - return null; + public Mana produceMana(boolean netMana, Game game, Ability source) { + Permanent enchantment = game.getPermanent(source.getSourceId()); + if (enchantment != null) { + Permanent land = game.getPermanent(enchantment.getAttachedTo()); + if (land != null) { + Player player = game.getPlayer(land.getControllerId()); + ChoiceColor choice = new ChoiceColor(); + if (player != null && player.choose(outcome, choice, game)) { + return choice.getMana(1); + } + } + } + return new Mana(); + } + + @Override + public List getNetMana(Game game, Ability source) { + ArrayList netMana = new ArrayList<>(); + netMana.add(Mana.GreenMana(1)); + netMana.add(Mana.WhiteMana(1)); + netMana.add(Mana.BlueMana(1)); + netMana.add(Mana.RedMana(1)); + netMana.add(Mana.BlackMana(1)); + return netMana; } } diff --git a/Mage/src/main/java/mage/abilities/effects/mana/AddManaChosenColorEffect.java b/Mage/src/main/java/mage/abilities/effects/mana/AddManaChosenColorEffect.java new file mode 100644 index 00000000000..eefb08c618d --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/mana/AddManaChosenColorEffect.java @@ -0,0 +1,54 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package mage.abilities.effects.mana; + +import mage.Mana; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.effects.common.ManaEffect; +import mage.constants.ColoredManaSymbol; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author LevelX2 + */ +public class AddManaChosenColorEffect extends ManaEffect { + + public AddManaChosenColorEffect() { + super(); + staticText = "Add one mana of the chosen color"; + } + + public AddManaChosenColorEffect(final AddManaChosenColorEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + player.getManaPool().addMana(getMana(game, source), game, source); + } + return true; + } + + @Override + public Mana produceMana(boolean netMana, Game game, Ability source) { + ObjectColor color = (ObjectColor) game.getState().getValue(source.getSourceId() + "_color"); + if (color != null) { + return new Mana(ColoredManaSymbol.lookup(color.toString().charAt(0))); + } else { + return null; + } + } + + @Override + public AddManaChosenColorEffect copy() { + return new AddManaChosenColorEffect(this); + } +} diff --git a/Mage/src/main/java/mage/abilities/effects/common/AddManaInAnyCombinationEffect.java b/Mage/src/main/java/mage/abilities/effects/mana/AddManaInAnyCombinationEffect.java similarity index 88% rename from Mage/src/main/java/mage/abilities/effects/common/AddManaInAnyCombinationEffect.java rename to Mage/src/main/java/mage/abilities/effects/mana/AddManaInAnyCombinationEffect.java index 0bb378b1edb..55e982a3291 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/AddManaInAnyCombinationEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/mana/AddManaInAnyCombinationEffect.java @@ -25,14 +25,16 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ -package mage.abilities.effects.common; +package mage.abilities.effects.mana; import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import mage.Mana; import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.common.ManaEffect; import mage.constants.ColoredManaSymbol; import mage.game.Game; import mage.players.Player; @@ -90,6 +92,17 @@ public class AddManaInAnyCombinationEffect extends ManaEffect { @Override public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + checkToFirePossibleEvents(getMana(game, source), game, source); + player.getManaPool().addMana(getMana(game, source), game, source); + return true; + } + return false; + } + + @Override + public Mana produceMana(boolean netMana, Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); if (player != null) { Mana mana = new Mana(); @@ -111,16 +124,17 @@ public class AddManaInAnyCombinationEffect extends ManaEffect { } } } - checkToFirePossibleEvents(mana, game, source); - player.getManaPool().addMana(mana, game, source); - return true; + + return mana; } - return false; + return null; } @Override - public Mana getMana(Game game, Ability source) { - return null; + public List getNetMana(Game game, Ability source) { + ArrayList netMana = new ArrayList<>(); + netMana.add(new Mana(0, 0, 0, 0, 0, 0, amount.calculate(game, source, this), 0)); + return netMana; } private String setText() { diff --git a/Mage/src/main/java/mage/abilities/effects/common/AddManaOfAnyColorEffect.java b/Mage/src/main/java/mage/abilities/effects/mana/AddManaOfAnyColorEffect.java similarity index 98% rename from Mage/src/main/java/mage/abilities/effects/common/AddManaOfAnyColorEffect.java rename to Mage/src/main/java/mage/abilities/effects/mana/AddManaOfAnyColorEffect.java index bf66ff3607b..55749f4618f 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/AddManaOfAnyColorEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/mana/AddManaOfAnyColorEffect.java @@ -25,7 +25,7 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ -package mage.abilities.effects.common; +package mage.abilities.effects.mana; import mage.Mana; import mage.abilities.Ability; @@ -91,7 +91,7 @@ public class AddManaOfAnyColorEffect extends BasicManaEffect { } @Override - public Mana getMana() { + public Mana getManaTemplate() { return new Mana(0, 0, 0, 0, 0, 0, amount, 0); } diff --git a/Mage/src/main/java/mage/abilities/effects/common/AddManaOfAnyTypeProducedEffect.java b/Mage/src/main/java/mage/abilities/effects/mana/AddManaOfAnyTypeProducedEffect.java similarity index 85% rename from Mage/src/main/java/mage/abilities/effects/common/AddManaOfAnyTypeProducedEffect.java rename to Mage/src/main/java/mage/abilities/effects/mana/AddManaOfAnyTypeProducedEffect.java index 2d84bfff046..2885f791b4c 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/AddManaOfAnyTypeProducedEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/mana/AddManaOfAnyTypeProducedEffect.java @@ -25,10 +25,11 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ -package mage.abilities.effects.common; +package mage.abilities.effects.mana; import mage.Mana; import mage.abilities.Ability; +import mage.abilities.effects.common.ManaEffect; import mage.choices.Choice; import mage.choices.ChoiceColor; import mage.game.Game; @@ -58,6 +59,24 @@ public class AddManaOfAnyTypeProducedEffect extends ManaEffect { if (targetController == null) { return false; } + checkToFirePossibleEvents(getMana(game, source), game, source); + targetController.getManaPool().addMana(getMana(game, source), game, source); + return true; + } + return false; + } + + @Override + public Mana produceMana(boolean netMana, Game game, Ability source) { + if (netMana) { + return null; + } + Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (permanent != null) { + Player targetController = game.getPlayer(permanent.getControllerId()); + if (targetController == null) { + return null; + } Mana types = (Mana) this.getValue("mana"); Choice choice = new ChoiceColor(true); choice.getChoices().clear(); @@ -80,15 +99,16 @@ public class AddManaOfAnyTypeProducedEffect extends ManaEffect { if (types.getColorless() > 0) { choice.getChoices().add("Colorless"); } + Mana newMana = new Mana(); if (!choice.getChoices().isEmpty()) { if (choice.getChoices().size() == 1) { choice.setChoice(choice.getChoices().iterator().next()); } else { if (!targetController.choose(outcome, choice, game)) { - return false; + return null; } } - Mana newMana = new Mana(); + switch (choice.getChoice()) { case "Black": newMana.setBlack(1); @@ -109,13 +129,10 @@ public class AddManaOfAnyTypeProducedEffect extends ManaEffect { newMana.setColorless(1); break; } - checkToFirePossibleEvents(newMana, game, source); - targetController.getManaPool().addMana(newMana, game, source); - } - return true; + return newMana; } - return false; + return null; } @Override @@ -123,8 +140,4 @@ public class AddManaOfAnyTypeProducedEffect extends ManaEffect { return new AddManaOfAnyTypeProducedEffect(this); } - @Override - public Mana getMana(Game game, Ability source) { - return null; - } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/AddManaToManaPoolSourceControllerEffect.java b/Mage/src/main/java/mage/abilities/effects/mana/AddManaToManaPoolSourceControllerEffect.java similarity index 97% rename from Mage/src/main/java/mage/abilities/effects/common/AddManaToManaPoolSourceControllerEffect.java rename to Mage/src/main/java/mage/abilities/effects/mana/AddManaToManaPoolSourceControllerEffect.java index fe3e3195f61..a2d8eabde44 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/AddManaToManaPoolSourceControllerEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/mana/AddManaToManaPoolSourceControllerEffect.java @@ -4,7 +4,7 @@ * and open the template in the editor. */ -package mage.abilities.effects.common; +package mage.abilities.effects.mana; import mage.Mana; import mage.abilities.Ability; diff --git a/Mage/src/main/java/mage/abilities/effects/common/AddManaToManaPoolTargetControllerEffect.java b/Mage/src/main/java/mage/abilities/effects/mana/AddManaToManaPoolTargetControllerEffect.java similarity index 74% rename from Mage/src/main/java/mage/abilities/effects/common/AddManaToManaPoolTargetControllerEffect.java rename to Mage/src/main/java/mage/abilities/effects/mana/AddManaToManaPoolTargetControllerEffect.java index e7943c88b1e..44bfec584d2 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/AddManaToManaPoolTargetControllerEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/mana/AddManaToManaPoolTargetControllerEffect.java @@ -3,11 +3,11 @@ * To change this template file, choose Tools | Templates * and open the template in the editor. */ - -package mage.abilities.effects.common; +package mage.abilities.effects.mana; import mage.Mana; import mage.abilities.Ability; +import mage.abilities.effects.common.ManaEffect; import mage.game.Game; import mage.players.Player; @@ -15,28 +15,30 @@ import mage.players.Player; * * @author LevelX2 */ - public class AddManaToManaPoolTargetControllerEffect extends ManaEffect { protected Mana mana; protected boolean emptyOnlyOnTurnsEnd; - + public AddManaToManaPoolTargetControllerEffect(Mana mana, String textManaPoolOwner) { this(mana, textManaPoolOwner, false); } + /** * Adds mana to the mana pool of target pointer player - * + * * @param mana mana that will be added to the pool - * @param textManaPoolOwner text that references to the mana pool owner (e.g. "damaged player's") - * @param emptyOnTurnsEnd if set, the mana will empty only on end of turnstep - * - */ + * @param textManaPoolOwner text that references to the mana pool owner + * (e.g. "damaged player's") + * @param emptyOnTurnsEnd if set, the mana will empty only on end of + * turnstep + * + */ public AddManaToManaPoolTargetControllerEffect(Mana mana, String textManaPoolOwner, boolean emptyOnTurnsEnd) { super(); this.mana = mana; this.emptyOnlyOnTurnsEnd = emptyOnTurnsEnd; - this.staticText = (textManaPoolOwner.equals("their")?"that player adds ":"add ") + mana.toString() + " to " + textManaPoolOwner + " mana pool"; + this.staticText = (textManaPoolOwner.equals("their") ? "that player adds " : "add ") + mana.toString() + " to " + textManaPoolOwner + " mana pool"; } public AddManaToManaPoolTargetControllerEffect(final AddManaToManaPoolTargetControllerEffect effect) { @@ -54,15 +56,17 @@ public class AddManaToManaPoolTargetControllerEffect extends ManaEffect { public boolean apply(Game game, Ability source) { Player player = game.getPlayer(getTargetPointer().getFirst(game, source)); if (player != null) { - player.getManaPool().addMana(mana, game, source, emptyOnlyOnTurnsEnd); + player.getManaPool().addMana(getMana(game, source), game, source, emptyOnlyOnTurnsEnd); return true; } return false; } @Override - public Mana getMana(Game game, Ability source) { - return mana; + public Mana produceMana(boolean netMana, Game game, Ability source) { + if (netMana) { + return null; + } + return mana.copy(); } - } diff --git a/Mage/src/main/java/mage/abilities/effects/common/BasicManaEffect.java b/Mage/src/main/java/mage/abilities/effects/mana/BasicManaEffect.java similarity index 56% rename from Mage/src/main/java/mage/abilities/effects/common/BasicManaEffect.java rename to Mage/src/main/java/mage/abilities/effects/mana/BasicManaEffect.java index 5bcd549778a..98a361c12e7 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/BasicManaEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/mana/BasicManaEffect.java @@ -1,29 +1,31 @@ -package mage.abilities.effects.common; +package mage.abilities.effects.mana; import mage.ConditionalMana; import mage.Mana; import mage.abilities.Ability; +import mage.abilities.effects.common.ManaEffect; import mage.game.Game; public class BasicManaEffect extends ManaEffect { - protected Mana mana; + protected Mana manaTemplate; public BasicManaEffect(Mana mana) { super(); - this.mana = mana; + this.manaTemplate = mana; staticText = "add " + mana.toString(); } public BasicManaEffect(ConditionalMana conditionalMana) { super(); - this.mana = conditionalMana; - staticText = "add " + mana.toString() + " " + conditionalMana.getDescription(); + this.manaTemplate = conditionalMana; + staticText = "add " + manaTemplate.toString() + " " + conditionalMana.getDescription(); } public BasicManaEffect(final BasicManaEffect effect) { super(effect); - this.mana = effect.mana.copy(); + this.manaTemplate = effect.manaTemplate.copy(); + } @Override @@ -33,16 +35,17 @@ public class BasicManaEffect extends ManaEffect { @Override public boolean apply(Game game, Ability source) { - game.getPlayer(source.getControllerId()).getManaPool().addMana(mana, game, source); + game.getPlayer(source.getControllerId()).getManaPool().addMana(getMana(game, source), game, source); return true; } - public Mana getMana() { - return mana; + public Mana getManaTemplate() { + return manaTemplate; } @Override - public Mana getMana(Game game, Ability source) { - return mana; + public Mana produceMana(boolean netMana, Game game, Ability source) { + return manaTemplate.copy(); } + } diff --git a/Mage/src/main/java/mage/abilities/effects/common/DoUnlessAnyPlayerPaysManaEffect.java b/Mage/src/main/java/mage/abilities/effects/mana/DoUnlessAnyPlayerPaysManaEffect.java similarity index 84% rename from Mage/src/main/java/mage/abilities/effects/common/DoUnlessAnyPlayerPaysManaEffect.java rename to Mage/src/main/java/mage/abilities/effects/mana/DoUnlessAnyPlayerPaysManaEffect.java index 29177424250..73a3eba235c 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/DoUnlessAnyPlayerPaysManaEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/mana/DoUnlessAnyPlayerPaysManaEffect.java @@ -3,14 +3,17 @@ * To change this template file, choose Tools | Templates * and open the template in the editor. */ -package mage.abilities.effects.common; +package mage.abilities.effects.mana; +import java.util.ArrayList; +import java.util.List; import java.util.UUID; import mage.MageObject; import mage.Mana; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.costs.Cost; +import mage.abilities.effects.common.ManaEffect; import mage.constants.Outcome; import mage.game.Game; import mage.players.Player; @@ -69,6 +72,24 @@ public class DoUnlessAnyPlayerPaysManaEffect extends ManaEffect { return false; } + @Override + public List getNetMana(Game game, Ability source) { + if (cost.canPay(source, source.getSourceId(), source.getControllerId(), game)) { + return manaEffect.getNetMana(game, source); + } + return new ArrayList<>(); + } + + @Override + public Mana getMana(Game game, Ability source) { + return manaEffect.getMana(game, source); + } + + @Override + public Mana produceMana(boolean netMana, Game game, Ability source) { + return manaEffect.produceMana(netMana, game, source); + } + protected Player getPayingPlayer(Game game, Ability source) { return game.getPlayer(source.getControllerId()); } @@ -81,11 +102,6 @@ public class DoUnlessAnyPlayerPaysManaEffect extends ManaEffect { return manaEffect.getText(mode) + " unless any player pays " + cost.getText(); } - @Override - public Mana getMana(Game game, Ability source) { - return manaEffect.getMana(game, source); - } - @Override public ManaEffect copy() { return new DoUnlessAnyPlayerPaysManaEffect(this); diff --git a/Mage/src/main/java/mage/abilities/effects/common/DynamicManaEffect.java b/Mage/src/main/java/mage/abilities/effects/mana/DynamicManaEffect.java similarity index 85% rename from Mage/src/main/java/mage/abilities/effects/common/DynamicManaEffect.java rename to Mage/src/main/java/mage/abilities/effects/mana/DynamicManaEffect.java index 4ce3ece908a..a700463320c 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/DynamicManaEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/mana/DynamicManaEffect.java @@ -25,7 +25,7 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ -package mage.abilities.effects.common; +package mage.abilities.effects.mana; import mage.Mana; import mage.abilities.Ability; @@ -64,10 +64,10 @@ public class DynamicManaEffect extends BasicManaEffect { * @param mana * @param amount * @param text - * @param oneChoice is all mana from the same colour or if false the player - * can choose different colours + * @param oneChoice is all manaTemplate from the same colour or if false the + * player can choose different colours * @param netAmount a dynamic value that calculates the possible available - * mana (e.g. if you have to pay by removing counters from source) + * manaTemplate (e.g. if you have to pay by removing counters from source) */ public DynamicManaEffect(Mana mana, DynamicValue amount, String text, boolean oneChoice, DynamicValue netAmount) { super(mana); @@ -96,9 +96,8 @@ public class DynamicManaEffect extends BasicManaEffect { @Override public boolean apply(Game game, Ability source) { - Mana computedMana = computeMana(false, game, source); - checkToFirePossibleEvents(computedMana, game, source); - game.getPlayer(source.getControllerId()).getManaPool().addMana(computedMana, game, source); + checkToFirePossibleEvents(getMana(game, source), game, source); + game.getPlayer(source.getControllerId()).getManaPool().addMana(getMana(game, source), game, source); return true; } @@ -111,33 +110,29 @@ public class DynamicManaEffect extends BasicManaEffect { } @Override - public Mana getMana(Game game, Ability source) { - return null; - } - - public Mana computeMana(boolean netMana, Game game, Ability source) { + public Mana produceMana(boolean netMana, Game game, Ability source) { Mana computedMana = new Mana(); int count; if (netMana && netAmount != null) { - // calculate the maximum available mana + // calculate the maximum available manaTemplate count = netAmount.calculate(game, source, this); } else { count = amount.calculate(game, source, this); } - if (mana.getBlack() > 0) { + if (manaTemplate.getBlack() > 0) { computedMana.setBlack(count); - } else if (mana.getBlue() > 0) { + } else if (manaTemplate.getBlue() > 0) { computedMana.setBlue(count); - } else if (mana.getGreen() > 0) { + } else if (manaTemplate.getGreen() > 0) { computedMana.setGreen(count); - } else if (mana.getRed() > 0) { + } else if (manaTemplate.getRed() > 0) { computedMana.setRed(count); - } else if (mana.getWhite() > 0) { + } else if (manaTemplate.getWhite() > 0) { computedMana.setWhite(count); - } else if (mana.getColorless() > 0) { + } else if (manaTemplate.getColorless() > 0) { computedMana.setColorless(count); - } else if (mana.getAny() > 0) { + } else if (manaTemplate.getAny() > 0) { if (netMana) { computedMana.setAny(count); } else { diff --git a/Mage/src/main/java/mage/abilities/mana/ActivateIfConditionManaAbility.java b/Mage/src/main/java/mage/abilities/mana/ActivateIfConditionManaAbility.java index f6c63bc2d46..dbbf9bb9103 100644 --- a/Mage/src/main/java/mage/abilities/mana/ActivateIfConditionManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/ActivateIfConditionManaAbility.java @@ -29,8 +29,8 @@ package mage.abilities.mana; import mage.abilities.condition.Condition; import mage.abilities.costs.Cost; -import mage.abilities.effects.common.AddConditionalColorlessManaEffect; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.AddConditionalColorlessManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.constants.Zone; import mage.game.Game; @@ -38,7 +38,7 @@ public class ActivateIfConditionManaAbility extends ActivatedManaAbilityImpl { public ActivateIfConditionManaAbility(Zone zone, BasicManaEffect effect, Cost cost, Condition condition) { super(zone, effect, cost); - this.netMana.add(effect.getMana()); + this.netMana.add(effect.getManaTemplate()); this.condition = condition; } diff --git a/Mage/src/main/java/mage/abilities/mana/ActivateOncePerTurnManaAbility.java b/Mage/src/main/java/mage/abilities/mana/ActivateOncePerTurnManaAbility.java index dc5f46335a9..d647995c9b9 100644 --- a/Mage/src/main/java/mage/abilities/mana/ActivateOncePerTurnManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/ActivateOncePerTurnManaAbility.java @@ -29,8 +29,8 @@ package mage.abilities.mana; import mage.Mana; import mage.abilities.costs.Cost; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.constants.Zone; import mage.game.Game; @@ -42,7 +42,7 @@ public class ActivateOncePerTurnManaAbility extends ActivatedManaAbilityImpl { public ActivateOncePerTurnManaAbility(Zone zone, BasicManaEffect effect, Cost cost) { super(zone, effect, cost); - this.netMana.add(effect.getMana()); + this.netMana.add(effect.getManaTemplate()); this.maxActivationsPerTurn = 1; } diff --git a/Mage/src/main/java/mage/abilities/mana/ActivatedManaAbilityImpl.java b/Mage/src/main/java/mage/abilities/mana/ActivatedManaAbilityImpl.java index e25aadbe696..9f7c294c6c3 100644 --- a/Mage/src/main/java/mage/abilities/mana/ActivatedManaAbilityImpl.java +++ b/Mage/src/main/java/mage/abilities/mana/ActivatedManaAbilityImpl.java @@ -33,6 +33,7 @@ import java.util.UUID; import mage.Mana; import mage.abilities.ActivatedAbilityImpl; import mage.abilities.costs.Cost; +import mage.abilities.effects.Effect; import mage.abilities.effects.common.ManaEffect; import mage.constants.AbilityType; import mage.constants.AsThoughEffectType; @@ -95,6 +96,13 @@ public abstract class ActivatedManaAbilityImpl extends ActivatedAbilityImpl impl */ @Override public List getNetMana(Game game) { + if (netMana.isEmpty()) { + for (Effect effect : getEffects()) { + if (effect instanceof ManaEffect) { + netMana.addAll(((ManaEffect) effect).getNetMana(game, this)); + } + } + } return netMana; } diff --git a/Mage/src/main/java/mage/abilities/mana/AnyColorLandsProduceManaAbility.java b/Mage/src/main/java/mage/abilities/mana/AnyColorLandsProduceManaAbility.java index b2f4056fe18..14b9cec5104 100644 --- a/Mage/src/main/java/mage/abilities/mana/AnyColorLandsProduceManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/AnyColorLandsProduceManaAbility.java @@ -105,6 +105,18 @@ class AnyColorLandsProduceManaEffect extends ManaEffect { @Override public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + checkToFirePossibleEvents(getMana(game, source), game, source); + controller.getManaPool().addMana(getMana(game, source), game, source); + return true; + } + return false; + } + + @Override + public Mana produceMana(boolean netMana, Game game, Ability source) { + Mana mana = new Mana(); Mana types = getManaTypes(game, source); Choice choice = new ChoiceColor(true); choice.getChoices().clear(); @@ -143,12 +155,11 @@ class AnyColorLandsProduceManaEffect extends ManaEffect { if (choice.getChoices().size() == 1) { choice.setChoice(choice.getChoices().iterator().next()); } else { - if (!player.choose(outcome, choice, game)) { - return false; + if (player == null || !player.choose(outcome, choice, game)) { + return null; } } if (choice.getChoice() != null) { - Mana mana = new Mana(); switch (choice.getChoice()) { case "Black": mana.setBlack(1); @@ -169,16 +180,9 @@ class AnyColorLandsProduceManaEffect extends ManaEffect { mana.setColorless(1); break; } - checkToFirePossibleEvents(mana, game, source); - player.getManaPool().addMana(mana, game, source); } } - return true; - } - - @Override - public Mana getMana(Game game, Ability source) { - return null; + return mana; } private Mana getManaTypes(Game game, Ability source) { @@ -205,6 +209,7 @@ class AnyColorLandsProduceManaEffect extends ManaEffect { return types; } + @Override public List getNetMana(Game game, Ability source) { List netManas = new ArrayList<>(); Mana types = getManaTypes(game, source); diff --git a/Mage/src/main/java/mage/abilities/mana/AnyColorManaAbility.java b/Mage/src/main/java/mage/abilities/mana/AnyColorManaAbility.java index 2443d88abf6..efae23008cd 100644 --- a/Mage/src/main/java/mage/abilities/mana/AnyColorManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/AnyColorManaAbility.java @@ -30,7 +30,7 @@ package mage.abilities.mana; import mage.Mana; import mage.abilities.costs.Cost; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.constants.Zone; public class AnyColorManaAbility extends ActivatedManaAbilityImpl { diff --git a/Mage/src/main/java/mage/abilities/mana/AnyColorPermanentTypesManaAbility.java b/Mage/src/main/java/mage/abilities/mana/AnyColorPermanentTypesManaAbility.java index e9c34732907..58c544d2ea5 100644 --- a/Mage/src/main/java/mage/abilities/mana/AnyColorPermanentTypesManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/AnyColorPermanentTypesManaAbility.java @@ -82,6 +82,18 @@ class AnyColorPermanentTypesManaEffect extends ManaEffect { @Override public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + checkToFirePossibleEvents(getMana(game, source), game, source); + controller.getManaPool().addMana(getMana(game, source), game, source); + return true; + } + return false; + } + + @Override + public Mana produceMana(boolean netMana, Game game, Ability source) { + Mana mana = new Mana(); Mana types = getManaTypes(game, source); Choice choice = new ChoiceColor(true); choice.getChoices().clear(); @@ -121,11 +133,11 @@ class AnyColorPermanentTypesManaEffect extends ManaEffect { choice.setChoice(choice.getChoices().iterator().next()); } else { if (!player.choose(outcome, choice, game)) { - return false; + return mana; } } if (choice.getChoice() != null) { - Mana mana = new Mana(); + switch (choice.getChoice()) { case "Black": mana.setBlack(1); @@ -146,16 +158,9 @@ class AnyColorPermanentTypesManaEffect extends ManaEffect { mana.setColorless(1); break; } - checkToFirePossibleEvents(mana, game, source); - player.getManaPool().addMana(mana, game, source); } } - return true; - } - - @Override - public Mana getMana(Game game, Ability source) { - return null; + return mana; } private Mana getManaTypes(Game game, Ability source) { @@ -167,18 +172,18 @@ class AnyColorPermanentTypesManaEffect extends ManaEffect { return types; } inManaTypeCalculation = true; - + ObjectColor permanentColor; - + List permanents = game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game); - + for (Permanent permanent : permanents) { permanentColor = permanent.getColor(game); - if(permanentColor.isColorless()) + if (permanentColor.isColorless()) { types.add(Mana.ColorlessMana(1)); - else{ + } else { List permanentColors = permanent.getColor(game).getColors(); - for (ObjectColor color : permanentColors){ + for (ObjectColor color : permanentColors) { types.add(new Mana(color.getOneColoredManaSymbol())); } } @@ -187,6 +192,7 @@ class AnyColorPermanentTypesManaEffect extends ManaEffect { return types; } + @Override public List getNetMana(Game game, Ability source) { List netManas = new ArrayList<>(); Mana types = getManaTypes(game, source); diff --git a/Mage/src/main/java/mage/abilities/mana/BlackManaAbility.java b/Mage/src/main/java/mage/abilities/mana/BlackManaAbility.java index 1c6f4f4648f..213c0b07886 100644 --- a/Mage/src/main/java/mage/abilities/mana/BlackManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/BlackManaAbility.java @@ -29,7 +29,7 @@ package mage.abilities.mana; import mage.Mana; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.constants.ColoredManaSymbol; /** diff --git a/Mage/src/main/java/mage/abilities/mana/BlueManaAbility.java b/Mage/src/main/java/mage/abilities/mana/BlueManaAbility.java index de55909692b..5be60a91dc2 100644 --- a/Mage/src/main/java/mage/abilities/mana/BlueManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/BlueManaAbility.java @@ -29,7 +29,7 @@ package mage.abilities.mana; import mage.Mana; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.constants.ColoredManaSymbol; /** diff --git a/Mage/src/main/java/mage/abilities/mana/ColorlessManaAbility.java b/Mage/src/main/java/mage/abilities/mana/ColorlessManaAbility.java index b58d43e1398..0ac8168f1b8 100644 --- a/Mage/src/main/java/mage/abilities/mana/ColorlessManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/ColorlessManaAbility.java @@ -28,7 +28,7 @@ package mage.abilities.mana; import mage.Mana; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; /** * diff --git a/Mage/src/main/java/mage/abilities/mana/CommanderColorIdentityManaAbility.java b/Mage/src/main/java/mage/abilities/mana/CommanderColorIdentityManaAbility.java index 0af4d691c6a..0617185ed9e 100644 --- a/Mage/src/main/java/mage/abilities/mana/CommanderColorIdentityManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/CommanderColorIdentityManaAbility.java @@ -122,6 +122,18 @@ class CommanderIdentityManaEffect extends ManaEffect { @Override public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + checkToFirePossibleEvents(getMana(game, source), game, source); + controller.getManaPool().addMana(getMana(game, source), game, source); + return true; + } + return false; + } + + @Override + public Mana produceMana(boolean netMana, Game game, Ability source) { + Mana mana = new Mana(); Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { Choice choice = new ChoiceImpl(); @@ -152,10 +164,10 @@ class CommanderIdentityManaEffect extends ManaEffect { choice.setChoice(choice.getChoices().iterator().next()); } else { if (!controller.choose(outcome, choice, game)) { - return false; + return mana; } } - Mana mana = new Mana(); + switch (choice.getChoice()) { case "Black": mana.setBlack(1); @@ -173,16 +185,10 @@ class CommanderIdentityManaEffect extends ManaEffect { mana.setWhite(1); break; } - checkToFirePossibleEvents(mana, game, source); - controller.getManaPool().addMana(mana, game, source); - return true; + } } - return false; + return mana; } - @Override - public Mana getMana(Game game, Ability source) { - return null; - } } diff --git a/Mage/src/main/java/mage/abilities/mana/ConditionalAnyColorManaAbility.java b/Mage/src/main/java/mage/abilities/mana/ConditionalAnyColorManaAbility.java index 916997a34c3..5a4e93f0944 100644 --- a/Mage/src/main/java/mage/abilities/mana/ConditionalAnyColorManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/ConditionalAnyColorManaAbility.java @@ -33,7 +33,7 @@ import mage.abilities.costs.Cost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.StaticValue; -import mage.abilities.effects.common.AddConditionalManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddConditionalManaOfAnyColorEffect; import mage.abilities.mana.builder.ConditionalManaBuilder; import mage.constants.Zone; import mage.game.Game; diff --git a/Mage/src/main/java/mage/abilities/mana/ConditionalColoredManaAbility.java b/Mage/src/main/java/mage/abilities/mana/ConditionalColoredManaAbility.java index df717ecdfa6..c89e16ce1ae 100644 --- a/Mage/src/main/java/mage/abilities/mana/ConditionalColoredManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/ConditionalColoredManaAbility.java @@ -8,7 +8,7 @@ package mage.abilities.mana; import mage.Mana; import mage.abilities.costs.Cost; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.AddConditionalManaEffect; +import mage.abilities.effects.mana.AddConditionalManaEffect; import mage.abilities.mana.builder.ConditionalManaBuilder; import mage.constants.Zone; diff --git a/Mage/src/main/java/mage/abilities/mana/ConditionalColorlessManaAbility.java b/Mage/src/main/java/mage/abilities/mana/ConditionalColorlessManaAbility.java index 8bf323b9d33..6c67a7f6579 100644 --- a/Mage/src/main/java/mage/abilities/mana/ConditionalColorlessManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/ConditionalColorlessManaAbility.java @@ -8,7 +8,7 @@ package mage.abilities.mana; import mage.Mana; import mage.abilities.costs.Cost; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.AddConditionalColorlessManaEffect; +import mage.abilities.effects.mana.AddConditionalColorlessManaEffect; import mage.abilities.mana.builder.ConditionalManaBuilder; import mage.constants.Zone; diff --git a/Mage/src/main/java/mage/abilities/mana/DynamicManaAbility.java b/Mage/src/main/java/mage/abilities/mana/DynamicManaAbility.java index 39ae1331bc1..a79b59192ad 100644 --- a/Mage/src/main/java/mage/abilities/mana/DynamicManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/DynamicManaAbility.java @@ -33,7 +33,7 @@ import mage.Mana; import mage.abilities.costs.Cost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.effects.common.DynamicManaEffect; +import mage.abilities.effects.mana.DynamicManaEffect; import mage.constants.Zone; import mage.game.Game; @@ -111,7 +111,7 @@ public class DynamicManaAbility extends ActivatedManaAbilityImpl { if (game != null) { // TODO: effects from replacement effects like Mana Reflection are not considered yet // TODO: effects that need a X payment (e.g. Mage-Ring Network) return always 0 - newNetMana.add(manaEffect.computeMana(true, game, this)); + newNetMana.addAll(manaEffect.getNetMana(game, this)); } return newNetMana; } diff --git a/Mage/src/main/java/mage/abilities/mana/GreenManaAbility.java b/Mage/src/main/java/mage/abilities/mana/GreenManaAbility.java index 54f00eccca8..16e8cb14735 100644 --- a/Mage/src/main/java/mage/abilities/mana/GreenManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/GreenManaAbility.java @@ -29,7 +29,7 @@ package mage.abilities.mana; import mage.Mana; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.constants.ColoredManaSymbol; /** diff --git a/Mage/src/main/java/mage/abilities/mana/RedManaAbility.java b/Mage/src/main/java/mage/abilities/mana/RedManaAbility.java index b07cc876061..312fe860b1d 100644 --- a/Mage/src/main/java/mage/abilities/mana/RedManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/RedManaAbility.java @@ -29,7 +29,7 @@ package mage.abilities.mana; import mage.Mana; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.constants.ColoredManaSymbol; /** diff --git a/Mage/src/main/java/mage/abilities/mana/SimpleManaAbility.java b/Mage/src/main/java/mage/abilities/mana/SimpleManaAbility.java index 0163abd7a67..26ff6b599e9 100644 --- a/Mage/src/main/java/mage/abilities/mana/SimpleManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/SimpleManaAbility.java @@ -30,9 +30,8 @@ package mage.abilities.mana; import java.util.List; import mage.Mana; import mage.abilities.costs.Cost; -import mage.abilities.effects.Effect; -import mage.abilities.effects.common.BasicManaEffect; import mage.abilities.effects.common.ManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.constants.Zone; import mage.game.Game; @@ -79,15 +78,8 @@ public class SimpleManaAbility extends ActivatedManaAbilityImpl { @Override public List getNetMana(Game game) { - if (netMana.isEmpty() && predictable) { - for (Effect effect : getEffects()) { - if (effect instanceof ManaEffect) { - Mana effectMana = ((ManaEffect) effect).getMana(game, this); - if (effectMana != null) { - netMana.add(effectMana); - } - } - } + if (predictable) { + return super.getNetMana(game); } return netMana; } diff --git a/Mage/src/main/java/mage/abilities/mana/TriggeredManaAbility.java b/Mage/src/main/java/mage/abilities/mana/TriggeredManaAbility.java index 90b027b03d2..4f676cef9c5 100644 --- a/Mage/src/main/java/mage/abilities/mana/TriggeredManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/TriggeredManaAbility.java @@ -32,7 +32,6 @@ import java.util.List; import mage.Mana; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.DynamicManaEffect; import mage.abilities.effects.common.ManaEffect; import mage.constants.AbilityType; import mage.constants.Zone; @@ -72,20 +71,14 @@ public abstract class TriggeredManaAbility extends TriggeredAbilityImpl implemen */ @Override public List getNetMana(Game game) { - if (!getEffects().isEmpty()) { - Effect effect = getEffects().get(0); - if (effect != null && game != null) { - ArrayList newNetMana = new ArrayList<>(); - if (effect instanceof DynamicManaEffect) { - - // TODO: effects from replacement effects like Mana Reflection are not considered yet - // TODO: effects that need a X payment (e.g. Mage-Ring Network) return always 0 - newNetMana.add(((DynamicManaEffect) effect).computeMana(true, game, this)); - } else if (effect instanceof Effect) { - newNetMana.add(((ManaEffect) effect).getMana(game, this)); + if (game != null) { + ArrayList newNetMana = new ArrayList<>(); + for (Effect effect : getEffects()) { + if (effect instanceof ManaEffect) { + newNetMana.addAll(((ManaEffect) effect).getNetMana(game, this)); } - return newNetMana; } + return newNetMana; } return netMana; } diff --git a/Mage/src/main/java/mage/abilities/mana/WhiteManaAbility.java b/Mage/src/main/java/mage/abilities/mana/WhiteManaAbility.java index 600544fea08..5867b21724d 100644 --- a/Mage/src/main/java/mage/abilities/mana/WhiteManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/WhiteManaAbility.java @@ -29,7 +29,7 @@ package mage.abilities.mana; import mage.Mana; -import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.effects.mana.BasicManaEffect; import mage.constants.ColoredManaSymbol; /** diff --git a/Mage/src/main/java/mage/filter/StaticFilters.java b/Mage/src/main/java/mage/filter/StaticFilters.java index 032ba232680..7ef7ed806b9 100644 --- a/Mage/src/main/java/mage/filter/StaticFilters.java +++ b/Mage/src/main/java/mage/filter/StaticFilters.java @@ -12,6 +12,7 @@ import mage.constants.TargetController; import mage.filter.common.*; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.predicate.mageobject.MulticoloredPredicate; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.filter.predicate.mageobject.SupertypePredicate; import mage.filter.predicate.permanent.AnotherPredicate; @@ -377,10 +378,18 @@ public final class StaticFilters { static { FILTER_SPELL.setLockedFilter(true); } - public static final FilterSpell FILTER_A_SPELL = new FilterSpell("a spell"); + + public static final FilterSpell FILTER_SPELL_A = new FilterSpell("a spell"); static { - FILTER_A_SPELL.setLockedFilter(true); + FILTER_SPELL_A.setLockedFilter(true); + } + + public static final FilterSpell FILTER_SPELL_A_MULTICOLORED = new FilterSpell("a multicolored spell"); + + static { + FILTER_SPELL_A_MULTICOLORED.add(new MulticoloredPredicate()); + FILTER_SPELL_A_MULTICOLORED.setLockedFilter(true); } public static final FilterSpell FILTER_INSTANT_OR_SORCERY_SPELL = new FilterSpell("instant or sorcery spell"); diff --git a/Mage/src/main/java/mage/game/GameImpl.java b/Mage/src/main/java/mage/game/GameImpl.java index 98730a7dc58..bd5e17cc79c 100644 --- a/Mage/src/main/java/mage/game/GameImpl.java +++ b/Mage/src/main/java/mage/game/GameImpl.java @@ -1386,7 +1386,7 @@ public abstract class GameImpl implements Game, Serializable { } catch (Exception ex) { logger.fatal("Game exception gameId: " + getId(), ex); if ((ex instanceof NullPointerException) - && errorContinueCounter == 1 && ex.getStackTrace() != null) { + && errorContinueCounter == 0 && ex.getStackTrace() != null) { logger.fatal(ex.getStackTrace()); } this.fireErrorEvent("Game exception occurred: ", ex); diff --git a/Mage/src/main/java/mage/game/permanent/token/EtheriumCellToken.java b/Mage/src/main/java/mage/game/permanent/token/EtheriumCellToken.java index ce21470e9a0..af50da7442b 100644 --- a/Mage/src/main/java/mage/game/permanent/token/EtheriumCellToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/EtheriumCellToken.java @@ -31,7 +31,7 @@ import mage.constants.CardType; import mage.abilities.Ability; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.mana.SimpleManaAbility; import mage.constants.Zone; diff --git a/Mage/src/main/java/mage/game/permanent/token/GoldToken.java b/Mage/src/main/java/mage/game/permanent/token/GoldToken.java index bdc6286180f..b23df81cbaf 100644 --- a/Mage/src/main/java/mage/game/permanent/token/GoldToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/GoldToken.java @@ -32,7 +32,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import mage.abilities.costs.common.SacrificeSourceCost; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.mana.SimpleManaAbility; import mage.constants.CardType; import mage.constants.Zone; diff --git a/Mage/src/main/java/mage/game/permanent/token/TreasureToken.java b/Mage/src/main/java/mage/game/permanent/token/TreasureToken.java index 6f931f910ce..1faade54396 100644 --- a/Mage/src/main/java/mage/game/permanent/token/TreasureToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/TreasureToken.java @@ -33,7 +33,7 @@ import java.util.List; import mage.abilities.Ability; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.mana.SimpleManaAbility; import mage.constants.CardType; import mage.constants.SubType; diff --git a/Mage/src/main/java/mage/watchers/common/PlayerLostLifeWatcher.java b/Mage/src/main/java/mage/watchers/common/PlayerLostLifeWatcher.java index 9dce3c3c5ba..bd4ca446a86 100644 --- a/Mage/src/main/java/mage/watchers/common/PlayerLostLifeWatcher.java +++ b/Mage/src/main/java/mage/watchers/common/PlayerLostLifeWatcher.java @@ -78,11 +78,11 @@ public class PlayerLostLifeWatcher extends Watcher { return amountOfLifeLostThisTurn.getOrDefault(playerId, 0); } - public int getAllOppLifeLost(UUID playerId) { + public int getAllOppLifeLost(UUID playerId, Game game) { int amount = 0; - for (UUID player : this.amountOfLifeLostThisTurn.keySet()) { - if (!player.equals(playerId)) { - amount += this.amountOfLifeLostThisTurn.get(player); + for (UUID opponentId : this.amountOfLifeLostThisTurn.keySet()) { + if (game.getOpponents(playerId).contains(opponentId)) { + amount += this.amountOfLifeLostThisTurn.get(playerId); } } return amount; From 4851ba9e84b4580d43fac8de5b9ab92d7c13eb22 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Mon, 14 May 2018 02:31:19 +0400 Subject: [PATCH 146/158] Test framework: added commands for real time checks/assertions: * new checks: color, subtype, ability, PT, permanent and hand count; * more info in #4936; --- .../org/mage/test/player/PlayerAction.java | 60 ++--- .../java/org/mage/test/player/TestPlayer.java | 220 +++++++++++++++--- .../base/impl/CardTestPlayerAPIImpl.java | 68 ++++-- .../java/mage/verify/VerifyCardDataTest.java | 86 ++++--- .../src/main/java/mage/constants/SubType.java | 16 +- 5 files changed, 344 insertions(+), 106 deletions(-) diff --git a/Mage.Tests/src/test/java/org/mage/test/player/PlayerAction.java b/Mage.Tests/src/test/java/org/mage/test/player/PlayerAction.java index 34f2ee4c7a5..6924fd9b7bb 100644 --- a/Mage.Tests/src/test/java/org/mage/test/player/PlayerAction.java +++ b/Mage.Tests/src/test/java/org/mage/test/player/PlayerAction.java @@ -1,46 +1,47 @@ /* -* Copyright 2012 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. -*/ + * Copyright 2012 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 org.mage.test.player; import mage.constants.PhaseStep; /** - * * @author BetaSteward_at_googlemail.com */ public class PlayerAction { + private final String actionName; private final int turnNum; private final PhaseStep step; private final String action; - public PlayerAction(int turnNum, PhaseStep step, String action) { + public PlayerAction(String actionName, int turnNum, PhaseStep step, String action) { + this.actionName = actionName; this.turnNum = turnNum; this.step = step; this.action = action; @@ -58,4 +59,7 @@ public class PlayerAction { return action; } + public String getActionName() { + return this.actionName; + } } 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 543fafdbeda..8970be0c125 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 @@ -31,8 +31,11 @@ import java.io.Serializable; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; + +import com.sun.org.apache.xpath.internal.operations.Bool; import mage.MageObject; import mage.MageObjectReference; +import mage.ObjectColor; import mage.abilities.*; import mage.abilities.costs.AlternativeSourceCosts; import mage.abilities.costs.Cost; @@ -76,11 +79,15 @@ import mage.players.Player; import mage.players.net.UserData; import mage.target.*; import mage.target.common.*; +import org.junit.Assert; import org.junit.Ignore; +import static org.mage.test.serverside.base.impl.CardTestPlayerAPIImpl.*; + /** * @author BetaSteward_at_googlemail.com * @author Simown + * @author JayDi85 */ @Ignore public class TestPlayer implements Player { @@ -136,7 +143,11 @@ public class TestPlayer implements Player { } public void addAction(int turnNum, PhaseStep step, String action) { - actions.add(new PlayerAction(turnNum, step, action)); + actions.add(new PlayerAction("", turnNum, step, action)); + } + + public void addAction(String actionName, int turnNum, PhaseStep step, String action) { + actions.add(new PlayerAction(actionName, turnNum, step, action)); } public List getActions() { @@ -145,7 +156,7 @@ public class TestPlayer implements Player { /** * @param maxCallsWithoutAction max number of priority passes a player may - * have for this test (default = 100) + * have for this test (default = 100) */ public void setMaxCallsWithoutAction(int maxCallsWithoutAction) { this.maxCallsWithoutAction = maxCallsWithoutAction; @@ -162,27 +173,27 @@ public class TestPlayer implements Player { /** * Finds a permanent based on a general filter an their name and possible * index. - * + *

    *g?;=j}?z@3%%+ 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%0D%A#;?%QFBI>79hS+=DfgSg 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®*y9jn&ejmFDZD2&710t%BD3pOiA-|D{F~ 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

  • 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⪼rGq@$YL(kR}68jR&u9c!y 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\`JhSctQQ4}CKZrrUV69LCaS;NvD!D`m^S5)=Rj ze9tH4t2)Qj#HaUbSGTTr7uZ}p&v2VLAP3*@AG?%Oz`kF&&8inpg&Q)C^$(}r{{UGA zhI6w(sj9%#v)_sMBQVIsPu)0Ufq<$9W1yj(jh5>T8ZQNA*<5Z$)}Ti1QSqSXOOG<+aLN4XldBBN zoc`y^OA8FZejq%pMIb{N&1CMOxsL!d1GUBZoli^nB{_(992N9aI9qbMMkZ2}Y*hjn2ekcz-IcFE3*I1W=T=N|YFWJfchFyPV-!0XnEzMD#HGsP` z1koRs25UdiiISr(6iR6$6x)UaiZj3!Ma|OV+My2AW5e$AjhZrp}tg zFU1OO6FCnC))H6yk5am4V3*vk4>ToLPJ$>MeCs?Hc!*i6Y&W@zK0|t8t?qH-ji}NH z+yD)4Q?MR|re-kt&qQ`#VzP?+_cf*)*!<@vYS&mTRqbXoI&NDl6O)-567W0K^w7su z{x)`p-Qs~khmx8AcrSHr_-h{@E8-3?4CIYiCKHU^zZ7Ye@|27!xrKU?+q(=_>#m69d7EGUT z^x{3_VqU(W&#K4@|kwJvaRJ>DVZd z!Wx>1^;@lviM6pO`(JQslvtHpn1*ZA7K@cGD*XJT&?H*YNjh=L!L{wsHUmf}nM=NKDnK9X<7#KE--CnShyz zHr?qwQ1|j==2eR!)o!_G0%$|gd&OgwQR36iLGDk3%^{E>lxD8(G)~@#tMy&)l~Z+b z>|qm@u}WubIi(l(;;b&C`qVopz-U}G9P=;RE5jG1xs|?(P$3Uqyg9$Xs(GmXa%wv3 z>f_&jG_gb9f;t=6e`h7hQ+??H_CdwfMXa+S5CE!+oCp&pMVEZaeSpfJPg(Xl=j+u9mrjnHQ$STG;?vKx(MLPL|{3| z^r1#R9ZKxbIp>>I<(;>PO3%g3qvjA(g5B>-H}T>k@KtLTh8G`IvOK9qQ_H z4PgOQsa+M;;^gePb4D4XQDbK^`<~RL0R0#8tkHFOKO=t3Om0ZNvs zS${pXq$~eivS|^ep3$!M&Wut6-W1CApaP;3j!dr2A%PY611S&Rb8XlT5P!(iFEas_e0 z)hde+T8&b_BS1QBBJKuNv^N{Ju6a8B{1-yhLu6icieKZUu(0cJ{fno(j_mp^tEKrM zEBOWCnP2gYm0f)Vg1Q+7R}XBjTE*$xxNn*|x~7UJh{U;AYij>jyNSfP7)Q(I=eCXw zTHnahiT<3+pE=Odrjuf^i~GRkd7Y^rCYRG`DsRgJKE_)mK!Q-?6*(IF!70 z#BaHs%T6N*YDTW57&li>=)y zV*AJ}OX)gjF?x#z2Qo-8DQY54iGN%Jw1fb8i}cMBaRS`qvxF8JOA)qu`N6Z@`^`D_ zZq)N9Be#*3r0D)v)SU1b7$1;3!wC~zmr#8gfGuv#4?gzKNymq_wH`(u1F{djx#BVHdVD+b^jP9 zvv8Cz2uDMkuTqq1A!@L+34&S`*;~M>ygKoIW#d84bh2NjBnuhez7~43lKjB+qqKN#2 zDxqoSf4q08sh9LS(})?|4P_=A4>%or6ox7_KZQkJrqP*XLO|z!nNTuwW5M0gT1@o; zUJl$_87wD0I7e%w(>f%UY4?k5gr3h>$zDy495~0 zhMcCYI9mvkFd(RJ@oLC%bS+M8l4*A7LAACjr$X+{uewv@RXUjy7pnh9HB4J;DSc~e z{we>Vc&Cgs@4-|@J9YEoEmuQyq|omRsh+{nm^pdFKQcir;99l#2J7`=x6lEcAsQ=& zO{ZTdqe>)2$ng0usvTO9V&g3I@KvW2am`2W-^sBy}@`ho1P-dG&F?|{qERg4g7|z0$&=g?@L>=f%Y`}3w z15AxyDzb@R8c5hi+=$=if2tY|1!xFXL($rXUv*VQGVaAfD)FI+6WFin^aaRLU7B8P zcTHYYTldp8Ye_)_NL0yR()#Z&mcDo{V*&>9k-|Y{D#>-vp7q5J)DM0t{s@ZC#y~DH|8&$rQAd23YvOO4X^rq8P?s{XxOQplSyd zFz%izn`B$IX+*C=uRcHy0fYJ=eBz+vAv_+Y$3=>SL7rPEd?*`7Gz zx5Ylv(XN$WRlE1d1Kr_IirUB|%mM?V!=z~(hm%t?P6VZkExy|1oAERsOn7=Te{n~w z9mg7asc;d0X|Lrjrb!1qQ4V86}_oNw_AOw>ORujE0xXg#NJ>x!iFo z?fRx=f^x9Av2ofpDg-8&F?QT42mwhm-RR~ON4*hiKB2?yqBQa+jq2a z%l>uX=}`jJ&~32U{c4i+{|ety$YaLUKRU{s<^e51(Tc?bw;Q4O>1E$cEJtYjCzY?Z zF8n+^`Kq>Em3`QT$YwZGCz8`%Vu6Z^J5w3H+9r;UzLT8R%V+=TvA+U(JjTjSXD6{Nu>Y>#Q0w z52SAAr__Uwt*+}U$Nk*!7pXr8t!zsa&i{0=obb%F2~=SaPBgsrPA8{Fbs92V;)0Dh zxLU|sN`TG|QHr5-z%Q!VSYCGHG^&e^X-jD5uy}!l2^g4#CAUAaq zmaq1E;#g6o9190))(a-dfjUmbAN8O9epuIUk;qZMv&Oh)nn{_%>0hiky2p8-9Y6ba zu^Widhz4=q61LlEzco4}Bgtlh(qS<5SB&N*dx%RtPXb1e7En#P5u<3VqbJr;RtBp! zp$O+u1@c+-)~FYk!{)7z$1E-+_%#O4J#Cyr_=GJCs?Y2mTi&y7_|s)ux!KQ7nHhc2 z9GnZlWQaZ-EbhT2zs3b@t6 zyg_OCjMBv;ax>AQ9^Lr+#MOe}vzecjU|7{oWp4+LsQ`y*lYQhbky|KJgw~s~La3A3 zJFIP}?iGh~Upc4cCt_6nuV{Vb+K?(m8{z1&6+;F!tFF>F#`5F&(`Xkr%o{t#>55V&{vgyo;owN;OUIjHd z0@6h34Y6Hdz~_=6Y%<+%=x`PJW~+CNV30YTbSg}B7Sx5W%v}-0-cX%sr6D7VTD#ij zSGSeIMn67%YOr9(`!$`_X!q>UksU=l*Oq9`aV>6*M-H1cZb4m-WM6XAnM<~Qpb^7g z?K69@T;ANBIwm*aZ5p}mU-SchT;4i{p*!z$a;(bJbHR4HbLh--%{D+d4P%BVU;h{xW`1XRZm*F?Uaj*6g#*EmQ<&ygc$<=0UtqW3Qc-eXJub0q1`j#V| zIW^Wlu~NRYSWqQ8cVy%x%_Z4iK_XdTTmqlO!r|e&71^yKsfY;8SY2!@D(u$%n9mFi zHRO2IOb``J(_WceeiYDCy@#uv(Y1w6-i-DCiL-0%hJ=+g*2pq_p;>AD+2GaWN$)Jo zS#l>X_bFSAYHUj8^u^R&cG7~9W!0}48FZMIpaMgg|G8XFBwa{&sFRT-Z=C1mF4eRz z8mnx*MD%-X{PfwWtK0j238V$j&-*f=%n)PV$hhVQ5xkYpa)o31Qq)mOmWeRi`xFEXj0h>R)LA_g=a^ za~oa;%cOzgUh^CW02I0ytZVGj2{#no>m~dV9)nQah~3KW<5mNVg}H(HO{_!pqdtRm zpEY0gay;9L?GaV}Y3y%TDT2?{9=><4aC|M{UkGmXary9IOy<1rm189^^b_17XAGyW z`wtfx^zNpX@4nkpVQO8HBDS-cqwy4DFL@Rh1D^qY6(oh$KM{^f?p7yYio`?aj{8~^ z)6OJ1)TpqivHFeJ;O%ALP;l!4Gxd^CS{B*JW1a4)CJzp(Q!Lo=vw8!Bi}a75_QNUb zR{33>`n=(*)=Eb%Ca-TIypv+!O;2n?sDIuHi6O7K3|<2Pu+hn+4N>Y_K}IKb_VmHT zOgsi8?8IE9;MN>dl3BNa0~K=}o{+A#1245E9QVm7w+m0N?Qf_XC`^1WQI(d)?2?a?OtOXz zgP!aqg_|yk800A`*j0Sgc}Fn$oB&abS>dC@Is2j~pu<@j0}V~)-IMfOSZS@+VD&?+ zsU}xGmjejt505%rNyu6yliDy^%I^Id;^lp`McUfhA1On8mSG>5qI$h}WtoW=sHdnQ zLW$AXUJzwEupmxZjODX~hf1AhOzL?uYSOm0d~e}+0*%{uW*O+;_magjI^Jr+Ggn>3 zs1^+Ft_fMtqFPY5;_X0y?2_rk#ggsb`=T&vX4y&aR;s_-@)w|^i;Rn{A=bE8i)VL7 zIM_A1U-j1c0TCroxt(*q(E54=<5T*})l5V(GkHW+XELo-xuCcyBOcUpemZdzC8|Yd z*Z$_LN{h@>;wUs1QE2eXn?(z=m{u`iOZccqTsEj)GOy&^iCe0E9c$B~R*30R70{`Z z4|st?G9cXR>ThiaO5X8X(MmcgJFrKREQGd@(U@c)NZ&1?!m9s|qBD<5I&H%+ib|GC zlT>K9lqQ;AC29!@DmAINfJ@t$nWi%?m5I2*xR*@~;o7E%nz&^yO>SkTwunxn7?_rO zVd09IpozbrlXx!&`^<(-c*+4?kl-eS)#x_VU$z;b>9(!L)aow_Ey@iKtHS)C>3DYYu=lm3Mi z=)G9qFj1MW@JzNzwA%6IL0#;>5X^(*NWmvZa7~Q`cznHbauWxD80TLJkKa|E>;E{tF}4bqe!b z3cjjqVf)*y_D~q*E&5-Ge^ig9Tu+1KzDFyHQ;|haCX)y9J8k@ztu%&z*|GCre=;#RbbH%5lCM|=|v=y(Z!c2!1V=yA6zUueTx)#=0WOchT?BjO1XxpR1GX>szUi#Jj{)j=g=-eN@WIpddFhGf-g9avMnX0 z7h)%khjqpNW7&@Aq*2}RG;v{jpX=@Gw&!ZzYcGryut5jzs8Z1oZ6f1}W&_81u0FD`puUy*3*dl>#s0ntPlA8>*~?Nv8{? zI~p0EHWMm95u}z>KPP==;zPb59J;--bF?Kf=A?;odbrcZ5i428eR2@2(UEAB4t%`xc zP*_B{Mmfg*@IO>W_G>&s)0ajeGATS{V0H+kL+`n?1jhcF+?-hQ-I&#i#Xn~DDJB(C zoj}Y~*Z{82mqrNuRT0C_f|}0r%v0IRtB@-UWnB37HCby3HE?%5#CWZ)M3*A#Dk`?W zZ^wN%vVx=zaO7OYWvN}RXRGAR6w01lOS2rr=->RBc_D&VRARVTZAiD>3nXI)ckUjT zhMopNN59a}=%>fy0oHh&EdUd=X|T5pZ%@3xyaKki7s8G;->BeuIM}<`|5-HMz2NW~ z^p5b6XQ1nOUJ8bi#f;*DuiR*YbVH1%(7OK_?wA;ZARi#WMN9__Lv8^X#|tBr*F%bEqjL@TiOHF zd7br2fp0{0p+TN6UmVFfaXsPk-l0esfrsHvr!Xh`RL3Sr2t~~NY@P-+rM)vD1hEWB z*GARh)g58#DSSNb^PlIFpDVN=@aANnONy^26XCYYJ7pgnXsOPKPGu91_-+Ks-X-)x z#p{cE%Hl+MZrNK5*2F5Ax8*Exu$$&Iu`lqce0vCDoR{Z0n8itOhnNO-8A_+!i=gXE z#F@l4f&*;U6`Tyudn6`4kF^5$B!pH@cH)cvBpV2Z3(9;_NNbXu2j>(l&hp^k&n|A@ z)2x+Pr2OEXGQ3d%D_d7LL~366;*j_8CUd<#F|eZCKMD#-%$2-~XvaJK&I*MXurm`2 zLSEcKFu6H>@?b1naCH6EG#_Nb%M)&2+fc&lYFPH#Tui34plXX|z0g}aH8g9EZ#OZ_ z>1gjcawSRuqb)+sGT*sU&e3lOKge~+Oa1TqFTQgbxO{plO)B?-3R9nUTAsX9sfO;@ z_I*VL3WqZea*p&!aDZw{HoB0~RmOVMJSmRt5oGd`{=#6oM2ui87OY&fj*XBulsbml zi$4V5ms<#->j;SFp=Y#bGtvAyIM94byB0VN_rf@ztvwWU(H-3BcG0w;>i&$*O_>Zj z6B=q}JL6Wfj8N@{W!mKA`F@KFNE0ISj?i{xjA-w}Ai zPHpXZp*BBkYwT3_?s8cF(g)#|mn&bIjnw+KZaDtbg+P=pcfgQodEAZ3H?cJ-ec$ZZ zUV7A2o29t}U-Yhc*hic52pJbBZohi=A=x6MtY5a>Zi+E50@WFkhP#;>z#vujFgTh2}ZCEIczC%Y36`My!M1vRww3x&srC)iorv%3M$(+pPkuuzRX0MudA@X zMZt~V7!R$sZc*uv_CG~lopfs9Fzq+sD@wBZr-0=1HP#N-}+kaY#y_m-Pvo zppXgnBH=>50TViIB>YMn360k72a8}IO<0BlW%?BAfwOf0=N{x@8e3GOTHInK*nPB7 zE5q+c$)MEk_C34sl)++HEh*F@X(IuB>eoxkV*}g8Yaetos$pNCH5LjB;4)Snupd@`f|<@({F%|}j@Uf;kM0Nfy@z8i}vDm=ZrgA6Qt;pl`Yr5mU#|LtB>yg4bB!f z+WW*jd$;q&)P*H!iTqS#)js51M{C5zu@|{FaG8;N^sgU|IUHF^H&cJ5=|?6#7m`uh z>yhr>Eg#M`6wN_Yd*eidJGGZD+CxJ3mz*$|?w?#i)r6p!q9z<8bbp<7cp9}iiuYhK zI}}kT6<0#5w{8%a?RH}JhKW6?$XoqUx`;g~ogT__)`lUZ5_g^SKYWvIn1Q$~rq>lE z`D6^{&7ntulqI@`{nk*deIZ<83LZChdi}a7R2$W_FDGW(C5mbDj0P!5!*oXDl?I(@ zinr0)2t{+^pgFy9Mf)VT#sGXi??V4ZSpIvffIXe^8-q1uA-n`-n|K4>6y7y-luRJb z#q*TDk$ueVxKf46s`dTbK&?QAz;GebDNU?6&)sUSJ(t=in&p^?n+CH^mj3F$D_5bz zXnQ1STu?gNl3bGMi2afd0|urpQQucQxzT%Doq4~DYkh3loFtduAI{fleV5tQx7@_ZaI`Bsaf}sI{Mk7D z!w|{3C26gdL@uY2+z+Jbaqk&oP$+_yHX0Qxp>!&7-v#HE6ZW zm_n}_Dsf~e%xXGaz1)Zq*1N3yS93FhM;1G|Q8^zM@_M~qbbN)zSU70&VHKslHk-ev z5G(P=&jEO4Z%7C1_R0~G=Q{(LMmdxzf)3>_W@_rHO2Q5YN1@3EhwK7b4tzNDQh zZ^sng9HM>48c8Sf+^=5D4_|+v5hw1;>Q%?AKYbN7+iUXd%eKoB45XEo)k)iW0+u$* zYc*>nbS}5(Hay832@F10uociZ)-rFj8VS5wVUkm;grSLDulBiP zp$VgF$;TQ9zbRlhYy|YP1G{2FV*fq~q42fK{C7Z5i=};D0^;Kj9T=2B3J(Z8feO|p zOYVK;7o${SqjdYBJ^j(zJY&vSGmfT1c84LpmucG#$93TP0P4I2ndW@y{2OWMzYuJX zvOU4voW`0Ih_c#2o~!f1u44Y+)6TeZ<#0N6w%_C2mFZmu2^df9vg0%(VZ2kwG4m4EQJ^3s}XHT8A(CfLhJul1r8 zTre{-%%x@OI!p;d?3P4A%FR(AAYW#(vvs!7V9yO;o$Q_vrbCc9eTxJ2k*8yh#R9+J zM##!se8r2Vz}%?1HZg#u7lmFa3W~4^Ege5oXWD6qRQ_8*`f@0PfWqIL zWoVN~3P9E(1@6np>PJ?Q@zYs7#ClV{CsTo$cP!gyBwQnIg5wyvv8SSg4;x53(sQYp z8{KaAVVVK-09jHoV{7`F3K^$|UAB78j)J|2uL^CT=N+vLQ03uU*P#)-UPRO=W3PlnEb|YJV(()Pc+mzn#nCFMD z7S&f*?Vf$3pCSjH&h-69QEm zR$r$460<9Hi^OE-ZOQA+#N6`rjSv%1t(yltL=&ySld!h7@O~P^8Co~(@G50EqsyxX zR8-1cARgsE>YOSjJg=j4Nt9>FkY9+1?&oLwIIEX=@}zoYuaNawgz>CaTR5>n3BbUaCf;ZAOE%o z*4#;9g&t#W`U1aKb*W_A`D-X#B&@Q>psU>=upElrX;gXsu{h&`o5oA#Pg&id>oq!c zHtN6F5nb1$9aJIsIF?EH=f*o1MY?f(`|A)fiiMF2cD!hUr%8J?=$?Ns3E3J2VcGQJ z@|Zc8(Ra-WXJfWGag|KE|25CE;Y0o{+4jh>v~pCQFN8N-YSM!L=}cW!{Zh`Lkr*jJ zi`Bd4nLr}ab>#?U0+^J9naalG2yUQ(7z`w{&M~kZJkM2+NX=88vtubYTk3chUcpPU zx}|Gn$-8ldg#N4)C)oHD{ryZ)vQ0EX#;b<4m0_`lI~B=6ua@TL-yF1Uh|=^cK4Cxv z+xF%X{S3e6@_*(7u>0wcX)^8v2X7Nw9KGkvZcvhjO@QNs@|~1b{c@_SL;L(n_e5|C z;XgWV^6nRqPMeE4I1yO&XKpDv@b)^eOb7vIu}0(5qL0_367Yg-!RK-7v&W(uLT-k*F?ySlDpd89hfw@FRvCLNHkh z+x{c(yJY>D45TYOd?h#FZYG|Z^5#hR%Z83+aS;XANpY4l_i%+0i)0=; z_qU4C5?fHBR#ia4gtzy#FHRaB&Q z@Q{LKNU(0atO#<5Tx0)J-Z2ddiz*Z(Yx)&lheMD_^65yDy;|UZaSj<*&Kc=*4PSQl zIR;B~YVJ{VIe#{ZO1>?S?@Q*=?(;|3HxR{czJNemaiWX#4GI^(7+zen( zjH)d3fmRZ*aq5~n`|oK=sw@+@h*od1UW`{GqhKg)8~}WTcdU9)dLjCK9@PmadiD(c z=dz*Z9o@FFJ@zGA9u)L${qc`?LuX9P!6P45`kGN&y*sv9#b$Bv8&`=Fhrr;cTmZjD za(EEB$OZV8ZQvSVby>4Thxes@o;eu>AK5|6xGaC~*fX;~xH`>9s}pp~8chA2kZF9w zQr8ikSa%CtO8>IlOGrNNdE7}`Tx)-Hi%$$KmQVAE(rRvZH^gk>sq(6E?0L~Pf^la!B)efi+~R|PUqYBhq?%tvgf?@j5A zU&hI}{C}wIHC8_)NKRYxNHX*>bqYLMhW;_J!;zL30Yl0r{Ml+J?Y-X1nFbo8PGc}5 zApo#8#!oXqjErdZ0ano^q43}U?<2Tc@$~ZWj$CBy>^#w&9AN*ycgJT?W>H#MQ}_@$ zQdDOkBpwX+3jYl4UhWdLB7a(;MJahm>Vv2+UakrE{CCu_tADmL=FWrfaVRAuo93OO zSF%*}!0!3)&G_7(QrwC!JW$cKx35NuE9Cx@I$N$dxhmkhQQ!;Pjz`s7!wyS}`?b>X4rYf$C(h~pd1x(xZ=U95JLA;3fH8%g7n$Va>wf>-BS zl}1@xI$;x``A<4zx|ntVx|&nx+M8u{iL!WM!L=CONc#KlojqFC51(wWff#Dbe`88J zaDlaM{pa#eZo7ZUc<*rG-7k8r*AY_r$rsPm!$)6%?uN@T)lPhpP0jgxPh$M@p6U@W?YfaP0qcgn`8-QHd1sd3Cm8_U z!|h2L_5V;=w{b&bFRz|c*$pYv~jkhUnAlifCrS)d~l3`*Xj=^u;E)ZszS4{qVI_eQTy)pcUKIu^!L+!p!^y=cP3x#<1ftW_#I zD5}HiAF$y}nA^;CS^3NC^ZTu^t4RZ3h4JLrN^Bs|T7YDjUVZHH{K*2jYL(B+2;yu? zr|BbA(PP|FUw`CiE*UJGsx-|t@8BHx}cPx8Fdg1*@Yf$(c0Dem(US~BfaX~i#5 z>Lu)@E(5(2s0yP5e8v7_-4!=)HE$DQjh6BpvAs66DExsax_J)qms=uSS{i3vNbQ2* zXi*PUqb^3xLBNVe)N}Cs{d1%0U7cqSmz~M8h;&AD=>mqWMN*6GosgC!#yPL&eVGv;}un*X-P3vn+!$9O#dQl z=!6You~_X{(&(VkQWr0*@|PCKCl*inX_3ZLBL$XaYFK!V&rR0C7~@Q1$p~%n4zH0| zI)u(O0)?&OmbHNq7x_p8|2VI?RC@xz-lsyVE}Ksmep_(ag86i#Ccd0rjo1QIe0Z8L z1r*By_4>2vkL?}+g}_}S_BYLGMr`b3^fQ;a2w&(p3+C(b{L9&>j)@6D>+qQaL#&~v z-MvmwzXhvc+jw7ni00A(X46?`;=E973JAzVEBHt zzUuvTxlQiLSVOE)APa0_RU)2hBU8rm>cj7Y-LnT#iG{^Gs@obi;pGE~^EZF*!7IV= zPvye4|4vC@r1Z$^BaFgiuX&|H44-!JD=QOA>Y|KRW+m{-w$}Zrw2L_G8%a9X+`!dy}6Jl+vl1no$dnC>uP}&{*#IMXx5db`KE0kM< zml3iRSHR)g1dC#A_LuCc$+Nh!1hm>|Lj~S%FP*>pe#)3KcDI(4m}?vPp-ixQb(!0- zk?`2nwMwg}t)lgIp3;{MjQ86v|U55W2B-N zreB`)0ylS0@Rg`N0_(bavqDB3^kK%8=Mapz!fAE15i}XFe(+ljPqaQV z28)7aC?}N4H(+UKSf2ip@Xq>oKH(L9s^Wi|O+qV>A~4xMYCA$IEF37v;@8js-%+u9 zHozQ|t;Bf|-JPIefj5b5&DRj3O}c$*W6T3^i9HDXO{&{YnO(t5_;cc>9pf>+tmMzPI2G5p3l-Pv z68%+dC>+ySRs`Nuj{=U`1ErI z6BBD5?yFY(s&8Ywl3sl#f1%Q+r4A9h$97mZtVbgCtn8gZs*DhV-64g_~GBS5H|Fb#=bnTju2 z7549$N-M0CYQqySpy_d?_2-5csqY+qIh0EM;q@+H{8BphzffsgQstYy7d##m0FF?z zr}K{YEy{2;lcGcL`%-ySQF?xCGZ;ae>>+zRNd8mku^A_)oKOzYB@ZIxf=nkr?5x9< zI4p95=0)p+KKZ~zCTSX4u?0FbN(fNgl~kS z!!+B2c#x;ZGu-#*v_Cz})M&l+Ux=F*G__<&#OxcUGrG@nF_VE{Pb~bd2@G-KVlIka zmf5MBj?QATe`BLlQiMWW->K*AOM`{AUZ!XIAaq(E{`w37g*EVM!lfS7L(t{#&!0bg z+GXyTLSPzG{dG2^D3Yh1oCM{B47g_tZV&s9)0^}P+_B`}7lk{IqE5Dplqxq33rdh{ zf=Y}S#j*MA;n4XfC*B#sAk>aPCWpHTf7%JU+Ac)ji#rsIL>bF%r5Jjk?&E34B7Jc& z4(t}~r=7Z#)`{!QrTiLLW61eO3Mcl0nyTh1fcxqW2Yh|Kjx8;%^I5ye4jwLinJbg( zNuflk)^{tBTsH5}DXP`Ap$k}+pr|nEp~ws_6jq}K*F#Wag9MT@hNq;Lo`Y{u7-Z&c zg-6n$F3#N|D2p6$l5^{9zF9e?ymAissZIZZh_Lp8oW?r`US@R|F`E>bid!HW?Xhq6 z9$mP!4VW&?iT|SukN-3{WxKVirR?=1kl0w79mIKNTh_U)}Katpi$7kkO22oz>g^Y#147wwZdv_HtJvre9c<>6tDd2|KD3|dx{ zs`*0My5h}HIbw97yCfq&jTuDWy7Sr1rE{YJeAstbtJ01S6YOvv?YI_pc^Q1dLBCGK zXk*GLcyFDp6V$Y+xE@>Gc2VhG`7OY|j)mg8p(u{&$Z4%baGdwtj4yF&eg$Y#Ki)Yj ziM~naln>f_TKhjpA07!Hu4aul!*70xC4Cm?*Vx}anf>gEUK3$6uJmipyALk25f8GC zM_Q<0Cli!S`ByhVKeT)hp2*&;huo-%{b^p1=YV%G#Cpy;ob^&s6eE+-1fw90r;s2q zBX+w*p>HIf)jXXfzl z6It2l4rsO2cL*}l5i;@LFkr8l?4nezfq{=b7iIM|!QfJzHctlw$%4=>x6c7)0L^w) zE9gvrq`!A0(r%^Jh~oBEQH9DeRr7Q5-LAYBp^L=@HrS2;ICJuLr$C;F0KGoBBy8B` z9&RM5$;`hw0Z!SbMOhuFe*Y+|qhnt*u{@=$UgCs~q8N*Tt_pSzybPC#bz9vJ#rJ|L zSkZ%(k&D)-T9njkC(k>BwBBc2+kCA?#b)w*sAZ?Q%_Lw`5jqeUZ9vl0E1z{x%@H=} zr;}@~AW7*Vpxxs+mg>{e?CBtQqTzJRNx%X=B*}chb%TYj^~$YlAMDBBz%Uo*eOzm4 zGnbxZK{8n=f(gf$ijb^pbR?AFm-?bnv-|?ha=6Wx!uF0$P%$RMV1-@Yl~tD__OL{I z9y2GTWzj}Qse=(1$jP)AwaV3aQQzd}%vZz1J?amwd7{MrUfV|4r5!Nn;+*ms_pX7JY_(e4S|Pzvp?fyd5riZBW?s3M z$GmMT(LFVA&^+NVj>8<{*?-y^RH(IYw?%|1(IR^fmhUC%LS%R z>=GAk3d0%>B3U6Ss3y-rB;|)E=h`<=AtDe|iTHFy?B!JIlyi^CMe0JT4VCm|f6E@W z$S}jfTzT(wdpCa!Kh*+je4t-j$9J(U{A&8*?$6bFqG#Z>djtNGh=H)4%e_LQ{s+NZ zF60F=gYSrIOKs^*5X2N2(S=+j7}O@Bnf+-xsz`T`=T?w+TCO%brAOcRF3x z(Yxyw`>ZcuYl0>vGel1F-!Kj9lo2>ordJ?#GRZRUNWT(a?*@kF?Fhjxocibe&0Dg| zmx6IxLYSarA|j?Kf(z7G>o?3ke$Oy02^6wu-Yy)H=7bY`q_+6L!I{^?oeM?NLoBZ5 zD^_!HSiRLnjs?ttCc+6p4vRQ85L7WsznQ~vv=uYGayXIp2aG23F6%$5@3#fz8ZnU- z*M+wLWV_z=SL0E8p%JJYxi{u?Zyd_FHb4L8L+8Wqp|Nwo88mcj!XMhcY-oJb?Ch;` z;REm;gqe6zT9&g)ddTRt?BjbvM25Jv9ic$_?knggj!kJep&)^v7n^u;k#rRPwBXTU z(hunyYa=F$D4TIV5+yy+wwIc0DW?gvIJ+xA2Hn(XxV3xbkCmL^+6Ji7PkplPhn$!0 zqn*x>ZkgOWwEMDcWVIsezh&r^V!zX|V3a(|?Z9i`X+dy`v0GO>dPWrTDa1(u8Qsv1YH$Cf59w(GkbBZe0| z#UFSy^gjLJz;R7~CwG*Cdz4H{Ks!6VfI*>UCVzc-=D!yznUHo#%jSQ@`Lou8tyW|DFIYw>fa#*6(_pPj z!I5Vcp+`sGEDV<06CBaQJ3UCG&Mfk|$3!r_Z5A;iV4*7uF2phqw)Ah-s)3&Aga)+} z+Zm@=x(aT$Tl5P|5r)r1sKFzycOOEOXrQ={=sDchWS3g*l;Ds>1gM5)%-4c;&~|@X zas}eRGx+I4@GPk`r~&feTJ{I>&&Zq&n2Wt!inS|F+B?C%0<{xaUBOO9i5Q-3p6kg+ z(cOl{T}UqxR(jQgXjQ!suFx0Ria|0WZ+GsNeZ6_;iueBdg1p_8d_7KmVu9Q9!%=&S#-`W#)|R;vD5rY9O=pZqC{pST74sJi;PQMJEVDK)}YgA_8UNEFxL z9}X?`9gM*slM@o+N@q7IzcA5EiqqvaDM&eh%4BtQUuzssX2oVbk6wT1^Q7O!J^aQY zOU^aL_^+ugHw{xh6#7(rocf!liHlL%PDGVju^dpKYnsVlK0{aqKb@E?Jg(_Yw{ zd+y1;?(^oj#Z7m_G&6&T-DzrkFM(@w7Xg_}fQ8*|O?hJ-U`pu(6S%yXfq(Aq;v}oW zlEJFks#*WdZ0`ZrGoj~Iup-U~AWip1MABqa>PKqQnocGkMv4uVW#y6R@&3Ff$%pL% z2h`x8(h|vNSsO9UM)r>$%(4Lb-h9rr$wf{sSM-=S$bPrrd#L(1Xe~iljjKRlHuV>f zd0y`5N>g9YtW2l3?830%)z4WLo>xY9q?T*r(W~#8a3CZ(?;yIOWWd^;tPGimJi8)3 zLOQs!vHH&zRIym4@c5rZbFXGkcJ%Z(n?kIzg*JK2wyUX7_gF&(ZzSNj{%xLK3T*#J-gB< zSlW?x<_WZ;8#6zc26QlsQ(-SqRdBz?z#Bde8gV>mtES_e5ApJKz9F~@c5r9N;q>S? zsHzW#C$$lx!bB{5A$JFvWDYaV3k|=vS{tP_8DVZ;jrs3p@o}2i(!v_9`s3)vgsRcR zA~P>eDY$u7#&!Km@XA_0;UQtPB`*&6Fw=&ar;MaAs(9tjB>gfIKrx-Idq3_OH$N!% zN>sVE+v}jo!8agHCrh+SwY(B`oeKgCgexZwUVo5gJ0HOZv%*=vw4zOri9`A0%xb z9n@u6x;6u9sqPl8hKr4nHAPz~lFIO92R_wR74Ib9nHYZ2{yg}ms;I`foXP^*IqR4s zW>N^*w$Ak9`n2+BgBC_sI_+>Cb!m&UTv}R0I|}zE^?oXS#Y*xyQ2Nj7hG$F#$a>`eMcbzb~uTjpM;vvWMcoki*j_An-&hRlHAKL?Wj@dRCC! zZ(%9Kw+O%(EV;31H>$|qGtb2MjG)6QY1-kl-N%S)ROQ)d}BSq>|E$o*&9e7tTsy42U;JVL{0D;@C;BP@|wc z$oc!)T|B=~^mj2xG-z85)%gwo;dDGDRe?u~<6|z6%C(Datq$%SzF1IV2;xV~yznhZ zMFKQk_F%B@Ov_)oOW`8StdJ>u+?(`qCVtxqUeexDBEP4QRAQAZ#em3ChgIru7^b2N zE0@8n6qW)jG1`hLEJJqGWDFO`AMo*C0eb3hN)}5Km~`5emYUfS=E@4yAI3gTfr&uQ zATtUzBAl+{=6`@7MqU|2m0VpReH!ogsA(YlCUlE;aB4=zay=Xg$k>NppM~Bsx(*Q` z7P{b8?b+3=sfA?T&mAp%4l8Ht8d$&9r;z2^IU(i zM0YV~xWN|8fD?~_eaYPZp6U-b@NIq}V!+3CzUl#<7MR zxV?9#31qpKuJ@tHhOrIGjC73eDD`)qK`+cYJPoY5_AA-mvum0Wp_FW+uml}QX^B?E zv?CA0A~05IZH8GR-eIH1DYp7R4gwGrtuVxcmA{%fcSGVGA_)hG%UCP6n8L4_(+jzD zPBFHhx=Rc-Ox=PMk~D!gEA5SrS(UQX%>npx71(QPdA4Cz3w?xf!|#|ci{Ip^nVG7S zP}o3rzY(19GGm(L9vZNI4P2DGgnzd7)xfWDk_*c$On*5Gj;JgXxqx!%^frQN2>Cqm zov+EdY16agZNC|to7>;s3pD`om?L{zuP+q7Z7wYeaHFzblxPEKPqO(Q^=W=j4#PZ> zmbnKTrnkInt+-v%iz(X?*KUY7n5_UEyIT>C;jAL&C7~s_a9ffjS=@Rmhx7{06l3%_ z4cZ74NSub+?H=~4KnzWD|qz$26C zUZQNvtl3k)zNP2x#VyvyNcmvX&8B=P?93K=hVK>GfhKQ;o2K80XRz60>)#r7K1m-Q zuEhQ1tO7xbbYUPlY;z*aRNRzAV;0^E9%NEGfdpemzn|#423^D{Fs&M8!LAa>Aj7U} zwYx}Exp^oJK2~0Vo#mL?p8rtY@hl~W#a=EtMD$&6o(pl2bX-zVlwt9$$|jRLQP`57 zp(M?%maGIzlE~f~C4`?<5rKos3k4qh-C!*RyuCcaVlIE9l2&8ZWGhyi{+3MH8+fuk znO}Vfy&C+j$Xe@r38;FL7dJu_LW-P8Nt&H^Dt+X|H&>%2A+laD6A=2;0olDYP!|of zngp9AbSTsQ54A#G-lYV>vaWQ2kF^Ta#`oBMY~AWWp6m>w(~NMkvD$8e43 zfNJ{0YEYktQ^ksQQER<3sda7njWJEyg#=2k4M!L|7KV&@b2xEhjp8zPabS)d>43@z zBw+9sl<#ZcGiSOAyj{Ga){AdXMw;H(O8;)>hwZ^M^i-PV&3O@L=oFUJL@5x8uk;%{ ze(Bt;iD(ISViAC=EvNakozEUKRK*9GGE}Ci?P8a#dS643_1}F-9Ef60;Sz6W{=0hX zDq=C>_J4*M59&H@Qv8hzUO|_(lh7@C&oACPIhm3(KX`;V9JT9A>rGo|N=hoxkP$Fq z!+E+=R{OSOf7Rn65oR8w>NXO>u8ve!$G{84i^W$XeEjBArD6_cD5LjAO;LV=l98t0 z`ckrqD1%hQ%01_LQv!UG`Xs8eL->Xzd&&Jg*ZS8>j}@TyM@6e!-Nji9Bk-B-7zrLjhdpYt4PS*+GK z#>36F)tT3V_mG?X(5^u7J1w{^*J^tG+VCAg4BQU!od{9$O6k<8{@Q>WZI^?~4Fp*^ z8R1l(zMvq#+4i6kA8*O~1cD$wSqIODy~h0)n_4JMm-;C06UY6~hwsP-thW1B^QW1mL@MOoGYOB3nykcDy zlBIhmJ!o0>V91v?b8x?ok>s^t?HGMB8tfrd&^*%fsM4y~W=VA&sNsdL_gVHPB%n{c zoKC?Y7daTEC1QU{FOBU_IkhuhwR0X_4mFx&g0`IS7s?1Y=2x0E{;ihA1_1D`1@}(P zHr*d@$Vcz&x~m0(kluAp7}0Q^%gjGE5-TZY_J@ZhAm0>%hO|4A1fD~0d|6iaeu9^c zthfq~xMv3L+U95m;jI>Xdjd(_7zE>Tng>9|qwqP+OAJY(>(VHBF;~p?5=#?)o&pf( z`t9iK1bIZrd#hbDnFSdTcB&?zG~sE;=yL16(u7y#O@pPVu}Q5TI+sR$vWF69!2W?P z=i~~?5eP#-eYhQKmT~tyA`+oCDS`=@YF9c?IXs`I#*!SR;mf`gqENs-arwzTRD2$5y-#`}^uYrWpR9tUQ*U zS&;9B-Sqnarv=XTI+_p{0#B3*w4iok5bICt%b3oq`d-#y`-e*!Go=%QX)hCh#RWr| z(QnL}4kAjwUN~lU-!*Z~neG>K1!~*0Na5@$$ z7+z7Q*_ngyaDNYO59XKy19lpV!Uq4V?AcwmBbxXpIcf8rjQ}lTfBR^4(EcdN8(iUY z8%jz>Z+`oXr4*I+bN=a&s*&THbWn-5iLLy)QWI=?=@Jb8m{sWF_FX}HWg>0Ceck!p zw(&~tx&@7Pv0zksOjxWfojhD#if6%e6GB|`i;g6gICN9kYiv)ZN%%U2eM+fjS%=0M zZJu^F>+W9v3+>=Dpat=t5CgS>qZ5i#F1RMsI-d?V5b3gPb^J73k#h5Cuhp7I9dnri z%~fgHQf~s?V>ErCPZcRHl1;lQeLu#@og90lQqcCQ8_A(E6mwX~G>v5MRzb50%vS@` zOB2%c-(u%XYcAnc_Ucl`Yg-TQ-a8tS`R;wnl-+H8U212%Ofk!cdzCtj=r9tO!sn}N zetpDA=`w^NmP>IQ60v>x!TjY5&zlsv(dCL{1Y!cY{6I4BG_bMO1A|)}>9e~mj}=uL zoS8Z7ft{lE*b2v!Oxi9L+}hTNPmQuJk)Uj7KTvGDvRhX2FXT~tXV|&0Avki$wYzI_ zO(V4RG?N5e8=M=-k!W%^#9ymjR>>GOKQp6^$97|}V)*t12W@GwBR^uC@~T|lFRo;; z#wHuxLwer(>eyu9Q#=u;a!y;0Lx98CrBbK;t$yLf1Ij0b^Fbp z$0_M6vmn(tIgw1$dw>4whZ{ZBH!w=yUD&i>hG(aP!8h`8?}HMrm@^mCILQe!UY4EY zPsA{RPF-T*C)bmM2c8_?YWmUS@h>s(RI~(R#mHyTe&V4T-0Q<9zjxyiGUR%B8@Bs% zW+YmO*9`PJ(?t(P%oc(Zdy7)-(YsVowG(iH;v~#-llu9y^A$ z#sxG_H-f0|gYH_M3Ssy(x?Tvf2{a0B3iFHSC5gQc>b=?jYqKYDywbwGzQzQDU9Y4i z12cF+$mtg)p`}5#nOIC`+zMA4RrqOPnnb)n;7VI`StJ`7KP)zpM2jw-8hVPGw)0Gz z8sRt__zROej6g_?z=Tb67`JS-f*y(yCh7IV3^eWkiG z_ymiLch-M%tgh3(?0}>63_R5_ZXM?Bnp)CGLic%)o>|=h&NK{G8#Y{x_j}Z`0s+jI zc~{2@TpFGMAE3MUUKGl`lQD~g7fW#OMj@4QHw_m5HmK73g9EU%3#Q{ z6AXay?zSj>k|r%2(7g33PQfq;US*g$b#VQ}(S@LEExwvUtD+s0tc*^sd#U8+t029R zSa{prqVihLs(NI!xEw?dzpqzno|`g3v4B*d+=9(kj6*R`eQ!Dc*w31Fs~rPmtA>Ky z2ud<>O2g7MzZoBXBHdv0a3f841TSvb+c%(1is;_y578GTrmevKKF!iLXg_Msm zy6%QegkCablj>#N^KRQ}4zJ8zfAd915O+AVZgzo<8?dnwJl?ReU z)b1Rv%?&BW=Gq4W#hfMBbOqR(<@KPW>PQ z6z-C7CcRPlNXdKk`X)s>70`5f!)0N_*cU0C!2MZ*6a%VYIb2d5;CIeQ8&(X0VLW)f z($(0A1>$Dh19?@({I>N<{F6;9pZSmQgD7oY)3o#5o_ETJSHGs-z2~{`qff!fcSH4S zN(c(<&+=?JZ8at;H7mQ)cuC)i4p#M>6x|O``(6UpY_lF)eHsGdA>c&IU5_uSnhl7D z8rt80KV5a6hrI_}G4qP521G&^bMQ%L=^UMK< zjywn!r|2w!7tl_;>i<*-be^UEvl>dX}AVP#i9{ zodkVva=v@Ik_L8$rp5^o2|3Sc{mCy@@o`?%Jjzxo%UrelVK#Bf^~&Y+Nv-iVw-i$Q zM9!cvTV4NGI0~o6B9nbUWqY|Br&B*@rT|`|P^Jviy_uUZ&^E{KN?{h zE#8+4QRV4k5Zt-?UC&a11&kA7gdP^6fQ3lsf0LuBGiII+^JyLW1-3H^(#kzPXI(5b z@ZXi8iu7P5sfZ~M3gl^8g_{jvAUxe0+N7Jg&1v=Pt&4MJNBZ3ag3#*!nXiW|j3gO4 zLx%@5s&|qkFJA!utpBF3&IPe+|KWtRRq&JF&@||q@3U@r4F&JE;8Ws)xYJZELWu>B zoJnM1>wvm(88QQutPot^%5e(7(R)a)_2YqVI7~>;~PrSIU zGG?J+xxk2+0#A%BtK7Awn!_nd$ze}Km(3gESX4HJ?5ee#?*`Qa3$nmI?>{hjYOiD5 zPS4R|yXwc*ztXeDIns_MWX8QHjB%;N2k8jxIihL>D(C}3f|+?&%=Vodo8U&;Nbzx{ z`)>k*Vw+2L!;55#8zYpQsL;^lCWZO*N4X6=YV?DOCOTHqr8g`#bM=fe) z$4x3?xZMz~4x`{{XS~Bw7axXD@`8YnuV(qaO4~4qhjROjt+Ys?zpw>dLB`LiR^19m zGk@>NVclAAMvo*XXlmp73OK2k@+$)Cx~B`P4PYr8N9uxWO{s#xJOs(HL242BBz(u@ zZ}|;U2LR_WG-SQZ(boL~kdMzvOmKnh#C`WPad&2u(H;N2yZix#&dzg8K9P=reM4#} z#6LA|E1K`JJEy~d<~^EIZXSFG(b4HJ>xO|r(s|y_32!cQoc}XbAJzo}w~DeRhuZh* z2W)CI{cXJo2jWHj-q}z3f(p#3ybCYyXXSJ+8&+$6YG@C==%^~{*PysIZ+H5(EMoU3 zCo4LJ;J=~ytq=sJHv-LzbcaN@qge5vhrVaL&ED6mPoXmo%L58A__ot4eX2$Z(`>ru zCZIv1$Mp++d=yu9WLy@F03=AptgE|3kt&@-_dxA9?ByPBhRX_IUD3eNg+=@AE>=$a zTH3-q&i;m1=*F8S-K~ZDt<`PM#){jJ7w`86BD5hio!_5@8;@0LTn<`X+HMnw;cD0} zW8_{>VlR@;Uqfc2lWBnrH{J5=hzQKAGe`)&twl(=G7tb&)5LW5niN65&2tJW!IN`G zJ=>LI@3*0>y3eP{L$tn_<4SHUMMZFtlK_p!2~2QKA7D9!@w8SwJ&q>I1UAGAsX zkr9iU#^y)@zL{TC+TM$SBGye_yqej+cPic>)-Lt7r0dGkSvTr!-tqao(Ell5%$D>t zjTnGK2Z6G)*m|#{OAVn0YwNGG9IOMl8by$^n^6MHERQg}FC|%fVS!%_`P7UHUMjkC zTXLi&7{@V>AeKO}JU3CfV%6x2_NRFu1!wPamC`kV{G1)5GY5mEWt5s?CO7aVhE(2V|hwdZx+DNbV+zQNAZMBK90iNzuXEiD59Cc z#m3pqwnQI7uU$dqJs=|N!OOP_8YlA|fN|N|at6C@dKf+WQ8g!vNu42uU}xDWgH}eP zJV{+|oII^tB~R2QKC@o}=F&pP==cxcf-jq%r0QY0J9=rDPP9?pQ1DIODccc zFo;Q-NhOsQsHH{bTWOMkf=i8S3NCG9W^R*9=7_jLu9THSxX@yRs3|U$OJy!8sg)wl zC?=-n$_R-Ui zK6CA)o6O$hEh=hwjBasPl=B4V?#j{mXWB}7CU>V^0B@xGHq;P+k8JRKL?b)@px)yf zrH$ETP7_ewKN5DDeXekRbs^B&tD^&JV-c?}Q}%36Q$N7K@VQs0uP*1fnaO$+iO8_y zrxVHf@1G80wX7^ajNB=}F7Kdj1ev5}kU}qK9Aiz|3HXF!jm@q6K1T5C)9z==?k97W zP*?f7SL`g4^hzEno?S1SI$u==d~cE|;GMcFiY($@kj2c(`_I?H9y{YB+640hS~Q&^ zkfeV!J-;o0^>!OwGf43*)7`kmiNY92UP9s5;>s>pd?dFT7D|wl&~Fmv*}Z@tq!ERc&?b#HE0f^R!y{W|9Dp+) zmGo|@A#QQ&Z&K+_v0&qDY6!^(5>py*Y#}7XWGAX1XQsPHi z(4)5v2NLZOeck@f+3YxeU+T&0zlBSHCPvRwAU>w~!xn(nBsqMSRlO_)6jWoLB)8`y zk57G?8c$ZpM{}i_eGl@Upf5}rd-OL5J>$`U=4i{nFL$$P8bGk3>5iwiw!@?OIM%5@ z&t}bYx2|2Bft{waxJBM{ide6{1u(%EPhP?Uce1d@Ap=)DzP|rq_5F}Zey+dsRASki zN(jv)T1s9*7fo$F@@GA0gVvt`>ji8uUfpg!c=DQjWP!F$a(|La?|VDXavaQ2sNw4T@U_ zm~cUXC0fbgvo#mO9|PTO#D5c2ekwzfLuPTV)`WzPx${vtPK~CYRDu#=Pvo{uIuMb- zYGV9Z!esK{vLRqa|0BcMC{PvBm4GS2;y2?Rk>$@XmmIiS<)_oxJ^~Xk$p!at^%6}n|u1QopCGS=a=Jl53R90 zT04-|H71Q{#NPmZonM8VTqXLbU{O`@lho&1eEqP%Do5YjN6R#Rr9A03t50rt8V09l z-X1DW151WV;YUPQANCTPoJI!HpjEuXv>LUwa>2+;Oo=P^3t$| z$Oib_TW!5QZT3=!0^a1ONfw}Nysy_?%P<~uaBe~TFlR5My0!|$J23J#=h(}4p;sCi zAKuv;0t*A!DVT17-iHQ0W|p%GC(9MeFIO(Rvm*AadI^I?9ujBX$nN1h z>Lw^_5R0?JK<#%UFTQvsPLCCWPgDoROuKyCqysoX7n}fxE&EvQql7(;Vknr`<+kU?Xraw+P76Z$V^t zfanVJ!jR5TPu7W8=AHz9TG#PJ5`m9uCcwffuV-Dmdd%BydTsL6$O@ONUiK!k9=XoD7lPC3~?2mqFLFp>V8P7+os>9Z8(@6bzKG#N7|2~P< zD`Q1{d*#GA7u%k4JW4138v(Icr(dYTWCjwS?k=?@5UqQ8=9yJdVGigtTl~uvB3!S? z5U|=H_B=N^_|@Wd6iAKWEbNCD)tYrLO)!x~R0Ul6E4rw8dhnT5jg|FNO}YY4^l%{y zBz2Sne;7>Z@cjXJN0IeM>i2~5M1IV$m*eV`vBpSlzHId2GnY=n0&Gp7sXiC@Mt=2lo34ixKvq|Z))WPVX}{u56<(Vz9*XLt_4iU&N+SxZ z{B4BZzJMI=(2!pdW>X0-O;NlId%lSOeJ`?~`8)JDo>j-aTfB>XitSUmhN9(L) zPN~%k`nM@q$+{|;R&qic<&lV;&Ag6@yjIjLlulQOlUm-#Ii1z`)(Lhg{^i=eU2)Z0 z4>UjlxL?bUlS!)Gr|;Li0*-7W62t`S10Bc-W%p$s=Rv`ASqYX4ICLfLp_^*!%|L`{ae(|>Miv&Ut$=+c< z{HaIm-Al8ab%kCT5lQ~_RX&<4=%LpkLAknJ*!9pb5b;OS{l{Xqn8IuW9V4*Uor{`* zz$Yk}O=^_}vpq#F;(Z7`fNW5tH$p5&Q|>k%*(6(d3Xoh6!jll>)o%CgOSp_f-~>er zZbuXl1vtn=Y(#JN#YaX`gVDfpl`Mq7+flB+A`^`zs@viZo6kC_A~68uM>E7k&_2vD zE!uQXrM6=Dq+hhGSG?#*fJ8b1YyjLxDO=AJz#i?>P_tTC6*c}DsbZ^Rn0aHna~+co z?$_a?Lk=!iOZrRZT{T(s*T&fCexxmcp!4sK{6C^C7}bFAdXnO-%6SZs@4QdEncL;+ z1z44!2u5+wE@8N`ynU;|bkh5sT^eErf#}l>MuJs2#S7>Dnae%VxvQ#P52PBjyoC=h z&hFg?;wRNmyJnp2jhHHqs`sq_r{;Mv5|ouPn*zxH!-v0?^IRhDsKOS{C` zB+V8pj-u+8J&-NS=kB{J5&`!Hdy6^n&pr5sX(!0{rzwzWK9IXC z$xAV|j8wCEusilm3rsdWb7=n52q+1iY;7zU`Kye)wk}V8v{dwPu(~eSGwC+ZWU{+G zXE&R@0|Y4v9TUD$1?Y*%`QDa{<~zkFu6F}Tz6jHJaUdcXtw|uY$`~VZv(%j7%#RQ^ z(3*me0s6+KzwT}{1!UzdRo}WZj1{T|&~wOn1pv2Vr|e4*0biL^j*8ETwv8tK01d z4sr_9qF{tEmrxHrb{T?2-|Q=A1PYBn4$#Wbrpg3~0aX+?Wl`Dplpd5q1V{j-`H!mb zM76&r(+>{IQu%=#;{>nXby$_6ScMVC@NqGe9obX}Rqti1kOnVz~*fJ~{~XZO$Y)D;XFGT8$~mC41=*ti?$jZj36d+)aBN_2}|Jt+eg-|h+w zAr%hRp0*twtkox3|N$6=2kNsg#QhBDSK9cv0fUf|5Y@l-f5yX zu1Bzvl#nt)+&2p#w63XR*H!0-H}kK^fi~K$eV3;rAxN8T7|Vv1+WfX zAy76-nEiDXCMm&qGsSeqpZ}N-%Qzq4^WB&3XfS96LgX!jt3WzL?&MYx4X;xT%(o5A z_sCG~iG8Il%JgrYc$7vh+c>K@+_&eX=3;M>11;0jeDs;c>u|S!l;R2V=JMqitV4Up4u{i&_>z4qTf&BFFQC7Wv0De&je-okn%^UCDXB6EE0v^AQN`PuJC#4C##upueTW+1uf}H*%_W@iwFc| z;lk0&>4T@Xf#&}XN;IxlU7s7XH9onk#;*Q0GF{Esl&FIhi(^!tpE*EsSyz?!E&%Br zSt$-8Z##N9!JXX@t~;IS6H|h3CgBUTo3=)W!DPr1>o?{HTAT%dcS%F{ZiGc$3F&6)Ysf@Cghf1qFp#0iP42N_oWROnHtvhRn$f8aT(mY z&lZCNgp}d@e$^bSo_7!J4_sIMMEg~USZiiF5 z^El@fWj|-=?pibV$dw~6{wc`e4dioAWCBhbu|CC^lSk_TN32S&O&!2h|4?h=DV}|%1ZqrMK3!O&NwrGG`0KGxiRB$ndRr=hs4a~hi30;g2UyPGb4th{e;j-wuvc-b78$%AHe)zWE>IF26GRha;krfT)ZLz8uqvV6qno zl2_X#5Y8GS)JpOLNg`1GcE5IQv)S-fmb2~>QW&=9P3mZC%YUHu(Wi!`*zjoN;iF0e zXTx}XR|&AzXvHna`6@MW-sVRyU-wUvBNo>>tx`7IP%F(k55zr1UuZnV6h*coQuZ2j zljwoSAK3Bi)9K(Av1Fm`D1i{^1cWax+pTU%v6UI=-Cqz0FrC&E8L-+FIhK#4+DR2uaU3Y)R%Y(;QnXe}#%!#X<8gbqnB`8(S5BT0*n0Gj}1ftM`+$+A^ z9l`5tq>%akjL=(7Qy5@DX54uB>!wO()|?uqqg{=h>M|_Bk>#{Aylw}d{_Z5(mbF_4 zVW^yhHZ6;4i>E7a`o9hHGlx`7*GP<}v-j%jK7DM_kpL6GXf9$0b$c2f=m2^bwyaoD zI3R2rHdZRZV>&mD`Cpooq>7qVMWCFIt5H8B_cSvfUe`4|I6v7#$C?(Zms zkKB!fjZ8CgyTVKX6zxizS7@O{!OUSPv!lzpNpv@o5)C*fO^$r_p8R0QOqZ?*eS2qH z0#Ph)AMa}ukcF1{9B@(5u}((wv5Nf<2f;>qYD7uu>8&61%VvoadzZF>VE^a5GGqJ! zX(y}F0E>=K&;4yH9ZfwSr`aObsSFbyQM++ zxgn;eW*~yH$NR`j??yAT4Pu!0^%M02p3%UUK(b$YleXT5nOFAcf3V4OLQ($$PPT;Q zI1O{f@+#2AKM@h+N_vm$Cd8TGV6|!+in%e zhnBcqYUW*Jz6;0|2=YP=fq%)WUP{+X3;|Pie2nSfgO~&e5*7i*mQ*FGGN(Rd4?*!( zUI_t?(8cj5e_l;}&e-~yx>6jNWjC1kx`z>bZAVVuKXE?W`|D-!9co~q_0M82kw?M9 z4gislgAnx&kORkjNW4wg#MUBhQG#+E?1hMcD}VKW1C z0=GMr)`c(5g>vJr(LH0?SB`yy4 ze6BxQMA2)oempDubFt@9>1rpq$`43nQ9MOos;BFd6=lGP%W=_wUIbgbM`Fi(v z%+yo|k+ZYqd~aA3SR!HqsbrFG&zq0`18FXEyC{nreWq^C0XtyT$b<>zXv(gP*ctHJ zBtYnbb%2ZkYUrHGXD7(oII~<|249K`Sp7>x4`8gXn_?%@ho%kyZ0 z8a`Q2gkTVn^{pj&m3zTB678qh-7Lp3sY!aZ*cpni|1T>gn4&H+>Sb%j@-nM*ttgxA zorgda_6pujqrW!*vB(B9LQ`^hkx*Z<{TGqblXurFjsk`xPA)3d5%mpYSZcUGkIBmb z|5(x8IBN627^{P*h5ByQI5~A>sbRZnWPFj1kzRv1rt^fLH^5Js4{(NzmawxOWxLil z8ALh#`!=<0FS&bGKLwa0O+eSgL81h{O(7zq!rLi8#!Tg7#66l(w$ktMhAfx<-t%u? z`+=ll#(><(!5NEb>EOHI()zw?XsmZrG)@(;)9jXz#$UrkYNnYt>f|nB2zyaJSWHkF zK_+J3+{OXw9W7$wy9V^^(?7Pn#+6H^o$RiRV`mw?tI@oVd42C?ky6dY#XW!ew>f=i zHbn0Liy^{txvg4a7xapY>*Cs?+!j3Lq$A{_B&(Eem5rnt@=w4LX}j66RvpS&B6Btx z3fw|w^j)r0sE*l3!`(0D#UnWE7;b?oaKpTs>GIq}`^(4{We;N6CY5^?ILW5~xjj3D zjrZw2>INKW_YOO50RB4x8W5`Je(-FM3xtv6OJxzg*tAvzjj%Cqa{ASb$+ma_w7dfY z-~M9->FCu{eD`;Y6R`~971y|8BNF{PRxpvaQoYR%m{=DUmvAJ!HWbP*(_e_rzan#D zT;*Q7g>017ZrXGr@dFR89b250_jXZ)ivh-FBKV2nYQs_#Ex$r%iY&xTr`o=#Q?b>Z zG0sSeP;Z@reP@M+rJVjdumEnVGd-p&Jb3TY*1Q)eP%sADW#uX8GFNmImelwshMS6) zfe-AlaWLyW!;04X3vuoQw=Mdk&EJ3}0D^7lGRqIkwho$0*A}$kV&<6+bLv2Un2ora zmK$Z;F_KScC~nc!`M<J zBZbAllzv&k<#%$D8h{@s9#Z)}uoh;pkh4iOlCp$ZdAiLUb=-Fmg!yHaa483nE17@_T zLul@6x(LFx@i$8ccQ@8QUTK*k3)4@2gzFm%sG-Ha;c{SB9p1g*nBb}{N zvYi(ZX=d~Gd6gG$$042gVXmob5JNg=>0sac<{-2Lr%4{`V^EWtKJ$jQ?yA+!_m~}} zuLBVv!it*)+1_du=KD0#390Oj8Gn*R&hB1hdn8@fdBN!j z)sZ5O!q!whZ!~o2C=AXH&W{|4TGFmfdde(y^$WyT8yB+zu8$b)^XeK7qDKwr6h>J^ zVTzx;ZQSocxKO{HO=}TWg}FuxF-lQwZTP#(5qDZ9KR}Uh0Xh3}*Vw0Le>?8q!H(X| zmZdf}hY<)^-4)$~h3(3ZB6q9QIU8FyG*f6;r_*L-!VS1YqCkHvPdgEzMu9mL`nf@i zYNO$cH8+ES>6eUqI_KA+9kC>TVHM@nfZ;oWW$!y*+N1X^Qs6m9-(wHJ$z&(47dM=C z(d~WO|y{q#V@W1i72afFhW*7XtT5m15Sz>QhMvL{n<3N>E?2{EvQsdC8 zpKXcth#*;YNu*Ue-cDD1{?7{qJV))+{3u7Bjt*3Ggf@LjbcyzQzmZA8b7)jgZ6`Mr{tB>=~l{++kzra1Mk!eDu&YwJ$j;1&m#hHH!zkYqn`u5i3&qRw%I zPSc$0gR<0Hu&5k27iZ_<_ALLq*p^jND+(b}H`qoEK3I7&Zp*a4-Jq#i{h|YS?_EU~ zWzVDQm!OsZT*bD4D4Qk^fwWsxWj3-O#mv9D|1bS@U~NM2-&%!db`bw=yS&`}=!<1hcj9~4aSt#}5UR)&LieY_BZ9g>KKn0BqA&-+;uqaau);j$`|A`ky6}=(v zm)adiXWPu7s;Q~0z$u%OI8eg0Yk0(TFXui!Iy^u-pOBn~!gj^$txvHlb9P_;$oC;J za}uX4TDyqq}J;i$LZp{FxCfzdQc7|~pgE?UI5U?(1-3?~8<0WyZ2UO`V4s%qTP`#?~;v5rwR z^3v!7633>I<48GDrqL9X&9A_1Bh%!g58m)v?D&wneqAoVigL{(#ycIVH)0%$=5pVU zoVvdQrXyeN`S#fW*aSi8K@|3 z95w6jstW{9IHw*Xdlz=eZ3d~>gf-LwMMF|E7r0o341!#F`A%60q_iQ)O(C4Gv4^j&Fm^5XpveCw9g1tzf)Iq%Nm1*E)+CxG>6$d zO5z=6*PQpKK4qmP{ zu@<;1UWhyU=%0r(v5}FW>Hf091p%Z$Dob^W8^8cRu_1u$3-Z$>wV*YYV^3*C#gB9= z#2$5QCX@Xu39XF}ue324pfjiY7!;`=1FX6&OTKP z2ZU|1DvFJr*YnRBpWHHRz%F0c%xVHlLK80XenV0v^)sP_kq?zXoHA5xL# zJkR7&Cu_h@GXP#4cIz_{Q#idv30 zxC{T5D$3I0QM9BYN^K7+`(!Leg6&Y{m=0&VPPZrMPOlqlIPa58sOqgsfW@)_Q+Pwn za4xO>!gBdnfE9R*9n4>IWOn~S_1ru+*Me9a>gPcKideT-FRWkR+m6<~(#o$;VOH~! z1@Ic!AJ4UT#+bFq1J7%K)O3bwze)XL-6?YbT%9?6E*N?7={M@_#itL3Mp#g9A}~$t z(<%I&chP2FqB2hE;dBisT!Qh`ALg{thbh|1C8RuL*NS$21P{oR-CZj~{Wg=;EW?fi zj#ElS1f2I1MNdL!Xs34S{tvW2MdQkSnIU6ja(CI*f@s+fcvEow+Mzvr9FYllM?;kd z^?0i#L^q_~Kect5*24tEwKC9n%BC*$Da$~{ea&S#Cp~4G9wiF~h0mWiN`d;`%-FOD zuf|FYODLXm!AtM?51!OZi@%X)HZk77`hE=5#7lOHLkqiUEpn9 zp;0v7$Adv2rD<8QKL=kM@UIE{6C>~KxxS?i3Yp99%gQZI%_91U-ue9a(BIr?%O~f3 zD8($b?Gt)Zmax-yCYLN!Nu1H91w!l4m|^x(N!~5$$$t)wr83yC_xI`fJieXcsdBhx zPJ`ftlDA`ve+{QN?9FmGbS)AAAcmNuEEpowClG0@p{#&zf6$_z%Ej{EVUeAXZHVkv zTvU{C=$oq_^FB1YL+z%4I$UMeMJs)uZFq1|RY_vIJvi}VG`D1yoBI4sLEyAVZhztJ z3!`s|?w--J`6Zjq3|}AcbwgTtZq-RaaPo?Zz|TaRY^hiW35;5 za!^-fJ>GdPbWZToOPe0u4wiSbBK40!5pxDw#4w_xe?<)Z7~+^AA{YwK`>6}X0HGK_ zx>6OHbSiE57AS=RusLIgZIOwoPy2VDc?sTE4b#=-18Qu*O_Q($VUb>sFa~Rn9Y}}% z1I5aTat@`INT~UC#QUYzyu%ytP`ZvZ7Jv)U_+>KIqwCuo?Nk`nKHGuJj_~Dp_JxOU zw+=^cMl1=$0qppxc-aDa2P+Oxzlik!jVJNR%Z_Qj(VlCGj&DQpe9i^y_gU3lo5#z4 zG!Epa4TAkUIt-4wolG`ZX+^}9JD&`6ygq{q0_WeDpiPfWw?6HgbomzdEf9Qo%(NvS zUYc?GgBk*ebFlvhVxHdNMy+5BJ;Z4SR}uh!u`VjhEcNHP*@JJlo^fky2TKePGQ9mh z=}UoO_e9~`r^$m~R_}tebFB7&mX?(sg~p9FfMscgKup>UOj*Ay!LOXENc>PJ2V#<3 zU?5K<`rBR)x&_#VD@{Y2^Q-jkrz4cK{sMHKlCF#^QCYYAJTG?w4s84BRL=S>oAW9; z@siRWz}NEe!{W-))2#Oyp_l)3vJW6|U>Xnl+P?Aw<{U*c6nv*X6EVHH1DrUbo z?>0Dv+=4WXS1A%8WEgQwYtfVQGZwvZfgcb-^hH21UcC9Mcwu-29sV)D=_UvvmC{;; zYAN-)!=M$AxF_k>zC3|Kx*nQb5~|kpezEt5r9uZTVlqga$U~RtV5vAOG5xqPMpwW` z)nZE%W5Drzycj!cdpera~ddP^tOeRGuARxZsCNN)kf=G^aq$ zvaN}&UQDsnl<>@Q1Lq`ZTjMJ>DT)OxL^z>%_rM z-fyePO?E;5+g(u<%{vApoo^l>yOaz_3uT38zN|kwp9NOE_wq zC7k=9VW0x^bCIAU4TeH>Fa^#R|7-w8g@h%oWgu(x#Zm8npbFKx*RaJ|d&ss85CF0X z(a)4*yTz(i^_mT#`m2CAy}xxSBPufFS=8HJD%ARapc1zuPN+yA>G7mHb`9LJW<0l| zle_vZ09Md$?q=}E9UNmgx&Z2@1%>E6wt1u|*`EJI2QMf-lQB|l5jznOYTS1T51MNXU%fYsjy$SPf^zom2kw0Zd)^EiWS?lXJim+(u&8#=l=UeSPkrqPoj6^KTv^C`e3^a1AI5*fhT{oKwdu3to*;U{fzpw0H>Hh{I=YBl3mwvWe2V!&uT){B5rL{v+ zp*|gJ1gyR!D7wmV=gt#$9{__=)rs-6qbuPde4yp{forT96pL943;$b(%oIY5GR*rC z8|axAtOLdQrVs%V51u}gSv3(Bx98nkpoH6B+=3Zt#q&a^ueXjW%^GA|IzTesQS**f zCrL^C)7cpPf9N^H)ix*wRp+xbQR8-rHF4dSa#xt_>cKFlGkBP1{pAH7`5$8yCp1pR zRfpVEE+cQdoQjn+^G?Fw{MJ~R7NZLD(Vjh%25vdBzR9g9@psEH)_b)saz9N`R4z@l z42IV<8arG4uFhu1NV4fcKrPbA0WPaqm3FzI|@H#bWt3-Vt zPG|#PvNX=MH%V*usOZ20+q2U@Qd8&RI}z{vqtka`t>U|gu8R(iu7Mbt(Slo}woy7M zf9lYZP&Ar1|LoYrF{pJ@G(1-ZfOq*}Zeg@;e+&kvOy#4CHKXMN!PpYj;KB|p3M+u$ zu5xuh6FUMWGm2iy;Q2zmpCthI`FRAIq23~pN*YRl>@0}ZyUmPMJSx{5Rt<&>d)2E3 zXJ=M~^mtwk9dt7_)LHQ*_2sdTs!4ukw5=Wo0!56+d=#y13$vvKTHZSGV10Byp~0XvdtpwHDOMv|D$jcCZ- za7_txu@sVmPi|y|9e?d-Ric*kc;3-QV*7R&GcD&V1w$22|1LXuy^RY&!RMt~&JpNe z8<*t+*jB)9zSv3ZIQA~Zww)ThP!2xdF+WLgbFGTb*)n}iOGkHUwj1o+vc#{Rw$J;L zb&W(>5=QhkcX4tC0w@XzBA91mz#*;bg?u?U02Z{gQ)!Ie*`~NI%h>rdG4U_2kv^mp zF+KqP0?}H=6Yow9mvyMtB~CE_YFrKOFYDB>R^Gs(-CZ)uAqlwuT0+u*@$T97!LQIW7OF2NvAPlidQTc9*k(2m&aJ3K#ay@7fMSe( zBuJTrr9trNsb%By#roVUa8ZN*7$E7*rfXTTcDR{^w9i@R8;do`1c9Js zmcO5UZtn4sA78ip)NlE$TwL|&P*l%7f%yV7Yv5uu@9j03_vc>yU_B!Lqz=swUnv=W zQe8Rx0s~wtG9-C0OFz;)b&TsocD(Eu(IUXKn{$?E*bjc3dc5)I+)RXIk&jR9gy1`7 z+k75&wT#dVeqcAE{dPD;p7dlA`VO2p@`28d11-1NnAGX4z71k1HqD#_X*Jjo?l%RF z;fdUHRl7Q_+r%(H+u0H*Tj{N-v+aZ zP90Or8>p%>+vn#bLsFKCBDb*9h$Na*<3I=$pN}lt7$T z)FIs|GHnQvLF|2g^o~b%??dag&(j-ZHzOtOe6JRMk7UC1s@@l(x&OhG^cw0*K%vzwOcw0r`P{EK>Jl?^1h3`Vb zCB`oo2M2LlbEttYWoVj+VMz|qJJ^0eCuRv3BQUX2xQwYF5O1oS~F-+BbMj;In= zUTL@{vso%#%K<&XYgVkS*bDy21#9I|2`kgK_*{_FlzBU*K!(9PhC$o~h#1|;5CQPY zU4<;$+E+vitc#e)qo>6SkQZpSEbq%(hsmiqP}>ixqQCS?LHRxt&mA77Uuc}D4&ne2 zcSrQU?cn9|6ND*A+|kJRjZ^oxC1#c+bY3uVnekcR-TLp$y2iWbG*VfK&`)a4)9+`K zI!`8*J+7l}ainO!;TNBKpMf?GtK0`HGOyB;m1PYUa{rKxvzN}No-FWC6rY=U@Nw;s zLNTdc;D5&UMa3t$`@z9jCjc^`C`jh?YW+JlN>2tHu@Ud1XMbwM!hErk(Ueg9$Knnl za8pe^8u4_=hUgQJp`m#U)m%O8V3ygFqGgIPkg?QJx+{tTNTJ@q{NR0rHe0-4tKndY zIEpEdXi&6=fDk31QpQFcr}WHsw41L3raI87>c1DD44yF_;M_)IxYZh9!|pgC_vqOh z4fr2!p0zXgVzyO#0+kBAlz==&X{`AeUE_@B+uQC@vA=+za*87~yUjr1r=~vVj05HY zN-wvH+z$wu0_b*`;vHb6F1CB49DQxP6O3daGQ-S)_1A^^8Cj(|ayJ(RqNPDgJ>XtiNNi~K~l&Rcq;TbkdKWr%a=I?NOFj{#1PafkfOE$3ayuq`R4oL4{go6xe=}T ziyGLIYesflRrc&@b_WG7;z^yTEAFIe+nn0>oCc%CE|Q>t%~r-rbPD`woUcG=^y9;s zNPMO@=rsR^I5^`9TPqhyy;}a&`(xN#ZZIlEjgTPidC9QQ1G-% zKce{Q8~AsglX$K5ZY$6@_2INKh@^~)@B^V?w-J)w!&X;u;_b7S;JP5$=0FIJMd&SA|p-|5QwzU8Bpa&x&t%d+Sxf+ATk9#oJdR9dV?L2#X7TrLn8O4UZX5nzdVctr#O137EEB z5zD9V^^I?BdLYzW>M4u=m-s8u&Dmw8H|pQlS;dUUNaM||;Ruol;RVDqt>4}$W~Nc} z)IM<+1?(VK*To3q!5`-CrDQ*8}_gbLnV!6cOC;|i4~^X$V;>BW{yc?eQDlr26ts3 z-)dJcNsGVzU zp|t*5V`m6RWjIc5pV#6q(}n2h=*XSSI5s{qw8&+)07>g!nijf>qF|t?()mDxo`{*t zj(V8cR=jbsW)P=od%al0?i&8XKyU#9P*3Z0!GOzJM>sy1}_0cz|4zQrH$=XsK zjFDs}g}xYO$LQrsd$#^2!0HI*IrndFzxUN}0j*s`{VOH$?(%q+#L#H1DG&l5d8_ql z1vx>DQ+k>QL(-y%!2jX;MbEGI41cDj<`cb1?rPswd0{Slu-2SBAWS%>Q?Mz5*9>!U z)&IL{f6DGSkN*A4|1g{&jDLf$Gc#P<`9H=e<9<)QI=@-c$6O25_`AC1_5ubMBtdUt z)~0=SjlG=4Tqr&|-lLbS+^A9Kh11?q6E|bIrNP(kqakCHre>)w@v}fV?txDzG&a87 zY@X#wa4ez5bY6Koc<{*AMm4PPM%=6;l%o!RGIQ~!_Ly#~VSQl(GTFQ<^v_q?7f!>o z9Dn&p8n{9PvM7u4JyhM~nt%SW)0yRyK-mwEZ4n^4-HQyNHjlzwm5Q}PJ7;>rZ91N^ zE^O5+T(_>_3>f|ZOkV|qg!d9rCb<*!FFonpk!uad&c6WEhlxJB*QEWD`&@_>cuV&7lMody|cH{9xAg?Z@5Bt9-vsvzf#RJOH|a zhF$Ts!<#WeHMeLp5)e`iS5kkWkY^Qs>*?ga{0Ca{lpxxGA;dY|cb=S-A?Reo6!I0d^r-TgUsrV>3* zN|;k4^}jJ^#06T@-kdF}OdESfC;P17}TUL|&MR0X{-*KsgE(Hrc+%#aM95qVD z_2DB|M_O{4g4xmlCMVfz{uHxT^4D8!fW&+o9jLmHmT1=ZsACV&&bZikwVJvxde3sl z*x?I1U1p&qiH=Z>)(E^%157^W3cjw7gV-+-v{Oea&VeePxybL12uxDM>}_T(EAR$P zi;n6q1-FFJ`ki;PL)LGgOfv>}ll^QB?3;n-6_DX=N%wC?%hfXenp#g|GuVtb=X?4O_^zBGMPXJ-B0viaN{&`&qlwS+G5_1; zhQo`U2NQr7V6bPy6Uyye@&?(_w`nooTl@NnUQVTuWVvCJT4VrlwGu;o28ZM7Yi?>4 z2Y(loi-~7$1z1CrPU(L=e@PG5dE}r9Ded@XWw$v! z)7O#fb^XY#f2#afWk6`!Gq@DLemHHUO~1d{CBZ1=xanrS$7RJ$aQG!jNGltcQ8IgF0TtsKjZnwf2;L|rMxQTG%rETUIU~ zYljAWwBo0*Xg{DHqXR%eEk<8dw5=tqaOdS~HynvYG+CrzXitnC`w>Nf~&McuB<}mc1-*vq4hCiKL7tqerEUR%o5p75Ts(uR7pv zNNB&;b3{>J6smyeJ!RGc>$*E6w^~jLw%!Nf2b@R{L4n9flILih)5A($AFd25^$RY5 zz?;N+TaxZu3^nQ>4hYKp7q@OHDu+d++F|CPeVm7Zdqx`gxaIMD4m;`W$>?lE1yJH* z%Q9UeTmGM-bMa@o{r~tF7BR)DsX26$S#Cw#wP6mqbBfKWbfZ$-v5L$bGC8ipoqNq; z9a*Cs#$67TvuG;D-OXfjK4mh@A=$_rzQ61D7kC)^e6H*De!ZVhe0osty{jG}HF!rW z6%R1Y4BjMZj5Wq5^W88IA(O5W5XMLAmsxtKf1L`AnIO}3&((EUHJM&t6l9am4u0Jp zD$x8{kJ8y#Iw@No%sf3hF&Q7!3)Y>gZds2nv4rWa0c;g|q*IB-(7WRo>#ptIKYI*L zLxHMM27ruHI_-)^=FMklarC851_FAH%r%V zTR^GFiJ2Lf%>EFQPCRMgSY1(X7aWJ?y!+)*Uoqa?*<$uq0YcSEl>RB(k2KJzJmtGX zw3g`eE<=Y?wLkL3Gz{8weU9pBH&j(-#G|m4C$dsTjEC*przv3Y!xbSXgR>PL`KKJH z#R^&L9(6DlrPaw*;ah?RD$>c0`omJrUW<2eTdTUgyYaN)(~+BB{eMlmQ>KQU$10=@ ztAbZ1%|qaMgmOz82JK~Gzk#~Br^);E$lFj#@4Xj1FdK2*7k|{|%mSDS_kZRtu6310 zldq}uU4BMLPjIh((VcqW&x)jj z*p)oe>IEm8e$aYX%D(1^URyjVgRkZJ_BLl&ri+}uvUBe#!e*p-qVGHfR+r%%R-}dg zjw{;2heBo+hh~jHS(WIP%W1+`#%`LmKwK&_j>N+u9k66mQ(kxSUKa?3pEvKCH<{a4 zqLf_Uc*}qllzbhWOJ-p?zDa4V9+A-=xN z=JjWVMFpIW_`m5PkVKSMxK^{?v1izVGhe&tVA~fCtgB^C78>;oG@d}JgKi&dic?A% zo%|3^7=<4^a#ACL%)fe(UA*rk+1X2O-w9bwl>Tfo3SW`* zJ}39E$+4_qeuv0){kv-pn?4A}*g!4f#HGujR`Ktj6}~;cvqp zr9ICup_l(V3RbCx-l{bH6STbEg+g(8UV{Ar&?s$*$DZ z4YTfy`wc1lwHYTs0AZXs`f{+&?fm;RJE`V(o3}cW9Q)RB^}0o${Fp8iNT!$`BX)07 zP#YaU)4ksGzyOOlW!1@*6#f$mwc#LcEJ0hrA@j93$|In7E|H2n&dAcLdTsoB^h%+90V*3N= zStAKXYq1f8(SjI5_QSogP07yIf$E7|FQcJlotrDO?)w4anunDZ;6(p}T*4NOa4GUi zX6Z@PYXLuCfl6@&(ARGRbBibUk~SJ)o_1;=QhG#YSa_TMA;5If2i-oXL(RzWn+>pE`g z?$Oc0ZT<$d8pdM)@!CDlAJNaGWyeOomXl|8T2hy?WB+}tL!hK(Ama>DxGUVeGFZ>L zpuYNje1NN~gLIGeR+68QW)~svyJIAIxH~XV9xF_{=2Tl6lVj%}3gD9~1)bye3bFjl zyXgjVH=+74x2MOEFmz?o#vwO(eJ4VL^CMxU#$6?8iPe=#UY_kDru zzkd7Q^$mhmo*8@M)87K~H`WD-g@&?cc$}@!*~hG%uMma5T>ctVw)fjy4T9MebnQWH z&VhB)hH7Jzs2$bR67airqvV?9Y5_FFYbWX1TOC&Lq_Fo9l8@82no60T``9KCiCvoK z35&(d$Z6zi2jW0Nim{qCJHkmp-l|(NOa0>7ZlGMfzuC&AT|B(k?a;W&`c#qZ48gyD zo7Qk7jt8^&&<^%pmj%1LsvbP?6Bqvt#svnHF+|jO)JjQ@XZpb}f06rlN^u>!<>J#{ zCd&5s-SM7Q5AX_xGL*2;-!L=JHC<(|R8kXUOU?P|-nk_f-;8H2{201W<_vn;f{McT z4?4|Sse#>tgSTt6S_w|5`BjTi^FBOP^3#vZOw~Jt$yFRo-E;8Q!g=YMkE}u@*!QAHXL=~`-QfJ$Klhjp1wO1uhstB zKd9jw1JD{*B!n^?&+q z+VBKiCl2u_(|_QO(B*V_%z%9_ps_FYWi}&52ah0X>QPCy;uCHxzrEEjF97jfFe6{V zOT>mJI0bmQ^YTUt^G5B^6?}VIwmmH?;dNxh34iz5_HStod*PN){_zAO>rKFW9L#(4)%;ieY>(7!qh73|CX$*PCT|pmwjc?*taXcgyU~rgx!ecM_|DH zn#q=zdG3k-oA5s9`=TSBV3qFRaOKL~;?DP=UD#J}zr6N94+h7tw%uD)hTqk%0Z5-L zvQwW?yyr=#tE+* z|HWHXsJJw9d4SapDEv5H&}ea>3ojrDYjghtjXu8dp$KO|%2Vryy9#yh8LBW_)u^apg-e>k+StT{;QW$i&pFuo39xm5b0?_H{{t@WBuO_s|m& z(SE7Yoy)C>b;haAm7S;}7(U(KamaHD%+YJo>FkxiL1j;FNw3 zxy6_sF*_^;BX*9*{F^{SC424&-K+b{ACS8Cc2QqS#{u;xzXhshf_`V=Z~}3;Xmg>U z?vGjI*1~n2FGfgo7G*<>j+uKb8;)I@$_TO!(h{+yVdqC`Kd@w**t`XyZhCFeV%WAU z=D^>C531u)Gs$Xhr`Uz%o(_?520=@PELUNZ`A}h~Tfy_P79oQyyL3NTu8n{0$*xK6v_0I&A#!|8pRU*n;z<{K%``P9Gj|fl-%5?S>1QsF} z)V~hi>34Vf2mTa?rc)`7aC7Nu%kHii7r*z#R!xuj_~LdG-q)V_4bs1>Z(#AEw#jgt zn<>t6ZSBHh1wmx^`^%qx$AoRzLr&peM?Od1-Nfq>|ZB z#sEhr&HxgD<0~MJy&4Ps!Q_KYutix3zh_q$pTEDF02hKa4iiIj|}l-v)0NUF1lnifOSx_^yVi0ii(mWKMOkYm-)46xI+3K?1hPrKlpdDwO3HsqVbpVb| ztO>|WJ24C=+OO83ymoz=!Ke&fxluhpnjU(ev5y z74?k^hY6Hqn0}Sk%EtAUUj((4-k;m$PXq8Vo(O)Z3}gehOM6cHSsY&5Fxv7-^}C8l z@{>b{?A8W`s#5JE+q5H;QC&yNUiMQ3Z}`w_b+|m&-fs{WgJ8RVah?3Azp@zWZ>(V=BB~sDIpIu=Y2Y8ERh_-Q0%%UwI^QK9_13^0>UJa2bB z?;;#46eQc_qpK~mmC3b~leyk@-6!of_*Dp%QRxD-3=D21(*#RO9|ArR^h25tLWUod z^cxe87MRVVb?$hVd^Fgv>z3e?4u#6uwz6RQ_;ongp!V=54+1b#fm}{TLL46=_%dxE zXuNgMO1h#j#lm?H(QouW{||R+2(rr_pRhTt5QCEH>mwxHAJjO{AeSC-^0ezZj8(Rd z3(JwKi|!Z1T_N-z?oh>MYX~gKFIGE=bJBC{(b{^*quX(sPj6Q*Eb(6%|7Ie&4TJ*nHh)zA%|S-zAqn120VR{JfKQ)v#86xk5W?Ff&5k_Mln2fhbaLxSinphCzX9S zikUV(`^T&PKluu9m#a&51}L4)dn#g|W2IdjipCMRGV%f!3}QoJ$TezaAMHfdarc3- zyn^LQy1YZw*LyI=9ukVB6Ib9GE`E}xyx@dI!mt*14%~Kf8zJ$1a z1s3HY9>OUG5b&8~%T)6XJcdil4eHPvbA)QAQ@U33OZ01`dAU`Krd(c46X|UV4_yIb zp_ksS?p7+iB7zm`(*3OaSb$81G*RK^4jRg~ z@5#&o(u*;BW7GYVF?5C#HO5MlCu9j48tToXR$T5KaDn2LCt05}&Md7hAFuBz>N}FW zLFt$CJUYi>L0kadyF@4b_d9B%PiB~adb339i=7O`7^@6lh&aRE>@ZiTR`(WnVrpVv znSE}A$va+O1QF#E2lJ}fE6jHeU_=fJe|3zoRZ$kxnuW;by!bokD1xj6GyCwI zckqvCa@#X&!foy+L$h3vLOl<)0cEL3e6rI#!(KtI6X34(@Ygq;TL99^7OZ0k0@bgz z(sgd4*11m6}{*;38Bz9^FWSo*B zX50_@@q+1YaI?PO&kfXBrTgyxKiQsxcZci;%BR9ZwyIKI>FJt!xxz?7(l`KXhUcVgMr;T5KF>Eobh3oz8)(^!$9 zyqg)efY12MZ41zKo64!tHxLAXUq?CFg8`J>H>%WQD3$t zD05|e+^}4~_{chjpD0nTOisnMo`gdR@{al4{kiM}usce4Oam$K$L{np^Z6FN8jk{W zF)Vk+;oQZCaNj24Cuws& zBruZ&klhHIiG~IjxdXS=_1G+LG9L$h=MnnO-s!^iNzJxS7*N)jvqP!=$7}jQ>3EJn znPJksb~TCv&cVLUxUi30mr4*r4e(%z+woyWDYJ``cH}w^T6P8{TXHUVX%T5kfM~-M z1Vp^@cr?ypq+VmRWWN%1H&zC8yx?^FGp?OeCQNjQmli?|=*bCu*RYnk6sy0KlyJ7^ z+;!ePbr`-dW;0rp&KGy59J`Q`f|LrOw6sWJ9uAsbcywXtmm>qpg2h;T0;Vi-AMJ`gIp^(?JRZrV zzM94yiM-y1ZN(cUF4sOx6=qPnqAa=rAr;%|q}Q`+S*vZnSBOs-9?I4{ zP?Q=ylPM6u25+~I%Tt=0Tkzf$*Y@Q}CKKS>EWW5(ky*=r6q9I;lmDm{gdDK589?Zy zMQ-bijGKDaFl66uki0Pvs1&b5@njR?fT#F0^`7J4E$yVv(D;TUf7lQEYiV3@GH3mS4s-jYFmxjD+ zXKxN#MvG?LO?q@AoTo9hqp~!U215&IW}6hXtK3eAGXOcF2?V$a?>_+v=O6Gih zh@=H5=8}#a)yB51!1O#~So2sY8p%T#yUIWSK}Vx|QaX?Z;}9h(lFf8@J`@P zy2yr;9qW4Ubjib)55Ec|GQn$z{?9te1S`>C2>Ha;E^fX%<)4FS`b@ zvcH`Zd+e^?hV(;i!y@sivzxen%@PW_+ML27SrPo=fYjI|##H(9TE26xa z=1G>%gWy|(6gFgh6N7CJPkbBw&zq{D1B1tw4S4w1ww7*L1eorFeSh42LFx(!8Kcd& z=p#^p$xe2bUg6&&^H9+sAre+uFAMZmTg{HU7rn>iX**KY&((6|nr-8ATbcV7$zY@z z4>9Y_^aW&EE>QPQ*2HA(DA7FzWydv_;HDGmf0#QqFjlCqh>6ZRBcLC3V};+S*YtdK zld|ZT(3+rRr1O4>w_F%#kF%D-N_~JrEefI$ff*gDX7*6LD`LB@8H{VT&0gmm4v#R! zjieQoR+M(sj++Uz$^1eL6s;St{U!}p->>2S>_wIfzlg+(A;N}=C@yC&8%phn+Pv^5 z7L7C2lit2NqVeD3gOf31w_J`kO@L&WXW!*T>C^AOm{K|T`T~QRe(njj5D$EJGQrFR z{|D1hdaAlU2}SSz@s=%ISS>hRpZ0+~E`sR5G2CD}YhE%Jy1V3$a4Y5zG$S(JOD_Gq zD6J@~;w8Xe$Ye_=Jrlw%zC_%~JzuJ3^EH2W#=0DPwCCf4`oB+DtnPhd?}&$eb2cem zKrx0TlU@sWt02T!M&TjP<4alBb?!e7ptBfFcPy@Tx%^hhJru`>)^^}saQp6{)+he< zC;z+Z&}q&DV6C38A%(!0sobLvfpmbHb}UfzvjI3OM5tK2TnQ@1{goU{n_o?K<_58W zwX3Ax>&@SRc54yJyl1V7R^Tbn-Wl3Zb(g@ukEh7k7+@x?tF2yH| z?lg8|CRF3KdRdZcnq|^KXtD11g2mifce&W;Je}*~vZ;qDcV!7ic{x>A{^tE$N;A*p z2<>Eder%GR&at0>Y0S|t5_o))wHHg$>6AF$WyV!i&jBBS`S5om2!BoV3tc)XV`YWP z{ZzcJWx@Z1e;q2fo_G%K4A##6feRVfxp)ux$w?-+Sxc05N=u86Yl9(FR{Kx=I(s3$hUl$_TwAQA7(Rq&=7m8xk?)s&NqJ(Q+*}xQ9hAocfjE)cbF_2L9 z0BrDnx+jZDagWh>_y|4>m2|=}_GsNtjV7m)3nPFr2fgNzr2cW-OX1~0|AZ--l?wi% zUB8aRjZOS-rPO>a8<<%mK6H`s;Ps-2xoiC=B0d8?V+xA>2tT-quAz|GkPGY?* z$#a?gLX)&6S<3P8C7h6mwe2o^vCQ+5v;v0MnR^b0H1G_AhCy>(&tF}3Y>@Bs#E=I3 zgqj;m43bk*!ke@Mmn4X5VJEnvawy*FGb?sn%5Cp3sn%J)>oiW36hLp=VFQ)5bRHK# zfVndn4zn{dT)Ac+Y3hWXAAMA}FJ*+zqMRPda(1~qiFV6?X_iSQr+Kx47`wG$78 zRI69;>+O)k2Fz@SRJowKI0zk-7X$kGlXTvO(6Zfb3{~taC-fLc?+d%q75!AY1MD@^6mz(yDPaa~1gnVJVo#-iTQDVYu9)s-LItI2 zMMD)=BJx4Z^QJ}pMSxa~@MYXjzV?aP>Wrt1K5cLA9R0~{N5Jxi8TtB~8Q1+z z1n9)WKMH?4{kpb(PBk&yS07KMdufc0M@`%;Gd5npLN_P4sW|;oJua39h*gM}i@_c_ zl&6hW>jGyX`w5zrl>5VoivI|!#$#%&S32W5)chlSXRWlqll!y7DNlz(@FaR+(x}uW&^ngSQ+BlpXE@VUT4)0{`*}7=_=2$7~a#g0R4H zdkW-c?&s~MAv$@H5oG5f3Lo92Lo)rme_s(Lec?x3{?ojuPAC1w0I#6EN94HHvZ!BD z;oEga->R3oRb72JTCJ&tUF3n^ZK#PXb|zJ)G=#8iU5T7;pl(wYe+!l5cR2i(qHbrZ z-#d?dTTbu8mThoHr&*(!ti+-mIV&lw2$q+xx722xlG(ER@?1x&(Kaz3T3)J!zk`%{ zX)j)(qjhrLy~V(Z|B;8i{qG&99hLzb>JhNM0z-YSnA6iTFdbqo_0Zfw3Wrgo*%l)C zHC>r*7iNjbMRw0k>DRw_=sZv2gU|(6_i#lYRUIt)oqYBl{BoVW#_Bh;}jpdbM zY4krGA!wRo_OwER)z(=I!Fkve2k_{7uS6z@D{$aB&a+-l_ij1$=upnRX!zr;)C}-w z=_!n0lFrJ3BLuNWC3>%t*t1qDqFsL2ag6il4VQTBqUN)?lzfy;y3c& zJ>amG0PiW-VY$Qumiy870Yhd-D^`)ymT3-SjNHuD?@}&j;^#N&dcMC{jDI z^0)B9yOnTdQ8muujuv(%{r$~3lX~T!xqP~(gH&m7K&}9MgS|A~dGN8KzCk9=I#8&$ z+_sA}R7|-NsK;cCj!+2VjS`nLzC*SDEzSB!7Tv5D4iMrs9BuBGd7V}b8&6F_U7{sl zZ(b2Q#KJDv1cb0;UU1t^5-0z(2FXfKJfyvp?Y1sjTJ*9Ryd6nIuHt9p+VxA29ao~V zUS%_<`sGuk(>Sra)$2X6-@FFb4YS;fGIXpam;0>Kz`Q(h(gCC{y9>+I9M&(Ef9aV8CJ4*@*xln z$b9C5`}6Zd9rc2PCuss}FSwmrZpklMS4v`iD-b&G+yuaY1G}-5vUS4yO0awO>*MUm zW2&Hrd0+U?<>nVzJzzIk>@#y=I;Y2hl?9m&)we#?@<2fe?`j)=wJX~zar&dM@j$@h6$5lpHN-`MOkbHw^YV?q zRjs}(b`juzBppPYEsa?F%iiV*?3=W>bK?4+Y7Mn~ot{Za*DhIFWaPed!Vz=(_Hgsm zIPE2ulQ~faFRLyFsj=unYmF0zLKcnw!zsw`kg&RDFL#NV(q8;sxeeUn_wLTl$IZ?i z0ytO*?CPZq7CppZ3(?(B#S8oOgTf@a56z~y>no(4Fu9%KXvV9lLRtfpiLlCW&f~wZ zc~;a)(Ly^8rAxih7h91tI&CL+ZD|T1RnHgtdsZzL8=GS1=Uv9ikwBk$G}{mUsbVz$ z+jx9Q5vycYd9hWwAjem;sp#8bfCw5-J3V`;JpRnJNSwlQdne|nf=&Uvsp#q3jy)HC zdVzLb2v~G~s}rIAtT5(fD@IgaoUhi02HvAIQt6z0hO$V1Cc};+@5{L%9DTqI$ZW+* zP-Mb5gZ<53t3&1Vz}-KtqGN^_tQ6NqtF4=9ky&A9f*Mpe6O86_ztOy^eC5CyLpp=6 z)8QZsJRs6T{~dq z)N`A*DDSu73uelY@ufw=GplC-7_eX>UbQg3+||MNwsf< ziPAog4rz!&DjM-bu@ix%?snSms)~E#EuMZ~o-}`!dJ1Erse7>TL#B8$)F6LtKL@{6X&rMF5cxZG*u= zt#t^Iq5iY(<+Y0(G1v-IWwJ+(oH+Y{l`=yn9Ko*4ob+P835^{BrX~sqCiC^RW-`=2 zaSP^F4&WCs)*Eki9Fttn=7pfUGO!)LETGsvfg!!ANXk!^Cb6fZpjx*lsxwXm15B93 z^z*I-6B%e$1j=hxtMDn-aYhxRFw=;5w>PL{QbNUT$kT7=M3axa(u8MckY$*X+K|0bq+ zNSKa~e(cUb$wKJklKhyxdf*$Q;-`GSVVfN~lSTR2y>Em=!*$&FIqOIOiA8TjY(-y_T z{^&U;s`-MMeL~FcG?g8!X#BKDk1QTuvNt(9Vp^CNGw{lmkEk51syeXVr}}xV8*|>? zYDGk!qDfnzd)Sj;G029Y9ry`fgGw2p>V2XM_To!xeOTfkNC}<=K zYNS)C_{qm!N$D5tpP!yRYZ;ds1l|u&6mm;64=Q*u+jVR zY?#RIgIZS-A`9~VDO(1%}zpGA)lB;a3mGI6xbOm5$)N+ zQiWSW7!;Pm%Fc|g4MeT4SS%#zCO*mg^^tv&ZFh3qoXvgZ7ccg^;FssK-9i}Ka4UH+ z?sFK}Go1cRH$BU8iNz*_!h*4xse5V?coy9hx-4*&6VqSbL!AuKheD*($8kp%Z_F^Qd7QOIVrB1o+UfeM_m_F)<$B(})+^et&AdDoi-^;q3rV~x zhzV*v2nSB&UP-yFPY3Jel1dSGNn?)aDRahJ3u-<0-+zwIHiuU2W^5+rk1}KTx|n># zZNxLEUZ5*Fql&@ufz~4rS-VNHGgz`S!|IFs)4W@;^SM;Trg0y-$jW8QTDXu zD4-+t>??sW?4%`oCiagn7U5qNt90QR0^q-$8dUA*Qtht?Cjb}zVL#znEMU&Z-%a=CPTOnQ^bFJKC0fmEe|7vavA_(vb3UgI32yl@e0}Tj zH2Lv3$fiBo+AH|Gx;^9RwA#_LC-h2S20#RZNMYkT<)B&!wWHi`Z}{4A(->zie-yRc zuTrzmV1Z~puZ(PoXxJkE~Dr;fr z7_&a?FR8&fSM0p3HX|*&A#pgJk$Z}Nocp?ZcbJ@83i7J#Dyaj4GKB8=9xA~%!Y()~ zY$TMB?O?(!#1o!(dZ|sr_9+v@tc{{ay-E%gTkjJY)o1u6J2U>-B3Zn0mTNZUyG5a;ruJ#0&HZ<|Gfca|`iiGSV$xOM*W;DXxQuN`iyF>AZH3+G0dgI?_Y}YN zJTX|0yrUy(lKX!GHQ$chy)Y}sN%+-j#0sX5 zZ$%bQBXQb}p+=TL@2;+U?dI~a=O2Zet$7#+IIfRSQKkwPv(K!I%g3SUf(BpvuwRYU zAMa3#AE&rfni@nTD37ZgZ#W*|g5wGqKa1FAKbL6kqq6&25{qbQyX}+0D-bggay!H9 zgvH$A#ei$Z!w#FIQX0>irAl@fzPQ7Q5I22Bh{$8-8|Zdtw2rHS`+&_f40tyuSv8Gv zue26>P!jDDu6je?|Bo=?Y?=!3!;fN!EyFT!FTsrcxHFRK zA+KSY_;kG+m0_jB(>Hv~%0gtB+Re11X=&jL>yb8f2y{qfTooiTF;EUxLnR^6`mD*x zETb6egM?F$>js@+-OP9A&k+%WCyV|4hmYH>$Rr*6QA@P7u7)##MC+}DTV}1W+Hu{> zFVHaqCVu~Ud|))zGeSRwJXj-(*|twl$j&^=*HaA%wJo%GrLVAsFM-SjhR;&O*_YJM zf%P51J4d%NiLA^YEK- zvd`d*TGYAlv3l_eY)w3x7W2C2Mh&R~&1N@Z<(V}|6nPp0A5v~5x8bR=`Ffc>nKPNb z{GybKJFFG$WrpIh4A_4>$T2%?f#7GEK`9vv)nhx7yTBW6c{;A7?syP-)~OLQn^@pk zJu&8gPb$i6??7uotyAbB8JN0rgUXSOcA)X9N>1Azw6MIE?J{Rr)=&4@$ zA7t}#PIdot>0mRP{mzx7C2j^N{Rx{hvp4m>;jD$sE-xdf!XzrZd7e1h%dL#Ry~K(U zDm`uJqqE?wp5oEoplfaL2nyil(7of<3xdgX)TNu<;qR%{FZXjV(CE=TLuQHq1=c$) za^5lxXHEVx1M@++8Z3)g>OFGyLHryVtJAOZo{8JI9ArQXPx+}Dg$Nm9lNV2!tQ^1{ z{_BJR1Kj)yVej-bM+;j_23%HyR7%!XAvQ}FGB9%ggIr5#6T7%PubfrOTu`^Ue-Ahw zI7ROMX*CwkVaxliqD0~hBhk>{egB5n2Z#Qmq~e-I)keCT;n)_9@ZM0%+cn{)QgB0LT`8Tq!m?;P|=LcWEJ4kx8yhCD8jd!%{;y@#` z+GTr-avC$0N&lIqMyQ`1N)O6Dtw^*Mu}Pm!JiDmLb7PZ|nO*4@BO*yBs!twQ6;0W& z;syQ>@#^?n{(WAjhGGy(XoV;qtWaMS6|;f4685QA7(u|HV#EM&Ks@K%j1s`Y4mmL! zLT%QtliktR9>>RDdQkRK=UI&cB!TydFLDOvFTkRtQhXlF?H;qgBiJy~?b?cV#qUK9 zFAE@W4$b`%Odq!9GwqNykVAWi#x0l;&}imRnsqAPKgdPYH$&(&weO^+nM|E|ks9IT z+1zm`=`R$7ssqWl(=neTR#{nJ%!ze@cI4fs8n76>vj8q;e##6Bd*m1HTSM zDu{|mq0C(mX}4i|ftiBB-x9b1WcKa94b3(wTi5d-jY>8&1Q)x)70$TY@^K~Kd~55x zdYi$Jw2&*xErJ=oc=|^{%D{O~a_d~$@kkd`aNuf3u%K#CGsfY|ZFwOY3sxgGwh&8v z;ZKzJBfj~8iXYs?X4GLRoJy=dYXL9!T-1p(w z1YRYBXis;;mMi^!1WI4cFIfo+3-y1g zupKQkr4|!pK5~(nmLoZwa20KPz8ulmxGeS!4|$>VaNP0-R>bin{0rKR)QS8{=s!zo z6%bXnh?z~elR*qOJMMdNZa(j81_7eazEjNk>J$LKQz4&oGP@=1I!?+Rzmx$qF%(K}a{V}-n;_muWl^&65x#JPVz4n25b7KdvWa;TJq&ox*W6R;#_DhAzW zu_{wSeE-ig^k&D+IO(Q~owe8R z(uTKw2OX6bMPn)4k;)DQIVhVna<^*N3sqXzR)Cj?ZYE;9ZmwLYZy1&c!fovJ)I?dJvz5$>~w-Hnf9XF)SB$$s9Me4`Hv)`QPj z)baZ2#CG%XhPT?Zydo`^dNb?UR_v#kk--+ZVKPsYnYOK&YtyqB`{GFbwX-gEdO=z; zZ^Aecr$Z~l9E*KcP~K$|)IJVvn@J&V*m4kePp;i&-R@L|6?5W&DBRX6m0H;qva!?x zUIBPASNG{JjnEBI)#0yp_%N^zHIePRU82t2LU@b}?do~>-t%X$1o6k9(0x8owv%^G zQu*5z&E1n_h}-}V-{Q)r7^RgryTP7#_`IU7Xesa7CDiK1dbW|_=WoNr&PQtk!3*sN z4?gOC9YS!>V6wG;>GQ2QDd42K7hij8qD)9R}4Z0dP7z z(zL(R2)RSalrkGC1dn?U`4qOJlGzxLvWHs-N3C=~Oz9$l!Ezg7E?9@)6Z}AwCO1@E z>$OdR)`t_@U1cX=0oryXz-m*N*=kA}`)H2}0(vIhW0cIHLL(RpRUS?iR5aYS6K-eH z7&p6+8cyHX_W?_R+lp&ja3qk3Fl$*L#pg@bz8`y*L@8;Wt=IWV5Bj&oN7|hyJf5Nr zRV$fdU}tY(vErdVrsI+8`-u6GirAXSv!nD#kz$0p8@UD3u5Zi=Da09D8EU-y-J(1Y zp0GqCD!$^6N-XZ)Tlj#Fji6q-zm)3CFSGLaPB+{2==^sMTFjs`}*!P@AdIKH;A@d%PmW zm3c2853`tq-vP|7C%+vUQ4aTwIUcqC5Aod1ptY`Ah;T6odzE&gp7!wV%i~Ip3mogi z6ap$qd8U)x0Uanfc5U?)ZKz1iifzT%2%O3|(Bs`nQr^yJN|pl`k{6ANS|U9WVSw(hqF&r-1Zu@#zmydZH4w>sZt((g~b}dARm`{ct79m|lv{ml{OQ zm61Suuw;eMF=x`)n=}3=A4FHs(p{BTn#Da47*%C$7ZiN+mX-{7${?~8K(POi5N#8XMtEkl88GyiM%!-AOJug;eXvOnLQ zG5EmBU2Zx2)qBe0iFTXrx!Qc(1_}CP^-Y_`INpV9lGdC$4xfy;SycZwi#a5q?%rtk(~Vz`_+_P~^&3>O z=3QpxDcu%ox|%jDNeGHXO~i$&S^m{aj}})#bRcL$Y@#JvPIlTb9SKu%7H4Mr^6Ki5 zGrn(={EKBL-HP<2KR$hJlXk8f9sjhnW&kTMAWVV>ri03}+1%<{fDDugQMJuQs!&V& zwPcSi_DOOk9`}1>T%kM`d_GTg^Bj2esrJtr( zJ{fvG8V(9fV)S4n!Q<2}X<0d9efG7w_wC3uUKyryr`uA4xYYUMx;M;$qwd^9oQ*q( z^F=aSi}-xAUWpiWdu1-qNp59wyXaZW%jOMXh-K;238$*r;2Tnhk=0Ox>B13T*2X_8F!rHLgQkt!I%`2{R$G!)9U{Z;zxwI;%VfWKW^2>Zp#dTq6OEZ%F4XX9}88& zr|7X9|58qzom5T$oUtN@;ylD16Lr$-PPz7@QC8r1qaG&a1T#O979AP8R6 zGL756*ZPPt!T;O+TP}$&4@Ow-fBH7^)xdTgEv`e(&4`1V4jk|Q1#?x$4m$lG_yvCE z`ALDQZJcxRSB?wvh)4nf1!Bk3)0ErD^E$qHg9fK?x zuC1$Ww^B?~5zl|$y%Mm0(KkC5YV^e|Fj&}G0!e8s| zhVm|3K_?QIaE-+{T%zsiCzUZ?T>rJ)nY?&2!?ikW<@wT+F`sO1n}8_Xg2I0l5bDD`<*{L7wV%YHD`s{1^XXf`Ez3F zXm-KAPuqj*^jUKv)^eK1K^V5+ow;{RUW2@<%G7G*cz_rR-_4+awo}UK#tTt4>!<}? z3#CVhrUGqV?9?k6>r8o|Q!!v?imytceyZ60FemVPHxCxzvx2B=@| z&?201OPl$Zv6 z?XNpc%}DIY#hCR3_q3;hZUZ&t7%}lgo%}s#wx2QV^Cd0YIV;niofC{0lQ7=&t{ez_ zrqXpA%LqScNk7Nr0+mHK3B{^c1H_*(aY|O2`@oA2tT8>sAnSh#MYsbIfx`%f6#MNl zJK2{r+Y|8n=B#C^$lWx`Tsf2X>qDoub6W6hXXwC1Cj8?2fTSF`)gJN<8Ud+pTm}w_ z?Lof|IHa}g8;Y@?5FXQpv5a_a@XlRQGslO%0o7Ms#)3ntdwbSN;nJ@x?}mM{UpG{L=8_+N^rU zNE6w4VT`IUfZ;{@E! zcIY$XxLM&tHb(HzV6N_yl=HEhbdqvHpxJQ6+tiI#avRq&Jh|u7%v9&mH|I7Wo3>{S zWK{0A&(uN|gyB8E+!-nti*9l;Gc2DJ@$$l<>s|W3zv~V!c7v~6ImRA2aj4qsB$>js z>81(~pu5b<$el>@TDOZVC_jjSX>YH9m>XN$X2L_#?;QEOWzg3eijdTYV+yxWQ|-T# znmyhrkG-IQ7S8gg|2!y1w#HucZFY-28mYY;&4HSmyi4=>UJ1XDQ1qT1Gq1L4@fXCY z-4HE6Nd||@{#Sm$C+h*gtnP>#VS!;l;L*>Kg)dupTPPwk29UqVcIqEWR9DU@OIF(6 zmio46D$m`78cN1u9dcTxh9CbNuHTMS52=ujGT9AliI(;;JG0Lom8j8m*phiqNU#`- zpnkjCd}W_yN%>q>LlAnx)yJueKZvKM#&gc}*F1HX7G5J#@?sT6-M@@i_xj0(oI_WV zJ&5>UpFJBmN(d|v<|MQ4`#$rKRQZPlBc&^{Us>6&Ki^Ud^t ztCM&92=XZcXWKPt%Ob8hu2Qd#42yzI4!el(VuZwaK<1L~PHvH-f?ng|fJ!w&*Jd`| zX;pA@y%v8AnAr?gmd8Sv4f7{7&R+;@Ko*K|i4`%b^^_^m-ike!x=0FbhCPFoZ9@#8 zEKx7skPCy(F#c)pLIfm|oo7X6S$(&j5ALh#$OKV;Y!A8}A+9jLlpQmoe|Y+USS2kv zU?>UcXNNU@4K%Oo1%^+YYZB=lo$+XjxY!$e4tPD|CUF+xg0kLAnJ$OJ-!kyP>NWn* zOx@TGXO{sGSw3Gc=Fb$$Z=`yZOA!G+48nDtR4pm0HTcVj`(2UwPd3g1k@90lWbC3B z>i)pyg6m+{4BS+e`1+djC(AEpD1^5jybbgH-J-DS>eWCk&}-eDq4=m~{#>a8f|byd zYi9F>xf6pIvq564uP_^**tGER(B)?j`^LczGAAg8ERUacvuc>{Z1C>KAnVZ72y4y6 za%4zNWF&>_Voh<2v}GhH1djO{5PtXcI%<$vMt43d+Tp7&^m2{kUwNm}x^Q+X8D5Z} z(U*5SX@$M2u@9jm(E-=*fRU;udAUj0GcvG0eH@5xWGCGZ9wNHi9JB?>XVJMy-&X?` z#UI4$Ek38q{5wwU_PN@kzVd$%%LO?vcOQQ^kJ>nM z$)ubkz-82<4EDS66tgGP(JfaDs0oWRctMRtYZ3T6WqAbu}0MJvl^;qA4#a_#Aa#@0Y`M9roLc_8+Lrc zRasiUMX4XyO=)&0)@0cQg)Z+$mwlKG{PUe5y1fI&N@iPNbpq1B#w4jW?^P&_{PjUQ z%qY|}0HVf&zSb}`(1`%?x<^=6uyI-|Y4mUWLXUr&Xm_epX`U|~ja_>~l&H`hQZsl- z^VYtiY_(ZdfKT^MR!|jno#)|7t4-G;h>d8gf+88A9UD@O#)Y<4JDn_f*9yCc!A+R! zUH=Z@+#k6GpVWd4toMshlN#63j^dq+6iOhZ`j0TI0qTAiD0#Y$1^y=>hGVgdg+C*c zYN?PQoNM2M6nj~qA<;>OUuwj~d?$FPYg&)})L*G+Po>-krHyWlb?fja z)w()NBQ+pZ(_?C$zRS0!$j*O78H%yr*v@=0P_p}6#bq{L=VlcI@zepq2>fs02$> zYa$M@Ok7;GGp=3tYS9cN2FfN0var91EhiW|44mi=r=F&@N8zk&$^hzRnFXM+< zby3BhQ9D2Xu>g>V!UCfi+CX>Z<6iE}@^=cWAn##m{C^_bLX&+l4P`3|cM!!gUxWCx zK4>`cvri|8sltA@bkXWgHa@XKzK!wXs9H7wu^hz-FJ>W>ux!h1eG5S}UbWcMte_>O z85`kV=v}8gMy_YAI~g_UDkiRTtdO>7IB-HJYW@A#^>NT4Q#D>7exb>>wz_Z_qN_Qs zHQU>BdNaVR0vycM9#Tm!{)VIiR)e^dV*xm`Su1`!NaqiqR~fNei(kxmN7~U6bmleo zw7#9c_+X^KTVQa5ttQ9WfwWA`nKMVnB#K*8DuYK7CX?4AyxMgp_6o7tb;LhGoJV;0 z6}@8rDe>3CRY$<7k4N^1!>lg7>@;<-#cr-Q$^yCW0sxVG93&(XcSD9uQP4rxG=d3aG;fzmerv(adK zfiS;oimx=XfV1XSZt0R9$Hth+fVlbmo6PkLFn9!#3Ud%+i!S`Qa^?z|j}1xbM}JEl z5F?b>^!4HWJI=+{`#&m#Xh!HcGD0m5HY&yS-fp_uT-$mx0|>{cacx1*RB|aZ5jGyG z*7m3!ZvO3In^7VFff2Q4GPn$UGFV)HRg6BY_FIENcBtoFAwtFw!q~!C{i$VP&z_K) zB*)b-LU+ntaIXY8>2ID8^&}%bSc#RoD(r0#YjG_n2(d2dP4H)=QTS~MTv`U7auyfz zIm$`B%J&)>IEkRmooS69n$ zhG!tD4DMoAOn~5-4uvie{jTa5W01_N%f*R9`Xo5o;f-X@d5C8y2TDfe&Hw@u5wb#R z?3fx@4b^zL?eW(#f5|*)w#N=clTkIK9>@G$kncd?7;oUXD@EE19gYV4uHf&^z`)xR z+7X#_p^1vf#!dVjas6QJT4MjlUYq1UHL%fWiH{yuTHZd?ch6qyni*!TmLts)!N*j^ z=jirIwBsou0G7`^nVD>NbbLz}zYvsjEfOa7Ru}K==vw+c$_!^2ziKm;hMx)DJ763) zsY}V!Djkbx&969j^6u4hn`_i0N**H1lRKO+#)_~dJUsbi;C9bCJNgbap!F*WNzkuq zQd_02p4e+2_3SFAZbtxBIwdOEoA~3SxSSl_Mt z(>J5?bAzhAxfqN|ciubtn1XBD<6X{WG8`#5% z7K1YDon1Ih`&E)&lG6e>7Mye~2d9MLkb>NpsgIU`N*ALPx9lS&qzlf4qOy}F+NF$I zghcv_n`%6>?%L^JK&8hFiV~_JtKw(!Vru?q9=Rt_H_neQE)vw^3%$v*%MPglAyrfb zH*`6Ix@a(S+1m4W9OcI{F;RQP#$)mG6JH`}SbI4su2Atq1u_emJu&YgI^wo!RKXF9 z>AZc^Q@?u*zFN22zJkR#OexSK* z#HFEK(z3E1kvr~-P3oCm%&{KNURZlk{Kp^KdpRTR zb3d|9d1oKAp`8|^4_$wKDgm-yQ%Ff;vMt~2GhSmU4{f{1G`KH^#)2k17jGA{P&#wT zzDn%AfE0l${B3$PPR45v7F@Dt6b6~yqTdBD6w%gvCOT8m@t?Ndt%PshWWt`$5K@LFEEHQnen&312x zDmadZb^E}y;{NOO?3ET2;sfJ6hG(gZ0X_zF2CyEyAu zm@kwRwyR582!$G1Hgx0FW|-+)!p~*Rk^=GPpg4y{&Mbdw%I6t%`-kR@*WL%Q(l19% z^(;#d)m4_<+V%4b;z0GO9scg^*sBwE(crD%Xl%m9UtB0dDvkT}LCV2qW0G8nSYb@c6p(Tf`0 z6goQ>GoDL%AWmV88Ebf?3;#t{K1WykyTZBnxYA9wj0OO}56cBm(w(d*Sf%B{WWcE=&TgSHvGawK;B8E~(%BMKMyAZv1Y-b)1q8>;85lpGc8$y4n?dj+F(_V;FZBP)3D$2krx#X`XTA(q{WQK@XP-jJ{%0505 zk*R6xG(j<__T48cJqsMEB)z{@Q-VRZfccd*o-Z;K<7`JuXATwR{5GWDmgHzgTz3}N zGRF?%v^{#PXS&6fjTsw%I5eet-hS$Ek~b(AwH)yL5?(AzSxXRJ1+^Nc5z3SU3r^nm&K?%==r5|-}-0tw6q>^qjdmnb=RB781e)LH zMR!OMs~Zoi|H5A@w{Lt9$`nwfRBSpbO z1;3Qp<6-IEMI?iLO+M7n3_i=%JYlT(WkGjIJh^cLEos&$biVO%Q>+_YXWa+}sh+A~ z(e98&*KI$&JuzxK4G+PrxR5CGG)Kf|^T(fWss^^RR%dgT#pw~Iuj6IIs^XEWOe?Dx z3qF<})V6rf5-5jYS%aMI&EzCb(9mxB^5zM9h38PANHOf+vf9v94CYX%m-~8g4YDDu zPwOKwbNCXgX|n_1U(XY82~ZC`BkCpq%ltPnoqEpOmfsGI;CGW;+^4nV_M#T%@ej+W z+nRiy^O8>+!aF)TuypaFkPH~ccfyngkI(k{g;b+}diU1z%>0teg)3wsgEF)HEep@T zg59K7-=pt|DVao?*hEG+LBaMX!fB+-VUnDFjXZOCos^}+qKXZ4Xao#M45c5a{BrEh z6qD-=(S4Gmlf2D#ks9pX-19)#+g( zpPvBiZ>oz^51YMWg*37YK@Il3W&Dj65b)GbKZHADdjG>T5JjGqcV5PZ;#VDa*c^+E zJ;1N|KZwZ(MxvwbM^kVPR~1)R&lg@?Tv-h*Jg0$Nk~!TUTuhr%NtDH}lXWquEhXhi z4!yP8TXMaU1!0;--D*78Tye#epv_?YxXJrfo0A1sylg(i&veZSSq8e#?Wm%Ye{0Qa zxAR1m0N@vE^i$ym%WnaBpyl)c!wK8jQ80S6VM9jN77?P}417H3y+ED#3sbUmpN1_4 zbGhlolZG1FS=qKCHu@uaH9>LgtCPNZtRq0TQv}zJhAu&JcM(iFQ&PB=?}Lmo<_&J_ zhnRg+_Zd(OC+fkUUguBl*=bMnrfEiKJH|;-8cTO@uv07r;jw4Bff!rxHV?WkPJrPn zOA>$Gmto9Pe514D9Nq^=PSf#v{ib7cCsTT)urxl{hLLayszQiPPhD$t#Gh;M!cF$6zD_Y4|RD z5T774fSZ$tbyfJm-_JgH`c@-wAR!uNpy=qf1x9uQaS1p#`9^jwkUx;!8TM6nYHpwntiC$^Q7yp6LjWJv>Z6e*@6JC@Z4;9S@lTR-Dkiu`Q z_804$)nik*x|Vo5COtSW%U%am*U5YpHtF;@Spkop?+$e7FUQJi6l(}O|<#k{jFy`uN*I~ z9Pivo1sfo;XE*hGSs~Zc{Y)!xzrTzG#>Bh`2sGpU!p9xTAQEoJj(EY9Eqah}l+aZy zONA`|RuRs*)K_ub%S+c4hc?`sd9}UEP391ei3+*PDhg7IIhASY%{XuXp-Ez8T z^v5?=!VDODELQ9bbj*h@LWh-w(0-f^-#DizM?Y;^ZPF8hOrCOIJLFpzu)Pg%b(IzR zr0{p(pLNA9(xL9$-aO;fPlWr=wp2%esw%m2>*0pREAre&%8un7wt@?P8Qj(LRvGsq zz^*pY0x||Pb4FzMjK}74L(EQG?nbn!QmM{%=MWPDo5-m)$3D|&57Zh>(>|m+@{38> z{C6XNVv3uQXA@FcQAGDe4pu2#}HuMEHgKzDinC*^F)XvO}k1I)8c$4+W=K_D2hFz>x_!Y5=>+PAa+ zssXpjr>t(6|0APcTqig1l`6zIt6kSc(_Wuz`Rp?J-mh-$(6;OAoesuzLnJ~qN1dPZ zp2&GY7{rGjJRjfXkOPQ95Jy4Sg$lux)8mu>eTWldZFDVvZ>p1N?FeG#wdI|6Xac>g`& z8^_5}?=2G&oWhh%l195H9yCtNQBs&0J8t7(W?D)&E~E0Si`?G4ZWE=;%#5biRf0j9 z>L_=;%KGS}YS_$Vpt~c`nvc7FHX?@%G=v~|PauHm`fs7kjm!7cUu|qVmc_M%Ga|K( z{+#f1%exiD%U4FZDr|6x4+4aKhF2%?|A=n^{2(?VUcU@(_d1!XVdc-8n$3)h=WAw)EB+R}mU+ z6ud9+&=Vn&q9l(KQkxzW^|v~fAkk9w<%J5;1<K5encSwAL^1`)hN}ZD>_u z!uZ3Lh38+-ud`g-L1sU~#c@HWp_kE`uVJ$L&+fP}F{4GsGt2O1PW{GdIngj$3}v#@ zY6{1Gk~6q>BVX)kY8a(Gn6Qf}q_u~SDR?F5p}a-)g;PXyha_mOd_GdM2LqC|zWkB2 zZ>^~;ItyBmWSI*^sHFQkKJIS1Q{d#JM50c+&(~i>UG=kgieLEOpHAIzG8S8_xPPwv zax(-8Dfl-%d~S+9pE#Mrj6vQ%5`#*WmO;ON-0y;SUc?gnPa5nU!&}?1QhG#s(oW+2 zh2x!v5@_aRww4sxf@08ujDAd5gb%%Vwr}7VA8P1FB^ovG%ow^_;|%)ESY%-Cm@en% zSUN1id8Qll(MEOk76uoAt0BADPA$#bc!oYdvk;>XQ3wbTq>@OCM2KGqP<^3GX|85) zl!GnrUzyX9znV9Fw@XcgVZD;eQ0sj=2Tmm+s}ePK&GxD$;-3;j!xqjSCJp^5E|+Uf z{?dw!>AHRXxRHw;;GD$Rre(XMcg24zdB)Gv<9Wq*lNk-A*{8)U#Euq0phq~R97Gkrfb3C{~Bkt9-8sA`~wl^q+j}0)^#(rZFzN_HKurbzY_n~0I z{(7SS11>|(k>G*Xy}mwE^h?ZyKhoTl`p7zieYNr%d0#fr=j~{b zwu3B9f}-Q&Z%bPro$U`8#K*7w8X#&n9E(J+{Ib)%?BZ$S)gl69u6;!V$`%{44AltcK-hUyPaDhhV>J6rlc@bO>taojP6Hd+Z!&O!q;ej9{e}gWJ{j6E0eY z&Khjgg+duj<*gKn&O$g5?Nf>b$Gh}0FadgDD zdtE=3vv{uX$QH7&@Q#Oo{N)l7p*D#w0|%Js_HN6`M^X|K(X)ImXuhews{PzmR z7w~F#D3GSbcf2!uQW3mp+TF|7k#lt05RmtOSykBnKW2+$+iT>>dkI> z84MfH;}SQ*oZ^x+`uex02>!|Qhb2+xNv}u$xq3{tc49YR)v7IDy!G6CDCsC*#k(Z( z`fG|xKBZpnGlKnCERoGRTm9tQIG$p2A}qje#cqQhWhojgXJk&?w4B4L^ij`2f_|QEqQO9U} z^Gy5iK;!*No!$CqIxPEIg;OkryYuJBpG7apf+DoCq~^Y=;f*9{Cpm4>GTD2`p|&3W zE;G{A%OJK4y%gWE_8pOQ8d4a=8?$uci%r$CwE^7qeSOc-1j>)-b@_~g$pvVRBK7UyV!Db8gXA4sO7USyr`Rr})88>N8UYX92{y3b zWCRW7fz?=bKT0RI2-lp@6X`tDyB>0(8r4H#Tw2ijO9KN#`f@+nh;`4*68C zx|pq>+dqjg@<@Eb=Y3xzTaOCKLnb%%&SdX--L&Dv-sjW5E#I_+n@8^k=r?4W3e8y| zE2ms4Y4aT80g1Gxf|5P_B140~lUo2r}{Ogq%HjykXDh#-oD z0_VSC3vXoFW`a09q!6(vXpnjC8}<#Yf=;+1XDOXf#-kN{*vWq{pMK9bXB-xnV};^U zyO?je`T32xH-fLfLrWPLj=Dr_4nboiAWGsJf$|#iAuQ+6CP^&S$%M9f0 z9DR<`b#Ko}M0KO%Qw`BbQ*sYm`3N(UisqXN;ljplKru=u7FWP=T@s(>7XH6qiPrCH zjPq}MSJw2od zHkz{Z`!yWiQAa3Eh1tL8T`0Rm*hg&I`6{d5@Mqz8K7GrZ0CMMU?!7M2m* znQ7eNYVoMaZBsLNNkgd|6@sPd8^N3`0Th8j?wTZ3?zm!g?dC=^^%t@UD$@!2G#gfk z5K>>LHeIhwja#b?Y*9nD8FF@f4TN1NL#t3W(ySj|Hj#(L>Z{cC*GxlRbQNmODS3?u z9~xv`q?)N3BNU<@!p4BhjPY*n8*S5=IO82sU6=$1ldE~X%={&2RiyhzySsP8i%yuf zzTT4I4;!QAX_`m}yr*RSWsdm}E6r!Y>;BvE2tLviHy-+6brY<4rHv-1PA}1|F*9sX zjuX;D%&Ksavcv`a4s?#cO zQ*e#ont!eF@ANso6kWb!r{J2X1rkzr&EuJUvyRrx4=;+qd*!2>1`+`xm+Gr0o}}!3 zd@-caRL}2IyC9s?b0jHsi(410pgqe8+G?B9jDnT7ER!?(iqU)>HCVaw*%{``qd*E9 zC^piJJj#BXuLzf#i!;f@&*}OPkdW^-H`@m-5G;MZ6vKZqq`mKg7Yz2V$t_Eu=(3Lr z+LWdgn3)QNTbpks8@E^%H%fv-*q>ux|7o0(0o*h3nrUDEb-YbY*;h}_#fHoJ4JiF| zVas<|;p)^mwgwbhZY~Lk2BofBkSxA{Xzh9U=BM8uk8f5WhJ>vFU<1v;3W^ZHQuNH&HCSs$nrW2Sn&Cyq6r2}Q4303vk&^OU`E zFB7tbsy|8aJx~I+dXt7+T+$6;fZm0_g=boyWHa^ELtu|k`KAt{QT>0 zuY-0KAbH;P5o%~IeyxrD99h@A^V)g!D{|QcWPx+734)b?Zm>sP?)6)%XyX-OIDa1) z(Lb4#J&E?U8K%-fI)lU;MZ(po>(BO0?D+T9v2*IiVj2u?;(_6rj_D3Oeek$uF~4?G z6#=5f;$Rcbo!;>)dnOS}0&<%{BXi?^ho6LS) z;?BSF&Tz$X{WTq2Vn;_sj&CpL>uIkSO*VMjI3!S`cqhc~|^R7ZG|o>_;dJCDV7qNLSm%oOVqvwr`3k3;*H zVhpw%B=f2)9c_8eeNTo4IE@#Z@3>weFOknQ#{brH`R{21FLAxadA@&#=Y$h@>s#WC zwDgh`n;T4}P}RpHq4tg9NlISsYj&z|%Db$eW#W^!L7xvTqxPL8;|{|?t}U(TR9 zcSq=%>J~^1o^wPy+PttaD>j~JY_uRS&-kIYbK${M43E&Hx7BcG0xKJa&!HUYAvX1y zH5!`Jqmh-U6gmTjS1#5Kh!VYo_QnyE4)aSHYi*`^kM<7W>~7(bYJYoXwf|JOJU17F z*35p zVzav`e$^#NJx!o4gr>0o$VICYgH4%d6yqx1P-`$_0h>srGch*G z17)ml%^cKYaWu9Bbd3}W)GgSSYgCCdIyU6rG!CPQBu{oK$Gg)s-_Ny(MRe%!yI zI&%>)n91&{70**SkApnk&CRpKM)BAbJQ4zcm9{dUOHI)F)20FL9egN_oEL#v>2`X0 z4&{-4_KFW^7K+iRV8$2tDyefQvi3(>qimIw)b`Jb{Ml{hOUx#HlTrZls15sEb^J-4 zfpMYU8`r&=->DhpA5T4O3HHICW0-YTc$=2%T?JWnA+PuB5?zddlw2}SrCT^C)9RG1z zX}Rsesqgil>hTL;BpYwEFrsDwz(4u4q{*5r->(aqVF3~F8NYxB*fakNy@{nWoFoDB zo_itPayuoz{i&h`cU)bX#vYc?iDFVWSs+SBg-v{vJ=@cb!@vOq3ZW8&;rn|;E=W~} zY&2(%9&9potWLQhYPIv{rj6ljnlsk zY39{i?mZn+(2v>zS(q6uX-=Q>cnb=+h~rrIfM0L(^@&tLv5-MC;f9aaKE@W2!NB0H=#F_)kGtnOQ_b1T*`Q*dFJO5x&E!#mlDN z*cK&1S3Y_h)?$I_*0hJX9&@?Za{RFn;P<#L09ZU>In6P_OGi0G-w_*43f(x8l)NLh z$0%QPP6K8*7Lb@AYW{auMT`zYjm6SkDm#pemodg4C;ahnYe^bH(T%~$tO-u>GA~5l zh)w(?hKIkA;t{{=1}Gm~dliZ^WLbDnmO&uWk4~z#%O#2bd_|~vL=f@$M2{f2rbeXO+jX7`;pt?EAUbN{PYpkHs zqFa+XS3q$qRW@&XoNcFCP!=92>6v}Yl+k~RJZ8@jVk4w&{&q3Nisdv<*%Pe~%fI_N z3dHWs_hS=4?YZx6v-v6C!Es~zB>$Y+tr4@!-e501`7JZv#x7*4-8iRq=+mxqXXFM% zOZ(e^X%#&yOhFYmJMupoB`TJC9COK_yxUhI9ZaR(`R|9q@R8#yHxHazoSjNnXP&D8 zPFk6((Zq(Zp^M23J7EuMmP{xF$C(s&!9}Nq!k|Af7!2+uRg`d5!V)8q=@7DC1m0F; zWC_=$1uIyKg|G)iyG(+=BrkM|Kc-l0>ap6goy2qQ$3}PV?{0KldrFGk%8WIzSXrf} z`(+XW(BswroUqcsGOWR@galzlp+V%4bAR+nlGE1%h?;iHgjxw7%5F_#x<~7ICxjq` z(MWk#Co(*3TYdu+ICPiq?Qen=vLciDpl}#Wi`2E)))aQ&Xfm#-@#Eg#@AG*{=ve|D z>_Kjm-(=dRFj|#CjUzv@IuAdPJve}sAObQfk%VRemQl)q%QvEGB$_)@+NCIMlB1bK=hkiS3lpW~| zhZZ4(()GWy7#p3#KP=OBHcDc+Rh^> z_(wDc3{=(YP#?tOMW zqW+2v-=U#+4t01`GWzpR*Cfgmzr;KUW5Tv|D<8Q-PvI#LqGM|FtW~G+eBOtq7b_Aa z7p*F_`JlMTSAp8?y(d)`SF&yB6hW9a7d_?p{d>8z zH_ttM`s|_F8Zlef&6E{XVSFEMoQo_Yr?}*&J#G*WSahQ?*o(Bn%>#2OSs8Ed$}Sts zG&|u>=f8=9kB#R+z>G=H9CQ<#)YQz<>e1q!^#>_gBKsF<=~?NC&XNUb`n57lcUgO7p-`?3yKI!%n@@}S5F9c! z3yQ^1l1XQ3+*nY0xOF^2t-tO!dCIeN7x^PN97?l|MSIykmo+|n)coVt6TZGcN2E|Bw(h2Vrg%Ac?jPhESlt>EQJ2;}T zM`Oc@!~34K9L;#Y3cOk@X`ACIZ&lf~gRu<&P2q2$nq3~x+CO`)0rf>PTk^;WIVY~X6a8jcWaz^>8Wo} ze~Q>f`+_m@)&poai8K8h#)>Jc|cP<6a{S3)I=!zhM*Urfj1uW_9 z7H72IB32k20D~fpT2(%z=|ffHhavm;N?D30=Gg3PPu_tiXW#((ChbA2x9N~|;4~>7 zi)w|GOaQlfh=GAKPu(tirT+Z#e>yMl*i&lWYhJvxJyia@I$~<= z1Tqp_%+<$^`kt?;xoxO2)yoMnXjG}k@Ze9*P1w+Fc!*V77aMx?80#X3;Hf z-|<@G(Tgnp^c#gIO7!Z~+3S4`#hLEyGDah+n@o?Dkm&#_LNeeXbaYJcFo+Mq2%ZR^ zJ3SbBppq5>L-Stn402&CDK@41#K|vyR>Rh6;!@q&FcQo>GqE)%>WuDle0~B$11?6L zOLW<_vTUsNgefbmZR)j8_8?R%ik?MpUB1&mWsF$B%z)#M-os4Lw`0_xX>s%Ptp*>rgcq^|7@6t%p5)w@Ds|-H_)0HqUWM99EFoz~-L5 zsv}36KMgs@1$Av`mmn@Z<_a<03FJR;C}X;XqtsxZ^610!$C31MoGo3E=UWmTXtlcv z`Jd~Kp*O$m)!!0069#9mx`a+m4-+=O@K|--Hbisgn|PnX;a>4D2EuycxmfpIHuPi`(R)wSyO4yt zs#y_={U)g{?|iuZJyQS-UjA;W&BF%OWA;8h>-h&Q1e6RgXxxNjLhO~ugx{u0I<7Vx zxe_pM(~T+3T5M>aV$-}i&j zlcfWdRaP5na;Up?mT01DJW;LBYZ4Jn{vJh7>??6_l8XT#s`CSbXQWUjtl~Dr8jC zd%2$k#g9HSi#4Qd(U|W2u&rZ0Ypcuc1_LO9L|AfWB>nRB@*Gha{2Pn~7RL)2zn>fc zT*ZZ@3c~>kOn%VRm>ki1s0Oo4#W9)@aK71cdAYM+ z;GlSJ1<%RoSU?1Mgz>|nTLrqGG$290@eICLq4ae0G2n_Id-2{$H{fp9ts?){o$)o9 zHCZgdQyCEer8w;V&+nM8P*gj~&KkcSEi<_^4Z5MIP*oTj9s&Rp{A=BZGn*gix(6+5 zC77rAVBw+01f-k~g+6t430N!^hlU89wvn;p z0q~lVWO=GX1Y)WY*8yes{0QCLGSlgnw*czS5lKPE2Ypxr%owLTd09tGU+ zQYX&vybyo*ifvxYpEQ5J7bf14{&t<&p^%JQ4KKFX2F;jh!-s7(zfxXE+y1V9 zzARgUw)h^Cb!5z@z&#?+hQFL_ z-jfNF%z^cib7S*0RCLtD!)ltSaE3VZzIeD=uMGSejg$lxWM)*Cle1c`xmUOfzuFi# z?(YAK0fx<h8+0Udklp57eh5{n0L!-jka{XdxvK)qxK93tFLhNnkDB zEFeJzMX{A@NEur!T2GJ8q*}fyH6S&6-znI*YhYGCBu7AG! zp<&9J)nRWeU+NKkl(IPN4cJE3+AP-47|Z$O^dk*2p0H*_9ENQ%nM*Knzb1U}b$l0n zhn*eWozkDpoSoZ;w$Rdia7E=gmQ^OA)A00NZTKCQ-@_)Z_m^-Z`;wa;z_2vBC<_-l#n$7FKTt`M)?-7J=ykSA+ zne}^8Ppka=DCaelC`P=heYv_(=W19qFSD+1bhEzf-3OIx-9Lbo(<{GPToB;%eU+-Ba)~@+Y=urDpi6)KNs0FrLcncy*1Vjvj z4}}y+wb^{ze*EplkB_ZGBc*A5@w~s*X+8RC(T#jA%A~(0CaM79^TUu71*QgENOtm) zSd)ixD3J(&;vTw|M#FXR&|K4qO7-wPEL`hMrm>k@^geLyT`Kx+)syLY_vZDxX*c^* zz03L=c02Yx_j}Q>#nHK;NVO19mT_}-qP=SXyGj!dF53pJpPCTIL0UAFdRBia^jDNr zxB3z~B`_#kv)6$4Kggxj7eoK}>tqiqA4)-|#bk}2WZx3i1nujQ-uIrJgox#Oi9bEk zkP4uWbym-pc=%i|q!rtunZv^XtD0oEN7rfeybp*@zOm_tAEW=enzwo(_)xUz-u_(c z_lqqp${Eqel4OGKw4DwBs~QHv*-P(2>~#s3>0SUp?$40Dq`#j0PR{ZB*tOn@m0Xjjn!eNv+I6zEmnf84 zE8obvh4ttJ08@1N^DoW|^mz0(92x zW+7$axI?`+t;wdU#SyxB!UhPH?-(+V@%(&J*LcL(h#?LuP%L~YVh2n?~*6!?~6>7|T$OL4BWyJ9|K!pF!wTdIN@8!(^7!y&9##_s~v0cZ$ZEXS88>^&!RV^+xU!2BPfA#FH zZ;WaFnp*a~jM9_@uPW(mYK&zKVe(?jJa^HH_l&;nq5G9B6p)5h>3%@#3}yDln@^#l z|1sjZ*$J%q*u}+yt4KecaVT2?*DRJa)WBP;380w*P3$tz)6>&lnAKOb@F92aX7c3Xty7?C^tSF*VX=r~s z{u#djUO2G!=C})YFyqV_g<(|Le31p1_;%~>5}c`++u)0AJUV!1;$S!o^rQK9RXn() zo%!pt2G85YF?jSX{c?ehKb!M6cE%cwuANlVGAiEU`8n18+{lV%@1N((bQU^0PdE;~ zaDCTJY2kraH33>`BhoE4)nfZGj-OfGcV`j5QaUoN&~3xVhpOo^ByVI6n`Zho6Ig4T z6hS*B%^FX!7s;%>hmzpG7zS2W@9Ga6ZF?N|&3W`~j8Zhk9{fV9y=uLl1|^MkS7Tzm z^&ii8sh|Hx4IHAW{b?oUA@5vq5*QNf)RAH`0gLp@%}B=aV@#Z}5^eE(Kki9t#K*f$ zDsi|$I~S;h;1beMlGdK`ao9OQSB6UE>{)5y7c59(z7e0+ZduZ?j~KP=xVYN<80-#QNCNAVN`23L3EJA8;}&t zxlryVqhA1Dk;=UBol{5bwPqV^%zT~i?jnZMu_Je1yDH1?`Dk*dwmqTu1PIlM^oDNO*=I` zh?lQ|m{R)M)T8?Ng^R=3HNIYNFC8)+Q-pM%7^$T=>rqZ^i&MElj$W6pAeUx71mvEG z2+p4E2spqr3&WH(B9~Y9rJrvuPeWLQ21;aUH$LkA+R{UuxjUR66KDzO8a1{z%(|rE>peFY#Rso*FSj zW4C<_$5ui7IZ@iTFt+RID0l4nOho8N8H323N? zfj?T*WGtT+&RpK4cfgD~mTB*(!8G2y)>*k6Oy9m@gq8B@5i?`Rvo9WWMD)E?7iw+1 za>+P;py-($4-y>Wk_@|Cv2Ws&v4sSS-j$Kl^909jpvg3s_za zBvu#wvdX_~j#ai&Fj~(-GWulgV{h|4n=MQ-g=yyiu%JIEZpR+@eKZvRNdfFK4cYJB zO?PMEY)w_5^K80kZg}rgA>NGnUe%6d4Zgrno_~TLka7rG0AgeV(^=?Eb32bm`(8RX zutRNrTLKN)gIvaGtH)Wl9XYYnaV#)|%3|d^4`>u2I^X%#!Vs9p%L_{VHf0btGOe0~ zdqQ@(n$B>*!T^pG+>Jw{VEf~iyY^i^_I}~|wF6UxZj)hl>V6VJL%g9Qm@T0*-#OrT z1*@Pd3Wi!GA9R)vjno(xe0(0UPe?IeT+^3wtd31oI#nJ>b_v1rtL%8S({|YL+!Ic2 zhk|$b8_GI>6KF=SV5a3@+Fdou>+xM!zJ-rFi^T>zpWK-9u$V-Zp+1J9p`8s*?E3nx z?E2mK4iu$J*P*2yhBp{HPYL`qF!ElkYD_fYY(L<-86nqPsff5q_6&@F##U5AimG&h z{MUwmV@va+%-r6a5}9>3&Bw1gstavvtQv{Jj)xUb@e;`9+pbm?)J2?!lV6T7i&f=9 z-nYSrc6%oEG{8~QfYB1pFPu3yrIY0vZa2X9QV@(Y;vE(6Fl#JtcW%t@Z;zUidF2*z zUX?|tp$&383~_>n8KOPV2i5KHlDCZf{}ytys*lVRY(lLp`qyvs|2d$!S_trzo-zC z{r)($?ROy0Q-M(kam zSlkpisgGu7WYRV3kUtdX2No+RnOnIx+8}D}5A|@9R-O@=gn@gwD{i4gJBJSOauH%i z8b=d|IY~dJ1>X(HWTF|gqd=S<3hA6{!FUq3MtklxPeY}RlYa952YH%GAjrruGl>Af z37HYN3!AS0ZvMIX8vO6oU+$ET7op*=a~h}2eZ-Vh{fRf$6V6_S6wcd+SP2T(W&L0o z)fk5U)-rRyG&={Pf_I5gwQ8?0$NxKb%V5}q;S+%;L0K$jj#PNUJ!Go&R-LBWRYMY~ z>Bp2)Dy>lMi>wP~B`L8Lp7l7thn0K2=@aV+R~;TUW#99#nf41f!?``mgSHX8SVyn8 zGQcHO`kL!$UU2S}-$H!H$}38`O0jkZOFG8YSxf#j@?P8L$7dJ}BEoD~uTq%fJ)b9? zBxhVhK`sq%;Np>(Y0@64dv7Iix;>7lI7Ld&?m_3>2_Etc4Kr|+@pcxs9 z?UYp7z=P@OoFCDfA)5LfUVfnWPbCCR?|Jh&J?=rbV#0nhjFC(E&6pAgBVx-w1XS*) zC)*&jlUi{Td0-B^Ev%z>abLtX8f8pokKl>sY^Sz5LvP|F3tzJst6EjsweAw(V0@ap zaWqZnnC^1JAMAqPxFS=^x7eBGB3`hAbwZ<`=l=fhIj=tWHVNKgEf9g|l(%*V)m(eJ z6EvGy0uBiRn?Q(FqmXX?Bk3ijkK-VaZ3;aPu@e=?&d#KWy^)+f%Zq;6rrFqvr`j(Rxy9iS(%zl@xmOkz%YxsoCdZl) zW4(VC@54haz`6m4srzpwxau|!*MdsM>#shi`#@8V4pcVyx_pf`^Zz(UIB;FJ4T^_Z z?AY9fm|3N{UW!&i1!5)5=3p)Bsdgwi6l=*X@3x1gxl^sZK{lR`Ozc)b#ycnsMFJX2#@nv>h?PYLA2XbOe3(hflR`jD<`}M!P}@@8>OCVbhfRxjig&DOHvz zaEE}9H75`!i(kp5b8pYS=iwndRBcSw)N!$M)~mZedq4q?%ZXdL^n4d{<7b&(?Cna~ z^{qbvR&I6P)rf?TT%C7uQZE5T{DXD2JrO|bR`4+VQ;zy9tnWcwW^=2x2&|X`_q{m> zcRe~Xt0k!iUn^3`)&d1S7b)&R$yNUc*=WvsDbdrIRto|$qdfXTUz|#})#}@LraR1w z?nAZv$`dxA4s%l95`QTufWm>FBI}!^njjLKWmv05FA%j((jvh~n){XrySdj2@V?bVE_} z&jw0*(caZTQty!4>%r6c6<&~FXOea%Ksg~%Pdg0ntiPQTh1^2F(H8BgIYMD5q+4dO zLkUtoqVQy1I}RK`&`L|Cei=PTLO6@QRMB~I*XSF(6G@Wrvbue^GxcD^Gc@(5+G~a<2iNe;p=K8 zWG1BBaI2<~qun?(`Vwlp&Wzy2Csu8Nf&=Hr(Z(yIWz(4AfT z)#oo?z-pxcXL=~1dzc2HrmAqOa~gS8`CJW2#k!Go9C$b>HX;t4=6YgEm%?KIQgt@V z%fDJZ-J9d)K)5`q*VRqNVR;sAOd43b_j>9Ncs5+W1BMa0Ov)sg7HVQWBI*Sdr`0