updated "play from top of library" effects

This commit is contained in:
Evan Kranzler 2020-04-25 18:49:23 -04:00
parent 29dfb1a404
commit 8bbdae4af6
11 changed files with 97 additions and 241 deletions

View file

@ -69,7 +69,7 @@ class BolassCitadelPlayTheTopCardEffect extends AsThoughEffectImpl {
BolassCitadelPlayTheTopCardEffect() {
super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE,
Duration.WhileOnBattlefield, Outcome.AIDontUseIt); // AI will need help with this
staticText = "You may play the top card of your library. If you cast a spell this way, "
staticText = "You may play lands and cast spells from the top of your library. If you cast a spell this way, "
+ "pay life equal to its converted mana cost rather than pay its mana cost.";
}

View file

@ -1,7 +1,5 @@
package mage.cards.c;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
@ -12,32 +10,37 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.filter.FilterCard;
import mage.filter.StaticFilters;
import mage.filter.common.FilterLandCard;
import mage.filter.common.FilterLandPermanent;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class CourserOfKruphix extends CardImpl {
private static final FilterCard filter = new FilterLandCard("play land cards");
public CourserOfKruphix(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT,CardType.CREATURE},"{1}{G}{G}");
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "{1}{G}{G}");
this.subtype.add(SubType.CENTAUR);
this.power = new MageInt(2);
this.toughness = new MageInt(4);
// Play with the top card of your library revealed.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new PlayWithTheTopCardRevealedEffect()));
this.addAbility(new SimpleStaticAbility(new PlayWithTheTopCardRevealedEffect()));
// You may play the top card of your library if it's a land card.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new PlayTheTopCardEffect(new FilterLandCard())));
this.addAbility(new SimpleStaticAbility(new PlayTheTopCardEffect(filter)));
// Whenever a land enters the battlefield under your control, you gain 1 life.
this.addAbility(new EntersBattlefieldControlledTriggeredAbility(new GainLifeEffect(1), new FilterLandPermanent("a land")));
this.addAbility(new EntersBattlefieldControlledTriggeredAbility(new GainLifeEffect(1), StaticFilters.FILTER_LAND_A));
}
public CourserOfKruphix(final CourserOfKruphix card) {
private CourserOfKruphix(final CourserOfKruphix card) {
super(card);
}

View file

@ -24,7 +24,7 @@ import java.util.UUID;
*/
public final class ElshaOfTheInfinite extends CardImpl {
private static final FilterCard filter = new FilterNonlandCard();
private static final FilterCard filter = new FilterNonlandCard("cast noncreature spells");
static {
filter.add(Predicates.not(CardType.CREATURE.getPredicate()));
@ -46,14 +46,10 @@ public final class ElshaOfTheInfinite extends CardImpl {
this.addAbility(new SimpleStaticAbility(new LookAtTopCardOfLibraryAnyTimeEffect()));
// You may cast the top card of your library if it's a noncreature, nonland card, and you may cast it as though it had flash.
Ability ability = new SimpleStaticAbility(
new PlayTheTopCardEffect(filter).setText(
"you may cast the top card of your library if it's a noncreature, nonland card,"
)
);
Ability ability = new SimpleStaticAbility(new PlayTheTopCardEffect(filter));
ability.addEffect(new CastAsThoughItHadFlashAllEffect(
Duration.WhileOnBattlefield, filter
).setText("and you may cast it as though it had flash"));
).setText("If you cast a spell this way, you may cast it as though it had flash."));
this.addAbility(ability);
}

View file

@ -1,9 +1,7 @@
package mage.cards.g;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.continuous.PlayTheTopCardEffect;
import mage.abilities.effects.common.continuous.PlayWithTheTopCardRevealedEffect;
import mage.abilities.keyword.TrampleAbility;
@ -11,14 +9,18 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.filter.StaticFilters;
import mage.filter.FilterCard;
import mage.filter.common.FilterCreatureCard;
import java.util.UUID;
/**
* @author nantuko
*/
public final class GarruksHorde extends CardImpl {
private static final FilterCard filter = new FilterCreatureCard("cast creature spells");
public GarruksHorde(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{G}{G}");
this.subtype.add(SubType.BEAST);
@ -26,16 +28,17 @@ public final class GarruksHorde extends CardImpl {
this.power = new MageInt(7);
this.toughness = new MageInt(7);
// Trample
this.addAbility(TrampleAbility.getInstance());
// Play with the top card of your library revealed.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new PlayWithTheTopCardRevealedEffect()));
this.addAbility(new SimpleStaticAbility(new PlayWithTheTopCardRevealedEffect()));
// You may cast the top card of your library if it's a creature card.
Effect effect = new PlayTheTopCardEffect(StaticFilters.FILTER_CARD_CREATURE);
effect.setText("You may cast the top card of your library if it's a creature card");
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect));
this.addAbility(new SimpleStaticAbility(new PlayTheTopCardEffect(filter)));
}
public GarruksHorde(final GarruksHorde card) {
private GarruksHorde(final GarruksHorde card) {
super(card);
}

View file

@ -1,4 +1,3 @@
package mage.cards.m;
import mage.MageInt;
@ -25,21 +24,21 @@ import mage.target.targetpointer.FixedTarget;
import java.util.UUID;
/**
*
* @author jeffwadsworth
*/
public final class MelekIzzetParagon extends CardImpl {
private static final FilterCard filter = new FilterCard("instant or sorcery card");
private static final FilterCard filter = new FilterCard("cast instant or sorcery spells");
static {
filter.add(Predicates.or(
CardType.INSTANT.getPredicate(),
CardType.SORCERY.getPredicate()));
CardType.SORCERY.getPredicate()
));
}
public MelekIzzetParagon(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{U}{R}");
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{U}{R}");
addSuperType(SuperType.LEGENDARY);
this.subtype.add(SubType.WEIRD);
this.subtype.add(SubType.WIZARD);

View file

@ -5,13 +5,17 @@ import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.PayLifeCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.AsThoughEffectImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.continuous.LookAtTopCardOfLibraryAnyTimeEffect;
import mage.cards.Card;
import mage.abilities.effects.common.continuous.PlayTheTopCardEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.filter.FilterCard;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.ColorlessPredicate;
import mage.game.Game;
import mage.players.Player;
@ -22,14 +26,23 @@ import java.util.UUID;
*/
public final class MysticForge extends CardImpl {
private static final FilterCard filter = new FilterCard("cast artifact spells and colorless spells");
static {
filter.add(Predicates.or(
ColorlessPredicate.instance,
CardType.ARTIFACT.getPredicate()
));
}
public MysticForge(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}");
// You may look at the top card of your library any time.
this.addAbility(new SimpleStaticAbility(new LookAtTopCardOfLibraryAnyTimeEffect()));
// You may cast the top card of your library if it's an artifact card or a colorless nonland card.
this.addAbility(new SimpleStaticAbility(new MysticForgeTopCardCastEffect()));
// You may cast artifact spells and colorless spells from the top of your library.
this.addAbility(new SimpleStaticAbility(new PlayTheTopCardEffect(filter)));
// {T}, Pay 1 life: Exile the top card of your library.
Ability ability = new SimpleActivatedAbility(new MysticForgeExileEffect(), new TapSourceCost());
@ -47,50 +60,6 @@ public final class MysticForge extends CardImpl {
}
}
class MysticForgeTopCardCastEffect extends AsThoughEffectImpl {
MysticForgeTopCardCastEffect() {
super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.WhileOnBattlefield, Outcome.Benefit);
staticText = "You may cast the top card of your library if it's an artifact card or a colorless nonland card.";
}
private MysticForgeTopCardCastEffect(final MysticForgeTopCardCastEffect effect) {
super(effect);
}
@Override
public boolean apply(Game game, Ability source) {
return true;
}
@Override
public MysticForgeTopCardCastEffect copy() {
return new MysticForgeTopCardCastEffect(this);
}
@Override
public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) {
if (!affectedControllerId.equals(source.getControllerId())) {
return false;
}
Card card = game.getCard(objectId);
if (card == null) {
return false;
}
Player controller = game.getPlayer(affectedControllerId);
if (controller == null) {
return false;
}
Card topCard = controller.getLibrary().getFromTop(game);
return game.getObject(source.getSourceId()) != null
&& topCard != null
&& topCard == card
&& (topCard.isArtifact() || (!topCard.isLand() && topCard.getColor(game).isColorless()))
&& topCard.getSpellAbility() != null
&& topCard.getSpellAbility().spellCanBeActivatedRegularlyNow(controller.getId(), game);
}
}
class MysticForgeExileEffect extends OneShotEffect {
MysticForgeExileEffect() {

View file

@ -1,8 +1,5 @@
package mage.cards.o;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.continuous.PlayAdditionalLandsControllerEffect;
@ -11,35 +8,41 @@ import mage.abilities.effects.common.continuous.PlayWithTheTopCardRevealedEffect
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Duration;
import mage.constants.Zone;
import mage.constants.SubType;
import mage.filter.FilterCard;
import mage.filter.common.FilterLandCard;
import java.util.UUID;
/**
*
* @author nantuko, BetaSteward_at_googlemail.com
*/
public final class OracleOfMulDaya extends CardImpl {
private static final FilterCard filter = new FilterLandCard("play land cards");
public OracleOfMulDaya(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{G}");
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}");
this.subtype.add(SubType.ELF);
this.subtype.add(SubType.SHAMAN);
this.power = new MageInt(2);
this.toughness = new MageInt(2);
// You may play an additional land on each of your turns.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new PlayAdditionalLandsControllerEffect(1, Duration.WhileOnBattlefield)));
this.addAbility(new SimpleStaticAbility(
new PlayAdditionalLandsControllerEffect(1, Duration.WhileOnBattlefield)
));
// Play with the top card of your library revealed.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new PlayWithTheTopCardRevealedEffect()));
this.addAbility(new SimpleStaticAbility(new PlayWithTheTopCardRevealedEffect()));
// You may play the top card of your library if it's a land card.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new PlayTheTopCardEffect(new FilterLandCard())));
this.addAbility(new SimpleStaticAbility(new PlayTheTopCardEffect(filter)));
}
public OracleOfMulDaya(final OracleOfMulDaya card) {
private OracleOfMulDaya(final OracleOfMulDaya card) {
super(card);
}
@ -47,5 +50,4 @@ public final class OracleOfMulDaya extends CardImpl {
public OracleOfMulDaya copy() {
return new OracleOfMulDaya(this);
}
}

View file

@ -1,17 +1,20 @@
package mage.cards.p;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.AsThoughEffectImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.continuous.LookAtTopCardOfLibraryAnyTimeEffect;
import mage.abilities.effects.common.continuous.PlayTheTopCardEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.filter.FilterCard;
import mage.filter.predicate.Predicates;
import mage.game.Game;
import mage.players.Player;
@ -22,6 +25,15 @@ import java.util.UUID;
*/
public final class PrecognitionField extends CardImpl {
private static final FilterCard filter = new FilterCard("cast instant or sorcery spells");
static {
filter.add(Predicates.or(
CardType.INSTANT.getPredicate(),
CardType.SORCERY.getPredicate()
));
}
public PrecognitionField(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{U}");
@ -29,7 +41,7 @@ public final class PrecognitionField extends CardImpl {
this.addAbility(new SimpleStaticAbility(new LookAtTopCardOfLibraryAnyTimeEffect()));
// You may cast the top card of your library if it's an instant or sorcery card.
this.addAbility(new SimpleStaticAbility(new PrecognitionFieldTopCardCastEffect()));
this.addAbility(new SimpleStaticAbility(new PlayTheTopCardEffect(filter)));
// {3}: Exile the top card of your library.
this.addAbility(new SimpleActivatedAbility(new PrecognitionFieldExileEffect(), new GenericManaCost(3)));
@ -45,50 +57,6 @@ public final class PrecognitionField extends CardImpl {
}
}
class PrecognitionFieldTopCardCastEffect extends AsThoughEffectImpl {
public PrecognitionFieldTopCardCastEffect() {
super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.WhileOnBattlefield, Outcome.Benefit);
staticText = "You may cast the top card of your library if it's an instant or sorcery card.";
}
public PrecognitionFieldTopCardCastEffect(final PrecognitionFieldTopCardCastEffect effect) {
super(effect);
}
@Override
public boolean apply(Game game, Ability source) {
return true;
}
@Override
public PrecognitionFieldTopCardCastEffect copy() {
return new PrecognitionFieldTopCardCastEffect(this);
}
@Override
public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) {
if (affectedControllerId.equals(source.getControllerId())) {
Card card = game.getCard(objectId);
if (card != null) {
Player controller = game.getPlayer(affectedControllerId);
if (controller != null) {
Card topCard = controller.getLibrary().getFromTop(game);
MageObject precognitionField = game.getObject(source.getSourceId());
if (precognitionField != null
&& topCard != null) {
return topCard == card
&& (topCard.isInstant() || topCard.isSorcery())
&& topCard.getSpellAbility() != null
&& topCard.getSpellAbility().spellCanBeActivatedRegularlyNow(controller.getId(), game);
}
}
}
}
return false;
}
}
class PrecognitionFieldExileEffect extends OneShotEffect {
public PrecognitionFieldExileEffect() {

View file

@ -5,12 +5,11 @@ import mage.abilities.DelayedTriggeredAbility;
import mage.abilities.LoyaltyAbility;
import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.AsThoughEffectImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
import mage.abilities.effects.common.continuous.LookAtTopCardOfLibraryAnyTimeEffect;
import mage.abilities.effects.common.continuous.PlayTheTopCardEffect;
import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.choices.Choice;
@ -34,13 +33,13 @@ import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
import static mage.constants.Outcome.Benefit;
/**
* @author TheElk801
*/
public final class VivienMonstersAdvocate extends CardImpl {
private static final FilterCard filter = new FilterCreatureCard("cast creature spells");
public VivienMonstersAdvocate(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{3}{G}{G}");
@ -52,7 +51,7 @@ public final class VivienMonstersAdvocate extends CardImpl {
this.addAbility(new SimpleStaticAbility(new LookAtTopCardOfLibraryAnyTimeEffect()));
// You may cast creature spells from the top of your library.
this.addAbility(new SimpleStaticAbility(new VivienMonstersAdvocateTopCardCastEffect()));
this.addAbility(new SimpleStaticAbility(new PlayTheTopCardEffect(filter)));
// +1: Create a 3/3 green Beast creature token. Put your choice of a vigilance counter, a reach counter, or a trample counter on it.
this.addAbility(new LoyaltyAbility(new VivienMonstersAdvocateTokenEffect(), 1));
@ -73,49 +72,6 @@ public final class VivienMonstersAdvocate extends CardImpl {
}
}
class VivienMonstersAdvocateTopCardCastEffect extends AsThoughEffectImpl {
VivienMonstersAdvocateTopCardCastEffect() {
super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.WhileOnBattlefield, Benefit);
staticText = "You may cast creature spells from the top of your library";
}
private VivienMonstersAdvocateTopCardCastEffect(final VivienMonstersAdvocateTopCardCastEffect effect) {
super(effect);
}
@Override
public boolean apply(Game game, Ability source) {
return true;
}
@Override
public VivienMonstersAdvocateTopCardCastEffect copy() {
return new VivienMonstersAdvocateTopCardCastEffect(this);
}
@Override
public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) {
if (!affectedControllerId.equals(source.getControllerId())) {
return false;
}
Card card = game.getCard(objectId);
if (card == null) {
return false;
}
Player controller = game.getPlayer(affectedControllerId);
if (controller == null) {
return false;
}
Card topCard = controller.getLibrary().getFromTop(game);
return topCard != null
&& topCard == card
&& topCard.isCreature()
&& topCard.getSpellAbility() != null
&& topCard.getSpellAbility().spellCanBeActivatedRegularlyNow(controller.getId(), game);
}
}
class VivienMonstersAdvocateTokenEffect extends OneShotEffect {
private static final Token token = new BeastToken();

View file

@ -7,13 +7,14 @@ import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.AsThoughEffectImpl;
import mage.abilities.effects.AsThoughManaEffect;
import mage.abilities.effects.common.continuous.LookAtTopCardOfLibraryAnyTimeEffect;
import mage.cards.Card;
import mage.abilities.effects.common.continuous.PlayTheTopCardEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.FilterCard;
import mage.filter.common.FilterCreatureCard;
import mage.game.Game;
import mage.players.ManaPoolItem;
import mage.players.Player;
import mage.util.CardUtil;
import java.util.UUID;
@ -23,6 +24,8 @@ import java.util.UUID;
*/
public final class VizierOfTheMenagerie extends CardImpl {
private static final FilterCard filter = new FilterCreatureCard("cast creature spells");
public VizierOfTheMenagerie(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}");
this.subtype.add(SubType.NAGA);
@ -34,7 +37,7 @@ public final class VizierOfTheMenagerie extends CardImpl {
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new LookAtTopCardOfLibraryAnyTimeEffect()));
// You may cast the top card of your library if it's a creature card.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new VizierOfTheMenagerieTopCardCastEffect()));
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new PlayTheTopCardEffect(filter)));
// You may spend mana as though it were mana of any type to cast creature spells.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new VizierOfTheMenagerieManaEffect()));
@ -51,50 +54,6 @@ public final class VizierOfTheMenagerie extends CardImpl {
}
}
class VizierOfTheMenagerieTopCardCastEffect extends AsThoughEffectImpl {
public VizierOfTheMenagerieTopCardCastEffect() {
super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.WhileOnBattlefield, Outcome.Benefit);
staticText = "You may cast the top card of your library if it's a creature card";
}
public VizierOfTheMenagerieTopCardCastEffect(final VizierOfTheMenagerieTopCardCastEffect effect) {
super(effect);
}
@Override
public boolean apply(Game game, Ability source) {
return true;
}
@Override
public VizierOfTheMenagerieTopCardCastEffect copy() {
return new VizierOfTheMenagerieTopCardCastEffect(this);
}
@Override
public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) {
if (affectedControllerId.equals(source.getControllerId())) {
Card card = game.getCard(objectId);
if (card != null) {
Player controller = game.getPlayer(affectedControllerId);
if (controller != null) {
Card topCard = controller.getLibrary().getFromTop(game);
MageObject vizierOfTheMenagerie = game.getObject(source.getSourceId());
if (vizierOfTheMenagerie != null
&& topCard != null) {
return topCard == card
&& topCard.isCreature()
&& topCard.getSpellAbility() != null
&& topCard.getSpellAbility().spellCanBeActivatedRegularlyNow(controller.getId(), game);
}
}
}
}
return false;
}
}
class VizierOfTheMenagerieManaEffect extends AsThoughEffectImpl implements AsThoughManaEffect {
public VizierOfTheMenagerieManaEffect() {

View file

@ -7,6 +7,7 @@ import mage.constants.AsThoughEffectType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.filter.FilterCard;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.players.Player;
import mage.util.CardUtil;
@ -18,17 +19,17 @@ import java.util.UUID;
*/
public class PlayTheTopCardEffect extends AsThoughEffectImpl {
private FilterCard filter;
private final FilterCard filter;
public PlayTheTopCardEffect() {
this(new FilterCard());
staticText = "You may play the top card of your library";
this(StaticFilters.FILTER_CARD);
staticText = "You may play lands and cast spells from the top of your library";
}
public PlayTheTopCardEffect(FilterCard filter) {
super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.WhileOnBattlefield, Outcome.Benefit);
this.filter = filter;
staticText = "You may play the top card of your library if it's a " + filter.getMessage();
staticText = "You may " + filter.getMessage() + " from the top of your library";
}
public PlayTheTopCardEffect(final PlayTheTopCardEffect effect) {