various files converted from CRLF to LF

This commit is contained in:
Evan Kranzler 2021-09-23 19:37:47 -04:00
parent ea561892f5
commit 3a3e3fda48
36 changed files with 8696 additions and 8696 deletions

View file

@ -1,161 +1,161 @@
package mage.cards.g;
import mage.abilities.Ability;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
import mage.abilities.dynamicvalue.common.StaticValue;
import mage.abilities.effects.ReplacementEffectImpl;
import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.StaticFilters;
import mage.filter.common.FilterControlledPermanent;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.ZoneChangeEvent;
import mage.players.Player;
import java.util.UUID;
import mage.Mana;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.decorator.ConditionalAsThoughEffect;
import mage.abilities.effects.AsThoughEffectImpl;
import mage.watchers.common.ManaSpentToCastWatcher;
/**
*
* @author jeffwadsworth
*/
public class GlimpseTheCosmos extends CardImpl {
public GlimpseTheCosmos(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{U}");
// Look at the top three cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order.
this.getSpellAbility().addEffect(new LookLibraryAndPickControllerEffect(
StaticValue.get(3), false, StaticValue.get(1),
StaticFilters.FILTER_CARD, Zone.LIBRARY, false,
false, false, Zone.HAND, false
).setText("look at the top three cards of your library. "
+ "Put one of them into your hand and the rest on the bottom of your library in any order"));
//As long as you control a Giant, you may cast Glimpse the Cosmos from your graveyard by paying {U} rather than paying its mana cost. If you cast Glimpse the Cosmos this way and it would be put into your graveyard, exile it instead.
this.addAbility(new SimpleStaticAbility(Zone.GRAVEYARD,
new ConditionalAsThoughEffect(
new GlimpseTheCosmosPlayEffect(),
new PermanentsOnTheBattlefieldCondition(new FilterControlledPermanent(SubType.GIANT)))));
this.addAbility(new SimpleStaticAbility(Zone.ALL, new GlimpseTheCosmosReplacementEffect()));
}
private GlimpseTheCosmos(final GlimpseTheCosmos card) {
super(card);
}
@Override
public GlimpseTheCosmos copy() {
return new GlimpseTheCosmos(this);
}
}
class GlimpseTheCosmosPlayEffect extends AsThoughEffectImpl {
public GlimpseTheCosmosPlayEffect() {
super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.EndOfGame, Outcome.Benefit);
staticText = "As long as you control a Giant, you may cast {this} from your graveyard by paying {U} rather than paying its mana cost";
}
public GlimpseTheCosmosPlayEffect(final GlimpseTheCosmosPlayEffect effect) {
super(effect);
}
@Override
public boolean apply(Game game, Ability source) {
return true;
}
@Override
public GlimpseTheCosmosPlayEffect copy() {
return new GlimpseTheCosmosPlayEffect(this);
}
@Override
public boolean applies(UUID sourceId, Ability source, UUID affectedControllerId, Game game) {
if (sourceId.equals(source.getSourceId())
&& source.isControlledBy(affectedControllerId)) {
if (game.getState().getZone(source.getSourceId()) == Zone.GRAVEYARD) {
Player controller = game.getPlayer(affectedControllerId);
if (controller != null) {
controller.setCastSourceIdWithAlternateMana(sourceId, new ManaCostsImpl<>("{U}"), null);
return true;
}
}
}
return false;
}
}
class GlimpseTheCosmosReplacementEffect extends ReplacementEffectImpl {
public GlimpseTheCosmosReplacementEffect() {
super(Duration.OneUse, Outcome.Exile);
staticText = "As long as you control a Giant, you may cast {this} from your graveyard by paying {U} rather than paying its mana cost. If you cast {this} this way and it would be put into your graveyard, exile it instead";
}
public GlimpseTheCosmosReplacementEffect(final GlimpseTheCosmosReplacementEffect effect) {
super(effect);
}
@Override
public GlimpseTheCosmosReplacementEffect copy() {
return new GlimpseTheCosmosReplacementEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
return true;
}
@Override
public boolean replaceEvent(GameEvent event, Ability source, Game game) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
Card card = game.getCard(event.getTargetId());
if (card != null) {
discard();
return controller.moveCards(
card, Zone.EXILED, source, game, false, false, false, event.getAppliedEffects());
}
}
return false;
}
@Override
public boolean checksEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ZONE_CHANGE;
}
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
ManaSpentToCastWatcher watcher = game.getState().getWatcher(ManaSpentToCastWatcher.class);
if (watcher == null) {
return false;
}
Mana payment = watcher.getLastManaPayment(source.getSourceId());
if (payment != null
&& payment.getBlue() == 1 // must be blue mana
&& payment.count() == 1) { // must be just one
if (event.getTargetId().equals(source.getSourceId())
&& ((ZoneChangeEvent) event).getFromZone() == Zone.STACK
&& ((ZoneChangeEvent) event).getToZone() != Zone.EXILED) {
return true;
}
}
return false;
}
}
package mage.cards.g;
import mage.abilities.Ability;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
import mage.abilities.dynamicvalue.common.StaticValue;
import mage.abilities.effects.ReplacementEffectImpl;
import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.StaticFilters;
import mage.filter.common.FilterControlledPermanent;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.ZoneChangeEvent;
import mage.players.Player;
import java.util.UUID;
import mage.Mana;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.decorator.ConditionalAsThoughEffect;
import mage.abilities.effects.AsThoughEffectImpl;
import mage.watchers.common.ManaSpentToCastWatcher;
/**
*
* @author jeffwadsworth
*/
public class GlimpseTheCosmos extends CardImpl {
public GlimpseTheCosmos(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{U}");
// Look at the top three cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order.
this.getSpellAbility().addEffect(new LookLibraryAndPickControllerEffect(
StaticValue.get(3), false, StaticValue.get(1),
StaticFilters.FILTER_CARD, Zone.LIBRARY, false,
false, false, Zone.HAND, false
).setText("look at the top three cards of your library. "
+ "Put one of them into your hand and the rest on the bottom of your library in any order"));
//As long as you control a Giant, you may cast Glimpse the Cosmos from your graveyard by paying {U} rather than paying its mana cost. If you cast Glimpse the Cosmos this way and it would be put into your graveyard, exile it instead.
this.addAbility(new SimpleStaticAbility(Zone.GRAVEYARD,
new ConditionalAsThoughEffect(
new GlimpseTheCosmosPlayEffect(),
new PermanentsOnTheBattlefieldCondition(new FilterControlledPermanent(SubType.GIANT)))));
this.addAbility(new SimpleStaticAbility(Zone.ALL, new GlimpseTheCosmosReplacementEffect()));
}
private GlimpseTheCosmos(final GlimpseTheCosmos card) {
super(card);
}
@Override
public GlimpseTheCosmos copy() {
return new GlimpseTheCosmos(this);
}
}
class GlimpseTheCosmosPlayEffect extends AsThoughEffectImpl {
public GlimpseTheCosmosPlayEffect() {
super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.EndOfGame, Outcome.Benefit);
staticText = "As long as you control a Giant, you may cast {this} from your graveyard by paying {U} rather than paying its mana cost";
}
public GlimpseTheCosmosPlayEffect(final GlimpseTheCosmosPlayEffect effect) {
super(effect);
}
@Override
public boolean apply(Game game, Ability source) {
return true;
}
@Override
public GlimpseTheCosmosPlayEffect copy() {
return new GlimpseTheCosmosPlayEffect(this);
}
@Override
public boolean applies(UUID sourceId, Ability source, UUID affectedControllerId, Game game) {
if (sourceId.equals(source.getSourceId())
&& source.isControlledBy(affectedControllerId)) {
if (game.getState().getZone(source.getSourceId()) == Zone.GRAVEYARD) {
Player controller = game.getPlayer(affectedControllerId);
if (controller != null) {
controller.setCastSourceIdWithAlternateMana(sourceId, new ManaCostsImpl<>("{U}"), null);
return true;
}
}
}
return false;
}
}
class GlimpseTheCosmosReplacementEffect extends ReplacementEffectImpl {
public GlimpseTheCosmosReplacementEffect() {
super(Duration.OneUse, Outcome.Exile);
staticText = "As long as you control a Giant, you may cast {this} from your graveyard by paying {U} rather than paying its mana cost. If you cast {this} this way and it would be put into your graveyard, exile it instead";
}
public GlimpseTheCosmosReplacementEffect(final GlimpseTheCosmosReplacementEffect effect) {
super(effect);
}
@Override
public GlimpseTheCosmosReplacementEffect copy() {
return new GlimpseTheCosmosReplacementEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
return true;
}
@Override
public boolean replaceEvent(GameEvent event, Ability source, Game game) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
Card card = game.getCard(event.getTargetId());
if (card != null) {
discard();
return controller.moveCards(
card, Zone.EXILED, source, game, false, false, false, event.getAppliedEffects());
}
}
return false;
}
@Override
public boolean checksEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ZONE_CHANGE;
}
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
ManaSpentToCastWatcher watcher = game.getState().getWatcher(ManaSpentToCastWatcher.class);
if (watcher == null) {
return false;
}
Mana payment = watcher.getLastManaPayment(source.getSourceId());
if (payment != null
&& payment.getBlue() == 1 // must be blue mana
&& payment.count() == 1) { // must be just one
if (event.getTargetId().equals(source.getSourceId())
&& ((ZoneChangeEvent) event).getFromZone() == Zone.STACK
&& ((ZoneChangeEvent) event).getToZone() != Zone.EXILED) {
return true;
}
}
return false;
}
}

View file

