package magic.model.condition; import java.util.LinkedList; import java.util.List; import magic.model.MagicAbility; import magic.model.MagicCard; import magic.model.MagicCardDefinition; import magic.model.MagicCardList; import magic.model.MagicGame; import magic.model.MagicPermanent; import magic.model.MagicPermanentState; import magic.model.MagicPlayer; import magic.model.MagicPlayerState; import magic.model.MagicSource; import magic.model.MagicSubType; import magic.model.MagicType; import magic.model.action.PlayAbilityAction; import magic.model.event.MagicConditionEvent; import magic.model.event.MagicEvent; import magic.model.event.MagicEventAction; import magic.model.event.MagicMatchedCostEvent; import magic.model.phase.MagicPhaseType; import magic.model.stack.MagicCardOnStack; import magic.model.target.MagicOtherPermanentTargetFilter; import magic.model.target.MagicTargetFilterFactory; public abstract class MagicCondition implements MagicMatchedCostEvent { private static final MagicEventAction PLAY_ABILITY_ACTION = (final MagicGame game, final MagicEvent event) -> game.doAction(new PlayAbilityAction(event.getPermanent())); public static List<MagicMatchedCostEvent> build(final String costs) { final List<MagicMatchedCostEvent> matched = new LinkedList<MagicMatchedCostEvent>(); final String[] splitCosts = costs.split("(,)? and "); for (String cost : splitCosts) { matched.add(MagicConditionParser.build(cost)); } return matched; } public boolean accept(final MagicEvent event) { return accept(event.getSource()); } public abstract boolean accept(final MagicSource source); @Override public MagicEvent getEvent(final MagicSource source) { return new MagicConditionEvent(source, this, getEventAction()); } public MagicEventAction getEventAction() { return MagicEventAction.NONE; } @Override public boolean isIndependent() { return true; } public static MagicCondition NONE = new MagicCondition() { public boolean accept(final MagicSource source) { return true; } }; public static MagicCondition CARD_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicCard card = (MagicCard)source; final MagicCardDefinition cardDefinition = card.getCardDefinition(); final MagicGame game = source.getGame(); if (cardDefinition.hasType(MagicType.Instant) || cardDefinition.hasAbility(MagicAbility.Flash)) { return true; } else if (cardDefinition.hasType(MagicType.Land)) { return game.canPlayLand(card.getOwner()); } else { return game.canPlaySorcery(card.getOwner()); } } }; public static MagicCondition HAND_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicCard card = (MagicCard)source; return card.isInHand(); } }; public static MagicCondition GRAVEYARD_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicCard card = (MagicCard)source; return card.isInGraveyard(); } }; public static MagicCondition NINJUTSU_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicGame game = source.getGame(); return game.isPhase(MagicPhaseType.DeclareBlockers) || game.isPhase(MagicPhaseType.CombatDamage) || game.isPhase(MagicPhaseType.EndOfCombat); } }; public static MagicCondition NOT_SORCERY_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicGame game = source.getGame(); return game.canPlaySorcery(source.getController()) == false; } }; public static MagicCondition NOT_MONSTROUS_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicPermanent permanent = (MagicPermanent)source; return permanent.hasState(MagicPermanentState.Monstrous) == false; } }; public static MagicCondition NOT_EXCLUDE_COMBAT_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicPermanent permanent = (MagicPermanent)source; return permanent.hasState(MagicPermanentState.ExcludeFromCombat) == false; } }; public static MagicCondition SORCERY_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicGame game = source.getGame(); return game.canPlaySorcery(source.getController()); } }; public static MagicCondition BEFORE_YOUR_ATTACK_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicGame game = source.getGame(); return source.isFriend(game.getTurnPlayer()) && game.getPhase().getType().ordinal() < MagicPhaseType.DeclareAttackers.ordinal(); } }; public static MagicCondition DECLARE_ATTACKERS = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicGame game = source.getGame(); return game.isPhase(MagicPhaseType.DeclareAttackers); } }; public static MagicCondition YOUR_UPKEEP_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicGame game = source.getGame(); return game.isPhase(MagicPhaseType.Upkeep) && source.isFriend(game.getTurnPlayer()); } }; public static MagicCondition ANY_UPKEEP_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicGame game = source.getGame(); return game.isPhase(MagicPhaseType.Upkeep); } }; public static MagicCondition OPPONENTS_UPKEEP_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicGame game = source.getGame(); return game.isPhase(MagicPhaseType.Upkeep) && source.isEnemy(game.getTurnPlayer()); } }; public static MagicCondition YOUR_TURN_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicGame game = source.getGame(); return source.isFriend(game.getTurnPlayer()); } }; public static MagicCondition BEFORE_ATTACKERS = new MagicCondition() { @Override public boolean accept(MagicSource source) { final MagicGame game = source.getGame(); return game.getPhase().getType().ordinal() < MagicPhaseType.DeclareAttackers.ordinal(); } }; public static MagicCondition BEFORE_BLOCKERS = new MagicCondition() { @Override public boolean accept(MagicSource source) { final MagicGame game = source.getGame(); return game.getPhase().getType().ordinal() < MagicPhaseType.DeclareBlockers.ordinal(); } }; public static MagicCondition BEFORE_COMBAT_DAMAGE = new MagicCondition() { @Override public boolean accept(MagicSource source) { final MagicGame game = source.getGame(); return game.getPhase().getType().ordinal() < MagicPhaseType.CombatDamage.ordinal(); } }; public static MagicCondition BEFORE_END_OF_COMBAT = new MagicCondition() { @Override public boolean accept(MagicSource source) { final MagicGame game = source.getGame(); return game.getPhase().getType().ordinal() < MagicPhaseType.EndOfCombat.ordinal(); } }; public static MagicCondition BEEN_ATTACKED = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicGame game = source.getGame(); return source.isEnemy(game.getTurnPlayer()) && game.getTurnPlayer().getNrOfAttackers() > 0; } }; public static MagicCondition END_OF_COMBAT_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicGame game = source.getGame(); return game.isPhase(MagicPhaseType.EndOfCombat); } }; public static MagicCondition DURING_COMBAT = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicGame game = source.getGame(); return game.getPhase().getType().ordinal() >= MagicPhaseType.BeginOfCombat.ordinal() && game.getPhase().getType().ordinal() <= MagicPhaseType.EndOfCombat.ordinal(); } }; public static MagicCondition DURING_COMBAT_AFTER_BLOCKERS = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicGame game = source.getGame(); return game.isPhase(MagicPhaseType.DeclareBlockers) || game.isPhase(MagicPhaseType.EndOfCombat); } }; public static MagicCondition DURING_BLOCKERS = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicGame game = source.getGame(); return game.isPhase(MagicPhaseType.DeclareBlockers); } }; public static MagicCondition DURING_COMBAT_BEFORE_BLOCKERS = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicGame game = source.getGame(); return game.getPhase().getType().ordinal() >= MagicPhaseType.BeginOfCombat.ordinal() && game.getPhase().getType().ordinal() < MagicPhaseType.DeclareBlockers.ordinal(); } }; public static MagicCondition AFTER_COMBAT = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicGame game = source.getGame(); return game.getPhase().getType().ordinal() > MagicPhaseType.EndOfCombat.ordinal(); } }; public static MagicCondition CAN_TAP_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicPermanent permanent = (MagicPermanent)source; return permanent.canTap(); } }; public static MagicCondition CAN_UNTAP_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicPermanent permanent = (MagicPermanent)source; return permanent.canUntap(); } }; public static MagicCondition TAPPED_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicPermanent permanent = (MagicPermanent)source; return permanent.isTapped(); } }; public static MagicCondition UNTAPPED_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicPermanent permanent = (MagicPermanent)source; return permanent.isUntapped(); } }; public static MagicCondition IS_BLOCKED_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicPermanent permanent = (MagicPermanent)source; return permanent.isBlocked(); } }; public static MagicCondition IS_ATTACKING_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicPermanent permanent = (MagicPermanent)source; return permanent.isAttacking(); } }; public static MagicCondition IS_ATTACKING_ALONE_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicPermanent permanent = (MagicPermanent)source; return permanent.isAttacking() && source.getController().getNrOfAttackers() == 1; } }; public static MagicCondition ABILITY_ONCE_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicPermanent permanent = (MagicPermanent)source; return permanent.getAbilityPlayedThisTurn() < 1; } @Override public MagicEventAction getEventAction() { return PLAY_ABILITY_ACTION; } @Override public boolean isIndependent() { return false; } }; public static MagicCondition ABILITY_TWICE_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicPermanent permanent = (MagicPermanent)source; return permanent.getAbilityPlayedThisTurn() < 2; } @Override public MagicEventAction getEventAction() { return PLAY_ABILITY_ACTION; } @Override public boolean isIndependent() { return false; } }; public static MagicCondition ABILITY_THRICE_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicPermanent permanent = (MagicPermanent)source; return permanent.getAbilityPlayedThisTurn() < 3; } @Override public MagicEventAction getEventAction() { return PLAY_ABILITY_ACTION; } @Override public boolean isIndependent() { return false; } }; public static MagicCondition NOT_CREATURE_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { return !source.isCreaturePermanent(); } }; public static MagicCondition METALCRAFT_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { return source.getController().getNrOfPermanents(MagicType.Artifact) >= 3; } }; public static MagicCondition CAN_REGENERATE_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicPermanent permanent = (MagicPermanent)source; return permanent.canRegenerate(); } }; public static MagicCondition THREE_ATTACKERS_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { return source.getController().getNrOfAttackers() >= 3; } }; public static MagicCondition PLAINS_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { return source.getController().controlsPermanent(MagicSubType.Plains); } }; public static MagicCondition ISLAND_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { return source.getController().controlsPermanent(MagicSubType.Island); } }; public static MagicCondition SWAMP_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { return source.getController().controlsPermanent(MagicSubType.Swamp); } }; public static MagicCondition MOUNTAIN_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { return source.getController().controlsPermanent(MagicSubType.Mountain); } }; public static MagicCondition FOREST_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { return source.getController().controlsPermanent(MagicSubType.Forest); } }; public static MagicCondition LEAST_FIVE_OTHER_MOUNTAINS = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicPermanent permanent = (MagicPermanent)source; final MagicOtherPermanentTargetFilter filter = new MagicOtherPermanentTargetFilter( MagicTargetFilterFactory.MOUNTAIN_YOU_CONTROL, permanent ); return permanent.getController().getNrOfPermanents(filter) >= 5; } }; public static MagicCondition THRESHOLD_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { return source.getController().getGraveyard().size() >= 7; } }; public static MagicCondition DELIRIUM_CONDITION = new MagicCondition() { public boolean accept(MagicSource source) { final MagicCardList graveyard = source.getController().getGraveyard(); int count = 0; for (MagicType type : MagicType.ALL_CARD_TYPES) { if (graveyard.containsType(type)) { count++; } } return count >= 4; } }; public static MagicCondition FATEFUL_HOUR = new MagicCondition() { public boolean accept(final MagicSource source) { return source.getController().getLife() <= 5; } }; public static MagicCondition HELLBENT = new MagicCondition() { public boolean accept(final MagicSource source) { return source.getController().getHandSize() == 0; } }; public static MagicCondition OPPONENT_HELLBENT = new MagicCondition() { public boolean accept(final MagicSource source) { return source.getOpponent().getHandSize() == 0; } }; public static MagicCondition ANY_HELLBENT = new MagicCondition() { public boolean accept(final MagicSource source) { return source.getOpponent().getHandSize() == 0 || source.getController().getHandSize() == 0; } }; public static MagicCondition THAT_HELLBENT = new MagicCondition() { @Override public boolean accept(final MagicEvent event) { return event.getRefPlayer().getHandSize() == 0; } @Override public boolean accept(final MagicSource source) { throw new RuntimeException("accept(source) called on THAT_HELLBENT"); } }; public static MagicCondition ENCHANTED_IS_UNTAPPED_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicPermanent permanent = (MagicPermanent)source; return permanent.getEnchantedPermanent().isUntapped(); } }; public static MagicCondition ENCHANTED_IS_BASIC_MOUNTAIN = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicPermanent enchanted = ((MagicPermanent)source).getEnchantedPermanent(); return enchanted.hasType(MagicType.Basic) && enchanted.hasSubType(MagicSubType.Mountain); } }; public static MagicCondition HAS_EXILED_CARD = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicPermanent permanent = (MagicPermanent)source; return permanent.getExiledCard().isValid(); } }; public static MagicCondition HAS_EXILED_CREATURE_CARD = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicPermanent permanent = (MagicPermanent)source; final MagicCard card = permanent.getExiledCard(); return card.isValid() && card.hasType(MagicType.Creature); } }; public static MagicCondition HAS_EQUIPPED_CREATURE = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicPermanent permanent = (MagicPermanent)source; return permanent.getEquippedCreature().isCreature(); } }; public static MagicCondition IS_EQUIPPED = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicPermanent permanent = (MagicPermanent)source; return permanent.isEquipped(); } }; public static MagicCondition IS_ENCHANTED = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicPermanent permanent = (MagicPermanent)source; return permanent.isEnchanted(); } }; public static MagicCondition IS_ENCHANTMENT = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicPermanent permanent = (MagicPermanent)source; return permanent.isEnchantment(); } }; public static MagicCondition IS_NOT_ENCHANTMENT = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicPermanent permanent = (MagicPermanent)source; return !permanent.isEnchantment(); } }; public static MagicCondition IS_MONSTROUS_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicPermanent permanent = (MagicPermanent)source; return permanent.hasState(MagicPermanentState.Monstrous); } }; public static MagicCondition IS_RENOWNED_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicPermanent permanent = (MagicPermanent)source; return permanent.hasState(MagicPermanentState.Renowned); } }; public static MagicCondition EMPTY_GRAVEYARD_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { return source.getController().getGraveyard().isEmpty(); } }; public static MagicCondition LIBRARY_HAS_20_OR_LESS_CARDS_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicPlayer player = source.getController(); return player.getLibrary().size() <= 20 || player.getOpponent().getLibrary().size() <= 20; } }; public static MagicCondition OPP_GRAVEYARD_WITH_10_OR_MORE_CARDS_CONDTITION = new MagicCondition() { public boolean accept(MagicSource source) { return source.getOpponent().getGraveyard().size() >= 10; } }; public static MagicCondition OPP_NOT_CONTROL_WHITE_OR_BLUE_CREATURE_CONDITION = new MagicCondition() { public boolean accept(MagicSource source) { return !source.getOpponent().controlsPermanent(MagicTargetFilterFactory.WHITE_OR_BLUE_CREATURE); } }; public static MagicCondition MOST_CARDS_IN_HAND_CONDITION = new MagicCondition() { public boolean accept(MagicSource source) { final MagicPlayer player = source.getController(); return player.getHandSize() > player.getOpponent().getHandSize(); } }; public static MagicCondition EXACTLY_SEVEN_CARDS_IN_HAND_CONDITION = new MagicCondition() { public boolean accept(MagicSource source) { final MagicPlayer player = source.getController(); return player.getHandSize() == 7; } }; public static MagicCondition OPPONENT_TEN_OR_LESS_LIFE = new MagicCondition() { public boolean accept(MagicSource source) { return source.getOpponent().getLife() <= 10; } }; public static MagicCondition OPPONENT_WAS_DEALT_DAMAGE = new MagicCondition() { public boolean accept(MagicSource source) { return source.getOpponent().hasState(MagicPlayerState.WasDealtDamage); } }; public static MagicCondition OPPONENT_HAS_GREATER_OR_EQUAL_LIFE = new MagicCondition() { public boolean accept(MagicSource source) { return source.getOpponent().getLife() >= source.getController().getLife(); } }; public static MagicCondition YOU_30_OR_MORE_LIFE = new MagicCondition() { public boolean accept(MagicSource source) { return source.getController().getLife() >= 30; } }; public static MagicCondition YOU_30_OR_MORE_OPPPONENT_10_OR_LESS_LIFE = new MagicCondition() { public boolean accept(MagicSource source) { return YOU_30_OR_MORE_LIFE.accept(source) && OPPONENT_TEN_OR_LESS_LIFE.accept(source); } }; public static MagicCondition HAS_WARRIOR_IN_GRAVEYARD = MagicConditionFactory.YouHaveAtLeast(MagicTargetFilterFactory.WARRIOR_CARD_FROM_GRAVEYARD, 1); public static MagicCondition HAS_ARTIFACT_IN_GRAVEYARD = MagicConditionFactory.YouHaveAtLeast(MagicTargetFilterFactory.ARTIFACT_CARD_FROM_GRAVEYARD, 1); public static MagicCondition OPP_NOT_CONTROL_CREATURE_CONDITION = new MagicCondition() { public boolean accept(MagicSource source) { return !source.getOpponent().controlsPermanent(MagicType.Creature); } }; public static MagicCondition NOT_YOUR_TURN_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicGame game = source.getGame(); return source.isEnemy(game.getTurnPlayer()); } }; public static MagicCondition FACE_DOWN_PERMANENT_CONDITION = new MagicCondition() { @Override public boolean accept(final MagicSource source) { final MagicPermanent permanent = (MagicPermanent)source; return permanent.isFaceDown(); } }; public static MagicCondition NO_SPELLS_CAST_LAST_TURN = new MagicCondition() { @Override public boolean accept(final MagicSource source) { final MagicGame game = source.getGame(); return game.getSpellsCastLastTurn() == 0; } }; public static MagicCondition TWO_OR_MORE_SPELLS_CAST_BY_PLAYER_LAST_TURN = new MagicCondition() { @Override public boolean accept(final MagicSource source) { return source.getController().getSpellsCastLastTurn() >= 2 || source.getOpponent().getSpellsCastLastTurn() >= 2; } }; public static MagicCondition MORE_CREATURES_THAN_DEFENDING = new MagicCondition() { @Override public boolean accept(final MagicSource source) { final MagicGame game = source.getGame(); return source.getController().getNrOfPermanents(MagicType.Creature) > game.getDefendingPlayer().getNrOfPermanents(MagicType.Creature); } }; public static MagicCondition MORE_CREATURES_THAN_ATTACKING = new MagicCondition() { @Override public boolean accept(final MagicSource source) { final MagicGame game = source.getGame(); return source.getController().getNrOfPermanents(MagicType.Creature) > game.getAttackingPlayer().getNrOfPermanents(MagicType.Creature); } }; public static MagicCondition MORE_LANDS_THAN_DEFENDING = new MagicCondition() { @Override public boolean accept(final MagicSource source) { final MagicGame game = source.getGame(); return source.getController().getNrOfPermanents(MagicType.Land) > game.getDefendingPlayer().getNrOfPermanents(MagicType.Land); } }; public static MagicCondition MORE_LANDS_THAN_ATTACKING = new MagicCondition() { @Override public boolean accept(final MagicSource source) { final MagicGame game = source.getGame(); return source.getController().getNrOfPermanents(MagicType.Land) > game.getAttackingPlayer().getNrOfPermanents(MagicType.Land); } }; public static MagicCondition OPP_MORE_LANDS = new MagicCondition() { @Override public boolean accept(final MagicSource source) { return source.getOpponent().getNrOfPermanents(MagicType.Land) > source.getController().getNrOfPermanents(MagicType.Land); } }; public static MagicCondition OPP_MORE_CREATURES = new MagicCondition() { @Override public boolean accept(final MagicSource source) { return source.getOpponent().getNrOfPermanents(MagicType.Creature) > source.getController().getNrOfPermanents(MagicType.Creature); } }; public static MagicCondition OPP_MORE_LIFE = new MagicCondition() { @Override public boolean accept(final MagicSource source) { return source.getOpponent().getLife() > source.getController().getLife(); } }; public static MagicCondition YOU_MORE_LIFE = new MagicCondition() { @Override public boolean accept(final MagicSource source) { return source.getController().getLife() > source.getOpponent().getLife(); } }; public static MagicCondition CREATURE_DIED_THIS_TURN = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicGame game = source.getGame(); return game.getCreatureDiedThisTurn(); } }; public static MagicCondition PERMANENT_YOU_CONTROLLED_LEFT_BATTLEFIELD = new MagicCondition() { public boolean accept(MagicSource source) { return source.getController().hasState(MagicPlayerState.Revolt); } }; public static MagicCondition YOU_ATTACKED_WITH_CREATURE = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicPlayer player = source.getController(); return player.getCreaturesAttackedThisTurn() >= 1; } }; public static MagicCondition CREATURE_IN_A_GRAVEYARD = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicPlayer player = source.getController(); return MagicTargetFilterFactory.CREATURE_CARD_FROM_ALL_GRAVEYARDS.filter(player).size() > 0; } }; public static MagicCondition HAS_CREATURE_IN_GRAVEYARD = MagicConditionFactory.YouHaveAtLeast(MagicTargetFilterFactory.CREATURE_CARD_FROM_GRAVEYARD, 1); public static MagicCondition HAS_CREATURE_IN_HAND = new MagicCondition() { public boolean accept(MagicSource source) { final MagicPlayer player = source.getController(); return MagicTargetFilterFactory.CREATURE_CARD_FROM_HAND.filter(player).size() > 0; } }; public static MagicCondition HAS_EQUIPMENT_IN_HAND = new MagicCondition() { public boolean accept(MagicSource source) { final MagicPlayer player = source.getController(); return MagicTargetFilterFactory.EQUIPMENT_CARD_FROM_HAND.filter(player).size() > 0; } }; public static MagicCondition INSTANT_OR_SORCERY_IN_A_GRAVEYARD = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicPlayer player = source.getController(); return !MagicTargetFilterFactory.INSTANT_OR_SORCERY_CARD_FROM_ALL_GRAVEYARDS.filter(player).isEmpty(); } }; public static MagicCondition SPELL_MASTERY_CONDITION = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicPlayer player = source.getController(); return MagicTargetFilterFactory.INSTANT_OR_SORCERY_CARD_FROM_GRAVEYARD.filter(player).size() >= 2; } }; public static MagicCondition FORMIDABLE = new MagicCondition() { public boolean accept(final MagicSource source) { final List<MagicPermanent> creatures = MagicTargetFilterFactory.CREATURE_YOU_CONTROL.filter(source.getController()); int totalPower = 0; for (final MagicPermanent creature : creatures) { totalPower += creature.getPowerValue(); } return totalPower >= 8; } }; public static MagicCondition CAST_FROM_HAND = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicPermanent permanent = (MagicPermanent)source; return permanent.hasState(MagicPermanentState.CastFromHand); } }; public static MagicCondition WAS_NONCREATURE_ARTIFACT = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicPermanent permanent = (MagicPermanent)source; return permanent.getCardDefinition().hasType(MagicType.Artifact) && !permanent.getCardDefinition().hasType(MagicType.Creature); } }; public static MagicCondition WAS_KICKED = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicCardOnStack spell = (MagicCardOnStack)source; return spell.isKicked(); } }; public static MagicCondition CAST_ANOTHER_SPELL_THIS_TURN = new MagicCondition() { public boolean accept(final MagicSource source) { return source.getController().getSpellsCast() > 0; } }; public static MagicCondition CAST_A_NONCREATURE_SPELL_THIS_TURN = new MagicCondition() { public boolean accept(final MagicSource source) { return source.getController().getNonCreatureSpellsCast() > 0; } }; public static MagicCondition DEFENDING_POISONED = new MagicCondition() { public boolean accept(final MagicSource source) { return source.getGame().getDefendingPlayer().getPoison() > 0; } }; public static MagicCondition CONTROL_SINCE_LAST_TURN = new MagicCondition() { public boolean accept(final MagicSource source) { final MagicPermanent permanent = (MagicPermanent)source; return !permanent.hasState(MagicPermanentState.Summoned); } }; public static MagicCondition YOU_ARE_MONARCH = new MagicCondition() { public boolean accept(final MagicSource source) { return source.getController().isMonarch(); } }; }