refactor a few more cards to test some more possible situations

This commit is contained in:
theelk801 2025-07-29 19:39:58 -04:00
parent cb9f608fad
commit 0f25453898
11 changed files with 208 additions and 177 deletions

View file

@ -1,11 +1,10 @@
package mage.cards.b;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.cards.i.InvasionOfBelenon;
import mage.constants.CardType;
import mage.constants.Duration;
import java.util.UUID;
@ -15,13 +14,9 @@ import java.util.UUID;
public final class BelenonWarAnthem extends CardImpl {
public BelenonWarAnthem(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "");
this.color.setWhite(true);
super(ownerId, setInfo, new CardType[]{}, "");
this.nightCard = true;
// Creatures you control get +1/+1.
this.addAbility(new SimpleStaticAbility(new BoostControlledEffect(1, 1, Duration.WhileOnBattlefield)));
TransformingDoubleFacedCard.copyToBackFace(new InvasionOfBelenon(ownerId, setInfo), this);
}
private BelenonWarAnthem(final BelenonWarAnthem card) {

View file

@ -3,19 +3,29 @@ package mage.cards.g;
import mage.abilities.Ability;
import mage.abilities.LoyaltyAbility;
import mage.abilities.StateTriggeredAbility;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.counters.CounterType;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.game.permanent.token.WolfToken;
import mage.game.permanent.token.WolfTokenWithDeathtouch;
import mage.target.common.TargetCardInLibrary;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
@ -23,29 +33,57 @@ import java.util.UUID;
/**
* @author nantuko
*/
public final class GarrukRelentless extends CardImpl {
public final class GarrukRelentless extends TransformingDoubleFacedCard {
private static final DynamicValue xValue = new CardsInControllerGraveyardCount(StaticFilters.FILTER_CARD_CREATURE);
public GarrukRelentless(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{3}{G}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.GARRUK);
super(
ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.PLANESWALKER}, new SubType[]{SubType.GARRUK}, "{3}{G}",
"Garruk, the Veil-Cursed",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.PLANESWALKER}, new SubType[]{SubType.GARRUK}, "BG"
);
this.getLeftHalfCard().setStartingLoyalty(3);
this.secondSideCardClazz = mage.cards.g.GarrukTheVeilCursed.class;
this.setStartingLoyalty(3);
// When Garruk Relentless has two or fewer loyalty counters on him, transform him.
this.addAbility(new TransformAbility());
this.addAbility(new GarrukRelentlessStateTrigger());
this.getLeftHalfCard().addAbility(new GarrukRelentlessStateTrigger());
// 0: Garruk Relentless deals 3 damage to target creature. That creature deals damage equal to its power to him
Ability ability = new LoyaltyAbility(new DamageTargetEffect(3), 0);
ability.addEffect(new GarrukRelentlessDamageEffect());
ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability);
this.getLeftHalfCard().addAbility(ability);
// 0: Create a 2/2 green Wolf creature token.
this.addAbility(new LoyaltyAbility(new CreateTokenEffect(new WolfToken()), 0));
this.getLeftHalfCard().addAbility(new LoyaltyAbility(new CreateTokenEffect(new WolfToken()), 0));
// Garruk, the Veil-Cursed
// +1 : Create a 1/1 black Wolf creature token with deathtouch.
this.getRightHalfCard().addAbility(new LoyaltyAbility(new CreateTokenEffect(new WolfTokenWithDeathtouch()), 1));
// -1 : Sacrifice a creature. If you do, search your library for a creature card, reveal it, put it into your hand, then shuffle your library.
this.getRightHalfCard().addAbility(new LoyaltyAbility(new DoIfCostPaid(
new SearchLibraryPutInHandEffect(new TargetCardInLibrary(
StaticFilters.FILTER_CARD_CREATURE_A
), true),
null,
new SacrificeTargetCost(StaticFilters.FILTER_PERMANENT_CREATURE),
false
), -1));
// -3 : Creatures you control gain trample and get +X/+X until end of turn, where X is the number of creature cards in your graveyard.
ability = new LoyaltyAbility(new GainAbilityControlledEffect(
TrampleAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_CONTROLLED_CREATURE
).setText("creatures you control gain trample"), -3);
ability.addEffect(new BoostControlledEffect(
xValue, xValue, Duration.EndOfTurn
).setText("and get +X/+X until end of turn, where X is the number of creature cards in your graveyard"));
this.getRightHalfCard().addAbility(ability);
this.finalizeDFC();
}
private GarrukRelentless(final GarrukRelentless card) {

View file

@ -1,25 +1,9 @@
package mage.cards.g;
import mage.abilities.Ability;
import mage.abilities.LoyaltyAbility;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.filter.StaticFilters;
import mage.game.permanent.token.WolfTokenWithDeathtouch;
import mage.target.common.TargetCardInLibrary;
import java.util.UUID;
@ -28,40 +12,10 @@ import java.util.UUID;
*/
public final class GarrukTheVeilCursed extends CardImpl {
private static final DynamicValue xValue = new CardsInControllerGraveyardCount(StaticFilters.FILTER_CARD_CREATURE);
public GarrukTheVeilCursed(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.GARRUK);
// this card is the second face of double-faced card
super(ownerId, setInfo, new CardType[]{}, "");
this.nightCard = true;
this.color.setGreen(true);
this.color.setBlack(true);
// +1 : Create a 1/1 black Wolf creature token with deathtouch.
this.addAbility(new LoyaltyAbility(new CreateTokenEffect(new WolfTokenWithDeathtouch()), 1));
// -1 : Sacrifice a creature. If you do, search your library for a creature card, reveal it, put it into your hand, then shuffle your library.
this.addAbility(new LoyaltyAbility(new DoIfCostPaid(
new SearchLibraryPutInHandEffect(new TargetCardInLibrary(
StaticFilters.FILTER_CARD_CREATURE_A
), true),
null,
new SacrificeTargetCost(StaticFilters.FILTER_PERMANENT_CREATURE),
false
), -1));
// -3 : Creatures you control gain trample and get +X/+X until end of turn, where X is the number of creature cards in your graveyard.
Ability ability = new LoyaltyAbility(new GainAbilityControlledEffect(
TrampleAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_CONTROLLED_CREATURE
).setText("creatures you control gain trample"), -3);
ability.addEffect(new BoostControlledEffect(
xValue, xValue, Duration.EndOfTurn
).setText("and get +X/+X until end of turn, where X is the number of creature cards in your graveyard"));
this.addAbility(ability);
TransformingDoubleFacedCard.copyToBackFace(new GarrukRelentless(ownerId, setInfo), this);
}
private GarrukTheVeilCursed(final GarrukTheVeilCursed card) {

View file

@ -2,10 +2,13 @@ package mage.cards.i;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SiegeAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.cards.CardImpl;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.game.permanent.token.KnightWhiteBlueToken;
@ -14,20 +17,30 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class InvasionOfBelenon extends CardImpl {
public final class InvasionOfBelenon extends TransformingDoubleFacedCard {
public InvasionOfBelenon(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{2}{W}");
super(
ownerId, setInfo,
new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{2}{W}",
"Belenon War Anthem",
new CardType[]{CardType.ENCHANTMENT}, new SubType[]{}, "W"
);
this.getLeftHalfCard().setStartingDefense(5);
this.subtype.add(SubType.SIEGE);
this.setStartingDefense(5);
this.secondSideCardClazz = mage.cards.b.BelenonWarAnthem.class;
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
this.addAbility(new SiegeAbility());
this.getLeftHalfCard().addAbility(new SiegeAbility());
// When Invasion of Belenon enters the battlefield, create a 2/2 white and blue Knight creature token with vigilance.
this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new KnightWhiteBlueToken())));
this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new KnightWhiteBlueToken())));
// Belenon War Anthem
// Creatures you control get +1/+1.
this.getRightHalfCard().addAbility(new SimpleStaticAbility(new BoostControlledEffect(1, 1, Duration.WhileOnBattlefield)));
this.finalizeDFC();
}
private InvasionOfBelenon(final InvasionOfBelenon card) {

View file

@ -5,8 +5,10 @@ import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SiegeAbility;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.GainLifeEffect;
import mage.cards.CardImpl;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.VigilanceAbility;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
@ -15,22 +17,36 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class InvasionOfDominaria extends CardImpl {
public final class InvasionOfDominaria extends TransformingDoubleFacedCard {
public InvasionOfDominaria(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.BATTLE}, "{2}{W}");
super(
ownerId, setInfo,
new CardType[]{CardType.BATTLE}, new SubType[]{SubType.SIEGE}, "{2}{W}",
"Serra Faithkeeper",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.ANGEL}, "W"
);
this.getLeftHalfCard().setStartingDefense(5);
this.getRightHalfCard().setPT(4, 4);
this.subtype.add(SubType.SIEGE);
this.setStartingDefense(5);
this.secondSideCardClazz = mage.cards.s.SerraFaithkeeper.class;
// (As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)
this.addAbility(new SiegeAbility());
this.getLeftHalfCard().addAbility(new SiegeAbility());
// When Invasion of Dominaria enters the battlefield, you gain 4 life and draw a card.
Ability ability = new EntersBattlefieldTriggeredAbility(new GainLifeEffect(4));
ability.addEffect(new DrawCardSourceControllerEffect(1).concatBy("and"));
this.addAbility(ability);
this.getLeftHalfCard().addAbility(ability);
// Serra Faithkeeper
// Flying
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
// Vigilance
this.getRightHalfCard().addAbility(VigilanceAbility.getInstance());
this.finalizeDFC();
}
private InvasionOfDominaria(final InvasionOfDominaria card) {

View file

@ -1,20 +1,9 @@
package mage.cards.j;
import mage.abilities.Ability;
import mage.abilities.LoyaltyAbility;
import mage.abilities.effects.common.GetEmblemEffect;
import mage.abilities.effects.common.MayCastTargetCardEffect;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.filter.StaticFilters;
import mage.game.command.emblems.JaceTelepathUnboundEmblem;
import mage.target.common.TargetCardInYourGraveyard;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
@ -24,29 +13,9 @@ import java.util.UUID;
public final class JaceTelepathUnbound extends CardImpl {
public JaceTelepathUnbound(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.JACE);
this.color.setBlue(true);
super(ownerId, setInfo, new CardType[]{}, "");
this.nightCard = true;
this.setStartingLoyalty(5);
// +1: Up to one target creature gets -2/-0 until your next turn.
Ability ability = new LoyaltyAbility(new BoostTargetEffect(
-2, 0, Duration.UntilYourNextTurn
).setText("Up to one target creature gets -2/-0 until your next turn"), 1);
ability.addTarget(new TargetCreaturePermanent(0, 1));
this.addAbility(ability);
// -3: You may cast target instant or sorcery card from your graveyard this turn. If that card would be put into your graveyard this turn, exile it instead.
ability = new LoyaltyAbility(new MayCastTargetCardEffect(Duration.EndOfTurn, true), -3);
ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_INSTANT_OR_SORCERY_FROM_YOUR_GRAVEYARD));
this.addAbility(ability);
// 9: You get an emblem with "Whenever you cast a spell, target opponent mills five cards."
this.addAbility(new LoyaltyAbility(new GetEmblemEffect(new JaceTelepathUnboundEmblem()), -9));
TransformingDoubleFacedCard.copyToBackFace(new JaceVrynsProdigy(ownerId, setInfo), this);
}
private JaceTelepathUnbound(final JaceTelepathUnbound card) {

View file

@ -1,7 +1,7 @@
package mage.cards.j;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.LoyaltyAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.CardsInControllerGraveyardCondition;
@ -9,39 +9,64 @@ import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.effects.common.DrawDiscardControllerEffect;
import mage.abilities.effects.common.ExileAndReturnSourceEffect;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.abilities.effects.common.GetEmblemEffect;
import mage.abilities.effects.common.MayCastTargetCardEffect;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.filter.StaticFilters;
import mage.game.command.emblems.JaceTelepathUnboundEmblem;
import mage.target.common.TargetCardInYourGraveyard;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
* @author LevelX2
*/
public final class JaceVrynsProdigy extends CardImpl {
public final class JaceVrynsProdigy extends TransformingDoubleFacedCard {
private static final Condition condition = new CardsInControllerGraveyardCondition(5);
public JaceVrynsProdigy(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.WIZARD);
this.power = new MageInt(0);
this.toughness = new MageInt(2);
super(
ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WIZARD}, "{1}{U}",
"Jace, Telepath Unbound",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.PLANESWALKER}, new SubType[]{SubType.JACE}, "U"
);
this.getLeftHalfCard().setPT(0, 2);
this.getRightHalfCard().setStartingLoyalty(5);
this.secondSideCardClazz = mage.cards.j.JaceTelepathUnbound.class;
// {T}: Draw a card, then discard a card. If there are five or more cards in your graveyard, exile Jace, Vryn's Prodigy, then return him to the battefield transformed under his owner's control.
this.addAbility(new TransformAbility());
Ability ability = new SimpleActivatedAbility(
new DrawDiscardControllerEffect(1, 1), new TapSourceCost()
);
ability.addEffect(new ConditionalOneShotEffect(
new ExileAndReturnSourceEffect(PutCards.BATTLEFIELD_TRANSFORMED, Pronoun.HE), condition
));
this.addAbility(ability);
this.getLeftHalfCard().addAbility(ability);
// Jace, Telepath Unbound
// +1: Up to one target creature gets -2/-0 until your next turn.
ability = new LoyaltyAbility(new BoostTargetEffect(
-2, 0, Duration.UntilYourNextTurn
).setText("Up to one target creature gets -2/-0 until your next turn"), 1);
ability.addTarget(new TargetCreaturePermanent(0, 1));
this.getRightHalfCard().addAbility(ability);
// -3: You may cast target instant or sorcery card from your graveyard this turn. If that card would be put into your graveyard this turn, exile it instead.
ability = new LoyaltyAbility(new MayCastTargetCardEffect(Duration.EndOfTurn, true), -3);
ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_INSTANT_OR_SORCERY_FROM_YOUR_GRAVEYARD));
this.getRightHalfCard().addAbility(ability);
// 9: You get an emblem with "Whenever you cast a spell, target opponent mills five cards."
this.getRightHalfCard().addAbility(new LoyaltyAbility(new GetEmblemEffect(new JaceTelepathUnboundEmblem()), -9));
this.finalizeDFC();
}
private JaceVrynsProdigy(final JaceVrynsProdigy card) {

View file

@ -1,13 +1,10 @@
package mage.cards.p;
import mage.MageInt;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
import mage.abilities.effects.common.ReturnToHandSourceEffect;
import mage.abilities.keyword.SkulkAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.cards.s.StartledAwake;
import mage.constants.CardType;
import mage.constants.SubType;
import java.util.UUID;
@ -17,22 +14,9 @@ import java.util.UUID;
public final class PersistentNightmare extends CardImpl {
public PersistentNightmare(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.NIGHTMARE);
this.power = new MageInt(1);
this.toughness = new MageInt(1);
this.color.setBlue(true);
// this card is the second face of double-faced card
super(ownerId, setInfo, new CardType[]{}, "");
this.nightCard = true;
// Skulk
this.addAbility(new SkulkAbility());
// When Persistent Nightmare deals combat damage to a player, return it to its owner's hand.
this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(
new ReturnToHandSourceEffect(), false
).setTriggerPhrase("When {this} deals combat damage to a player, "));
TransformingDoubleFacedCard.copyToBackFace(new StartledAwake(ownerId, setInfo), this);
}
private PersistentNightmare(final PersistentNightmare card) {

View file

@ -1,12 +1,10 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.VigilanceAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.cards.i.InvasionOfDominaria;
import mage.constants.CardType;
import mage.constants.SubType;
import java.util.UUID;
@ -16,19 +14,9 @@ import java.util.UUID;
public final class SerraFaithkeeper extends CardImpl {
public SerraFaithkeeper(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.ANGEL);
this.power = new MageInt(4);
this.toughness = new MageInt(4);
this.color.setWhite(true);
super(ownerId, setInfo, new CardType[]{}, "");
this.nightCard = true;
// Flying
this.addAbility(FlyingAbility.getInstance());
// Vigilance
this.addAbility(VigilanceAbility.getInstance());
TransformingDoubleFacedCard.copyToBackFace(new InvasionOfDominaria(ownerId, setInfo), this);
}
private SerraFaithkeeper(final SerraFaithkeeper card) {

View file

@ -1,17 +1,20 @@
package mage.cards.s;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.MillCardsTargetEffect;
import mage.abilities.effects.common.ReturnToHandSourceEffect;
import mage.abilities.keyword.SkulkAbility;
import mage.abilities.keyword.TransformAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.game.Game;
import mage.players.Player;
@ -22,22 +25,38 @@ import java.util.UUID;
/**
* @author LevelX2
*/
public final class StartledAwake extends CardImpl {
public final class StartledAwake extends TransformingDoubleFacedCard {
public StartledAwake(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{U}{U}");
super(
ownerId, setInfo,
new CardType[]{CardType.SORCERY}, new SubType[]{}, "{2}{U}{U}",
"Persistent Nightmare",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.NIGHTMARE}, "U"
);
this.getRightHalfCard().setPT(1, 1);
this.secondSideCardClazz = mage.cards.p.PersistentNightmare.class;
// Target opponent puts the top thirteen cards of their library into their graveyard.
this.getSpellAbility().addTarget(new TargetOpponent());
this.getSpellAbility().addEffect(new MillCardsTargetEffect(13));
this.getLeftHalfCard().getSpellAbility().addEffect(new MillCardsTargetEffect(13));
this.getLeftHalfCard().getSpellAbility().addTarget(new TargetOpponent());
// {3}{U}{U}: Put Startled Awake from your graveyard onto the battlefield transformed. Activate this ability only any time you could cast a sorcery.
this.addAbility(new TransformAbility());
this.addAbility(new ActivateAsSorceryActivatedAbility(
this.getLeftHalfCard().addAbility(new ActivateAsSorceryActivatedAbility(
Zone.GRAVEYARD, new StartledAwakeReturnTransformedEffect(), new ManaCostsImpl<>("{3}{U}{U}")
));
// Persistent Nightmare
// Skulk
this.getRightHalfCard().addAbility(new SkulkAbility());
// When Persistent Nightmare deals combat damage to a player, return it to its owner's hand.
this.getRightHalfCard().addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(
new ReturnToHandSourceEffect(), false
).setTriggerPhrase("When {this} deals combat damage to a player, "));
this.finalizeDFC();
}
private StartledAwake(final StartledAwake card) {

View file

@ -2,10 +2,12 @@ package mage.cards;
import mage.ObjectColor;
import mage.abilities.Ability;
import mage.abilities.effects.Effect;
import mage.abilities.keyword.TransformAbility;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.target.Target;
import java.util.UUID;
@ -16,6 +18,7 @@ public abstract class TransformingDoubleFacedCard extends CardImpl {
protected TransformingDoubleFacedCardHalfImpl leftHalfCard; // main card in all zone
protected TransformingDoubleFacedCardHalfImpl rightHalfCard; // second side card, can be only in stack and battlefield zones
private boolean finalized = false;
public TransformingDoubleFacedCard(
UUID ownerId, CardSetInfo setInfo,
@ -57,6 +60,10 @@ public abstract class TransformingDoubleFacedCard extends CardImpl {
super(card);
this.leftHalfCard = card.leftHalfCard.copy();
this.rightHalfCard = card.rightHalfCard.copy();
if (!card.finalized) {
throw new IllegalStateException("Error, finalizeDFC needs to be called");
}
this.finalized = true;
}
public Card getLeftHalfCard() {
@ -72,11 +79,24 @@ public abstract class TransformingDoubleFacedCard extends CardImpl {
this.getCardType().addAll(this.getLeftHalfCard().getCardType());
this.getSubtype().addAll(this.getLeftHalfCard().getSubtype());
for (Ability ability : this.getLeftHalfCard().getAbilities()) {
this.addAbility(ability);
if (!ability.equals(this.getLeftHalfCard().getSpellAbility())) {
this.addAbility(ability);
}
}
if (!this.getAbilities().containsClass(TransformAbility.class)) {
this.addAbility(new TransformAbility());
}
for (Effect effect : this.getLeftHalfCard().getSpellAbility().getEffects()) {
this.getSpellAbility().addEffect(effect);
}
for (Target target : this.getLeftHalfCard().getSpellAbility().getTargets()) {
this.getSpellAbility().addTarget(target);
}
this.addAbility(new TransformAbility());
this.power = this.getLeftHalfCard().getPower().copy();
this.toughness = this.getLeftHalfCard().getToughness().copy();
this.startingLoyalty = this.getLeftHalfCard().getStartingLoyalty();
this.startingDefense = this.getLeftHalfCard().getStartingDefense();
this.finalized = true;
}
public static void copyToBackFace(TransformingDoubleFacedCard tdfc, Card card) {
@ -85,8 +105,18 @@ public abstract class TransformingDoubleFacedCard extends CardImpl {
card.getCardType().addAll(tdfc.getRightHalfCard().getCardType());
card.getSubtype().addAll(tdfc.getRightHalfCard().getSubtype());
for (Ability ability : tdfc.getRightHalfCard().getAbilities()) {
card.addAbility(ability);
if (!ability.equals(tdfc.getRightHalfCard().getSpellAbility())) {
card.addAbility(ability);
}
}
for (Effect effect : tdfc.getRightHalfCard().getSpellAbility().getEffects()) {
card.getSpellAbility().addEffect(effect);
}
for (Target target : tdfc.getRightHalfCard().getSpellAbility().getTargets()) {
card.getSpellAbility().addTarget(target);
}
card.setPT(tdfc.getRightHalfCard().getPower().copy(), tdfc.getRightHalfCard().getToughness().copy());
card.setStartingLoyalty(tdfc.getRightHalfCard().getStartingLoyalty());
card.setStartingDefense(tdfc.getRightHalfCard().getStartingDefense());
}
}