mirror of
https://github.com/correl/mage.git
synced 2024-12-24 11:50:45 +00:00
updated "play from top of library" effects
This commit is contained in:
parent
29dfb1a404
commit
8bbdae4af6
11 changed files with 97 additions and 241 deletions
|
@ -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.";
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in a new issue