remove FilterBySubtypeCard

This commit is contained in:
theelk801 2025-07-25 10:52:22 -04:00
parent 008aa810d9
commit 68f2d7468c
20 changed files with 147 additions and 206 deletions

View file

@ -13,7 +13,6 @@ import mage.constants.SubType;
import mage.constants.SuperType; import mage.constants.SuperType;
import mage.filter.FilterCard; import mage.filter.FilterCard;
import mage.filter.FilterPermanent; import mage.filter.FilterPermanent;
import mage.filter.common.FilterBySubtypeCard;
import mage.filter.common.FilterControlledPermanent; import mage.filter.common.FilterControlledPermanent;
import mage.target.common.TargetCardInLibrary; import mage.target.common.TargetCardInLibrary;
@ -24,7 +23,7 @@ import java.util.UUID;
*/ */
public final class AlpineGuide extends CardImpl { public final class AlpineGuide extends CardImpl {
private static final FilterCard filter = new FilterBySubtypeCard(SubType.MOUNTAIN); private static final FilterCard filter = new FilterCard(SubType.MOUNTAIN);
private static final FilterPermanent filter2 = new FilterControlledPermanent(SubType.MOUNTAIN, "Mountain"); private static final FilterPermanent filter2 = new FilterControlledPermanent(SubType.MOUNTAIN, "Mountain");
public AlpineGuide(UUID ownerId, CardSetInfo setInfo) { public AlpineGuide(UUID ownerId, CardSetInfo setInfo) {

View file

@ -18,7 +18,7 @@ import mage.cards.CardSetInfo;
import mage.constants.AttachmentType; import mage.constants.AttachmentType;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.filter.common.FilterBySubtypeCard; import mage.filter.FilterCard;
import mage.game.Game; import mage.game.Game;
import mage.util.CardUtil; import mage.util.CardUtil;
@ -30,6 +30,8 @@ import java.util.UUID;
*/ */
public final class ArmMountedAnchor extends CardImpl { public final class ArmMountedAnchor extends CardImpl {
private static final FilterCard filter = new FilterCard(SubType.PIRATE);
public ArmMountedAnchor(UUID ownerId, CardSetInfo setInfo) { public ArmMountedAnchor(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}");
this.subtype.add(SubType.EQUIPMENT); this.subtype.add(SubType.EQUIPMENT);
@ -42,11 +44,12 @@ public final class ArmMountedAnchor extends CardImpl {
this.addAbility(firstAbility); this.addAbility(firstAbility);
// Whenever equipped creature deals combat damage to a player, draw two cards. Then discard two cards unless you discard a Pirate card. // Whenever equipped creature deals combat damage to a player, draw two cards. Then discard two cards unless you discard a Pirate card.
Ability drawAbility = new DealsDamageToAPlayerAttachedTriggeredAbility(new DrawCardSourceControllerEffect(2), "equipped creature", false); Ability drawAbility = new DealsDamageToAPlayerAttachedTriggeredAbility(
DiscardCardCost cost = new DiscardCardCost(new FilterBySubtypeCard(SubType.PIRATE)); new DrawCardSourceControllerEffect(2), "equipped creature", false
cost.setText("Discard a Pirate card instead of discarding two cards"); );
drawAbility.addEffect(new DoIfCostPaid( drawAbility.addEffect(new DoIfCostPaid(
null, new DiscardControllerEffect(2), cost null, new DiscardControllerEffect(2),
new DiscardCardCost(filter).setText("Discard a Pirate card instead of discarding two cards")
).setText("Then discard two cards unless you discard a Pirate card")); ).setText("Then discard two cards unless you discard a Pirate card"));
this.addAbility(drawAbility); this.addAbility(drawAbility);

View file

@ -13,7 +13,6 @@ import mage.constants.SagaChapter;
import mage.constants.SubType; import mage.constants.SubType;
import mage.filter.FilterCard; import mage.filter.FilterCard;
import mage.filter.StaticFilters; import mage.filter.StaticFilters;
import mage.filter.common.FilterBySubtypeCard;
import mage.target.TargetPermanent; import mage.target.TargetPermanent;
import mage.target.common.TargetCardInLibrary; import mage.target.common.TargetCardInLibrary;
@ -24,7 +23,7 @@ import java.util.UUID;
*/ */
public final class BindingTheOldGods extends CardImpl { public final class BindingTheOldGods extends CardImpl {
private static final FilterCard filter = new FilterBySubtypeCard(SubType.FOREST); private static final FilterCard filter = new FilterCard(SubType.FOREST);
public BindingTheOldGods(UUID ownerId, CardSetInfo setInfo) { public BindingTheOldGods(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}{G}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}{G}");
@ -33,15 +32,18 @@ public final class BindingTheOldGods extends CardImpl {
// (As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.) // (As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)
SagaAbility sagaAbility = new SagaAbility(this); SagaAbility sagaAbility = new SagaAbility(this);
// I Destroy target nonland permanent an opponent controls. // I Destroy target nonland permanent an opponent controls.
sagaAbility.addChapterEffect( sagaAbility.addChapterEffect(
this, SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_I, this, SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_I,
new DestroyTargetEffect(), new TargetPermanent(StaticFilters.FILTER_OPPONENTS_PERMANENT_NON_LAND) new DestroyTargetEffect(), new TargetPermanent(StaticFilters.FILTER_OPPONENTS_PERMANENT_NON_LAND)
); );
// II Search your library for a Forest card, put it onto the battlefield tapped, then shuffle your library. // II Search your library for a Forest card, put it onto the battlefield tapped, then shuffle your library.
sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_II, sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_II,
new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), true) new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), true)
); );
// III Creatures you control gain deathtouch until end of turn. // III Creatures you control gain deathtouch until end of turn.
sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III, sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III,
new GainAbilityControlledEffect(DeathtouchAbility.getInstance(), Duration.EndOfTurn, new GainAbilityControlledEffect(DeathtouchAbility.getInstance(), Duration.EndOfTurn,

View file

@ -20,7 +20,6 @@ import mage.constants.TargetController;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.filter.FilterCard; import mage.filter.FilterCard;
import mage.filter.StaticFilters; import mage.filter.StaticFilters;
import mage.filter.common.FilterBySubtypeCard;
import mage.filter.predicate.Predicates; import mage.filter.predicate.Predicates;
import mage.target.common.TargetCardInLibrary; import mage.target.common.TargetCardInLibrary;
@ -39,7 +38,7 @@ public final class CharitableLevy extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.COLLECTION, 3); private static final Condition condition = new SourceHasCounterCondition(CounterType.COLLECTION, 3);
private static final FilterCard filterPlains = new FilterBySubtypeCard(SubType.PLAINS); private static final FilterCard filterPlains = new FilterCard(SubType.PLAINS);
public CharitableLevy(UUID ownerId, CardSetInfo setInfo) { public CharitableLevy(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}");

View file

@ -1,29 +1,28 @@
package mage.cards.e; package mage.cards.e;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.DiesSourceTriggeredAbility; import mage.abilities.common.DiesSourceTriggeredAbility;
import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect;
import mage.constants.SubType;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.FilterCard; import mage.filter.FilterCard;
import mage.filter.common.FilterBySubtypeCard;
import mage.filter.predicate.mageobject.AnotherPredicate; import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.target.common.TargetCardInYourGraveyard; import mage.target.common.TargetCardInYourGraveyard;
import java.util.UUID;
/** /**
*
* @author weirddan455 * @author weirddan455
*/ */
public final class ElderfangRitualist extends CardImpl { public final class ElderfangRitualist extends CardImpl {
private static final FilterCard filter = new FilterBySubtypeCard(SubType.ELF); private static final FilterCard filter = new FilterCard(SubType.ELF, "another target Elf card from your graveyard");
static { static {
filter.add(AnotherPredicate.instance); filter.add(AnotherPredicate.instance);
filter.setMessage("another target Elf card from your graveyard");
} }
public ElderfangRitualist(UUID ownerId, CardSetInfo setInfo) { public ElderfangRitualist(UUID ownerId, CardSetInfo setInfo) {

View file

@ -1,32 +1,33 @@
package mage.cards.f; package mage.cards.f;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldAllTriggeredAbility;
import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.common.LoseLifeOpponentsEffect; import mage.abilities.effects.common.LoseLifeOpponentsEffect;
import mage.abilities.effects.common.search.SearchLibraryPutOnLibraryEffect; import mage.abilities.effects.common.search.SearchLibraryPutOnLibraryEffect;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.*; import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.FilterCard;
import mage.filter.FilterPermanent; import mage.filter.FilterPermanent;
import mage.filter.common.FilterBySubtypeCard; import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.AnotherPredicate; import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.target.common.TargetCardInLibrary; import mage.target.common.TargetCardInLibrary;
import java.util.UUID;
/** /**
*
* @author JayDi85 * @author JayDi85
*/ */
public final class ForerunnerOfTheCoalition extends CardImpl { public final class ForerunnerOfTheCoalition extends CardImpl {
private static final FilterPermanent filterAnotherPirate = new FilterPermanent(SubType.PIRATE, "another " + SubType.PIRATE.toString()); private static final FilterCard filter = new FilterCard(SubType.PIRATE);
private static final FilterPermanent filter2
= new FilterControlledPermanent(SubType.PIRATE, "another Pirate you control");
static { static {
filterAnotherPirate.add(AnotherPredicate.instance); filter2.add(AnotherPredicate.instance);
filterAnotherPirate.add(TargetController.YOU.getControllerPredicate());
} }
public ForerunnerOfTheCoalition(UUID ownerId, CardSetInfo setInfo) { public ForerunnerOfTheCoalition(UUID ownerId, CardSetInfo setInfo) {
@ -39,15 +40,13 @@ public final class ForerunnerOfTheCoalition extends CardImpl {
// When Forerunner of the Coalition enters the battlefield, you may search your library for a Pirate card, reveal it, then shuffle your library and put that card on top of it. // When Forerunner of the Coalition enters the battlefield, you may search your library for a Pirate card, reveal it, then shuffle your library and put that card on top of it.
this.addAbility(new EntersBattlefieldTriggeredAbility( this.addAbility(new EntersBattlefieldTriggeredAbility(
new SearchLibraryPutOnLibraryEffect( new SearchLibraryPutOnLibraryEffect(new TargetCardInLibrary(filter), true), true
new TargetCardInLibrary(new FilterBySubtypeCard(SubType.PIRATE)), ));
true), true));
// Whenever another Pirate you control enters, each opponent loses 1 life. // Whenever another Pirate you control enters, each opponent loses 1 life.
Ability ability = new EntersBattlefieldControlledTriggeredAbility( this.addAbility(new EntersBattlefieldAllTriggeredAbility(
Zone.BATTLEFIELD, new LoseLifeOpponentsEffect(1), new LoseLifeOpponentsEffect(1), filter2
filterAnotherPirate, false); ));
this.addAbility(ability);
} }
private ForerunnerOfTheCoalition(final ForerunnerOfTheCoalition card) { private ForerunnerOfTheCoalition(final ForerunnerOfTheCoalition card) {

View file

@ -1,9 +1,7 @@
package mage.cards.f; package mage.cards.f;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldAllTriggeredAbility;
import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.common.DamageAllEffect; import mage.abilities.effects.common.DamageAllEffect;
import mage.abilities.effects.common.search.SearchLibraryPutOnLibraryEffect; import mage.abilities.effects.common.search.SearchLibraryPutOnLibraryEffect;
@ -11,10 +9,10 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.TargetController; import mage.filter.FilterCard;
import mage.constants.Zone; import mage.filter.FilterPermanent;
import mage.filter.common.FilterBySubtypeCard; import mage.filter.StaticFilters;
import mage.filter.common.FilterCreaturePermanent; import mage.filter.common.FilterControlledPermanent;
import mage.target.common.TargetCardInLibrary; import mage.target.common.TargetCardInLibrary;
import java.util.UUID; import java.util.UUID;
@ -24,11 +22,9 @@ import java.util.UUID;
*/ */
public final class ForerunnerOfTheEmpire extends CardImpl { public final class ForerunnerOfTheEmpire extends CardImpl {
private static final FilterCreaturePermanent filterAnyDinosaur = new FilterCreaturePermanent(SubType.DINOSAUR, "a " + SubType.DINOSAUR.toString()); private static final FilterCard filter = new FilterCard(SubType.DINOSAUR);
private static final FilterPermanent filter2
static { = new FilterControlledPermanent(SubType.DINOSAUR, "Dinosaur you control");
filterAnyDinosaur.add(TargetController.YOU.getControllerPredicate());
}
public ForerunnerOfTheEmpire(UUID ownerId, CardSetInfo setInfo) { public ForerunnerOfTheEmpire(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}");
@ -39,23 +35,16 @@ public final class ForerunnerOfTheEmpire extends CardImpl {
this.toughness = new MageInt(3); this.toughness = new MageInt(3);
// When Forerunner of the Empire enters the battlefield, you may search your library for a Dinosaur card, reveal it, then shuffle your library and put that card on top of it. // When Forerunner of the Empire enters the battlefield, you may search your library for a Dinosaur card, reveal it, then shuffle your library and put that card on top of it.
this.addAbility( this.addAbility(new EntersBattlefieldTriggeredAbility(
new EntersBattlefieldTriggeredAbility( new SearchLibraryPutOnLibraryEffect(new TargetCardInLibrary(filter), true), true
new SearchLibraryPutOnLibraryEffect( ));
new TargetCardInLibrary(new FilterBySubtypeCard(SubType.DINOSAUR)),
true
),
true
)
);
// Whenever a Dinosaur you control enters, you may have Forerunner of the Empire deal 1 damage to each creature. // Whenever a Dinosaur you control enters, you may have Forerunner of the Empire deal 1 damage to each creature.
Ability ability = new EntersBattlefieldControlledTriggeredAbility( this.addAbility(new EntersBattlefieldAllTriggeredAbility(
Zone.BATTLEFIELD, new DamageAllEffect(1, StaticFilters.FILTER_PERMANENT_CREATURE)
new DamageAllEffect(1, new FilterCreaturePermanent()).setText("have {this} deal 1 damage to each creature"), .setText("have {this} deal 1 damage to each creature"),
filterAnyDinosaur, filter2, true
true); ));
this.addAbility(ability);
} }
private ForerunnerOfTheEmpire(final ForerunnerOfTheEmpire card) { private ForerunnerOfTheEmpire(final ForerunnerOfTheEmpire card) {

View file

@ -1,34 +1,35 @@
package mage.cards.f; package mage.cards.f;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldAllTriggeredAbility;
import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.effects.common.search.SearchLibraryPutOnLibraryEffect; import mage.abilities.effects.common.search.SearchLibraryPutOnLibraryEffect;
import mage.constants.SubType;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.TargetController; import mage.constants.SubType;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.filter.FilterCard;
import mage.filter.FilterPermanent; import mage.filter.FilterPermanent;
import mage.filter.common.FilterBySubtypeCard; import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.AnotherPredicate; import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.target.common.TargetCardInLibrary; import mage.target.common.TargetCardInLibrary;
import java.util.UUID;
/** /**
*
* @author JayDi85 * @author JayDi85
*/ */
public final class ForerunnerOfTheHeralds extends CardImpl { public final class ForerunnerOfTheHeralds extends CardImpl {
private static final FilterPermanent filterAnotherMerfolk = new FilterPermanent(SubType.MERFOLK, "another " + SubType.MERFOLK.toString()); private static final FilterCard filter = new FilterCard(SubType.MERFOLK);
private static final FilterPermanent filter2
= new FilterControlledPermanent(SubType.MERFOLK, "another Merfolk you control");
static { static {
filterAnotherMerfolk.add(AnotherPredicate.instance); filter2.add(AnotherPredicate.instance);
filterAnotherMerfolk.add(TargetController.YOU.getControllerPredicate());
} }
public ForerunnerOfTheHeralds(UUID ownerId, CardSetInfo setInfo) { public ForerunnerOfTheHeralds(UUID ownerId, CardSetInfo setInfo) {
@ -39,21 +40,15 @@ public final class ForerunnerOfTheHeralds extends CardImpl {
this.power = new MageInt(3); this.power = new MageInt(3);
this.toughness = new MageInt(2); this.toughness = new MageInt(2);
// When Forerunner of the Heralds enters the battlefield, you may search your library for a Merfolk card, reveal it, then shuffle your library and put that card on top of it. // When Forerunner of the Heralds enters the battlefield, you may search your library for a Merfolk card, reveal it, then shuffle your library and put that card on top of it.
this.addAbility( this.addAbility(new EntersBattlefieldTriggeredAbility(
new EntersBattlefieldTriggeredAbility( new SearchLibraryPutOnLibraryEffect(new TargetCardInLibrary(filter), true), true
new SearchLibraryPutOnLibraryEffect( ));
new TargetCardInLibrary(new FilterBySubtypeCard(SubType.MERFOLK)),
true
),
true
)
);
// Whenever another Merfolk you control enters, put a +1/+1 counter on Forerunner of the Heralds. // Whenever another Merfolk you control enters, put a +1/+1 counter on Forerunner of the Heralds.
Ability ability = new EntersBattlefieldControlledTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), filterAnotherMerfolk); this.addAbility(new EntersBattlefieldAllTriggeredAbility(
this.addAbility(ability); new AddCountersSourceEffect(CounterType.P1P1.createInstance()), filter2
));
} }
private ForerunnerOfTheHeralds(final ForerunnerOfTheHeralds card) { private ForerunnerOfTheHeralds(final ForerunnerOfTheHeralds card) {

View file

@ -1,32 +1,35 @@
package mage.cards.f; package mage.cards.f;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; import mage.abilities.common.EntersBattlefieldAllTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.abilities.effects.common.search.SearchLibraryPutOnLibraryEffect; import mage.abilities.effects.common.search.SearchLibraryPutOnLibraryEffect;
import mage.constants.*;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.FilterCard;
import mage.filter.FilterPermanent; import mage.filter.FilterPermanent;
import mage.filter.common.FilterBySubtypeCard; import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.AnotherPredicate; import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.target.common.TargetCardInLibrary; import mage.target.common.TargetCardInLibrary;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/** /**
*
* @author JayDi85 * @author JayDi85
*/ */
public final class ForerunnerOfTheLegion extends CardImpl { public final class ForerunnerOfTheLegion extends CardImpl {
private static final FilterPermanent filterAnotherVampire = new FilterPermanent(SubType.VAMPIRE, "another " + SubType.VAMPIRE.toString()); private static final FilterCard filter = new FilterCard(SubType.VAMPIRE);
private static final FilterPermanent filter2
= new FilterControlledPermanent(SubType.VAMPIRE, "another Vampire you control");
static { static {
filterAnotherVampire.add(AnotherPredicate.instance); filter2.add(AnotherPredicate.instance);
filterAnotherVampire.add(TargetController.YOU.getControllerPredicate());
} }
public ForerunnerOfTheLegion(UUID ownerId, CardSetInfo setInfo) { public ForerunnerOfTheLegion(UUID ownerId, CardSetInfo setInfo) {
@ -38,18 +41,12 @@ public final class ForerunnerOfTheLegion extends CardImpl {
this.toughness = new MageInt(2); this.toughness = new MageInt(2);
// When Forerunner of the Legion enters the battlefield, you may search your library for a Vampire card, reveal it, then shuffle your library and put that card on top of it. // When Forerunner of the Legion enters the battlefield, you may search your library for a Vampire card, reveal it, then shuffle your library and put that card on top of it.
this.addAbility( this.addAbility(new EntersBattlefieldTriggeredAbility(
new EntersBattlefieldTriggeredAbility( new SearchLibraryPutOnLibraryEffect(new TargetCardInLibrary(filter), true), true
new SearchLibraryPutOnLibraryEffect( ));
new TargetCardInLibrary(new FilterBySubtypeCard(SubType.VAMPIRE)),
true
),
true
)
);
// Whenever another Vampire you control enters, target creature gets +1/+1 until end of turn. // Whenever another Vampire you control enters, target creature gets +1/+1 until end of turn.
Ability ability = new EntersBattlefieldControlledTriggeredAbility(new BoostTargetEffect(1,1, Duration.EndOfTurn), filterAnotherVampire); Ability ability = new EntersBattlefieldAllTriggeredAbility(new BoostTargetEffect(1, 1), filter2);
ability.addTarget(new TargetCreaturePermanent()); ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -1,28 +1,26 @@
package mage.cards.h; package mage.cards.h;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.condition.common.ForetoldCondition; import mage.abilities.condition.common.ForetoldCondition;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.ChooseCreatureTypeEffect; import mage.abilities.effects.common.ChooseCreatureTypeEffect;
import mage.abilities.keyword.ForetellAbility; import mage.abilities.keyword.ForetellAbility;
import mage.cards.Card;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.cards.CardsImpl;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Outcome; import mage.constants.Outcome;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.Zone; import mage.constants.Zone;
import mage.filter.common.FilterBySubtypeCard; import mage.filter.FilterCard;
import mage.game.Game; import mage.game.Game;
import mage.players.Player; import mage.players.Player;
import mage.target.TargetCard;
import mage.target.common.TargetCardInYourGraveyard; import mage.target.common.TargetCardInYourGraveyard;
import java.util.UUID;
/** /**
*
* @author weirddan455 * @author weirddan455
*/ */
public final class HauntingVoyage extends CardImpl { public final class HauntingVoyage extends CardImpl {
@ -70,30 +68,15 @@ class HauntingVoyageEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId()); Player controller = game.getPlayer(source.getControllerId());
SubType chosenSubType = ChooseCreatureTypeEffect.getChosenCreatureType(source.getSourceId(), game); SubType chosenSubType = ChooseCreatureTypeEffect.getChosenCreatureType(source.getSourceId(), game);
if (controller != null && chosenSubType != null) { if (controller == null || chosenSubType == null) {
Set<Card> cardsToBattlefield = new LinkedHashSet<>(); return false;
if (!ForetoldCondition.instance.apply(game, source)) {
TargetCardInYourGraveyard target = new TargetCardInYourGraveyard(0, 2, new FilterBySubtypeCard(chosenSubType), true);
controller.chooseTarget(outcome, target, source, game);
for (UUID cardId : target.getTargets()) {
Card card = game.getCard(cardId);
if (card != null) {
cardsToBattlefield.add(card);
}
}
} else {
for (UUID cardId : controller.getGraveyard()) {
Card card = game.getCard(cardId);
if (card != null && card.hasSubtype(chosenSubType, game)) {
cardsToBattlefield.add(card);
}
}
}
if (!cardsToBattlefield.isEmpty()) {
controller.moveCards(cardsToBattlefield, Zone.BATTLEFIELD, source, game);
return true;
}
} }
return false; FilterCard filter = new FilterCard(chosenSubType);
if (ForetoldCondition.instance.apply(game, source)) {
return controller.moveCards(controller.getGraveyard().getCards(filter, game), Zone.BATTLEFIELD, source, game);
}
TargetCard target = new TargetCardInYourGraveyard(0, 2, filter, true);
controller.chooseTarget(outcome, target, source, game);
return controller.moveCards(new CardsImpl(target.getTargets()), Zone.BATTLEFIELD, source, game);
} }
} }

View file

@ -13,7 +13,6 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.filter.FilterCard; import mage.filter.FilterCard;
import mage.filter.common.FilterBySubtypeCard;
import mage.game.permanent.token.HumanSoldierToken; import mage.game.permanent.token.HumanSoldierToken;
import mage.target.common.TargetCardInLibrary; import mage.target.common.TargetCardInLibrary;
@ -24,7 +23,7 @@ import java.util.UUID;
*/ */
public final class HonoredKnightCaptain extends CardImpl { public final class HonoredKnightCaptain extends CardImpl {
private static final FilterCard filter = new FilterBySubtypeCard(SubType.EQUIPMENT); private static final FilterCard filter = new FilterCard(SubType.EQUIPMENT);
public HonoredKnightCaptain(UUID ownerId, CardSetInfo setInfo) { public HonoredKnightCaptain(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}");

View file

@ -1,11 +1,8 @@
package mage.cards.i; package mage.cards.i;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.common.TurnedFaceUpSourceTriggeredAbility; import mage.abilities.common.TurnedFaceUpSourceTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.MorphAbility; import mage.abilities.keyword.MorphAbility;
@ -13,31 +10,34 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.filter.common.FilterBySubtypeCard; import mage.filter.FilterCard;
import mage.target.common.TargetCardInLibrary; import mage.target.common.TargetCardInLibrary;
import java.util.UUID;
/** /**
*
* @author fireshoes * @author fireshoes
*/ */
public final class ImperialHellkite extends CardImpl { public final class ImperialHellkite extends CardImpl {
private static final FilterCard filter = new FilterCard(SubType.DRAGON);
public ImperialHellkite(UUID ownerId, CardSetInfo setInfo) { public ImperialHellkite(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{5}{R}{R}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{R}{R}");
this.subtype.add(SubType.DRAGON); this.subtype.add(SubType.DRAGON);
this.power = new MageInt(6); this.power = new MageInt(6);
this.toughness = new MageInt(6); this.toughness = new MageInt(6);
// Flying // Flying
this.addAbility(FlyingAbility.getInstance()); this.addAbility(FlyingAbility.getInstance());
// Morph {6}{R}{R} // Morph {6}{R}{R}
this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{6}{R}{R}"))); this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{6}{R}{R}")));
// When Imperial Hellkite is turned face up, you may search your library for a Dragon card, reveal it, and put it into your hand. If you do, shuffle your library. // When Imperial Hellkite is turned face up, you may search your library for a Dragon card, reveal it, and put it into your hand. If you do, shuffle your library.
Effect effect = new SearchLibraryPutInHandEffect(new TargetCardInLibrary(0, 1, new FilterBySubtypeCard(SubType.DRAGON)), true); this.addAbility(new TurnedFaceUpSourceTriggeredAbility(
effect.setText("you may search your library for a Dragon card, reveal it, put it into your hand, then shuffle"); new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true), false, true
this.addAbility(new TurnedFaceUpSourceTriggeredAbility(effect)); ));
} }
private ImperialHellkite(final ImperialHellkite card) { private ImperialHellkite(final ImperialHellkite card) {

View file

@ -1,11 +1,8 @@
package mage.cards.i; package mage.cards.i;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.common.TurnedFaceUpSourceTriggeredAbility; import mage.abilities.common.TurnedFaceUpSourceTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.ReturnToHandFromGraveyardAllEffect; import mage.abilities.effects.common.ReturnToHandFromGraveyardAllEffect;
import mage.abilities.keyword.MorphAbility; import mage.abilities.keyword.MorphAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
@ -13,18 +10,18 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.filter.FilterCard; import mage.filter.FilterCard;
import mage.filter.common.FilterBySubtypeCard;
import java.util.UUID;
/** /**
*
* @author cg5 * @author cg5
*/ */
public final class InfernalCaretaker extends CardImpl { public final class InfernalCaretaker extends CardImpl {
private static FilterCard zombieCard = new FilterBySubtypeCard(SubType.ZOMBIE); private static FilterCard zombieCard = new FilterCard(SubType.ZOMBIE);
public InfernalCaretaker(UUID ownerId, CardSetInfo setInfo) { public InfernalCaretaker(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{B}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}");
this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.CLERIC); this.subtype.add(SubType.CLERIC);
this.power = new MageInt(2); this.power = new MageInt(2);
@ -32,11 +29,10 @@ public final class InfernalCaretaker extends CardImpl {
// Morph {3}{B} // Morph {3}{B}
this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{3}{B}"))); this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{3}{B}")));
// When Infernal Caretaker is turned face up, return all Zombie cards from all graveyards to their owners' hands. // When Infernal Caretaker is turned face up, return all Zombie cards from all graveyards to their owners' hands.
Effect effect = new ReturnToHandFromGraveyardAllEffect(zombieCard); this.addAbility(new TurnedFaceUpSourceTriggeredAbility(new ReturnToHandFromGraveyardAllEffect(zombieCard)
effect.setText("return all Zombie cards from all graveyards to their owners' hands"); .setText("return all Zombie cards from all graveyards to their owners' hands")));
this.addAbility(new TurnedFaceUpSourceTriggeredAbility(effect));
} }
private InfernalCaretaker(final InfernalCaretaker card) { private InfernalCaretaker(final InfernalCaretaker card) {
@ -47,4 +43,4 @@ public final class InfernalCaretaker extends CardImpl {
public InfernalCaretaker copy() { public InfernalCaretaker copy() {
return new InfernalCaretaker(this); return new InfernalCaretaker(this);
} }
} }

View file

@ -12,7 +12,6 @@ import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.filter.FilterCard; import mage.filter.FilterCard;
import mage.filter.StaticFilters; import mage.filter.StaticFilters;
import mage.filter.common.FilterBySubtypeCard;
import mage.target.common.TargetCardInLibrary; import mage.target.common.TargetCardInLibrary;
import java.util.UUID; import java.util.UUID;
@ -22,7 +21,7 @@ import java.util.UUID;
*/ */
public final class KnightOfTheWhiteOrchid extends CardImpl { public final class KnightOfTheWhiteOrchid extends CardImpl {
private static final FilterCard filter = new FilterBySubtypeCard(SubType.PLAINS); private static final FilterCard filter = new FilterCard(SubType.PLAINS);
private static final Condition condition = new OpponentControlsMoreCondition(StaticFilters.FILTER_LANDS); private static final Condition condition = new OpponentControlsMoreCondition(StaticFilters.FILTER_LANDS);
public KnightOfTheWhiteOrchid(UUID ownerId, CardSetInfo setInfo) { public KnightOfTheWhiteOrchid(UUID ownerId, CardSetInfo setInfo) {

View file

@ -1,7 +1,5 @@
package mage.cards.k; package mage.cards.k;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect;
@ -9,17 +7,20 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.filter.common.FilterBySubtypeCard; import mage.filter.FilterCard;
import mage.target.common.TargetCardInLibrary; import mage.target.common.TargetCardInLibrary;
import java.util.UUID;
/** /**
*
* @author North * @author North
*/ */
public final class KorCartographer extends CardImpl { public final class KorCartographer extends CardImpl {
private static final FilterCard filter = new FilterCard(SubType.PLAINS);
public KorCartographer(UUID ownerId, CardSetInfo setInfo) { public KorCartographer(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{W}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}");
this.subtype.add(SubType.KOR); this.subtype.add(SubType.KOR);
this.subtype.add(SubType.SCOUT); this.subtype.add(SubType.SCOUT);
@ -27,7 +28,9 @@ public final class KorCartographer extends CardImpl {
this.toughness = new MageInt(2); this.toughness = new MageInt(2);
// When Kor Cartographer enters the battlefield, you may search your library for a Plains card, put it onto the battlefield tapped, then shuffle your library. // When Kor Cartographer enters the battlefield, you may search your library for a Plains card, put it onto the battlefield tapped, then shuffle your library.
this.addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(new FilterBySubtypeCard(SubType.PLAINS)), true), true)); this.addAbility(new EntersBattlefieldTriggeredAbility(
new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), true), true
));
} }
private KorCartographer(final KorCartographer card) { private KorCartographer(final KorCartographer card) {

View file

@ -11,7 +11,6 @@ import mage.constants.PutCards;
import mage.constants.SubType; import mage.constants.SubType;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.filter.FilterCard; import mage.filter.FilterCard;
import mage.filter.common.FilterBySubtypeCard;
import java.util.UUID; import java.util.UUID;
@ -20,7 +19,7 @@ import java.util.UUID;
*/ */
public final class PulsarSquadronAce extends CardImpl { public final class PulsarSquadronAce extends CardImpl {
private static final FilterCard filter = new FilterBySubtypeCard(SubType.SPACECRAFT); private static final FilterCard filter = new FilterCard(SubType.SPACECRAFT);
public PulsarSquadronAce(UUID ownerId, CardSetInfo setInfo) { public PulsarSquadronAce(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}");

View file

@ -15,7 +15,7 @@ import mage.constants.CardType;
import mage.constants.Outcome; import mage.constants.Outcome;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.Zone; import mage.constants.Zone;
import mage.filter.common.FilterBySubtypeCard; import mage.filter.FilterCard;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.players.Player; import mage.players.Player;
@ -54,7 +54,7 @@ public final class TempleOfTheDragonQueen extends CardImpl {
class TempleOfTheDragonQueenEffect extends OneShotEffect { class TempleOfTheDragonQueenEffect extends OneShotEffect {
private static final FilterBySubtypeCard filter = new FilterBySubtypeCard(SubType.DRAGON); private static final FilterCard filter = new FilterCard(SubType.DRAGON);
public TempleOfTheDragonQueenEffect() { public TempleOfTheDragonQueenEffect() {
super(Outcome.Tap); super(Outcome.Tap);

View file

@ -12,7 +12,6 @@ import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.SuperType; import mage.constants.SuperType;
import mage.filter.FilterCard; import mage.filter.FilterCard;
import mage.filter.common.FilterBySubtypeCard;
import mage.target.common.TargetCardInYourGraveyard; import mage.target.common.TargetCardInYourGraveyard;
import java.util.UUID; import java.util.UUID;
@ -22,8 +21,8 @@ import java.util.UUID;
*/ */
public final class TombstoneCareerCriminal extends CardImpl { public final class TombstoneCareerCriminal extends CardImpl {
private static final FilterCard filter = new FilterBySubtypeCard(SubType.VILLAIN); private static final FilterCard filter = new FilterCard(SubType.VILLAIN);
private static final FilterCard filter2 = new FilterBySubtypeCard(SubType.VILLAIN, "Villain spells"); private static final FilterCard filter2 = new FilterCard(SubType.VILLAIN, "Villain spells");
public TombstoneCareerCriminal(UUID ownerId, CardSetInfo setInfo) { public TombstoneCareerCriminal(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}");

View file

@ -2,6 +2,7 @@ package mage.filter;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.cards.Card; import mage.cards.Card;
import mage.constants.SubType;
import mage.constants.TargetController; import mage.constants.TargetController;
import mage.filter.predicate.ObjectSourcePlayer; import mage.filter.predicate.ObjectSourcePlayer;
import mage.filter.predicate.ObjectSourcePlayerPredicate; import mage.filter.predicate.ObjectSourcePlayerPredicate;
@ -29,7 +30,18 @@ public class FilterCard extends FilterObject<Card> {
} }
public FilterCard(String name) { public FilterCard(String name) {
this(null, name);
}
public FilterCard(SubType subType) {
this(subType, subType + " card");
}
public FilterCard(SubType subType, String name) {
super(name); super(name);
if (subType != null) {
this.add(subType.getPredicate());
}
} }
protected FilterCard(final FilterCard filter) { protected FilterCard(final FilterCard filter) {

View file

@ -1,31 +0,0 @@
package mage.filter.common;
import mage.constants.SubType;
import mage.filter.FilterCard;
/**
* TODO: Collapse this into FilterCard
*
* @author LevelX2
*/
public class FilterBySubtypeCard extends FilterCard {
public FilterBySubtypeCard(SubType subtype) {
this(subtype, subtype + " card");
}
public FilterBySubtypeCard(SubType subtype, String name) {
super(name);
this.add(subtype.getPredicate());
}
protected FilterBySubtypeCard(final FilterBySubtypeCard filter) {
super(filter);
}
@Override
public FilterBySubtypeCard copy() {
return new FilterBySubtypeCard(this);
}
}