@ -1,375 +1,375 @@
package mage.sets;
import mage.cards.ExpansionSet;
import mage.constants.Rarity;
import mage.constants.SetType;
/**
* @author North
*/
public final class MercadianMasques extends ExpansionSet {
private static final MercadianMasques instance = new MercadianMasques();
public static MercadianMasques getInstance() {
return instance;
}
private MercadianMasques() {
super("Mercadian Masques", "MMQ", ExpansionSet.buildDate(1999, 8, 25), SetType.EXPANSION);
this.blockName = "Masques";
this.hasBoosters = true;
this.numBoosterLands = 0;
this.numBoosterCommon = 11;
this.numBoosterUncommon = 3;
this.numBoosterRare = 1;
this.ratioBoosterMythic = 0;
cards.add(new SetCardInfo("Aerial Caravan", 58, Rarity.RARE, mage.cards.a.AerialCaravan.class));
cards.add(new SetCardInfo("Afterlife", 1, Rarity.UNCOMMON, mage.cards.a.Afterlife.class));
cards.add(new SetCardInfo("Alabaster Wall", 2, Rarity.COMMON, mage.cards.a.AlabasterWall.class));
cards.add(new SetCardInfo("Alley Grifters", 115, Rarity.COMMON, mage.cards.a.AlleyGrifters.class));
cards.add(new SetCardInfo("Ancestral Mask", 229, Rarity.COMMON, mage.cards.a.AncestralMask.class));
cards.add(new SetCardInfo("Armistice", 3, Rarity.RARE, mage.cards.a.Armistice.class));
cards.add(new SetCardInfo("Arms Dealer", 172, Rarity.UNCOMMON, mage.cards.a.ArmsDealer.class));
cards.add(new SetCardInfo("Arrest", 4, Rarity.UNCOMMON, mage.cards.a.Arrest.class));
cards.add(new SetCardInfo("Assembly Hall", 286, Rarity.RARE, mage.cards.a.AssemblyHall.class));
cards.add(new SetCardInfo("Ballista Squad", 5, Rarity.UNCOMMON, mage.cards.b.BallistaSquad.class));
cards.add(new SetCardInfo("Balloon Peddler", 59, Rarity.COMMON, mage.cards.b.BalloonPeddler.class));
cards.add(new SetCardInfo("Barbed Wire", 287, Rarity.UNCOMMON, mage.cards.b.BarbedWire.class));
cards.add(new SetCardInfo("Battle Rampart", 173, Rarity.COMMON, mage.cards.b.BattleRampart.class));
cards.add(new SetCardInfo("Battle Squadron", 174, Rarity.RARE, mage.cards.b.BattleSquadron.class));
cards.add(new SetCardInfo("Bifurcate", 230, Rarity.RARE, mage.cards.b.Bifurcate.class));
cards.add(new SetCardInfo("Black Market", 116, Rarity.RARE, mage.cards.b.BlackMarket.class));
cards.add(new SetCardInfo("Blaster Mage", 175, Rarity.COMMON, mage.cards.b.BlasterMage.class));
cards.add(new SetCardInfo("Blockade Runner", 60, Rarity.COMMON, mage.cards.b.BlockadeRunner.class));
cards.add(new SetCardInfo("Blood Hound", 176, Rarity.RARE, mage.cards.b.BloodHound.class));
cards.add(new SetCardInfo("Blood Oath", 177, Rarity.RARE, mage.cards.b.BloodOath.class));
cards.add(new SetCardInfo("Boa Constrictor", 231, Rarity.UNCOMMON, mage.cards.b.BoaConstrictor.class));
cards.add(new SetCardInfo("Bog Smugglers", 117, Rarity.COMMON, mage.cards.b.BogSmugglers.class));
cards.add(new SetCardInfo("Bog Witch", 118, Rarity.COMMON, mage.cards.b.BogWitch.class));
cards.add(new SetCardInfo("Brainstorm", 61, Rarity.COMMON, mage.cards.b.Brainstorm.class));
cards.add(new SetCardInfo("Brawl", 178, Rarity.RARE, mage.cards.b.Brawl.class));
cards.add(new SetCardInfo("Briar Patch", 232, Rarity.UNCOMMON, mage.cards.b.BriarPatch.class));
cards.add(new SetCardInfo("Bribery", 62, Rarity.RARE, mage.cards.b.Bribery.class));
cards.add(new SetCardInfo("Buoyancy", 63, Rarity.COMMON, mage.cards.b.Buoyancy.class));
cards.add(new SetCardInfo("Cackling Witch", 119, Rarity.UNCOMMON, mage.cards.c.CacklingWitch.class));
cards.add(new SetCardInfo("Caller of the Hunt", 233, Rarity.RARE, mage.cards.c.CallerOfTheHunt.class));
cards.add(new SetCardInfo("Cateran Brute", 120, Rarity.COMMON, mage.cards.c.CateranBrute.class));
cards.add(new SetCardInfo("Cateran Enforcer", 121, Rarity.UNCOMMON, mage.cards.c.CateranEnforcer.class));
cards.add(new SetCardInfo("Cateran Kidnappers", 122, Rarity.UNCOMMON, mage.cards.c.CateranKidnappers.class));
cards.add(new SetCardInfo("Cateran Overlord", 123, Rarity.RARE, mage.cards.c.CateranOverlord.class));
cards.add(new SetCardInfo("Cateran Persuader", 124, Rarity.COMMON, mage.cards.c.CateranPersuader.class));
cards.add(new SetCardInfo("Cateran Slaver", 125, Rarity.RARE, mage.cards.c.CateranSlaver.class));
cards.add(new SetCardInfo("Cateran Summons", 126, Rarity.UNCOMMON, mage.cards.c.CateranSummons.class));
cards.add(new SetCardInfo("Caustic Wasps", 234, Rarity.UNCOMMON, mage.cards.c.CausticWasps.class));
cards.add(new SetCardInfo("Cave-In", 180, Rarity.RARE, mage.cards.c.CaveIn.class));
cards.add(new SetCardInfo("Cavern Crawler", 181, Rarity.COMMON, mage.cards.c.CavernCrawler.class));
cards.add(new SetCardInfo("Cave Sense", 179, Rarity.COMMON, mage.cards.c.CaveSense.class));
cards.add(new SetCardInfo("Ceremonial Guard", 182, Rarity.COMMON, mage.cards.c.CeremonialGuard.class));
cards.add(new SetCardInfo("Chambered Nautilus", 64, Rarity.UNCOMMON, mage.cards.c.ChamberedNautilus.class));
cards.add(new SetCardInfo("Chameleon Spirit", 65, Rarity.UNCOMMON, mage.cards.c.ChameleonSpirit.class));
cards.add(new SetCardInfo("Charisma", 66, Rarity.RARE, mage.cards.c.Charisma.class));
cards.add(new SetCardInfo("Charm Peddler", 6, Rarity.COMMON, mage.cards.c.CharmPeddler.class));
cards.add(new SetCardInfo("Charmed Griffin", 7, Rarity.UNCOMMON, mage.cards.c.CharmedGriffin.class));
cards.add(new SetCardInfo("Cho-Arrim Alchemist", 8, Rarity.RARE, mage.cards.c.ChoArrimAlchemist.class));
cards.add(new SetCardInfo("Cho-Arrim Bruiser", 9, Rarity.RARE, mage.cards.c.ChoArrimBruiser.class));
cards.add(new SetCardInfo("Cho-Arrim Legate", 10, Rarity.UNCOMMON, mage.cards.c.ChoArrimLegate.class));
cards.add(new SetCardInfo("Cho-Manno, Revolutionary", 11, Rarity.RARE, mage.cards.c.ChoMannoRevolutionary.class));
cards.add(new SetCardInfo("Cho-Manno's Blessing", 12, Rarity.COMMON, mage.cards.c.ChoMannosBlessing.class));
cards.add(new SetCardInfo("Cinder Elemental", 183, Rarity.UNCOMMON, mage.cards.c.CinderElemental.class));
cards.add(new SetCardInfo("Clear the Land", 235, Rarity.RARE, mage.cards.c.ClearTheLand.class));
cards.add(new SetCardInfo("Close Quarters", 184, Rarity.UNCOMMON, mage.cards.c.CloseQuarters.class));
cards.add(new SetCardInfo("Cloud Sprite", 67, Rarity.COMMON, mage.cards.c.CloudSprite.class));
cards.add(new SetCardInfo("Coastal Piracy", 68, Rarity.UNCOMMON, mage.cards.c.CoastalPiracy.class));
cards.add(new SetCardInfo("Collective Unconscious", 236, Rarity.RARE, mage.cards.c.CollectiveUnconscious.class));
cards.add(new SetCardInfo("Common Cause", 13, Rarity.RARE, mage.cards.c.CommonCause.class));
cards.add(new SetCardInfo("Conspiracy", 127, Rarity.RARE, mage.cards.c.Conspiracy.class));
cards.add(new SetCardInfo("Cornered Market", 14, Rarity.RARE, mage.cards.c.CorneredMarket.class));
cards.add(new SetCardInfo("Corrupt Official", 128, Rarity.RARE, mage.cards.c.CorruptOfficial.class));
cards.add(new SetCardInfo("Counterspell", 69, Rarity.COMMON, mage.cards.c.Counterspell.class));
cards.add(new SetCardInfo("Cowardice", 70, Rarity.RARE, mage.cards.c.Cowardice.class));
cards.add(new SetCardInfo("Crackdown", 15, Rarity.RARE, mage.cards.c.Crackdown.class));
cards.add(new SetCardInfo("Crag Saurian", 185, Rarity.RARE, mage.cards.c.CragSaurian.class));
cards.add(new SetCardInfo("Crash", 186, Rarity.COMMON, mage.cards.c.Crash.class));
cards.add(new SetCardInfo("Credit Voucher", 289, Rarity.UNCOMMON, mage.cards.c.CreditVoucher.class));
cards.add(new SetCardInfo("Crenellated Wall", 290, Rarity.UNCOMMON, mage.cards.c.CrenellatedWall.class));
cards.add(new SetCardInfo("Crooked Scales", 291, Rarity.RARE, mage.cards.c.CrookedScales.class));
cards.add(new SetCardInfo("Crossbow Infantry", 16, Rarity.COMMON, mage.cards.c.CrossbowInfantry.class));
cards.add(new SetCardInfo("Crumbling Sanctuary", 292, Rarity.RARE, mage.cards.c.CrumblingSanctuary.class));
cards.add(new SetCardInfo("Customs Depot", 71, Rarity.UNCOMMON, mage.cards.c.CustomsDepot.class));
cards.add(new SetCardInfo("Dark Ritual", 129, Rarity.COMMON, mage.cards.d.DarkRitual.class));
cards.add(new SetCardInfo("Darting Merfolk", 72, Rarity.COMMON, mage.cards.d.DartingMerfolk.class));
cards.add(new SetCardInfo("Dawnstrider", 237, Rarity.RARE, mage.cards.d.Dawnstrider.class));
cards.add(new SetCardInfo("Deadly Insect", 238, Rarity.COMMON, mage.cards.d.DeadlyInsect.class));
cards.add(new SetCardInfo("Deathgazer", 130, Rarity.UNCOMMON, mage.cards.d.Deathgazer.class));
cards.add(new SetCardInfo("Deepwood Drummer", 239, Rarity.COMMON, mage.cards.d.DeepwoodDrummer.class));
cards.add(new SetCardInfo("Deepwood Elder", 240, Rarity.RARE, mage.cards.d.DeepwoodElder.class));
cards.add(new SetCardInfo("Deepwood Ghoul", 131, Rarity.COMMON, mage.cards.d.DeepwoodGhoul.class));
cards.add(new SetCardInfo("Deepwood Legate", 132, Rarity.UNCOMMON, mage.cards.d.DeepwoodLegate.class));
cards.add(new SetCardInfo("Deepwood Tantiv", 241, Rarity.UNCOMMON, mage.cards.d.DeepwoodTantiv.class));
cards.add(new SetCardInfo("Deepwood Wolverine", 242, Rarity.COMMON, mage.cards.d.DeepwoodWolverine.class));
cards.add(new SetCardInfo("Dehydration", 73, Rarity.COMMON, mage.cards.d.Dehydration.class));
cards.add(new SetCardInfo("Delraich", 133, Rarity.RARE, mage.cards.d.Delraich.class));
cards.add(new SetCardInfo("Desert Twister", 243, Rarity.UNCOMMON, mage.cards.d.DesertTwister.class));
cards.add(new SetCardInfo("Devout Witness", 17, Rarity.COMMON, mage.cards.d.DevoutWitness.class));
cards.add(new SetCardInfo("Diplomatic Escort", 74, Rarity.UNCOMMON, mage.cards.d.DiplomaticEscort.class));
cards.add(new SetCardInfo("Diplomatic Immunity", 75, Rarity.COMMON, mage.cards.d.DiplomaticImmunity.class));
cards.add(new SetCardInfo("Disenchant", 18, Rarity.COMMON, mage.cards.d.Disenchant.class));
cards.add(new SetCardInfo("Distorting Lens", 293, Rarity.RARE, mage.cards.d.DistortingLens.class));
cards.add(new SetCardInfo("Drake Hatchling", 76, Rarity.COMMON, mage.cards.d.DrakeHatchling.class));
cards.add(new SetCardInfo("Dust Bowl", 316, Rarity.RARE, mage.cards.d.DustBowl.class));
cards.add(new SetCardInfo("Embargo", 77, Rarity.RARE, mage.cards.e.Embargo.class));
cards.add(new SetCardInfo("Energy Flux", 78, Rarity.UNCOMMON, mage.cards.e.EnergyFlux.class));
cards.add(new SetCardInfo("Enslaved Horror", 134, Rarity.UNCOMMON, mage.cards.e.EnslavedHorror.class));
cards.add(new SetCardInfo("Extortion", 135, Rarity.RARE, mage.cards.e.Extortion.class));
cards.add(new SetCardInfo("Extravagant Spirit", 79, Rarity.RARE, mage.cards.e.ExtravagantSpirit.class));
cards.add(new SetCardInfo("Eye of Ramos", 294, Rarity.RARE, mage.cards.e.EyeOfRamos.class));
cards.add(new SetCardInfo("False Demise", 80, Rarity.UNCOMMON, mage.cards.f.FalseDemise.class));
cards.add(new SetCardInfo("Ferocity", 245, Rarity.COMMON, mage.cards.f.Ferocity.class));
cards.add(new SetCardInfo("Flailing Manticore", 187, Rarity.RARE, mage.cards.f.FlailingManticore.class));
cards.add(new SetCardInfo("Flailing Ogre", 188, Rarity.UNCOMMON, mage.cards.f.FlailingOgre.class));
cards.add(new SetCardInfo("Flailing Soldier", 189, Rarity.COMMON, mage.cards.f.FlailingSoldier.class));
cards.add(new SetCardInfo("Flaming Sword", 190, Rarity.COMMON, mage.cards.f.FlamingSword.class));
cards.add(new SetCardInfo("Food Chain", 246, Rarity.RARE, mage.cards.f.FoodChain.class));
cards.add(new SetCardInfo("Forced March", 136, Rarity.RARE, mage.cards.f.ForcedMarch.class));
cards.add(new SetCardInfo("Forest", 347, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Forest", 348, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Forest", 349, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Forest", 350, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Foster", 247, Rarity.RARE, mage.cards.f.Foster.class));
cards.add(new SetCardInfo("Fountain of Cho", 317, Rarity.UNCOMMON, mage.cards.f.FountainOfCho.class));
cards.add(new SetCardInfo("Fountain Watch", 19, Rarity.RARE, mage.cards.f.FountainWatch.class));
cards.add(new SetCardInfo("Fresh Volunteers", 20, Rarity.COMMON, mage.cards.f.FreshVolunteers.class));
cards.add(new SetCardInfo("Furious Assault", 191, Rarity.COMMON, mage.cards.f.FuriousAssault.class));
cards.add(new SetCardInfo("Game Preserve", 248, Rarity.RARE, mage.cards.g.GamePreserve.class));
cards.add(new SetCardInfo("General's Regalia", 295, Rarity.RARE, mage.cards.g.GeneralsRegalia.class));
cards.add(new SetCardInfo("Gerrard's Irregulars", 192, Rarity.COMMON, mage.cards.g.GerrardsIrregulars.class));
cards.add(new SetCardInfo("Ghoul's Feast", 137, Rarity.UNCOMMON, mage.cards.g.GhoulsFeast.class));
cards.add(new SetCardInfo("Giant Caterpillar", 249, Rarity.COMMON, mage.cards.g.GiantCaterpillar.class));
cards.add(new SetCardInfo("Glowing Anemone", 81, Rarity.UNCOMMON, mage.cards.g.GlowingAnemone.class));
cards.add(new SetCardInfo("Groundskeeper", 250, Rarity.UNCOMMON, mage.cards.g.Groundskeeper.class));
cards.add(new SetCardInfo("Gush", 82, Rarity.COMMON, mage.cards.g.Gush.class));
cards.add(new SetCardInfo("Hammer Mage", 193, Rarity.UNCOMMON, mage.cards.h.HammerMage.class));
cards.add(new SetCardInfo("Haunted Crossroads", 138, Rarity.UNCOMMON, mage.cards.h.HauntedCrossroads.class));
cards.add(new SetCardInfo("Heart of Ramos", 296, Rarity.RARE, mage.cards.h.HeartOfRamos.class));
cards.add(new SetCardInfo("Henge Guardian", 297, Rarity.UNCOMMON, mage.cards.h.HengeGuardian.class));
cards.add(new SetCardInfo("Henge of Ramos", 318, Rarity.UNCOMMON, mage.cards.h.HengeOfRamos.class));
cards.add(new SetCardInfo("Hickory Woodlot", 319, Rarity.COMMON, mage.cards.h.HickoryWoodlot.class));
cards.add(new SetCardInfo("High Market", 320, Rarity.RARE, mage.cards.h.HighMarket.class));
cards.add(new SetCardInfo("High Seas", 83, Rarity.UNCOMMON, mage.cards.h.HighSeas.class));
cards.add(new SetCardInfo("Highway Robber", 139, Rarity.COMMON, mage.cards.h.HighwayRobber.class));
cards.add(new SetCardInfo("Hired Giant", 194, Rarity.UNCOMMON, mage.cards.h.HiredGiant.class));
cards.add(new SetCardInfo("Honor the Fallen", 21, Rarity.RARE, mage.cards.h.HonorTheFallen.class));
cards.add(new SetCardInfo("Hoodwink", 84, Rarity.COMMON, mage.cards.h.Hoodwink.class));
cards.add(new SetCardInfo("Horned Troll", 251, Rarity.COMMON, mage.cards.h.HornedTroll.class));
cards.add(new SetCardInfo("Horn of Plenty", 298, Rarity.RARE, mage.cards.h.HornOfPlenty.class));
cards.add(new SetCardInfo("Horn of Ramos", 299, Rarity.RARE, mage.cards.h.HornOfRamos.class));
cards.add(new SetCardInfo("Howling Wolf", 252, Rarity.COMMON, mage.cards.h.HowlingWolf.class));
cards.add(new SetCardInfo("Hunted Wumpus", 253, Rarity.UNCOMMON, mage.cards.h.HuntedWumpus.class));
cards.add(new SetCardInfo("Ignoble Soldier", 22, Rarity.UNCOMMON, mage.cards.i.IgnobleSoldier.class));
cards.add(new SetCardInfo("Indentured Djinn", 85, Rarity.UNCOMMON, mage.cards.i.IndenturedDjinn.class));
cards.add(new SetCardInfo("Instigator", 140, Rarity.RARE, mage.cards.i.Instigator.class));
cards.add(new SetCardInfo("Insubordination", 141, Rarity.COMMON, mage.cards.i.Insubordination.class));
cards.add(new SetCardInfo("Intimidation", 142, Rarity.UNCOMMON, mage.cards.i.Intimidation.class));
cards.add(new SetCardInfo("Invigorate", 254, Rarity.COMMON, mage.cards.i.Invigorate.class));
cards.add(new SetCardInfo("Inviolability", 23, Rarity.COMMON, mage.cards.i.Inviolability.class));
cards.add(new SetCardInfo("Iron Lance", 300, Rarity.UNCOMMON, mage.cards.i.IronLance.class));
cards.add(new SetCardInfo("Island", 335, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Island", 336, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Island", 337, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Island", 338, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ivory Mask", 24, Rarity.RARE, mage.cards.i.IvoryMask.class));
cards.add(new SetCardInfo("Jeweled Torque", 301, Rarity.UNCOMMON, mage.cards.j.JeweledTorque.class));
cards.add(new SetCardInfo("Jhovall Queen", 25, Rarity.RARE, mage.cards.j.JhovallQueen.class));
cards.add(new SetCardInfo("Jhovall Rider", 26, Rarity.UNCOMMON, mage.cards.j.JhovallRider.class));
cards.add(new SetCardInfo("Karn's Touch", 86, Rarity.RARE, mage.cards.k.KarnsTouch.class));
cards.add(new SetCardInfo("Kris Mage", 195, Rarity.COMMON, mage.cards.k.KrisMage.class));
cards.add(new SetCardInfo("Kyren Archive", 302, Rarity.RARE, mage.cards.k.KyrenArchive.class));
cards.add(new SetCardInfo("Kyren Glider", 196, Rarity.COMMON, mage.cards.k.KyrenGlider.class));
cards.add(new SetCardInfo("Kyren Legate", 197, Rarity.UNCOMMON, mage.cards.k.KyrenLegate.class));
cards.add(new SetCardInfo("Kyren Negotiations", 198, Rarity.UNCOMMON, mage.cards.k.KyrenNegotiations.class));
cards.add(new SetCardInfo("Kyren Sniper", 199, Rarity.COMMON, mage.cards.k.KyrenSniper.class));
cards.add(new SetCardInfo("Kyren Toy", 303, Rarity.RARE, mage.cards.k.KyrenToy.class));
cards.add(new SetCardInfo("Land Grant", 255, Rarity.COMMON, mage.cards.l.LandGrant.class));
cards.add(new SetCardInfo("Larceny", 143, Rarity.UNCOMMON, mage.cards.l.Larceny.class));
cards.add(new SetCardInfo("Last Breath", 27, Rarity.UNCOMMON, mage.cards.l.LastBreath.class));
cards.add(new SetCardInfo("Lava Runner", 200, Rarity.RARE, mage.cards.l.LavaRunner.class));
cards.add(new SetCardInfo("Liability", 144, Rarity.RARE, mage.cards.l.Liability.class));
cards.add(new SetCardInfo("Lightning Hounds", 201, Rarity.COMMON, mage.cards.l.LightningHounds.class));
cards.add(new SetCardInfo("Lithophage", 202, Rarity.RARE, mage.cards.l.Lithophage.class));
cards.add(new SetCardInfo("Lumbering Satyr", 257, Rarity.UNCOMMON, mage.cards.l.LumberingSatyr.class));
cards.add(new SetCardInfo("Lunge", 203, Rarity.COMMON, mage.cards.l.Lunge.class));
cards.add(new SetCardInfo("Lure", 258, Rarity.UNCOMMON, mage.cards.l.Lure.class));
cards.add(new SetCardInfo("Maggot Therapy", 145, Rarity.COMMON, mage.cards.m.MaggotTherapy.class));
cards.add(new SetCardInfo("Magistrate's Scepter", 304, Rarity.RARE, mage.cards.m.MagistratesScepter.class));
cards.add(new SetCardInfo("Magistrate's Veto", 204, Rarity.UNCOMMON, mage.cards.m.MagistratesVeto.class));
cards.add(new SetCardInfo("Megatherium", 259, Rarity.RARE, mage.cards.m.Megatherium.class));
cards.add(new SetCardInfo("Mercadia's Downfall", 205, Rarity.UNCOMMON, mage.cards.m.MercadiasDownfall.class));
cards.add(new SetCardInfo("Mercadian Atlas", 305, Rarity.RARE, mage.cards.m.MercadianAtlas.class));
cards.add(new SetCardInfo("Mercadian Bazaar", 321, Rarity.UNCOMMON, mage.cards.m.MercadianBazaar.class));
cards.add(new SetCardInfo("Mercadian Lift", 306, Rarity.RARE, mage.cards.m.MercadianLift.class));
cards.add(new SetCardInfo("Midnight Ritual", 146, Rarity.RARE, mage.cards.m.MidnightRitual.class));
cards.add(new SetCardInfo("Misdirection", 87, Rarity.RARE, mage.cards.m.Misdirection.class));
cards.add(new SetCardInfo("Misshapen Fiend", 147, Rarity.COMMON, mage.cards.m.MisshapenFiend.class));
cards.add(new SetCardInfo("Misstep", 88, Rarity.COMMON, mage.cards.m.Misstep.class));
cards.add(new SetCardInfo("Molting Harpy", 148, Rarity.UNCOMMON, mage.cards.m.MoltingHarpy.class));
cards.add(new SetCardInfo("Moment of Silence", 28, Rarity.COMMON, mage.cards.m.MomentOfSilence.class));
cards.add(new SetCardInfo("Monkey Cage", 307, Rarity.RARE, mage.cards.m.MonkeyCage.class));
cards.add(new SetCardInfo("Moonlit Wake", 29, Rarity.UNCOMMON, mage.cards.m.MoonlitWake.class));
cards.add(new SetCardInfo("Mountain", 343, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Mountain", 344, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Mountain", 345, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Mountain", 346, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Muzzle", 30, Rarity.COMMON, mage.cards.m.Muzzle.class));
cards.add(new SetCardInfo("Natural Affinity", 260, Rarity.RARE, mage.cards.n.NaturalAffinity.class));
cards.add(new SetCardInfo("Nether Spirit", 149, Rarity.RARE, mage.cards.n.NetherSpirit.class));
cards.add(new SetCardInfo("Nightwind Glider", 31, Rarity.COMMON, mage.cards.n.NightwindGlider.class));
cards.add(new SetCardInfo("Noble Purpose", 32, Rarity.UNCOMMON, mage.cards.n.NoblePurpose.class));
cards.add(new SetCardInfo("Notorious Assassin", 150, Rarity.RARE, mage.cards.n.NotoriousAssassin.class));
cards.add(new SetCardInfo("Ogre Taskmaster", 206, Rarity.UNCOMMON, mage.cards.o.OgreTaskmaster.class));
cards.add(new SetCardInfo("Orim's Cure", 33, Rarity.COMMON, mage.cards.o.OrimsCure.class));
cards.add(new SetCardInfo("Overtaker", 89, Rarity.RARE, mage.cards.o.Overtaker.class));
cards.add(new SetCardInfo("Panacea", 308, Rarity.UNCOMMON, mage.cards.p.Panacea.class));
cards.add(new SetCardInfo("Pangosaur", 261, Rarity.RARE, mage.cards.p.Pangosaur.class));
cards.add(new SetCardInfo("Peat Bog", 322, Rarity.COMMON, mage.cards.p.PeatBog.class));
cards.add(new SetCardInfo("Pious Warrior", 34, Rarity.COMMON, mage.cards.p.PiousWarrior.class));
cards.add(new SetCardInfo("Plains", 331, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Plains", 332, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Plains", 333, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Plains", 334, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Port Inspector", 90, Rarity.COMMON, mage.cards.p.PortInspector.class));
cards.add(new SetCardInfo("Power Matrix", 309, Rarity.RARE, mage.cards.p.PowerMatrix.class));
cards.add(new SetCardInfo("Pretender's Claim", 151, Rarity.UNCOMMON, mage.cards.p.PretendersClaim.class));
cards.add(new SetCardInfo("Primeval Shambler", 152, Rarity.UNCOMMON, mage.cards.p.PrimevalShambler.class));
cards.add(new SetCardInfo("Puffer Extract", 310, Rarity.UNCOMMON, mage.cards.p.PufferExtract.class));
cards.add(new SetCardInfo("Pulverize", 207, Rarity.RARE, mage.cards.p.Pulverize.class));
cards.add(new SetCardInfo("Putrefaction", 153, Rarity.UNCOMMON, mage.cards.p.Putrefaction.class));
cards.add(new SetCardInfo("Puppet's Verdict", 208, Rarity.RARE, mage.cards.p.PuppetsVerdict.class));
cards.add(new SetCardInfo("Quagmire Lamprey", 154, Rarity.UNCOMMON, mage.cards.q.QuagmireLamprey.class));
cards.add(new SetCardInfo("Rain of Tears", 155, Rarity.UNCOMMON, mage.cards.r.RainOfTears.class));
cards.add(new SetCardInfo("Ramosian Captain", 35, Rarity.UNCOMMON, mage.cards.r.RamosianCaptain.class));
cards.add(new SetCardInfo("Ramosian Commander", 36, Rarity.UNCOMMON, mage.cards.r.RamosianCommander.class));
cards.add(new SetCardInfo("Ramosian Lieutenant", 37, Rarity.COMMON, mage.cards.r.RamosianLieutenant.class));
cards.add(new SetCardInfo("Ramosian Rally", 38, Rarity.COMMON, mage.cards.r.RamosianRally.class));
cards.add(new SetCardInfo("Ramosian Sergeant", 39, Rarity.COMMON, mage.cards.r.RamosianSergeant.class));
cards.add(new SetCardInfo("Ramosian Sky Marshal", 40, Rarity.RARE, mage.cards.r.RamosianSkyMarshal.class));
cards.add(new SetCardInfo("Rampart Crawler", 156, Rarity.COMMON, mage.cards.r.RampartCrawler.class));
cards.add(new SetCardInfo("Rappelling Scouts", 41, Rarity.RARE, mage.cards.r.RappellingScouts.class));
cards.add(new SetCardInfo("Remote Farm", 323, Rarity.COMMON, mage.cards.r.RemoteFarm.class));
cards.add(new SetCardInfo("Renounce", 42, Rarity.UNCOMMON, mage.cards.r.Renounce.class));
cards.add(new SetCardInfo("Revered Elder", 43, Rarity.COMMON, mage.cards.r.ReveredElder.class));
cards.add(new SetCardInfo("Reverent Mantra", 44, Rarity.RARE, mage.cards.r.ReverentMantra.class));
cards.add(new SetCardInfo("Revive", 262, Rarity.UNCOMMON, mage.cards.r.Revive.class));
cards.add(new SetCardInfo("Righteous Aura", 45, Rarity.UNCOMMON, mage.cards.r.RighteousAura.class));
cards.add(new SetCardInfo("Righteous Indignation", 46, Rarity.UNCOMMON, mage.cards.r.RighteousIndignation.class));
cards.add(new SetCardInfo("Rishadan Airship", 91, Rarity.COMMON, mage.cards.r.RishadanAirship.class));
cards.add(new SetCardInfo("Rishadan Brigand", 92, Rarity.RARE, mage.cards.r.RishadanBrigand.class));
cards.add(new SetCardInfo("Rishadan Cutpurse", 93, Rarity.COMMON, mage.cards.r.RishadanCutpurse.class));
cards.add(new SetCardInfo("Rishadan Footpad", 94, Rarity.UNCOMMON, mage.cards.r.RishadanFootpad.class));
cards.add(new SetCardInfo("Rishadan Pawnshop", 311, Rarity.RARE, mage.cards.r.RishadanPawnshop.class));
cards.add(new SetCardInfo("Rishadan Port", 324, Rarity.RARE, mage.cards.r.RishadanPort.class));
cards.add(new SetCardInfo("Robber Fly", 209, Rarity.UNCOMMON, mage.cards.r.RobberFly.class));
cards.add(new SetCardInfo("Rock Badger", 210, Rarity.UNCOMMON, mage.cards.r.RockBadger.class));
cards.add(new SetCardInfo("Rouse", 157, Rarity.COMMON, mage.cards.r.Rouse.class));
cards.add(new SetCardInfo("Rushwood Dryad", 263, Rarity.COMMON, mage.cards.r.RushwoodDryad.class));
cards.add(new SetCardInfo("Rushwood Elemental", 264, Rarity.RARE, mage.cards.r.RushwoodElemental.class));
cards.add(new SetCardInfo("Rushwood Grove", 325, Rarity.UNCOMMON, mage.cards.r.RushwoodGrove.class));
cards.add(new SetCardInfo("Rushwood Herbalist", 265, Rarity.COMMON, mage.cards.r.RushwoodHerbalist.class));
cards.add(new SetCardInfo("Rushwood Legate", 266, Rarity.UNCOMMON, mage.cards.r.RushwoodLegate.class));
cards.add(new SetCardInfo("Saber Ants", 267, Rarity.UNCOMMON, mage.cards.s.SaberAnts.class));
cards.add(new SetCardInfo("Sacred Prey", 268, Rarity.COMMON, mage.cards.s.SacredPrey.class));
cards.add(new SetCardInfo("Sailmonger", 95, Rarity.UNCOMMON, mage.cards.s.Sailmonger.class));
cards.add(new SetCardInfo("Sand Squid", 96, Rarity.RARE, mage.cards.s.SandSquid.class));
cards.add(new SetCardInfo("Sandstone Needle", 326, Rarity.COMMON, mage.cards.s.SandstoneNeedle.class));
cards.add(new SetCardInfo("Saprazzan Bailiff", 97, Rarity.RARE, mage.cards.s.SaprazzanBailiff.class));
cards.add(new SetCardInfo("Saprazzan Breaker", 98, Rarity.UNCOMMON, mage.cards.s.SaprazzanBreaker.class));
cards.add(new SetCardInfo("Saprazzan Cove", 327, Rarity.UNCOMMON, mage.cards.s.SaprazzanCove.class));
cards.add(new SetCardInfo("Saprazzan Heir", 99, Rarity.RARE, mage.cards.s.SaprazzanHeir.class));
cards.add(new SetCardInfo("Saprazzan Legate", 100, Rarity.UNCOMMON, mage.cards.s.SaprazzanLegate.class));
cards.add(new SetCardInfo("Saprazzan Outrigger", 101, Rarity.COMMON, mage.cards.s.SaprazzanOutrigger.class));
cards.add(new SetCardInfo("Saprazzan Raider", 102, Rarity.COMMON, mage.cards.s.SaprazzanRaider.class));
cards.add(new SetCardInfo("Saprazzan Skerry", 328, Rarity.COMMON, mage.cards.s.SaprazzanSkerry.class));
cards.add(new SetCardInfo("Scandalmonger", 158, Rarity.UNCOMMON, mage.cards.s.Scandalmonger.class));
cards.add(new SetCardInfo("Security Detail", 47, Rarity.RARE, mage.cards.s.SecurityDetail.class));
cards.add(new SetCardInfo("Seismic Mage", 211, Rarity.RARE, mage.cards.s.SeismicMage.class));
cards.add(new SetCardInfo("Sever Soul", 159, Rarity.COMMON, mage.cards.s.SeverSoul.class));
cards.add(new SetCardInfo("Shock Troops", 212, Rarity.COMMON, mage.cards.s.ShockTroops.class));
cards.add(new SetCardInfo("Shoving Match", 103, Rarity.UNCOMMON, mage.cards.s.ShovingMatch.class));
cards.add(new SetCardInfo("Silent Assassin", 160, Rarity.RARE, mage.cards.s.SilentAssassin.class));
cards.add(new SetCardInfo("Silverglade Elemental", 269, Rarity.COMMON, mage.cards.s.SilvergladeElemental.class));
cards.add(new SetCardInfo("Silverglade Pathfinder", 270, Rarity.UNCOMMON, mage.cards.s.SilvergladePathfinder.class));
cards.add(new SetCardInfo("Sizzle", 213, Rarity.COMMON, mage.cards.s.Sizzle.class));
cards.add(new SetCardInfo("Skulking Fugitive", 161, Rarity.COMMON, mage.cards.s.SkulkingFugitive.class));
cards.add(new SetCardInfo("Skull of Ramos", 312, Rarity.RARE, mage.cards.s.SkullOfRamos.class));
cards.add(new SetCardInfo("Snake Pit", 271, Rarity.UNCOMMON, mage.cards.s.SnakePit.class));
cards.add(new SetCardInfo("Snorting Gahr", 272, Rarity.COMMON, mage.cards.s.SnortingGahr.class));
cards.add(new SetCardInfo("Snuff Out", 162, Rarity.COMMON, mage.cards.s.SnuffOut.class));
cards.add(new SetCardInfo("Soothing Balm", 48, Rarity.COMMON, mage.cards.s.SoothingBalm.class));
cards.add(new SetCardInfo("Soothsaying", 104, Rarity.UNCOMMON, mage.cards.s.Soothsaying.class));
cards.add(new SetCardInfo("Soul Channeling", 163, Rarity.COMMON, mage.cards.s.SoulChanneling.class));
cards.add(new SetCardInfo("Specter's Wail", 164, Rarity.COMMON, mage.cards.s.SpectersWail.class));
cards.add(new SetCardInfo("Spidersilk Armor", 273, Rarity.COMMON, mage.cards.s.SpidersilkArmor.class));
cards.add(new SetCardInfo("Spiritual Focus", 49, Rarity.RARE, mage.cards.s.SpiritualFocus.class));
cards.add(new SetCardInfo("Spontaneous Generation", 274, Rarity.RARE, mage.cards.s.SpontaneousGeneration.class));
cards.add(new SetCardInfo("Squall", 275, Rarity.COMMON, mage.cards.s.Squall.class));
cards.add(new SetCardInfo("Squallmonger", 276, Rarity.UNCOMMON, mage.cards.s.Squallmonger.class));
cards.add(new SetCardInfo("Squee, Goblin Nabob", 214, Rarity.RARE, mage.cards.s.SqueeGoblinNabob.class));
cards.add(new SetCardInfo("Squeeze", 105, Rarity.RARE, mage.cards.s.Squeeze.class));
cards.add(new SetCardInfo("Stamina", 277, Rarity.UNCOMMON, mage.cards.s.Stamina.class));
cards.add(new SetCardInfo("Statecraft", 106, Rarity.RARE, mage.cards.s.Statecraft.class));
cards.add(new SetCardInfo("Steadfast Guard", 50, Rarity.COMMON, mage.cards.s.SteadfastGuard.class));
cards.add(new SetCardInfo("Stinging Barrier", 107, Rarity.COMMON, mage.cards.s.StingingBarrier.class));
cards.add(new SetCardInfo("Stone Rain", 215, Rarity.COMMON, mage.cards.s.StoneRain.class));
cards.add(new SetCardInfo("Story Circle", 51, Rarity.UNCOMMON, mage.cards.s.StoryCircle.class));
cards.add(new SetCardInfo("Strongarm Thug", 165, Rarity.UNCOMMON, mage.cards.s.StrongarmThug.class));
cards.add(new SetCardInfo("Subterranean Hangar", 329, Rarity.UNCOMMON, mage.cards.s.SubterraneanHangar.class));
cards.add(new SetCardInfo("Sustenance", 278, Rarity.UNCOMMON, mage.cards.s.Sustenance.class));
cards.add(new SetCardInfo("Swamp", 339, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Swamp", 340, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Swamp", 341, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Swamp", 342, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Task Force", 52, Rarity.COMMON, mage.cards.t.TaskForce.class));
cards.add(new SetCardInfo("Tectonic Break", 216, Rarity.RARE, mage.cards.t.TectonicBreak.class));
cards.add(new SetCardInfo("Territorial Dispute", 217, Rarity.RARE, mage.cards.t.TerritorialDispute.class));
cards.add(new SetCardInfo("Thermal Glider", 53, Rarity.COMMON, mage.cards.t.ThermalGlider.class));
cards.add(new SetCardInfo("Thieves' Auction", 218, Rarity.RARE, mage.cards.t.ThievesAuction.class));
cards.add(new SetCardInfo("Thrashing Wumpus", 166, Rarity.RARE, mage.cards.t.ThrashingWumpus.class));
cards.add(new SetCardInfo("Thunderclap", 219, Rarity.COMMON, mage.cards.t.Thunderclap.class));
cards.add(new SetCardInfo("Thwart", 108, Rarity.UNCOMMON, mage.cards.t.Thwart.class));
cards.add(new SetCardInfo("Tidal Bore", 109, Rarity.COMMON, mage.cards.t.TidalBore.class));
cards.add(new SetCardInfo("Tidal Kraken", 110, Rarity.RARE, mage.cards.t.TidalKraken.class));
cards.add(new SetCardInfo("Tiger Claws", 279, Rarity.COMMON, mage.cards.t.TigerClaws.class));
cards.add(new SetCardInfo("Timid Drake", 111, Rarity.UNCOMMON, mage.cards.t.TimidDrake.class));
cards.add(new SetCardInfo("Tonic Peddler", 54, Rarity.UNCOMMON, mage.cards.t.TonicPeddler.class));
cards.add(new SetCardInfo("Tooth of Ramos", 313, Rarity.RARE, mage.cards.t.ToothOfRamos.class));
cards.add(new SetCardInfo("Tower of the Magistrate", 330, Rarity.RARE, mage.cards.t.TowerOfTheMagistrate.class));
cards.add(new SetCardInfo("Toymaker", 314, Rarity.UNCOMMON, mage.cards.t.Toymaker.class));
cards.add(new SetCardInfo("Trade Routes", 112, Rarity.RARE, mage.cards.t.TradeRoutes.class));
cards.add(new SetCardInfo("Tranquility", 280, Rarity.COMMON, mage.cards.t.Tranquility.class));
cards.add(new SetCardInfo("Trap Runner", 55, Rarity.UNCOMMON, mage.cards.t.TrapRunner.class));
cards.add(new SetCardInfo("Tremor", 220, Rarity.COMMON, mage.cards.t.Tremor.class));
cards.add(new SetCardInfo("Two-Headed Dragon", 221, Rarity.RARE, mage.cards.t.TwoHeadedDragon.class));
cards.add(new SetCardInfo("Undertaker", 167, Rarity.COMMON, mage.cards.u.Undertaker.class));
cards.add(new SetCardInfo("Unmask", 168, Rarity.RARE, mage.cards.u.Unmask.class));
cards.add(new SetCardInfo("Unnatural Hunger", 169, Rarity.RARE, mage.cards.u.UnnaturalHunger.class));
cards.add(new SetCardInfo("Uphill Battle", 222, Rarity.UNCOMMON, mage.cards.u.UphillBattle.class));
cards.add(new SetCardInfo("Vendetta", 170, Rarity.COMMON, mage.cards.v.Vendetta.class));
cards.add(new SetCardInfo("Venomous Breath", 281, Rarity.UNCOMMON, mage.cards.v.VenomousBreath.class));
cards.add(new SetCardInfo("Venomous Dragonfly", 282, Rarity.COMMON, mage.cards.v.VenomousDragonfly.class));
cards.add(new SetCardInfo("Vernal Equinox", 283, Rarity.RARE, mage.cards.v.VernalEquinox.class));
cards.add(new SetCardInfo("Vine Dryad", 284, Rarity.RARE, mage.cards.v.VineDryad.class));
cards.add(new SetCardInfo("Vine Trellis", 285, Rarity.COMMON, mage.cards.v.VineTrellis.class));
cards.add(new SetCardInfo("Volcanic Wind", 223, Rarity.UNCOMMON, mage.cards.v.VolcanicWind.class));
cards.add(new SetCardInfo("Wall of Distortion", 171, Rarity.COMMON, mage.cards.w.WallOfDistortion.class));
cards.add(new SetCardInfo("War Cadence", 224, Rarity.UNCOMMON, mage.cards.w.WarCadence.class));
cards.add(new SetCardInfo("War Tax", 113, Rarity.UNCOMMON, mage.cards.w.WarTax.class));
cards.add(new SetCardInfo("Warmonger", 225, Rarity.UNCOMMON, mage.cards.w.Warmonger.class));
cards.add(new SetCardInfo("Warpath", 226, Rarity.UNCOMMON, mage.cards.w.Warpath.class));
cards.add(new SetCardInfo("Waterfront Bouncer", 114, Rarity.COMMON, mage.cards.w.WaterfrontBouncer.class));
cards.add(new SetCardInfo("Wave of Reckoning", 56, Rarity.RARE, mage.cards.w.WaveOfReckoning.class));
cards.add(new SetCardInfo("Wild Jhovall", 227, Rarity.COMMON, mage.cards.w.WildJhovall.class));
cards.add(new SetCardInfo("Wishmonger", 57, Rarity.UNCOMMON, mage.cards.w.Wishmonger.class));
cards.add(new SetCardInfo("Word of Blasting", 228, Rarity.UNCOMMON, mage.cards.w.WordOfBlasting.class));
cards.add(new SetCardInfo("Worry Beads", 315, Rarity.RARE, mage.cards.w.WorryBeads.class));
}
}
package mage.sets;
import mage.cards.ExpansionSet;
import mage.constants.Rarity;
import mage.constants.SetType;
/**
* @author North
*/
public final class MercadianMasques extends ExpansionSet {
private static final MercadianMasques instance = new MercadianMasques();
public static MercadianMasques getInstance() {
return instance;
}
private MercadianMasques() {
super("Mercadian Masques", "MMQ", ExpansionSet.buildDate(1999, 8, 25), SetType.EXPANSION);
this.blockName = "Masques";
this.hasBoosters = true;
this.numBoosterLands = 0;
this.numBoosterCommon = 11;
this.numBoosterUncommon = 3;
this.numBoosterRare = 1;
this.ratioBoosterMythic = 0;
cards.add(new SetCardInfo("Aerial Caravan", 58, Rarity.RARE, mage.cards.a.AerialCaravan.class));
cards.add(new SetCardInfo("Afterlife", 1, Rarity.UNCOMMON, mage.cards.a.Afterlife.class));
cards.add(new SetCardInfo("Alabaster Wall", 2, Rarity.COMMON, mage.cards.a.AlabasterWall.class));
cards.add(new SetCardInfo("Alley Grifters", 115, Rarity.COMMON, mage.cards.a.AlleyGrifters.class));
cards.add(new SetCardInfo("Ancestral Mask", 229, Rarity.COMMON, mage.cards.a.AncestralMask.class));
cards.add(new SetCardInfo("Armistice", 3, Rarity.RARE, mage.cards.a.Armistice.class));
cards.add(new SetCardInfo("Arms Dealer", 172, Rarity.UNCOMMON, mage.cards.a.ArmsDealer.class));
cards.add(new SetCardInfo("Arrest", 4, Rarity.UNCOMMON, mage.cards.a.Arrest.class));
cards.add(new SetCardInfo("Assembly Hall", 286, Rarity.RARE, mage.cards.a.AssemblyHall.class));
cards.add(new SetCardInfo("Ballista Squad", 5, Rarity.UNCOMMON, mage.cards.b.BallistaSquad.class));
cards.add(new SetCardInfo("Balloon Peddler", 59, Rarity.COMMON, mage.cards.b.BalloonPeddler.class));
cards.add(new SetCardInfo("Barbed Wire", 287, Rarity.UNCOMMON, mage.cards.b.BarbedWire.class));
cards.add(new SetCardInfo("Battle Rampart", 173, Rarity.COMMON, mage.cards.b.BattleRampart.class));
cards.add(new SetCardInfo("Battle Squadron", 174, Rarity.RARE, mage.cards.b.BattleSquadron.class));
cards.add(new SetCardInfo("Bifurcate", 230, Rarity.RARE, mage.cards.b.Bifurcate.class));
cards.add(new SetCardInfo("Black Market", 116, Rarity.RARE, mage.cards.b.BlackMarket.class));
cards.add(new SetCardInfo("Blaster Mage", 175, Rarity.COMMON, mage.cards.b.BlasterMage.class));
cards.add(new SetCardInfo("Blockade Runner", 60, Rarity.COMMON, mage.cards.b.BlockadeRunner.class));
cards.add(new SetCardInfo("Blood Hound", 176, Rarity.RARE, mage.cards.b.BloodHound.class));
cards.add(new SetCardInfo("Blood Oath", 177, Rarity.RARE, mage.cards.b.BloodOath.class));
cards.add(new SetCardInfo("Boa Constrictor", 231, Rarity.UNCOMMON, mage.cards.b.BoaConstrictor.class));
cards.add(new SetCardInfo("Bog Smugglers", 117, Rarity.COMMON, mage.cards.b.BogSmugglers.class));
cards.add(new SetCardInfo("Bog Witch", 118, Rarity.COMMON, mage.cards.b.BogWitch.class));
cards.add(new SetCardInfo("Brainstorm", 61, Rarity.COMMON, mage.cards.b.Brainstorm.class));
cards.add(new SetCardInfo("Brawl", 178, Rarity.RARE, mage.cards.b.Brawl.class));
cards.add(new SetCardInfo("Briar Patch", 232, Rarity.UNCOMMON, mage.cards.b.BriarPatch.class));
cards.add(new SetCardInfo("Bribery", 62, Rarity.RARE, mage.cards.b.Bribery.class));
cards.add(new SetCardInfo("Buoyancy", 63, Rarity.COMMON, mage.cards.b.Buoyancy.class));
cards.add(new SetCardInfo("Cackling Witch", 119, Rarity.UNCOMMON, mage.cards.c.CacklingWitch.class));
cards.add(new SetCardInfo("Caller of the Hunt", 233, Rarity.RARE, mage.cards.c.CallerOfTheHunt.class));
cards.add(new SetCardInfo("Cateran Brute", 120, Rarity.COMMON, mage.cards.c.CateranBrute.class));
cards.add(new SetCardInfo("Cateran Enforcer", 121, Rarity.UNCOMMON, mage.cards.c.CateranEnforcer.class));
cards.add(new SetCardInfo("Cateran Kidnappers", 122, Rarity.UNCOMMON, mage.cards.c.CateranKidnappers.class));
cards.add(new SetCardInfo("Cateran Overlord", 123, Rarity.RARE, mage.cards.c.CateranOverlord.class));
cards.add(new SetCardInfo("Cateran Persuader", 124, Rarity.COMMON, mage.cards.c.CateranPersuader.class));
cards.add(new SetCardInfo("Cateran Slaver", 125, Rarity.RARE, mage.cards.c.CateranSlaver.class));
cards.add(new SetCardInfo("Cateran Summons", 126, Rarity.UNCOMMON, mage.cards.c.CateranSummons.class));
cards.add(new SetCardInfo("Caustic Wasps", 234, Rarity.UNCOMMON, mage.cards.c.CausticWasps.class));
cards.add(new SetCardInfo("Cave-In", 180, Rarity.RARE, mage.cards.c.CaveIn.class));
cards.add(new SetCardInfo("Cavern Crawler", 181, Rarity.COMMON, mage.cards.c.CavernCrawler.class));
cards.add(new SetCardInfo("Cave Sense", 179, Rarity.COMMON, mage.cards.c.CaveSense.class));
cards.add(new SetCardInfo("Ceremonial Guard", 182, Rarity.COMMON, mage.cards.c.CeremonialGuard.class));
cards.add(new SetCardInfo("Chambered Nautilus", 64, Rarity.UNCOMMON, mage.cards.c.ChamberedNautilus.class));
cards.add(new SetCardInfo("Chameleon Spirit", 65, Rarity.UNCOMMON, mage.cards.c.ChameleonSpirit.class));
cards.add(new SetCardInfo("Charisma", 66, Rarity.RARE, mage.cards.c.Charisma.class));
cards.add(new SetCardInfo("Charm Peddler", 6, Rarity.COMMON, mage.cards.c.CharmPeddler.class));
cards.add(new SetCardInfo("Charmed Griffin", 7, Rarity.UNCOMMON, mage.cards.c.CharmedGriffin.class));
cards.add(new SetCardInfo("Cho-Arrim Alchemist", 8, Rarity.RARE, mage.cards.c.ChoArrimAlchemist.class));
cards.add(new SetCardInfo("Cho-Arrim Bruiser", 9, Rarity.RARE, mage.cards.c.ChoArrimBruiser.class));
cards.add(new SetCardInfo("Cho-Arrim Legate", 10, Rarity.UNCOMMON, mage.cards.c.ChoArrimLegate.class));
cards.add(new SetCardInfo("Cho-Manno, Revolutionary", 11, Rarity.RARE, mage.cards.c.ChoMannoRevolutionary.class));
cards.add(new SetCardInfo("Cho-Manno's Blessing", 12, Rarity.COMMON, mage.cards.c.ChoMannosBlessing.class));
cards.add(new SetCardInfo("Cinder Elemental", 183, Rarity.UNCOMMON, mage.cards.c.CinderElemental.class));
cards.add(new SetCardInfo("Clear the Land", 235, Rarity.RARE, mage.cards.c.ClearTheLand.class));
cards.add(new SetCardInfo("Close Quarters", 184, Rarity.UNCOMMON, mage.cards.c.CloseQuarters.class));
cards.add(new SetCardInfo("Cloud Sprite", 67, Rarity.COMMON, mage.cards.c.CloudSprite.class));
cards.add(new SetCardInfo("Coastal Piracy", 68, Rarity.UNCOMMON, mage.cards.c.CoastalPiracy.class));
cards.add(new SetCardInfo("Collective Unconscious", 236, Rarity.RARE, mage.cards.c.CollectiveUnconscious.class));
cards.add(new SetCardInfo("Common Cause", 13, Rarity.RARE, mage.cards.c.CommonCause.class));
cards.add(new SetCardInfo("Conspiracy", 127, Rarity.RARE, mage.cards.c.Conspiracy.class));
cards.add(new SetCardInfo("Cornered Market", 14, Rarity.RARE, mage.cards.c.CorneredMarket.class));
cards.add(new SetCardInfo("Corrupt Official", 128, Rarity.RARE, mage.cards.c.CorruptOfficial.class));
cards.add(new SetCardInfo("Counterspell", 69, Rarity.COMMON, mage.cards.c.Counterspell.class));
cards.add(new SetCardInfo("Cowardice", 70, Rarity.RARE, mage.cards.c.Cowardice.class));
cards.add(new SetCardInfo("Crackdown", 15, Rarity.RARE, mage.cards.c.Crackdown.class));
cards.add(new SetCardInfo("Crag Saurian", 185, Rarity.RARE, mage.cards.c.CragSaurian.class));
cards.add(new SetCardInfo("Crash", 186, Rarity.COMMON, mage.cards.c.Crash.class));
cards.add(new SetCardInfo("Credit Voucher", 289, Rarity.UNCOMMON, mage.cards.c.CreditVoucher.class));
cards.add(new SetCardInfo("Crenellated Wall", 290, Rarity.UNCOMMON, mage.cards.c.CrenellatedWall.class));
cards.add(new SetCardInfo("Crooked Scales", 291, Rarity.RARE, mage.cards.c.CrookedScales.class));
cards.add(new SetCardInfo("Crossbow Infantry", 16, Rarity.COMMON, mage.cards.c.CrossbowInfantry.class));
cards.add(new SetCardInfo("Crumbling Sanctuary", 292, Rarity.RARE, mage.cards.c.CrumblingSanctuary.class));
cards.add(new SetCardInfo("Customs Depot", 71, Rarity.UNCOMMON, mage.cards.c.CustomsDepot.class));
cards.add(new SetCardInfo("Dark Ritual", 129, Rarity.COMMON, mage.cards.d.DarkRitual.class));
cards.add(new SetCardInfo("Darting Merfolk", 72, Rarity.COMMON, mage.cards.d.DartingMerfolk.class));
cards.add(new SetCardInfo("Dawnstrider", 237, Rarity.RARE, mage.cards.d.Dawnstrider.class));
cards.add(new SetCardInfo("Deadly Insect", 238, Rarity.COMMON, mage.cards.d.DeadlyInsect.class));
cards.add(new SetCardInfo("Deathgazer", 130, Rarity.UNCOMMON, mage.cards.d.Deathgazer.class));
cards.add(new SetCardInfo("Deepwood Drummer", 239, Rarity.COMMON, mage.cards.d.DeepwoodDrummer.class));
cards.add(new SetCardInfo("Deepwood Elder", 240, Rarity.RARE, mage.cards.d.DeepwoodElder.class));
cards.add(new SetCardInfo("Deepwood Ghoul", 131, Rarity.COMMON, mage.cards.d.DeepwoodGhoul.class));
cards.add(new SetCardInfo("Deepwood Legate", 132, Rarity.UNCOMMON, mage.cards.d.DeepwoodLegate.class));
cards.add(new SetCardInfo("Deepwood Tantiv", 241, Rarity.UNCOMMON, mage.cards.d.DeepwoodTantiv.class));
cards.add(new SetCardInfo("Deepwood Wolverine", 242, Rarity.COMMON, mage.cards.d.DeepwoodWolverine.class));
cards.add(new SetCardInfo("Dehydration", 73, Rarity.COMMON, mage.cards.d.Dehydration.class));
cards.add(new SetCardInfo("Delraich", 133, Rarity.RARE, mage.cards.d.Delraich.class));
cards.add(new SetCardInfo("Desert Twister", 243, Rarity.UNCOMMON, mage.cards.d.DesertTwister.class));
cards.add(new SetCardInfo("Devout Witness", 17, Rarity.COMMON, mage.cards.d.DevoutWitness.class));
cards.add(new SetCardInfo("Diplomatic Escort", 74, Rarity.UNCOMMON, mage.cards.d.DiplomaticEscort.class));
cards.add(new SetCardInfo("Diplomatic Immunity", 75, Rarity.COMMON, mage.cards.d.DiplomaticImmunity.class));
cards.add(new SetCardInfo("Disenchant", 18, Rarity.COMMON, mage.cards.d.Disenchant.class));
cards.add(new SetCardInfo("Distorting Lens", 293, Rarity.RARE, mage.cards.d.DistortingLens.class));
cards.add(new SetCardInfo("Drake Hatchling", 76, Rarity.COMMON, mage.cards.d.DrakeHatchling.class));
cards.add(new SetCardInfo("Dust Bowl", 316, Rarity.RARE, mage.cards.d.DustBowl.class));
cards.add(new SetCardInfo("Embargo", 77, Rarity.RARE, mage.cards.e.Embargo.class));
cards.add(new SetCardInfo("Energy Flux", 78, Rarity.UNCOMMON, mage.cards.e.EnergyFlux.class));
cards.add(new SetCardInfo("Enslaved Horror", 134, Rarity.UNCOMMON, mage.cards.e.EnslavedHorror.class));
cards.add(new SetCardInfo("Extortion", 135, Rarity.RARE, mage.cards.e.Extortion.class));
cards.add(new SetCardInfo("Extravagant Spirit", 79, Rarity.RARE, mage.cards.e.ExtravagantSpirit.class));
cards.add(new SetCardInfo("Eye of Ramos", 294, Rarity.RARE, mage.cards.e.EyeOfRamos.class));
cards.add(new SetCardInfo("False Demise", 80, Rarity.UNCOMMON, mage.cards.f.FalseDemise.class));
cards.add(new SetCardInfo("Ferocity", 245, Rarity.COMMON, mage.cards.f.Ferocity.class));
cards.add(new SetCardInfo("Flailing Manticore", 187, Rarity.RARE, mage.cards.f.FlailingManticore.class));
cards.add(new SetCardInfo("Flailing Ogre", 188, Rarity.UNCOMMON, mage.cards.f.FlailingOgre.class));
cards.add(new SetCardInfo("Flailing Soldier", 189, Rarity.COMMON, mage.cards.f.FlailingSoldier.class));
cards.add(new SetCardInfo("Flaming Sword", 190, Rarity.COMMON, mage.cards.f.FlamingSword.class));
cards.add(new SetCardInfo("Food Chain", 246, Rarity.RARE, mage.cards.f.FoodChain.class));
cards.add(new SetCardInfo("Forced March", 136, Rarity.RARE, mage.cards.f.ForcedMarch.class));
cards.add(new SetCardInfo("Forest", 347, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Forest", 348, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Forest", 349, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Forest", 350, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Foster", 247, Rarity.RARE, mage.cards.f.Foster.class));
cards.add(new SetCardInfo("Fountain of Cho", 317, Rarity.UNCOMMON, mage.cards.f.FountainOfCho.class));
cards.add(new SetCardInfo("Fountain Watch", 19, Rarity.RARE, mage.cards.f.FountainWatch.class));
cards.add(new SetCardInfo("Fresh Volunteers", 20, Rarity.COMMON, mage.cards.f.FreshVolunteers.class));
cards.add(new SetCardInfo("Furious Assault", 191, Rarity.COMMON, mage.cards.f.FuriousAssault.class));
cards.add(new SetCardInfo("Game Preserve", 248, Rarity.RARE, mage.cards.g.GamePreserve.class));
cards.add(new SetCardInfo("General's Regalia", 295, Rarity.RARE, mage.cards.g.GeneralsRegalia.class));
cards.add(new SetCardInfo("Gerrard's Irregulars", 192, Rarity.COMMON, mage.cards.g.GerrardsIrregulars.class));
cards.add(new SetCardInfo("Ghoul's Feast", 137, Rarity.UNCOMMON, mage.cards.g.GhoulsFeast.class));
cards.add(new SetCardInfo("Giant Caterpillar", 249, Rarity.COMMON, mage.cards.g.GiantCaterpillar.class));
cards.add(new SetCardInfo("Glowing Anemone", 81, Rarity.UNCOMMON, mage.cards.g.GlowingAnemone.class));
cards.add(new SetCardInfo("Groundskeeper", 250, Rarity.UNCOMMON, mage.cards.g.Groundskeeper.class));
cards.add(new SetCardInfo("Gush", 82, Rarity.COMMON, mage.cards.g.Gush.class));
cards.add(new SetCardInfo("Hammer Mage", 193, Rarity.UNCOMMON, mage.cards.h.HammerMage.class));
cards.add(new SetCardInfo("Haunted Crossroads", 138, Rarity.UNCOMMON, mage.cards.h.HauntedCrossroads.class));
cards.add(new SetCardInfo("Heart of Ramos", 296, Rarity.RARE, mage.cards.h.HeartOfRamos.class));
cards.add(new SetCardInfo("Henge Guardian", 297, Rarity.UNCOMMON, mage.cards.h.HengeGuardian.class));
cards.add(new SetCardInfo("Henge of Ramos", 318, Rarity.UNCOMMON, mage.cards.h.HengeOfRamos.class));
cards.add(new SetCardInfo("Hickory Woodlot", 319, Rarity.COMMON, mage.cards.h.HickoryWoodlot.class));
cards.add(new SetCardInfo("High Market", 320, Rarity.RARE, mage.cards.h.HighMarket.class));
cards.add(new SetCardInfo("High Seas", 83, Rarity.UNCOMMON, mage.cards.h.HighSeas.class));
cards.add(new SetCardInfo("Highway Robber", 139, Rarity.COMMON, mage.cards.h.HighwayRobber.class));
cards.add(new SetCardInfo("Hired Giant", 194, Rarity.UNCOMMON, mage.cards.h.HiredGiant.class));
cards.add(new SetCardInfo("Honor the Fallen", 21, Rarity.RARE, mage.cards.h.HonorTheFallen.class));
cards.add(new SetCardInfo("Hoodwink", 84, Rarity.COMMON, mage.cards.h.Hoodwink.class));
cards.add(new SetCardInfo("Horned Troll", 251, Rarity.COMMON, mage.cards.h.HornedTroll.class));
cards.add(new SetCardInfo("Horn of Plenty", 298, Rarity.RARE, mage.cards.h.HornOfPlenty.class));
cards.add(new SetCardInfo("Horn of Ramos", 299, Rarity.RARE, mage.cards.h.HornOfRamos.class));
cards.add(new SetCardInfo("Howling Wolf", 252, Rarity.COMMON, mage.cards.h.HowlingWolf.class));
cards.add(new SetCardInfo("Hunted Wumpus", 253, Rarity.UNCOMMON, mage.cards.h.HuntedWumpus.class));
cards.add(new SetCardInfo("Ignoble Soldier", 22, Rarity.UNCOMMON, mage.cards.i.IgnobleSoldier.class));
cards.add(new SetCardInfo("Indentured Djinn", 85, Rarity.UNCOMMON, mage.cards.i.IndenturedDjinn.class));
cards.add(new SetCardInfo("Instigator", 140, Rarity.RARE, mage.cards.i.Instigator.class));
cards.add(new SetCardInfo("Insubordination", 141, Rarity.COMMON, mage.cards.i.Insubordination.class));
cards.add(new SetCardInfo("Intimidation", 142, Rarity.UNCOMMON, mage.cards.i.Intimidation.class));
cards.add(new SetCardInfo("Invigorate", 254, Rarity.COMMON, mage.cards.i.Invigorate.class));
cards.add(new SetCardInfo("Inviolability", 23, Rarity.COMMON, mage.cards.i.Inviolability.class));
cards.add(new SetCardInfo("Iron Lance", 300, Rarity.UNCOMMON, mage.cards.i.IronLance.class));
cards.add(new SetCardInfo("Island", 335, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Island", 336, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Island", 337, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Island", 338, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ivory Mask", 24, Rarity.RARE, mage.cards.i.IvoryMask.class));
cards.add(new SetCardInfo("Jeweled Torque", 301, Rarity.UNCOMMON, mage.cards.j.JeweledTorque.class));
cards.add(new SetCardInfo("Jhovall Queen", 25, Rarity.RARE, mage.cards.j.JhovallQueen.class));
cards.add(new SetCardInfo("Jhovall Rider", 26, Rarity.UNCOMMON, mage.cards.j.JhovallRider.class));
cards.add(new SetCardInfo("Karn's Touch", 86, Rarity.RARE, mage.cards.k.KarnsTouch.class));
cards.add(new SetCardInfo("Kris Mage", 195, Rarity.COMMON, mage.cards.k.KrisMage.class));
cards.add(new SetCardInfo("Kyren Archive", 302, Rarity.RARE, mage.cards.k.KyrenArchive.class));
cards.add(new SetCardInfo("Kyren Glider", 196, Rarity.COMMON, mage.cards.k.KyrenGlider.class));
cards.add(new SetCardInfo("Kyren Legate", 197, Rarity.UNCOMMON, mage.cards.k.KyrenLegate.class));
cards.add(new SetCardInfo("Kyren Negotiations", 198, Rarity.UNCOMMON, mage.cards.k.KyrenNegotiations.class));
cards.add(new SetCardInfo("Kyren Sniper", 199, Rarity.COMMON, mage.cards.k.KyrenSniper.class));
cards.add(new SetCardInfo("Kyren Toy", 303, Rarity.RARE, mage.cards.k.KyrenToy.class));
cards.add(new SetCardInfo("Land Grant", 255, Rarity.COMMON, mage.cards.l.LandGrant.class));
cards.add(new SetCardInfo("Larceny", 143, Rarity.UNCOMMON, mage.cards.l.Larceny.class));
cards.add(new SetCardInfo("Last Breath", 27, Rarity.UNCOMMON, mage.cards.l.LastBreath.class));
cards.add(new SetCardInfo("Lava Runner", 200, Rarity.RARE, mage.cards.l.LavaRunner.class));
cards.add(new SetCardInfo("Liability", 144, Rarity.RARE, mage.cards.l.Liability.class));
cards.add(new SetCardInfo("Lightning Hounds", 201, Rarity.COMMON, mage.cards.l.LightningHounds.class));
cards.add(new SetCardInfo("Lithophage", 202, Rarity.RARE, mage.cards.l.Lithophage.class));
cards.add(new SetCardInfo("Lumbering Satyr", 257, Rarity.UNCOMMON, mage.cards.l.LumberingSatyr.class));
cards.add(new SetCardInfo("Lunge", 203, Rarity.COMMON, mage.cards.l.Lunge.class));
cards.add(new SetCardInfo("Lure", 258, Rarity.UNCOMMON, mage.cards.l.Lure.class));
cards.add(new SetCardInfo("Maggot Therapy", 145, Rarity.COMMON, mage.cards.m.MaggotTherapy.class));
cards.add(new SetCardInfo("Magistrate's Scepter", 304, Rarity.RARE, mage.cards.m.MagistratesScepter.class));
cards.add(new SetCardInfo("Magistrate's Veto", 204, Rarity.UNCOMMON, mage.cards.m.MagistratesVeto.class));
cards.add(new SetCardInfo("Megatherium", 259, Rarity.RARE, mage.cards.m.Megatherium.class));
cards.add(new SetCardInfo("Mercadia's Downfall", 205, Rarity.UNCOMMON, mage.cards.m.MercadiasDownfall.class));
cards.add(new SetCardInfo("Mercadian Atlas", 305, Rarity.RARE, mage.cards.m.MercadianAtlas.class));
cards.add(new SetCardInfo("Mercadian Bazaar", 321, Rarity.UNCOMMON, mage.cards.m.MercadianBazaar.class));
cards.add(new SetCardInfo("Mercadian Lift", 306, Rarity.RARE, mage.cards.m.MercadianLift.class));
cards.add(new SetCardInfo("Midnight Ritual", 146, Rarity.RARE, mage.cards.m.MidnightRitual.class));
cards.add(new SetCardInfo("Misdirection", 87, Rarity.RARE, mage.cards.m.Misdirection.class));
cards.add(new SetCardInfo("Misshapen Fiend", 147, Rarity.COMMON, mage.cards.m.MisshapenFiend.class));
cards.add(new SetCardInfo("Misstep", 88, Rarity.COMMON, mage.cards.m.Misstep.class));
cards.add(new SetCardInfo("Molting Harpy", 148, Rarity.UNCOMMON, mage.cards.m.MoltingHarpy.class));
cards.add(new SetCardInfo("Moment of Silence", 28, Rarity.COMMON, mage.cards.m.MomentOfSilence.class));
cards.add(new SetCardInfo("Monkey Cage", 307, Rarity.RARE, mage.cards.m.MonkeyCage.class));
cards.add(new SetCardInfo("Moonlit Wake", 29, Rarity.UNCOMMON, mage.cards.m.MoonlitWake.class));
cards.add(new SetCardInfo("Mountain", 343, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Mountain", 344, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Mountain", 345, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Mountain", 346, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Muzzle", 30, Rarity.COMMON, mage.cards.m.Muzzle.class));
cards.add(new SetCardInfo("Natural Affinity", 260, Rarity.RARE, mage.cards.n.NaturalAffinity.class));
cards.add(new SetCardInfo("Nether Spirit", 149, Rarity.RARE, mage.cards.n.NetherSpirit.class));
cards.add(new SetCardInfo("Nightwind Glider", 31, Rarity.COMMON, mage.cards.n.NightwindGlider.class));
cards.add(new SetCardInfo("Noble Purpose", 32, Rarity.UNCOMMON, mage.cards.n.NoblePurpose.class));
cards.add(new SetCardInfo("Notorious Assassin", 150, Rarity.RARE, mage.cards.n.NotoriousAssassin.class));
cards.add(new SetCardInfo("Ogre Taskmaster", 206, Rarity.UNCOMMON, mage.cards.o.OgreTaskmaster.class));
cards.add(new SetCardInfo("Orim's Cure", 33, Rarity.COMMON, mage.cards.o.OrimsCure.class));
cards.add(new SetCardInfo("Overtaker", 89, Rarity.RARE, mage.cards.o.Overtaker.class));
cards.add(new SetCardInfo("Panacea", 308, Rarity.UNCOMMON, mage.cards.p.Panacea.class));
cards.add(new SetCardInfo("Pangosaur", 261, Rarity.RARE, mage.cards.p.Pangosaur.class));
cards.add(new SetCardInfo("Peat Bog", 322, Rarity.COMMON, mage.cards.p.PeatBog.class));
cards.add(new SetCardInfo("Pious Warrior", 34, Rarity.COMMON, mage.cards.p.PiousWarrior.class));
cards.add(new SetCardInfo("Plains", 331, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Plains", 332, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Plains", 333, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Plains", 334, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Port Inspector", 90, Rarity.COMMON, mage.cards.p.PortInspector.class));
cards.add(new SetCardInfo("Power Matrix", 309, Rarity.RARE, mage.cards.p.PowerMatrix.class));
cards.add(new SetCardInfo("Pretender's Claim", 151, Rarity.UNCOMMON, mage.cards.p.PretendersClaim.class));
cards.add(new SetCardInfo("Primeval Shambler", 152, Rarity.UNCOMMON, mage.cards.p.PrimevalShambler.class));
cards.add(new SetCardInfo("Puffer Extract", 310, Rarity.UNCOMMON, mage.cards.p.PufferExtract.class));
cards.add(new SetCardInfo("Pulverize", 207, Rarity.RARE, mage.cards.p.Pulverize.class));
cards.add(new SetCardInfo("Putrefaction", 153, Rarity.UNCOMMON, mage.cards.p.Putrefaction.class));
cards.add(new SetCardInfo("Puppet's Verdict", 208, Rarity.RARE, mage.cards.p.PuppetsVerdict.class));
cards.add(new SetCardInfo("Quagmire Lamprey", 154, Rarity.UNCOMMON, mage.cards.q.QuagmireLamprey.class));
cards.add(new SetCardInfo("Rain of Tears", 155, Rarity.UNCOMMON, mage.cards.r.RainOfTears.class));
cards.add(new SetCardInfo("Ramosian Captain", 35, Rarity.UNCOMMON, mage.cards.r.RamosianCaptain.class));
cards.add(new SetCardInfo("Ramosian Commander", 36, Rarity.UNCOMMON, mage.cards.r.RamosianCommander.class));
cards.add(new SetCardInfo("Ramosian Lieutenant", 37, Rarity.COMMON, mage.cards.r.RamosianLieutenant.class));
cards.add(new SetCardInfo("Ramosian Rally", 38, Rarity.COMMON, mage.cards.r.RamosianRally.class));
cards.add(new SetCardInfo("Ramosian Sergeant", 39, Rarity.COMMON, mage.cards.r.RamosianSergeant.class));
cards.add(new SetCardInfo("Ramosian Sky Marshal", 40, Rarity.RARE, mage.cards.r.RamosianSkyMarshal.class));
cards.add(new SetCardInfo("Rampart Crawler", 156, Rarity.COMMON, mage.cards.r.RampartCrawler.class));
cards.add(new SetCardInfo("Rappelling Scouts", 41, Rarity.RARE, mage.cards.r.RappellingScouts.class));
cards.add(new SetCardInfo("Remote Farm", 323, Rarity.COMMON, mage.cards.r.RemoteFarm.class));
cards.add(new SetCardInfo("Renounce", 42, Rarity.UNCOMMON, mage.cards.r.Renounce.class));
cards.add(new SetCardInfo("Revered Elder", 43, Rarity.COMMON, mage.cards.r.ReveredElder.class));
cards.add(new SetCardInfo("Reverent Mantra", 44, Rarity.RARE, mage.cards.r.ReverentMantra.class));
cards.add(new SetCardInfo("Revive", 262, Rarity.UNCOMMON, mage.cards.r.Revive.class));
cards.add(new SetCardInfo("Righteous Aura", 45, Rarity.UNCOMMON, mage.cards.r.RighteousAura.class));
cards.add(new SetCardInfo("Righteous Indignation", 46, Rarity.UNCOMMON, mage.cards.r.RighteousIndignation.class));
cards.add(new SetCardInfo("Rishadan Airship", 91, Rarity.COMMON, mage.cards.r.RishadanAirship.class));
cards.add(new SetCardInfo("Rishadan Brigand", 92, Rarity.RARE, mage.cards.r.RishadanBrigand.class));
cards.add(new SetCardInfo("Rishadan Cutpurse", 93, Rarity.COMMON, mage.cards.r.RishadanCutpurse.class));
cards.add(new SetCardInfo("Rishadan Footpad", 94, Rarity.UNCOMMON, mage.cards.r.RishadanFootpad.class));
cards.add(new SetCardInfo("Rishadan Pawnshop", 311, Rarity.RARE, mage.cards.r.RishadanPawnshop.class));
cards.add(new SetCardInfo("Rishadan Port", 324, Rarity.RARE, mage.cards.r.RishadanPort.class));
cards.add(new SetCardInfo("Robber Fly", 209, Rarity.UNCOMMON, mage.cards.r.RobberFly.class));
cards.add(new SetCardInfo("Rock Badger", 210, Rarity.UNCOMMON, mage.cards.r.RockBadger.class));
cards.add(new SetCardInfo("Rouse", 157, Rarity.COMMON, mage.cards.r.Rouse.class));
cards.add(new SetCardInfo("Rushwood Dryad", 263, Rarity.COMMON, mage.cards.r.RushwoodDryad.class));
cards.add(new SetCardInfo("Rushwood Elemental", 264, Rarity.RARE, mage.cards.r.RushwoodElemental.class));
cards.add(new SetCardInfo("Rushwood Grove", 325, Rarity.UNCOMMON, mage.cards.r.RushwoodGrove.class));
cards.add(new SetCardInfo("Rushwood Herbalist", 265, Rarity.COMMON, mage.cards.r.RushwoodHerbalist.class));
cards.add(new SetCardInfo("Rushwood Legate", 266, Rarity.UNCOMMON, mage.cards.r.RushwoodLegate.class));
cards.add(new SetCardInfo("Saber Ants", 267, Rarity.UNCOMMON, mage.cards.s.SaberAnts.class));
cards.add(new SetCardInfo("Sacred Prey", 268, Rarity.COMMON, mage.cards.s.SacredPrey.class));
cards.add(new SetCardInfo("Sailmonger", 95, Rarity.UNCOMMON, mage.cards.s.Sailmonger.class));
cards.add(new SetCardInfo("Sand Squid", 96, Rarity.RARE, mage.cards.s.SandSquid.class));
cards.add(new SetCardInfo("Sandstone Needle", 326, Rarity.COMMON, mage.cards.s.SandstoneNeedle.class));
cards.add(new SetCardInfo("Saprazzan Bailiff", 97, Rarity.RARE, mage.cards.s.SaprazzanBailiff.class));
cards.add(new SetCardInfo("Saprazzan Breaker", 98, Rarity.UNCOMMON, mage.cards.s.SaprazzanBreaker.class));
cards.add(new SetCardInfo("Saprazzan Cove", 327, Rarity.UNCOMMON, mage.cards.s.SaprazzanCove.class));
cards.add(new SetCardInfo("Saprazzan Heir", 99, Rarity.RARE, mage.cards.s.SaprazzanHeir.class));
cards.add(new SetCardInfo("Saprazzan Legate", 100, Rarity.UNCOMMON, mage.cards.s.SaprazzanLegate.class));
cards.add(new SetCardInfo("Saprazzan Outrigger", 101, Rarity.COMMON, mage.cards.s.SaprazzanOutrigger.class));
cards.add(new SetCardInfo("Saprazzan Raider", 102, Rarity.COMMON, mage.cards.s.SaprazzanRaider.class));
cards.add(new SetCardInfo("Saprazzan Skerry", 328, Rarity.COMMON, mage.cards.s.SaprazzanSkerry.class));
cards.add(new SetCardInfo("Scandalmonger", 158, Rarity.UNCOMMON, mage.cards.s.Scandalmonger.class));
cards.add(new SetCardInfo("Security Detail", 47, Rarity.RARE, mage.cards.s.SecurityDetail.class));
cards.add(new SetCardInfo("Seismic Mage", 211, Rarity.RARE, mage.cards.s.SeismicMage.class));
cards.add(new SetCardInfo("Sever Soul", 159, Rarity.COMMON, mage.cards.s.SeverSoul.class));
cards.add(new SetCardInfo("Shock Troops", 212, Rarity.COMMON, mage.cards.s.ShockTroops.class));
cards.add(new SetCardInfo("Shoving Match", 103, Rarity.UNCOMMON, mage.cards.s.ShovingMatch.class));
cards.add(new SetCardInfo("Silent Assassin", 160, Rarity.RARE, mage.cards.s.SilentAssassin.class));
cards.add(new SetCardInfo("Silverglade Elemental", 269, Rarity.COMMON, mage.cards.s.SilvergladeElemental.class));
cards.add(new SetCardInfo("Silverglade Pathfinder", 270, Rarity.UNCOMMON, mage.cards.s.SilvergladePathfinder.class));
cards.add(new SetCardInfo("Sizzle", 213, Rarity.COMMON, mage.cards.s.Sizzle.class));
cards.add(new SetCardInfo("Skulking Fugitive", 161, Rarity.COMMON, mage.cards.s.SkulkingFugitive.class));
cards.add(new SetCardInfo("Skull of Ramos", 312, Rarity.RARE, mage.cards.s.SkullOfRamos.class));
cards.add(new SetCardInfo("Snake Pit", 271, Rarity.UNCOMMON, mage.cards.s.SnakePit.class));
cards.add(new SetCardInfo("Snorting Gahr", 272, Rarity.COMMON, mage.cards.s.SnortingGahr.class));
cards.add(new SetCardInfo("Snuff Out", 162, Rarity.COMMON, mage.cards.s.SnuffOut.class));
cards.add(new SetCardInfo("Soothing Balm", 48, Rarity.COMMON, mage.cards.s.SoothingBalm.class));
cards.add(new SetCardInfo("Soothsaying", 104, Rarity.UNCOMMON, mage.cards.s.Soothsaying.class));
cards.add(new SetCardInfo("Soul Channeling", 163, Rarity.COMMON, mage.cards.s.SoulChanneling.class));
cards.add(new SetCardInfo("Specter's Wail", 164, Rarity.COMMON, mage.cards.s.SpectersWail.class));
cards.add(new SetCardInfo("Spidersilk Armor", 273, Rarity.COMMON, mage.cards.s.SpidersilkArmor.class));
cards.add(new SetCardInfo("Spiritual Focus", 49, Rarity.RARE, mage.cards.s.SpiritualFocus.class));
cards.add(new SetCardInfo("Spontaneous Generation", 274, Rarity.RARE, mage.cards.s.SpontaneousGeneration.class));
cards.add(new SetCardInfo("Squall", 275, Rarity.COMMON, mage.cards.s.Squall.class));
cards.add(new SetCardInfo("Squallmonger", 276, Rarity.UNCOMMON, mage.cards.s.Squallmonger.class));
cards.add(new SetCardInfo("Squee, Goblin Nabob", 214, Rarity.RARE, mage.cards.s.SqueeGoblinNabob.class));
cards.add(new SetCardInfo("Squeeze", 105, Rarity.RARE, mage.cards.s.Squeeze.class));
cards.add(new SetCardInfo("Stamina", 277, Rarity.UNCOMMON, mage.cards.s.Stamina.class));
cards.add(new SetCardInfo("Statecraft", 106, Rarity.RARE, mage.cards.s.Statecraft.class));
cards.add(new SetCardInfo("Steadfast Guard", 50, Rarity.COMMON, mage.cards.s.SteadfastGuard.class));
cards.add(new SetCardInfo("Stinging Barrier", 107, Rarity.COMMON, mage.cards.s.StingingBarrier.class));
cards.add(new SetCardInfo("Stone Rain", 215, Rarity.COMMON, mage.cards.s.StoneRain.class));
cards.add(new SetCardInfo("Story Circle", 51, Rarity.UNCOMMON, mage.cards.s.StoryCircle.class));
cards.add(new SetCardInfo("Strongarm Thug", 165, Rarity.UNCOMMON, mage.cards.s.StrongarmThug.class));
cards.add(new SetCardInfo("Subterranean Hangar", 329, Rarity.UNCOMMON, mage.cards.s.SubterraneanHangar.class));
cards.add(new SetCardInfo("Sustenance", 278, Rarity.UNCOMMON, mage.cards.s.Sustenance.class));
cards.add(new SetCardInfo("Swamp", 339, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Swamp", 340, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Swamp", 341, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Swamp", 342, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Task Force", 52, Rarity.COMMON, mage.cards.t.TaskForce.class));
cards.add(new SetCardInfo("Tectonic Break", 216, Rarity.RARE, mage.cards.t.TectonicBreak.class));
cards.add(new SetCardInfo("Territorial Dispute", 217, Rarity.RARE, mage.cards.t.TerritorialDispute.class));
cards.add(new SetCardInfo("Thermal Glider", 53, Rarity.COMMON, mage.cards.t.ThermalGlider.class));
cards.add(new SetCardInfo("Thieves' Auction", 218, Rarity.RARE, mage.cards.t.ThievesAuction.class));
cards.add(new SetCardInfo("Thrashing Wumpus", 166, Rarity.RARE, mage.cards.t.ThrashingWumpus.class));
cards.add(new SetCardInfo("Thunderclap", 219, Rarity.COMMON, mage.cards.t.Thunderclap.class));
cards.add(new SetCardInfo("Thwart", 108, Rarity.UNCOMMON, mage.cards.t.Thwart.class));
cards.add(new SetCardInfo("Tidal Bore", 109, Rarity.COMMON, mage.cards.t.TidalBore.class));
cards.add(new SetCardInfo("Tidal Kraken", 110, Rarity.RARE, mage.cards.t.TidalKraken.class));
cards.add(new SetCardInfo("Tiger Claws", 279, Rarity.COMMON, mage.cards.t.TigerClaws.class));
cards.add(new SetCardInfo("Timid Drake", 111, Rarity.UNCOMMON, mage.cards.t.TimidDrake.class));
cards.add(new SetCardInfo("Tonic Peddler", 54, Rarity.UNCOMMON, mage.cards.t.TonicPeddler.class));
cards.add(new SetCardInfo("Tooth of Ramos", 313, Rarity.RARE, mage.cards.t.ToothOfRamos.class));
cards.add(new SetCardInfo("Tower of the Magistrate", 330, Rarity.RARE, mage.cards.t.TowerOfTheMagistrate.class));
cards.add(new SetCardInfo("Toymaker", 314, Rarity.UNCOMMON, mage.cards.t.Toymaker.class));
cards.add(new SetCardInfo("Trade Routes", 112, Rarity.RARE, mage.cards.t.TradeRoutes.class));
cards.add(new SetCardInfo("Tranquility", 280, Rarity.COMMON, mage.cards.t.Tranquility.class));
cards.add(new SetCardInfo("Trap Runner", 55, Rarity.UNCOMMON, mage.cards.t.TrapRunner.class));
cards.add(new SetCardInfo("Tremor", 220, Rarity.COMMON, mage.cards.t.Tremor.class));
cards.add(new SetCardInfo("Two-Headed Dragon", 221, Rarity.RARE, mage.cards.t.TwoHeadedDragon.class));
cards.add(new SetCardInfo("Undertaker", 167, Rarity.COMMON, mage.cards.u.Undertaker.class));
cards.add(new SetCardInfo("Unmask", 168, Rarity.RARE, mage.cards.u.Unmask.class));
cards.add(new SetCardInfo("Unnatural Hunger", 169, Rarity.RARE, mage.cards.u.UnnaturalHunger.class));
cards.add(new SetCardInfo("Uphill Battle", 222, Rarity.UNCOMMON, mage.cards.u.UphillBattle.class));
cards.add(new SetCardInfo("Vendetta", 170, Rarity.COMMON, mage.cards.v.Vendetta.class));
cards.add(new SetCardInfo("Venomous Breath", 281, Rarity.UNCOMMON, mage.cards.v.VenomousBreath.class));
cards.add(new SetCardInfo("Venomous Dragonfly", 282, Rarity.COMMON, mage.cards.v.VenomousDragonfly.class));
cards.add(new SetCardInfo("Vernal Equinox", 283, Rarity.RARE, mage.cards.v.VernalEquinox.class));
cards.add(new SetCardInfo("Vine Dryad", 284, Rarity.RARE, mage.cards.v.VineDryad.class));
cards.add(new SetCardInfo("Vine Trellis", 285, Rarity.COMMON, mage.cards.v.VineTrellis.class));
cards.add(new SetCardInfo("Volcanic Wind", 223, Rarity.UNCOMMON, mage.cards.v.VolcanicWind.class));
cards.add(new SetCardInfo("Wall of Distortion", 171, Rarity.COMMON, mage.cards.w.WallOfDistortion.class));
cards.add(new SetCardInfo("War Cadence", 224, Rarity.UNCOMMON, mage.cards.w.WarCadence.class));
cards.add(new SetCardInfo("War Tax", 113, Rarity.UNCOMMON, mage.cards.w.WarTax.class));
cards.add(new SetCardInfo("Warmonger", 225, Rarity.UNCOMMON, mage.cards.w.Warmonger.class));
cards.add(new SetCardInfo("Warpath", 226, Rarity.UNCOMMON, mage.cards.w.Warpath.class));
cards.add(new SetCardInfo("Waterfront Bouncer", 114, Rarity.COMMON, mage.cards.w.WaterfrontBouncer.class));
cards.add(new SetCardInfo("Wave of Reckoning", 56, Rarity.RARE, mage.cards.w.WaveOfReckoning.class));
cards.add(new SetCardInfo("Wild Jhovall", 227, Rarity.COMMON, mage.cards.w.WildJhovall.class));
cards.add(new SetCardInfo("Wishmonger", 57, Rarity.UNCOMMON, mage.cards.w.Wishmonger.class));
cards.add(new SetCardInfo("Word of Blasting", 228, Rarity.UNCOMMON, mage.cards.w.WordOfBlasting.class));
cards.add(new SetCardInfo("Worry Beads", 315, Rarity.RARE, mage.cards.w.WorryBeads.class));
}
}

