Merge branch 'master' of https://github.com/magefree/mage into magefree-master

# Conflicts:
#	Utils/mtg-cards-data.txt
This commit is contained in:
Evan Kranzler 2017-09-07 11:36:07 -04:00
parent 7ad5b7efad
commit 0656f97d7c
14 changed files with 958 additions and 355 deletions

View file

@ -25,22 +25,17 @@
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
package mage.cards.m;
package mage.cards.b;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.ContinuousEffectImpl;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Layer;
import mage.constants.Outcome;
import mage.constants.SubLayer;
import mage.constants.TargetController;
import mage.constants.Zone;
import mage.constants.*;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.permanent.ControllerPredicate;
import mage.game.Game;

View file

@ -28,6 +28,7 @@
package mage.cards.c;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.AttachEffect;
@ -36,7 +37,12 @@ import mage.abilities.effects.common.ruleModifying.TargetsHaveToTargetPermanentI
import mage.abilities.keyword.EnchantAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.constants.AttachmentType;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.filter.FilterPermanent;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
@ -50,7 +56,7 @@ public class CoalitionFlag extends CardImpl {
public CoalitionFlag(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{W}");
this.subtype.add("Aura");
this.subtype.add(SubType.AURA);
// Enchant creature you control
TargetPermanent auraTarget = new TargetCreaturePermanent();
@ -60,7 +66,7 @@ public class CoalitionFlag extends CardImpl {
this.addAbility(ability);
// Enchanted creature is a Flagbearer.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SetCardSubtypeAttachedEffect(SubType.FLAGBEARER, Duration.WhileOnBattlefield, AttachmentType.AURA)));
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SetCardSubtypeAttachedEffect(Duration.WhileOnBattlefield, AttachmentType.AURA, SubType.FLAGBEARER)));
// While choosing targets as part of casting a spell or activating an ability, your opponents must choose at least one Flagbearer on the battlefield if able.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new TargetsHaveToTargetPermanentIfAbleEffect(new FilterPermanent(SubType.FLAGBEARER, "one Flagbearer"))));

View file

@ -97,7 +97,7 @@ class CrimsonHonorGuardEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(game.getActivePlayerId());
if (player != null) {
int numCommanders = game.getBattlefield().getActivePermanents(filter, player.getId(), game).size();
int numCommanders = game.getBattlefield().getAllActivePermanents(filter, player.getId(), game).size();
if (numCommanders == 0) {
player.damage(4, source.getSourceId(), game, false, true);
return true;

View file

@ -25,12 +25,13 @@
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
package mage.cards.t;
package mage.cards.d;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.keyword.VigilanceAbility;
import mage.abilities.keyword.CrewAbility;
import mage.abilities.keyword.VigilanceAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;

View file

@ -28,6 +28,7 @@
package mage.cards.n;
import java.util.UUID;
import mage.ObjectColor;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
@ -44,7 +45,12 @@ import mage.abilities.keyword.IntimidateAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.constants.AttachmentType;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
@ -62,7 +68,7 @@ public class NimDeathmantle extends CardImpl {
public NimDeathmantle(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}");
this.subtype.add("Equipment");
this.subtype.add(SubType.EQUIPMENT);
this.addAbility(new EquipAbility(Outcome.AddAbility, new GenericManaCost(4)));
@ -70,7 +76,7 @@ public class NimDeathmantle extends CardImpl {
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEquippedEffect(2, 2)));
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(IntimidateAbility.getInstance(), AttachmentType.EQUIPMENT)));
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SetCardColorAttachedEffect(ObjectColor.BLACK, Duration.WhileOnBattlefield, AttachmentType.EQUIPMENT)));
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SetCardSubtypeAttachedEffect(SubType.ZOMBIE, Duration.WhileOnBattlefield, AttachmentType.EQUIPMENT)));
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SetCardSubtypeAttachedEffect(Duration.WhileOnBattlefield, AttachmentType.EQUIPMENT, SubType.ZOMBIE)));
// Whenever a nontoken creature is put into your graveyard from the battlefield, you may pay {4}. If you do, return that card to the battlefield and attach Nim Deathmantle to it.
this.addAbility(new NimDeathmantleTriggeredAbility());

View file

@ -27,9 +27,8 @@
*/
package mage.cards.o;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
@ -42,12 +41,7 @@ import mage.abilities.keyword.EnchantAbility;
import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.AttachmentType;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.TargetController;
import mage.constants.Zone;
import mage.constants.*;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
@ -58,16 +52,9 @@ import mage.target.common.TargetCreaturePermanent;
*/
public class OniPossession extends CardImpl {
private static final List<String> setSubtypes = new ArrayList<>();
static {
setSubtypes.add("Demon");
setSubtypes.add("Spirit");
}
public OniPossession(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{B}");
this.subtype.add("Aura");
this.subtype.add(SubType.AURA);
// Enchant creature
TargetPermanent auraTarget = new TargetCreaturePermanent();
@ -84,7 +71,7 @@ public class OniPossession extends CardImpl {
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(3, 3, Duration.WhileOnBattlefield)));
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(TrampleAbility.getInstance(), AttachmentType.AURA)));
// Enchanted creature is a Demon Spirit.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SetCardSubtypeAttachedEffect(setSubtypes, Duration.WhileOnBattlefield, AttachmentType.AURA)));
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SetCardSubtypeAttachedEffect(Duration.WhileOnBattlefield, AttachmentType.AURA, SubType.DEMON, SubType.SPIRIT)));
}
public OniPossession(final OniPossession card) {

View file

@ -0,0 +1,140 @@
/*
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
package mage.cards.p;
import java.util.UUID;
import mage.MageInt;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.Cards;
import mage.cards.CardsImpl;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.constants.TargetController;
import mage.constants.Zone;
import mage.filter.FilterCard;
import mage.filter.predicate.mageobject.SubtypePredicate;
import mage.game.Game;
import mage.players.Player;
import mage.target.common.TargetCardInHand;
import mage.target.common.TargetCardInLibrary;
/**
*
* @author spjspj
*/
public class PriestOfTheWakeningSun extends CardImpl {
private static final FilterCard filter = new FilterCard("a Dinosaur card");
static {
filter.add(new SubtypePredicate(SubType.DINOSAUR));
}
public PriestOfTheWakeningSun(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}");
this.subtype.add("Human");
this.subtype.add("Cleric");
this.power = new MageInt(1);
this.toughness = new MageInt(1);
// At the beginning of your upkeep, you may reveal a Dinosaur card from your hand. If you do, you gain 2 life.
Ability ability = new BeginningOfUpkeepTriggeredAbility(new PriestOfTheWakeningSunEffect(), TargetController.YOU, true);
this.addAbility(ability);
// {3}{W}{W}, Sacrifice Priest of the Wakening Sun: Search your library for a Dinosaur card, reveal it, put it into your hand, then shuffle your library.
TargetCardInLibrary target = new TargetCardInLibrary(0, 1, filter);
Ability ability2 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new SearchLibraryPutInHandEffect(new TargetCardInLibrary(target), true, true), new ManaCostsImpl("{3}{W}{W}"));
ability2.addCost(new SacrificeSourceCost());
this.addAbility(ability2);
}
public PriestOfTheWakeningSun(final PriestOfTheWakeningSun card) {
super(card);
}
@Override
public PriestOfTheWakeningSun copy() {
return new PriestOfTheWakeningSun(this);
}
}
class PriestOfTheWakeningSunEffect extends OneShotEffect {
private static final FilterCard filter = new FilterCard("a Dinosaur card to reveal");
static {
filter.add(new SubtypePredicate(SubType.DINOSAUR));
}
PriestOfTheWakeningSunEffect() {
super(Outcome.Benefit);
this.staticText = "reveal a Dinosaur card from your hand. If you do, you gain 2 life";
}
PriestOfTheWakeningSunEffect(final PriestOfTheWakeningSunEffect effect) {
super(effect);
}
@Override
public PriestOfTheWakeningSunEffect copy() {
return new PriestOfTheWakeningSunEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
MageObject sourceObject = game.getObject(source.getSourceId());
if (controller != null && sourceObject != null) {
if (controller.getHand().count(filter, source.getSourceId(), source.getControllerId(), game) > 0) {
if (controller.chooseUse(outcome, "Reveal a Dinosaur card?", source, game)) {
TargetCardInHand target = new TargetCardInHand(0, 1, filter);
if (controller.chooseTarget(outcome, target, source, game) && !target.getTargets().isEmpty()) {
Cards cards = new CardsImpl();
cards.addAll(target.getTargets());
controller.revealCards(sourceObject.getIdName(), cards, game);
controller.gainLife(2, game);
return true;
}
}
}
}
return false;
}
}

View file

@ -0,0 +1,81 @@
/*
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
package mage.cards.s;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.dynamicvalue.common.ManacostVariableValue;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.ReturnToLibrarySpellEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.game.Game;
/**
*
* @author spjspj
*/
public class SanguineSacrament extends CardImpl {
public SanguineSacrament(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{W}{W}");
// You gain twice X life. Put Sanguine Sacrament on the bottom of its owner's library.
this.getSpellAbility().addEffect(new GainLifeEffect(new SanguineSacramentValue()));
this.getSpellAbility().addEffect(new ReturnToLibrarySpellEffect(false));
}
public SanguineSacrament(final SanguineSacrament card) {
super(card);
}
@Override
public SanguineSacrament copy() {
return new SanguineSacrament(this);
}
}
class SanguineSacramentValue extends ManacostVariableValue {
@Override
public int calculate(Game game, Ability sourceAbility, Effect effect) {
return super.calculate(game, sourceAbility, effect) * 2;
}
@Override
public SanguineSacramentValue copy() {
return new SanguineSacramentValue();
}
@Override
public String toString() {
return "twice X";
}
}

