added new helper methods to test for CardType, to get rid of the contains(CardType.XXX) everywhere, put the logic of that in one place and use the interface call

This commit is contained in:
ingmargoudt 2017-03-04 00:16:36 +01:00
parent 6b20d352ca
commit 5a57731968
69 changed files with 151 additions and 120 deletions

View file

@ -209,8 +209,8 @@ public class TransformTest extends CardTestPlayerBase {
assertGraveyardCount(playerA, "Startled Awake", 0); assertGraveyardCount(playerA, "Startled Awake", 0);
assertPermanentCount(playerA, "Persistent Nightmare", 1); // Night-side card of Startled Awake assertPermanentCount(playerA, "Persistent Nightmare", 1); // Night-side card of Startled Awake
Permanent nightmare = getPermanent("Persistent Nightmare", playerA); Permanent nightmare = getPermanent("Persistent Nightmare", playerA);
Assert.assertTrue("Has to have creature card type", nightmare.getCardType().contains(CardType.CREATURE)); Assert.assertTrue("Has to have creature card type", nightmare.isCreature());
Assert.assertFalse("Has not to have sorcery card type", nightmare.getCardType().contains(CardType.SORCERY)); Assert.assertFalse("Has not to have sorcery card type", nightmare.isSorcery());
} }
/** /**

View file

@ -82,4 +82,34 @@ public interface MageObject extends MageItem, Serializable {
void setZoneChangeCounter(int value, Game game); void setZoneChangeCounter(int value, Game game);
default boolean isCreature(){
return getCardType().contains(CardType.CREATURE);
}
default boolean isArtifact(){
return getCardType().contains(CardType.ARTIFACT);
}
default boolean isLand(){
return getCardType().contains(CardType.LAND);
}
default boolean isEnchantment(){
return getCardType().contains(CardType.ENCHANTMENT);
}
default boolean isInstant(){
return getCardType().contains(CardType.INSTANT);
}
default boolean isSorcery(){
return getCardType().contains(CardType.SORCERY);
}
default boolean isPlaneswalker(){
return getCardType().contains(CardType.PLANESWALKER);
}
} }

View file

@ -183,7 +183,7 @@ public abstract class MageObjectImpl implements MageObject {
public ObjectColor getFrameColor(Game game) { public ObjectColor getFrameColor(Game game) {
// For lands, add any colors of mana the land can produce to // For lands, add any colors of mana the land can produce to
// its frame colors. // its frame colors.
if (getCardType().contains(CardType.LAND)) { if (this.isLand()) {
ObjectColor cl = frameColor.copy(); ObjectColor cl = frameColor.copy();
for (Ability ab: getAbilities()) { for (Ability ab: getAbilities()) {
if (ab instanceof ActivatedManaAbilityImpl) { if (ab instanceof ActivatedManaAbilityImpl) {

View file

@ -71,7 +71,7 @@ public class ConstellationAbility extends TriggeredAbilityImpl {
public boolean checkTrigger(GameEvent event, Game game) { public boolean checkTrigger(GameEvent event, Game game) {
if (event.getPlayerId().equals(this.getControllerId())) { if (event.getPlayerId().equals(this.getControllerId())) {
Permanent permanent = game.getPermanent(event.getTargetId()); Permanent permanent = game.getPermanent(event.getTargetId());
if (permanent != null && permanent.getCardType().contains(CardType.ENCHANTMENT)) { if (permanent != null && permanent.isEnchantment()) {
return true; return true;
} }
} }

View file

@ -93,7 +93,7 @@ public class AttacksAllTriggeredAbility extends TriggeredAbilityImpl {
check = true; check = true;
} else { } else {
Permanent planeswalker = game.getPermanent(event.getTargetId()); Permanent planeswalker = game.getPermanent(event.getTargetId());
if (planeswalker != null && planeswalker.getCardType().contains(CardType.PLANESWALKER) && planeswalker.getControllerId().equals(getControllerId())) { if (planeswalker != null && planeswalker.isPlaneswalker() && planeswalker.getControllerId().equals(getControllerId())) {
check = true; check = true;
} }
} }

View file

@ -38,7 +38,7 @@ public class DealtDamageAndDiedTriggeredAbility extends TriggeredAbilityImpl {
public boolean checkTrigger(GameEvent event, Game game) { public boolean checkTrigger(GameEvent event, Game game) {
if (((ZoneChangeEvent)event).isDiesEvent()) { if (((ZoneChangeEvent)event).isDiesEvent()) {
ZoneChangeEvent zEvent = (ZoneChangeEvent) event; ZoneChangeEvent zEvent = (ZoneChangeEvent) event;
if (zEvent.getTarget().getCardType().contains(CardType.CREATURE)) { if (zEvent.getTarget().isCreature()) {
boolean damageDealt = false; boolean damageDealt = false;
for (MageObjectReference mor : zEvent.getTarget().getDealtDamageByThisTurn()) { for (MageObjectReference mor : zEvent.getTarget().getDealtDamageByThisTurn()) {
if (mor.refersTo(getSourceObject(game), game)) { if (mor.refersTo(getSourceObject(game), game)) {

View file

@ -36,7 +36,7 @@ public class FeralDeceiverAbility extends LimitedTimesPerTurnActivatedAbility {
Card card = player.getLibrary().getFromTop(game); Card card = player.getLibrary().getFromTop(game);
cards.add(card); cards.add(card);
player.revealCards("Feral Deceiver", cards, game); player.revealCards("Feral Deceiver", cards, game);
if (card != null && card.getCardType().contains(CardType.LAND)) { if (card != null && card.isLand()) {
return true; return true;
} }
} }

View file

@ -74,7 +74,7 @@ public class LandfallAbility extends TriggeredAbilityImpl {
public boolean checkTrigger(GameEvent event, Game game) { public boolean checkTrigger(GameEvent event, Game game) {
Permanent permanent = game.getPermanent(event.getTargetId()); Permanent permanent = game.getPermanent(event.getTargetId());
if (permanent != null if (permanent != null
&& permanent.getCardType().contains(CardType.LAND) && permanent.isLand()
&& permanent.getControllerId().equals(this.controllerId)) { && permanent.getControllerId().equals(this.controllerId)) {
triggeringLand = permanent; triggeringLand = permanent;
if (setTargetPointer == SetTargetPointer.PERMANENT) { if (setTargetPointer == SetTargetPointer.PERMANENT) {

View file

@ -62,7 +62,7 @@ public class TapLandForManaAllTriggeredAbility extends TriggeredAbilityImpl {
@Override @Override
public boolean checkTrigger(GameEvent event, Game game) { public boolean checkTrigger(GameEvent event, Game game) {
Permanent permanent = game.getPermanentOrLKIBattlefield(event.getSourceId()); Permanent permanent = game.getPermanentOrLKIBattlefield(event.getSourceId());
if (permanent != null && permanent.getCardType().contains(CardType.LAND)) { if (permanent != null && permanent.isLand()) {
if (setTargetPointer) { if (setTargetPointer) {
getEffects().get(0).setTargetPointer(new FixedTarget(permanent.getId())); getEffects().get(0).setTargetPointer(new FixedTarget(permanent.getId()));
} }

View file

@ -63,7 +63,7 @@ public class TapLandForManaAllTriggeredManaAbility extends TriggeredManaAbility
@Override @Override
public boolean checkTrigger(GameEvent event, Game game) { public boolean checkTrigger(GameEvent event, Game game) {
Permanent permanent = game.getPermanentOrLKIBattlefield(event.getSourceId()); Permanent permanent = game.getPermanentOrLKIBattlefield(event.getSourceId());
if (permanent != null && permanent.getCardType().contains(CardType.LAND)) { if (permanent != null && permanent.isLand()) {
if (setTargetPointer) { if (setTargetPointer) {
getEffects().get(0).setTargetPointer(new FixedTarget(permanent.getId())); getEffects().get(0).setTargetPointer(new FixedTarget(permanent.getId()));
} }

View file

@ -57,7 +57,7 @@ public class EnchantedSourceCondition implements Condition {
if (permanent != null) { if (permanent != null) {
for (UUID uuid : permanent.getAttachments()) { for (UUID uuid : permanent.getAttachments()) {
Permanent attached = game.getBattlefield().getPermanent(uuid); Permanent attached = game.getBattlefield().getPermanent(uuid);
if (attached != null && attached.getCardType().contains(CardType.ENCHANTMENT)) { if (attached != null && attached.isEnchantment()) {
if (++numberOfFoundEnchantments >= numberOfEnchantments) { if (++numberOfFoundEnchantments >= numberOfEnchantments) {
return true; return true;
} }

View file

@ -28,7 +28,7 @@ public class EnchantedTargetCondition implements Condition {
if (targetPermanent != null) { if (targetPermanent != null) {
for (UUID uuid : targetPermanent.getAttachments()) { for (UUID uuid : targetPermanent.getAttachments()) {
Permanent attached = game.getBattlefield().getPermanent(uuid); Permanent attached = game.getBattlefield().getPermanent(uuid);
if (attached != null && attached.getCardType().contains(CardType.ENCHANTMENT)) { if (attached != null && attached.isEnchantment()) {
return true; return true;
} }
} }

View file

@ -49,6 +49,6 @@ public class SourceIsSpellCondition implements Condition {
@Override @Override
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
MageObject object = game.getObject(source.getSourceId()); MageObject object = game.getObject(source.getSourceId());
return object != null && !object.getCardType().contains(CardType.LAND); return object != null && !object.isLand();
} }
} }

View file

@ -39,39 +39,34 @@ import mage.players.Player;
*/ */
public class TopLibraryCardTypeCondition implements Condition { public class TopLibraryCardTypeCondition implements Condition {
public static enum CheckType { public enum CheckType {
CREATURE, LAND, SORCERY, INSTANT CREATURE, LAND, SORCERY, INSTANT
} }
private TopLibraryCardTypeCondition.CheckType type; private CheckType type;
public TopLibraryCardTypeCondition(TopLibraryCardTypeCondition.CheckType type) { public TopLibraryCardTypeCondition(CheckType type) {
this.type = type; this.type = type;
} }
@Override @Override
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
boolean conditionApplies = false;
Player controller = game.getPlayer(source.getControllerId()); Player controller = game.getPlayer(source.getControllerId());
if (controller != null && controller.getLibrary().size() > 0) { if (controller != null && controller.getLibrary().size() > 0) {
Card card = controller.getLibrary().getFromTop(game); Card card = controller.getLibrary().getFromTop(game);
if (card != null) { if (card != null) {
switch (this.type) { switch (this.type) {
case CREATURE: case CREATURE:
conditionApplies |= card.getCardType().contains(CardType.CREATURE); return card.isCreature();
break;
case LAND: case LAND:
conditionApplies |= card.getCardType().contains(CardType.LAND); return card.isLand();
break;
case SORCERY: case SORCERY:
conditionApplies |= card.getCardType().contains(CardType.SORCERY); return card.isSorcery();
break;
case INSTANT: case INSTANT:
conditionApplies |= card.getCardType().contains(CardType.INSTANT); return card.isInstant();
break;
} }
} }
} }
return conditionApplies; return false;
} }
} }