View file

@ -1,110 +1,110 @@
package org.mage.test.cards.abilities.keywords;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import mage.counters.CounterType;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class CumulativeUpkeepTest extends CardTestPlayerBase {
@Test
public void basicTest() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 3);
// Flying; fear
// Cumulative upkeep {B}
addCard(Zone.HAND, playerA, "Phobian Phantasm"); // Creature {1}{B}{B} 3/3
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Phobian Phantasm");
// Phobian Phantasm - CumulativeUpkeepAbility: Cumulative upkeep {B}
setChoice(playerA, true); // Pay {B}?
attack(3, playerA, "Phobian Phantasm");
checkPermanentCounters("Age counters", 3, PhaseStep.PRECOMBAT_MAIN, playerA, "Phobian Phantasm", CounterType.AGE, 1);
setChoice(playerA, true); // Pay {B}{B}?
attack(5, playerA, "Phobian Phantasm");
checkPermanentCounters("Age counters", 5, PhaseStep.PRECOMBAT_MAIN, playerA, "Phobian Phantasm", CounterType.AGE, 2);
setChoice(playerA, false); // Pay {B}{B}{B}?
setStopAt(7, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertGraveyardCount(playerA, "Phobian Phantasm", 1);
assertLife(playerA, 20);
assertLife(playerB, 14);
}
/**
I changed control of a Illusions of Grandeur to an AI after cumulative upkeep had triggered but before it resolved.
I chose not to pay the upkeep cost and then either the AI sacrificed it or I sacrificed it, neither of which should happen.
I can't sacrifice it because it's not under my control. The AI can't sacrifice it because they are not instructed to do so.
Here is the reminder text for cumulative upkeep:
At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.
*/
@Test
public void controlChangeTest() {
setStrictChooseMode(true);
// Whenever Kor Celebrant or another creature enters the battlefield under your control, you gain 1 life.
addCard(Zone.HAND, playerB, "Kor Celebrant", 1); // Creature {2}{W}
addCard(Zone.BATTLEFIELD, playerB, "Plains", 3);
addCard(Zone.BATTLEFIELD, playerA, "Island", 6);
// Cumulative upkeep {2}
// When Illusions of Grandeur enters the battlefield, you gain 20 life.
// When Illusions of Grandeur leaves the battlefield, you lose 20 life.
addCard(Zone.HAND, playerA, "Illusions of Grandeur"); // Enchantment {3}{U}
// At the beginning of your upkeep, you may exchange control of target nonland permanent you control and target nonland permanent an opponent controls with an equal or lesser converted mana cost.
addCard(Zone.HAND, playerA, "Puca's Mischief"); // Enchantment {3}{U}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Illusions of Grandeur");
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Kor Celebrant");
// Illusions of Grandeur - CumulativeUpkeepAbility: Cumulative upkeep {2}
setChoice(playerA, true); // Pay {2}?
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Puca's Mischief");
setChoice(playerA, "Cumulative upkeep"); // Triggered list (total 2) which trigger goes first on the stack
addTarget(playerA, "Illusions of Grandeur"); // Own target permanent of Puca's Mischief
addTarget(playerA, "Kor Celebrant"); // Opponent's target permanent of Puca's Mischief
setChoice(playerA, true); // At the beginning of your upkeep, you may exchange control of target nonland permanent you control and target nonland permanent an opponent controls with an equal or lesser converted mana cost.
setChoice(playerA, false); // Pay {2}{2}?
checkPermanentCounters("Age counters", 5, PhaseStep.PRECOMBAT_MAIN, playerB, "Illusions of Grandeur", CounterType.AGE, 2);
setStopAt(5, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertLife(playerA, 40);
assertLife(playerB, 21);
assertPermanentCount(playerA, "Kor Celebrant", 1);
assertPermanentCount(playerB, "Illusions of Grandeur", 1);
}
package org.mage.test.cards.abilities.keywords;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import mage.counters.CounterType;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class CumulativeUpkeepTest extends CardTestPlayerBase {
@Test
public void basicTest() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 3);
// Flying; fear
// Cumulative upkeep {B}
addCard(Zone.HAND, playerA, "Phobian Phantasm"); // Creature {1}{B}{B} 3/3
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Phobian Phantasm");
// Phobian Phantasm - CumulativeUpkeepAbility: Cumulative upkeep {B}
setChoice(playerA, true); // Pay {B}?
attack(3, playerA, "Phobian Phantasm");
checkPermanentCounters("Age counters", 3, PhaseStep.PRECOMBAT_MAIN, playerA, "Phobian Phantasm", CounterType.AGE, 1);
setChoice(playerA, true); // Pay {B}{B}?
attack(5, playerA, "Phobian Phantasm");
checkPermanentCounters("Age counters", 5, PhaseStep.PRECOMBAT_MAIN, playerA, "Phobian Phantasm", CounterType.AGE, 2);
setChoice(playerA, false); // Pay {B}{B}{B}?
setStopAt(7, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertGraveyardCount(playerA, "Phobian Phantasm", 1);
assertLife(playerA, 20);
assertLife(playerB, 14);
}
/**
I changed control of a Illusions of Grandeur to an AI after cumulative upkeep had triggered but before it resolved.
I chose not to pay the upkeep cost and then either the AI sacrificed it or I sacrificed it, neither of which should happen.
I can't sacrifice it because it's not under my control. The AI can't sacrifice it because they are not instructed to do so.
Here is the reminder text for cumulative upkeep:
At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.
*/
@Test
public void controlChangeTest() {
setStrictChooseMode(true);
// Whenever Kor Celebrant or another creature enters the battlefield under your control, you gain 1 life.
addCard(Zone.HAND, playerB, "Kor Celebrant", 1); // Creature {2}{W}
addCard(Zone.BATTLEFIELD, playerB, "Plains", 3);
addCard(Zone.BATTLEFIELD, playerA, "Island", 6);
// Cumulative upkeep {2}
// When Illusions of Grandeur enters the battlefield, you gain 20 life.
// When Illusions of Grandeur leaves the battlefield, you lose 20 life.
addCard(Zone.HAND, playerA, "Illusions of Grandeur"); // Enchantment {3}{U}
// At the beginning of your upkeep, you may exchange control of target nonland permanent you control and target nonland permanent an opponent controls with an equal or lesser converted mana cost.
addCard(Zone.HAND, playerA, "Puca's Mischief"); // Enchantment {3}{U}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Illusions of Grandeur");
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Kor Celebrant");
// Illusions of Grandeur - CumulativeUpkeepAbility: Cumulative upkeep {2}
setChoice(playerA, true); // Pay {2}?
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Puca's Mischief");
setChoice(playerA, "Cumulative upkeep"); // Triggered list (total 2) which trigger goes first on the stack
addTarget(playerA, "Illusions of Grandeur"); // Own target permanent of Puca's Mischief
addTarget(playerA, "Kor Celebrant"); // Opponent's target permanent of Puca's Mischief
setChoice(playerA, true); // At the beginning of your upkeep, you may exchange control of target nonland permanent you control and target nonland permanent an opponent controls with an equal or lesser converted mana cost.
setChoice(playerA, false); // Pay {2}{2}?
checkPermanentCounters("Age counters", 5, PhaseStep.PRECOMBAT_MAIN, playerB, "Illusions of Grandeur", CounterType.AGE, 2);
setStopAt(5, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertLife(playerA, 40);
assertLife(playerB, 21);
assertPermanentCount(playerA, "Kor Celebrant", 1);
assertPermanentCount(playerB, "Illusions of Grandeur", 1);
}
}

View file

@ -1,179 +1,179 @@
package org.mage.test.cards.abilities.keywords;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
* @author LevelX2, JayDi85
*/
public class EntwineTest extends CardTestPlayerBase {
@Test
public void test_CastWithoutEntwine() {
// Choose one
// Barbed Lightning deals 3 damage to target creature.
// Barbed Lightning deals 3 damage to target player or planeswalker.
// Entwine {2} (Choose both if you pay the entwine cost.)
addCard(Zone.HAND, playerA, "Barbed Lightning", 1); // {2}{R}
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3);
//
addCard(Zone.BATTLEFIELD, playerA, "Balduvian Bears", 1); // 2/2
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Barbed Lightning");
setChoice(playerA, false); // not use Entwine
setModeChoice(playerA, "1"); // target creature
addTarget(playerA, "Balduvian Bears");
setStrictChooseMode(true);
setStopAt(1, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertLife(playerA, 20);
assertPermanentCount(playerA, "Balduvian Bears", 0);
assertTappedCount("Mountain", true, 3);
}
@Test
public void test_CastEntwine_Normal() {
// Choose one
// Barbed Lightning deals 3 damage to target creature.
// Barbed Lightning deals 3 damage to target player or planeswalker.
// Entwine {2} (Choose both if you pay the entwine cost.)
addCard(Zone.HAND, playerA, "Barbed Lightning", 1); // {2}{R}
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3 + 2);
//
addCard(Zone.BATTLEFIELD, playerA, "Balduvian Bears", 1); // 2/2
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Barbed Lightning");
setChoice(playerA, true); // use Entwine
addTarget(playerA, "Balduvian Bears");
addTarget(playerA, playerA);
setStrictChooseMode(true);
setStopAt(1, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertLife(playerA, 20 - 3);
assertPermanentCount(playerA, "Balduvian Bears", 0);
assertTappedCount("Mountain", true, 3 + 2);
}
@Test
public void test_CastEntwine_CostReduction() {
addCustomEffect_SpellCostModification(playerA, -4);
// Choose one
// Barbed Lightning deals 3 damage to target creature.
// Barbed Lightning deals 3 damage to target player or planeswalker.
// Entwine {2} (Choose both if you pay the entwine cost.)
addCard(Zone.HAND, playerA, "Barbed Lightning", 1); // {2}{R}
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 1); // -4 as cost reduction
//
addCard(Zone.BATTLEFIELD, playerA, "Balduvian Bears", 1); // 2/2
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Barbed Lightning");
setChoice(playerA, true); // use Entwine
addTarget(playerA, "Balduvian Bears");
addTarget(playerA, playerA);
setStrictChooseMode(true);
setStopAt(1, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertLife(playerA, 20 - 3);
assertPermanentCount(playerA, "Balduvian Bears", 0);
assertTappedCount("Mountain", true, 1);
}
@Test
public void test_CastEntwine_CostIncreasing() {
addCustomEffect_SpellCostModification(playerA, 5);
// Choose one
// Barbed Lightning deals 3 damage to target creature.
// Barbed Lightning deals 3 damage to target player or planeswalker.
// Entwine {2} (Choose both if you pay the entwine cost.)
addCard(Zone.HAND, playerA, "Barbed Lightning", 1); // {2}{R}
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3 + 2 + 5);
//
addCard(Zone.BATTLEFIELD, playerA, "Balduvian Bears", 1); // 2/2
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Barbed Lightning");
setChoice(playerA, true); // use Entwine
addTarget(playerA, "Balduvian Bears");
addTarget(playerA, playerA);
setStrictChooseMode(true);
setStopAt(1, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertLife(playerA, 20 - 3);
assertPermanentCount(playerA, "Balduvian Bears", 0);
assertTappedCount("Mountain", true, 3 + 2 + 5);
}
@Test
public void test_CastEntwine_FreeFromHand() {
// You may cast nonland cards from your hand without paying their mana costs.
addCard(Zone.BATTLEFIELD, playerA, "Omniscience");
// Choose one
// Barbed Lightning deals 3 damage to target creature.
// Barbed Lightning deals 3 damage to target player or planeswalker.
// Entwine {2} (Choose both if you pay the entwine cost.)
addCard(Zone.HAND, playerA, "Barbed Lightning", 1); // {2}{R}
addCard(Zone.BATTLEFIELD, playerA, "Plains", 2); // only Entwine pay need
//
addCard(Zone.BATTLEFIELD, playerA, "Balduvian Bears", 1); // 2/2
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Barbed Lightning");
setChoice(playerA, true); // cast for free
setChoice(playerA, true); // use Entwine
addTarget(playerA, "Balduvian Bears");
addTarget(playerA, playerA);
setStrictChooseMode(true);
setStopAt(1, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertLife(playerA, 20 - 3);
assertPermanentCount(playerA, "Balduvian Bears", 0);
assertTappedCount("Plains", true, 2);
}
@Test
public void test_ToothAndNail() {
setStrictChooseMode(true);
addCard(Zone.LIBRARY, playerA, "Silvercoat Lion", 1);
addCard(Zone.LIBRARY, playerA, "Pillarfield Ox", 1);
addCard(Zone.BATTLEFIELD, playerA, "Forest", 9);
// Choose one -
// Search your library for up to two creature cards, reveal them, put them into your hand, then shuffle your library;
// or put up to two creature cards from your hand onto the battlefield.
// Entwine {2}
addCard(Zone.HAND, playerA, "Tooth and Nail"); // Sorcery {5}{G}{G}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Tooth and Nail");
setChoice(playerA, true); // Message: Pay Entwine {2} ?
addTarget(playerA, "Silvercoat Lion^Pillarfield Ox");
setChoice(playerA, "Silvercoat Lion^Pillarfield Ox");
setStopAt(1, PhaseStep.POSTCOMBAT_MAIN);
execute();
assertAllCommandsUsed();
assertPermanentCount(playerA, "Silvercoat Lion", 1);
assertPermanentCount(playerA, "Pillarfield Ox", 1);
}
}
package org.mage.test.cards.abilities.keywords;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
* @author LevelX2, JayDi85
*/
public class EntwineTest extends CardTestPlayerBase {
@Test
public void test_CastWithoutEntwine() {
// Choose one
// Barbed Lightning deals 3 damage to target creature.
// Barbed Lightning deals 3 damage to target player or planeswalker.
// Entwine {2} (Choose both if you pay the entwine cost.)
addCard(Zone.HAND, playerA, "Barbed Lightning", 1); // {2}{R}
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3);
//
addCard(Zone.BATTLEFIELD, playerA, "Balduvian Bears", 1); // 2/2
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Barbed Lightning");
setChoice(playerA, false); // not use Entwine
setModeChoice(playerA, "1"); // target creature
addTarget(playerA, "Balduvian Bears");
setStrictChooseMode(true);
setStopAt(1, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertLife(playerA, 20);
assertPermanentCount(playerA, "Balduvian Bears", 0);
assertTappedCount("Mountain", true, 3);
}
@Test
public void test_CastEntwine_Normal() {
// Choose one
// Barbed Lightning deals 3 damage to target creature.
// Barbed Lightning deals 3 damage to target player or planeswalker.
// Entwine {2} (Choose both if you pay the entwine cost.)
addCard(Zone.HAND, playerA, "Barbed Lightning", 1); // {2}{R}
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3 + 2);
//
addCard(Zone.BATTLEFIELD, playerA, "Balduvian Bears", 1); // 2/2
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Barbed Lightning");
setChoice(playerA, true); // use Entwine
addTarget(playerA, "Balduvian Bears");
addTarget(playerA, playerA);
setStrictChooseMode(true);
setStopAt(1, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertLife(playerA, 20 - 3);
assertPermanentCount(playerA, "Balduvian Bears", 0);
assertTappedCount("Mountain", true, 3 + 2);
}
@Test
public void test_CastEntwine_CostReduction() {
addCustomEffect_SpellCostModification(playerA, -4);
// Choose one
// Barbed Lightning deals 3 damage to target creature.
// Barbed Lightning deals 3 damage to target player or planeswalker.
// Entwine {2} (Choose both if you pay the entwine cost.)
addCard(Zone.HAND, playerA, "Barbed Lightning", 1); // {2}{R}
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 1); // -4 as cost reduction
//
addCard(Zone.BATTLEFIELD, playerA, "Balduvian Bears", 1); // 2/2
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Barbed Lightning");
setChoice(playerA, true); // use Entwine
addTarget(playerA, "Balduvian Bears");
addTarget(playerA, playerA);
setStrictChooseMode(true);
setStopAt(1, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertLife(playerA, 20 - 3);
assertPermanentCount(playerA, "Balduvian Bears", 0);
assertTappedCount("Mountain", true, 1);
}
@Test
public void test_CastEntwine_CostIncreasing() {
addCustomEffect_SpellCostModification(playerA, 5);
// Choose one
// Barbed Lightning deals 3 damage to target creature.
// Barbed Lightning deals 3 damage to target player or planeswalker.
// Entwine {2} (Choose both if you pay the entwine cost.)
addCard(Zone.HAND, playerA, "Barbed Lightning", 1); // {2}{R}
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3 + 2 + 5);
//
addCard(Zone.BATTLEFIELD, playerA, "Balduvian Bears", 1); // 2/2
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Barbed Lightning");
setChoice(playerA, true); // use Entwine
addTarget(playerA, "Balduvian Bears");
addTarget(playerA, playerA);
setStrictChooseMode(true);
setStopAt(1, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertLife(playerA, 20 - 3);
assertPermanentCount(playerA, "Balduvian Bears", 0);
assertTappedCount("Mountain", true, 3 + 2 + 5);
}
@Test
public void test_CastEntwine_FreeFromHand() {
// You may cast nonland cards from your hand without paying their mana costs.
addCard(Zone.BATTLEFIELD, playerA, "Omniscience");
// Choose one
// Barbed Lightning deals 3 damage to target creature.
// Barbed Lightning deals 3 damage to target player or planeswalker.
// Entwine {2} (Choose both if you pay the entwine cost.)
addCard(Zone.HAND, playerA, "Barbed Lightning", 1); // {2}{R}
addCard(Zone.BATTLEFIELD, playerA, "Plains", 2); // only Entwine pay need
//
addCard(Zone.BATTLEFIELD, playerA, "Balduvian Bears", 1); // 2/2
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Barbed Lightning");
setChoice(playerA, true); // cast for free
setChoice(playerA, true); // use Entwine
addTarget(playerA, "Balduvian Bears");
addTarget(playerA, playerA);
setStrictChooseMode(true);
setStopAt(1, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertLife(playerA, 20 - 3);
assertPermanentCount(playerA, "Balduvian Bears", 0);
assertTappedCount("Plains", true, 2);
}
@Test
public void test_ToothAndNail() {
setStrictChooseMode(true);
addCard(Zone.LIBRARY, playerA, "Silvercoat Lion", 1);
addCard(Zone.LIBRARY, playerA, "Pillarfield Ox", 1);
addCard(Zone.BATTLEFIELD, playerA, "Forest", 9);
// Choose one -
// Search your library for up to two creature cards, reveal them, put them into your hand, then shuffle your library;
// or put up to two creature cards from your hand onto the battlefield.
// Entwine {2}
addCard(Zone.HAND, playerA, "Tooth and Nail"); // Sorcery {5}{G}{G}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Tooth and Nail");
setChoice(playerA, true); // Message: Pay Entwine {2} ?
addTarget(playerA, "Silvercoat Lion^Pillarfield Ox");
setChoice(playerA, "Silvercoat Lion^Pillarfield Ox");
setStopAt(1, PhaseStep.POSTCOMBAT_MAIN);
execute();
assertAllCommandsUsed();
assertPermanentCount(playerA, "Silvercoat Lion", 1);
assertPermanentCount(playerA, "Pillarfield Ox", 1);
}
}

View file

@ -1,39 +1,39 @@
package org.mage.test.cards.cost.modification;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class FerventChampionTest extends CardTestPlayerBase {
@Test
public void testFerventChampion() {
setStrictChooseMode(true);
// First strike, Haste
// Whenever Fervent Champion attacks, another target attacking Knight you control gets +1/+0 until end of turn.
// Equip abilities you activate that target Fervent Champion cost {3} less to activate.
addCard(Zone.BATTLEFIELD, playerA, "Fervent Champion");
// Equipped creature gets +2/+2 and has protection from red and from blue.
// Whenever equipped creature deals combat damage to a player, Sword of Fire
// and Ice deals 2 damage to any target and you draw a card.
// Equip {2}
addCard(Zone.BATTLEFIELD, playerA, "Sword of Fire and Ice", 1);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Equip");
addTarget(playerA, "Fervent Champion");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertPowerToughness(playerA, "Fervent Champion", 3,3);
}
package org.mage.test.cards.cost.modification;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class FerventChampionTest extends CardTestPlayerBase {
@Test
public void testFerventChampion() {
setStrictChooseMode(true);
// First strike, Haste
// Whenever Fervent Champion attacks, another target attacking Knight you control gets +1/+0 until end of turn.
// Equip abilities you activate that target Fervent Champion cost {3} less to activate.
addCard(Zone.BATTLEFIELD, playerA, "Fervent Champion");
// Equipped creature gets +2/+2 and has protection from red and from blue.
// Whenever equipped creature deals combat damage to a player, Sword of Fire
// and Ice deals 2 damage to any target and you draw a card.
// Equip {2}
addCard(Zone.BATTLEFIELD, playerA, "Sword of Fire and Ice", 1);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Equip");
addTarget(playerA, "Fervent Champion");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertPowerToughness(playerA, "Fervent Champion", 3,3);
}
}

View file

@ -1,56 +1,56 @@
package org.mage.test.cards.facedown;
import mage.constants.EmptyNames;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class PrimordialMistTest extends CardTestPlayerBase {
/**
* I have Brine Elemental played face down as a morph, an artifact which has
* been manifested and Kadena which has been turned face by Ixidron. I can't
* seem to activate Primordial Mist's second ability for any of these kinds
* of face down creatures:
*/
@Test
public void test_ExileAndCastMorphFaceDownCard() {
setStrictChooseMode(true);
// At the beginning of your end step, you may manifest the top card of your library.
// Exile a face-down permanent you control face-up: You may play that card this turn
addCard(Zone.BATTLEFIELD, playerA, "Primordial Mist");
// Morph {5}{U}{U}
// When Brine Elemental is turned face up, each opponent skips their next untap step.
addCard(Zone.HAND, playerA, "Brine Elemental"); // Creature {5}{U}{U} (5/4)
addCard(Zone.BATTLEFIELD, playerA, "Island", 9);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Brine Elemental");
setChoice(playerA, true); // cast it face down as 2/2 creature
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN, playerA);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Exile a face-down permanent you control");
setChoice(playerA, EmptyNames.FACE_DOWN_CREATURE.toString());
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Brine Elemental");
setChoice(playerA, false); // cast it face down as 2/2 creature
setChoice(playerA, true);
setStopAt(1, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertExileCount(playerA, 0);
assertPowerToughness(playerA, "Brine Elemental", 5, 4);
}
}
package org.mage.test.cards.facedown;
import mage.constants.EmptyNames;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class PrimordialMistTest extends CardTestPlayerBase {
/**
* I have Brine Elemental played face down as a morph, an artifact which has
* been manifested and Kadena which has been turned face by Ixidron. I can't
* seem to activate Primordial Mist's second ability for any of these kinds
* of face down creatures:
*/
@Test
public void test_ExileAndCastMorphFaceDownCard() {
setStrictChooseMode(true);
// At the beginning of your end step, you may manifest the top card of your library.
// Exile a face-down permanent you control face-up: You may play that card this turn
addCard(Zone.BATTLEFIELD, playerA, "Primordial Mist");
// Morph {5}{U}{U}
// When Brine Elemental is turned face up, each opponent skips their next untap step.
addCard(Zone.HAND, playerA, "Brine Elemental"); // Creature {5}{U}{U} (5/4)
addCard(Zone.BATTLEFIELD, playerA, "Island", 9);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Brine Elemental");
setChoice(playerA, true); // cast it face down as 2/2 creature
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN, playerA);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Exile a face-down permanent you control");
setChoice(playerA, EmptyNames.FACE_DOWN_CREATURE.toString());
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Brine Elemental");
setChoice(playerA, false); // cast it face down as 2/2 creature
setChoice(playerA, true);
setStopAt(1, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertExileCount(playerA, 0);
assertPowerToughness(playerA, "Brine Elemental", 5, 4);
}
}

View file

@ -1,62 +1,62 @@
package org.mage.test.cards.facedown;
import mage.cards.Card;
import mage.constants.EmptyNames;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Assert;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class TriggerTest extends CardTestPlayerBase {
/**
* Midnight Reaper triggers when dies face down #7063
* Ixidron has turned Midnight Reaper and Balduvian Bears face down:
*
*/
// test that cards imprinted using Summoner's Egg are face down
@Test
public void testReaperDoesNotTriggerDiesTriggerFaceDown() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, "Island", 5);
// As Ixidron enters the battlefield, turn all other nontoken creatures face down.
// Ixidron's power and toughness are each equal to the number of face-down creatures on the battlefield.
addCard(Zone.HAND, playerA, "Ixidron"); // Creature {3}{U}{U} (*/*)
// Whenever a nontoken creature you control dies, Midnight Reaper deals 1 damage to you and you draw a card.
addCard(Zone.BATTLEFIELD, playerA, "Midnight Reaper"); // Creature {2}{B}
addCard(Zone.BATTLEFIELD, playerB, "Mountain", 1);
addCard(Zone.HAND, playerB, "Lightning Bolt"); // Instant 3 damage
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Ixidron");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN, playerA);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Lightning Bolt", EmptyNames.FACE_DOWN_CREATURE.toString());
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertGraveyardCount(playerB, "Lightning Bolt", 1);
assertGraveyardCount(playerA, "Midnight Reaper", 1);
assertGraveyardCount(playerA, "Ixidron", 1);
assertHandCount(playerA, 0);
assertLife(playerA, 20);
}
package org.mage.test.cards.facedown;
import mage.cards.Card;
import mage.constants.EmptyNames;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Assert;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class TriggerTest extends CardTestPlayerBase {
/**
* Midnight Reaper triggers when dies face down #7063
* Ixidron has turned Midnight Reaper and Balduvian Bears face down:
*
*/
// test that cards imprinted using Summoner's Egg are face down
@Test
public void testReaperDoesNotTriggerDiesTriggerFaceDown() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, "Island", 5);
// As Ixidron enters the battlefield, turn all other nontoken creatures face down.
// Ixidron's power and toughness are each equal to the number of face-down creatures on the battlefield.
addCard(Zone.HAND, playerA, "Ixidron"); // Creature {3}{U}{U} (*/*)
// Whenever a nontoken creature you control dies, Midnight Reaper deals 1 damage to you and you draw a card.
addCard(Zone.BATTLEFIELD, playerA, "Midnight Reaper"); // Creature {2}{B}
addCard(Zone.BATTLEFIELD, playerB, "Mountain", 1);
addCard(Zone.HAND, playerB, "Lightning Bolt"); // Instant 3 damage
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Ixidron");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN, playerA);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Lightning Bolt", EmptyNames.FACE_DOWN_CREATURE.toString());
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertGraveyardCount(playerB, "Lightning Bolt", 1);
assertGraveyardCount(playerA, "Midnight Reaper", 1);
assertGraveyardCount(playerA, "Ixidron", 1);
assertHandCount(playerA, 0);
assertLife(playerA, 20);
}
}

