Merge branch 'master' into master

This commit is contained in:
Zzooouhh 2017-12-22 23:17:20 +01:00 committed by GitHub
commit 6fae8ef606
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
48 changed files with 1721 additions and 503 deletions

View file

@ -199,12 +199,12 @@ public enum MagicCardsImageSource implements CardImageSource {
add("E01");
add("HOU");
add("C17");
// add("XLN");
// add("DDT");
// add("IMA");
// add("E02");
// add("V17");
// add("UST");
add("XLN");
add("DDT");
add("IMA");
add("E02");
add("V17");
add("UST");
// add("RIX");
// add("A25");
// add("DOM");

View file

@ -228,11 +228,11 @@ public enum MagidexImageSource implements CardImageSource {
supportedSets.add("E01");
supportedSets.add("HOU");
supportedSets.add("C17");
// supportedSets.add("XLN");
// supportedSets.add("DDT");
// supportedSets.add("IMA");
// supportedSets.add("E02");
// supportedSets.add("V17");
supportedSets.add("XLN");
supportedSets.add("DDT");
supportedSets.add("IMA");
supportedSets.add("E02");
supportedSets.add("V17");
// supportedSets.add("UST");
// supportedSets.add("RIX");
// supportedSets.add("A25");

View file

@ -200,12 +200,14 @@ public enum ScryfallImageSource implements CardImageSource {
supportedSets.add("HOU");
supportedSets.add("C17");
supportedSets.add("XLN");
// supportedSets.add("DDT");
supportedSets.add("DDT");
supportedSets.add("IMA");
// supportedSets.add("E02");
// supportedSets.add("V17");
supportedSets.add("E02");
supportedSets.add("V17");
supportedSets.add("UST");
supportedSets.add("RIX");
supportedSets.add("WMCQ");
supportedSets.add("PPRO");
// supportedSets.add("A25");
// supportedSets.add("DOM");
// supportedSets.add("M19");
@ -283,6 +285,7 @@ public enum ScryfallImageSource implements CardImageSource {
put("DD3EVG", "evg");
put("MPS-AKH", "mp2");
put("MBP", "pmei");
put("WMCQ", "pwcq");
}
};

View file

@ -258,10 +258,10 @@ public enum WizardCardsImageSource implements CardImageSource {
supportedSets.add("HOU");
supportedSets.add("C17");
supportedSets.add("XLN");
// supportedSets.add("DDT"); // Duel Decks: Merfolk vs. Goblins
// supportedSets.add("IMA"); // Iconic Msters
// supportedSets.add("E02"); // Explorers of Ixalan
// supportedSets.add("V17"); // From the Vault: Transform
supportedSets.add("DDT"); // Duel Decks: Merfolk vs. Goblins
supportedSets.add("IMA"); // Iconic Msters
supportedSets.add("E02"); // Explorers of Ixalan
supportedSets.add("V17"); // From the Vault: Transform
// supportedSets.add("UST"); // Unstable
// supportedSets.add("RIX"); // Rivals of Ixalan
// supportedSets.add("A25"); // Masters 25

View file

@ -352,6 +352,8 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
if (cardImageSource.isTokenSource() && cardImageSource.isImageProvided(data.getSet(), data.getName())) {
numberTokenImagesAvailable++;
cardsToDownload.add(data);
}else{
//logger.warn("Source do not support token (set " + data.getSet() + ", token " + data.getName() + ")");
}
} else {
if (selectedSetCodes != null && selectedSetCodes.contains(data.getSet())) {
@ -838,7 +840,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
// download ERROR
logger.warn("Image download for " + card.getName()
+ (!card.getDownloadName().equals(card.getName()) ? " downloadname: " + card.getDownloadName() : "")
+ '(' + card.getSet() + ") failed - responseCode: " + responseCode + " url: " + url.toString()
+ " (" + card.getSet() + ") failed - responseCode: " + responseCode + " url: " + url.toString()
);
if (logger.isDebugEnabled()) {

View file

@ -501,6 +501,7 @@
|Generate|TOK:E01|Soldier|||SoldierToken|
|Generate|TOK:E01|Spirit|||SpiritWhiteToken|
|Generate|TOK:E01|Zombie|||ZombieToken|
|Generate|TOK:E02|Saproling|||SaprolingToken|
|Generate|TOK:EMA|Assembly-Worker|||AssemblyWorkerToken|
|Generate|TOK:EMA|Beast|||CarnivoreToken|
|Generate|TOK:EMA|Carnivore||
@ -1119,4 +1120,4 @@
|Generate|TOK:ZEN|Snake|||SnakeToken|
|Generate|TOK:ZEN|Vampire||
|Generate|TOK:ZEN|Wolf|||WolfToken|
|Generate|TOK:ZEN|Zombie Giant|||QuestForTheGravelordZombieToken|
|Generate|TOK:ZEN|Zombie Giant|||QuestForTheGravelordZombieToken|

View file

@ -73,6 +73,6 @@ dd3evg=ddaevg
dd3gvl=ddagvl
dd3jvc=ddajvc
# Remove setname as soon as the images can be downloaded
ignore.urls=TOK,DDT,V17,E02,M19,M25,DOM,H17
ignore.urls=TOK,M19,M25,DOM,H17
# sets ordered by release time (newest goes first)
token.lookup.order=M19,M25,DOM,E02,RIX,UST,XLN,IMA,H17,C17,V17,E01,DDT,CMA,HOU,MM3,DDS,AKH,DD3DVD,DD3EVG,DD3GVL,DD3JVC,H09,AER,PCA,C16,V16,MPS,KLD,DDR,CN2,EMN,EMA,SOI,DDQ,CP,CMA,ARENA,SUS,APAC,EURO,UGIN,C15,OGW,EXP,DDP,BFZ,DRB,V09,V10,V11,V12,V13,V14,V15,TPR,MPRP,DD3,DDO,ORI,MM2,PTC,DTK,FRF,KTK,M15,VMA,CNS,JOU,BNG,THS,DDL,M14,MMA,DGM,GTC,RTR,M13,AVR,DDI,DKA,ISD,M12,NPH,MBS,SOM,M11,ROE,DDE,WWK,ZEN,M10,GVL,ARB,DVD,CFX,JVC,ALA,EVE,SHM,EVG,MOR,LRW,10E,CLS,CHK,GRC

View file

@ -37,10 +37,10 @@ import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
import mage.abilities.keyword.TransformAbility;
import mage.cards.i.InfectiousCurse;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.i.InfectiousCurse;
import mage.constants.*;
import mage.game.Game;
import mage.game.permanent.Permanent;
@ -106,6 +106,7 @@ class AccursedWitchReturnTransformedEffect extends OneShotEffect {
//note: should check for null after game.getCard
Card card = game.getCard(source.getSourceId());
if (card != null) {
card.removeFromZone(game, Zone.GRAVEYARD, source.getSourceId());
card.putOntoBattlefield(game, Zone.BATTLEFIELD, source.getSourceId(), source.getControllerId(), false);
}
}

View file

@ -0,0 +1,112 @@
/*
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
package mage.cards.a;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.RestrictionEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SuperType;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.game.permanent.PermanentToken;
import mage.watchers.common.CastSpellYourLastTurnWatcher;
import mage.watchers.common.PermanentsEnteredBattlefieldYourLastTurnWatcher;
/**
*
* @author spjspj
*/
public class Arboria extends CardImpl {
public Arboria(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}{G}");
addSuperType(SuperType.WORLD);
// Creatures can't attack a player unless that player cast a spell or put a nontoken permanent onto the battlefield during his or her last turn.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ArboriaEffect()), new PermanentsEnteredBattlefieldYourLastTurnWatcher());
}
public Arboria(final Arboria card) {
super(card);
}
@Override
public Arboria copy() {
return new Arboria(this);
}
}
class ArboriaEffect extends RestrictionEffect {
public ArboriaEffect() {
super(Duration.WhileOnBattlefield);
staticText = "Creatures can't attack a player unless that player cast a spell or put a nontoken permanent onto the battlefield during his or her last turn";
}
public ArboriaEffect(final ArboriaEffect effect) {
super(effect);
}
@Override
public ArboriaEffect copy() {
return new ArboriaEffect(this);
}
@Override
public boolean canAttack(Permanent attacker, UUID defenderId, Ability source, Game game) {
CastSpellYourLastTurnWatcher watcher = (CastSpellYourLastTurnWatcher) game.getState().getWatchers().get(CastSpellYourLastTurnWatcher.class.getSimpleName());
if (watcher != null && watcher.getAmountOfSpellsCastOnPlayersTurn(defenderId) > 0) {
return true;
}
PermanentsEnteredBattlefieldYourLastTurnWatcher watcher2
= (PermanentsEnteredBattlefieldYourLastTurnWatcher) game.getState().getWatchers().get(PermanentsEnteredBattlefieldYourLastTurnWatcher.class.getSimpleName());
if (watcher2 != null && watcher2.getPermanentsEnteringOnPlayersLastTurn(game, defenderId) != null) {
for (Permanent permanent : watcher2.getPermanentsEnteringOnPlayersLastTurn(game, defenderId)) {
if (permanent != null && !(permanent instanceof PermanentToken)) {
return true;
}
}
}
return false;
}
@Override
public boolean applies(Permanent permanent, Ability source, Game game) {
return true;
}
}

View file

@ -0,0 +1,62 @@
/*
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
package mage.cards.b;
import java.util.UUID;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.filter.StaticFilters;
import mage.game.permanent.token.TreasureToken;
/**
*
* @author LevelX2
*/
public class BrasssBounty extends CardImpl {
public BrasssBounty(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{6}{R}");
// For each land you control, create a colorless Treasure artifact token with "{T}, Sacrifice this artifact: Add one mana of any color to your mana pool."
this.getSpellAbility().addEffect(
new CreateTokenEffect(new TreasureToken(), new PermanentsOnBattlefieldCount(StaticFilters.FILTER_CONTROLLED_PERMANENT))
.setText("For each land you control, create a colorless Treasure artifact token with \"{T}, Sacrifice this artifact: Add one mana of any color to your mana pool.\""));
}
public BrasssBounty(final BrasssBounty card) {
super(card);
}
@Override
public BrasssBounty copy() {
return new BrasssBounty(this);
}
}

View file

@ -0,0 +1,95 @@
/*
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
package mage.cards.c;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import static mage.filter.predicate.permanent.ControllerControlsIslandPredicate.filter;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.common.TargetCreaturePermanent;
/**
*
* @author spjspj
*/
public class CapitalOffense extends CardImpl {
public CapitalOffense(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{B}{B}");
// target creature gets -x/-x until end of turn, where x is the number of times a capital letter appears in its rules text. (ignore reminder text and flavor text.)
DynamicValue xValue = new NumberOfCapitalsInTextOfTargetCreatureCount();
this.getSpellAbility().addEffect(new BoostTargetEffect(xValue, xValue, Duration.EndOfTurn, true));
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
}
public CapitalOffense(final CapitalOffense card) {
super(card);
}
@Override
public CapitalOffense copy() {
return new CapitalOffense(this);
}
}
class NumberOfCapitalsInTextOfTargetCreatureCount implements DynamicValue {
@Override
public NumberOfCapitalsInTextOfTargetCreatureCount copy() {
return new NumberOfCapitalsInTextOfTargetCreatureCount();
}
@Override
public int calculate(Game game, Ability sourceAbility, Effect effect) {
Permanent permanent = game.getPermanent(sourceAbility.getTargets().get(0).getFirstTarget());
if (permanent != null) {
int capitals = 0;
for (String line : permanent.getRules()) {
line = line.replaceAll("(?i)<i.*?</i>", ""); // Ignoring reminder text in italic
line = line.replaceAll("\\{this\\}", permanent.getName());
capitals += line.length() - line.replaceAll("[A-Z]", "").length();
}
return -1 * capitals;
}
return 0;
}
@Override
public String getMessage() {
return filter.getMessage() + " that player controls";
}
}

View file

@ -88,6 +88,7 @@ class FumigateEffect extends OneShotEffect {
destroyedCreature++;
}
}
game.applyEffects();
if (destroyedCreature > 0) {
controller.gainLife(destroyedCreature, game);
}

View file

@ -56,7 +56,7 @@ import mage.target.targetpointer.FixedTarget;
public class MassMutiny extends CardImpl {
public MassMutiny(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{3}{R}{R}");
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{R}{R}");
// For each opponent, gain control of up to one target creature that player controls until end of turn. Untap those creatures. They gain haste until end of turn.
this.getSpellAbility().addEffect(new MassMutinyEffect());
@ -65,10 +65,10 @@ public class MassMutiny extends CardImpl {
@Override
public void adjustTargets(Ability ability, Game game) {
if (ability instanceof SpellAbility) {
ability.getTargets().clear();
for (UUID opponentId : game.getOpponents(ability.getControllerId())) {
Player opponent = game.getPlayer(opponentId);
if (opponent != null) {
ability.getTargets().clear();
FilterCreaturePermanent filter = new FilterCreaturePermanent("creature from opponent " + opponent.getName());
filter.add(new ControllerIdPredicate(opponentId));
TargetCreaturePermanent target = new TargetCreaturePermanent(0, 1, filter, false);

View file

@ -31,19 +31,18 @@ import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.BeginningOfEndStepTriggeredAbility;
import mage.abilities.common.EntersBattlefieldAllTriggeredAbility;
import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateTokenCopyTargetEffect;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.SacrificeSourceEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.TargetController;
import mage.constants.*;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.Predicates;
@ -69,8 +68,15 @@ public class MinionReflector extends CardImpl {
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{5}");
// Whenever a nontoken creature enters the battlefield under your control, you may pay {2}. If you do, create a token that's a copy of that creature. That token has haste and "At the beginning of the end step, sacrifice this permanent."
Ability ability = new MinionReflectorTriggeredAbility();
ability.addCost(new ManaCostsImpl("{2}"));
Ability ability = new EntersBattlefieldControlledTriggeredAbility(Zone.BATTLEFIELD, new DoIfCostPaid(
new MinionReflectorEffect(), new ManaCostsImpl("{2}"),
"Pay {2} to create a token that's a copy of that creature that " +
"entered the battlefield?"),
filter, false, SetTargetPointer.PERMANENT,
"Whenever a nontoken creature enters the battlefield under your control, " +
"you may pay 2. If you do, create a token that's a copy of that creature. " +
"That token has haste and \"At the beginning of the end step, sacrifice this " +
"permanent.\"");
this.addAbility(ability);
}
@ -84,38 +90,6 @@ public class MinionReflector extends CardImpl {
}
}
class MinionReflectorTriggeredAbility extends EntersBattlefieldAllTriggeredAbility {
public MinionReflectorTriggeredAbility() {
super(new MinionReflectorEffect(), new FilterControlledCreaturePermanent(), "Whenever a nontoken creature enters the battlefield under your control, you may pay {2}. If you do, create a token that's a copy of that creature. That token has haste and \"At the beginning of the end step, sacrifice this permanent");
filter.add(Predicates.not(new TokenPredicate()));
}
public MinionReflectorTriggeredAbility(MinionReflectorTriggeredAbility ability) {
super(ability);
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD) {
UUID targetId = event.getTargetId();
Permanent permanent = game.getPermanent(targetId);
if (filter.match(permanent, getSourceId(), getControllerId(), game)) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(targetId));
}
return true;
}
}
return false;
}
@Override
public MinionReflectorTriggeredAbility copy() {
return new MinionReflectorTriggeredAbility(this);
}
}
class MinionReflectorEffect extends OneShotEffect {
@ -141,7 +115,7 @@ class MinionReflectorEffect extends OneShotEffect {
effect.setTargetPointer(new FixedTarget(permanent, game));
effect.apply(game, source);
for (Permanent addedToken : effect.getAddedPermanent()) {
ContinuousEffect continuousEffect = new GainAbilityTargetEffect(new BeginningOfEndStepTriggeredAbility(new SacrificeSourceEffect(), TargetController.ANY, true), Duration.Custom);
ContinuousEffect continuousEffect = new GainAbilityTargetEffect(new BeginningOfEndStepTriggeredAbility(new SacrificeSourceEffect(), TargetController.ANY, false), Duration.Custom);
continuousEffect.setTargetPointer(new FixedTarget(addedToken.getId()));
game.addEffect(continuousEffect, source);
}

View file

@ -0,0 +1,110 @@
/*
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
package mage.cards.o;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.Mode;
import mage.abilities.effects.OneShotEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
/**
*
* @author spjspj
*/
public class OddlyUneven extends CardImpl {
public OddlyUneven(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{W}{W}");
// Choose one --
// * Destroy each creature with an odd number of words in its name. (Hyphenated words are one word.)
this.getSpellAbility().addEffect(new OddOrEvenEffect(true));
// * Destroy each creature with an even number of words in its name.
Mode mode = new Mode();
mode.getEffects().add(new OddOrEvenEffect(false));
this.getSpellAbility().addMode(mode);
}
public OddlyUneven(final OddlyUneven card) {
super(card);
}
@Override
public OddlyUneven copy() {
return new OddlyUneven(this);
}
}
class OddOrEvenEffect extends OneShotEffect {
private boolean odd = true;
public OddOrEvenEffect(boolean odd) {
super(Outcome.DestroyPermanent);
this.odd = odd;
this.staticText = "Destroy each creature with an " + (odd ? "odd" : "even") + " number of words in its name. (Hyphenated words are one word.)";
}
public OddOrEvenEffect(final OddOrEvenEffect effect) {
super(effect);
this.odd = effect.odd;
}
@Override
public OddOrEvenEffect copy() {
return new OddOrEvenEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
for (Permanent creature : game.getState().getBattlefield().getActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURE, controller.getId(), game)) {
// Check the number of words in the name (based on number of spaces)
if (creature != null) {
String name = creature.getName();
int spaces = name.length() - name.replace(" ", "").length();
boolean nameIsOdd = (spaces % 2 == 0);
if (this.odd && nameIsOdd || !this.odd && !nameIsOdd) {
creature.destroy(source.getSourceId(), game, false);
}
}
}
}
return false;
}
}

View file

@ -0,0 +1,123 @@
/*
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
package mage.cards.v;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.condition.InvertCondition;
import mage.abilities.condition.common.CitysBlessingCondition;
import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.SacrificeOpponentsEffect;
import mage.abilities.effects.keyword.AscendEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.TargetPermanent;
/**
*
* @author LevelX2
*/
public class VonasHunger extends CardImpl {
public VonasHunger(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{B}");
// Ascend (If you control ten or more permanents, you get the city's blessing for the rest of the game.)
this.getSpellAbility().addEffect(new AscendEffect());
// Each opponent sacrifices a creature.
this.getSpellAbility().addEffect(new ConditionalOneShotEffect(
new SacrificeOpponentsEffect(StaticFilters.FILTER_PERMANENT_A_CREATURE),
new InvertCondition(CitysBlessingCondition.instance),
"Each opponent sacrifices a creature"));
// If you have the city's blessing, instead each opponent sacrifices half the creatures he or she controls rounded up.
this.getSpellAbility().addEffect(new ConditionalOneShotEffect(
new VonasHungerEffect(),
CitysBlessingCondition.instance,
"If you have the city's blessing, instead each opponent sacrifices half the creatures he or she controls rounded up"));
}
public VonasHunger(final VonasHunger card) {
super(card);
}
@Override
public VonasHunger copy() {
return new VonasHunger(this);
}
}
class VonasHungerEffect extends OneShotEffect {
public VonasHungerEffect() {
super(Outcome.Sacrifice);
}
public VonasHungerEffect(final VonasHungerEffect effect) {
super(effect);
}
@Override
public VonasHungerEffect copy() {
return new VonasHungerEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
List<UUID> perms = new ArrayList<>();
for (UUID playerId : game.getOpponents(source.getControllerId())) {
Player player = game.getPlayer(playerId);
if (player != null) {
int numTargets = (game.getBattlefield().countAll(StaticFilters.FILTER_CONTROLLED_CREATURE, player.getId(), game) + 1) / 2;
if (numTargets > 0) {
TargetPermanent target = new TargetPermanent(numTargets, numTargets, StaticFilters.FILTER_CONTROLLED_CREATURE, true);
if (target.canChoose(player.getId(), game)) {
player.chooseTarget(Outcome.Sacrifice, target, source, game);
perms.addAll(target.getTargets());
}
}
}
}
for (UUID permID : perms) {
Permanent permanent = game.getPermanent(permID);
if (permanent != null) {
permanent.sacrifice(source.getSourceId(), game);
}
}
return true;
}
}

View file

@ -28,11 +28,12 @@
package mage.sets;
import mage.cards.ExpansionSet;
import mage.constants.Rarity;
import mage.constants.SetType;
/**
*
* @author fireshoes
* @author JayDi85
*/
public class ExplorersOfIxalan extends ExpansionSet {
@ -43,7 +44,55 @@ public class ExplorersOfIxalan extends ExpansionSet {
}
private ExplorersOfIxalan() {
super("Explorers of Ixalan", "E02", ExpansionSet.buildDate(2017, 1, 24), SetType.SUPPLEMENTAL);
super("Explorers of Ixalan", "E02", ExpansionSet.buildDate(2017, 11, 24), SetType.SUPPLEMENTAL);
this.blockName = "Explorers of Ixalan";
cards.add(new SetCardInfo("Adaptive Automaton", 42, Rarity.RARE, mage.cards.a.AdaptiveAutomaton.class));
cards.add(new SetCardInfo("Aether Gale", 7, Rarity.RARE, mage.cards.a.AetherGale.class));
cards.add(new SetCardInfo("Aggravated Assault", 25, Rarity.RARE, mage.cards.a.AggravatedAssault.class));
cards.add(new SetCardInfo("Beacon of Immortality", 1, Rarity.RARE, mage.cards.b.BeaconOfImmortality.class));
cards.add(new SetCardInfo("Blatant Thievery", 8, Rarity.RARE, mage.cards.b.BlatantThievery.class));
cards.add(new SetCardInfo("Bloodbond Vampire", 15, Rarity.UNCOMMON, mage.cards.b.BloodbondVampire.class));
cards.add(new SetCardInfo("Borderland Ranger", 31, Rarity.COMMON, mage.cards.b.BorderlandRanger.class));
cards.add(new SetCardInfo("Child of Night", 16, Rarity.COMMON, mage.cards.c.ChildOfNight.class));
cards.add(new SetCardInfo("Coat with Venom", 17, Rarity.COMMON, mage.cards.c.CoatWithVenom.class));
cards.add(new SetCardInfo("Concentrate", 9, Rarity.UNCOMMON, mage.cards.c.Concentrate.class));
cards.add(new SetCardInfo("Crumbling Necropolis", 45, Rarity.UNCOMMON, mage.cards.c.CrumblingNecropolis.class));
cards.add(new SetCardInfo("Day of Judgment", 2, Rarity.RARE, mage.cards.d.DayOfJudgment.class));
cards.add(new SetCardInfo("Disaster Radius", 26, Rarity.RARE, mage.cards.d.DisasterRadius.class));
cards.add(new SetCardInfo("Doom Blade", 18, Rarity.UNCOMMON, mage.cards.d.DoomBlade.class));
cards.add(new SetCardInfo("Giant Growth", 32, Rarity.COMMON, mage.cards.g.GiantGrowth.class));
cards.add(new SetCardInfo("Hunter's Prowess", 33, Rarity.RARE, mage.cards.h.HuntersProwess.class));
cards.add(new SetCardInfo("Innocent Blood", 19, Rarity.COMMON, mage.cards.i.InnocentBlood.class));
cards.add(new SetCardInfo("Jungle Barrier", 38, Rarity.UNCOMMON, mage.cards.j.JungleBarrier.class));
cards.add(new SetCardInfo("Jungle Shrine", 46, Rarity.UNCOMMON, mage.cards.j.JungleShrine.class));
cards.add(new SetCardInfo("Lightning Helix", 39, Rarity.UNCOMMON, mage.cards.l.LightningHelix.class));
cards.add(new SetCardInfo("Mass Mutiny", 27, Rarity.RARE, mage.cards.m.MassMutiny.class));
cards.add(new SetCardInfo("Merfolk Sovereign", 10, Rarity.RARE, mage.cards.m.MerfolkSovereign.class));
cards.add(new SetCardInfo("Mortify", 40, Rarity.UNCOMMON, mage.cards.m.Mortify.class));
cards.add(new SetCardInfo("Necropolis Regent", 20, Rarity.MYTHIC, mage.cards.n.NecropolisRegent.class));
cards.add(new SetCardInfo("Path to Exile", 3, Rarity.UNCOMMON, mage.cards.p.PathToExile.class));
cards.add(new SetCardInfo("Prey Upon", 34, Rarity.COMMON, mage.cards.p.PreyUpon.class));
cards.add(new SetCardInfo("Prismatic Lens", 43, Rarity.UNCOMMON, mage.cards.p.PrismaticLens.class));
cards.add(new SetCardInfo("Quicksilver Amulet", 44, Rarity.RARE, mage.cards.q.QuicksilverAmulet.class));
cards.add(new SetCardInfo("Rancor", 35, Rarity.UNCOMMON, mage.cards.r.Rancor.class));
cards.add(new SetCardInfo("Rush of Adrenaline", 28, Rarity.COMMON, mage.cards.r.RushOfAdrenaline.class));
cards.add(new SetCardInfo("Shared Animosity", 29, Rarity.RARE, mage.cards.s.SharedAnimosity.class));
cards.add(new SetCardInfo("Shielded by Faith", 4, Rarity.RARE, mage.cards.s.ShieldedByFaith.class));
cards.add(new SetCardInfo("Soul of the Harvest", 36, Rarity.RARE, mage.cards.s.SoulOfTheHarvest.class));
cards.add(new SetCardInfo("Tainted Field", 47, Rarity.UNCOMMON, mage.cards.t.TaintedField.class));
cards.add(new SetCardInfo("Threads of Disloyalty", 11, Rarity.RARE, mage.cards.t.ThreadsOfDisloyalty.class));
cards.add(new SetCardInfo("Time Warp", 12, Rarity.MYTHIC, mage.cards.t.TimeWarp.class));
cards.add(new SetCardInfo("Unsummon", 13, Rarity.COMMON, mage.cards.u.Unsummon.class));
cards.add(new SetCardInfo("Urge to Feed", 21, Rarity.UNCOMMON, mage.cards.u.UrgeToFeed.class));
cards.add(new SetCardInfo("Vampire Interloper", 22, Rarity.COMMON, mage.cards.v.VampireInterloper.class));
cards.add(new SetCardInfo("Vampire Nighthawk", 23, Rarity.UNCOMMON, mage.cards.v.VampireNighthawk.class));
cards.add(new SetCardInfo("Vampire Noble", 24, Rarity.COMMON, mage.cards.v.VampireNoble.class));
cards.add(new SetCardInfo("Veteran's Reflexes", 5, Rarity.COMMON, mage.cards.v.VeteransReflexes.class));
cards.add(new SetCardInfo("Vow of Duty", 6, Rarity.UNCOMMON, mage.cards.v.VowOfDuty.class));
cards.add(new SetCardInfo("Vow of Flight", 14, Rarity.UNCOMMON, mage.cards.v.VowOfFlight.class));
cards.add(new SetCardInfo("Vow of Lightning", 30, Rarity.UNCOMMON, mage.cards.v.VowOfLightning.class));
cards.add(new SetCardInfo("Vow of Wildness", 37, Rarity.UNCOMMON, mage.cards.v.VowOfWildness.class));
cards.add(new SetCardInfo("Zealous Persecution", 41, Rarity.UNCOMMON, mage.cards.z.ZealousPersecution.class));
}
}

View file

@ -66,6 +66,7 @@ public class Legends extends ExpansionSet {
cards.add(new SetCardInfo("Amrou Kithkin", 172, Rarity.COMMON, mage.cards.a.AmrouKithkin.class));
cards.add(new SetCardInfo("Angelic Voices", 173, Rarity.RARE, mage.cards.a.AngelicVoices.class));
cards.add(new SetCardInfo("Angus Mackenzie", 257, Rarity.RARE, mage.cards.a.AngusMackenzie.class));
cards.add(new SetCardInfo("Arboria", 88, Rarity.UNCOMMON, mage.cards.a.Arboria.class));
cards.add(new SetCardInfo("Arcades Sabboth", 258, Rarity.RARE, mage.cards.a.ArcadesSabboth.class));
cards.add(new SetCardInfo("Arena of the Ancients", 215, Rarity.RARE, mage.cards.a.ArenaOfTheAncients.class));
cards.add(new SetCardInfo("Avoid Fate", 89, Rarity.COMMON, mage.cards.a.AvoidFate.class));

View file

@ -27,288 +27,288 @@ public class LimitedEditionBeta extends ExpansionSet {
cards.add(new SetCardInfo("Air Elemental", 47, Rarity.UNCOMMON, mage.cards.a.AirElemental.class));
cards.add(new SetCardInfo("Ancestral Recall", 48, Rarity.RARE, mage.cards.a.AncestralRecall.class));
cards.add(new SetCardInfo("Animate Artifact", 49, Rarity.UNCOMMON, mage.cards.a.AnimateArtifact.class));
cards.add(new SetCardInfo("Animate Dead", 1, Rarity.UNCOMMON, mage.cards.a.AnimateDead.class));
cards.add(new SetCardInfo("Animate Wall", 186, Rarity.RARE, mage.cards.a.AnimateWall.class));
cards.add(new SetCardInfo("Ankh of Mishra", 232, Rarity.RARE, mage.cards.a.AnkhOfMishra.class));
cards.add(new SetCardInfo("Armageddon", 187, Rarity.RARE, mage.cards.a.Armageddon.class));
cards.add(new SetCardInfo("Aspect of Wolf", 93, Rarity.RARE, mage.cards.a.AspectOfWolf.class));
cards.add(new SetCardInfo("Badlands", 139, Rarity.RARE, mage.cards.b.Badlands.class));
cards.add(new SetCardInfo("Bad Moon", 2, Rarity.RARE, mage.cards.b.BadMoon.class));
cards.add(new SetCardInfo("Balance", 188, Rarity.RARE, mage.cards.b.Balance.class));
cards.add(new SetCardInfo("Basalt Monolith", 233, Rarity.UNCOMMON, mage.cards.b.BasaltMonolith.class));
cards.add(new SetCardInfo("Animate Dead", 93, Rarity.UNCOMMON, mage.cards.a.AnimateDead.class));
cards.add(new SetCardInfo("Animate Wall", 1, Rarity.RARE, mage.cards.a.AnimateWall.class));
cards.add(new SetCardInfo("Ankh of Mishra", 231, Rarity.RARE, mage.cards.a.AnkhOfMishra.class));
cards.add(new SetCardInfo("Armageddon", 2, Rarity.RARE, mage.cards.a.Armageddon.class));
cards.add(new SetCardInfo("Aspect of Wolf", 185, Rarity.RARE, mage.cards.a.AspectOfWolf.class));
cards.add(new SetCardInfo("Bad Moon", 94, Rarity.RARE, mage.cards.b.BadMoon.class));
cards.add(new SetCardInfo("Badlands", 278, Rarity.RARE, mage.cards.b.Badlands.class));
cards.add(new SetCardInfo("Balance", 3, Rarity.RARE, mage.cards.b.Balance.class));
cards.add(new SetCardInfo("Basalt Monolith", 232, Rarity.UNCOMMON, mage.cards.b.BasaltMonolith.class));
cards.add(new SetCardInfo("Bayou", 279, Rarity.RARE, mage.cards.b.Bayou.class));
cards.add(new SetCardInfo("Berserk", 94, Rarity.UNCOMMON, mage.cards.b.Berserk.class));
cards.add(new SetCardInfo("Birds of Paradise", 95, Rarity.RARE, mage.cards.b.BirdsOfParadise.class));
cards.add(new SetCardInfo("Black Knight", 3, Rarity.UNCOMMON, mage.cards.b.BlackKnight.class));
cards.add(new SetCardInfo("Black Lotus", 234, Rarity.RARE, mage.cards.b.BlackLotus.class));
cards.add(new SetCardInfo("Black Vise", 235, Rarity.UNCOMMON, mage.cards.b.BlackVise.class));
cards.add(new SetCardInfo("Black Ward", 190, Rarity.UNCOMMON, mage.cards.b.BlackWard.class));
cards.add(new SetCardInfo("Blessing", 192, Rarity.RARE, mage.cards.b.Blessing.class));
cards.add(new SetCardInfo("Berserk", 186, Rarity.UNCOMMON, mage.cards.b.Berserk.class));
cards.add(new SetCardInfo("Birds of Paradise", 187, Rarity.RARE, mage.cards.b.BirdsOfParadise.class));
cards.add(new SetCardInfo("Black Knight", 95, Rarity.UNCOMMON, mage.cards.b.BlackKnight.class));
cards.add(new SetCardInfo("Black Lotus", 233, Rarity.RARE, mage.cards.b.BlackLotus.class));
cards.add(new SetCardInfo("Black Vise", 234, Rarity.UNCOMMON, mage.cards.b.BlackVise.class));
cards.add(new SetCardInfo("Black Ward", 5, Rarity.UNCOMMON, mage.cards.b.BlackWard.class));
cards.add(new SetCardInfo("Blessing", 7, Rarity.RARE, mage.cards.b.Blessing.class));
cards.add(new SetCardInfo("Blue Elemental Blast", 50, Rarity.COMMON, mage.cards.b.BlueElementalBlast.class));
cards.add(new SetCardInfo("Blue Ward", 193, Rarity.UNCOMMON, mage.cards.b.BlueWard.class));
cards.add(new SetCardInfo("Bog Wraith", 4, Rarity.UNCOMMON, mage.cards.b.BogWraith.class));
cards.add(new SetCardInfo("Blue Ward", 8, Rarity.UNCOMMON, mage.cards.b.BlueWard.class));
cards.add(new SetCardInfo("Bog Wraith", 96, Rarity.UNCOMMON, mage.cards.b.BogWraith.class));
cards.add(new SetCardInfo("Braingeyser", 51, Rarity.RARE, mage.cards.b.Braingeyser.class));
cards.add(new SetCardInfo("Burrowing", 140, Rarity.UNCOMMON, mage.cards.b.Burrowing.class));
cards.add(new SetCardInfo("Castle", 194, Rarity.UNCOMMON, mage.cards.c.Castle.class));
cards.add(new SetCardInfo("Celestial Prism", 236, Rarity.UNCOMMON, mage.cards.c.CelestialPrism.class));
cards.add(new SetCardInfo("Channel", 97, Rarity.UNCOMMON, mage.cards.c.Channel.class));
cards.add(new SetCardInfo("Chaoslace", 141, Rarity.RARE, mage.cards.c.Chaoslace.class));
cards.add(new SetCardInfo("Circle of Protection: Black", 195, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlack.class));
cards.add(new SetCardInfo("Circle of Protection: Blue", 196, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlue.class));
cards.add(new SetCardInfo("Circle of Protection: Green", 197, Rarity.COMMON, mage.cards.c.CircleOfProtectionGreen.class));
cards.add(new SetCardInfo("Circle of Protection: Red", 198, Rarity.COMMON, mage.cards.c.CircleOfProtectionRed.class));
cards.add(new SetCardInfo("Circle of Protection: White", 199, Rarity.COMMON, mage.cards.c.CircleOfProtectionWhite.class));
cards.add(new SetCardInfo("Clockwork Beast", 238, Rarity.RARE, mage.cards.c.ClockworkBeast.class));
cards.add(new SetCardInfo("Burrowing", 139, Rarity.UNCOMMON, mage.cards.b.Burrowing.class));
cards.add(new SetCardInfo("Castle", 9, Rarity.UNCOMMON, mage.cards.c.Castle.class));
cards.add(new SetCardInfo("Celestial Prism", 235, Rarity.UNCOMMON, mage.cards.c.CelestialPrism.class));
cards.add(new SetCardInfo("Channel", 189, Rarity.UNCOMMON, mage.cards.c.Channel.class));
cards.add(new SetCardInfo("Chaoslace", 140, Rarity.RARE, mage.cards.c.Chaoslace.class));
cards.add(new SetCardInfo("Circle of Protection: Black", 10, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlack.class));
cards.add(new SetCardInfo("Circle of Protection: Blue", 11, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlue.class));
cards.add(new SetCardInfo("Circle of Protection: Green", 12, Rarity.COMMON, mage.cards.c.CircleOfProtectionGreen.class));
cards.add(new SetCardInfo("Circle of Protection: Red", 13, Rarity.COMMON, mage.cards.c.CircleOfProtectionRed.class));
cards.add(new SetCardInfo("Circle of Protection: White", 14, Rarity.COMMON, mage.cards.c.CircleOfProtectionWhite.class));
cards.add(new SetCardInfo("Clockwork Beast", 237, Rarity.RARE, mage.cards.c.ClockworkBeast.class));
cards.add(new SetCardInfo("Clone", 52, Rarity.UNCOMMON, mage.cards.c.Clone.class));
cards.add(new SetCardInfo("Cockatrice", 98, Rarity.RARE, mage.cards.c.Cockatrice.class));
cards.add(new SetCardInfo("Consecrate Land", 200, Rarity.UNCOMMON, mage.cards.c.ConsecrateLand.class));
cards.add(new SetCardInfo("Conservator", 239, Rarity.UNCOMMON, mage.cards.c.Conservator.class));
cards.add(new SetCardInfo("Cockatrice", 190, Rarity.RARE, mage.cards.c.Cockatrice.class));
cards.add(new SetCardInfo("Consecrate Land", 15, Rarity.UNCOMMON, mage.cards.c.ConsecrateLand.class));
cards.add(new SetCardInfo("Conservator", 238, Rarity.UNCOMMON, mage.cards.c.Conservator.class));
cards.add(new SetCardInfo("Control Magic", 53, Rarity.UNCOMMON, mage.cards.c.ControlMagic.class));
cards.add(new SetCardInfo("Conversion", 201, Rarity.UNCOMMON, mage.cards.c.Conversion.class));
cards.add(new SetCardInfo("Copper Tablet", 240, Rarity.UNCOMMON, mage.cards.c.CopperTablet.class));
cards.add(new SetCardInfo("Conversion", 16, Rarity.UNCOMMON, mage.cards.c.Conversion.class));
cards.add(new SetCardInfo("Copper Tablet", 239, Rarity.UNCOMMON, mage.cards.c.CopperTablet.class));
cards.add(new SetCardInfo("Copy Artifact", 54, Rarity.RARE, mage.cards.c.CopyArtifact.class));
cards.add(new SetCardInfo("Counterspell", 55, Rarity.UNCOMMON, mage.cards.c.Counterspell.class));
cards.add(new SetCardInfo("Craw Wurm", 99, Rarity.COMMON, mage.cards.c.CrawWurm.class));
cards.add(new SetCardInfo("Craw Wurm", 191, Rarity.COMMON, mage.cards.c.CrawWurm.class));
cards.add(new SetCardInfo("Creature Bond", 56, Rarity.COMMON, mage.cards.c.CreatureBond.class));
cards.add(new SetCardInfo("Crusade", 202, Rarity.RARE, mage.cards.c.Crusade.class));
cards.add(new SetCardInfo("Crystal Rod", 241, Rarity.UNCOMMON, mage.cards.c.CrystalRod.class));
cards.add(new SetCardInfo("Cursed Land", 6, Rarity.UNCOMMON, mage.cards.c.CursedLand.class));
cards.add(new SetCardInfo("Cyclopean Tomb", 242, Rarity.RARE, mage.cards.c.CyclopeanTomb.class));
cards.add(new SetCardInfo("Dark Ritual", 7, Rarity.COMMON, mage.cards.d.DarkRitual.class));
cards.add(new SetCardInfo("Deathgrip", 9, Rarity.UNCOMMON, mage.cards.d.Deathgrip.class));
cards.add(new SetCardInfo("Deathlace", 10, Rarity.RARE, mage.cards.d.Deathlace.class));
cards.add(new SetCardInfo("Death Ward", 203, Rarity.COMMON, mage.cards.d.DeathWard.class));
cards.add(new SetCardInfo("Demonic Hordes", 12, Rarity.RARE, mage.cards.d.DemonicHordes.class));
cards.add(new SetCardInfo("Demonic Tutor", 13, Rarity.UNCOMMON, mage.cards.d.DemonicTutor.class));
cards.add(new SetCardInfo("Dingus Egg", 243, Rarity.RARE, mage.cards.d.DingusEgg.class));
cards.add(new SetCardInfo("Disenchant", 204, Rarity.COMMON, mage.cards.d.Disenchant.class));
cards.add(new SetCardInfo("Disintegrate", 142, Rarity.COMMON, mage.cards.d.Disintegrate.class));
cards.add(new SetCardInfo("Disrupting Scepter", 244, Rarity.RARE, mage.cards.d.DisruptingScepter.class));
cards.add(new SetCardInfo("Dragon Whelp", 143, Rarity.UNCOMMON, mage.cards.d.DragonWhelp.class));
cards.add(new SetCardInfo("Drain Life", 14, Rarity.COMMON, mage.cards.d.DrainLife.class));
cards.add(new SetCardInfo("Drudge Skeletons", 15, Rarity.COMMON, mage.cards.d.DrudgeSkeletons.class));
cards.add(new SetCardInfo("Dwarven Demolition Team", 144, Rarity.UNCOMMON, mage.cards.d.DwarvenDemolitionTeam.class));
cards.add(new SetCardInfo("Dwarven Warriors", 145, Rarity.COMMON, mage.cards.d.DwarvenWarriors.class));
cards.add(new SetCardInfo("Crusade", 17, Rarity.RARE, mage.cards.c.Crusade.class));
cards.add(new SetCardInfo("Crystal Rod", 240, Rarity.UNCOMMON, mage.cards.c.CrystalRod.class));
cards.add(new SetCardInfo("Cursed Land", 98, Rarity.UNCOMMON, mage.cards.c.CursedLand.class));
cards.add(new SetCardInfo("Cyclopean Tomb", 241, Rarity.RARE, mage.cards.c.CyclopeanTomb.class));
cards.add(new SetCardInfo("Dark Ritual", 99, Rarity.COMMON, mage.cards.d.DarkRitual.class));
cards.add(new SetCardInfo("Death Ward", 18, Rarity.COMMON, mage.cards.d.DeathWard.class));
cards.add(new SetCardInfo("Deathgrip", 101, Rarity.UNCOMMON, mage.cards.d.Deathgrip.class));
cards.add(new SetCardInfo("Deathlace", 102, Rarity.RARE, mage.cards.d.Deathlace.class));
cards.add(new SetCardInfo("Demonic Hordes", 104, Rarity.RARE, mage.cards.d.DemonicHordes.class));
cards.add(new SetCardInfo("Demonic Tutor", 105, Rarity.UNCOMMON, mage.cards.d.DemonicTutor.class));
cards.add(new SetCardInfo("Dingus Egg", 242, Rarity.RARE, mage.cards.d.DingusEgg.class));
cards.add(new SetCardInfo("Disenchant", 19, Rarity.COMMON, mage.cards.d.Disenchant.class));
cards.add(new SetCardInfo("Disintegrate", 141, Rarity.COMMON, mage.cards.d.Disintegrate.class));
cards.add(new SetCardInfo("Disrupting Scepter", 243, Rarity.RARE, mage.cards.d.DisruptingScepter.class));
cards.add(new SetCardInfo("Dragon Whelp", 142, Rarity.UNCOMMON, mage.cards.d.DragonWhelp.class));
cards.add(new SetCardInfo("Drain Life", 106, Rarity.COMMON, mage.cards.d.DrainLife.class));
cards.add(new SetCardInfo("Drudge Skeletons", 107, Rarity.COMMON, mage.cards.d.DrudgeSkeletons.class));
cards.add(new SetCardInfo("Dwarven Demolition Team", 143, Rarity.UNCOMMON, mage.cards.d.DwarvenDemolitionTeam.class));
cards.add(new SetCardInfo("Dwarven Warriors", 144, Rarity.COMMON, mage.cards.d.DwarvenWarriors.class));
cards.add(new SetCardInfo("Earth Elemental", 145, Rarity.UNCOMMON, mage.cards.e.EarthElemental.class));
cards.add(new SetCardInfo("Earthbind", 146, Rarity.COMMON, mage.cards.e.Earthbind.class));
cards.add(new SetCardInfo("Earth Elemental", 146, Rarity.UNCOMMON, mage.cards.e.EarthElemental.class));
cards.add(new SetCardInfo("Earthquake", 148, Rarity.RARE, mage.cards.e.Earthquake.class));
cards.add(new SetCardInfo("Elvish Archers", 100, Rarity.RARE, mage.cards.e.ElvishArchers.class));
cards.add(new SetCardInfo("Evil Presence", 16, Rarity.UNCOMMON, mage.cards.e.EvilPresence.class));
cards.add(new SetCardInfo("False Orders", 149, Rarity.COMMON, mage.cards.f.FalseOrders.class));
cards.add(new SetCardInfo("Farmstead", 205, Rarity.RARE, mage.cards.f.Farmstead.class));
cards.add(new SetCardInfo("Fastbond", 101, Rarity.RARE, mage.cards.f.Fastbond.class));
cards.add(new SetCardInfo("Fear", 17, Rarity.COMMON, mage.cards.f.Fear.class));
cards.add(new SetCardInfo("Earthquake", 147, Rarity.RARE, mage.cards.e.Earthquake.class));
cards.add(new SetCardInfo("Elvish Archers", 192, Rarity.RARE, mage.cards.e.ElvishArchers.class));
cards.add(new SetCardInfo("Evil Presence", 108, Rarity.UNCOMMON, mage.cards.e.EvilPresence.class));
cards.add(new SetCardInfo("False Orders", 148, Rarity.COMMON, mage.cards.f.FalseOrders.class));
cards.add(new SetCardInfo("Farmstead", 20, Rarity.RARE, mage.cards.f.Farmstead.class));
cards.add(new SetCardInfo("Fastbond", 193, Rarity.RARE, mage.cards.f.Fastbond.class));
cards.add(new SetCardInfo("Fear", 109, Rarity.COMMON, mage.cards.f.Fear.class));
cards.add(new SetCardInfo("Feedback", 58, Rarity.UNCOMMON, mage.cards.f.Feedback.class));
cards.add(new SetCardInfo("Fireball", 151, Rarity.COMMON, mage.cards.f.Fireball.class));
cards.add(new SetCardInfo("Firebreathing", 152, Rarity.COMMON, mage.cards.f.Firebreathing.class));
cards.add(new SetCardInfo("Fire Elemental", 150, Rarity.UNCOMMON, mage.cards.f.FireElemental.class));
cards.add(new SetCardInfo("Flashfires", 153, Rarity.UNCOMMON, mage.cards.f.Flashfires.class));
cards.add(new SetCardInfo("Fire Elemental", 149, Rarity.UNCOMMON, mage.cards.f.FireElemental.class));
cards.add(new SetCardInfo("Fireball", 150, Rarity.COMMON, mage.cards.f.Fireball.class));
cards.add(new SetCardInfo("Firebreathing", 151, Rarity.COMMON, mage.cards.f.Firebreathing.class));
cards.add(new SetCardInfo("Flashfires", 152, Rarity.UNCOMMON, mage.cards.f.Flashfires.class));
cards.add(new SetCardInfo("Flight", 59, Rarity.COMMON, mage.cards.f.Flight.class));
cards.add(new SetCardInfo("Fog", 102, Rarity.COMMON, mage.cards.f.Fog.class));
cards.add(new SetCardInfo("Forcefield", 245, Rarity.RARE, mage.cards.f.Forcefield.class));
cards.add(new SetCardInfo("Force of Nature", 103, Rarity.RARE, mage.cards.f.ForceOfNature.class));
cards.add(new SetCardInfo("Forest", 280, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Forest", 281, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Forest", 282, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Fork", 154, Rarity.RARE, mage.cards.f.Fork.class));
cards.add(new SetCardInfo("Frozen Shade", 18, Rarity.COMMON, mage.cards.f.FrozenShade.class));
cards.add(new SetCardInfo("Fungusaur", 104, Rarity.RARE, mage.cards.f.Fungusaur.class));
cards.add(new SetCardInfo("Gaea's Liege", 105, Rarity.RARE, mage.cards.g.GaeasLiege.class));
cards.add(new SetCardInfo("Gauntlet of Might", 246, Rarity.RARE, mage.cards.g.GauntletOfMight.class));
cards.add(new SetCardInfo("Giant Growth", 106, Rarity.COMMON, mage.cards.g.GiantGrowth.class));
cards.add(new SetCardInfo("Giant Spider", 107, Rarity.COMMON, mage.cards.g.GiantSpider.class));
cards.add(new SetCardInfo("Glasses of Urza", 247, Rarity.UNCOMMON, mage.cards.g.GlassesOfUrza.class));
cards.add(new SetCardInfo("Gloom", 19, Rarity.UNCOMMON, mage.cards.g.Gloom.class));
cards.add(new SetCardInfo("Goblin Balloon Brigade", 155, Rarity.UNCOMMON, mage.cards.g.GoblinBalloonBrigade.class));
cards.add(new SetCardInfo("Goblin King", 156, Rarity.RARE, mage.cards.g.GoblinKing.class));
cards.add(new SetCardInfo("Granite Gargoyle", 157, Rarity.RARE, mage.cards.g.GraniteGargoyle.class));
cards.add(new SetCardInfo("Gray Ogre", 158, Rarity.COMMON, mage.cards.g.GrayOgre.class));
cards.add(new SetCardInfo("Green Ward", 206, Rarity.UNCOMMON, mage.cards.g.GreenWard.class));
cards.add(new SetCardInfo("Grizzly Bears", 108, Rarity.COMMON, mage.cards.g.GrizzlyBears.class));
cards.add(new SetCardInfo("Guardian Angel", 207, Rarity.COMMON, mage.cards.g.GuardianAngel.class));
cards.add(new SetCardInfo("Healing Salve", 208, Rarity.COMMON, mage.cards.h.HealingSalve.class));
cards.add(new SetCardInfo("Hill Giant", 159, Rarity.COMMON, mage.cards.h.HillGiant.class));
cards.add(new SetCardInfo("Holy Armor", 209, Rarity.COMMON, mage.cards.h.HolyArmor.class));
cards.add(new SetCardInfo("Holy Strength", 210, Rarity.COMMON, mage.cards.h.HolyStrength.class));
cards.add(new SetCardInfo("Howl from Beyond", 20, Rarity.COMMON, mage.cards.h.HowlFromBeyond.class));
cards.add(new SetCardInfo("Howling Mine", 249, Rarity.RARE, mage.cards.h.HowlingMine.class));
cards.add(new SetCardInfo("Hurloon Minotaur", 160, Rarity.COMMON, mage.cards.h.HurloonMinotaur.class));
cards.add(new SetCardInfo("Hurricane", 109, Rarity.UNCOMMON, mage.cards.h.Hurricane.class));
cards.add(new SetCardInfo("Hypnotic Specter", 21, Rarity.UNCOMMON, mage.cards.h.HypnoticSpecter.class));
cards.add(new SetCardInfo("Ice Storm", 110, Rarity.UNCOMMON, mage.cards.i.IceStorm.class));
cards.add(new SetCardInfo("Icy Manipulator", 250, Rarity.UNCOMMON, mage.cards.i.IcyManipulator.class));
cards.add(new SetCardInfo("Instill Energy", 111, Rarity.UNCOMMON, mage.cards.i.InstillEnergy.class));
cards.add(new SetCardInfo("Fog", 194, Rarity.COMMON, mage.cards.f.Fog.class));
cards.add(new SetCardInfo("Force of Nature", 195, Rarity.RARE, mage.cards.f.ForceOfNature.class));
cards.add(new SetCardInfo("Forcefield", 244, Rarity.RARE, mage.cards.f.Forcefield.class));
cards.add(new SetCardInfo("Forest", 300, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Forest", 301, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Forest", 302, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Fork", 153, Rarity.RARE, mage.cards.f.Fork.class));
cards.add(new SetCardInfo("Frozen Shade", 110, Rarity.COMMON, mage.cards.f.FrozenShade.class));
cards.add(new SetCardInfo("Fungusaur", 196, Rarity.RARE, mage.cards.f.Fungusaur.class));
cards.add(new SetCardInfo("Gaea's Liege", 197, Rarity.RARE, mage.cards.g.GaeasLiege.class));
cards.add(new SetCardInfo("Gauntlet of Might", 245, Rarity.RARE, mage.cards.g.GauntletOfMight.class));
cards.add(new SetCardInfo("Giant Growth", 198, Rarity.COMMON, mage.cards.g.GiantGrowth.class));
cards.add(new SetCardInfo("Giant Spider", 199, Rarity.COMMON, mage.cards.g.GiantSpider.class));
cards.add(new SetCardInfo("Glasses of Urza", 246, Rarity.UNCOMMON, mage.cards.g.GlassesOfUrza.class));
cards.add(new SetCardInfo("Gloom", 111, Rarity.UNCOMMON, mage.cards.g.Gloom.class));
cards.add(new SetCardInfo("Goblin Balloon Brigade", 154, Rarity.UNCOMMON, mage.cards.g.GoblinBalloonBrigade.class));
cards.add(new SetCardInfo("Goblin King", 155, Rarity.RARE, mage.cards.g.GoblinKing.class));
cards.add(new SetCardInfo("Granite Gargoyle", 156, Rarity.RARE, mage.cards.g.GraniteGargoyle.class));
cards.add(new SetCardInfo("Gray Ogre", 157, Rarity.COMMON, mage.cards.g.GrayOgre.class));
cards.add(new SetCardInfo("Green Ward", 21, Rarity.UNCOMMON, mage.cards.g.GreenWard.class));
cards.add(new SetCardInfo("Grizzly Bears", 200, Rarity.COMMON, mage.cards.g.GrizzlyBears.class));
cards.add(new SetCardInfo("Guardian Angel", 22, Rarity.COMMON, mage.cards.g.GuardianAngel.class));
cards.add(new SetCardInfo("Healing Salve", 23, Rarity.COMMON, mage.cards.h.HealingSalve.class));
cards.add(new SetCardInfo("Hill Giant", 158, Rarity.COMMON, mage.cards.h.HillGiant.class));
cards.add(new SetCardInfo("Holy Armor", 24, Rarity.COMMON, mage.cards.h.HolyArmor.class));
cards.add(new SetCardInfo("Holy Strength", 25, Rarity.COMMON, mage.cards.h.HolyStrength.class));
cards.add(new SetCardInfo("Howl from Beyond", 112, Rarity.COMMON, mage.cards.h.HowlFromBeyond.class));
cards.add(new SetCardInfo("Howling Mine", 248, Rarity.RARE, mage.cards.h.HowlingMine.class));
cards.add(new SetCardInfo("Hurloon Minotaur", 159, Rarity.COMMON, mage.cards.h.HurloonMinotaur.class));
cards.add(new SetCardInfo("Hurricane", 201, Rarity.UNCOMMON, mage.cards.h.Hurricane.class));
cards.add(new SetCardInfo("Hypnotic Specter", 113, Rarity.UNCOMMON, mage.cards.h.HypnoticSpecter.class));
cards.add(new SetCardInfo("Ice Storm", 202, Rarity.UNCOMMON, mage.cards.i.IceStorm.class));
cards.add(new SetCardInfo("Icy Manipulator", 249, Rarity.UNCOMMON, mage.cards.i.IcyManipulator.class));
cards.add(new SetCardInfo("Instill Energy", 203, Rarity.UNCOMMON, mage.cards.i.InstillEnergy.class));
cards.add(new SetCardInfo("Invisibility", 60, Rarity.COMMON, mage.cards.i.Invisibility.class));
cards.add(new SetCardInfo("Ironclaw Orcs", 161, Rarity.COMMON, mage.cards.i.IronclawOrcs.class));
cards.add(new SetCardInfo("Ironroot Treefolk", 112, Rarity.COMMON, mage.cards.i.IronrootTreefolk.class));
cards.add(new SetCardInfo("Iron Star", 252, Rarity.UNCOMMON, mage.cards.i.IronStar.class));
cards.add(new SetCardInfo("Island", 283, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Island", 284, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Island", 285, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Island Sanctuary", 211, Rarity.RARE, mage.cards.i.IslandSanctuary.class));
cards.add(new SetCardInfo("Ivory Cup", 253, Rarity.UNCOMMON, mage.cards.i.IvoryCup.class));
cards.add(new SetCardInfo("Jade Monolith", 254, Rarity.RARE, mage.cards.j.JadeMonolith.class));
cards.add(new SetCardInfo("Jade Statue", 255, Rarity.UNCOMMON, mage.cards.j.JadeStatue.class));
cards.add(new SetCardInfo("Jayemdae Tome", 256, Rarity.RARE, mage.cards.j.JayemdaeTome.class));
cards.add(new SetCardInfo("Juggernaut", 257, Rarity.UNCOMMON, mage.cards.j.Juggernaut.class));
cards.add(new SetCardInfo("Iron Star", 251, Rarity.UNCOMMON, mage.cards.i.IronStar.class));
cards.add(new SetCardInfo("Ironclaw Orcs", 160, Rarity.COMMON, mage.cards.i.IronclawOrcs.class));
cards.add(new SetCardInfo("Ironroot Treefolk", 204, Rarity.COMMON, mage.cards.i.IronrootTreefolk.class));
cards.add(new SetCardInfo("Island Sanctuary", 26, Rarity.RARE, mage.cards.i.IslandSanctuary.class));
cards.add(new SetCardInfo("Island", 291, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Island", 292, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Island", 293, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ivory Cup", 252, Rarity.UNCOMMON, mage.cards.i.IvoryCup.class));
cards.add(new SetCardInfo("Jade Monolith", 253, Rarity.RARE, mage.cards.j.JadeMonolith.class));
cards.add(new SetCardInfo("Jade Statue", 254, Rarity.UNCOMMON, mage.cards.j.JadeStatue.class));
cards.add(new SetCardInfo("Jayemdae Tome", 255, Rarity.RARE, mage.cards.j.JayemdaeTome.class));
cards.add(new SetCardInfo("Juggernaut", 256, Rarity.UNCOMMON, mage.cards.j.Juggernaut.class));
cards.add(new SetCardInfo("Jump", 61, Rarity.COMMON, mage.cards.j.Jump.class));
cards.add(new SetCardInfo("Karma", 212, Rarity.UNCOMMON, mage.cards.k.Karma.class));
cards.add(new SetCardInfo("Keldon Warlord", 162, Rarity.UNCOMMON, mage.cards.k.KeldonWarlord.class));
cards.add(new SetCardInfo("Kormus Bell", 258, Rarity.RARE, mage.cards.k.KormusBell.class));
cards.add(new SetCardInfo("Kudzu", 113, Rarity.RARE, mage.cards.k.Kudzu.class));
cards.add(new SetCardInfo("Lance", 213, Rarity.UNCOMMON, mage.cards.l.Lance.class));
cards.add(new SetCardInfo("Ley Druid", 114, Rarity.UNCOMMON, mage.cards.l.LeyDruid.class));
cards.add(new SetCardInfo("Library of Leng", 259, Rarity.UNCOMMON, mage.cards.l.LibraryOfLeng.class));
cards.add(new SetCardInfo("Lich", 22, Rarity.RARE, mage.cards.l.Lich.class));
cards.add(new SetCardInfo("Lifeforce", 115, Rarity.UNCOMMON, mage.cards.l.Lifeforce.class));
cards.add(new SetCardInfo("Lifelace", 116, Rarity.RARE, mage.cards.l.Lifelace.class));
cards.add(new SetCardInfo("Karma", 27, Rarity.UNCOMMON, mage.cards.k.Karma.class));
cards.add(new SetCardInfo("Keldon Warlord", 161, Rarity.UNCOMMON, mage.cards.k.KeldonWarlord.class));
cards.add(new SetCardInfo("Kormus Bell", 257, Rarity.RARE, mage.cards.k.KormusBell.class));
cards.add(new SetCardInfo("Kudzu", 205, Rarity.RARE, mage.cards.k.Kudzu.class));
cards.add(new SetCardInfo("Lance", 28, Rarity.UNCOMMON, mage.cards.l.Lance.class));
cards.add(new SetCardInfo("Ley Druid", 206, Rarity.UNCOMMON, mage.cards.l.LeyDruid.class));
cards.add(new SetCardInfo("Library of Leng", 258, Rarity.UNCOMMON, mage.cards.l.LibraryOfLeng.class));
cards.add(new SetCardInfo("Lich", 114, Rarity.RARE, mage.cards.l.Lich.class));
cards.add(new SetCardInfo("Lifeforce", 207, Rarity.UNCOMMON, mage.cards.l.Lifeforce.class));
cards.add(new SetCardInfo("Lifelace", 208, Rarity.RARE, mage.cards.l.Lifelace.class));
cards.add(new SetCardInfo("Lifetap", 62, Rarity.UNCOMMON, mage.cards.l.Lifetap.class));
cards.add(new SetCardInfo("Lightning Bolt", 163, Rarity.COMMON, mage.cards.l.LightningBolt.class));
cards.add(new SetCardInfo("Living Artifact", 117, Rarity.RARE, mage.cards.l.LivingArtifact.class));
cards.add(new SetCardInfo("Living Lands", 118, Rarity.RARE, mage.cards.l.LivingLands.class));
cards.add(new SetCardInfo("Living Wall", 260, Rarity.UNCOMMON, mage.cards.l.LivingWall.class));
cards.add(new SetCardInfo("Llanowar Elves", 119, Rarity.COMMON, mage.cards.l.LlanowarElves.class));
cards.add(new SetCardInfo("Lightning Bolt", 162, Rarity.COMMON, mage.cards.l.LightningBolt.class));
cards.add(new SetCardInfo("Living Artifact", 209, Rarity.RARE, mage.cards.l.LivingArtifact.class));
cards.add(new SetCardInfo("Living Lands", 210, Rarity.RARE, mage.cards.l.LivingLands.class));
cards.add(new SetCardInfo("Living Wall", 259, Rarity.UNCOMMON, mage.cards.l.LivingWall.class));
cards.add(new SetCardInfo("Llanowar Elves", 211, Rarity.COMMON, mage.cards.l.LlanowarElves.class));
cards.add(new SetCardInfo("Lord of Atlantis", 63, Rarity.RARE, mage.cards.l.LordOfAtlantis.class));
cards.add(new SetCardInfo("Lord of the Pit", 23, Rarity.RARE, mage.cards.l.LordOfThePit.class));
cards.add(new SetCardInfo("Lure", 120, Rarity.UNCOMMON, mage.cards.l.Lure.class));
cards.add(new SetCardInfo("Lord of the Pit", 115, Rarity.RARE, mage.cards.l.LordOfThePit.class));
cards.add(new SetCardInfo("Lure", 212, Rarity.UNCOMMON, mage.cards.l.Lure.class));
cards.add(new SetCardInfo("Mahamoti Djinn", 65, Rarity.RARE, mage.cards.m.MahamotiDjinn.class));
cards.add(new SetCardInfo("Manabarbs", 165, Rarity.RARE, mage.cards.m.Manabarbs.class));
cards.add(new SetCardInfo("Mana Flare", 164, Rarity.RARE, mage.cards.m.ManaFlare.class));
cards.add(new SetCardInfo("Mana Flare", 163, Rarity.RARE, mage.cards.m.ManaFlare.class));
cards.add(new SetCardInfo("Mana Short", 66, Rarity.RARE, mage.cards.m.ManaShort.class));
cards.add(new SetCardInfo("Mana Vault", 261, Rarity.RARE, mage.cards.m.ManaVault.class));
cards.add(new SetCardInfo("Meekstone", 262, Rarity.RARE, mage.cards.m.Meekstone.class));
cards.add(new SetCardInfo("Mana Vault", 260, Rarity.RARE, mage.cards.m.ManaVault.class));
cards.add(new SetCardInfo("Manabarbs", 164, Rarity.RARE, mage.cards.m.Manabarbs.class));
cards.add(new SetCardInfo("Meekstone", 261, Rarity.RARE, mage.cards.m.Meekstone.class));
cards.add(new SetCardInfo("Merfolk of the Pearl Trident", 67, Rarity.COMMON, mage.cards.m.MerfolkOfThePearlTrident.class));
cards.add(new SetCardInfo("Mind Twist", 24, Rarity.RARE, mage.cards.m.MindTwist.class));
cards.add(new SetCardInfo("Mons's Goblin Raiders", 166, Rarity.COMMON, mage.cards.m.MonssGoblinRaiders.class));
cards.add(new SetCardInfo("Mountain", 286, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Mountain", 287, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Mountain", 288, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Mox Emerald", 263, Rarity.RARE, mage.cards.m.MoxEmerald.class));
cards.add(new SetCardInfo("Mox Jet", 264, Rarity.RARE, mage.cards.m.MoxJet.class));
cards.add(new SetCardInfo("Mox Pearl", 265, Rarity.RARE, mage.cards.m.MoxPearl.class));
cards.add(new SetCardInfo("Mox Ruby", 266, Rarity.RARE, mage.cards.m.MoxRuby.class));
cards.add(new SetCardInfo("Mox Sapphire", 267, Rarity.RARE, mage.cards.m.MoxSapphire.class));
cards.add(new SetCardInfo("Natural Selection", 121, Rarity.RARE, mage.cards.n.NaturalSelection.class));
cards.add(new SetCardInfo("Nether Shadow", 25, Rarity.RARE, mage.cards.n.NetherShadow.class));
cards.add(new SetCardInfo("Nettling Imp", 26, Rarity.UNCOMMON, mage.cards.n.NettlingImp.class));
cards.add(new SetCardInfo("Nevinyrral's Disk", 268, Rarity.RARE, mage.cards.n.NevinyrralsDisk.class));
cards.add(new SetCardInfo("Nightmare", 27, Rarity.RARE, mage.cards.n.Nightmare.class));
cards.add(new SetCardInfo("Northern Paladin", 215, Rarity.RARE, mage.cards.n.NorthernPaladin.class));
cards.add(new SetCardInfo("Obsianus Golem", 269, Rarity.UNCOMMON, mage.cards.o.ObsianusGolem.class));
cards.add(new SetCardInfo("Orcish Artillery", 167, Rarity.UNCOMMON, mage.cards.o.OrcishArtillery.class));
cards.add(new SetCardInfo("Orcish Oriflamme", 168, Rarity.UNCOMMON, mage.cards.o.OrcishOriflamme.class));
cards.add(new SetCardInfo("Paralyze", 28, Rarity.COMMON, mage.cards.p.Paralyze.class));
cards.add(new SetCardInfo("Pearled Unicorn", 216, Rarity.COMMON, mage.cards.p.PearledUnicorn.class));
cards.add(new SetCardInfo("Personal Incarnation", 217, Rarity.RARE, mage.cards.p.PersonalIncarnation.class));
cards.add(new SetCardInfo("Pestilence", 29, Rarity.COMMON, mage.cards.p.Pestilence.class));
cards.add(new SetCardInfo("Mind Twist", 116, Rarity.RARE, mage.cards.m.MindTwist.class));
cards.add(new SetCardInfo("Mons's Goblin Raiders", 165, Rarity.COMMON, mage.cards.m.MonssGoblinRaiders.class));
cards.add(new SetCardInfo("Mountain", 297, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Mountain", 298, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Mountain", 299, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Mox Emerald", 262, Rarity.RARE, mage.cards.m.MoxEmerald.class));
cards.add(new SetCardInfo("Mox Jet", 263, Rarity.RARE, mage.cards.m.MoxJet.class));
cards.add(new SetCardInfo("Mox Pearl", 264, Rarity.RARE, mage.cards.m.MoxPearl.class));
cards.add(new SetCardInfo("Mox Ruby", 265, Rarity.RARE, mage.cards.m.MoxRuby.class));
cards.add(new SetCardInfo("Mox Sapphire", 266, Rarity.RARE, mage.cards.m.MoxSapphire.class));
cards.add(new SetCardInfo("Natural Selection", 213, Rarity.RARE, mage.cards.n.NaturalSelection.class));
cards.add(new SetCardInfo("Nether Shadow", 117, Rarity.RARE, mage.cards.n.NetherShadow.class));
cards.add(new SetCardInfo("Nettling Imp", 118, Rarity.UNCOMMON, mage.cards.n.NettlingImp.class));
cards.add(new SetCardInfo("Nevinyrral's Disk", 267, Rarity.RARE, mage.cards.n.NevinyrralsDisk.class));
cards.add(new SetCardInfo("Nightmare", 119, Rarity.RARE, mage.cards.n.Nightmare.class));
cards.add(new SetCardInfo("Northern Paladin", 30, Rarity.RARE, mage.cards.n.NorthernPaladin.class));
cards.add(new SetCardInfo("Obsianus Golem", 268, Rarity.UNCOMMON, mage.cards.o.ObsianusGolem.class));
cards.add(new SetCardInfo("Orcish Artillery", 166, Rarity.UNCOMMON, mage.cards.o.OrcishArtillery.class));
cards.add(new SetCardInfo("Orcish Oriflamme", 167, Rarity.UNCOMMON, mage.cards.o.OrcishOriflamme.class));
cards.add(new SetCardInfo("Paralyze", 120, Rarity.COMMON, mage.cards.p.Paralyze.class));
cards.add(new SetCardInfo("Pearled Unicorn", 31, Rarity.COMMON, mage.cards.p.PearledUnicorn.class));
cards.add(new SetCardInfo("Personal Incarnation", 32, Rarity.RARE, mage.cards.p.PersonalIncarnation.class));
cards.add(new SetCardInfo("Pestilence", 121, Rarity.COMMON, mage.cards.p.Pestilence.class));
cards.add(new SetCardInfo("Phantasmal Forces", 68, Rarity.UNCOMMON, mage.cards.p.PhantasmalForces.class));
cards.add(new SetCardInfo("Phantasmal Terrain", 69, Rarity.COMMON, mage.cards.p.PhantasmalTerrain.class));
cards.add(new SetCardInfo("Phantom Monster", 70, Rarity.UNCOMMON, mage.cards.p.PhantomMonster.class));
cards.add(new SetCardInfo("Pirate Ship", 71, Rarity.RARE, mage.cards.p.PirateShip.class));
cards.add(new SetCardInfo("Plague Rats", 30, Rarity.COMMON, mage.cards.p.PlagueRats.class));
cards.add(new SetCardInfo("Plague Rats", 122, Rarity.COMMON, mage.cards.p.PlagueRats.class));
cards.add(new SetCardInfo("Plains", 288, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Plains", 289, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Plains", 290, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Plains", 291, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Plateau", 292, Rarity.RARE, mage.cards.p.Plateau.class));
cards.add(new SetCardInfo("Plateau", 280, Rarity.RARE, mage.cards.p.Plateau.class));
cards.add(new SetCardInfo("Power Sink", 73, Rarity.COMMON, mage.cards.p.PowerSink.class));
cards.add(new SetCardInfo("Power Surge", 169, Rarity.RARE, mage.cards.p.PowerSurge.class));
cards.add(new SetCardInfo("Power Surge", 168, Rarity.RARE, mage.cards.p.PowerSurge.class));
cards.add(new SetCardInfo("Prodigal Sorcerer", 74, Rarity.COMMON, mage.cards.p.ProdigalSorcerer.class));
cards.add(new SetCardInfo("Psionic Blast", 75, Rarity.UNCOMMON, mage.cards.p.PsionicBlast.class));
cards.add(new SetCardInfo("Psychic Venom", 76, Rarity.COMMON, mage.cards.p.PsychicVenom.class));
cards.add(new SetCardInfo("Purelace", 218, Rarity.RARE, mage.cards.p.Purelace.class));
cards.add(new SetCardInfo("Raging River", 170, Rarity.RARE, mage.cards.r.RagingRiver.class));
cards.add(new SetCardInfo("Raise Dead", 31, Rarity.COMMON, mage.cards.r.RaiseDead.class));
cards.add(new SetCardInfo("Red Elemental Blast", 171, Rarity.COMMON, mage.cards.r.RedElementalBlast.class));
cards.add(new SetCardInfo("Red Ward", 219, Rarity.UNCOMMON, mage.cards.r.RedWard.class));
cards.add(new SetCardInfo("Regeneration", 122, Rarity.COMMON, mage.cards.r.Regeneration.class));
cards.add(new SetCardInfo("Regrowth", 123, Rarity.UNCOMMON, mage.cards.r.Regrowth.class));
cards.add(new SetCardInfo("Resurrection", 220, Rarity.UNCOMMON, mage.cards.r.Resurrection.class));
cards.add(new SetCardInfo("Reverse Damage", 221, Rarity.RARE, mage.cards.r.ReverseDamage.class));
cards.add(new SetCardInfo("Righteousness", 222, Rarity.RARE, mage.cards.r.Righteousness.class));
cards.add(new SetCardInfo("Roc of Kher Ridges", 172, Rarity.RARE, mage.cards.r.RocOfKherRidges.class));
cards.add(new SetCardInfo("Rock Hydra", 173, Rarity.RARE, mage.cards.r.RockHydra.class));
cards.add(new SetCardInfo("Rod of Ruin", 270, Rarity.UNCOMMON, mage.cards.r.RodOfRuin.class));
cards.add(new SetCardInfo("Royal Assassin", 32, Rarity.RARE, mage.cards.r.RoyalAssassin.class));
cards.add(new SetCardInfo("Sacrifice", 33, Rarity.UNCOMMON, mage.cards.s.Sacrifice.class));
cards.add(new SetCardInfo("Samite Healer", 223, Rarity.COMMON, mage.cards.s.SamiteHealer.class));
cards.add(new SetCardInfo("Savannah", 293, Rarity.RARE, mage.cards.s.Savannah.class));
cards.add(new SetCardInfo("Savannah Lions", 224, Rarity.RARE, mage.cards.s.SavannahLions.class));
cards.add(new SetCardInfo("Scathe Zombies", 34, Rarity.COMMON, mage.cards.s.ScatheZombies.class));
cards.add(new SetCardInfo("Scavenging Ghoul", 35, Rarity.UNCOMMON, mage.cards.s.ScavengingGhoul.class));
cards.add(new SetCardInfo("Scrubland", 294, Rarity.RARE, mage.cards.s.Scrubland.class));
cards.add(new SetCardInfo("Scryb Sprites", 124, Rarity.COMMON, mage.cards.s.ScrybSprites.class));
cards.add(new SetCardInfo("Purelace", 33, Rarity.RARE, mage.cards.p.Purelace.class));
cards.add(new SetCardInfo("Raging River", 169, Rarity.RARE, mage.cards.r.RagingRiver.class));
cards.add(new SetCardInfo("Raise Dead", 123, Rarity.COMMON, mage.cards.r.RaiseDead.class));
cards.add(new SetCardInfo("Red Elemental Blast", 170, Rarity.COMMON, mage.cards.r.RedElementalBlast.class));
cards.add(new SetCardInfo("Red Ward", 34, Rarity.UNCOMMON, mage.cards.r.RedWard.class));
cards.add(new SetCardInfo("Regeneration", 214, Rarity.COMMON, mage.cards.r.Regeneration.class));
cards.add(new SetCardInfo("Regrowth", 215, Rarity.UNCOMMON, mage.cards.r.Regrowth.class));
cards.add(new SetCardInfo("Resurrection", 35, Rarity.UNCOMMON, mage.cards.r.Resurrection.class));
cards.add(new SetCardInfo("Reverse Damage", 36, Rarity.RARE, mage.cards.r.ReverseDamage.class));
cards.add(new SetCardInfo("Righteousness", 37, Rarity.RARE, mage.cards.r.Righteousness.class));
cards.add(new SetCardInfo("Roc of Kher Ridges", 171, Rarity.RARE, mage.cards.r.RocOfKherRidges.class));
cards.add(new SetCardInfo("Rock Hydra", 172, Rarity.RARE, mage.cards.r.RockHydra.class));
cards.add(new SetCardInfo("Rod of Ruin", 269, Rarity.UNCOMMON, mage.cards.r.RodOfRuin.class));
cards.add(new SetCardInfo("Royal Assassin", 124, Rarity.RARE, mage.cards.r.RoyalAssassin.class));
cards.add(new SetCardInfo("Sacrifice", 125, Rarity.UNCOMMON, mage.cards.s.Sacrifice.class));
cards.add(new SetCardInfo("Samite Healer", 38, Rarity.COMMON, mage.cards.s.SamiteHealer.class));
cards.add(new SetCardInfo("Savannah Lions", 39, Rarity.RARE, mage.cards.s.SavannahLions.class));
cards.add(new SetCardInfo("Savannah", 281, Rarity.RARE, mage.cards.s.Savannah.class));
cards.add(new SetCardInfo("Scathe Zombies", 126, Rarity.COMMON, mage.cards.s.ScatheZombies.class));
cards.add(new SetCardInfo("Scavenging Ghoul", 127, Rarity.UNCOMMON, mage.cards.s.ScavengingGhoul.class));
cards.add(new SetCardInfo("Scrubland", 282, Rarity.RARE, mage.cards.s.Scrubland.class));
cards.add(new SetCardInfo("Scryb Sprites", 216, Rarity.COMMON, mage.cards.s.ScrybSprites.class));
cards.add(new SetCardInfo("Sea Serpent", 77, Rarity.COMMON, mage.cards.s.SeaSerpent.class));
cards.add(new SetCardInfo("Sedge Troll", 174, Rarity.RARE, mage.cards.s.SedgeTroll.class));
cards.add(new SetCardInfo("Sengir Vampire", 36, Rarity.UNCOMMON, mage.cards.s.SengirVampire.class));
cards.add(new SetCardInfo("Serra Angel", 225, Rarity.UNCOMMON, mage.cards.s.SerraAngel.class));
cards.add(new SetCardInfo("Shanodin Dryads", 125, Rarity.COMMON, mage.cards.s.ShanodinDryads.class));
cards.add(new SetCardInfo("Shatter", 175, Rarity.COMMON, mage.cards.s.Shatter.class));
cards.add(new SetCardInfo("Shivan Dragon", 176, Rarity.RARE, mage.cards.s.ShivanDragon.class));
cards.add(new SetCardInfo("Simulacrum", 37, Rarity.UNCOMMON, mage.cards.s.Simulacrum.class));
cards.add(new SetCardInfo("Sinkhole", 38, Rarity.COMMON, mage.cards.s.Sinkhole.class));
cards.add(new SetCardInfo("Sedge Troll", 173, Rarity.RARE, mage.cards.s.SedgeTroll.class));
cards.add(new SetCardInfo("Sengir Vampire", 128, Rarity.UNCOMMON, mage.cards.s.SengirVampire.class));
cards.add(new SetCardInfo("Serra Angel", 40, Rarity.UNCOMMON, mage.cards.s.SerraAngel.class));
cards.add(new SetCardInfo("Shanodin Dryads", 217, Rarity.COMMON, mage.cards.s.ShanodinDryads.class));
cards.add(new SetCardInfo("Shatter", 174, Rarity.COMMON, mage.cards.s.Shatter.class));
cards.add(new SetCardInfo("Shivan Dragon", 175, Rarity.RARE, mage.cards.s.ShivanDragon.class));
cards.add(new SetCardInfo("Simulacrum", 129, Rarity.UNCOMMON, mage.cards.s.Simulacrum.class));
cards.add(new SetCardInfo("Sinkhole", 130, Rarity.COMMON, mage.cards.s.Sinkhole.class));
cards.add(new SetCardInfo("Siren's Call", 78, Rarity.UNCOMMON, mage.cards.s.SirensCall.class));
cards.add(new SetCardInfo("Smoke", 177, Rarity.RARE, mage.cards.s.Smoke.class));
cards.add(new SetCardInfo("Sol Ring", 271, Rarity.UNCOMMON, mage.cards.s.SolRing.class));
cards.add(new SetCardInfo("Soul Net", 272, Rarity.UNCOMMON, mage.cards.s.SoulNet.class));
cards.add(new SetCardInfo("Smoke", 176, Rarity.RARE, mage.cards.s.Smoke.class));
cards.add(new SetCardInfo("Sol Ring", 270, Rarity.UNCOMMON, mage.cards.s.SolRing.class));
cards.add(new SetCardInfo("Soul Net", 271, Rarity.UNCOMMON, mage.cards.s.SoulNet.class));
cards.add(new SetCardInfo("Spell Blast", 80, Rarity.COMMON, mage.cards.s.SpellBlast.class));
cards.add(new SetCardInfo("Stasis", 81, Rarity.RARE, mage.cards.s.Stasis.class));
cards.add(new SetCardInfo("Steal Artifact", 82, Rarity.UNCOMMON, mage.cards.s.StealArtifact.class));
cards.add(new SetCardInfo("Stone Giant", 178, Rarity.UNCOMMON, mage.cards.s.StoneGiant.class));
cards.add(new SetCardInfo("Stone Rain", 179, Rarity.COMMON, mage.cards.s.StoneRain.class));
cards.add(new SetCardInfo("Stream of Life", 126, Rarity.COMMON, mage.cards.s.StreamOfLife.class));
cards.add(new SetCardInfo("Sunglasses of Urza", 273, Rarity.RARE, mage.cards.s.SunglassesOfUrza.class));
cards.add(new SetCardInfo("Stone Giant", 177, Rarity.UNCOMMON, mage.cards.s.StoneGiant.class));
cards.add(new SetCardInfo("Stone Rain", 178, Rarity.COMMON, mage.cards.s.StoneRain.class));
cards.add(new SetCardInfo("Stream of Life", 218, Rarity.COMMON, mage.cards.s.StreamOfLife.class));
cards.add(new SetCardInfo("Sunglasses of Urza", 272, Rarity.RARE, mage.cards.s.SunglassesOfUrza.class));
cards.add(new SetCardInfo("Swamp", 294, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Swamp", 295, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Swamp", 296, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Swamp", 297, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Swords to Plowshares", 226, Rarity.UNCOMMON, mage.cards.s.SwordsToPlowshares.class));
cards.add(new SetCardInfo("Taiga", 298, Rarity.RARE, mage.cards.t.Taiga.class));
cards.add(new SetCardInfo("Terror", 39, Rarity.COMMON, mage.cards.t.Terror.class));
cards.add(new SetCardInfo("The Hive", 274, Rarity.RARE, mage.cards.t.TheHive.class));
cards.add(new SetCardInfo("Thicket Basilisk", 127, Rarity.UNCOMMON, mage.cards.t.ThicketBasilisk.class));
cards.add(new SetCardInfo("Swords to Plowshares", 41, Rarity.UNCOMMON, mage.cards.s.SwordsToPlowshares.class));
cards.add(new SetCardInfo("Taiga", 283, Rarity.RARE, mage.cards.t.Taiga.class));
cards.add(new SetCardInfo("Terror", 131, Rarity.COMMON, mage.cards.t.Terror.class));
cards.add(new SetCardInfo("The Hive", 273, Rarity.RARE, mage.cards.t.TheHive.class));
cards.add(new SetCardInfo("Thicket Basilisk", 219, Rarity.UNCOMMON, mage.cards.t.ThicketBasilisk.class));
cards.add(new SetCardInfo("Thoughtlace", 83, Rarity.RARE, mage.cards.t.Thoughtlace.class));
cards.add(new SetCardInfo("Throne of Bone", 275, Rarity.UNCOMMON, mage.cards.t.ThroneOfBone.class));
cards.add(new SetCardInfo("Timetwister", 85, Rarity.RARE, mage.cards.t.Timetwister.class));
cards.add(new SetCardInfo("Time Vault", 276, Rarity.RARE, mage.cards.t.TimeVault.class));
cards.add(new SetCardInfo("Throne of Bone", 274, Rarity.UNCOMMON, mage.cards.t.ThroneOfBone.class));
cards.add(new SetCardInfo("Time Vault", 275, Rarity.RARE, mage.cards.t.TimeVault.class));
cards.add(new SetCardInfo("Time Walk", 84, Rarity.RARE, mage.cards.t.TimeWalk.class));
cards.add(new SetCardInfo("Tranquility", 129, Rarity.COMMON, mage.cards.t.Tranquility.class));
cards.add(new SetCardInfo("Tropical Island", 299, Rarity.RARE, mage.cards.t.TropicalIsland.class));
cards.add(new SetCardInfo("Tsunami", 130, Rarity.UNCOMMON, mage.cards.t.Tsunami.class));
cards.add(new SetCardInfo("Tundra", 300, Rarity.RARE, mage.cards.t.Tundra.class));
cards.add(new SetCardInfo("Tunnel", 180, Rarity.UNCOMMON, mage.cards.t.Tunnel.class));
cards.add(new SetCardInfo("Timetwister", 85, Rarity.RARE, mage.cards.t.Timetwister.class));
cards.add(new SetCardInfo("Tranquility", 221, Rarity.COMMON, mage.cards.t.Tranquility.class));
cards.add(new SetCardInfo("Tropical Island", 284, Rarity.RARE, mage.cards.t.TropicalIsland.class));
cards.add(new SetCardInfo("Tsunami", 222, Rarity.UNCOMMON, mage.cards.t.Tsunami.class));
cards.add(new SetCardInfo("Tundra", 285, Rarity.RARE, mage.cards.t.Tundra.class));
cards.add(new SetCardInfo("Tunnel", 179, Rarity.UNCOMMON, mage.cards.t.Tunnel.class));
cards.add(new SetCardInfo("Twiddle", 86, Rarity.COMMON, mage.cards.t.Twiddle.class));
cards.add(new SetCardInfo("Two-Headed Giant of Foriys", 181, Rarity.RARE, mage.cards.t.TwoHeadedGiantOfForiys.class));
cards.add(new SetCardInfo("Underground Sea", 301, Rarity.RARE, mage.cards.u.UndergroundSea.class));
cards.add(new SetCardInfo("Unholy Strength", 40, Rarity.COMMON, mage.cards.u.UnholyStrength.class));
cards.add(new SetCardInfo("Two-Headed Giant of Foriys", 180, Rarity.RARE, mage.cards.t.TwoHeadedGiantOfForiys.class));
cards.add(new SetCardInfo("Underground Sea", 286, Rarity.RARE, mage.cards.u.UndergroundSea.class));
cards.add(new SetCardInfo("Unholy Strength", 132, Rarity.COMMON, mage.cards.u.UnholyStrength.class));
cards.add(new SetCardInfo("Unsummon", 87, Rarity.COMMON, mage.cards.u.Unsummon.class));
cards.add(new SetCardInfo("Uthden Troll", 182, Rarity.UNCOMMON, mage.cards.u.UthdenTroll.class));
cards.add(new SetCardInfo("Verduran Enchantress", 131, Rarity.RARE, mage.cards.v.VerduranEnchantress.class));
cards.add(new SetCardInfo("Uthden Troll", 181, Rarity.UNCOMMON, mage.cards.u.UthdenTroll.class));
cards.add(new SetCardInfo("Verduran Enchantress", 223, Rarity.RARE, mage.cards.v.VerduranEnchantress.class));
cards.add(new SetCardInfo("Vesuvan Doppelganger", 88, Rarity.RARE, mage.cards.v.VesuvanDoppelganger.class));
cards.add(new SetCardInfo("Veteran Bodyguard", 227, Rarity.RARE, mage.cards.v.VeteranBodyguard.class));
cards.add(new SetCardInfo("Veteran Bodyguard", 42, Rarity.RARE, mage.cards.v.VeteranBodyguard.class));
cards.add(new SetCardInfo("Volcanic Eruption", 89, Rarity.RARE, mage.cards.v.VolcanicEruption.class));
cards.add(new SetCardInfo("Volcanic Island", 302, Rarity.RARE, mage.cards.v.VolcanicIsland.class));
cards.add(new SetCardInfo("Volcanic Island", 287, Rarity.RARE, mage.cards.v.VolcanicIsland.class));
cards.add(new SetCardInfo("Wall of Air", 90, Rarity.UNCOMMON, mage.cards.w.WallOfAir.class));
cards.add(new SetCardInfo("Wall of Bone", 41, Rarity.UNCOMMON, mage.cards.w.WallOfBone.class));
cards.add(new SetCardInfo("Wall of Brambles", 132, Rarity.UNCOMMON, mage.cards.w.WallOfBrambles.class));
cards.add(new SetCardInfo("Wall of Fire", 183, Rarity.UNCOMMON, mage.cards.w.WallOfFire.class));
cards.add(new SetCardInfo("Wall of Ice", 133, Rarity.UNCOMMON, mage.cards.w.WallOfIce.class));
cards.add(new SetCardInfo("Wall of Stone", 184, Rarity.UNCOMMON, mage.cards.w.WallOfStone.class));
cards.add(new SetCardInfo("Wall of Swords", 228, Rarity.UNCOMMON, mage.cards.w.WallOfSwords.class));
cards.add(new SetCardInfo("Wall of Bone", 133, Rarity.UNCOMMON, mage.cards.w.WallOfBone.class));
cards.add(new SetCardInfo("Wall of Brambles", 224, Rarity.UNCOMMON, mage.cards.w.WallOfBrambles.class));
cards.add(new SetCardInfo("Wall of Fire", 182, Rarity.UNCOMMON, mage.cards.w.WallOfFire.class));
cards.add(new SetCardInfo("Wall of Ice", 225, Rarity.UNCOMMON, mage.cards.w.WallOfIce.class));
cards.add(new SetCardInfo("Wall of Stone", 183, Rarity.UNCOMMON, mage.cards.w.WallOfStone.class));
cards.add(new SetCardInfo("Wall of Swords", 43, Rarity.UNCOMMON, mage.cards.w.WallOfSwords.class));
cards.add(new SetCardInfo("Wall of Water", 91, Rarity.UNCOMMON, mage.cards.w.WallOfWater.class));
cards.add(new SetCardInfo("Wall of Wood", 134, Rarity.COMMON, mage.cards.w.WallOfWood.class));
cards.add(new SetCardInfo("Wanderlust", 135, Rarity.UNCOMMON, mage.cards.w.Wanderlust.class));
cards.add(new SetCardInfo("War Mammoth", 136, Rarity.COMMON, mage.cards.w.WarMammoth.class));
cards.add(new SetCardInfo("Warp Artifact", 42, Rarity.RARE, mage.cards.w.WarpArtifact.class));
cards.add(new SetCardInfo("Wall of Wood", 226, Rarity.COMMON, mage.cards.w.WallOfWood.class));
cards.add(new SetCardInfo("Wanderlust", 227, Rarity.UNCOMMON, mage.cards.w.Wanderlust.class));
cards.add(new SetCardInfo("War Mammoth", 228, Rarity.COMMON, mage.cards.w.WarMammoth.class));
cards.add(new SetCardInfo("Warp Artifact", 134, Rarity.RARE, mage.cards.w.WarpArtifact.class));
cards.add(new SetCardInfo("Water Elemental", 92, Rarity.UNCOMMON, mage.cards.w.WaterElemental.class));
cards.add(new SetCardInfo("Weakness", 43, Rarity.COMMON, mage.cards.w.Weakness.class));
cards.add(new SetCardInfo("Web", 137, Rarity.RARE, mage.cards.w.Web.class));
cards.add(new SetCardInfo("Wheel of Fortune", 185, Rarity.RARE, mage.cards.w.WheelOfFortune.class));
cards.add(new SetCardInfo("White Knight", 229, Rarity.UNCOMMON, mage.cards.w.WhiteKnight.class));
cards.add(new SetCardInfo("White Ward", 230, Rarity.UNCOMMON, mage.cards.w.WhiteWard.class));
cards.add(new SetCardInfo("Wild Growth", 138, Rarity.COMMON, mage.cards.w.WildGrowth.class));
cards.add(new SetCardInfo("Will-o'-the-Wisp", 44, Rarity.RARE, mage.cards.w.WillOTheWisp.class));
cards.add(new SetCardInfo("Winter Orb", 277, Rarity.RARE, mage.cards.w.WinterOrb.class));
cards.add(new SetCardInfo("Wooden Sphere", 278, Rarity.UNCOMMON, mage.cards.w.WoodenSphere.class));
cards.add(new SetCardInfo("Wrath of God", 231, Rarity.RARE, mage.cards.w.WrathOfGod.class));
cards.add(new SetCardInfo("Zombie Master", 46, Rarity.RARE, mage.cards.z.ZombieMaster.class));
cards.add(new SetCardInfo("Weakness", 135, Rarity.COMMON, mage.cards.w.Weakness.class));
cards.add(new SetCardInfo("Web", 229, Rarity.RARE, mage.cards.w.Web.class));
cards.add(new SetCardInfo("Wheel of Fortune", 184, Rarity.RARE, mage.cards.w.WheelOfFortune.class));
cards.add(new SetCardInfo("White Knight", 44, Rarity.UNCOMMON, mage.cards.w.WhiteKnight.class));
cards.add(new SetCardInfo("White Ward", 45, Rarity.UNCOMMON, mage.cards.w.WhiteWard.class));
cards.add(new SetCardInfo("Wild Growth", 230, Rarity.COMMON, mage.cards.w.WildGrowth.class));
cards.add(new SetCardInfo("Will-o'-the-Wisp", 136, Rarity.RARE, mage.cards.w.WillOTheWisp.class));
cards.add(new SetCardInfo("Winter Orb", 276, Rarity.RARE, mage.cards.w.WinterOrb.class));
cards.add(new SetCardInfo("Wooden Sphere", 277, Rarity.UNCOMMON, mage.cards.w.WoodenSphere.class));
cards.add(new SetCardInfo("Wrath of God", 46, Rarity.RARE, mage.cards.w.WrathOfGod.class));
cards.add(new SetCardInfo("Zombie Master", 138, Rarity.RARE, mage.cards.z.ZombieMaster.class));
}
}

View file

@ -61,6 +61,7 @@ public class MastersEditionIII extends ExpansionSet {
cards.add(new SetCardInfo("Anaba Ancestor", 86, Rarity.COMMON, mage.cards.a.AnabaAncestor.class));
cards.add(new SetCardInfo("Anaba Spirit Crafter", 87, Rarity.COMMON, mage.cards.a.AnabaSpiritCrafter.class));
cards.add(new SetCardInfo("Angus Mackenzie", 141, Rarity.RARE, mage.cards.a.AngusMackenzie.class));
cards.add(new SetCardInfo("Arboria", 113, Rarity.RARE, mage.cards.a.Arboria.class));
cards.add(new SetCardInfo("Arcades Sabboth", 142, Rarity.RARE, mage.cards.a.ArcadesSabboth.class));
cards.add(new SetCardInfo("Arena of the Ancients", 188, Rarity.RARE, mage.cards.a.ArenaOfTheAncients.class));
cards.add(new SetCardInfo("Ashes to Ashes", 58, Rarity.UNCOMMON, mage.cards.a.AshesToAshes.class));

View file

@ -70,8 +70,8 @@ public class MastersEditionIV extends ExpansionSet {
cards.add(new SetCardInfo("Argivian Blacksmith", 4, Rarity.UNCOMMON, mage.cards.a.ArgivianBlacksmith.class));
cards.add(new SetCardInfo("Argothian Pixies", 142, Rarity.COMMON, mage.cards.a.ArgothianPixies.class));
cards.add(new SetCardInfo("Argothian Treefolk", 143, Rarity.UNCOMMON, mage.cards.a.ArgothianTreefolk.class));
cards.add(new SetCardInfo("Armageddon", 5, Rarity.RARE, mage.cards.a.Armageddon.class));
cards.add(new SetCardInfo("Armageddon Clock", 180, Rarity.RARE, mage.cards.a.ArmageddonClock.class));
cards.add(new SetCardInfo("Armageddon", 5, Rarity.RARE, mage.cards.a.Armageddon.class));
cards.add(new SetCardInfo("Artifact Blast", 108, Rarity.COMMON, mage.cards.a.ArtifactBlast.class));
cards.add(new SetCardInfo("Ashnod's Altar", 181, Rarity.RARE, mage.cards.a.AshnodsAltar.class));
cards.add(new SetCardInfo("Atog", 109, Rarity.COMMON, mage.cards.a.Atog.class));
@ -133,9 +133,9 @@ public class MastersEditionIV extends ExpansionSet {
cards.add(new SetCardInfo("Eye for an Eye", 12, Rarity.RARE, mage.cards.e.EyeForAnEye.class));
cards.add(new SetCardInfo("False Summoning", 49, Rarity.COMMON, mage.cards.f.FalseSummoning.class));
cards.add(new SetCardInfo("Fastbond", 152, Rarity.RARE, mage.cards.f.Fastbond.class));
cards.add(new SetCardInfo("Fireball", 115, Rarity.UNCOMMON, mage.cards.f.Fireball.class));
cards.add(new SetCardInfo("Fire Imp", 113, Rarity.UNCOMMON, mage.cards.f.FireImp.class));
cards.add(new SetCardInfo("Fire Tempest", 114, Rarity.RARE, mage.cards.f.FireTempest.class));
cards.add(new SetCardInfo("Fireball", 115, Rarity.UNCOMMON, mage.cards.f.Fireball.class));
cards.add(new SetCardInfo("Floodwater Dam", 200, Rarity.RARE, mage.cards.f.FloodwaterDam.class));
cards.add(new SetCardInfo("Flying Carpet", 201, Rarity.COMMON, mage.cards.f.FlyingCarpet.class));
cards.add(new SetCardInfo("Fog", 153, Rarity.COMMON, mage.cards.f.Fog.class));
@ -165,8 +165,8 @@ public class MastersEditionIV extends ExpansionSet {
cards.add(new SetCardInfo("Horn of Deafening", 205, Rarity.UNCOMMON, mage.cards.h.HornOfDeafening.class));
cards.add(new SetCardInfo("Howl from Beyond", 87, Rarity.COMMON, mage.cards.h.HowlFromBeyond.class));
cards.add(new SetCardInfo("Icy Manipulator", 207, Rarity.UNCOMMON, mage.cards.i.IcyManipulator.class));
cards.add(new SetCardInfo("Instill Energy", 157, Rarity.UNCOMMON, mage.cards.i.InstillEnergy.class));
cards.add(new SetCardInfo("In the Eye of Chaos", 51, Rarity.RARE, mage.cards.i.InTheEyeOfChaos.class));
cards.add(new SetCardInfo("Instill Energy", 157, Rarity.UNCOMMON, mage.cards.i.InstillEnergy.class));
cards.add(new SetCardInfo("Ironhoof Ox", 158, Rarity.COMMON, mage.cards.i.IronhoofOx.class));
cards.add(new SetCardInfo("Island Sanctuary", 15, Rarity.RARE, mage.cards.i.IslandSanctuary.class));
cards.add(new SetCardInfo("Jade Monolith", 208, Rarity.RARE, mage.cards.j.JadeMonolith.class));
@ -227,8 +227,8 @@ public class MastersEditionIV extends ExpansionSet {
cards.add(new SetCardInfo("Rock Hydra", 133, Rarity.RARE, mage.cards.r.RockHydra.class));
cards.add(new SetCardInfo("Rockslide Ambush", 134, Rarity.COMMON, mage.cards.r.RockslideAmbush.class));
cards.add(new SetCardInfo("Sandstorm", 164, Rarity.COMMON, mage.cards.s.Sandstorm.class));
cards.add(new SetCardInfo("Savannah", 250, Rarity.RARE, mage.cards.s.Savannah.class));
cards.add(new SetCardInfo("Savannah Lions", 24, Rarity.UNCOMMON, mage.cards.s.SavannahLions.class));
cards.add(new SetCardInfo("Savannah", 250, Rarity.RARE, mage.cards.s.Savannah.class));
cards.add(new SetCardInfo("Scarwood Bandits", 165, Rarity.RARE, mage.cards.s.ScarwoodBandits.class));
cards.add(new SetCardInfo("Scavenger Folk", 166, Rarity.COMMON, mage.cards.s.ScavengerFolk.class));
cards.add(new SetCardInfo("Scavenging Ghoul", 95, Rarity.UNCOMMON, mage.cards.s.ScavengingGhoul.class));
@ -244,10 +244,9 @@ public class MastersEditionIV extends ExpansionSet {
cards.add(new SetCardInfo("Sinkhole", 97, Rarity.RARE, mage.cards.s.Sinkhole.class));
cards.add(new SetCardInfo("Sleight of Hand", 62, Rarity.COMMON, mage.cards.s.SleightOfHand.class));
cards.add(new SetCardInfo("Smoke", 137, Rarity.RARE, mage.cards.s.Smoke.class));
cards.add(new SetCardInfo("Soldevi Golem", 228, Rarity.UNCOMMON, mage.cards.s.SoldeviGolem.class));
cards.add(new SetCardInfo("Soldevi Machinist", 63, Rarity.UNCOMMON, mage.cards.s.SoldeviMachinist.class));
cards.add(new SetCardInfo("Sol Ring", 227, Rarity.RARE, mage.cards.s.SolRing.class));
cards.add(new SetCardInfo("Soldevi Golem", 228, Rarity.UNCOMMON, mage.cards.s.SoldeviGolem.class));
cards.add(new SetCardInfo("Soldevi Machinist", 63, Rarity.UNCOMMON, mage.cards.s.SoldeviMachinist.class));
cards.add(new SetCardInfo("Soul Shred", 98, Rarity.COMMON, mage.cards.s.SoulShred.class));
cards.add(new SetCardInfo("Southern Elephant", 167, Rarity.COMMON, mage.cards.s.SouthernElephant.class));
cards.add(new SetCardInfo("Spotted Griffin", 28, Rarity.COMMON, mage.cards.s.SpottedGriffin.class));
@ -280,10 +279,19 @@ public class MastersEditionIV extends ExpansionSet {
cards.add(new SetCardInfo("Two-Headed Giant of Foriys", 139, Rarity.UNCOMMON, mage.cards.t.TwoHeadedGiantOfForiys.class));
cards.add(new SetCardInfo("Underground Sea", 256, Rarity.RARE, mage.cards.u.UndergroundSea.class));
cards.add(new SetCardInfo("Urza's Chalice", 236, Rarity.COMMON, mage.cards.u.UrzasChalice.class));
cards.add(new SetCardInfo("Urza's Mine", 257, Rarity.LAND, mage.cards.u.UrzasMine.class));
cards.add(new SetCardInfo("Urza's Mine", "257a", Rarity.LAND, mage.cards.u.UrzasMine.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Urza's Mine", "257b", Rarity.LAND, mage.cards.u.UrzasMine.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Urza's Mine", "257c", Rarity.LAND, mage.cards.u.UrzasMine.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Urza's Mine", "257d", Rarity.LAND, mage.cards.u.UrzasMine.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Urza's Miter", 237, Rarity.RARE, mage.cards.u.UrzasMiter.class));
cards.add(new SetCardInfo("Urza's Power Plant", 258, Rarity.LAND, mage.cards.u.UrzasPowerPlant.class));
cards.add(new SetCardInfo("Urza's Tower", 259, Rarity.LAND, mage.cards.u.UrzasTower.class));
cards.add(new SetCardInfo("Urza's Power Plant", "258a", Rarity.LAND, mage.cards.u.UrzasPowerPlant.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Urza's Power Plant", "258b", Rarity.LAND, mage.cards.u.UrzasPowerPlant.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Urza's Power Plant", "258c", Rarity.LAND, mage.cards.u.UrzasPowerPlant.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Urza's Power Plant", "258d", Rarity.LAND, mage.cards.u.UrzasPowerPlant.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Urza's Tower", "259a", Rarity.LAND, mage.cards.u.UrzasTower.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Urza's Tower", "259b", Rarity.LAND, mage.cards.u.UrzasTower.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Urza's Tower", "259c", Rarity.LAND, mage.cards.u.UrzasTower.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Urza's Tower", "259d", Rarity.LAND, mage.cards.u.UrzasTower.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Veteran Bodyguard", 32, Rarity.RARE, mage.cards.v.VeteranBodyguard.class));
cards.add(new SetCardInfo("Vibrating Sphere", 238, Rarity.RARE, mage.cards.v.VibratingSphere.class));
cards.add(new SetCardInfo("Volcanic Island", 260, Rarity.RARE, mage.cards.v.VolcanicIsland.class));

View file

@ -0,0 +1,62 @@
/*
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
package mage.sets;
import mage.cards.ExpansionSet;
import mage.constants.Rarity;
import mage.constants.SetType;
/**
*
* @author JayDi85
*/
public class ProTourPromos extends ExpansionSet {
private static final ProTourPromos instance = new ProTourPromos();
public static ProTourPromos getInstance() {
return instance;
}
private ProTourPromos() {
super("Pro Tour Promos", "PPRO", ExpansionSet.buildDate(2007, 2, 9), SetType.PROMOTIONAL);
this.hasBoosters = false;
this.hasBasicLands = false;
// https://mtg.gamepedia.com/Promotional_cards#Pro_tour_cards
cards.add(new SetCardInfo("Ajani Goldmane", 2011, Rarity.MYTHIC, mage.cards.a.AjaniGoldmane.class));
cards.add(new SetCardInfo("Avatar of Woe", 2010, Rarity.RARE, mage.cards.a.AvatarOfWoe.class));
cards.add(new SetCardInfo("Emrakul, the Aeons Torn", 2017, Rarity.MYTHIC, mage.cards.e.EmrakulTheAeonsTorn.class));
cards.add(new SetCardInfo("Eternal Dragon", 2007, Rarity.RARE, mage.cards.e.EternalDragon.class));
cards.add(new SetCardInfo("Liliana of the Veil", 2015, Rarity.MYTHIC, mage.cards.l.LilianaOfTheVeil.class));
cards.add(new SetCardInfo("Mirari's Wake", 2008, Rarity.RARE, mage.cards.m.MirarisWake.class));
cards.add(new SetCardInfo("Noble Hierarch", 2018, Rarity.RARE, mage.cards.n.NobleHierarch.class));
cards.add(new SetCardInfo("Snapcaster Mage", 2016, Rarity.MYTHIC, mage.cards.s.SnapcasterMage.class));
cards.add(new SetCardInfo("Treva, the Renewer", 2009, Rarity.RARE, mage.cards.t.TrevaTheRenewer.class));
}
}

View file

@ -1,63 +1,65 @@
/*
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
package mage.sets;
import mage.cards.ExpansionSet;
import mage.constants.Rarity;
import mage.constants.SetType;
/**
*
* @author fireshoes
*/
public class RivalsOfIxalan extends ExpansionSet {
private static final RivalsOfIxalan instance = new RivalsOfIxalan();
public static RivalsOfIxalan getInstance() {
return instance;
}
private RivalsOfIxalan() {
super("Rivals of Ixalan", "RIX", ExpansionSet.buildDate(2018, 1, 19), SetType.EXPANSION);
this.blockName = "Ixalan";
this.parentSet = Ixalan.getInstance();
this.hasBoosters = true;
this.hasBasicLands = false;
this.numBoosterLands = 1;
this.numBoosterCommon = 11;
this.numBoosterUncommon = 3;
this.numBoosterRare = 1;
this.ratioBoosterMythic = 8;
cards.add(new SetCardInfo("Ghalta, Primal Hunger", 130, Rarity.RARE, mage.cards.g.GhaltaPrimalHunger.class));
cards.add(new SetCardInfo("Silvergill Adept", 53, Rarity.UNCOMMON, mage.cards.s.SilvergillAdept.class));
cards.add(new SetCardInfo("Storm the Vault", 173, Rarity.RARE, mage.cards.s.StormTheVault.class));
cards.add(new SetCardInfo("Vault of Catlacan", 173, Rarity.RARE, mage.cards.v.VaultOfCatlacan.class));
}
}
/*
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
package mage.sets;
import mage.cards.ExpansionSet;
import mage.constants.Rarity;
import mage.constants.SetType;
/**
*
* @author fireshoes
*/
public class RivalsOfIxalan extends ExpansionSet {
private static final RivalsOfIxalan instance = new RivalsOfIxalan();
public static RivalsOfIxalan getInstance() {
return instance;
}
private RivalsOfIxalan() {
super("Rivals of Ixalan", "RIX", ExpansionSet.buildDate(2018, 1, 19), SetType.EXPANSION);
this.blockName = "Ixalan";
this.parentSet = Ixalan.getInstance();
this.hasBoosters = true;
this.hasBasicLands = false;
this.numBoosterLands = 1;
this.numBoosterCommon = 11;
this.numBoosterUncommon = 3;
this.numBoosterRare = 1;
this.ratioBoosterMythic = 8;
cards.add(new SetCardInfo("Brass's Bounty", 94, Rarity.RARE, mage.cards.b.BrasssBounty.class));
cards.add(new SetCardInfo("Ghalta, Primal Hunger", 130, Rarity.RARE, mage.cards.g.GhaltaPrimalHunger.class));
cards.add(new SetCardInfo("Silvergill Adept", 53, Rarity.UNCOMMON, mage.cards.s.SilvergillAdept.class));
cards.add(new SetCardInfo("Storm the Vault", 173, Rarity.RARE, mage.cards.s.StormTheVault.class));
cards.add(new SetCardInfo("Vault of Catlacan", 173, Rarity.RARE, mage.cards.v.VaultOfCatlacan.class));
cards.add(new SetCardInfo("Vona's Hunger", 90, Rarity.RARE, mage.cards.v.VonasHunger.class));
}
}

View file

@ -53,6 +53,7 @@ public class StarWars extends ExpansionSet {
this.numBoosterUncommon = 3;
this.numBoosterRare = 1;
this.ratioBoosterMythic = 8;
cards.add(new SetCardInfo("A-Wing", 96, Rarity.UNCOMMON, mage.cards.a.AWing.class));
cards.add(new SetCardInfo("AAT-1", 160, Rarity.UNCOMMON, mage.cards.a.AAT1.class));
cards.add(new SetCardInfo("Acklay of the Arena", 161, Rarity.RARE, mage.cards.a.AcklayOfTheArena.class));
cards.add(new SetCardInfo("Acquire Target", 65, Rarity.COMMON, mage.cards.a.AcquireTarget.class));
@ -66,7 +67,6 @@ public class StarWars extends ExpansionSet {
cards.add(new SetCardInfo("Asajj Ventress", 164, Rarity.RARE, mage.cards.a.AsajjVentress.class));
cards.add(new SetCardInfo("AT-ST", 128, Rarity.RARE, mage.cards.a.ATST.class));
cards.add(new SetCardInfo("Aurra Sing, Bane of Jedi", 165, Rarity.MYTHIC, mage.cards.a.AurraSingBaneOfJedi.class));
cards.add(new SetCardInfo("A-Wing", 96, Rarity.UNCOMMON, mage.cards.a.AWing.class));
cards.add(new SetCardInfo("Bantha Herd", 3, Rarity.RARE, mage.cards.b.BanthaHerd.class));
cards.add(new SetCardInfo("Bathe in Bacta", 129, Rarity.COMMON, mage.cards.b.BatheInBacta.class));
cards.add(new SetCardInfo("Battle Tactics", 5, Rarity.UNCOMMON, mage.cards.b.BattleTactics.class));
@ -96,7 +96,7 @@ public class StarWars extends ExpansionSet {
cards.add(new SetCardInfo("Dark Apprenticeship", 101, Rarity.UNCOMMON, mage.cards.d.DarkApprenticeship.class));
cards.add(new SetCardInfo("Dark Decision", 177, Rarity.COMMON, mage.cards.d.DarkDecision.class));
cards.add(new SetCardInfo("Dark Trooper", 231, Rarity.UNCOMMON, mage.cards.d.DarkTrooper.class));
cards.add(new SetCardInfo("Darth Maul", 170, Rarity.RARE, mage.cards.d.DarthMaul.class));
cards.add(new SetCardInfo("Darth Maul", 178, Rarity.RARE, mage.cards.d.DarthMaul.class));
cards.add(new SetCardInfo("Darth Sidious, Sith Lord", 179, Rarity.MYTHIC, mage.cards.d.DarthSidiousSithLord.class));
cards.add(new SetCardInfo("Darth Tyranus", 180, Rarity.MYTHIC, mage.cards.d.DarthTyranus.class));
cards.add(new SetCardInfo("Darth Vader", 140, Rarity.MYTHIC, mage.cards.d.DarthVader.class));
@ -173,7 +173,7 @@ public class StarWars extends ExpansionSet {
cards.add(new SetCardInfo("Jedi Enclave", 243, Rarity.COMMON, mage.cards.j.JediEnclave.class));
cards.add(new SetCardInfo("Jedi Holocron", 233, Rarity.COMMON, mage.cards.j.JediHolocron.class));
cards.add(new SetCardInfo("Jedi Inquirer", 17, Rarity.COMMON, mage.cards.j.JediInquirer.class));
cards.add(new SetCardInfo("Jedi Instructor", 17, Rarity.COMMON, mage.cards.j.JediInstructor.class));
cards.add(new SetCardInfo("Jedi Instructor", 18, Rarity.COMMON, mage.cards.j.JediInstructor.class));
cards.add(new SetCardInfo("Jedi Knight", 193, Rarity.UNCOMMON, mage.cards.j.JediKnight.class));
cards.add(new SetCardInfo("Jedi Mind Trick", 44, Rarity.RARE, mage.cards.j.JediMindTrick.class));
cards.add(new SetCardInfo("Jedi Sentinel", 194, Rarity.COMMON, mage.cards.j.JediSentinel.class));
@ -312,8 +312,8 @@ public class StarWars extends ExpansionSet {
cards.add(new SetCardInfo("Underworld Slums", 251, Rarity.COMMON, mage.cards.u.UnderworldSlums.class));
cards.add(new SetCardInfo("Unity of the Droids", 220, Rarity.UNCOMMON, mage.cards.u.UnityOfTheDroids.class));
cards.add(new SetCardInfo("Unruly Sureshot", 95, Rarity.UNCOMMON, mage.cards.u.UnrulySureshot.class));
cards.add(new SetCardInfo("Vapor Snag", 62, Rarity.COMMON, mage.cards.v.VaporSnag.class));
cards.add(new SetCardInfo("V-Wing", 126, Rarity.COMMON, mage.cards.v.VWing.class));
cards.add(new SetCardInfo("Vapor Snag", 62, Rarity.COMMON, mage.cards.v.VaporSnag.class));
cards.add(new SetCardInfo("Weequay Beastmaster", 127, Rarity.UNCOMMON, mage.cards.w.WeequayBeastmaster.class));
cards.add(new SetCardInfo("Wild Holocron", 238, Rarity.COMMON, mage.cards.w.WildHolocron.class));
cards.add(new SetCardInfo("Wisdom of the Jedi", 221, Rarity.UNCOMMON, mage.cards.w.WisdomOfTheJedi.class));
@ -322,8 +322,8 @@ public class StarWars extends ExpansionSet {
cards.add(new SetCardInfo("Wookiee Mystic", 222, Rarity.UNCOMMON, mage.cards.w.WookieeMystic.class));
cards.add(new SetCardInfo("Wookiee Raidleader", 229, Rarity.COMMON, mage.cards.w.WookieeRaidleader.class));
cards.add(new SetCardInfo("X-Wing", 33, Rarity.COMMON, mage.cards.x.XWing.class));
cards.add(new SetCardInfo("Yoda, Jedi Master", 223, Rarity.MYTHIC, mage.cards.y.YodaJediMaster.class));
cards.add(new SetCardInfo("Y-Wing", 63, Rarity.UNCOMMON, mage.cards.y.YWing.class));
cards.add(new SetCardInfo("Yoda, Jedi Master", 223, Rarity.MYTHIC, mage.cards.y.YodaJediMaster.class));
cards.add(new SetCardInfo("Zam Wesell", 64, Rarity.RARE, mage.cards.z.ZamWesell.class));
}

View file

@ -58,60 +58,62 @@ public class Starter2000 extends ExpansionSet {
this.numBoosterRare = 1;
this.ratioBoosterMythic = 0;
cards.add(new SetCardInfo("Angelic Blessing", 1, Rarity.COMMON, mage.cards.a.AngelicBlessing.class));
cards.add(new SetCardInfo("Armored Pegasus", 101, Rarity.COMMON, mage.cards.a.ArmoredPegasus.class));
cards.add(new SetCardInfo("Bog Imp", 116, Rarity.COMMON, mage.cards.b.BogImp.class));
cards.add(new SetCardInfo("Breath of Life", 2, Rarity.UNCOMMON, mage.cards.b.BreathOfLife.class));
cards.add(new SetCardInfo("Coercion", 118, Rarity.COMMON, mage.cards.c.Coercion.class));
cards.add(new SetCardInfo("Counterspell", 24, Rarity.COMMON, mage.cards.c.Counterspell.class));
cards.add(new SetCardInfo("Disenchant", 102, Rarity.COMMON, mage.cards.d.Disenchant.class));
cards.add(new SetCardInfo("Durkwood Boars", 3, Rarity.COMMON, mage.cards.d.DurkwoodBoars.class));
cards.add(new SetCardInfo("Eager Cadet", 4, Rarity.COMMON, mage.cards.e.EagerCadet.class));
cards.add(new SetCardInfo("Flame Spirit", 179, Rarity.COMMON, mage.cards.f.FlameSpirit.class));
cards.add(new SetCardInfo("Flight", 103, Rarity.COMMON, mage.cards.f.Flight.class));
cards.add(new SetCardInfo("Forest", 262, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Forest", 263, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Giant Growth", 125, Rarity.COMMON, mage.cards.g.GiantGrowth.class));
cards.add(new SetCardInfo("Giant Octopus", 5, Rarity.COMMON, mage.cards.g.GiantOctopus.class));
cards.add(new SetCardInfo("Goblin Hero", 103, Rarity.COMMON, mage.cards.g.GoblinHero.class));
cards.add(new SetCardInfo("Hand of Death", 6, Rarity.COMMON, mage.cards.h.HandOfDeath.class));
cards.add(new SetCardInfo("Hero's Resolve", 24, Rarity.COMMON, mage.cards.h.HerosResolve.class));
cards.add(new SetCardInfo("Inspiration", 42, Rarity.COMMON, mage.cards.i.Inspiration.class));
cards.add(new SetCardInfo("Island", 253, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Island", 254, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Armored Pegasus", 2, Rarity.COMMON, mage.cards.a.ArmoredPegasus.class));
cards.add(new SetCardInfo("Bog Imp", 22, Rarity.COMMON, mage.cards.b.BogImp.class));
cards.add(new SetCardInfo("Breath of Life", 3, Rarity.UNCOMMON, mage.cards.b.BreathOfLife.class));
cards.add(new SetCardInfo("Coercion", 23, Rarity.COMMON, mage.cards.c.Coercion.class));
cards.add(new SetCardInfo("Counterspell", 12, Rarity.COMMON, mage.cards.c.Counterspell.class));
cards.add(new SetCardInfo("Disenchant", 4, Rarity.COMMON, mage.cards.d.Disenchant.class));
cards.add(new SetCardInfo("Drudge Skeletons", 24, Rarity.COMMON, mage.cards.d.DrudgeSkeletons.class));
cards.add(new SetCardInfo("Durkwood Boars", 38, Rarity.COMMON, mage.cards.d.DurkwoodBoars.class));
cards.add(new SetCardInfo("Eager Cadet", 5, Rarity.COMMON, mage.cards.e.EagerCadet.class));
cards.add(new SetCardInfo("Flame Spirit", 29, Rarity.COMMON, mage.cards.f.FlameSpirit.class));
cards.add(new SetCardInfo("Flight", 13, Rarity.COMMON, mage.cards.f.Flight.class));
cards.add(new SetCardInfo("Forest", 49, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Forest", 50, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Giant Growth", 39, Rarity.COMMON, mage.cards.g.GiantGrowth.class));
cards.add(new SetCardInfo("Giant Octopus", 14, Rarity.COMMON, mage.cards.g.GiantOctopus.class));
cards.add(new SetCardInfo("Goblin Hero", 30, Rarity.COMMON, mage.cards.g.GoblinHero.class));
cards.add(new SetCardInfo("Hand of Death", 25, Rarity.COMMON, mage.cards.h.HandOfDeath.class));
cards.add(new SetCardInfo("Hero's Resolve", 6, Rarity.COMMON, mage.cards.h.HerosResolve.class));
cards.add(new SetCardInfo("Inspiration", 15, Rarity.COMMON, mage.cards.i.Inspiration.class));
cards.add(new SetCardInfo("Island", 51, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Island", 52, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Knight Errant", 7, Rarity.COMMON, mage.cards.k.KnightErrant.class));
cards.add(new SetCardInfo("Lava Axe", 8, Rarity.COMMON, mage.cards.l.LavaAxe.class));
cards.add(new SetCardInfo("Llanowar Elves", 182, Rarity.COMMON, mage.cards.l.LlanowarElves.class));
cards.add(new SetCardInfo("Merfolk of the Pearl Trident", 60, Rarity.COMMON, mage.cards.m.MerfolkOfThePearlTrident.class));
cards.add(new SetCardInfo("Mons's Goblin Raiders", 9, Rarity.COMMON, mage.cards.m.MonssGoblinRaiders.class));
cards.add(new SetCardInfo("Monstrous Growth", 10, Rarity.COMMON, mage.cards.m.MonstrousGrowth.class));
cards.add(new SetCardInfo("Moon Sprite", 11, Rarity.UNCOMMON, mage.cards.m.MoonSprite.class));
cards.add(new SetCardInfo("Mountain", 102, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Mountain", 103, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Obsianus Golem", 303, Rarity.UNCOMMON, mage.cards.o.ObsianusGolem.class));
cards.add(new SetCardInfo("Ogre Warrior", 12, Rarity.COMMON, mage.cards.o.OgreWarrior.class));
cards.add(new SetCardInfo("Orcish Oriflamme", 206, Rarity.UNCOMMON, mage.cards.o.OrcishOriflamme.class));
cards.add(new SetCardInfo("Plains", 275, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Plains", 276, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Prodigal Sorcerer", 29, Rarity.COMMON, mage.cards.p.ProdigalSorcerer.class));
cards.add(new SetCardInfo("Python", 150, Rarity.COMMON, mage.cards.p.Python.class));
cards.add(new SetCardInfo("Rod of Ruin", 219, Rarity.UNCOMMON, mage.cards.r.RodOfRuin.class));
cards.add(new SetCardInfo("Royal Falcon", 14, Rarity.COMMON, mage.cards.r.RoyalFalcon.class));
cards.add(new SetCardInfo("Samite Healer", 244, Rarity.COMMON, mage.cards.s.SamiteHealer.class));
cards.add(new SetCardInfo("Scathe Zombies", 175, Rarity.COMMON, mage.cards.s.ScatheZombies.class));
cards.add(new SetCardInfo("Sea Eagle", 15, Rarity.COMMON, mage.cards.s.SeaEagle.class));
cards.add(new SetCardInfo("Shock", 104, Rarity.COMMON, mage.cards.s.Shock.class));
cards.add(new SetCardInfo("Soul Net", 317, Rarity.UNCOMMON, mage.cards.s.SoulNet.class));
cards.add(new SetCardInfo("Spined Wurm", 197, Rarity.COMMON, mage.cards.s.SpinedWurm.class));
cards.add(new SetCardInfo("Stone Rain", 221, Rarity.COMMON, mage.cards.s.StoneRain.class));
cards.add(new SetCardInfo("Swamp", 135, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Swamp", 136, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Terror", 111, Rarity.COMMON, mage.cards.t.Terror.class));
cards.add(new SetCardInfo("Time Ebb", 16, Rarity.COMMON, mage.cards.t.TimeEbb.class));
cards.add(new SetCardInfo("Trained Orgg", 17, Rarity.RARE, mage.cards.t.TrainedOrgg.class));
cards.add(new SetCardInfo("Venerable Monk", 105, Rarity.COMMON, mage.cards.v.VenerableMonk.class));
cards.add(new SetCardInfo("Vizzerdrix", 18, Rarity.RARE, mage.cards.v.Vizzerdrix.class));
cards.add(new SetCardInfo("Wild Griffin", 19, Rarity.COMMON, mage.cards.w.WildGriffin.class));
cards.add(new SetCardInfo("Willow Elf", 20, Rarity.COMMON, mage.cards.w.WillowElf.class));
cards.add(new SetCardInfo("Wind Drake", 75, Rarity.COMMON, mage.cards.w.WindDrake.class));
cards.add(new SetCardInfo("Lava Axe", 31, Rarity.COMMON, mage.cards.l.LavaAxe.class));
cards.add(new SetCardInfo("Llanowar Elves", 40, Rarity.COMMON, mage.cards.l.LlanowarElves.class));
cards.add(new SetCardInfo("Merfolk of the Pearl Trident", 16, Rarity.COMMON, mage.cards.m.MerfolkOfThePearlTrident.class));
cards.add(new SetCardInfo("Mons's Goblin Raiders", 32, Rarity.COMMON, mage.cards.m.MonssGoblinRaiders.class));
cards.add(new SetCardInfo("Monstrous Growth", 41, Rarity.COMMON, mage.cards.m.MonstrousGrowth.class));
cards.add(new SetCardInfo("Moon Sprite", 42, Rarity.UNCOMMON, mage.cards.m.MoonSprite.class));
cards.add(new SetCardInfo("Mountain", 53, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Mountain", 54, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Obsianus Golem", 46, Rarity.UNCOMMON, mage.cards.o.ObsianusGolem.class));
cards.add(new SetCardInfo("Ogre Warrior", 33, Rarity.COMMON, mage.cards.o.OgreWarrior.class));
cards.add(new SetCardInfo("Orcish Oriflamme", 34, Rarity.UNCOMMON, mage.cards.o.OrcishOriflamme.class));
cards.add(new SetCardInfo("Plains", 55, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Plains", 56, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Prodigal Sorcerer", 17, Rarity.COMMON, mage.cards.p.ProdigalSorcerer.class));
cards.add(new SetCardInfo("Python", 26, Rarity.COMMON, mage.cards.p.Python.class));
cards.add(new SetCardInfo("Rhox", 43, Rarity.RARE, mage.cards.r.Rhox.class));
cards.add(new SetCardInfo("Rod of Ruin", 47, Rarity.UNCOMMON, mage.cards.r.RodOfRuin.class));
cards.add(new SetCardInfo("Royal Falcon", 8, Rarity.COMMON, mage.cards.r.RoyalFalcon.class));
cards.add(new SetCardInfo("Samite Healer", 9, Rarity.COMMON, mage.cards.s.SamiteHealer.class));
cards.add(new SetCardInfo("Scathe Zombies", 27, Rarity.COMMON, mage.cards.s.ScatheZombies.class));
cards.add(new SetCardInfo("Sea Eagle", 18, Rarity.COMMON, mage.cards.s.SeaEagle.class));
cards.add(new SetCardInfo("Shock", 35, Rarity.COMMON, mage.cards.s.Shock.class));
cards.add(new SetCardInfo("Soul Net", 48, Rarity.UNCOMMON, mage.cards.s.SoulNet.class));
cards.add(new SetCardInfo("Spined Wurm", 44, Rarity.COMMON, mage.cards.s.SpinedWurm.class));
cards.add(new SetCardInfo("Stone Rain", 36, Rarity.COMMON, mage.cards.s.StoneRain.class));
cards.add(new SetCardInfo("Swamp", 57, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Swamp", 58, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Terror", 28, Rarity.COMMON, mage.cards.t.Terror.class));
cards.add(new SetCardInfo("Time Ebb", 19, Rarity.COMMON, mage.cards.t.TimeEbb.class));
cards.add(new SetCardInfo("Trained Orgg", 37, Rarity.RARE, mage.cards.t.TrainedOrgg.class));
cards.add(new SetCardInfo("Venerable Monk", 10, Rarity.COMMON, mage.cards.v.VenerableMonk.class));
cards.add(new SetCardInfo("Vizzerdrix", 20, Rarity.RARE, mage.cards.v.Vizzerdrix.class));
cards.add(new SetCardInfo("Wild Griffin", 11, Rarity.COMMON, mage.cards.w.WildGriffin.class));
cards.add(new SetCardInfo("Willow Elf", 45, Rarity.COMMON, mage.cards.w.WillowElf.class));
cards.add(new SetCardInfo("Wind Drake", 21, Rarity.COMMON, mage.cards.w.WindDrake.class));
}
}

View file

@ -59,8 +59,8 @@ public class TempestRemastered extends ExpansionSet {
cards.add(new SetCardInfo("Angelic Blessing", 1, Rarity.COMMON, mage.cards.a.AngelicBlessing.class));
cards.add(new SetCardInfo("Angelic Protector", 2, Rarity.UNCOMMON, mage.cards.a.AngelicProtector.class));
cards.add(new SetCardInfo("Anoint", 3, Rarity.COMMON, mage.cards.a.Anoint.class));
cards.add(new SetCardInfo("Armored Pegasus", 5, Rarity.COMMON, mage.cards.a.ArmoredPegasus.class));
cards.add(new SetCardInfo("Armor Sliver", 4, Rarity.COMMON, mage.cards.a.ArmorSliver.class));
cards.add(new SetCardInfo("Armored Pegasus", 5, Rarity.COMMON, mage.cards.a.ArmoredPegasus.class));
cards.add(new SetCardInfo("Avenging Angel", 6, Rarity.UNCOMMON, mage.cards.a.AvengingAngel.class));
cards.add(new SetCardInfo("Bandage", 7, Rarity.COMMON, mage.cards.b.Bandage.class));
cards.add(new SetCardInfo("Barbed Sliver", 126, Rarity.COMMON, mage.cards.b.BarbedSliver.class));
@ -101,8 +101,8 @@ public class TempestRemastered extends ExpansionSet {
cards.add(new SetCardInfo("Dauthi Warlord", 98, Rarity.UNCOMMON, mage.cards.d.DauthiWarlord.class));
cards.add(new SetCardInfo("Deadshot", 129, Rarity.UNCOMMON, mage.cards.d.Deadshot.class));
cards.add(new SetCardInfo("Death Pits of Rath", 99, Rarity.RARE, mage.cards.d.DeathPitsOfRath.class));
cards.add(new SetCardInfo("Death's Duet", 101, Rarity.COMMON, mage.cards.d.DeathsDuet.class));
cards.add(new SetCardInfo("Death Stroke", 100, Rarity.COMMON, mage.cards.d.DeathStroke.class));
cards.add(new SetCardInfo("Death's Duet", 101, Rarity.COMMON, mage.cards.d.DeathsDuet.class));
cards.add(new SetCardInfo("Diabolic Edict", 102, Rarity.COMMON, mage.cards.d.DiabolicEdict.class));
cards.add(new SetCardInfo("Disenchant", 11, Rarity.COMMON, mage.cards.d.Disenchant.class));
cards.add(new SetCardInfo("Dismiss", 45, Rarity.UNCOMMON, mage.cards.d.Dismiss.class));
@ -159,7 +159,7 @@ public class TempestRemastered extends ExpansionSet {
cards.add(new SetCardInfo("Kor Chant", 17, Rarity.UNCOMMON, mage.cards.k.KorChant.class));
cards.add(new SetCardInfo("Krakilin", 177, Rarity.RARE, mage.cards.k.Krakilin.class));
cards.add(new SetCardInfo("Lab Rats", 108, Rarity.COMMON, mage.cards.l.LabRats.class));
cards.add(new SetCardInfo("Legacy's Allure", 57, Rarity.RARE, mage.cards.l.LegacysAllure.class));
cards.add(new SetCardInfo("Legacy's Allure", 56, Rarity.RARE, mage.cards.l.LegacysAllure.class));
cards.add(new SetCardInfo("Legerdemain", 57, Rarity.UNCOMMON, mage.cards.l.Legerdemain.class));
cards.add(new SetCardInfo("Lightning Blast", 138, Rarity.COMMON, mage.cards.l.LightningBlast.class));
cards.add(new SetCardInfo("Living Death", 109, Rarity.MYTHIC, mage.cards.l.LivingDeath.class));
@ -168,8 +168,8 @@ public class TempestRemastered extends ExpansionSet {
cards.add(new SetCardInfo("Lowland Giant", 139, Rarity.COMMON, mage.cards.l.LowlandGiant.class));
cards.add(new SetCardInfo("Mage il-Vec", 140, Rarity.UNCOMMON, mage.cards.m.MageIlVec.class));
cards.add(new SetCardInfo("Magmasaur", 141, Rarity.RARE, mage.cards.m.Magmasaur.class));
cards.add(new SetCardInfo("Manabond", 179, Rarity.RARE, mage.cards.m.Manabond.class));
cards.add(new SetCardInfo("Mana Leak", 58, Rarity.COMMON, mage.cards.m.ManaLeak.class));
cards.add(new SetCardInfo("Manabond", 179, Rarity.RARE, mage.cards.m.Manabond.class));
cards.add(new SetCardInfo("Maniacal Rage", 142, Rarity.COMMON, mage.cards.m.ManiacalRage.class));
cards.add(new SetCardInfo("Master Decoy", 18, Rarity.COMMON, mage.cards.m.MasterDecoy.class));
cards.add(new SetCardInfo("Mawcor", 59, Rarity.RARE, mage.cards.m.Mawcor.class));

View file

@ -68,6 +68,7 @@ public class Unstable extends ExpansionSet {
cards.add(new SetCardInfo("Lobe Lobber", 153, Rarity.UNCOMMON, mage.cards.l.LobeLobber.class));
cards.add(new SetCardInfo("Mad Science Fair Project", 154, Rarity.COMMON, mage.cards.m.MadScienceFairProject.class));
cards.add(new SetCardInfo("Mountain", 215, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(FrameStyle.UNH_FULL_ART_BASIC, false)));
cards.add(new SetCardInfo("Oddly Uneven", 15, Rarity.RARE, mage.cards.o.OddlyUneven.class));
cards.add(new SetCardInfo("Painiac", 91, Rarity.COMMON, mage.cards.p.Painiac.class));
cards.add(new SetCardInfo("Plains", 212, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(FrameStyle.UNH_FULL_ART_BASIC, false)));
cards.add(new SetCardInfo("Snickering Squirrel", 68, Rarity.COMMON, mage.cards.s.SnickeringSquirrel.class));
@ -79,5 +80,6 @@ public class Unstable extends ExpansionSet {
cards.add(new SetCardInfo("Target Minotaur", 98, Rarity.COMMON, mage.cards.t.TargetMinotaur.class));
cards.add(new SetCardInfo("Time Out", 48, Rarity.COMMON, mage.cards.t.TimeOut.class));
cards.add(new SetCardInfo("Willing Test Subject", 126, Rarity.COMMON, mage.cards.w.WillingTestSubject.class));
cards.add(new SetCardInfo("capital offense", 52, Rarity.COMMON, mage.cards.c.CapitalOffense.class));
}
}

View file

@ -55,8 +55,8 @@ public class UrzasLegacy extends ExpansionSet {
this.numBoosterRare = 1;
this.ratioBoosterMythic = 0;
cards.add(new SetCardInfo("About Face", 73, Rarity.COMMON, mage.cards.a.AboutFace.class));
cards.add(new SetCardInfo("Angelic Curator", 1, Rarity.COMMON, mage.cards.a.AngelicCurator.class));
cards.add(new SetCardInfo("Angel's Trumpet", 121, Rarity.UNCOMMON, mage.cards.a.AngelsTrumpet.class));
cards.add(new SetCardInfo("Angelic Curator", 1, Rarity.COMMON, mage.cards.a.AngelicCurator.class));
cards.add(new SetCardInfo("Anthroplasm", 25, Rarity.RARE, mage.cards.a.Anthroplasm.class));
cards.add(new SetCardInfo("Archivist", 26, Rarity.RARE, mage.cards.a.Archivist.class));
cards.add(new SetCardInfo("Aura Flux", 27, Rarity.COMMON, mage.cards.a.AuraFlux.class));
@ -120,10 +120,9 @@ public class UrzasLegacy extends ExpansionSet {
cards.add(new SetCardInfo("Miscalculation", 36, Rarity.COMMON, mage.cards.m.Miscalculation.class));
cards.add(new SetCardInfo("Molten Hydra", 85, Rarity.RARE, mage.cards.m.MoltenHydra.class));
cards.add(new SetCardInfo("Mother of Runes", 14, Rarity.UNCOMMON, mage.cards.m.MotherOfRunes.class));
cards.add(new SetCardInfo("Multani's Presence", 109, Rarity.UNCOMMON, mage.cards.m.MultanisPresence.class));
cards.add(new SetCardInfo("Multani, Maro-Sorcerer", 107, Rarity.RARE, mage.cards.m.MultaniMaroSorcerer.class));
cards.add(new SetCardInfo("Multani's Acolyte", 108, Rarity.COMMON, mage.cards.m.MultanisAcolyte.class));
cards.add(new SetCardInfo("Multani's Presence", 109, Rarity.UNCOMMON, mage.cards.m.MultanisPresence.class));
cards.add(new SetCardInfo("Multani, Maro-Sorcerer", 107, Rarity.RARE, mage.cards.m.MultaniMaroSorcerer.class));
cards.add(new SetCardInfo("No Mercy", 56, Rarity.RARE, mage.cards.n.NoMercy.class));
cards.add(new SetCardInfo("Opal Champion", 16, Rarity.COMMON, mage.cards.o.OpalChampion.class));
cards.add(new SetCardInfo("Opportunity", 37, Rarity.UNCOMMON, mage.cards.o.Opportunity.class));
@ -144,9 +143,9 @@ public class UrzasLegacy extends ExpansionSet {
cards.add(new SetCardInfo("Pyromancy", 88, Rarity.RARE, mage.cards.p.Pyromancy.class));
cards.add(new SetCardInfo("Quicksilver Amulet", 130, Rarity.RARE, mage.cards.q.QuicksilverAmulet.class));
cards.add(new SetCardInfo("Rack and Ruin", 89, Rarity.UNCOMMON, mage.cards.r.RackAndRuin.class));
cards.add(new SetCardInfo("Radiant, Archangel", 20, Rarity.RARE, mage.cards.r.RadiantArchangel.class));
cards.add(new SetCardInfo("Radiant's Dragoons", 21, Rarity.UNCOMMON, mage.cards.r.RadiantsDragoons.class));
cards.add(new SetCardInfo("Radiant's Judgment", 22, Rarity.COMMON, mage.cards.r.RadiantsJudgment.class));
cards.add(new SetCardInfo("Radiant, Archangel", 20, Rarity.RARE, mage.cards.r.RadiantArchangel.class));
cards.add(new SetCardInfo("Rancor", 110, Rarity.COMMON, mage.cards.r.Rancor.class));
cards.add(new SetCardInfo("Rank and File", 65, Rarity.UNCOMMON, mage.cards.r.RankAndFile.class));
cards.add(new SetCardInfo("Raven Familiar", 39, Rarity.UNCOMMON, mage.cards.r.RavenFamiliar.class));

View file

@ -47,13 +47,12 @@ public class WorldMagicCupQualifier extends ExpansionSet {
super("World Magic Cup Qualifier", "WMCQ", ExpansionSet.buildDate(2011, 6, 17), SetType.PROMOTIONAL);
this.hasBoosters = false;
this.hasBasicLands = false;
cards.add(new SetCardInfo("Abrupt Decay", 6, Rarity.RARE, mage.cards.a.AbruptDecay.class));
cards.add(new SetCardInfo("Geist of Saint Traft", 2, Rarity.MYTHIC, mage.cards.g.GeistOfSaintTraft.class));
cards.add(new SetCardInfo("Inkmoth Nexus", 6, Rarity.SPECIAL, mage.cards.i.InkmothNexus.class));
cards.add(new SetCardInfo("Liliana of the Veil", 4, Rarity.MYTHIC, mage.cards.l.LilianaOfTheVeil.class));
cards.add(new SetCardInfo("Snapcaster Mage", 5, Rarity.RARE, mage.cards.s.SnapcasterMage.class));
cards.add(new SetCardInfo("Thalia, Guardian of Thraben", 3, Rarity.RARE, mage.cards.t.ThaliaGuardianOfThraben.class));
cards.add(new SetCardInfo("Vengevine", 1, Rarity.MYTHIC, mage.cards.v.Vengevine.class));
// https://mtg.gamepedia.com/World_Magic_Cup_Qualifiers
cards.add(new SetCardInfo("Abrupt Decay", 2016, Rarity.RARE, mage.cards.a.AbruptDecay.class));
cards.add(new SetCardInfo("Geist of Saint Traft", 2014, Rarity.MYTHIC, mage.cards.g.GeistOfSaintTraft.class));
cards.add(new SetCardInfo("Inkmoth Nexus", 2017, Rarity.SPECIAL, mage.cards.i.InkmothNexus.class));
cards.add(new SetCardInfo("Thalia, Guardian of Thraben", 2015, Rarity.RARE, mage.cards.t.ThaliaGuardianOfThraben.class));
cards.add(new SetCardInfo("Vengevine", 2013, Rarity.MYTHIC, mage.cards.v.Vengevine.class));
}
}

View file

@ -49,6 +49,8 @@ import mage.choices.Choice;
import mage.constants.*;
import mage.counters.Counter;
import mage.counters.Counters;
import mage.designations.Designation;
import mage.designations.DesignationType;
import mage.filter.Filter;
import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
@ -1835,7 +1837,6 @@ public class TestPlayer implements Player {
return computerPlayer.rollDice(game, appliedEffects, numSides);
}
@Override
public List<Permanent> getAvailableAttackers(Game game) {
return computerPlayer.getAvailableAttackers(game);
@ -2301,6 +2302,21 @@ public class TestPlayer implements Player {
return computerPlayer.moveCards(cards, toZone, source, game, tapped, faceDown, byOwner, appliedEffects);
}
@Override
public boolean hasDesignation(DesignationType designationName) {
return computerPlayer.hasDesignation(designationName);
}
@Override
public void addDesignation(Designation designation) {
computerPlayer.addDesignation(designation);
}
@Override
public List<Designation> getDesignations() {
return computerPlayer.getDesignations();
}
public void setAIPlayer(boolean AIPlayer) {
this.AIPlayer = AIPlayer;
}

View file

@ -217,7 +217,7 @@ public class DeckValidatorTest extends CardTestPlayerBase {
Assert.assertFalse("Counterspell not allowed in modern", testDeckValid(new Modern(), deckList));
deckList.clear();
deckList.add(new CardNameAmount("S00", 24, 4));
deckList.add(new CardNameAmount("S00", 12, 4));
deckList.add(new CardNameAmount("Mountain", 56));
Assert.assertFalse("Counterspell not allowed in modern", testDeckValid(new Modern(), deckList));

View file

@ -45,6 +45,8 @@ import mage.choices.Choice;
import mage.constants.*;
import mage.counters.Counter;
import mage.counters.Counters;
import mage.designations.Designation;
import mage.designations.DesignationType;
import mage.filter.FilterPermanent;
import mage.game.Game;
import mage.game.Graveyard;
@ -656,7 +658,6 @@ public class PlayerStub implements Player {
return 1;
}
@Override
public void discard(int amount, Ability source, Game game) {
@ -1252,4 +1253,19 @@ public class PlayerStub implements Player {
}
@Override
public boolean hasDesignation(DesignationType designationName) {
return false;
}
@Override
public void addDesignation(Designation designation) {
}
@Override
public List<Designation> getDesignations() {
return null;
}
}

View file

@ -22,7 +22,6 @@ class JsonCard {
public boolean starter; // only available in boxed sets and not in boosters
public int hand; // vanguard
public int life; // vanguard
public String mciNumber;
// only available in AllSets.json
public String artist;
@ -33,6 +32,7 @@ class JsonCard {
public boolean reserved;
public int[] variations;
public String number;
public String mciNumber;
public String releaseDate; // promos
public String border;
public String watermark;

View file

@ -28,7 +28,7 @@ public class VerifyCardDataTest {
private static boolean skipListHaveName(String listName, String name){ return skipCheckLists.get(listName).contains(name); }
static {
// skip lists for checks (example: ustable cards with same name may have different stats)
// skip lists for checks (example: unstable cards with same name may have different stats)
// power-toughness
skipListCreate("PT");
@ -50,6 +50,9 @@ public class VerifyCardDataTest {
// subtype
skipListCreate("SUBTYPE");
// number
skipListCreate("NUMBER");
}
public static List<Card> allCards() {
@ -94,6 +97,89 @@ public class VerifyCardDataTest {
}
}
@Test
public void checkDuplicateCardNumbersInDB(){
Collection<String> doubleErrors = new ArrayList<>();
Collection<ExpansionSet> sets = Sets.getInstance().values();
for (ExpansionSet set : sets) {
Map<String, ExpansionSet.SetCardInfo> cardsList = new HashMap<>();
for (ExpansionSet.SetCardInfo checkCard: set.getSetCardInfo()) {
String cardNumber = checkCard.getCardNumber();
// ignore double faced
Card realCard = CardImpl.createCard(checkCard.getCardClass(), new CardSetInfo(checkCard.getName(), set.getCode(),
checkCard.getCardNumber(), checkCard.getRarity(), checkCard.getGraphicInfo()));
if (realCard.isNightCard()){
continue;
}
if (cardsList.containsKey(cardNumber)){
ExpansionSet.SetCardInfo prevCard = cardsList.get(cardNumber);
String errorType;
if (checkCard.getName().equals(prevCard.getName())){
errorType = " founded DUPLICATED cards"
+ " set (" + set.getCode() + " - " + set.getName() + ")"
+ " (" + checkCard.getCardNumber() + " - " + checkCard.getName() + ")";
}else{
errorType = " founded TYPOS in card numbers"
+ " set (" + set.getCode() + " - " + set.getName() + ")"
+ " (" + prevCard.getCardNumber() + " - " + prevCard.getName() + ")"
+ " and"
+ " (" + checkCard.getCardNumber() + " - " + checkCard.getName() + ")";
}
String error = "Error: " + errorType;
doubleErrors.add(error);
}else{
cardsList.put(cardNumber, checkCard);
}
}
}
for (String error: doubleErrors) {
System.out.println(error);
}
if (doubleErrors.size() > 0){
Assert.fail("DB have duplicated card numbers, founded errors: " + doubleErrors.size());
}
}
@Test
public void checkWrongCardClasses(){
Collection<String> errorsList = new ArrayList<>();
Map<String, String> classesIndex = new HashMap<>();
Collection<ExpansionSet> sets = Sets.getInstance().values();
for (ExpansionSet set : sets) {
for (ExpansionSet.SetCardInfo checkCard : set.getSetCardInfo()) {
String currentClass = checkCard.getCardClass().toString();
if (classesIndex.containsKey(checkCard.getName())) {
String needClass = classesIndex.get(checkCard.getName());
if (!needClass.equals(currentClass)) {
// workaround to star wars set with same card names
if(!checkCard.getName().equals("Syndicate Enforcer")) {
errorsList.add("Error: founded wrong class in set " + set.getCode() + " - " + checkCard.getName() + " (" + currentClass + " <> " + needClass + ")");
}
}
} else {
classesIndex.put(checkCard.getName(), currentClass);
}
}
}
for (String error: errorsList) {
System.out.println(error);
}
if (errorsList.size() > 0){
Assert.fail("DB have wrong card classes, founded errors: " + errorsList.size());
}
}
private static final Pattern SHORT_JAVA_STRING = Pattern.compile("(?<=\")[A-Z][a-z]+(?=\")");
private Set<String> findSourceTokens(Class c) throws IOException {
@ -156,6 +242,7 @@ public class VerifyCardDataTest {
checkSupertypes(card, ref);
checkTypes(card, ref);
checkColors(card, ref);
//checkNumbers(card, ref); // TODO: load data from allsets.json and check it (allcards.json do not have card numbers)
}
private void checkColors(Card card, JsonCard ref) {
@ -259,6 +346,16 @@ public class VerifyCardDataTest {
}
}
private void checkNumbers(Card card, JsonCard ref) {
if (skipListHaveName("NUMBER", card.getName())){ return; }
String expected = ref.number;
String current = card.getCardNumber();
if (!eqPT(current, expected)) {
warn(card, "card number " + current + " != " + expected);
}
}
private String join(Iterable<?> items) {
StringBuilder result = new StringBuilder();
for (Object item : items) {

View file

@ -0,0 +1,52 @@
/*
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
package mage.abilities.condition.common;
import mage.abilities.Ability;
import mage.abilities.condition.Condition;
import mage.designations.DesignationType;
import mage.game.Game;
/**
*
* @author LvelX2
*/
public enum CitysBlessingCondition implements Condition {
instance;
@Override
public boolean apply(Game game, Ability source) {
return game.getPlayer(source.getControllerId()).hasDesignation(DesignationType.CITYS_BLESSING);
}
@Override
public String toString() {
return "If you have the city's blessing";
}
}

View file

@ -0,0 +1,77 @@
/*
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
package mage.abilities.effects.keyword;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.constants.Outcome;
import mage.designations.CitysBlessing;
import mage.designations.DesignationType;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.players.Player;
/**
*
* @author LevelX2
*/
public class AscendEffect extends OneShotEffect {
public AscendEffect() {
super(Outcome.Detriment);
staticText = "Ascend (If you control ten or more permanents, you get the city's blessing for the rest of the game.)<br>";
}
public AscendEffect(final AscendEffect effect) {
super(effect);
}
@Override
public AscendEffect copy() {
return new AscendEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
if (game.getBattlefield().countAll(StaticFilters.FILTER_PERMANENT_ARTIFACT_CREATURE_ENCHANTMENT_OR_LAND, controller.getId(), game) > 9) {
if (!controller.hasDesignation(DesignationType.CITYS_BLESSING)) {
controller.addDesignation(new CitysBlessing());
game.informPlayers(controller.getLogName() + " gets the city's blessing for the rest of the game.");
} else {
game.informPlayers(controller.getLogName() + " already has the city's blessing.");
}
} else {
game.informPlayers(controller.getLogName() + " does not get the city's blessing.");
}
return true;
}
return false;
}
}

View file

@ -0,0 +1,39 @@
/*
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
package mage.designations;
/**
*
* @author LevelX2
*/
public class CitysBlessing extends Designation {
public CitysBlessing() {
super(DesignationType.CITYS_BLESSING, "RIX");
}
}

View file

@ -5,6 +5,10 @@
*/
package mage.designations;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;
import java.util.UUID;
import mage.MageInt;
import mage.MageObject;
import mage.ObjectColor;
@ -14,6 +18,7 @@ import mage.abilities.Ability;
import mage.abilities.costs.mana.ManaCost;
import mage.abilities.costs.mana.ManaCosts;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.text.TextPart;
import mage.cards.FrameStyle;
import mage.constants.CardType;
import mage.constants.SubType;
@ -23,11 +28,6 @@ import mage.game.events.ZoneChangeEvent;
import mage.util.GameLog;
import mage.util.SubTypeList;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;
import java.util.UUID;
/**
*
* @author LevelX2
@ -40,27 +40,35 @@ public abstract class Designation implements MageObject {
private static ManaCostsImpl emptyCost = new ManaCostsImpl();
private String name;
private DesignationType designationType;
private UUID id;
private FrameStyle frameStyle;
private Abilities<Ability> abilites = new AbilitiesImpl<>();
private String expansionSetCodeForImage;
private final boolean unique; // can a designation be added multiple times (false) or only once to an object (true)
public Designation(String name, String expansionSetCode) {
this.name = name;
public Designation(DesignationType designationType, String expansionSetCode) {
this(designationType, expansionSetCode, true);
}
public Designation(DesignationType designationType, String expansionSetCode, boolean unique) {
this.name = designationType.name();
this.designationType = designationType;
this.id = UUID.randomUUID();
this.frameStyle = FrameStyle.M15_NORMAL;
this.expansionSetCodeForImage = expansionSetCode;
this.unique = unique;
}
public Designation(final Designation designation) {
this.id = designation.id;
this.name = designation.name;
this.designationType = designation.designationType;
this.frameStyle = designation.frameStyle;
this.abilites = designation.abilites.copy();
this.unique = designation.unique;
}
public abstract void start(Game game, UUID controllerId);
@Override
public FrameStyle getFrameStyle() {
return frameStyle;
@ -110,6 +118,10 @@ public abstract class Designation implements MageObject {
return this.id;
}
public DesignationType getDesignationType() {
return designationType;
}
public void setExpansionSetCodeForImage(String expansionSetCodeForImage) {
this.expansionSetCodeForImage = expansionSetCodeForImage;
}
@ -218,4 +230,38 @@ public abstract class Designation implements MageObject {
@Override
public void removePTCDA() {
}
/**
*
* @param game
* @param controllerId
*/
public void start(Game game, UUID controllerId) {
}
@Override
public boolean isAllCreatureTypes() {
return false;
}
@Override
public void setIsAllCreatureTypes(boolean value) {
}
@Override
public List<TextPart> getTextParts() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public TextPart addTextPart(TextPart textPart) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
public boolean isUnique() {
return unique;
}
}

View file

@ -0,0 +1,49 @@
/*
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
package mage.designations;
/**
*
* @author LevelX2
*/
public enum DesignationType {
THE_MONARCH("The Monarch"),
CITYS_BLESSING("City's Blessing");
private final String text;
DesignationType(String text) {
this.text = text;
}
@Override
public String toString() {
return text;
}
}

View file

@ -27,14 +27,11 @@
*/
package mage.designations;
import java.util.List;
import java.util.UUID;
import mage.MageObject;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.BeginningOfEndStepTriggeredAbility;
import mage.abilities.effects.common.BecomesMonarchTargetEffect;
import mage.abilities.effects.common.DrawCardTargetEffect;
import mage.abilities.text.TextPart;
import mage.constants.TargetController;
import mage.constants.Zone;
import mage.game.Game;
@ -50,40 +47,10 @@ import mage.target.targetpointer.FixedTarget;
public class Monarch extends Designation {
public Monarch() {
super("The Monarch", "CN2");
super(DesignationType.THE_MONARCH, "CN2");
addAbility(new MonarchDrawTriggeredAbility());
addAbility(new MonarchDealsCombatDamageToAPlayerTriggeredAbility());
}
/**
*
* @param game
* @param controllerId
*/
@Override
public void start(Game game, UUID controllerId) {
}
@Override
public boolean isAllCreatureTypes() {
return false;
}
@Override
public void setIsAllCreatureTypes(boolean value) {
}
@Override
public List<TextPart> getTextParts() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public TextPart addTextPart(TextPart textPart) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}
// At the beginning of the monarchs end step, that player draws a card

View file

@ -34,6 +34,7 @@ public final class StaticFilters {
public static final FilterNonlandCard FILTER_CARD_A_NON_LAND = new FilterNonlandCard("a nonland card");
public static final FilterCard FILTER_CARD_ARTIFACT_OR_CREATURE = new FilterCard("artifact or creature card");
public static final FilterPermanent FILTER_PERMANENT = new FilterPermanent();
public static final FilterCreaturePermanent FILTER_ARTIFACT_CREATURE_PERMANENT = new FilterArtifactCreaturePermanent();
public static final FilterPermanent FILTER_PERMANENT_ARTIFACT_OR_CREATURE = new FilterPermanent("artifact or creature");
public static final FilterPermanent FILTER_PERMANENT_ARTIFACT_CREATURE_OR_ENCHANTMENT = new FilterPermanent("artifact, creature, or enchantment");
@ -42,6 +43,7 @@ public final class StaticFilters {
public static final FilterControlledPermanent FILTER_CONTROLLED_PERMANENT = new FilterControlledPermanent();
public static final FilterControlledPermanent FILTER_CONTROLLED_PERMANENT_ARTIFACT = new FilterControlledArtifactPermanent();
public static final FilterControlledPermanent FILTER_CONTROLLED_PERMANENT_ARTIFACT_OR_CREATURE = new FilterControlledPermanent("artifact or creature you control");
public static final FilterControlledPermanent FILTER_CONTROLLED_PERMANENT_LAND = new FilterControlledLandPermanent();
public static final FilterPermanent FILTER_OPPONENTS_PERMANENT = new FilterPermanent("permanent an opponent controls");
public static final FilterPermanent FILTER_OPPONENTS_PERMANENT_CREATURE = new FilterCreaturePermanent("creature an opponent controls");

View file

@ -1020,6 +1020,7 @@ public abstract class GameImpl implements Game, Serializable {
}
watchers.add(new MorbidWatcher());
watchers.add(new CastSpellLastTurnWatcher());
watchers.add(new CastSpellYourLastTurnWatcher());
watchers.add(new PlayerLostLifeWatcher());
watchers.add(new BlockedAttackerWatcher());
watchers.add(new DamageDoneWatcher());

View file

@ -45,7 +45,25 @@ public class SaprolingToken extends Token {
final static private List<String> tokenImageSets = new ArrayList<>();
static {
tokenImageSets.addAll(Arrays.asList("10E", "ALA", "DDE", "DDH", "DDJ", "M12", "M13", "M14", "MM2", "MMA", "RTR", "C15", "MM3", "C16", "CMA"));
tokenImageSets.addAll(Arrays.asList(
"10E",
"ALA",
"DDE",
"DDH",
"DDJ",
"M12",
"M13",
"M14",
"MM2",
"MM3",
"MMA",
"RTR",
"C15",
"MM3",
"C16", // 2 different token images...
"CMA",
"VMA", // 2 different token, one with DIFFERENT stats, "Saproling Burst" create different token, see https://scryfall.com/card/tvma/12
"E02"));
}
public SaprolingToken() {

View file

@ -62,6 +62,8 @@ import mage.constants.RangeOfInfluence;
import mage.constants.Zone;
import mage.counters.Counter;
import mage.counters.Counters;
import mage.designations.Designation;
import mage.designations.DesignationType;
import mage.filter.FilterPermanent;
import mage.game.Game;
import mage.game.Graveyard;
@ -840,4 +842,11 @@ public interface Player extends MageItem, Copyable<Player> {
boolean addTargets(Ability ability, Game game);
String getHistory();
boolean hasDesignation(DesignationType designationName);
void addDesignation(Designation designation);
List<Designation> getDesignations();
}

View file

@ -62,6 +62,8 @@ import static mage.constants.Zone.LIBRARY;
import mage.counters.Counter;
import mage.counters.CounterType;
import mage.counters.Counters;
import mage.designations.Designation;
import mage.designations.DesignationType;
import mage.filter.FilterCard;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
@ -199,6 +201,8 @@ public abstract class PlayerImpl implements Player, Serializable {
protected UserData userData;
protected MatchPlayer matchPlayer;
protected List<Designation> designations = new ArrayList<>();
/**
* During some steps we can't play anything
*/
@ -300,6 +304,8 @@ public abstract class PlayerImpl implements Player, Serializable {
this.castSourceIdManaCosts = player.castSourceIdManaCosts;
this.castSourceIdCosts = player.castSourceIdCosts;
this.payManaMode = player.payManaMode;
this.designations.addAll(player.designations);
}
@Override
@ -363,6 +369,9 @@ public abstract class PlayerImpl implements Player, Serializable {
this.castSourceIdManaCosts = player.getCastSourceIdManaCosts();
this.castSourceIdCosts = player.getCastSourceIdCosts();
this.designations.clear();
this.designations.addAll(player.getDesignations());
// Don't restore!
// this.storedBookmark
// this.usersAllowedToSeeHandCards
@ -435,6 +444,8 @@ public abstract class PlayerImpl implements Player, Serializable {
this.castSourceIdManaCosts = null;
this.castSourceIdCosts = null;
this.getManaPool().init(); // needed to remove mana that not empties on step change from previous game if left
this.designations.clear();
}
/**
@ -3624,9 +3635,7 @@ public abstract class PlayerImpl implements Player, Serializable {
}
@Override
public boolean scry(int value, Ability source,
Game game
) {
public boolean scry(int value, Ability source, Game game) {
game.informPlayers(getLogName() + " scries " + value);
Cards cards = new CardsImpl();
cards.addAll(getLibrary().getTopCards(game, value));
@ -3659,4 +3668,25 @@ public abstract class PlayerImpl implements Player, Serializable {
return "no available";
}
@Override
public boolean hasDesignation(DesignationType designationName) {
for (Designation designation : designations) {
if (designation.getDesignationType().equals(designationName)) {
return true;
}
}
return false;
}
@Override
public void addDesignation(Designation designation) {
if (!designation.isUnique() || !this.hasDesignation(designation.getDesignationType())) {
designations.add(designation);
}
}
@Override
public List<Designation> getDesignations() {
return designations;
}
}

View file

@ -0,0 +1,94 @@
/*
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
package mage.watchers.common;
import mage.constants.WatcherScope;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.watchers.Watcher;
import java.util.*;
import java.util.Map.Entry;
/**
* @author nantuko, BetaSteward_at_googlemail.com (spjspj)
*/
public class CastSpellYourLastTurnWatcher extends Watcher {
private final Map<UUID, Integer> amountOfSpellsCastOnPrevTurn = new HashMap<>();
private final Map<UUID, Integer> amountOfSpellsCastOnCurrentTurn = new HashMap<>();
private UUID lastActivePlayer = null;
public CastSpellYourLastTurnWatcher() {
super(CastSpellYourLastTurnWatcher.class.getSimpleName(), WatcherScope.GAME);
}
public CastSpellYourLastTurnWatcher(final CastSpellYourLastTurnWatcher watcher) {
super(watcher);
for (Entry<UUID, Integer> entry : watcher.amountOfSpellsCastOnCurrentTurn.entrySet()) {
amountOfSpellsCastOnCurrentTurn.put(entry.getKey(), entry.getValue());
}
for (Entry<UUID, Integer> entry : watcher.amountOfSpellsCastOnPrevTurn.entrySet()) {
amountOfSpellsCastOnPrevTurn.put(entry.getKey(), entry.getValue());
}
}
@Override
public void watch(GameEvent event, Game game) {
lastActivePlayer = game.getActivePlayerId();
if (event.getType() == GameEvent.EventType.SPELL_CAST) {
UUID playerId = event.getPlayerId();
if (playerId != null && lastActivePlayer != null && playerId == lastActivePlayer) {
amountOfSpellsCastOnCurrentTurn.putIfAbsent(playerId, 0);
amountOfSpellsCastOnCurrentTurn.compute(playerId, (k, a) -> a + 1);
}
}
}
@Override
public void reset() {
if (amountOfSpellsCastOnPrevTurn != null
&& lastActivePlayer != null
&& amountOfSpellsCastOnPrevTurn.get(lastActivePlayer) != null) {
amountOfSpellsCastOnPrevTurn.remove(lastActivePlayer);
}
amountOfSpellsCastOnPrevTurn.putAll(amountOfSpellsCastOnCurrentTurn);
amountOfSpellsCastOnCurrentTurn.clear();
lastActivePlayer = null;
}
public Integer getAmountOfSpellsCastOnPlayersTurn(UUID playerId) {
return amountOfSpellsCastOnPrevTurn.getOrDefault(playerId, 0);
}
@Override
public CastSpellYourLastTurnWatcher copy() {
return new CastSpellYourLastTurnWatcher(this);
}
}

View file

@ -0,0 +1,83 @@
/*
* 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.watchers.common;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;
import mage.constants.WatcherScope;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.watchers.Watcher;
/**
*
* @author LevelX2 (spjspj)
*/
public class PermanentsEnteredBattlefieldYourLastTurnWatcher extends Watcher {
private final HashMap<UUID, List<Permanent>> enteringBattlefield = new HashMap<>();
private final HashMap<UUID, List<Permanent>> enteringBattlefieldLastTurn = new HashMap<>();
private UUID lastActivePlayer = null;
public PermanentsEnteredBattlefieldYourLastTurnWatcher() {
super(PermanentsEnteredBattlefieldYourLastTurnWatcher.class.getSimpleName(), WatcherScope.GAME);
}
public PermanentsEnteredBattlefieldYourLastTurnWatcher(final PermanentsEnteredBattlefieldYourLastTurnWatcher watcher) {
super(watcher);
this.enteringBattlefield.putAll(watcher.enteringBattlefield);
this.enteringBattlefieldLastTurn.putAll(watcher.enteringBattlefieldLastTurn);
}
@Override
public PermanentsEnteredBattlefieldYourLastTurnWatcher copy() {
return new PermanentsEnteredBattlefieldYourLastTurnWatcher(this);
}
@Override
public void watch(GameEvent event, Game game) {
lastActivePlayer = game.getActivePlayerId();
if (event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD) {
Permanent perm = game.getPermanentEntering(event.getTargetId());
if (perm == null) {
perm = game.getPermanent(event.getTargetId());
}
if (perm != null) {
List<Permanent> permanents;
if (!enteringBattlefield.containsKey(perm.getControllerId())) {
permanents = new ArrayList<>();
enteringBattlefield.put(perm.getControllerId(), permanents);
} else {
permanents = enteringBattlefield.get(perm.getControllerId());
}
permanents.add(perm.copy()); // copy needed because attributes like color could be changed later
}
}
}
@Override
public void reset() {
if (enteringBattlefieldLastTurn != null
&& lastActivePlayer != null
&& enteringBattlefieldLastTurn.get(lastActivePlayer) != null) {
enteringBattlefieldLastTurn.remove(lastActivePlayer);
}
enteringBattlefieldLastTurn.putAll(enteringBattlefield);
enteringBattlefield.clear();
lastActivePlayer = null;
}
public List<Permanent> getPermanentsEnteringOnPlayersLastTurn(Game game, UUID playerId) {
if (game.getActivePlayerId() == playerId) {
return enteringBattlefield.get(playerId);
}
return enteringBattlefieldLastTurn.get(playerId);
}
}

View file

@ -32698,10 +32698,23 @@ Dungeon Master|Heroes of the Realm|1|M|{2}{W}{U}|Legendary Planeswalker - Dungeo
Nira, Hellkite Duelist|Heroes of the Realm|3|M|{W}{U}{B}{R}{G}|Legendary Creature — Dragon|6|6|Flash$Flying, trample, haste$When Nira, Hellkite Duelist enters the battlefield, the next time you would lose the game this turn, instead draw three cards and your life total becomes 5.|
Silvergill Adept|Rivals of Ixalan|53|U|{1}{U}|Creature - Merfolk Wizard|2|1|As an additional cost to cast Silvergill Adept, reveal a Merfolk card from your hand or pay {3}.$When Silvergill Adept enters the battlefield, draw a card.|
Tetzimoc, Primal Death|Rivals of Ixalan|86|R|{4}{B}{B}|Legendary Creature - Elder Dinosaur|6|6|Deathtouch${B}, Reveal Tetzimoc, Primal Death from your hand: Put a prey counter on target creature. Activate this ability only during your turn.$When Tetzimoc, Primal Death enters the battlefield, destroy each creature your opponents control with a prey counter on it.|
Ghalta, Primal Hunger|Rivals of Ixalan|130|R|{10}{G}{G}|Legendary Creature - Elder Dinosaur|12|12|Ghalta, Primal Hunger costs {X} less to cast, where X is the total power of creatures you control.$Trample|
Vona's Hunger|Rivals of Ixalan|90|R|{2}{B}|Instant|||Ascend <i>(If you control ten or more permanents, you get the city's blessing for the rest of the game.)</i>$Each opponent sacrifices a creature. If you have the city's blessing, instead each opponent sacrifices half the creatures he or she controls rounded up.|
Brass's Bounty|Rivals of Ixalan|94|R|{6}{R}|Sorcery|||For each land you control, create a colorless Treasure artifact token with "{t}, Sacrifice this artifact: Add one mana of any color to your mana pool."|
Ghalta, Primal Hunger|Rivals of Ixalan|130|R|{1}{0}{G}{G}|Legendary Creature - Elder Dinosaur|12|12|Ghalta, Primal Hunger costs {X} less to cast, where X is the total power of creatures you control.$Trample|
Storm the Vault|Rivals of Ixalan|173|R|{2}{U}{R}|Legendary Enchantment|||Whenever one or more creatures you control deal combat damage to a player, create a colorless Treasure artifact token with "{T}, Sacrifice this artifact: Add one mana of any color to your mana pool."$At the beginning of your end step, if you control five or more artifacts, transform Storm the Vault.|
Vault of Catlacan|Rivals of Ixalan|173|R||Legendary Land|||<i>(Transforms from Storm the Vault.)</i>${T}: Add one mana of any color to your mana pool.${T}: Add {U} to your mana pool for each artifact you control.|
Captain's Hook|Rivals of Ixalan|177|R|{3}|Artifact - Equipment|||Equipped creature gets +2/+0, has menace, and is a Pirate in addition to its other creature types.$Whenever Captain's Hook becomes unattached from a permanent, destroy that permanent.$Equip {1}|
The Immortal Sun|Rivals of Ixalan|180|M|{6}|Legendary Artifact|||Players can't activate loyalty abilities of planeswalkers.$At the beginning of your draw step, draw an additional card.$Spells you cast cost {1} less to cast.$Creatures you control get +1/+1.|
Evolving Wilds|Rivals of Ixalan|186|C||Land|||{T}, Sacrifice Evolving Wilds: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library.|
Vraska, Scheming Gorgon|Rivals of Ixalan|197|M|{4}{B}{B}|Legendary Planeswalker - Vraska|5|+2: Creatures you control get +1/+0 until end of turn.$-3: Destroy target creature.$-10: Until end of turn, creatures you control gain deathtouch and "Whenever this creature deals damage to an opponent, that player loses the game."|
Vampire Champion|Rivals of Ixalan|198|C|{3}{B}|Creature - Vampire Soldier|3|3|Deathtouch <i>(Any amount of damage this deals to a creature is enough to destroy it.)</i>|
Vraska's Conquistador|Rivals of Ixalan|199|U|{1}{B}|Creature - Vampire Soldier|2|1|Whenever Vraska's Conquistador attacks or blocks, if you control a Vraska planeswalker, target opponent loses 2 life and you gain 2 life.|
Vraska's Scorn|Rivals of Ixalan|200|R|{2}{B}{B}|Sorcery|||Target opponent loses 4 life. You may search your library and/or graveyard for a card named Vraska, Scheming Gorgon, reveal it, and put it into your hand. If you search your library this way, shuffle it.|
Angrath, Minotaur Pirate|Rivals of Ixalan|201|M|{4}{B}{R}|Legendary Planeswalker - Angrath|5|+2: Angrath, Minotaur Pirate deals 1 damage to target opponent and each creature that player controls.$-3: Return target Pirate card from your graveyard to the battlefield.$-11: Destroy all creature target opponent controls. Angrath, Minotaur Pirate deals damage to that player equal to their total power.|
Angrath's Ambusher|Rivals of Ixalan|202|U|{2}{B}|Creature - Orc Pirate|2|3|Angrath's Ambusher gets +2/+0 as long as you control an Angrath planeswalker.|
Swab Goblin|Rivals of Ixalan|203|C|{1}{R}|Creature - Goblin Pirate|2|2||
Angrath's Fury|Rivals of Ixalan|204|R|{3}{B}{R}|Sorcery|||Destroy target creature. Angrath's Fury deals 3 damage to target player. You may search your library and/or graveyard for a card named Angrath, Minotaur Pirate, reveal it, and put it into your hand. If you search your library this way, shuffle it.|
Cinder Barrens|Rivals of Ixalan|205|C||Land|||Cinder Barrens enters the battlefield tapped.${T}: Add {B} or {R} to your mana pool.|
Amateur Auteur|Unstable|3|C|{1}{W}|Creature - Human|2|2|Sacrifice Amateur Auteur: Destroy target enchantment.|
Angelic Rocket|Unstable|139|R|{8}|Host Creature - Angel|4|4|Flying$When this creature enters the battlefield, you may destroy target nonland permanent.|
As Luck Would Have It|Unstable|102|R|{G}|Enchantment|||Hexproof$Whenever you roll a die, put a number of luck counters on As Luck Would Have It equal to the result. Then is there are 100 or more luck counters on As Luck Would Have It, you win the game. (Count both rolls if you reroll a die.)|