View file

@ -48,7 +48,7 @@ public class ExileTopCreatureCardOfGraveyardCost extends CostImpl {
if(controller != null) { if(controller != null) {
Card topCard = null; Card topCard = null;
for (Card card :controller.getGraveyard().getCards(game)) { for (Card card :controller.getGraveyard().getCards(game)) {
if (card.getCardType().contains(CardType.CREATURE)) { if (card.isCreature()) {
topCard = card; topCard = card;
} }
} }

View file

@ -61,7 +61,7 @@ public class DomainValue implements DynamicValue {
targetPlayer = sourceAbility.getControllerId(); targetPlayer = sourceAbility.getControllerId();
} }
for (Permanent p : game.getBattlefield().getAllActivePermanents(targetPlayer)) { for (Permanent p : game.getBattlefield().getAllActivePermanents(targetPlayer)) {
if (p.getCardType().contains(CardType.LAND)) { if (p.isLand()) {
if (havePlains == 0 && p.getSubtype(game).contains("Plains")) { if (havePlains == 0 && p.getSubtype(game).contains("Plains")) {
havePlains = 1; havePlains = 1;
} }

View file

@ -68,7 +68,7 @@ public class ParleyCount implements DynamicValue, MageSingleton {
if (player != null) { if (player != null) {
Card card = player.getLibrary().getFromTop(game); Card card = player.getLibrary().getFromTop(game);
if (card != null) { if (card != null) {
if (!card.getCardType().contains(CardType.LAND)) { if (!card.isLand()) {
parleyValue++; parleyValue++;
} }
player.revealCards(sourceObject.getIdName() + " (" + player.getName() + ')', new CardsImpl(card), game); player.revealCards(sourceObject.getIdName() + " (" + player.getName() + ')', new CardsImpl(card), game);

View file

@ -208,11 +208,11 @@ public class AuraReplacementEffect extends ReplacementEffectImpl {
if (((ZoneChangeEvent) event).getToZone() == Zone.BATTLEFIELD if (((ZoneChangeEvent) event).getToZone() == Zone.BATTLEFIELD
&& (((ZoneChangeEvent) event).getFromZone() != Zone.STACK)) { && (((ZoneChangeEvent) event).getFromZone() != Zone.STACK)) {
Card card = game.getCard(event.getTargetId()); Card card = game.getCard(event.getTargetId());
if (card != null && (card.getCardType().contains(CardType.ENCHANTMENT) && card.hasSubtype("Aura", game) if (card != null && (card.isEnchantment() && card.hasSubtype("Aura", game)
|| // in case of transformable enchantments || // in case of transformable enchantments
(game.getState().getValue(TransformAbility.VALUE_KEY_ENTER_TRANSFORMED + card.getId()) != null (game.getState().getValue(TransformAbility.VALUE_KEY_ENTER_TRANSFORMED + card.getId()) != null
&& card.getSecondCardFace() != null && card.getSecondCardFace() != null
&& card.getSecondCardFace().getCardType().contains(CardType.ENCHANTMENT) && card.getSecondCardFace().isEnchantment()
&& card.getSecondCardFace().hasSubtype("Aura", game)))) { && card.getSecondCardFace().hasSubtype("Aura", game)))) {
return true; return true;
} }

View file

@ -66,8 +66,8 @@ public class DamageEachOtherEffect extends OneShotEffect {
} }
if (sourceCreature != null && targetCreature != null if (sourceCreature != null && targetCreature != null
&& sourceCreature.getCardType().contains(CardType.CREATURE) && sourceCreature.isCreature()
&& targetCreature.getCardType().contains(CardType.CREATURE)) { && targetCreature.isCreature()) {
targetCreature.damage(sourceCreature.getPower().getValue(), sourceCreature.getId(), game, false, true); targetCreature.damage(sourceCreature.getPower().getValue(), sourceCreature.getId(), game, false, true);
if (sourceOnBattlefield) { if (sourceOnBattlefield) {
sourceCreature.damage(targetCreature.getPower().getValue(), targetCreature.getId(), game, false, true); sourceCreature.damage(targetCreature.getPower().getValue(), targetCreature.getId(), game, false, true);

View file

@ -59,7 +59,7 @@ public class FightTargetSourceEffect extends OneShotEffect {
Permanent creature1 = game.getPermanent(source.getTargets().get(0).getFirstTarget()); Permanent creature1 = game.getPermanent(source.getTargets().get(0).getFirstTarget());
// 20110930 - 701.10 // 20110930 - 701.10
if (creature1 != null && sourcePermanent != null) { if (creature1 != null && sourcePermanent != null) {
if (creature1.getCardType().contains(CardType.CREATURE) && sourcePermanent.getCardType().contains(CardType.CREATURE)) { if (creature1.isCreature() && sourcePermanent.isCreature()) {
return sourcePermanent.fight(creature1, source, game); return sourcePermanent.fight(creature1, source, game);
} }
} }

View file

@ -65,7 +65,7 @@ public class FightTargetsEffect extends OneShotEffect {
Permanent creature2 = game.getPermanent(source.getTargets().get(1).getFirstTarget()); Permanent creature2 = game.getPermanent(source.getTargets().get(1).getFirstTarget());
// 20110930 - 701.10 // 20110930 - 701.10
if (creature1 != null && creature2 != null) { if (creature1 != null && creature2 != null) {
if (creature1.getCardType().contains(CardType.CREATURE) && creature2.getCardType().contains(CardType.CREATURE)) { if (creature1.isCreature() && creature2.isCreature()) {
return creature1.fight(creature2, source, game); return creature1.fight(creature2, source, game);
} }
} }

View file

@ -76,7 +76,7 @@ public class HideawayPlayEffect extends OneShotEffect {
* If the removed card is a land, you may play it as a result of the last ability only if it's your turn * If the removed card is a land, you may play it as a result of the last ability only if it's your turn
* and you haven't already played a land that turn. This counts as your land play for the turn. * and you haven't already played a land that turn. This counts as your land play for the turn.
*/ */
if (card.getCardType().contains(CardType.LAND)) { if (card.isLand()) {
UUID playerId = controller.getId(); UUID playerId = controller.getId();
if (!game.getActivePlayerId().equals(playerId) || !game.getPlayer(playerId).canPlayLand()) { if (!game.getActivePlayerId().equals(playerId) || !game.getPlayer(playerId).canPlayLand()) {
return false; return false;

View file

@ -73,7 +73,7 @@ public class PreventDamageByTargetEffect extends PreventionEffectImpl {
if (!this.used && super.applies(event, source, game)) { if (!this.used && super.applies(event, source, game)) {
MageObject mageObject = game.getObject(event.getSourceId()); MageObject mageObject = game.getObject(event.getSourceId());
if (mageObject != null if (mageObject != null
&& (mageObject.getCardType().contains(CardType.INSTANT) || mageObject.getCardType().contains(CardType.SORCERY))) { && (mageObject.isInstant() || mageObject.isSorcery())) {
for (Target target : source.getTargets()) { for (Target target : source.getTargets()) {
if (target instanceof TargetSpell) { if (target instanceof TargetSpell) {
if (((TargetSpell) target).getSourceIds().contains(event.getSourceId())) { if (((TargetSpell) target).getSourceIds().contains(event.getSourceId())) {

View file

@ -42,7 +42,7 @@ public class RevealTopLandToBattlefieldElseHandEffect extends OneShotEffect {
} }
cards.add(card); cards.add(card);
controller.revealCards(sourceObject.getName(), cards, game); controller.revealCards(sourceObject.getName(), cards, game);
if (card.getCardType().contains(CardType.LAND)) { if (card.isLand()) {
return controller.moveCards(card, Zone.BATTLEFIELD, source, game); return controller.moveCards(card, Zone.BATTLEFIELD, source, game);
} else { } else {
controller.moveCards(card, Zone.HAND, source, game); controller.moveCards(card, Zone.HAND, source, game);

View file

@ -68,7 +68,7 @@ public class UntapAllThatAttackedEffect extends OneShotEffect {
Set<UUID> attackedThisTurn = ((AttackedThisTurnWatcher) watcher).getAttackedThisTurnCreatures(); Set<UUID> attackedThisTurn = ((AttackedThisTurnWatcher) watcher).getAttackedThisTurnCreatures();
for (UUID uuid : attackedThisTurn) { for (UUID uuid : attackedThisTurn) {
Permanent permanent = game.getPermanent(uuid); Permanent permanent = game.getPermanent(uuid);
if (permanent != null && permanent.getCardType().contains(CardType.CREATURE)) { if (permanent != null && permanent.isCreature()) {
permanent.untap(game); permanent.untap(game);
} }
} }

View file

@ -90,7 +90,7 @@ public class CantAttackYouUnlessPayManaAllEffect extends PayCostToAttackBlockEff
if (payAlsoForAttackingPlaneswalker) { if (payAlsoForAttackingPlaneswalker) {
Permanent permanent = game.getPermanent(event.getTargetId()); Permanent permanent = game.getPermanent(event.getTargetId());
if (permanent != null if (permanent != null
&& permanent.getCardType().contains(CardType.PLANESWALKER) && permanent.isPlaneswalker()
&& permanent.getControllerId().equals(source.getControllerId())) { && permanent.getControllerId().equals(source.getControllerId())) {
return true; return true;
} }

View file

@ -144,7 +144,7 @@ public class BecomesBasicLandTargetEffect extends ContinuousEffectImpl {
switch (layer) { switch (layer) {
case TypeChangingEffects_4: case TypeChangingEffects_4:
// Attention: Cards like Unstable Frontier that use this class do not give the "Basic" supertype to the target // Attention: Cards like Unstable Frontier that use this class do not give the "Basic" supertype to the target
if (!land.getCardType().contains(CardType.LAND)) { if (!land.isLand()) {
land.getCardType().add(CardType.LAND); land.getCardType().add(CardType.LAND);
} }
if (loseOther) { if (loseOther) {

View file

@ -120,7 +120,7 @@ public class BecomesCreatureSourceEffect extends ContinuousEffectImpl implements
} }
} }
} }
if (type != null && type.isEmpty() || type == null && permanent.getCardType().contains(CardType.LAND)) { if (type != null && type.isEmpty() || type == null && permanent.isLand()) {
permanent.getSubtype(game).retainAll(CardRepository.instance.getLandTypes()); permanent.getSubtype(game).retainAll(CardRepository.instance.getLandTypes());
} }
if (!token.getSubtype(game).isEmpty()) { if (!token.getSubtype(game).isEmpty()) {

View file

@ -101,7 +101,7 @@ public class BoostTargetEffect extends ContinuousEffectImpl {
int affectedTargets = 0; int affectedTargets = 0;
for (UUID permanentId : targetPointer.getTargets(game, source)) { for (UUID permanentId : targetPointer.getTargets(game, source)) {
Permanent target = game.getPermanent(permanentId); Permanent target = game.getPermanent(permanentId);
if (target != null && target.getCardType().contains(CardType.CREATURE)) { if (target != null && target.isCreature()) {
target.addPower(power.calculate(game, source, this)); target.addPower(power.calculate(game, source, this));
target.addToughness(toughness.calculate(game, source, this)); target.addToughness(toughness.calculate(game, source, this));
affectedTargets++; affectedTargets++;

View file

@ -78,7 +78,7 @@ public class PlayTheTopCardEffect extends AsThoughEffectImpl {
if (cardOnTop != null if (cardOnTop != null
&& affectedControllerId.equals(source.getControllerId()) && affectedControllerId.equals(source.getControllerId())
&& cardOnTop.getOwnerId().equals(source.getControllerId()) && cardOnTop.getOwnerId().equals(source.getControllerId())
&& (!cardOnTop.getManaCost().isEmpty() || cardOnTop.getCardType().contains(CardType.LAND)) && (!cardOnTop.getManaCost().isEmpty() || cardOnTop.isLand())
&& filter.match(cardOnTop, game)) { && filter.match(cardOnTop, game)) {
Player player = game.getPlayer(cardOnTop.getOwnerId()); Player player = game.getPlayer(cardOnTop.getOwnerId());
if (player != null && cardOnTop.equals(player.getLibrary().getFromTop(game))) { if (player != null && cardOnTop.equals(player.getLibrary().getFromTop(game))) {

View file

@ -50,7 +50,7 @@ public class DealtDamageToCreatureBySourceDies extends ReplacementEffectImpl {
public DealtDamageToCreatureBySourceDies(Card card, Duration duration) { public DealtDamageToCreatureBySourceDies(Card card, Duration duration) {
super(duration, Outcome.Exile); super(duration, Outcome.Exile);
if (card.getCardType().contains(CardType.CREATURE)) { if (card.isCreature()) {
staticText = "If a creature dealt damage by {this} this turn would die, exile it instead"; staticText = "If a creature dealt damage by {this} this turn would die, exile it instead";
} else { } else {
staticText = "If a creature dealt damage this way would die this turn, exile it instead"; staticText = "If a creature dealt damage this way would die this turn, exile it instead";

View file

@ -78,7 +78,7 @@ public class ManifestEffect extends OneShotEffect {
Set<Card> cards = controller.getLibrary().getTopCards(game, amount); Set<Card> cards = controller.getLibrary().getTopCards(game, amount);
for (Card card : cards) { for (Card card : cards) {
ManaCosts manaCosts = null; ManaCosts manaCosts = null;
if (card.getCardType().contains(CardType.CREATURE)) { if (card.isCreature()) {
manaCosts = card.getSpellAbility() != null ? card.getSpellAbility().getManaCosts() : null; manaCosts = card.getSpellAbility() != null ? card.getSpellAbility().getManaCosts() : null;
if (manaCosts == null) { if (manaCosts == null) {
manaCosts = new ManaCostsImpl("{0}"); manaCosts = new ManaCostsImpl("{0}");

View file

@ -81,7 +81,7 @@ public class ManifestTargetPlayerEffect extends OneShotEffect {
Set<Card> cards = targetPlayer.getLibrary().getTopCards(game, amount); Set<Card> cards = targetPlayer.getLibrary().getTopCards(game, amount);
for (Card card : cards) { for (Card card : cards) {
ManaCosts manaCosts = null; ManaCosts manaCosts = null;
if (card.getCardType().contains(CardType.CREATURE)) { if (card.isCreature()) {
manaCosts = card.getSpellAbility().getManaCosts(); manaCosts = card.getSpellAbility().getManaCosts();
if (manaCosts == null) { if (manaCosts == null) {
manaCosts = new ManaCostsImpl("{0}"); manaCosts = new ManaCostsImpl("{0}");

View file

@ -50,7 +50,7 @@ public class SupportEffect extends AddCountersTargetEffect {
super(CounterType.P1P1.createInstance(0), new StaticValue(1)); super(CounterType.P1P1.createInstance(0), new StaticValue(1));
this.amountSupportTargets = new StaticValue(amount); this.amountSupportTargets = new StaticValue(amount);
this.otherPermanent = otherPermanent; this.otherPermanent = otherPermanent;
if (card.getCardType().contains(CardType.INSTANT) || card.getCardType().contains(CardType.SORCERY)) { if (card.isInstant() || card.isSorcery()) {
card.getSpellAbility().addTarget(new TargetCreaturePermanent(0, amount, new FilterCreaturePermanent("target creatures"), false)); card.getSpellAbility().addTarget(new TargetCreaturePermanent(0, amount, new FilterCreaturePermanent("target creatures"), false));
} }
staticText = setText(); staticText = setText();

View file

@ -150,12 +150,12 @@ public class BestowAbility extends SpellAbility {
MageObject basicObject = permanent.getBasicMageObject(game); MageObject basicObject = permanent.getBasicMageObject(game);
if (basicObject != null) { if (basicObject != null) {
basicObject.getSubtype(null).remove("Aura"); basicObject.getSubtype(null).remove("Aura");
if (!basicObject.getCardType().contains(CardType.CREATURE)) { if (!basicObject.isCreature()) {
basicObject.getCardType().add(CardType.CREATURE); basicObject.getCardType().add(CardType.CREATURE);
} }
} }
permanent.getSubtype(null).remove("Aura"); permanent.getSubtype(null).remove("Aura");
if (!permanent.getCardType().contains(CardType.CREATURE)) { if (!permanent.isCreature()) {
permanent.getCardType().add(CardType.CREATURE); permanent.getCardType().add(CardType.CREATURE);
} }

View file

@ -120,7 +120,7 @@ class CascadeEffect extends OneShotEffect {
} }
controller.moveCardsToExile(card, source, game, true, exile.getId(), exile.getName()); controller.moveCardsToExile(card, source, game, true, exile.getId(), exile.getName());
} while (controller.isInGame() } while (controller.isInGame()
&& (card.getCardType().contains(CardType.LAND) && (card.isLand()
|| !cardThatCostsLess(sourceCost, card, game))); || !cardThatCostsLess(sourceCost, card, game)));
controller.getLibrary().reset(); // set back empty draw state if that caused an empty draw controller.getLibrary().reset(); // set back empty draw state if that caused an empty draw

View file

@ -110,7 +110,7 @@ public class EvolveAbility extends TriggeredAbilityImpl {
if (!event.getTargetId().equals(this.getSourceId())) { if (!event.getTargetId().equals(this.getSourceId())) {
Permanent triggeringCreature = game.getPermanent(event.getTargetId()); Permanent triggeringCreature = game.getPermanent(event.getTargetId());
if (triggeringCreature != null if (triggeringCreature != null
&& triggeringCreature.getCardType().contains(CardType.CREATURE) && triggeringCreature.isCreature()
&& triggeringCreature.getControllerId().equals(this.controllerId)) { && triggeringCreature.getControllerId().equals(this.controllerId)) {
Permanent sourceCreature = game.getPermanent(sourceId); Permanent sourceCreature = game.getPermanent(sourceId);
if (sourceCreature != null && isPowerOrThoughnessGreater(sourceCreature, triggeringCreature)) { if (sourceCreature != null && isPowerOrThoughnessGreater(sourceCreature, triggeringCreature)) {

View file

@ -91,7 +91,7 @@ class FearEffect extends RestrictionEffect implements MageSingleton {
@Override @Override
public boolean canBeBlocked(Permanent attacker, Permanent blocker, Ability source, Game game) { public boolean canBeBlocked(Permanent attacker, Permanent blocker, Ability source, Game game) {
if (blocker.getCardType().contains(CardType.ARTIFACT) || blocker.getColor(game).isBlack()) { if (blocker.isArtifact() || blocker.getColor(game).isBlack()) {
return true; return true;
} }
return false; return false;

View file

@ -69,7 +69,7 @@ public class HauntAbility extends TriggeredAbilityImpl {
public HauntAbility(Card card, Effect effect) { public HauntAbility(Card card, Effect effect) {
super(Zone.ALL, effect , false); super(Zone.ALL, effect , false);
creatureHaunt = card.getCardType().contains(CardType.CREATURE); creatureHaunt = card.isCreature();
addSubAbility(new HauntExileAbility(creatureHaunt)); addSubAbility(new HauntExileAbility(creatureHaunt));
} }

View file

@ -61,7 +61,7 @@ class IntimidateEffect extends RestrictionEffect implements MageSingleton {
@Override @Override
public boolean canBeBlocked(Permanent attacker, Permanent blocker, Ability source, Game game) { public boolean canBeBlocked(Permanent attacker, Permanent blocker, Ability source, Game game) {
boolean result = false; boolean result = false;
if (blocker.getCardType().contains(CardType.ARTIFACT) && (blocker.getCardType().contains(CardType.CREATURE))) { if (blocker.isArtifact() && (blocker.isCreature())) {
result = true; result = true;
} }
if (attacker.getColor(game).shares(blocker.getColor(game))) { if (attacker.getColor(game).shares(blocker.getColor(game))) {

View file

@ -115,7 +115,7 @@ public class ProtectionAbility extends StaticAbility {
// object is still a card and not a spell yet. So return only if the source object can't be a spell // object is still a card and not a spell yet. So return only if the source object can't be a spell
// otherwise the following FilterObject check will be applied // otherwise the following FilterObject check will be applied
if (source instanceof StackObject if (source instanceof StackObject
|| (!source.getCardType().contains(CardType.INSTANT) && !source.getCardType().contains(CardType.SORCERY))) { || (!source.isInstant() && !source.isSorcery())) {
return true; return true;
} }
} }

View file

@ -55,7 +55,7 @@ import mage.players.Player;
public class RecoverAbility extends TriggeredAbilityImpl { public class RecoverAbility extends TriggeredAbilityImpl {
public RecoverAbility(Cost cost, Card card) { public RecoverAbility(Cost cost, Card card) {
super(Zone.GRAVEYARD, new RecoverEffect(cost, card.getCardType().contains(CardType.CREATURE)), false); super(Zone.GRAVEYARD, new RecoverEffect(cost, card.isCreature()), false);
} }
public RecoverAbility(final RecoverAbility ability) { public RecoverAbility(final RecoverAbility ability) {
@ -77,7 +77,7 @@ public class RecoverAbility extends TriggeredAbilityImpl {
ZoneChangeEvent zEvent = (ZoneChangeEvent) event; ZoneChangeEvent zEvent = (ZoneChangeEvent) event;
if (zEvent.getFromZone() == Zone.BATTLEFIELD && zEvent.getToZone() == Zone.GRAVEYARD) { if (zEvent.getFromZone() == Zone.BATTLEFIELD && zEvent.getToZone() == Zone.GRAVEYARD) {
if (zEvent.getTarget().getOwnerId().equals(getControllerId()) if (zEvent.getTarget().getOwnerId().equals(getControllerId())
&& zEvent.getTarget().getCardType().contains(CardType.CREATURE) && zEvent.getTarget().isCreature()
&& !zEvent.getTarget().getId().equals(getSourceId())) { && !zEvent.getTarget().getId().equals(getSourceId())) {
return true; return true;
} }

View file

@ -102,7 +102,7 @@ public class SoulbondAbility extends EntersBattlefieldTriggeredAbility {
boolean self = false; boolean self = false;
boolean other = false; boolean other = false;
for (Permanent permanent : game.getBattlefield().getAllActivePermanents(getControllerId())) { for (Permanent permanent : game.getBattlefield().getAllActivePermanents(getControllerId())) {
if (permanent.getCardType().contains(CardType.CREATURE)) { if (permanent.isCreature()) {
if (permanent.getId().equals(getSourceId())) { if (permanent.getId().equals(getSourceId())) {
if (permanent.getControllerId().equals(getControllerId())) { if (permanent.getControllerId().equals(getControllerId())) {
self = true; self = true;
@ -158,7 +158,7 @@ class SoulboundEntersSelfEffect extends OneShotEffect {
@Override @Override
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId()); Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null && permanent.getCardType().contains(CardType.CREATURE)) { if (permanent != null && permanent.isCreature()) {
Player controller = game.getPlayer(permanent.getControllerId()); Player controller = game.getPlayer(permanent.getControllerId());
if (controller != null) { if (controller != null) {
TargetControlledPermanent target = new TargetControlledPermanent(filter); TargetControlledPermanent target = new TargetControlledPermanent(filter);
@ -259,11 +259,11 @@ class SoulboundEntersOtherEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId()); Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null && permanent.getPairedCard() == null if (permanent != null && permanent.getPairedCard() == null
&& permanent.getCardType().contains(CardType.CREATURE)) { && permanent.isCreature()) {
Player controller = game.getPlayer(permanent.getControllerId()); Player controller = game.getPlayer(permanent.getControllerId());
if (controller != null) { if (controller != null) {
Permanent enteringPermanent = game.getPermanent(getTargetPointer().getFirst(game, source)); Permanent enteringPermanent = game.getPermanent(getTargetPointer().getFirst(game, source));
if (enteringPermanent != null && enteringPermanent.getCardType().contains(CardType.CREATURE) && enteringPermanent.getPairedCard() == null) { if (enteringPermanent != null && enteringPermanent.isCreature() && enteringPermanent.getPairedCard() == null) {
enteringPermanent.setPairedCard(new MageObjectReference(permanent, game)); enteringPermanent.setPairedCard(new MageObjectReference(permanent, game));
permanent.setPairedCard(new MageObjectReference(enteringPermanent, game)); permanent.setPairedCard(new MageObjectReference(enteringPermanent, game));
if (!game.isSimulation()) { if (!game.isSimulation()) {

View file

@ -53,7 +53,7 @@ public class SunburstAbility extends EntersBattlefieldAbility {
public SunburstAbility(Card card) { public SunburstAbility(Card card) {
super(new SunburstEffect(), ""); super(new SunburstEffect(), "");
isCreature = card.getCardType().contains(CardType.CREATURE); isCreature = card.isCreature();
} }
public SunburstAbility(final SunburstAbility ability) { public SunburstAbility(final SunburstAbility ability) {
@ -91,7 +91,7 @@ class SunburstEffect extends OneShotEffect {
Permanent permanent = game.getPermanentEntering(source.getSourceId()); Permanent permanent = game.getPermanentEntering(source.getSourceId());
if (permanent != null) { if (permanent != null) {
Counter counter; Counter counter;
if (permanent.getCardType().contains(CardType.CREATURE)) { if (permanent.isCreature()) {
counter = CounterType.P1P1.createInstance(amount.calculate(game, source, this)); counter = CounterType.P1P1.createInstance(amount.calculate(game, source, this));
} else { } else {
counter = CounterType.CHARGE.createInstance(amount.calculate(game, source, this)); counter = CounterType.CHARGE.createInstance(amount.calculate(game, source, this));

View file

@ -48,9 +48,9 @@ public class SupportAbility extends EntersBattlefieldTriggeredAbility {
public SupportAbility(Card card, int amount) { public SupportAbility(Card card, int amount) {
super(new SupportEffect(card, amount, true)); super(new SupportEffect(card, amount, true));
if (!card.getCardType().contains(CardType.INSTANT) && !card.getCardType().contains(CardType.SORCERY)) { if (!card.isInstant() && !card.isSorcery()) {
FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures"); FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures");
if (card.getCardType().contains(CardType.CREATURE)) { if (card.isCreature()) {
filter.add(new AnotherPredicate()); filter.add(new AnotherPredicate());
filter.setMessage("other target creatures"); filter.setMessage("other target creatures");
} }

View file

@ -180,7 +180,7 @@ public class SuspendAbility extends SpecialAction {
.append((suspend == 1 ? "a time counter" : (suspend == Integer.MAX_VALUE ? "X time counters" : suspend + " time counters"))) .append((suspend == 1 ? "a time counter" : (suspend == Integer.MAX_VALUE ? "X time counters" : suspend + " time counters")))
.append(" on it.") .append(" on it.")
.append(" At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.") .append(" At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.")
.append(card.getCardType().contains(CardType.CREATURE) ? " If you play it this way and it's a creature, it gains haste until you lose control of it." : "") .append(card.isCreature() ? " If you play it this way and it's a creature, it gains haste until you lose control of it." : "")
.append(")</i>"); .append(")</i>");
} }
if (card.getManaCost().isEmpty()) { if (card.getManaCost().isEmpty()) {
@ -241,7 +241,7 @@ public class SuspendAbility extends SpecialAction {
return false; return false;
} }
MageObject object = game.getObject(sourceId); MageObject object = game.getObject(sourceId);
return (object.getCardType().contains(CardType.INSTANT) return (object.isInstant()
|| object.hasAbility(FlashAbility.getInstance().getId(), game) || object.hasAbility(FlashAbility.getInstance().getId(), game)
|| game.getContinuousEffects().asThough(sourceId, AsThoughEffectType.CAST_AS_INSTANT, this, playerId, game) || game.getContinuousEffects().asThough(sourceId, AsThoughEffectType.CAST_AS_INSTANT, this, playerId, game)
|| game.canPlaySorcery(playerId)); || game.canPlaySorcery(playerId));
@ -384,7 +384,7 @@ class SuspendPlayCardEffect extends OneShotEffect {
} }
// cast the card for free // cast the card for free
if (player.cast(card.getSpellAbility(), game, true)) { if (player.cast(card.getSpellAbility(), game, true)) {
if (card.getCardType().contains(CardType.CREATURE)) { if (card.isCreature()) {
ContinuousEffect effect = new GainHasteEffect(); ContinuousEffect effect = new GainHasteEffect();
effect.setTargetPointer(new FixedTarget(card.getId(), card.getZoneChangeCounter(game) + 1)); effect.setTargetPointer(new FixedTarget(card.getId(), card.getZoneChangeCounter(game) + 1));
game.addEffect(effect, source); game.addEffect(effect, source);

View file

@ -46,7 +46,7 @@ public class ArtifactCastManaCondition extends ManaCondition implements Conditio
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
if (source instanceof SpellAbility) { if (source instanceof SpellAbility) {
MageObject object = game.getObject(source.getSourceId()); MageObject object = game.getObject(source.getSourceId());
if (object != null && object.getCardType().contains(CardType.ARTIFACT)) { if (object != null && object.isArtifact()) {
return true; return true;
} }
} }

View file

@ -45,7 +45,7 @@ public class CreatureCastManaCondition extends ManaCondition implements Conditio
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
if (source instanceof SpellAbility) { if (source instanceof SpellAbility) {
MageObject object = game.getObject(source.getSourceId()); MageObject object = game.getObject(source.getSourceId());
if (object != null && object.getCardType().contains(CardType.CREATURE)) { if (object != null && object.isCreature()) {
return true; return true;
} }
} }

View file

@ -35,6 +35,7 @@ import mage.Mana;
import mage.abilities.Abilities; import mage.abilities.Abilities;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.SpellAbility; import mage.abilities.SpellAbility;
import mage.constants.CardType;
import mage.constants.Rarity; import mage.constants.Rarity;
import mage.constants.Zone; import mage.constants.Zone;
import mage.counters.Counter; import mage.counters.Counter;
@ -174,4 +175,7 @@ public interface Card extends MageObject {
* returned * returned
*/ */
Card getMainCard(); Card getMainCard();
} }

View file

@ -93,13 +93,13 @@ public abstract class CardImpl extends MageObjectImpl implements Card {
this.cardType.addAll(Arrays.asList(cardTypes)); this.cardType.addAll(Arrays.asList(cardTypes));
this.manaCost.load(costs); this.manaCost.load(costs);
setDefaultColor(); setDefaultColor();
if (cardType.contains(CardType.LAND)) { if (this.isLand()) {
Ability ability = new PlayLandAbility(name); Ability ability = new PlayLandAbility(name);
ability.setSourceId(this.getId()); ability.setSourceId(this.getId());
abilities.add(ability); abilities.add(ability);
} else { } else {
SpellAbility ability = new SpellAbility(manaCost, name, Zone.HAND, spellAbilityType); SpellAbility ability = new SpellAbility(manaCost, name, Zone.HAND, spellAbilityType);
if (!cardType.contains(CardType.INSTANT)) { if (!this.isInstant()) {
ability.setTiming(TimingRule.SORCERY); ability.setTiming(TimingRule.SORCERY);
} }
ability.setSourceId(this.getId()); ability.setSourceId(this.getId());

View file

@ -49,7 +49,7 @@ public class MockCard extends CardImpl {
this.secondSideCard = new MockCard(CardRepository.instance.findCard(card.getSecondSideName())); this.secondSideCard = new MockCard(CardRepository.instance.findCard(card.getSecondSideName()));
} }
if (this.cardType.contains(CardType.PLANESWALKER)) { if (this.isPlaneswalker()) {
String startingLoyaltyString = card.getStartingLoyalty(); String startingLoyaltyString = card.getStartingLoyalty();
if (startingLoyaltyString.isEmpty()) { if (startingLoyaltyString.isEmpty()) {
//Logger.getLogger(MockCard.class).warn("Planeswalker `" + this.name + "` has empty starting loyalty."); //Logger.getLogger(MockCard.class).warn("Planeswalker `" + this.name + "` has empty starting loyalty.");

View file

@ -188,7 +188,7 @@ public class CardInfo {
} }
// Starting loyalty // Starting loyalty
if (card.getCardType().contains(CardType.PLANESWALKER)) { if (card.isPlaneswalker()) {
for (Ability ab : card.getAbilities()) { for (Ability ab : card.getAbilities()) {
if (ab instanceof PlanswalkerEntersWithLoyalityCountersAbility) { if (ab instanceof PlanswalkerEntersWithLoyalityCountersAbility) {
this.startingLoyalty = "" + ((PlanswalkerEntersWithLoyalityCountersAbility) ab).getStartingLoyalty(); this.startingLoyalty = "" + ((PlanswalkerEntersWithLoyalityCountersAbility) ab).getStartingLoyalty();

View file

@ -125,7 +125,7 @@ class MonarchDealsCombatDamageToAPlayerTriggeredAbility extends TriggeredAbility
MageObject damagingObject = game.getObject(event.getSourceId()); MageObject damagingObject = game.getObject(event.getSourceId());
if (damagingObject != null if (damagingObject != null
&& damagingObject instanceof Permanent && damagingObject instanceof Permanent
&& damagingObject.getCardType().contains(CardType.CREATURE) && damagingObject.isCreature()
&& event.getTargetId().equals(game.getMonarchId())) { && event.getTargetId().equals(game.getMonarchId())) {
setControllerId(event.getPlayerId()); setControllerId(event.getPlayerId());
getEffects().get(0).setTargetPointer(new FixedTarget(((Permanent) damagingObject).getControllerId())); getEffects().get(0).setTargetPointer(new FixedTarget(((Permanent) damagingObject).getControllerId()));

View file

@ -20,7 +20,7 @@ public class CommanderPredicate implements Predicate<Permanent> {
@Override @Override
public boolean apply(Permanent input, Game game) { public boolean apply(Permanent input, Game game) {
Player owner = game.getPlayer(input.getOwnerId()); Player owner = game.getPlayer(input.getOwnerId());
return input.getCardType().contains(CardType.CREATURE) return input.isCreature()
&& owner != null && owner != null
&& owner.getCommandersIds().contains(input.getId()); && owner.getCommandersIds().contains(input.getId());
} }

View file

@ -43,7 +43,7 @@ public class EnchantedPredicate implements Predicate<Permanent> {
public boolean apply(Permanent input, Game game) { public boolean apply(Permanent input, Game game) {
for (UUID attachmentId : input.getAttachments()) { for (UUID attachmentId : input.getAttachments()) {
Permanent attachment = game.getPermanent(attachmentId); Permanent attachment = game.getPermanent(attachmentId);
if (attachment != null && attachment.getCardType().contains(CardType.ENCHANTMENT)) { if (attachment != null && attachment.isEnchantment()) {
return true; return true;
} }
} }

View file

@ -1688,7 +1688,7 @@ public abstract class GameImpl implements Game, Serializable {
List<Permanent> legendary = new ArrayList<>(); List<Permanent> legendary = new ArrayList<>();
List<Permanent> worldEnchantment = new ArrayList<>(); List<Permanent> worldEnchantment = new ArrayList<>();
for (Permanent perm : getBattlefield().getAllActivePermanents()) { for (Permanent perm : getBattlefield().getAllActivePermanents()) {
if (perm.getCardType().contains(CardType.CREATURE)) { if (perm.isCreature()) {
//20091005 - 704.5f //20091005 - 704.5f
if (perm.getToughness().getValue() <= 0) { if (perm.getToughness().getValue() <= 0) {
if (movePermanentToGraveyardWithInfo(perm)) { if (movePermanentToGraveyardWithInfo(perm)) {
@ -1723,7 +1723,7 @@ public abstract class GameImpl implements Game, Serializable {
} }
somethingHappened = true; somethingHappened = true;
} }
if (perm.getCardType().contains(CardType.PLANESWALKER)) { if (perm.isPlaneswalker()) {
//20091005 - 704.5i //20091005 - 704.5i
if (perm.getCounters(this).getCount(CounterType.LOYALTY) == 0) { if (perm.getCounters(this).getCount(CounterType.LOYALTY) == 0) {
if (movePermanentToGraveyardWithInfo(perm)) { if (movePermanentToGraveyardWithInfo(perm)) {
@ -1740,7 +1740,7 @@ public abstract class GameImpl implements Game, Serializable {
//20091005 - 704.5n, 702.14c //20091005 - 704.5n, 702.14c
if (perm.getAttachedTo() == null) { if (perm.getAttachedTo() == null) {
Card card = this.getCard(perm.getId()); Card card = this.getCard(perm.getId());
if (card != null && !card.getCardType().contains(CardType.CREATURE)) { // no bestow creature if (card != null && !card.isCreature()) { // no bestow creature
if (movePermanentToGraveyardWithInfo(perm)) { if (movePermanentToGraveyardWithInfo(perm)) {
somethingHappened = true; somethingHappened = true;
} }
@ -1767,7 +1767,7 @@ public abstract class GameImpl implements Game, Serializable {
if (attachedTo == null || !attachedTo.getAttachments().contains(perm.getId())) { if (attachedTo == null || !attachedTo.getAttachments().contains(perm.getId())) {
// handle bestow unattachment // handle bestow unattachment
Card card = this.getCard(perm.getId()); Card card = this.getCard(perm.getId());
if (card != null && card.getCardType().contains(CardType.CREATURE)) { if (card != null && card.isCreature()) {
UUID wasAttachedTo = perm.getAttachedTo(); UUID wasAttachedTo = perm.getAttachedTo();
perm.attachTo(null, this); perm.attachTo(null, this);
BestowAbility.becomeCreature(perm, this); BestowAbility.becomeCreature(perm, this);
@ -1787,7 +1787,7 @@ public abstract class GameImpl implements Game, Serializable {
} else if (!auraFilter.match(attachedTo, this) || attachedTo.cantBeAttachedBy(perm, this)) { } else if (!auraFilter.match(attachedTo, this) || attachedTo.cantBeAttachedBy(perm, this)) {
// handle bestow unattachment // handle bestow unattachment
Card card = this.getCard(perm.getId()); Card card = this.getCard(perm.getId());
if (card != null && card.getCardType().contains(CardType.CREATURE)) { if (card != null && card.isCreature()) {
UUID wasAttachedTo = perm.getAttachedTo(); UUID wasAttachedTo = perm.getAttachedTo();
perm.attachTo(null, this); perm.attachTo(null, this);
fireEvent(new GameEvent(GameEvent.EventType.UNATTACHED, wasAttachedTo, perm.getId(), perm.getControllerId())); fireEvent(new GameEvent(GameEvent.EventType.UNATTACHED, wasAttachedTo, perm.getId(), perm.getControllerId()));
@ -1835,7 +1835,7 @@ public abstract class GameImpl implements Game, Serializable {
UUID wasAttachedTo = perm.getAttachedTo(); UUID wasAttachedTo = perm.getAttachedTo();
perm.attachTo(null, this); perm.attachTo(null, this);
fireEvent(new GameEvent(GameEvent.EventType.UNATTACHED, wasAttachedTo, perm.getId(), perm.getControllerId())); fireEvent(new GameEvent(GameEvent.EventType.UNATTACHED, wasAttachedTo, perm.getId(), perm.getControllerId()));
} else if (!attachedTo.getCardType().contains(CardType.CREATURE) || attachedTo.hasProtectionFrom(perm, this)) { } else if (!attachedTo.isCreature() || attachedTo.hasProtectionFrom(perm, this)) {
if (attachedTo.removeAttachment(perm.getId(), this)) { if (attachedTo.removeAttachment(perm.getId(), this)) {
somethingHappened = true; somethingHappened = true;
} }
@ -1847,7 +1847,7 @@ public abstract class GameImpl implements Game, Serializable {
Permanent land = getPermanent(perm.getAttachedTo()); Permanent land = getPermanent(perm.getAttachedTo());
if (land == null || !land.getAttachments().contains(perm.getId())) { if (land == null || !land.getAttachments().contains(perm.getId())) {
perm.attachTo(null, this); perm.attachTo(null, this);
} else if (!land.getCardType().contains(CardType.LAND) || land.hasProtectionFrom(perm, this)) { } else if (!land.isLand() || land.hasProtectionFrom(perm, this)) {
if (land.removeAttachment(perm.getId(), this)) { if (land.removeAttachment(perm.getId(), this)) {
somethingHappened = true; somethingHappened = true;
} }
@ -1861,7 +1861,7 @@ public abstract class GameImpl implements Game, Serializable {
for (UUID attachmentId : perm.getAttachments()) { for (UUID attachmentId : perm.getAttachments()) {
Permanent attachment = getPermanent(attachmentId); Permanent attachment = getPermanent(attachmentId);
if (attachment != null if (attachment != null
&& (attachment.getCardType().contains(CardType.CREATURE) && (attachment.isCreature()
|| !(attachment.getSubtype(this).contains("Aura") || !(attachment.getSubtype(this).contains("Aura")
|| attachment.getSubtype(this).contains("Equipment") || attachment.getSubtype(this).contains("Equipment")
|| attachment.getSubtype(this).contains("Fortification")))) { || attachment.getSubtype(this).contains("Fortification")))) {
@ -2293,7 +2293,7 @@ public abstract class GameImpl implements Game, Serializable {
} }
} }
// check if it's a creature and must be removed from combat // check if it's a creature and must be removed from combat
if (perm.getCardType().contains(CardType.CREATURE) && this.getCombat() != null) { if (perm.isCreature() && this.getCombat() != null) {
perm.removeFromCombat(this, true); perm.removeFromCombat(this, true);
} }
it.remove(); it.remove();

View file

@ -172,13 +172,13 @@ public class Combat implements Serializable, Copyable<Combat> {
public void checkForRemoveFromCombat(Game game) { public void checkForRemoveFromCombat(Game game) {
for (UUID creatureId : getAttackers()) { for (UUID creatureId : getAttackers()) {
Permanent creature = game.getPermanent(creatureId); Permanent creature = game.getPermanent(creatureId);
if (creature != null && !creature.getCardType().contains(CardType.CREATURE)) { if (creature != null && !creature.isCreature()) {
removeFromCombat(creatureId, game, true); removeFromCombat(creatureId, game, true);
} }
} }
for (UUID creatureId : getBlockers()) { for (UUID creatureId : getBlockers()) {
Permanent creature = game.getPermanent(creatureId); Permanent creature = game.getPermanent(creatureId);
if (creature != null && !creature.getCardType().contains(CardType.CREATURE)) { if (creature != null && !creature.isCreature()) {
removeFromCombat(creatureId, game, true); removeFromCombat(creatureId, game, true);
} }
} }

View file

@ -359,7 +359,7 @@ public abstract class PermanentImpl extends CardImpl implements Permanent {
@Override @Override
public boolean canTap() { public boolean canTap() {
return !cardType.contains(CardType.CREATURE) || !hasSummoningSickness(); return !isCreature() || !hasSummoningSickness();
} }
@Override @Override
@ -701,7 +701,7 @@ public abstract class PermanentImpl extends CardImpl implements Permanent {
private int damage(int damageAmount, UUID sourceId, Game game, boolean preventable, boolean combat, boolean markDamage, ArrayList<UUID> appliedEffects) { private int damage(int damageAmount, UUID sourceId, Game game, boolean preventable, boolean combat, boolean markDamage, ArrayList<UUID> appliedEffects) {
int damageDone = 0; int damageDone = 0;
if (damageAmount > 0 && canDamage(game.getObject(sourceId), game)) { if (damageAmount > 0 && canDamage(game.getObject(sourceId), game)) {
if (cardType.contains(CardType.PLANESWALKER)) { if (this.isPlaneswalker()) {
damageDone = damagePlaneswalker(damageAmount, sourceId, game, preventable, combat, markDamage, appliedEffects); damageDone = damagePlaneswalker(damageAmount, sourceId, game, preventable, combat, markDamage, appliedEffects);
} else { } else {
damageDone = damageCreature(damageAmount, sourceId, game, preventable, combat, markDamage, appliedEffects); damageDone = damageCreature(damageAmount, sourceId, game, preventable, combat, markDamage, appliedEffects);
@ -945,7 +945,7 @@ public abstract class PermanentImpl extends CardImpl implements Permanent {
} else { } else {
logName = this.getLogName(); logName = this.getLogName();
} }
if (this.getCardType().contains(CardType.CREATURE)) { if (this.isCreature()) {
game.informPlayers(logName + " died"); game.informPlayers(logName + " died");
} else { } else {
game.informPlayers(logName + " was destroyed"); game.informPlayers(logName + " was destroyed");
@ -1175,7 +1175,7 @@ public abstract class PermanentImpl extends CardImpl implements Permanent {
public boolean removeFromCombat(Game game, boolean withInfo) { public boolean removeFromCombat(Game game, boolean withInfo) {
if (this.isAttacking() || this.blocking > 0) { if (this.isAttacking() || this.blocking > 0) {
return game.getCombat().removeFromCombat(objectId, game, withInfo); return game.getCombat().removeFromCombat(objectId, game, withInfo);
} else if (getCardType().contains(CardType.PLANESWALKER)) { } else if (this.isPlaneswalker()) {
if (game.getCombat().getDefenders().contains(getId())) { if (game.getCombat().getDefenders().contains(getId())) {
game.getCombat().removePlaneswalkerFromCombat(objectId, game, withInfo); game.getCombat().removePlaneswalkerFromCombat(objectId, game, withInfo);
} }

View file

@ -195,7 +195,7 @@ public class Token extends MageObjectImpl {
expansionSetCodeChecked = this.updateExpansionSetCode(setCode); expansionSetCodeChecked = this.updateExpansionSetCode(setCode);
} }
GameEvent event = new GameEvent(EventType.CREATE_TOKEN, null, sourceId, controllerId, amount, this.getCardType().contains(CardType.CREATURE)); GameEvent event = new GameEvent(EventType.CREATE_TOKEN, null, sourceId, controllerId, amount, this.isCreature());
if (!game.replaceEvent(event)) { if (!game.replaceEvent(event)) {
amount = event.getAmount(); amount = event.getAmount();

View file

@ -191,7 +191,7 @@ public class Spell extends StackObjImpl implements Card {
if (controller == null) { if (controller == null) {
return false; return false;
} }
if (this.getCardType().contains(CardType.INSTANT) || this.getCardType().contains(CardType.SORCERY)) { if (this.isInstant() || this.isSorcery()) {
int index = 0; int index = 0;
result = false; result = false;
boolean legalParts = false; boolean legalParts = false;
@ -239,7 +239,7 @@ public class Spell extends StackObjImpl implements Card {
} }
counter(null, game); counter(null, game);
return false; return false;
} else if (this.getCardType().contains(CardType.ENCHANTMENT) && this.getSubtype(game).contains("Aura")) { } else if (this.isEnchantment() && this.getSubtype(game).contains("Aura")) {
if (ability.getTargets().stillLegal(ability, game)) { if (ability.getTargets().stillLegal(ability, game)) {
updateOptionalCosts(0); updateOptionalCosts(0);
boolean bestow = ability instanceof BestowAbility; boolean bestow = ability instanceof BestowAbility;
@ -432,7 +432,7 @@ public class Spell extends StackObjImpl implements Card {
@Override @Override
public String getLogName() { public String getLogName() {
if (faceDown) { if (faceDown) {
if (getCardType().contains(CardType.CREATURE)) { if (this.isCreature()) {
return "face down creature spell"; return "face down creature spell";
} else { } else {
return "face down spell"; return "face down spell";

View file

@ -938,7 +938,7 @@ public abstract class PlayerImpl implements Player, Serializable {
return false; return false;
} }
boolean result; boolean result;
if (card.getCardType().contains(CardType.LAND)) { if (card.isLand()) {
result = playLand(card, game, ignoreTiming); result = playLand(card, game, ignoreTiming);
} else { } else {
result = cast(card.getSpellAbility(), game, noMana); result = cast(card.getSpellAbility(), game, noMana);
@ -1264,7 +1264,7 @@ public abstract class PlayerImpl implements Player, Serializable {
useable.put(ability.getId(), (ActivatedAbility) ability); useable.put(ability.getId(), (ActivatedAbility) ability);
} }
} else if (ability instanceof AlternativeSourceCosts) { } else if (ability instanceof AlternativeSourceCosts) {
if (object.getCardType().contains(CardType.LAND)) { if (object.isLand()) {
for (Ability ability2 : object.getAbilities().copy()) { for (Ability ability2 : object.getAbilities().copy()) {
if (ability2 instanceof PlayLandAbility) { if (ability2 instanceof PlayLandAbility) {
useable.put(ability2.getId(), (ActivatedAbility) ability2); useable.put(ability2.getId(), (ActivatedAbility) ability2);
@ -1319,7 +1319,7 @@ public abstract class PlayerImpl implements Player, Serializable {
if (card.isSplitCard() && ability instanceof FlashbackAbility) { if (card.isSplitCard() && ability instanceof FlashbackAbility) {
FlashbackAbility flashbackAbility; FlashbackAbility flashbackAbility;
// Left Half // Left Half
if (card.getCardType().contains(CardType.INSTANT)) { if (card.isInstant()) {
flashbackAbility = new FlashbackAbility(((SplitCard) card).getLeftHalfCard().getManaCost(), TimingRule.INSTANT); flashbackAbility = new FlashbackAbility(((SplitCard) card).getLeftHalfCard().getManaCost(), TimingRule.INSTANT);
} else { } else {
flashbackAbility = new FlashbackAbility(((SplitCard) card).getLeftHalfCard().getManaCost(), TimingRule.SORCERY); flashbackAbility = new FlashbackAbility(((SplitCard) card).getLeftHalfCard().getManaCost(), TimingRule.SORCERY);
@ -1332,7 +1332,7 @@ public abstract class PlayerImpl implements Player, Serializable {
useable.put(flashbackAbility.getId(), flashbackAbility); useable.put(flashbackAbility.getId(), flashbackAbility);
} }
// Right Half // Right Half
if (card.getCardType().contains(CardType.INSTANT)) { if (card.isInstant()) {
flashbackAbility = new FlashbackAbility(((SplitCard) card).getRightHalfCard().getManaCost(), TimingRule.INSTANT); flashbackAbility = new FlashbackAbility(((SplitCard) card).getRightHalfCard().getManaCost(), TimingRule.INSTANT);
} else { } else {
flashbackAbility = new FlashbackAbility(((SplitCard) card).getRightHalfCard().getManaCost(), TimingRule.SORCERY); flashbackAbility = new FlashbackAbility(((SplitCard) card).getRightHalfCard().getManaCost(), TimingRule.SORCERY);
@ -2616,11 +2616,11 @@ public abstract class PlayerImpl implements Player, Serializable {
} }
} }
} else if (ability instanceof AlternativeSourceCosts) { } else if (ability instanceof AlternativeSourceCosts) {
if (card.getCardType().contains(CardType.LAND)) { if (card.isLand()) {
if (canLandPlayAlternateSourceCostsAbility(card, availableMana, ability, game)) { // e.g. Land with Morph if (canLandPlayAlternateSourceCostsAbility(card, availableMana, ability, game)) { // e.g. Land with Morph
playable.add(ability); playable.add(ability);
} }
} else if (card.getCardType().contains(CardType.CREATURE)) { // e.g. makes a card available for play by Morph if the card may not be cast normally } else if (card.isCreature()) { // e.g. makes a card available for play by Morph if the card may not be cast normally
if (!playable.contains(card.getSpellAbility())) { if (!playable.contains(card.getSpellAbility())) {
if (((AlternativeSourceCosts) ability).isAvailable(card.getSpellAbility(), game)) { if (((AlternativeSourceCosts) ability).isAvailable(card.getSpellAbility(), game)) {
playable.add(card.getSpellAbility()); playable.add(card.getSpellAbility());
@ -2766,7 +2766,7 @@ public abstract class PlayerImpl implements Player, Serializable {
} }
break; break;
case STATIC: case STATIC:
if (card.getCardType().contains(CardType.LAND) && ability instanceof AlternativeSourceCosts) { if (card.isLand() && ability instanceof AlternativeSourceCosts) {
if (canLandPlayAlternateSourceCostsAbility(card, available, ability, game)) { // e.g. Land with Morph if (canLandPlayAlternateSourceCostsAbility(card, available, ability, game)) { // e.g. Land with Morph
if (game.canPlaySorcery(getId())) { if (game.canPlaySorcery(getId())) {
playable.add(card.getId()); playable.add(card.getId());

View file

@ -124,7 +124,7 @@ public final class CardUtil {
throw new IllegalArgumentException("Params can't be null"); throw new IllegalArgumentException("Params can't be null");
} }
if (card1.getCardType().contains(CardType.CREATURE) && card2.getCardType().contains(CardType.CREATURE)) { if (card1.isCreature() && card2.isCreature()) {
if (card1.getAbilities().contains(ChangelingAbility.getInstance()) if (card1.getAbilities().contains(ChangelingAbility.getInstance())
|| card1.getSubtype(game).contains(ChangelingAbility.ALL_CREATURE_TYPE) || card1.getSubtype(game).contains(ChangelingAbility.ALL_CREATURE_TYPE)
|| card2.getAbilities().contains(ChangelingAbility.getInstance()) || card2.getAbilities().contains(ChangelingAbility.getInstance())
@ -411,11 +411,11 @@ public final class CardUtil {
public static boolean isPermanentCard(Card card) { public static boolean isPermanentCard(Card card) {
boolean permanent = false; boolean permanent = false;
permanent |= card.getCardType().contains(CardType.ARTIFACT); permanent |= card.isArtifact();
permanent |= card.getCardType().contains(CardType.CREATURE); permanent |= card.isCreature();
permanent |= card.getCardType().contains(CardType.ENCHANTMENT); permanent |= card.isEnchantment();
permanent |= card.getCardType().contains(CardType.LAND); permanent |= card.isLand();
permanent |= card.getCardType().contains(CardType.PLANESWALKER); permanent |= card.isPlaneswalker();
return permanent; return permanent;
} }
@ -676,7 +676,7 @@ public final class CardUtil {
} }
public static boolean cardCanBePlayedNow(Card card, UUID playerId, Game game) { public static boolean cardCanBePlayedNow(Card card, UUID playerId, Game game) {
if (card.getCardType().contains(CardType.LAND)) { if (card.isLand()) {
return game.canPlaySorcery(playerId) && game.getPlayer(playerId).canPlayLand(); return game.canPlaySorcery(playerId) && game.getPlayer(playerId).canPlayLand();
} else { } else {
return card.getSpellAbility() != null && card.getSpellAbility().spellCanBeActivatedRegularlyNow(playerId, game); return card.getSpellAbility() != null && card.getSpellAbility().spellCanBeActivatedRegularlyNow(playerId, game);

View file

@ -58,7 +58,7 @@ public final class TraceUtil {
if (hasIntimidate(attacker)) { if (hasIntimidate(attacker)) {
for (UUID blockerId : group.getBlockers()) { for (UUID blockerId : group.getBlockers()) {
Permanent blocker = game.getPermanent(blockerId); Permanent blocker = game.getPermanent(blockerId);
if (blocker != null && !blocker.getCardType().contains(CardType.ARTIFACT) if (blocker != null && !blocker.isArtifact()
&& !attacker.getColor(game).shares(blocker.getColor(game))) { && !attacker.getColor(game).shares(blocker.getColor(game))) {
log.warn("Found creature with intimidate blocked by non artifact not sharing color creature"); log.warn("Found creature with intimidate blocked by non artifact not sharing color creature");
traceCombat(game, attacker, blocker); traceCombat(game, attacker, blocker);

View file

@ -62,7 +62,7 @@ public class CreatureWasCastWatcher extends Watcher {
Spell spell = (Spell) game.getObject(event.getTargetId()); Spell spell = (Spell) game.getObject(event.getTargetId());
if (spell != null) { if (spell != null) {
Card card = game.getCard(spell.getSourceId()); Card card = game.getCard(spell.getSourceId());
if (card != null && card.getCardType().contains(CardType.CREATURE)) { if (card != null && card.isCreature()) {
creaturesCasted.add(card.getId()); creaturesCasted.add(card.getId());
} }
} }
@ -70,7 +70,7 @@ public class CreatureWasCastWatcher extends Watcher {
if (event.getType() == GameEvent.EventType.ZONE_CHANGE if (event.getType() == GameEvent.EventType.ZONE_CHANGE
&& ((ZoneChangeEvent) event).getFromZone() == Zone.BATTLEFIELD) { && ((ZoneChangeEvent) event).getFromZone() == Zone.BATTLEFIELD) {
Card card = game.getCard(event.getTargetId()); Card card = game.getCard(event.getTargetId());
if (card != null && card.getCardType().contains(CardType.CREATURE)) { if (card != null && card.isCreature()) {
creaturesCasted.remove(card.getId()); creaturesCasted.remove(card.getId());
} }
} }

View file

@ -59,7 +59,9 @@ public class CreaturesDiedWatcher extends Watcher {
public void watch(GameEvent event, Game game) { public void watch(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.ZONE_CHANGE) { if (event.getType() == GameEvent.EventType.ZONE_CHANGE) {
ZoneChangeEvent zEvent = (ZoneChangeEvent) event; ZoneChangeEvent zEvent = (ZoneChangeEvent) event;
if (zEvent.isDiesEvent() && zEvent.getTarget() != null && zEvent.getTarget().getCardType().contains(CardType.CREATURE)) { if (zEvent.isDiesEvent()
&& zEvent.getTarget() != null
&& zEvent.getTarget().isCreature()) {
amountOfCreaturesThatDied++; amountOfCreaturesThatDied++;
int amount = 0; int amount = 0;
if (amountOfCreaturesThatDiedByController.containsKey(zEvent.getTarget().getControllerId())) { if (amountOfCreaturesThatDiedByController.containsKey(zEvent.getTarget().getControllerId())) {

View file

@ -36,7 +36,7 @@ public class LandfallWatcher extends Watcher {
public void watch(GameEvent event, Game game) { public void watch(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD) { if (event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD) {
Permanent permanent = game.getPermanentOrLKIBattlefield(event.getTargetId()); Permanent permanent = game.getPermanentOrLKIBattlefield(event.getTargetId());
if (permanent != null && permanent.getCardType().contains(CardType.LAND) && !playerPlayedLand.contains(event.getPlayerId())) { if (permanent != null && permanent.isLand() && !playerPlayedLand.contains(event.getPlayerId())) {
playerPlayedLand.add(event.getPlayerId()); playerPlayedLand.add(event.getPlayerId());
} }
} }

View file

@ -58,7 +58,7 @@ public class MorbidWatcher extends Watcher {
} }
if (event.getType() == GameEvent.EventType.ZONE_CHANGE && ((ZoneChangeEvent)event).isDiesEvent()) { if (event.getType() == GameEvent.EventType.ZONE_CHANGE && ((ZoneChangeEvent)event).isDiesEvent()) {
Permanent p = (Permanent) game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD); Permanent p = (Permanent) game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD);
if (p != null && p.getCardType().contains(CardType.CREATURE)) { if (p != null && p.isCreature()) {
condition = true; condition = true;
} }
} }

View file

@ -77,7 +77,7 @@ public class PermanentsEnteredBattlefieldWatcher extends Watcher {
for (Permanent permanent : enteringBattlefieldLastTurn.get(sourcePermanent.getControllerId())) { for (Permanent permanent : enteringBattlefieldLastTurn.get(sourcePermanent.getControllerId())) {
if (!permanent.getId().equals(sourcePermanent.getId()) if (!permanent.getId().equals(sourcePermanent.getId())
//|| permanent.getZoneChangeCounter(game) == sourcePermanent.getZoneChangeCounter(game) why is this needed? //|| permanent.getZoneChangeCounter(game) == sourcePermanent.getZoneChangeCounter(game) why is this needed?
&& permanent.getCardType().contains(CardType.CREATURE)) { && permanent.isCreature()) {
return true; return true;
} }
} }

View file

@ -58,7 +58,7 @@ public class PlayerCastCreatureWatcher extends Watcher {
public void watch(GameEvent event, Game game) { public void watch(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.SPELL_CAST) { if (event.getType() == GameEvent.EventType.SPELL_CAST) {
Spell spell = (Spell) game.getObject(event.getTargetId()); Spell spell = (Spell) game.getObject(event.getTargetId());
if (spell.getCardType().contains(CardType.CREATURE)) { if (spell.isCreature()) {
playerIds.add(spell.getControllerId()); playerIds.add(spell.getControllerId());
} }
} }