View file

@ -0,0 +1,183 @@
/*
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
package mage.cards.s;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.CounterTargetEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Zone;
import mage.filter.Filter;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.game.stack.Spell;
import mage.game.stack.StackAbility;
import mage.game.stack.StackObject;
import mage.target.Target;
import mage.target.TargetObject;
import mage.target.Targets;
/**
*
* @author spjspj
*/
public class SirenStormtamer extends CardImpl {
public SirenStormtamer(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{U}");
this.subtype.add("Siren");
this.subtype.add("Pirate");
this.subtype.add("Wizard");
this.power = new MageInt(1);
this.toughness = new MageInt(1);
// Flying
this.addAbility(FlyingAbility.getInstance());
// {U}, Sacrifice Siren Stormtamer: Counter target spell or ability that targets you or a creature you control.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CounterTargetEffect(), new ManaCostsImpl("{U}"));
ability.addTarget(new SirenStormtamerTargetObject());
ability.addCost(new SacrificeSourceCost());
this.addAbility(ability);
}
public SirenStormtamer(final SirenStormtamer card) {
super(card);
}
@Override
public SirenStormtamer copy() {
return new SirenStormtamer(this);
}
}
class SirenStormtamerTargetObject extends TargetObject {
public SirenStormtamerTargetObject() {
this.minNumberOfTargets = 1;
this.maxNumberOfTargets = 1;
this.zone = Zone.STACK;
this.targetName = "spell or ability that targets you or a creature you control";
}
public SirenStormtamerTargetObject(final SirenStormtamerTargetObject target) {
super(target);
}
@Override
public boolean canTarget(UUID id, Ability source, Game game) {
StackObject stackObject = game.getStack().getStackObject(id);
return (stackObject instanceof Spell) || (stackObject instanceof StackAbility);
}
@Override
public boolean canChoose(UUID sourceId, UUID sourceControllerId, Game game) {
return canChoose(sourceControllerId, game);
}
@Override
public boolean canChoose(UUID sourceControllerId, Game game) {
for (StackObject stackObject : game.getStack()) {
if ((stackObject instanceof Spell) || (stackObject instanceof StackAbility)) {
Targets objectTargets = stackObject.getStackAbility().getTargets();
if (!objectTargets.isEmpty()) {
for (Target target : objectTargets) {
for (UUID targetId : target.getTargets()) {
Permanent targetedPermanent = game.getPermanentOrLKIBattlefield(targetId);
if (targetedPermanent != null
&& targetedPermanent.getControllerId().equals(sourceControllerId)
&& targetedPermanent.isCreature()) {
return true;
}
if (sourceControllerId.equals(targetId)) {
return true;
}
}
}
}
}
}
return false;
}
@Override
public Set<UUID> possibleTargets(UUID sourceId, UUID sourceControllerId,
Game game) {
return possibleTargets(sourceControllerId, game);
}
@Override
public Set<UUID> possibleTargets(UUID sourceControllerId, Game game) {
Set<UUID> possibleTargets = new HashSet<>();
for (StackObject stackObject : game.getStack()) {
if ((stackObject instanceof Spell) || (stackObject instanceof StackAbility)) {
Targets objectTargets = stackObject.getStackAbility().getTargets();
if (!objectTargets.isEmpty()) {
for (Target target : objectTargets) {
for (UUID targetId : target.getTargets()) {
Permanent targetedPermanent = game.getPermanentOrLKIBattlefield(targetId);
if (targetedPermanent != null
&& targetedPermanent.getControllerId().equals(sourceControllerId)
&& targetedPermanent.isCreature()) {
possibleTargets.add(stackObject.getId());
}
if (sourceControllerId.equals(targetId)) {
possibleTargets.add(stackObject.getId());
}
}
}
}
}
}
return possibleTargets;
}
@Override
public SirenStormtamerTargetObject copy() {
return new SirenStormtamerTargetObject(this);
}
@Override
public Filter getFilter() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}

View file

@ -0,0 +1,165 @@
/*
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
package mage.cards.s;
import java.util.UUID;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.Cards;
import mage.cards.CardsImpl;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.filter.FilterCard;
import mage.filter.common.FilterNonlandCard;
import mage.filter.predicate.mageobject.ConvertedManaCostPredicate;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.stack.Spell;
import mage.players.Player;
import mage.target.TargetCard;
import mage.target.targetpointer.FixedTarget;
/**
*
* @author spjspj
*/
public class SunbirdsInvocation extends CardImpl {
public SunbirdsInvocation(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{5}{R}");
// Whenever you cast a spell from your hand, reveal the top X cards of your library, where X is that spell's converted mana cost. You may cast a card revealed this way with converted mana cost X or less without paying its mana cost. Put the rest on the bottom of your library in a random order.
this.addAbility(new SunbirdsInvocationTriggeredAbility());
}
public SunbirdsInvocation(final SunbirdsInvocation card) {
super(card);
}
@Override
public SunbirdsInvocation copy() {
return new SunbirdsInvocation(this);
}
}
class SunbirdsInvocationTriggeredAbility extends SpellCastControllerTriggeredAbility {
public SunbirdsInvocationTriggeredAbility() {
super(new SunbirdsInvocationEffect(), false);
}
public SunbirdsInvocationTriggeredAbility(SunbirdsInvocationTriggeredAbility ability) {
super(ability);
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getPlayerId().equals(this.getControllerId())) {
Spell spell = game.getStack().getSpell(event.getTargetId());
if (spell != null && spell.getFromZone() == Zone.HAND) {
if (spell.getCard() != null) {
for (Effect effect : getEffects()) {
effect.setTargetPointer(new FixedTarget(spell.getId()));
}
return true;
}
}
}
return false;
}
@Override
public SunbirdsInvocationTriggeredAbility copy() {
return new SunbirdsInvocationTriggeredAbility(this);
}
}
class SunbirdsInvocationEffect extends OneShotEffect {
public SunbirdsInvocationEffect() {
super(Outcome.PutCardInPlay);
staticText = "Reveal the top X cards of your library, where X is that spell's converted mana cost. You may cast a card revealed this way with converted mana cost X or less without paying its mana cost. Put the rest on the bottom of your library in a random order";
}
public SunbirdsInvocationEffect(final SunbirdsInvocationEffect effect) {
super(effect);
}
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
MageObject sourceObject = game.getObject(source.getSourceId());
if (controller == null || sourceObject == null) {
return false;
}
Cards cards = new CardsImpl();
int xValue = game.getStack().getSpell(getTargetPointer().getFirst(game, source)).getConvertedManaCost();
cards.addAll(controller.getLibrary().getTopCards(game, xValue));
if (!cards.isEmpty()) {
controller.revealCards(sourceObject.getIdName(), cards, game);
FilterCard filter = new FilterNonlandCard("card revealed this way with converted mana cost " + xValue + " or less");
filter.add(new ConvertedManaCostPredicate(ComparisonType.FEWER_THAN, xValue + 1));
TargetCard target = new TargetCard(1, Zone.LIBRARY, filter);
if (controller.chooseTarget(Outcome.PlayForFree, cards, target, source, game)) {
Card card = cards.get(target.getFirstTarget(), game);
if (card != null) {
if (controller.chooseUse(outcome, "Do you wish to cast " + card.getName(), source, game)) {
Card copy = game.copyCard(card, source, source.getControllerId());
controller.cast(copy.getSpellAbility(), game, true);
}
return true;
}
}
}
while (!cards.isEmpty()) {
Card card = cards.getRandom(game);
if (card != null) {
cards.remove(card);
card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, false);
}
}
return true;
}
@Override
public SunbirdsInvocationEffect copy() {
return new SunbirdsInvocationEffect(this);
}
}

View file

