diff --git a/Mage.Client/src/main/java/mage/client/table/TablesPanel.java b/Mage.Client/src/main/java/mage/client/table/TablesPanel.java index 73ca9f0caed..d9aad35135b 100644 --- a/Mage.Client/src/main/java/mage/client/table/TablesPanel.java +++ b/Mage.Client/src/main/java/mage/client/table/TablesPanel.java @@ -572,7 +572,7 @@ public class TablesPanel extends javax.swing.JPanel { formatFilterList.add(RowFilter.regexFilter("^Limited", TableTableModel.COLUMN_DECK_TYPE)); } if (btnFormatOther.isSelected()) { - formatFilterList.add(RowFilter.regexFilter("^Momir Basic|^Constructed - Pauper|^Constructed - Frontier|^Constructed - Extended|^Constructed - Eternal|^Constructed - Historical|^Constructed - Super|^Constructed - Freeform|^Australian Highlander|^Canadian Highlander", TableTableModel.COLUMN_DECK_TYPE)); + formatFilterList.add(RowFilter.regexFilter("^Momir Basic|^Constructed - Pauper|^Constructed - Frontier|^Constructed - Extended|^Constructed - Eternal|^Constructed - Historical|^Constructed - Super|^Constructed - Freeform|^Australian Highlander|^Canadian Highlander|^Constructed - Old", TableTableModel.COLUMN_DECK_TYPE)); } List> skillFilterList = new ArrayList<>(); diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/OldSchool9394.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/OldSchool9394.java new file mode 100644 index 00000000000..e55e6c15f8f --- /dev/null +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/OldSchool9394.java @@ -0,0 +1,113 @@ +/* +* Copyright 2011 BetaSteward_at_googlemail.com. All rights reserved. +* +* Redistribution and use in source and binary forms, with or without modification, are +* permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, this list of +* conditions and the following disclaimer. +* +* 2. Redistributions in binary form must reproduce the above copyright notice, this list +* of conditions and the following disclaimer in the documentation and/or other materials +* provided with the distribution. +* +* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED +* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR +* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* The views and conclusions contained in the software and documentation are those of the +* authors and should not be interpreted as representing official policies, either expressed +* or implied, of BetaSteward_at_googlemail.com. + */ +package mage.deck; + +import mage.cards.ExpansionSet; +import mage.cards.Sets; +import mage.cards.decks.Constructed; +import mage.constants.SetType; + +/** + * This class validates a deck for the Old School 93/94 format. + * + * This was originally made to follow the deck construction rules found at the + * Old School Mtg blog found at: + * http://oldschool-mtg.blogspot.com/p/banrestriction.html + * + * There is no mana burn in this version of old school. + * + * If there are any questions or corrections, feel free to contact me. + * + * @author Marthinwurer (at gmail.com) + */ +public class OldSchool9394 extends Constructed { + + public OldSchool9394() { + super("Constructed - Old School 93/94"); + + // use the set instances to make sure that we get the correct set codes + setCodes.add(mage.sets.LimitedEditionAlpha.getInstance().getCode()); + setCodes.add(mage.sets.LimitedEditionBeta.getInstance().getCode()); + setCodes.add(mage.sets.UnlimitedEdition.getInstance().getCode()); + setCodes.add(mage.sets.ArabianNights.getInstance().getCode()); + setCodes.add(mage.sets.Antiquities.getInstance().getCode()); + setCodes.add(mage.sets.Legends.getInstance().getCode()); + setCodes.add(mage.sets.TheDark.getInstance().getCode()); + + // ante cards and conspiracies banned, with specifically mentioned ones called out. + banned.add("Advantageous Proclamation"); + banned.add("Amulet of Quoz"); + banned.add("Backup Plan"); + banned.add("Brago's Favor"); + banned.add("Bronze Tablet"); /// + banned.add("Contract from Below"); /// + banned.add("Darkpact"); /// + banned.add("Demonic Attorney"); /// + banned.add("Double Stroke"); + banned.add("Immediate Action"); + banned.add("Iterative Analysis"); + banned.add("Jeweled Bird"); /// + banned.add("Muzzio's Preparations"); + banned.add("Power Play"); + banned.add("Rebirth"); /// + banned.add("Secret Summoning"); + banned.add("Secrets of Paradise"); + banned.add("Sentinel Dispatch"); + banned.add("Shahrazad"); + banned.add("Tempest Efreet"); /// + banned.add("Timmerian Fiends"); + banned.add("Unexpected Potential"); + banned.add("Worldknit"); + + restricted.add("Ancestral Recall"); + restricted.add("Balance"); + restricted.add("Black Lotus"); + restricted.add("Braingeyser"); + restricted.add("Channel"); + restricted.add("Chaos Orb"); + restricted.add("Demonic Tutor"); + restricted.add("Library of Alexandria"); + restricted.add("Mana Drain"); + restricted.add("Mind Twist"); + restricted.add("Mishra's Workshop"); + restricted.add("Mox Emerald"); + restricted.add("Mox Jet"); + restricted.add("Mox Pearl"); + restricted.add("Mox Ruby"); + restricted.add("Mox Sapphire"); + restricted.add("Regrowth"); + restricted.add("Shahrazad"); + restricted.add("Sol Ring"); + restricted.add("Strip Mine"); + restricted.add("Time Vault"); + restricted.add("Time Walk"); + restricted.add("Timetwister"); + restricted.add("Wheel of Fortune"); + + } +} diff --git a/Mage.Server/config/config.xml b/Mage.Server/config/config.xml index b9b2129968e..366b18e516b 100644 --- a/Mage.Server/config/config.xml +++ b/Mage.Server/config/config.xml @@ -138,6 +138,8 @@ + + diff --git a/Mage.Server/release/config/config.xml b/Mage.Server/release/config/config.xml index eb180fc8d38..d1b9959b57f 100644 --- a/Mage.Server/release/config/config.xml +++ b/Mage.Server/release/config/config.xml @@ -135,6 +135,8 @@ + + diff --git a/Mage.Sets/src/mage/cards/a/AbandonedSarcophagus.java b/Mage.Sets/src/mage/cards/a/AbandonedSarcophagus.java index d0e0fe71d16..6621fa8baa7 100644 --- a/Mage.Sets/src/mage/cards/a/AbandonedSarcophagus.java +++ b/Mage.Sets/src/mage/cards/a/AbandonedSarcophagus.java @@ -174,12 +174,14 @@ class AbandonedSarcophagusReplacementEffect extends ReplacementEffectImpl { public boolean applies(GameEvent event, Ability source, Game game) { cardWasCycledThisTurn = false; cardHasCycling = false; - if (((ZoneChangeEvent) event).getToZone() == Zone.GRAVEYARD) { + if (((ZoneChangeEvent) event).getToZone() == Zone.GRAVEYARD + && !game.isSimulation()) { Player controller = game.getPlayer(source.getControllerId()); AbandonedSarcophagusWatcher watcher = (AbandonedSarcophagusWatcher) game.getState().getWatchers().get(AbandonedSarcophagusWatcher.class.getSimpleName()); Card card = game.getCard(event.getTargetId()); if (card != null - && watcher != null) { + && watcher != null + && card.getOwnerId() == controller.getId()) { for (Ability ability : card.getAbilities()) { if (ability instanceof CyclingAbility) { cardHasCycling = true; @@ -217,9 +219,13 @@ class AbandonedSarcophagusWatcher extends Watcher { @Override public void watch(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.CYCLE_CARD) { + if (event.getType() == GameEvent.EventType.CYCLE_CARD + && !game.isSimulation()) { Card card = game.getCard(event.getSourceId()); - if (card != null) { + Player controller = game.getPlayer(event.getPlayerId()); + if (card != null + && controller != null + && card.getOwnerId() == controller.getId()) { Cards c = getCardsCycledThisTurn(event.getPlayerId()); c.add(card); cycledCardsThisTurn.put(event.getPlayerId(), c); diff --git a/Mage.Sets/src/mage/cards/a/AcidicSoil.java b/Mage.Sets/src/mage/cards/a/AcidicSoil.java index 28587b2cad8..149821c7fbc 100644 --- a/Mage.Sets/src/mage/cards/a/AcidicSoil.java +++ b/Mage.Sets/src/mage/cards/a/AcidicSoil.java @@ -33,7 +33,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; -import mage.filter.common.FilterLandPermanent; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; @@ -78,7 +78,7 @@ class AcidicSoilEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - List permanents = game.getBattlefield().getActivePermanents(new FilterLandPermanent(), source.getControllerId(), source.getSourceId(), game); + List permanents = game.getBattlefield().getActivePermanents(StaticFilters.FILTER_LAND, source.getControllerId(), source.getSourceId(), game); for (UUID playerId : game.getState().getPlayersInRange(source.getControllerId(), game)) { Player player = game.getPlayer(playerId); if (player != null) { diff --git a/Mage.Sets/src/mage/cards/a/AlteredEgo.java b/Mage.Sets/src/mage/cards/a/AlteredEgo.java index 5b47f126a83..c55f31d1b8b 100644 --- a/Mage.Sets/src/mage/cards/a/AlteredEgo.java +++ b/Mage.Sets/src/mage/cards/a/AlteredEgo.java @@ -39,7 +39,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.counters.Counter; import mage.counters.CounterType; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; @@ -61,7 +61,7 @@ public class AlteredEgo extends CardImpl { this.addAbility(new CantBeCounteredAbility()); // You may have Altered Ego enter the battlefield as a copy of any creature on the battlefield, except it enters with an additional X +1/+1 counters on it. - Effect effect = new CopyPermanentEffect(new FilterCreaturePermanent(), null); + Effect effect = new CopyPermanentEffect(StaticFilters.FILTER_PERMANENT_CREATURE, null); effect.setText("a copy of any creature on the battlefield"); EntersBattlefieldAbility ability = new EntersBattlefieldAbility(effect, true); effect = new AlteredEgoAddCountersEffect(CounterType.P1P1.createInstance()); diff --git a/Mage.Sets/src/mage/cards/a/AnkleShanker.java b/Mage.Sets/src/mage/cards/a/AnkleShanker.java index a34c8c566f6..03eca9c9fcd 100644 --- a/Mage.Sets/src/mage/cards/a/AnkleShanker.java +++ b/Mage.Sets/src/mage/cards/a/AnkleShanker.java @@ -39,7 +39,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import java.util.UUID; @@ -60,7 +60,7 @@ public class AnkleShanker extends CardImpl { // Haste this.addAbility(HasteAbility.getInstance()); // Whenever Ankle Shanker attacks, creatures you control gain first strike and deathtouch until end of turn. - Effect effect = new GainAbilityControlledEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn, new FilterCreaturePermanent("Creatures")); + Effect effect = new GainAbilityControlledEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES); effect.setText("creatures you control gain first strike"); Ability ability = new AttacksTriggeredAbility(effect, false); effect = new GainAbilityControlledEffect(DeathtouchAbility.getInstance(), Duration.EndOfTurn); diff --git a/Mage.Sets/src/mage/cards/a/ArchetypeOfAggression.java b/Mage.Sets/src/mage/cards/a/ArchetypeOfAggression.java index 719fdd37654..00d9d991199 100644 --- a/Mage.Sets/src/mage/cards/a/ArchetypeOfAggression.java +++ b/Mage.Sets/src/mage/cards/a/ArchetypeOfAggression.java @@ -38,6 +38,7 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.TargetController; import mage.constants.Zone; +import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.permanent.ControllerPredicate; @@ -64,7 +65,7 @@ public class ArchetypeOfAggression extends CardImpl { this.toughness = new MageInt(2); // Creatures you control have trample. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.WhileOnBattlefield, new FilterCreaturePermanent("Creatures")))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURES))); // Creatures your opponents control lose trample and can't have or gain trample. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CreaturesCantGetOrHaveAbilityEffect(TrampleAbility.getInstance(), Duration.WhileOnBattlefield, filter))); diff --git a/Mage.Sets/src/mage/cards/a/ArchetypeOfCourage.java b/Mage.Sets/src/mage/cards/a/ArchetypeOfCourage.java index d04ad2f2938..3129a1fc827 100644 --- a/Mage.Sets/src/mage/cards/a/ArchetypeOfCourage.java +++ b/Mage.Sets/src/mage/cards/a/ArchetypeOfCourage.java @@ -38,6 +38,7 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.TargetController; import mage.constants.Zone; +import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.permanent.ControllerPredicate; @@ -63,7 +64,7 @@ public class ArchetypeOfCourage extends CardImpl { this.toughness = new MageInt(2); // Creatures you control have first strike. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(FirstStrikeAbility.getInstance(), Duration.WhileOnBattlefield, new FilterCreaturePermanent("Creatures")))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(FirstStrikeAbility.getInstance(), Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURES))); // Creatures your opponents control lose first strike and can't have or gain first strike. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CreaturesCantGetOrHaveAbilityEffect(FirstStrikeAbility.getInstance(), Duration.WhileOnBattlefield, filter))); } diff --git a/Mage.Sets/src/mage/cards/a/ArchetypeOfEndurance.java b/Mage.Sets/src/mage/cards/a/ArchetypeOfEndurance.java index be83580eefc..8ea45676b87 100644 --- a/Mage.Sets/src/mage/cards/a/ArchetypeOfEndurance.java +++ b/Mage.Sets/src/mage/cards/a/ArchetypeOfEndurance.java @@ -38,6 +38,7 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.TargetController; import mage.constants.Zone; +import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.permanent.ControllerPredicate; @@ -63,7 +64,7 @@ public class ArchetypeOfEndurance extends CardImpl { this.toughness = new MageInt(5); // Creatures you control have hexproof. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(HexproofAbility.getInstance(), Duration.WhileOnBattlefield, new FilterCreaturePermanent("Creatures")))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(HexproofAbility.getInstance(), Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURES))); // Creatures your opponents control lose hexproof and can't have or gain hexproof. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CreaturesCantGetOrHaveAbilityEffect(HexproofAbility.getInstance(), Duration.WhileOnBattlefield, filter))); diff --git a/Mage.Sets/src/mage/cards/a/ArchetypeOfFinality.java b/Mage.Sets/src/mage/cards/a/ArchetypeOfFinality.java index 04d60bdf255..a43b7dc44bc 100644 --- a/Mage.Sets/src/mage/cards/a/ArchetypeOfFinality.java +++ b/Mage.Sets/src/mage/cards/a/ArchetypeOfFinality.java @@ -38,6 +38,7 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.TargetController; import mage.constants.Zone; +import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.permanent.ControllerPredicate; @@ -63,7 +64,7 @@ public class ArchetypeOfFinality extends CardImpl { this.toughness = new MageInt(3); // Creatures you control have deathtouch. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(DeathtouchAbility.getInstance(), Duration.WhileOnBattlefield, new FilterCreaturePermanent("Creatures")))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(DeathtouchAbility.getInstance(), Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURES))); // Creatures your opponents control lose deathtouch and can't have or gain deathtouch. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CreaturesCantGetOrHaveAbilityEffect(DeathtouchAbility.getInstance(), Duration.WhileOnBattlefield, filter))); diff --git a/Mage.Sets/src/mage/cards/a/ArchetypeOfImagination.java b/Mage.Sets/src/mage/cards/a/ArchetypeOfImagination.java index 610d547d5b3..9620c7a3231 100644 --- a/Mage.Sets/src/mage/cards/a/ArchetypeOfImagination.java +++ b/Mage.Sets/src/mage/cards/a/ArchetypeOfImagination.java @@ -38,6 +38,7 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.TargetController; import mage.constants.Zone; +import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.permanent.ControllerPredicate; @@ -63,7 +64,7 @@ public class ArchetypeOfImagination extends CardImpl { this.toughness = new MageInt(2); // Creatures you control have flying. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(FlyingAbility.getInstance(), Duration.WhileOnBattlefield, new FilterCreaturePermanent("Creatures")))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(FlyingAbility.getInstance(), Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURES))); // Creatures your opponents control lose flying and can't have or gain flying. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CreaturesCantGetOrHaveAbilityEffect(FlyingAbility.getInstance(), Duration.WhileOnBattlefield, filter))); diff --git a/Mage.Sets/src/mage/cards/a/Armageddon.java b/Mage.Sets/src/mage/cards/a/Armageddon.java index 01783d32168..8eda2a39add 100644 --- a/Mage.Sets/src/mage/cards/a/Armageddon.java +++ b/Mage.Sets/src/mage/cards/a/Armageddon.java @@ -31,7 +31,7 @@ import mage.abilities.effects.common.DestroyAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.common.FilterLandPermanent; +import mage.filter.StaticFilters; import java.util.UUID; @@ -46,7 +46,7 @@ public class Armageddon extends CardImpl { // Destroy all lands. - this.getSpellAbility().addEffect(new DestroyAllEffect(new FilterLandPermanent("lands"))); + this.getSpellAbility().addEffect(new DestroyAllEffect(StaticFilters.FILTER_LANDS)); } public Armageddon(final Armageddon card) { diff --git a/Mage.Sets/src/mage/cards/b/BakuAltar.java b/Mage.Sets/src/mage/cards/b/BakuAltar.java index 092b1ca7c83..68b7a644dcd 100644 --- a/Mage.Sets/src/mage/cards/b/BakuAltar.java +++ b/Mage.Sets/src/mage/cards/b/BakuAltar.java @@ -40,7 +40,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; import mage.counters.CounterType; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.filter.StaticFilters; import mage.game.permanent.token.SpiritToken; import java.util.UUID; @@ -51,12 +51,10 @@ import java.util.UUID; */ public class BakuAltar extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); - public BakuAltar(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{2}"); // Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Baku Altar. - this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance(1)), filter, true)); + this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance(1)), StaticFilters.SPIRIT_OR_ARCANE_CARD, true)); // {2}, {tap}, Remove a ki counter from Baku Altar: Create a 1/1 colorless Spirit creature token. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new SpiritToken(), 1), new GenericManaCost(2)); ability.addCost(new TapSourceCost()); diff --git a/Mage.Sets/src/mage/cards/b/BattlefieldThaumaturge.java b/Mage.Sets/src/mage/cards/b/BattlefieldThaumaturge.java index a635efd686f..34db5229735 100644 --- a/Mage.Sets/src/mage/cards/b/BattlefieldThaumaturge.java +++ b/Mage.Sets/src/mage/cards/b/BattlefieldThaumaturge.java @@ -38,9 +38,7 @@ import mage.abilities.keyword.HexproofAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; -import mage.filter.FilterSpell; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.stack.Spell; @@ -83,11 +81,6 @@ public class BattlefieldThaumaturge extends CardImpl { class BattlefieldThaumaturgeSpellsCostReductionEffect extends CostModificationEffectImpl { - private static final FilterSpell filter = new FilterSpell("instant and sorcery spell"); - - static { - filter.add(Predicates.or(new CardTypePredicate(CardType.INSTANT), new CardTypePredicate(CardType.SORCERY))); - } public BattlefieldThaumaturgeSpellsCostReductionEffect() { super(Duration.WhileOnBattlefield, Outcome.Benefit, CostModificationType.REDUCE_COST); @@ -118,7 +111,7 @@ class BattlefieldThaumaturgeSpellsCostReductionEffect extends CostModificationEf if ((abilityToModify instanceof SpellAbility) && abilityToModify.getControllerId().equals(source.getControllerId())) { Spell spell = (Spell) game.getStack().getStackObject(abilityToModify.getId()); - return spell != null && BattlefieldThaumaturgeSpellsCostReductionEffect.filter.match(spell, game); + return spell != null && StaticFilters.FILTER_INSTANT_OR_SORCERY_SPELL.match(spell, game); } return false; } diff --git a/Mage.Sets/src/mage/cards/b/BlademaneBaku.java b/Mage.Sets/src/mage/cards/b/BlademaneBaku.java index a8109dd5adc..c51ccc2fd3f 100644 --- a/Mage.Sets/src/mage/cards/b/BlademaneBaku.java +++ b/Mage.Sets/src/mage/cards/b/BlademaneBaku.java @@ -29,34 +29,32 @@ package mage.cards.b; import mage.MageInt; - import mage.abilities.Ability; - import mage.abilities.common.SimpleActivatedAbility; - import mage.abilities.common.SpellCastControllerTriggeredAbility; - import mage.abilities.costs.Cost; - import mage.abilities.costs.common.RemoveVariableCountersSourceCost; - import mage.abilities.costs.mana.GenericManaCost; - import mage.abilities.effects.OneShotEffect; - import mage.abilities.effects.common.continuous.BoostSourceEffect; - import mage.abilities.effects.common.counter.AddCountersSourceEffect; - import mage.cards.CardImpl; - import mage.cards.CardSetInfo; - import mage.constants.CardType; - import mage.constants.Duration; - import mage.constants.Outcome; - import mage.constants.Zone; - import mage.counters.CounterType; - import mage.filter.common.FilterSpiritOrArcaneCard; - import mage.game.Game; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.costs.Cost; +import mage.abilities.costs.common.RemoveVariableCountersSourceCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.StaticFilters; +import mage.game.Game; - import java.util.UUID; +import java.util.UUID; /** * @author LevelX2 */ public class BlademaneBaku extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); - public BlademaneBaku(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{R}"); this.subtype.add("Spirit"); @@ -65,7 +63,7 @@ public class BlademaneBaku extends CardImpl { this.toughness = new MageInt(1); // Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Skullmane Baku. - this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), filter, true)); + this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), StaticFilters.SPIRIT_OR_ARCANE_CARD, true)); // {1}, Remove X ki counters from Blademane Baku: For each counter removed, Blademane Baku gets +2/+0 until end of turn. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BlademaneBakuBoostEffect(), new GenericManaCost(1)); diff --git a/Mage.Sets/src/mage/cards/b/BlanketOfNight.java b/Mage.Sets/src/mage/cards/b/BlanketOfNight.java index 3daf758aab0..8532cec6a8b 100644 --- a/Mage.Sets/src/mage/cards/b/BlanketOfNight.java +++ b/Mage.Sets/src/mage/cards/b/BlanketOfNight.java @@ -38,6 +38,7 @@ import mage.constants.CardType; import mage.constants.DependencyType; import mage.constants.Duration; import mage.constants.Zone; +import mage.filter.StaticFilters; import mage.filter.common.FilterLandPermanent; import java.util.UUID; @@ -55,7 +56,7 @@ public class BlanketOfNight extends CardImpl { // Each land is a Swamp in addition to its other land types. Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAllEffect(new BlackManaAbility(), Duration.WhileOnBattlefield, new FilterLandPermanent(), "Each land is a Swamp in addition to its other land types")); - ability.addEffect(new AddCardSubtypeAllEffect(new FilterLandPermanent(), "Swamp", DependencyType.BecomeSwamp)); + ability.addEffect(new AddCardSubtypeAllEffect(StaticFilters.FILTER_LAND, "Swamp", DependencyType.BecomeSwamp)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/b/BlistercoilWeird.java b/Mage.Sets/src/mage/cards/b/BlistercoilWeird.java index 93ec6c1ad16..782100a79e5 100644 --- a/Mage.Sets/src/mage/cards/b/BlistercoilWeird.java +++ b/Mage.Sets/src/mage/cards/b/BlistercoilWeird.java @@ -36,9 +36,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.filter.FilterSpell; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.StaticFilters; import java.util.UUID; @@ -47,14 +45,6 @@ import java.util.UUID; */ public class BlistercoilWeird extends CardImpl { - private static final FilterSpell filter = new FilterSpell("instant or sorcery spell"); - - static { - filter.add(Predicates.or( - new CardTypePredicate(CardType.INSTANT), - new CardTypePredicate(CardType.SORCERY))); - } - public BlistercoilWeird(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{U/R}"); this.subtype.add("Weird"); @@ -65,7 +55,7 @@ public class BlistercoilWeird extends CardImpl { this.toughness = new MageInt(1); // Whenever you cast an instant or sorcery spell, Blistercoil Weird gets +1/+1 until end of turn. Untap it. - Ability ability = new SpellCastControllerTriggeredAbility(new BoostSourceEffect(1, 1, Duration.EndOfTurn), filter, false); + Ability ability = new SpellCastControllerTriggeredAbility(new BoostSourceEffect(1, 1, Duration.EndOfTurn), StaticFilters.FILTER_INSTANT_OR_SORCERY_SPELL, false); ability.addEffect(new UntapSourceEffect()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/b/BoomBust.java b/Mage.Sets/src/mage/cards/b/BoomBust.java index 7edf763ed8d..01272520d1e 100644 --- a/Mage.Sets/src/mage/cards/b/BoomBust.java +++ b/Mage.Sets/src/mage/cards/b/BoomBust.java @@ -27,7 +27,6 @@ */ package mage.cards.b; -import java.util.UUID; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DestroyAllEffect; import mage.abilities.effects.common.DestroyTargetEffect; @@ -36,10 +35,13 @@ import mage.cards.SplitCard; import mage.constants.CardType; import mage.constants.SpellAbilityType; import mage.constants.TargetController; +import mage.filter.StaticFilters; import mage.filter.common.FilterLandPermanent; import mage.filter.predicate.permanent.ControllerPredicate; import mage.target.TargetPermanent; +import java.util.UUID; + public class BoomBust extends SplitCard { private static final FilterLandPermanent filter1 = new FilterLandPermanent("land you control"); @@ -63,7 +65,7 @@ public class BoomBust extends SplitCard { // Bust // Destroy all lands. - getRightHalfCard().getSpellAbility().addEffect(new DestroyAllEffect(new FilterLandPermanent())); + getRightHalfCard().getSpellAbility().addEffect(new DestroyAllEffect(StaticFilters.FILTER_LANDS)); } diff --git a/Mage.Sets/src/mage/cards/b/BounteousKirin.java b/Mage.Sets/src/mage/cards/b/BounteousKirin.java index 139f2eb5bc5..9ce2b884d8d 100644 --- a/Mage.Sets/src/mage/cards/b/BounteousKirin.java +++ b/Mage.Sets/src/mage/cards/b/BounteousKirin.java @@ -38,7 +38,7 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SuperType; import mage.constants.Zone; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.stack.Spell; import mage.players.Player; @@ -63,7 +63,7 @@ public class BounteousKirin extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); // Whenever you cast a Spirit or Arcane spell, you may gain life equal to that spell's converted mana cost. - this.addAbility(new SpellCastControllerTriggeredAbility(Zone.BATTLEFIELD, new BounteousKirinEffect(), new FilterSpiritOrArcaneCard(), true, true)); + this.addAbility(new SpellCastControllerTriggeredAbility(Zone.BATTLEFIELD, new BounteousKirinEffect(), StaticFilters.SPIRIT_OR_ARCANE_CARD, true, true)); } public BounteousKirin(final BounteousKirin card) { diff --git a/Mage.Sets/src/mage/cards/b/BriarknitKami.java b/Mage.Sets/src/mage/cards/b/BriarknitKami.java index f896586d8e6..a9b09ac31fc 100644 --- a/Mage.Sets/src/mage/cards/b/BriarknitKami.java +++ b/Mage.Sets/src/mage/cards/b/BriarknitKami.java @@ -35,7 +35,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.counters.CounterType; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.filter.StaticFilters; import mage.target.common.TargetCreaturePermanent; import java.util.UUID; @@ -46,8 +46,6 @@ import java.util.UUID; */ public class BriarknitKami extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); - public BriarknitKami(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{G}{G}"); this.subtype.add("Spirit"); @@ -55,7 +53,7 @@ public class BriarknitKami extends CardImpl { this.power = new MageInt(3); this.toughness = new MageInt(3); // Whenever you cast a Spirit or Arcane spell, put a +1/+1 counter on target creature. - Ability ability = new SpellCastControllerTriggeredAbility(new AddCountersTargetEffect(CounterType.P1P1.createInstance()), filter, false); + Ability ability = new SpellCastControllerTriggeredAbility(new AddCountersTargetEffect(CounterType.P1P1.createInstance()), StaticFilters.SPIRIT_OR_ARCANE_CARD, false); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/b/BudokaPupil.java b/Mage.Sets/src/mage/cards/b/BudokaPupil.java index b4ac3495ec6..306212797ff 100644 --- a/Mage.Sets/src/mage/cards/b/BudokaPupil.java +++ b/Mage.Sets/src/mage/cards/b/BudokaPupil.java @@ -46,7 +46,7 @@ import mage.constants.Duration; import mage.constants.SuperType; import mage.constants.Zone; import mage.counters.CounterType; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.filter.StaticFilters; import mage.game.events.GameEvent; import mage.game.permanent.token.Token; import mage.target.common.TargetCreaturePermanent; @@ -59,8 +59,6 @@ import java.util.UUID; */ public class BudokaPupil extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); - public BudokaPupil(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{G}{G}"); this.subtype.add("Human"); @@ -72,7 +70,7 @@ public class BudokaPupil extends CardImpl { this.flipCardName = "Ichiga, Who Topples Oaks"; // Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Budoka Pupil. - this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), filter, true)); + this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), StaticFilters.SPIRIT_OR_ARCANE_CARD, true)); // At the beginning of the end step, if there are two or more ki counters on Budoka Pupil, you may flip it. this.addAbility(new ConditionalTriggeredAbility( diff --git a/Mage.Sets/src/mage/cards/b/BurningSands.java b/Mage.Sets/src/mage/cards/b/BurningSands.java index a6bec6f2c9c..f001bcfe42e 100644 --- a/Mage.Sets/src/mage/cards/b/BurningSands.java +++ b/Mage.Sets/src/mage/cards/b/BurningSands.java @@ -34,7 +34,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; -import mage.filter.common.FilterLandPermanent; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.targetpointer.FixedTarget; @@ -48,13 +48,12 @@ import java.util.UUID; public class BurningSands extends CardImpl { private final UUID originalId; - private static final FilterLandPermanent filter = new FilterLandPermanent(); public BurningSands(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{3}{R}{R}"); // Whenever a creature dies, that creature's controller sacrifices a land. - Ability ability = new DiesCreatureTriggeredAbility(new SacrificeEffect(filter, 1, "that creature's controller"), false, false, true); + Ability ability = new DiesCreatureTriggeredAbility(new SacrificeEffect(StaticFilters.FILTER_LAND, 1, "that creature's controller"), false, false, true); originalId = ability.getOriginalId(); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/c/CallowJushi.java b/Mage.Sets/src/mage/cards/c/CallowJushi.java index 82cb731d50e..994a07c474e 100644 --- a/Mage.Sets/src/mage/cards/c/CallowJushi.java +++ b/Mage.Sets/src/mage/cards/c/CallowJushi.java @@ -45,7 +45,7 @@ import mage.constants.CardType; import mage.constants.SuperType; import mage.constants.Zone; import mage.counters.CounterType; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.filter.StaticFilters; import mage.game.events.GameEvent; import mage.game.permanent.token.Token; import mage.target.TargetSpell; @@ -58,8 +58,6 @@ import java.util.UUID; */ public class CallowJushi extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); - public CallowJushi(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}{U}"); this.subtype.add("Human"); @@ -71,7 +69,7 @@ public class CallowJushi extends CardImpl { this.flipCardName = "Jaraku the Interloper"; // Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Callow Jushi. - this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), filter, true)); + this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), StaticFilters.SPIRIT_OR_ARCANE_CARD, true)); // At the beginning of the end step, if there are two or more ki counters on Callow Jushi, you may flip it. this.addAbility(new ConditionalTriggeredAbility( diff --git a/Mage.Sets/src/mage/cards/c/CelestialKirin.java b/Mage.Sets/src/mage/cards/c/CelestialKirin.java index bf9f3e3a3e0..59dede50ac8 100644 --- a/Mage.Sets/src/mage/cards/c/CelestialKirin.java +++ b/Mage.Sets/src/mage/cards/c/CelestialKirin.java @@ -29,19 +29,15 @@ package mage.cards.c; import mage.MageInt; import mage.abilities.Ability; -import mage.constants.ComparisonType; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DestroyAllEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.SuperType; -import mage.constants.Zone; +import mage.constants.*; import mage.filter.FilterPermanent; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.filter.StaticFilters; import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; import mage.game.Game; import mage.game.stack.Spell; @@ -66,7 +62,7 @@ public class CelestialKirin extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); // Whenever you cast a Spirit or Arcane spell, destroy all permanents with that spell's converted mana cost. - this.addAbility(new SpellCastControllerTriggeredAbility(Zone.BATTLEFIELD, new CelestialKirinEffect(), new FilterSpiritOrArcaneCard(), false, true)); + this.addAbility(new SpellCastControllerTriggeredAbility(Zone.BATTLEFIELD, new CelestialKirinEffect(), StaticFilters.SPIRIT_OR_ARCANE_CARD, false, true)); } public CelestialKirin(final CelestialKirin card) { diff --git a/Mage.Sets/src/mage/cards/c/CerebralEruption.java b/Mage.Sets/src/mage/cards/c/CerebralEruption.java index 9fc7077e7ae..0d818bb4de4 100644 --- a/Mage.Sets/src/mage/cards/c/CerebralEruption.java +++ b/Mage.Sets/src/mage/cards/c/CerebralEruption.java @@ -34,8 +34,7 @@ import mage.cards.*; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.FilterPermanent; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; @@ -69,7 +68,6 @@ public class CerebralEruption extends CardImpl { class CerebralEruptionEffect extends OneShotEffect { - private static FilterPermanent filter = new FilterCreaturePermanent(); CerebralEruptionEffect() { super(Outcome.Damage); @@ -91,7 +89,7 @@ class CerebralEruptionEffect extends OneShotEffect { game.getState().setValue(source.getSourceId().toString(), card); int damage = card.getConvertedManaCost(); player.damage(damage, source.getSourceId(), game, false, true); - for (Permanent perm : game.getBattlefield().getAllActivePermanents(filter, player.getId(), game)) { + for (Permanent perm : game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURES, player.getId(), game)) { perm.damage(damage, source.getSourceId(), game, false, true); } if (card.isLand()) { diff --git a/Mage.Sets/src/mage/cards/c/ChancellorOfTheAnnex.java b/Mage.Sets/src/mage/cards/c/ChancellorOfTheAnnex.java index e8706998b94..4b08d66a0c9 100644 --- a/Mage.Sets/src/mage/cards/c/ChancellorOfTheAnnex.java +++ b/Mage.Sets/src/mage/cards/c/ChancellorOfTheAnnex.java @@ -42,7 +42,7 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SetTargetPointer; import mage.constants.Zone; -import mage.filter.FilterSpell; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; @@ -69,7 +69,7 @@ public class ChancellorOfTheAnnex extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Whenever an opponent casts a spell, counter it unless that player pays {1}. - this.addAbility(new SpellCastOpponentTriggeredAbility(Zone.BATTLEFIELD, new CounterUnlessPaysEffect(new GenericManaCost(1)), new FilterSpell(), false, SetTargetPointer.SPELL)); + this.addAbility(new SpellCastOpponentTriggeredAbility(Zone.BATTLEFIELD, new CounterUnlessPaysEffect(new GenericManaCost(1)), StaticFilters.FILTER_SPELL, false, SetTargetPointer.SPELL)); } public ChancellorOfTheAnnex(final ChancellorOfTheAnnex card) { diff --git a/Mage.Sets/src/mage/cards/c/ChandraFlamecaller.java b/Mage.Sets/src/mage/cards/c/ChandraFlamecaller.java index 9178df62046..46bd32bcd22 100644 --- a/Mage.Sets/src/mage/cards/c/ChandraFlamecaller.java +++ b/Mage.Sets/src/mage/cards/c/ChandraFlamecaller.java @@ -42,7 +42,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.token.ElementalToken; import mage.players.Player; @@ -69,7 +69,7 @@ public class ChandraFlamecaller extends CardImpl { this.addAbility(new LoyaltyAbility(new ChandraDrawEffect(), 0)); // -X: Chandra, Flamecaller deals X damage to each creature. - this.addAbility(new LoyaltyAbility(new DamageAllEffect(ChandraXValue.getDefault(), new FilterCreaturePermanent("creature")))); + this.addAbility(new LoyaltyAbility(new DamageAllEffect(ChandraXValue.getDefault(), StaticFilters.FILTER_PERMANENT_CREATURE))); } public ChandraFlamecaller(final ChandraFlamecaller card) { diff --git a/Mage.Sets/src/mage/cards/c/ChromaticLantern.java b/Mage.Sets/src/mage/cards/c/ChromaticLantern.java index d1d4965a3dd..0cfd3398974 100644 --- a/Mage.Sets/src/mage/cards/c/ChromaticLantern.java +++ b/Mage.Sets/src/mage/cards/c/ChromaticLantern.java @@ -35,7 +35,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Zone; -import mage.filter.common.FilterLandPermanent; +import mage.filter.StaticFilters; import java.util.UUID; @@ -48,7 +48,7 @@ public class ChromaticLantern extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}"); // Lands you control have "{T}: Add one mana of any color to your mana pool." - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(new AnyColorManaAbility(), Duration.WhileOnBattlefield, new FilterLandPermanent("Lands"), false))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(new AnyColorManaAbility(), Duration.WhileOnBattlefield, StaticFilters.FILTER_LANDS, false))); // {T}: Add one mana of any color to your mana pool. this.addAbility(new AnyColorManaAbility()); diff --git a/Mage.Sets/src/mage/cards/c/ChronomanticEscape.java b/Mage.Sets/src/mage/cards/c/ChronomanticEscape.java index f25a04ed6cf..93b69af5b8f 100644 --- a/Mage.Sets/src/mage/cards/c/ChronomanticEscape.java +++ b/Mage.Sets/src/mage/cards/c/ChronomanticEscape.java @@ -39,7 +39,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.counters.CounterType; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import java.util.UUID; @@ -49,13 +49,12 @@ import java.util.UUID; */ public class ChronomanticEscape extends CardImpl { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures"); public ChronomanticEscape(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{W}{W}"); // Until your next turn, creatures can't attack you. Exile Chronomantic Escape with three time counters on it. - getSpellAbility().addEffect(new CantAttackYouAllEffect(Duration.UntilYourNextTurn, filter)); + getSpellAbility().addEffect(new CantAttackYouAllEffect(Duration.UntilYourNextTurn, StaticFilters.FILTER_PERMANENT_CREATURES)); getSpellAbility().addEffect(ExileSpellEffect.getInstance()); Effect effect = new AddCountersSourceEffect(CounterType.TIME.createInstance(), new StaticValue(3), true, true); effect.setText("with 3 time counters on it"); diff --git a/Mage.Sets/src/mage/cards/c/CloudhoofKirin.java b/Mage.Sets/src/mage/cards/c/CloudhoofKirin.java index 2018196354c..42a5277890e 100644 --- a/Mage.Sets/src/mage/cards/c/CloudhoofKirin.java +++ b/Mage.Sets/src/mage/cards/c/CloudhoofKirin.java @@ -38,7 +38,7 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SuperType; import mage.constants.Zone; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.stack.Spell; import mage.players.Player; @@ -65,7 +65,7 @@ public class CloudhoofKirin extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); // Whenever you cast a Spirit or Arcane spell, you may have target player put the top X cards of his or her library into his or her graveyard, where X is that spell's converted mana cost. - Ability ability = new SpellCastControllerTriggeredAbility(Zone.BATTLEFIELD, new CloudhoofKirinEffect(), new FilterSpiritOrArcaneCard(), true, true); + Ability ability = new SpellCastControllerTriggeredAbility(Zone.BATTLEFIELD, new CloudhoofKirinEffect(), StaticFilters.SPIRIT_OR_ARCANE_CARD, true, true); ability.addTarget(new TargetPlayer()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/c/CoatOfArms.java b/Mage.Sets/src/mage/cards/c/CoatOfArms.java index fea7421fcee..57a7930a2ca 100644 --- a/Mage.Sets/src/mage/cards/c/CoatOfArms.java +++ b/Mage.Sets/src/mage/cards/c/CoatOfArms.java @@ -34,7 +34,7 @@ import mage.abilities.keyword.ChangelingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.util.CardUtil; @@ -67,9 +67,7 @@ public class CoatOfArms extends CardImpl { class CoatOfArmsEffect extends ContinuousEffectImpl { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(); - - public CoatOfArmsEffect() { + public CoatOfArmsEffect() { super(Duration.WhileOnBattlefield, Layer.PTChangingEffects_7, SubLayer.ModifyPT_7c, Outcome.BoostCreature); this.staticText = "Each creature gets +1/+1 for each other creature on the battlefield that shares at least one creature type with it"; } @@ -85,7 +83,7 @@ class CoatOfArmsEffect extends ContinuousEffectImpl { @Override public boolean apply(Game game, Ability source) { - List permanents = game.getBattlefield().getActivePermanents(filter, source.getControllerId(), game); + List permanents = game.getBattlefield().getActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURE, source.getControllerId(), game); for (Permanent permanent : permanents) { int amount = getAmount(permanents, permanent, game); permanent.addPower(amount); diff --git a/Mage.Sets/src/mage/cards/c/ConcealedCourtyard.java b/Mage.Sets/src/mage/cards/c/ConcealedCourtyard.java index 5a43f451a4c..2fa58106b70 100644 --- a/Mage.Sets/src/mage/cards/c/ConcealedCourtyard.java +++ b/Mage.Sets/src/mage/cards/c/ConcealedCourtyard.java @@ -27,7 +27,6 @@ */ package mage.cards.c; -import mage.constants.ComparisonType; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.condition.Condition; import mage.abilities.condition.InvertCondition; @@ -39,7 +38,8 @@ import mage.abilities.mana.WhiteManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.common.FilterLandPermanent; +import mage.constants.ComparisonType; +import mage.filter.StaticFilters; import java.util.UUID; @@ -53,7 +53,7 @@ public class ConcealedCourtyard extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.LAND},""); // Concealed Courtyard enters the battlefield tapped unless you control two or fewer other lands. - Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(new FilterLandPermanent(), ComparisonType.FEWER_THAN, 3)); + Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(StaticFilters.FILTER_LANDS, ComparisonType.FEWER_THAN, 3)); String abilityText = "tapped unless you control fewer than 3 lands"; this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText)); diff --git a/Mage.Sets/src/mage/cards/c/ConcordantCrossroads.java b/Mage.Sets/src/mage/cards/c/ConcordantCrossroads.java index 0dd6f6275f2..f8435932456 100644 --- a/Mage.Sets/src/mage/cards/c/ConcordantCrossroads.java +++ b/Mage.Sets/src/mage/cards/c/ConcordantCrossroads.java @@ -36,7 +36,7 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SuperType; import mage.constants.Zone; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import java.util.UUID; @@ -52,7 +52,7 @@ public class ConcordantCrossroads extends CardImpl { // All creatures have haste. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, - new GainAbilityAllEffect(HasteAbility.getInstance(), Duration.WhileOnBattlefield, new FilterCreaturePermanent("Creatures")))); + new GainAbilityAllEffect(HasteAbility.getInstance(), Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURES))); } public ConcordantCrossroads(final ConcordantCrossroads card) { diff --git a/Mage.Sets/src/mage/cards/c/CopperlineGorge.java b/Mage.Sets/src/mage/cards/c/CopperlineGorge.java index e8009154d02..35bce7dc386 100644 --- a/Mage.Sets/src/mage/cards/c/CopperlineGorge.java +++ b/Mage.Sets/src/mage/cards/c/CopperlineGorge.java @@ -27,7 +27,6 @@ */ package mage.cards.c; -import mage.constants.ComparisonType; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.condition.Condition; import mage.abilities.condition.InvertCondition; @@ -39,7 +38,8 @@ import mage.abilities.mana.RedManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.common.FilterLandPermanent; +import mage.constants.ComparisonType; +import mage.filter.StaticFilters; import java.util.UUID; @@ -48,14 +48,11 @@ import java.util.UUID; * @author maurer.it_at_gmail.com */ public class CopperlineGorge extends CardImpl { - - private static FilterLandPermanent filter = new FilterLandPermanent(); - public CopperlineGorge(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.LAND},null); // Copperline Gorge enters the battlefield tapped unless you control two or fewer other lands. - Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.FEWER_THAN, 3)); + Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(StaticFilters.FILTER_LANDS, ComparisonType.FEWER_THAN, 3)); String abilityText = "tapped unless you control two or fewer other lands"; this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText)); this.addAbility(new RedManaAbility()); diff --git a/Mage.Sets/src/mage/cards/c/Counterbalance.java b/Mage.Sets/src/mage/cards/c/Counterbalance.java index 7149248f742..9fb3fc60a8c 100644 --- a/Mage.Sets/src/mage/cards/c/Counterbalance.java +++ b/Mage.Sets/src/mage/cards/c/Counterbalance.java @@ -38,12 +38,11 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SetTargetPointer; import mage.constants.Zone; -import mage.filter.FilterSpell; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.stack.Spell; import mage.players.Player; -import mage.util.CardUtil; import java.util.UUID; @@ -58,7 +57,7 @@ public class Counterbalance extends CardImpl { // Whenever an opponent casts a spell, you may reveal the top card of your library. If you do, counter that spell if it has the same converted mana cost as the revealed card. - this.addAbility(new SpellCastOpponentTriggeredAbility(Zone.BATTLEFIELD, new CounterbalanceEffect(), new FilterSpell(), true, SetTargetPointer.SPELL)); + this.addAbility(new SpellCastOpponentTriggeredAbility(Zone.BATTLEFIELD, new CounterbalanceEffect(), StaticFilters.FILTER_SPELL, true, SetTargetPointer.SPELL)); } public Counterbalance(final Counterbalance card) { diff --git a/Mage.Sets/src/mage/cards/c/Countermand.java b/Mage.Sets/src/mage/cards/c/Countermand.java index c87687b8ed2..1a239cfa7d7 100644 --- a/Mage.Sets/src/mage/cards/c/Countermand.java +++ b/Mage.Sets/src/mage/cards/c/Countermand.java @@ -34,7 +34,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.FilterSpell; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.stack.StackObject; import mage.players.Player; @@ -53,7 +53,7 @@ public class Countermand extends CardImpl { // Counter target spell. Its controller puts the top four cards of his or her library into his or her graveyard. - this.getSpellAbility().addTarget(new TargetSpell(new FilterSpell())); + this.getSpellAbility().addTarget(new TargetSpell(StaticFilters.FILTER_SPELL)); this.getSpellAbility().addEffect(new CountermandEffect()); } diff --git a/Mage.Sets/src/mage/cards/c/CrovaxTheCursed.java b/Mage.Sets/src/mage/cards/c/CrovaxTheCursed.java index fdb92e9d777..ef709a0b52c 100644 --- a/Mage.Sets/src/mage/cards/c/CrovaxTheCursed.java +++ b/Mage.Sets/src/mage/cards/c/CrovaxTheCursed.java @@ -42,7 +42,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; import mage.counters.CounterType; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; @@ -105,9 +105,9 @@ class CrovaxTheCursedEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { Permanent sourceObject = (Permanent) source.getSourceObjectIfItStillExists(game); - int creatures = game.getBattlefield().countAll(new FilterCreaturePermanent(), source.getControllerId(), game); + int creatures = game.getBattlefield().countAll(StaticFilters.FILTER_PERMANENT_CREATURES, source.getControllerId(), game); if (creatures > 0 && controller.chooseUse(outcome, "Sacrifice a creature?", source, game)) { - if (new SacrificeControllerEffect(new FilterCreaturePermanent(), 1, "").apply(game, source)) { + if (new SacrificeControllerEffect(StaticFilters.FILTER_PERMANENT_CREATURES, 1, "").apply(game, source)) { if (sourceObject != null) { sourceObject.getCounters(game).addCounter(CounterType.P1P1.createInstance()); game.informPlayers(controller.getLogName() + " puts a +1/+1 counter on " + sourceObject.getName()); diff --git a/Mage.Sets/src/mage/cards/c/CryptolithRite.java b/Mage.Sets/src/mage/cards/c/CryptolithRite.java index 616c966a9a9..4a2c3b37795 100644 --- a/Mage.Sets/src/mage/cards/c/CryptolithRite.java +++ b/Mage.Sets/src/mage/cards/c/CryptolithRite.java @@ -35,7 +35,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Zone; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import java.util.UUID; @@ -48,9 +48,9 @@ public class CryptolithRite extends CardImpl { public CryptolithRite(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{G}"); - // Creature you control have "{T}: Add one mana of any color to your mana pool." + // Creatures you control have "{T}: Add one mana of any color to your mana pool." this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect( - new AnyColorManaAbility(), Duration.WhileOnBattlefield, new FilterCreaturePermanent("creature"), false))); + new AnyColorManaAbility(), Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURES, false))); } public CryptolithRite(final CryptolithRite card) { diff --git a/Mage.Sets/src/mage/cards/c/CunningBandit.java b/Mage.Sets/src/mage/cards/c/CunningBandit.java index 404fd319173..0990d3a1de6 100644 --- a/Mage.Sets/src/mage/cards/c/CunningBandit.java +++ b/Mage.Sets/src/mage/cards/c/CunningBandit.java @@ -45,7 +45,7 @@ import mage.constants.Duration; import mage.constants.SuperType; import mage.constants.Zone; import mage.counters.CounterType; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.filter.StaticFilters; import mage.game.events.GameEvent; import mage.game.permanent.token.Token; import mage.target.common.TargetCreaturePermanent; @@ -58,8 +58,6 @@ import java.util.UUID; */ public class CunningBandit extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); - public CunningBandit(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{R}"); this.subtype.add("Human"); @@ -71,7 +69,7 @@ public class CunningBandit extends CardImpl { this.flipCardName = "Azamuki, Treachery Incarnate"; // Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Cunning Bandit. - this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), filter, true)); + this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), StaticFilters.SPIRIT_OR_ARCANE_CARD, true)); // At the beginning of the end step, if there are two or more ki counters on Cunning Bandit, you may flip it. this.addAbility(new ConditionalTriggeredAbility( diff --git a/Mage.Sets/src/mage/cards/c/Cursecatcher.java b/Mage.Sets/src/mage/cards/c/Cursecatcher.java index 78352a704d0..5aebc0c8c2c 100644 --- a/Mage.Sets/src/mage/cards/c/Cursecatcher.java +++ b/Mage.Sets/src/mage/cards/c/Cursecatcher.java @@ -36,9 +36,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; -import mage.filter.FilterSpell; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.StaticFilters; import mage.target.TargetSpell; import java.util.UUID; @@ -49,14 +47,6 @@ import java.util.UUID; */ public class Cursecatcher extends CardImpl { - private static final FilterSpell filter = new FilterSpell("instant or sorcery spell"); - - static { - filter.add(Predicates.or( - new CardTypePredicate(CardType.INSTANT), - new CardTypePredicate(CardType.SORCERY))); - } - public Cursecatcher(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{U}"); this.subtype.add("Merfolk"); @@ -69,7 +59,7 @@ public class Cursecatcher extends CardImpl { SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CounterUnlessPaysEffect(new GenericManaCost(1)), new SacrificeSourceCost()); - ability.addTarget(new TargetSpell(filter)); + ability.addTarget(new TargetSpell(StaticFilters.FILTER_INSTANT_OR_SORCERY_SPELL)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/c/CyclopsOfEternalFury.java b/Mage.Sets/src/mage/cards/c/CyclopsOfEternalFury.java index bd2e338cd2a..e594d30efc8 100644 --- a/Mage.Sets/src/mage/cards/c/CyclopsOfEternalFury.java +++ b/Mage.Sets/src/mage/cards/c/CyclopsOfEternalFury.java @@ -36,7 +36,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Zone; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import java.util.UUID; @@ -46,7 +46,6 @@ import java.util.UUID; */ public class CyclopsOfEternalFury extends CardImpl { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures"); public CyclopsOfEternalFury(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT,CardType.CREATURE},"{4}{R}{R}"); @@ -56,7 +55,7 @@ public class CyclopsOfEternalFury extends CardImpl { this.toughness = new MageInt(3); // Creatures you control have haste. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(HasteAbility.getInstance(), Duration.WhileOnBattlefield, filter))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(HasteAbility.getInstance(), Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURES))); } public CyclopsOfEternalFury(final CyclopsOfEternalFury card) { diff --git a/Mage.Sets/src/mage/cards/d/DacksDuplicate.java b/Mage.Sets/src/mage/cards/d/DacksDuplicate.java index 2ad15c3f0c1..d220c4d3f14 100644 --- a/Mage.Sets/src/mage/cards/d/DacksDuplicate.java +++ b/Mage.Sets/src/mage/cards/d/DacksDuplicate.java @@ -27,7 +27,6 @@ */ package mage.cards.d; -import java.util.UUID; import mage.MageInt; import mage.MageObject; import mage.abilities.Ability; @@ -39,11 +38,13 @@ import mage.abilities.keyword.HasteAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.util.functions.ApplyToPermanent; +import java.util.UUID; + /** * * @author LevelX2 @@ -58,7 +59,7 @@ public class DacksDuplicate extends CardImpl { this.toughness = new MageInt(0); // You may have Dack's Duplicate enter the battlefield as a copy of any creature on the battlefield except it gains haste and dethrone. - Effect effect = new CopyPermanentEffect(new FilterCreaturePermanent(), new DacksDuplicateApplyToPermanent()); + Effect effect = new CopyPermanentEffect(StaticFilters.FILTER_PERMANENT_CREATURE, new DacksDuplicateApplyToPermanent()); effect.setText("as a copy of any creature on the battlefield except it gains haste and dethrone"); this.addAbility(new EntersBattlefieldAbility(effect, true)); } diff --git a/Mage.Sets/src/mage/cards/d/DanceOfShadows.java b/Mage.Sets/src/mage/cards/d/DanceOfShadows.java index 168ff866857..76b13bea8d8 100644 --- a/Mage.Sets/src/mage/cards/d/DanceOfShadows.java +++ b/Mage.Sets/src/mage/cards/d/DanceOfShadows.java @@ -36,7 +36,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import java.util.UUID; @@ -52,10 +52,10 @@ public class DanceOfShadows extends CardImpl { // Creatures you control get +1/+0 and gain fear until end of turn. (They can't be blocked except by artifact creatures and/or black creatures.) - Effect effect = new BoostControlledEffect(1, 0, Duration.EndOfTurn, new FilterCreaturePermanent()); + Effect effect = new BoostControlledEffect(1, 0, Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES); effect.setText("Creatures you control get +1/+0"); this.getSpellAbility().addEffect(effect); - effect = new GainAbilityControlledEffect(FearAbility.getInstance(), Duration.EndOfTurn, new FilterCreaturePermanent()); + effect = new GainAbilityControlledEffect(FearAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES); effect.setText("and gain fear until end of turn"); this.getSpellAbility().addEffect(effect); } diff --git a/Mage.Sets/src/mage/cards/d/DawnfeatherEagle.java b/Mage.Sets/src/mage/cards/d/DawnfeatherEagle.java index ee90bf1fd07..673db710d06 100644 --- a/Mage.Sets/src/mage/cards/d/DawnfeatherEagle.java +++ b/Mage.Sets/src/mage/cards/d/DawnfeatherEagle.java @@ -39,7 +39,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import java.util.UUID; @@ -63,7 +63,7 @@ public class DawnfeatherEagle extends CardImpl { Effect effect = new BoostControlledEffect(1, 1, Duration.EndOfTurn); effect.setText("creatures you control get +1/+1"); Ability ability = new EntersBattlefieldTriggeredAbility(effect, false); - effect = new GainAbilityControlledEffect(VigilanceAbility.getInstance(), Duration.EndOfTurn, new FilterCreaturePermanent()); + effect = new GainAbilityControlledEffect(VigilanceAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES); effect.setText("and gain vigilance until end of turn"); ability.addEffect(effect); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/d/DeadlyWanderings.java b/Mage.Sets/src/mage/cards/d/DeadlyWanderings.java index d73d92db05f..cafae8dd4dc 100644 --- a/Mage.Sets/src/mage/cards/d/DeadlyWanderings.java +++ b/Mage.Sets/src/mage/cards/d/DeadlyWanderings.java @@ -43,29 +43,28 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.TargetController; import mage.constants.Zone; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import java.util.UUID; /** - * * @author LevelX2 */ public class DeadlyWanderings extends CardImpl { public DeadlyWanderings(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{3}{B}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}{B}"); // As long as you control exactly one creature, that creature gets +2/+0 and has deathtouch and lifelink. ContinuousEffect boostEffect = new BoostControlledEffect(2, 0, Duration.WhileOnBattlefield); Effect effect = new ConditionalContinuousEffect(boostEffect, new CreatureCountCondition(1, TargetController.YOU), "As long as you control exactly one creature, that creature gets +2/+0"); Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, effect); - ContinuousEffect deathtouchEffect = new GainAbilityControlledEffect(DeathtouchAbility.getInstance(), Duration.WhileOnBattlefield, new FilterCreaturePermanent()); + ContinuousEffect deathtouchEffect = new GainAbilityControlledEffect(DeathtouchAbility.getInstance(), Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURE); effect = new ConditionalContinuousEffect(deathtouchEffect, new CreatureCountCondition(1, TargetController.YOU), "and has deathtouch"); ability.addEffect(effect); - ContinuousEffect lifelinkEffect = new GainAbilityControlledEffect(LifelinkAbility.getInstance(), Duration.WhileOnBattlefield, new FilterCreaturePermanent()); + ContinuousEffect lifelinkEffect = new GainAbilityControlledEffect(LifelinkAbility.getInstance(), Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURE); effect = new ConditionalContinuousEffect(lifelinkEffect, new CreatureCountCondition(1, TargetController.YOU), "and lifelink"); ability.addEffect(effect); diff --git a/Mage.Sets/src/mage/cards/d/DeathFrenzy.java b/Mage.Sets/src/mage/cards/d/DeathFrenzy.java index c36b22c094c..d448b83144e 100644 --- a/Mage.Sets/src/mage/cards/d/DeathFrenzy.java +++ b/Mage.Sets/src/mage/cards/d/DeathFrenzy.java @@ -35,6 +35,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; +import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.events.GameEvent; @@ -69,7 +70,6 @@ public class DeathFrenzy extends CardImpl { class DeathFrenzyDelayedTriggeredAbility extends DelayedTriggeredAbility { - protected FilterCreaturePermanent filter = new FilterCreaturePermanent(); public DeathFrenzyDelayedTriggeredAbility() { super(new GainLifeEffect(1), Duration.EndOfTurn, false); @@ -87,7 +87,7 @@ class DeathFrenzyDelayedTriggeredAbility extends DelayedTriggeredAbility { @Override public boolean checkTrigger(GameEvent event, Game game) { ZoneChangeEvent zEvent = (ZoneChangeEvent) event; - if (zEvent.isDiesEvent() && zEvent.getTarget() != null && filter.match(zEvent.getTarget(), sourceId, controllerId, game)) { + if (zEvent.isDiesEvent() && zEvent.getTarget() != null && StaticFilters.FILTER_PERMANENT_CREATURES.match(zEvent.getTarget(), sourceId, controllerId, game)) { return true; } return false; diff --git a/Mage.Sets/src/mage/cards/d/DeclarationInStone.java b/Mage.Sets/src/mage/cards/d/DeclarationInStone.java index 0270f549c31..748e7b15eca 100644 --- a/Mage.Sets/src/mage/cards/d/DeclarationInStone.java +++ b/Mage.Sets/src/mage/cards/d/DeclarationInStone.java @@ -36,7 +36,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.PermanentToken; @@ -103,7 +103,7 @@ class DeclarationInStoneEffect extends OneShotEffect { && !(targetPermanent instanceof PermanentToken)) { nonTokenCount++; } - for (Permanent permanent : game.getBattlefield().getAllActivePermanents(new FilterCreaturePermanent(), targetPermanent.getControllerId(), game)) { + for (Permanent permanent : game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURES, targetPermanent.getControllerId(), game)) { if (!permanent.getId().equals(targetPermanent.getId()) && permanent.getName().equals(targetPermanent.getName())) { cardsToExile.add(permanent); diff --git a/Mage.Sets/src/mage/cards/d/DecreeOfAnnihilation.java b/Mage.Sets/src/mage/cards/d/DecreeOfAnnihilation.java index 8d2998961b1..b4df27f0344 100644 --- a/Mage.Sets/src/mage/cards/d/DecreeOfAnnihilation.java +++ b/Mage.Sets/src/mage/cards/d/DecreeOfAnnihilation.java @@ -28,25 +28,25 @@ package mage.cards.d; import mage.abilities.Ability; - import mage.abilities.common.CycleTriggeredAbility; - import mage.abilities.costs.mana.ManaCostsImpl; - import mage.abilities.effects.OneShotEffect; - import mage.abilities.effects.common.DestroyAllEffect; - import mage.abilities.keyword.CyclingAbility; - import mage.cards.Card; - import mage.cards.CardImpl; - import mage.cards.CardSetInfo; - import mage.constants.CardType; - import mage.constants.Outcome; - import mage.filter.FilterPermanent; - import mage.filter.common.FilterLandPermanent; - import mage.filter.predicate.Predicates; - import mage.filter.predicate.mageobject.CardTypePredicate; - import mage.game.Game; - import mage.game.permanent.Permanent; - import mage.players.Player; +import mage.abilities.common.CycleTriggeredAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DestroyAllEffect; +import mage.abilities.keyword.CyclingAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.filter.FilterPermanent; +import mage.filter.StaticFilters; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; - import java.util.UUID; +import java.util.UUID; /** * @@ -64,7 +64,7 @@ public class DecreeOfAnnihilation extends CardImpl { this.addAbility(new CyclingAbility(new ManaCostsImpl("{5}{R}{R}"))); // When you cycle Decree of Annihilation, destroy all lands. - Ability ability = new CycleTriggeredAbility(new DestroyAllEffect(new FilterLandPermanent("lands")), false); + Ability ability = new CycleTriggeredAbility(new DestroyAllEffect(StaticFilters.FILTER_LANDS), false); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/d/DecreeOfSilence.java b/Mage.Sets/src/mage/cards/d/DecreeOfSilence.java index 15b7c6c5e7b..8c4627e3401 100644 --- a/Mage.Sets/src/mage/cards/d/DecreeOfSilence.java +++ b/Mage.Sets/src/mage/cards/d/DecreeOfSilence.java @@ -44,7 +44,7 @@ import mage.constants.CardType; import mage.constants.SetTargetPointer; import mage.constants.Zone; import mage.counters.CounterType; -import mage.filter.FilterSpell; +import mage.filter.StaticFilters; import mage.target.TargetSpell; import java.util.UUID; @@ -61,7 +61,7 @@ public class DecreeOfSilence extends CardImpl { // Whenever an opponent casts a spell, counter that spell and put a depletion counter on Decree of Silence. If there are three or more depletion counters on Decree of Silence, sacrifice it. Effect effect = new CounterTargetEffect(); effect.setText("counter that spell"); - Ability ability = new SpellCastOpponentTriggeredAbility(Zone.BATTLEFIELD, effect, new FilterSpell(), + Ability ability = new SpellCastOpponentTriggeredAbility(Zone.BATTLEFIELD, effect, StaticFilters.FILTER_SPELL, false, SetTargetPointer.SPELL); effect = new AddCountersSourceEffect(CounterType.DEPLETION.createInstance()); effect.setText("and put a depletion counter on {this}."); diff --git a/Mage.Sets/src/mage/cards/d/Demoralize.java b/Mage.Sets/src/mage/cards/d/Demoralize.java index 427c0df5ea1..bcb184c47d6 100644 --- a/Mage.Sets/src/mage/cards/d/Demoralize.java +++ b/Mage.Sets/src/mage/cards/d/Demoralize.java @@ -37,7 +37,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import java.util.UUID; @@ -53,12 +53,12 @@ public class Demoralize extends CardImpl { // All creatures gain menace until end of turn. (They can't be blocked except by two or more creatures.) - this.getSpellAbility().addEffect(new GainAbilityAllEffect(new MenaceAbility(), Duration.EndOfTurn, new FilterCreaturePermanent())); + this.getSpellAbility().addEffect(new GainAbilityAllEffect(new MenaceAbility(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES)); // Threshold — If seven or more cards are in your graveyard, creatures can't block this turn. this.getSpellAbility().addEffect( new ConditionalOneShotEffect( - new AddContinuousEffectToGame(new CantBlockAllEffect(new FilterCreaturePermanent(), Duration.EndOfTurn)), + new AddContinuousEffectToGame(new CantBlockAllEffect(StaticFilters.FILTER_PERMANENT_CREATURES, Duration.EndOfTurn)), new CardsInControllerGraveCondition(7), "

Threshold - If seven or more cards are in your graveyard, creatures can't block this turn" )); diff --git a/Mage.Sets/src/mage/cards/d/DenseFoliage.java b/Mage.Sets/src/mage/cards/d/DenseFoliage.java index 71c2da4201e..fc7a30d91f3 100644 --- a/Mage.Sets/src/mage/cards/d/DenseFoliage.java +++ b/Mage.Sets/src/mage/cards/d/DenseFoliage.java @@ -35,7 +35,7 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Zone; import mage.filter.FilterSpell; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import java.util.UUID; @@ -50,7 +50,7 @@ public class DenseFoliage extends CardImpl { // Creatures can't be the targets of spells. - CantBeTargetedAllEffect cantTargetEffect = new CantBeTargetedAllEffect(new FilterCreaturePermanent("Creatures"), new FilterSpell("spells"), Duration.WhileOnBattlefield); + CantBeTargetedAllEffect cantTargetEffect = new CantBeTargetedAllEffect(StaticFilters.FILTER_PERMANENT_CREATURES, new FilterSpell("spells"), Duration.WhileOnBattlefield); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, cantTargetEffect)); } diff --git a/Mage.Sets/src/mage/cards/d/DescendUponTheSinful.java b/Mage.Sets/src/mage/cards/d/DescendUponTheSinful.java index d3cdec8d40a..4591edafac0 100644 --- a/Mage.Sets/src/mage/cards/d/DescendUponTheSinful.java +++ b/Mage.Sets/src/mage/cards/d/DescendUponTheSinful.java @@ -35,7 +35,7 @@ import mage.abilities.effects.common.ExileAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import mage.game.permanent.token.AngelToken; import java.util.UUID; @@ -50,7 +50,7 @@ public class DescendUponTheSinful extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{4}{W}{W}"); // Exile all creatures - this.getSpellAbility().addEffect(new ExileAllEffect(new FilterCreaturePermanent())); + this.getSpellAbility().addEffect(new ExileAllEffect(StaticFilters.FILTER_PERMANENT_CREATURES)); // Delirium — Create a 4/4 white Angel creature token with flying if there are four or more card types among cards in your graveyard. Effect effect = new ConditionalOneShotEffect(new CreateTokenEffect(new AngelToken()), DeliriumCondition.instance); diff --git a/Mage.Sets/src/mage/cards/d/DesolationAngel.java b/Mage.Sets/src/mage/cards/d/DesolationAngel.java index 6de8b95a9f6..2e8c6307cb4 100644 --- a/Mage.Sets/src/mage/cards/d/DesolationAngel.java +++ b/Mage.Sets/src/mage/cards/d/DesolationAngel.java @@ -38,6 +38,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.TargetController; +import mage.filter.StaticFilters; import mage.filter.common.FilterLandPermanent; import mage.filter.predicate.permanent.ControllerPredicate; @@ -48,7 +49,6 @@ import java.util.UUID; */ public class DesolationAngel extends CardImpl { - private static final FilterLandPermanent filter = new FilterLandPermanent("lands"); private static final FilterLandPermanent filter2 = new FilterLandPermanent("lands you control"); static { @@ -69,7 +69,7 @@ public class DesolationAngel extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // When Desolation Angel enters the battlefield, destroy all lands you control. If it was kicked, destroy all lands instead. - this.addAbility(new EntersBattlefieldTriggeredAbility(new ConditionalOneShotEffect(new DestroyAllEffect(filter), + this.addAbility(new EntersBattlefieldTriggeredAbility(new ConditionalOneShotEffect(new DestroyAllEffect(StaticFilters.FILTER_LANDS), new DestroyAllEffect(filter2), KickedCondition.instance, "destroy all lands you control. If it was kicked, destroy all lands instead."))); } diff --git a/Mage.Sets/src/mage/cards/d/Disrupt.java b/Mage.Sets/src/mage/cards/d/Disrupt.java index 9b571fcfac6..348fc635c3f 100644 --- a/Mage.Sets/src/mage/cards/d/Disrupt.java +++ b/Mage.Sets/src/mage/cards/d/Disrupt.java @@ -33,9 +33,7 @@ import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.FilterSpell; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.StaticFilters; import mage.target.TargetSpell; import java.util.UUID; @@ -47,19 +45,11 @@ import java.util.UUID; */ public class Disrupt extends CardImpl { - private static final FilterSpell filter = new FilterSpell("instant or sorcery spell"); - - static { - filter.add(Predicates.or( - new CardTypePredicate(CardType.INSTANT), - new CardTypePredicate(CardType.SORCERY))); - } - public Disrupt(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{U}"); // Counter target instant or sorcery spell unless its controller pays {1}. - this.getSpellAbility().addTarget(new TargetSpell(filter)); + this.getSpellAbility().addTarget(new TargetSpell(StaticFilters.FILTER_INSTANT_OR_SORCERY_SPELL)); this.getSpellAbility().addEffect(new CounterUnlessPaysEffect(new GenericManaCost(1))); // Draw a card. this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); diff --git a/Mage.Sets/src/mage/cards/d/DivineReckoning.java b/Mage.Sets/src/mage/cards/d/DivineReckoning.java index d33119caa27..bc46ffb68ca 100644 --- a/Mage.Sets/src/mage/cards/d/DivineReckoning.java +++ b/Mage.Sets/src/mage/cards/d/DivineReckoning.java @@ -37,8 +37,8 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.TimingRule; +import mage.filter.StaticFilters; import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; @@ -105,7 +105,7 @@ class DivineReckoningEffect extends OneShotEffect { } } - for (Permanent permanent : game.getBattlefield().getActivePermanents(new FilterCreaturePermanent(), source.getControllerId(), source.getSourceId(), game)) { + for (Permanent permanent : game.getBattlefield().getActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURES, source.getControllerId(), source.getSourceId(), game)) { if (!chosen.contains(permanent)) { permanent.destroy(source.getSourceId(), game, false); } diff --git a/Mage.Sets/src/mage/cards/d/DoOrDie.java b/Mage.Sets/src/mage/cards/d/DoOrDie.java index 933c4051d3c..b694514aa48 100644 --- a/Mage.Sets/src/mage/cards/d/DoOrDie.java +++ b/Mage.Sets/src/mage/cards/d/DoOrDie.java @@ -33,6 +33,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; +import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.permanent.Permanent; @@ -89,7 +90,7 @@ class DoOrDieEffect extends OneShotEffect { Player player = game.getPlayer(source.getControllerId()); Player targetPlayer = game.getPlayer(source.getFirstTarget()); if (player != null && targetPlayer != null) { - int count = game.getBattlefield().countAll(new FilterCreaturePermanent(), targetPlayer.getId(), game); + int count = game.getBattlefield().countAll(StaticFilters.FILTER_PERMANENT_CREATURES, targetPlayer.getId(), game); TargetCreaturePermanent creatures = new TargetCreaturePermanent(0, count, new FilterCreaturePermanent("creatures to put in the first pile"), true); List pile1 = new ArrayList<>(); creatures.setRequired(false); diff --git a/Mage.Sets/src/mage/cards/d/DoorOfDestinies.java b/Mage.Sets/src/mage/cards/d/DoorOfDestinies.java index 46c5aae4333..5fd58b9294d 100644 --- a/Mage.Sets/src/mage/cards/d/DoorOfDestinies.java +++ b/Mage.Sets/src/mage/cards/d/DoorOfDestinies.java @@ -39,7 +39,7 @@ import mage.cards.CardSetInfo; import mage.constants.*; import mage.counters.CounterType; import mage.filter.FilterSpell; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.filter.predicate.permanent.ControllerPredicate; import mage.game.Game; @@ -124,7 +124,6 @@ class AddCounterAbility extends TriggeredAbilityImpl { class BoostCreatureEffectEffect extends ContinuousEffectImpl { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(); public BoostCreatureEffectEffect() { super(Duration.WhileOnBattlefield, Layer.PTChangingEffects_7, SubLayer.ModifyPT_7c, Outcome.BoostCreature); @@ -146,7 +145,7 @@ class BoostCreatureEffectEffect extends ContinuousEffectImpl { if (permanent != null) { String subtype = (String) game.getState().getValue(permanent.getId() + "_type"); if (subtype != null) { - for (Permanent perm : game.getBattlefield().getAllActivePermanents(filter, source.getControllerId(), game)) { + for (Permanent perm : game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURES, source.getControllerId(), game)) { if (perm.hasSubtype(subtype, game)) { int boost = permanent.getCounters(game).getCount(CounterType.CHARGE); perm.addPower(boost); diff --git a/Mage.Sets/src/mage/cards/d/DoranTheSiegeTower.java b/Mage.Sets/src/mage/cards/d/DoranTheSiegeTower.java index cde7ba5a338..c80c64d4f47 100644 --- a/Mage.Sets/src/mage/cards/d/DoranTheSiegeTower.java +++ b/Mage.Sets/src/mage/cards/d/DoranTheSiegeTower.java @@ -34,7 +34,7 @@ import mage.abilities.effects.ContinuousEffectImpl; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import mage.game.Game; import java.util.UUID; @@ -79,7 +79,6 @@ public class DoranTheSiegeTower extends CardImpl { class DoranTheSiegeTowerCombatDamageRuleEffect extends ContinuousEffectImpl { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(); public DoranTheSiegeTowerCombatDamageRuleEffect() { super(Duration.WhileOnBattlefield, Outcome.Detriment); @@ -99,7 +98,7 @@ class DoranTheSiegeTowerCombatDamageRuleEffect extends ContinuousEffectImpl { public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { // Change the rule game.getCombat().setUseToughnessForDamage(true); - game.getCombat().addUseToughnessForDamageFilter(filter); + game.getCombat().addUseToughnessForDamageFilter(StaticFilters.FILTER_PERMANENT_CREATURES); return true; } diff --git a/Mage.Sets/src/mage/cards/d/DoubleNegative.java b/Mage.Sets/src/mage/cards/d/DoubleNegative.java index d31cc9aaa8b..8032e12df6c 100644 --- a/Mage.Sets/src/mage/cards/d/DoubleNegative.java +++ b/Mage.Sets/src/mage/cards/d/DoubleNegative.java @@ -32,7 +32,7 @@ import mage.abilities.effects.common.CounterTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.FilterSpell; +import mage.filter.StaticFilters; import mage.target.TargetSpell; import java.util.UUID; @@ -53,7 +53,7 @@ public class DoubleNegative extends CardImpl { Effect effect = new CounterTargetEffect(); effect.setText("Counter up to two target spells"); this.getSpellAbility().addEffect(effect); - this.getSpellAbility().addTarget(new TargetSpell(0, 2, new FilterSpell())); + this.getSpellAbility().addTarget(new TargetSpell(0, 2, StaticFilters.FILTER_SPELL)); } public DoubleNegative(final DoubleNegative card) { diff --git a/Mage.Sets/src/mage/cards/d/DragonThroneOfTarkir.java b/Mage.Sets/src/mage/cards/d/DragonThroneOfTarkir.java index c1a007eacba..1e7bae3a67f 100644 --- a/Mage.Sets/src/mage/cards/d/DragonThroneOfTarkir.java +++ b/Mage.Sets/src/mage/cards/d/DragonThroneOfTarkir.java @@ -44,7 +44,7 @@ import mage.abilities.keyword.TrampleAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import java.util.UUID; @@ -61,11 +61,11 @@ public class DragonThroneOfTarkir extends CardImpl { // Equipped creature has defender and "{2}, {T}: Other creatures you control gain trample and get +X/+X until end of turn, where X is this creature's power." Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(DefenderAbility.getInstance(), AttachmentType.EQUIPMENT)); - Effect effect = new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.EndOfTurn, new FilterCreaturePermanent(), true); + Effect effect = new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES, true); effect.setText("Other creatures you control gain trample"); Ability gainedAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new GenericManaCost(2)); DynamicValue xValue = new SourcePermanentPowerCount(); - effect = new BoostControlledEffect(xValue, xValue, Duration.EndOfTurn, new FilterCreaturePermanent(), true, true); + effect = new BoostControlledEffect(xValue, xValue, Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURE, true, true); effect.setText("and get +X/+X until end of turn, where X is this creature's power"); gainedAbility.addEffect(effect); gainedAbility.addCost(new TapSourceCost()); diff --git a/Mage.Sets/src/mage/cards/d/Dreamcatcher.java b/Mage.Sets/src/mage/cards/d/Dreamcatcher.java index 933381b2c6b..4287cbf9156 100644 --- a/Mage.Sets/src/mage/cards/d/Dreamcatcher.java +++ b/Mage.Sets/src/mage/cards/d/Dreamcatcher.java @@ -27,7 +27,6 @@ */ package mage.cards.d; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SpellCastControllerTriggeredAbility; @@ -36,7 +35,9 @@ import mage.abilities.effects.common.SacrificeSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.filter.StaticFilters; + +import java.util.UUID; /** * @@ -52,7 +53,7 @@ public class Dreamcatcher extends CardImpl { this.toughness = new MageInt(1); // Whenever you cast a Spirit or Arcane spell, you may sacrifice Dreamcatcher. If you do, draw a card. - Ability ability = new SpellCastControllerTriggeredAbility(new SacrificeSourceEffect(), new FilterSpiritOrArcaneCard(), true, + Ability ability = new SpellCastControllerTriggeredAbility(new SacrificeSourceEffect(), StaticFilters.SPIRIT_OR_ARCANE_CARD, true, "Whenever you cast a Spirit or Arcane spell, you may sacrifice {this}. If you do, draw a card."); ability.addEffect(new DrawCardSourceControllerEffect(1)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/d/DropOfHoney.java b/Mage.Sets/src/mage/cards/d/DropOfHoney.java index ee948d50eba..02c40faf905 100644 --- a/Mage.Sets/src/mage/cards/d/DropOfHoney.java +++ b/Mage.Sets/src/mage/cards/d/DropOfHoney.java @@ -39,6 +39,7 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.TargetController; import mage.constants.Zone; +import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.PowerPredicate; import mage.game.Game; @@ -56,8 +57,6 @@ import java.util.UUID; */ public class DropOfHoney extends CardImpl { - static final FilterCreaturePermanent filter = new FilterCreaturePermanent(); - public DropOfHoney(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{G}"); @@ -101,7 +100,7 @@ class DropOfHoneyEffect extends OneShotEffect { int leastPower = Integer.MAX_VALUE; boolean multipleExist = false; Permanent permanentToDestroy = null; - for (Permanent permanent : game.getBattlefield().getActivePermanents(DropOfHoney.filter, source.getControllerId(), game)) { + for (Permanent permanent : game.getBattlefield().getActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURES, source.getControllerId(), game)) { if (permanent.getPower().getValue() < leastPower) { permanentToDestroy = permanent; leastPower = permanent.getPower().getValue(); @@ -151,7 +150,7 @@ class DropOfHoneyStateTriggeredAbility extends StateTriggeredAbility { @Override public boolean checkTrigger(GameEvent event, Game game) { - return game.getBattlefield().count(DropOfHoney.filter, this.getSourceId(), this.getControllerId(), game) == 0; + return game.getBattlefield().count(StaticFilters.FILTER_PERMANENT_CREATURES, this.getSourceId(), this.getControllerId(), game) == 0; } @Override diff --git a/Mage.Sets/src/mage/cards/d/DualcasterMage.java b/Mage.Sets/src/mage/cards/d/DualcasterMage.java index af01feff424..3d88c72193c 100644 --- a/Mage.Sets/src/mage/cards/d/DualcasterMage.java +++ b/Mage.Sets/src/mage/cards/d/DualcasterMage.java @@ -35,9 +35,7 @@ import mage.abilities.keyword.FlashAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.FilterSpell; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.StaticFilters; import mage.target.TargetSpell; import java.util.UUID; @@ -48,14 +46,6 @@ import java.util.UUID; */ public class DualcasterMage extends CardImpl { - private static final FilterSpell filter = new FilterSpell("instant or sorcery spell"); - - static { - filter.add(Predicates.or( - new CardTypePredicate(CardType.INSTANT), - new CardTypePredicate(CardType.SORCERY))); - } - public DualcasterMage(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{R}{R}"); this.subtype.add("Human"); @@ -69,7 +59,7 @@ public class DualcasterMage extends CardImpl { // When Dualcaster Mage enters the battlefield, copy target instant or sorcery spell. You may choose new targets for the copy. Ability ability = new EntersBattlefieldTriggeredAbility(new CopyTargetSpellEffect(), false); - ability.addTarget(new TargetSpell(filter)); + ability.addTarget(new TargetSpell(StaticFilters.FILTER_INSTANT_OR_SORCERY_SPELL)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/d/Duneblast.java b/Mage.Sets/src/mage/cards/d/Duneblast.java index 9ca45f07809..d89feff668f 100644 --- a/Mage.Sets/src/mage/cards/d/Duneblast.java +++ b/Mage.Sets/src/mage/cards/d/Duneblast.java @@ -33,6 +33,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; +import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.permanent.Permanent; @@ -94,7 +95,7 @@ class DuneblastEffect extends OneShotEffect { if (controller.choose(outcome, target, source.getSourceId(), game)) { creatureToKeep = game.getPermanent(target.getFirstTarget()); } - for(Permanent creature: game.getBattlefield().getActivePermanents(new FilterCreaturePermanent(), source.getControllerId(), source.getSourceId(), game)) { + for(Permanent creature: game.getBattlefield().getActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURES, source.getControllerId(), source.getSourceId(), game)) { if (!Objects.equals(creature, creatureToKeep)) { creature.destroy(source.getSourceId(), game, false); } diff --git a/Mage.Sets/src/mage/cards/d/DwarvenCatapult.java b/Mage.Sets/src/mage/cards/d/DwarvenCatapult.java index 7c19a006303..87daa2a9690 100644 --- a/Mage.Sets/src/mage/cards/d/DwarvenCatapult.java +++ b/Mage.Sets/src/mage/cards/d/DwarvenCatapult.java @@ -34,6 +34,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; +import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.target.common.TargetOpponent; @@ -78,7 +79,7 @@ class DwarvenCatapultEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int howMany = game.getBattlefield().getAllActivePermanents(new FilterCreaturePermanent(), source.getFirstTarget(), game).size(); + int howMany = game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURES, source.getFirstTarget(), game).size(); int amount = source.getManaCostsToPay().getX()/howMany; DamageAllControlledTargetEffect dmgEffect = new DamageAllControlledTargetEffect(amount, new FilterCreaturePermanent()); diff --git a/Mage.Sets/src/mage/cards/e/Earthshaker.java b/Mage.Sets/src/mage/cards/e/Earthshaker.java index b27479facd0..74915e7c37d 100644 --- a/Mage.Sets/src/mage/cards/e/Earthshaker.java +++ b/Mage.Sets/src/mage/cards/e/Earthshaker.java @@ -36,8 +36,8 @@ import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; -import mage.filter.common.FilterSpiritOrArcaneCard; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.AbilityPredicate; @@ -47,12 +47,10 @@ import java.util.UUID; * @author Loki */ public class Earthshaker extends CardImpl { - - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); private static final FilterCreaturePermanent creatureFilter = new FilterCreaturePermanent("creature without flying"); static { - filter.add(Predicates.not(new AbilityPredicate(FlyingAbility.class))); + creatureFilter.add(Predicates.not(new AbilityPredicate(FlyingAbility.class))); } public Earthshaker(UUID ownerId, CardSetInfo setInfo) { @@ -62,7 +60,7 @@ public class Earthshaker extends CardImpl { this.power = new MageInt(4); this.toughness = new MageInt(5); // Whenever you cast a Spirit or Arcane spell, Earthshaker deals 2 damage to each creature without flying. - this.addAbility(new SpellCastControllerTriggeredAbility(new DamageAllEffect(new StaticValue(2) , creatureFilter), filter, false)); + this.addAbility(new SpellCastControllerTriggeredAbility(new DamageAllEffect(new StaticValue(2) , creatureFilter), StaticFilters.SPIRIT_OR_ARCANE_CARD, false)); } public Earthshaker(final Earthshaker card) { diff --git a/Mage.Sets/src/mage/cards/e/EchoMage.java b/Mage.Sets/src/mage/cards/e/EchoMage.java index 1edc7da3ad8..1253ba42847 100644 --- a/Mage.Sets/src/mage/cards/e/EchoMage.java +++ b/Mage.Sets/src/mage/cards/e/EchoMage.java @@ -43,9 +43,7 @@ import mage.cards.LevelerCard; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.FilterSpell; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.stack.Spell; import mage.target.TargetSpell; @@ -58,14 +56,6 @@ import java.util.UUID; */ public class EchoMage extends LevelerCard { - private static final FilterSpell filter = new FilterSpell("instant or sorcery spell"); - - static { - filter.add(Predicates.or( - new CardTypePredicate(CardType.INSTANT), - new CardTypePredicate(CardType.SORCERY))); - } - public EchoMage(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{U}{U}"); this.subtype.add("Human"); @@ -82,7 +72,7 @@ public class EchoMage extends LevelerCard { // {U}{U}, {tap}: Copy target instant or sorcery spell. You may choose new targets for the copy. Abilities abilities1 = new AbilitiesImpl<>(); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CopyTargetSpellEffect(), new ManaCostsImpl("{U}{U}")); - ability.addTarget(new TargetSpell(filter)); + ability.addTarget(new TargetSpell(StaticFilters.FILTER_INSTANT_OR_SORCERY_SPELL)); ability.addCost(new TapSourceCost()); abilities1.add(ability); // LEVEL 4+ @@ -90,7 +80,7 @@ public class EchoMage extends LevelerCard { // {U}{U}, {tap}: Copy target instant or sorcery spell twice. You may choose new targets for the copies. Abilities abilities2 = new AbilitiesImpl<>(); ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new EchoMageEffect(), new ManaCostsImpl("{U}{U}")); - ability.addTarget(new TargetSpell(filter)); + ability.addTarget(new TargetSpell(StaticFilters.FILTER_INSTANT_OR_SORCERY_SPELL)); ability.addCost(new TapSourceCost()); abilities2.add(ability); diff --git a/Mage.Sets/src/mage/cards/e/ElderPineOfJukai.java b/Mage.Sets/src/mage/cards/e/ElderPineOfJukai.java index dfe2d34a164..dd3ae9ca436 100644 --- a/Mage.Sets/src/mage/cards/e/ElderPineOfJukai.java +++ b/Mage.Sets/src/mage/cards/e/ElderPineOfJukai.java @@ -35,8 +35,8 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; +import mage.filter.StaticFilters; import mage.filter.common.FilterLandCard; -import mage.filter.common.FilterSpiritOrArcaneCard; import java.util.UUID; @@ -54,7 +54,7 @@ public class ElderPineOfJukai extends CardImpl { this.toughness = new MageInt(1); // Whenever you cast a Spirit or Arcane spell, reveal the top three cards of your library. Put all land cards revealed this way into your hand and the rest on the bottom of your library in any order. - this.addAbility(new SpellCastControllerTriggeredAbility(new RevealLibraryPutIntoHandEffect(3, new FilterLandCard(), Zone.LIBRARY), new FilterSpiritOrArcaneCard(), false)); + this.addAbility(new SpellCastControllerTriggeredAbility(new RevealLibraryPutIntoHandEffect(3, new FilterLandCard(), Zone.LIBRARY), StaticFilters.SPIRIT_OR_ARCANE_CARD, false)); // Soulshift 2 this.addAbility(new SoulshiftAbility(2)); diff --git a/Mage.Sets/src/mage/cards/e/ElvishHarbinger.java b/Mage.Sets/src/mage/cards/e/ElvishHarbinger.java index 3583822b7c4..4b6116be2bc 100644 --- a/Mage.Sets/src/mage/cards/e/ElvishHarbinger.java +++ b/Mage.Sets/src/mage/cards/e/ElvishHarbinger.java @@ -35,12 +35,12 @@ import mage.abilities.mana.AnyColorManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.filter.FilterCard; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.target.common.TargetCardInLibrary; import java.util.UUID; +import mage.constants.SubType; /** * @@ -50,7 +50,7 @@ public class ElvishHarbinger extends CardImpl { static final FilterCard filter = new FilterCard("Elf card"); static { - filter.add(new SubtypePredicate(SubType.ELEMENTAL)); + filter.add(new SubtypePredicate(SubType.ELF)); } public ElvishHarbinger(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}"); diff --git a/Mage.Sets/src/mage/cards/f/FaithfulSquire.java b/Mage.Sets/src/mage/cards/f/FaithfulSquire.java index acab18b0994..162961b7115 100644 --- a/Mage.Sets/src/mage/cards/f/FaithfulSquire.java +++ b/Mage.Sets/src/mage/cards/f/FaithfulSquire.java @@ -48,7 +48,7 @@ import mage.constants.Duration; import mage.constants.SuperType; import mage.constants.Zone; import mage.counters.CounterType; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.filter.StaticFilters; import mage.game.events.GameEvent; import mage.game.permanent.token.Token; import mage.target.common.TargetCreaturePermanent; @@ -60,8 +60,6 @@ import java.util.UUID; */ public class FaithfulSquire extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); - public FaithfulSquire(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}{W}"); this.subtype.add("Human"); @@ -73,7 +71,7 @@ public class FaithfulSquire extends CardImpl { this.flipCardName = "Kaiso, Memory of Loyalty"; // Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Faithful Squire. - this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), filter, true)); + this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), StaticFilters.SPIRIT_OR_ARCANE_CARD, true)); // At the beginning of the end step, if there are two or more ki counters on Faithful Squire, you may flip it this.addAbility(new ConditionalTriggeredAbility( diff --git a/Mage.Sets/src/mage/cards/f/FerocityOfTheUnderworld.java b/Mage.Sets/src/mage/cards/f/FerocityOfTheUnderworld.java index c24504a8618..a871e01b1e2 100644 --- a/Mage.Sets/src/mage/cards/f/FerocityOfTheUnderworld.java +++ b/Mage.Sets/src/mage/cards/f/FerocityOfTheUnderworld.java @@ -27,7 +27,6 @@ */ package mage.cards.f; -import mage.constants.ComparisonType; import mage.abilities.Mode; import mage.abilities.effects.common.CopyTargetSpellEffect; import mage.abilities.effects.common.DestroyTargetEffect; @@ -35,10 +34,9 @@ import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.FilterSpell; +import mage.constants.ComparisonType; +import mage.filter.StaticFilters; import mage.filter.common.FilterNonlandPermanent; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; import mage.target.TargetSpell; import mage.target.common.TargetCardInYourGraveyard; @@ -53,11 +51,9 @@ import java.util.UUID; public class FerocityOfTheUnderworld extends CardImpl { private static final FilterNonlandPermanent filterMode1 = new FilterNonlandPermanent("nonland permanent with converted mana cost 3 or less"); - private static final FilterSpell filterMode2 = new FilterSpell("instant or sorcery spell"); static { filterMode1.add(new ConvertedManaCostPredicate(ComparisonType.FEWER_THAN, 4)); - filterMode2.add(Predicates.or(new CardTypePredicate(CardType.INSTANT), new CardTypePredicate(CardType.SORCERY))); } public FerocityOfTheUnderworld(UUID ownerId, CardSetInfo setInfo) { @@ -70,7 +66,7 @@ public class FerocityOfTheUnderworld extends CardImpl { // Copy target instant or sorcery spell. You may choose new targets for the copy. Mode mode = new Mode(); mode.getEffects().add(new CopyTargetSpellEffect()); - mode.getTargets().add(new TargetSpell(filterMode2)); + mode.getTargets().add(new TargetSpell(StaticFilters.FILTER_INSTANT_OR_SORCERY_SPELL)); this.getSpellAbility().addMode(mode); // Return target card from your graveyard to your hand. diff --git a/Mage.Sets/src/mage/cards/f/FiddleheadKami.java b/Mage.Sets/src/mage/cards/f/FiddleheadKami.java index 510cf6e3571..78a668027e5 100644 --- a/Mage.Sets/src/mage/cards/f/FiddleheadKami.java +++ b/Mage.Sets/src/mage/cards/f/FiddleheadKami.java @@ -33,7 +33,7 @@ import mage.abilities.effects.common.RegenerateSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.filter.StaticFilters; import java.util.UUID; @@ -43,8 +43,6 @@ import java.util.UUID; */ public class FiddleheadKami extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); - public FiddleheadKami(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{G}"); this.subtype.add("Spirit"); @@ -53,7 +51,7 @@ public class FiddleheadKami extends CardImpl { this.toughness = new MageInt(3); // Whenever you cast a Spirit or Arcane spell, regenerate Fiddlehead Kami. - this.addAbility(new SpellCastControllerTriggeredAbility(new RegenerateSourceEffect(), filter, false)); + this.addAbility(new SpellCastControllerTriggeredAbility(new RegenerateSourceEffect(), StaticFilters.SPIRIT_OR_ARCANE_CARD, false)); } public FiddleheadKami(final FiddleheadKami card) { diff --git a/Mage.Sets/src/mage/cards/f/Flusterstorm.java b/Mage.Sets/src/mage/cards/f/Flusterstorm.java index 6e79c2bae10..dee404d226a 100644 --- a/Mage.Sets/src/mage/cards/f/Flusterstorm.java +++ b/Mage.Sets/src/mage/cards/f/Flusterstorm.java @@ -33,9 +33,7 @@ import mage.abilities.keyword.StormAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.FilterSpell; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.StaticFilters; import mage.target.TargetSpell; import java.util.UUID; @@ -46,18 +44,12 @@ import java.util.UUID; */ public class Flusterstorm extends CardImpl { - private static final FilterSpell filter = new FilterSpell("instant or sorcery spell"); - - static { - filter.add(Predicates.or(new CardTypePredicate(CardType.INSTANT), new CardTypePredicate(CardType.SORCERY))); - } - public Flusterstorm(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{U}"); // Counter target instant or sorcery spell unless its controller pays {1}. this.getSpellAbility().addEffect(new CounterUnlessPaysEffect(new ManaCostsImpl("{1}"))); - this.getSpellAbility().addTarget(new TargetSpell(filter)); + this.getSpellAbility().addTarget(new TargetSpell(StaticFilters.FILTER_INSTANT_OR_SORCERY_SPELL)); // Storm this.addAbility(new StormAbility()); } diff --git a/Mage.Sets/src/mage/cards/f/Fluxcharger.java b/Mage.Sets/src/mage/cards/f/Fluxcharger.java index 6fae10adb52..749116f8301 100644 --- a/Mage.Sets/src/mage/cards/f/Fluxcharger.java +++ b/Mage.Sets/src/mage/cards/f/Fluxcharger.java @@ -35,9 +35,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.filter.FilterSpell; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.StaticFilters; import java.util.UUID; @@ -47,13 +45,6 @@ import java.util.UUID; */ public class Fluxcharger extends CardImpl { - private static final FilterSpell filter = new FilterSpell("instant or sorcery spell"); - static { - filter.add(Predicates.or( - new CardTypePredicate(CardType.INSTANT), - new CardTypePredicate(CardType.SORCERY))); - } - public Fluxcharger(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{U}{R}"); this.subtype.add("Weird"); @@ -64,7 +55,7 @@ public class Fluxcharger extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); // Whenever you cast an instant or sorcery spell, you may switch Fluxcharger's power and toughness until end of turn. - this.addAbility(new SpellCastControllerTriggeredAbility(new SwitchPowerToughnessSourceEffect(Duration.EndOfTurn), filter, true)); + this.addAbility(new SpellCastControllerTriggeredAbility(new SwitchPowerToughnessSourceEffect(Duration.EndOfTurn), StaticFilters.FILTER_INSTANT_OR_SORCERY_SPELL, true)); } diff --git a/Mage.Sets/src/mage/cards/f/ForcedFruition.java b/Mage.Sets/src/mage/cards/f/ForcedFruition.java index 0e7ca4589cf..7d27a9c7710 100644 --- a/Mage.Sets/src/mage/cards/f/ForcedFruition.java +++ b/Mage.Sets/src/mage/cards/f/ForcedFruition.java @@ -34,7 +34,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SetTargetPointer; import mage.constants.Zone; -import mage.filter.FilterSpell; +import mage.filter.StaticFilters; import java.util.UUID; @@ -50,7 +50,7 @@ public class ForcedFruition extends CardImpl { // Whenever an opponent casts a spell, that player draws seven cards. this.addAbility(new SpellCastOpponentTriggeredAbility(Zone.BATTLEFIELD, new DrawCardTargetEffect(7), - new FilterSpell(), false, SetTargetPointer.PLAYER)); + StaticFilters.FILTER_SPELL, false, SetTargetPointer.PLAYER)); } public ForcedFruition(final ForcedFruition card) { diff --git a/Mage.Sets/src/mage/cards/f/FoulSpirit.java b/Mage.Sets/src/mage/cards/f/FoulSpirit.java index cf8a297cb27..5deb57ba9b1 100644 --- a/Mage.Sets/src/mage/cards/f/FoulSpirit.java +++ b/Mage.Sets/src/mage/cards/f/FoulSpirit.java @@ -34,7 +34,7 @@ import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.common.FilterLandPermanent; +import mage.filter.StaticFilters; import java.util.UUID; @@ -54,7 +54,7 @@ public class FoulSpirit extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // When Foul Spirit enters the battlefield, sacrifice a land. - this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeControllerEffect(new FilterLandPermanent(), 1, ""), false)); + this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeControllerEffect(StaticFilters.FILTER_LAND, 1, ""), false)); } public FoulSpirit(final FoulSpirit card) { diff --git a/Mage.Sets/src/mage/cards/g/GateHound.java b/Mage.Sets/src/mage/cards/g/GateHound.java index 92ff28eebca..3f3ba3f56c5 100644 --- a/Mage.Sets/src/mage/cards/g/GateHound.java +++ b/Mage.Sets/src/mage/cards/g/GateHound.java @@ -38,7 +38,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Zone; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import java.util.UUID; @@ -57,7 +57,7 @@ public class GateHound extends CardImpl { this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect( - new GainAbilityControlledEffect(VigilanceAbility.getInstance(), Duration.WhileOnBattlefield, new FilterCreaturePermanent()), + new GainAbilityControlledEffect(VigilanceAbility.getInstance(), Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURES), new EnchantedSourceCondition(), "Creatures you control have vigilance as long as {this} is enchanted"))); } diff --git a/Mage.Sets/src/mage/cards/g/GateToTheAfterlife.java b/Mage.Sets/src/mage/cards/g/GateToTheAfterlife.java index 62d30eacb5a..7a0575d91a1 100644 --- a/Mage.Sets/src/mage/cards/g/GateToTheAfterlife.java +++ b/Mage.Sets/src/mage/cards/g/GateToTheAfterlife.java @@ -87,7 +87,6 @@ public class GateToTheAfterlife extends CardImpl { new GateToTheAfterlifeEffect(), new GenericManaCost(2), new CardsInControllerGraveCondition(6, new FilterCreatureCard())); ability.addCost(new TapSourceCost()); ability.addCost(new SacrificeSourceCost()); - ability.addEffect(effect); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/g/GiftOfEstates.java b/Mage.Sets/src/mage/cards/g/GiftOfEstates.java index 1d29a6303be..ac340a1789f 100644 --- a/Mage.Sets/src/mage/cards/g/GiftOfEstates.java +++ b/Mage.Sets/src/mage/cards/g/GiftOfEstates.java @@ -35,7 +35,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.filter.FilterCard; -import mage.filter.common.FilterLandPermanent; +import mage.filter.StaticFilters; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.target.common.TargetCardInLibrary; @@ -61,7 +61,7 @@ public class GiftOfEstates extends CardImpl { // If an opponent controls more lands than you, search your library for up to three Plains cards, reveal them, and put them into your hand. Then shuffle your library. this.getSpellAbility().addEffect(new ConditionalOneShotEffect( new SearchLibraryPutInHandEffect(new TargetCardInLibrary(0, 3, filter), true), - new OpponentControlsMoreCondition(new FilterLandPermanent("lands")))); + new OpponentControlsMoreCondition(StaticFilters.FILTER_LANDS))); } public GiftOfEstates(final GiftOfEstates card) { diff --git a/Mage.Sets/src/mage/cards/g/GiltLeafArchdruid.java b/Mage.Sets/src/mage/cards/g/GiltLeafArchdruid.java index 43e8951c60e..95173b41145 100644 --- a/Mage.Sets/src/mage/cards/g/GiltLeafArchdruid.java +++ b/Mage.Sets/src/mage/cards/g/GiltLeafArchdruid.java @@ -39,8 +39,8 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; import mage.filter.FilterSpell; +import mage.filter.StaticFilters; import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.common.FilterLandPermanent; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.game.Game; import mage.game.permanent.Permanent; @@ -108,7 +108,7 @@ class GainControlAllLandsEffect extends ContinuousEffectImpl { public boolean apply(Game game, Ability source) { Player targetPlayer = game.getPlayer(targetPointer.getFirst(game, source)); if (targetPlayer != null && targetPlayer.isInGame()) { - for (Permanent permanent : game.getBattlefield().getAllActivePermanents(new FilterLandPermanent(), targetPointer.getFirst(game, source), game)) { + for (Permanent permanent : game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_LANDS, targetPointer.getFirst(game, source), game)) { if (permanent != null) { permanent.changeControllerId(source.getControllerId(), game); } diff --git a/Mage.Sets/src/mage/cards/g/GlimpseOfNature.java b/Mage.Sets/src/mage/cards/g/GlimpseOfNature.java index 22d51adfcea..b95b15662b3 100644 --- a/Mage.Sets/src/mage/cards/g/GlimpseOfNature.java +++ b/Mage.Sets/src/mage/cards/g/GlimpseOfNature.java @@ -34,8 +34,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.filter.FilterSpell; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; @@ -66,11 +65,6 @@ public class GlimpseOfNature extends CardImpl { class GlimpseOfNatureTriggeredAbility extends DelayedTriggeredAbility { - private static final FilterSpell filter = new FilterSpell(); - static { - filter.add(new CardTypePredicate(CardType.CREATURE)); - } - public GlimpseOfNatureTriggeredAbility() { super(new DrawCardSourceControllerEffect(1), Duration.EndOfTurn, false); } @@ -88,7 +82,7 @@ class GlimpseOfNatureTriggeredAbility extends DelayedTriggeredAbility { public boolean checkTrigger(GameEvent event, Game game) { if (event.getPlayerId().equals(this.getControllerId())) { Spell spell = game.getStack().getSpell(event.getTargetId()); - if (spell != null && filter.match(spell, game)) { + if (spell != null && StaticFilters.FILTER_SPELL_A_CREATURE.match(spell, game)) { return true; } } diff --git a/Mage.Sets/src/mage/cards/g/GlobalRuin.java b/Mage.Sets/src/mage/cards/g/GlobalRuin.java index 0bc382a9152..94b8942ddb8 100644 --- a/Mage.Sets/src/mage/cards/g/GlobalRuin.java +++ b/Mage.Sets/src/mage/cards/g/GlobalRuin.java @@ -35,8 +35,8 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SubType; import mage.constants.SubTypeSet; +import mage.filter.StaticFilters; import mage.filter.common.FilterControlledLandPermanent; -import mage.filter.common.FilterLandPermanent; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.game.Game; import mage.game.permanent.Permanent; @@ -104,7 +104,7 @@ class GlobalRuinDestroyLandEffect extends OneShotEffect { } } } - for (Permanent permanent : game.getBattlefield().getAllActivePermanents(new FilterLandPermanent(), game)) { + for (Permanent permanent : game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_LAND, game)) { if (!lands.contains(permanent.getId())) { permanent.sacrifice(permanent.getId(), game); } diff --git a/Mage.Sets/src/mage/cards/g/GoblinFirebug.java b/Mage.Sets/src/mage/cards/g/GoblinFirebug.java index 752cc5e2da2..5139a3bb5a3 100644 --- a/Mage.Sets/src/mage/cards/g/GoblinFirebug.java +++ b/Mage.Sets/src/mage/cards/g/GoblinFirebug.java @@ -33,7 +33,7 @@ import mage.abilities.effects.common.SacrificeControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.common.FilterLandPermanent; +import mage.filter.StaticFilters; import java.util.UUID; @@ -50,7 +50,7 @@ public class GoblinFirebug extends CardImpl { this.toughness = new MageInt(2); // When Goblin Firebug leaves the battlefield, sacrifice a land. - this.addAbility(new LeavesBattlefieldTriggeredAbility(new SacrificeControllerEffect(new FilterLandPermanent(), 1, ""), false)); + this.addAbility(new LeavesBattlefieldTriggeredAbility(new SacrificeControllerEffect(StaticFilters.FILTER_LAND, 1, ""), false)); } public GoblinFirebug(final GoblinFirebug card) { diff --git a/Mage.Sets/src/mage/cards/g/GruulWarPlow.java b/Mage.Sets/src/mage/cards/g/GruulWarPlow.java index 80fd7f81ee1..d348ae9682a 100644 --- a/Mage.Sets/src/mage/cards/g/GruulWarPlow.java +++ b/Mage.Sets/src/mage/cards/g/GruulWarPlow.java @@ -28,21 +28,21 @@ package mage.cards.g; import mage.MageInt; - import mage.abilities.common.SimpleActivatedAbility; - import mage.abilities.common.SimpleStaticAbility; - import mage.abilities.costs.mana.ManaCostsImpl; - import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect; - import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; - import mage.abilities.keyword.TrampleAbility; - import mage.cards.CardImpl; - import mage.cards.CardSetInfo; - import mage.constants.CardType; - import mage.constants.Duration; - import mage.constants.Zone; - import mage.filter.common.FilterCreaturePermanent; - import mage.game.permanent.token.Token; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.filter.StaticFilters; +import mage.game.permanent.token.Token; - import java.util.UUID; +import java.util.UUID; /** * @author Loki @@ -53,7 +53,7 @@ public class GruulWarPlow extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{4}"); // Creatures you control have trample. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.WhileOnBattlefield, new FilterCreaturePermanent()))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURES))); // {1}{R}{G}: Gruul War Plow becomes a 4/4 Juggernaut artifact creature until end of turn. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureSourceEffect(new GruulWarPlowToken(), "", Duration.EndOfTurn), new ManaCostsImpl("{1}{R}{G}"))); diff --git a/Mage.Sets/src/mage/cards/g/GuardianOfSolitude.java b/Mage.Sets/src/mage/cards/g/GuardianOfSolitude.java index d4cd517a261..bba222a826d 100644 --- a/Mage.Sets/src/mage/cards/g/GuardianOfSolitude.java +++ b/Mage.Sets/src/mage/cards/g/GuardianOfSolitude.java @@ -37,7 +37,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.filter.StaticFilters; import mage.target.common.TargetCreaturePermanent; import java.util.UUID; @@ -47,15 +47,13 @@ import java.util.UUID; */ public class GuardianOfSolitude extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); - public GuardianOfSolitude(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{U}"); this.subtype.add("Spirit"); this.power = new MageInt(1); this.toughness = new MageInt(2); - Ability ability = new SpellCastControllerTriggeredAbility(new GainAbilityTargetEffect(FlyingAbility.getInstance(), Duration.EndOfTurn), filter, false); + Ability ability = new SpellCastControllerTriggeredAbility(new GainAbilityTargetEffect(FlyingAbility.getInstance(), Duration.EndOfTurn), StaticFilters.SPIRIT_OR_ARCANE_CARD, false); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/g/GulfSquid.java b/Mage.Sets/src/mage/cards/g/GulfSquid.java index 6561bfe9311..16a46aeac43 100644 --- a/Mage.Sets/src/mage/cards/g/GulfSquid.java +++ b/Mage.Sets/src/mage/cards/g/GulfSquid.java @@ -34,7 +34,7 @@ import mage.abilities.effects.common.TapAllTargetPlayerControlsEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.common.FilterLandPermanent; +import mage.filter.StaticFilters; import mage.target.TargetPlayer; import java.util.UUID; @@ -53,7 +53,7 @@ public class GulfSquid extends CardImpl { this.toughness = new MageInt(2); // When Gulf Squid enters the battlefield, tap all lands target player controls. - Ability ability = new EntersBattlefieldTriggeredAbility(new TapAllTargetPlayerControlsEffect(new FilterLandPermanent("lands"))); + Ability ability = new EntersBattlefieldTriggeredAbility(new TapAllTargetPlayerControlsEffect(StaticFilters.FILTER_LANDS)); ability.addTarget(new TargetPlayer()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/h/HammerOfPurphoros.java b/Mage.Sets/src/mage/cards/h/HammerOfPurphoros.java index 11698128237..e7a69e3fca8 100644 --- a/Mage.Sets/src/mage/cards/h/HammerOfPurphoros.java +++ b/Mage.Sets/src/mage/cards/h/HammerOfPurphoros.java @@ -27,7 +27,6 @@ */ package mage.cards.h; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleStaticAbility; @@ -43,11 +42,13 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SuperType; import mage.constants.Zone; +import mage.filter.StaticFilters; import mage.filter.common.FilterControlledLandPermanent; -import mage.filter.common.FilterCreaturePermanent; import mage.game.permanent.token.HammerOfPurphorosGolemToken; import mage.target.common.TargetControlledPermanent; +import java.util.UUID; + /** * * @author LevelX2 @@ -60,7 +61,7 @@ public class HammerOfPurphoros extends CardImpl { // Creatures you control have haste. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, - new GainAbilityControlledEffect(HasteAbility.getInstance(), Duration.WhileOnBattlefield, new FilterCreaturePermanent("Creatures")))); + new GainAbilityControlledEffect(HasteAbility.getInstance(), Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURES))); // {2}{R}, {tap}, Sacrifice a land: Create a 3/3 colorless Golem enchantment artifact creature token. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new HammerOfPurphorosGolemToken()), new ManaCostsImpl("{2}{R}")); diff --git a/Mage.Sets/src/mage/cards/h/HaruOnna.java b/Mage.Sets/src/mage/cards/h/HaruOnna.java index 93bfd63fdb3..4c807a9d312 100644 --- a/Mage.Sets/src/mage/cards/h/HaruOnna.java +++ b/Mage.Sets/src/mage/cards/h/HaruOnna.java @@ -27,8 +27,6 @@ */ package mage.cards.h; -import java.util.UUID; -import mage.constants.CardType; import mage.MageInt; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SpellCastControllerTriggeredAbility; @@ -36,7 +34,10 @@ import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.ReturnToHandSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.constants.CardType; +import mage.filter.StaticFilters; + +import java.util.UUID; /** * @@ -44,8 +45,6 @@ import mage.filter.common.FilterSpiritOrArcaneCard; */ public class HaruOnna extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); - public HaruOnna(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{G}"); this.subtype.add("Spirit"); @@ -56,7 +55,7 @@ public class HaruOnna extends CardImpl { // When Haru-Onna enters the battlefield, draw a card. this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1))); // Whenever you cast a Spirit or Arcane spell, you may return Haru-Onna to its owner's hand. - this.addAbility(new SpellCastControllerTriggeredAbility(new ReturnToHandSourceEffect(true), filter, true)); + this.addAbility(new SpellCastControllerTriggeredAbility(new ReturnToHandSourceEffect(true), StaticFilters.SPIRIT_OR_ARCANE_CARD, true)); } public HaruOnna(final HaruOnna card) { diff --git a/Mage.Sets/src/mage/cards/h/HellraiserGoblin.java b/Mage.Sets/src/mage/cards/h/HellraiserGoblin.java index 5ab8f221e89..582f7ef37cd 100644 --- a/Mage.Sets/src/mage/cards/h/HellraiserGoblin.java +++ b/Mage.Sets/src/mage/cards/h/HellraiserGoblin.java @@ -28,7 +28,6 @@ */ package mage.cards.h; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.Mode; @@ -42,11 +41,13 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Zone; +import mage.filter.StaticFilters; import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.permanent.Permanent; +import java.util.UUID; + /** * * @author LevelX2 @@ -63,7 +64,7 @@ public class HellraiserGoblin extends CardImpl { this.toughness = new MageInt(2); // Creatures you control have haste and attack each combat if able. - Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(HasteAbility.getInstance(), Duration.WhileOnBattlefield, new FilterCreaturePermanent("Creatures"))); + Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(HasteAbility.getInstance(), Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURES)); Effect effect = new AttacksIfAbleAllEffect(Duration.WhileOnBattlefield); effect.setText("and attack each combat if able"); ability.addEffect(effect); diff --git a/Mage.Sets/src/mage/cards/h/HikariTwilightGuardian.java b/Mage.Sets/src/mage/cards/h/HikariTwilightGuardian.java index aa765634c7d..b16e1003c9a 100644 --- a/Mage.Sets/src/mage/cards/h/HikariTwilightGuardian.java +++ b/Mage.Sets/src/mage/cards/h/HikariTwilightGuardian.java @@ -36,7 +36,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SuperType; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.filter.StaticFilters; import java.util.UUID; @@ -46,8 +46,6 @@ import java.util.UUID; */ public class HikariTwilightGuardian extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); - public HikariTwilightGuardian(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{W}{W}"); addSuperType(SuperType.LEGENDARY); @@ -61,7 +59,7 @@ public class HikariTwilightGuardian extends CardImpl { // Whenever you cast a Spirit or Arcane spell, you may exile Hikari, Twilight Guardian. If you do, return it to the battlefield under its owner's control at the beginning of the next end step. Effect effect = new ExileReturnBattlefieldOwnerNextEndStepSourceEffect(true); effect.setText("you may exile {this}. If you do, return it to the battlefield under its owner's control at the beginning of the next end step"); - this.addAbility(new SpellCastControllerTriggeredAbility(effect, filter, true)); + this.addAbility(new SpellCastControllerTriggeredAbility(effect, StaticFilters.SPIRIT_OR_ARCANE_CARD, true)); } public HikariTwilightGuardian(final HikariTwilightGuardian card) { diff --git a/Mage.Sets/src/mage/cards/h/HiredMuscle.java b/Mage.Sets/src/mage/cards/h/HiredMuscle.java index b12ea5d24d9..5611e4afec7 100644 --- a/Mage.Sets/src/mage/cards/h/HiredMuscle.java +++ b/Mage.Sets/src/mage/cards/h/HiredMuscle.java @@ -27,7 +27,6 @@ */ package mage.cards.h; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.OnEventTriggeredAbility; @@ -47,21 +46,21 @@ import mage.constants.Duration; import mage.constants.SuperType; import mage.constants.Zone; import mage.counters.CounterType; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.filter.StaticFilters; import mage.game.events.GameEvent; import mage.game.permanent.token.Token; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** - * * @author LevelX2 */ public class HiredMuscle extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); public HiredMuscle(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{B}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}{B}"); this.subtype.add("Human"); this.subtype.add("Warrior"); @@ -71,7 +70,7 @@ public class HiredMuscle extends CardImpl { this.flipCardName = "Scarmaker"; // Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Hired Muscle. - this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), filter, true)); + this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), StaticFilters.SPIRIT_OR_ARCANE_CARD, true)); // At the beginning of the end step, if there are two or more ki counters on Hired Muscle, you may flip it. this.addAbility(new ConditionalTriggeredAbility( diff --git a/Mage.Sets/src/mage/cards/h/HokoriDustDrinker.java b/Mage.Sets/src/mage/cards/h/HokoriDustDrinker.java index b817e76543e..89c7204d2f2 100644 --- a/Mage.Sets/src/mage/cards/h/HokoriDustDrinker.java +++ b/Mage.Sets/src/mage/cards/h/HokoriDustDrinker.java @@ -36,6 +36,7 @@ import mage.abilities.effects.common.DontUntapInControllersUntapStepAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; +import mage.filter.StaticFilters; import mage.filter.common.FilterLandPermanent; import mage.filter.predicate.permanent.ControllerIdPredicate; import mage.game.Game; @@ -60,7 +61,7 @@ public class HokoriDustDrinker extends CardImpl { this.toughness = new MageInt(2); // Lands don't untap during their controllers' untap steps. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DontUntapInControllersUntapStepAllEffect(Duration.WhileOnBattlefield, TargetController.ANY, new FilterLandPermanent("Lands")))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DontUntapInControllersUntapStepAllEffect(Duration.WhileOnBattlefield, TargetController.ANY, StaticFilters.FILTER_LANDS))); // At the beginning of each player's upkeep, that player untaps a land he or she controls. this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new HokoriDustDrinkerUntapEffect(), TargetController.ANY, false)); diff --git a/Mage.Sets/src/mage/cards/h/HorizonSeed.java b/Mage.Sets/src/mage/cards/h/HorizonSeed.java index c3ef6a071fa..771d22b276b 100644 --- a/Mage.Sets/src/mage/cards/h/HorizonSeed.java +++ b/Mage.Sets/src/mage/cards/h/HorizonSeed.java @@ -28,32 +28,30 @@ package mage.cards.h; -import java.util.UUID; - -import mage.constants.CardType; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.effects.common.RegenerateTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.constants.CardType; +import mage.filter.StaticFilters; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** * @author Loki */ public class HorizonSeed extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); - public HorizonSeed(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{W}"); this.subtype.add("Spirit"); this.power = new MageInt(2); this.toughness = new MageInt(1); - Ability ability = new SpellCastControllerTriggeredAbility(new RegenerateTargetEffect(), filter, false); + Ability ability = new SpellCastControllerTriggeredAbility(new RegenerateTargetEffect(), StaticFilters.SPIRIT_OR_ARCANE_CARD, false); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/i/IceCave.java b/Mage.Sets/src/mage/cards/i/IceCave.java index 228e2d6d4d0..009dc048e89 100644 --- a/Mage.Sets/src/mage/cards/i/IceCave.java +++ b/Mage.Sets/src/mage/cards/i/IceCave.java @@ -29,6 +29,8 @@ package mage.cards.i; import mage.abilities.Ability; import mage.abilities.common.SpellCastAllTriggeredAbility; +import mage.abilities.costs.Cost; +import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -36,13 +38,11 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SetTargetPointer; import mage.constants.Zone; -import mage.filter.FilterSpell; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.stack.Spell; import mage.players.Player; -import mage.abilities.costs.Cost; -import mage.abilities.costs.mana.ManaCostsImpl; import java.util.UUID; @@ -57,7 +57,7 @@ public class IceCave extends CardImpl { // Whenever a player casts a spell, any other player may pay that spell's mana cost. If a player does, counter the spell. (Mana cost includes color.) - this.addAbility(new SpellCastAllTriggeredAbility(Zone.BATTLEFIELD, new IceCaveEffect(), new FilterSpell(), false, SetTargetPointer.SPELL)); + this.addAbility(new SpellCastAllTriggeredAbility(Zone.BATTLEFIELD, new IceCaveEffect(), StaticFilters.FILTER_SPELL, false, SetTargetPointer.SPELL)); } public IceCave(final IceCave card) { diff --git a/Mage.Sets/src/mage/cards/i/InfernalKirin.java b/Mage.Sets/src/mage/cards/i/InfernalKirin.java index e92e8840e96..4bb7533e151 100644 --- a/Mage.Sets/src/mage/cards/i/InfernalKirin.java +++ b/Mage.Sets/src/mage/cards/i/InfernalKirin.java @@ -39,7 +39,7 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SuperType; import mage.constants.Zone; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.stack.Spell; import mage.players.Player; @@ -66,7 +66,7 @@ public class InfernalKirin extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); // Whenever you cast a Spirit or Arcane spell, target player reveals his or her hand and discards all cards with that spell's converted mana cost. - Ability ability = new SpellCastControllerTriggeredAbility(Zone.BATTLEFIELD, new InfernalKirinEffect(), new FilterSpiritOrArcaneCard(), false, true); + Ability ability = new SpellCastControllerTriggeredAbility(Zone.BATTLEFIELD, new InfernalKirinEffect(), StaticFilters.SPIRIT_OR_ARCANE_CARD, false, true); ability.addTarget(new TargetPlayer()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/i/InnocenceKami.java b/Mage.Sets/src/mage/cards/i/InnocenceKami.java index 5b1adfec32c..1604fa347cc 100644 --- a/Mage.Sets/src/mage/cards/i/InnocenceKami.java +++ b/Mage.Sets/src/mage/cards/i/InnocenceKami.java @@ -28,9 +28,6 @@ package mage.cards.i; -import java.util.UUID; - -import mage.constants.CardType; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -41,18 +38,19 @@ import mage.abilities.effects.common.TapTargetEffect; import mage.abilities.effects.common.UntapSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.constants.CardType; import mage.constants.ColoredManaSymbol; import mage.constants.Zone; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.filter.StaticFilters; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** * @author Loki */ public class InnocenceKami extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); - public InnocenceKami(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{W}{W}"); this.subtype.add("Spirit"); @@ -63,7 +61,7 @@ public class InnocenceKami extends CardImpl { ability.addCost(new TapSourceCost()); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); - this.addAbility(new SpellCastControllerTriggeredAbility(new UntapSourceEffect(), filter, false)); + this.addAbility(new SpellCastControllerTriggeredAbility(new UntapSourceEffect(), StaticFilters.SPIRIT_OR_ARCANE_CARD, false)); } public InnocenceKami(final InnocenceKami card) { diff --git a/Mage.Sets/src/mage/cards/i/InsidiousWill.java b/Mage.Sets/src/mage/cards/i/InsidiousWill.java index d7e7d0fa903..63838c28118 100644 --- a/Mage.Sets/src/mage/cards/i/InsidiousWill.java +++ b/Mage.Sets/src/mage/cards/i/InsidiousWill.java @@ -27,7 +27,6 @@ */ package mage.cards.i; -import java.util.UUID; import mage.abilities.Mode; import mage.abilities.effects.common.ChooseNewTargetsTargetEffect; import mage.abilities.effects.common.CopyTargetSpellEffect; @@ -35,25 +34,17 @@ import mage.abilities.effects.common.CounterTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.FilterSpell; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.StaticFilters; import mage.target.TargetSpell; +import java.util.UUID; + /** * * @author fireshoes */ public class InsidiousWill extends CardImpl { - private static final FilterSpell filter = new FilterSpell("instant or sorcery spell"); - - static { - filter.add(Predicates.or( - new CardTypePredicate(CardType.INSTANT), - new CardTypePredicate(CardType.SORCERY))); - } - public InsidiousWill(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{2}{U}{U}"); @@ -74,7 +65,7 @@ public class InsidiousWill extends CardImpl { // Copy target instant or sorcery spell. You may choose new targets for the copy. mode = new Mode(); mode.getEffects().add(new CopyTargetSpellEffect()); - mode.getTargets().add(new TargetSpell(filter)); + mode.getTargets().add(new TargetSpell(StaticFilters.FILTER_INSTANT_OR_SORCERY_SPELL)); this.getSpellAbility().getModes().addMode(mode); } diff --git a/Mage.Sets/src/mage/cards/i/InspiringVantage.java b/Mage.Sets/src/mage/cards/i/InspiringVantage.java index 32353b18e90..be17134f612 100644 --- a/Mage.Sets/src/mage/cards/i/InspiringVantage.java +++ b/Mage.Sets/src/mage/cards/i/InspiringVantage.java @@ -27,9 +27,6 @@ */ package mage.cards.i; -import java.util.UUID; - -import mage.constants.ComparisonType; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.condition.Condition; import mage.abilities.condition.InvertCondition; @@ -41,19 +38,21 @@ import mage.abilities.mana.WhiteManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.common.FilterLandPermanent; +import mage.constants.ComparisonType; +import mage.filter.StaticFilters; + +import java.util.UUID; /** - * * @author fireshoes */ public class InspiringVantage extends CardImpl { public InspiringVantage(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.LAND},""); + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Inspiring Vantage enters the battlefield tapped unless you control two or fewer other lands. - Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(new FilterLandPermanent(), ComparisonType.FEWER_THAN, 3)); + Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(StaticFilters.FILTER_LANDS, ComparisonType.FEWER_THAN, 3)); String abilityText = "tapped unless you control fewer than 3 lands"; this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText)); diff --git a/Mage.Sets/src/mage/cards/i/Intimidation.java b/Mage.Sets/src/mage/cards/i/Intimidation.java index 347be240f59..dcbc9ee6b33 100644 --- a/Mage.Sets/src/mage/cards/i/Intimidation.java +++ b/Mage.Sets/src/mage/cards/i/Intimidation.java @@ -27,8 +27,6 @@ */ package mage.cards.i; -import java.util.UUID; - import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; import mage.abilities.keyword.FearAbility; @@ -37,7 +35,9 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Zone; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; + +import java.util.UUID; /** * @@ -49,7 +49,7 @@ public class Intimidation extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}{B}{B}"); // Creatures you control have fear. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(FearAbility.getInstance(), Duration.WhileOnBattlefield, new FilterCreaturePermanent("Creatures")))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(FearAbility.getInstance(), Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURES))); } public Intimidation(final Intimidation card) { diff --git a/Mage.Sets/src/mage/cards/j/JadeIdol.java b/Mage.Sets/src/mage/cards/j/JadeIdol.java index 7dfd58c9ec0..6fa9dda0333 100644 --- a/Mage.Sets/src/mage/cards/j/JadeIdol.java +++ b/Mage.Sets/src/mage/cards/j/JadeIdol.java @@ -28,28 +28,26 @@ package mage.cards.j; -import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Duration; import mage.MageInt; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.filter.StaticFilters; import mage.game.permanent.token.Token; +import java.util.UUID; + /** * @author Loki */ public class JadeIdol extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); - public JadeIdol(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{4}"); - this.addAbility(new SpellCastControllerTriggeredAbility(new BecomesCreatureSourceEffect(new JadeIdolToken(), "", Duration.EndOfTurn), filter, false)); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}"); + this.addAbility(new SpellCastControllerTriggeredAbility(new BecomesCreatureSourceEffect(new JadeIdolToken(), "", Duration.EndOfTurn), StaticFilters.SPIRIT_OR_ARCANE_CARD, false)); } public JadeIdol(final JadeIdol card) { diff --git a/Mage.Sets/src/mage/cards/j/JoinerAdept.java b/Mage.Sets/src/mage/cards/j/JoinerAdept.java index d5751527d0c..0d91b0d6861 100644 --- a/Mage.Sets/src/mage/cards/j/JoinerAdept.java +++ b/Mage.Sets/src/mage/cards/j/JoinerAdept.java @@ -27,18 +27,18 @@ */ package mage.cards.j; -import java.util.UUID; - -import mage.constants.CardType; import mage.MageInt; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; import mage.abilities.mana.AnyColorManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Zone; -import mage.filter.common.FilterLandPermanent; +import mage.filter.StaticFilters; + +import java.util.UUID; /** * @@ -53,7 +53,7 @@ public class JoinerAdept extends CardImpl { this.power = new MageInt(2); this.toughness = new MageInt(1); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(new AnyColorManaAbility(), Duration.WhileOnBattlefield, new FilterLandPermanent(), false))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(new AnyColorManaAbility(), Duration.WhileOnBattlefield, StaticFilters.FILTER_LANDS, false))); } public JoinerAdept(final JoinerAdept card) { diff --git a/Mage.Sets/src/mage/cards/j/JudgesFamiliar.java b/Mage.Sets/src/mage/cards/j/JudgesFamiliar.java index d69e52b9c1d..faa3ac8d003 100644 --- a/Mage.Sets/src/mage/cards/j/JudgesFamiliar.java +++ b/Mage.Sets/src/mage/cards/j/JudgesFamiliar.java @@ -27,9 +27,6 @@ */ package mage.cards.j; -import java.util.UUID; - -import mage.constants.CardType; import mage.MageInt; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeSourceCost; @@ -38,26 +35,19 @@ import mage.abilities.effects.common.CounterUnlessPaysEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.constants.CardType; import mage.constants.Zone; -import mage.filter.FilterSpell; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.StaticFilters; import mage.target.TargetSpell; +import java.util.UUID; + /** * * @author LevelX2 */ public class JudgesFamiliar extends CardImpl { - private static final FilterSpell filter = new FilterSpell("instant or sorcery spell"); - - static { - filter.add(Predicates.or( - new CardTypePredicate(CardType.INSTANT), - new CardTypePredicate(CardType.SORCERY))); - } - public JudgesFamiliar(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{W/U}"); this.subtype.add("Bird"); @@ -73,7 +63,7 @@ public class JudgesFamiliar extends CardImpl { SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CounterUnlessPaysEffect(new GenericManaCost(1)), new SacrificeSourceCost()); - ability.addTarget(new TargetSpell(filter)); + ability.addTarget(new TargetSpell(StaticFilters.FILTER_INSTANT_OR_SORCERY_SPELL)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/k/KaervekTheMerciless.java b/Mage.Sets/src/mage/cards/k/KaervekTheMerciless.java index e711a881bf1..c01971b28bf 100644 --- a/Mage.Sets/src/mage/cards/k/KaervekTheMerciless.java +++ b/Mage.Sets/src/mage/cards/k/KaervekTheMerciless.java @@ -35,7 +35,7 @@ import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; -import mage.filter.FilterSpell; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.stack.Spell; @@ -61,7 +61,7 @@ public class KaervekTheMerciless extends CardImpl { this.toughness = new MageInt(4); // Whenever an opponent casts a spell, Kaervek the Merciless deals damage to target creature or player equal to that spell's converted mana cost. - Ability ability = new SpellCastOpponentTriggeredAbility(Zone.BATTLEFIELD, new KaervekTheMercilessEffect(), new FilterSpell(), false, SetTargetPointer.SPELL); + Ability ability = new SpellCastOpponentTriggeredAbility(Zone.BATTLEFIELD, new KaervekTheMercilessEffect(), StaticFilters.FILTER_SPELL, false, SetTargetPointer.SPELL); ability.addTarget(new TargetCreatureOrPlayer()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/k/KamiOfFiresRoar.java b/Mage.Sets/src/mage/cards/k/KamiOfFiresRoar.java index 4ca3944b374..025b85ccfcc 100644 --- a/Mage.Sets/src/mage/cards/k/KamiOfFiresRoar.java +++ b/Mage.Sets/src/mage/cards/k/KamiOfFiresRoar.java @@ -28,26 +28,24 @@ package mage.cards.k; -import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Duration; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.effects.common.combat.CantBlockTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.filter.StaticFilters; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** * @author Loki */ public class KamiOfFiresRoar extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); - public KamiOfFiresRoar(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{R}"); this.subtype.add("Spirit"); @@ -56,7 +54,7 @@ public class KamiOfFiresRoar extends CardImpl { this.toughness = new MageInt(3); // Whenever you cast a Spirit or Arcane spell, target creature can't block this turn. - Ability ability = new SpellCastControllerTriggeredAbility(new CantBlockTargetEffect(Duration.EndOfTurn), filter, false); + Ability ability = new SpellCastControllerTriggeredAbility(new CantBlockTargetEffect(Duration.EndOfTurn), StaticFilters.SPIRIT_OR_ARCANE_CARD, false); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/k/KamiOfTatteredShoji.java b/Mage.Sets/src/mage/cards/k/KamiOfTatteredShoji.java index d1bafb579af..198ffb2275f 100644 --- a/Mage.Sets/src/mage/cards/k/KamiOfTatteredShoji.java +++ b/Mage.Sets/src/mage/cards/k/KamiOfTatteredShoji.java @@ -27,17 +27,17 @@ */ package mage.cards.k; -import java.util.UUID; - -import mage.constants.CardType; import mage.MageInt; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.constants.CardType; import mage.constants.Duration; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.filter.StaticFilters; + +import java.util.UUID; /** * @@ -45,8 +45,6 @@ import mage.filter.common.FilterSpiritOrArcaneCard; */ public class KamiOfTatteredShoji extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); - public KamiOfTatteredShoji(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{W}"); this.subtype.add("Spirit"); @@ -54,7 +52,7 @@ public class KamiOfTatteredShoji extends CardImpl { this.power = new MageInt(2); this.toughness = new MageInt(5); // Whenever you cast a Spirit or Arcane spell, Kami of Tattered Shoji gains flying until end of turn. - this.addAbility(new SpellCastControllerTriggeredAbility(new GainAbilitySourceEffect(FlyingAbility.getInstance(), Duration.EndOfTurn), filter, false)); + this.addAbility(new SpellCastControllerTriggeredAbility(new GainAbilitySourceEffect(FlyingAbility.getInstance(), Duration.EndOfTurn), StaticFilters.SPIRIT_OR_ARCANE_CARD, false)); } public KamiOfTatteredShoji(final KamiOfTatteredShoji card) { diff --git a/Mage.Sets/src/mage/cards/k/KamiOfTheHunt.java b/Mage.Sets/src/mage/cards/k/KamiOfTheHunt.java index 3676bef8526..d056676245f 100644 --- a/Mage.Sets/src/mage/cards/k/KamiOfTheHunt.java +++ b/Mage.Sets/src/mage/cards/k/KamiOfTheHunt.java @@ -28,31 +28,29 @@ package mage.cards.k; -import java.util.UUID; - -import mage.constants.CardType; import mage.MageInt; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.constants.CardType; import mage.constants.Duration; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.filter.StaticFilters; + +import java.util.UUID; /** * @author Loki */ public class KamiOfTheHunt extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); - public KamiOfTheHunt(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}"); this.subtype.add("Spirit"); this.power = new MageInt(2); this.toughness = new MageInt(2); - this.addAbility(new SpellCastControllerTriggeredAbility(new BoostSourceEffect(1, 1, Duration.EndOfTurn), filter, false)); + this.addAbility(new SpellCastControllerTriggeredAbility(new BoostSourceEffect(1, 1, Duration.EndOfTurn), StaticFilters.SPIRIT_OR_ARCANE_CARD, false)); } public KamiOfTheHunt(final KamiOfTheHunt card) { diff --git a/Mage.Sets/src/mage/cards/k/KamiOfThePaintedRoad.java b/Mage.Sets/src/mage/cards/k/KamiOfThePaintedRoad.java index 19912dcf9ef..32df7eec6b7 100644 --- a/Mage.Sets/src/mage/cards/k/KamiOfThePaintedRoad.java +++ b/Mage.Sets/src/mage/cards/k/KamiOfThePaintedRoad.java @@ -27,7 +27,6 @@ */ package mage.cards.k; -import java.util.UUID; import mage.MageInt; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.effects.common.continuous.GainProtectionFromColorSourceEffect; @@ -35,7 +34,9 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.filter.StaticFilters; + +import java.util.UUID; /** * @@ -43,8 +44,6 @@ import mage.filter.common.FilterSpiritOrArcaneCard; */ public class KamiOfThePaintedRoad extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); - public KamiOfThePaintedRoad(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{W}"); this.subtype.add("Spirit"); @@ -53,7 +52,7 @@ public class KamiOfThePaintedRoad extends CardImpl { this.toughness = new MageInt(3); // Whenever you cast a Spirit or Arcane spell, Kami of the Painted Road gains protection from the color of your choice until end of turn. - this.addAbility(new SpellCastControllerTriggeredAbility(new GainProtectionFromColorSourceEffect(Duration.EndOfTurn), filter, false)); + this.addAbility(new SpellCastControllerTriggeredAbility(new GainProtectionFromColorSourceEffect(Duration.EndOfTurn), StaticFilters.SPIRIT_OR_ARCANE_CARD, false)); } diff --git a/Mage.Sets/src/mage/cards/k/KamiOfTheWaningMoon.java b/Mage.Sets/src/mage/cards/k/KamiOfTheWaningMoon.java index 26099d62079..f1d136d8f2b 100644 --- a/Mage.Sets/src/mage/cards/k/KamiOfTheWaningMoon.java +++ b/Mage.Sets/src/mage/cards/k/KamiOfTheWaningMoon.java @@ -28,9 +28,6 @@ package mage.cards.k; -import java.util.UUID; - -import mage.constants.CardType; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SpellCastControllerTriggeredAbility; @@ -39,17 +36,18 @@ import mage.abilities.keyword.FearAbility; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.constants.CardType; import mage.constants.Duration; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.filter.StaticFilters; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** * @author Loki */ public class KamiOfTheWaningMoon extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); - public KamiOfTheWaningMoon(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{B}"); this.subtype.add("Spirit"); @@ -57,7 +55,7 @@ public class KamiOfTheWaningMoon extends CardImpl { this.power = new MageInt(1); this.toughness = new MageInt(1); this.addAbility(FlyingAbility.getInstance()); - Ability ability = new SpellCastControllerTriggeredAbility(new GainAbilityTargetEffect(FearAbility.getInstance(), Duration.EndOfTurn), filter, false); + Ability ability = new SpellCastControllerTriggeredAbility(new GainAbilityTargetEffect(FearAbility.getInstance(), Duration.EndOfTurn), StaticFilters.SPIRIT_OR_ARCANE_CARD, false); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/k/KemuriOnna.java b/Mage.Sets/src/mage/cards/k/KemuriOnna.java index a7c53b1674c..d3b805ee15a 100644 --- a/Mage.Sets/src/mage/cards/k/KemuriOnna.java +++ b/Mage.Sets/src/mage/cards/k/KemuriOnna.java @@ -27,27 +27,26 @@ */ package mage.cards.k; -import java.util.UUID; -import mage.constants.CardType; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SpellCastControllerTriggeredAbility; -import mage.abilities.effects.common.discard.DiscardTargetEffect; import mage.abilities.effects.common.ReturnToHandSourceEffect; +import mage.abilities.effects.common.discard.DiscardTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.constants.CardType; +import mage.filter.StaticFilters; import mage.target.TargetPlayer; +import java.util.UUID; + /** * * @author Loki */ public class KemuriOnna extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); - public KemuriOnna(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{B}"); this.subtype.add("Spirit"); @@ -60,7 +59,7 @@ public class KemuriOnna extends CardImpl { ability.addTarget(new TargetPlayer()); this.addAbility(ability); // Whenever you cast a Spirit or Arcane spell, you may return Kemuri-Onna to its owner's hand. - this.addAbility(new SpellCastControllerTriggeredAbility(new ReturnToHandSourceEffect(true), filter, true)); + this.addAbility(new SpellCastControllerTriggeredAbility(new ReturnToHandSourceEffect(true), StaticFilters.SPIRIT_OR_ARCANE_CARD, true)); } public KemuriOnna(final KemuriOnna card) { diff --git a/Mage.Sets/src/mage/cards/k/KiriOnna.java b/Mage.Sets/src/mage/cards/k/KiriOnna.java index f01b4f9f06b..84be84077ce 100644 --- a/Mage.Sets/src/mage/cards/k/KiriOnna.java +++ b/Mage.Sets/src/mage/cards/k/KiriOnna.java @@ -27,8 +27,6 @@ */ package mage.cards.k; -import java.util.UUID; -import mage.constants.CardType; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; @@ -37,17 +35,18 @@ import mage.abilities.effects.common.ReturnToHandSourceEffect; import mage.abilities.effects.common.ReturnToHandTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.constants.CardType; +import mage.filter.StaticFilters; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** * * @author Loki */ public class KiriOnna extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); - public KiriOnna(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{U}"); this.subtype.add("Spirit"); @@ -60,7 +59,7 @@ public class KiriOnna extends CardImpl { ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); // Whenever you cast a Spirit or Arcane spell, you may return Kiri-Onna to its owner's hand. - this.addAbility(new SpellCastControllerTriggeredAbility(new ReturnToHandSourceEffect(true), filter, true)); + this.addAbility(new SpellCastControllerTriggeredAbility(new ReturnToHandSourceEffect(true), StaticFilters.SPIRIT_OR_ARCANE_CARD, true)); } public KiriOnna(final KiriOnna card) { diff --git a/Mage.Sets/src/mage/cards/k/KnightOfTheWhiteOrchid.java b/Mage.Sets/src/mage/cards/k/KnightOfTheWhiteOrchid.java index 54ecc742404..369137b4ed0 100644 --- a/Mage.Sets/src/mage/cards/k/KnightOfTheWhiteOrchid.java +++ b/Mage.Sets/src/mage/cards/k/KnightOfTheWhiteOrchid.java @@ -28,8 +28,6 @@ package mage.cards.k; -import java.util.UUID; -import mage.constants.CardType; import mage.MageInt; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.common.OpponentControlsMoreCondition; @@ -38,11 +36,14 @@ import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; import mage.abilities.keyword.FirstStrikeAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.constants.CardType; import mage.constants.SubType; +import mage.filter.StaticFilters; import mage.filter.common.FilterBySubtypeCard; -import mage.filter.common.FilterLandPermanent; import mage.target.common.TargetCardInLibrary; +import java.util.UUID; + /** * * @author BetaSteward_at_googlemail.com @@ -63,7 +64,7 @@ public class KnightOfTheWhiteOrchid extends CardImpl { // When Knight of the White Orchid enters the battlefield, if an opponent controls more lands than you, you may search your library for a Plains card, put it onto the battlefield, then shuffle your library. this.addAbility(new ConditionalTriggeredAbility( new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(0, 1, new FilterBySubtypeCard(SubType.PLAINS)), false), true), - new OpponentControlsMoreCondition(new FilterLandPermanent("lands")), + new OpponentControlsMoreCondition(StaticFilters.FILTER_LANDS), "When {this} enters the battlefield, if an opponent controls more lands than you, you may search your library for a Plains card, put it onto the battlefield, then shuffle your library")); } diff --git a/Mage.Sets/src/mage/cards/k/KodamaOfTheSouthTree.java b/Mage.Sets/src/mage/cards/k/KodamaOfTheSouthTree.java index 50370f58378..864c03d3c26 100644 --- a/Mage.Sets/src/mage/cards/k/KodamaOfTheSouthTree.java +++ b/Mage.Sets/src/mage/cards/k/KodamaOfTheSouthTree.java @@ -39,8 +39,8 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SuperType; +import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; -import mage.filter.common.FilterSpiritOrArcaneCard; import java.util.UUID; @@ -49,8 +49,6 @@ import java.util.UUID; */ public class KodamaOfTheSouthTree extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); - public KodamaOfTheSouthTree(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}{G}"); addSuperType(SuperType.LEGENDARY); @@ -58,8 +56,8 @@ public class KodamaOfTheSouthTree extends CardImpl { this.power = new MageInt(4); this.toughness = new MageInt(4); - Ability ability = new SpellCastControllerTriggeredAbility(new BoostControlledEffect(1, 1, Duration.EndOfTurn, new FilterCreaturePermanent(), true), filter, false); - ability.addEffect(new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.EndOfTurn, new FilterCreaturePermanent(), true)); + Ability ability = new SpellCastControllerTriggeredAbility(new BoostControlledEffect(1, 1, Duration.EndOfTurn, new FilterCreaturePermanent(), true), StaticFilters.SPIRIT_OR_ARCANE_CARD, false); + ability.addEffect(new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURE, true)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/k/KyokiSanitysEclipse.java b/Mage.Sets/src/mage/cards/k/KyokiSanitysEclipse.java index 4dc2693b8da..ff4326df8b6 100644 --- a/Mage.Sets/src/mage/cards/k/KyokiSanitysEclipse.java +++ b/Mage.Sets/src/mage/cards/k/KyokiSanitysEclipse.java @@ -37,7 +37,7 @@ import mage.constants.CardType; import mage.constants.SuperType; import mage.constants.Zone; import mage.filter.FilterCard; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.filter.StaticFilters; import mage.target.common.TargetOpponent; import java.util.UUID; @@ -58,7 +58,7 @@ public class KyokiSanitysEclipse extends CardImpl { this.toughness = new MageInt(4); // Whenever you cast a Spirit or Arcane spell, target opponent exiles a card from his or her hand. - Ability ability = new SpellCastControllerTriggeredAbility(new ExileFromZoneTargetEffect(Zone.HAND, null, "", new FilterCard()), new FilterSpiritOrArcaneCard(), false); + Ability ability = new SpellCastControllerTriggeredAbility(new ExileFromZoneTargetEffect(Zone.HAND, null, "", new FilterCard()), StaticFilters.SPIRIT_OR_ARCANE_CARD, false); ability.addTarget(new TargetOpponent()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/l/LandEquilibrium.java b/Mage.Sets/src/mage/cards/l/LandEquilibrium.java index 33027bb7815..a7cecfd3bd3 100644 --- a/Mage.Sets/src/mage/cards/l/LandEquilibrium.java +++ b/Mage.Sets/src/mage/cards/l/LandEquilibrium.java @@ -27,19 +27,20 @@ */ package mage.cards.l; -import java.util.UUID; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.common.SacrificeEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; -import mage.filter.common.FilterLandPermanent; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; import mage.target.targetpointer.FixedTarget; +import java.util.UUID; + /** * * @author spjspj @@ -65,10 +66,8 @@ public class LandEquilibrium extends CardImpl { class LandEquilibriumAbility extends TriggeredAbilityImpl { - private static final FilterLandPermanent filter = new FilterLandPermanent("land"); - public LandEquilibriumAbility() { - super(Zone.BATTLEFIELD, new SacrificeEffect(new FilterLandPermanent(), 1, ""), false); + super(Zone.BATTLEFIELD, new SacrificeEffect(StaticFilters.FILTER_LAND, 1, ""), false); } public LandEquilibriumAbility(final LandEquilibriumAbility ability) { @@ -87,8 +86,8 @@ class LandEquilibriumAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { - int numMyLands = game.getBattlefield().countAll(filter, this.getControllerId(), game); - int theirLands = game.getBattlefield().countAll(filter, event.getPlayerId(), game); + int numMyLands = game.getBattlefield().countAll(StaticFilters.FILTER_LAND, this.getControllerId(), game); + int theirLands = game.getBattlefield().countAll(StaticFilters.FILTER_LAND, event.getPlayerId(), game); if (numMyLands < theirLands) { this.getEffects().get(0).setTargetPointer(new FixedTarget(event.getPlayerId())); return true; diff --git a/Mage.Sets/src/mage/cards/l/LandTax.java b/Mage.Sets/src/mage/cards/l/LandTax.java index 2045ad46103..30b0fe99b28 100644 --- a/Mage.Sets/src/mage/cards/l/LandTax.java +++ b/Mage.Sets/src/mage/cards/l/LandTax.java @@ -27,7 +27,6 @@ */ package mage.cards.l; -import java.util.UUID; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.condition.common.OpponentControlsMoreCondition; import mage.abilities.decorator.ConditionalTriggeredAbility; @@ -36,10 +35,12 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.TargetController; +import mage.filter.StaticFilters; import mage.filter.common.FilterBasicLandCard; -import mage.filter.common.FilterLandPermanent; import mage.target.common.TargetCardInLibrary; +import java.util.UUID; + /** * * @author LevelX2 @@ -52,7 +53,7 @@ public class LandTax extends CardImpl { // At the beginning of your upkeep, if an opponent controls more lands than you, you may search your library for up to three basic land cards, reveal them, and put them into your hand. If you do, shuffle your library. this.addAbility(new ConditionalTriggeredAbility( new BeginningOfUpkeepTriggeredAbility(new SearchLibraryPutInHandEffect(new TargetCardInLibrary(0, 3, new FilterBasicLandCard()), true), TargetController.YOU, true), - new OpponentControlsMoreCondition(new FilterLandPermanent("lands")), + new OpponentControlsMoreCondition(StaticFilters.FILTER_LANDS), "At the beginning of your upkeep, if an opponent controls more lands than you, you may search your library for up to three basic land cards, reveal them, and put them into your hand. If you do, shuffle your library" )); diff --git a/Mage.Sets/src/mage/cards/l/LavaballTrap.java b/Mage.Sets/src/mage/cards/l/LavaballTrap.java index b51e94de928..e803d6a55b1 100644 --- a/Mage.Sets/src/mage/cards/l/LavaballTrap.java +++ b/Mage.Sets/src/mage/cards/l/LavaballTrap.java @@ -27,8 +27,6 @@ */ package mage.cards.l; -import java.util.List; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.condition.Condition; import mage.abilities.costs.AlternativeCostSourceAbility; @@ -38,13 +36,16 @@ import mage.abilities.effects.common.DestroyTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; -import mage.filter.common.FilterLandPermanent; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.common.TargetLandPermanent; import mage.watchers.common.PermanentsEnteredBattlefieldWatcher; +import java.util.List; +import java.util.UUID; + /** * * @author jeffwadsworth @@ -61,7 +62,7 @@ public class LavaballTrap extends CardImpl { // Destroy two target lands. Lavaball Trap deals 4 damage to each creature. this.getSpellAbility().addEffect(new DestroyTargetEffect()); this.getSpellAbility().addEffect(new DamageAllEffect(4, new FilterCreaturePermanent())); - this.getSpellAbility().addTarget(new TargetLandPermanent(2, 2, new FilterLandPermanent("lands"), false)); + this.getSpellAbility().addTarget(new TargetLandPermanent(2, 2, StaticFilters.FILTER_LANDS, false)); } diff --git a/Mage.Sets/src/mage/cards/l/LiegeOfTheTangle.java b/Mage.Sets/src/mage/cards/l/LiegeOfTheTangle.java index f3063ea85bc..2d6414ab23a 100644 --- a/Mage.Sets/src/mage/cards/l/LiegeOfTheTangle.java +++ b/Mage.Sets/src/mage/cards/l/LiegeOfTheTangle.java @@ -39,7 +39,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; import mage.counters.CounterType; -import mage.filter.common.FilterLandPermanent; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.events.DamagedPlayerEvent; import mage.game.events.GameEvent; @@ -82,7 +82,7 @@ class LiegeOfTheTangleTriggeredAbility extends TriggeredAbilityImpl { LiegeOfTheTangleTriggeredAbility() { super(Zone.BATTLEFIELD, new AddCountersTargetEffect(CounterType.AWAKENING.createInstance())); this.addEffect(new LiegeOfTheTangleEffect()); - Target target = new TargetLandPermanent(0, Integer.MAX_VALUE, new FilterLandPermanent(), true); + Target target = new TargetLandPermanent(0, Integer.MAX_VALUE, StaticFilters.FILTER_LANDS, true); this.addTarget(target); } diff --git a/Mage.Sets/src/mage/cards/l/Lifeline.java b/Mage.Sets/src/mage/cards/l/Lifeline.java index d48c2f24fd6..bb11676871c 100644 --- a/Mage.Sets/src/mage/cards/l/Lifeline.java +++ b/Mage.Sets/src/mage/cards/l/Lifeline.java @@ -27,9 +27,7 @@ */ package mage.cards.l; -import java.util.UUID; import mage.abilities.Ability; -import mage.constants.ComparisonType; import mage.abilities.common.DiesCreatureTriggeredAbility; import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; @@ -40,21 +38,19 @@ import mage.abilities.effects.common.ReturnToBattlefieldUnderOwnerControlTargetE import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.TargetController; -import mage.constants.Zone; -import mage.filter.common.FilterCreaturePermanent; +import mage.constants.*; +import mage.filter.StaticFilters; import mage.game.Game; import mage.target.targetpointer.FixedTarget; +import java.util.UUID; + /** * * @author HCrescent */ public class Lifeline extends CardImpl { - -private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature"); + public Lifeline(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{5}"); @@ -62,8 +58,8 @@ private static final FilterCreaturePermanent filter = new FilterCreaturePermanen // Whenever a creature dies, if another creature is on the battlefield, return the first card to the battlefield under its owner's control at the beginning of the next end step. Ability ability = new ConditionalTriggeredAbility( - new DiesCreatureTriggeredAbility( Zone.BATTLEFIELD, new LifelineEffect(), false, filter, true), - new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.MORE_THAN, 0, false), + new DiesCreatureTriggeredAbility( Zone.BATTLEFIELD, new LifelineEffect(), false, StaticFilters.FILTER_PERMANENT_CREATURE, true), + new PermanentsOnTheBattlefieldCondition(StaticFilters.FILTER_PERMANENT_CREATURE, ComparisonType.MORE_THAN, 0, false), "Whenever a creature dies, if another creature is on the battlefield, return the first card to the battlefield under its owner's control at the beginning of the next end step."); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/l/LifesFinale.java b/Mage.Sets/src/mage/cards/l/LifesFinale.java index d8ad5a4f0d9..24eabd2c902 100644 --- a/Mage.Sets/src/mage/cards/l/LifesFinale.java +++ b/Mage.Sets/src/mage/cards/l/LifesFinale.java @@ -27,8 +27,6 @@ */ package mage.cards.l; -import java.util.List; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; @@ -37,14 +35,17 @@ import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; +import mage.filter.StaticFilters; import mage.filter.common.FilterCreatureCard; -import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetCardInLibrary; import mage.target.common.TargetOpponent; +import java.util.List; +import java.util.UUID; + /** * * @author North @@ -87,7 +88,7 @@ class LifesFinaleEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - List permanents = game.getBattlefield().getActivePermanents(new FilterCreaturePermanent(), source.getControllerId(), game); + List permanents = game.getBattlefield().getActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURES, source.getControllerId(), game); for (Permanent permanent : permanents) { permanent.destroy(source.getSourceId(), game, false); } diff --git a/Mage.Sets/src/mage/cards/l/LightningVolley.java b/Mage.Sets/src/mage/cards/l/LightningVolley.java index e3244b376e1..95abda6719b 100644 --- a/Mage.Sets/src/mage/cards/l/LightningVolley.java +++ b/Mage.Sets/src/mage/cards/l/LightningVolley.java @@ -27,7 +27,6 @@ */ package mage.cards.l; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; @@ -39,9 +38,11 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Zone; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import mage.target.common.TargetCreatureOrPlayer; +import java.util.UUID; + /** * * @author LevelX2 @@ -55,7 +56,7 @@ public class LightningVolley extends CardImpl { // Until end of turn, creatures you control gain "{T}: This creature deals 1 damage to target creature or player." Ability grantedAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(1), new TapSourceCost()); grantedAbility.addTarget(new TargetCreatureOrPlayer()); - Effect effect = new GainAbilityControlledEffect(grantedAbility, Duration.EndOfTurn, new FilterCreaturePermanent("Creatures")); + Effect effect = new GainAbilityControlledEffect(grantedAbility, Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES); effect.setText("Until end of turn, creatures you control gain \"{T}: This creature deals 1 damage to target creature or player.\""); this.getSpellAbility().addEffect(effect); } diff --git a/Mage.Sets/src/mage/cards/l/LivingPlane.java b/Mage.Sets/src/mage/cards/l/LivingPlane.java index f1f0d84a0cc..323b413da2a 100644 --- a/Mage.Sets/src/mage/cards/l/LivingPlane.java +++ b/Mage.Sets/src/mage/cards/l/LivingPlane.java @@ -27,7 +27,6 @@ */ package mage.cards.l; -import java.util.UUID; import mage.MageInt; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.continuous.BecomesCreatureAllEffect; @@ -37,9 +36,11 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SuperType; import mage.constants.Zone; -import mage.filter.common.FilterLandPermanent; +import mage.filter.StaticFilters; import mage.game.permanent.token.Token; +import java.util.UUID; + /** * * @author fireshoes @@ -51,7 +52,7 @@ public class LivingPlane extends CardImpl { this.addSuperType(SuperType.WORLD); // All lands are 1/1 creatures that are still lands. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesCreatureAllEffect(new LivingPlaneToken(), "lands", new FilterLandPermanent("lands"), Duration.WhileOnBattlefield))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesCreatureAllEffect(new LivingPlaneToken(), "lands", StaticFilters.FILTER_LANDS, Duration.WhileOnBattlefield))); } public LivingPlane(final LivingPlane card) { diff --git a/Mage.Sets/src/mage/cards/l/LoamDweller.java b/Mage.Sets/src/mage/cards/l/LoamDweller.java index da795e3a7de..00dbe1db5ec 100644 --- a/Mage.Sets/src/mage/cards/l/LoamDweller.java +++ b/Mage.Sets/src/mage/cards/l/LoamDweller.java @@ -27,14 +27,15 @@ */ package mage.cards.l; -import java.util.UUID; import mage.MageInt; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.effects.common.PutLandFromHandOntoBattlefieldEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.filter.StaticFilters; + +import java.util.UUID; /** * @@ -50,7 +51,7 @@ public class LoamDweller extends CardImpl { this.toughness = new MageInt(2); // Whenever you cast a Spirit or Arcane spell, you may put a land card from your hand onto the battlefield tapped. - this.addAbility(new SpellCastControllerTriggeredAbility(new PutLandFromHandOntoBattlefieldEffect(true), new FilterSpiritOrArcaneCard(), true)); + this.addAbility(new SpellCastControllerTriggeredAbility(new PutLandFromHandOntoBattlefieldEffect(true), StaticFilters.SPIRIT_OR_ARCANE_CARD, true)); } public LoamDweller(final LoamDweller card) { diff --git a/Mage.Sets/src/mage/cards/m/MagusOfTheCandelabra.java b/Mage.Sets/src/mage/cards/m/MagusOfTheCandelabra.java index 02375789276..b221dac8290 100644 --- a/Mage.Sets/src/mage/cards/m/MagusOfTheCandelabra.java +++ b/Mage.Sets/src/mage/cards/m/MagusOfTheCandelabra.java @@ -27,7 +27,6 @@ */ package mage.cards.m; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -39,10 +38,12 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; -import mage.filter.common.FilterLandPermanent; +import mage.filter.StaticFilters; import mage.game.Game; import mage.target.common.TargetLandPermanent; +import java.util.UUID; + /** * @author duncant */ @@ -72,7 +73,7 @@ public class MagusOfTheCandelabra extends CardImpl { if (ability.getOriginalId().equals(originalId)){ int xValue = ability.getManaCostsToPay().getX(); ability.getTargets().clear(); - ability.addTarget(new TargetLandPermanent(xValue, xValue, new FilterLandPermanent(), false)); + ability.addTarget(new TargetLandPermanent(xValue, xValue, StaticFilters.FILTER_LANDS, false)); } } diff --git a/Mage.Sets/src/mage/cards/m/ManaBreach.java b/Mage.Sets/src/mage/cards/m/ManaBreach.java index 7ce760a31b7..9318ff04875 100644 --- a/Mage.Sets/src/mage/cards/m/ManaBreach.java +++ b/Mage.Sets/src/mage/cards/m/ManaBreach.java @@ -27,7 +27,6 @@ */ package mage.cards.m; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SpellCastAllTriggeredAbility; import mage.abilities.effects.OneShotEffect; @@ -37,7 +36,7 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SetTargetPointer; import mage.constants.Zone; -import mage.filter.FilterSpell; +import mage.filter.StaticFilters; import mage.filter.common.FilterLandPermanent; import mage.filter.predicate.permanent.ControllerIdPredicate; import mage.game.Game; @@ -45,6 +44,8 @@ import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetLandPermanent; +import java.util.UUID; + /** * * @author LoneFox @@ -56,7 +57,7 @@ public class ManaBreach extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{U}"); // Whenever a player casts a spell, that player returns a land he or she controls to its owner's hand. - this.addAbility(new SpellCastAllTriggeredAbility(new ManaBreachEffect(), new FilterSpell(), false, SetTargetPointer.PLAYER)); + this.addAbility(new SpellCastAllTriggeredAbility(new ManaBreachEffect(), StaticFilters.FILTER_SPELL, false, SetTargetPointer.PLAYER)); } public ManaBreach(final ManaBreach card) { diff --git a/Mage.Sets/src/mage/cards/m/ManaShort.java b/Mage.Sets/src/mage/cards/m/ManaShort.java index 423679897a6..79a2aa5b4a2 100644 --- a/Mage.Sets/src/mage/cards/m/ManaShort.java +++ b/Mage.Sets/src/mage/cards/m/ManaShort.java @@ -27,17 +27,18 @@ */ package mage.cards.m; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.common.TapAllTargetPlayerControlsEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.common.FilterLandPermanent; +import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; import mage.target.TargetPlayer; +import java.util.UUID; + /** * * @author Quercitron @@ -65,7 +66,7 @@ public class ManaShort extends CardImpl { class ManaShortEffect extends TapAllTargetPlayerControlsEffect { public ManaShortEffect() { - super(new FilterLandPermanent("lands")); + super(StaticFilters.FILTER_LANDS); staticText = "Tap all lands target player controls and empty his or her mana pool"; } diff --git a/Mage.Sets/src/mage/cards/m/ManaVortex.java b/Mage.Sets/src/mage/cards/m/ManaVortex.java index 9ad92bfc4c1..d7ec8b27568 100644 --- a/Mage.Sets/src/mage/cards/m/ManaVortex.java +++ b/Mage.Sets/src/mage/cards/m/ManaVortex.java @@ -27,7 +27,6 @@ */ package mage.cards.m; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.StateTriggeredAbility; @@ -43,8 +42,8 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.TargetController; import mage.constants.Zone; +import mage.filter.StaticFilters; import mage.filter.common.FilterControlledLandPermanent; -import mage.filter.common.FilterLandPermanent; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.stack.Spell; @@ -52,13 +51,13 @@ import mage.game.stack.StackObject; import mage.players.Player; import mage.target.common.TargetControlledPermanent; +import java.util.UUID; + /** * * @author fireshoes */ public class ManaVortex extends CardImpl { - - static final FilterLandPermanent filter = new FilterLandPermanent(); public ManaVortex(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{U}{U}"); @@ -67,7 +66,7 @@ public class ManaVortex extends CardImpl { this.addAbility(new CastSourceTriggeredAbility(new CounterSourceEffect())); // At the beginning of each player's upkeep, that player sacrifices a land. - this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SacrificeEffect(new FilterLandPermanent(), 1, "that player"), + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SacrificeEffect(StaticFilters.FILTER_LAND, 1, "that player"), TargetController.ANY, false)); // When there are no lands on the battlefield, sacrifice Mana Vortex. @@ -151,7 +150,7 @@ class ManaVortexStateTriggeredAbility extends StateTriggeredAbility { @Override public boolean checkTrigger(GameEvent event, Game game) { - return game.getBattlefield().count(ManaVortex.filter, this.getSourceId(), this.getControllerId(), game) == 0; + return game.getBattlefield().count(StaticFilters.FILTER_LANDS, this.getSourceId(), this.getControllerId(), game) == 0; } @Override diff --git a/Mage.Sets/src/mage/cards/m/MarchOfSouls.java b/Mage.Sets/src/mage/cards/m/MarchOfSouls.java index 4f4a9b9b04d..5c566b7da15 100644 --- a/Mage.Sets/src/mage/cards/m/MarchOfSouls.java +++ b/Mage.Sets/src/mage/cards/m/MarchOfSouls.java @@ -33,7 +33,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.token.SpiritWhiteToken; @@ -84,7 +84,7 @@ class MarchOfSoulsEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - List creatures = game.getBattlefield().getActivePermanents(new FilterCreaturePermanent(), + List creatures = game.getBattlefield().getActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURES, source.getControllerId(), source.getSourceId(), game); HashMap playersWithCreatures = new HashMap<>(); for(Permanent p : creatures) { diff --git a/Mage.Sets/src/mage/cards/m/MarchesaTheBlackRose.java b/Mage.Sets/src/mage/cards/m/MarchesaTheBlackRose.java index 471f6500103..3d99f17de5c 100644 --- a/Mage.Sets/src/mage/cards/m/MarchesaTheBlackRose.java +++ b/Mage.Sets/src/mage/cards/m/MarchesaTheBlackRose.java @@ -43,7 +43,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; import mage.counters.CounterType; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; @@ -73,7 +73,7 @@ public class MarchesaTheBlackRose extends CardImpl { // Other creatures you control have dethrone. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, - new GainAbilityControlledEffect(new DethroneAbility(), Duration.WhileOnBattlefield, new FilterCreaturePermanent(), true))); + new GainAbilityControlledEffect(new DethroneAbility(), Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURES, true))); // Whenever a creature you control with a +1/+1 counter on it dies, return that card to the battlefield under your control at the beginning of the next end step. this.addAbility(new MarchesaTheBlackRoseTriggeredAbility()); diff --git a/Mage.Sets/src/mage/cards/m/MarshCasualties.java b/Mage.Sets/src/mage/cards/m/MarshCasualties.java index 461b76d34cb..80f4b1eba98 100644 --- a/Mage.Sets/src/mage/cards/m/MarshCasualties.java +++ b/Mage.Sets/src/mage/cards/m/MarshCasualties.java @@ -27,8 +27,6 @@ */ package mage.cards.m; -import java.util.Iterator; -import java.util.UUID; import mage.MageObjectReference; import mage.abilities.Ability; import mage.abilities.condition.LockedInCondition; @@ -39,11 +37,14 @@ import mage.abilities.keyword.KickerAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.TargetPlayer; +import java.util.Iterator; +import java.util.UUID; + /** * * @author North @@ -105,7 +106,7 @@ class MarshCasualtiesEffect extends ContinuousEffectImpl { public void init(Ability source, Game game) { super.init(source, game); if (this.affectedObjectsSet) { - for (Permanent creature : game.getBattlefield().getAllActivePermanents(new FilterCreaturePermanent(), source.getFirstTarget(), game)) { + for (Permanent creature : game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURES, source.getFirstTarget(), game)) { affectedObjectList.add(new MageObjectReference(creature, game)); } } diff --git a/Mage.Sets/src/mage/cards/m/MartialCoup.java b/Mage.Sets/src/mage/cards/m/MartialCoup.java index 0820f4d6000..7bb6b8de0e7 100644 --- a/Mage.Sets/src/mage/cards/m/MartialCoup.java +++ b/Mage.Sets/src/mage/cards/m/MartialCoup.java @@ -27,19 +27,20 @@ */ package mage.cards.m; -import java.util.List; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.token.SoldierToken; +import java.util.List; +import java.util.UUID; + /** * * @author BetaSteward_at_googlemail.com @@ -87,7 +88,7 @@ class MartialCoupEffect extends OneShotEffect { token.putOntoBattlefield(amount, game, source.getSourceId(), source.getControllerId()); List tokens = token.getLastAddedTokenIds(); if (amount > 4) { - for (Permanent permanent : game.getBattlefield().getActivePermanents(new FilterCreaturePermanent(), source.getControllerId(), game)) { + for (Permanent permanent : game.getBattlefield().getActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURES, source.getControllerId(), game)) { if (!tokens.contains(permanent.getId())) { permanent.destroy(source.getSourceId(), game, false); } diff --git a/Mage.Sets/src/mage/cards/m/MeletisCharlatan.java b/Mage.Sets/src/mage/cards/m/MeletisCharlatan.java index d500fa27a5a..079bd0d6923 100644 --- a/Mage.Sets/src/mage/cards/m/MeletisCharlatan.java +++ b/Mage.Sets/src/mage/cards/m/MeletisCharlatan.java @@ -27,7 +27,6 @@ */ package mage.cards.m; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -39,9 +38,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.FilterSpell; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.stack.Spell; import mage.game.stack.StackObject; @@ -49,20 +46,14 @@ import mage.players.Player; import mage.target.Target; import mage.target.TargetSpell; +import java.util.UUID; + /** * * @author LevelX2 */ public class MeletisCharlatan extends CardImpl { - private static final FilterSpell filter = new FilterSpell("instant or sorcery spell"); - - static { - filter.add(Predicates.or( - new CardTypePredicate(CardType.INSTANT), - new CardTypePredicate(CardType.SORCERY))); - } - public MeletisCharlatan(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{U}"); this.subtype.add("Human"); @@ -74,7 +65,7 @@ public class MeletisCharlatan extends CardImpl { // {2}{U}, {T}: The controller of target instant or sorcery spell copies it. That player may choose new targets for the copy. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new MeletisCharlatanCopyTargetSpellEffect(), new ManaCostsImpl("{2}{U}")); ability.addCost(new TapSourceCost()); - Target target = new TargetSpell(filter); + Target target = new TargetSpell(StaticFilters.FILTER_INSTANT_OR_SORCERY_SPELL); ability.addTarget(target); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/m/MercurialGeists.java b/Mage.Sets/src/mage/cards/m/MercurialGeists.java index afff551fbbd..4c3c3410eea 100644 --- a/Mage.Sets/src/mage/cards/m/MercurialGeists.java +++ b/Mage.Sets/src/mage/cards/m/MercurialGeists.java @@ -27,7 +27,6 @@ */ package mage.cards.m; -import java.util.UUID; import mage.MageInt; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.effects.common.continuous.BoostSourceEffect; @@ -36,9 +35,9 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.filter.FilterSpell; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.StaticFilters; + +import java.util.UUID; /** * @@ -46,14 +45,6 @@ import mage.filter.predicate.mageobject.CardTypePredicate; */ public class MercurialGeists extends CardImpl { - private static final FilterSpell filter = new FilterSpell("instant or sorcery spell"); - - static { - filter.add(Predicates.or( - new CardTypePredicate(CardType.INSTANT), - new CardTypePredicate(CardType.SORCERY))); - } - public MercurialGeists(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{U}{R}"); this.subtype.add("Spirit"); @@ -64,7 +55,7 @@ public class MercurialGeists extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Whenever you cast an instant or sorcery spell, Mercurial Geists gets +3/+0 until end of turn. - this.addAbility(new SpellCastControllerTriggeredAbility(new BoostSourceEffect(3, 0, Duration.EndOfTurn), filter, false)); + this.addAbility(new SpellCastControllerTriggeredAbility(new BoostSourceEffect(3, 0, Duration.EndOfTurn), StaticFilters.FILTER_INSTANT_OR_SORCERY_SPELL, false)); } public MercurialGeists(final MercurialGeists card) { diff --git a/Mage.Sets/src/mage/cards/m/MimingSlime.java b/Mage.Sets/src/mage/cards/m/MimingSlime.java index 2e6a54f33d5..6f7496b2198 100644 --- a/Mage.Sets/src/mage/cards/m/MimingSlime.java +++ b/Mage.Sets/src/mage/cards/m/MimingSlime.java @@ -33,7 +33,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.token.OozeToken; @@ -85,7 +85,7 @@ class MimingSlimeEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); if (player != null) { - List creatures = game.getBattlefield().getAllActivePermanents(new FilterCreaturePermanent(), player.getId(), game); + List creatures = game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURES, player.getId(), game); int amount = 0; for (Permanent creature : creatures) { int power = creature.getPower().getValue(); diff --git a/Mage.Sets/src/mage/cards/m/MinamosMeddling.java b/Mage.Sets/src/mage/cards/m/MinamosMeddling.java index 5aed0d2d4b3..609b657ce45 100644 --- a/Mage.Sets/src/mage/cards/m/MinamosMeddling.java +++ b/Mage.Sets/src/mage/cards/m/MinamosMeddling.java @@ -31,15 +31,11 @@ import mage.MageObject; import mage.abilities.Ability; import mage.abilities.SpellAbility; import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.cards.Cards; -import mage.cards.CardsImpl; +import mage.cards.*; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SpellAbilityType; -import mage.filter.FilterSpell; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.stack.Spell; import mage.players.Player; @@ -59,7 +55,7 @@ public class MinamosMeddling extends CardImpl { // Counter target spell. That spell's controller reveals his or her hand, then discards each card with the same name as a card spliced onto that spell. - this.getSpellAbility().addTarget(new TargetSpell(new FilterSpell())); + this.getSpellAbility().addTarget(new TargetSpell(StaticFilters.FILTER_SPELL)); this.getSpellAbility().addEffect(new MinamosMeddlingCounterTargetEffect()); } diff --git a/Mage.Sets/src/mage/cards/m/MindsDilation.java b/Mage.Sets/src/mage/cards/m/MindsDilation.java index 3d5ad7e4b2e..aad9499b1d6 100644 --- a/Mage.Sets/src/mage/cards/m/MindsDilation.java +++ b/Mage.Sets/src/mage/cards/m/MindsDilation.java @@ -27,8 +27,6 @@ */ package mage.cards.m; -import java.util.List; -import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.SpellCastOpponentTriggeredAbility; @@ -40,7 +38,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.FilterSpell; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.stack.Spell; @@ -48,6 +46,9 @@ import mage.players.Player; import mage.target.targetpointer.FixedTarget; import mage.watchers.common.SpellsCastWatcher; +import java.util.List; +import java.util.UUID; + /** * * @author fireshoes @@ -75,7 +76,7 @@ public class MindsDilation extends CardImpl { class MindsDilationTriggeredAbility extends SpellCastOpponentTriggeredAbility { public MindsDilationTriggeredAbility(Effect effect, boolean optional) { - super(Zone.BATTLEFIELD, effect, new FilterSpell(), optional); + super(Zone.BATTLEFIELD, effect, StaticFilters.FILTER_SPELL, optional); } public MindsDilationTriggeredAbility(SpellCastOpponentTriggeredAbility ability) { diff --git a/Mage.Sets/src/mage/cards/m/MischievousQuanar.java b/Mage.Sets/src/mage/cards/m/MischievousQuanar.java index 3d20a6cc9cd..936d6f739c4 100644 --- a/Mage.Sets/src/mage/cards/m/MischievousQuanar.java +++ b/Mage.Sets/src/mage/cards/m/MischievousQuanar.java @@ -27,7 +27,6 @@ */ package mage.cards.m; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -42,24 +41,16 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Zone; -import mage.filter.FilterSpell; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.StaticFilters; import mage.target.TargetSpell; +import java.util.UUID; + /** * * @author fireshoes */ public class MischievousQuanar extends CardImpl { - - private static final FilterSpell filter = new FilterSpell("instant or sorcery spell"); - - static { - filter.add(Predicates.or( - new CardTypePredicate(CardType.INSTANT), - new CardTypePredicate(CardType.SORCERY))); - } public MischievousQuanar(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{U}"); @@ -79,7 +70,7 @@ public class MischievousQuanar extends CardImpl { Effect effect2 = new CopyTargetSpellEffect(); effect2.setText("copy target instant or sorcery spell. You may choose new targets for that copy"); Ability ability = new TurnedFaceUpSourceTriggeredAbility(effect2); - ability.addTarget(new TargetSpell(filter)); + ability.addTarget(new TargetSpell(StaticFilters.FILTER_INSTANT_OR_SORCERY_SPELL)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/m/MishrasHelix.java b/Mage.Sets/src/mage/cards/m/MishrasHelix.java index a05e4e11d11..d8447abb581 100644 --- a/Mage.Sets/src/mage/cards/m/MishrasHelix.java +++ b/Mage.Sets/src/mage/cards/m/MishrasHelix.java @@ -27,7 +27,6 @@ */ package mage.cards.m; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; @@ -38,10 +37,12 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; -import mage.filter.common.FilterLandPermanent; +import mage.filter.StaticFilters; import mage.game.Game; import mage.target.common.TargetLandPermanent; +import java.util.UUID; + /** * * @author fireshoes @@ -66,7 +67,7 @@ public class MishrasHelix extends CardImpl { if (ability.getOriginalId().equals(originalId)){ int xValue = ability.getManaCostsToPay().getX(); ability.getTargets().clear(); - ability.addTarget(new TargetLandPermanent(xValue, xValue, new FilterLandPermanent(), false)); + ability.addTarget(new TargetLandPermanent(xValue, xValue, StaticFilters.FILTER_LANDS, false)); } } diff --git a/Mage.Sets/src/mage/cards/m/Misstep.java b/Mage.Sets/src/mage/cards/m/Misstep.java index a988b3b324c..090523fa739 100644 --- a/Mage.Sets/src/mage/cards/m/Misstep.java +++ b/Mage.Sets/src/mage/cards/m/Misstep.java @@ -27,24 +27,25 @@ */ package mage.cards.m; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DontUntapInControllersNextUntapStepTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; -import mage.filter.common.FilterCreaturePermanent; -import mage.abilities.effects.common.DontUntapInControllersNextUntapStepTargetEffect; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.TargetPlayer; import mage.target.targetpointer.FixedTargets; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + /** * * @author djbrez @@ -90,7 +91,7 @@ class MisstepEffect extends OneShotEffect { Player player = game.getPlayer(source.getFirstTarget()); if (player != null) { List doNotUntapNextUntapStep = new ArrayList<>(); - for (Permanent creature : game.getBattlefield().getAllActivePermanents(new FilterCreaturePermanent(), player.getId(), game)) { + for (Permanent creature : game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURES, player.getId(), game)) { doNotUntapNextUntapStep.add(creature); } if (!doNotUntapNextUntapStep.isEmpty()) { diff --git a/Mage.Sets/src/mage/cards/m/MistbindClique.java b/Mage.Sets/src/mage/cards/m/MistbindClique.java index 2b7fc6b56c1..76f3901fb7d 100644 --- a/Mage.Sets/src/mage/cards/m/MistbindClique.java +++ b/Mage.Sets/src/mage/cards/m/MistbindClique.java @@ -27,7 +27,6 @@ */ package mage.cards.m; -import java.util.UUID; import mage.MageInt; import mage.abilities.common.ZoneChangeTriggeredAbility; import mage.abilities.effects.common.TapAllTargetPlayerControlsEffect; @@ -39,12 +38,14 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; -import mage.filter.common.FilterLandPermanent; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.target.TargetPlayer; +import java.util.UUID; + /** * * @author LevelX2 @@ -84,7 +85,7 @@ class MistbindCliqueAbility extends ZoneChangeTriggeredAbility { public MistbindCliqueAbility() { // ability has to trigger independant where the source object is now - super(Zone.ALL, Zone.BATTLEFIELD, Zone.EXILED, new TapAllTargetPlayerControlsEffect(new FilterLandPermanent("lands")), "When a Faerie is championed with {this}, ", false); + super(Zone.ALL, Zone.BATTLEFIELD, Zone.EXILED, new TapAllTargetPlayerControlsEffect(StaticFilters.FILTER_LANDS), "When a Faerie is championed with {this}, ", false); this.addTarget(new TargetPlayer()); } diff --git a/Mage.Sets/src/mage/cards/m/MoltenInfluence.java b/Mage.Sets/src/mage/cards/m/MoltenInfluence.java index f1e02c3fb74..ae998627326 100644 --- a/Mage.Sets/src/mage/cards/m/MoltenInfluence.java +++ b/Mage.Sets/src/mage/cards/m/MoltenInfluence.java @@ -27,40 +27,31 @@ */ package mage.cards.m; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; -import mage.filter.FilterSpell; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.stack.Spell; import mage.players.Player; import mage.target.TargetSpell; +import java.util.UUID; + /** * * @author cbt33, LevelX2 (Quash) */ public class MoltenInfluence extends CardImpl { - private static final FilterSpell filter = new FilterSpell("instant or sorcery spell"); - - static { - Predicates.or( - new CardTypePredicate(CardType.INSTANT), - new CardTypePredicate(CardType.SORCERY)); - } - public MoltenInfluence(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{R}"); // Counter target instant or sorcery spell unless its controller has Molten Influence deal 4 damage to him or her. - this.getSpellAbility().addTarget(new TargetSpell(filter)); + this.getSpellAbility().addTarget(new TargetSpell(StaticFilters.FILTER_INSTANT_OR_SORCERY_SPELL)); this.getSpellAbility().addEffect(new MoltenInfluenceEffect()); } diff --git a/Mage.Sets/src/mage/cards/m/Mortuary.java b/Mage.Sets/src/mage/cards/m/Mortuary.java index cdfbf8f1a75..700b9bc6ef1 100644 --- a/Mage.Sets/src/mage/cards/m/Mortuary.java +++ b/Mage.Sets/src/mage/cards/m/Mortuary.java @@ -27,27 +27,27 @@ */ package mage.cards.m; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.PutIntoGraveFromBattlefieldAllTriggeredAbility; import mage.abilities.effects.common.PutOnLibraryTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; + +import java.util.UUID; /** * * @author HCrescent */ public class Mortuary extends CardImpl { - - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature"); + public Mortuary(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}"); - Ability ability = new PutIntoGraveFromBattlefieldAllTriggeredAbility(new PutOnLibraryTargetEffect(true, "put that card on top of your library."), false, filter, true, true); + Ability ability = new PutIntoGraveFromBattlefieldAllTriggeredAbility(new PutOnLibraryTargetEffect(true, "put that card on top of your library."), false, StaticFilters.FILTER_PERMANENT_CREATURE, true, true); // Whenever a creature is put into your graveyard from the battlefield, put that card on top of your library. this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/m/Mutilate.java b/Mage.Sets/src/mage/cards/m/Mutilate.java index 2adcec92131..c39250acfbc 100644 --- a/Mage.Sets/src/mage/cards/m/Mutilate.java +++ b/Mage.Sets/src/mage/cards/m/Mutilate.java @@ -27,21 +27,22 @@ */ package mage.cards.m; -import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.SubType; -import mage.constants.TargetController; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.common.continuous.BoostAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.filter.common.FilterCreaturePermanent; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.constants.TargetController; +import mage.filter.StaticFilters; import mage.filter.common.FilterLandPermanent; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.filter.predicate.permanent.ControllerPredicate; +import java.util.UUID; + /** * @@ -64,7 +65,7 @@ public class Mutilate extends CardImpl { // All creatures get -1/-1 until end of turn for each Swamp you control. PermanentsOnBattlefieldCount count = new PermanentsOnBattlefieldCount(filter, -1); - ContinuousEffect effect = new BoostAllEffect(count, count, Duration.EndOfTurn, new FilterCreaturePermanent(), false, null, true); + ContinuousEffect effect = new BoostAllEffect(count, count, Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES, false, null, true); effect.overrideRuleText(ruleText); this.getSpellAbility().addEffect(effect); } diff --git a/Mage.Sets/src/mage/cards/m/MyojinOfInfiniteRage.java b/Mage.Sets/src/mage/cards/m/MyojinOfInfiniteRage.java index 3f39280b9f1..bc3a467830b 100644 --- a/Mage.Sets/src/mage/cards/m/MyojinOfInfiniteRage.java +++ b/Mage.Sets/src/mage/cards/m/MyojinOfInfiniteRage.java @@ -47,7 +47,7 @@ import mage.constants.Duration; import mage.constants.SuperType; import mage.constants.Zone; import mage.counters.CounterType; -import mage.filter.common.FilterLandPermanent; +import mage.filter.StaticFilters; import mage.watchers.common.CastFromHandWatcher; import java.util.UUID; @@ -57,8 +57,6 @@ import java.util.UUID; */ public class MyojinOfInfiniteRage extends CardImpl { - private static final FilterLandPermanent filter = new FilterLandPermanent("lands"); - public MyojinOfInfiniteRage(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{7}{R}{R}{R}"); addSuperType(SuperType.LEGENDARY); @@ -75,7 +73,7 @@ public class MyojinOfInfiniteRage extends CardImpl { this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect(new GainAbilitySourceEffect(IndestructibleAbility.getInstance(), Duration.WhileOnBattlefield), new SourceHasCounterCondition(CounterType.DIVINITY), "{this} is indestructible as long as it has a divinity counter on it"))); // Remove a divinity counter from Myojin of Infinite Rage: Destroy all lands. - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyAllEffect(filter), new RemoveCountersSourceCost(CounterType.DIVINITY.createInstance()))); + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyAllEffect(StaticFilters.FILTER_LANDS), new RemoveCountersSourceCost(CounterType.DIVINITY.createInstance()))); } public MyojinOfInfiniteRage(final MyojinOfInfiniteRage card) { diff --git a/Mage.Sets/src/mage/cards/m/MyrSuperion.java b/Mage.Sets/src/mage/cards/m/MyrSuperion.java index c0f3fa476ee..fb688b1bf71 100644 --- a/Mage.Sets/src/mage/cards/m/MyrSuperion.java +++ b/Mage.Sets/src/mage/cards/m/MyrSuperion.java @@ -27,7 +27,6 @@ */ package mage.cards.m; -import java.util.UUID; import mage.MageInt; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.InfoEffect; @@ -35,7 +34,9 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; + +import java.util.UUID; /** * @@ -43,7 +44,6 @@ import mage.filter.common.FilterCreaturePermanent; */ public class MyrSuperion extends CardImpl { - private static FilterCreaturePermanent filter = new FilterCreaturePermanent(); public MyrSuperion(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{2}"); @@ -54,8 +54,8 @@ public class MyrSuperion extends CardImpl { // Spend only mana produced by creatures to cast Myr Superion. this.addAbility(new SimpleStaticAbility(Zone.ALL, new InfoEffect("Spend only mana produced by creatures to cast {this}"))); - this.getSpellAbility().getManaCostsToPay().setSourceFilter(filter); - this.getSpellAbility().getManaCosts().setSourceFilter(filter); + this.getSpellAbility().getManaCostsToPay().setSourceFilter(StaticFilters.FILTER_PERMANENT_CREATURES); + this.getSpellAbility().getManaCosts().setSourceFilter(StaticFilters.FILTER_PERMANENT_CREATURES); } public MyrSuperion(final MyrSuperion card) { diff --git a/Mage.Sets/src/mage/cards/n/Narcolepsy.java b/Mage.Sets/src/mage/cards/n/Narcolepsy.java index d1346d84640..d2d1d0c9832 100644 --- a/Mage.Sets/src/mage/cards/n/Narcolepsy.java +++ b/Mage.Sets/src/mage/cards/n/Narcolepsy.java @@ -27,7 +27,6 @@ */ package mage.cards.n; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.effects.OneShotEffect; @@ -38,18 +37,19 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.TargetController; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.TargetPermanent; +import java.util.UUID; + /** * * @author jeffwadsworth */ public class Narcolepsy extends CardImpl { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature"); public Narcolepsy(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{U}"); @@ -57,7 +57,7 @@ public class Narcolepsy extends CardImpl { // Enchant creature - TargetPermanent auraTarget = new TargetPermanent(filter); + TargetPermanent auraTarget = new TargetPermanent(StaticFilters.FILTER_PERMANENT_CREATURE); this.getSpellAbility().addTarget(auraTarget); this.getSpellAbility().addEffect(new AttachEffect(Outcome.Detriment)); EnchantAbility ability = new EnchantAbility(auraTarget.getTargetName()); diff --git a/Mage.Sets/src/mage/cards/n/NaturesWill.java b/Mage.Sets/src/mage/cards/n/NaturesWill.java index 4ba7e84e89b..c717da3575c 100644 --- a/Mage.Sets/src/mage/cards/n/NaturesWill.java +++ b/Mage.Sets/src/mage/cards/n/NaturesWill.java @@ -36,7 +36,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.common.FilterLandPermanent; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.events.DamagedPlayerEvent; import mage.game.events.GameEvent; @@ -152,8 +152,7 @@ class NaturesWillEffect extends OneShotEffect { return false; } - FilterLandPermanent filter = new FilterLandPermanent(); - List lands = game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game); + List lands = game.getBattlefield().getActivePermanents(StaticFilters.FILTER_LAND, source.getControllerId(), source.getSourceId(), game); for (Permanent land : lands) { if (damagedPlayers.contains(land.getControllerId())) { land.tap(game); diff --git a/Mage.Sets/src/mage/cards/n/NiblisOfFrost.java b/Mage.Sets/src/mage/cards/n/NiblisOfFrost.java index 120870dedd1..3e22f958494 100644 --- a/Mage.Sets/src/mage/cards/n/NiblisOfFrost.java +++ b/Mage.Sets/src/mage/cards/n/NiblisOfFrost.java @@ -27,7 +27,6 @@ */ package mage.cards.n; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SpellCastControllerTriggeredAbility; @@ -39,27 +38,22 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.TargetController; -import mage.filter.FilterSpell; +import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; import mage.filter.predicate.permanent.ControllerPredicate; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** * * @author fireshoes */ public class NiblisOfFrost extends CardImpl { - - private static final FilterSpell filterSpell = new FilterSpell("instant or sorcery spell"); private static final FilterCreaturePermanent filterCreature = new FilterCreaturePermanent("creature an opponent controls"); static { filterCreature.add(new ControllerPredicate(TargetController.OPPONENT)); - filterSpell.add(Predicates.or( - new CardTypePredicate(CardType.INSTANT), - new CardTypePredicate(CardType.SORCERY))); } public NiblisOfFrost(UUID ownerId, CardSetInfo setInfo) { @@ -75,7 +69,7 @@ public class NiblisOfFrost extends CardImpl { this.addAbility(new ProwessAbility()); // Whenever you cast an instant or sorcery spell, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step. - Ability ability = new SpellCastControllerTriggeredAbility(new TapTargetEffect(), filterSpell, false); + Ability ability = new SpellCastControllerTriggeredAbility(new TapTargetEffect(), StaticFilters.FILTER_INSTANT_OR_SORCERY_SPELL, false); ability.addTarget(new TargetCreaturePermanent(filterCreature)); ability.addEffect(new DontUntapInControllersNextUntapStepTargetEffect("That creature")); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/n/NikkoOnna.java b/Mage.Sets/src/mage/cards/n/NikkoOnna.java index 0cd88b001eb..d3620d135d4 100644 --- a/Mage.Sets/src/mage/cards/n/NikkoOnna.java +++ b/Mage.Sets/src/mage/cards/n/NikkoOnna.java @@ -27,7 +27,6 @@ */ package mage.cards.n; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; @@ -37,17 +36,18 @@ import mage.abilities.effects.common.ReturnToHandSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.filter.StaticFilters; import mage.target.common.TargetEnchantmentPermanent; +import java.util.UUID; + /** - * * @author Loki */ public class NikkoOnna extends CardImpl { public NikkoOnna(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}"); this.subtype.add("Spirit"); this.power = new MageInt(2); @@ -59,7 +59,7 @@ public class NikkoOnna extends CardImpl { this.addAbility(ability); // Whenever you cast a Spirit or Arcane spell, you may return Nikko-Onna to its owner's hand. - this.addAbility(new SpellCastControllerTriggeredAbility(new ReturnToHandSourceEffect(true), new FilterSpiritOrArcaneCard(), true)); + this.addAbility(new SpellCastControllerTriggeredAbility(new ReturnToHandSourceEffect(true), StaticFilters.SPIRIT_OR_ARCANE_CARD, true)); } public NikkoOnna(final NikkoOnna card) { diff --git a/Mage.Sets/src/mage/cards/n/NissaSageAnimist.java b/Mage.Sets/src/mage/cards/n/NissaSageAnimist.java index 6f5d6854612..0473a381b8b 100644 --- a/Mage.Sets/src/mage/cards/n/NissaSageAnimist.java +++ b/Mage.Sets/src/mage/cards/n/NissaSageAnimist.java @@ -27,7 +27,6 @@ */ package mage.cards.n; -import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; @@ -41,13 +40,15 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.cards.CardsImpl; import mage.constants.*; -import mage.filter.common.FilterLandPermanent; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.token.NissaSageAnimistToken; import mage.players.Player; import mage.target.common.TargetLandPermanent; +import java.util.UUID; + /** * * @author emerald000 @@ -71,7 +72,7 @@ public class NissaSageAnimist extends CardImpl { // -7: Untap up to six target lands. They become 6/6 Elemental creatures. They're still lands. Ability ability = new LoyaltyAbility(new UntapTargetEffect(), -7); - ability.addTarget(new TargetLandPermanent(0, 6, new FilterLandPermanent("lands"), false)); + ability.addTarget(new TargetLandPermanent(0, 6, StaticFilters.FILTER_LANDS, false)); ability.addEffect(new NissaSageAnimistMinusSevenEffect()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/n/NoContest.java b/Mage.Sets/src/mage/cards/n/NoContest.java index 798459dc025..1a9ef1a4178 100644 --- a/Mage.Sets/src/mage/cards/n/NoContest.java +++ b/Mage.Sets/src/mage/cards/n/NoContest.java @@ -34,6 +34,7 @@ import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.PowerPredicate; import mage.game.Game; @@ -84,7 +85,7 @@ class TargetCreatureWithLessPowerPermanent extends TargetPermanent { public boolean canChoose(UUID sourceId, UUID sourceControllerId, Game game) { int maxPower = Integer.MIN_VALUE; // get the most poerful controlled creature that can be targeted Card sourceCard = game.getCard(sourceId); - for (Permanent permanent : game.getBattlefield().getAllActivePermanents(new FilterCreaturePermanent(), sourceControllerId, game)) { + for (Permanent permanent : game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURES, sourceControllerId, game)) { if (permanent.getPower().getValue() > maxPower && permanent.canBeTargetedBy(sourceCard, sourceControllerId, game)) { maxPower = permanent.getPower().getValue(); } diff --git a/Mage.Sets/src/mage/cards/n/NumotTheDevastator.java b/Mage.Sets/src/mage/cards/n/NumotTheDevastator.java index f8e74fb52bf..9a1f1e6425c 100644 --- a/Mage.Sets/src/mage/cards/n/NumotTheDevastator.java +++ b/Mage.Sets/src/mage/cards/n/NumotTheDevastator.java @@ -39,7 +39,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SuperType; -import mage.filter.common.FilterLandPermanent; +import mage.filter.StaticFilters; import mage.target.common.TargetLandPermanent; import java.util.UUID; @@ -65,7 +65,7 @@ public class NumotTheDevastator extends CardImpl { effect.setText("destroy up to two target lands"); Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility( new DoIfCostPaid(effect, new ManaCostsImpl("{2}{R}")), false); - ability.addTarget(new TargetLandPermanent(0,2, new FilterLandPermanent("lands"), false)); + ability.addTarget(new TargetLandPermanent(0,2, StaticFilters.FILTER_LANDS, false)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/o/OddsEnds.java b/Mage.Sets/src/mage/cards/o/OddsEnds.java index e7e0fd23916..3445100988d 100644 --- a/Mage.Sets/src/mage/cards/o/OddsEnds.java +++ b/Mage.Sets/src/mage/cards/o/OddsEnds.java @@ -27,7 +27,6 @@ */ package mage.cards.o; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CopyTargetSpellEffect; @@ -37,32 +36,24 @@ import mage.cards.SplitCard; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SpellAbilityType; -import mage.filter.FilterSpell; +import mage.filter.StaticFilters; import mage.filter.common.FilterAttackingCreature; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; import mage.game.Game; import mage.players.Player; import mage.target.TargetPlayer; import mage.target.TargetSpell; +import java.util.UUID; + public class OddsEnds extends SplitCard { - private static final FilterSpell filter = new FilterSpell("instant or sorcery spell"); - - static { - filter.add(Predicates.or( - new CardTypePredicate(CardType.INSTANT), - new CardTypePredicate(CardType.SORCERY))); - } - public OddsEnds(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{U}{R}", "{3}{R}{W}", SpellAbilityType.SPLIT); // Odds // Flip a coin. If it comes up heads, counter target instant or sorcery spell. If it comes up tails, copy that spell and you may choose new targets for the copy. getLeftHalfCard().getSpellAbility().addEffect(new OddsEffect()); - getLeftHalfCard().getSpellAbility().addTarget(new TargetSpell(filter)); + getLeftHalfCard().getSpellAbility().addTarget(new TargetSpell(StaticFilters.FILTER_INSTANT_OR_SORCERY_SPELL)); // Ends // Target player sacrifices two attacking creatures. diff --git a/Mage.Sets/src/mage/cards/o/OrbweaverKumo.java b/Mage.Sets/src/mage/cards/o/OrbweaverKumo.java index d831d63eace..e89711bba6d 100644 --- a/Mage.Sets/src/mage/cards/o/OrbweaverKumo.java +++ b/Mage.Sets/src/mage/cards/o/OrbweaverKumo.java @@ -28,9 +28,6 @@ package mage.cards.o; -import java.util.UUID; - -import mage.constants.CardType; import mage.MageInt; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; @@ -38,16 +35,17 @@ import mage.abilities.keyword.ForestwalkAbility; import mage.abilities.keyword.ReachAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.constants.CardType; import mage.constants.Duration; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.filter.StaticFilters; + +import java.util.UUID; /** * @author Loki */ public class OrbweaverKumo extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); - public OrbweaverKumo(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{G}{G}"); this.subtype.add("Spirit"); @@ -55,7 +53,7 @@ public class OrbweaverKumo extends CardImpl { this.power = new MageInt(3); this.toughness = new MageInt(4); this.addAbility(ReachAbility.getInstance()); - this.addAbility(new SpellCastControllerTriggeredAbility(new GainAbilitySourceEffect(new ForestwalkAbility(), Duration.EndOfTurn), filter, false)); + this.addAbility(new SpellCastControllerTriggeredAbility(new GainAbilitySourceEffect(new ForestwalkAbility(), Duration.EndOfTurn), StaticFilters.SPIRIT_OR_ARCANE_CARD, false)); } public OrbweaverKumo(final OrbweaverKumo card) { diff --git a/Mage.Sets/src/mage/cards/o/OrderChaos.java b/Mage.Sets/src/mage/cards/o/OrderChaos.java index 6edc36300c9..1eee125dd53 100644 --- a/Mage.Sets/src/mage/cards/o/OrderChaos.java +++ b/Mage.Sets/src/mage/cards/o/OrderChaos.java @@ -27,7 +27,6 @@ */ package mage.cards.o; -import java.util.UUID; import mage.abilities.effects.common.ExileTargetEffect; import mage.abilities.effects.common.combat.CantBlockAllEffect; import mage.cards.CardSetInfo; @@ -35,10 +34,12 @@ import mage.cards.SplitCard; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SpellAbilityType; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import mage.target.Target; import mage.target.common.TargetAttackingCreature; +import java.util.UUID; + public class OrderChaos extends SplitCard { public OrderChaos(UUID ownerId, CardSetInfo setInfo) { @@ -52,7 +53,7 @@ public class OrderChaos extends SplitCard { // Chaos // Creatures can't block this turn. - getRightHalfCard().getSpellAbility().addEffect(new CantBlockAllEffect(new FilterCreaturePermanent("Creatures"), Duration.EndOfTurn)); + getRightHalfCard().getSpellAbility().addEffect(new CantBlockAllEffect(StaticFilters.FILTER_PERMANENT_CREATURES, Duration.EndOfTurn)); } diff --git a/Mage.Sets/src/mage/cards/o/OreGorger.java b/Mage.Sets/src/mage/cards/o/OreGorger.java index 356487f9641..a7696671bcf 100644 --- a/Mage.Sets/src/mage/cards/o/OreGorger.java +++ b/Mage.Sets/src/mage/cards/o/OreGorger.java @@ -28,32 +28,30 @@ package mage.cards.o; -import java.util.UUID; - -import mage.constants.CardType; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.effects.common.DestroyTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.constants.CardType; +import mage.filter.StaticFilters; import mage.target.common.TargetNonBasicLandPermanent; +import java.util.UUID; + /** * @author Loki */ public class OreGorger extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); - public OreGorger(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{R}{R}"); this.subtype.add("Spirit"); this.power = new MageInt(3); this.toughness = new MageInt(1); - Ability ability = new SpellCastControllerTriggeredAbility(new DestroyTargetEffect(), filter, true); + Ability ability = new SpellCastControllerTriggeredAbility(new DestroyTargetEffect(), StaticFilters.SPIRIT_OR_ARCANE_CARD, true); ability.addTarget(new TargetNonBasicLandPermanent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/o/Outwit.java b/Mage.Sets/src/mage/cards/o/Outwit.java index 0d0d0156dbd..5722bfad1ed 100644 --- a/Mage.Sets/src/mage/cards/o/Outwit.java +++ b/Mage.Sets/src/mage/cards/o/Outwit.java @@ -35,6 +35,7 @@ import mage.constants.CardType; import mage.constants.Zone; import mage.filter.Filter; import mage.filter.FilterSpell; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.stack.Spell; import mage.game.stack.StackObject; @@ -79,7 +80,7 @@ public class Outwit extends CardImpl { protected FilterSpell filter; public CustomTargetSpell() { - this(1, 1, new FilterSpell()); + this(1, 1, StaticFilters.FILTER_SPELL); } public CustomTargetSpell(FilterSpell filter) { diff --git a/Mage.Sets/src/mage/cards/o/OyobiWhoSplitTheHeavens.java b/Mage.Sets/src/mage/cards/o/OyobiWhoSplitTheHeavens.java index 5f885d8e9e6..38f47cc99f9 100644 --- a/Mage.Sets/src/mage/cards/o/OyobiWhoSplitTheHeavens.java +++ b/Mage.Sets/src/mage/cards/o/OyobiWhoSplitTheHeavens.java @@ -27,7 +27,6 @@ */ package mage.cards.o; -import java.util.UUID; import mage.MageInt; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.effects.common.CreateTokenEffect; @@ -36,16 +35,16 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SuperType; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.filter.StaticFilters; import mage.game.permanent.token.AnotherSpiritToken; +import java.util.UUID; + /** * @author Loki */ public class OyobiWhoSplitTheHeavens extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); - public OyobiWhoSplitTheHeavens(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{6}{W}"); addSuperType(SuperType.LEGENDARY); @@ -55,7 +54,7 @@ public class OyobiWhoSplitTheHeavens extends CardImpl { this.toughness = new MageInt(6); this.addAbility(FlyingAbility.getInstance()); // Whenever you cast a Spirit or Arcane spell, create a 3/3 white Spirit creature token with flying. - this.addAbility(new SpellCastControllerTriggeredAbility(new CreateTokenEffect(new AnotherSpiritToken()), filter, false)); + this.addAbility(new SpellCastControllerTriggeredAbility(new CreateTokenEffect(new AnotherSpiritToken()), StaticFilters.SPIRIT_OR_ARCANE_CARD, false)); } public OyobiWhoSplitTheHeavens(final OyobiWhoSplitTheHeavens card) { diff --git a/Mage.Sets/src/mage/cards/p/PainfulQuandary.java b/Mage.Sets/src/mage/cards/p/PainfulQuandary.java index 2dfae425b46..b48b1210e36 100644 --- a/Mage.Sets/src/mage/cards/p/PainfulQuandary.java +++ b/Mage.Sets/src/mage/cards/p/PainfulQuandary.java @@ -27,7 +27,6 @@ */ package mage.cards.p; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SpellCastOpponentTriggeredAbility; import mage.abilities.costs.Cost; @@ -39,11 +38,13 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SetTargetPointer; import mage.constants.Zone; -import mage.filter.FilterSpell; +import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCardInHand; +import java.util.UUID; + /** * * @author BetaSteward_at_googlemail.com @@ -54,7 +55,7 @@ public class PainfulQuandary extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{3}{B}{B}"); // Whenever an opponent casts a spell, that player loses 5 life unless he or she discards a card. - this.addAbility(new SpellCastOpponentTriggeredAbility(Zone.BATTLEFIELD, new PainfulQuandryEffect(), new FilterSpell(), false, SetTargetPointer.PLAYER)); + this.addAbility(new SpellCastOpponentTriggeredAbility(Zone.BATTLEFIELD, new PainfulQuandryEffect(), StaticFilters.FILTER_SPELL, false, SetTargetPointer.PLAYER)); } public PainfulQuandary(final PainfulQuandary card) { diff --git a/Mage.Sets/src/mage/cards/p/PardicDragon.java b/Mage.Sets/src/mage/cards/p/PardicDragon.java index 159adf9793d..74f85021159 100644 --- a/Mage.Sets/src/mage/cards/p/PardicDragon.java +++ b/Mage.Sets/src/mage/cards/p/PardicDragon.java @@ -44,7 +44,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; import mage.counters.CounterType; -import mage.filter.FilterSpell; +import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; @@ -71,7 +71,7 @@ public class PardicDragon extends CardImpl { this.addAbility(new SuspendAbility(2, new ManaCostsImpl("{R}{R}"), this, true)); // Whenever an opponent casts a spell, if Pardic Dragon is suspended, that player may put a time counter on Pardic Dragon. this.addAbility(new ConditionalTriggeredAbility( - new SpellCastOpponentTriggeredAbility(Zone.EXILED, new PardicDragonEffect(), new FilterSpell(), false, SetTargetPointer.PLAYER), + new SpellCastOpponentTriggeredAbility(Zone.EXILED, new PardicDragonEffect(), StaticFilters.FILTER_SPELL, false, SetTargetPointer.PLAYER), SuspendedCondition.instance, "Whenever an opponent casts a spell, if {this} is suspended, that player may put a time counter on {this}." )); diff --git a/Mage.Sets/src/mage/cards/p/PathbreakerIbex.java b/Mage.Sets/src/mage/cards/p/PathbreakerIbex.java index 6b4c6dbfd4b..e0fa33138cf 100644 --- a/Mage.Sets/src/mage/cards/p/PathbreakerIbex.java +++ b/Mage.Sets/src/mage/cards/p/PathbreakerIbex.java @@ -27,7 +27,6 @@ */ package mage.cards.p; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.AttacksTriggeredAbility; @@ -41,10 +40,13 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; +import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.permanent.Permanent; +import java.util.UUID; + /** * * @author fireshoes @@ -95,7 +97,7 @@ class PathbreakerIbexEffect extends OneShotEffect { maxPower = perm.getPower().getValue(); } } - ContinuousEffect effect = new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.EndOfTurn, new FilterCreaturePermanent()); + ContinuousEffect effect = new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES); game.addEffect(effect, source); if (maxPower != 0) { effect = new BoostControlledEffect(maxPower, maxPower, Duration.EndOfTurn); diff --git a/Mage.Sets/src/mage/cards/p/PetalmaneBaku.java b/Mage.Sets/src/mage/cards/p/PetalmaneBaku.java index 7ae2fbab462..ae904dc44d5 100644 --- a/Mage.Sets/src/mage/cards/p/PetalmaneBaku.java +++ b/Mage.Sets/src/mage/cards/p/PetalmaneBaku.java @@ -27,7 +27,6 @@ */ package mage.cards.p; -import java.util.UUID; import mage.MageInt; import mage.Mana; import mage.abilities.Ability; @@ -42,15 +41,15 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.counters.CounterType; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.filter.StaticFilters; + +import java.util.UUID; /** * @author LevelX2 */ public class PetalmaneBaku extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); - public PetalmaneBaku(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{G}"); this.subtype.add("Spirit"); @@ -59,7 +58,7 @@ public class PetalmaneBaku extends CardImpl { this.toughness = new MageInt(2); // Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Skullmane Baku. - this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), filter, true)); + this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), StaticFilters.SPIRIT_OR_ARCANE_CARD, true)); // {1}, Remove X ki counters from Petalmane Baku: Add X mana of any one color to your mana pool. Ability ability = new DynamicManaAbility( diff --git a/Mage.Sets/src/mage/cards/p/PhenaxGodOfDeception.java b/Mage.Sets/src/mage/cards/p/PhenaxGodOfDeception.java index e1fd97467ec..8cdb24f483b 100644 --- a/Mage.Sets/src/mage/cards/p/PhenaxGodOfDeception.java +++ b/Mage.Sets/src/mage/cards/p/PhenaxGodOfDeception.java @@ -42,7 +42,7 @@ import mage.abilities.keyword.IndestructibleAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import mage.target.TargetPlayer; import java.util.UUID; @@ -72,7 +72,7 @@ public class PhenaxGodOfDeception extends CardImpl { effect.setText("Target player puts the top X cards of his or her library into his or her graveyard, where X is this creature's toughness"); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new TapSourceCost()); ability.addTarget(new TargetPlayer()); - effect = new GainAbilityControlledEffect(ability, Duration.WhileOnBattlefield, new FilterCreaturePermanent("Creatures"),false); + effect = new GainAbilityControlledEffect(ability, Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURES,false); effect.setText("Creatures you control have \"{T}: Target player puts the top X cards of his or her library into his or her graveyard, where X is this creature's toughness.\""); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); } diff --git a/Mage.Sets/src/mage/cards/p/PlowUnder.java b/Mage.Sets/src/mage/cards/p/PlowUnder.java index f771fe4a7ac..d5395b91462 100644 --- a/Mage.Sets/src/mage/cards/p/PlowUnder.java +++ b/Mage.Sets/src/mage/cards/p/PlowUnder.java @@ -27,14 +27,15 @@ */ package mage.cards.p; -import java.util.UUID; import mage.abilities.effects.common.PutOnLibraryTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.common.FilterLandPermanent; +import mage.filter.StaticFilters; import mage.target.common.TargetLandPermanent; +import java.util.UUID; + /** * * @author Plopman @@ -47,7 +48,7 @@ public class PlowUnder extends CardImpl { // Put two target lands on top of their owners' libraries. this.getSpellAbility().addEffect(new PutOnLibraryTargetEffect(true)); - this.getSpellAbility().addTarget(new TargetLandPermanent(2,2, new FilterLandPermanent("lands"), false)); + this.getSpellAbility().addTarget(new TargetLandPermanent(2,2, StaticFilters.FILTER_LANDS, false)); } public PlowUnder(final PlowUnder card) { diff --git a/Mage.Sets/src/mage/cards/p/PredatoryNightstalker.java b/Mage.Sets/src/mage/cards/p/PredatoryNightstalker.java index 7356bfc7498..8716a2755e9 100644 --- a/Mage.Sets/src/mage/cards/p/PredatoryNightstalker.java +++ b/Mage.Sets/src/mage/cards/p/PredatoryNightstalker.java @@ -27,7 +27,6 @@ */ package mage.cards.p; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; @@ -35,9 +34,11 @@ import mage.abilities.effects.common.SacrificeEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import mage.target.common.TargetOpponent; +import java.util.UUID; + /** * * @author fireshoes @@ -51,7 +52,7 @@ public class PredatoryNightstalker extends CardImpl { this.toughness = new MageInt(2); // When Predatory Nightstalker enters the battlefield, you may have target opponent sacrifice a creature. - Ability ability = new EntersBattlefieldTriggeredAbility(new SacrificeEffect(new FilterCreaturePermanent("creature"), 1, "target opponent"), true); + Ability ability = new EntersBattlefieldTriggeredAbility(new SacrificeEffect(StaticFilters.FILTER_PERMANENT_CREATURE, 1, "target opponent"), true); ability.addTarget(new TargetOpponent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/p/PrescientChimera.java b/Mage.Sets/src/mage/cards/p/PrescientChimera.java index 926310998b2..ed7939845e0 100644 --- a/Mage.Sets/src/mage/cards/p/PrescientChimera.java +++ b/Mage.Sets/src/mage/cards/p/PrescientChimera.java @@ -27,7 +27,6 @@ */ package mage.cards.p; -import java.util.UUID; import mage.MageInt; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.effects.keyword.ScryEffect; @@ -35,9 +34,9 @@ import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.FilterSpell; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.StaticFilters; + +import java.util.UUID; /** * @@ -45,13 +44,6 @@ import mage.filter.predicate.mageobject.CardTypePredicate; */ public class PrescientChimera extends CardImpl { - private static final FilterSpell filter = new FilterSpell("instant or sorcery spell"); - static { - filter.add(Predicates.or( - new CardTypePredicate(CardType.INSTANT), - new CardTypePredicate(CardType.SORCERY))); - } - public PrescientChimera(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{U}{U}"); this.subtype.add("Chimera"); @@ -62,7 +54,7 @@ public class PrescientChimera extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); // Whenever you cast an instant or sorcery spell, scry 1. - this.addAbility(new SpellCastControllerTriggeredAbility(new ScryEffect(1), filter, false)); + this.addAbility(new SpellCastControllerTriggeredAbility(new ScryEffect(1), StaticFilters.FILTER_INSTANT_OR_SORCERY_SPELL, false)); } public PrescientChimera(final PrescientChimera card) { diff --git a/Mage.Sets/src/mage/cards/p/PsychicStrike.java b/Mage.Sets/src/mage/cards/p/PsychicStrike.java index d4df7478e78..694897aee70 100644 --- a/Mage.Sets/src/mage/cards/p/PsychicStrike.java +++ b/Mage.Sets/src/mage/cards/p/PsychicStrike.java @@ -27,20 +27,21 @@ */ package mage.cards.p; -import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Zone; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.filter.FilterSpell; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.stack.StackObject; import mage.players.Player; import mage.target.TargetSpell; +import java.util.UUID; + /** * * @author LevelX2 @@ -52,7 +53,7 @@ public class PsychicStrike extends CardImpl { // Counter target spell. Its controller puts the top two cards of his or her library into his or her graveyard. - this.getSpellAbility().addTarget(new TargetSpell(new FilterSpell())); + this.getSpellAbility().addTarget(new TargetSpell(StaticFilters.FILTER_SPELL)); this.getSpellAbility().addEffect(new PsychicStrikeEffect()); } diff --git a/Mage.Sets/src/mage/cards/p/PunishIgnorance.java b/Mage.Sets/src/mage/cards/p/PunishIgnorance.java index 6cecac6dfd3..b740fa6d505 100644 --- a/Mage.Sets/src/mage/cards/p/PunishIgnorance.java +++ b/Mage.Sets/src/mage/cards/p/PunishIgnorance.java @@ -27,17 +27,18 @@ */ package mage.cards.p; -import java.util.UUID; import mage.abilities.effects.Effect; -import mage.constants.CardType; import mage.abilities.effects.common.CounterTargetEffect; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.LoseLifeTargetControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.filter.FilterSpell; +import mage.constants.CardType; +import mage.filter.StaticFilters; import mage.target.TargetSpell; +import java.util.UUID; + /** * * @author North @@ -49,7 +50,7 @@ public class PunishIgnorance extends CardImpl { // Counter target spell. Its controller loses 3 life and you gain 3 life. - this.getSpellAbility().addTarget(new TargetSpell(new FilterSpell())); + this.getSpellAbility().addTarget(new TargetSpell(StaticFilters.FILTER_SPELL)); this.getSpellAbility().addEffect(new CounterTargetEffect()); this.getSpellAbility().addEffect(new LoseLifeTargetControllerEffect(3)); Effect effect = new GainLifeEffect(3); diff --git a/Mage.Sets/src/mage/cards/p/PyroclastConsul.java b/Mage.Sets/src/mage/cards/p/PyroclastConsul.java index 034fb61ef21..71298569be6 100644 --- a/Mage.Sets/src/mage/cards/p/PyroclastConsul.java +++ b/Mage.Sets/src/mage/cards/p/PyroclastConsul.java @@ -27,14 +27,15 @@ */ package mage.cards.p; -import java.util.UUID; import mage.MageInt; import mage.abilities.abilityword.KinshipAbility; import mage.abilities.effects.common.DamageAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; + +import java.util.UUID; /** * @@ -52,7 +53,7 @@ public class PyroclastConsul extends CardImpl { // Kinship - At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Pyroclast Consul, you may reveal it. // If you do, Pyroclast Consul deals 2 damage to each creature. - this.addAbility(new KinshipAbility(new DamageAllEffect(2, new FilterCreaturePermanent()))); + this.addAbility(new KinshipAbility(new DamageAllEffect(2, StaticFilters.FILTER_PERMANENT_CREATURE))); } public PyroclastConsul(final PyroclastConsul card) { diff --git a/Mage.Sets/src/mage/cards/q/Quash.java b/Mage.Sets/src/mage/cards/q/Quash.java index 4d1340e534f..f377c144e62 100644 --- a/Mage.Sets/src/mage/cards/q/Quash.java +++ b/Mage.Sets/src/mage/cards/q/Quash.java @@ -27,37 +27,28 @@ */ package mage.cards.q; -import java.util.UUID; -import mage.constants.CardType; import mage.abilities.effects.common.CounterTargetAndSearchGraveyardHandLibraryEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.filter.FilterSpell; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.constants.CardType; +import mage.filter.StaticFilters; import mage.target.TargetSpell; +import java.util.UUID; + /** * * @author LevelX2 */ public class Quash extends CardImpl { - private static final FilterSpell filter = new FilterSpell("instant or sorcery spell"); - - static { - Predicates.or( - new CardTypePredicate(CardType.INSTANT), - new CardTypePredicate(CardType.SORCERY)); - } - public Quash(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{2}{U}{U}"); // Counter target instant or sorcery spell. // Search its controller's graveyard, hand, and library for all cards with the same name as that spell and exile them. Then that player shuffles his or her library. - this.getSpellAbility().addTarget(new TargetSpell(filter)); + this.getSpellAbility().addTarget(new TargetSpell(StaticFilters.FILTER_INSTANT_OR_SORCERY_SPELL)); this.getSpellAbility().addEffect(new CounterTargetAndSearchGraveyardHandLibraryEffect()); } diff --git a/Mage.Sets/src/mage/cards/q/QuillmaneBaku.java b/Mage.Sets/src/mage/cards/q/QuillmaneBaku.java index f7a776ad24f..b2ad17b2c53 100644 --- a/Mage.Sets/src/mage/cards/q/QuillmaneBaku.java +++ b/Mage.Sets/src/mage/cards/q/QuillmaneBaku.java @@ -29,7 +29,6 @@ package mage.cards.q; import mage.MageInt; import mage.abilities.Ability; -import mage.constants.ComparisonType; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.costs.Cost; @@ -41,11 +40,12 @@ import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.ComparisonType; import mage.constants.Outcome; import mage.constants.Zone; import mage.counters.CounterType; +import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; -import mage.filter.common.FilterSpiritOrArcaneCard; import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; import mage.game.Game; import mage.game.permanent.Permanent; @@ -59,7 +59,6 @@ import java.util.UUID; */ public class QuillmaneBaku extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); private final UUID originalId; public QuillmaneBaku(UUID ownerId, CardSetInfo setInfo) { @@ -70,7 +69,7 @@ public class QuillmaneBaku extends CardImpl { this.toughness = new MageInt(3); // Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Skullmane Baku. - this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), filter, true)); + this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), StaticFilters.SPIRIT_OR_ARCANE_CARD, true)); // {1}, Tap, Remove X ki counters from Quillmane Baku: Return target creature with converted mana cost X or less to its owner's hand. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new QuillmaneBakuReturnEffect(), new GenericManaCost(1)); diff --git a/Mage.Sets/src/mage/cards/r/RalZarek.java b/Mage.Sets/src/mage/cards/r/RalZarek.java index 6211d8c2631..b88a1dfeb50 100644 --- a/Mage.Sets/src/mage/cards/r/RalZarek.java +++ b/Mage.Sets/src/mage/cards/r/RalZarek.java @@ -62,7 +62,7 @@ public class RalZarek extends CardImpl { } public RalZarek(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{2}{U}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{U}{R}"); this.subtype.add("Ral"); this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); diff --git a/Mage.Sets/src/mage/cards/r/RavagesOfWar.java b/Mage.Sets/src/mage/cards/r/RavagesOfWar.java index a154fdacf86..c3789ef99d3 100644 --- a/Mage.Sets/src/mage/cards/r/RavagesOfWar.java +++ b/Mage.Sets/src/mage/cards/r/RavagesOfWar.java @@ -27,12 +27,13 @@ */ package mage.cards.r; -import java.util.UUID; import mage.abilities.effects.common.DestroyAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.common.FilterLandPermanent; +import mage.filter.StaticFilters; + +import java.util.UUID; /** * @@ -45,7 +46,7 @@ public class RavagesOfWar extends CardImpl { // Destroy all lands. - this.getSpellAbility().addEffect(new DestroyAllEffect(new FilterLandPermanent("lands"))); + this.getSpellAbility().addEffect(new DestroyAllEffect(StaticFilters.FILTER_LANDS)); } public RavagesOfWar(final RavagesOfWar card) { diff --git a/Mage.Sets/src/mage/cards/r/RazorvergeThicket.java b/Mage.Sets/src/mage/cards/r/RazorvergeThicket.java index 810858a04cf..f670b51acfb 100644 --- a/Mage.Sets/src/mage/cards/r/RazorvergeThicket.java +++ b/Mage.Sets/src/mage/cards/r/RazorvergeThicket.java @@ -27,9 +27,6 @@ */ package mage.cards.r; -import java.util.UUID; - -import mage.constants.ComparisonType; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.condition.Condition; import mage.abilities.condition.InvertCondition; @@ -41,7 +38,10 @@ import mage.abilities.mana.WhiteManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.common.FilterLandPermanent; +import mage.constants.ComparisonType; +import mage.filter.StaticFilters; + +import java.util.UUID; /** * @@ -49,12 +49,10 @@ import mage.filter.common.FilterLandPermanent; */ public class RazorvergeThicket extends CardImpl { - private static FilterLandPermanent filter = new FilterLandPermanent(); - public RazorvergeThicket(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.LAND},null); - Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.FEWER_THAN, 3)); + Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(StaticFilters.FILTER_LANDS, ComparisonType.FEWER_THAN, 3)); String abilityText = "tap it unless you control fewer than 3 lands"; this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText)); diff --git a/Mage.Sets/src/mage/cards/r/ReadyWilling.java b/Mage.Sets/src/mage/cards/r/ReadyWilling.java index 19771ff54ec..869a239dac0 100644 --- a/Mage.Sets/src/mage/cards/r/ReadyWilling.java +++ b/Mage.Sets/src/mage/cards/r/ReadyWilling.java @@ -27,7 +27,6 @@ */ package mage.cards.r; -import java.util.UUID; import mage.abilities.effects.Effect; import mage.abilities.effects.common.UntapAllControllerEffect; import mage.abilities.effects.common.continuous.GainAbilityAllEffect; @@ -40,8 +39,10 @@ import mage.cards.SplitCard; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SpellAbilityType; +import mage.filter.StaticFilters; import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.common.FilterCreaturePermanent; + +import java.util.UUID; /** * @@ -61,8 +62,8 @@ public class ReadyWilling extends SplitCard { // Willing // Creatures you control gain deathtouch and lifelink until end of turn. - getRightHalfCard().getSpellAbility().addEffect(new GainAbilityControlledEffect(DeathtouchAbility.getInstance(), Duration.EndOfTurn, new FilterCreaturePermanent("Creatures"))); - effect = new GainAbilityControlledEffect(LifelinkAbility.getInstance(), Duration.EndOfTurn, new FilterCreaturePermanent("Creatures")); + getRightHalfCard().getSpellAbility().addEffect(new GainAbilityControlledEffect(DeathtouchAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES)); + effect = new GainAbilityControlledEffect(LifelinkAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES); effect.setText("Creatures you control gain lifelink until end of turn"); getRightHalfCard().getSpellAbility().addEffect(effect); diff --git a/Mage.Sets/src/mage/cards/r/Retaliation.java b/Mage.Sets/src/mage/cards/r/Retaliation.java index e4c5d85ad2d..6883f1b3cb3 100644 --- a/Mage.Sets/src/mage/cards/r/Retaliation.java +++ b/Mage.Sets/src/mage/cards/r/Retaliation.java @@ -27,7 +27,6 @@ */ package mage.cards.r; -import java.util.UUID; import mage.abilities.common.BecomesBlockedByCreatureTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.continuous.BoostSourceEffect; @@ -37,7 +36,9 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Zone; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; + +import java.util.UUID; /** * @@ -51,7 +52,7 @@ public class Retaliation extends CardImpl { // Creatures you control have "Whenever this creature becomes blocked by a creature, this creature gets +1/+1 until end of turn." this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(new BecomesBlockedByCreatureTriggeredAbility(new BoostSourceEffect(1, 1, Duration.EndOfTurn), false), - Duration.WhileOnBattlefield, new FilterCreaturePermanent("Creatures")))); + Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURES))); } public Retaliation(final Retaliation card) { diff --git a/Mage.Sets/src/mage/cards/r/ReverentMantra.java b/Mage.Sets/src/mage/cards/r/ReverentMantra.java new file mode 100644 index 00000000000..9a98f63445f --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/ReverentMantra.java @@ -0,0 +1,75 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.cards.r; + +import mage.ObjectColor; +import mage.abilities.costs.AlternativeCostSourceAbility; +import mage.abilities.costs.common.ExileFromHandCost; +import mage.abilities.effects.common.continuous.GainProtectionFromColorAllEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.common.FilterOwnedCard; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardIdPredicate; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.target.common.TargetCardInHand; + +import java.util.UUID; + +/** + * + * @author ciaccona007 + */ +public class ReverentMantra extends CardImpl { + + public ReverentMantra(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{W}"); + + // You may exile a white card from your hand rather than pay Reverent Mantra's mana cost. + FilterOwnedCard filter = new FilterOwnedCard("a white card from your hand"); + filter.add(new ColorPredicate(ObjectColor.WHITE)); + filter.add(Predicates.not(new CardIdPredicate(this.getId()))); + + this.addAbility(new AlternativeCostSourceAbility(new ExileFromHandCost(new TargetCardInHand(filter)))); + + // Choose a color. All creatures gain protection from the chosen color until end of turn. + this.getSpellAbility().addEffect(new GainProtectionFromColorAllEffect(Duration.EndOfTurn, new FilterCreaturePermanent())); + } + + public ReverentMantra(final ReverentMantra card) { + super(card); + } + + @Override + public ReverentMantra copy() { + return new ReverentMantra(this); + } +} diff --git a/Mage.Sets/src/mage/cards/r/RhysticStudy.java b/Mage.Sets/src/mage/cards/r/RhysticStudy.java index 41e2e18fda5..c1a45897116 100644 --- a/Mage.Sets/src/mage/cards/r/RhysticStudy.java +++ b/Mage.Sets/src/mage/cards/r/RhysticStudy.java @@ -27,7 +27,6 @@ */ package mage.cards.r; -import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.SpellCastOpponentTriggeredAbility; @@ -40,10 +39,12 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SetTargetPointer; import mage.constants.Zone; -import mage.filter.FilterSpell; +import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; +import java.util.UUID; + /** * * @author Quercitron @@ -54,7 +55,7 @@ public class RhysticStudy extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{U}"); // Whenever an opponent casts a spell, you may draw a card unless that player pays {1}. - this.addAbility(new SpellCastOpponentTriggeredAbility(Zone.BATTLEFIELD, new RhysticStudyDrawEffect(), new FilterSpell(), false, SetTargetPointer.PLAYER)); + this.addAbility(new SpellCastOpponentTriggeredAbility(Zone.BATTLEFIELD, new RhysticStudyDrawEffect(), StaticFilters.FILTER_SPELL, false, SetTargetPointer.PLAYER)); } public RhysticStudy(final RhysticStudy card) { diff --git a/Mage.Sets/src/mage/cards/r/RisingWaters.java b/Mage.Sets/src/mage/cards/r/RisingWaters.java index 133a14497df..b596aa735bd 100644 --- a/Mage.Sets/src/mage/cards/r/RisingWaters.java +++ b/Mage.Sets/src/mage/cards/r/RisingWaters.java @@ -27,7 +27,6 @@ */ package mage.cards.r; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; @@ -35,11 +34,8 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DontUntapInControllersUntapStepAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.TargetController; -import mage.constants.Zone; +import mage.constants.*; +import mage.filter.StaticFilters; import mage.filter.common.FilterLandPermanent; import mage.filter.predicate.permanent.ControllerIdPredicate; import mage.game.Game; @@ -48,6 +44,8 @@ import mage.players.Player; import mage.target.Target; import mage.target.common.TargetLandPermanent; +import java.util.UUID; + /** * * @author fireshoes @@ -59,7 +57,7 @@ public class RisingWaters extends CardImpl { // Lands don't untap during their controllers' untap steps. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, - new DontUntapInControllersUntapStepAllEffect(Duration.WhileOnBattlefield, TargetController.ANY, new FilterLandPermanent("Lands")))); + new DontUntapInControllersUntapStepAllEffect(Duration.WhileOnBattlefield, TargetController.ANY, StaticFilters.FILTER_LANDS))); // At the beginning of each player's upkeep, that player untaps a land he or she controls. this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new RisingWatersUntapEffect(), TargetController.ANY, false)); diff --git a/Mage.Sets/src/mage/cards/r/Rivalry.java b/Mage.Sets/src/mage/cards/r/Rivalry.java index 900fb4f1ad6..1756bfa7e2e 100644 --- a/Mage.Sets/src/mage/cards/r/Rivalry.java +++ b/Mage.Sets/src/mage/cards/r/Rivalry.java @@ -27,7 +27,6 @@ */ package mage.cards.r; -import java.util.UUID; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DamageTargetEffect; @@ -35,13 +34,14 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; -import mage.filter.FilterPermanent; -import mage.filter.common.FilterLandPermanent; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; import mage.target.targetpointer.FixedTarget; +import java.util.UUID; + /** * * @author Plopman @@ -69,10 +69,6 @@ public class Rivalry extends CardImpl { class RivalryTriggeredAbility extends TriggeredAbilityImpl { - private static final FilterPermanent filter = new FilterLandPermanent(); - - - public RivalryTriggeredAbility() { super(Zone.BATTLEFIELD, new DamageTargetEffect(2), false); } @@ -104,10 +100,10 @@ class RivalryTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkInterveningIfClause(Game game) { UUID player = game.getActivePlayerId(); - int land = game.getBattlefield().countAll(filter, player, game); + int land = game.getBattlefield().countAll(StaticFilters.FILTER_LAND, player, game); if(player != null){ for(UUID opponent : game.getOpponents(player)){ - if(land <= game.getBattlefield().countAll(filter, opponent, game)){ + if(land <= game.getBattlefield().countAll(StaticFilters.FILTER_LAND, opponent, game)){ return false; } } diff --git a/Mage.Sets/src/mage/cards/r/RuinousMinotaur.java b/Mage.Sets/src/mage/cards/r/RuinousMinotaur.java index fef8cdbb8f8..7a65ae01bb9 100644 --- a/Mage.Sets/src/mage/cards/r/RuinousMinotaur.java +++ b/Mage.Sets/src/mage/cards/r/RuinousMinotaur.java @@ -27,14 +27,15 @@ */ package mage.cards.r; -import java.util.UUID; -import mage.constants.CardType; import mage.MageInt; import mage.abilities.common.DealsDamageToOpponentTriggeredAbility; import mage.abilities.effects.common.SacrificeControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.filter.common.FilterLandPermanent; +import mage.constants.CardType; +import mage.filter.StaticFilters; + +import java.util.UUID; /** * @@ -51,7 +52,7 @@ public class RuinousMinotaur extends CardImpl { this.toughness = new MageInt(2); // Whenever Ruinous Minotaur deals damage to an opponent, sacrifice a land. - this.addAbility(new DealsDamageToOpponentTriggeredAbility(new SacrificeControllerEffect(new FilterLandPermanent(), 1, ""), false, false)); + this.addAbility(new DealsDamageToOpponentTriggeredAbility(new SacrificeControllerEffect(StaticFilters.FILTER_LAND, 1, ""), false, false)); } diff --git a/Mage.Sets/src/mage/cards/r/RuthlessDeathfang.java b/Mage.Sets/src/mage/cards/r/RuthlessDeathfang.java index 3b79c23c3a6..6c3e783c588 100644 --- a/Mage.Sets/src/mage/cards/r/RuthlessDeathfang.java +++ b/Mage.Sets/src/mage/cards/r/RuthlessDeathfang.java @@ -27,7 +27,6 @@ */ package mage.cards.r; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; @@ -37,12 +36,14 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; import mage.target.common.TargetOpponent; +import java.util.UUID; + /** * * @author fireshoes @@ -77,7 +78,7 @@ public class RuthlessDeathfang extends CardImpl { class RuthlessDeathfangTriggeredAbility extends TriggeredAbilityImpl { public RuthlessDeathfangTriggeredAbility() { - super(Zone.BATTLEFIELD, new SacrificeEffect(new FilterCreaturePermanent("creature"), 1, "target opponent"), false); + super(Zone.BATTLEFIELD, new SacrificeEffect(StaticFilters.FILTER_PERMANENT_CREATURE, 1, "target opponent"), false); setLeavesTheBattlefieldTrigger(true); } diff --git a/Mage.Sets/src/mage/cards/s/SakashimaTheImpostor.java b/Mage.Sets/src/mage/cards/s/SakashimaTheImpostor.java index 79066d5b54e..4ae50ccd86f 100644 --- a/Mage.Sets/src/mage/cards/s/SakashimaTheImpostor.java +++ b/Mage.Sets/src/mage/cards/s/SakashimaTheImpostor.java @@ -27,7 +27,6 @@ */ package mage.cards.s; -import java.util.UUID; import mage.MageInt; import mage.MageObject; import mage.abilities.Ability; @@ -44,11 +43,13 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SuperType; import mage.constants.Zone; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.util.functions.ApplyToPermanent; +import java.util.UUID; + /** * @author LevelX2 */ @@ -63,7 +64,7 @@ public class SakashimaTheImpostor extends CardImpl { this.toughness = new MageInt(1); // You may have Sakashima the Impostor enter the battlefield as a copy of any creature on the battlefield, except its name is still Sakashima the Impostor, it's legendary in addition to its other types, and it gains "{2}{U}{U}: Return Sakashima the Impostor to its owner's hand at the beginning of the next end step." - Effect effect = new CopyPermanentEffect(new FilterCreaturePermanent(), new SakashimaTheImpostorApplier()); + Effect effect = new CopyPermanentEffect(StaticFilters.FILTER_PERMANENT_CREATURE, new SakashimaTheImpostorApplier()); effect.setText("as a copy of any creature on the battlefield, except its name is still Sakashima the Impostor, it's legendary in addition to its other types, and it gains \"{2}{U}{U}: Return {this} to its owner's hand at the beginning of the next end step.\""); this.addAbility(new EntersBattlefieldAbility(effect, true)); } diff --git a/Mage.Sets/src/mage/cards/s/SarkhanVol.java b/Mage.Sets/src/mage/cards/s/SarkhanVol.java index 40e0391f5dd..608debcf7a9 100644 --- a/Mage.Sets/src/mage/cards/s/SarkhanVol.java +++ b/Mage.Sets/src/mage/cards/s/SarkhanVol.java @@ -27,7 +27,6 @@ */ package mage.cards.s; -import java.util.UUID; import mage.abilities.LoyaltyAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; import mage.abilities.effects.Effects; @@ -42,10 +41,12 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import mage.game.permanent.token.DragonToken; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** * * @author BetaSteward_at_googlemail.com @@ -63,7 +64,7 @@ public class SarkhanVol extends CardImpl { // +1: Creatures you control get +1/+1 and gain haste until end of turn. Effects effects1 = new Effects(); effects1.add(new BoostControlledEffect(1, 1, Duration.EndOfTurn)); - effects1.add(new GainAbilityControlledEffect(HasteAbility.getInstance(), Duration.EndOfTurn, new FilterCreaturePermanent())); + effects1.add(new GainAbilityControlledEffect(HasteAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES)); this.addAbility(new LoyaltyAbility(effects1, 1)); // -2: Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. diff --git a/Mage.Sets/src/mage/cards/s/ScaledHulk.java b/Mage.Sets/src/mage/cards/s/ScaledHulk.java index 44a85626759..0ba6ebc3334 100644 --- a/Mage.Sets/src/mage/cards/s/ScaledHulk.java +++ b/Mage.Sets/src/mage/cards/s/ScaledHulk.java @@ -27,16 +27,16 @@ */ package mage.cards.s; -import java.util.UUID; - -import mage.constants.CardType; import mage.MageInt; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.constants.CardType; import mage.constants.Duration; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.filter.StaticFilters; + +import java.util.UUID; /** * @@ -44,8 +44,6 @@ import mage.filter.common.FilterSpiritOrArcaneCard; */ public class ScaledHulk extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); - public ScaledHulk(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{5}{G}"); this.subtype.add("Spirit"); @@ -53,7 +51,7 @@ public class ScaledHulk extends CardImpl { this.power = new MageInt(4); this.toughness = new MageInt(4); // Whenever you cast a Spirit or Arcane spell, Scaled Hulk gets +2/+2 until end of turn. - this.addAbility(new SpellCastControllerTriggeredAbility(new BoostSourceEffect(2, 2, Duration.EndOfTurn), filter, false)); + this.addAbility(new SpellCastControllerTriggeredAbility(new BoostSourceEffect(2, 2, Duration.EndOfTurn), StaticFilters.SPIRIT_OR_ARCANE_CARD, false)); } public ScaledHulk(final ScaledHulk card) { diff --git a/Mage.Sets/src/mage/cards/s/SeachromeCoast.java b/Mage.Sets/src/mage/cards/s/SeachromeCoast.java index 6402dd3aa77..07685bd2358 100644 --- a/Mage.Sets/src/mage/cards/s/SeachromeCoast.java +++ b/Mage.Sets/src/mage/cards/s/SeachromeCoast.java @@ -27,9 +27,6 @@ */ package mage.cards.s; -import java.util.UUID; - -import mage.constants.ComparisonType; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.condition.Condition; import mage.abilities.condition.InvertCondition; @@ -41,21 +38,21 @@ import mage.abilities.mana.WhiteManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.common.FilterLandPermanent; +import mage.constants.ComparisonType; +import mage.filter.StaticFilters; + +import java.util.UUID; /** * * @author maurer.it_at_gmail.com */ public class SeachromeCoast extends CardImpl { - - private static FilterLandPermanent filter = new FilterLandPermanent(); - public SeachromeCoast(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.LAND},null); // Seachrome Coast enters the battlefield tapped unless you control two or fewer other lands. - Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.FEWER_THAN, 3)); + Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(StaticFilters.FILTER_LANDS, ComparisonType.FEWER_THAN, 3)); String abilityText = "tap it unless you control fewer than 3 lands"; this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText)); diff --git a/Mage.Sets/src/mage/cards/s/SearingBlaze.java b/Mage.Sets/src/mage/cards/s/SearingBlaze.java index 56dabba7cdc..9d89f25bfcc 100644 --- a/Mage.Sets/src/mage/cards/s/SearingBlaze.java +++ b/Mage.Sets/src/mage/cards/s/SearingBlaze.java @@ -27,17 +27,14 @@ */ package mage.cards.s; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Outcome; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.filter.common.FilterCreaturePermanent; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.stack.StackObject; @@ -46,6 +43,10 @@ import mage.target.TargetPermanent; import mage.target.TargetPlayer; import mage.watchers.common.LandfallWatcher; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + /** * * @author BetaSteward_at_googlemail.com @@ -114,7 +115,7 @@ class SearingBlazeEffect extends OneShotEffect { class SearingBlazeTarget extends TargetPermanent { public SearingBlazeTarget() { - super(1, 1, new FilterCreaturePermanent(), false); + super(1, 1, StaticFilters.FILTER_PERMANENT_CREATURE, false); } public SearingBlazeTarget(final SearingBlazeTarget target) { diff --git a/Mage.Sets/src/mage/cards/s/SeedTheLand.java b/Mage.Sets/src/mage/cards/s/SeedTheLand.java index c1d4b76abc3..a7fa9c555a3 100644 --- a/Mage.Sets/src/mage/cards/s/SeedTheLand.java +++ b/Mage.Sets/src/mage/cards/s/SeedTheLand.java @@ -27,7 +27,6 @@ */ package mage.cards.s; -import java.util.UUID; import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; import mage.abilities.effects.common.CreateTokenTargetEffect; import mage.cards.CardImpl; @@ -35,9 +34,11 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SetTargetPointer; import mage.constants.Zone; -import mage.filter.common.FilterLandPermanent; +import mage.filter.StaticFilters; import mage.game.permanent.token.SnakeToken; +import java.util.UUID; + /** * * @author LevelX2 @@ -49,7 +50,7 @@ public class SeedTheLand extends CardImpl { // Whenever a land enters the battlefield, its controller creates a 1/1 green Snake creature token. this.addAbility(new EntersBattlefieldAllTriggeredAbility(Zone.BATTLEFIELD, - new CreateTokenTargetEffect(new SnakeToken()), new FilterLandPermanent(), false, SetTargetPointer.PLAYER, + new CreateTokenTargetEffect(new SnakeToken()), StaticFilters.FILTER_LAND, false, SetTargetPointer.PLAYER, "Whenever a land enters the battlefield, its controller creates a 1/1 green Snake creature token.")); } diff --git a/Mage.Sets/src/mage/cards/s/SerendibDjinn.java b/Mage.Sets/src/mage/cards/s/SerendibDjinn.java index 2def83ab79b..33da13199ab 100644 --- a/Mage.Sets/src/mage/cards/s/SerendibDjinn.java +++ b/Mage.Sets/src/mage/cards/s/SerendibDjinn.java @@ -29,7 +29,6 @@ package mage.cards.s; import mage.MageInt; import mage.abilities.Ability; -import mage.constants.ComparisonType; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.ControlsPermanentsControllerTriggeredAbility; import mage.abilities.effects.OneShotEffect; @@ -38,10 +37,11 @@ import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.ComparisonType; import mage.constants.Outcome; import mage.constants.TargetController; +import mage.filter.StaticFilters; import mage.filter.common.FilterControlledLandPermanent; -import mage.filter.common.FilterLandPermanent; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; @@ -68,7 +68,7 @@ public class SerendibDjinn extends CardImpl { this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SerendibDjinnEffect(), TargetController.YOU, false)); // When you control no lands, sacrifice Serendib Djinn. this.addAbility(new ControlsPermanentsControllerTriggeredAbility( - new FilterLandPermanent(), ComparisonType.EQUAL_TO, 0, + StaticFilters.FILTER_LANDS, ComparisonType.EQUAL_TO, 0, new SacrificeSourceEffect())); } diff --git a/Mage.Sets/src/mage/cards/s/ShelteredValley.java b/Mage.Sets/src/mage/cards/s/ShelteredValley.java index 36826c540a7..172a4794345 100644 --- a/Mage.Sets/src/mage/cards/s/ShelteredValley.java +++ b/Mage.Sets/src/mage/cards/s/ShelteredValley.java @@ -27,9 +27,7 @@ */ package mage.cards.s; -import java.util.UUID; import mage.abilities.Ability; -import mage.constants.ComparisonType; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.Condition; @@ -43,19 +41,21 @@ import mage.abilities.mana.ColorlessManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.ComparisonType; import mage.constants.TargetController; import mage.constants.Zone; import mage.filter.FilterPermanent; -import mage.filter.common.FilterLandPermanent; +import mage.filter.StaticFilters; import mage.filter.predicate.mageobject.NamePredicate; +import java.util.UUID; + /** * * @author anonymous */ public class ShelteredValley extends CardImpl { - - private static final FilterLandPermanent filter = new FilterLandPermanent(); + private static final FilterPermanent filterShelteredValley = new FilterPermanent("permanent named Sheltered Valley"); static { @@ -72,7 +72,7 @@ public class ShelteredValley extends CardImpl { this.addAbility(ability); // At the beginning of your upkeep, if you control three or fewer lands, you gain 1 life. - Condition controls = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.FEWER_THAN, 4); + Condition controls = new PermanentsOnTheBattlefieldCondition(StaticFilters.FILTER_LANDS, ComparisonType.FEWER_THAN, 4); effect = new ConditionalOneShotEffect(new GainLifeEffect(1), controls); effect.setText("if you control three or fewer lands, you gain 1 life"); ability = new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, effect, TargetController.YOU, false); diff --git a/Mage.Sets/src/mage/cards/s/ShieldsOfVelisVel.java b/Mage.Sets/src/mage/cards/s/ShieldsOfVelisVel.java index 60f238a0315..59df9913760 100644 --- a/Mage.Sets/src/mage/cards/s/ShieldsOfVelisVel.java +++ b/Mage.Sets/src/mage/cards/s/ShieldsOfVelisVel.java @@ -27,25 +27,23 @@ */ package mage.cards.s; -import java.util.Iterator; -import java.util.List; -import java.util.UUID; import mage.MageObjectReference; import mage.abilities.Ability; import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.keyword.ChangelingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Layer; -import mage.constants.Outcome; -import mage.constants.SubLayer; +import mage.constants.*; +import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.TargetPlayer; +import java.util.Iterator; +import java.util.List; +import java.util.UUID; + /** * * @author Styxo @@ -137,7 +135,7 @@ class ShieldsOfVelisVelBoostEffect extends ContinuousEffectImpl { public void init(Ability source, Game game) { super.init(source, game); if (this.affectedObjectsSet) { - List creatures = game.getBattlefield().getAllActivePermanents(new FilterCreaturePermanent(), source.getFirstTarget(), game); + List creatures = game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURES, source.getFirstTarget(), game); for (Permanent creature : creatures) { affectedObjectList.add(new MageObjectReference(creature, game)); } diff --git a/Mage.Sets/src/mage/cards/s/SigilTracer.java b/Mage.Sets/src/mage/cards/s/SigilTracer.java index 4db7443ecef..694f562c3fe 100644 --- a/Mage.Sets/src/mage/cards/s/SigilTracer.java +++ b/Mage.Sets/src/mage/cards/s/SigilTracer.java @@ -27,7 +27,6 @@ */ package mage.cards.s; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -39,29 +38,26 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; -import mage.filter.FilterSpell; +import mage.filter.StaticFilters; import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.filter.predicate.permanent.TappedPredicate; import mage.target.TargetSpell; import mage.target.common.TargetControlledCreaturePermanent; +import java.util.UUID; + /** * @author Loki */ public class SigilTracer extends CardImpl { private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("untapped Wizards you control"); - private static final FilterSpell filterInstorSorc = new FilterSpell("instant or sorcery spell"); static { filter.add(Predicates.not(new TappedPredicate())); filter.add(new SubtypePredicate(SubType.WIZARD)); - filterInstorSorc.add(Predicates.or( - new CardTypePredicate(CardType.INSTANT), - new CardTypePredicate(CardType.SORCERY))); } public SigilTracer(UUID ownerId, CardSetInfo setInfo) { @@ -74,7 +70,7 @@ public class SigilTracer extends CardImpl { // {1}{U}, Tap two untapped Wizards you control: Copy target instant or sorcery spell. You may choose new targets for the copy. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CopyTargetSpellEffect(), new ManaCostsImpl("{1}{U}")); - ability.addTarget(new TargetSpell(filterInstorSorc)); + ability.addTarget(new TargetSpell(StaticFilters.FILTER_INSTANT_OR_SORCERY_SPELL)); ability.addCost(new TapTargetCost(new TargetControlledCreaturePermanent(2, 2, filter, false))); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/s/SireOfTheStorm.java b/Mage.Sets/src/mage/cards/s/SireOfTheStorm.java index c1297cbb1c9..978abe2aaac 100644 --- a/Mage.Sets/src/mage/cards/s/SireOfTheStorm.java +++ b/Mage.Sets/src/mage/cards/s/SireOfTheStorm.java @@ -28,24 +28,22 @@ package mage.cards.s; -import java.util.UUID; - -import mage.constants.CardType; import mage.MageInt; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.constants.CardType; +import mage.filter.StaticFilters; + +import java.util.UUID; /** * @author Loki */ public class SireOfTheStorm extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); - public SireOfTheStorm(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{U}{U}"); this.subtype.add("Spirit"); @@ -54,7 +52,7 @@ public class SireOfTheStorm extends CardImpl { this.power = new MageInt(3); this.toughness = new MageInt(3); this.addAbility(FlyingAbility.getInstance()); - this.addAbility(new SpellCastControllerTriggeredAbility(new DrawCardSourceControllerEffect(1), filter, true)); + this.addAbility(new SpellCastControllerTriggeredAbility(new DrawCardSourceControllerEffect(1), StaticFilters.SPIRIT_OR_ARCANE_CARD, true)); } public SireOfTheStorm(final SireOfTheStorm card) { diff --git a/Mage.Sets/src/mage/cards/s/SkullmaneBaku.java b/Mage.Sets/src/mage/cards/s/SkullmaneBaku.java index e63bf5ad5e3..2bd2e570c98 100644 --- a/Mage.Sets/src/mage/cards/s/SkullmaneBaku.java +++ b/Mage.Sets/src/mage/cards/s/SkullmaneBaku.java @@ -47,7 +47,7 @@ import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Zone; import mage.counters.CounterType; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.common.TargetCreaturePermanent; @@ -59,8 +59,6 @@ import java.util.UUID; */ public class SkullmaneBaku extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); - public SkullmaneBaku(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{B}{B}"); this.subtype.add("Spirit"); @@ -69,7 +67,7 @@ public class SkullmaneBaku extends CardImpl { this.toughness = new MageInt(1); // Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Skullmane Baku. - this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), filter, true)); + this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), StaticFilters.SPIRIT_OR_ARCANE_CARD, true)); // {1}, {T}, Remove X ki counters from Skullmane Baku: Target creature gets -X/-X until end of turn. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new SkullmaneBakuUnboostEffect(), new GenericManaCost(1)); diff --git a/Mage.Sets/src/mage/cards/s/SkyfireKirin.java b/Mage.Sets/src/mage/cards/s/SkyfireKirin.java index d02f720f9a1..a056881236d 100644 --- a/Mage.Sets/src/mage/cards/s/SkyfireKirin.java +++ b/Mage.Sets/src/mage/cards/s/SkyfireKirin.java @@ -29,7 +29,6 @@ package mage.cards.s; import mage.MageInt; import mage.abilities.Ability; -import mage.constants.ComparisonType; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; @@ -39,8 +38,8 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; import mage.filter.FilterPermanent; +import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; -import mage.filter.common.FilterSpiritOrArcaneCard; import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; import mage.game.Game; import mage.game.permanent.Permanent; @@ -71,7 +70,7 @@ public class SkyfireKirin extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); // Whenever you cast a Spirit or Arcane spell, you may gain control of target creature with that spell's converted mana cost until end of turn. - Ability ability = new SpellCastControllerTriggeredAbility(Zone.BATTLEFIELD, new SkyfireKirinEffect(), new FilterSpiritOrArcaneCard(), true, true); + Ability ability = new SpellCastControllerTriggeredAbility(Zone.BATTLEFIELD, new SkyfireKirinEffect(), StaticFilters.SPIRIT_OR_ARCANE_CARD, true, true); ability.addTarget(new TargetCreaturePermanent()); originalId = ability.getOriginalId(); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/s/SmotheringAbomination.java b/Mage.Sets/src/mage/cards/s/SmotheringAbomination.java index 61dc6346efc..db1840ae207 100644 --- a/Mage.Sets/src/mage/cards/s/SmotheringAbomination.java +++ b/Mage.Sets/src/mage/cards/s/SmotheringAbomination.java @@ -27,7 +27,6 @@ */ package mage.cards.s; -import java.util.UUID; import mage.MageInt; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -40,11 +39,13 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.TargetController; import mage.constants.Zone; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; +import java.util.UUID; + /** * * @author fireshoes @@ -65,7 +66,7 @@ public class SmotheringAbomination extends CardImpl { // At the beginning of your upkeep, sacrifice a creature this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SacrificeControllerEffect( - new FilterCreaturePermanent(), 1, null), TargetController.YOU, false)); + StaticFilters.FILTER_PERMANENT_CREATURE, 1, null), TargetController.YOU, false)); // Whenever you sacrifice a creature, draw a card. this.addAbility(new SmotheringAbominationTriggeredAbility()); diff --git a/Mage.Sets/src/mage/cards/s/Soilshaper.java b/Mage.Sets/src/mage/cards/s/Soilshaper.java index 26c6bc5f231..8637767633a 100644 --- a/Mage.Sets/src/mage/cards/s/Soilshaper.java +++ b/Mage.Sets/src/mage/cards/s/Soilshaper.java @@ -28,26 +28,25 @@ package mage.cards.s; -import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Duration; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.effects.common.continuous.BecomesCreatureTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.filter.StaticFilters; import mage.game.permanent.token.Token; import mage.target.common.TargetLandPermanent; +import java.util.UUID; + /** * @author Loki */ public class Soilshaper extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); public Soilshaper(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{G}"); @@ -57,7 +56,7 @@ public class Soilshaper extends CardImpl { this.toughness = new MageInt(1); // Whenever you cast a Spirit or Arcane spell, target land becomes a 3/3 creature until end of turn. It's still a land. - Ability ability = new SpellCastControllerTriggeredAbility(new BecomesCreatureTargetEffect(new SoilshaperToken(), false, true, Duration.EndOfTurn), filter, false); + Ability ability = new SpellCastControllerTriggeredAbility(new BecomesCreatureTargetEffect(new SoilshaperToken(), false, true, Duration.EndOfTurn), StaticFilters.SPIRIT_OR_ARCANE_CARD, false); ability.addTarget(new TargetLandPermanent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/s/Solemnity.java b/Mage.Sets/src/mage/cards/s/Solemnity.java index ce26d0595cc..bd3fc7cbaa4 100644 --- a/Mage.Sets/src/mage/cards/s/Solemnity.java +++ b/Mage.Sets/src/mage/cards/s/Solemnity.java @@ -146,6 +146,9 @@ class SolemnityEffect2 extends ReplacementEffectImpl { public boolean applies(GameEvent event, Ability source, Game game) { MageObject object = game.getObject(event.getTargetId()); Permanent permanent = game.getPermanentEntering(event.getSourceId()); + Permanent permanent2 = game.getPermanent(event.getTargetId()); + Permanent permanent3 = game.getPermanentEntering(event.getTargetId()); + if (object != null && object instanceof Permanent) { if (filter.match((Permanent) object, game)) { return true; @@ -154,7 +157,16 @@ class SolemnityEffect2 extends ReplacementEffectImpl { if (filter.match(permanent, game)) { return true; } + } else if (permanent2 != null) { + if (filter.match(permanent2, game)) { + return true; + } + } else if (permanent3 != null) { + if (filter.match(permanent3, game)) { + return true; + } } + return false; } } diff --git a/Mage.Sets/src/mage/cards/s/SorinSolemnVisitor.java b/Mage.Sets/src/mage/cards/s/SorinSolemnVisitor.java index 7411f993e2d..1eb831f3be0 100644 --- a/Mage.Sets/src/mage/cards/s/SorinSolemnVisitor.java +++ b/Mage.Sets/src/mage/cards/s/SorinSolemnVisitor.java @@ -27,7 +27,6 @@ */ package mage.cards.s; -import java.util.UUID; import mage.abilities.LoyaltyAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; import mage.abilities.effects.Effect; @@ -39,11 +38,13 @@ import mage.abilities.keyword.LifelinkAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.game.command.emblems.SorinSolemnVisitorEmblem; import mage.constants.Duration; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; +import mage.game.command.emblems.SorinSolemnVisitorEmblem; import mage.game.permanent.token.SorinSolemnVisitorVampireToken; +import java.util.UUID; + /** * * @author LevelX2 @@ -57,10 +58,10 @@ public class SorinSolemnVisitor extends CardImpl { this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); // +1: Until your next turn, creatures you control get +1/+0 and gain lifelink. - Effect effect = new BoostControlledEffect(1, 0, Duration.UntilYourNextTurn, new FilterCreaturePermanent()); + Effect effect = new BoostControlledEffect(1, 0, Duration.UntilYourNextTurn, StaticFilters.FILTER_PERMANENT_CREATURES); effect.setText("Until your next turn, creatures you control get +1/+0"); LoyaltyAbility loyaltyAbility = new LoyaltyAbility(effect, 1); - effect = new GainAbilityControlledEffect(LifelinkAbility.getInstance(), Duration.UntilYourNextTurn, new FilterCreaturePermanent()); + effect = new GainAbilityControlledEffect(LifelinkAbility.getInstance(), Duration.UntilYourNextTurn, StaticFilters.FILTER_PERMANENT_CREATURES); effect.setText("and gain lifelink"); loyaltyAbility.addEffect(effect); this.addAbility(loyaltyAbility); diff --git a/Mage.Sets/src/mage/cards/s/SoulBarrier.java b/Mage.Sets/src/mage/cards/s/SoulBarrier.java index 050153f01ab..b93b14dafe9 100644 --- a/Mage.Sets/src/mage/cards/s/SoulBarrier.java +++ b/Mage.Sets/src/mage/cards/s/SoulBarrier.java @@ -27,8 +27,6 @@ */ package mage.cards.s; -import java.util.UUID; - import mage.abilities.Ability; import mage.abilities.common.SpellCastOpponentTriggeredAbility; import mage.abilities.costs.mana.GenericManaCost; @@ -39,10 +37,12 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SetTargetPointer; import mage.constants.Zone; -import mage.filter.FilterSpell; +import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; +import java.util.UUID; + /** * * @author Galatolol @@ -53,8 +53,8 @@ public class SoulBarrier extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}"); // Whenever an opponent casts a creature spell, Soul Barrier deals 2 damage to that player unless he or she pays {2}. - this.addAbility(new SpellCastOpponentTriggeredAbility(Zone.BATTLEFIELD, new SoulBarrierEffect(), - new FilterSpell(),false, SetTargetPointer.PLAYER)); + this.addAbility(new SpellCastOpponentTriggeredAbility(Zone.BATTLEFIELD, new SoulBarrierEffect(), + StaticFilters.FILTER_SPELL,false, SetTargetPointer.PLAYER)); } public SoulBarrier(final SoulBarrier card) { diff --git a/Mage.Sets/src/mage/cards/s/SoulOfMagma.java b/Mage.Sets/src/mage/cards/s/SoulOfMagma.java index 285b076ddd0..50a43497f9b 100644 --- a/Mage.Sets/src/mage/cards/s/SoulOfMagma.java +++ b/Mage.Sets/src/mage/cards/s/SoulOfMagma.java @@ -28,32 +28,30 @@ package mage.cards.s; -import java.util.UUID; - -import mage.constants.CardType; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.constants.CardType; +import mage.filter.StaticFilters; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** * @author Loki */ public class SoulOfMagma extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); - public SoulOfMagma(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{R}{R}"); this.subtype.add("Spirit"); this.power = new MageInt(2); this.toughness = new MageInt(2); - Ability ability = new SpellCastControllerTriggeredAbility(new DamageTargetEffect(1), filter, false); + Ability ability = new SpellCastControllerTriggeredAbility(new DamageTargetEffect(1), StaticFilters.SPIRIT_OR_ARCANE_CARD, false); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/s/Soulquake.java b/Mage.Sets/src/mage/cards/s/Soulquake.java index d42e819883c..b437695c1c0 100644 --- a/Mage.Sets/src/mage/cards/s/Soulquake.java +++ b/Mage.Sets/src/mage/cards/s/Soulquake.java @@ -27,7 +27,6 @@ */ package mage.cards.s; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; @@ -36,12 +35,14 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; +import mage.filter.StaticFilters; import mage.filter.common.FilterCreatureCard; -import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; +import java.util.UUID; + /** * * @author jeffwadsworth @@ -67,7 +68,6 @@ public class Soulquake extends CardImpl { class SoulquakeEffect extends OneShotEffect { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature"); private static final FilterCreatureCard filter2 = new FilterCreatureCard("creature"); public SoulquakeEffect() { @@ -86,7 +86,7 @@ class SoulquakeEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game)) { + for (Permanent permanent : game.getBattlefield().getActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURE, source.getControllerId(), source.getSourceId(), game)) { permanent.moveToZone(Zone.HAND, source.getSourceId(), game, true); } for (UUID playerId : game.getState().getPlayersInRange(source.getControllerId(), game)) { diff --git a/Mage.Sets/src/mage/cards/s/SpelltitheEnforcer.java b/Mage.Sets/src/mage/cards/s/SpelltitheEnforcer.java index d2c05e3b0f2..f8ffdb87296 100644 --- a/Mage.Sets/src/mage/cards/s/SpelltitheEnforcer.java +++ b/Mage.Sets/src/mage/cards/s/SpelltitheEnforcer.java @@ -27,7 +27,6 @@ */ package mage.cards.s; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SpellCastOpponentTriggeredAbility; @@ -39,10 +38,12 @@ import mage.constants.CardType; import mage.constants.SetTargetPointer; import mage.constants.Zone; import mage.filter.FilterPermanent; -import mage.filter.FilterSpell; +import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; +import java.util.UUID; + /** * * @author LevelX2 @@ -60,7 +61,7 @@ public class SpelltitheEnforcer extends CardImpl { this.addAbility(new SpellCastOpponentTriggeredAbility( Zone.BATTLEFIELD, new SpelltitheEnforcerEffect(), - new FilterSpell(), + StaticFilters.FILTER_SPELL, false, SetTargetPointer.PLAYER )); diff --git a/Mage.Sets/src/mage/cards/s/SpidersilkArmor.java b/Mage.Sets/src/mage/cards/s/SpidersilkArmor.java index 7f19f6db784..609952555d7 100644 --- a/Mage.Sets/src/mage/cards/s/SpidersilkArmor.java +++ b/Mage.Sets/src/mage/cards/s/SpidersilkArmor.java @@ -27,7 +27,6 @@ */ package mage.cards.s; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.Effect; @@ -39,7 +38,9 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Zone; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; + +import java.util.UUID; /** * @@ -54,7 +55,7 @@ public class SpidersilkArmor extends CardImpl { Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostControlledEffect(0, 1, Duration.WhileOnBattlefield)); Effect effect = new GainAbilityControlledEffect(ReachAbility.getInstance(), - Duration.WhileOnBattlefield, new FilterCreaturePermanent()); + Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURES); effect.setText("and have reach."); ability.addEffect(effect); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/s/SpirebluffCanal.java b/Mage.Sets/src/mage/cards/s/SpirebluffCanal.java index 68877a6da48..8ed01680673 100644 --- a/Mage.Sets/src/mage/cards/s/SpirebluffCanal.java +++ b/Mage.Sets/src/mage/cards/s/SpirebluffCanal.java @@ -27,9 +27,6 @@ */ package mage.cards.s; -import java.util.UUID; - -import mage.constants.ComparisonType; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.condition.Condition; import mage.abilities.condition.InvertCondition; @@ -41,7 +38,10 @@ import mage.abilities.mana.RedManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.common.FilterLandPermanent; +import mage.constants.ComparisonType; +import mage.filter.StaticFilters; + +import java.util.UUID; /** * @@ -53,7 +53,7 @@ public class SpirebluffCanal extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.LAND},""); // Spirebluff Canal enters the battlefield tapped unless you control two or fewer other lands. - Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(new FilterLandPermanent(), ComparisonType.FEWER_THAN, 3)); + Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(StaticFilters.FILTER_LANDS, ComparisonType.FEWER_THAN, 3)); String abilityText = "tapped unless you control fewer than 3 lands"; this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText)); diff --git a/Mage.Sets/src/mage/cards/s/SplitDecision.java b/Mage.Sets/src/mage/cards/s/SplitDecision.java index cb123a7ef93..1fa440fc0c8 100644 --- a/Mage.Sets/src/mage/cards/s/SplitDecision.java +++ b/Mage.Sets/src/mage/cards/s/SplitDecision.java @@ -27,7 +27,6 @@ */ package mage.cards.s; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CopyTargetSpellEffect; @@ -35,33 +34,25 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; -import mage.filter.FilterSpell; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; import mage.target.TargetSpell; +import java.util.UUID; + /** * * @author fireshoes */ public class SplitDecision extends CardImpl { - private static final FilterSpell filter = new FilterSpell("instant or sorcery spell"); - - static { - filter.add(Predicates.or( - new CardTypePredicate(CardType.INSTANT), - new CardTypePredicate(CardType.SORCERY))); - } - public SplitDecision(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{1}{U}"); // Will of the council - Choose target instant or sorcery spell. Starting with you, each player votes for denial or duplication. If denial gets more votes, counter the spell. If duplication gets more votes or the vote is tied, copy the spell. You may choose new targets for the copy. this.getSpellAbility().addEffect(new SplitDecisionEffect()); - this.getSpellAbility().addTarget(new TargetSpell(filter)); + this.getSpellAbility().addTarget(new TargetSpell(StaticFilters.FILTER_INSTANT_OR_SORCERY_SPELL)); } public SplitDecision(final SplitDecision card) { diff --git a/Mage.Sets/src/mage/cards/s/StampedeDriver.java b/Mage.Sets/src/mage/cards/s/StampedeDriver.java index 2ebd8bae673..381082893ae 100644 --- a/Mage.Sets/src/mage/cards/s/StampedeDriver.java +++ b/Mage.Sets/src/mage/cards/s/StampedeDriver.java @@ -27,7 +27,6 @@ */ package mage.cards.s; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -42,9 +41,11 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Zone; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import mage.target.common.TargetCardInHand; +import java.util.UUID; + /** * * @author Backfir3 @@ -63,7 +64,7 @@ public class StampedeDriver extends CardImpl { Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostControlledEffect(1, 1, Duration.EndOfTurn), new ManaCostsImpl("{1}{G}")); ability.addCost(new TapSourceCost()); ability.addCost(new DiscardTargetCost(new TargetCardInHand())); - ability.addEffect(new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.EndOfTurn, new FilterCreaturePermanent())); + ability.addEffect(new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/s/StoneRain.java b/Mage.Sets/src/mage/cards/s/StoneRain.java index 220d2d4086e..2ed26d90acd 100644 --- a/Mage.Sets/src/mage/cards/s/StoneRain.java +++ b/Mage.Sets/src/mage/cards/s/StoneRain.java @@ -28,14 +28,15 @@ package mage.cards.s; -import java.util.UUID; -import mage.constants.CardType; import mage.abilities.effects.common.DestroyTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.filter.common.FilterLandPermanent; +import mage.constants.CardType; +import mage.filter.StaticFilters; import mage.target.TargetPermanent; +import java.util.UUID; + /** * * @author Loki @@ -45,7 +46,7 @@ public class StoneRain extends CardImpl { public StoneRain (UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{2}{R}"); - this.getSpellAbility().addTarget(new TargetPermanent(new FilterLandPermanent())); + this.getSpellAbility().addTarget(new TargetPermanent(StaticFilters.FILTER_LAND)); this.getSpellAbility().addEffect(new DestroyTargetEffect()); } diff --git a/Mage.Sets/src/mage/cards/s/StratusDancer.java b/Mage.Sets/src/mage/cards/s/StratusDancer.java index dd3b1c2df50..0018b7cf585 100644 --- a/Mage.Sets/src/mage/cards/s/StratusDancer.java +++ b/Mage.Sets/src/mage/cards/s/StratusDancer.java @@ -27,7 +27,6 @@ */ package mage.cards.s; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.TurnedFaceUpSourceTriggeredAbility; @@ -39,23 +38,16 @@ import mage.abilities.keyword.MorphAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.FilterSpell; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.StaticFilters; import mage.target.TargetSpell; +import java.util.UUID; + /** * * @author jeffwadsworth */ public class StratusDancer extends CardImpl { - - private final static FilterSpell filter = new FilterSpell("instant or sorcery spell"); - - static { - filter.add(Predicates.or(new CardTypePredicate(CardType.INSTANT), - new CardTypePredicate(CardType.SORCERY))); - } public StratusDancer(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{U}"); @@ -74,7 +66,7 @@ public class StratusDancer extends CardImpl { Effect effect = new CounterTargetEffect(); effect.setText("counter target instant or sorcery spell"); Ability ability = new TurnedFaceUpSourceTriggeredAbility(effect, false); - ability.addTarget(new TargetSpell(filter)); + ability.addTarget(new TargetSpell(StaticFilters.FILTER_INSTANT_OR_SORCERY_SPELL)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/s/StructuralCollapse.java b/Mage.Sets/src/mage/cards/s/StructuralCollapse.java index 8d5e3367b1b..abe0965dadb 100644 --- a/Mage.Sets/src/mage/cards/s/StructuralCollapse.java +++ b/Mage.Sets/src/mage/cards/s/StructuralCollapse.java @@ -27,16 +27,17 @@ */ package mage.cards.s; -import java.util.UUID; -import mage.constants.CardType; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.SacrificeEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.StaticFilters; import mage.filter.common.FilterArtifactPermanent; -import mage.filter.common.FilterLandPermanent; import mage.target.TargetPlayer; +import java.util.UUID; + /** * * @author Plopman @@ -49,7 +50,7 @@ public class StructuralCollapse extends CardImpl { // Target player sacrifices an artifact and a land. Structural Collapse deals 2 damage to that player. this.getSpellAbility().addEffect(new SacrificeEffect(new FilterArtifactPermanent(), 1, "Target player")); - this.getSpellAbility().addEffect(new SacrificeEffect(new FilterLandPermanent(), 1, "Target player")); + this.getSpellAbility().addEffect(new SacrificeEffect(StaticFilters.FILTER_LANDS, 1, "Target player")); this.getSpellAbility().addEffect(new DamageTargetEffect(2)); this.getSpellAbility().addTarget(new TargetPlayer()); } diff --git a/Mage.Sets/src/mage/cards/s/Sunder.java b/Mage.Sets/src/mage/cards/s/Sunder.java index c759c0578bf..f05bfe5a0e2 100644 --- a/Mage.Sets/src/mage/cards/s/Sunder.java +++ b/Mage.Sets/src/mage/cards/s/Sunder.java @@ -27,12 +27,13 @@ */ package mage.cards.s; -import java.util.UUID; import mage.abilities.effects.common.ReturnToHandFromBattlefieldAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.common.FilterLandPermanent; +import mage.filter.StaticFilters; + +import java.util.UUID; /** * @@ -44,7 +45,7 @@ public class Sunder extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{3}{U}{U}"); // Return all lands to their owners' hands. - this.getSpellAbility().addEffect(new ReturnToHandFromBattlefieldAllEffect(new FilterLandPermanent("lands"))); + this.getSpellAbility().addEffect(new ReturnToHandFromBattlefieldAllEffect(StaticFilters.FILTER_LANDS)); } public Sunder(final Sunder card) { diff --git a/Mage.Sets/src/mage/cards/t/TaintedAether.java b/Mage.Sets/src/mage/cards/t/TaintedAether.java index 5c10108fcb9..f39af6efa7b 100644 --- a/Mage.Sets/src/mage/cards/t/TaintedAether.java +++ b/Mage.Sets/src/mage/cards/t/TaintedAether.java @@ -27,18 +27,19 @@ */ package mage.cards.t; -import java.util.UUID; import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; import mage.abilities.effects.common.SacrificeEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.SetTargetPointer; import mage.constants.Zone; +import mage.filter.StaticFilters; import mage.filter.common.FilterControlledPermanent; -import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; -import mage.constants.SetTargetPointer; + +import java.util.UUID; /** * @@ -58,7 +59,7 @@ public class TaintedAether extends CardImpl { // Whenever a creature enters the battlefield, its controller sacrifices a creature or land. this.addAbility(new EntersBattlefieldAllTriggeredAbility(Zone.BATTLEFIELD, new SacrificeEffect(filter, 1, ""), - new FilterCreaturePermanent(), false, SetTargetPointer.PLAYER, + StaticFilters.FILTER_PERMANENT_CREATURES, false, SetTargetPointer.PLAYER, "Whenever a creature enters the battlefield, its controller sacrifices a creature or land")); } diff --git a/Mage.Sets/src/mage/cards/t/Tallowisp.java b/Mage.Sets/src/mage/cards/t/Tallowisp.java index 6772ae2150b..11ac5d39358 100644 --- a/Mage.Sets/src/mage/cards/t/Tallowisp.java +++ b/Mage.Sets/src/mage/cards/t/Tallowisp.java @@ -27,8 +27,6 @@ */ package mage.cards.t; -import java.util.UUID; -import mage.constants.CardType; import mage.MageInt; import mage.MageObject; import mage.abilities.Abilities; @@ -38,16 +36,18 @@ import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; import mage.abilities.keyword.EnchantAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.constants.CardType; import mage.constants.SubType; import mage.filter.FilterCard; -import mage.filter.FilterSpell; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.filter.StaticFilters; import mage.filter.predicate.Predicate; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.game.Game; import mage.target.common.TargetCardInLibrary; +import java.util.UUID; + /** * * @author LevelX2 @@ -55,7 +55,6 @@ import mage.target.common.TargetCardInLibrary; public class Tallowisp extends CardImpl { private static final FilterCard filterAura = new FilterCard("Aura card"); - private static final FilterSpell filterTrigger = new FilterSpiritOrArcaneCard(); static { filterAura.add(new CardTypePredicate(CardType.ENCHANTMENT)); @@ -71,7 +70,7 @@ public class Tallowisp extends CardImpl { this.toughness = new MageInt(3); // Whenever you cast a Spirit or Arcane spell, you may search your library for an Aura card with enchant creature, reveal it, and put it into your hand. If you do, shuffle your library. - this.addAbility(new SpellCastControllerTriggeredAbility(new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filterAura), true, true), filterTrigger, true)); + this.addAbility(new SpellCastControllerTriggeredAbility(new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filterAura), true, true), StaticFilters.SPIRIT_OR_ARCANE_CARD, true)); } public Tallowisp(final Tallowisp card) { diff --git a/Mage.Sets/src/mage/cards/t/TamiyoFieldResearcher.java b/Mage.Sets/src/mage/cards/t/TamiyoFieldResearcher.java index 9e71e2efb16..85651043826 100644 --- a/Mage.Sets/src/mage/cards/t/TamiyoFieldResearcher.java +++ b/Mage.Sets/src/mage/cards/t/TamiyoFieldResearcher.java @@ -27,9 +27,6 @@ */ package mage.cards.t; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; import mage.MageObjectReference; import mage.abilities.Ability; import mage.abilities.DelayedTriggeredAbility; @@ -46,7 +43,7 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; import mage.filter.FilterPermanent; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.game.Game; @@ -58,6 +55,10 @@ import mage.players.Player; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + /** * * @author LevelX2 @@ -78,7 +79,7 @@ public class TamiyoFieldResearcher extends CardImpl { // +1: Choose up to two target creatures. Until your next turn, whenever either of those creatures deals combat damage, you draw a card. Ability ability = new LoyaltyAbility(new TamiyoFieldResearcherEffect1(), 1); - ability.addTarget(new TargetCreaturePermanent(0, 2, new FilterCreaturePermanent("creatures"), false)); + ability.addTarget(new TargetCreaturePermanent(0, 2, StaticFilters.FILTER_PERMANENT_CREATURES, false)); this.addAbility(ability); // -2: Tap up to two target nonland permanents. They don't untap during their controller's next untap step. diff --git a/Mage.Sets/src/mage/cards/t/TectonicEdge.java b/Mage.Sets/src/mage/cards/t/TectonicEdge.java index 91b7589d698..37c96cb87b9 100644 --- a/Mage.Sets/src/mage/cards/t/TectonicEdge.java +++ b/Mage.Sets/src/mage/cards/t/TectonicEdge.java @@ -28,9 +28,7 @@ package mage.cards.t; -import java.util.UUID; import mage.abilities.Ability; -import mage.constants.ComparisonType; import mage.abilities.common.ActivateIfConditionActivatedAbility; import mage.abilities.condition.common.OpponentControlsPermanentCondition; import mage.abilities.costs.Cost; @@ -43,11 +41,15 @@ import mage.abilities.mana.ColorlessManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.ComparisonType; import mage.constants.Zone; +import mage.filter.StaticFilters; import mage.filter.common.FilterLandPermanent; import mage.game.Game; import mage.target.common.TargetNonBasicLandPermanent; +import java.util.UUID; + /** * * @author BetaSteward_at_googlemail.com @@ -87,7 +89,6 @@ public class TectonicEdge extends CardImpl { class TectonicEdgeCost extends CostImpl { - private static final FilterLandPermanent filter = new FilterLandPermanent(); public TectonicEdgeCost() { this.text = "Activate this ability only if an opponent controls four or more lands"; @@ -105,7 +106,7 @@ class TectonicEdgeCost extends CostImpl { @Override public boolean canPay(Ability ability, UUID sourceId, UUID controllerId, Game game) { for (UUID opponentId: game.getOpponents(controllerId)) { - if (game.getBattlefield().countAll(filter, opponentId, game) > 3) { + if (game.getBattlefield().countAll(StaticFilters.FILTER_LANDS, opponentId, game) > 3) { return true; } } diff --git a/Mage.Sets/src/mage/cards/t/TectonicInstability.java b/Mage.Sets/src/mage/cards/t/TectonicInstability.java index 0a392663295..414ad63984c 100644 --- a/Mage.Sets/src/mage/cards/t/TectonicInstability.java +++ b/Mage.Sets/src/mage/cards/t/TectonicInstability.java @@ -27,7 +27,6 @@ */ package mage.cards.t; -import java.util.UUID; import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; import mage.abilities.effects.common.TapAllTargetPlayerControlsEffect; import mage.cards.CardImpl; @@ -35,8 +34,11 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SetTargetPointer; import mage.constants.Zone; +import mage.filter.StaticFilters; import mage.filter.common.FilterLandPermanent; +import java.util.UUID; + /** * * @author LoneFox @@ -49,7 +51,7 @@ public class TectonicInstability extends CardImpl { // Whenever a land enters the battlefield, tap all lands its controller controls. this.addAbility(new EntersBattlefieldAllTriggeredAbility(Zone.BATTLEFIELD, - new TapAllTargetPlayerControlsEffect(new FilterLandPermanent()), new FilterLandPermanent(), + new TapAllTargetPlayerControlsEffect(new FilterLandPermanent()), StaticFilters.FILTER_LANDS, false, SetTargetPointer.PLAYER, "Whenever a land enters the battlefield, tap all lands its controller controls.")); } diff --git a/Mage.Sets/src/mage/cards/t/TellerOfTales.java b/Mage.Sets/src/mage/cards/t/TellerOfTales.java index 5724bb0a088..98644e1df49 100644 --- a/Mage.Sets/src/mage/cards/t/TellerOfTales.java +++ b/Mage.Sets/src/mage/cards/t/TellerOfTales.java @@ -29,8 +29,6 @@ */ package mage.cards.t; -import java.util.UUID; -import mage.constants.CardType; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SpellCastControllerTriggeredAbility; @@ -38,22 +36,22 @@ import mage.abilities.effects.common.MayTapOrUntapTargetEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.constants.CardType; +import mage.filter.StaticFilters; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** - * * @author Ludwig */ public class TellerOfTales extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); - - // Outcome.Benefit, "tap or untap target creature" + // Outcome.Benefit, "tap or untap target creature" public TellerOfTales(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{U}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}{U}"); this.subtype.add("Spirit"); this.power = new MageInt(3); @@ -61,7 +59,7 @@ public class TellerOfTales extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); // Whenever you cast a Spirit or Arcane spell, you may tap or untap target creature. - Ability ability = new SpellCastControllerTriggeredAbility(new MayTapOrUntapTargetEffect(),filter, true); + Ability ability = new SpellCastControllerTriggeredAbility(new MayTapOrUntapTargetEffect(), StaticFilters.SPIRIT_OR_ARCANE_CARD, true); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/t/Tephraderm.java b/Mage.Sets/src/mage/cards/t/Tephraderm.java index 8b08f37e3c7..3191fc5d81d 100644 --- a/Mage.Sets/src/mage/cards/t/Tephraderm.java +++ b/Mage.Sets/src/mage/cards/t/Tephraderm.java @@ -27,7 +27,6 @@ */ package mage.cards.t; -import java.util.UUID; import mage.MageInt; import mage.abilities.TriggeredAbility; import mage.abilities.TriggeredAbilityImpl; @@ -38,7 +37,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; -import mage.filter.FilterSpell; +import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.events.GameEvent; @@ -46,6 +45,8 @@ import mage.game.permanent.Permanent; import mage.game.stack.StackObject; import mage.target.targetpointer.FixedTarget; +import java.util.UUID; + /** * * @author Quercitron @@ -125,8 +126,6 @@ class TephradermCreatureDamageTriggeredAbility extends TriggeredAbilityImpl { class TephradermSpellDamageTriggeredAbility extends TriggeredAbilityImpl { - private static final FilterSpell FILTER_SPELL = new FilterSpell(); - public TephradermSpellDamageTriggeredAbility() { super(Zone.BATTLEFIELD, new DamageTargetEffect(0)); } @@ -147,7 +146,7 @@ class TephradermSpellDamageTriggeredAbility extends TriggeredAbilityImpl { } StackObject sourceSpell = game.getStack().getStackObject(event.getSourceId()); - if (sourceSpell != null && FILTER_SPELL.match(sourceSpell, getSourceId(), getControllerId(), game)) { + if (sourceSpell != null && StaticFilters.FILTER_SPELL.match(sourceSpell, getSourceId(), getControllerId(), game)) { for (Effect effect : getEffects()) { if (effect instanceof DamageTargetEffect) { effect.setTargetPointer(new FixedTarget(sourceSpell.getControllerId())); diff --git a/Mage.Sets/src/mage/cards/t/Terminus.java b/Mage.Sets/src/mage/cards/t/Terminus.java index d735dfb3ab3..5fb567c1afd 100644 --- a/Mage.Sets/src/mage/cards/t/Terminus.java +++ b/Mage.Sets/src/mage/cards/t/Terminus.java @@ -27,21 +27,22 @@ */ package mage.cards.t; -import java.util.List; -import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Zone; import mage.abilities.Ability; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.OneShotEffect; import mage.abilities.keyword.MiracleAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.filter.common.FilterCreaturePermanent; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; +import java.util.List; +import java.util.UUID; + /** * * @author North @@ -88,7 +89,7 @@ class TerminusEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { List permanents = game.getBattlefield().getActivePermanents( - new FilterCreaturePermanent(), source.getControllerId(), source.getSourceId(), game); + StaticFilters.FILTER_PERMANENT_CREATURES, source.getControllerId(), source.getSourceId(), game); for (Permanent permanent : permanents) { permanent.moveToZone(Zone.LIBRARY, source.getSourceId(), game, false); } diff --git a/Mage.Sets/src/mage/cards/t/TheTabernacleAtPendrellVale.java b/Mage.Sets/src/mage/cards/t/TheTabernacleAtPendrellVale.java index a4493efd799..437a9060100 100644 --- a/Mage.Sets/src/mage/cards/t/TheTabernacleAtPendrellVale.java +++ b/Mage.Sets/src/mage/cards/t/TheTabernacleAtPendrellVale.java @@ -27,9 +27,6 @@ */ package mage.cards.t; -import java.util.UUID; - -import mage.constants.*; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -40,11 +37,14 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.GainAbilityAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.filter.common.FilterCreaturePermanent; +import mage.constants.*; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; +import java.util.UUID; + /** * * @author Plopman @@ -57,7 +57,7 @@ public class TheTabernacleAtPendrellVale extends CardImpl { // All creatures have "At the beginning of your upkeep, destroy this creature unless you pay {1}." Ability ability = new BeginningOfUpkeepTriggeredAbility(new DestroySourceUnlessPaysEffect(new ManaCostsImpl("{1}")), TargetController.YOU, false); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAllEffect(ability, Duration.WhileOnBattlefield, new FilterCreaturePermanent("Creatures")))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAllEffect(ability, Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURES))); } public TheTabernacleAtPendrellVale(final TheTabernacleAtPendrellVale card) { diff --git a/Mage.Sets/src/mage/cards/t/ThiefOfHope.java b/Mage.Sets/src/mage/cards/t/ThiefOfHope.java index 385f12fc935..dad06e23403 100644 --- a/Mage.Sets/src/mage/cards/t/ThiefOfHope.java +++ b/Mage.Sets/src/mage/cards/t/ThiefOfHope.java @@ -28,9 +28,6 @@ package mage.cards.t; -import java.util.UUID; - -import mage.constants.CardType; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SpellCastControllerTriggeredAbility; @@ -39,23 +36,24 @@ import mage.abilities.effects.common.LoseLifeTargetEffect; import mage.abilities.keyword.SoulshiftAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.constants.CardType; +import mage.filter.StaticFilters; import mage.target.common.TargetOpponent; +import java.util.UUID; + /** * @author Loki */ public class ThiefOfHope extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); - public ThiefOfHope(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{B}"); this.subtype.add("Spirit"); this.power = new MageInt(2); this.toughness = new MageInt(2); - Ability ability = new SpellCastControllerTriggeredAbility(new LoseLifeTargetEffect(1), filter, false); + Ability ability = new SpellCastControllerTriggeredAbility(new LoseLifeTargetEffect(1), StaticFilters.SPIRIT_OR_ARCANE_CARD, false); ability.addEffect(new GainLifeEffect(1)); ability.addTarget(new TargetOpponent()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/t/TitanicUltimatum.java b/Mage.Sets/src/mage/cards/t/TitanicUltimatum.java index fa96d444b5f..a9c240c413f 100644 --- a/Mage.Sets/src/mage/cards/t/TitanicUltimatum.java +++ b/Mage.Sets/src/mage/cards/t/TitanicUltimatum.java @@ -27,9 +27,6 @@ */ package mage.cards.t; -import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Duration; import mage.abilities.effects.common.continuous.BoostControlledEffect; import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; import mage.abilities.keyword.FirstStrikeAbility; @@ -37,24 +34,27 @@ import mage.abilities.keyword.LifelinkAbility; import mage.abilities.keyword.TrampleAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.filter.common.FilterCreaturePermanent; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.filter.StaticFilters; + +import java.util.UUID; /** * * @author North, Eugen */ public class TitanicUltimatum extends CardImpl { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures"); public TitanicUltimatum(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{R}{R}{G}{G}{G}{W}{W}"); // Until end of turn, creatures you control get +5/+5 and gain first strike, lifelink, and trample. - this.getSpellAbility().addEffect(new BoostControlledEffect(5, 5, Duration.EndOfTurn, filter)); - this.getSpellAbility().addEffect(new GainAbilityControlledEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn, filter)); - this.getSpellAbility().addEffect(new GainAbilityControlledEffect(LifelinkAbility.getInstance(), Duration.EndOfTurn, filter)); - this.getSpellAbility().addEffect(new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.EndOfTurn, filter)); + this.getSpellAbility().addEffect(new BoostControlledEffect(5, 5, Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES)); + this.getSpellAbility().addEffect(new GainAbilityControlledEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES)); + this.getSpellAbility().addEffect(new GainAbilityControlledEffect(LifelinkAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES)); + this.getSpellAbility().addEffect(new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES)); } public TitanicUltimatum(final TitanicUltimatum card) { diff --git a/Mage.Sets/src/mage/cards/t/TreacherousTerrain.java b/Mage.Sets/src/mage/cards/t/TreacherousTerrain.java index 244d06ebdbb..684b1950776 100644 --- a/Mage.Sets/src/mage/cards/t/TreacherousTerrain.java +++ b/Mage.Sets/src/mage/cards/t/TreacherousTerrain.java @@ -27,8 +27,6 @@ */ package mage.cards.t; -import java.util.List; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.OneShotEffect; @@ -37,11 +35,14 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; -import mage.filter.common.FilterLandPermanent; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; +import java.util.List; +import java.util.UUID; + /** * * @author Styxo @@ -81,7 +82,7 @@ class TreacherousTerrainEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - List permanents = game.getBattlefield().getActivePermanents(new FilterLandPermanent(), source.getControllerId(), source.getSourceId(), game); + List permanents = game.getBattlefield().getActivePermanents(StaticFilters.FILTER_LAND, source.getControllerId(), source.getSourceId(), game); for (UUID playerId : game.getOpponents(source.getControllerId())) { Player player = game.getPlayer(playerId); if (player != null) { diff --git a/Mage.Sets/src/mage/cards/t/TrialOfAmbition.java b/Mage.Sets/src/mage/cards/t/TrialOfAmbition.java index f431660c011..ac457d70fb5 100644 --- a/Mage.Sets/src/mage/cards/t/TrialOfAmbition.java +++ b/Mage.Sets/src/mage/cards/t/TrialOfAmbition.java @@ -27,7 +27,6 @@ */ package mage.cards.t; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; @@ -37,11 +36,13 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; +import mage.filter.StaticFilters; import mage.filter.common.FilterControlledPermanent; -import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.target.common.TargetOpponent; +import java.util.UUID; + /** * * @author fireshoes @@ -58,7 +59,7 @@ public class TrialOfAmbition extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}"); // When Trial of Ambition enters the battlefield, target opponent sacrifices a creature. - Ability ability = new EntersBattlefieldTriggeredAbility(new SacrificeEffect(new FilterCreaturePermanent(), 1, "target opponent")); + Ability ability = new EntersBattlefieldTriggeredAbility(new SacrificeEffect(StaticFilters.FILTER_PERMANENT_CREATURES, 1, "target opponent")); ability.addTarget(new TargetOpponent()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/t/TriumphOfTheHordes.java b/Mage.Sets/src/mage/cards/t/TriumphOfTheHordes.java index 0193a812284..c60b506914c 100644 --- a/Mage.Sets/src/mage/cards/t/TriumphOfTheHordes.java +++ b/Mage.Sets/src/mage/cards/t/TriumphOfTheHordes.java @@ -35,7 +35,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import java.util.UUID; @@ -44,15 +44,14 @@ import java.util.UUID; */ public class TriumphOfTheHordes extends CardImpl { - private FilterCreaturePermanent filterCreaturePermanent = new FilterCreaturePermanent(); public TriumphOfTheHordes(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{G}{G}"); this.getSpellAbility().addEffect(new BoostControlledEffect(1, 1, Duration.EndOfTurn)); - this.getSpellAbility().addEffect(new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.EndOfTurn, filterCreaturePermanent)); - this.getSpellAbility().addEffect(new GainAbilityControlledEffect(InfectAbility.getInstance(), Duration.EndOfTurn, filterCreaturePermanent)); + this.getSpellAbility().addEffect(new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES)); + this.getSpellAbility().addEffect(new GainAbilityControlledEffect(InfectAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES)); } public TriumphOfTheHordes(final TriumphOfTheHordes card) { diff --git a/Mage.Sets/src/mage/cards/t/Twincast.java b/Mage.Sets/src/mage/cards/t/Twincast.java index f7748ec571d..3af0001537a 100644 --- a/Mage.Sets/src/mage/cards/t/Twincast.java +++ b/Mage.Sets/src/mage/cards/t/Twincast.java @@ -27,36 +27,27 @@ */ package mage.cards.t; -import java.util.UUID; -import mage.constants.CardType; import mage.abilities.effects.common.CopyTargetSpellEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.filter.FilterSpell; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.constants.CardType; +import mage.filter.StaticFilters; import mage.target.TargetSpell; +import java.util.UUID; + /** * * @author Loki */ public class Twincast extends CardImpl { - private static final FilterSpell filter = new FilterSpell("instant or sorcery spell"); - - static { - filter.add(Predicates.or( - new CardTypePredicate(CardType.INSTANT), - new CardTypePredicate(CardType.SORCERY))); - } - public Twincast(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{U}{U}"); // Copy target instant or sorcery spell. You may choose new targets for the copy. this.getSpellAbility().addEffect(new CopyTargetSpellEffect()); - this.getSpellAbility().addTarget(new TargetSpell(filter)); + this.getSpellAbility().addTarget(new TargetSpell(StaticFilters.FILTER_INSTANT_OR_SORCERY_SPELL)); } public Twincast(final Twincast card) { diff --git a/Mage.Sets/src/mage/cards/u/Undermine.java b/Mage.Sets/src/mage/cards/u/Undermine.java index 13965dc7135..9f6910dc9e7 100644 --- a/Mage.Sets/src/mage/cards/u/Undermine.java +++ b/Mage.Sets/src/mage/cards/u/Undermine.java @@ -27,15 +27,16 @@ */ package mage.cards.u; -import java.util.UUID; import mage.abilities.effects.common.CounterTargetEffect; import mage.abilities.effects.common.LoseLifeTargetControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.FilterSpell; +import mage.filter.StaticFilters; import mage.target.TargetSpell; +import java.util.UUID; + /** * * @author LevelX2 @@ -47,7 +48,7 @@ public class Undermine extends CardImpl { // Counter target spell. Its controller loses 3 life. - this.getSpellAbility().addTarget(new TargetSpell(new FilterSpell())); + this.getSpellAbility().addTarget(new TargetSpell(StaticFilters.FILTER_SPELL)); this.getSpellAbility().addEffect(new CounterTargetEffect()); this.getSpellAbility().addEffect(new LoseLifeTargetControllerEffect(3)); diff --git a/Mage.Sets/src/mage/cards/u/UrborgJustice.java b/Mage.Sets/src/mage/cards/u/UrborgJustice.java index 72068f62d99..0838d406a10 100644 --- a/Mage.Sets/src/mage/cards/u/UrborgJustice.java +++ b/Mage.Sets/src/mage/cards/u/UrborgJustice.java @@ -27,8 +27,6 @@ */ package mage.cards.u; -import java.util.UUID; - import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.effects.Effect; @@ -36,11 +34,13 @@ import mage.abilities.effects.common.SacrificeEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import mage.game.Game; import mage.target.common.TargetOpponent; import mage.watchers.common.CreaturesDiedWatcher; +import java.util.UUID; + /** * * @author andyfries @@ -52,7 +52,7 @@ public class UrborgJustice extends CardImpl { // Target opponent sacrifices a creature for each creature put into your graveyard from the battlefield this turn. this.getSpellAbility().addWatcher(new CreaturesDiedWatcher()); - SacrificeEffect sacrificeEffect = new SacrificeEffect(new FilterCreaturePermanent(), new UrborgJusticeDynamicValue(), ""); + SacrificeEffect sacrificeEffect = new SacrificeEffect(StaticFilters.FILTER_PERMANENT_CREATURE, new UrborgJusticeDynamicValue(), ""); sacrificeEffect.setText("Target opponent sacrifices a creature for each creature put into your graveyard from the battlefield this turn"); this.getSpellAbility().addEffect(sacrificeEffect); diff --git a/Mage.Sets/src/mage/cards/u/UrgeToFeed.java b/Mage.Sets/src/mage/cards/u/UrgeToFeed.java index 095e17ac33d..2cab1490751 100644 --- a/Mage.Sets/src/mage/cards/u/UrgeToFeed.java +++ b/Mage.Sets/src/mage/cards/u/UrgeToFeed.java @@ -27,7 +27,6 @@ */ package mage.cards.u; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; @@ -44,20 +43,21 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** * * @author jeffwadsworth */ public class UrgeToFeed extends CardImpl { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(); public UrgeToFeed(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{B}{B}"); // Target creature gets -3/-3 until end of turn. You may tap any number of untapped Vampire creatures you control. If you do, put a +1/+1 counter on each of those Vampires. this.getSpellAbility().addEffect(new BoostTargetEffect(-3, -3, Duration.EndOfTurn)); - this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); this.getSpellAbility().addEffect(new UrgeToFeedEffect()); } diff --git a/Mage.Sets/src/mage/cards/u/UyoSilentProphet.java b/Mage.Sets/src/mage/cards/u/UyoSilentProphet.java index 62b3693d690..ecb14a3d781 100644 --- a/Mage.Sets/src/mage/cards/u/UyoSilentProphet.java +++ b/Mage.Sets/src/mage/cards/u/UyoSilentProphet.java @@ -39,10 +39,8 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SuperType; import mage.constants.Zone; -import mage.filter.FilterSpell; +import mage.filter.StaticFilters; import mage.filter.common.FilterControlledLandPermanent; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; import mage.target.TargetSpell; import mage.target.common.TargetControlledPermanent; @@ -54,14 +52,6 @@ import java.util.UUID; */ public class UyoSilentProphet extends CardImpl { - private static final FilterSpell filter = new FilterSpell("instant or sorcery spell"); - - static { - filter.add(Predicates.or( - new CardTypePredicate(CardType.INSTANT), - new CardTypePredicate(CardType.SORCERY))); - } - public UyoSilentProphet(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{U}{U}"); addSuperType(SuperType.LEGENDARY); @@ -76,7 +66,7 @@ public class UyoSilentProphet extends CardImpl { // {2}, Return two lands you control to their owner's hand: Copy target instant or sorcery spell. You may choose new targets for the copy. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CopyTargetSpellEffect(), new GenericManaCost(2)); ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(2, 2, new FilterControlledLandPermanent("lands"), false))); - ability.addTarget(new TargetSpell(filter)); + ability.addTarget(new TargetSpell(StaticFilters.FILTER_INSTANT_OR_SORCERY_SPELL)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/v/VenserTheSojourner.java b/Mage.Sets/src/mage/cards/v/VenserTheSojourner.java index 16207988d03..87f6f0bc307 100644 --- a/Mage.Sets/src/mage/cards/v/VenserTheSojourner.java +++ b/Mage.Sets/src/mage/cards/v/VenserTheSojourner.java @@ -27,7 +27,6 @@ */ package mage.cards.v; -import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; @@ -40,13 +39,9 @@ import mage.abilities.effects.common.ReturnToBattlefieldUnderYourControlTargetEf import mage.abilities.effects.common.combat.CantBeBlockedAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.TargetController; -import mage.constants.Zone; +import mage.constants.*; import mage.filter.FilterPermanent; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import mage.filter.predicate.other.OwnerPredicate; import mage.game.Game; import mage.game.command.emblems.VenserTheSojournerEmblem; @@ -56,6 +51,8 @@ import mage.target.Target; import mage.target.TargetPermanent; import mage.target.targetpointer.FixedTarget; +import java.util.UUID; + /** * @author nantuko */ @@ -80,7 +77,7 @@ public class VenserTheSojourner extends CardImpl { this.addAbility(ability1); // -1: Creatures can't be blocked this turn. - this.addAbility(new LoyaltyAbility(new CantBeBlockedAllEffect(new FilterCreaturePermanent("Creatures"), Duration.EndOfTurn), -1)); + this.addAbility(new LoyaltyAbility(new CantBeBlockedAllEffect(StaticFilters.FILTER_PERMANENT_CREATURES, Duration.EndOfTurn), -1)); // -8: You get an emblem with "Whenever you cast a spell, exile target permanent." LoyaltyAbility ability2 = new LoyaltyAbility(new GetEmblemEffect(new VenserTheSojournerEmblem()), -8); diff --git a/Mage.Sets/src/mage/cards/v/VodalianMystic.java b/Mage.Sets/src/mage/cards/v/VodalianMystic.java index f9418d1ebe1..937160a3d35 100644 --- a/Mage.Sets/src/mage/cards/v/VodalianMystic.java +++ b/Mage.Sets/src/mage/cards/v/VodalianMystic.java @@ -27,7 +27,6 @@ */ package mage.cards.v; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -38,25 +37,17 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Zone; -import mage.filter.FilterSpell; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.StaticFilters; import mage.target.TargetSpell; +import java.util.UUID; + /** * * @author LoneFox */ public class VodalianMystic extends CardImpl { - private static final FilterSpell filter = new FilterSpell("instant or sorcery spell"); - - static { - filter.add(Predicates.or( - new CardTypePredicate(CardType.INSTANT), - new CardTypePredicate(CardType.SORCERY))); - } - public VodalianMystic(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{U}"); this.subtype.add("Merfolk"); @@ -66,7 +57,7 @@ public class VodalianMystic extends CardImpl { // {T}: Target instant or sorcery spell becomes the color of your choice. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesColorTargetEffect(Duration.WhileOnStack), new TapSourceCost()); - ability.addTarget(new TargetSpell(filter)); + ability.addTarget(new TargetSpell(StaticFilters.FILTER_INSTANT_OR_SORCERY_SPELL)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/w/WaxmaneBaku.java b/Mage.Sets/src/mage/cards/w/WaxmaneBaku.java index e88cbeecd28..c46db7451cf 100644 --- a/Mage.Sets/src/mage/cards/w/WaxmaneBaku.java +++ b/Mage.Sets/src/mage/cards/w/WaxmaneBaku.java @@ -28,11 +28,6 @@ package mage.cards.w; -import java.util.List; -import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Zone; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -44,22 +39,25 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.constants.CardType; import mage.constants.Outcome; +import mage.constants.Zone; import mage.counters.CounterType; import mage.filter.FilterPermanent; +import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; -import mage.filter.common.FilterSpiritOrArcaneCard; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.TargetPermanent; +import java.util.List; +import java.util.UUID; + /** * @author LevelX2 */ public class WaxmaneBaku extends CardImpl { - private static final FilterSpiritOrArcaneCard filter = new FilterSpiritOrArcaneCard(); - public WaxmaneBaku(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{W}"); this.subtype.add("Spirit"); @@ -68,7 +66,7 @@ public class WaxmaneBaku extends CardImpl { this.toughness = new MageInt(2); // Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Waxmane Baku. - this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), filter, true)); + this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), StaticFilters.SPIRIT_OR_ARCANE_CARD, true)); // {1}, Remove X ki counters from Waxmane Baku: Tap X target creatures. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new WaxmaneBakuTapEffect(), new GenericManaCost(1)); diff --git a/Mage.Sets/src/mage/cards/w/WeatheredWayfarer.java b/Mage.Sets/src/mage/cards/w/WeatheredWayfarer.java index be81960a1e6..a4241504150 100644 --- a/Mage.Sets/src/mage/cards/w/WeatheredWayfarer.java +++ b/Mage.Sets/src/mage/cards/w/WeatheredWayfarer.java @@ -27,9 +27,6 @@ */ package mage.cards.w; -import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Zone; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.ActivateIfConditionActivatedAbility; @@ -39,10 +36,14 @@ import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; +import mage.filter.StaticFilters; import mage.filter.common.FilterLandCard; -import mage.filter.common.FilterLandPermanent; import mage.target.common.TargetCardInLibrary; +import java.util.UUID; + /** * * @author LevelX2 @@ -63,7 +64,7 @@ public class WeatheredWayfarer extends CardImpl { Zone.BATTLEFIELD, new SearchLibraryPutInHandEffect(new TargetCardInLibrary(new FilterLandCard()), true, true), new ManaCostsImpl("{W}"), - new OpponentControlsMoreCondition(new FilterLandPermanent("lands"))); + new OpponentControlsMoreCondition(StaticFilters.FILTER_LANDS)); ability.addCost(new TapSourceCost()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/w/WhipOfErebos.java b/Mage.Sets/src/mage/cards/w/WhipOfErebos.java index b7408e74e4c..7c3a332a98c 100644 --- a/Mage.Sets/src/mage/cards/w/WhipOfErebos.java +++ b/Mage.Sets/src/mage/cards/w/WhipOfErebos.java @@ -27,7 +27,6 @@ */ package mage.cards.w; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.DelayedTriggeredAbility; import mage.abilities.common.ActivateAsSorceryActivatedAbility; @@ -47,8 +46,8 @@ import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; +import mage.filter.StaticFilters; import mage.filter.common.FilterCreatureCard; -import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.ZoneChangeEvent; @@ -57,6 +56,8 @@ import mage.players.Player; import mage.target.common.TargetCardInYourGraveyard; import mage.target.targetpointer.FixedTarget; +import java.util.UUID; + /** * * @author LevelX2 @@ -68,7 +69,7 @@ public class WhipOfErebos extends CardImpl { addSuperType(SuperType.LEGENDARY); // Creatures you control have lifelink. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(LifelinkAbility.getInstance(), Duration.WhileOnBattlefield, new FilterCreaturePermanent("Creatures")))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(LifelinkAbility.getInstance(), Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURES))); // {2}{B}{B}, {T}: Return target creature card from your graveyard to the battlefield. // It gains haste. Exile it at the beginning of the next end step. // If it would leave the battlefield, exile it instead of putting it anywhere else. diff --git a/Mage.Sets/src/mage/cards/w/Wildfire.java b/Mage.Sets/src/mage/cards/w/Wildfire.java index 34ad8c0e8ba..aeb86af948c 100644 --- a/Mage.Sets/src/mage/cards/w/Wildfire.java +++ b/Mage.Sets/src/mage/cards/w/Wildfire.java @@ -27,15 +27,16 @@ */ package mage.cards.w; -import java.util.UUID; -import mage.constants.CardType; import mage.abilities.effects.common.DamageAllEffect; import mage.abilities.effects.common.SacrificeAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.StaticFilters; import mage.filter.common.FilterControlledLandPermanent; import mage.filter.common.FilterControlledPermanent; -import mage.filter.common.FilterCreaturePermanent; + +import java.util.UUID; /** * @@ -52,7 +53,7 @@ public class Wildfire extends CardImpl { //Each player sacrifices four lands. this.getSpellAbility().addEffect(new SacrificeAllEffect(4, filter)); //Wildfire deals 4 damage to each creature. - this.getSpellAbility().addEffect(new DamageAllEffect(4, new FilterCreaturePermanent())); + this.getSpellAbility().addEffect(new DamageAllEffect(4, StaticFilters.FILTER_PERMANENT_CREATURES)); } public Wildfire(final Wildfire card) { diff --git a/Mage.Sets/src/mage/cards/w/WoodbornBehemoth.java b/Mage.Sets/src/mage/cards/w/WoodbornBehemoth.java index ef34e9cb648..cff1a964210 100644 --- a/Mage.Sets/src/mage/cards/w/WoodbornBehemoth.java +++ b/Mage.Sets/src/mage/cards/w/WoodbornBehemoth.java @@ -27,10 +27,8 @@ */ package mage.cards.w; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.constants.ComparisonType; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; import mage.abilities.decorator.ConditionalContinuousEffect; @@ -40,9 +38,12 @@ import mage.abilities.keyword.TrampleAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.ComparisonType; import mage.constants.Duration; import mage.constants.Zone; -import mage.filter.common.FilterLandPermanent; +import mage.filter.StaticFilters; + +import java.util.UUID; /** * @@ -58,7 +59,7 @@ public class WoodbornBehemoth extends CardImpl { this.toughness = new MageInt(4); // As long as you control eight or more lands, Woodborn Behemoth gets +4/+4 and has trample. - PermanentsOnTheBattlefieldCondition eightOrMoreLandCondition = new PermanentsOnTheBattlefieldCondition(new FilterLandPermanent(), ComparisonType.MORE_THAN,7); + PermanentsOnTheBattlefieldCondition eightOrMoreLandCondition = new PermanentsOnTheBattlefieldCondition(StaticFilters.FILTER_LANDS, ComparisonType.MORE_THAN,7); ConditionalContinuousEffect effect1 = new ConditionalContinuousEffect( new BoostSourceEffect(4,4, Duration.WhileOnBattlefield), eightOrMoreLandCondition, "As long as you control eight or more lands, {this} gets +4/+4"); diff --git a/Mage.Sets/src/mage/cards/y/YokeOfTheDamned.java b/Mage.Sets/src/mage/cards/y/YokeOfTheDamned.java index a3feb2092b9..7fbe70589e6 100644 --- a/Mage.Sets/src/mage/cards/y/YokeOfTheDamned.java +++ b/Mage.Sets/src/mage/cards/y/YokeOfTheDamned.java @@ -27,7 +27,6 @@ */ package mage.cards.y; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.DiesCreatureTriggeredAbility; import mage.abilities.effects.common.AttachEffect; @@ -37,17 +36,18 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** * * @author jeffwadsworth */ public class YokeOfTheDamned extends CardImpl { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("a creature"); public YokeOfTheDamned(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{B}"); @@ -62,7 +62,7 @@ public class YokeOfTheDamned extends CardImpl { this.addAbility(ability); // When a creature dies, destroy enchanted creature. - this.addAbility(new DiesCreatureTriggeredAbility(new DestroyAttachedToEffect("enchanted creature"), false, filter)); + this.addAbility(new DiesCreatureTriggeredAbility(new DestroyAttachedToEffect("enchanted creature"), false, StaticFilters.FILTER_PERMANENT_A_CREATURE)); } diff --git a/Mage.Sets/src/mage/cards/y/YoungPyromancer.java b/Mage.Sets/src/mage/cards/y/YoungPyromancer.java index 84f2f5867f2..5e14f37823f 100644 --- a/Mage.Sets/src/mage/cards/y/YoungPyromancer.java +++ b/Mage.Sets/src/mage/cards/y/YoungPyromancer.java @@ -27,32 +27,23 @@ */ package mage.cards.y; -import java.util.UUID; import mage.MageInt; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.FilterSpell; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.StaticFilters; import mage.game.permanent.token.YoungPyromancerElementalToken; +import java.util.UUID; + /** * * @author jeffwadsworth */ public class YoungPyromancer extends CardImpl { - private static final FilterSpell filter = new FilterSpell("instant or sorcery spell"); - - static { - filter.add(Predicates.or( - new CardTypePredicate(CardType.INSTANT), - new CardTypePredicate(CardType.SORCERY))); - } - public YoungPyromancer(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}"); this.subtype.add("Human"); @@ -62,7 +53,7 @@ public class YoungPyromancer extends CardImpl { this.toughness = new MageInt(1); // Whenever you cast an instant or sorcery spell, create a 1/1 red Elemental creature token. - this.addAbility(new SpellCastControllerTriggeredAbility(new CreateTokenEffect(new YoungPyromancerElementalToken()), filter, false)); + this.addAbility(new SpellCastControllerTriggeredAbility(new CreateTokenEffect(new YoungPyromancerElementalToken()), StaticFilters.FILTER_INSTANT_OR_SORCERY_SPELL, false)); } diff --git a/Mage.Sets/src/mage/cards/y/YukiOnna.java b/Mage.Sets/src/mage/cards/y/YukiOnna.java index a37ae953dee..3b163826454 100644 --- a/Mage.Sets/src/mage/cards/y/YukiOnna.java +++ b/Mage.Sets/src/mage/cards/y/YukiOnna.java @@ -27,8 +27,6 @@ */ package mage.cards.y; -import java.util.UUID; -import mage.constants.CardType; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; @@ -37,9 +35,12 @@ import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.effects.common.ReturnToHandSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.filter.common.FilterSpiritOrArcaneCard; +import mage.constants.CardType; +import mage.filter.StaticFilters; import mage.target.common.TargetArtifactPermanent; +import java.util.UUID; + /** * @author Loki */ @@ -57,7 +58,7 @@ public class YukiOnna extends CardImpl { ability.addTarget(new TargetArtifactPermanent()); this.addAbility(ability); // Whenever you cast a Spirit or Arcane spell, you may return Yuki-Onna to its owner's hand. - this.addAbility(new SpellCastControllerTriggeredAbility(new ReturnToHandSourceEffect(true), new FilterSpiritOrArcaneCard(), true)); + this.addAbility(new SpellCastControllerTriggeredAbility(new ReturnToHandSourceEffect(true), StaticFilters.SPIRIT_OR_ARCANE_CARD, true)); } public YukiOnna(final YukiOnna card) { diff --git a/Mage.Sets/src/mage/sets/MercadianMasques.java b/Mage.Sets/src/mage/sets/MercadianMasques.java index 727ee4bc20b..b504288d704 100644 --- a/Mage.Sets/src/mage/sets/MercadianMasques.java +++ b/Mage.Sets/src/mage/sets/MercadianMasques.java @@ -234,6 +234,7 @@ public class MercadianMasques extends ExpansionSet { cards.add(new SetCardInfo("Rampart Crawler", 156, Rarity.COMMON, mage.cards.r.RampartCrawler.class)); cards.add(new SetCardInfo("Rappelling Scouts", 41, Rarity.RARE, mage.cards.r.RappellingScouts.class)); cards.add(new SetCardInfo("Remote Farm", 323, Rarity.COMMON, mage.cards.r.RemoteFarm.class)); + cards.add(new SetCardInfo("Reverent Mantra", 44, Rarity.RARE, mage.cards.r.ReverentMantra.class)); cards.add(new SetCardInfo("Revive", 262, Rarity.UNCOMMON, mage.cards.r.Revive.class)); cards.add(new SetCardInfo("Righteous Aura", 45, Rarity.UNCOMMON, mage.cards.r.RighteousAura.class)); cards.add(new SetCardInfo("Rishadan Airship", 91, Rarity.COMMON, mage.cards.r.RishadanAirship.class)); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/enters/GreenbeltRampagerTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/enters/GreenbeltRampagerTest.java index e34a5802ee7..6505a3e4808 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/enters/GreenbeltRampagerTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/enters/GreenbeltRampagerTest.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package org.mage.test.cards.abilities.enters; import mage.constants.PhaseStep; @@ -90,9 +89,14 @@ public class GreenbeltRampagerTest extends CardTestPlayerBase { @Test public void testCastNotOwned() { addCard(Zone.BATTLEFIELD, playerA, "Swamp", 10); - addCard(Zone.HAND, playerA, "Gonti, Lord of Luxury"); + // Deathtouch + // When Gonti, Lord of Luxury enters the battlefield, look at the top four cards of target opponent's library, exile one of them face down, + // then put the rest on the bottom of that library in a random order. For as long as that card remains exiled, + // you may look at it, you may cast it, and you may spend mana as though it were mana of any type to cast it. + addCard(Zone.HAND, playerA, "Gonti, Lord of Luxury"); // Creature {2}{B}{B} - addCard(Zone.LIBRARY, playerB, "Greenbelt Rampager"); + // When Greenbelt Rampager enters the battlefield, pay {E}{E}. If you can't, return Greenbelt Rampager to its owner's hand and you get {E}. + addCard(Zone.LIBRARY, playerB, "Greenbelt Rampager"); // Creature {G} 3/4 skipInitShuffling(); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/mana/MycosynthLatticeTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/mana/MycosynthLatticeTest.java index 531ecf77927..629190c7469 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/mana/MycosynthLatticeTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/mana/MycosynthLatticeTest.java @@ -8,10 +8,38 @@ import org.mage.test.serverside.base.CardTestPlayerBase; public class MycosynthLatticeTest extends CardTestPlayerBase { + @Test + public void testMycoSynthLatticeNormal() { + // Converge - Crystalline Crawler enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it. + // Remove a +1/+1 counter from Crystalline Crawler: Add one mana of any color to your mana pool. + // {T}: Put a +1/+1 counter on Crystalline Crawler. + String crawler = "Crystalline Crawler"; + + addCard(Zone.BATTLEFIELD, playerA, "Plains"); + addCard(Zone.BATTLEFIELD, playerA, "Island"); + addCard(Zone.BATTLEFIELD, playerA, "Swamp"); + addCard(Zone.BATTLEFIELD, playerA, "Mountain"); + addCard(Zone.HAND, playerA, crawler); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, crawler); + + setStopAt(1, PhaseStep.POSTCOMBAT_MAIN); + + execute(); + + assertCounterCount(playerA, crawler, CounterType.P1P1, 4); + } @Test - public void testMycoSynthLatticeWithCrystallineCrawler(){ + public void testMycoSynthLatticeWithCrystallineCrawler() { + // Converge - Crystalline Crawler enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it. + // Remove a +1/+1 counter from Crystalline Crawler: Add one mana of any color to your mana pool. + // {T}: Put a +1/+1 counter on Crystalline Crawler. String crawler = "Crystalline Crawler"; + + // All permanents are artifacts in addition to their other types. + // All cards that aren't on the battlefield, spells, and permanents are colorless. + // Players may spend mana as though it were mana of any color. String lattice = "Mycosynth Lattice"; addCard(Zone.BATTLEFIELD, playerA, lattice); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/planeswalker/RalZarekTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/planeswalker/RalZarekTest.java new file mode 100644 index 00000000000..8da714e4de3 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/planeswalker/RalZarekTest.java @@ -0,0 +1,68 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package org.mage.test.cards.planeswalker; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import mage.counters.CounterType; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX + */ +public class RalZarekTest extends CardTestPlayerBase { + + @Test + public void testFirstAbility() { + // +1: Tap target permanent, then untap another target permanent. + // -2: Ral Zarek deals 3 damage to target creature or player. + // -7: Flip five coins. Take an extra turn after this one for each coin that comes up heads. + String ralZarek = "Ral Zarek"; // {2}{U}{R} + addCard(Zone.HAND, playerA, ralZarek); + addCard(Zone.BATTLEFIELD, playerA, "Island", 3); + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 1); + + addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion"); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, ralZarek); + + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "+1:", "Silvercoat Lion"); // Ral Zarek +1 + addTarget(playerA, "Mountain"); // Untap the Mountain + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertPermanentCount(playerA, ralZarek, 1); + assertCounterCount(playerA, ralZarek, CounterType.LOYALTY, 5); + + assertTapped("Mountain", false); + assertTapped("Silvercoat Lion", true); + } +} diff --git a/Mage.Verify/src/main/java/mage/verify/JsonCard.java b/Mage.Verify/src/main/java/mage/verify/JsonCard.java index ac0c0dc0691..4575c54f909 100644 --- a/Mage.Verify/src/main/java/mage/verify/JsonCard.java +++ b/Mage.Verify/src/main/java/mage/verify/JsonCard.java @@ -17,7 +17,7 @@ class JsonCard { public String text; public String power; public String toughness; - public int loyalty; + public String loyalty; public String imageName; public boolean starter; // only available in boxed sets and not in boosters public int hand; // vanguard diff --git a/Mage/src/main/java/mage/Mana.java b/Mage/src/main/java/mage/Mana.java index 7eb518ed5e9..3eae16609ce 100644 --- a/Mage/src/main/java/mage/Mana.java +++ b/Mage/src/main/java/mage/Mana.java @@ -237,6 +237,38 @@ public class Mana implements Comparable, Serializable, Copyable { any += mana.getAny(); } + /** + * Increases the given mana by one. + * + * @param manaType + */ + public void increase(ManaType manaType) { + switch (manaType) { + case BLACK: + black++; + break; + case BLUE: + blue++; + break; + case COLORLESS: + colorless++; + break; + case GENERIC: + generic++; + break; + case GREEN: + green++; + break; + case RED: + red++; + break; + case WHITE: + white++; + break; + } + + } + /** * Increases the Red mana by one. */ @@ -815,11 +847,12 @@ public class Mana implements Comparable, Serializable, Copyable { } /** - * Returns if this objects mana contains any coloured mana the same as the passed in - * {@link Mana}'s mana. + * Returns if this objects mana contains any coloured mana the same as the + * passed in {@link Mana}'s mana. * * @param mana the mana to check for - * @return true if this contains any of the same type of coloured mana that this has + * @return true if this contains any of the same type of coloured mana that + * this has */ public boolean containsAny(final Mana mana) { if (mana.black > 0 && this.black > 0) { @@ -832,7 +865,7 @@ public class Mana implements Comparable, Serializable, Copyable { return true; } else if (mana.green > 0 && this.green > 0) { return true; - } + } return false; } diff --git a/Mage/src/main/java/mage/abilities/TriggeredAbilities.java b/Mage/src/main/java/mage/abilities/TriggeredAbilities.java index d71c080b6e2..a8eebfb296c 100644 --- a/Mage/src/main/java/mage/abilities/TriggeredAbilities.java +++ b/Mage/src/main/java/mage/abilities/TriggeredAbilities.java @@ -28,14 +28,6 @@ */ package mage.abilities; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; import mage.MageObject; import mage.constants.Zone; import mage.designations.Designation; @@ -45,6 +37,9 @@ import mage.game.events.NumberOfTriggersEvent; import mage.game.permanent.Permanent; import mage.game.stack.Spell; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + /** * * @author BetaSteward_at_googlemail.com @@ -181,9 +176,7 @@ public class TriggeredAbilities extends ConcurrentHashMap payment.count() && (pool.count() > 0 || conditionalCount > 0)) { - if (pool.pay(ManaType.COLORLESS, ability, sourceFilter, game, costToPay)) { + if (pool.pay(ManaType.COLORLESS, ability, sourceFilter, game, costToPay, usedManaToPay)) { this.payment.increaseColorless(); } break; @@ -164,27 +172,27 @@ public abstract class ManaCostImpl extends CostImpl implements ManaCost { protected boolean assignGeneric(Ability ability, Game game, ManaPool pool, int mana, Cost costToPay) { int conditionalCount = pool.getConditionalCount(ability, game, null, costToPay); while (mana > payment.count() && (pool.count() > 0 || conditionalCount > 0)) { - if (pool.pay(ManaType.COLORLESS, ability, sourceFilter, game, costToPay)) { + if (pool.pay(ManaType.COLORLESS, ability, sourceFilter, game, costToPay, usedManaToPay)) { this.payment.increaseColorless(); continue; } - if (pool.pay(ManaType.BLACK, ability, sourceFilter, game, costToPay)) { + if (pool.pay(ManaType.BLACK, ability, sourceFilter, game, costToPay, usedManaToPay)) { this.payment.increaseBlack(); continue; } - if (pool.pay(ManaType.BLUE, ability, sourceFilter, game, costToPay)) { + if (pool.pay(ManaType.BLUE, ability, sourceFilter, game, costToPay, usedManaToPay)) { this.payment.increaseBlue(); continue; } - if (pool.pay(ManaType.WHITE, ability, sourceFilter, game, costToPay)) { + if (pool.pay(ManaType.WHITE, ability, sourceFilter, game, costToPay, usedManaToPay)) { this.payment.increaseWhite(); continue; } - if (pool.pay(ManaType.GREEN, ability, sourceFilter, game, costToPay)) { + if (pool.pay(ManaType.GREEN, ability, sourceFilter, game, costToPay, usedManaToPay)) { this.payment.increaseGreen(); continue; } - if (pool.pay(ManaType.RED, ability, sourceFilter, game, costToPay)) { + if (pool.pay(ManaType.RED, ability, sourceFilter, game, costToPay, usedManaToPay)) { this.payment.increaseRed(); continue; } diff --git a/Mage/src/main/java/mage/abilities/costs/mana/ManaCostsImpl.java b/Mage/src/main/java/mage/abilities/costs/mana/ManaCostsImpl.java index e912ce2fb04..f040a8f2cd2 100644 --- a/Mage/src/main/java/mage/abilities/costs/mana/ManaCostsImpl.java +++ b/Mage/src/main/java/mage/abilities/costs/mana/ManaCostsImpl.java @@ -120,6 +120,15 @@ public class ManaCostsImpl extends ArrayList implements M return manaTotal; } + @Override + public Mana getUsedManaToPay() { + Mana manaTotal = new Mana(); + for (ManaCost cost : this) { + manaTotal.add(cost.getUsedManaToPay()); + } + return manaTotal; + } + @Override public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana) { return pay(ability, game, sourceId, controllerId, noMana, this); diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/ColorsOfManaSpentToCastCount.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/ColorsOfManaSpentToCastCount.java index 497b4e02dec..1bc24e1aa6d 100644 --- a/Mage/src/main/java/mage/abilities/dynamicvalue/common/ColorsOfManaSpentToCastCount.java +++ b/Mage/src/main/java/mage/abilities/dynamicvalue/common/ColorsOfManaSpentToCastCount.java @@ -43,7 +43,7 @@ public class ColorsOfManaSpentToCastCount implements DynamicValue { } if (spell != null) { // NOT the cmc of the spell on the stack - Mana mana = spell.getSpellAbility().getManaCostsToPay().getPayment(); + Mana mana = spell.getSpellAbility().getManaCostsToPay().getUsedManaToPay(); if (mana.getBlack() > 0) { count++; } diff --git a/Mage/src/main/java/mage/abilities/effects/common/CopySpellForEachItCouldTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/CopySpellForEachItCouldTargetEffect.java index 8a99938b2a6..45503ab173c 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/CopySpellForEachItCouldTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/CopySpellForEachItCouldTargetEffect.java @@ -46,8 +46,8 @@ import mage.util.TargetAddress; import java.util.*; /** - * @author duncant * @param + * @author duncant */ public abstract class CopySpellForEachItCouldTargetEffect extends OneShotEffect { @@ -191,10 +191,7 @@ public abstract class CopySpellForEachItCouldTargetEffect ex madeACopy = true; } } - - for (UUID idToDelete : toDelete) { - targetCopyMap.remove(idToDelete); - } + targetCopyMap.keySet().removeAll((toDelete)); } } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/UntapTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/UntapTargetEffect.java index ce24f5097d9..e9f5fbc0f8c 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/UntapTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/UntapTargetEffect.java @@ -56,6 +56,7 @@ public class UntapTargetEffect extends OneShotEffect { public UntapTargetEffect(final UntapTargetEffect effect) { super(effect); + this.useOnlyTargetPointer = effect.useOnlyTargetPointer; } @Override diff --git a/Mage/src/main/java/mage/abilities/effects/common/combat/CantAttackYouAllEffect.java b/Mage/src/main/java/mage/abilities/effects/common/combat/CantAttackYouAllEffect.java index 7dc4efa76cf..54dcd2f4b43 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/combat/CantAttackYouAllEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/combat/CantAttackYouAllEffect.java @@ -27,15 +27,17 @@ */ package mage.abilities.effects.common.combat; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.RestrictionEffect; import mage.constants.Duration; import mage.constants.Outcome; +import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.permanent.Permanent; +import java.util.UUID; + /** * * @author LevelX2 @@ -46,7 +48,7 @@ public class CantAttackYouAllEffect extends RestrictionEffect { private final boolean alsoPlaneswalker; public CantAttackYouAllEffect(Duration duration) { - this(duration, new FilterCreaturePermanent("creatures")); + this(duration, StaticFilters.FILTER_PERMANENT_CREATURES); } public CantAttackYouAllEffect(Duration duration, FilterCreaturePermanent filter) { diff --git a/Mage/src/main/java/mage/filter/StaticFilters.java b/Mage/src/main/java/mage/filter/StaticFilters.java index 0f1c4c19bbd..ff16f24eca8 100644 --- a/Mage/src/main/java/mage/filter/StaticFilters.java +++ b/Mage/src/main/java/mage/filter/StaticFilters.java @@ -7,15 +7,7 @@ package mage.filter; import mage.constants.CardType; import mage.constants.SubType; -import mage.filter.common.FilterArtifactCard; -import mage.filter.common.FilterArtifactCreaturePermanent; -import mage.filter.common.FilterControlledArtifactPermanent; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.common.FilterControlledPermanent; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.common.FilterCreatureSpell; -import mage.filter.common.FilterNonlandCard; -import mage.filter.common.FilterNonlandPermanent; +import mage.filter.common.*; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.filter.predicate.permanent.AnotherPredicate; @@ -28,6 +20,9 @@ import mage.filter.predicate.permanent.TokenPredicate; */ public final class StaticFilters { + + public static final FilterSpiritOrArcaneCard SPIRIT_OR_ARCANE_CARD = new FilterSpiritOrArcaneCard(); + public static final FilterArtifactCard FILTER_CARD_ARTIFACT = new FilterArtifactCard(); public static final FilterNonlandCard FILTER_CARD_NON_LAND = new FilterNonlandCard(); public static final FilterNonlandCard FILTER_CARD_A_NON_LAND = new FilterNonlandCard("a nonland card"); @@ -43,6 +38,9 @@ public final class StaticFilters { public static final FilterControlledPermanent FILTER_CONTROLLED_A_CREATURE = new FilterControlledCreaturePermanent("a creature you control"); public static final FilterControlledCreaturePermanent FILTER_CONTROLLED_ANOTHER_CREATURE = new FilterControlledCreaturePermanent("another creature"); public static final FilterControlledPermanent FILTER_CONTROLLED_PERMANENT_NON_LAND = new FilterControlledPermanent("nonland permanent"); + public static final FilterLandPermanent FILTER_LAND = new FilterLandPermanent(); + public static final FilterLandPermanent FILTER_LANDS = new FilterLandPermanent("lands"); + public static final FilterLandPermanent FILTER_BASIC_LAND = new FilterLandPermanent(); public static final FilterCreaturePermanent FILTER_PERMANENT_CREATURE = new FilterCreaturePermanent(); public static final FilterCreaturePermanent FILTER_PERMANENT_A_CREATURE = new FilterCreaturePermanent("a creature"); @@ -56,6 +54,10 @@ public final class StaticFilters { public static final FilterSpell FILTER_SPELL_NON_CREATURE = (FilterSpell) new FilterSpell("noncreature spell").add(Predicates.not(new CardTypePredicate(CardType.CREATURE))); + public static final FilterSpell FILTER_SPELL = new FilterSpell(); + + public static final FilterSpell FILTER_INSTANT_OR_SORCERY_SPELL = new FilterSpell("instant or sorcery spell"); + public static final FilterPermanent FILTER_CREATURE_TOKENS = new FilterCreaturePermanent("creature tokens"); public static final FilterPermanent FILTER_ATTACKING_CREATURES = new FilterCreaturePermanent("attacking creatures"); @@ -63,6 +65,8 @@ public final class StaticFilters { static { FILTER_CONTROLLED_PERMANENT_NON_LAND.add( Predicates.not(new CardTypePredicate(CardType.LAND))); + + FILTER_CREATURE_TOKENS.add(new TokenPredicate()); FILTER_ATTACKING_CREATURES.add(new AttackingPredicate()); @@ -92,6 +96,11 @@ public final class StaticFilters { new CardTypePredicate(CardType.ARTIFACT), new CardTypePredicate(CardType.CREATURE) )); + + FILTER_INSTANT_OR_SORCERY_SPELL.add(Predicates.or( + new CardTypePredicate(CardType.INSTANT), + new CardTypePredicate(CardType.SORCERY) + )); } } diff --git a/Mage/src/main/java/mage/players/ManaPool.java b/Mage/src/main/java/mage/players/ManaPool.java index 0df36cae431..1ffeeffc40e 100644 --- a/Mage/src/main/java/mage/players/ManaPool.java +++ b/Mage/src/main/java/mage/players/ManaPool.java @@ -110,9 +110,10 @@ public class ManaPool implements Serializable { * @param filter * @param game * @param costToPay complete costs to pay (needed to check conditional mana) + * @param usedManaToPay the information about what mana was paid * @return */ - public boolean pay(ManaType manaType, Ability ability, Filter filter, Game game, Cost costToPay) { + public boolean pay(ManaType manaType, Ability ability, Filter filter, Game game, Cost costToPay, Mana usedManaToPay) { if (!autoPayment && manaType != unlockedManaType) { // if manual payment and the needed mana type was not unlocked, nothing will be paid return false; @@ -149,6 +150,7 @@ public class ManaPool implements Serializable { GameEvent event = new GameEvent(GameEvent.EventType.MANA_PAID, ability.getId(), mana.getSourceId(), ability.getControllerId(), 0, mana.getFlag()); event.setData(mana.getOriginalId().toString()); game.fireEvent(event); + usedManaToPay.increase(mana.getFirstAvailable()); mana.remove(usableManaType); if (mana.count() == 0) { // so no items with count 0 stay in list manaItems.remove(mana); @@ -479,7 +481,7 @@ public class ManaPool implements Serializable { return false; } - public boolean isEmpty(){ + public boolean isEmpty() { return count() == 0; } } diff --git a/Mage/src/main/java/mage/target/TargetSpell.java b/Mage/src/main/java/mage/target/TargetSpell.java index 9495b4dbec4..bc11f5e28c4 100644 --- a/Mage/src/main/java/mage/target/TargetSpell.java +++ b/Mage/src/main/java/mage/target/TargetSpell.java @@ -30,6 +30,7 @@ package mage.target; import mage.abilities.Ability; import mage.constants.Zone; import mage.filter.FilterSpell; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.stack.Spell; import mage.game.stack.StackObject; @@ -49,7 +50,7 @@ public class TargetSpell extends TargetObject { private final Set sourceIds = new HashSet<>(); public TargetSpell() { - this(1, 1, new FilterSpell()); + this(1, 1, StaticFilters.FILTER_SPELL); } public TargetSpell(FilterSpell filter) {