View file

@ -1,45 +1,45 @@
package org.mage.test.cards.mana;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class MultipleTimesUsableActivatedManaAbilitiesTest extends CardTestPlayerBase {
/**
* Seton, Krosan Protector - only seems to get counted as if it were one
* mana for determining if a spell can be cast, regardless of how many
* druids you have in playF
*/
@Test
public void testCanBeCastWithSetonKrosanProtector() {
// Tap an untapped Druid you control: Add {G}.
addCard(Zone.BATTLEFIELD, playerA, "Seton, Krosan Protector", 1); // Creature {G}{G}{G}
addCard(Zone.BATTLEFIELD, playerA, "Citanul Druid", 3);
addCard(Zone.HAND, playerA, "Leatherback Baloth", 1); // Creature 4/5
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Leatherback Baloth");
setChoice(playerA, "Citanul Druid");
setChoice(playerA, "Citanul Druid");
setChoice(playerA, "Citanul Druid");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
setStrictChooseMode(true);
execute();
assertAllCommandsUsed();
assertTappedCount("Citanul Druid", true, 3);
assertPermanentCount(playerA, "Leatherback Baloth", 1);
}
}
package org.mage.test.cards.mana;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class MultipleTimesUsableActivatedManaAbilitiesTest extends CardTestPlayerBase {
/**
* Seton, Krosan Protector - only seems to get counted as if it were one
* mana for determining if a spell can be cast, regardless of how many
* druids you have in playF
*/
@Test
public void testCanBeCastWithSetonKrosanProtector() {
// Tap an untapped Druid you control: Add {G}.
addCard(Zone.BATTLEFIELD, playerA, "Seton, Krosan Protector", 1); // Creature {G}{G}{G}
addCard(Zone.BATTLEFIELD, playerA, "Citanul Druid", 3);
addCard(Zone.HAND, playerA, "Leatherback Baloth", 1); // Creature 4/5
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Leatherback Baloth");
setChoice(playerA, "Citanul Druid");
setChoice(playerA, "Citanul Druid");
setChoice(playerA, "Citanul Druid");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
setStrictChooseMode(true);
execute();
assertAllCommandsUsed();
assertTappedCount("Citanul Druid", true, 3);
assertPermanentCount(playerA, "Leatherback Baloth", 1);
}
}

