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.filter.FilterCard;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterBySubtypeCard;
import mage.filter.common.FilterControlledPermanent;
import mage.target.common.TargetCardInLibrary;
@ -24,7 +23,7 @@ import java.util.UUID;
*/
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");
public AlpineGuide(UUID ownerId, CardSetInfo setInfo) {

View file

@ -18,7 +18,7 @@ import mage.cards.CardSetInfo;
import mage.constants.AttachmentType;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.common.FilterBySubtypeCard;
import mage.filter.FilterCard;
import mage.game.Game;
import mage.util.CardUtil;
@ -30,6 +30,8 @@ import java.util.UUID;
*/
public final class ArmMountedAnchor extends CardImpl {
private static final FilterCard filter = new FilterCard(SubType.PIRATE);
public ArmMountedAnchor(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}");
this.subtype.add(SubType.EQUIPMENT);
@ -42,11 +44,12 @@ public final class ArmMountedAnchor extends CardImpl {
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.
Ability drawAbility = new DealsDamageToAPlayerAttachedTriggeredAbility(new DrawCardSourceControllerEffect(2), "equipped creature", false);
DiscardCardCost cost = new DiscardCardCost(new FilterBySubtypeCard(SubType.PIRATE));
cost.setText("Discard a Pirate card instead of discarding two cards");
Ability drawAbility = new DealsDamageToAPlayerAttachedTriggeredAbility(
new DrawCardSourceControllerEffect(2), "equipped creature", false
);
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"));
this.addAbility(drawAbility);

View file

@ -13,7 +13,6 @@ import mage.constants.SagaChapter;
import mage.constants.SubType;
import mage.filter.FilterCard;
import mage.filter.StaticFilters;
import mage.filter.common.FilterBySubtypeCard;
import mage.target.TargetPermanent;
import mage.target.common.TargetCardInLibrary;
@ -24,7 +23,7 @@ import java.util.UUID;
*/
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) {
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.)
SagaAbility sagaAbility = new SagaAbility(this);
// I Destroy target nonland permanent an opponent controls.
sagaAbility.addChapterEffect(
this, SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_I,
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.
sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_II,
new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), true)
);
// III Creatures you control gain deathtouch until end of turn.
sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III,
new GainAbilityControlledEffect(DeathtouchAbility.getInstance(), Duration.EndOfTurn,

View file

@ -20,7 +20,6 @@ import mage.constants.TargetController;
import mage.counters.CounterType;
import mage.filter.FilterCard;
import mage.filter.StaticFilters;
import mage.filter.common.FilterBySubtypeCard;
import mage.filter.predicate.Predicates;
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 FilterCard filterPlains = new FilterBySubtypeCard(SubType.PLAINS);
private static final FilterCard filterPlains = new FilterCard(SubType.PLAINS);
public CharitableLevy(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}");

View file

@ -1,29 +1,28 @@
package mage.cards.e;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.DiesSourceTriggeredAbility;
import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect;
import mage.constants.SubType;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.FilterCard;
import mage.filter.common.FilterBySubtypeCard;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.target.common.TargetCardInYourGraveyard;
import java.util.UUID;
/**
*
* @author weirddan455
*/
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 {
filter.add(AnotherPredicate.instance);
filter.setMessage("another target Elf card from your graveyard");
}
public ElderfangRitualist(UUID ownerId, CardSetInfo setInfo) {

View file

@ -1,32 +1,33 @@
package mage.cards.f;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
import mage.abilities.common.EntersBattlefieldAllTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.common.LoseLifeOpponentsEffect;
import mage.abilities.effects.common.search.SearchLibraryPutOnLibraryEffect;
import mage.cards.CardImpl;
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.common.FilterBySubtypeCard;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.target.common.TargetCardInLibrary;
import java.util.UUID;
/**
*
* @author JayDi85
*/
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 {
filterAnotherPirate.add(AnotherPredicate.instance);
filterAnotherPirate.add(TargetController.YOU.getControllerPredicate());
filter2.add(AnotherPredicate.instance);
}
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.
this.addAbility(new EntersBattlefieldTriggeredAbility(
new SearchLibraryPutOnLibraryEffect(
new TargetCardInLibrary(new FilterBySubtypeCard(SubType.PIRATE)),
true), true));
new SearchLibraryPutOnLibraryEffect(new TargetCardInLibrary(filter), true), true
));
// Whenever another Pirate you control enters, each opponent loses 1 life.
Ability ability = new EntersBattlefieldControlledTriggeredAbility(
Zone.BATTLEFIELD, new LoseLifeOpponentsEffect(1),
filterAnotherPirate, false);
this.addAbility(ability);
this.addAbility(new EntersBattlefieldAllTriggeredAbility(
new LoseLifeOpponentsEffect(1), filter2
));
}
private ForerunnerOfTheCoalition(final ForerunnerOfTheCoalition card) {

View file

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

View file

@ -1,34 +1,35 @@
package mage.cards.f;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
import mage.abilities.common.EntersBattlefieldAllTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.effects.common.search.SearchLibraryPutOnLibraryEffect;
import mage.constants.SubType;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.TargetController;
import mage.constants.SubType;
import mage.counters.CounterType;
import mage.filter.FilterCard;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterBySubtypeCard;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.target.common.TargetCardInLibrary;
import java.util.UUID;
/**
*
* @author JayDi85
*/
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 {
filterAnotherMerfolk.add(AnotherPredicate.instance);
filterAnotherMerfolk.add(TargetController.YOU.getControllerPredicate());
filter2.add(AnotherPredicate.instance);
}
public ForerunnerOfTheHeralds(UUID ownerId, CardSetInfo setInfo) {
@ -39,21 +40,15 @@ public final class ForerunnerOfTheHeralds extends CardImpl {
this.power = new MageInt(3);
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.
this.addAbility(
new EntersBattlefieldTriggeredAbility(
new SearchLibraryPutOnLibraryEffect(
new TargetCardInLibrary(new FilterBySubtypeCard(SubType.MERFOLK)),
true
),
true
)
);
this.addAbility(new EntersBattlefieldTriggeredAbility(
new SearchLibraryPutOnLibraryEffect(new TargetCardInLibrary(filter), true), true
));
// 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(ability);
this.addAbility(new EntersBattlefieldAllTriggeredAbility(
new AddCountersSourceEffect(CounterType.P1P1.createInstance()), filter2
));
}
private ForerunnerOfTheHeralds(final ForerunnerOfTheHeralds card) {

View file

@ -1,32 +1,35 @@
package mage.cards.f;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
import mage.abilities.common.EntersBattlefieldAllTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.abilities.effects.common.search.SearchLibraryPutOnLibraryEffect;
import mage.constants.*;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.FilterCard;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterBySubtypeCard;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.target.common.TargetCardInLibrary;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
*
* @author JayDi85
*/
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 {
filterAnotherVampire.add(AnotherPredicate.instance);
filterAnotherVampire.add(TargetController.YOU.getControllerPredicate());
filter2.add(AnotherPredicate.instance);
}
public ForerunnerOfTheLegion(UUID ownerId, CardSetInfo setInfo) {
@ -38,18 +41,12 @@ public final class ForerunnerOfTheLegion extends CardImpl {
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.
this.addAbility(
new EntersBattlefieldTriggeredAbility(
new SearchLibraryPutOnLibraryEffect(
new TargetCardInLibrary(new FilterBySubtypeCard(SubType.VAMPIRE)),
true
),
true
)
);
this.addAbility(new EntersBattlefieldTriggeredAbility(
new SearchLibraryPutOnLibraryEffect(new TargetCardInLibrary(filter), true), true
));
// 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());
this.addAbility(ability);
}

View file

@ -1,28 +1,26 @@
package mage.cards.h;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.condition.common.ForetoldCondition;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.ChooseCreatureTypeEffect;
import mage.abilities.keyword.ForetellAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.CardsImpl;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.filter.common.FilterBySubtypeCard;
import mage.filter.FilterCard;
import mage.game.Game;
import mage.players.Player;
import mage.target.TargetCard;
import mage.target.common.TargetCardInYourGraveyard;
import java.util.UUID;
/**
*
* @author weirddan455
*/
public final class HauntingVoyage extends CardImpl {
@ -70,30 +68,15 @@ class HauntingVoyageEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
SubType chosenSubType = ChooseCreatureTypeEffect.getChosenCreatureType(source.getSourceId(), game);
if (controller != null && chosenSubType != null) {
Set<Card> cardsToBattlefield = new LinkedHashSet<>();
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;
}
if (controller == null || chosenSubType == null) {
return false;
}
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.SubType;
import mage.filter.FilterCard;
import mage.filter.common.FilterBySubtypeCard;
import mage.game.permanent.token.HumanSoldierToken;
import mage.target.common.TargetCardInLibrary;
@ -24,7 +23,7 @@ import java.util.UUID;
*/
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) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}");

View file

@ -1,11 +1,8 @@
package mage.cards.i;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.TurnedFaceUpSourceTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.MorphAbility;
@ -13,31 +10,34 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.common.FilterBySubtypeCard;
import mage.filter.FilterCard;
import mage.target.common.TargetCardInLibrary;
import java.util.UUID;
/**
*
* @author fireshoes
*/
public final class ImperialHellkite extends CardImpl {
private static final FilterCard filter = new FilterCard(SubType.DRAGON);
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.power = new MageInt(6);
this.toughness = new MageInt(6);
// Flying
this.addAbility(FlyingAbility.getInstance());
// Morph {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.
Effect effect = new SearchLibraryPutInHandEffect(new TargetCardInLibrary(0, 1, new FilterBySubtypeCard(SubType.DRAGON)), true);
effect.setText("you may search your library for a Dragon card, reveal it, put it into your hand, then shuffle");
this.addAbility(new TurnedFaceUpSourceTriggeredAbility(effect));
this.addAbility(new TurnedFaceUpSourceTriggeredAbility(
new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true), false, true
));
}
private ImperialHellkite(final ImperialHellkite card) {

View file

@ -1,11 +1,8 @@
package mage.cards.i;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.TurnedFaceUpSourceTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.ReturnToHandFromGraveyardAllEffect;
import mage.abilities.keyword.MorphAbility;
import mage.cards.CardImpl;
@ -13,18 +10,18 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.FilterCard;
import mage.filter.common.FilterBySubtypeCard;
import java.util.UUID;
/**
*
* @author cg5
*/
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) {
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.CLERIC);
this.power = new MageInt(2);
@ -32,11 +29,10 @@ public final class InfernalCaretaker extends CardImpl {
// Morph {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.
Effect effect = new ReturnToHandFromGraveyardAllEffect(zombieCard);
effect.setText("return all Zombie cards from all graveyards to their owners' hands");
this.addAbility(new TurnedFaceUpSourceTriggeredAbility(effect));
this.addAbility(new TurnedFaceUpSourceTriggeredAbility(new ReturnToHandFromGraveyardAllEffect(zombieCard)
.setText("return all Zombie cards from all graveyards to their owners' hands")));
}
private InfernalCaretaker(final InfernalCaretaker card) {
@ -47,4 +43,4 @@ public final class InfernalCaretaker extends CardImpl {
public InfernalCaretaker copy() {
return new InfernalCaretaker(this);
}
}
}

View file

@ -12,7 +12,6 @@ import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.FilterCard;
import mage.filter.StaticFilters;
import mage.filter.common.FilterBySubtypeCard;
import mage.target.common.TargetCardInLibrary;
import java.util.UUID;
@ -22,7 +21,7 @@ import java.util.UUID;
*/
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);
public KnightOfTheWhiteOrchid(UUID ownerId, CardSetInfo setInfo) {

View file

@ -1,7 +1,5 @@
package mage.cards.k;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect;
@ -9,17 +7,20 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.common.FilterBySubtypeCard;
import mage.filter.FilterCard;
import mage.target.common.TargetCardInLibrary;
import java.util.UUID;
/**
*
* @author North
*/
public final class KorCartographer extends CardImpl {
private static final FilterCard filter = new FilterCard(SubType.PLAINS);
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.SCOUT);
@ -27,7 +28,9 @@ public final class KorCartographer extends CardImpl {
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.
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) {

View file

@ -11,7 +11,6 @@ import mage.constants.PutCards;
import mage.constants.SubType;
import mage.counters.CounterType;
import mage.filter.FilterCard;
import mage.filter.common.FilterBySubtypeCard;
import java.util.UUID;
@ -20,7 +19,7 @@ import java.util.UUID;
*/
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) {
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.SubType;
import mage.constants.Zone;
import mage.filter.common.FilterBySubtypeCard;
import mage.filter.FilterCard;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
@ -54,7 +54,7 @@ public final class TempleOfTheDragonQueen extends CardImpl {
class TempleOfTheDragonQueenEffect extends OneShotEffect {
private static final FilterBySubtypeCard filter = new FilterBySubtypeCard(SubType.DRAGON);
private static final FilterCard filter = new FilterCard(SubType.DRAGON);
public TempleOfTheDragonQueenEffect() {
super(Outcome.Tap);

View file

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

View file

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