@ -35,7 +35,7 @@ public class Ixalan extends ExpansionSet {
cards.add(new SetCardInfo("Angrath's Marauders", 132, Rarity.RARE, mage.cards.a.AngrathsMarauders.class));
cards.add(new SetCardInfo("Ashes of the Abhorrent", 2, Rarity.RARE, mage.cards.a.AshesOfTheAbhorrent.class));
cards.add(new SetCardInfo("Bishop of Rebirth", 5, Rarity.RARE, mage.cards.b.BishopOfRebirth.class));
cards.add(new SetCardInfo("Belligerent Brontodon", 218, Rarity.UNCOMMON, mage.cards.m.BelligerentBrontodon.class));
cards.add(new SetCardInfo("Belligerent Brontodon", 218, Rarity.UNCOMMON, mage.cards.b.BelligerentBrontodon.class));
cards.add(new SetCardInfo("Bellowing Aegisaur", 4, Rarity.UNCOMMON, mage.cards.b.BellowingAegisaur.class));
cards.add(new SetCardInfo("Bloodcrazed Paladin", 93, Rarity.RARE, mage.cards.b.BloodcrazedPaladin.class));
cards.add(new SetCardInfo("Boneyard Parley", 94, Rarity.MYTHIC, mage.cards.b.BoneyardParley.class));
@ -60,7 +60,7 @@ public class Ixalan extends ExpansionSet {
cards.add(new SetCardInfo("Drover of the Mighty", 167, Rarity.UNCOMMON, mage.cards.d.DroverOfTheMighty.class));
cards.add(new SetCardInfo("Drowned Catacomb", 253, Rarity.RARE, mage.cards.d.DrownedCatacomb.class));
cards.add(new SetCardInfo("Duress", 105, Rarity.COMMON, mage.cards.d.Duress.class));
cards.add(new SetCardInfo("Dusk Legion Dreadnought", 236, Rarity.UNCOMMON, mage.cards.t.DuskLegionDreadnought.class));
cards.add(new SetCardInfo("Dusk Legion Dreadnought", 236, Rarity.UNCOMMON, mage.cards.d.DuskLegionDreadnought.class));
cards.add(new SetCardInfo("Emperor's Vanguard", 189, Rarity.RARE, mage.cards.e.EmperorsVanguard.class));
cards.add(new SetCardInfo("Entrancing Melody", 55, Rarity.RARE, mage.cards.e.EntrancingMelody.class));
cards.add(new SetCardInfo("Fathom Fleet Captain", 106, Rarity.RARE, mage.cards.f.FathomFleetCaptain.class));
@ -92,6 +92,7 @@ public class Ixalan extends ExpansionSet {
cards.add(new SetCardInfo("Overflowing Insight", 64, Rarity.MYTHIC, mage.cards.o.OverflowingInsight.class));
cards.add(new SetCardInfo("Pillar of Origins", 241, Rarity.UNCOMMON, mage.cards.p.PillarOfOrigins.class));
cards.add(new SetCardInfo("Pirate's Cutlass", 242, Rarity.COMMON, mage.cards.p.PiratesCutlass.class));
cards.add(new SetCardInfo("Priest of the Wakening Sun", 27, Rarity.RARE, mage.cards.p.PriestOfTheWakeningSun.class));
cards.add(new SetCardInfo("Primal Amulet", 243, Rarity.RARE, mage.cards.p.PrimalAmulet.class));
cards.add(new SetCardInfo("Primal Wellspring", 243, Rarity.RARE, mage.cards.p.PrimalWellspring.class));
cards.add(new SetCardInfo("Prosperous Pirates", 69, Rarity.COMMON, mage.cards.p.ProsperousPirates.class));
@ -105,11 +106,13 @@ public class Ixalan extends ExpansionSet {
cards.add(new SetCardInfo("Rowdy Crew", 159, Rarity.MYTHIC, mage.cards.r.RowdyCrew.class));
cards.add(new SetCardInfo("Ruin Raider", 118, Rarity.RARE, mage.cards.r.RuinRaider.class));
cards.add(new SetCardInfo("Sanctum Seeker", 120, Rarity.RARE, mage.cards.s.SanctumSeeker.class));
cards.add(new SetCardInfo("Sanguine Sacrament", 33, Rarity.RARE, mage.cards.s.SanguineSacrament.class));
cards.add(new SetCardInfo("Savage Stomp", 205, Rarity.UNCOMMON, mage.cards.s.SavageStomp.class));
cards.add(new SetCardInfo("Sentinel Totem", 245, Rarity.UNCOMMON, mage.cards.s.SentinelTotem.class));
cards.add(new SetCardInfo("Settle the Wreckage", 34, Rarity.RARE, mage.cards.s.SettleTheWreckage.class));
cards.add(new SetCardInfo("Shapers of Nature", 228, Rarity.UNCOMMON, mage.cards.s.ShapersOfNature.class));
cards.add(new SetCardInfo("Shapers' Sanctuary", 206, Rarity.RARE, mage.cards.s.ShapersSanctuary.class));
cards.add(new SetCardInfo("Siren Stormtamer", 79, Rarity.UNCOMMON, mage.cards.s.SirenStormtamer.class));
cards.add(new SetCardInfo("Sleek Schooner", 247, Rarity.UNCOMMON, mage.cards.s.SleekSchooner.class));
cards.add(new SetCardInfo("Slice in Twain", 207, Rarity.UNCOMMON, mage.cards.s.SliceinTwain.class));
cards.add(new SetCardInfo("Sorcerous Spyglass", 248, Rarity.RARE, mage.cards.s.SorcerousSpyglass.class));
@ -121,6 +124,7 @@ public class Ixalan extends ExpansionSet {
cards.add(new SetCardInfo("Storm Fleet Arsonist", 162, Rarity.UNCOMMON, mage.cards.s.StormFleetArsonist.class));
cards.add(new SetCardInfo("Sun-Blessed Mount", 288, Rarity.RARE, mage.cards.s.SunBlessedMount.class));
cards.add(new SetCardInfo("Sun-Crowned Hunters", 164, Rarity.COMMON, mage.cards.s.SunCrownedHunters.class));
cards.add(new SetCardInfo("Sunbird's Invocation", 165, Rarity.RARE, mage.cards.s.SunbirdsInvocation.class));
cards.add(new SetCardInfo("Sunpetal Grove", 257, Rarity.RARE, mage.cards.s.SunpetalGrove.class));
cards.add(new SetCardInfo("Thaumatic Compass", 249, Rarity.RARE, mage.cards.t.ThaumaticCompass.class));
cards.add(new SetCardInfo("Tilonalli's Skinshifter", 170, Rarity.RARE, mage.cards.t.TilonallisSkinshifter.class));

View file

@ -29,13 +29,16 @@ package mage.abilities.effects.common.continuous;
import mage.abilities.Ability;
import mage.abilities.effects.ContinuousEffectImpl;
import mage.constants.*;
import mage.constants.AttachmentType;
import mage.constants.Duration;
import mage.constants.Layer;
import mage.constants.Outcome;
import mage.constants.SubLayer;
import mage.constants.SubType;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.util.SubTypeList;
import java.util.List;
/**
* @author nantuko
*/
@ -44,7 +47,14 @@ public class SetCardSubtypeAttachedEffect extends ContinuousEffectImpl {
private SubTypeList setSubtypes = new SubTypeList();
private final AttachmentType attachmentType;
public SetCardSubtypeAttachedEffect(SubType setSubtype, Duration duration, AttachmentType attachmentType) {
public SetCardSubtypeAttachedEffect(Duration duration, AttachmentType attachmentType, SubType... setSubtype) {
super(duration, Layer.TypeChangingEffects_4, SubLayer.NA, Outcome.Benefit);
this.setSubtypes.add(setSubtype);
this.attachmentType = attachmentType;
this.setText();
}
/*public SetCardSubtypeAttachedEffect(SubType setSubtype, Duration duration, AttachmentType attachmentType) {
super(duration, Layer.TypeChangingEffects_4, SubLayer.NA, Outcome.Benefit);
this.setSubtypes.add(setSubtype);
this.attachmentType = attachmentType;
@ -56,7 +66,7 @@ public class SetCardSubtypeAttachedEffect extends ContinuousEffectImpl {
this.setSubtypes.addAll(setSubtypes);
this.attachmentType = attachmentType;
setText();
}
}*/
public SetCardSubtypeAttachedEffect(final SetCardSubtypeAttachedEffect effect) {
super(effect);

View file

@ -1,396 +1,410 @@
package mage.constants;
import mage.util.SubTypeList;
import java.util.Arrays;
import java.util.EnumSet;
import java.util.Set;
import java.util.stream.Collectors;
import mage.util.SubTypeList;
public enum SubType {
//205.3k Instants and sorceries share their lists of subtypes; these subtypes are called spell types.
ARCANE("Arcane", SubTypeSet.SpellType, false),
TRAP("Trap", SubTypeSet.SpellType, false),
ARCANE("Arcane", SubTypeSet.SpellType),
TRAP("Trap", SubTypeSet.SpellType),
// 205.3i: Lands have their own unique set of subtypes; these subtypes are called land types.
// Of that list, Forest, Island, Mountain, Plains, and Swamp are the basic land types.
FOREST("Forest", SubTypeSet.BasicLandType, false),
ISLAND("Island", SubTypeSet.BasicLandType, false),
MOUNTAIN("Mountain", SubTypeSet.BasicLandType, false),
PLAINS("Plains", SubTypeSet.BasicLandType, false),
SWAMP("Swamp", SubTypeSet.BasicLandType, false),
DESERT("Desert", SubTypeSet.NonBasicLandType, false),
GATE("Gate", SubTypeSet.NonBasicLandType, false),
LAIR("Lair", SubTypeSet.NonBasicLandType, false),
LOCUS("Locus", SubTypeSet.NonBasicLandType, false),
URZAS("Urza's", SubTypeSet.NonBasicLandType, false),
MINE("Mine", SubTypeSet.NonBasicLandType, false),
POWER_PLANT("Power-Plant", SubTypeSet.NonBasicLandType, false),
TOWER("Tower", SubTypeSet.NonBasicLandType, false),
FOREST("Forest", SubTypeSet.BasicLandType),
ISLAND("Island", SubTypeSet.BasicLandType),
MOUNTAIN("Mountain", SubTypeSet.BasicLandType),
PLAINS("Plains", SubTypeSet.BasicLandType),
SWAMP("Swamp", SubTypeSet.BasicLandType),
DESERT("Desert", SubTypeSet.NonBasicLandType),
GATE("Gate", SubTypeSet.NonBasicLandType),
LAIR("Lair", SubTypeSet.NonBasicLandType),
LOCUS("Locus", SubTypeSet.NonBasicLandType),
URZAS("Urza's", SubTypeSet.NonBasicLandType),
MINE("Mine", SubTypeSet.NonBasicLandType),
POWER_PLANT("Power-Plant", SubTypeSet.NonBasicLandType),
TOWER("Tower", SubTypeSet.NonBasicLandType),
// 205.3h Enchantments have their own unique set of subtypes; these subtypes are called enchantment types.
AURA("Aura", SubTypeSet.EnchantmentType, false),
CARTOUCHE("Cartouche", SubTypeSet.EnchantmentType, false),
CURSE("Curse", SubTypeSet.EnchantmentType, false),
SHRINE("Shrine", SubTypeSet.EnchantmentType, false),
AURA("Aura", SubTypeSet.EnchantmentType),
CARTOUCHE("Cartouche", SubTypeSet.EnchantmentType),
CURSE("Curse", SubTypeSet.EnchantmentType),
SHRINE("Shrine", SubTypeSet.EnchantmentType),
// 205.3g: Artifacts have their own unique set of subtypes; these subtypes are called artifact types.
CLUE("Clue", SubTypeSet.ArtifactType, false),
CONTRAPTION("Contraption", SubTypeSet.ArtifactType, false),
EQUIPMENT("Equipment", SubTypeSet.ArtifactType, false),
FORTIFICATION("Fortification", SubTypeSet.ArtifactType, false),
TREASURE("Treasure", SubTypeSet.ArtifactType, false),
VEHICLE("Vehicle", SubTypeSet.ArtifactType, false),
CLUE("Clue", SubTypeSet.ArtifactType),
CONTRAPTION("Contraption", SubTypeSet.ArtifactType),
EQUIPMENT("Equipment", SubTypeSet.ArtifactType),
FORTIFICATION("Fortification", SubTypeSet.ArtifactType),
TREASURE("Treasure", SubTypeSet.ArtifactType),
VEHICLE("Vehicle", SubTypeSet.ArtifactType),
// 205.3m : Creatures and tribals share their lists of subtypes; these subtypes are called creature types.
// A
ADVISOR("Advisor", SubTypeSet.CreatureType, false),
AETHERBORN("Aetherborn", SubTypeSet.CreatureType, false),
ALLY("Ally", SubTypeSet.CreatureType, false),
ANGEL("Angel", SubTypeSet.CreatureType, false),
ANTELOPE("Antelope", SubTypeSet.CreatureType, false),
ADVISOR("Advisor", SubTypeSet.CreatureType),
AETHERBORN("Aetherborn", SubTypeSet.CreatureType),
ALLY("Ally", SubTypeSet.CreatureType),
ANGEL("Angel", SubTypeSet.CreatureType),
ANTELOPE("Antelope", SubTypeSet.CreatureType),
AQUALISH("Aqualish", SubTypeSet.CreatureType, true), // Star Wars
APE("Ape", SubTypeSet.CreatureType, false),
APE("Ape", SubTypeSet.CreatureType),
ARCONA("Arcona", SubTypeSet.CreatureType, true),
ARCHER("Archer", SubTypeSet.CreatureType, false),
ARCHON("Archon", SubTypeSet.CreatureType, false),
ARTIFICER("Artificer", SubTypeSet.CreatureType, false),
ARCHER("Archer", SubTypeSet.CreatureType),
ARCHON("Archon", SubTypeSet.CreatureType),
ARTIFICER("Artificer", SubTypeSet.CreatureType),
ARTIFICIER("Artificier", SubTypeSet.CreatureType, true),
ASSASSIN("Assassin", SubTypeSet.CreatureType, false),
ASSEMBLY_WORKER("Assembly-Worker", SubTypeSet.CreatureType, false),
ATOG("Atog", SubTypeSet.CreatureType, false),
ASSASSIN("Assassin", SubTypeSet.CreatureType),
ASSEMBLY_WORKER("Assembly-Worker", SubTypeSet.CreatureType),
ATOG("Atog", SubTypeSet.CreatureType),
ATAT("AT-AT", SubTypeSet.CreatureType, true),
AUROCHS("Aurochs", SubTypeSet.CreatureType, false),
AUROCHS("Aurochs", SubTypeSet.CreatureType),
AUTOBOT("Autobot", SubTypeSet.CreatureType, true), // H17, Grimlock
AVATAR("Avatar", SubTypeSet.CreatureType, false),
AVATAR("Avatar", SubTypeSet.CreatureType),
// B
BADGER("Badger", SubTypeSet.CreatureType, false),
BARBARIAN("Barbarian", SubTypeSet.CreatureType, false),
BASILISK("Basilisk", SubTypeSet.CreatureType, false),
BAT("Bat", SubTypeSet.CreatureType, false),
BEAR("Bear", SubTypeSet.CreatureType, false),
BEAST("Beast", SubTypeSet.CreatureType, false),
BEEBLE("Beeble", SubTypeSet.CreatureType, false),
BERSERKER("Berserker", SubTypeSet.CreatureType, false),
BIRD("Bird", SubTypeSet.CreatureType, false),
BADGER("Badger", SubTypeSet.CreatureType),
BARBARIAN("Barbarian", SubTypeSet.CreatureType),
BASILISK("Basilisk", SubTypeSet.CreatureType),
BAT("Bat", SubTypeSet.CreatureType),
BEAR("Bear", SubTypeSet.CreatureType),
BEAST("Beast", SubTypeSet.CreatureType),
BEEBLE("Beeble", SubTypeSet.CreatureType),
BERSERKER("Berserker", SubTypeSet.CreatureType),
BIRD("Bird", SubTypeSet.CreatureType),
BITH("Bith", SubTypeSet.CreatureType, true), // Star Wars
BLINKMOTH("Blinkmoth", SubTypeSet.CreatureType, false),
BOAR("Boar", SubTypeSet.CreatureType, false),
BRINGER("Bringer", SubTypeSet.CreatureType, false),
BRUSHWAGG("Brushwagg", SubTypeSet.CreatureType, false),
BLINKMOTH("Blinkmoth", SubTypeSet.CreatureType),
BOAR("Boar", SubTypeSet.CreatureType),
BRINGER("Bringer", SubTypeSet.CreatureType),
BRUSHWAGG("Brushwagg", SubTypeSet.CreatureType),
// C
CALAMARI("Calamari", SubTypeSet.CreatureType, true), // Star Wars
CAMARID("Camarid", SubTypeSet.CreatureType, false),
CAMEL("Camel", SubTypeSet.CreatureType, false),
CARIBOU("Caribou", SubTypeSet.CreatureType, false),
CARRIER("Carrier", SubTypeSet.CreatureType, false),
CAT("Cat", SubTypeSet.CreatureType, false),
CENTAUR("Centaur", SubTypeSet.CreatureType, false),
CAMARID("Camarid", SubTypeSet.CreatureType),
CAMEL("Camel", SubTypeSet.CreatureType),
CARIBOU("Caribou", SubTypeSet.CreatureType),
CARRIER("Carrier", SubTypeSet.CreatureType),
CAT("Cat", SubTypeSet.CreatureType),
CENTAUR("Centaur", SubTypeSet.CreatureType),
CEREAN("Cerean", SubTypeSet.CreatureType, true), // Star Wars
CEPHALID("Cephalid", SubTypeSet.CreatureType, false),
CHIMERA("Chimera", SubTypeSet.CreatureType, false),
CEPHALID("Cephalid", SubTypeSet.CreatureType),
CHIMERA("Chimera", SubTypeSet.CreatureType),
CHISS("Chiss", SubTypeSet.CreatureType, true),
CITIZEN("Citizen", SubTypeSet.CreatureType, false),
CLERIC("Cleric", SubTypeSet.CreatureType, false),
COCKATRICE("Cockatrice", SubTypeSet.CreatureType, false),
CONSTRUCT("Construct", SubTypeSet.CreatureType, false),
COWARD("Coward", SubTypeSet.CreatureType, false),
CRAB("Crab", SubTypeSet.CreatureType, false),
CROCODILE("Crocodile", SubTypeSet.CreatureType, false),
CITIZEN("Citizen", SubTypeSet.CreatureType),
CLERIC("Cleric", SubTypeSet.CreatureType),
COCKATRICE("Cockatrice", SubTypeSet.CreatureType),
CONSTRUCT("Construct", SubTypeSet.CreatureType),
COWARD("Coward", SubTypeSet.CreatureType),
CRAB("Crab", SubTypeSet.CreatureType),
CROCODILE("Crocodile", SubTypeSet.CreatureType),
CYBORG("Cyborg", SubTypeSet.CreatureType, true), // Star Wars
CYCLOPS("Cyclops", SubTypeSet.CreatureType, false),
CYCLOPS("Cyclops", SubTypeSet.CreatureType),
// D
DATHOMIRIAN("Dathomirian", SubTypeSet.CreatureType, true), // Star Wars
DAUTHI("Dauthi", SubTypeSet.CreatureType, false),
DEMON("Demon", SubTypeSet.CreatureType, false),
DESERTER("Deserter", SubTypeSet.CreatureType, false),
DEVIL("Devil", SubTypeSet.CreatureType, false),
DINOSAUR("Dinosaur", SubTypeSet.CreatureType, false), // With Ixalan now being spoiled, need this to be selectable
DJINN("Djinn", SubTypeSet.CreatureType, false),
DRAGON("Dragon", SubTypeSet.CreatureType, false),
DRAKE("Drake", SubTypeSet.CreatureType, false),
DREADNOUGHT("Dreadnought", SubTypeSet.CreatureType, false),
DRONE("Drone", SubTypeSet.CreatureType, false),
DRUID("Druid", SubTypeSet.CreatureType, false),
DAUTHI("Dauthi", SubTypeSet.CreatureType),
DEMON("Demon", SubTypeSet.CreatureType),
DESERTER("Deserter", SubTypeSet.CreatureType),
DEVIL("Devil", SubTypeSet.CreatureType),
DINOSAUR("Dinosaur", SubTypeSet.CreatureType), // With Ixalan now being spoiled, need this to be selectable
DJINN("Djinn", SubTypeSet.CreatureType),
DRAGON("Dragon", SubTypeSet.CreatureType),
DRAKE("Drake", SubTypeSet.CreatureType),
DREADNOUGHT("Dreadnought", SubTypeSet.CreatureType),
DRONE("Drone", SubTypeSet.CreatureType),
DRUID("Druid", SubTypeSet.CreatureType),
DROID("Droid", SubTypeSet.CreatureType, true), // Star Wars
DRYAD("Dryad", SubTypeSet.CreatureType, false),
DWARF("Dwarf", SubTypeSet.CreatureType, false),
DRYAD("Dryad", SubTypeSet.CreatureType),
DWARF("Dwarf", SubTypeSet.CreatureType),
// E
EFREET("Efreet", SubTypeSet.CreatureType, false),
ELDER("Elder", SubTypeSet.CreatureType, false),
ELDRAZI("Eldrazi", SubTypeSet.CreatureType, false),
ELEMENTAL("Elemental", SubTypeSet.CreatureType, false),
ELEPHANT("Elephant", SubTypeSet.CreatureType, false),
ELF("Elf", SubTypeSet.CreatureType, false),
ELK("Elk", SubTypeSet.CreatureType, false),
EYE("Eye", SubTypeSet.CreatureType, false),
EFREET("Efreet", SubTypeSet.CreatureType),
ELDER("Elder", SubTypeSet.CreatureType),
ELDRAZI("Eldrazi", SubTypeSet.CreatureType),
ELEMENTAL("Elemental", SubTypeSet.CreatureType),
ELEPHANT("Elephant", SubTypeSet.CreatureType),
ELF("Elf", SubTypeSet.CreatureType),
ELK("Elk", SubTypeSet.CreatureType),
EYE("Eye", SubTypeSet.CreatureType),
EWOK("Ewok", SubTypeSet.CreatureType, true), // Star Wars
// F
FAERIE("Faerie", SubTypeSet.CreatureType, false),
FERRET("Ferret", SubTypeSet.CreatureType, false),
FISH("Fish", SubTypeSet.CreatureType, false),
FLAGBEARER("Flagbearer", SubTypeSet.CreatureType, false),
FOX("Fox", SubTypeSet.CreatureType, false),
FROG("Frog", SubTypeSet.CreatureType, false),
FUNGUS("Fungus", SubTypeSet.CreatureType, false),
FAERIE("Faerie", SubTypeSet.CreatureType),
FERRET("Ferret", SubTypeSet.CreatureType),
FISH("Fish", SubTypeSet.CreatureType),
FLAGBEARER("Flagbearer", SubTypeSet.CreatureType),
FOX("Fox", SubTypeSet.CreatureType),
FROG("Frog", SubTypeSet.CreatureType),
FUNGUS("Fungus", SubTypeSet.CreatureType),
// G
GAMORREAN("Gamorrean", SubTypeSet.CreatureType, true), // Star Wars
GAND("Gand", SubTypeSet.CreatureType, true), // Star Wars
GARGOYLE("Gargoyle", SubTypeSet.CreatureType, false),
GERM("Germ", SubTypeSet.CreatureType, false),
GIANT("Giant", SubTypeSet.CreatureType, false),
GNOME("Gnome", SubTypeSet.CreatureType, false),
GOLEM("Golem", SubTypeSet.CreatureType, false),
GOAT("Goat", SubTypeSet.CreatureType, false),
GOBLIN("Goblin", SubTypeSet.CreatureType, false),
GOD("God", SubTypeSet.CreatureType, false),
GORGON("Gorgon", SubTypeSet.CreatureType, false),
GRAVEBORN("Graveborn", SubTypeSet.CreatureType, false),
GREMLIN("Gremlin", SubTypeSet.CreatureType, false),
GRIFFIN("Griffin", SubTypeSet.CreatureType, false),
GARGOYLE("Gargoyle", SubTypeSet.CreatureType),
GERM("Germ", SubTypeSet.CreatureType),
GIANT("Giant", SubTypeSet.CreatureType),
GNOME("Gnome", SubTypeSet.CreatureType),
GOLEM("Golem", SubTypeSet.CreatureType),
GOAT("Goat", SubTypeSet.CreatureType),
GOBLIN("Goblin", SubTypeSet.CreatureType),
GOD("God", SubTypeSet.CreatureType),
GORGON("Gorgon", SubTypeSet.CreatureType),
GRAVEBORN("Graveborn", SubTypeSet.CreatureType),
GREMLIN("Gremlin", SubTypeSet.CreatureType),
GRIFFIN("Griffin", SubTypeSet.CreatureType),
GUNGAN("Gungan", SubTypeSet.CreatureType, true), // Star Wars
// H
HAG("Hag", SubTypeSet.CreatureType, false),
HARPY("Harpy", SubTypeSet.CreatureType, false),
HELLION("Hellion", SubTypeSet.CreatureType, false),
HIPPO("Hippo", SubTypeSet.CreatureType, false),
HIPPOGRIFF("Hippogriff", SubTypeSet.CreatureType, false),
HOMARID("Homarid", SubTypeSet.CreatureType, false),
HOMUNCULUS("Homunculus", SubTypeSet.CreatureType, false),
HORROR("Horror", SubTypeSet.CreatureType, false),
HORSE("Horse", SubTypeSet.CreatureType, false),
HOUND("Hound", SubTypeSet.CreatureType, false),
HUMAN("Human", SubTypeSet.CreatureType, false),
HUNTER("Hunter", SubTypeSet.CreatureType, false),
HAG("Hag", SubTypeSet.CreatureType),
HARPY("Harpy", SubTypeSet.CreatureType),
HELLION("Hellion", SubTypeSet.CreatureType),
HIPPO("Hippo", SubTypeSet.CreatureType),
HIPPOGRIFF("Hippogriff", SubTypeSet.CreatureType),
HOMARID("Homarid", SubTypeSet.CreatureType),
HOMUNCULUS("Homunculus", SubTypeSet.CreatureType),
HORROR("Horror", SubTypeSet.CreatureType),
HORSE("Horse", SubTypeSet.CreatureType),
HOUND("Hound", SubTypeSet.CreatureType),
HUMAN("Human", SubTypeSet.CreatureType),
HUNTER("Hunter", SubTypeSet.CreatureType),
HUTT("Hutt", SubTypeSet.CreatureType, true), // Star Wars
HYDRA("Hydra", SubTypeSet.CreatureType, false),
HYENA("Hyena", SubTypeSet.CreatureType, false),
HYDRA("Hydra", SubTypeSet.CreatureType),
HYENA("Hyena", SubTypeSet.CreatureType),
// I
ILLUSION("Illusion", SubTypeSet.CreatureType, false),
IMP("Imp", SubTypeSet.CreatureType, false),
INCARNATION("Incarnation", SubTypeSet.CreatureType, false),
INSECT("Insect", SubTypeSet.CreatureType, false),
ILLUSION("Illusion", SubTypeSet.CreatureType),
IMP("Imp", SubTypeSet.CreatureType),
INCARNATION("Incarnation", SubTypeSet.CreatureType),
INSECT("Insect", SubTypeSet.CreatureType),
ITHORIAN("Ithorian", SubTypeSet.CreatureType, true), // Star Wars
// J
JACKAL("Jackal", SubTypeSet.CreatureType, false),
JACKAL("Jackal", SubTypeSet.CreatureType),
JAWA("Jawa", SubTypeSet.CreatureType, true),
JEDI("Jedi", SubTypeSet.CreatureType, true), // Star Wars
JELLYFISH("Jellyfish", SubTypeSet.CreatureType, false),
JUGGERNAUT("Juggernaut", SubTypeSet.CreatureType, false),
JELLYFISH("Jellyfish", SubTypeSet.CreatureType),
JUGGERNAUT("Juggernaut", SubTypeSet.CreatureType),
// K
KALEESH("Kaleesh", SubTypeSet.CreatureType, true), // Star Wars
KAVU("Kavu", SubTypeSet.CreatureType, false),
KAVU("Kavu", SubTypeSet.CreatureType),
KELDOR("KelDor", SubTypeSet.CreatureType, true),
KIRIN("Kirin", SubTypeSet.CreatureType, false),
KITHKIN("Kithkin", SubTypeSet.CreatureType, false),
KNIGHT("Knight", SubTypeSet.CreatureType, false),
KOBOLD("Kobold", SubTypeSet.CreatureType, false),
KIRIN("Kirin", SubTypeSet.CreatureType),
KITHKIN("Kithkin", SubTypeSet.CreatureType),
KNIGHT("Knight", SubTypeSet.CreatureType),
KOBOLD("Kobold", SubTypeSet.CreatureType),
KOORIVAR("Koorivar", SubTypeSet.CreatureType, true),
KOR("Kor", SubTypeSet.CreatureType, false),
KRAKEN("Kraken", SubTypeSet.CreatureType, false),
KOR("Kor", SubTypeSet.CreatureType),
KRAKEN("Kraken", SubTypeSet.CreatureType),
// L
LAMIA("Lamia", SubTypeSet.CreatureType, false),
LAMMASU("Lammasu", SubTypeSet.CreatureType, false),
LEECH("Leech", SubTypeSet.CreatureType, false),
LEVIATHAN("Leviathan", SubTypeSet.CreatureType, false),
LHURGOYF("Lhurgoyf", SubTypeSet.CreatureType, false),
LICID("Licid", SubTypeSet.CreatureType, false),
LIZARD("Lizard", SubTypeSet.CreatureType, false),
LAMIA("Lamia", SubTypeSet.CreatureType),
LAMMASU("Lammasu", SubTypeSet.CreatureType),
LEECH("Leech", SubTypeSet.CreatureType),
LEVIATHAN("Leviathan", SubTypeSet.CreatureType),
LHURGOYF("Lhurgoyf", SubTypeSet.CreatureType),
LICID("Licid", SubTypeSet.CreatureType),
LIZARD("Lizard", SubTypeSet.CreatureType),
// M
MANTELLIAN("Mantellian", SubTypeSet.CreatureType, true), // Star Wars
MANTICORE("Manticore", SubTypeSet.CreatureType, false),
MASTICORE("Masticore", SubTypeSet.CreatureType, false),
MERCENARY("Mercenary", SubTypeSet.CreatureType, false),
MERFOLK("Merfolk", SubTypeSet.CreatureType, false),
METATHRAN("Metathran", SubTypeSet.CreatureType, false),
MINION("Minion", SubTypeSet.CreatureType, false),
MINOTAUR("Minotaur", SubTypeSet.CreatureType, false),
MANTICORE("Manticore", SubTypeSet.CreatureType),
MASTICORE("Masticore", SubTypeSet.CreatureType),
MERCENARY("Mercenary", SubTypeSet.CreatureType),
MERFOLK("Merfolk", SubTypeSet.CreatureType),
METATHRAN("Metathran", SubTypeSet.CreatureType),
MINION("Minion", SubTypeSet.CreatureType),
MINOTAUR("Minotaur", SubTypeSet.CreatureType),
MIRIALAN("Mirialan", SubTypeSet.CreatureType, true), // Star Wars
MOLE("Mole", SubTypeSet.CreatureType, false),
MONGER("Monger", SubTypeSet.CreatureType, false),
MONGOOSE("Mongoose", SubTypeSet.CreatureType, false),
MONK("Monk", SubTypeSet.CreatureType, false),
MONKEY("Monkey", SubTypeSet.CreatureType, false),
MOONFOLK("Moonfolk", SubTypeSet.CreatureType, false),
MUTANT("Mutant", SubTypeSet.CreatureType, false),
MYR("Myr", SubTypeSet.CreatureType, false),
MYSTIC("Mystic", SubTypeSet.CreatureType, false),
MOLE("Mole", SubTypeSet.CreatureType),
MONGER("Monger", SubTypeSet.CreatureType),
MONGOOSE("Mongoose", SubTypeSet.CreatureType),
MONK("Monk", SubTypeSet.CreatureType),
MONKEY("Monkey", SubTypeSet.CreatureType),
MOONFOLK("Moonfolk", SubTypeSet.CreatureType),
MUTANT("Mutant", SubTypeSet.CreatureType),
MYR("Myr", SubTypeSet.CreatureType),
MYSTIC("Mystic", SubTypeSet.CreatureType),
// N
NAGA("Naga", SubTypeSet.CreatureType, false),
NAUTILUS("Nautilus", SubTypeSet.CreatureType, false),
NAGA("Naga", SubTypeSet.CreatureType),
NAUTILUS("Nautilus", SubTypeSet.CreatureType),
NAUTOLAN("Nautolan", SubTypeSet.CreatureType, true), // Star Wars
NEIMOIDIAN("Neimoidian", SubTypeSet.CreatureType, true), // Star Wars
NEPHILIM("Nephilim", SubTypeSet.CreatureType, false),
NIGHTMARE("Nightmare", SubTypeSet.CreatureType, false),
NIGHTSTALKER("Nightstalker", SubTypeSet.CreatureType, false),
NINJA("Ninja", SubTypeSet.CreatureType, false),
NOGGLE("Noggle", SubTypeSet.CreatureType, false),
NOMAD("Nomad", SubTypeSet.CreatureType, false),
NYMPH("Nymph", SubTypeSet.CreatureType, false),
NEPHILIM("Nephilim", SubTypeSet.CreatureType),
NIGHTMARE("Nightmare", SubTypeSet.CreatureType),
NIGHTSTALKER("Nightstalker", SubTypeSet.CreatureType),
NINJA("Ninja", SubTypeSet.CreatureType),
NOGGLE("Noggle", SubTypeSet.CreatureType),
NOMAD("Nomad", SubTypeSet.CreatureType),
NYMPH("Nymph", SubTypeSet.CreatureType),
// O
OCTOPUS("Octopus", SubTypeSet.CreatureType, false),
OGRE("Ogre", SubTypeSet.CreatureType, false),
OOZE("Ooze", SubTypeSet.CreatureType, false),
ORB("Orb", SubTypeSet.CreatureType, false),
ORC("Orc", SubTypeSet.CreatureType, false),
ORGG("Orgg", SubTypeSet.CreatureType, false),
OCTOPUS("Octopus", SubTypeSet.CreatureType),
OGRE("Ogre", SubTypeSet.CreatureType),
OOZE("Ooze", SubTypeSet.CreatureType),
ORB("Orb", SubTypeSet.CreatureType),
ORC("Orc", SubTypeSet.CreatureType),
ORGG("Orgg", SubTypeSet.CreatureType),
ORTOLAN("Ortolan", SubTypeSet.CreatureType, true),
OUPHE("Ouphe", SubTypeSet.CreatureType, false),
OX("Ox", SubTypeSet.CreatureType, false),
OYSTER("Oyster", SubTypeSet.CreatureType, false),
OUPHE("Ouphe", SubTypeSet.CreatureType),
OX("Ox", SubTypeSet.CreatureType),
OYSTER("Oyster", SubTypeSet.CreatureType),
// P
PEGASUS("Pegasus", SubTypeSet.CreatureType, false),
PENTAVITE("Pentavite", SubTypeSet.CreatureType, false),
PEST("Pest", SubTypeSet.CreatureType, false),
PHELDDAGRIF("Phelddagrif", SubTypeSet.CreatureType, false),
PHOENIX("Phoenix", SubTypeSet.CreatureType, false),
PILOT("Pilot", SubTypeSet.CreatureType, false),
PINCHER("Pincher", SubTypeSet.CreatureType, false),
PIRATE("Pirate", SubTypeSet.CreatureType, false),
PLANT("Plant", SubTypeSet.CreatureType, false),
PRAETOR("Praetor", SubTypeSet.CreatureType, false),
PRISM("Prism", SubTypeSet.CreatureType, false),
PROCESSOR("Processor", SubTypeSet.CreatureType, false),
PEGASUS("Pegasus", SubTypeSet.CreatureType),
PENTAVITE("Pentavite", SubTypeSet.CreatureType),
PEST("Pest", SubTypeSet.CreatureType),
PHELDDAGRIF("Phelddagrif", SubTypeSet.CreatureType),
PHOENIX("Phoenix", SubTypeSet.CreatureType),
PILOT("Pilot", SubTypeSet.CreatureType),
PINCHER("Pincher", SubTypeSet.CreatureType),
PIRATE("Pirate", SubTypeSet.CreatureType),
PLANT("Plant", SubTypeSet.CreatureType),
PRAETOR("Praetor", SubTypeSet.CreatureType),
PRISM("Prism", SubTypeSet.CreatureType),
PROCESSOR("Processor", SubTypeSet.CreatureType),
PUREBLOOD("Pureblood", SubTypeSet.CreatureType, true),
// Q
QUARREN("Quarren", SubTypeSet.CreatureType, true), // Star Wars
// R
RABBIT("Rabbit", SubTypeSet.CreatureType, false),
RAT("Rat", SubTypeSet.CreatureType, false),
REBEL("Rebel", SubTypeSet.CreatureType, false),
REFLECTION("Reflection", SubTypeSet.CreatureType, false),
RHINO("Rhino", SubTypeSet.CreatureType, false),
RIGGER("Rigger", SubTypeSet.CreatureType, false),
RABBIT("Rabbit", SubTypeSet.CreatureType),
RAT("Rat", SubTypeSet.CreatureType),
REBEL("Rebel", SubTypeSet.CreatureType),
REFLECTION("Reflection", SubTypeSet.CreatureType),
RHINO("Rhino", SubTypeSet.CreatureType),
RIGGER("Rigger", SubTypeSet.CreatureType),
RODIAN("Rodian", SubTypeSet.CreatureType, true), // Star Wars
ROGUE("Rogue", SubTypeSet.CreatureType, false),
ROGUE("Rogue", SubTypeSet.CreatureType),
// S
SABLE("Sable", SubTypeSet.CreatureType, false),
SALAMANDER("Salamander", SubTypeSet.CreatureType, false),
SAMURAI("Samurai", SubTypeSet.CreatureType, false),
SAND("Sand", SubTypeSet.CreatureType, false),
SAPROLING("Saproling", SubTypeSet.CreatureType, false),
SATYR("Satyr", SubTypeSet.CreatureType, false),
SCARECROW("Scarecrow", SubTypeSet.CreatureType, false),
SCION("Scion", SubTypeSet.CreatureType, false),
SCORPION("Scorpion", SubTypeSet.CreatureType, false),
SCOUT("Scout", SubTypeSet.CreatureType, false),
SERF("Serf", SubTypeSet.CreatureType, false),
SERPENT("Serpent", SubTypeSet.CreatureType, false),
SERVO("Servo", SubTypeSet.CreatureType, false),
SHADE("Shade", SubTypeSet.CreatureType, false),
SHAMAN("Shaman", SubTypeSet.CreatureType, false),
SHAPESHIFTER("Shapeshifter", SubTypeSet.CreatureType, false),
SHEEP("Sheep", SubTypeSet.CreatureType, false),
SIREN("Siren", SubTypeSet.CreatureType, false),
SITH("Sith", SubTypeSet.CreatureType, false),
SKELETON("Skeleton", SubTypeSet.CreatureType, false),
SLITH("Slith", SubTypeSet.CreatureType, false),
SLIVER("Sliver", SubTypeSet.CreatureType, false),
SLUG("Slug", SubTypeSet.CreatureType, false),
SNAKE("Snake", SubTypeSet.CreatureType, false),
SOLDIER("Soldier", SubTypeSet.CreatureType, false),
SOLTARI("Soltari", SubTypeSet.CreatureType, false),
SPAWN("Spawn", SubTypeSet.CreatureType, false),
SPECTER("Specter", SubTypeSet.CreatureType, false),
SPELLSHAPER("Spellshaper", SubTypeSet.CreatureType, false),
SPHINX("Sphinx", SubTypeSet.CreatureType, false),
SPIDER("Spider", SubTypeSet.CreatureType, false),
SPIKE("Spike", SubTypeSet.CreatureType, false),
SPIRIT("Spirit", SubTypeSet.CreatureType, false),
SPLITTER("Splitter", SubTypeSet.CreatureType, false),
SPONGE("Sponge", SubTypeSet.CreatureType, false),
SQUID("Squid", SubTypeSet.CreatureType, false),
SQUIRREL("Squirrel", SubTypeSet.CreatureType, false),
STARFISH("Starfish", SubTypeSet.CreatureType, false),
SABLE("Sable", SubTypeSet.CreatureType),
SALAMANDER("Salamander", SubTypeSet.CreatureType),
SAMURAI("Samurai", SubTypeSet.CreatureType),
SAND("Sand", SubTypeSet.CreatureType),
SAPROLING("Saproling", SubTypeSet.CreatureType),
SATYR("Satyr", SubTypeSet.CreatureType),
SCARECROW("Scarecrow", SubTypeSet.CreatureType),
SCION("Scion", SubTypeSet.CreatureType),
SCORPION("Scorpion", SubTypeSet.CreatureType),
SCOUT("Scout", SubTypeSet.CreatureType),
SERF("Serf", SubTypeSet.CreatureType),
SERPENT("Serpent", SubTypeSet.CreatureType),
SERVO("Servo", SubTypeSet.CreatureType),
SHADE("Shade", SubTypeSet.CreatureType),
SHAMAN("Shaman", SubTypeSet.CreatureType),
SHAPESHIFTER("Shapeshifter", SubTypeSet.CreatureType),
SHEEP("Sheep", SubTypeSet.CreatureType),
SIREN("Siren", SubTypeSet.CreatureType),
SITH("Sith", SubTypeSet.CreatureType),
SKELETON("Skeleton", SubTypeSet.CreatureType),
SLITH("Slith", SubTypeSet.CreatureType),
SLIVER("Sliver", SubTypeSet.CreatureType),
SLUG("Slug", SubTypeSet.CreatureType),
SNAKE("Snake", SubTypeSet.CreatureType),
SOLDIER("Soldier", SubTypeSet.CreatureType),
SOLTARI("Soltari", SubTypeSet.CreatureType),
SPAWN("Spawn", SubTypeSet.CreatureType),
SPECTER("Specter", SubTypeSet.CreatureType),
SPELLSHAPER("Spellshaper", SubTypeSet.CreatureType),
SPHINX("Sphinx", SubTypeSet.CreatureType),
SPIDER("Spider", SubTypeSet.CreatureType),
SPIKE("Spike", SubTypeSet.CreatureType),
SPIRIT("Spirit", SubTypeSet.CreatureType),
SPLITTER("Splitter", SubTypeSet.CreatureType),
SPONGE("Sponge", SubTypeSet.CreatureType),
SQUID("Squid", SubTypeSet.CreatureType),
SQUIRREL("Squirrel", SubTypeSet.CreatureType),
STARFISH("Starfish", SubTypeSet.CreatureType),
STARSHIP("Starship", SubTypeSet.CreatureType, true), // Star Wars
SULLUSTAN("Sullustan", SubTypeSet.CreatureType, true), // Star Wars
SURRAKAR("Surrakar", SubTypeSet.CreatureType, false),
SURVIVOR("Survivor", SubTypeSet.CreatureType, false),
SURRAKAR("Surrakar", SubTypeSet.CreatureType),
SURVIVOR("Survivor", SubTypeSet.CreatureType),
// T
TETRAVITE("Tetravite", SubTypeSet.CreatureType, false),
THALAKOS("Thalakos", SubTypeSet.CreatureType, false),
THOPTER("Thopter", SubTypeSet.CreatureType, false),
TETRAVITE("Tetravite", SubTypeSet.CreatureType),
THALAKOS("Thalakos", SubTypeSet.CreatureType),
THOPTER("Thopter", SubTypeSet.CreatureType),
TRANDOSHAN("Trandoshan", SubTypeSet.CreatureType, true), // Star Wars
THRULL("Thrull", SubTypeSet.CreatureType, false),
TREEFOLK("Treefolk", SubTypeSet.CreatureType, false),
TRISKELAVITE("Triskelavite", SubTypeSet.CreatureType, false),
TROLL("Troll", SubTypeSet.CreatureType, false),
TURTLE("Turtle", SubTypeSet.CreatureType, false),
THRULL("Thrull", SubTypeSet.CreatureType),
TREEFOLK("Treefolk", SubTypeSet.CreatureType),
TRISKELAVITE("Triskelavite", SubTypeSet.CreatureType),
TROLL("Troll", SubTypeSet.CreatureType),
TURTLE("Turtle", SubTypeSet.CreatureType),
TROOPER("Trooper", SubTypeSet.CreatureType, true), // Star Wars
TWILEK("Twi'lek", SubTypeSet.CreatureType, true), // Star Wars
// U
UGNAUGHT("Ugnaught", SubTypeSet.CreatureType, true),
UNICORN("Unicorn", SubTypeSet.CreatureType, false),
UNICORN("Unicorn", SubTypeSet.CreatureType),
//V
VAMPIRE("Vampire", SubTypeSet.CreatureType, false),
VEDALKEN("Vedalken", SubTypeSet.CreatureType, false),
VIASHINO("Viashino", SubTypeSet.CreatureType, false),
VOLVER("Volver", SubTypeSet.CreatureType, false),
VAMPIRE("Vampire", SubTypeSet.CreatureType),
VEDALKEN("Vedalken", SubTypeSet.CreatureType),
VIASHINO("Viashino", SubTypeSet.CreatureType),
VOLVER("Volver", SubTypeSet.CreatureType),
//W
WALL("Wall", SubTypeSet.CreatureType, false),
WARRIOR("Warrior", SubTypeSet.CreatureType, false),
WALL("Wall", SubTypeSet.CreatureType),
WARRIOR("Warrior", SubTypeSet.CreatureType),
WEEQUAY("Weequay", SubTypeSet.CreatureType, true),
WEIRD("Weird", SubTypeSet.CreatureType, false),
WEREWOLF("Werewolf", SubTypeSet.CreatureType, false),
WHALE("Whale", SubTypeSet.CreatureType, false),
WIZARD("Wizard", SubTypeSet.CreatureType, false),
WOLF("Wolf", SubTypeSet.CreatureType, false),
WOLVERINE("Wolverine", SubTypeSet.CreatureType, false),
WOMBAT("Wombat", SubTypeSet.CreatureType, false),
WEIRD("Weird", SubTypeSet.CreatureType),
WEREWOLF("Werewolf", SubTypeSet.CreatureType),
WHALE("Whale", SubTypeSet.CreatureType),
WIZARD("Wizard", SubTypeSet.CreatureType),
WOLF("Wolf", SubTypeSet.CreatureType),
WOLVERINE("Wolverine", SubTypeSet.CreatureType),
WOMBAT("Wombat", SubTypeSet.CreatureType),
WOOKIEE("Wookiee", SubTypeSet.CreatureType, true), // Star Wars
WORM("Worm", SubTypeSet.CreatureType, false),
WRAITH("Wraith", SubTypeSet.CreatureType, false),
WURM("Wurm", SubTypeSet.CreatureType, false),
WORM("Worm", SubTypeSet.CreatureType),
WRAITH("Wraith", SubTypeSet.CreatureType),
WURM("Wurm", SubTypeSet.CreatureType),
// Y
YETI("Yeti", SubTypeSet.CreatureType, false),
YETI("Yeti", SubTypeSet.CreatureType),
// Z
ZABRAK("Zabrak", SubTypeSet.CreatureType, true), // Star Wars
ZOMBIE("Zombie", SubTypeSet.CreatureType, false),
ZUBERA("Zubera", SubTypeSet.CreatureType, false),
ZOMBIE("Zombie", SubTypeSet.CreatureType),
ZUBERA("Zubera", SubTypeSet.CreatureType),
// Planeswalker
AJANI("Ajani", SubTypeSet.PlaneswalkerType, false),
ARLINN("Arlinn", SubTypeSet.PlaneswalkerType, false),
ASHIOK("Ashiok", SubTypeSet.PlaneswalkerType, false),
AJANI("Ajani", SubTypeSet.PlaneswalkerType),
ARLINN("Arlinn", SubTypeSet.PlaneswalkerType),
ASHIOK("Ashiok", SubTypeSet.PlaneswalkerType),
AURRA("Aurra", SubTypeSet.PlaneswalkerType, true), // Star Wars
BOLAS("Bolas", SubTypeSet.PlaneswalkerType, false),
CHANDRA("Chandra", SubTypeSet.PlaneswalkerType, false),
DACK("Dack", SubTypeSet.PlaneswalkerType, false),
DARETTI("Daretti", SubTypeSet.PlaneswalkerType, false),
DOMRI("Domri", SubTypeSet.PlaneswalkerType, false),
BOLAS("Bolas", SubTypeSet.PlaneswalkerType),
CHANDRA("Chandra", SubTypeSet.PlaneswalkerType),
DACK("Dack", SubTypeSet.PlaneswalkerType),
DARETTI("Daretti", SubTypeSet.PlaneswalkerType),
DOMRI("Domri", SubTypeSet.PlaneswalkerType),
DOOKU("Dooku", SubTypeSet.PlaneswalkerType, true), // Star Wars
DOVIN("Dovin", SubTypeSet.PlaneswalkerType, false),
ELSPETH("Elspeth", SubTypeSet.PlaneswalkerType, false),
FREYALISE("Freyalise", SubTypeSet.PlaneswalkerType, false),
GARRUK("Garruk", SubTypeSet.PlaneswalkerType, false),
GIDEON("Gideon", SubTypeSet.PlaneswalkerType, false),
HUATLI("Huatli", SubTypeSet.PlaneswalkerType, false),
JACE("Jace", SubTypeSet.PlaneswalkerType, false),
KARN("Karn", SubTypeSet.PlaneswalkerType, false),
KAYA("Kaya", SubTypeSet.PlaneswalkerType, false),
KIORA("Kiora", SubTypeSet.PlaneswalkerType, false),
KOTH("Koth", SubTypeSet.PlaneswalkerType, false),
LILIANA("Liliana", SubTypeSet.PlaneswalkerType, false),
NAHIRI("Nahiri", SubTypeSet.PlaneswalkerType, false),
NARSET("Narset", SubTypeSet.PlaneswalkerType, false),
NISSA("Nissa", SubTypeSet.PlaneswalkerType, false),
NIXILIS("Nixilis", SubTypeSet.PlaneswalkerType, false),
DOVIN("Dovin", SubTypeSet.PlaneswalkerType),
ELSPETH("Elspeth", SubTypeSet.PlaneswalkerType),
FREYALISE("Freyalise", SubTypeSet.PlaneswalkerType),
GARRUK("Garruk", SubTypeSet.PlaneswalkerType),
GIDEON("Gideon", SubTypeSet.PlaneswalkerType),
HUATLI("Huatli", SubTypeSet.PlaneswalkerType),
JACE("Jace", SubTypeSet.PlaneswalkerType),
KARN("Karn", SubTypeSet.PlaneswalkerType),
KAYA("Kaya", SubTypeSet.PlaneswalkerType),
KIORA("Kiora", SubTypeSet.PlaneswalkerType),
KOTH("Koth", SubTypeSet.PlaneswalkerType),
LILIANA("Liliana", SubTypeSet.PlaneswalkerType),
NAHIRI("Nahiri", SubTypeSet.PlaneswalkerType),
NARSET("Narset", SubTypeSet.PlaneswalkerType),
NISSA("Nissa", SubTypeSet.PlaneswalkerType),
NIXILIS("Nixilis", SubTypeSet.PlaneswalkerType),
OBI_WAN("Obi-Wan", SubTypeSet.PlaneswalkerType, true), // Star Wars
RAL("Ral", SubTypeSet.PlaneswalkerType, false),
SAHEELI("Saheeli", SubTypeSet.PlaneswalkerType, false),
SAMUT("Samut", SubTypeSet.PlaneswalkerType, false),
SARKHAN("Sarkhan", SubTypeSet.PlaneswalkerType, false),
RAL("Ral", SubTypeSet.PlaneswalkerType),
SAHEELI("Saheeli", SubTypeSet.PlaneswalkerType),
SAMUT("Samut", SubTypeSet.PlaneswalkerType),
SARKHAN("Sarkhan", SubTypeSet.PlaneswalkerType),
SIDIOUS("Sidious", SubTypeSet.PlaneswalkerType, true), // Star Wars
SORIN("Sorin", SubTypeSet.PlaneswalkerType, false),
TAMIYO("Tamiyo", SubTypeSet.PlaneswalkerType, false),
TEFERI("Teferi", SubTypeSet.PlaneswalkerType, false),
TEZZERET("Tezzeret", SubTypeSet.PlaneswalkerType, false),
TIBALT("Tibalt", SubTypeSet.PlaneswalkerType, false),
UGIN("Ugin", SubTypeSet.PlaneswalkerType, false),
VENSER("Venser", SubTypeSet.PlaneswalkerType, false),
VRASKA("Vraska", SubTypeSet.PlaneswalkerType, false),
XENAGOS("Xenagos", SubTypeSet.PlaneswalkerType, false),
SORIN("Sorin", SubTypeSet.PlaneswalkerType),
TAMIYO("Tamiyo", SubTypeSet.PlaneswalkerType),
TEFERI("Teferi", SubTypeSet.PlaneswalkerType),
TEZZERET("Tezzeret", SubTypeSet.PlaneswalkerType),
TIBALT("Tibalt", SubTypeSet.PlaneswalkerType),
UGIN("Ugin", SubTypeSet.PlaneswalkerType),
VENSER("Venser", SubTypeSet.PlaneswalkerType),
VRASKA("Vraska", SubTypeSet.PlaneswalkerType),
XENAGOS("Xenagos", SubTypeSet.PlaneswalkerType),
YODA("Yoda", SubTypeSet.PlaneswalkerType, true); // Star Wars
private final SubTypeSet subTypeSet;
SubType(String description, SubTypeSet subTypeSet) {
this(description, subTypeSet, false);
}
SubType(String description, SubTypeSet subTypeSet, boolean customSet) {
this.description = description;
this.subTypeSet = subTypeSet;
this.customSet = customSet;
}
public String getDescription() {
return description;
}
@ -404,12 +418,6 @@ public enum SubType {
return description;
}
SubType(String description, SubTypeSet subTypeSet, boolean customSet) {
this.description = description;
this.subTypeSet = subTypeSet;
this.customSet = customSet;
}
public static SubType byDescription(String subType) {
for (SubType s : values()) {
if (s.getDescription().equals(subType)) {
@ -434,7 +442,10 @@ public enum SubType {
}
public static Set<SubType> getBasicLands(boolean customSet) {
return Arrays.stream(values()).filter(s -> s.customSet == customSet).filter(p -> p.getSubTypeSet() == SubTypeSet.BasicLandType).collect(Collectors.toSet());
return Arrays.stream(values())
.filter(p -> p.getSubTypeSet() == SubTypeSet.BasicLandType)
.filter(s -> s.customSet == customSet)
.collect(Collectors.toSet());
}
public static SubTypeList getLandTypes(boolean customSet) {

View file

@ -1,20 +1,27 @@
package mage.util;
import mage.constants.SubType;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import mage.constants.SubType;
public class SubTypeList extends ArrayList<SubType> {
@Deprecated
public boolean addAll(List<String> subtypes) {
return addAll(subtypes.stream().map(SubType::byDescription).collect(Collectors.toList()));
return addAll(subtypes.stream()
.map(SubType::byDescription)
.collect(Collectors.toList()));
}
@Deprecated
public boolean removeAll(List<String> subtypes){
return removeAll(subtypes.stream().map(SubType::byDescription).collect(Collectors.toList()));
return removeAll(subtypes.stream()
.map(SubType::byDescription)
.collect(Collectors.toList()));
}
@ -22,10 +29,17 @@ public class SubTypeList extends ArrayList<SubType> {
return Collections.addAll(this, subTypes);
}
public boolean removeAll(SubType... subTypes) {
return super.removeAll(Arrays.stream(subTypes)
.collect(Collectors.toList()));
}
@Deprecated
public boolean add(String s) {
return add(SubType.byDescription(s));
}
@Deprecated
public boolean contains(String s) {
return contains(SubType.byDescription(s));
}