View file

@ -1,112 +1,112 @@
package org.mage.test.cards.mana.conditional;
import mage.abilities.mana.ManaOptions;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import mage.counters.CounterType;
import org.junit.Assert;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
import static org.mage.test.utils.ManaOptionsTestUtils.assertManaOptions;
/**
*
* @author LevelX2
*/
public class CrypticTrilobiteTest extends CardTestPlayerBase {
@Test
public void testAvailableManaCalculation(){
setStrictChooseMode(true);
// Cryptic Trilobite enters the battlefield with X +1/+1 counters on it.
// Remove a +1/+1 counter from Cryptic Trilobite: Add {C}{C}. Spend this mana only to activate abilities.
// {1}, {T}: Put a +1/+1 counter on Cryptic Trilobite.
addCard(Zone.HAND, playerA, "Cryptic Trilobite"); // Creature {X}{X}
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 10);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cryptic Trilobite");
setChoice(playerA, "X=5");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertPermanentCount(playerA, "Cryptic Trilobite", 1);
ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame);
Assert.assertEquals("mana variations don't fit", 1, manaOptions.size());
assertManaOptions("{C}{C}{C}{C}{C}{C}{C}{C}{C}{C}[{CrypticTrilobiteManaCondition}]", manaOptions);
}
@Test
public void testUse(){
setStrictChooseMode(true);
// Cryptic Trilobite enters the battlefield with X +1/+1 counters on it.
// Remove a +1/+1 counter from Cryptic Trilobite: Add {C}{C}. Spend this mana only to activate abilities.
// {1}, {T}: Put a +1/+1 counter on Cryptic Trilobite.
addCard(Zone.HAND, playerA, "Cryptic Trilobite"); // Creature {X}{X}
// Flying
// {2}: Deathknell Kami gets +1/+1 until end of turn. Sacrifice it at the beginning of the next end step.
// Soulshift 1 (When this creature dies, you may return target Spirit card with converted mana cost 1 or less from your graveyard to your hand.)
addCard(Zone.BATTLEFIELD, playerA, "Deathknell Kami"); // Creature (0/1)
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 10);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cryptic Trilobite");
setChoice(playerA, "X=5");
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{2}:");
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{2}:");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertPermanentCount(playerA, "Cryptic Trilobite", 1);
assertCounterCount(playerA, "Cryptic Trilobite", CounterType.P1P1, 3);
assertPowerToughness(playerA, "Deathknell Kami", 2, 3);
ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame);
Assert.assertEquals("mana variations don't fit", 1, manaOptions.size());
assertManaOptions("{C}{C}{C}{C}{C}{C}[{CrypticTrilobiteManaCondition}]", manaOptions);
}
@Test
public void testCantUse(){
setStrictChooseMode(true);
// Cryptic Trilobite enters the battlefield with X +1/+1 counters on it.
// Remove a +1/+1 counter from Cryptic Trilobite: Add {C}{C}. Spend this mana only to activate abilities.
// {1}, {T}: Put a +1/+1 counter on Cryptic Trilobite.
addCard(Zone.HAND, playerA, "Cryptic Trilobite"); // Creature {X}{X}
// {4}{W}: Return another target creature you control to its owner's hand.
addCard(Zone.HAND, playerA, "Aegis Automaton"); // Creature {2} (0/2)
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 10);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cryptic Trilobite");
setChoice(playerA, "X=5");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN, playerA);
checkPlayableAbility("can't play", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Aegis Automaton", false);
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertPermanentCount(playerA, "Cryptic Trilobite", 1);
assertCounterCount(playerA, "Cryptic Trilobite", CounterType.P1P1, 5);
}
package org.mage.test.cards.mana.conditional;
import mage.abilities.mana.ManaOptions;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import mage.counters.CounterType;
import org.junit.Assert;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
import static org.mage.test.utils.ManaOptionsTestUtils.assertManaOptions;
/**
*
* @author LevelX2
*/
public class CrypticTrilobiteTest extends CardTestPlayerBase {
@Test
public void testAvailableManaCalculation(){
setStrictChooseMode(true);
// Cryptic Trilobite enters the battlefield with X +1/+1 counters on it.
// Remove a +1/+1 counter from Cryptic Trilobite: Add {C}{C}. Spend this mana only to activate abilities.
// {1}, {T}: Put a +1/+1 counter on Cryptic Trilobite.
addCard(Zone.HAND, playerA, "Cryptic Trilobite"); // Creature {X}{X}
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 10);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cryptic Trilobite");
setChoice(playerA, "X=5");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertPermanentCount(playerA, "Cryptic Trilobite", 1);
ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame);
Assert.assertEquals("mana variations don't fit", 1, manaOptions.size());
assertManaOptions("{C}{C}{C}{C}{C}{C}{C}{C}{C}{C}[{CrypticTrilobiteManaCondition}]", manaOptions);
}
@Test
public void testUse(){
setStrictChooseMode(true);
// Cryptic Trilobite enters the battlefield with X +1/+1 counters on it.
// Remove a +1/+1 counter from Cryptic Trilobite: Add {C}{C}. Spend this mana only to activate abilities.
// {1}, {T}: Put a +1/+1 counter on Cryptic Trilobite.
addCard(Zone.HAND, playerA, "Cryptic Trilobite"); // Creature {X}{X}
// Flying
// {2}: Deathknell Kami gets +1/+1 until end of turn. Sacrifice it at the beginning of the next end step.
// Soulshift 1 (When this creature dies, you may return target Spirit card with converted mana cost 1 or less from your graveyard to your hand.)
addCard(Zone.BATTLEFIELD, playerA, "Deathknell Kami"); // Creature (0/1)
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 10);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cryptic Trilobite");
setChoice(playerA, "X=5");
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{2}:");
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{2}:");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertPermanentCount(playerA, "Cryptic Trilobite", 1);
assertCounterCount(playerA, "Cryptic Trilobite", CounterType.P1P1, 3);
assertPowerToughness(playerA, "Deathknell Kami", 2, 3);
ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame);
Assert.assertEquals("mana variations don't fit", 1, manaOptions.size());
assertManaOptions("{C}{C}{C}{C}{C}{C}[{CrypticTrilobiteManaCondition}]", manaOptions);
}
@Test
public void testCantUse(){
setStrictChooseMode(true);
// Cryptic Trilobite enters the battlefield with X +1/+1 counters on it.
// Remove a +1/+1 counter from Cryptic Trilobite: Add {C}{C}. Spend this mana only to activate abilities.
// {1}, {T}: Put a +1/+1 counter on Cryptic Trilobite.
addCard(Zone.HAND, playerA, "Cryptic Trilobite"); // Creature {X}{X}
// {4}{W}: Return another target creature you control to its owner's hand.
addCard(Zone.HAND, playerA, "Aegis Automaton"); // Creature {2} (0/2)
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 10);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cryptic Trilobite");
setChoice(playerA, "X=5");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN, playerA);
checkPlayableAbility("can't play", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Aegis Automaton", false);
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertPermanentCount(playerA, "Cryptic Trilobite", 1);
assertCounterCount(playerA, "Cryptic Trilobite", CounterType.P1P1, 5);
}
}

View file

@ -1,44 +1,44 @@
package org.mage.test.cards.mana.conditional;
import mage.abilities.mana.ManaOptions;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Assert;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
import static org.mage.test.utils.ManaOptionsTestUtils.assertManaOptions;
/**
*
* @author LevelX2
*/
public class TitansNestTest extends CardTestPlayerBase {
@Test
public void testTitansNest(){
setStrictChooseMode(true);
// At the beginning of your upkeep, look at the top card of your library. You may put that card into your graveyard.
// Exile a card from your graveyard: Add {C}. Spend this mana only to cast a colored spell without {X} in its mana cost.
addCard(Zone.HAND, playerA, "Titans' Nest"); // Enchantment {1}{B}{G}{U}
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 1);
addCard(Zone.BATTLEFIELD, playerA, "Forest", 2);
addCard(Zone.BATTLEFIELD, playerA, "Island", 1);
addCard(Zone.GRAVEYARD, playerA, "Grizzly Bears", 2);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Titans' Nest");
setStopAt(1, PhaseStep.POSTCOMBAT_MAIN);
execute();
assertAllCommandsUsed();
assertPermanentCount(playerA, "Titans' Nest", 1);
ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame);
Assert.assertEquals("mana variations don't fit", 1, manaOptions.size());
assertManaOptions("{C}{C}[{TitansNestManaCondition}]", manaOptions);
}
package org.mage.test.cards.mana.conditional;
import mage.abilities.mana.ManaOptions;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Assert;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
import static org.mage.test.utils.ManaOptionsTestUtils.assertManaOptions;
/**
*
* @author LevelX2
*/
public class TitansNestTest extends CardTestPlayerBase {
@Test
public void testTitansNest(){
setStrictChooseMode(true);
// At the beginning of your upkeep, look at the top card of your library. You may put that card into your graveyard.
// Exile a card from your graveyard: Add {C}. Spend this mana only to cast a colored spell without {X} in its mana cost.
addCard(Zone.HAND, playerA, "Titans' Nest"); // Enchantment {1}{B}{G}{U}
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 1);
addCard(Zone.BATTLEFIELD, playerA, "Forest", 2);
addCard(Zone.BATTLEFIELD, playerA, "Island", 1);
addCard(Zone.GRAVEYARD, playerA, "Grizzly Bears", 2);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Titans' Nest");
setStopAt(1, PhaseStep.POSTCOMBAT_MAIN);
execute();
assertAllCommandsUsed();
assertPermanentCount(playerA, "Titans' Nest", 1);
ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame);
Assert.assertEquals("mana variations don't fit", 1, manaOptions.size());
assertManaOptions("{C}{C}[{TitansNestManaCondition}]", manaOptions);
}
}

View file

@ -1,145 +1,145 @@
package org.mage.test.cards.prevention;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class PreventAllDamageTest extends CardTestPlayerBase {
@Test
public void test_SafePassage() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, "Plains", 3);
// Prevent all damage that would be dealt to you and creatures you control this turn.
addCard(Zone.HAND, playerA, "Safe Passage"); // Instant {2}{W}
addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion", 1); // (2/2)
addCard(Zone.BATTLEFIELD, playerB, "Pillarfield Ox", 2); // (2/4)
addCard(Zone.BATTLEFIELD, playerB, "Mountain", 2);
addCard(Zone.HAND, playerB, "Lightning Bolt", 2); // Instnat {R}
castSpell(2, PhaseStep.UPKEEP, playerA, "Safe Passage");
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Lightning Bolt", playerA);
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Lightning Bolt", "Silvercoat Lion");
attack(2, playerB, "Pillarfield Ox");
attack(2, playerB, "Pillarfield Ox");
block(2, playerA, "Silvercoat Lion", "Pillarfield Ox");
setStopAt(2, PhaseStep.POSTCOMBAT_MAIN);
execute();
assertAllCommandsUsed();
assertGraveyardCount(playerA, "Safe Passage", 1);
assertPermanentCount(playerA, "Silvercoat Lion", 1);
assertGraveyardCount(playerB, "Lightning Bolt", 2);
assertLife(playerA, 20);
assertLife(playerB, 20);
}
@Test
public void test_EtherealHaze() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, "Plains", 1);
// Prevent all damage that would be dealt by creatures this turn.
addCard(Zone.HAND, playerA, "Ethereal Haze"); // Instant {W}
addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion", 1); // (2/2)
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 2); // (2/4)
addCard(Zone.BATTLEFIELD, playerB, "Mountain", 2);
addCard(Zone.HAND, playerB, "Lightning Bolt", 1); // Instant {R}
castSpell(2, PhaseStep.UPKEEP, playerA, "Ethereal Haze");
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Lightning Bolt", playerA);
attack(2, playerB, "Silvercoat Lion");
attack(2, playerB, "Silvercoat Lion");
block(2, playerA, "Silvercoat Lion", "Silvercoat Lion");
setStopAt(2, PhaseStep.POSTCOMBAT_MAIN);
execute();
assertAllCommandsUsed();
assertGraveyardCount(playerA, "Ethereal Haze", 1);
assertPermanentCount(playerA, "Silvercoat Lion", 1);
assertPermanentCount(playerB, "Silvercoat Lion", 2);
assertGraveyardCount(playerB, "Lightning Bolt", 1);
assertLife(playerA, 17);
assertLife(playerB, 20);
}
@Test
public void test_EnergyStorm() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, "Plains", 2);
// Cumulative upkeep {1}
// Prevent all damage that would be dealt by instant and sorcery spells.
// Creatures with flying don't untap during their controllers' untap steps.
addCard(Zone.HAND, playerA, "Energy Storm"); // ENCHANTMENT {1}{W}
// Flying, vigilance
addCard(Zone.BATTLEFIELD, playerA, "Abbey Griffin", 1); // (2/2)
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1); // (2/2)
addCard(Zone.BATTLEFIELD, playerB, "Mountain", 4);
addCard(Zone.HAND, playerB, "Lightning Bolt", 2); // Instant {R}
// Fire Ambush deals 3 damage to any target.
addCard(Zone.HAND, playerB, "Fire Ambush", 2); // Sorcery {1}{R}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Energy Storm");
attack(1, playerA, "Abbey Griffin");
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "Lightning Bolt", playerA);
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "Lightning Bolt", "Abbey Griffin");
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Fire Ambush", playerA);
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Fire Ambush", "Abbey Griffin");
attack(2, playerB, "Silvercoat Lion");
setChoice(playerA, false); // Pay {1}? Energy Storm - CumulativeUpkeepAbility: Cumulative upkeep {1}
setStopAt(3, PhaseStep.PRECOMBAT_MAIN);
execute();
assertAllCommandsUsed();
assertGraveyardCount(playerA, "Energy Storm", 1);
assertPermanentCount(playerA, "Abbey Griffin", 1);
assertPermanentCount(playerB, "Silvercoat Lion", 1);
assertGraveyardCount(playerB, "Lightning Bolt", 2);
assertGraveyardCount(playerB, "Fire Ambush", 2);
assertLife(playerA, 18);
assertLife(playerB, 18);
}
}
package org.mage.test.cards.prevention;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class PreventAllDamageTest extends CardTestPlayerBase {
@Test
public void test_SafePassage() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, "Plains", 3);
// Prevent all damage that would be dealt to you and creatures you control this turn.
addCard(Zone.HAND, playerA, "Safe Passage"); // Instant {2}{W}
addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion", 1); // (2/2)
addCard(Zone.BATTLEFIELD, playerB, "Pillarfield Ox", 2); // (2/4)
addCard(Zone.BATTLEFIELD, playerB, "Mountain", 2);
addCard(Zone.HAND, playerB, "Lightning Bolt", 2); // Instnat {R}
castSpell(2, PhaseStep.UPKEEP, playerA, "Safe Passage");
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Lightning Bolt", playerA);
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Lightning Bolt", "Silvercoat Lion");
attack(2, playerB, "Pillarfield Ox");
attack(2, playerB, "Pillarfield Ox");
block(2, playerA, "Silvercoat Lion", "Pillarfield Ox");
setStopAt(2, PhaseStep.POSTCOMBAT_MAIN);
execute();
assertAllCommandsUsed();
assertGraveyardCount(playerA, "Safe Passage", 1);
assertPermanentCount(playerA, "Silvercoat Lion", 1);
assertGraveyardCount(playerB, "Lightning Bolt", 2);
assertLife(playerA, 20);
assertLife(playerB, 20);
}
@Test
public void test_EtherealHaze() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, "Plains", 1);
// Prevent all damage that would be dealt by creatures this turn.
addCard(Zone.HAND, playerA, "Ethereal Haze"); // Instant {W}
addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion", 1); // (2/2)
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 2); // (2/4)
addCard(Zone.BATTLEFIELD, playerB, "Mountain", 2);
addCard(Zone.HAND, playerB, "Lightning Bolt", 1); // Instant {R}
castSpell(2, PhaseStep.UPKEEP, playerA, "Ethereal Haze");
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Lightning Bolt", playerA);
attack(2, playerB, "Silvercoat Lion");
attack(2, playerB, "Silvercoat Lion");
block(2, playerA, "Silvercoat Lion", "Silvercoat Lion");
setStopAt(2, PhaseStep.POSTCOMBAT_MAIN);
execute();
assertAllCommandsUsed();
assertGraveyardCount(playerA, "Ethereal Haze", 1);
assertPermanentCount(playerA, "Silvercoat Lion", 1);
assertPermanentCount(playerB, "Silvercoat Lion", 2);
assertGraveyardCount(playerB, "Lightning Bolt", 1);
assertLife(playerA, 17);
assertLife(playerB, 20);
}
@Test
public void test_EnergyStorm() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, "Plains", 2);
// Cumulative upkeep {1}
// Prevent all damage that would be dealt by instant and sorcery spells.
// Creatures with flying don't untap during their controllers' untap steps.
addCard(Zone.HAND, playerA, "Energy Storm"); // ENCHANTMENT {1}{W}
// Flying, vigilance
addCard(Zone.BATTLEFIELD, playerA, "Abbey Griffin", 1); // (2/2)
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1); // (2/2)
addCard(Zone.BATTLEFIELD, playerB, "Mountain", 4);
addCard(Zone.HAND, playerB, "Lightning Bolt", 2); // Instant {R}
// Fire Ambush deals 3 damage to any target.
addCard(Zone.HAND, playerB, "Fire Ambush", 2); // Sorcery {1}{R}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Energy Storm");
attack(1, playerA, "Abbey Griffin");
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "Lightning Bolt", playerA);
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "Lightning Bolt", "Abbey Griffin");
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Fire Ambush", playerA);
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Fire Ambush", "Abbey Griffin");
attack(2, playerB, "Silvercoat Lion");
setChoice(playerA, false); // Pay {1}? Energy Storm - CumulativeUpkeepAbility: Cumulative upkeep {1}
setStopAt(3, PhaseStep.PRECOMBAT_MAIN);
execute();
assertAllCommandsUsed();
assertGraveyardCount(playerA, "Energy Storm", 1);
assertPermanentCount(playerA, "Abbey Griffin", 1);
assertPermanentCount(playerB, "Silvercoat Lion", 1);
assertGraveyardCount(playerB, "Lightning Bolt", 2);
assertGraveyardCount(playerB, "Fire Ambush", 2);
assertLife(playerA, 18);
assertLife(playerB, 18);
}
}

View file

@ -1,48 +1,48 @@
package org.mage.test.cards.protection;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import mage.counters.CounterType;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class EightAndAHalfTailsTest extends CardTestPlayerBase {
@Test
public void testProtectingPlaneswalker() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, "Plains", 2);
// Activated abilities of artifacts your opponents control can't be activated.
// +1: Until your next turn, up to one target noncreature artifact becomes an artifact creature with power and toughness equal to its converted mana cost.
// -2: You may choose an artifact card you own from outside the game or in exile, reveal that card, and put it into your hand.
addCard(Zone.BATTLEFIELD, playerA, "Karn, the Great Creator"); // Planeswalker (5)
// {1}{W}: Target permanent you control gains protection from white until end of turn.
// {1}: Target spell or permanent becomes white until end of turn.
addCard(Zone.BATTLEFIELD, playerA, "Eight-and-a-Half-Tails"); // Creature
// Flying, double strike
// Whenever a creature you control deals combat damage to a player, you and that player each gain that much life.
// At the beginning of your end step, if you have at least 15 life more than your starting life total, each player Angel of Destiny attacked this turn loses the game.
addCard(Zone.BATTLEFIELD, playerB, "Angel of Destiny"); // Creature
attack(2, playerB, "Angel of Destiny", "Karn, the Great Creator");
activateAbility(2, PhaseStep.DECLARE_ATTACKERS, playerA, "{1}{W}: Target permanent you control gains protection from white until end of turn.");
addTarget(playerA, "Karn, the Great Creator");
setStopAt(2, PhaseStep.END_COMBAT);
execute();
assertPermanentCount(playerA, "Karn, the Great Creator", 1);
assertCounterCount("Karn, the Great Creator", CounterType.LOYALTY, 5);
}
package org.mage.test.cards.protection;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import mage.counters.CounterType;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class EightAndAHalfTailsTest extends CardTestPlayerBase {
@Test
public void testProtectingPlaneswalker() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, "Plains", 2);
// Activated abilities of artifacts your opponents control can't be activated.
// +1: Until your next turn, up to one target noncreature artifact becomes an artifact creature with power and toughness equal to its converted mana cost.
// -2: You may choose an artifact card you own from outside the game or in exile, reveal that card, and put it into your hand.
addCard(Zone.BATTLEFIELD, playerA, "Karn, the Great Creator"); // Planeswalker (5)
// {1}{W}: Target permanent you control gains protection from white until end of turn.
// {1}: Target spell or permanent becomes white until end of turn.
addCard(Zone.BATTLEFIELD, playerA, "Eight-and-a-Half-Tails"); // Creature
// Flying, double strike
// Whenever a creature you control deals combat damage to a player, you and that player each gain that much life.
// At the beginning of your end step, if you have at least 15 life more than your starting life total, each player Angel of Destiny attacked this turn loses the game.
addCard(Zone.BATTLEFIELD, playerB, "Angel of Destiny"); // Creature
attack(2, playerB, "Angel of Destiny", "Karn, the Great Creator");
activateAbility(2, PhaseStep.DECLARE_ATTACKERS, playerA, "{1}{W}: Target permanent you control gains protection from white until end of turn.");
addTarget(playerA, "Karn, the Great Creator");
setStopAt(2, PhaseStep.END_COMBAT);
execute();
assertPermanentCount(playerA, "Karn, the Great Creator", 1);
assertCounterCount("Karn, the Great Creator", CounterType.LOYALTY, 5);
}
}

View file

@ -1,51 +1,51 @@
package org.mage.test.cards.single.bfz;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class ConduitOfRuinTest extends CardTestPlayerBase {
@Test
public void testCast() {
setStrictChooseMode(true);
// Emrakul, the Aeons Torn can't be countered.
// When you cast Emrakul, take an extra turn after this one.
// Flying, protection from colored spells, annihilator 6
// When Emrakul is put into a graveyard from anywhere, its owner shuffles their graveyard into their library.
addCard(Zone.LIBRARY, playerA, "Emrakul, the Aeons Torn"); // Creature {15} 15/15
// When you cast Conduit of Ruin, you may search your library for a colorless creature card with converted mana cost 7 or greater, then shuffle your library and put that card on top of it.
// The first creature spell you cast each turn costs {2} less to cast.
addCard(Zone.HAND, playerA, "Conduit of Ruin"); // Creature {6} 5/5
addCard(Zone.BATTLEFIELD, playerA, "Plains", 13);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Conduit of Ruin");
setChoice(playerA, true); // When you cast this spell, you may search...
addTarget(playerA, "Emrakul, the Aeons Torn");
setStopAt(3, PhaseStep.DRAW);
execute();
assertLibraryCount(playerA, "Emrakul, the Aeons Torn", 0);
assertHandCount(playerA, "Emrakul, the Aeons Torn", 1);
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Emrakul, the Aeons Torn");
setStopAt(3, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertPermanentCount(playerA, "Conduit of Ruin", 1);
assertPermanentCount(playerA, "Emrakul, the Aeons Torn", 1);
}
package org.mage.test.cards.single.bfz;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class ConduitOfRuinTest extends CardTestPlayerBase {
@Test
public void testCast() {
setStrictChooseMode(true);
// Emrakul, the Aeons Torn can't be countered.
// When you cast Emrakul, take an extra turn after this one.
// Flying, protection from colored spells, annihilator 6
// When Emrakul is put into a graveyard from anywhere, its owner shuffles their graveyard into their library.
addCard(Zone.LIBRARY, playerA, "Emrakul, the Aeons Torn"); // Creature {15} 15/15
// When you cast Conduit of Ruin, you may search your library for a colorless creature card with converted mana cost 7 or greater, then shuffle your library and put that card on top of it.
// The first creature spell you cast each turn costs {2} less to cast.
addCard(Zone.HAND, playerA, "Conduit of Ruin"); // Creature {6} 5/5
addCard(Zone.BATTLEFIELD, playerA, "Plains", 13);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Conduit of Ruin");
setChoice(playerA, true); // When you cast this spell, you may search...
addTarget(playerA, "Emrakul, the Aeons Torn");
setStopAt(3, PhaseStep.DRAW);
execute();
assertLibraryCount(playerA, "Emrakul, the Aeons Torn", 0);
assertHandCount(playerA, "Emrakul, the Aeons Torn", 1);
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Emrakul, the Aeons Torn");
setStopAt(3, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertPermanentCount(playerA, "Conduit of Ruin", 1);
assertPermanentCount(playerA, "Emrakul, the Aeons Torn", 1);
}
}

View file

@ -1,49 +1,49 @@
package org.mage.test.cards.single.c17;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class TheUrDragonTest extends CardTestPlayerBase {
@Test
public void test_basic() {
setStrictChooseMode(true);
addCard(Zone.LIBRARY, playerA, "Silvercoat Lion", 1);
skipInitShuffling();
// Eminence As long as The Ur-Dragon is in the command zone or on the battlefield, other Dragon spells you cast cost 1 less to cast.
// Flying
// Whenever one or more Dragons you control attack, draw that many cards, then you may put a permanent card from your hand onto the battlefield.
addCard(Zone.BATTLEFIELD, playerA, "The Ur-Dragon", 1); // Creature (10/10)
// Flying
// {R}: Dragon Hatchling gets +1/+0 until end of turn.
addCard(Zone.HAND, playerA, "Dragon Hatchling", 2); // Creature Dragon {1}{R} (0/1)
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 2);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Dragon Hatchling");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Dragon Hatchling");
attack(3, playerA, "The Ur-Dragon");
attack(3, playerA, "Dragon Hatchling");
attack(3, playerA, "Dragon Hatchling");
setChoice(playerA, true); // Put a permanent card from your hand onto the battlefield?
setChoice(playerA, "Silvercoat Lion");
setStopAt(3, PhaseStep.END_COMBAT);
execute();
assertAllCommandsUsed();
assertPermanentCount(playerA, "Dragon Hatchling", 2);
assertPermanentCount(playerA, "Silvercoat Lion", 1 );
assertHandCount(playerA, 3);
}
package org.mage.test.cards.single.c17;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class TheUrDragonTest extends CardTestPlayerBase {
@Test
public void test_basic() {
setStrictChooseMode(true);
addCard(Zone.LIBRARY, playerA, "Silvercoat Lion", 1);
skipInitShuffling();
// Eminence As long as The Ur-Dragon is in the command zone or on the battlefield, other Dragon spells you cast cost 1 less to cast.
// Flying
// Whenever one or more Dragons you control attack, draw that many cards, then you may put a permanent card from your hand onto the battlefield.
addCard(Zone.BATTLEFIELD, playerA, "The Ur-Dragon", 1); // Creature (10/10)
// Flying
// {R}: Dragon Hatchling gets +1/+0 until end of turn.
addCard(Zone.HAND, playerA, "Dragon Hatchling", 2); // Creature Dragon {1}{R} (0/1)
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 2);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Dragon Hatchling");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Dragon Hatchling");
attack(3, playerA, "The Ur-Dragon");
attack(3, playerA, "Dragon Hatchling");
attack(3, playerA, "Dragon Hatchling");
setChoice(playerA, true); // Put a permanent card from your hand onto the battlefield?
setChoice(playerA, "Silvercoat Lion");
setStopAt(3, PhaseStep.END_COMBAT);
execute();
assertAllCommandsUsed();
assertPermanentCount(playerA, "Dragon Hatchling", 2);
assertPermanentCount(playerA, "Silvercoat Lion", 1 );
assertHandCount(playerA, 3);
}
}

View file

