From 8ce5c7f907af37a8f10bb4919522f23ff0ae7633 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Wed, 26 Aug 2020 13:34:08 +0400 Subject: [PATCH 1/3] Fixed NPE on game.getState() usage --- .../java/mage/client/remote/S3Uploader.java | 9 +++--- .../src/mage/cards/c/CabalTherapist.java | 9 ++++-- Mage.Sets/src/mage/cards/c/CabalTherapy.java | 11 ++++--- .../src/mage/cards/c/CheeringFanatic.java | 10 ++++--- .../src/mage/cards/c/ChromeReplicator.java | 2 +- .../mage/cards/c/CouncilOfTheAbsolute.java | 2 +- .../src/mage/cards/d/DeclarationOfNaught.java | 9 ++++-- .../src/mage/cards/d/DementiaSliver.java | 2 +- Mage.Sets/src/mage/cards/d/Dispossess.java | 8 +++-- Mage.Sets/src/mage/cards/f/FailureComply.java | 15 +++++----- .../src/mage/cards/g/GideonsIntervention.java | 7 ++--- .../src/mage/cards/j/JestersScepter.java | 30 ++++++------------- .../src/mage/cards/m/MedomaisProphecy.java | 2 +- Mage.Sets/src/mage/cards/m/Memoricide.java | 7 +++-- .../src/mage/cards/p/PatternMatcher.java | 4 ++- Mage.Sets/src/mage/cards/s/Shapeshifter.java | 13 ++++---- .../src/mage/cards/s/SlaughterGames.java | 10 ++++--- .../mage/cards/s/StaffOfTheLetterMagus.java | 2 +- Mage.Sets/src/mage/cards/s/StainTheMind.java | 10 ++++--- Mage.Sets/src/mage/cards/t/TwinningGlass.java | 15 ++++++---- .../predicate/mageobject/NamePredicate.java | 3 ++ 21 files changed, 97 insertions(+), 83 deletions(-) diff --git a/Mage.Client/src/main/java/mage/client/remote/S3Uploader.java b/Mage.Client/src/main/java/mage/client/remote/S3Uploader.java index 35a1b538ce..95be10c267 100644 --- a/Mage.Client/src/main/java/mage/client/remote/S3Uploader.java +++ b/Mage.Client/src/main/java/mage/client/remote/S3Uploader.java @@ -4,9 +4,10 @@ import com.amazonaws.AmazonClientException; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.services.s3.transfer.TransferManager; import com.amazonaws.services.s3.transfer.Upload; -import java.io.File; import org.apache.log4j.Logger; +import java.io.File; + public class S3Uploader { private static final Logger logger = Logger.getLogger(S3Uploader.class); @@ -18,9 +19,9 @@ public class S3Uploader { String accessKeyId = System.getenv("AWS_ACCESS_ID"); String secretKeyId = System.getenv("AWS_SECRET_KEY"); - if (accessKeyId == null || "".equals(accessKeyId) - || secretKeyId == null || "".equals(secretKeyId) - || existingBucketName == null || "".equals(existingBucketName)) { + if (accessKeyId == null || accessKeyId.isEmpty() + || secretKeyId == null || secretKeyId.isEmpty() + || existingBucketName == null || existingBucketName.isEmpty()) { logger.info("Aborting json log sync."); return false; } diff --git a/Mage.Sets/src/mage/cards/c/CabalTherapist.java b/Mage.Sets/src/mage/cards/c/CabalTherapist.java index 66ed076a80..56725f4cf6 100644 --- a/Mage.Sets/src/mage/cards/c/CabalTherapist.java +++ b/Mage.Sets/src/mage/cards/c/CabalTherapist.java @@ -10,7 +10,10 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.ChooseACardNameEffect; import mage.abilities.effects.common.DoWhenCostPaid; import mage.abilities.keyword.MenaceAbility; -import mage.cards.*; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.Cards; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SubType; @@ -79,10 +82,10 @@ class CabalTherapistDiscardEffect extends OneShotEffect { Player targetPlayer = game.getPlayer(targetPointer.getFirst(game, source)); Player controller = game.getPlayer(source.getControllerId()); MageObject sourceObject = game.getObject(source.getSourceId()); - if (targetPlayer == null || controller == null || sourceObject == null) { + String cardName = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY); + if (targetPlayer == null || controller == null || sourceObject == null || cardName == null) { return false; } - String cardName = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY); Cards hand = targetPlayer.getHand().copy(); targetPlayer.revealCards(source, hand, game); hand.removeIf(uuid -> { diff --git a/Mage.Sets/src/mage/cards/c/CabalTherapy.java b/Mage.Sets/src/mage/cards/c/CabalTherapy.java index 2df5084432..569e9a5758 100644 --- a/Mage.Sets/src/mage/cards/c/CabalTherapy.java +++ b/Mage.Sets/src/mage/cards/c/CabalTherapy.java @@ -6,10 +6,14 @@ import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.ChooseACardNameEffect; import mage.abilities.keyword.FlashbackAbility; -import mage.cards.*; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.Cards; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.TimingRule; +import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; import mage.target.TargetPlayer; @@ -17,7 +21,6 @@ import mage.target.common.TargetControlledCreaturePermanent; import mage.util.CardUtil; import java.util.UUID; -import mage.filter.StaticFilters; /** * @author jonubuu @@ -64,10 +67,10 @@ class CabalTherapyEffect extends OneShotEffect { Player targetPlayer = game.getPlayer(targetPointer.getFirst(game, source)); Player controller = game.getPlayer(source.getControllerId()); MageObject sourceObject = game.getObject(source.getSourceId()); - if (targetPlayer == null || controller == null || sourceObject == null) { + String cardName = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY); + if (targetPlayer == null || controller == null || sourceObject == null || cardName == null) { return false; } - String cardName = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY); Cards hand = targetPlayer.getHand().copy(); targetPlayer.revealCards(source, hand, game); hand.removeIf(uuid -> { diff --git a/Mage.Sets/src/mage/cards/c/CheeringFanatic.java b/Mage.Sets/src/mage/cards/c/CheeringFanatic.java index e0288f1af8..ec8abfa655 100644 --- a/Mage.Sets/src/mage/cards/c/CheeringFanatic.java +++ b/Mage.Sets/src/mage/cards/c/CheeringFanatic.java @@ -1,7 +1,5 @@ - package mage.cards.c; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.AttacksTriggeredAbility; @@ -10,18 +8,19 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.ChooseACardNameEffect; import mage.abilities.effects.common.ChooseACardNameEffect.TypeOfName; import mage.abilities.effects.common.cost.SpellsCostReductionAllEffect; -import mage.constants.SubType; 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.filter.FilterCard; import mage.filter.predicate.mageobject.NamePredicate; import mage.game.Game; +import java.util.UUID; + /** - * * @author TheElk801 */ public final class CheeringFanatic extends CardImpl { @@ -67,6 +66,9 @@ class CheeringFanaticEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { new ChooseACardNameEffect(TypeOfName.ALL).apply(game, source); String cardName = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY); + if (cardName == null) { + return false; + } FilterCard filter = new FilterCard(); filter.add(new NamePredicate(cardName)); ContinuousEffect effect = new SpellsCostReductionAllEffect(filter, 1); diff --git a/Mage.Sets/src/mage/cards/c/ChromeReplicator.java b/Mage.Sets/src/mage/cards/c/ChromeReplicator.java index 8075551225..fb331f6133 100644 --- a/Mage.Sets/src/mage/cards/c/ChromeReplicator.java +++ b/Mage.Sets/src/mage/cards/c/ChromeReplicator.java @@ -74,7 +74,7 @@ enum ChromeReplicatorCondition implements Condition { .filter(Objects::nonNull) .map(MageObject::getName) .filter(Objects::nonNull) - .filter(s -> !"".equals(s)) + .filter(s -> !s.isEmpty()) .anyMatch(s -> nameMap.compute(s, (x, i) -> i == null ? 1 : Integer.sum(i, 1)) >= 2); } } diff --git a/Mage.Sets/src/mage/cards/c/CouncilOfTheAbsolute.java b/Mage.Sets/src/mage/cards/c/CouncilOfTheAbsolute.java index 483f058a50..55f9a88890 100644 --- a/Mage.Sets/src/mage/cards/c/CouncilOfTheAbsolute.java +++ b/Mage.Sets/src/mage/cards/c/CouncilOfTheAbsolute.java @@ -93,7 +93,7 @@ class CouncilOfTheAbsoluteReplacementEffect extends ContinuousRuleModifyingEffec if (game.getOpponents(source.getControllerId()).contains(event.getPlayerId())) { MageObject object = game.getObject(event.getSourceId()); String cardName = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY); - return object != null && CardUtil.haveSameNames(object, cardName, game); + return object != null && cardName != null && CardUtil.haveSameNames(object, cardName, game); } return false; } diff --git a/Mage.Sets/src/mage/cards/d/DeclarationOfNaught.java b/Mage.Sets/src/mage/cards/d/DeclarationOfNaught.java index 8e761b1c30..32d9a819ce 100644 --- a/Mage.Sets/src/mage/cards/d/DeclarationOfNaught.java +++ b/Mage.Sets/src/mage/cards/d/DeclarationOfNaught.java @@ -1,12 +1,11 @@ package mage.cards.d; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.AsEntersBattlefieldAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.CounterTargetEffect; import mage.abilities.effects.common.ChooseACardNameEffect; +import mage.abilities.effects.common.CounterTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -17,8 +16,9 @@ import mage.game.Game; import mage.target.TargetSpell; import mage.target.targetadjustment.TargetAdjuster; +import java.util.UUID; + /** - * * @author jeffwadsworth */ public final class DeclarationOfNaught extends CardImpl { @@ -55,6 +55,9 @@ enum DeclarationOfNaughtAdjuster implements TargetAdjuster { public void adjustTargets(Ability ability, Game game) { ability.getTargets().clear(); String chosenName = (String) game.getState().getValue(ability.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY); + if (chosenName == null) { + return; + } FilterSpell filterSpell = new FilterSpell("spell named " + chosenName); filterSpell.add(new NamePredicate(chosenName)); TargetSpell target = new TargetSpell(1, filterSpell); diff --git a/Mage.Sets/src/mage/cards/d/DementiaSliver.java b/Mage.Sets/src/mage/cards/d/DementiaSliver.java index 1610c825ae..f3a971608d 100644 --- a/Mage.Sets/src/mage/cards/d/DementiaSliver.java +++ b/Mage.Sets/src/mage/cards/d/DementiaSliver.java @@ -79,7 +79,7 @@ class DementiaSliverEffect extends OneShotEffect { Player opponent = game.getPlayer(targetPointer.getFirst(game, source)); MageObject sourceObject = game.getObject(source.getSourceId()); String cardName = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY); - if (opponent != null && sourceObject != null && !cardName.isEmpty()) { + if (opponent != null && sourceObject != null && cardName != null && !cardName.isEmpty()) { if (!opponent.getHand().isEmpty()) { Cards revealed = new CardsImpl(); Card card = opponent.getHand().getRandom(game); diff --git a/Mage.Sets/src/mage/cards/d/Dispossess.java b/Mage.Sets/src/mage/cards/d/Dispossess.java index 58569dcca4..8553c03faf 100644 --- a/Mage.Sets/src/mage/cards/d/Dispossess.java +++ b/Mage.Sets/src/mage/cards/d/Dispossess.java @@ -1,7 +1,5 @@ - package mage.cards.d; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.common.ChooseACardNameEffect; import mage.abilities.effects.common.search.SearchTargetGraveyardHandLibraryForCardNameAndExileEffect; @@ -11,8 +9,9 @@ import mage.constants.CardType; import mage.game.Game; import mage.target.TargetPlayer; +import java.util.UUID; + /** - * * @author fireshoes */ public final class Dispossess extends CardImpl { @@ -49,6 +48,9 @@ class DispossessEffect extends SearchTargetGraveyardHandLibraryForCardNameAndExi @Override public boolean apply(Game game, Ability source) { String cardName = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY); + if (cardName == null) { + return false; + } return super.applySearchAndExile(game, source, cardName, targetPointer.getFirst(game, source)); } diff --git a/Mage.Sets/src/mage/cards/f/FailureComply.java b/Mage.Sets/src/mage/cards/f/FailureComply.java index b463bad11e..c08eac0b82 100644 --- a/Mage.Sets/src/mage/cards/f/FailureComply.java +++ b/Mage.Sets/src/mage/cards/f/FailureComply.java @@ -1,7 +1,5 @@ - package mage.cards.f; -import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; @@ -19,6 +17,9 @@ import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; import mage.target.TargetSpell; +import mage.util.CardUtil; + +import java.util.UUID; /** * @author spjspj @@ -72,9 +73,9 @@ class ComplyCantCastEffect extends ContinuousRuleModifyingEffectImpl { @Override public String getInfoMessage(Ability source, GameEvent event, Game game) { MageObject mageObject = game.getObject(source.getSourceId()); - if (mageObject != null) { - String cardName = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY); - return "You may not cast a card named " + cardName + " (" + mageObject.getIdName() + ")."; + String cardName = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY); + if (mageObject != null && cardName != null) { + return "You can't cast a card named " + cardName + " (" + mageObject.getIdName() + ")."; } return null; } @@ -89,9 +90,7 @@ class ComplyCantCastEffect extends ContinuousRuleModifyingEffectImpl { String cardName = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY); if (game.getOpponents(source.getControllerId()).contains(event.getPlayerId())) { MageObject object = game.getObject(event.getSourceId()); - if (object != null && object.getName().equals(cardName)) { - return true; - } + return object != null && CardUtil.haveSameNames(object, cardName, game); } return false; } diff --git a/Mage.Sets/src/mage/cards/g/GideonsIntervention.java b/Mage.Sets/src/mage/cards/g/GideonsIntervention.java index 1a679be278..c186aa8628 100644 --- a/Mage.Sets/src/mage/cards/g/GideonsIntervention.java +++ b/Mage.Sets/src/mage/cards/g/GideonsIntervention.java @@ -73,9 +73,9 @@ class GideonsInterventionCantCastEffect extends ContinuousRuleModifyingEffectImp @Override public String getInfoMessage(Ability source, GameEvent event, Game game) { MageObject mageObject = game.getObject(source.getSourceId()); - if (mageObject != null) { - String cardName = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY); - return "You may not cast a card named " + cardName + " (" + mageObject.getIdName() + ")."; + String cardName = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY); + if (mageObject != null && cardName != null) { + return "You can't cast a card named " + cardName + " (" + mageObject.getIdName() + ")."; } return null; } @@ -134,7 +134,6 @@ class GideonsInterventionPreventAllDamageEffect extends PreventionEffectImpl { MageObject object = game.getObject(event.getSourceId()); Permanent targetPerm = game.getPermanent(event.getTargetId()); String cardName = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY); - if (object != null && (event.getType() == GameEvent.EventType.DAMAGE_PLAYER || targetPerm != null && (event.getType() == GameEvent.EventType.DAMAGE_CREATURE || event.getType() == GameEvent.EventType.DAMAGE_PLANESWALKER))) { diff --git a/Mage.Sets/src/mage/cards/j/JestersScepter.java b/Mage.Sets/src/mage/cards/j/JestersScepter.java index c67505242e..88c08a6595 100644 --- a/Mage.Sets/src/mage/cards/j/JestersScepter.java +++ b/Mage.Sets/src/mage/cards/j/JestersScepter.java @@ -1,8 +1,5 @@ - package mage.cards.j; -import java.util.Set; -import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; @@ -14,16 +11,8 @@ import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.AsThoughEffectImpl; import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.cards.Cards; -import mage.cards.SplitCard; -import mage.constants.AsThoughEffectType; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.Zone; +import mage.cards.*; +import mage.constants.*; import mage.filter.FilterCard; import mage.game.ExileZone; import mage.game.Game; @@ -34,14 +23,16 @@ import mage.target.TargetSpell; import mage.target.common.TargetCardInExile; import mage.util.CardUtil; +import java.util.Set; +import java.util.UUID; + /** - * * @author jeffwadsworth */ public final class JestersScepter extends CardImpl { public JestersScepter(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); // When Jester's Scepter enters the battlefield, exile the top five cards of target player's library face down. Ability ability = new EntersBattlefieldTriggeredAbility(new JestersScepterEffect(), false); @@ -213,14 +204,11 @@ class JestersScepterCounterEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Spell spell = game.getStack().getSpell(targetPointer.getFirst(game, source)); if (spell != null) { - // In case of Split Card String nameOfExiledCardPayment = (String) game.getState().getValue(source.getSourceId() + "_nameOfExiledCardPayment"); String nameOfExiledCardPayment2 = (String) game.getState().getValue(source.getSourceId() + "_nameOfExiledCardPayment2"); - if (nameOfExiledCardPayment != null) { - if (nameOfExiledCardPayment.equals(spell.getCard().getName()) - || (nameOfExiledCardPayment2 != null) && nameOfExiledCardPayment2.equals(spell.getCard().getName())) { - return game.getStack().counter(targetPointer.getFirst(game, source), source.getSourceId(), game); - } + if (CardUtil.haveSameNames(spell.getCard(), nameOfExiledCardPayment, game) + || CardUtil.haveSameNames(spell.getCard(), nameOfExiledCardPayment2, game)) { + return game.getStack().counter(targetPointer.getFirst(game, source), source.getSourceId(), game); } } return false; diff --git a/Mage.Sets/src/mage/cards/m/MedomaisProphecy.java b/Mage.Sets/src/mage/cards/m/MedomaisProphecy.java index 64dbb24e0d..85079d76fc 100644 --- a/Mage.Sets/src/mage/cards/m/MedomaisProphecy.java +++ b/Mage.Sets/src/mage/cards/m/MedomaisProphecy.java @@ -78,7 +78,7 @@ class MedomaisProphecyTriggerEffect extends OneShotEffect { String cardName = (String) game.getState().getValue( source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY ); - if (cardName == null || "".equals(cardName)) { + if (cardName == null || cardName.isEmpty()) { return false; } game.addDelayedTriggeredAbility(new MedomaisProphecyDelayedTriggeredAbility(cardName), source); diff --git a/Mage.Sets/src/mage/cards/m/Memoricide.java b/Mage.Sets/src/mage/cards/m/Memoricide.java index c38672412f..88948a85f9 100644 --- a/Mage.Sets/src/mage/cards/m/Memoricide.java +++ b/Mage.Sets/src/mage/cards/m/Memoricide.java @@ -1,6 +1,5 @@ package mage.cards.m; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.effects.common.ChooseACardNameEffect; @@ -11,8 +10,9 @@ import mage.constants.CardType; import mage.game.Game; import mage.target.TargetPlayer; +import java.util.UUID; + /** - * * @author BetaSteward_at_googlemail.com */ public final class Memoricide extends CardImpl { @@ -51,6 +51,9 @@ class MemoricideEffect extends SearchTargetGraveyardHandLibraryForCardNameAndExi @Override public boolean apply(Game game, Ability source) { String cardName = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY); + if (cardName == null) { + return false; + } return super.applySearchAndExile(game, source, cardName, targetPointer.getFirst(game, source)); } diff --git a/Mage.Sets/src/mage/cards/p/PatternMatcher.java b/Mage.Sets/src/mage/cards/p/PatternMatcher.java index c53382c25e..97099f2cef 100644 --- a/Mage.Sets/src/mage/cards/p/PatternMatcher.java +++ b/Mage.Sets/src/mage/cards/p/PatternMatcher.java @@ -20,6 +20,7 @@ import mage.players.Player; import mage.target.common.TargetCardInLibrary; import java.util.List; +import java.util.Objects; import java.util.UUID; import java.util.stream.Collectors; @@ -79,7 +80,8 @@ class RegularExpression extends OneShotEffect { source.getControllerId(), source.getSourceId(), game ).stream() .map(Permanent::getName) - .filter(s -> !"".equals(s)) + .filter(Objects::nonNull) + .filter(s -> !s.isEmpty()) .map(NamePredicate::new) .collect(Collectors.toList()); FilterCard filter diff --git a/Mage.Sets/src/mage/cards/s/Shapeshifter.java b/Mage.Sets/src/mage/cards/s/Shapeshifter.java index 92ea75e059..65fd94cbfb 100644 --- a/Mage.Sets/src/mage/cards/s/Shapeshifter.java +++ b/Mage.Sets/src/mage/cards/s/Shapeshifter.java @@ -1,9 +1,5 @@ - package mage.cards.s; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; import mage.MageInt; import mage.MageObject; import mage.abilities.Ability; @@ -22,8 +18,11 @@ import mage.game.permanent.Permanent; import mage.players.Player; import mage.util.CardUtil; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + /** - * * @author MarcoMarin / HCrescent */ public final class Shapeshifter extends CardImpl { @@ -116,8 +115,8 @@ class ShapeshifterContinuousEffect extends ContinuousEffectImpl { @Override public boolean apply(Game game, Ability source) { Permanent permanent = game.getPermanent(source.getSourceId()); - if (permanent != null) { - String lastChosen = (String) game.getState().getValue(source.getSourceId().toString() + "_Shapeshifter"); + String lastChosen = (String) game.getState().getValue(source.getSourceId().toString() + "_Shapeshifter"); + if (permanent != null && lastChosen != null) { int lastChosenNumber = Integer.parseInt(lastChosen); permanent.getPower().modifyBaseValue(lastChosenNumber); permanent.getToughness().modifyBaseValue(7 - lastChosenNumber); diff --git a/Mage.Sets/src/mage/cards/s/SlaughterGames.java b/Mage.Sets/src/mage/cards/s/SlaughterGames.java index e1cf56315e..e398dcb968 100644 --- a/Mage.Sets/src/mage/cards/s/SlaughterGames.java +++ b/Mage.Sets/src/mage/cards/s/SlaughterGames.java @@ -1,7 +1,5 @@ - package mage.cards.s; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.Effect; @@ -15,14 +13,15 @@ import mage.constants.Zone; import mage.game.Game; import mage.target.common.TargetOpponent; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class SlaughterGames extends CardImpl { public SlaughterGames(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{2}{B}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{B}{R}"); // Slaughter Games can't be countered. Effect effect = new CantBeCounteredSourceEffect(); @@ -60,6 +59,9 @@ class SlaughterGamesEffect extends SearchTargetGraveyardHandLibraryForCardNameAn @Override public boolean apply(Game game, Ability source) { String cardName = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY); + if (cardName == null) { + return false; + } return super.applySearchAndExile(game, source, cardName, targetPointer.getFirst(game, source)); } diff --git a/Mage.Sets/src/mage/cards/s/StaffOfTheLetterMagus.java b/Mage.Sets/src/mage/cards/s/StaffOfTheLetterMagus.java index b95f6f96b0..ad523d865a 100644 --- a/Mage.Sets/src/mage/cards/s/StaffOfTheLetterMagus.java +++ b/Mage.Sets/src/mage/cards/s/StaffOfTheLetterMagus.java @@ -130,7 +130,7 @@ class StaffOfTheLetterMagusEffect extends OneShotEffect { for (int i = 0; i < spellName.length(); i++) { char letter = spellName.charAt(i); String chosenLetter = (String) game.getState().getValue(mageObject.getId() + "_letter"); - if (Character.isLetter(letter) && Character.toUpperCase(letter) == chosenLetter.charAt(0)) { + if (chosenLetter != null && Character.isLetter(letter) && Character.toUpperCase(letter) == chosenLetter.charAt(0)) { lifegainValue++; } } diff --git a/Mage.Sets/src/mage/cards/s/StainTheMind.java b/Mage.Sets/src/mage/cards/s/StainTheMind.java index 509edcca9b..953b0ad71b 100644 --- a/Mage.Sets/src/mage/cards/s/StainTheMind.java +++ b/Mage.Sets/src/mage/cards/s/StainTheMind.java @@ -1,7 +1,5 @@ - package mage.cards.s; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.common.ChooseACardNameEffect; import mage.abilities.effects.common.search.SearchTargetGraveyardHandLibraryForCardNameAndExileEffect; @@ -12,14 +10,15 @@ import mage.constants.CardType; import mage.game.Game; import mage.target.TargetPlayer; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class StainTheMind extends CardImpl { public StainTheMind(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{4}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{B}"); // Convoke this.addAbility(new ConvokeAbility()); @@ -52,6 +51,9 @@ class StainTheMindEffect extends SearchTargetGraveyardHandLibraryForCardNameAndE @Override public boolean apply(Game game, Ability source) { String cardName = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY); + if (cardName == null) { + return false; + } return super.applySearchAndExile(game, source, cardName, targetPointer.getFirst(game, source)); } diff --git a/Mage.Sets/src/mage/cards/t/TwinningGlass.java b/Mage.Sets/src/mage/cards/t/TwinningGlass.java index a89d9321ba..76d0468c3b 100644 --- a/Mage.Sets/src/mage/cards/t/TwinningGlass.java +++ b/Mage.Sets/src/mage/cards/t/TwinningGlass.java @@ -1,6 +1,6 @@ package mage.cards.t; -import java.util.ArrayList; +import mage.ApprovingObject; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; @@ -12,19 +12,21 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; +import mage.filter.common.FilterNonlandCard; import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.NamePredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.stack.Spell; import mage.players.Player; +import mage.target.TargetCard; import mage.watchers.common.SpellsCastWatcher; + +import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.UUID; import java.util.stream.Collectors; -import mage.ApprovingObject; -import mage.filter.common.FilterNonlandCard; -import mage.filter.predicate.mageobject.NamePredicate; -import mage.target.TargetCard; /** * @author jeffwadsworth @@ -95,7 +97,8 @@ class TwinningGlassEffect extends OneShotEffect { } List predicates = spells.stream() .map(Spell::getName) - .filter(s -> !"".equals(s)) + .filter(Objects::nonNull) + .filter(s -> !s.isEmpty()) .map(NamePredicate::new) .collect(Collectors.toList()); FilterNonlandCard filterCard = new FilterNonlandCard("nonland card that was cast this turn"); diff --git a/Mage/src/main/java/mage/filter/predicate/mageobject/NamePredicate.java b/Mage/src/main/java/mage/filter/predicate/mageobject/NamePredicate.java index fbc763c73a..294f2d18af 100644 --- a/Mage/src/main/java/mage/filter/predicate/mageobject/NamePredicate.java +++ b/Mage/src/main/java/mage/filter/predicate/mageobject/NamePredicate.java @@ -27,6 +27,9 @@ public class NamePredicate implements Predicate { @Override public boolean apply(MageObject input, Game game) { + if (name == null) { + return false; + } // If a player names a card, the player may name either half of a split card, but not both. // A split card has the chosen name if one of its two names matches the chosen name. if (input instanceof SplitCard) { From 6787688610a3638a60400bf3b9349c14b6f72552 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Wed, 26 Aug 2020 14:20:39 +0400 Subject: [PATCH 2/3] Tests: fixed random failed test testMysteryBooster1, removed redundant logs; --- .../src/main/java/mage/server/Main.java | 1 - Mage.Sets/src/mage/sets/MysteryBooster.java | 3407 +++++++++-------- .../test/serverside/base/MageTestBase.java | 5 +- .../serverside/base/MageTestPlayerBase.java | 1 - .../mage/test/sets/BoosterGenerationTest.java | 5 +- 5 files changed, 1709 insertions(+), 1710 deletions(-) diff --git a/Mage.Server/src/main/java/mage/server/Main.java b/Mage.Server/src/main/java/mage/server/Main.java index 877e0f8e09..805239efd8 100644 --- a/Mage.Server/src/main/java/mage/server/Main.java +++ b/Mage.Server/src/main/java/mage/server/Main.java @@ -407,7 +407,6 @@ public final class Main { private static TournamentType loadTournamentType(GamePlugin plugin) { try { classLoader.addURL(new File(pluginFolder, plugin.getJar()).toURI().toURL()); - logger.debug("Loading tournament type: " + plugin.getClassName()); return (TournamentType) Class.forName(plugin.getTypeName(), true, classLoader).getConstructor().newInstance(); } catch (ClassNotFoundException ex) { logger.warn("Tournament type not found:" + plugin.getName() + " / " + plugin.getJar() + " - check plugin folder", ex); diff --git a/Mage.Sets/src/mage/sets/MysteryBooster.java b/Mage.Sets/src/mage/sets/MysteryBooster.java index cccc859a11..089538bfce 100644 --- a/Mage.Sets/src/mage/sets/MysteryBooster.java +++ b/Mage.Sets/src/mage/sets/MysteryBooster.java @@ -9,20 +9,22 @@ import mage.constants.Rarity; import mage.constants.SetType; import mage.util.RandomUtil; -import static java.util.Arrays.asList; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import static java.util.Arrays.asList; + /** * https://mtg.gamepedia.com/Mystery_Booster * https://magic.wizards.com/en/articles/archive/feature/unraveling-mystery-booster-2019-11-14 * https://scryfall.com/sets/mb1 * Print sheets used for booster construction sourced from http://www.lethe.xyz/mtg/collation/mb1.html - * + *

* This set has a very special booster layout: Each slot draws from it’s own distinct print sheet and * all cards have an equal probability. Therefore, this class implements booster construction by using 14 card lists. + * * @author TheElk801 */ public class MysteryBooster extends ExpansionSet { @@ -1743,1742 +1745,1743 @@ public class MysteryBooster extends ExpansionSet { cards.add(new SetCardInfo("Zulaport Chainmage", 830, Rarity.COMMON, mage.cards.z.ZulaportChainmage.class)); } - private void populateBoosterSlotMap() { - for(int i = 1; i < 16; ++i) + private synchronized void populateBoosterSlotMap() { + for (int i = 1; i < 16; ++i) this.possibleCardsPerBoosterSlot.put(i, new ArrayList<>()); this.populateSlot(1, asList( // White A - "Abzan Falconer", - "Abzan Runemark", - "Acrobatic Maneuver", - "Affa Protector", - "Ainok Bond-Kin", - "Alley Evasion", - "Angelic Purge", - "Angelsong", - "Apostle's Blessing", - "Arrester's Zeal", - "Artful Maneuver", - "Aura of Silence", - "Bartered Cow", - "Bonds of Faith", - "Borrowed Grace", - "Bulwark Giant", - "Caravan Escort", - "Caught in the Brights", - "Celestial Crusader", - "Celestial Flare", - "Center Soul", - "Cliffside Lookout", - "Conviction", - "Countless Gears Renegade", - "Court Street Denizen", - "Crib Swap", - "Danitha Capashen, Paragon", - "Daring Skyjek", - "Decommission", - "Defiant Strike", - "Desperate Sentry", - "Devilthorn Fox", - "Disposal Mummy", - "Divine Favor", - "Dragon's Eye Sentry", - "Dragon's Presence", - "Eddytrail Hawk", - "Enduring Victory", - "Enlightened Ascetic", - "Ephemeral Shields", - "Ephemerate", - "Excoriate", - "Expose Evil", - "Eyes in the Skies", - "Faith's Fetters", - "Feat of Resistance", - "Felidar Umbra", - "Firehoof Cavalry", - "Ghostblade Eidolon", - "Gift of Estates", - "Glaring Aegis", - "Glint-Sleeve Artisan", - "God-Pharaoh's Faithful", - "Grasp of the Hieromancer", - "Gust Walker", - "Gustcloak Skirmisher", - "Healing Hands", - "Hyena Umbra", - "Infantry Veteran", - "Inquisitor's Ox", - "Isolation Zone", - "Knight of Old Benalia", - "Knight of Sorrows", - "Kor Skyfisher", - "Leonin Relic-Warder", - "Lightform", - "Lone Missionary", - "Lonesome Unicorn", - "Lotus-Eye Mystics", - "Loxodon Partisan", - "Mardu Hordechief", - "Marked by Honor", - "Meditation Puzzle", - "Mortal's Ardor", - "Mother of Runes", - "Ninth Bridge Patrol", - "Ondu Greathorn", - "Ondu War Cleric", - "Oreskos Swiftclaw", - "Oust", - "Palace Jailer", - "Path to Exile", - "Peace of Mind", - "Prowling Caracal", - "Resurrection", - "Rhet-Crop Spearmaster", - "Righteous Cause", - "Savannah Lions", - "Searing Light", - "Serra's Embrace", - "Sheer Drop", - "Shining Aerosaur", - "Shining Armor", - "Siegecraft", - "Skymarcher Aspirant", - "Skyspear Cavalry", - "Snubhorn Sentry", - "Soul Parry", - "Soul Summons", - "Soul-Strike Technique", - "Soulmender", - "Sparring Mummy", - "Spectral Gateguards", - "Stave Off", - "Steadfast Sentinel", - "Stone Haven Medic", - "Suppression Bonds", - "Survive the Night", - "Territorial Hammerskull", - "Thraben Inspector", - "Thraben Standard Bearer", - "Topan Freeblade", - "Veteran Swordsmith", - "Village Bell-Ringer", - "Voice of the Provinces", - "Wall of One Thousand Cuts", - "Wandering Champion", - "War Behemoth", - "Windborne Charge", - "Wing Shards", - "Winged Shepherd" + "Abzan Falconer", + "Abzan Runemark", + "Acrobatic Maneuver", + "Affa Protector", + "Ainok Bond-Kin", + "Alley Evasion", + "Angelic Purge", + "Angelsong", + "Apostle's Blessing", + "Arrester's Zeal", + "Artful Maneuver", + "Aura of Silence", + "Bartered Cow", + "Bonds of Faith", + "Borrowed Grace", + "Bulwark Giant", + "Caravan Escort", + "Caught in the Brights", + "Celestial Crusader", + "Celestial Flare", + "Center Soul", + "Cliffside Lookout", + "Conviction", + "Countless Gears Renegade", + "Court Street Denizen", + "Crib Swap", + "Danitha Capashen, Paragon", + "Daring Skyjek", + "Decommission", + "Defiant Strike", + "Desperate Sentry", + "Devilthorn Fox", + "Disposal Mummy", + "Divine Favor", + "Dragon's Eye Sentry", + "Dragon's Presence", + "Eddytrail Hawk", + "Enduring Victory", + "Enlightened Ascetic", + "Ephemeral Shields", + "Ephemerate", + "Excoriate", + "Expose Evil", + "Eyes in the Skies", + "Faith's Fetters", + "Feat of Resistance", + "Felidar Umbra", + "Firehoof Cavalry", + "Ghostblade Eidolon", + "Gift of Estates", + "Glaring Aegis", + "Glint-Sleeve Artisan", + "God-Pharaoh's Faithful", + "Grasp of the Hieromancer", + "Gust Walker", + "Gustcloak Skirmisher", + "Healing Hands", + "Hyena Umbra", + "Infantry Veteran", + "Inquisitor's Ox", + "Isolation Zone", + "Knight of Old Benalia", + "Knight of Sorrows", + "Kor Skyfisher", + "Leonin Relic-Warder", + "Lightform", + "Lone Missionary", + "Lonesome Unicorn", + "Lotus-Eye Mystics", + "Loxodon Partisan", + "Mardu Hordechief", + "Marked by Honor", + "Meditation Puzzle", + "Mortal's Ardor", + "Mother of Runes", + "Ninth Bridge Patrol", + "Ondu Greathorn", + "Ondu War Cleric", + "Oreskos Swiftclaw", + "Oust", + "Palace Jailer", + "Path to Exile", + "Peace of Mind", + "Prowling Caracal", + "Resurrection", + "Rhet-Crop Spearmaster", + "Righteous Cause", + "Savannah Lions", + "Searing Light", + "Serra's Embrace", + "Sheer Drop", + "Shining Aerosaur", + "Shining Armor", + "Siegecraft", + "Skymarcher Aspirant", + "Skyspear Cavalry", + "Snubhorn Sentry", + "Soul Parry", + "Soul Summons", + "Soul-Strike Technique", + "Soulmender", + "Sparring Mummy", + "Spectral Gateguards", + "Stave Off", + "Steadfast Sentinel", + "Stone Haven Medic", + "Suppression Bonds", + "Survive the Night", + "Territorial Hammerskull", + "Thraben Inspector", + "Thraben Standard Bearer", + "Topan Freeblade", + "Veteran Swordsmith", + "Village Bell-Ringer", + "Voice of the Provinces", + "Wall of One Thousand Cuts", + "Wandering Champion", + "War Behemoth", + "Windborne Charge", + "Wing Shards", + "Winged Shepherd" )); this.populateSlot(2, asList( // White B - "Adanto Vanguard", - "Ajani's Pridemate", - "Angel of Mercy", - "Angel of Renewal", - "Angelic Gift", - "Arrest", - "Aven Battle Priest", - "Aven Sentry", - "Ballynock Cohort", - "Battle Mastery", - "Benevolent Ancestor", - "Blade Instructor", - "Blessed Spirits", - "Built to Last", - "Candlelight Vigil", - "Cartouche of Solidarity", - "Cast Out", - "Cathar's Companion", - "Champion of Arashin", - "Charge", - "Cloudshift", - "Coalition Honor Guard", - "Collar the Culprit", - "Congregate", - "Court Homunculus", - "Darksteel Mutation", - "Dauntless Cathar", - "Dawnglare Invoker", - "Disenchant", - "Dismantling Blow", - "Djeru's Renunciation", - "Djeru's Resolve", - "Doomed Traveler", - "Dragon Bell Monk", - "Emerge Unscathed", - "Encampment Keeper", - "Encircling Fissure", - "Excavation Elephant", - "Expedition Raptor", - "Exultant Skymarcher", - "Faithbearer Paladin", - "Felidar Guardian", - "Fencing Ace", - "Fiend Hunter", - "Forsake the Worldly", - "Fortify", - "Fragmentize", - "Geist of the Moors", - "Gideon's Lawkeeper", - "Gleam of Resistance", - "Gods Willing", - "Great-Horn Krushok", - "Guided Strike", - "Healer's Hawk", - "Healing Grace", - "Heavy Infantry", - "Humble", - "Inspired Charge", - "Intrusive Packbeast", - "Iona's Judgment", - "Jubilant Mascot", - "Knight of Cliffhaven", - "Knight of the Skyward Eye", - "Knight of the Tusk", - "Kor Bladewhirl", - "Kor Firewalker", - "Kor Hookmaster", - "Kor Sky Climber", - "Lieutenants of the Guard", - "Lightwalker", - "Lingering Souls", - "Looming Altisaur", - "Loyal Sentry", - "Lunarch Mantle", - "Midnight Guard", - "Momentary Blink", - "Moonlit Strider", - "Nyx-Fleece Ram", - "Pacifism", - "Palace Sentinels", - "Paladin of the Bloodstained", - "Path of Peace", - "Pegasus Courser", - "Pentarch Ward", - "Pitfall Trap", - "Pressure Point", - "Promise of Bunrei", - "Rally the Peasants", - "Raptor Companion", - "Refurbish", - "Renewed Faith", - "Retreat to Emeria", - "Reviving Dose", - "Rootborn Defenses", - "Sacred Cat", - "Sanctum Gargoyle", - "Sandstorm Charger", - "Seal of Cleansing", - "Seeker of the Way", - "Sensor Splicer", - "Seraph of the Suns", - "Serra Disciple", - "Shoulder to Shoulder", - "Silverchase Fox", - "Skyhunter Skirmisher", - "Slash of Talons", - "Soul Warden", - "Stalwart Aven", - "Star-Crowned Stag", - "Sunlance", - "Sunrise Seeker", - "Swords to Plowshares", - "Take Vengeance", - "Tandem Tactics", - "Terashi's Grasp", - "Unwavering Initiate", - "Wake the Reflections", - "Wall of Omens", - "Wild Griffin", - "Youthful Knight", - "Zealous Strike" + "Adanto Vanguard", + "Ajani's Pridemate", + "Angel of Mercy", + "Angel of Renewal", + "Angelic Gift", + "Arrest", + "Aven Battle Priest", + "Aven Sentry", + "Ballynock Cohort", + "Battle Mastery", + "Benevolent Ancestor", + "Blade Instructor", + "Blessed Spirits", + "Built to Last", + "Candlelight Vigil", + "Cartouche of Solidarity", + "Cast Out", + "Cathar's Companion", + "Champion of Arashin", + "Charge", + "Cloudshift", + "Coalition Honor Guard", + "Collar the Culprit", + "Congregate", + "Court Homunculus", + "Darksteel Mutation", + "Dauntless Cathar", + "Dawnglare Invoker", + "Disenchant", + "Dismantling Blow", + "Djeru's Renunciation", + "Djeru's Resolve", + "Doomed Traveler", + "Dragon Bell Monk", + "Emerge Unscathed", + "Encampment Keeper", + "Encircling Fissure", + "Excavation Elephant", + "Expedition Raptor", + "Exultant Skymarcher", + "Faithbearer Paladin", + "Felidar Guardian", + "Fencing Ace", + "Fiend Hunter", + "Forsake the Worldly", + "Fortify", + "Fragmentize", + "Geist of the Moors", + "Gideon's Lawkeeper", + "Gleam of Resistance", + "Gods Willing", + "Great-Horn Krushok", + "Guided Strike", + "Healer's Hawk", + "Healing Grace", + "Heavy Infantry", + "Humble", + "Inspired Charge", + "Intrusive Packbeast", + "Iona's Judgment", + "Jubilant Mascot", + "Knight of Cliffhaven", + "Knight of the Skyward Eye", + "Knight of the Tusk", + "Kor Bladewhirl", + "Kor Firewalker", + "Kor Hookmaster", + "Kor Sky Climber", + "Lieutenants of the Guard", + "Lightwalker", + "Lingering Souls", + "Looming Altisaur", + "Loyal Sentry", + "Lunarch Mantle", + "Midnight Guard", + "Momentary Blink", + "Moonlit Strider", + "Nyx-Fleece Ram", + "Pacifism", + "Palace Sentinels", + "Paladin of the Bloodstained", + "Path of Peace", + "Pegasus Courser", + "Pentarch Ward", + "Pitfall Trap", + "Pressure Point", + "Promise of Bunrei", + "Rally the Peasants", + "Raptor Companion", + "Refurbish", + "Renewed Faith", + "Retreat to Emeria", + "Reviving Dose", + "Rootborn Defenses", + "Sacred Cat", + "Sanctum Gargoyle", + "Sandstorm Charger", + "Seal of Cleansing", + "Seeker of the Way", + "Sensor Splicer", + "Seraph of the Suns", + "Serra Disciple", + "Shoulder to Shoulder", + "Silverchase Fox", + "Skyhunter Skirmisher", + "Slash of Talons", + "Soul Warden", + "Stalwart Aven", + "Star-Crowned Stag", + "Sunlance", + "Sunrise Seeker", + "Swords to Plowshares", + "Take Vengeance", + "Tandem Tactics", + "Terashi's Grasp", + "Unwavering Initiate", + "Wake the Reflections", + "Wall of Omens", + "Wild Griffin", + "Youthful Knight", + "Zealous Strike" )); this.populateSlot(3, asList( // Blue A - "Amass the Components", - "Anticipate", - "Artificer's Assistant", - "Augury Owl", - "Befuddle", - "Benthic Giant", - "Calculated Dismissal", - "Call to Heel", - "Caller of Gales", - "Cancel", - "Capture Sphere", - "Catalog", - "Chart a Course", - "Chillbringer", - "Chronostutter", - "Circular Logic", - "Clear the Mind", - "Cloak of Mists", - "Cloudkin Seer", - "Clutch of Currents", - "Compelling Argument", - "Condescend", - "Containment Membrane", - "Contingency Plan", - "Contradict", - "Crashing Tide", - "Crush Dissent", - "Curio Vendor", - "Daze", - "Decision Paralysis", - "Deep Freeze", - "Dispel", - "Displace", - "Drag Under", - "Dragon's Eye Savants", - "Dreadwaters", - "Embodiment of Spring", - "Ensoul Artifact", - "Everdream", - "Failed Inspection", - "Flashfreeze", - "Fledgling Mawcor", - "Fleeting Distraction", - "Fogwalker", - "Foil", - "Frantic Search", - "Frilled Sea Serpent", - "Gaseous Form", - "Glint", - "Gone Missing", - "Grasp of Phantoms", - "Guard Gomazoa", - "Gurmag Drowner", - "Gush", - "Hightide Hermit", - "Hinterland Drake", - "Humongulus", - "Inkfathom Divers", - "Invisibility", - "Jeering Homunculus", - "Jeskai Sage", - "Kiora's Dambreaker", - "Laboratory Brute", - "Laboratory Maniac", - "Labyrinth Guardian", - "Messenger Jays", - "Mind Sculpt", - "Mist Raven", - "Mnemonic Wall", - "Monastery Loremaster", - "Murder of Crows", - "Nagging Thoughts", - "Niblis of Dusk", - "Nine-Tail White Fox", - "Ojutai's Breath", - "Phyrexian Ingester", - "Pondering Mage", - "Predict", - "Purple-Crystal Crab", - "Refocus", - "Riftwing Cloudskate", - "River Darter", - "Sailor of Means", - "Scroll Thief", - "Send to Sleep", - "Shipwreck Looter", - "Silent Observer", - "Silvergill Adept", - "Singing Bell Strike", - "Skaab Goliath", - "Skitter Eel", - "Sleep", - "Slipstream Eel", - "Slither Blade", - "Sphinx's Tutelage", - "Stream of Thought", - "Surrakar Banisher", - "Syr Elenora, the Discerning", - "Thought Collapse", - "Thunder Drake", - "Tidal Warrior", - "Trail of Evidence", - "Treasure Cruise", - "Treasure Mage", - "Trinket Mage", - "Turn Aside", - "Uncomfortable Chill", - "Wall of Frost", - "Warden of Evos Isle", - "Watercourser", - "Weldfast Wingsmith", - "Welkin Tern", - "Wind Drake", - "Wind Strider", - "Wind-Kin Raiders", - "Windcaller Aven", - "Wishcoin Crab", - "Wishful Merfolk", - "Wretched Gryff", - "Write into Being", - "Youthful Scholar" + "Amass the Components", + "Anticipate", + "Artificer's Assistant", + "Augury Owl", + "Befuddle", + "Benthic Giant", + "Calculated Dismissal", + "Call to Heel", + "Caller of Gales", + "Cancel", + "Capture Sphere", + "Catalog", + "Chart a Course", + "Chillbringer", + "Chronostutter", + "Circular Logic", + "Clear the Mind", + "Cloak of Mists", + "Cloudkin Seer", + "Clutch of Currents", + "Compelling Argument", + "Condescend", + "Containment Membrane", + "Contingency Plan", + "Contradict", + "Crashing Tide", + "Crush Dissent", + "Curio Vendor", + "Daze", + "Decision Paralysis", + "Deep Freeze", + "Dispel", + "Displace", + "Drag Under", + "Dragon's Eye Savants", + "Dreadwaters", + "Embodiment of Spring", + "Ensoul Artifact", + "Everdream", + "Failed Inspection", + "Flashfreeze", + "Fledgling Mawcor", + "Fleeting Distraction", + "Fogwalker", + "Foil", + "Frantic Search", + "Frilled Sea Serpent", + "Gaseous Form", + "Glint", + "Gone Missing", + "Grasp of Phantoms", + "Guard Gomazoa", + "Gurmag Drowner", + "Gush", + "Hightide Hermit", + "Hinterland Drake", + "Humongulus", + "Inkfathom Divers", + "Invisibility", + "Jeering Homunculus", + "Jeskai Sage", + "Kiora's Dambreaker", + "Laboratory Brute", + "Laboratory Maniac", + "Labyrinth Guardian", + "Messenger Jays", + "Mind Sculpt", + "Mist Raven", + "Mnemonic Wall", + "Monastery Loremaster", + "Murder of Crows", + "Nagging Thoughts", + "Niblis of Dusk", + "Nine-Tail White Fox", + "Ojutai's Breath", + "Phyrexian Ingester", + "Pondering Mage", + "Predict", + "Purple-Crystal Crab", + "Refocus", + "Riftwing Cloudskate", + "River Darter", + "Sailor of Means", + "Scroll Thief", + "Send to Sleep", + "Shipwreck Looter", + "Silent Observer", + "Silvergill Adept", + "Singing Bell Strike", + "Skaab Goliath", + "Skitter Eel", + "Sleep", + "Slipstream Eel", + "Slither Blade", + "Sphinx's Tutelage", + "Stream of Thought", + "Surrakar Banisher", + "Syr Elenora, the Discerning", + "Thought Collapse", + "Thunder Drake", + "Tidal Warrior", + "Trail of Evidence", + "Treasure Cruise", + "Treasure Mage", + "Trinket Mage", + "Turn Aside", + "Uncomfortable Chill", + "Wall of Frost", + "Warden of Evos Isle", + "Watercourser", + "Weldfast Wingsmith", + "Welkin Tern", + "Wind Drake", + "Wind Strider", + "Wind-Kin Raiders", + "Windcaller Aven", + "Wishcoin Crab", + "Wishful Merfolk", + "Wretched Gryff", + "Write into Being", + "Youthful Scholar" )); this.populateSlot(4, asList( // Blue B - "Academy Journeymage", - "Aether Tradewinds", - "Aethersnipe", - "Amphin Pathmage", - "Arcane Denial", - "Archaeomancer", - "Archetype of Imagination", - "Augur of Bolas", - "Bastion Inventor", - "Bewilder", - "Blue Elemental Blast", - "Borrowing 100,000 Arrows", - "Brainstorm", - "Brilliant Spectrum", - "Brine Elemental", - "Cartouche of Knowledge", - "Castaway's Despair", - "Choking Tethers", - "Citywatch Sphinx", - "Claustrophobia", - "Cloud Elemental", - "Cloudreader Sphinx", - "Concentrate", - "Convolute", - "Coral Trickster", - "Coralhelm Guide", - "Counterspell", - "Court Hussar", - "Curiosity", - "Dazzling Lights", - "Deep Analysis", - "Diminish", - "Dirgur Nemesis", - "Distortion Strike", - "Divination", - "Doorkeeper", - "Dream Cache", - "Dream Twist", - "Eel Umbra", - "Enlightened Maniac", - "Errant Ephemeron", - "Essence Scatter", - "Exclude", - "Fact or Fiction", - "Faerie Invaders", - "Faerie Mechanist", - "Fascination", - "Fathom Seer", - "Fog Bank", - "Forbidden Alchemy", - "Frost Lynx", - "Ghost Ship", - "Glacial Crasher", - "Hieroglyphic Illumination", - "Horseshoe Crab", - "Impulse", - "Ior Ruin Expedition", - "Jace's Phantasm", - "Jwar Isle Avenger", - "Lay Claim", - "Leapfrog", - "Mahamoti Djinn", - "Man-o'-War", - "Mana Leak", - "Maximize Altitude", - "Memory Lapse", - "Merfolk Looter", - "Metallic Rebuke", - "Mulldrifter", - "Mystic of the Hidden Way", - "Mystical Teachings", - "Negate", - "Ninja of the Deep Hours", - "Ojutai Interceptor", - "Omenspeaker", - "Opportunity", - "Opt", - "Peel from Reality", - "Phantasmal Bear", - "Portent", - "Preordain", - "Prodigal Sorcerer", - "Propaganda", - "Prosperous Pirates", - "Repulse", - "Retraction Helix", - "Ringwarden Owl", - "River Serpent", - "Riverwheel Aerialists", - "Sage of Lat-Nam", - "Sea Gate Oracle", - "Sealock Monster", - "Secrets of the Golden City", - "Shaper Parasite", - "Shimmerscale Drake", - "Sigiled Starfish", - "Skittering Crustacean", - "Snap", - "Snapping Drake", - "Somber Hoverguard", - "Spire Monitor", - "Steady Progress", - "Stitched Drake", - "Storm Sculptor", - "Strategic Planning", - "Syncopate", - "Tandem Lookout", - "Temporal Fissure", - "Thornwind Faeries", - "Thought Scour", - "Thoughtcast", - "Thrummingbird", - "Tidal Wave", - "Totally Lost", - "Treasure Hunt", - "Triton Tactics", - "Vapor Snag", - "Vigean Graftmage", - "Wave-Wing Elemental", - "Whiplash Trap", - "Windrider Eel" + "Academy Journeymage", + "Aether Tradewinds", + "Aethersnipe", + "Amphin Pathmage", + "Arcane Denial", + "Archaeomancer", + "Archetype of Imagination", + "Augur of Bolas", + "Bastion Inventor", + "Bewilder", + "Blue Elemental Blast", + "Borrowing 100,000 Arrows", + "Brainstorm", + "Brilliant Spectrum", + "Brine Elemental", + "Cartouche of Knowledge", + "Castaway's Despair", + "Choking Tethers", + "Citywatch Sphinx", + "Claustrophobia", + "Cloud Elemental", + "Cloudreader Sphinx", + "Concentrate", + "Convolute", + "Coral Trickster", + "Coralhelm Guide", + "Counterspell", + "Court Hussar", + "Curiosity", + "Dazzling Lights", + "Deep Analysis", + "Diminish", + "Dirgur Nemesis", + "Distortion Strike", + "Divination", + "Doorkeeper", + "Dream Cache", + "Dream Twist", + "Eel Umbra", + "Enlightened Maniac", + "Errant Ephemeron", + "Essence Scatter", + "Exclude", + "Fact or Fiction", + "Faerie Invaders", + "Faerie Mechanist", + "Fascination", + "Fathom Seer", + "Fog Bank", + "Forbidden Alchemy", + "Frost Lynx", + "Ghost Ship", + "Glacial Crasher", + "Hieroglyphic Illumination", + "Horseshoe Crab", + "Impulse", + "Ior Ruin Expedition", + "Jace's Phantasm", + "Jwar Isle Avenger", + "Lay Claim", + "Leapfrog", + "Mahamoti Djinn", + "Man-o'-War", + "Mana Leak", + "Maximize Altitude", + "Memory Lapse", + "Merfolk Looter", + "Metallic Rebuke", + "Mulldrifter", + "Mystic of the Hidden Way", + "Mystical Teachings", + "Negate", + "Ninja of the Deep Hours", + "Ojutai Interceptor", + "Omenspeaker", + "Opportunity", + "Opt", + "Peel from Reality", + "Phantasmal Bear", + "Portent", + "Preordain", + "Prodigal Sorcerer", + "Propaganda", + "Prosperous Pirates", + "Repulse", + "Retraction Helix", + "Ringwarden Owl", + "River Serpent", + "Riverwheel Aerialists", + "Sage of Lat-Nam", + "Sea Gate Oracle", + "Sealock Monster", + "Secrets of the Golden City", + "Shaper Parasite", + "Shimmerscale Drake", + "Sigiled Starfish", + "Skittering Crustacean", + "Snap", + "Snapping Drake", + "Somber Hoverguard", + "Spire Monitor", + "Steady Progress", + "Stitched Drake", + "Storm Sculptor", + "Strategic Planning", + "Syncopate", + "Tandem Lookout", + "Temporal Fissure", + "Thornwind Faeries", + "Thought Scour", + "Thoughtcast", + "Thrummingbird", + "Tidal Wave", + "Totally Lost", + "Treasure Hunt", + "Triton Tactics", + "Vapor Snag", + "Vigean Graftmage", + "Wave-Wing Elemental", + "Whiplash Trap", + "Windrider Eel" )); this.populateSlot(5, asList( // Black A - "Aid the Fallen", - "Alesha's Vanguard", - "Alley Strangler", - "Ambitious Aetherborn", - "Ancestral Vengeance", - "Annihilate", - "Bala Ged Scorpion", - "Bitter Revelation", - "Bladebrand", - "Blighted Bat", - "Blistergrub", - "Bone Splinters", - "Boon of Emrakul", - "Breeding Pit", - "Butcher's Glee", - "Cabal Therapy", - "Cackling Imp", - "Cadaver Imp", - "Catacomb Slug", - "Certain Death", - "Coat with Venom", - "Corpsehatch", - "Covenant of Blood", - "Crow of Dark Tidings", - "Dark Dabbling", - "Dark Withering", - "Darkblast", - "Dead Reveler", - "Deadeye Tormentor", - "Defeat", - "Demon's Grasp", - "Demonic Tutor", - "Demonic Vigor", - "Dismember", - "Disowned Ancestor", - "Doomed Dissenter", - "Douse in Gloom", - "Dread Return", - "Dregscape Zombie", - "Dukhara Scavenger", - "Dune Beetle", - "Duress", - "Farbog Revenant", - "Fetid Imp", - "First-Sphere Gargantua", - "Flesh to Dust", - "Fretwork Colony", - "Genju of the Fens", - "Ghoulcaller's Accomplice", - "Grasping Scoundrel", - "Gravepurge", - "Grim Discovery", - "Hideous End", - "Induce Despair", - "Infernal Scarring", - "Infest", - "Instill Infection", - "Kalastria Nightwatch", - "Krumar Bond-Kin", - "Lazotep Behemoth", - "Macabre Waltz", - "Marauding Boneslasher", - "Mark of the Vampire", - "Marsh Hulk", - "Merciless Resolve", - "Miasmic Mummy", - "Mind Rake", - "Mire's Malice", - "Murder", - "Murderous Compulsion", - "Nantuko Husk", - "Never Happened", - "Nirkana Assassin", - "Plaguecrafter", - "Prowling Pangolin", - "Rakshasa's Secret", - "Read the Bones", - "Reaper of Night", - "Reassembling Skeleton", - "Reckless Imp", - "Reckless Spite", - "Returned Centaur", - "Revenant", - "Rite of the Serpent", - "Ruin Rat", - "Scrounger of Souls", - "Sengir Vampire", - "Shambling Attendants", - "Shambling Goblin", - "Shriekmaw", - "Silumgar Butcher", - "Skeleton Archer", - "Stab Wound", - "Stallion of Ashmouth", - "Stinkweed Imp", - "Stromkirk Patrol", - "Subtle Strike", - "Sultai Runemark", - "Tar Snare", - "Thallid Omnivore", - "The Eldest Reborn", - "Thornbow Archer", - "Thraben Foulbloods", - "Torment of Venom", - "Touch of Moonglove", - "Twins of Maurer Estate", - "Undercity's Embrace", - "Untamed Hunger", - "Unyielding Krumar", - "Vampire Champion", - "Vampire Envoy", - "Vampire Nighthawk", - "Vessel of Malignity", - "Voracious Null", - "Vraska's Finisher", - "Walk the Plank", - "Warteye Witch", - "Weight of the Underworld", - "Weirded Vampire", - "Yargle, Glutton of Urborg", - "Zulaport Chainmage" + "Aid the Fallen", + "Alesha's Vanguard", + "Alley Strangler", + "Ambitious Aetherborn", + "Ancestral Vengeance", + "Annihilate", + "Bala Ged Scorpion", + "Bitter Revelation", + "Bladebrand", + "Blighted Bat", + "Blistergrub", + "Bone Splinters", + "Boon of Emrakul", + "Breeding Pit", + "Butcher's Glee", + "Cabal Therapy", + "Cackling Imp", + "Cadaver Imp", + "Catacomb Slug", + "Certain Death", + "Coat with Venom", + "Corpsehatch", + "Covenant of Blood", + "Crow of Dark Tidings", + "Dark Dabbling", + "Dark Withering", + "Darkblast", + "Dead Reveler", + "Deadeye Tormentor", + "Defeat", + "Demon's Grasp", + "Demonic Tutor", + "Demonic Vigor", + "Dismember", + "Disowned Ancestor", + "Doomed Dissenter", + "Douse in Gloom", + "Dread Return", + "Dregscape Zombie", + "Dukhara Scavenger", + "Dune Beetle", + "Duress", + "Farbog Revenant", + "Fetid Imp", + "First-Sphere Gargantua", + "Flesh to Dust", + "Fretwork Colony", + "Genju of the Fens", + "Ghoulcaller's Accomplice", + "Grasping Scoundrel", + "Gravepurge", + "Grim Discovery", + "Hideous End", + "Induce Despair", + "Infernal Scarring", + "Infest", + "Instill Infection", + "Kalastria Nightwatch", + "Krumar Bond-Kin", + "Lazotep Behemoth", + "Macabre Waltz", + "Marauding Boneslasher", + "Mark of the Vampire", + "Marsh Hulk", + "Merciless Resolve", + "Miasmic Mummy", + "Mind Rake", + "Mire's Malice", + "Murder", + "Murderous Compulsion", + "Nantuko Husk", + "Never Happened", + "Nirkana Assassin", + "Plaguecrafter", + "Prowling Pangolin", + "Rakshasa's Secret", + "Read the Bones", + "Reaper of Night", + "Reassembling Skeleton", + "Reckless Imp", + "Reckless Spite", + "Returned Centaur", + "Revenant", + "Rite of the Serpent", + "Ruin Rat", + "Scrounger of Souls", + "Sengir Vampire", + "Shambling Attendants", + "Shambling Goblin", + "Shriekmaw", + "Silumgar Butcher", + "Skeleton Archer", + "Stab Wound", + "Stallion of Ashmouth", + "Stinkweed Imp", + "Stromkirk Patrol", + "Subtle Strike", + "Sultai Runemark", + "Tar Snare", + "Thallid Omnivore", + "The Eldest Reborn", + "Thornbow Archer", + "Thraben Foulbloods", + "Torment of Venom", + "Touch of Moonglove", + "Twins of Maurer Estate", + "Undercity's Embrace", + "Untamed Hunger", + "Unyielding Krumar", + "Vampire Champion", + "Vampire Envoy", + "Vampire Nighthawk", + "Vessel of Malignity", + "Voracious Null", + "Vraska's Finisher", + "Walk the Plank", + "Warteye Witch", + "Weight of the Underworld", + "Weirded Vampire", + "Yargle, Glutton of Urborg", + "Zulaport Chainmage" )); this.populateSlot(6, asList( // Black B - "Absorb Vis", - "Accursed Spirit", - "Altar's Reap", - "Animate Dead", - "Baleful Ammit", - "Balustrade Spy", - "Bartizan Bats", - "Black Cat", - "Blessing of Belzenlok", - "Blightsoil Druid", - "Blood Artist", - "Bloodrite Invoker", - "Caligo Skin-Witch", - "Carrion Feeder", - "Carrion Imp", - "Catacomb Crocodile", - "Caustic Tar", - "Child of Night", - "Costly Plunder", - "Cower in Fear", - "Crippling Blight", - "Cursed Minotaur", - "Daring Demolition", - "Dark Ritual", - "Deadbridge Shaman", - "Death Denied", - "Desperate Castaways", - "Diabolic Edict", - "Die Young", - "Dinosaur Hunter", - "Dirge of Dread", - "Dread Drone", - "Dreadbringer Lampads", - "Driver of the Dead", - "Drudge Sentinel", - "Dusk Charger", - "Dusk Legion Zealot", - "Epicure of Blood", - "Erg Raiders", - "Eternal Thirst", - "Evincar's Justice", - "Executioner's Capsule", - "Eyeblight's Ending", - "Fallen Angel", - "Fatal Push", - "Fen Hauler", - "Feral Abomination", - "Festercreep", - "Festering Newt", - "Fill with Fright", - "Fungal Infection", - "Ghostly Changeling", - "Gifted Aetherborn", - "Go for the Throat", - "Gravedigger", - "Gray Merchant of Asphodel", - "Grim Affliction", - "Grixis Slavedriver", - "Grotesque Mutation", - "Gruesome Fate", - "Gurmag Angler", - "Hired Blade", - "Hound of the Farbogs", - "Innocent Blood", - "Inquisition of Kozilek", - "Lawless Broker", - "Lethal Sting", - "Lord of the Accursed", - "March of the Drowned", - "Mephitic Vapors", - "Mind Rot", - "Moment of Craving", - "Nameless Inversion", - "Night's Whisper", - "Noxious Dragon", - "Okiba-Gang Shinobi", - "Painful Lesson", - "Phyrexian Rager", - "Phyrexian Reclamation", - "Pit Keeper", - "Plague Wight", - "Plagued Rusalka", - "Prakhata Club Security", - "Queen's Agent", - "Quest for the Gravelord", - "Rabid Bloodsucker", - "Rakdos Drake", - "Ravenous Chupacabra", - "Recover", - "Renegade Demon", - "Renegade's Getaway", - "Rotfeaster Maggot", - "Scarab Feast", - "Scuttling Death", - "Seal of Doom", - "Shadowcloak Vampire", - "Skeletal Scrying", - "Skulking Ghost", - "Smiting Helix", - "Spreading Rot", - "Street Wraith", - "Tavern Swindler", - "Tendrils of Corruption", - "Thorn of the Black Rose", - "Tidy Conclusion", - "Tragic Slip", - "Trespasser's Curse", - "Trial of Ambition", - "Typhoid Rats", - "Unburden", - "Urborg Uprising", - "Vampire Hexmage", - "Vampire Lacerator", - "Virulent Swipe", - "Wake of Vultures", - "Walking Corpse", - "Wander in Death", - "Wight of Precinct Six", - "Will-o'-the-Wisp", - "Windgrace Acolyte", - "Wrench Mind" + "Absorb Vis", + "Accursed Spirit", + "Altar's Reap", + "Animate Dead", + "Baleful Ammit", + "Balustrade Spy", + "Bartizan Bats", + "Black Cat", + "Blessing of Belzenlok", + "Blightsoil Druid", + "Blood Artist", + "Bloodrite Invoker", + "Caligo Skin-Witch", + "Carrion Feeder", + "Carrion Imp", + "Catacomb Crocodile", + "Caustic Tar", + "Child of Night", + "Costly Plunder", + "Cower in Fear", + "Crippling Blight", + "Cursed Minotaur", + "Daring Demolition", + "Dark Ritual", + "Deadbridge Shaman", + "Death Denied", + "Desperate Castaways", + "Diabolic Edict", + "Die Young", + "Dinosaur Hunter", + "Dirge of Dread", + "Dread Drone", + "Dreadbringer Lampads", + "Driver of the Dead", + "Drudge Sentinel", + "Dusk Charger", + "Dusk Legion Zealot", + "Epicure of Blood", + "Erg Raiders", + "Eternal Thirst", + "Evincar's Justice", + "Executioner's Capsule", + "Eyeblight's Ending", + "Fallen Angel", + "Fatal Push", + "Fen Hauler", + "Feral Abomination", + "Festercreep", + "Festering Newt", + "Fill with Fright", + "Fungal Infection", + "Ghostly Changeling", + "Gifted Aetherborn", + "Go for the Throat", + "Gravedigger", + "Gray Merchant of Asphodel", + "Grim Affliction", + "Grixis Slavedriver", + "Grotesque Mutation", + "Gruesome Fate", + "Gurmag Angler", + "Hired Blade", + "Hound of the Farbogs", + "Innocent Blood", + "Inquisition of Kozilek", + "Lawless Broker", + "Lethal Sting", + "Lord of the Accursed", + "March of the Drowned", + "Mephitic Vapors", + "Mind Rot", + "Moment of Craving", + "Nameless Inversion", + "Night's Whisper", + "Noxious Dragon", + "Okiba-Gang Shinobi", + "Painful Lesson", + "Phyrexian Rager", + "Phyrexian Reclamation", + "Pit Keeper", + "Plague Wight", + "Plagued Rusalka", + "Prakhata Club Security", + "Queen's Agent", + "Quest for the Gravelord", + "Rabid Bloodsucker", + "Rakdos Drake", + "Ravenous Chupacabra", + "Recover", + "Renegade Demon", + "Renegade's Getaway", + "Rotfeaster Maggot", + "Scarab Feast", + "Scuttling Death", + "Seal of Doom", + "Shadowcloak Vampire", + "Skeletal Scrying", + "Skulking Ghost", + "Smiting Helix", + "Spreading Rot", + "Street Wraith", + "Tavern Swindler", + "Tendrils of Corruption", + "Thorn of the Black Rose", + "Tidy Conclusion", + "Tragic Slip", + "Trespasser's Curse", + "Trial of Ambition", + "Typhoid Rats", + "Unburden", + "Urborg Uprising", + "Vampire Hexmage", + "Vampire Lacerator", + "Virulent Swipe", + "Wake of Vultures", + "Walking Corpse", + "Wander in Death", + "Wight of Precinct Six", + "Will-o'-the-Wisp", + "Windgrace Acolyte", + "Wrench Mind" )); this.populateSlot(7, asList( // Red A - "Act on Impulse", - "Ainok Tracker", - "Alchemist's Greeting", - "Ancient Grudge", - "Arc Trail", - "Arrow Storm", - "Azra Bladeseeker", - "Balduvian Horde", - "Barrage of Boulders", - "Beetleback Chief", - "Bellows Lizard", - "Blastfire Bolt", - "Blazing Volley", - "Blindblast", - "Blood Ogre", - "Bloodfire Expert", - "Bloodlust Inciter", - "Bloodstone Goblin", - "Blow Your House Down", - "Bombard", - "Bomber Corps", - "Borrowed Hostility", - "Brazen Buccaneers", - "Brazen Wolves", - "Bring Low", - "Brute Strength", - "Built to Smash", - "Burst Lightning", - "Canyon Lurkers", - "Chandra's Pyrohelix", - "Charging Monstrosaur", - "Cobblebrute", - "Crowd's Favor", - "Crown-Hunter Hireling", - "Curse of Opulence", - "Destructive Tampering", - "Direct Current", - "Dragon Fodder", - "Dynacharge", - "Erratic Explosion", - "Expedite", - "Falkenrath Reaver", - "Fireball", - "Flame Jab", - "Forge Devil", - "Foundry Street Denizen", - "Frontline Rebel", - "Furnace Whelp", - "Galvanic Blast", - "Generator Servant", - "Geomancer's Gambit", - "Ghitu Lavarunner", - "Giant Spectacle", - "Goblin Assault", - "Goblin Bombardment", - "Goblin Fireslinger", - "Goblin Matron", - "Goblin Roughrider", - "Goblin War Paint", - "Gore Swine", - "Gorehorn Minotaurs", - "Granitic Titan", - "Grapeshot", - "Gravitic Punch", - "Guttersnipe", - "Hammerhand", - "Hardened Berserker", - "Hyena Pack", - "Ill-Tempered Cyclops", - "Impact Tremors", - "Incorrigible Youths", - "Inferno Fist", - "Inferno Jet", - "Ingot Chewer", - "Keldon Halberdier", - "Kiln Fiend", - "Krenko's Enforcer", - "Leaping Master", - "Leopard-Spotted Jiao", - "Madcap Skills", - "Mardu Warshrieker", - "Maximize Velocity", - "Miner's Bane", - "Mogg Flunkies", - "Molten Rain", - "Monastery Swiftspear", - "Ondu Champion", - "Outnumber", - "Price of Progress", - "Pyrotechnics", - "Quakefoot Cyclops", - "Reckless Fireweaver", - "Reckless Wurm", - "Rivals' Duel", - "Ruinous Gremlin", - "Samut's Sprint", - "Sarkhan's Rage", - "Screamreach Brawler", - "Seismic Shift", - "Shattering Spree", - "Shenanigans", - "Smelt", - "Sparkmage Apprentice", - "Sparkspitter", - "Staggershock", - "Stormblood Berserker", - "Swift Kick", - "Tectonic Rift", - "Temur Battle Rage", - "Thrill of Possibility", - "Tibalt's Rager", - "Torch Courier", - "Valakut Invoker", - "Valakut Predator", - "Valley Dasher", - "Vandalize", - "Volcanic Dragon", - "Volcanic Rush", - "Wall of Fire", - "Wayward Giant", - "Wojek Bodyguard" + "Act on Impulse", + "Ainok Tracker", + "Alchemist's Greeting", + "Ancient Grudge", + "Arc Trail", + "Arrow Storm", + "Azra Bladeseeker", + "Balduvian Horde", + "Barrage of Boulders", + "Beetleback Chief", + "Bellows Lizard", + "Blastfire Bolt", + "Blazing Volley", + "Blindblast", + "Blood Ogre", + "Bloodfire Expert", + "Bloodlust Inciter", + "Bloodstone Goblin", + "Blow Your House Down", + "Bombard", + "Bomber Corps", + "Borrowed Hostility", + "Brazen Buccaneers", + "Brazen Wolves", + "Bring Low", + "Brute Strength", + "Built to Smash", + "Burst Lightning", + "Canyon Lurkers", + "Chandra's Pyrohelix", + "Charging Monstrosaur", + "Cobblebrute", + "Crowd's Favor", + "Crown-Hunter Hireling", + "Curse of Opulence", + "Destructive Tampering", + "Direct Current", + "Dragon Fodder", + "Dynacharge", + "Erratic Explosion", + "Expedite", + "Falkenrath Reaver", + "Fireball", + "Flame Jab", + "Forge Devil", + "Foundry Street Denizen", + "Frontline Rebel", + "Furnace Whelp", + "Galvanic Blast", + "Generator Servant", + "Geomancer's Gambit", + "Ghitu Lavarunner", + "Giant Spectacle", + "Goblin Assault", + "Goblin Bombardment", + "Goblin Fireslinger", + "Goblin Matron", + "Goblin Roughrider", + "Goblin War Paint", + "Gore Swine", + "Gorehorn Minotaurs", + "Granitic Titan", + "Grapeshot", + "Gravitic Punch", + "Guttersnipe", + "Hammerhand", + "Hardened Berserker", + "Hyena Pack", + "Ill-Tempered Cyclops", + "Impact Tremors", + "Incorrigible Youths", + "Inferno Fist", + "Inferno Jet", + "Ingot Chewer", + "Keldon Halberdier", + "Kiln Fiend", + "Krenko's Enforcer", + "Leaping Master", + "Leopard-Spotted Jiao", + "Madcap Skills", + "Mardu Warshrieker", + "Maximize Velocity", + "Miner's Bane", + "Mogg Flunkies", + "Molten Rain", + "Monastery Swiftspear", + "Ondu Champion", + "Outnumber", + "Price of Progress", + "Pyrotechnics", + "Quakefoot Cyclops", + "Reckless Fireweaver", + "Reckless Wurm", + "Rivals' Duel", + "Ruinous Gremlin", + "Samut's Sprint", + "Sarkhan's Rage", + "Screamreach Brawler", + "Seismic Shift", + "Shattering Spree", + "Shenanigans", + "Smelt", + "Sparkmage Apprentice", + "Sparkspitter", + "Staggershock", + "Stormblood Berserker", + "Swift Kick", + "Tectonic Rift", + "Temur Battle Rage", + "Thrill of Possibility", + "Tibalt's Rager", + "Torch Courier", + "Valakut Invoker", + "Valakut Predator", + "Valley Dasher", + "Vandalize", + "Volcanic Dragon", + "Volcanic Rush", + "Wall of Fire", + "Wayward Giant", + "Wojek Bodyguard" )); this.populateSlot(8, asList( // Red B - "Act of Treason", - "Ahn-Crop Crasher", - "Akroan Sergeant", - "Anger", - "Atarka Efreet", - "Avarax", - "Barging Sergeant", - "Battle Rampart", - "Battle-Rattle Shaman", - "Blades of Velis Vel", - "Bloodmad Vampire", - "Blur of Blades", - "Boggart Brute", - "Boiling Earth", - "Boulder Salvo", - "Browbeat", - "Cartouche of Zeal", - "Cathartic Reunion", - "Chandra's Revolution", - "Chartooth Cougar", - "Cinder Hellion", - "Cleansing Screech", - "Cosmotronic Wave", - "Crash Through", - "Curse of the Nightly Hunt", - "Death by Dragons", - "Defiant Ogre", - "Demolish", - "Desert Cerodon", - "Desperate Ravings", - "Distemper of the Blood", - "Dragon Breath", - "Dragon Egg", - "Dragon Whelp", - "Dragonsoul Knight", - "Dual Shot", - "Earth Elemental", - "Emrakul's Hatcher", - "Enthralling Victor", - "Faithless Looting", - "Fall of the Hammer", - "Fervent Strike", - "Fierce Invocation", - "Fiery Hellhound", - "Fiery Temper", - "Fire Elemental", - "Firebolt", - "Firebrand Archer", - "Flametongue Kavu", - "Flamewave Invoker", - "Fling", - "Frenzied Raptor", - "Frilled Deathspitter", - "Frontline Devastator", - "Fury Charm", - "Genju of the Spires", - "Goblin Balloon Brigade", - "Goblin Locksmith", - "Goblin Motivator", - "Goblin Oriflamme", - "Goblin Warchief", - "Gut Shot", - "Hanweir Lancer", - "Hijack", - "Hulking Devil", - "Insolent Neonate", - "Jackal Pup", - "Keldon Overseer", - "Khenra Scrapper", - "Kird Ape", - "Kolaghan Stormsinger", - "Krenko's Command", - "Lightning Bolt", - "Lightning Javelin", - "Lightning Shrieker", - "Lightning Talons", - "Magma Spray", - "Makindi Sliderunner", - "Mark of Mutiny", - "Mogg Fanatic", - "Mogg War Marshal", - "Mutiny", - "Nimble-Blade Khenra", - "Orcish Cannonade", - "Orcish Oriflamme", - "Pillage", - "Prickleboar", - "Prophetic Ravings", - "Rampaging Cyclops", - "Renegade Tactics", - "Roast", - "Rolling Thunder", - "Rubblebelt Maaka", - "Rummaging Goblin", - "Run Amok", - "Rush of Adrenaline", - "Salivating Gremlins", - "Seismic Stomp", - "Shatter", - "Shock", - "Skirk Commando", - "Skirk Prospector", - "Smash to Smithereens", - "Sparktongue Dragon", - "Spikeshot Goblin", - "Sulfurous Blast", - "Summit Prowler", - "Sun-Crowned Hunters", - "Swashbuckling", - "Sweatworks Brawler", - "Tarfire", - "Thresher Lizard", - "Uncaged Fury", - "Undying Rage", - "Vent Sentinel", - "Vessel of Volatility", - "Voldaren Duelist", - "Wildfire Emissary", - "Young Pyromancer", - "Zada's Commando", - "Zealot of the God-Pharaoh" + "Act of Treason", + "Ahn-Crop Crasher", + "Akroan Sergeant", + "Anger", + "Atarka Efreet", + "Avarax", + "Barging Sergeant", + "Battle Rampart", + "Battle-Rattle Shaman", + "Blades of Velis Vel", + "Bloodmad Vampire", + "Blur of Blades", + "Boggart Brute", + "Boiling Earth", + "Boulder Salvo", + "Browbeat", + "Cartouche of Zeal", + "Cathartic Reunion", + "Chandra's Revolution", + "Chartooth Cougar", + "Cinder Hellion", + "Cleansing Screech", + "Cosmotronic Wave", + "Crash Through", + "Curse of the Nightly Hunt", + "Death by Dragons", + "Defiant Ogre", + "Demolish", + "Desert Cerodon", + "Desperate Ravings", + "Distemper of the Blood", + "Dragon Breath", + "Dragon Egg", + "Dragon Whelp", + "Dragonsoul Knight", + "Dual Shot", + "Earth Elemental", + "Emrakul's Hatcher", + "Enthralling Victor", + "Faithless Looting", + "Fall of the Hammer", + "Fervent Strike", + "Fierce Invocation", + "Fiery Hellhound", + "Fiery Temper", + "Fire Elemental", + "Firebolt", + "Firebrand Archer", + "Flametongue Kavu", + "Flamewave Invoker", + "Fling", + "Frenzied Raptor", + "Frilled Deathspitter", + "Frontline Devastator", + "Fury Charm", + "Genju of the Spires", + "Goblin Balloon Brigade", + "Goblin Locksmith", + "Goblin Motivator", + "Goblin Oriflamme", + "Goblin Warchief", + "Gut Shot", + "Hanweir Lancer", + "Hijack", + "Hulking Devil", + "Insolent Neonate", + "Jackal Pup", + "Keldon Overseer", + "Khenra Scrapper", + "Kird Ape", + "Kolaghan Stormsinger", + "Krenko's Command", + "Lightning Bolt", + "Lightning Javelin", + "Lightning Shrieker", + "Lightning Talons", + "Magma Spray", + "Makindi Sliderunner", + "Mark of Mutiny", + "Mogg Fanatic", + "Mogg War Marshal", + "Mutiny", + "Nimble-Blade Khenra", + "Orcish Cannonade", + "Orcish Oriflamme", + "Pillage", + "Prickleboar", + "Prophetic Ravings", + "Rampaging Cyclops", + "Renegade Tactics", + "Roast", + "Rolling Thunder", + "Rubblebelt Maaka", + "Rummaging Goblin", + "Run Amok", + "Rush of Adrenaline", + "Salivating Gremlins", + "Seismic Stomp", + "Shatter", + "Shock", + "Skirk Commando", + "Skirk Prospector", + "Smash to Smithereens", + "Sparktongue Dragon", + "Spikeshot Goblin", + "Sulfurous Blast", + "Summit Prowler", + "Sun-Crowned Hunters", + "Swashbuckling", + "Sweatworks Brawler", + "Tarfire", + "Thresher Lizard", + "Uncaged Fury", + "Undying Rage", + "Vent Sentinel", + "Vessel of Volatility", + "Voldaren Duelist", + "Wildfire Emissary", + "Young Pyromancer", + "Zada's Commando", + "Zealot of the God-Pharaoh" )); this.populateSlot(9, asList( // Green A - "Affectionate Indrik", - "Ancestral Mask", - "Ancient Brontodon", - "Arbor Armament", - "Beastbreaker of Bala Ged", - "Become Immense", - "Blanchwood Armor", - "Blastoderm", - "Borderland Explorer", - "Briarhorn", - "Broodhunter Wurm", - "Byway Courier", - "Centaur Courser", - "Creeping Mold", - "Destructor Dragon", - "Domesticated Hydra", - "Dragon-Scarred Bear", - "Elemental Uprising", - "Elvish Fury", - "Eternal Witness", - "Feral Prowler", - "Fierce Empath", - "Frontier Mastodon", - "Gaea's Blessing", - "Gaea's Protector", - "Gift of Growth", - "Glade Watcher", - "Grapple with the Past", - "Greater Basilisk", - "Greater Sandwurm", - "Hamlet Captain", - "Hooded Brawler", - "Hooting Mandrills", - "Jungle Delver", - "Jungle Wayfinder", - "Kin-Tree Warden", - "Kraul Foragers", - "Krosan Druid", - "Lead by Example", - "Lead the Stampede", - "Lifespring Druid", - "Lignify", - "Llanowar Elves", - "Llanowar Empath", - "Lure", - "Mantle of Webs", - "Map the Wastes", - "Mulch", - "Natural Connection", - "Naturalize", - "Nature's Lore", - "Nest Invader", - "Nettle Sentinel", - "New Horizons", - "Nimble Mongoose", - "Ondu Giant", - "Oran-Rief Invoker", - "Overgrown Armasaur", - "Pack's Favor", - "Penumbra Spider", - "Pierce the Sky", - "Plummet", - "Prey Upon", - "Prey's Vengeance", - "Pulse of Murasa", - "Quiet Disrepair", - "Rampant Growth", - "Ranger's Guile", - "Ravenous Leucrocota", - "Reclaim", - "Revive", - "Rhox Maulers", - "Riparian Tiger", - "Roar of the Wurm", - "Root Out", - "Rosethorn Halberd", - "Runeclaw Bear", - "Sagu Archer", - "Sakura-Tribe Elder", - "Saproling Migration", - "Savage Punch", - "Seal of Strength", - "Search for Tomorrow", - "Seek the Horizon", - "Seek the Wilds", - "Shape the Sands", - "Siege Wurm", - "Silhana Ledgewalker", - "Silkweaver Elite", - "Snake Umbra", - "Snapping Sailback", - "Spider Spawning", - "Stoic Builder", - "Strength in Numbers", - "Sylvan Bounty", - "Tajuru Pathwarden", - "Take Down", - "Talons of Wildwood", - "Territorial Baloth", - "Thornhide Wolves", - "Thornweald Archer", - "Thrive", - "Timberwatch Elf", - "Time to Feed", - "Titanic Growth", - "Tukatongue Thallid", - "Turntimber Basilisk", - "Vastwood Gorger", - "Watcher in the Web", - "Wellwisher", - "Wild Growth", - "Wild Mongrel", - "Wildsize", - "Wolfkin Bond", - "Woodborn Behemoth", - "Woolly Loxodon", - "Wren's Run Vanquisher", - "Yavimaya Elder", - "Yavimaya Sapherd", - "Yeva's Forcemage", - "Zendikar's Roil" + "Affectionate Indrik", + "Ancestral Mask", + "Ancient Brontodon", + "Arbor Armament", + "Beastbreaker of Bala Ged", + "Become Immense", + "Blanchwood Armor", + "Blastoderm", + "Borderland Explorer", + "Briarhorn", + "Broodhunter Wurm", + "Byway Courier", + "Centaur Courser", + "Creeping Mold", + "Destructor Dragon", + "Domesticated Hydra", + "Dragon-Scarred Bear", + "Elemental Uprising", + "Elvish Fury", + "Eternal Witness", + "Feral Prowler", + "Fierce Empath", + "Frontier Mastodon", + "Gaea's Blessing", + "Gaea's Protector", + "Gift of Growth", + "Glade Watcher", + "Grapple with the Past", + "Greater Basilisk", + "Greater Sandwurm", + "Hamlet Captain", + "Hooded Brawler", + "Hooting Mandrills", + "Jungle Delver", + "Jungle Wayfinder", + "Kin-Tree Warden", + "Kraul Foragers", + "Krosan Druid", + "Lead by Example", + "Lead the Stampede", + "Lifespring Druid", + "Lignify", + "Llanowar Elves", + "Llanowar Empath", + "Lure", + "Mantle of Webs", + "Map the Wastes", + "Mulch", + "Natural Connection", + "Naturalize", + "Nature's Lore", + "Nest Invader", + "Nettle Sentinel", + "New Horizons", + "Nimble Mongoose", + "Ondu Giant", + "Oran-Rief Invoker", + "Overgrown Armasaur", + "Pack's Favor", + "Penumbra Spider", + "Pierce the Sky", + "Plummet", + "Prey Upon", + "Prey's Vengeance", + "Pulse of Murasa", + "Quiet Disrepair", + "Rampant Growth", + "Ranger's Guile", + "Ravenous Leucrocota", + "Reclaim", + "Revive", + "Rhox Maulers", + "Riparian Tiger", + "Roar of the Wurm", + "Root Out", + "Rosethorn Halberd", + "Runeclaw Bear", + "Sagu Archer", + "Sakura-Tribe Elder", + "Saproling Migration", + "Savage Punch", + "Seal of Strength", + "Search for Tomorrow", + "Seek the Horizon", + "Seek the Wilds", + "Shape the Sands", + "Siege Wurm", + "Silhana Ledgewalker", + "Silkweaver Elite", + "Snake Umbra", + "Snapping Sailback", + "Spider Spawning", + "Stoic Builder", + "Strength in Numbers", + "Sylvan Bounty", + "Tajuru Pathwarden", + "Take Down", + "Talons of Wildwood", + "Territorial Baloth", + "Thornhide Wolves", + "Thornweald Archer", + "Thrive", + "Timberwatch Elf", + "Time to Feed", + "Titanic Growth", + "Tukatongue Thallid", + "Turntimber Basilisk", + "Vastwood Gorger", + "Watcher in the Web", + "Wellwisher", + "Wild Growth", + "Wild Mongrel", + "Wildsize", + "Wolfkin Bond", + "Woodborn Behemoth", + "Woolly Loxodon", + "Wren's Run Vanquisher", + "Yavimaya Elder", + "Yavimaya Sapherd", + "Yeva's Forcemage", + "Zendikar's Roil" )); this.populateSlot(10, asList( // Green B - "Abundant Growth", - "Acidic Slime", - "Adventurous Impulse", - "Aerie Bowmasters", - "Aggressive Instinct", - "Aggressive Urge", - "Ainok Survivalist", - "Alpine Grizzly", - "Ambassador Oak", - "Ancient Stirrings", - "Arachnus Web", - "Arbor Elf", - "Aura Gnarlid", - "Avacyn's Pilgrim", - "Backwoods Survivalists", - "Baloth Gorger", - "Basking Rootwalla", - "Beast Within", - "Beneath the Sands", - "Bestial Menace", - "Bitterblade Warrior", - "Bitterbow Sharpshooters", - "Blossom Dryad", - "Borderland Ranger", - "Bristling Boar", - "Broken Bond", - "Canopy Spider", - "Carnivorous Moss-Beast", - "Caustic Caterpillar", - "Charging Rhino", - "Citanul Woodreaders", - "Clip Wings", - "Colossal Dreadmaw", - "Combo Attack", - "Commune with Nature", - "Commune with the Gods", - "Conifer Strider", - "Crop Rotation", - "Crossroads Consecrator", - "Crowned Ceratok", - "Crushing Canopy", - "Cultivate", - "Daggerback Basilisk", - "Dawn's Reflection", - "Death-Hood Cobra", - "Desert Twister", - "Dissenter's Deliverance", - "Dragonscale Boon", - "Durkwood Baloth", - "Earthen Arms", - "Elephant Guide", - "Elves of Deep Shadow", - "Elvish Visionary", - "Elvish Warrior", - "Ember Weaver", - "Epic Confrontation", - "Essence Warden", - "Experiment One", - "Explore", - "Explosive Vegetation", - "Ezuri's Archers", - "Fade into Antiquity", - "Farseek", - "Feed the Clan", - "Feral Krushok", - "Ferocious Zheng", - "Fertile Ground", - "Fog", - "Formless Nurturing", - "Giant Growth", - "Giant Spider", - "Gift of Paradise", - "Gnarlid Pack", - "Grazing Gladehart", - "Greenwood Sentinel", - "Groundswell", - "Guardian Shield-Bearer", - "Hardy Veteran", - "Harmonize", - "Harrow", - "Hunt the Weak", - "Hunter's Ambush", - "Imperious Perfect", - "Invigorate", - "Ivy Lane Denizen", - "Kavu Climber", - "Kavu Primarch", - "Khalni Heart Expedition", - "Kozilek's Predator", - "Kraul Warrior", - "Krosan Tusker", - "Larger Than Life", - "Lay of the Land", - "Longshot Squad", - "Manglehorn", - "Might of the Masses", - "Nature's Claim", - "Oakgnarl Warrior", - "Overgrown Battlement", - "Overrun", - "Peema Outrider", - "Pelakka Wurm", - "Pinion Feast", - "Pouncing Cheetah", - "Priest of Titania", - "Rain of Thorns", - "Rancor", - "Reclaiming Vines", - "Regrowth", - "Relic Crush", - "Return to the Earth", - "Roots", - "Scatter the Seeds", - "Stalking Tiger", - "Sylvan Scrying", - "Tajuru Warcaller", - "Terrain Elemental", - "The Crowd Goes Wild", - "Thornscape Battlemage", - "Thrashing Brontodon", - "Venom Sliver" + "Abundant Growth", + "Acidic Slime", + "Adventurous Impulse", + "Aerie Bowmasters", + "Aggressive Instinct", + "Aggressive Urge", + "Ainok Survivalist", + "Alpine Grizzly", + "Ambassador Oak", + "Ancient Stirrings", + "Arachnus Web", + "Arbor Elf", + "Aura Gnarlid", + "Avacyn's Pilgrim", + "Backwoods Survivalists", + "Baloth Gorger", + "Basking Rootwalla", + "Beast Within", + "Beneath the Sands", + "Bestial Menace", + "Bitterblade Warrior", + "Bitterbow Sharpshooters", + "Blossom Dryad", + "Borderland Ranger", + "Bristling Boar", + "Broken Bond", + "Canopy Spider", + "Carnivorous Moss-Beast", + "Caustic Caterpillar", + "Charging Rhino", + "Citanul Woodreaders", + "Clip Wings", + "Colossal Dreadmaw", + "Combo Attack", + "Commune with Nature", + "Commune with the Gods", + "Conifer Strider", + "Crop Rotation", + "Crossroads Consecrator", + "Crowned Ceratok", + "Crushing Canopy", + "Cultivate", + "Daggerback Basilisk", + "Dawn's Reflection", + "Death-Hood Cobra", + "Desert Twister", + "Dissenter's Deliverance", + "Dragonscale Boon", + "Durkwood Baloth", + "Earthen Arms", + "Elephant Guide", + "Elves of Deep Shadow", + "Elvish Visionary", + "Elvish Warrior", + "Ember Weaver", + "Epic Confrontation", + "Essence Warden", + "Experiment One", + "Explore", + "Explosive Vegetation", + "Ezuri's Archers", + "Fade into Antiquity", + "Farseek", + "Feed the Clan", + "Feral Krushok", + "Ferocious Zheng", + "Fertile Ground", + "Fog", + "Formless Nurturing", + "Giant Growth", + "Giant Spider", + "Gift of Paradise", + "Gnarlid Pack", + "Grazing Gladehart", + "Greenwood Sentinel", + "Groundswell", + "Guardian Shield-Bearer", + "Hardy Veteran", + "Harmonize", + "Harrow", + "Hunt the Weak", + "Hunter's Ambush", + "Imperious Perfect", + "Invigorate", + "Ivy Lane Denizen", + "Kavu Climber", + "Kavu Primarch", + "Khalni Heart Expedition", + "Kozilek's Predator", + "Kraul Warrior", + "Krosan Tusker", + "Larger Than Life", + "Lay of the Land", + "Longshot Squad", + "Manglehorn", + "Might of the Masses", + "Nature's Claim", + "Oakgnarl Warrior", + "Overgrown Battlement", + "Overrun", + "Peema Outrider", + "Pelakka Wurm", + "Pinion Feast", + "Pouncing Cheetah", + "Priest of Titania", + "Rain of Thorns", + "Rancor", + "Reclaiming Vines", + "Regrowth", + "Relic Crush", + "Return to the Earth", + "Roots", + "Scatter the Seeds", + "Stalking Tiger", + "Sylvan Scrying", + "Tajuru Warcaller", + "Terrain Elemental", + "The Crowd Goes Wild", + "Thornscape Battlemage", + "Thrashing Brontodon", + "Venom Sliver" )); this.populateSlot(11, asList( // Multicolored - "Abzan Charm", - "Abzan Guide", - "Agony Warp", - "Akroan Hoplite", - "Armadillo Cloak", - "Armament Corps", - "Azorius Charm", - "Azra Oddsmaker", - "Baleful Strix", - "Baloth Null", - "Bear's Companion", - "Belligerent Brontodon", - "Bituminous Blast", - "Bladewing the Risen", - "Blightning", - "Bloodbraid Elf", - "Boros Challenger", - "Bounding Krasis", - "Call of the Nightwing", - "Campaign of Vengeance", - "Cauldron Dance", - "Citadel Castellan", - "Claim // Fame", - "Coiling Oracle", - "Contraband Kingpin", - "Corpsejack Menace", - "Crosis's Charm", - "Cunning Breezedancer", - "Deathreap Ritual", - "Deny Reality", - "Draconic Disciple", - "Drana's Emissary", - "Engineered Might", - "Esper Charm", - "Ethercaste Knight", - "Ethereal Ambush", - "Extract from Darkness", - "Fire // Ice", - "Fires of Yavimaya", - "Flame-Kin Zealot", - "Fusion Elemental", - "Gelectrode", - "Ghor-Clan Rampager", - "Giantbaiting", - "Gift of Orzhova", - "Goblin Deathraiders", - "Grim Contest", - "Gwyllion Hedge-Mage", - "Hammer Dropper", - "Hidden Stockpile", - "Highspire Mantis", - "Hypothesizzle", - "Iroas's Champion", - "Join Shields", - "Jungle Barrier", - "Kathari Remnant", - "Kin-Tree Invocation", - "Kiora's Follower", - "Kiss of the Amesha", - "Lawmage's Binding", - "Lightning Helix", - "Mardu Roughrider", - "Martial Glory", - "Maverick Thopterist", - "Mercurial Geists", - "Migratory Route", - "Mistmeadow Witch", - "Mortify", - "Naya Charm", - "Nucklavee", - "Obelisk Spider", - "Ochran Assassin", - "Pillory of the Sleepless", - "Plaxcaster Frogling", - "Pollenbright Wings", - "Putrefy", - "Qasali Pridemage", - "Raff Capashen, Ship's Mage", - "Raging Swordtooth", - "Reclusive Artificer", - "Reflector Mage", - "Rhox War Monk", - "Riptide Crab", - "River Hoopoe", - "Rosemane Centaur", - "Rosheen Meanderer", - "Satyr Enchanter", - "Savage Twister", - "Sedraxis Specter", - "Selesnya Guildmage", - "Shambling Remains", - "Shardless Agent", - "Shipwreck Singer", - "Shrewd Hatchling", - "Skyward Eye Prophets", - "Slave of Bolas", - "Soul Manipulation", - "Sprouting Thrinax", - "Stormchaser Chimera", - "Sultai Charm", - "Sultai Soothsayer", - "Tatyova, Benthic Druid", - "Terminate", - "Thopter Foundry", - "Thought Erasure", - "Tithe Drinker", - "Tower Gargoyle", - "Treacherous Terrain", - "Underworld Coinsmith", - "Unflinching Courage", - "Unlicensed Disintegration", - "Urban Evolution", - "Vengeful Rebirth", - "Warden of the Eye", - "Wayfaring Temple", - "Weapons Trainer", - "Wee Dragonauts", - "Winding Constrictor", - "Woolly Thoctar", - "Zealous Persecution", - "Zhur-Taa Druid" + "Abzan Charm", + "Abzan Guide", + "Agony Warp", + "Akroan Hoplite", + "Armadillo Cloak", + "Armament Corps", + "Azorius Charm", + "Azra Oddsmaker", + "Baleful Strix", + "Baloth Null", + "Bear's Companion", + "Belligerent Brontodon", + "Bituminous Blast", + "Bladewing the Risen", + "Blightning", + "Bloodbraid Elf", + "Boros Challenger", + "Bounding Krasis", + "Call of the Nightwing", + "Campaign of Vengeance", + "Cauldron Dance", + "Citadel Castellan", + "Claim // Fame", + "Coiling Oracle", + "Contraband Kingpin", + "Corpsejack Menace", + "Crosis's Charm", + "Cunning Breezedancer", + "Deathreap Ritual", + "Deny Reality", + "Draconic Disciple", + "Drana's Emissary", + "Engineered Might", + "Esper Charm", + "Ethercaste Knight", + "Ethereal Ambush", + "Extract from Darkness", + "Fire // Ice", + "Fires of Yavimaya", + "Flame-Kin Zealot", + "Fusion Elemental", + "Gelectrode", + "Ghor-Clan Rampager", + "Giantbaiting", + "Gift of Orzhova", + "Goblin Deathraiders", + "Grim Contest", + "Gwyllion Hedge-Mage", + "Hammer Dropper", + "Hidden Stockpile", + "Highspire Mantis", + "Hypothesizzle", + "Iroas's Champion", + "Join Shields", + "Jungle Barrier", + "Kathari Remnant", + "Kin-Tree Invocation", + "Kiora's Follower", + "Kiss of the Amesha", + "Lawmage's Binding", + "Lightning Helix", + "Mardu Roughrider", + "Martial Glory", + "Maverick Thopterist", + "Mercurial Geists", + "Migratory Route", + "Mistmeadow Witch", + "Mortify", + "Naya Charm", + "Nucklavee", + "Obelisk Spider", + "Ochran Assassin", + "Pillory of the Sleepless", + "Plaxcaster Frogling", + "Pollenbright Wings", + "Putrefy", + "Qasali Pridemage", + "Raff Capashen, Ship's Mage", + "Raging Swordtooth", + "Reclusive Artificer", + "Reflector Mage", + "Rhox War Monk", + "Riptide Crab", + "River Hoopoe", + "Rosemane Centaur", + "Rosheen Meanderer", + "Satyr Enchanter", + "Savage Twister", + "Sedraxis Specter", + "Selesnya Guildmage", + "Shambling Remains", + "Shardless Agent", + "Shipwreck Singer", + "Shrewd Hatchling", + "Skyward Eye Prophets", + "Slave of Bolas", + "Soul Manipulation", + "Sprouting Thrinax", + "Stormchaser Chimera", + "Sultai Charm", + "Sultai Soothsayer", + "Tatyova, Benthic Druid", + "Terminate", + "Thopter Foundry", + "Thought Erasure", + "Tithe Drinker", + "Tower Gargoyle", + "Treacherous Terrain", + "Underworld Coinsmith", + "Unflinching Courage", + "Unlicensed Disintegration", + "Urban Evolution", + "Vengeful Rebirth", + "Warden of the Eye", + "Wayfaring Temple", + "Weapons Trainer", + "Wee Dragonauts", + "Winding Constrictor", + "Woolly Thoctar", + "Zealous Persecution", + "Zhur-Taa Druid" )); this.populateSlot(12, asList( // Artifact/Land - "Aether Hub", - "Aether Spellbomb", - "Akoum Refuge", - "Alchemist's Vial", - "Alloy Myr", - "Arcane Sanctum", - "Armillary Sphere", - "Artisan of Kozilek", - "Ash Barrens", - "Ashnod's Altar", - "Benthic Infiltrator", - "Blasted Landscape", - "Blighted Fen", - "Blinding Souleater", - "Blossoming Sands", - "Bojuka Bog", - "Bomat Bazaar Barge", - "Bone Saw", - "Bottle Gnomes", - "Breaker of Armies", - "Burnished Hart", - "Call the Scions", - "Cathodion", - "Coldsteel Heart", - "Consulate Dreadnought", - "Copper Carapace", - "Crumbling Necropolis", - "Crystal Ball", - "Crystal Chimes", - "Darksteel Citadel", - "Diamond Mare", - "Dismal Backwater", - "Dreadship Reef", - "Eldrazi Devastator", - "Emmessi Tome", - "Etched Oracle", - "Evolving Wilds", - "Faerie Conclave", - "Farmstead Gleaner", - "Field of Ruin", - "Filigree Familiar", - "Flayer Husk", - "Forgotten Cave", - "Foundry Inspector", - "Fountain of Renewal", - "Frogmite", - "Frontier Bivouac", - "Gateway Plaza", - "Ghost Quarter", - "Goblin Burrows", - "Graypelt Refuge", - "Great Furnace", - "Gruul Signet", - "Guardians of Meletis", - "Heavy Arbalest", - "Herald's Horn", - "Hexplate Golem", - "Hot Soup", - "Icy Manipulator", - "Implement of Malice", - "Irontread Crusher", - "Juggernaut", - "Jungle Hollow", - "Jungle Shrine", - "Kazandu Refuge", - "Krosan Verge", - "Lightning Greaves", - "Loxodon Warhammer", - "Mask of Memory", - "Meteorite", - "Millikin", - "Millstone", - "Mind Stone", - "Mishra's Bauble", - "Mishra's Factory", - "Moonglove Extract", - "Mortarpod", - "Myr Retriever", - "Myr Sire", - "New Benalia", - "Ornithopter", - "Orzhov Basilica", - "Palladium Myr", - "Peace Strider", - "Perilous Myr", - "Pilgrim's Eye", - "Prophetic Prism", - "Reliquary Tower", - "Renegade Map", - "Rhonas's Monument", - "Rogue's Passage", - "Sandsteppe Citadel", - "Sandstone Oracle", - "Scoured Barrens", - "Sejiri Refuge", - "Serrated Arrows", - "Short Sword", - "Sigil of Valor", - "Simic Locket", - "Skarrg, the Rage Pits", - "Skullclamp", - "Skyscanner", - "Sol Ring", - "Sorcerer's Broom", - //"Spy Kit", - "Sunset Pyramid", - "Suspicious Bookcase", - "Swiftwater Cliffs", - "Tectonic Edge", - "Temple of the False God", - "Thornwood Falls", - "Thought Vessel", - "Thran Dynamo", - "Thran Golem", - "Tormod's Crypt", - "Trepanation Blade", - "Unclaimed Territory", - "Universal Automaton", - "Universal Solvent", - "Whispersilk Cloak", - "Wirewood Lodge" + "Aether Hub", + "Aether Spellbomb", + "Akoum Refuge", + "Alchemist's Vial", + "Alloy Myr", + "Arcane Sanctum", + "Armillary Sphere", + "Artisan of Kozilek", + "Ash Barrens", + "Ashnod's Altar", + "Benthic Infiltrator", + "Blasted Landscape", + "Blighted Fen", + "Blinding Souleater", + "Blossoming Sands", + "Bojuka Bog", + "Bomat Bazaar Barge", + "Bone Saw", + "Bottle Gnomes", + "Breaker of Armies", + "Burnished Hart", + "Call the Scions", + "Cathodion", + "Coldsteel Heart", + "Consulate Dreadnought", + "Copper Carapace", + "Crumbling Necropolis", + "Crystal Ball", + "Crystal Chimes", + "Darksteel Citadel", + "Diamond Mare", + "Dismal Backwater", + "Dreadship Reef", + "Eldrazi Devastator", + "Emmessi Tome", + "Etched Oracle", + "Evolving Wilds", + "Faerie Conclave", + "Farmstead Gleaner", + "Field of Ruin", + "Filigree Familiar", + "Flayer Husk", + "Forgotten Cave", + "Foundry Inspector", + "Fountain of Renewal", + "Frogmite", + "Frontier Bivouac", + "Gateway Plaza", + "Ghost Quarter", + "Goblin Burrows", + "Graypelt Refuge", + "Great Furnace", + "Gruul Signet", + "Guardians of Meletis", + "Heavy Arbalest", + "Herald's Horn", + "Hexplate Golem", + "Hot Soup", + "Icy Manipulator", + "Implement of Malice", + "Irontread Crusher", + "Juggernaut", + "Jungle Hollow", + "Jungle Shrine", + "Kazandu Refuge", + "Krosan Verge", + "Lightning Greaves", + "Loxodon Warhammer", + "Mask of Memory", + "Meteorite", + "Millikin", + "Millstone", + "Mind Stone", + "Mishra's Bauble", + "Mishra's Factory", + "Moonglove Extract", + "Mortarpod", + "Myr Retriever", + "Myr Sire", + "New Benalia", + "Ornithopter", + "Orzhov Basilica", + "Palladium Myr", + "Peace Strider", + "Perilous Myr", + "Pilgrim's Eye", + "Prophetic Prism", + "Reliquary Tower", + "Renegade Map", + "Rhonas's Monument", + "Rogue's Passage", + "Sandsteppe Citadel", + "Sandstone Oracle", + "Scoured Barrens", + "Sejiri Refuge", + "Serrated Arrows", + "Short Sword", + "Sigil of Valor", + "Simic Locket", + "Skarrg, the Rage Pits", + "Skullclamp", + "Skyscanner", + "Sol Ring", + "Sorcerer's Broom", + //"Spy Kit", + "Sunset Pyramid", + "Suspicious Bookcase", + "Swiftwater Cliffs", + "Tectonic Edge", + "Temple of the False God", + "Thornwood Falls", + "Thought Vessel", + "Thran Dynamo", + "Thran Golem", + "Tormod's Crypt", + "Trepanation Blade", + "Unclaimed Territory", + "Universal Automaton", + "Universal Solvent", + "Whispersilk Cloak", + "Wirewood Lodge" )); this.populateSlot(13, asList( // Pre-M15, sourced from magic.wizards.com - "Avalanche Riders", - "Belbe's Portal", - "Black Knight", - "Dauthi Mindripper", - "Knight of Dawn", - "Maelstrom Archangel", - "Mana Tithe", - "Oracle of Nectars", - "Perish", - "Pestilence", - "Tower of Eons", - "Ana Sanctuary", - "Ancient Den", - "Ancient Ziggurat", - "Angelic Destiny", - "Archangel", - "Asceticism", - "Assemble the Legion", - "Athreos, God of Passage", - "Aura Shards", - "Bear Cub", - "Bloom Tender", - "Bonesplitter", - "Bow of Nylea", - "Brimstone Dragon", - "Brimstone Mage", - "Cairn Wanderer", - "Carpet of Flowers", - "Centaur Glade", - "Chancellor of the Annex", - "Chatter of the Squirrel", - "Chromatic Star", - "Contagion Clasp", - "Corrupted Conscience", - "Cragganwick Cremator", - "Crenellated Wall", - "Crystal Shard", - "Darksteel Garrison", - "Defense of the Heart", - "Dictate of Erebos", - "Dolmen Gate", - "Dominus of Fealty", - "Doomgape", - "Draco", - "Dragon Broodmother", - "Dragon Mask", - "Dungrove Elder", - "Eater of Days", - "Elixir of Immortality", - "Empyrial Armor", - "Enchanted Evening", - "Energy Field", - "Exsanguinate", - "Flameshot", - "Floodgate", - "Font of Mythos", - "Ghitu War Cry", - "Gilt-Leaf Palace", - "Goblin Game", - "Greater Gargadon", - "Guided Passage", - "Haakon, Stromgald Scourge", - "Hedron Crab", - "Helm of Awakening", - "Hunter of Eyeblights", - "Hurricane", - "Hypnotic Specter", - "Impending Disaster", - "Jushi Apprentice", - "Kaervek's Torch", - "Kargan Dragonlord", - "Knollspine Dragon", - "Kor Chant", - "Kruphix, God of Horizons", - "Lashknife Barrier", - "Lotus Petal", - "Magus of the Moat", - "Manamorphose", - "Martyr's Bond", - "Martyr's Cause", - "Master Transmuter", - "Meddling Mage", - "Mistform Shrieker", - "Nemesis of Reason", - "Pathrazer of Ulamog", - "Phantasmal Dragon", - "Phantom Centaur", - "Phyrexian Metamorph", - "Phyrexian Soulgorger", - "Purphoros, God of the Forge", - "Questing Phelddagrif", - "Rage Reflection", - "Recoup", - "Release the Ants", - "Rhys the Redeemed", - "Rhystic Study", - "Rishadan Footpad", - "Rith, the Awakener", - "River Boa", - "Sadistic Hypnotist", - "Sakashima the Impostor", - "Sapphire Charm", - "Shrouded Lore", - "Soothsaying", - "Sorin Markov", - "Squirrel Wrangler", - "Thieving Magpie", - "Thrun, the Last Troll", - "Time Sieve", - "Timely Reinforcements", - "Tinker", - "Toxin Sliver", - "Triumph of the Hordes", - "Umbral Mantle", - "Viashino Sandstalker", - "Violent Ultimatum", - "Volunteer Reserves", - "Wargate", - "Weathered Wayfarer", - "Wild Nacatl", - "Yavimaya's Embrace" + "Avalanche Riders", + "Belbe's Portal", + "Black Knight", + "Dauthi Mindripper", + "Knight of Dawn", + "Maelstrom Archangel", + "Mana Tithe", + "Oracle of Nectars", + "Perish", + "Pestilence", + "Tower of Eons", + "Ana Sanctuary", + "Ancient Den", + "Ancient Ziggurat", + "Angelic Destiny", + "Archangel", + "Asceticism", + "Assemble the Legion", + "Athreos, God of Passage", + "Aura Shards", + "Bear Cub", + "Bloom Tender", + "Bonesplitter", + "Bow of Nylea", + "Brimstone Dragon", + "Brimstone Mage", + "Cairn Wanderer", + "Carpet of Flowers", + "Centaur Glade", + "Chancellor of the Annex", + "Chatter of the Squirrel", + "Chromatic Star", + "Contagion Clasp", + "Corrupted Conscience", + "Cragganwick Cremator", + "Crenellated Wall", + "Crystal Shard", + "Darksteel Garrison", + "Defense of the Heart", + "Dictate of Erebos", + "Dolmen Gate", + "Dominus of Fealty", + "Doomgape", + "Draco", + "Dragon Broodmother", + "Dragon Mask", + "Dungrove Elder", + "Eater of Days", + "Elixir of Immortality", + "Empyrial Armor", + "Enchanted Evening", + "Energy Field", + "Exsanguinate", + "Flameshot", + "Floodgate", + "Font of Mythos", + "Ghitu War Cry", + "Gilt-Leaf Palace", + "Goblin Game", + "Greater Gargadon", + "Guided Passage", + "Haakon, Stromgald Scourge", + "Hedron Crab", + "Helm of Awakening", + "Hunter of Eyeblights", + "Hurricane", + "Hypnotic Specter", + "Impending Disaster", + "Jushi Apprentice", + "Kaervek's Torch", + "Kargan Dragonlord", + "Knollspine Dragon", + "Kor Chant", + "Kruphix, God of Horizons", + "Lashknife Barrier", + "Lotus Petal", + "Magus of the Moat", + "Manamorphose", + "Martyr's Bond", + "Martyr's Cause", + "Master Transmuter", + "Meddling Mage", + "Mistform Shrieker", + "Nemesis of Reason", + "Pathrazer of Ulamog", + "Phantasmal Dragon", + "Phantom Centaur", + "Phyrexian Metamorph", + "Phyrexian Soulgorger", + "Purphoros, God of the Forge", + "Questing Phelddagrif", + "Rage Reflection", + "Recoup", + "Release the Ants", + "Rhys the Redeemed", + "Rhystic Study", + "Rishadan Footpad", + "Rith, the Awakener", + "River Boa", + "Sadistic Hypnotist", + "Sakashima the Impostor", + "Sapphire Charm", + "Shrouded Lore", + "Soothsaying", + "Sorin Markov", + "Squirrel Wrangler", + "Thieving Magpie", + "Thrun, the Last Troll", + "Time Sieve", + "Timely Reinforcements", + "Tinker", + "Toxin Sliver", + "Triumph of the Hordes", + "Umbral Mantle", + "Viashino Sandstalker", + "Violent Ultimatum", + "Volunteer Reserves", + "Wargate", + "Weathered Wayfarer", + "Wild Nacatl", + "Yavimaya's Embrace" )); this.populateSlot(14, asList( // Post-M15 rare / mythic, sourced from magic.wizards.com - "Adorned Pouncer", - "Aetherflux Reservoir", - "Akroan Horse", - "Alesha, Who Smiles at Death", - "Alhammarret's Archive", - "All Is Dust", - "Aminatou's Augury", - "Angel of the Dire Hour", - "Anger of the Gods", - "Animar, Soul of Elements", - "Approach of the Second Sun", - "Arch of Orazca", - "Basilisk Collar", - "Beacon of Immortality", - "Beastmaster Ascension", - "Birds of Paradise", - "Black Market", - "Boompile", - "Boros Reckoner", - "Caged Sun", - "Cauldron of Souls", - "Champion of the Parish", - "Chaos Warp", - "Chasm Skulker", - "Chromatic Lantern", - "Coat of Arms", - "Collective Brutality", - "Commit // Memory", - "Courser of Kruphix", - "Coveted Jewel", - "Daretti, Scrap Savant", - "Deadly Tempest", - "Debtors' Knell", - "Decree of Justice", - "Deepglow Skate", - "Desolation Twin", - "Dictate of Heliod", - "Djinn of Wishes", - "Dragonlord Ojutai", - "Drana, Kalastria Bloodchief", - "Eldrazi Monument", - "Eldritch Evolution", - "Elesh Norn, Grand Cenobite", - "Evra, Halcyon Witness", - "Expropriate", - "Fblthp, the Lost", - "Felidar Sovereign", - "Gideon Jura", - "Goblin Charbelcher", - "Goblin Piledriver", - "Gonti, Lord of Luxury", - "Grasp of Fate", - "Grave Titan", - "Gravecrawler", - "Greenbelt Rampager", - "Hornet Nest", - "Kiki-Jiki, Mirror Breaker", - "Kolaghan's Command", - "Krenko, Mob Boss", - "Liliana, Death's Majesty", - "Living Death", - "Mana Crypt", - "Meandering Towershell", - "Memory Erosion", - "Meren of Clan Nel Toth", - "Mimic Vat", - "Mind Shatter", - "Mind Spring", - "Mirran Crusader", - "Mirror Entity", - "Misdirection", - "Mizzix's Mastery", - "Mycoloth", - "Mystic Confluence", - "Nighthowler", - "Nin, the Pain Artist", - "Nissa, Voice of Zendikar", - "Odric, Lunarch Marshal", - "Phyrexian Arena", - "Phyrexian Plaguelord", - "Precursor Golem", - "Preyseizer Dragon", - "Queen Marchesa", - "Reality Scramble", - "Recruiter of the Guard", - "Release the Gremlins", - "Revel in Riches", - "Rune-Scarred Demon", - "Savage Knuckleblade", - "Selvala, Heart of the Wilds", - "Serendib Efreet", - "Sewer Nemesis", - "Shamanic Revelation", - "Sliver Hivelord", - "Solemn Simulacrum", - "Spawning Grounds", - "Star of Extinction", - "Steamflogger Boss", - "Stunt Double", - "Sudden Demise", - "Supreme Verdict", - "Sword of the Animist", - "Talrand, Sky Summoner", - "Taurean Mauler", - "Teferi, Temporal Archmage", - "Teferi's Protection", - "Temporal Mastery", - "Tempt with Discovery", - "Thalia's Lancers", - "The Gitrog Monster", - "The Mirari Conjecture", - "Tireless Tracker", - "Torment of Hailfire", - "Trading Post", - "Two-Headed Giant", - "Urza's Rage", - "Vigor", - "Wheel of Fate", - "Whelming Wave", - "Whir of Invention", - "Yuriko, the Tiger's Shadow" + "Adorned Pouncer", + "Aetherflux Reservoir", + "Akroan Horse", + "Alesha, Who Smiles at Death", + "Alhammarret's Archive", + "All Is Dust", + "Aminatou's Augury", + "Angel of the Dire Hour", + "Anger of the Gods", + "Animar, Soul of Elements", + "Approach of the Second Sun", + "Arch of Orazca", + "Basilisk Collar", + "Beacon of Immortality", + "Beastmaster Ascension", + "Birds of Paradise", + "Black Market", + "Boompile", + "Boros Reckoner", + "Caged Sun", + "Cauldron of Souls", + "Champion of the Parish", + "Chaos Warp", + "Chasm Skulker", + "Chromatic Lantern", + "Coat of Arms", + "Collective Brutality", + "Commit // Memory", + "Courser of Kruphix", + "Coveted Jewel", + "Daretti, Scrap Savant", + "Deadly Tempest", + "Debtors' Knell", + "Decree of Justice", + "Deepglow Skate", + "Desolation Twin", + "Dictate of Heliod", + "Djinn of Wishes", + "Dragonlord Ojutai", + "Drana, Kalastria Bloodchief", + "Eldrazi Monument", + "Eldritch Evolution", + "Elesh Norn, Grand Cenobite", + "Evra, Halcyon Witness", + "Expropriate", + "Fblthp, the Lost", + "Felidar Sovereign", + "Gideon Jura", + "Goblin Charbelcher", + "Goblin Piledriver", + "Gonti, Lord of Luxury", + "Grasp of Fate", + "Grave Titan", + "Gravecrawler", + "Greenbelt Rampager", + "Hornet Nest", + "Kiki-Jiki, Mirror Breaker", + "Kolaghan's Command", + "Krenko, Mob Boss", + "Liliana, Death's Majesty", + "Living Death", + "Mana Crypt", + "Meandering Towershell", + "Memory Erosion", + "Meren of Clan Nel Toth", + "Mimic Vat", + "Mind Shatter", + "Mind Spring", + "Mirran Crusader", + "Mirror Entity", + "Misdirection", + "Mizzix's Mastery", + "Mycoloth", + "Mystic Confluence", + "Nighthowler", + "Nin, the Pain Artist", + "Nissa, Voice of Zendikar", + "Odric, Lunarch Marshal", + "Phyrexian Arena", + "Phyrexian Plaguelord", + "Precursor Golem", + "Preyseizer Dragon", + "Queen Marchesa", + "Reality Scramble", + "Recruiter of the Guard", + "Release the Gremlins", + "Revel in Riches", + "Rune-Scarred Demon", + "Savage Knuckleblade", + "Selvala, Heart of the Wilds", + "Serendib Efreet", + "Sewer Nemesis", + "Shamanic Revelation", + "Sliver Hivelord", + "Solemn Simulacrum", + "Spawning Grounds", + "Star of Extinction", + "Steamflogger Boss", + "Stunt Double", + "Sudden Demise", + "Supreme Verdict", + "Sword of the Animist", + "Talrand, Sky Summoner", + "Taurean Mauler", + "Teferi, Temporal Archmage", + "Teferi's Protection", + "Temporal Mastery", + "Tempt with Discovery", + "Thalia's Lancers", + "The Gitrog Monster", + "The Mirari Conjecture", + "Tireless Tracker", + "Torment of Hailfire", + "Trading Post", + "Two-Headed Giant", + "Urza's Rage", + "Vigor", + "Wheel of Fate", + "Whelming Wave", + "Whir of Invention", + "Yuriko, the Tiger's Shadow" )); this.populateBoosterSpecialSlot(); } /** * Populate the given booster slot. + * * @param slotNumber booster slot number. 1-indexed, valid range is 1-14, as 15 is the special slot - * @param cardNames List of English card names found on the given slot + * @param cardNames List of English card names found on the given slot */ private void populateSlot(int slotNumber, List cardNames) { final List cardInfoList = this.possibleCardsPerBoosterSlot.get(slotNumber); - for(String name : cardNames) { + for (String name : cardNames) { final CardInfo cardWithGivenName = CardRepository.instance.findCardWPreferredSet(name, this.code, false); cardInfoList.add(cardWithGivenName); } @@ -3496,12 +3499,12 @@ public class MysteryBooster extends ExpansionSet { @Override public List createBooster() { - if(this.possibleCardsPerBoosterSlot.isEmpty()) { + if (this.possibleCardsPerBoosterSlot.isEmpty()) { // Generate the map only once this.populateBoosterSlotMap(); } final List booster = new ArrayList<>(15); - for(int slot = 1; slot < 16; ++slot) { + for (int slot = 1; slot < 16; ++slot) { final List availableCards = this.possibleCardsPerBoosterSlot.get(slot); final int printSheetCardNumber = RandomUtil.nextInt(availableCards.size()); final Card chosenCard = availableCards.get(printSheetCardNumber).getCard(); diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/base/MageTestBase.java b/Mage.Tests/src/test/java/org/mage/test/serverside/base/MageTestBase.java index 6aca7be4ff..d5d228dd14 100644 --- a/Mage.Tests/src/test/java/org/mage/test/serverside/base/MageTestBase.java +++ b/Mage.Tests/src/test/java/org/mage/test/serverside/base/MageTestBase.java @@ -99,8 +99,6 @@ public abstract class MageTestBase { @BeforeClass public static void init() { Logger.getRootLogger().setLevel(Level.DEBUG); - logger.info("Starting MAGE tests"); - logger.info("Logging level: " + logger.getLevel()); deleteSavedGames(); ConfigSettings config = ConfigSettings.instance; config.getGameTypes().forEach((gameType) -> { @@ -148,7 +146,6 @@ public abstract class MageTestBase { private static TournamentType loadTournamentType(GamePlugin plugin) { try { classLoader.addURL(new File(PLUGIN_FOLDER + '/' + plugin.getJar()).toURI().toURL()); - logger.info("Loading tournament type: " + plugin.getClassName()); return (TournamentType) Class.forName(plugin.getTypeName(), true, classLoader).getConstructor().newInstance(); } catch (ClassNotFoundException ex) { logger.warn("Tournament type not found:" + plugin.getJar() + " - check plugin folder"); @@ -174,7 +171,7 @@ public abstract class MageTestBase { protected void parseScenario(String filename) throws FileNotFoundException { parserState = ParserState.INIT; File f = new File(filename); - try(Scanner scanner = new Scanner(f)) { + try (Scanner scanner = new Scanner(f)) { while (scanner.hasNextLine()) { String line = scanner.nextLine().trim(); if (line == null || line.isEmpty() || line.startsWith("#")) { diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/base/MageTestPlayerBase.java b/Mage.Tests/src/test/java/org/mage/test/serverside/base/MageTestPlayerBase.java index 4efe7837f2..fadd7761a6 100644 --- a/Mage.Tests/src/test/java/org/mage/test/serverside/base/MageTestPlayerBase.java +++ b/Mage.Tests/src/test/java/org/mage/test/serverside/base/MageTestPlayerBase.java @@ -141,7 +141,6 @@ public abstract class MageTestPlayerBase { private static TournamentType loadTournamentType(GamePlugin plugin) { try { classLoader.addURL(new File(pluginFolder + '/' + plugin.getJar()).toURI().toURL()); - logger.info("Loading tournament type: " + plugin.getClassName()); return (TournamentType) Class.forName(plugin.getTypeName(), true, classLoader).getConstructor().newInstance(); } catch (ClassNotFoundException ex) { logger.warn("Tournament type not found:" + plugin.getJar() + " - check plugin folder"); diff --git a/Mage.Tests/src/test/java/org/mage/test/sets/BoosterGenerationTest.java b/Mage.Tests/src/test/java/org/mage/test/sets/BoosterGenerationTest.java index f1badd5847..f2a33abe00 100644 --- a/Mage.Tests/src/test/java/org/mage/test/sets/BoosterGenerationTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/sets/BoosterGenerationTest.java @@ -108,8 +108,9 @@ public class BoosterGenerationTest extends MageTestBase { Assert.assertTrue("Slot 1 is white", booster.get(0).getColor(null).isWhite()); Assert.assertTrue("Slot 2 is white", booster.get(1).getColor(null).isWhite()); - Assert.assertTrue("Slot 3 is blue", booster.get(2).getColor(null).isBlue()); - Assert.assertTrue("Slot 4 is blue", booster.get(3).getColor(null).isBlue()); + // Wretched Gryff is colorless, but stores in blue slots + Assert.assertTrue("Slot 3 is blue", booster.get(2).getName().equals("Wretched Gryff") || booster.get(2).getColor(null).isBlue()); + Assert.assertTrue("Slot 4 is blue", booster.get(3).getName().equals("Wretched Gryff") || booster.get(3).getColor(null).isBlue()); Assert.assertTrue("Slot 5 is black", booster.get(4).getColor(null).isBlack()); Assert.assertTrue("Slot 6 is black", booster.get(5).getColor(null).isBlack()); From e01a03fa79068fbc56b7ff6bf84c909b0c0e50aa Mon Sep 17 00:00:00 2001 From: Thomas Winwood Date: Wed, 26 Aug 2020 16:02:30 +0100 Subject: [PATCH 3/3] Add Signature Spellbook: Chandra (#7004) * Add Signature Spellbook: Chandra * Update ScryfallImageSupportCards.java * dangit * Update SignatureSpellbookChandra.java --- .../dl/sources/ScryfallImageSupportCards.java | 2 +- .../mage/sets/SignatureSpellbookChandra.java | 32 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 Mage.Sets/src/mage/sets/SignatureSpellbookChandra.java diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportCards.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportCards.java index dd2d409ee1..f35c9727cd 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportCards.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportCards.java @@ -476,7 +476,7 @@ public class ScryfallImageSupportCards { add("SLD"); // Secret Lair Drop add("PMEI"); // Magazine Inserts add("SLU"); // Secret Lair: Ultimate Edition - //add("SS3"); // Signature Spellbook: Chandra + add("SS3"); // Signature Spellbook: Chandra add("HA3"); // Historic Anthology 3 // add("TD0"); // Commander Theme Decks diff --git a/Mage.Sets/src/mage/sets/SignatureSpellbookChandra.java b/Mage.Sets/src/mage/sets/SignatureSpellbookChandra.java new file mode 100644 index 0000000000..566d229342 --- /dev/null +++ b/Mage.Sets/src/mage/sets/SignatureSpellbookChandra.java @@ -0,0 +1,32 @@ +package mage.sets; + +import mage.cards.ExpansionSet; +import mage.constants.Rarity; +import mage.constants.SetType; + +/** + * @author Ketsuban + */ +public final class SignatureSpellbookChandra extends ExpansionSet { + + private static final SignatureSpellbookChandra instance = new SignatureSpellbookChandra(); + + public static SignatureSpellbookChandra getInstance() { + return instance; + } + + private SignatureSpellbookChandra() { + super("Signature Spellbook: Chandra", "SS3", ExpansionSet.buildDate(2020, 6, 26), SetType.SUPPLEMENTAL); + this.hasBoosters = false; + this.hasBasicLands = false; + + cards.add(new SetCardInfo("Chandra, Torch of Defiance", 1, Rarity.MYTHIC, mage.cards.c.ChandraTorchOfDefiance.class)); + cards.add(new SetCardInfo("Cathartic Reunion", 2, Rarity.RARE, mage.cards.c.CatharticReunion.class)); + cards.add(new SetCardInfo("Fiery Confluence", 3, Rarity.RARE, mage.cards.f.FieryConfluence.class)); + cards.add(new SetCardInfo("Past in Flames", 4, Rarity.MYTHIC, mage.cards.p.PastInFlames.class)); + cards.add(new SetCardInfo("Pyroblast", 5, Rarity.RARE, mage.cards.p.Pyroblast.class)); + cards.add(new SetCardInfo("Pyromancer Ascension", 6, Rarity.RARE, mage.cards.p.PyromancerAscension.class)); + cards.add(new SetCardInfo("Rite of Flame", 7, Rarity.RARE, mage.cards.r.RiteOfFlame.class)); + cards.add(new SetCardInfo("Young Pyromancer", 8, Rarity.RARE, mage.cards.y.YoungPyromancer.class)); + } +}