@ -1,75 +1,75 @@
package org.mage.test.cards.single.c18;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class AminatousAuguryTest extends CardTestPlayerBase {
@Test
public void testCastMultiple() {
setStrictChooseMode(true);
addCard(Zone.LIBRARY, playerA, "Pillarfield Ox"); // Creature (2/4)
// As an additional cost to cast this spell, discard a card.
// Draw two cards.
addCard(Zone.LIBRARY, playerA, "Tormenting Voice"); // Sorcery
// {1}: Adarkar Sentinel gets +0/+1 until end of turn.
addCard(Zone.LIBRARY, playerA, "Adarkar Sentinel"); // Artifact Creature {5} (3/3)
addCard(Zone.LIBRARY, playerA, "Storm Crow");
// You have hexproof. (You can't be the target of spells or abilities your opponents control.)
addCard(Zone.LIBRARY, playerA, "Aegis of the Gods"); // Enchantment Creature {1}{W} (2/1)
addCard(Zone.LIBRARY, playerA, "Lightning Bolt"); // Instant
addCard(Zone.LIBRARY, playerA, "Badlands");
skipInitShuffling();
// Exile the top eight cards of your library. You may put a land card from among them onto the battlefield.
// Until end of turn, for each nonland card type, you may cast a card of that type from among the exiled cards
// without paying its mana cost.
addCard(Zone.HAND, playerA, "Aminatou's Augury"); // SORCERY {6}{U}{U}
addCard(Zone.HAND, playerA, "Mountain");
addCard(Zone.HAND, playerA, "Silvercoat Lion");
addCard(Zone.BATTLEFIELD, playerA, "Island", 8);
playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Mountain");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Aminatou's Augury");
setChoice(playerA, true); // Put a land from among the exiled cards into play?
setChoice(playerA, "Badlands"); // Select a land card
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Adarkar Sentinel");
setChoice(playerA, "Artifact"); // Which card type do you want to consume?
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Aegis of the Gods");
setChoice(playerA, "Enchantment"); // Which card type do you want to consume?
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Storm Crow");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", playerB);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Tormenting Voice");
setChoice(playerA, "Silvercoat Lion"); // Select a card (discard cost)
checkPlayableAbility("Cannot cast second creature from exile", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Pillarfield Ox", Boolean.FALSE); // Type Creature type is already consumed
execute();
assertAllCommandsUsed();
assertGraveyardCount(playerA, "Aminatou's Augury", 1);
assertPermanentCount(playerA, "Mountain", 1);
assertPermanentCount(playerA, "Badlands", 1);
assertPermanentCount(playerA, "Adarkar Sentinel", 1);
assertPermanentCount(playerA, "Aegis of the Gods", 1);
assertPermanentCount(playerA, "Storm Crow", 1);
assertGraveyardCount(playerA, "Lightning Bolt", 1);
assertLife(playerA, 20);
assertLife(playerB, 17);
assertHandCount(playerA, 2);
assertGraveyardCount(playerA, "Silvercoat Lion",1);
assertExileCount(playerA, 2);
}
}
package org.mage.test.cards.single.c18;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class AminatousAuguryTest extends CardTestPlayerBase {
@Test
public void testCastMultiple() {
setStrictChooseMode(true);
addCard(Zone.LIBRARY, playerA, "Pillarfield Ox"); // Creature (2/4)
// As an additional cost to cast this spell, discard a card.
// Draw two cards.
addCard(Zone.LIBRARY, playerA, "Tormenting Voice"); // Sorcery
// {1}: Adarkar Sentinel gets +0/+1 until end of turn.
addCard(Zone.LIBRARY, playerA, "Adarkar Sentinel"); // Artifact Creature {5} (3/3)
addCard(Zone.LIBRARY, playerA, "Storm Crow");
// You have hexproof. (You can't be the target of spells or abilities your opponents control.)
addCard(Zone.LIBRARY, playerA, "Aegis of the Gods"); // Enchantment Creature {1}{W} (2/1)
addCard(Zone.LIBRARY, playerA, "Lightning Bolt"); // Instant
addCard(Zone.LIBRARY, playerA, "Badlands");
skipInitShuffling();
// Exile the top eight cards of your library. You may put a land card from among them onto the battlefield.
// Until end of turn, for each nonland card type, you may cast a card of that type from among the exiled cards
// without paying its mana cost.
addCard(Zone.HAND, playerA, "Aminatou's Augury"); // SORCERY {6}{U}{U}
addCard(Zone.HAND, playerA, "Mountain");
addCard(Zone.HAND, playerA, "Silvercoat Lion");
addCard(Zone.BATTLEFIELD, playerA, "Island", 8);
playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Mountain");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Aminatou's Augury");
setChoice(playerA, true); // Put a land from among the exiled cards into play?
setChoice(playerA, "Badlands"); // Select a land card
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Adarkar Sentinel");
setChoice(playerA, "Artifact"); // Which card type do you want to consume?
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Aegis of the Gods");
setChoice(playerA, "Enchantment"); // Which card type do you want to consume?
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Storm Crow");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", playerB);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Tormenting Voice");
setChoice(playerA, "Silvercoat Lion"); // Select a card (discard cost)
checkPlayableAbility("Cannot cast second creature from exile", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Pillarfield Ox", Boolean.FALSE); // Type Creature type is already consumed
execute();
assertAllCommandsUsed();
assertGraveyardCount(playerA, "Aminatou's Augury", 1);
assertPermanentCount(playerA, "Mountain", 1);
assertPermanentCount(playerA, "Badlands", 1);
assertPermanentCount(playerA, "Adarkar Sentinel", 1);
assertPermanentCount(playerA, "Aegis of the Gods", 1);
assertPermanentCount(playerA, "Storm Crow", 1);
assertGraveyardCount(playerA, "Lightning Bolt", 1);
assertLife(playerA, 20);
assertLife(playerB, 17);
assertHandCount(playerA, 2);
assertGraveyardCount(playerA, "Silvercoat Lion",1);
assertExileCount(playerA, 2);
}
}

View file

@ -1,96 +1,96 @@
package org.mage.test.cards.single.c20;
import mage.cards.Card;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import mage.counters.CounterType;
import org.junit.Assert;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class PakoArcaneRetrieverTest extends CardTestPlayerBase {
@Test
public void test_CheckExiled() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 6);
addCard(Zone.LIBRARY, playerA, "Silvercoat Lion", 1);
addCard(Zone.LIBRARY, playerB, "Pillarfield Ox", 1);
skipInitShuffling();
// Partner with Pako, Arcane Retriever
// You may play noncreature cards from exile with fetch counters on them if you
// exiled them, and you may spend mana as though it were mana of any color to cast those spells.
addCard(Zone.BATTLEFIELD, playerA, "Haldan, Avid Arcanist", 1);
// Partner with Haldan, Avid Arcanist
// Haste
// Whenever Pako, Arcane Retriever attacks, exile the top card of each player's library and put a fetch counter on each of them. Put a +1/+1 counter on Pako for each noncreature card exiled this way.
addCard(Zone.BATTLEFIELD, playerA, "Pako, Arcane Retriever", 1); // Creature {3}{R}{G} (3/3)
attack(1, playerA, "Pako, Arcane Retriever");
setStopAt(1, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertLife(playerA, 20);
assertLife(playerB, 17);
assertExileCount(playerA, "Silvercoat Lion", 1);
assertExileCount(playerB, "Pillarfield Ox", 1);
for(Card card :currentGame.getExile().getAllCards(currentGame)) {
Assert.assertTrue(card.getName() + " has a fetch counter",card.getCounters(currentGame).getCount(CounterType.FETCH) == 1);
}
}
@Test
public void test_CastExiled() {
// setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, "Forest", 3);
addCard(Zone.BATTLEFIELD, playerA, "Plains", 3);
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 6);
addCard(Zone.LIBRARY, playerA, "Lightning Bolt", 1); // Instant 3 damge
// Create a 3/3 green Centaur creature token.
addCard(Zone.LIBRARY, playerB, "Call of the Conclave", 1); // Sorcery {W}{G}
skipInitShuffling();
// Partner with Pako, Arcane Retriever
// You may play noncreature cards from exile with fetch counters on them if you
// exiled them, and you may spend mana as though it were mana of any color to cast those spells.
addCard(Zone.BATTLEFIELD, playerA, "Haldan, Avid Arcanist", 1);
// Partner with Haldan, Avid Arcanist
// Haste
// Whenever Pako, Arcane Retriever attacks, exile the top card of each player's library and put a fetch counter on each of them. Put a +1/+1 counter on Pako for each noncreature card exiled this way.
addCard(Zone.BATTLEFIELD, playerA, "Pako, Arcane Retriever", 1); // Creature {3}{R}{G} (3/3)
attack(1, playerA, "Pako, Arcane Retriever");
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Lightning Bolt", playerB);
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Call of the Conclave");
setStopAt(1, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertLife(playerA, 20);
assertLife(playerB, 12); // 3+2 (attack) + 3 Lighning Bolt
assertGraveyardCount(playerA, "Lightning Bolt", 1);
assertGraveyardCount(playerB, "Call of the Conclave", 1);
}
}
package org.mage.test.cards.single.c20;
import mage.cards.Card;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import mage.counters.CounterType;
import org.junit.Assert;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class PakoArcaneRetrieverTest extends CardTestPlayerBase {
@Test
public void test_CheckExiled() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 6);
addCard(Zone.LIBRARY, playerA, "Silvercoat Lion", 1);
addCard(Zone.LIBRARY, playerB, "Pillarfield Ox", 1);
skipInitShuffling();
// Partner with Pako, Arcane Retriever
// You may play noncreature cards from exile with fetch counters on them if you
// exiled them, and you may spend mana as though it were mana of any color to cast those spells.
addCard(Zone.BATTLEFIELD, playerA, "Haldan, Avid Arcanist", 1);
// Partner with Haldan, Avid Arcanist
// Haste
// Whenever Pako, Arcane Retriever attacks, exile the top card of each player's library and put a fetch counter on each of them. Put a +1/+1 counter on Pako for each noncreature card exiled this way.
addCard(Zone.BATTLEFIELD, playerA, "Pako, Arcane Retriever", 1); // Creature {3}{R}{G} (3/3)
attack(1, playerA, "Pako, Arcane Retriever");
setStopAt(1, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertLife(playerA, 20);
assertLife(playerB, 17);
assertExileCount(playerA, "Silvercoat Lion", 1);
assertExileCount(playerB, "Pillarfield Ox", 1);
for(Card card :currentGame.getExile().getAllCards(currentGame)) {
Assert.assertTrue(card.getName() + " has a fetch counter",card.getCounters(currentGame).getCount(CounterType.FETCH) == 1);
}
}
@Test
public void test_CastExiled() {
// setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, "Forest", 3);
addCard(Zone.BATTLEFIELD, playerA, "Plains", 3);
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 6);
addCard(Zone.LIBRARY, playerA, "Lightning Bolt", 1); // Instant 3 damge
// Create a 3/3 green Centaur creature token.
addCard(Zone.LIBRARY, playerB, "Call of the Conclave", 1); // Sorcery {W}{G}
skipInitShuffling();
// Partner with Pako, Arcane Retriever
// You may play noncreature cards from exile with fetch counters on them if you
// exiled them, and you may spend mana as though it were mana of any color to cast those spells.
addCard(Zone.BATTLEFIELD, playerA, "Haldan, Avid Arcanist", 1);
// Partner with Haldan, Avid Arcanist
// Haste
// Whenever Pako, Arcane Retriever attacks, exile the top card of each player's library and put a fetch counter on each of them. Put a +1/+1 counter on Pako for each noncreature card exiled this way.
addCard(Zone.BATTLEFIELD, playerA, "Pako, Arcane Retriever", 1); // Creature {3}{R}{G} (3/3)
attack(1, playerA, "Pako, Arcane Retriever");
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Lightning Bolt", playerB);
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Call of the Conclave");
setStopAt(1, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertLife(playerA, 20);
assertLife(playerB, 12); // 3+2 (attack) + 3 Lighning Bolt
assertGraveyardCount(playerA, "Lightning Bolt", 1);
assertGraveyardCount(playerB, "Call of the Conclave", 1);
}
}

View file

@ -1,72 +1,72 @@
package org.mage.test.cards.single.dst;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class DemonsHornTest extends CardTestPlayerBase {
@Test
public void testWithBlackSpell() {
setStrictChooseMode(true);
// When Abyssal Gatekeeper dies, each player sacrifices a creature.
addCard(Zone.HAND, playerA, "Abyssal Gatekeeper", 1); // Creature {2}{B} 1/1
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 2);
// Whenever a player casts a black spell, you may gain 1 life.
addCard(Zone.BATTLEFIELD, playerB, "Demon's Horn", 1);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Abyssal Gatekeeper");
setChoice(playerB, true);
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertPermanentCount(playerA, "Abyssal Gatekeeper", 1);
assertLife(playerA, 20);
assertLife(playerB, 21);
}
/**
* https://github.com/magefree/mage/issues/6890
*
* Color == Color Identity #6890
*
* Alesha, Who Smiles at Death triggers Demon's Horn
*/
@Test
public void testSpellWithBlackManaOnlyInTriggeredOptionalCost() {
setStrictChooseMode(true);
// First strike
// Whenever Alesha, Who Smiles at Death attacks, you may pay {W/B}{W/B}. If you do, return target creature card with power 2 or less from your graveyard to the battlefield tapped and attacking.
addCard(Zone.HAND, playerA, "Alesha, Who Smiles at Death", 1); // Creature {2}{R} 3/2
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3);
// Whenever a player casts a black spell, you may gain 1 life.
addCard(Zone.BATTLEFIELD, playerB, "Demon's Horn", 1);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Alesha, Who Smiles at Death");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertPermanentCount(playerA, "Alesha, Who Smiles at Death", 1);
assertLife(playerA, 20);
assertLife(playerB, 20);
}
}
package org.mage.test.cards.single.dst;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class DemonsHornTest extends CardTestPlayerBase {
@Test
public void testWithBlackSpell() {
setStrictChooseMode(true);
// When Abyssal Gatekeeper dies, each player sacrifices a creature.
addCard(Zone.HAND, playerA, "Abyssal Gatekeeper", 1); // Creature {2}{B} 1/1
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 2);
// Whenever a player casts a black spell, you may gain 1 life.
addCard(Zone.BATTLEFIELD, playerB, "Demon's Horn", 1);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Abyssal Gatekeeper");
setChoice(playerB, true);
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertPermanentCount(playerA, "Abyssal Gatekeeper", 1);
assertLife(playerA, 20);
assertLife(playerB, 21);
}
/**
* https://github.com/magefree/mage/issues/6890
*
* Color == Color Identity #6890
*
* Alesha, Who Smiles at Death triggers Demon's Horn
*/
@Test
public void testSpellWithBlackManaOnlyInTriggeredOptionalCost() {
setStrictChooseMode(true);
// First strike
// Whenever Alesha, Who Smiles at Death attacks, you may pay {W/B}{W/B}. If you do, return target creature card with power 2 or less from your graveyard to the battlefield tapped and attacking.
addCard(Zone.HAND, playerA, "Alesha, Who Smiles at Death", 1); // Creature {2}{R} 3/2
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3);
// Whenever a player casts a black spell, you may gain 1 life.
addCard(Zone.BATTLEFIELD, playerB, "Demon's Horn", 1);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Alesha, Who Smiles at Death");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertPermanentCount(playerA, "Alesha, Who Smiles at Death", 1);
assertLife(playerA, 20);
assertLife(playerB, 20);
}
}

View file

@ -1,88 +1,88 @@
package org.mage.test.cards.single.eld;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class BarteredCowTest extends CardTestPlayerBase {
@Test
public void testDiesTrigger() {
setStrictChooseMode(true);
// When Bartered Cow dies or when you discard it, create a Food token.
addCard(Zone.BATTLEFIELD, playerA, "Bartered Cow"); // Creature {3}{W} 3/3
addCard(Zone.HAND, playerB, "Lightning Bolt", 1);
addCard(Zone.BATTLEFIELD, playerB, "Mountain");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Lightning Bolt", "Bartered Cow");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertGraveyardCount(playerB, "Lightning Bolt", 1);
assertGraveyardCount(playerA, "Bartered Cow", 1);
assertPermanentCount(playerA, "Food", 1);
}
@Test
public void testDiscardTrigger() {
setStrictChooseMode(true);
// When Bartered Cow dies or when you discard it, create a Food token.
addCard(Zone.HAND, playerA, "Bartered Cow"); // Creature {3}{W} 3/3
// Choose one
// Target player discards a card.
// Target creature gets +2/-1 until end of turn.
// Target creature gains swampwalk until end of turn. (It can't be blocked as long as defending player controls a Swamp.)
addCard(Zone.HAND, playerB, "Funeral Charm", 1); // Instant {B}
addCard(Zone.BATTLEFIELD, playerB, "Swamp");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Funeral Charm");
setModeChoice(playerB, "1");
addTarget(playerB, playerA);
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertGraveyardCount(playerB, "Funeral Charm", 1);
assertGraveyardCount(playerA, "Bartered Cow", 1);
assertPermanentCount(playerA, "Food", 1);
}
@Test
public void testDiscardTriggerWithTorturedExistence() {
setStrictChooseMode(true);
// When Bartered Cow dies or when you discard it, create a Food token.
addCard(Zone.HAND, playerA, "Bartered Cow"); // Creature {3}{W} 3/3
// {B}, Discard a creature card: Return target creature card from your graveyard to your hand.
addCard(Zone.BATTLEFIELD, playerA, "Tortured Existence", 1); // Instant {B}
addCard(Zone.BATTLEFIELD, playerA, "Swamp");
addCard(Zone.GRAVEYARD, playerA, "Silvercoat Lion");
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{B}, Discard a creature card");
setChoice(playerA, "Bartered Cow");
addTarget(playerA, "Silvercoat Lion");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertGraveyardCount(playerA, "Bartered Cow", 1);
assertHandCount(playerA, "Silvercoat Lion", 1);
assertPermanentCount(playerA, "Food", 1);
}
}
package org.mage.test.cards.single.eld;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class BarteredCowTest extends CardTestPlayerBase {
@Test
public void testDiesTrigger() {
setStrictChooseMode(true);
// When Bartered Cow dies or when you discard it, create a Food token.
addCard(Zone.BATTLEFIELD, playerA, "Bartered Cow"); // Creature {3}{W} 3/3
addCard(Zone.HAND, playerB, "Lightning Bolt", 1);
addCard(Zone.BATTLEFIELD, playerB, "Mountain");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Lightning Bolt", "Bartered Cow");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertGraveyardCount(playerB, "Lightning Bolt", 1);
assertGraveyardCount(playerA, "Bartered Cow", 1);
assertPermanentCount(playerA, "Food", 1);
}
@Test
public void testDiscardTrigger() {
setStrictChooseMode(true);
// When Bartered Cow dies or when you discard it, create a Food token.
addCard(Zone.HAND, playerA, "Bartered Cow"); // Creature {3}{W} 3/3
// Choose one
// Target player discards a card.
// Target creature gets +2/-1 until end of turn.
// Target creature gains swampwalk until end of turn. (It can't be blocked as long as defending player controls a Swamp.)
addCard(Zone.HAND, playerB, "Funeral Charm", 1); // Instant {B}
addCard(Zone.BATTLEFIELD, playerB, "Swamp");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Funeral Charm");
setModeChoice(playerB, "1");
addTarget(playerB, playerA);
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertGraveyardCount(playerB, "Funeral Charm", 1);
assertGraveyardCount(playerA, "Bartered Cow", 1);
assertPermanentCount(playerA, "Food", 1);
}
@Test
public void testDiscardTriggerWithTorturedExistence() {
setStrictChooseMode(true);
// When Bartered Cow dies or when you discard it, create a Food token.
addCard(Zone.HAND, playerA, "Bartered Cow"); // Creature {3}{W} 3/3
// {B}, Discard a creature card: Return target creature card from your graveyard to your hand.
addCard(Zone.BATTLEFIELD, playerA, "Tortured Existence", 1); // Instant {B}
addCard(Zone.BATTLEFIELD, playerA, "Swamp");
addCard(Zone.GRAVEYARD, playerA, "Silvercoat Lion");
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{B}, Discard a creature card");
setChoice(playerA, "Bartered Cow");
addTarget(playerA, "Silvercoat Lion");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertGraveyardCount(playerA, "Bartered Cow", 1);
assertHandCount(playerA, "Silvercoat Lion", 1);
assertPermanentCount(playerA, "Food", 1);
}
}

View file

@ -1,89 +1,89 @@
package org.mage.test.cards.single.eld;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class OnceUponATimeTest extends CardTestPlayerBase {
@Test
public void test_castRegularly() {
setStrictChooseMode(true);
addCard(Zone.LIBRARY, playerA, "Silvercoat Lion");
addCard(Zone.LIBRARY, playerA, "Plains", 4);
skipInitShuffling();
// If this spell is the first spell you've cast this game, you may cast it without paying its mana cost.
// Look at the top five cards of your library.
// You may reveal a creature or land card from among them and put it into your hand.
// Put the rest on the bottom of your library in a random order.
addCard(Zone.HAND, playerA, "Once Upon a Time"); // Instant {1}{G}
addCard(Zone.BATTLEFIELD, playerA, "Forest", 1);
addCard(Zone.HAND, playerA, "Forest", 1);
playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Forest");
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Once Upon a Time");
setChoice(playerA, false); // Cast without paying its mana cost?
setChoice(playerA, true); // Do you wish to reveal a creature or land card and put into your hand?
setChoice(playerA, "Silvercoat Lion");
setStopAt(2, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertGraveyardCount(playerA, "Once Upon a Time", 1);
assertTappedCount("Forest", true, 2);
assertHandCount(playerA, "Silvercoat Lion", 1);
}
@Test
public void test_castForFree() {
setStrictChooseMode(true);
addCard(Zone.LIBRARY, playerA, "Silvercoat Lion");
addCard(Zone.LIBRARY, playerA, "Plains", 4);
addCard(Zone.LIBRARY, playerB, "Silvercoat Lion", 5);
skipInitShuffling();
// If this spell is the first spell you've cast this game, you may cast it without paying its mana cost.
// Look at the top five cards of your library.
// You may reveal a creature or land card from among them and put it into your hand.
// Put the rest on the bottom of your library in a random order.
addCard(Zone.HAND, playerA, "Once Upon a Time"); // Instant {1}{G}
addCard(Zone.HAND, playerB, "Once Upon a Time"); // Instant {1}{G}
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Once Upon a Time");
setChoice(playerA, true); // Cast without paying its mana cost?
setChoice(playerA, true); // Do you wish to reveal a creature or land card and put into your hand?
setChoice(playerA, "Silvercoat Lion");
castSpell(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "Once Upon a Time");
setChoice(playerB, true); // Cast without paying its mana cost?
setChoice(playerB, true); // Do you wish to reveal a creature or land card and put into your hand?
setChoice(playerB, "Silvercoat Lion");
setStopAt(2, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertGraveyardCount(playerA, "Once Upon a Time", 1);
assertGraveyardCount(playerB, "Once Upon a Time", 1);
assertHandCount(playerA, "Silvercoat Lion", 1);
assertHandCount(playerB, "Silvercoat Lion", 2);
}
package org.mage.test.cards.single.eld;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class OnceUponATimeTest extends CardTestPlayerBase {
@Test
public void test_castRegularly() {
setStrictChooseMode(true);
addCard(Zone.LIBRARY, playerA, "Silvercoat Lion");
addCard(Zone.LIBRARY, playerA, "Plains", 4);
skipInitShuffling();
// If this spell is the first spell you've cast this game, you may cast it without paying its mana cost.
// Look at the top five cards of your library.
// You may reveal a creature or land card from among them and put it into your hand.
// Put the rest on the bottom of your library in a random order.
addCard(Zone.HAND, playerA, "Once Upon a Time"); // Instant {1}{G}
addCard(Zone.BATTLEFIELD, playerA, "Forest", 1);
addCard(Zone.HAND, playerA, "Forest", 1);
playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Forest");
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Once Upon a Time");
setChoice(playerA, false); // Cast without paying its mana cost?
setChoice(playerA, true); // Do you wish to reveal a creature or land card and put into your hand?
setChoice(playerA, "Silvercoat Lion");
setStopAt(2, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertGraveyardCount(playerA, "Once Upon a Time", 1);
assertTappedCount("Forest", true, 2);
assertHandCount(playerA, "Silvercoat Lion", 1);
}
@Test
public void test_castForFree() {
setStrictChooseMode(true);
addCard(Zone.LIBRARY, playerA, "Silvercoat Lion");
addCard(Zone.LIBRARY, playerA, "Plains", 4);
addCard(Zone.LIBRARY, playerB, "Silvercoat Lion", 5);
skipInitShuffling();
// If this spell is the first spell you've cast this game, you may cast it without paying its mana cost.
// Look at the top five cards of your library.
// You may reveal a creature or land card from among them and put it into your hand.
// Put the rest on the bottom of your library in a random order.
addCard(Zone.HAND, playerA, "Once Upon a Time"); // Instant {1}{G}
addCard(Zone.HAND, playerB, "Once Upon a Time"); // Instant {1}{G}
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Once Upon a Time");
setChoice(playerA, true); // Cast without paying its mana cost?
setChoice(playerA, true); // Do you wish to reveal a creature or land card and put into your hand?
setChoice(playerA, "Silvercoat Lion");
castSpell(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "Once Upon a Time");
setChoice(playerB, true); // Cast without paying its mana cost?
setChoice(playerB, true); // Do you wish to reveal a creature or land card and put into your hand?
setChoice(playerB, "Silvercoat Lion");
setStopAt(2, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertGraveyardCount(playerA, "Once Upon a Time", 1);
assertGraveyardCount(playerB, "Once Upon a Time", 1);
assertHandCount(playerA, "Silvercoat Lion", 1);
assertHandCount(playerB, "Silvercoat Lion", 2);
}
}

View file

@ -1,57 +1,57 @@
package org.mage.test.cards.single.eld;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class SyrGwynHeroOfAshvaleTest extends CardTestPlayerBase {
@Test
public void equipKnightTest() {
// Equipped creature gets +2/+2 and has trample and lifelink.
addCard(Zone.BATTLEFIELD, playerA, "Behemoth Sledge"); // Artifact - Equipment {1}{G}{W}
// Vigilance, menace
// Whenever an equipped creature you control attacks, you draw a card and you lose 1 life.
// Equipment you control have equip Knight {0}.
addCard(Zone.BATTLEFIELD, playerA, "Syr Gwyn, Hero of Ashvale"); // Legendary Creature {3}{R}{W}{B} 5/5 Human Knight
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Equip Knight", "Syr Gwyn, Hero of Ashvale");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertPowerToughness(playerA, "Syr Gwyn, Hero of Ashvale", 7, 7);
}
@Test
public void equipKnightTestInstantSpeed() {
// Equipped creature gets +2/+2 and has trample and lifelink.
addCard(Zone.BATTLEFIELD, playerA, "Behemoth Sledge"); // Artifact - Equipment {1}{G}{W}
// You may activate equip abilities any time you could cast an instant.
addCard(Zone.BATTLEFIELD, playerA, "Leonin Shikari", 2); // Creature 2/2
// Vigilance, menace
// Whenever an equipped creature you control attacks, you draw a card and you lose 1 life.
// Equipment you control have equip Knight {0}.
addCard(Zone.BATTLEFIELD, playerA, "Syr Gwyn, Hero of Ashvale"); // Legendary Creature {3}{R}{W}{B} 5/5 Human Knight
activateAbility(1, PhaseStep.DECLARE_ATTACKERS, playerA, "Equip Knight", "Syr Gwyn, Hero of Ashvale");
setStopAt(1, PhaseStep.END_COMBAT);
execute();
assertPowerToughness(playerA, "Syr Gwyn, Hero of Ashvale", 7, 7);
}
}
package org.mage.test.cards.single.eld;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class SyrGwynHeroOfAshvaleTest extends CardTestPlayerBase {
@Test
public void equipKnightTest() {
// Equipped creature gets +2/+2 and has trample and lifelink.
addCard(Zone.BATTLEFIELD, playerA, "Behemoth Sledge"); // Artifact - Equipment {1}{G}{W}
// Vigilance, menace
// Whenever an equipped creature you control attacks, you draw a card and you lose 1 life.
// Equipment you control have equip Knight {0}.
addCard(Zone.BATTLEFIELD, playerA, "Syr Gwyn, Hero of Ashvale"); // Legendary Creature {3}{R}{W}{B} 5/5 Human Knight
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Equip Knight", "Syr Gwyn, Hero of Ashvale");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertPowerToughness(playerA, "Syr Gwyn, Hero of Ashvale", 7, 7);
}
@Test
public void equipKnightTestInstantSpeed() {
// Equipped creature gets +2/+2 and has trample and lifelink.
addCard(Zone.BATTLEFIELD, playerA, "Behemoth Sledge"); // Artifact - Equipment {1}{G}{W}
// You may activate equip abilities any time you could cast an instant.
addCard(Zone.BATTLEFIELD, playerA, "Leonin Shikari", 2); // Creature 2/2
// Vigilance, menace
// Whenever an equipped creature you control attacks, you draw a card and you lose 1 life.
// Equipment you control have equip Knight {0}.
addCard(Zone.BATTLEFIELD, playerA, "Syr Gwyn, Hero of Ashvale"); // Legendary Creature {3}{R}{W}{B} 5/5 Human Knight
activateAbility(1, PhaseStep.DECLARE_ATTACKERS, playerA, "Equip Knight", "Syr Gwyn, Hero of Ashvale");
setStopAt(1, PhaseStep.END_COMBAT);
execute();
assertPowerToughness(playerA, "Syr Gwyn, Hero of Ashvale", 7, 7);
}
}

View file

@ -1,245 +1,245 @@
package org.mage.test.cards.single.grn;
import mage.abilities.keyword.TrampleAbility;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.filter.Filter;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
* @author LevelX2, TheElk801
*/
public class PeltCollectorTest extends CardTestPlayerBase {
private static final String collector = "Pelt Collector";
private static final String lion = "Silvercoat Lion";
private static final String trostani = "Trostani Discordant";
private static final String bear = "Grizzly Bears";
private static final String murder = "Murder";
private static final String courser = "Centaur Courser";
private static final String growth = "Giant Growth";
private static final String karstoderm = "Karstoderm";
@Test
public void test_Simple() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, "Forest", 1);
addCard(Zone.BATTLEFIELD, playerA, "Plains", 2);
// Whenever another creature you control enters the battlefield or dies, if that creature's power is greater than Pelt Collector's, put a +1/+1 counter on Pelt Collector.
// As long as Pelt Collector has three or more +1/+1 counters on it, it has trample.
addCard(Zone.HAND, playerA, collector, 1); // Creature {G}
addCard(Zone.HAND, playerA, lion, 1); // Creature {1}{W}
addCard(Zone.BATTLEFIELD, playerB, collector, 1);// Creature {G}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, collector);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, lion);
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertPowerToughness(playerB, collector, 1, 1);
assertPowerToughness(playerA, lion, 2, 2);
assertPowerToughness(playerA, collector, 2, 2);
assertAbility(playerA, collector, TrampleAbility.getInstance(), false);
assertAbility(playerB, collector, TrampleAbility.getInstance(), false);
}
/**
* To determine if Pelt Collectors first ability triggers when a creature
* enters the battlefield, use the creatures power after applying any
* static abilities (such as that of Trostani Discordant) that modify its
* power.
*/
@Test
public void test_TrostaniDiscordant() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, "Forest", 2);
addCard(Zone.BATTLEFIELD, playerA, "Plains", 3);
// Whenever another creature you control enters the battlefield or dies, if that creature's power is greater than Pelt Collector's, put a +1/+1 counter on Pelt Collector.
// As long as Pelt Collector has three or more +1/+1 counters on it, it has trample.
addCard(Zone.HAND, playerA, collector, 1); // Creature {G}
addCard(Zone.HAND, playerA, lion, 1); // Creature {1}{W}
// Other creatures you control get +1/+1.
// When Trostani Discordant enters the battlefield, create two 1/1 white Soldier creature tokens with lifelink.
// At the beginning of your end step, each player gains control of all creatures they own.
addCard(Zone.HAND, playerA, trostani, 1); // Creature {3}{G}{W} /1/4)
addCard(Zone.BATTLEFIELD, playerB, collector, 1);// Creature {G}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, trostani);
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, collector);
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, lion);
setStopAt(3, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertPowerToughness(playerB, collector, 1, 1);
assertPowerToughness(playerA, "Soldier", 2, 2, Filter.ComparisonScope.All);
assertPowerToughness(playerA, lion, 3, 3);
assertPowerToughness(playerA, collector, 3, 3);
assertAbility(playerA, collector, TrampleAbility.getInstance(), false);
assertAbility(playerB, collector, TrampleAbility.getInstance(), false);
}
@Test
public void testEntersTrigger() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, collector);
addCard(Zone.HAND, playerA, bear);
addCard(Zone.BATTLEFIELD, playerA, "Forest", 2);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, bear);
setStopAt(1, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertPowerToughness(playerA, collector, 2, 2);
assertCounterCount(collector, CounterType.P1P1, 1);
}
@Test
public void testEntersTrigger2() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, collector);
addCard(Zone.HAND, playerA, karstoderm);
addCard(Zone.BATTLEFIELD, playerA, "Forest", 4);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, karstoderm);
setStopAt(1, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertPowerToughness(playerA, collector, 2, 2);
assertCounterCount(collector, CounterType.P1P1, 1);
}
@Test
public void testDiesTrigger() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, collector);
addCard(Zone.HAND, playerA, bear);
addCard(Zone.HAND, playerA, murder);
addCard(Zone.BATTLEFIELD, playerA, "Bayou", 5);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, bear);
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, murder, bear);
setStopAt(1, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertPowerToughness(playerA, collector, 2, 2);
assertCounterCount(collector, CounterType.P1P1, 1);
}
@Test
public void testDiesTrigger2() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, collector);
addCard(Zone.HAND, playerA, courser);
addCard(Zone.HAND, playerA, murder);
addCard(Zone.BATTLEFIELD, playerA, "Bayou", 6);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, courser);
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, murder, courser);
setStopAt(1, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertPowerToughness(playerA, collector, 3, 3);
assertCounterCount(collector, CounterType.P1P1, 2);
}
@Test
public void testDiesTrigger3() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, collector);
addCard(Zone.HAND, playerA, karstoderm);
addCard(Zone.HAND, playerA, murder);
addCard(Zone.BATTLEFIELD, playerA, "Bayou", 7);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, karstoderm);
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, murder, karstoderm);
setStopAt(1, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertPowerToughness(playerA, collector, 3, 3);
assertCounterCount(collector, CounterType.P1P1, 2);
}
@Test
public void testInterveningIf() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, collector);
addCard(Zone.HAND, playerA, bear);
addCard(Zone.HAND, playerA, growth);
addCard(Zone.BATTLEFIELD, playerA, "Forest", 3);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, bear);
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN, true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, growth, collector);
setStopAt(1, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertPowerToughness(playerA, collector, 4, 4);
assertCounterCount(collector, CounterType.P1P1, 0);
}
@Test
public void testInterveningIf2() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, collector);
addCard(Zone.HAND, playerA, bear);
addCard(Zone.HAND, playerA, "Scar");
addCard(Zone.BATTLEFIELD, playerA, "Bayou", 3);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, bear);
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN, true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Scar", bear);
setStopAt(1, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertPowerToughness(playerA, collector, 1, 1);
assertCounterCount(collector, CounterType.P1P1, 0);
}
}
package org.mage.test.cards.single.grn;
import mage.abilities.keyword.TrampleAbility;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.filter.Filter;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
* @author LevelX2, TheElk801
*/
public class PeltCollectorTest extends CardTestPlayerBase {
private static final String collector = "Pelt Collector";
private static final String lion = "Silvercoat Lion";
private static final String trostani = "Trostani Discordant";
private static final String bear = "Grizzly Bears";
private static final String murder = "Murder";
private static final String courser = "Centaur Courser";
private static final String growth = "Giant Growth";
private static final String karstoderm = "Karstoderm";
@Test
public void test_Simple() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, "Forest", 1);
addCard(Zone.BATTLEFIELD, playerA, "Plains", 2);
// Whenever another creature you control enters the battlefield or dies, if that creature's power is greater than Pelt Collector's, put a +1/+1 counter on Pelt Collector.
// As long as Pelt Collector has three or more +1/+1 counters on it, it has trample.
addCard(Zone.HAND, playerA, collector, 1); // Creature {G}
addCard(Zone.HAND, playerA, lion, 1); // Creature {1}{W}
addCard(Zone.BATTLEFIELD, playerB, collector, 1);// Creature {G}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, collector);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, lion);
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertPowerToughness(playerB, collector, 1, 1);
assertPowerToughness(playerA, lion, 2, 2);
assertPowerToughness(playerA, collector, 2, 2);
assertAbility(playerA, collector, TrampleAbility.getInstance(), false);
assertAbility(playerB, collector, TrampleAbility.getInstance(), false);
}
/**
* To determine if Pelt Collectors first ability triggers when a creature
* enters the battlefield, use the creatures power after applying any
* static abilities (such as that of Trostani Discordant) that modify its
* power.
*/
@Test
public void test_TrostaniDiscordant() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, "Forest", 2);
addCard(Zone.BATTLEFIELD, playerA, "Plains", 3);
// Whenever another creature you control enters the battlefield or dies, if that creature's power is greater than Pelt Collector's, put a +1/+1 counter on Pelt Collector.
// As long as Pelt Collector has three or more +1/+1 counters on it, it has trample.
addCard(Zone.HAND, playerA, collector, 1); // Creature {G}
addCard(Zone.HAND, playerA, lion, 1); // Creature {1}{W}
// Other creatures you control get +1/+1.
// When Trostani Discordant enters the battlefield, create two 1/1 white Soldier creature tokens with lifelink.
// At the beginning of your end step, each player gains control of all creatures they own.
addCard(Zone.HAND, playerA, trostani, 1); // Creature {3}{G}{W} /1/4)
addCard(Zone.BATTLEFIELD, playerB, collector, 1);// Creature {G}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, trostani);
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, collector);
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, lion);
setStopAt(3, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertPowerToughness(playerB, collector, 1, 1);
assertPowerToughness(playerA, "Soldier", 2, 2, Filter.ComparisonScope.All);
assertPowerToughness(playerA, lion, 3, 3);
assertPowerToughness(playerA, collector, 3, 3);
assertAbility(playerA, collector, TrampleAbility.getInstance(), false);
assertAbility(playerB, collector, TrampleAbility.getInstance(), false);
}
@Test
public void testEntersTrigger() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, collector);
addCard(Zone.HAND, playerA, bear);
addCard(Zone.BATTLEFIELD, playerA, "Forest", 2);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, bear);
setStopAt(1, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertPowerToughness(playerA, collector, 2, 2);
assertCounterCount(collector, CounterType.P1P1, 1);
}
@Test
public void testEntersTrigger2() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, collector);
addCard(Zone.HAND, playerA, karstoderm);
addCard(Zone.BATTLEFIELD, playerA, "Forest", 4);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, karstoderm);
setStopAt(1, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertPowerToughness(playerA, collector, 2, 2);
assertCounterCount(collector, CounterType.P1P1, 1);
}
@Test
public void testDiesTrigger() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, collector);
addCard(Zone.HAND, playerA, bear);
addCard(Zone.HAND, playerA, murder);
addCard(Zone.BATTLEFIELD, playerA, "Bayou", 5);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, bear);
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, murder, bear);
setStopAt(1, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertPowerToughness(playerA, collector, 2, 2);
assertCounterCount(collector, CounterType.P1P1, 1);
}
@Test
public void testDiesTrigger2() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, collector);
addCard(Zone.HAND, playerA, courser);
addCard(Zone.HAND, playerA, murder);
addCard(Zone.BATTLEFIELD, playerA, "Bayou", 6);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, courser);
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, murder, courser);
setStopAt(1, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertPowerToughness(playerA, collector, 3, 3);
assertCounterCount(collector, CounterType.P1P1, 2);
}
@Test
public void testDiesTrigger3() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, collector);
addCard(Zone.HAND, playerA, karstoderm);
addCard(Zone.HAND, playerA, murder);
addCard(Zone.BATTLEFIELD, playerA, "Bayou", 7);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, karstoderm);
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, murder, karstoderm);
setStopAt(1, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertPowerToughness(playerA, collector, 3, 3);
assertCounterCount(collector, CounterType.P1P1, 2);
}
@Test
public void testInterveningIf() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, collector);
addCard(Zone.HAND, playerA, bear);
addCard(Zone.HAND, playerA, growth);
addCard(Zone.BATTLEFIELD, playerA, "Forest", 3);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, bear);
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN, true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, growth, collector);
setStopAt(1, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertPowerToughness(playerA, collector, 4, 4);
assertCounterCount(collector, CounterType.P1P1, 0);
}
@Test
public void testInterveningIf2() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, collector);
addCard(Zone.HAND, playerA, bear);
addCard(Zone.HAND, playerA, "Scar");
addCard(Zone.BATTLEFIELD, playerA, "Bayou", 3);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, bear);
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN, true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Scar", bear);
setStopAt(1, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertPowerToughness(playerA, collector, 1, 1);
assertCounterCount(collector, CounterType.P1P1, 0);
}
}

View file

@ -1,88 +1,88 @@
package org.mage.test.cards.single.hou;
import java.io.FileNotFoundException;
import mage.constants.MultiplayerAttackOption;
import mage.constants.PhaseStep;
import mage.constants.RangeOfInfluence;
import mage.constants.Zone;
import mage.game.FreeForAll;
import mage.game.Game;
import mage.game.GameException;
import mage.game.mulligan.MulliganType;
import org.junit.Assert;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestMultiPlayerBase;
/**
*
* @author LevelX2
*/
public class TormentOfHailfireTest extends CardTestMultiPlayerBase {
@Override
protected Game createNewGameAndPlayers() throws GameException, FileNotFoundException {
// Start Life = 2
Game game = new FreeForAll(MultiplayerAttackOption.MULTIPLE, RangeOfInfluence.ONE, MulliganType.GAME_DEFAULT.getMulligan(0), 20);
// Player order: A -> D -> C -> B
playerA = createPlayer(game, playerA, "PlayerA");
playerB = createPlayer(game, playerB, "PlayerB");
playerC = createPlayer(game, playerC, "PlayerC");
playerD = createPlayer(game, playerD, "PlayerD");
return game;
}
@Test
public void test_Normal() {
setStrictChooseMode(true);
// Repeat the following process X times. Each opponent loses 3 life unless they sacrifice a nonland permanent or discards a card.
addCard(Zone.HAND, playerA, "Torment of Hailfire", 1); // Sorcery {X}{B}{B}
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 12);
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 2);
addCard(Zone.HAND, playerB, "Plains", 1);
addCard(Zone.BATTLEFIELD, playerC, "Silvercoat Lion", 3);
addCard(Zone.BATTLEFIELD, playerD, "Silvercoat Lion", 3);
addCard(Zone.HAND, playerD, "Plains", 1);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Torment of Hailfire");
setChoice(playerA, "X=10");
setChoice(playerD, true);// Sacrifices a nonland permanent?
setChoice(playerD, "Silvercoat Lion");
setChoice(playerB, true);// Sacrifices a nonland permanent?
setChoice(playerB, "Silvercoat Lion");
setChoice(playerD, true);// Sacrifices a nonland permanent?
setChoice(playerD, "Silvercoat Lion");
setChoice(playerB, true);// Sacrifices a nonland permanent?
setChoice(playerB, "Silvercoat Lion");
setChoice(playerD, false);// Sacrifices a nonland permanent?
setChoice(playerD, true);// Discard a card?
setChoice(playerB, true);// Discard a card?
setChoice(playerD, true);// Sacrifices a nonland permanent?
setChoice(playerD, "Silvercoat Lion");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertGraveyardCount(playerA, "Torment of Hailfire", 1);
assertLife(playerA, 20);
assertLife(playerC, 20);
assertLife(playerD, 2);
assertLife(playerB, -1);
Assert.assertFalse("Player B is dead", playerB.isInGame());
}
}
package org.mage.test.cards.single.hou;
import java.io.FileNotFoundException;
import mage.constants.MultiplayerAttackOption;
import mage.constants.PhaseStep;
import mage.constants.RangeOfInfluence;
import mage.constants.Zone;
import mage.game.FreeForAll;
import mage.game.Game;
import mage.game.GameException;
import mage.game.mulligan.MulliganType;
import org.junit.Assert;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestMultiPlayerBase;
/**
*
* @author LevelX2
*/
public class TormentOfHailfireTest extends CardTestMultiPlayerBase {
@Override
protected Game createNewGameAndPlayers() throws GameException, FileNotFoundException {
// Start Life = 2
Game game = new FreeForAll(MultiplayerAttackOption.MULTIPLE, RangeOfInfluence.ONE, MulliganType.GAME_DEFAULT.getMulligan(0), 20);
// Player order: A -> D -> C -> B
playerA = createPlayer(game, playerA, "PlayerA");
playerB = createPlayer(game, playerB, "PlayerB");
playerC = createPlayer(game, playerC, "PlayerC");
playerD = createPlayer(game, playerD, "PlayerD");
return game;
}
@Test
public void test_Normal() {
setStrictChooseMode(true);
// Repeat the following process X times. Each opponent loses 3 life unless they sacrifice a nonland permanent or discards a card.
addCard(Zone.HAND, playerA, "Torment of Hailfire", 1); // Sorcery {X}{B}{B}
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 12);
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 2);
addCard(Zone.HAND, playerB, "Plains", 1);
addCard(Zone.BATTLEFIELD, playerC, "Silvercoat Lion", 3);
addCard(Zone.BATTLEFIELD, playerD, "Silvercoat Lion", 3);
addCard(Zone.HAND, playerD, "Plains", 1);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Torment of Hailfire");
setChoice(playerA, "X=10");
setChoice(playerD, true);// Sacrifices a nonland permanent?
setChoice(playerD, "Silvercoat Lion");
setChoice(playerB, true);// Sacrifices a nonland permanent?
setChoice(playerB, "Silvercoat Lion");
setChoice(playerD, true);// Sacrifices a nonland permanent?
setChoice(playerD, "Silvercoat Lion");
setChoice(playerB, true);// Sacrifices a nonland permanent?
setChoice(playerB, "Silvercoat Lion");
setChoice(playerD, false);// Sacrifices a nonland permanent?
setChoice(playerD, true);// Discard a card?
setChoice(playerB, true);// Discard a card?
setChoice(playerD, true);// Sacrifices a nonland permanent?
setChoice(playerD, "Silvercoat Lion");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertGraveyardCount(playerA, "Torment of Hailfire", 1);
assertLife(playerA, 20);
assertLife(playerC, 20);
assertLife(playerD, 2);
assertLife(playerB, -1);
Assert.assertFalse("Player B is dead", playerB.isInGame());
}
}

View file

@ -1,34 +1,34 @@
package org.mage.test.cards.single.iko;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
* @author LevelX2
*/
public class OboshThePreypiercerTest extends CardTestPlayerBase {
@Test
public void testZeroCMSIsHandledAsOdd() {
setStrictChooseMode(true);
// At the beginning of your upkeep, flip a coin. If you lose the flip, Mana Crypt deals 3 damage to you.
// {T}: Add {C}{C}.
addCard(Zone.BATTLEFIELD, playerA, "Mana Crypt");
// Companion Your starting deck contains only cards with odd converted mana costs and land cards.
// If a source you control with an odd converted mana cost would deal damage to a permanent or player, it deals double that damage to that permanent or player instead.
addCard(Zone.BATTLEFIELD, playerA, "Obosh, the Preypiercer");
// lose the flip
setFlipCoinResult(playerA, false);
setStopAt(1, PhaseStep.PRECOMBAT_MAIN);
execute();
assertAllCommandsUsed();
assertLife(playerA, 20 - 3);
}
package org.mage.test.cards.single.iko;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
* @author LevelX2
*/
public class OboshThePreypiercerTest extends CardTestPlayerBase {
@Test
public void testZeroCMSIsHandledAsOdd() {
setStrictChooseMode(true);
// At the beginning of your upkeep, flip a coin. If you lose the flip, Mana Crypt deals 3 damage to you.
// {T}: Add {C}{C}.
addCard(Zone.BATTLEFIELD, playerA, "Mana Crypt");
// Companion Your starting deck contains only cards with odd converted mana costs and land cards.
// If a source you control with an odd converted mana cost would deal damage to a permanent or player, it deals double that damage to that permanent or player instead.
addCard(Zone.BATTLEFIELD, playerA, "Obosh, the Preypiercer");
// lose the flip
setFlipCoinResult(playerA, false);
setStopAt(1, PhaseStep.PRECOMBAT_MAIN);
execute();
assertAllCommandsUsed();
assertLife(playerA, 20 - 3);
}
}

View file

@ -1,90 +1,90 @@
package org.mage.test.cards.single.iko;
import mage.ObjectColor;
import mage.abilities.keyword.FlyingAbility;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class SkycatSovereignTest extends CardTestPlayerBase {
@Test
public void test_BoostFromFlyers() {
setStrictChooseMode(true);
// Flying
// Skycat Sovereign gets +1/+1 for each other creature you control with flying.
// {2}{W}{U}: Create a 1/1 white Cat Bird creature token with flying.
addCard(Zone.BATTLEFIELD, playerA, "Skycat Sovereign"); // Creature {W}{U} (1/1)
// Flying, vigilance
addCard(Zone.BATTLEFIELD, playerA, "Abbey Griffin", 2); // Creature Griffin (2/2)
setStopAt(1, PhaseStep.PRECOMBAT_MAIN);
execute();
assertAllCommandsUsed();
assertPowerToughness(playerA, "Skycat Sovereign", 3, 3);
}
/**
* Skycat Sovereign still gets +1/+1 for each creature that is supposed to have flying when there's an opposing Archetype of Imagination.
*/
@Test
public void test_NoBoostIfFlyingLost() {
setStrictChooseMode(true);
// Flying
// Skycat Sovereign gets +1/+1 for each other creature you control with flying.
// {2}{W}{U}: Create a 1/1 white Cat Bird creature token with flying.
addCard(Zone.BATTLEFIELD, playerA, "Skycat Sovereign"); // Creature {W}{U} (1/1)
// Flying, vigilance
addCard(Zone.BATTLEFIELD, playerA, "Abbey Griffin", 2); // Creature Griffin (2/2)
// Creatures you control have flying.
// Creatures your opponents control lose flying and can't have or gain flying.
addCard(Zone.BATTLEFIELD, playerB, "Archetype of Imagination"); //
setStopAt(1, PhaseStep.PRECOMBAT_MAIN);
execute();
assertAllCommandsUsed();
assertPowerToughness(playerA, "Skycat Sovereign", 1, 1);
}
@Test
public void test_BoostFromToken() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, "Plains");
addCard(Zone.BATTLEFIELD, playerA, "Island", 3);
// Flying
// Skycat Sovereign gets +1/+1 for each other creature you control with flying.
// {2}{W}{U}: Create a 1/1 white Cat Bird creature token with flying.
addCard(Zone.BATTLEFIELD, playerA, "Skycat Sovereign"); // Creature {W}{U} (1/1)
// Flying, vigilance
addCard(Zone.BATTLEFIELD, playerA, "Abbey Griffin", 2); // Creature Griffin (2/2)
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{2}{W}{U}: Create");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertPermanentCount(playerA, "Cat Bird", 1);
assertColor(playerA, "Cat Bird", ObjectColor.WHITE, true);
assertColor(playerA, "Cat Bird", ObjectColor.BLUE, false);
assertAbility(playerA, "Cat Bird", FlyingAbility.getInstance(), true);
assertPowerToughness(playerA, "Skycat Sovereign", 4, 4);
}
package org.mage.test.cards.single.iko;
import mage.ObjectColor;
import mage.abilities.keyword.FlyingAbility;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class SkycatSovereignTest extends CardTestPlayerBase {
@Test
public void test_BoostFromFlyers() {
setStrictChooseMode(true);
// Flying
// Skycat Sovereign gets +1/+1 for each other creature you control with flying.
// {2}{W}{U}: Create a 1/1 white Cat Bird creature token with flying.
addCard(Zone.BATTLEFIELD, playerA, "Skycat Sovereign"); // Creature {W}{U} (1/1)
// Flying, vigilance
addCard(Zone.BATTLEFIELD, playerA, "Abbey Griffin", 2); // Creature Griffin (2/2)
setStopAt(1, PhaseStep.PRECOMBAT_MAIN);
execute();
assertAllCommandsUsed();
assertPowerToughness(playerA, "Skycat Sovereign", 3, 3);
}
/**
* Skycat Sovereign still gets +1/+1 for each creature that is supposed to have flying when there's an opposing Archetype of Imagination.
*/
@Test
public void test_NoBoostIfFlyingLost() {
setStrictChooseMode(true);
// Flying
// Skycat Sovereign gets +1/+1 for each other creature you control with flying.
// {2}{W}{U}: Create a 1/1 white Cat Bird creature token with flying.
addCard(Zone.BATTLEFIELD, playerA, "Skycat Sovereign"); // Creature {W}{U} (1/1)
// Flying, vigilance
addCard(Zone.BATTLEFIELD, playerA, "Abbey Griffin", 2); // Creature Griffin (2/2)
// Creatures you control have flying.
// Creatures your opponents control lose flying and can't have or gain flying.
addCard(Zone.BATTLEFIELD, playerB, "Archetype of Imagination"); //
setStopAt(1, PhaseStep.PRECOMBAT_MAIN);
execute();
assertAllCommandsUsed();
assertPowerToughness(playerA, "Skycat Sovereign", 1, 1);
}
@Test
public void test_BoostFromToken() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, "Plains");
addCard(Zone.BATTLEFIELD, playerA, "Island", 3);
// Flying
// Skycat Sovereign gets +1/+1 for each other creature you control with flying.
// {2}{W}{U}: Create a 1/1 white Cat Bird creature token with flying.
addCard(Zone.BATTLEFIELD, playerA, "Skycat Sovereign"); // Creature {W}{U} (1/1)
// Flying, vigilance
addCard(Zone.BATTLEFIELD, playerA, "Abbey Griffin", 2); // Creature Griffin (2/2)
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{2}{W}{U}: Create");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertPermanentCount(playerA, "Cat Bird", 1);
assertColor(playerA, "Cat Bird", ObjectColor.WHITE, true);
assertColor(playerA, "Cat Bird", ObjectColor.BLUE, false);
assertAbility(playerA, "Cat Bird", FlyingAbility.getInstance(), true);
assertPowerToughness(playerA, "Skycat Sovereign", 4, 4);
}
}

View file

@ -1,39 +1,39 @@
package org.mage.test.cards.single.mh1;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class PlagueEngineerTest extends CardTestPlayerBase {
@Test
public void test_Standard() {
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 3);
// Deathtouch
// As Plague Engineer enters the battlefield, choose a creature type.
// Creatures of the chosen type your opponents control get -1/-1.
addCard(Zone.HAND, playerA, "Plague Engineer"); // Creature {2}{B} (2/2)
addCard(Zone.BATTLEFIELD, playerA, "Defiant Elf", 2); //Creature - Elf (1/1)
addCard(Zone.BATTLEFIELD, playerB, "Defiant Elf", 2); //Creature - Elf (1/1)
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Plague Engineer");
setChoice(playerA, "Elf");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertPermanentCount(playerA, "Plague Engineer", 1);
assertPermanentCount(playerA, "Defiant Elf", 2);
assertGraveyardCount(playerB, "Defiant Elf", 2);
assertLife(playerA, 20);
assertLife(playerB, 20);
}
package org.mage.test.cards.single.mh1;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class PlagueEngineerTest extends CardTestPlayerBase {
@Test
public void test_Standard() {
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 3);
// Deathtouch
// As Plague Engineer enters the battlefield, choose a creature type.
// Creatures of the chosen type your opponents control get -1/-1.
addCard(Zone.HAND, playerA, "Plague Engineer"); // Creature {2}{B} (2/2)
addCard(Zone.BATTLEFIELD, playerA, "Defiant Elf", 2); //Creature - Elf (1/1)
addCard(Zone.BATTLEFIELD, playerB, "Defiant Elf", 2); //Creature - Elf (1/1)
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Plague Engineer");
setChoice(playerA, "Elf");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertPermanentCount(playerA, "Plague Engineer", 1);
assertPermanentCount(playerA, "Defiant Elf", 2);
assertGraveyardCount(playerB, "Defiant Elf", 2);
assertLife(playerA, 20);
assertLife(playerB, 20);
}
}

View file

@ -1,51 +1,51 @@
package org.mage.test.cards.single.som;
import mage.abilities.keyword.IntimidateAbility;
import mage.constants.CardType;
import mage.constants.PhaseStep;
import mage.constants.SubType;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class NimDeathmantleTest extends CardTestPlayerBase {
@Test
public void test_Basic() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion");
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 6);
// Equipped creature gets +2/+2, has intimidate, and is a black Zombie.
// Whenever a nontoken creature is put into your graveyard from the battlefield, you may pay {4}. If you do, return that card to the battlefield and attach Nim Deathmantle to it.
addCard(Zone.HAND, playerA, "Nim Deathmantle"); // Artifact Equipment {2}
addCard(Zone.BATTLEFIELD, playerB, "Mountain");
addCard(Zone.HAND, playerB, "Lightning Bolt");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Nim Deathmantle");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Lightning Bolt", "Silvercoat Lion");
setChoice(playerA, true); // Message: Nim Deathmantle - Pay {4}?
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertGraveyardCount(playerB, "Lightning Bolt",1);
assertPermanentCount(playerA, "Nim Deathmantle", 1);
assertPowerToughness(playerA, "Silvercoat Lion", 4, 4);
assertAbility(playerA, "Silvercoat Lion", IntimidateAbility.getInstance(), true);
assertType("Silvercoat Lion", CardType.CREATURE, SubType.ZOMBIE);
}
package org.mage.test.cards.single.som;
import mage.abilities.keyword.IntimidateAbility;
import mage.constants.CardType;
import mage.constants.PhaseStep;
import mage.constants.SubType;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class NimDeathmantleTest extends CardTestPlayerBase {
@Test
public void test_Basic() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion");
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 6);
// Equipped creature gets +2/+2, has intimidate, and is a black Zombie.
// Whenever a nontoken creature is put into your graveyard from the battlefield, you may pay {4}. If you do, return that card to the battlefield and attach Nim Deathmantle to it.
addCard(Zone.HAND, playerA, "Nim Deathmantle"); // Artifact Equipment {2}
addCard(Zone.BATTLEFIELD, playerB, "Mountain");
addCard(Zone.HAND, playerB, "Lightning Bolt");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Nim Deathmantle");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Lightning Bolt", "Silvercoat Lion");
setChoice(playerA, true); // Message: Nim Deathmantle - Pay {4}?
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertGraveyardCount(playerB, "Lightning Bolt",1);
assertPermanentCount(playerA, "Nim Deathmantle", 1);
assertPowerToughness(playerA, "Silvercoat Lion", 4, 4);
assertAbility(playerA, "Silvercoat Lion", IntimidateAbility.getInstance(), true);
assertType("Silvercoat Lion", CardType.CREATURE, SubType.ZOMBIE);
}
}

View file

@ -1,103 +1,103 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.mage.test.cards.triggers;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author jeffwadsworth
*/
public class KardurDoomscourgeAndKithkinMourncallerTest extends CardTestPlayerBase {
@Test
public void testKDRemovedFromCombatViaRegenerateAbility() {
setStrictChooseMode(true);
// Kardur, Doomscourge: if an attacking creature dies, each opponent loses 1 life and you gain 1 life
addCard(Zone.BATTLEFIELD, playerA, "Kardur, Doomscourge");
addCard(Zone.BATTLEFIELD, playerA, "Elvish Archers");
addCard(Zone.BATTLEFIELD, playerB, "Serra Angel");
addCard(Zone.HAND, playerA, "Regenerate");
addCard(Zone.HAND, playerA, "Terror");
addCard(Zone.BATTLEFIELD, playerA, "Forest", 4);
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 4);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Regenerate", "Elvish Archers");
attack(1, playerA, "Elvish Archers");
block(1, playerB, "Serra Angel", "Elvish Archers"); // regeneration shield used up and EA is removed from combat
castSpell(1, PhaseStep.END_COMBAT, playerA, "Terror", "Elvish Archers"); // still within the combat phase, the EA is destroyed/dies
setStopAt(1, PhaseStep.POSTCOMBAT_MAIN);
execute();
assertAllCommandsUsed();
assertGraveyardCount(playerA, "Elvish Archers", 1);
// does not fire due to the Elvish Archers not in an attacking state
assertLife(playerA, 20);
assertLife(playerB, 20);
}
@Test
public void testSuccessfulKDTrigger() {
setStrictChooseMode(true);
// Kardur, Doomscourge: if an attacking creature dies, each opponent loses 1 life and you gain 1 life
addCard(Zone.BATTLEFIELD, playerA, "Kardur, Doomscourge");
addCard(Zone.BATTLEFIELD, playerA, "Elvish Archers"); // 2/2 first strike
addCard(Zone.BATTLEFIELD, playerB, "Serra Angel"); // 4/4 vigilance
attack(1, playerA, "Elvish Archers");
block(1, playerB, "Serra Angel", "Elvish Archers"); // Elvish Archer dies causing KD to trigger
setStopAt(1, PhaseStep.POSTCOMBAT_MAIN);
execute();
assertAllCommandsUsed();
assertGraveyardCount(playerA, "Elvish Archers", 1);
// successful fire so playerA gains 1 life and playerB loses 1 life
assertLife(playerA, 21);
assertLife(playerB, 19);
}
@Test
public void testKMTrigger() {
setStrictChooseMode(true);
// Kithkin Mourncaller: if an elf or kithkin dies, you may draw a card
addCard(Zone.BATTLEFIELD, playerA, "Kithkin Mourncaller");
addCard(Zone.BATTLEFIELD, playerA, "Elvish Archers"); // 2/1 first strike
addCard(Zone.BATTLEFIELD, playerA, "Pearled Unicorn"); // 2/2
addCard(Zone.BATTLEFIELD, playerB, "Serra Angel"); // 4/4 vigilance
addCard(Zone.BATTLEFIELD, playerB, "Runeclaw Bear"); // 2/2
addCard(Zone.LIBRARY, playerA, "Island", 2); // used for draw trigger
attack(1, playerA, "Elvish Archers");
attack(1, playerA, "Pearled Unicorn");
block(1, playerB, "Serra Angel", "Elvish Archers"); // Elvish Achers will die and trigger KM
block(1, playerB, "Runeclaw Bear", "Pearled Unicorn"); // Pearled Unicorn will die but not trigger KM
setChoice(playerA, "Yes"); // accept the drawing of a card from the single trigger (Elvish Archers "elf type")
setStopAt(1, PhaseStep.POSTCOMBAT_MAIN);
execute();
assertAllCommandsUsed();
assertGraveyardCount(playerA, "Elvish Archers", 1);
assertGraveyardCount(playerA, "Pearled Unicorn", 1);
// successful fire due to dead Elvish Archers (elf) so playerA draws a card
assertHandCount(playerA, 1);
}
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.mage.test.cards.triggers;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author jeffwadsworth
*/
public class KardurDoomscourgeAndKithkinMourncallerTest extends CardTestPlayerBase {
@Test
public void testKDRemovedFromCombatViaRegenerateAbility() {
setStrictChooseMode(true);
// Kardur, Doomscourge: if an attacking creature dies, each opponent loses 1 life and you gain 1 life
addCard(Zone.BATTLEFIELD, playerA, "Kardur, Doomscourge");
addCard(Zone.BATTLEFIELD, playerA, "Elvish Archers");
addCard(Zone.BATTLEFIELD, playerB, "Serra Angel");
addCard(Zone.HAND, playerA, "Regenerate");
addCard(Zone.HAND, playerA, "Terror");
addCard(Zone.BATTLEFIELD, playerA, "Forest", 4);
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 4);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Regenerate", "Elvish Archers");
attack(1, playerA, "Elvish Archers");
block(1, playerB, "Serra Angel", "Elvish Archers"); // regeneration shield used up and EA is removed from combat
castSpell(1, PhaseStep.END_COMBAT, playerA, "Terror", "Elvish Archers"); // still within the combat phase, the EA is destroyed/dies
setStopAt(1, PhaseStep.POSTCOMBAT_MAIN);
execute();
assertAllCommandsUsed();
assertGraveyardCount(playerA, "Elvish Archers", 1);
// does not fire due to the Elvish Archers not in an attacking state
assertLife(playerA, 20);
assertLife(playerB, 20);
}
@Test
public void testSuccessfulKDTrigger() {
setStrictChooseMode(true);
// Kardur, Doomscourge: if an attacking creature dies, each opponent loses 1 life and you gain 1 life
addCard(Zone.BATTLEFIELD, playerA, "Kardur, Doomscourge");
addCard(Zone.BATTLEFIELD, playerA, "Elvish Archers"); // 2/2 first strike
addCard(Zone.BATTLEFIELD, playerB, "Serra Angel"); // 4/4 vigilance
attack(1, playerA, "Elvish Archers");
block(1, playerB, "Serra Angel", "Elvish Archers"); // Elvish Archer dies causing KD to trigger
setStopAt(1, PhaseStep.POSTCOMBAT_MAIN);
execute();
assertAllCommandsUsed();
assertGraveyardCount(playerA, "Elvish Archers", 1);
// successful fire so playerA gains 1 life and playerB loses 1 life
assertLife(playerA, 21);
assertLife(playerB, 19);
}
@Test
public void testKMTrigger() {
setStrictChooseMode(true);
// Kithkin Mourncaller: if an elf or kithkin dies, you may draw a card
addCard(Zone.BATTLEFIELD, playerA, "Kithkin Mourncaller");
addCard(Zone.BATTLEFIELD, playerA, "Elvish Archers"); // 2/1 first strike
addCard(Zone.BATTLEFIELD, playerA, "Pearled Unicorn"); // 2/2
addCard(Zone.BATTLEFIELD, playerB, "Serra Angel"); // 4/4 vigilance
addCard(Zone.BATTLEFIELD, playerB, "Runeclaw Bear"); // 2/2
addCard(Zone.LIBRARY, playerA, "Island", 2); // used for draw trigger
attack(1, playerA, "Elvish Archers");
attack(1, playerA, "Pearled Unicorn");
block(1, playerB, "Serra Angel", "Elvish Archers"); // Elvish Achers will die and trigger KM
block(1, playerB, "Runeclaw Bear", "Pearled Unicorn"); // Pearled Unicorn will die but not trigger KM
setChoice(playerA, "Yes"); // accept the drawing of a card from the single trigger (Elvish Archers "elf type")
setStopAt(1, PhaseStep.POSTCOMBAT_MAIN);
execute();
assertAllCommandsUsed();
assertGraveyardCount(playerA, "Elvish Archers", 1);
assertGraveyardCount(playerA, "Pearled Unicorn", 1);
// successful fire due to dead Elvish Archers (elf) so playerA draws a card
assertHandCount(playerA, 1);
}
}

View file

@ -1,68 +1,68 @@
package org.mage.test.cards.triggers.dies;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class AshenRiderTest extends CardTestPlayerBase {
/*
* Volrath, the Shapestealer and Ashen Rider, Ashen Rider has a counter on it:
Turn Volrath into Ashen Rider:
Destroy the Volrath (who's the Ashen Rider) with Putrefy:
The death trigger for the Volrath copying Ashen Rider did not trigger.
*/
@Test
public void cartelAristrocraftInteractionOpponentDoesNotPayLife() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1);
addCard(Zone.BATTLEFIELD, playerA, "Forest", 2);
addCard(Zone.BATTLEFIELD, playerA, "Island", 2);
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 3);
// Flying
// When Ashen Rider enters the battlefield or dies, exile target permanent.
addCard(Zone.BATTLEFIELD, playerA, "Ashen Rider"); // Creature {4}{W}{W}{B}{B}
// At the beginning of combat on your turn, put a -1/-1 counter on up to one target creature.
// {1}: Until your next turn, Volrath, the Shapestealer becomes a copy of target creature with a counter on it, except it's 7/5 and it has this ability.
addCard(Zone.HAND, playerA, "Volrath, the Shapestealer"); // Creature {2}{B}{G}{U}
addTarget(playerA, "Ashen Rider");
// Destroy target artifact or creature. It can't be regenerated.
addCard(Zone.HAND, playerA, "Putrefy"); // Instant {1}{B}{G}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Volrath, the Shapestealer");
activateAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "{1}: Until your next turn");
addTarget(playerA, "Ashen Rider");
waitStackResolved(3, PhaseStep.PRECOMBAT_MAIN);
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Putrefy", "Ashen Rider[only copy]");
addTarget(playerA, "Silvercoat Lion"); // Dies trigger of Volrath, the Shapestealer copied from Ashen Rider
setStopAt(3, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertPowerToughness(playerA, "Ashen Rider", 4,4);
assertGraveyardCount(playerA, "Putrefy", 1);
assertGraveyardCount(playerA, "Volrath, the Shapestealer", 1);
assertExileCount(playerB, "Silvercoat Lion", 1);
}
}
package org.mage.test.cards.triggers.dies;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class AshenRiderTest extends CardTestPlayerBase {
/*
* Volrath, the Shapestealer and Ashen Rider, Ashen Rider has a counter on it:
Turn Volrath into Ashen Rider:
Destroy the Volrath (who's the Ashen Rider) with Putrefy:
The death trigger for the Volrath copying Ashen Rider did not trigger.
*/
@Test
public void cartelAristrocraftInteractionOpponentDoesNotPayLife() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1);
addCard(Zone.BATTLEFIELD, playerA, "Forest", 2);
addCard(Zone.BATTLEFIELD, playerA, "Island", 2);
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 3);
// Flying
// When Ashen Rider enters the battlefield or dies, exile target permanent.
addCard(Zone.BATTLEFIELD, playerA, "Ashen Rider"); // Creature {4}{W}{W}{B}{B}
// At the beginning of combat on your turn, put a -1/-1 counter on up to one target creature.
// {1}: Until your next turn, Volrath, the Shapestealer becomes a copy of target creature with a counter on it, except it's 7/5 and it has this ability.
addCard(Zone.HAND, playerA, "Volrath, the Shapestealer"); // Creature {2}{B}{G}{U}
addTarget(playerA, "Ashen Rider");
// Destroy target artifact or creature. It can't be regenerated.
addCard(Zone.HAND, playerA, "Putrefy"); // Instant {1}{B}{G}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Volrath, the Shapestealer");
activateAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "{1}: Until your next turn");
addTarget(playerA, "Ashen Rider");
waitStackResolved(3, PhaseStep.PRECOMBAT_MAIN);
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Putrefy", "Ashen Rider[only copy]");
addTarget(playerA, "Silvercoat Lion"); // Dies trigger of Volrath, the Shapestealer copied from Ashen Rider
setStopAt(3, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertPowerToughness(playerA, "Ashen Rider", 4,4);
assertGraveyardCount(playerA, "Putrefy", 1);
assertGraveyardCount(playerA, "Volrath, the Shapestealer", 1);
assertExileCount(playerB, "Silvercoat Lion", 1);
}
}

View file

@ -1,122 +1,122 @@
package org.mage.test.commander.duel;
import java.io.FileNotFoundException;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.GameException;
import mage.game.permanent.Permanent;
import org.junit.Assert;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestCommanderDuelBase;
/**
*
* @author LevelX2
*/
public class CommanderColorChangeTest extends CardTestCommanderDuelBase {
@Override
protected Game createNewGameAndPlayers() throws GameException, FileNotFoundException {
// When a player casts a spell or a creature attacks, exile Norin the Wary. Return it to the battlefield under its owner's control at the beginning of the next end step.
setDecknamePlayerA("CMDNorinTheWary.dck"); // Commander = Norin the Wary {R}
return super.createNewGameAndPlayers();
}
@Test
public void castCommanderWithAddedBlueColor() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3);
// As Painter's Servant enters the battlefield, choose a color.
// All cards that aren't on the battlefield, spells, and permanents are the chosen color in addition to their other colors.
addCard(Zone.HAND, playerA, "Painter's Servant", 1); // Artifact Creature {2}
// Whenever a player casts a blue spell, you may gain 1 life.
addCard(Zone.BATTLEFIELD, playerA, "Kraken's Eye", 1);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Painter's Servant");
setChoice(playerA, "Blue");
// When a player casts a spell or a creature attacks, exile Norin the Wary.
// Return it to the battlefield under its owner's control at the beginning of the next end step.
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Norin the Wary");
setChoice(playerA, true); // Whenever a player casts a blue spell, you may gain 1 life. Choices: Yes - No
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertPermanentCount(playerA, "Norin the Wary", 1);
Permanent norin = getPermanent("Norin the Wary", playerA);
Assert.assertEquals(true, norin.getColor(currentGame).isBlue());
Assert.assertEquals(true, norin.getColor(currentGame).isRed());
Permanent kraken = getPermanent("Kraken's Eye", playerA);
Assert.assertEquals(true, kraken.getColor(currentGame).isBlue());
assertLife(playerA, 41);
assertLife(playerB, 40);
}
/**
* I played a Painter's Servant, named black, but the other commanders get a extra colors
* Later it got removed but the commanders and some cards still have the extra color
* I played it again later, named green, and the previously affected cards get the extra color
* so now they have 2 extra colors and the commander get and additional color on top of that
* And finally I got the empty hand error #6738 on my turn for what I assume is the Painter's Servant + Grindstone combo I have,
* but nonetheless manage to tie the game so it go into a second game and the issue carry over,
* all the commanders have all the extra colors they gain from the first game
*/
@Test
public void castCommanderWithoutAddedBlueColor() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3);
// As Painter's Servant enters the battlefield, choose a color.
// All cards that aren't on the battlefield, spells, and permanents are the chosen color in addition to their other colors.
addCard(Zone.HAND, playerA, "Painter's Servant", 1); // Artifact Creature {2}
// Whenever a player casts a blue spell, you may gain 1 life.
addCard(Zone.BATTLEFIELD, playerA, "Kraken's Eye", 1);
// Exile target artifact or enchantment.
addCard(Zone.HAND, playerB, "Altar's Light", 1); // Instant {2}{W}{W}
addCard(Zone.BATTLEFIELD, playerB, "Plains", 4);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Painter's Servant");
setChoice(playerA, "Blue");
// When a player casts a spell or a creature attacks, exile Norin the Wary.
// Return it to the battlefield under its owner's control at the beginning of the next end step.
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Norin the Wary");
setChoice(playerA, true); // Whenever a player casts a blue spell, you may gain 1 life. Choices: Yes - No
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Altar's Light", "Painter's Servant", "Norin the Wary");
setChoice(playerA, true); // Whenever a player casts a blue spell, you may gain 1 life. Choices: Yes - No
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertPermanentCount(playerA, "Norin the Wary", 1);
assertAllCommandsUsed();
Permanent norin = getPermanent("Norin the Wary", playerA);
Assert.assertEquals(false, norin.getColor(currentGame).isBlue());
Assert.assertEquals(true, norin.getColor(currentGame).isRed());
Permanent kraken = getPermanent("Kraken's Eye", playerA);
Assert.assertEquals(false, kraken.getColor(currentGame).isBlue());
assertLife(playerA, 42);
assertLife(playerB, 40);
}
}
package org.mage.test.commander.duel;
import java.io.FileNotFoundException;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.GameException;
import mage.game.permanent.Permanent;
import org.junit.Assert;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestCommanderDuelBase;
/**
*
* @author LevelX2
*/
public class CommanderColorChangeTest extends CardTestCommanderDuelBase {
@Override
protected Game createNewGameAndPlayers() throws GameException, FileNotFoundException {
// When a player casts a spell or a creature attacks, exile Norin the Wary. Return it to the battlefield under its owner's control at the beginning of the next end step.
setDecknamePlayerA("CMDNorinTheWary.dck"); // Commander = Norin the Wary {R}
return super.createNewGameAndPlayers();
}
@Test
public void castCommanderWithAddedBlueColor() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3);
// As Painter's Servant enters the battlefield, choose a color.
// All cards that aren't on the battlefield, spells, and permanents are the chosen color in addition to their other colors.
addCard(Zone.HAND, playerA, "Painter's Servant", 1); // Artifact Creature {2}
// Whenever a player casts a blue spell, you may gain 1 life.
addCard(Zone.BATTLEFIELD, playerA, "Kraken's Eye", 1);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Painter's Servant");
setChoice(playerA, "Blue");
// When a player casts a spell or a creature attacks, exile Norin the Wary.
// Return it to the battlefield under its owner's control at the beginning of the next end step.
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Norin the Wary");
setChoice(playerA, true); // Whenever a player casts a blue spell, you may gain 1 life. Choices: Yes - No
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertPermanentCount(playerA, "Norin the Wary", 1);
Permanent norin = getPermanent("Norin the Wary", playerA);
Assert.assertEquals(true, norin.getColor(currentGame).isBlue());
Assert.assertEquals(true, norin.getColor(currentGame).isRed());
Permanent kraken = getPermanent("Kraken's Eye", playerA);
Assert.assertEquals(true, kraken.getColor(currentGame).isBlue());
assertLife(playerA, 41);
assertLife(playerB, 40);
}
/**
* I played a Painter's Servant, named black, but the other commanders get a extra colors
* Later it got removed but the commanders and some cards still have the extra color
* I played it again later, named green, and the previously affected cards get the extra color
* so now they have 2 extra colors and the commander get and additional color on top of that
* And finally I got the empty hand error #6738 on my turn for what I assume is the Painter's Servant + Grindstone combo I have,
* but nonetheless manage to tie the game so it go into a second game and the issue carry over,
* all the commanders have all the extra colors they gain from the first game
*/
@Test
public void castCommanderWithoutAddedBlueColor() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3);
// As Painter's Servant enters the battlefield, choose a color.
// All cards that aren't on the battlefield, spells, and permanents are the chosen color in addition to their other colors.
addCard(Zone.HAND, playerA, "Painter's Servant", 1); // Artifact Creature {2}
// Whenever a player casts a blue spell, you may gain 1 life.
addCard(Zone.BATTLEFIELD, playerA, "Kraken's Eye", 1);
// Exile target artifact or enchantment.
addCard(Zone.HAND, playerB, "Altar's Light", 1); // Instant {2}{W}{W}
addCard(Zone.BATTLEFIELD, playerB, "Plains", 4);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Painter's Servant");
setChoice(playerA, "Blue");
// When a player casts a spell or a creature attacks, exile Norin the Wary.
// Return it to the battlefield under its owner's control at the beginning of the next end step.
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Norin the Wary");
setChoice(playerA, true); // Whenever a player casts a blue spell, you may gain 1 life. Choices: Yes - No
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Altar's Light", "Painter's Servant", "Norin the Wary");
setChoice(playerA, true); // Whenever a player casts a blue spell, you may gain 1 life. Choices: Yes - No
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertPermanentCount(playerA, "Norin the Wary", 1);
assertAllCommandsUsed();
Permanent norin = getPermanent("Norin the Wary", playerA);
Assert.assertEquals(false, norin.getColor(currentGame).isBlue());
Assert.assertEquals(true, norin.getColor(currentGame).isRed());
Permanent kraken = getPermanent("Kraken's Eye", playerA);
Assert.assertEquals(false, kraken.getColor(currentGame).isBlue());
assertLife(playerA, 42);
assertLife(playerB, 40);
}
}

View file

@ -1,28 +1,28 @@
package mage;
import mage.abilities.Ability;
import mage.game.Game;
/**
*
* @author LevelX2
*/
public class ApprovingObject {
private final Ability approvingAbility;
private final MageObjectReference approvingMageObjectReference;
public ApprovingObject(Ability source, Game game) {
this.approvingAbility = source;
this.approvingMageObjectReference = new MageObjectReference(source.getSourceId(), game);
}
public Ability getApprovingAbility() {
return approvingAbility;
}
public MageObjectReference getApprovingMageObjectReference() {
return approvingMageObjectReference;
}
}
package mage;
import mage.abilities.Ability;
import mage.game.Game;
/**
*
* @author LevelX2
*/
public class ApprovingObject {
private final Ability approvingAbility;
private final MageObjectReference approvingMageObjectReference;
public ApprovingObject(Ability source, Game game) {
this.approvingAbility = source;
this.approvingMageObjectReference = new MageObjectReference(source.getSourceId(), game);
}
public Ability getApprovingAbility() {
return approvingAbility;
}
public MageObjectReference getApprovingMageObjectReference() {
return approvingMageObjectReference;
}
}

View file

@ -1,124 +1,124 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package mage.abilities.common;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.effects.Effect;
import mage.constants.Zone;
import mage.filter.FilterPermanent;
import mage.game.Game;
import mage.game.events.GameEvent;
import static mage.game.events.GameEvent.EventType.END_COMBAT_STEP_POST;
import static mage.game.events.GameEvent.EventType.REMOVED_FROM_COMBAT;
import static mage.game.events.GameEvent.EventType.ZONE_CHANGE;
import mage.game.events.ZoneChangeEvent;
import mage.game.permanent.Permanent;
/**
*
* @author weirddan455 and jeffwadsworth
*/
public class AttackingCreaturePutIntoGraveyardTriggeredAbility extends TriggeredAbilityImpl {
protected FilterPermanent filterPermanent;
private final boolean onlyToControllerGraveyard;
private final boolean itDies;
public AttackingCreaturePutIntoGraveyardTriggeredAbility(Effect effect, FilterPermanent filterPermanent, Boolean onlyToControllerGraveyard, Boolean itDies, Boolean optional) {
super(Zone.BATTLEFIELD, effect, optional);
this.filterPermanent = filterPermanent;
this.onlyToControllerGraveyard = onlyToControllerGraveyard;
this.itDies = itDies;
}
private AttackingCreaturePutIntoGraveyardTriggeredAbility(final AttackingCreaturePutIntoGraveyardTriggeredAbility ability) {
super(ability);
this.filterPermanent = ability.filterPermanent;
this.onlyToControllerGraveyard = ability.onlyToControllerGraveyard;
this.itDies = ability.itDies;
}
@Override
public AttackingCreaturePutIntoGraveyardTriggeredAbility copy() {
return new AttackingCreaturePutIntoGraveyardTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
switch (event.getType()) {
case ATTACKER_DECLARED:
case END_COMBAT_STEP_POST:
case ZONE_CHANGE:
case REMOVED_FROM_COMBAT:
return true;
default:
return false;
}
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
switch (event.getType()) {
case ATTACKER_DECLARED:
Permanent permanent = game.getPermanent(event.getSourceId());
if (permanent != null
&& !filterPermanent.match(permanent, game)) {
return false;
}
List<UUID> attackersList = new ArrayList<>();
List<UUID> attackersListCopy = (List<UUID>) game.getState().getValue(this.getSourceId() + "Attackers");
if (attackersListCopy == null) {
attackersListCopy = attackersList;
}
attackersListCopy.add(event.getSourceId()); // add the filtered creature to the list
game.getState().setValue(this.getSourceId() + "Attackers", attackersListCopy);
return false;
case END_COMBAT_STEP_POST:
game.getState().setValue(this.getSourceId() + "Attackers", null);
return false;
case ZONE_CHANGE:
ZoneChangeEvent zEvent = (ZoneChangeEvent) event;
if (zEvent.getFromZone() == Zone.BATTLEFIELD
&& zEvent.getToZone() == Zone.GRAVEYARD) {
if (onlyToControllerGraveyard
&& !this.isControlledBy(game.getOwnerId(zEvent.getTargetId()))) {
return false;
}
if (itDies
&& !zEvent.isDiesEvent()) {
return false;
}
List<UUID> attackers = (List<UUID>) game.getState().getValue(this.getSourceId() + "Attackers");
return attackers != null
&& attackers.contains(zEvent.getTargetId());
}
case REMOVED_FROM_COMBAT:
// a card removed from combat is no longer an attacker or blocker so remove it from the list
List<UUID> attackersListRFC = (List<UUID>) game.getState().getValue(this.getSourceId() + "Attackers");
if (attackersListRFC != null
&& attackersListRFC.contains(event.getTargetId())) {
attackersListRFC.remove(event.getTargetId());
game.getState().setValue(this.getSourceId() + "Attackers", attackersListRFC);
}
default:
return false;
}
}
@Override
public String getTriggerPhrase() {
if (itDies) {
return "Whenever " + filterPermanent.getMessage() + " dies, ";
}
return "Whenever " + filterPermanent.getMessage() + " is put into " + (onlyToControllerGraveyard ? "your" : "a")
+ " graveyard from the battlefield, ";
}
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package mage.abilities.common;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.effects.Effect;
import mage.constants.Zone;
import mage.filter.FilterPermanent;
import mage.game.Game;
import mage.game.events.GameEvent;
import static mage.game.events.GameEvent.EventType.END_COMBAT_STEP_POST;
import static mage.game.events.GameEvent.EventType.REMOVED_FROM_COMBAT;
import static mage.game.events.GameEvent.EventType.ZONE_CHANGE;
import mage.game.events.ZoneChangeEvent;
import mage.game.permanent.Permanent;
/**
*
* @author weirddan455 and jeffwadsworth
*/
public class AttackingCreaturePutIntoGraveyardTriggeredAbility extends TriggeredAbilityImpl {
protected FilterPermanent filterPermanent;
private final boolean onlyToControllerGraveyard;
private final boolean itDies;
public AttackingCreaturePutIntoGraveyardTriggeredAbility(Effect effect, FilterPermanent filterPermanent, Boolean onlyToControllerGraveyard, Boolean itDies, Boolean optional) {
super(Zone.BATTLEFIELD, effect, optional);
this.filterPermanent = filterPermanent;
this.onlyToControllerGraveyard = onlyToControllerGraveyard;
this.itDies = itDies;
}
private AttackingCreaturePutIntoGraveyardTriggeredAbility(final AttackingCreaturePutIntoGraveyardTriggeredAbility ability) {
super(ability);
this.filterPermanent = ability.filterPermanent;
this.onlyToControllerGraveyard = ability.onlyToControllerGraveyard;
this.itDies = ability.itDies;
}
@Override
public AttackingCreaturePutIntoGraveyardTriggeredAbility copy() {
return new AttackingCreaturePutIntoGraveyardTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
switch (event.getType()) {
case ATTACKER_DECLARED:
case END_COMBAT_STEP_POST:
case ZONE_CHANGE:
case REMOVED_FROM_COMBAT:
return true;
default:
return false;
}
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
switch (event.getType()) {
case ATTACKER_DECLARED:
Permanent permanent = game.getPermanent(event.getSourceId());
if (permanent != null
&& !filterPermanent.match(permanent, game)) {
return false;
}
List<UUID> attackersList = new ArrayList<>();
List<UUID> attackersListCopy = (List<UUID>) game.getState().getValue(this.getSourceId() + "Attackers");
if (attackersListCopy == null) {
attackersListCopy = attackersList;
}
attackersListCopy.add(event.getSourceId()); // add the filtered creature to the list
game.getState().setValue(this.getSourceId() + "Attackers", attackersListCopy);
return false;
case END_COMBAT_STEP_POST:
game.getState().setValue(this.getSourceId() + "Attackers", null);
return false;
case ZONE_CHANGE:
ZoneChangeEvent zEvent = (ZoneChangeEvent) event;
if (zEvent.getFromZone() == Zone.BATTLEFIELD
&& zEvent.getToZone() == Zone.GRAVEYARD) {
if (onlyToControllerGraveyard
&& !this.isControlledBy(game.getOwnerId(zEvent.getTargetId()))) {
return false;
}
if (itDies
&& !zEvent.isDiesEvent()) {
return false;
}
List<UUID> attackers = (List<UUID>) game.getState().getValue(this.getSourceId() + "Attackers");
return attackers != null
&& attackers.contains(zEvent.getTargetId());
}
case REMOVED_FROM_COMBAT:
// a card removed from combat is no longer an attacker or blocker so remove it from the list
List<UUID> attackersListRFC = (List<UUID>) game.getState().getValue(this.getSourceId() + "Attackers");
if (attackersListRFC != null
&& attackersListRFC.contains(event.getTargetId())) {
attackersListRFC.remove(event.getTargetId());
game.getState().setValue(this.getSourceId() + "Attackers", attackersListRFC);
}
default:
return false;
}
}
@Override
public String getTriggerPhrase() {
if (itDies) {
return "Whenever " + filterPermanent.getMessage() + " dies, ";
}
return "Whenever " + filterPermanent.getMessage() + " is put into " + (onlyToControllerGraveyard ? "your" : "a")
+ " graveyard from the battlefield, ";
}
}

View file

@ -1,31 +1,31 @@
package mage.abilities.condition.common;
import mage.MageObjectReference;
import mage.abilities.Ability;
import mage.abilities.condition.Condition;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.watchers.common.AttackedThisTurnWatcher;
/**
*
* @author jeffwadsworth
*/
public enum DidNotAttackThisTurnEnchantedCondition implements Condition {
instance;
@Override
public boolean apply(Game game, Ability source) {
Permanent auraPermanent = game.getPermanentOrLKIBattlefield(source.getSourceId());
if (auraPermanent != null) {
Permanent enchantedPermanent = game.getPermanent(auraPermanent.getAttachedTo());
AttackedThisTurnWatcher watcher = game.getState().getWatcher(AttackedThisTurnWatcher.class);
return enchantedPermanent != null
&& watcher != null
&& !watcher.getAttackedThisTurnCreatures().contains(
new MageObjectReference(enchantedPermanent, game));
}
return false;
}
}
package mage.abilities.condition.common;
import mage.MageObjectReference;
import mage.abilities.Ability;
import mage.abilities.condition.Condition;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.watchers.common.AttackedThisTurnWatcher;
/**
*
* @author jeffwadsworth
*/
public enum DidNotAttackThisTurnEnchantedCondition implements Condition {
instance;
@Override
public boolean apply(Game game, Ability source) {
Permanent auraPermanent = game.getPermanentOrLKIBattlefield(source.getSourceId());
if (auraPermanent != null) {
Permanent enchantedPermanent = game.getPermanent(auraPermanent.getAttachedTo());
AttackedThisTurnWatcher watcher = game.getState().getWatcher(AttackedThisTurnWatcher.class);
return enchantedPermanent != null
&& watcher != null
&& !watcher.getAttackedThisTurnCreatures().contains(
new MageObjectReference(enchantedPermanent, game));
}
return false;
}
}

View file

@ -1,48 +1,48 @@
package mage.abilities.dynamicvalue.common;
import mage.abilities.Ability;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.effects.Effect;
import mage.game.Game;
import mage.players.Player;
/**
*
* @author LevelX2
*/
public class ControllerLifeDividedValue implements DynamicValue {
private final Integer divider;
public ControllerLifeDividedValue(Integer divider) {
this.divider = divider;
}
public ControllerLifeDividedValue(final ControllerLifeDividedValue dynamicValue) {
this.divider = dynamicValue.divider;
}
@Override
public int calculate(Game game, Ability sourceAbility, Effect effect) {
Player p = game.getPlayer(sourceAbility.getControllerId());
if (p != null) {
return p.getLife() / divider;
}
return 0;
}
@Override
public ControllerLifeDividedValue copy() {
return new ControllerLifeDividedValue(this);
}
@Override
public String toString() {
return "X";
}
@Override
public String getMessage() {
return "";
}
}
package mage.abilities.dynamicvalue.common;
import mage.abilities.Ability;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.effects.Effect;
import mage.game.Game;
import mage.players.Player;
/**
*
* @author LevelX2
*/
public class ControllerLifeDividedValue implements DynamicValue {
private final Integer divider;
public ControllerLifeDividedValue(Integer divider) {
this.divider = divider;
}
public ControllerLifeDividedValue(final ControllerLifeDividedValue dynamicValue) {
this.divider = dynamicValue.divider;
}
@Override
public int calculate(Game game, Ability sourceAbility, Effect effect) {
Player p = game.getPlayer(sourceAbility.getControllerId());
if (p != null) {
return p.getLife() / divider;
}
return 0;
}
@Override
public ControllerLifeDividedValue copy() {
return new ControllerLifeDividedValue(this);
}
@Override
public String toString() {
return "X";
}
@Override
public String getMessage() {
return "";
}
}

View file

@ -1,62 +1,62 @@
package mage.abilities.dynamicvalue.common;
import mage.abilities.Ability;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.effects.Effect;
import mage.filter.FilterPermanent;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
/**
*
* @author LevelX2
*/
public class HighestCMCOfPermanentValue implements DynamicValue {
private final FilterPermanent filter;
private final boolean onlyIfCanBeSacrificed;
public HighestCMCOfPermanentValue(FilterPermanent filter, boolean onlyIfCanBeSacrificed) {
super();
this.filter = filter;
this.onlyIfCanBeSacrificed = onlyIfCanBeSacrificed;
}
public HighestCMCOfPermanentValue(final HighestCMCOfPermanentValue dynamicValue) {
this.filter = dynamicValue.filter;
this.onlyIfCanBeSacrificed = dynamicValue.onlyIfCanBeSacrificed;
}
@Override
public int calculate(Game game, Ability sourceAbility, Effect effect) {
int value = 0;
Player controller = game.getPlayer(sourceAbility.getControllerId());
if (controller != null) {
for (Permanent permanent : game.getBattlefield()
.getActivePermanents(filter, sourceAbility.getControllerId(), sourceAbility.getSourceId(), game)) {
if ((!onlyIfCanBeSacrificed || controller.canPaySacrificeCost(permanent, sourceAbility, sourceAbility.getControllerId(), game))
&& permanent.getManaValue() > value) {
value = permanent.getManaValue();
}
}
}
return value;
}
@Override
public HighestCMCOfPermanentValue copy() {
return new HighestCMCOfPermanentValue(this);
}
@Override
public String toString() {
return "X";
}
@Override
public String getMessage() {
return filter.getMessage();
}
}
package mage.abilities.dynamicvalue.common;
import mage.abilities.Ability;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.effects.Effect;
import mage.filter.FilterPermanent;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
/**
*
* @author LevelX2
*/
public class HighestCMCOfPermanentValue implements DynamicValue {
private final FilterPermanent filter;
private final boolean onlyIfCanBeSacrificed;
public HighestCMCOfPermanentValue(FilterPermanent filter, boolean onlyIfCanBeSacrificed) {
super();
this.filter = filter;
this.onlyIfCanBeSacrificed = onlyIfCanBeSacrificed;
}
public HighestCMCOfPermanentValue(final HighestCMCOfPermanentValue dynamicValue) {
this.filter = dynamicValue.filter;
this.onlyIfCanBeSacrificed = dynamicValue.onlyIfCanBeSacrificed;
}
@Override
public int calculate(Game game, Ability sourceAbility, Effect effect) {
int value = 0;
Player controller = game.getPlayer(sourceAbility.getControllerId());
if (controller != null) {
for (Permanent permanent : game.getBattlefield()
.getActivePermanents(filter, sourceAbility.getControllerId(), sourceAbility.getSourceId(), game)) {
if ((!onlyIfCanBeSacrificed || controller.canPaySacrificeCost(permanent, sourceAbility, sourceAbility.getControllerId(), game))
&& permanent.getManaValue() > value) {
value = permanent.getManaValue();
}
}
}
return value;
}
@Override
public HighestCMCOfPermanentValue copy() {
return new HighestCMCOfPermanentValue(this);
}
@Override
public String toString() {
return "X";
}
@Override
public String getMessage() {
return filter.getMessage();
}
}

File diff suppressed because it is too large Load diff