convert transforming "S" cards to single class file

part of #14099
This commit is contained in:
jmlundeen 2025-12-04 10:58:39 -06:00
parent 99bb467bdc
commit 7cd68d9620
86 changed files with 1399 additions and 2481 deletions

View file

@ -1,50 +0,0 @@
package mage.cards.a;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.StaticFilters;
import mage.target.common.TargetAnyTarget;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class AshmouthDragon extends CardImpl {
public AshmouthDragon(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.DRAGON);
this.power = new MageInt(4);
this.toughness = new MageInt(4);
this.color.setRed(true);
this.nightCard = true;
// Flying
this.addAbility(FlyingAbility.getInstance());
// Whenever you cast an instant or sorcery spell, Ashmouth Dragon deals 2 damage to any target.
Ability ability = new SpellCastControllerTriggeredAbility(
new DamageTargetEffect(2), StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY, false
);
ability.addTarget(new TargetAnyTarget());
this.addAbility(ability);
}
private AshmouthDragon(final AshmouthDragon card) {
super(card);
}
@Override
public AshmouthDragon copy() {
return new AshmouthDragon(this);
}
}

View file

@ -1,60 +0,0 @@
package mage.cards.a;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
import mage.abilities.mana.BlueManaAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.PutCards;
import mage.constants.SuperType;
import mage.filter.FilterCard;
import mage.filter.predicate.Predicates;
/**
*
* @author LevelX2
*/
public final class AzcantaTheSunkenRuin extends CardImpl {
private static final FilterCard filter = new FilterCard("a noncreature, nonland card");
static {
filter.add(Predicates.not(CardType.CREATURE.getPredicate()));
filter.add(Predicates.not(CardType.LAND.getPredicate()));
}
public AzcantaTheSunkenRuin(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
this.supertype.add(SuperType.LEGENDARY);
// this card is the second face of double-faced card
this.nightCard = true;
// (Transforms from Search for Azcanta)/
// {T} : Add {U}.
this.addAbility(new BlueManaAbility());
// {2}{U} , {T} : Look at the top four cards of your library. You may reveal a noncreature, nonland card from among them and put it into your hand. Put the rest on the bottom of your library in any order.
Ability ability = new SimpleActivatedAbility(
new LookLibraryAndPickControllerEffect(4, 1, filter, PutCards.HAND, PutCards.BOTTOM_ANY),
new ManaCostsImpl<>("{2}{U}")
);
ability.addCost(new TapSourceCost());
this.addAbility(ability);
}
private AzcantaTheSunkenRuin(final AzcantaTheSunkenRuin card) {
super(card);
}
@Override
public AzcantaTheSunkenRuin copy() {
return new AzcantaTheSunkenRuin(this);
}
}

View file

@ -1,54 +0,0 @@
package mage.cards.b;
import mage.MageInt;
import mage.abilities.common.LandfallAbility;
import mage.abilities.common.TransformIntoSourceTriggeredAbility;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
import mage.target.common.TargetCardInLibrary;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class BlackChocobo extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent(SubType.BIRD, "Birds");
public BlackChocobo(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.BIRD);
this.power = new MageInt(2);
this.toughness = new MageInt(2);
this.nightCard = true;
this.color.setGreen(true);
// When this permanent transforms into Black Chocobo, search your library for a land card, put it onto the battlefield tapped, then shuffle.
this.addAbility(new TransformIntoSourceTriggeredAbility(
new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(StaticFilters.FILTER_CARD_LAND_A), true)
));
// Landfall -- Whenever a land you control enters, Birds you control get +1/+0 until end of turn.
this.addAbility(new LandfallAbility(new BoostControlledEffect(
1, 0, Duration.EndOfTurn, filter, false
)));
}
private BlackChocobo(final BlackChocobo card) {
super(card);
}
@Override
public BlackChocobo copy() {
return new BlackChocobo(this);
}
}

View file

@ -1,50 +0,0 @@
package mage.cards.c;
import mage.MageInt;
import mage.abilities.common.CanBlockOnlyFlyingAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.DrawDiscardControllerEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class CipherboundSpirit extends CardImpl {
public CipherboundSpirit(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.SPIRIT);
this.power = new MageInt(3);
this.toughness = new MageInt(2);
this.color.setBlue(true);
this.nightCard = true;
// Flying
this.addAbility(FlyingAbility.getInstance());
// Cipherbound Spirit can block only creatures with flying.
this.addAbility(new CanBlockOnlyFlyingAbility());
// {3}{U}: Draw two cards, then discard a card.
this.addAbility(new SimpleActivatedAbility(
new DrawDiscardControllerEffect(2, 1), new ManaCostsImpl<>("{3}{U}")
));
}
private CipherboundSpirit(final CipherboundSpirit card) {
super(card);
}
@Override
public CipherboundSpirit copy() {
return new CipherboundSpirit(this);
}
}

View file

@ -1,48 +0,0 @@
package mage.cards.c;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.counter.AddCountersAllEffect;
import mage.abilities.mana.WhiteManaAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.counters.CounterType;
import mage.filter.StaticFilters;
/**
* @author balazskristof
*/
public final class CookingCampsite extends CardImpl {
public CookingCampsite(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
this.nightCard = true;
// {T}: Add {W}.
this.addAbility(new WhiteManaAbility());
// {3}, {T}, Sacrifice an artifact: Put a +1/+1 counter on each creature you control. Activate only as a sorcery.
Ability ability = new ActivateAsSorceryActivatedAbility(
new AddCountersAllEffect(CounterType.P1P1.createInstance(), StaticFilters.FILTER_CONTROLLED_CREATURE), new ManaCostsImpl<>("{3}")
);
ability.addCost(new TapSourceCost());
ability.addCost(new SacrificeTargetCost(StaticFilters.FILTER_PERMANENT_ARTIFACT_AN));
this.addAbility(ability);
}
private CookingCampsite(final CookingCampsite card) {
super(card);
}
@Override
public CookingCampsite copy() {
return new CookingCampsite(this);
}
}

View file

@ -1,45 +0,0 @@
package mage.cards.c;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.s.SerahFarron;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SuperType;
import mage.filter.StaticFilters;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class CrystallizedSerah extends CardImpl {
public CrystallizedSerah(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "");
this.supertype.add(SuperType.LEGENDARY);
this.nightCard = true;
this.color.setGreen(true);
this.color.setWhite(true);
// The first legendary creature spell you cast each turn costs {2} less to cast.
this.addAbility(SerahFarron.makeAbility());
// Legendary creatures you control get +2/+2.
this.addAbility(new SimpleStaticAbility(new BoostControlledEffect(
2, 2, Duration.WhileOnBattlefield, StaticFilters.FILTER_CREATURES_LEGENDARY
)));
}
private CrystallizedSerah(final CrystallizedSerah card) {
super(card);
}
@Override
public CrystallizedSerah copy() {
return new CrystallizedSerah(this);
}
}

View file

@ -1,45 +0,0 @@
package mage.cards.e;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.target.common.TargetAnyTarget;
/**
*
* @author fireshoes
*/
public final class EruptingDreadwolf extends CardImpl {
public EruptingDreadwolf(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"");
this.subtype.add(SubType.ELDRAZI);
this.subtype.add(SubType.WEREWOLF);
this.power = new MageInt(6);
this.toughness = new MageInt(4);
// this card is the second face of double-faced card
this.nightCard = true;
// Whenever Erupting Dreadwolf attacks, it deals 2 damage to any target.
Ability ability = new AttacksTriggeredAbility(new DamageTargetEffect(2, "it"), false);
ability.addTarget(new TargetAnyTarget());
this.addAbility(ability);
}
private EruptingDreadwolf(final EruptingDreadwolf card) {
super(card);
}
@Override
public EruptingDreadwolf copy() {
return new EruptingDreadwolf(this);
}
}

View file

@ -1,88 +0,0 @@
package mage.cards.f;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateTokenCopyTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.counters.CounterType;
import mage.game.Game;
import mage.game.permanent.Permanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class FurnaceBlessedConqueror extends CardImpl {
public FurnaceBlessedConqueror(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.PHYREXIAN);
this.subtype.add(SubType.CLERIC);
this.power = new MageInt(3);
this.toughness = new MageInt(3);
this.color.setWhite(true);
this.color.setRed(true);
this.nightCard = true;
// Whenever Furnace-Blessed Conqueror attacks, create a tapped and attacking token that's a copy of it. Put a +1/+1 counter on that token for each +1/+1 counter on Furnace-Blessed Conqueror. Sacrifice that token at the beginning of the next end step.
this.addAbility(new AttacksTriggeredAbility(new FurnaceBlessedConquerorEffect()));
}
private FurnaceBlessedConqueror(final FurnaceBlessedConqueror card) {
super(card);
}
@Override
public FurnaceBlessedConqueror copy() {
return new FurnaceBlessedConqueror(this);
}
}
class FurnaceBlessedConquerorEffect extends OneShotEffect {
FurnaceBlessedConquerorEffect() {
super(Outcome.Benefit);
staticText = "create a tapped and attacking token that's a copy of it. " +
"Put a +1/+1 counter on that token for each +1/+1 counter on {this}. " +
"Sacrifice that token at the beginning of the next end step";
}
private FurnaceBlessedConquerorEffect(final FurnaceBlessedConquerorEffect effect) {
super(effect);
}
@Override
public FurnaceBlessedConquerorEffect copy() {
return new FurnaceBlessedConquerorEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Permanent permanent = source.getSourcePermanentIfItStillExists(game);
if (permanent == null) {
return false;
}
CreateTokenCopyTargetEffect effect = new CreateTokenCopyTargetEffect(
null, null, false, 1, true, true
);
effect.setSavedPermanent(permanent);
effect.apply(game, source);
effect.sacrificeTokensCreatedAtNextEndStep(game, source);
int counters = permanent.getCounters(game).getCount(CounterType.P1P1);
if (counters < 1) {
return true;
}
for (Permanent token : effect.getAddedPermanents()) {
token.addCounters(CounterType.P1P1.createInstance(counters), source, game);
}
return true;
}
}

View file

@ -1,47 +0,0 @@
package mage.cards.g;
import java.util.UUID;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.continuous.ControlEnchantedEffect;
import mage.abilities.keyword.EnchantAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
/**
*
* @author BetaSteward
*/
public final class GhastlyHaunting extends CardImpl {
public GhastlyHaunting(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"");
this.subtype.add(SubType.AURA);
this.color.setBlue(true);
// this card is the second face of double-faced card
this.nightCard = true;
// Enchant creature
TargetPermanent auraTarget = new TargetCreaturePermanent();
this.getSpellAbility().addTarget(auraTarget);
this.addAbility(new EnchantAbility(auraTarget));
// You control enchanted creature.
this.addAbility(new SimpleStaticAbility(new ControlEnchantedEffect()));
}
private GhastlyHaunting(final GhastlyHaunting card) {
super(card);
}
@Override
public GhastlyHaunting copy() {
return new GhastlyHaunting(this);
}
}

View file

@ -1,48 +0,0 @@
package mage.cards.h;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesWithLessPowerEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.game.permanent.token.EldraziHorrorToken;
/**
*
* @author LevelX2
*/
public final class HowlingChorus extends CardImpl {
public HowlingChorus(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"");
this.subtype.add(SubType.ELDRAZI);
this.subtype.add(SubType.WEREWOLF);
this.power = new MageInt(3);
this.toughness = new MageInt(5);
// this card is the second face of double-faced card
this.nightCard = true;
// Creatures with power less than Howling Chorus's power can't block it.
this.addAbility(new SimpleStaticAbility(new CantBeBlockedByCreaturesWithLessPowerEffect()));
// Whenever Howling Chorus deals combat damage to a player, create a 3/2 colorless Eldrazi Horror creature token.
this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new CreateTokenEffect(new EldraziHorrorToken()), false));
}
private HowlingChorus(final HowlingChorus card) {
super(card);
}
@Override
public HowlingChorus copy() {
return new HowlingChorus(this);
}
}

View file

@ -8,6 +8,7 @@ import mage.abilities.effects.Effect;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.counter.DistributeCountersEffect;
import mage.abilities.keyword.CraftAbility;
import mage.cards.Card;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
@ -66,9 +67,15 @@ enum JadeheartAttendantValue implements DynamicValue {
@Override
public int calculate(Game game, Ability sourceAbility, Effect effect) {
Card sourceCard = game.getCard(sourceAbility.getSourceId());
if (sourceCard == null) {
return 0;
}
ExileZone exileZone = game
.getExile()
.getExileZone(CardUtil.getExileZoneId(game, sourceAbility, -2));
.getExileZone(CardUtil.getExileZoneId(game,
sourceCard.getMainCard().getMainCard().getId(),
sourceCard.getMainCard().getZoneChangeCounter(game) - 1));
return exileZone != null
? exileZone
.getCards(game)

View file

@ -1,42 +0,0 @@
package mage.cards.m;
import mage.MageInt;
import mage.abilities.keyword.CrewAbility;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class MagickedCard extends CardImpl {
public MagickedCard(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "");
this.subtype.add(SubType.VEHICLE);
this.power = new MageInt(4);
this.toughness = new MageInt(4);
this.nightCard = true;
this.color.setBlue(true);
// Flying
this.addAbility(FlyingAbility.getInstance());
// Crew 1
this.addAbility(new CrewAbility(1));
}
private MagickedCard(final MagickedCard card) {
super(card);
}
@Override
public MagickedCard copy() {
return new MagickedCard(this);
}
}

View file

@ -1,88 +0,0 @@
package mage.cards.m;
import mage.MageInt;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.continuous.SetBasePowerSourceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.game.ExileZone;
import mage.game.Game;
import mage.util.CardUtil;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class MastercraftRaptor extends CardImpl {
public MastercraftRaptor(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "");
this.subtype.add(SubType.DINOSAUR);
this.power = new MageInt(0);
this.toughness = new MageInt(4);
this.nightCard = true;
this.color.setRed(true);
// Mastercraft Raptor's power is equal to the total power of the exiled cards used to craft it.
this.addAbility(new SimpleStaticAbility(
Zone.ALL, new SetBasePowerSourceEffect(MastercraftRaptorValue.instance)
.setText("{this}'s power is equal to the total power of the exiled cards used to craft it")
));
}
private MastercraftRaptor(final MastercraftRaptor card) {
super(card);
}
@Override
public MastercraftRaptor copy() {
return new MastercraftRaptor(this);
}
}
enum MastercraftRaptorValue implements DynamicValue {
instance;
@Override
public int calculate(Game game, Ability sourceAbility, Effect effect) {
ExileZone exileZone = game
.getExile()
.getExileZone(CardUtil.getExileZoneId(
game, sourceAbility.getSourceId(),
game.getState().getZoneChangeCounter(sourceAbility.getSourceId()) - 2
));
if (exileZone == null) {
return 0;
}
return exileZone
.getCards(game)
.stream()
.map(MageObject::getPower)
.mapToInt(MageInt::getValue)
.sum();
}
@Override
public MastercraftRaptorValue copy() {
return this;
}
@Override
public String getMessage() {
return "";
}
@Override
public String toString() {
return "1";
}
}

View file

@ -1,50 +0,0 @@
package mage.cards.m;
import mage.MageInt;
import mage.Mana;
import mage.abilities.common.WerewolfBackTriggeredAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.keyword.VigilanceAbility;
import mage.abilities.mana.SimpleManaAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
import java.util.UUID;
/**
* @author North
*/
public final class MoonscarredWerewolf extends CardImpl {
public MoonscarredWerewolf(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.WEREWOLF);
this.color.setGreen(true);
this.power = new MageInt(2);
this.toughness = new MageInt(2);
// this card is the second face of double-faced card
this.nightCard = true;
this.addAbility(VigilanceAbility.getInstance());
// {tap}: Add {G}{G}.
this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, Mana.GreenMana(2), new TapSourceCost()));
// At the beginning of each upkeep, if a player cast two or more spells last turn, transform Moonscarred Werewolf.
this.addAbility(new WerewolfBackTriggeredAbility());
}
private MoonscarredWerewolf(final MoonscarredWerewolf card) {
super(card);
}
@Override
public MoonscarredWerewolf copy() {
return new MoonscarredWerewolf(this);
}
}

View file

@ -1,38 +0,0 @@
package mage.cards.o;
import mage.MageInt;
import mage.abilities.common.WerewolfBackTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import java.util.UUID;
/**
* @author LevelX2
*/
public final class OneOfThePack extends CardImpl {
public OneOfThePack(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.WEREWOLF);
this.power = new MageInt(5);
this.toughness = new MageInt(6);
this.color.setGreen(true);
this.nightCard = true;
// At the beginning of each upkeep, if a player cast two or more spells last turn, transform One of the Pack.
this.addAbility(new WerewolfBackTriggeredAbility());
}
private OneOfThePack(final OneOfThePack card) {
super(card);
}
@Override
public OneOfThePack copy() {
return new OneOfThePack(this);
}
}

View file

@ -1,17 +1,19 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.common.WerewolfBackTriggeredAbility;
import mage.abilities.common.WerewolfFrontTriggeredAbility;
import mage.abilities.condition.common.NotTransformedCondition;
import mage.abilities.decorator.ConditionalContinuousEffect;
import mage.abilities.dynamicvalue.common.CardsInAllHandsCount;
import mage.abilities.dynamicvalue.common.CardsInControllerHandCount;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.continuous.SetBasePowerToughnessSourceEffect;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.abilities.keyword.TrampleAbility;
import mage.abilities.keyword.VigilanceAbility;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
@ -21,20 +23,20 @@ import java.util.UUID;
/**
* @author fireshoes
*/
public final class SageOfAncientLore extends CardImpl {
public final class SageOfAncientLore extends TransformingDoubleFacedCard {
public SageOfAncientLore(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.SHAMAN);
this.subtype.add(SubType.WEREWOLF);
this.power = new MageInt(0);
this.toughness = new MageInt(0);
super(ownerId, setInfo,
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.SHAMAN, SubType.WEREWOLF}, "{4}{G}",
"Werewolf of Ancient Hunger",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "G"
);
this.secondSideCardClazz = mage.cards.w.WerewolfOfAncientHunger.class;
// Sage of Ancient Lore
this.getLeftHalfCard().setPT(0, 0);
// Sage of Ancient Lore's power and toughness are each equal to the number of cards in your hand.
this.addAbility(new SimpleStaticAbility(
this.getLeftHalfCard().addAbility(new SimpleStaticAbility(
Zone.ALL,
new ConditionalContinuousEffect(
new SetBasePowerToughnessSourceEffect(CardsInControllerHandCount.ANY), NotTransformedCondition.instance,
@ -43,11 +45,31 @@ public final class SageOfAncientLore extends CardImpl {
));
// When Sage of Ancient Lore enters the battlefield, draw a card.
this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1), false));
this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1), false));
// At the beginning of each upkeep, if no spells were cast last turn, transform Sage of Ancient Lore.
this.addAbility(new TransformAbility());
this.addAbility(new WerewolfFrontTriggeredAbility());
this.getLeftHalfCard().addAbility(new WerewolfFrontTriggeredAbility());
// Werewolf of Ancient Hunger
this.getRightHalfCard().setPT(0, 0);
// Vigilance
this.getRightHalfCard().addAbility(VigilanceAbility.getInstance());
// Trample
this.getRightHalfCard().addAbility(TrampleAbility.getInstance());
// Werewolf of Ancient Hunger's power and toughness are each equal to the total number of cards in all players' hands.
this.getRightHalfCard().addAbility(new SimpleStaticAbility(
Zone.ALL,
new ConditionalContinuousEffect(
new SetBasePowerToughnessSourceEffect(CardsInAllHandsCount.instance), NotTransformedCondition.instance,
"{this}'s power and toughness are each equal to the total number of cards in all players' hands"
)
));
// At the beginning of each upkeep, if a player cast two or more spells last turn, transform Werewolf of Ancient Hunger.
this.getRightHalfCard().addAbility(new WerewolfBackTriggeredAbility());
}
private SageOfAncientLore(final SageOfAncientLore card) {

View file

@ -1,36 +1,60 @@
package mage.cards.s;
import mage.MageInt;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.DiscardCardCost;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.continuous.SetBasePowerSourceEffect;
import mage.abilities.keyword.CraftAbility;
import mage.cards.CardImpl;
import mage.cards.Card;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.game.ExileZone;
import mage.game.Game;
import mage.util.CardUtil;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class SaheelisLattice extends CardImpl {
public final class SaheelisLattice extends TransformingDoubleFacedCard {
public SaheelisLattice(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}{R}");
this.secondSideCardClazz = mage.cards.m.MastercraftRaptor.class;
super(ownerId, setInfo,
new CardType[]{CardType.ARTIFACT}, new SubType[]{}, "{1}{R}",
"Mastercraft Raptor",
new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, new SubType[]{SubType.DINOSAUR}, "R"
);
// When Saheeli's Lattice enters the battlefield, you may discard a card. If you do, draw two cards.
this.addAbility(new EntersBattlefieldTriggeredAbility(
this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(
new DoIfCostPaid(new DrawCardSourceControllerEffect(2), new DiscardCardCost())
));
// Craft with one or more Dinosaurs {4}{R}
this.addAbility(new CraftAbility(
this.getLeftHalfCard().addAbility(new CraftAbility(
"{4}{R}", "one or more Dinosaurs", "other Dinosaurs you control " +
"or Dinosaur cards in your graveyard", 1, Integer.MAX_VALUE, SubType.DINOSAUR.getPredicate()
));
// Mastercraft Raptor
this.getRightHalfCard().setPT(0, 4);
// Mastercraft Raptor's power is equal to the total power of the exiled cards used to craft it.
this.getRightHalfCard().addAbility(new SimpleStaticAbility(
Zone.ALL, new SetBasePowerSourceEffect(MastercraftRaptorValue.instance)
.setText("{this}'s power is equal to the total power of the exiled cards used to craft it")
));
}
private SaheelisLattice(final SaheelisLattice card) {
@ -42,3 +66,45 @@ public final class SaheelisLattice extends CardImpl {
return new SaheelisLattice(this);
}
}
enum MastercraftRaptorValue implements DynamicValue {
instance;
@Override
public int calculate(Game game, Ability sourceAbility, Effect effect) {
Card sourceCard = game.getCard(sourceAbility.getSourceId());
if (sourceCard == null) {
return 0;
}
ExileZone exileZone = game
.getExile()
.getExileZone(CardUtil.getExileZoneId(
game, sourceCard.getMainCard().getId(),
sourceCard.getMainCard().getZoneChangeCounter(game) - 1
));
if (exileZone == null) {
return 0;
}
return exileZone
.getCards(game)
.stream()
.map(MageObject::getPower)
.mapToInt(MageInt::getValue)
.sum();
}
@Override
public MastercraftRaptorValue copy() {
return this;
}
@Override
public String getMessage() {
return "";
}
@Override
public String toString() {
return "1";
}
}

View file

@ -1,37 +1,52 @@
package mage.cards.s;
import mage.MageInt;
import mage.Mana;
import mage.abilities.common.WerewolfBackTriggeredAbility;
import mage.abilities.common.WerewolfFrontTriggeredAbility;
import mage.abilities.keyword.TransformAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.keyword.VigilanceAbility;
import mage.abilities.mana.GreenManaAbility;
import mage.cards.CardImpl;
import mage.abilities.mana.SimpleManaAbility;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
import java.util.UUID;
/**
* @author North
*/
public final class ScornedVillager extends CardImpl {
public final class ScornedVillager extends TransformingDoubleFacedCard {
public ScornedVillager(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.WEREWOLF);
super(ownerId, setInfo,
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WEREWOLF}, "{1}{G}",
"Moonscarred Werewolf",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "G"
);
this.power = new MageInt(1);
this.toughness = new MageInt(1);
this.secondSideCardClazz = mage.cards.m.MoonscarredWerewolf.class;
// Scorned Villager
this.getLeftHalfCard().setPT(1, 1);
// {tap}: Add {G}.
this.addAbility(new GreenManaAbility());
this.getLeftHalfCard().addAbility(new GreenManaAbility());
// At the beginning of each upkeep, if no spells were cast last turn, transform Scorned Villager.
this.addAbility(new TransformAbility());
this.addAbility(new WerewolfFrontTriggeredAbility());
this.getLeftHalfCard().addAbility(new WerewolfFrontTriggeredAbility());
// Moonscarred Werewolf
this.getRightHalfCard().setPT(2, 2);
// Vigilance
this.getRightHalfCard().addAbility(VigilanceAbility.getInstance());
// {tap}: Add {G}{G}.
this.getRightHalfCard().addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, Mana.GreenMana(2), new TapSourceCost()));
// At the beginning of each upkeep, if a player cast two or more spells last turn, transform Moonscarred Werewolf.
this.getRightHalfCard().addAbility(new WerewolfBackTriggeredAbility());
}
private ScornedVillager(final ScornedVillager card) {

View file

@ -1,14 +1,13 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.Ability;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
@ -17,25 +16,32 @@ import java.util.UUID;
/**
* @author nantuko
*/
public final class ScreechingBat extends CardImpl {
public final class ScreechingBat extends TransformingDoubleFacedCard {
public ScreechingBat(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}");
this.subtype.add(SubType.BAT);
super(ownerId, setInfo,
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.BAT}, "{2}{B}",
"Stalking Vampire",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.VAMPIRE}, "B"
);
this.secondSideCardClazz = mage.cards.s.StalkingVampire.class;
// Screeching Bat
this.getLeftHalfCard().setPT(2, 2);
this.power = new MageInt(2);
this.toughness = new MageInt(2);
this.addAbility(FlyingAbility.getInstance());
this.getLeftHalfCard().addAbility(FlyingAbility.getInstance());
// At the beginning of your upkeep, you may pay {2}{B}{B}. If you do, transform Screeching Bat.
this.addAbility(new TransformAbility());
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new DoIfCostPaid(
Ability transformAbility = new BeginningOfUpkeepTriggeredAbility(new DoIfCostPaid(
new TransformSourceEffect(),
new ManaCostsImpl<>("{2}{B}{B}")
)));
));
this.getLeftHalfCard().addAbility(transformAbility);
// Stalking Vampire
this.getRightHalfCard().setPT(5, 5);
// At the beginning of your upkeep, you may pay {2}{B}{B}. If you do, transform Screeching Bat.
this.getRightHalfCard().addAbility(transformAbility.copy());
}
private ScreechingBat(final ScreechingBat card) {

View file

@ -1,49 +0,0 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.keyword.CantBeBlockedSourceAbility;
import mage.abilities.keyword.NightboundAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class SeafaringWerewolf extends CardImpl {
public SeafaringWerewolf(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.WEREWOLF);
this.power = new MageInt(2);
this.toughness = new MageInt(1);
this.color.setGreen(true);
this.nightCard = true;
// Seafaring Werewolf can't be blocked.
this.addAbility(new CantBeBlockedSourceAbility());
// Whenever Seafaring Werewolf deals combat damage to a player, draw a card.
this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(
new DrawCardSourceControllerEffect(1), false
));
// Nightbound
this.addAbility(new NightboundAbility());
}
private SeafaringWerewolf(final SeafaringWerewolf card) {
super(card);
}
@Override
public SeafaringWerewolf copy() {
return new SeafaringWerewolf(this);
}
}

View file

@ -1,15 +1,19 @@
package mage.cards.s;
import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
import mage.abilities.effects.keyword.SurveilEffect;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.abilities.mana.BlueManaAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SuperType;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.filter.FilterCard;
import mage.filter.predicate.Predicates;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
@ -19,22 +23,41 @@ import java.util.UUID;
/**
* @author LevelX2
*/
public final class SearchForAzcanta extends CardImpl {
public final class SearchForAzcanta extends TransformingDoubleFacedCard {
private static final FilterCard filter = new FilterCard("a noncreature, nonland card");
static {
filter.add(Predicates.not(CardType.CREATURE.getPredicate()));
filter.add(Predicates.not(CardType.LAND.getPredicate()));
}
public SearchForAzcanta(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}");
this.secondSideCardClazz = mage.cards.a.AzcantaTheSunkenRuin.class;
this.supertype.add(SuperType.LEGENDARY);
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ENCHANTMENT}, new SubType[]{}, "{1}{U}",
"Azcanta, The Sunken Ruin",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.LAND}, new SubType[]{}, "U"
);
// Search for Azcanta
// At the beginning of your upkeep, look at the top card of your library. You may put it into your graveyard. Then if you have seven or more cards in your graveyard, you may transform Search for Azcanta.
Ability ability = new BeginningOfUpkeepTriggeredAbility(
new SurveilEffect(1, false)
);
ability.addEffect(new SearchForAzcantaEffect());
this.addAbility(new TransformAbility());
this.addAbility(ability);
this.getLeftHalfCard().addAbility(ability);
// Azcanta, The Sunken Ruin
// {T} : Add {U}.
this.getRightHalfCard().addAbility(new BlueManaAbility());
// {2}{U} , {T} : Look at the top four cards of your library. You may reveal a noncreature, nonland card from among them and put it into your hand. Put the rest on the bottom of your library in any order.
Ability ability2 = new SimpleActivatedAbility(
new LookLibraryAndPickControllerEffect(4, 1, filter, PutCards.HAND, PutCards.BOTTOM_ANY),
new ManaCostsImpl<>("{2}{U}")
);
ability2.addCost(new TapSourceCost());
this.getRightHalfCard().addAbility(ability2);
}
private SearchForAzcanta(final SearchForAzcanta card) {

View file

@ -1,47 +1,53 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.common.DiesCreatureTriggeredAbility;
import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.ReplacementEffectImpl;
import mage.abilities.effects.common.*;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.command.emblems.SephirothOneWingedAngelEmblem;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.common.TargetOpponent;
import mage.target.common.TargetSacrifice;
import mage.watchers.common.AbilityResolvedWatcher;
import java.util.Optional;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class SephirothFabledSOLDIER extends CardImpl {
public final class SephirothFabledSOLDIER extends TransformingDoubleFacedCard {
public SephirothFabledSOLDIER(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}");
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.AVATAR, SubType.SOLDIER}, "{2}{B}",
"Sephiroth, One-Winged Angel",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.ANGEL, SubType.NIGHTMARE, SubType.AVATAR}, "B"
);
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.AVATAR);
this.subtype.add(SubType.SOLDIER);
this.power = new MageInt(3);
this.toughness = new MageInt(3);
this.secondSideCardClazz = mage.cards.s.SephirothOneWingedAngel.class;
// Sephiroth, Fabled SOLDIER
this.getLeftHalfCard().setPT(3, 3);
// Whenever Sephiroth enters or attacks, you may sacrifice another creature. If you do, draw a card.
this.addAbility(new EntersBattlefieldOrAttacksSourceTriggeredAbility(new DoIfCostPaid(
this.getLeftHalfCard().addAbility(new EntersBattlefieldOrAttacksSourceTriggeredAbility(new DoIfCostPaid(
new DrawCardSourceControllerEffect(1),
new SacrificeTargetCost(StaticFilters.FILTER_ANOTHER_CREATURE)
)));
// Whenever another creature dies, target opponent loses 1 life and you gain 1 life. If this is the fourth time this ability has resolved this turn, transform Sephiroth.
this.addAbility(new TransformAbility());
Ability ability = new DiesCreatureTriggeredAbility(
new LoseLifeTargetEffect(1), false,
StaticFilters.FILTER_ANOTHER_CREATURE
@ -49,7 +55,21 @@ public final class SephirothFabledSOLDIER extends CardImpl {
ability.addEffect(new GainLifeEffect(1).concatBy("and"));
ability.addEffect(new IfAbilityHasResolvedXTimesEffect(4, new TransformSourceEffect()));
ability.addTarget(new TargetOpponent());
this.addAbility(ability, new AbilityResolvedWatcher());
ability.addWatcher(new AbilityResolvedWatcher());
this.getLeftHalfCard().addAbility(ability);
// Sephiroth, One-Winged Angel
this.getRightHalfCard().setPT(5, 5);
// Flying
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
// Super Nova -- As this creature transforms into Sephiroth, One-Winged Angel, you get an emblem with "Whenever a creature dies, target opponent loses 1 life and you gain 1 life."
this.getRightHalfCard().addAbility(new SimpleStaticAbility(new SephirothOneWingedAngelEmblemEffect()).withFlavorWord("Super Nova"));
// Whenever Sephiroth attacks, you may sacrifice any number of other creatures. If you do, draw that many cards.
this.getRightHalfCard().addAbility(new AttacksTriggeredAbility(new SephirothOneWingedAngelSacrificeEffect()));
}
private SephirothFabledSOLDIER(final SephirothFabledSOLDIER card) {
@ -61,3 +81,80 @@ public final class SephirothFabledSOLDIER extends CardImpl {
return new SephirothFabledSOLDIER(this);
}
}
class SephirothOneWingedAngelEmblemEffect extends ReplacementEffectImpl {
SephirothOneWingedAngelEmblemEffect() {
super(Duration.WhileOnBattlefield, Outcome.Benefit);
staticText = "as this creature transforms into {this}, " +
"you get an emblem with \"Whenever a creature dies, target opponent loses 1 life and you gain 1 life.\"";
}
private SephirothOneWingedAngelEmblemEffect(final SephirothOneWingedAngelEmblemEffect effect) {
super(effect);
}
@Override
public SephirothOneWingedAngelEmblemEffect copy() {
return new SephirothOneWingedAngelEmblemEffect(this);
}
@Override
public boolean replaceEvent(GameEvent event, Ability source, Game game) {
Optional.ofNullable(source.getSourceObject(game))
.ifPresent(obj -> game.addEmblem(new SephirothOneWingedAngelEmblem(), obj, source));
return false;
}
@Override
public boolean checksEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.TRANSFORMING;
}
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
return source.getSourceId().equals(event.getTargetId())
&& source.getSourcePermanentIfItStillExists(game) != null;
}
}
class SephirothOneWingedAngelSacrificeEffect extends OneShotEffect {
SephirothOneWingedAngelSacrificeEffect() {
super(Outcome.Benefit);
staticText = "you may sacrifice any number of other creatures. If you do, draw that many cards";
}
private SephirothOneWingedAngelSacrificeEffect(final SephirothOneWingedAngelSacrificeEffect effect) {
super(effect);
}
@Override
public SephirothOneWingedAngelSacrificeEffect copy() {
return new SephirothOneWingedAngelSacrificeEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
if (player == null) {
return false;
}
TargetSacrifice target = new TargetSacrifice(
0, Integer.MAX_VALUE, StaticFilters.FILTER_ANOTHER_CREATURE
);
player.choose(outcome, target, source, game);
int count = 0;
for (UUID targetId : target.getTargets()) {
Permanent permanent = game.getPermanent(targetId);
if (permanent != null && permanent.sacrifice(source, game)) {
count++;
}
}
if (count < 1) {
return false;
}
player.drawCards(count, source, game);
return true;
}
}

View file

@ -1,136 +0,0 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.ReplacementEffectImpl;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.command.emblems.SephirothOneWingedAngelEmblem;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.common.TargetSacrifice;
import java.util.Optional;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class SephirothOneWingedAngel extends CardImpl {
public SephirothOneWingedAngel(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.ANGEL);
this.subtype.add(SubType.NIGHTMARE);
this.subtype.add(SubType.AVATAR);
this.power = new MageInt(5);
this.toughness = new MageInt(5);
this.nightCard = true;
this.color.setBlack(true);
// Flying
this.addAbility(FlyingAbility.getInstance());
// Super Nova -- As this creature transforms into Sephiroth, One-Winged Angel, you get an emblem with "Whenever a creature dies, target opponent loses 1 life and you gain 1 life."
this.addAbility(new SimpleStaticAbility(new SephirothOneWingedAngelEmblemEffect()).withFlavorWord("Super Nova"));
// Whenever Sephiroth attacks, you may sacrifice any number of other creatures. If you do, draw that many cards.
this.addAbility(new AttacksTriggeredAbility(new SephirothOneWingedAngelSacrificeEffect()));
}
private SephirothOneWingedAngel(final SephirothOneWingedAngel card) {
super(card);
}
@Override
public SephirothOneWingedAngel copy() {
return new SephirothOneWingedAngel(this);
}
}
class SephirothOneWingedAngelEmblemEffect extends ReplacementEffectImpl {
SephirothOneWingedAngelEmblemEffect() {
super(Duration.WhileOnBattlefield, Outcome.Benefit);
staticText = "as this creature transforms into {this}, " +
"you get an emblem with \"Whenever a creature dies, target opponent loses 1 life and you gain 1 life.\"";
}
private SephirothOneWingedAngelEmblemEffect(final SephirothOneWingedAngelEmblemEffect effect) {
super(effect);
}
@Override
public SephirothOneWingedAngelEmblemEffect copy() {
return new SephirothOneWingedAngelEmblemEffect(this);
}
@Override
public boolean replaceEvent(GameEvent event, Ability source, Game game) {
Optional.ofNullable(source.getSourceObject(game))
.ifPresent(obj -> game.addEmblem(new SephirothOneWingedAngelEmblem(), obj, source));
return false;
}
@Override
public boolean checksEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.TRANSFORMING;
}
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
return source.getSourceId().equals(event.getTargetId())
&& source.getSourcePermanentIfItStillExists(game) != null;
}
}
class SephirothOneWingedAngelSacrificeEffect extends OneShotEffect {
SephirothOneWingedAngelSacrificeEffect() {
super(Outcome.Benefit);
staticText = "you may sacrifice any number of other creatures. If you do, draw that many cards";
}
private SephirothOneWingedAngelSacrificeEffect(final SephirothOneWingedAngelSacrificeEffect effect) {
super(effect);
}
@Override
public SephirothOneWingedAngelSacrificeEffect copy() {
return new SephirothOneWingedAngelSacrificeEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
if (player == null) {
return false;
}
TargetSacrifice target = new TargetSacrifice(
0, Integer.MAX_VALUE, StaticFilters.FILTER_ANOTHER_CREATURE
);
player.choose(outcome, target, source, game);
int count = 0;
for (UUID targetId : target.getTargets()) {
Permanent permanent = game.getPermanent(targetId);
if (permanent != null && permanent.sacrifice(source, game)) {
count++;
}
}
if (count < 1) {
return false;
}
player.drawCards(count, source, game);
return true;
}
}

View file

@ -1,26 +1,23 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.abilities.effects.common.cost.SpellsCostReductionControllerEffect;
import mage.abilities.hint.Hint;
import mage.abilities.hint.ValueConditionHint;
import mage.abilities.keyword.TransformAbility;
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.constants.WatcherScope;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.filter.FilterCard;
import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.common.FilterCreatureCard;
import mage.filter.predicate.ObjectSourcePlayer;
@ -38,7 +35,7 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class SerahFarron extends CardImpl {
public final class SerahFarron extends TransformingDoubleFacedCard {
private static final FilterCard filter
= new FilterCreatureCard("the first legendary creature spell you cast each turn");
@ -59,23 +56,32 @@ public final class SerahFarron extends CardImpl {
);
public SerahFarron(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}{W}");
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.CITIZEN}, "{1}{G}{W}",
"Crystallized Serah",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ARTIFACT}, new SubType[]{}, "WG");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.CITIZEN);
this.power = new MageInt(2);
this.toughness = new MageInt(2);
this.secondSideCardClazz = mage.cards.c.CrystallizedSerah.class;
// Serah Farron
this.getLeftHalfCard().setPT(2, 2);
// The first legendary creature spell you cast each turn costs {2} less to cast.
this.addAbility(makeAbility(), new SerahFarronWatcher());
Ability ability = new SimpleStaticAbility(new SpellsCostReductionControllerEffect(filter, 2));
ability.addWatcher(new SerahFarronWatcher());
this.getLeftHalfCard().addAbility(ability);
// At the beginning of combat on your turn, if you control two or more other legendary creatures, you may transform Serah Farron.
this.addAbility(new TransformAbility());
this.addAbility(new BeginningOfCombatTriggeredAbility(
this.getLeftHalfCard().addAbility(new BeginningOfCombatTriggeredAbility(
new TransformSourceEffect(), true
).withInterveningIf(condition).addHint(hint));
// Crystallized Serah
// The first legendary creature spell you cast each turn costs {2} less to cast.
this.getRightHalfCard().addAbility(ability.copy());
// Legendary creatures you control get +2/+2.
this.getRightHalfCard().addAbility(new SimpleStaticAbility(new BoostControlledEffect(
2, 2, Duration.WhileOnBattlefield, StaticFilters.FILTER_CREATURES_LEGENDARY
)));
}
private SerahFarron(final SerahFarron card) {
@ -86,11 +92,6 @@ public final class SerahFarron extends CardImpl {
public SerahFarron copy() {
return new SerahFarron(this);
}
public static Ability makeAbility() {
return new SimpleStaticAbility(new SpellsCostReductionControllerEffect(filter, 2));
}
}
enum SerahFarronPredicate implements ObjectSourcePlayerPredicate<Card> {

View file

@ -1,38 +1,54 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.TransformAbility;
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.filter.StaticFilters;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class SeraphOfNewCapenna extends CardImpl {
public final class SeraphOfNewCapenna extends TransformingDoubleFacedCard {
public SeraphOfNewCapenna(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}");
super(ownerId, setInfo,
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.ANGEL, SubType.SOLDIER}, "{2}{W}",
"Seraph of New Phyrexia",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.PHYREXIAN, SubType.ANGEL}, "WB"
);
this.subtype.add(SubType.ANGEL);
this.subtype.add(SubType.SOLDIER);
this.power = new MageInt(2);
this.toughness = new MageInt(2);
this.secondSideCardClazz = mage.cards.s.SeraphOfNewPhyrexia.class;
// Seraph of New Capenna
this.getLeftHalfCard().setPT(2, 2);
// Flying
this.addAbility(FlyingAbility.getInstance());
this.getLeftHalfCard().addAbility(FlyingAbility.getInstance());
// {4}{B/P}: Transform Seraph of New Capenna. Activate only as a sorcery.
this.addAbility(new TransformAbility());
this.addAbility(new ActivateAsSorceryActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{4}{B/P}")));
this.getLeftHalfCard().addAbility(new ActivateAsSorceryActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{4}{B/P}")));
// Seraph of New Phyrexia
this.getRightHalfCard().setPT(3, 3);
// Flying
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
// Whenever Seraph of New Phyrexia attacks, you may sacrifice another creature or artifact. If you do, Seraph of New Phyrexia gets +2/+1 until end of turn.
this.getRightHalfCard().addAbility(new AttacksTriggeredAbility(new DoIfCostPaid(
new BoostSourceEffect(2, 1, Duration.EndOfTurn),
new SacrificeTargetCost(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE_OR_ARTIFACT)
)));
}
private SeraphOfNewCapenna(final SeraphOfNewCapenna card) {

View file

@ -1,52 +0,0 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.StaticFilters;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class SeraphOfNewPhyrexia extends CardImpl {
public SeraphOfNewPhyrexia(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.PHYREXIAN);
this.subtype.add(SubType.ANGEL);
this.power = new MageInt(3);
this.toughness = new MageInt(3);
this.color.setWhite(true);
this.color.setBlack(true);
this.nightCard = true;
// Flying
this.addAbility(FlyingAbility.getInstance());
// Whenever Seraph of New Phyrexia attacks, you may sacrifice another creature or artifact. If you do, Seraph of New Phyrexia gets +2/+1 until end of turn.
this.addAbility(new AttacksTriggeredAbility(new DoIfCostPaid(
new BoostSourceEffect(2, 1, Duration.EndOfTurn),
new SacrificeTargetCost(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE_OR_ARTIFACT)
)));
}
private SeraphOfNewPhyrexia(final SeraphOfNewPhyrexia card) {
super(card);
}
@Override
public SeraphOfNewPhyrexia copy() {
return new SeraphOfNewPhyrexia(this);
}
}

View file

@ -1,10 +1,10 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.keyword.DayboundAbility;
import mage.abilities.keyword.MenaceAbility;
import mage.cards.CardImpl;
import mage.abilities.keyword.NightboundAbility;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
@ -13,22 +13,32 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class ShadyTraveler extends CardImpl {
public final class ShadyTraveler extends TransformingDoubleFacedCard {
public ShadyTraveler(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}");
super(ownerId, setInfo,
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WEREWOLF}, "{2}{B}",
"Stalking Predator",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "B"
);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.WEREWOLF);
this.power = new MageInt(2);
this.toughness = new MageInt(3);
this.secondSideCardClazz = mage.cards.s.StalkingPredator.class;
// Shady Traveler
this.getLeftHalfCard().setPT(2, 3);
// Menace
this.addAbility(new MenaceAbility());
this.getLeftHalfCard().addAbility(new MenaceAbility());
// Daybound
this.addAbility(new DayboundAbility());
this.getLeftHalfCard().addAbility(new DayboundAbility());
// Stalking Predator
this.getRightHalfCard().setPT(4, 4);
// Menace
this.getRightHalfCard().addAbility(new MenaceAbility());
// Nightbound
this.getRightHalfCard().addAbility(new NightboundAbility());
}
private ShadyTraveler(final ShadyTraveler card) {

View file

@ -1,27 +1,40 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.ActivateIfConditionActivatedAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SagaAbility;
import mage.abilities.condition.common.CardsInOpponentGraveyardCondition;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.common.ActivateIfConditionActivatedAbility;
import mage.abilities.effects.common.ExileAndReturnSourceEffect;
import mage.abilities.effects.common.SacrificeOpponentsEffect;
import mage.abilities.dynamicvalue.common.StaticValue;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.*;
import mage.abilities.effects.common.discard.DiscardEachPlayerEffect;
import mage.abilities.keyword.MenaceAbility;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.Cards;
import mage.cards.CardsImpl;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
import mage.filter.common.FilterCreatureOrPlaneswalkerPermanent;
import mage.filter.predicate.permanent.TokenPredicate;
import mage.game.Game;
import mage.players.Player;
import mage.target.common.TargetCreatureOrPlaneswalker;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer;
import java.util.Collection;
import java.util.Objects;
import java.util.UUID;
import java.util.stream.Collectors;
/**
* @author TheElk801
*/
public final class Sheoldred extends CardImpl {
public final class Sheoldred extends TransformingDoubleFacedCard {
private static final FilterPermanent filter
= new FilterCreatureOrPlaneswalkerPermanent("nontoken creature or planeswalker");
@ -31,27 +44,56 @@ public final class Sheoldred extends CardImpl {
}
public Sheoldred(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}{B}");
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.PHYREXIAN, SubType.PRAETOR}, "{3}{B}{B}",
"The True Scriptures",
new SuperType[]{}, new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.SAGA}, "B"
);
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.PHYREXIAN);
this.subtype.add(SubType.PRAETOR);
this.power = new MageInt(4);
this.toughness = new MageInt(5);
this.secondSideCardClazz = mage.cards.t.TheTrueScriptures.class;
// Sheoldred
this.getLeftHalfCard().setPT(4, 5);
// Menace
this.addAbility(new MenaceAbility(false));
this.getLeftHalfCard().addAbility(new MenaceAbility(false));
// When Sheoldred enters the battlefield, each opponent sacrifices a nontoken creature or planeswalker.
this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeOpponentsEffect(filter)));
this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeOpponentsEffect(filter)));
// {4}{B}: Exile Sheoldred, then return it to the battlefield transformed under its owner's control. Activate only as a sorcery and only if an opponent has eight or more cards in their graveyard.
this.addAbility(new TransformAbility());
this.addAbility(new ActivateIfConditionActivatedAbility(
this.getLeftHalfCard().addAbility(new ActivateIfConditionActivatedAbility(
new ExileAndReturnSourceEffect(PutCards.BATTLEFIELD_TRANSFORMED),
new ManaCostsImpl<>("{4}{B}"), CardsInOpponentGraveyardCondition.EIGHT
).setTiming(TimingRule.SORCERY).addHint(CardsInOpponentGraveyardCondition.EIGHT.getHint()));
// The True Scriptures
// (As this Saga enters and after your draw step, add a lore counter.)
SagaAbility sagaAbility = new SagaAbility(this.getRightHalfCard());
// I -- For each opponent, destroy up to one target creature or planeswalker that player controls.
sagaAbility.addChapterEffect(
this.getRightHalfCard(), SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_I, false,
ability -> {
ability.addEffect(new DestroyTargetEffect().setTargetPointer(new EachTargetPointer())
.setText("for each opponent, destroy up to one target creature or planeswalker that player controls"));
ability.addTarget(new TargetCreatureOrPlaneswalker(0, 1));
ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
}
);
// II -- Each opponent discards three cards, then mills three cards.
sagaAbility.addChapterEffect(
this.getRightHalfCard(), SagaChapter.CHAPTER_II,
new DiscardEachPlayerEffect(StaticValue.get(3), false, TargetController.OPPONENT),
new MillCardsEachPlayerEffect(3, TargetController.OPPONENT).setText(", then mills three cards")
);
// III -- Put all creature cards from all graveyards onto the battlefield under your control. Exile The True Scriptures, then return it to the battlefield.
sagaAbility.addChapterEffect(
this.getRightHalfCard(), SagaChapter.CHAPTER_III,
new SheoldredTrueScripturesEffect(),
new ExileSourceAndReturnFaceUpEffect()
);
this.getRightHalfCard().addAbility(sagaAbility);
}
private Sheoldred(final Sheoldred card) {
@ -63,3 +105,39 @@ public final class Sheoldred extends CardImpl {
return new Sheoldred(this);
}
}
class SheoldredTrueScripturesEffect extends OneShotEffect {
SheoldredTrueScripturesEffect() {
super(Outcome.Benefit);
staticText = "put all creature cards from all graveyards onto the battlefield under your control";
}
private SheoldredTrueScripturesEffect(final SheoldredTrueScripturesEffect effect) {
super(effect);
}
@Override
public SheoldredTrueScripturesEffect copy() {
return new SheoldredTrueScripturesEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
if (player == null) {
return false;
}
Cards cards = new CardsImpl(game
.getState()
.getPlayersInRange(source.getControllerId(), game)
.stream()
.map(game::getPlayer)
.filter(Objects::nonNull)
.map(Player::getGraveyard)
.map(gy -> gy.getCards(StaticFilters.FILTER_CARD_CREATURE, game))
.flatMap(Collection::stream)
.collect(Collectors.toList()));
return player.moveCards(cards, Zone.BATTLEFIELD, source, game);
}
}

View file

@ -1,42 +1,49 @@
package mage.cards.s;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesWithLessPowerEffect;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.game.permanent.token.EldraziHorrorToken;
import java.util.UUID;
/**
* @author LevelX2
*/
public final class ShrillHowler extends CardImpl {
public final class ShrillHowler extends TransformingDoubleFacedCard {
public ShrillHowler(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}");
this.subtype.add(SubType.WEREWOLF);
this.subtype.add(SubType.HORROR);
this.power = new MageInt(3);
this.toughness = new MageInt(1);
super(ownerId, setInfo,
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF, SubType.HORROR}, "{2}{G}",
"Howling Chorus",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.ELDRAZI, SubType.WEREWOLF}, ""
);
this.secondSideCardClazz = mage.cards.h.HowlingChorus.class;
// Shrill Howler
this.getLeftHalfCard().setPT(3, 1);
// Creatures with power less than Shrill Howler's power can't block it.
this.addAbility(new SimpleStaticAbility(new CantBeBlockedByCreaturesWithLessPowerEffect()));
this.getLeftHalfCard().addAbility(new SimpleStaticAbility(new CantBeBlockedByCreaturesWithLessPowerEffect()));
// {5}{G}: Transform Shrill Howler.
this.addAbility(new TransformAbility());
this.addAbility(new SimpleActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{5}{G}")));
this.getLeftHalfCard().addAbility(new SimpleActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{5}{G}")));
// Howling Chorus
this.getRightHalfCard().setPT(3, 5);
// Creatures with power less than Howling Chorus's power can't block it.
this.getRightHalfCard().addAbility(new SimpleStaticAbility(new CantBeBlockedByCreaturesWithLessPowerEffect()));
// Whenever Howling Chorus deals combat damage to a player, create a 3/2 colorless Eldrazi Horror creature token.
this.getRightHalfCard().addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new CreateTokenEffect(new EldraziHorrorToken()), false));
}
private ShrillHowler(final ShrillHowler card) {

View file

@ -5,32 +5,45 @@ import mage.abilities.condition.Condition;
import mage.abilities.condition.common.CardsInControllerGraveyardCondition;
import mage.abilities.effects.common.DrawDiscardControllerEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.keyword.TransformAbility;
import mage.abilities.keyword.CrewAbility;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class SidequestCardCollection extends CardImpl {
public final class SidequestCardCollection extends TransformingDoubleFacedCard {
private static final Condition condition = new CardsInControllerGraveyardCondition(8);
public SidequestCardCollection(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{U}");
this.secondSideCardClazz = mage.cards.m.MagickedCard.class;
super(ownerId, setInfo,
new CardType[]{CardType.ENCHANTMENT}, new SubType[]{}, "{3}{U}",
"Magicked Card",
new CardType[]{CardType.ARTIFACT}, new SubType[]{SubType.VEHICLE}, "U"
);
// Sidequest: Card Collection
// When this enchantment enters, draw three cards, then discard two cards.
this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawDiscardControllerEffect(3, 2)));
this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new DrawDiscardControllerEffect(3, 2)));
// At the beginning of your end step, if eight or more cards are in your graveyard, transform this enchantment.
this.addAbility(new TransformAbility());
this.addAbility(new BeginningOfEndStepTriggeredAbility(new TransformSourceEffect()).withInterveningIf(condition));
this.getLeftHalfCard().addAbility(new BeginningOfEndStepTriggeredAbility(new TransformSourceEffect()).withInterveningIf(condition));
// Magicked Card
this.getRightHalfCard().setPT(4, 4);
// Flying
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
// Crew 1
this.getRightHalfCard().addAbility(new CrewAbility(1));
}
private SidequestCardCollection(final SidequestCardCollection card) {

View file

@ -1,36 +1,58 @@
package mage.cards.s;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.keyword.TransformAbility;
import mage.abilities.effects.common.counter.AddCountersAllEffect;
import mage.abilities.mana.WhiteManaAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.CardsImpl;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.permanent.token.FoodToken;
import mage.players.Player;
import java.util.UUID;
/**
* @author balazskristof
*/
public final class SidequestCatchAFish extends CardImpl {
public final class SidequestCatchAFish extends TransformingDoubleFacedCard {
public SidequestCatchAFish(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}");
this.secondSideCardClazz = mage.cards.c.CookingCampsite.class;
super(ownerId, setInfo,
new CardType[]{CardType.ENCHANTMENT}, new SubType[]{}, "{2}{W}",
"Cooking Campsite",
new CardType[]{CardType.LAND}, new SubType[]{}, ""
);
// Sidequest: Catch a Fish
// At the beginning of your upkeep, look at the top card of your library. If it's an artifact or creature card, you may reveal it and put it into your hand. If you put a card into your hand this way, create a Food token and transform this enchantment.
this.addAbility(new TransformAbility());
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SidequestCatchAFishEffect()));
this.getLeftHalfCard().addAbility(new BeginningOfUpkeepTriggeredAbility(new SidequestCatchAFishEffect()));
// Cooking Campsite
// {T}: Add {W}.
this.getRightHalfCard().addAbility(new WhiteManaAbility());
// {3}, {T}, Sacrifice an artifact: Put a +1/+1 counter on each creature you control. Activate only as a sorcery.
Ability ability = new ActivateAsSorceryActivatedAbility(
new AddCountersAllEffect(CounterType.P1P1.createInstance(), StaticFilters.FILTER_CONTROLLED_CREATURE), new ManaCostsImpl<>("{3}")
);
ability.addCost(new TapSourceCost());
ability.addCost(new SacrificeTargetCost(StaticFilters.FILTER_PERMANENT_ARTIFACT_AN));
this.getRightHalfCard().addAbility(ability);
}
private SidequestCatchAFish(final SidequestCatchAFish card) {
@ -48,8 +70,8 @@ class SidequestCatchAFishEffect extends OneShotEffect {
SidequestCatchAFishEffect() {
super(Outcome.Benefit);
staticText = "look at the top card of your library. " +
"If it's an artifact or creature card, you may reveal it and put it into your hand. " +
"If you put a card into your hand this way, create a Food token and transform this enchantment.";
"If it's an artifact or creature card, you may reveal it and put it into your hand. " +
"If you put a card into your hand this way, create a Food token and transform this enchantment.";
}
private SidequestCatchAFishEffect(final SidequestCatchAFishEffect effect) {

View file

@ -2,25 +2,30 @@ package mage.cards.s;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.abilities.effects.common.TapSourceEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.hint.ConditionHint;
import mage.abilities.hint.Hint;
import mage.abilities.hint.ValueHint;
import mage.abilities.keyword.TransformAbility;
import mage.abilities.keyword.IndestructibleAbility;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.SubType;
import mage.constants.WatcherScope;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.ZoneChangeEvent;
@ -35,7 +40,7 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class SidequestHuntTheMark extends CardImpl {
public final class SidequestHuntTheMark extends TransformingDoubleFacedCard {
private static final Condition condition = new PermanentsOnTheBattlefieldCondition(
new FilterControlledPermanent(SubType.TREASURE), ComparisonType.MORE_THAN, 2
@ -44,25 +49,51 @@ public final class SidequestHuntTheMark extends CardImpl {
"Treasures you control", new PermanentsOnBattlefieldCount(new FilterControlledPermanent(SubType.TREASURE))
);
private static final FilterPermanent ySacFilter = new FilterPermanent("another creature or artifact");
static {
ySacFilter.add(AnotherPredicate.instance);
ySacFilter.add(Predicates.or(
CardType.CREATURE.getPredicate(),
CardType.ARTIFACT.getPredicate()
));
}
public SidequestHuntTheMark(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}{B}");
this.secondSideCardClazz = mage.cards.y.YiazmatUltimateMark.class;
super(ownerId, setInfo,
new SuperType[]{}, new CardType[]{CardType.ENCHANTMENT}, new SubType[]{}, "{3}{B}{B}",
"Yiazmat, Ultimate Mark",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.DRAGON}, "B"
);
// Sidequest: Hunt the Mark
// When this enchantment enters, destroy up to one target creature.
Ability ability = new EntersBattlefieldTriggeredAbility(new DestroyTargetEffect());
ability.addTarget(new TargetCreaturePermanent(0, 1));
this.addAbility(ability);
this.getLeftHalfCard().addAbility(ability);
// At the beginning of your end step, if a creature died under an opponent's control this turn, create a Treasure token. Then if you control three or more Treasures, transform this enchantment.
this.addAbility(new TransformAbility());
ability = new BeginningOfEndStepTriggeredAbility(new CreateTokenEffect(new TreasureToken()))
.withInterveningIf(SidequestHuntTheMarkCondition.instance);
ability.addEffect(new ConditionalOneShotEffect(
new TransformSourceEffect(), condition,
"Then if you control three or more Treasures, transform {this}"
));
this.addAbility(ability.addHint(hint).addHint(SidequestHuntTheMarkCondition.getHint()), new SidequestHuntTheMarkWatcher());
ability.addHint(hint)
.addHint(SidequestHuntTheMarkCondition.getHint());
ability.addWatcher(new SidequestHuntTheMarkWatcher());
this.getLeftHalfCard().addAbility(ability);
// Yiazmat, Ultimate Mark
this.getRightHalfCard().setPT(5, 6);
// {1}{B}, Sacrifice another creature or artifact: Yiazmat gains indestructible until end of turn. Tap it.
Ability yAbility = new SimpleActivatedAbility(
new GainAbilitySourceEffect(IndestructibleAbility.getInstance(), Duration.EndOfTurn), new ManaCostsImpl<>("{1}{B}")
);
yAbility.addCost(new SacrificeTargetCost(ySacFilter));
yAbility.addEffect(new TapSourceEffect().setText("tap it"));
this.getRightHalfCard().addAbility(yAbility);
}
private SidequestHuntTheMark(final SidequestHuntTheMark card) {
@ -120,10 +151,10 @@ class SidequestHuntTheMarkWatcher extends Watcher {
}
static boolean checkPlayer(Game game, Ability source) {
return game
game
.getState()
.getWatcher(SidequestHuntTheMarkWatcher.class)
.set
.getWatcher(SidequestHuntTheMarkWatcher.class);
return set
.contains(source.getControllerId());
}
}

View file

@ -2,18 +2,19 @@ package mage.cards.s;
import mage.abilities.Ability;
import mage.abilities.common.EndOfCombatTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.continuous.BoostEquippedEffect;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.abilities.keyword.TransformAbility;
import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
import mage.abilities.keyword.DoubleStrikeAbility;
import mage.abilities.keyword.EquipAbility;
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.TargetController;
import mage.constants.WatcherScope;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.events.DamagedEvent;
@ -32,25 +33,39 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class SidequestPlayBlitzball extends CardImpl {
public final class SidequestPlayBlitzball extends TransformingDoubleFacedCard {
public SidequestPlayBlitzball(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}");
this.secondSideCardClazz = mage.cards.w.WorldChampionCelestialWeapon.class;
super(ownerId, setInfo,
new SuperType[]{}, new CardType[]{CardType.ENCHANTMENT}, new SubType[]{}, "{2}{R}",
"World Champion, Celestial Weapon",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ARTIFACT}, new SubType[]{SubType.EQUIPMENT}, "R"
);
// Sidequest: Play Blitzball
// At the beginning of combat on your turn, target creature you control gets +2/+0 until end of turn.
Ability ability = new BeginningOfCombatTriggeredAbility(new BoostTargetEffect(2, 0));
ability.addTarget(new TargetControlledCreaturePermanent());
this.addAbility(ability);
this.getLeftHalfCard().addAbility(ability);
// At the end of combat on your turn, if a player was dealt 6 or more combat damage this turn, transform this enchantment, then attach it to a creature you control.
this.addAbility(new TransformAbility());
ability = new EndOfCombatTriggeredAbility(
new TransformSourceEffect(), TargetController.YOU, false
).withInterveningIf(SidequestPlayBlitzballCondition.instance).setTriggerPhrase("At the end of combat on your turn, ");
ability.addEffect(new SidequestPlayBlitzballEffect());
this.addAbility(ability, new SidequestPlayBlitzballWatcher());
ability.addWatcher(new SidequestPlayBlitzballWatcher());
this.getLeftHalfCard().addAbility(ability);
// World Champion, Celestial Weapon
// Double Overdrive -- Equipped creature gets +2/+0 and has double strike.
Ability eAbility = new SimpleStaticAbility(new BoostEquippedEffect(2, 0));
eAbility.addEffect(new GainAbilityAttachedEffect(
DoubleStrikeAbility.getInstance(), AttachmentType.EQUIPMENT
).setText("and has double strike"));
this.getRightHalfCard().addAbility(eAbility.withFlavorWord("Double Overdrive"));
// Equip {3}
this.getRightHalfCard().addAbility(new EquipAbility(3));
}
private SidequestPlayBlitzball(final SidequestPlayBlitzball card) {

View file

@ -1,30 +1,38 @@
package mage.cards.s;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.LandfallAbility;
import mage.abilities.common.TransformIntoSourceTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect;
import mage.abilities.hint.Hint;
import mage.abilities.hint.ValueHint;
import mage.abilities.keyword.TransformAbility;
import mage.abilities.triggers.BeginningOfFirstMainTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
import mage.filter.common.FilterControlledPermanent;
import mage.game.permanent.token.ChocoboToken;
import mage.target.common.TargetCardInLibrary;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class SidequestRaiseAChocobo extends CardImpl {
public final class SidequestRaiseAChocobo extends TransformingDoubleFacedCard {
private static final FilterPermanent filter = new FilterPermanent(SubType.BIRD, "Birds");
private static final Condition condition = new PermanentsOnTheBattlefieldCondition(
new FilterControlledPermanent(SubType.BIRD, "you control four or more Birds"),
ComparisonType.MORE_THAN, 3
@ -34,17 +42,32 @@ public final class SidequestRaiseAChocobo extends CardImpl {
);
public SidequestRaiseAChocobo(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{G}");
this.secondSideCardClazz = mage.cards.b.BlackChocobo.class;
super(ownerId, setInfo,
new CardType[]{CardType.ENCHANTMENT}, new SubType[]{}, "{1}{G}",
"Black Chocobo",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.BIRD}, "G"
);
// Sidequest: Raise a Chocobo
// When this enchantment enters, create a 2/2 green Bird creature token with "Whenever a land you control enters, this token gets +1/+0 until end of turn."
this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new ChocoboToken())));
this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new ChocoboToken())));
// At the beginning of your first main phase, if you control four or more Birds, transform this enchantment.
this.addAbility(new TransformAbility());
this.addAbility(new BeginningOfFirstMainTriggeredAbility(new TransformSourceEffect())
this.getLeftHalfCard().addAbility(new BeginningOfFirstMainTriggeredAbility(new TransformSourceEffect())
.withInterveningIf(condition).addHint(hint));
// Black Chocobo
this.getRightHalfCard().setPT(2, 2);
// When this permanent transforms into Black Chocobo, search your library for a land card, put it onto the battlefield tapped, then shuffle.
this.getRightHalfCard().addAbility(new TransformIntoSourceTriggeredAbility(
new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(StaticFilters.FILTER_CARD_LAND_A), true)
));
// Landfall -- Whenever a land you control enters, Birds you control get +1/+0 until end of turn.
this.getRightHalfCard().addAbility(new LandfallAbility(new BoostControlledEffect(
1, 0, Duration.EndOfTurn, filter, false
)));
}
private SidequestRaiseAChocobo(final SidequestRaiseAChocobo card) {

View file

@ -1,7 +1,5 @@
package mage.cards.s;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.DiesAttachedTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
@ -11,45 +9,46 @@ import mage.abilities.effects.common.combat.AttacksIfAbleAttachedEffect;
import mage.abilities.keyword.EnchantAbility;
import mage.abilities.keyword.TransformAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.AttachmentType;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.game.Game;
import mage.players.Player;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class SkinInvasion extends CardImpl {
public final class SkinInvasion extends TransformingDoubleFacedCard {
public SkinInvasion(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{R}");
this.subtype.add(SubType.AURA);
this.secondSideCardClazz = mage.cards.s.SkinShedder.class;
super(ownerId, setInfo,
new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.AURA}, "{R}",
"Skin Shedder",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.INSECT, SubType.HORROR}, "R"
);
// Skin Invasion
// Enchant creature
TargetPermanent auraTarget = new TargetCreaturePermanent();
this.getSpellAbility().addTarget(auraTarget);
this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility));
this.getLeftHalfCard().getSpellAbility().addTarget(auraTarget);
this.getLeftHalfCard().getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility));
Ability ability = new EnchantAbility(auraTarget);
this.addAbility(ability);
this.getLeftHalfCard().addAbility(ability);
// Enchanted creature attacks each combat if able.
this.addAbility(new SimpleStaticAbility(
this.getLeftHalfCard().addAbility(new SimpleStaticAbility(
new AttacksIfAbleAttachedEffect(Duration.WhileOnBattlefield, AttachmentType.AURA)));
// When enchanted creature dies, return Skin Invasion to the battlefield transformed under your control.
this.addAbility(new TransformAbility());
this.addAbility(new DiesAttachedTriggeredAbility(new SkinInvasionEffect(), "enchanted creature", false));
this.getLeftHalfCard().addAbility(new DiesAttachedTriggeredAbility(new SkinInvasionEffect(), "enchanted creature", false));
// Skin Shedder
this.getRightHalfCard().setPT(3, 4);
}
private SkinInvasion(final SkinInvasion card) {

View file

@ -1,38 +0,0 @@
package mage.cards.s;
import java.util.UUID;
import mage.MageInt;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
/**
*
* @author LevelX2
*/
public final class SkinShedder extends CardImpl {
public SkinShedder(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"");
this.subtype.add(SubType.INSECT);
this.subtype.add(SubType.HORROR);
this.color.setRed(true);
this.nightCard = true;
this.power = new MageInt(3);
this.toughness = new MageInt(4);
}
private SkinShedder(final SkinShedder card) {
super(card);
}
@Override
public SkinShedder copy() {
return new SkinShedder(this);
}
}

View file

@ -1,38 +1,54 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.common.TransformIntoSourceTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.cards.Card;
import mage.cards.CardSetInfo;
import mage.cards.CardsImpl;
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;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class SkyclaveAerialist extends CardImpl {
public final class SkyclaveAerialist extends TransformingDoubleFacedCard {
public SkyclaveAerialist(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}");
super(ownerId, setInfo,
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.MERFOLK, SubType.SCOUT}, "{1}{U}",
"Skyclave Invader",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.PHYREXIAN, SubType.MERFOLK, SubType.SCOUT}, "UG"
);
this.subtype.add(SubType.MERFOLK);
this.subtype.add(SubType.SCOUT);
this.power = new MageInt(2);
this.toughness = new MageInt(1);
this.secondSideCardClazz = mage.cards.s.SkyclaveInvader.class;
// Skyclave Aerialist
this.getLeftHalfCard().setPT(2, 1);
// Flying
this.addAbility(FlyingAbility.getInstance());
this.getLeftHalfCard().addAbility(FlyingAbility.getInstance());
// {4}{G/P}: Transform Skyclave Aerialist. Activate only as a sorcery.
this.addAbility(new TransformAbility());
this.addAbility(new ActivateAsSorceryActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{4}{G/P}")));
this.getLeftHalfCard().addAbility(new ActivateAsSorceryActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{4}{G/P}")));
// Skyclave Invader
this.getRightHalfCard().setPT(2, 4);
// Flying
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
// When this creature transforms into Skyclave Invader, look at the top card of your library. If it's a land card, you may put it onto the battlefield. If you don't put the card onto the battlefield, put it into your hand.
this.getRightHalfCard().addAbility(new TransformIntoSourceTriggeredAbility(new SkyclaveInvaderEffect()));
}
private SkyclaveAerialist(final SkyclaveAerialist card) {
@ -44,3 +60,38 @@ public final class SkyclaveAerialist extends CardImpl {
return new SkyclaveAerialist(this);
}
}
class SkyclaveInvaderEffect extends OneShotEffect {
SkyclaveInvaderEffect() {
super(Outcome.Benefit);
staticText = "look at the top card of your library. If it's a land card, you may put it onto the battlefield. " +
"If you don't put the card onto the battlefield, put it into your hand";
}
private SkyclaveInvaderEffect(final SkyclaveInvaderEffect effect) {
super(effect);
}
@Override
public SkyclaveInvaderEffect copy() {
return new SkyclaveInvaderEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
if (player == null) {
return false;
}
Card card = player.getLibrary().getFromTop(game);
if (card == null) {
return false;
}
player.lookAtCards(source, null, new CardsImpl(card), game);
return player.moveCards(card, card.isLand(game) && player.chooseUse(
Outcome.PutCardInPlay, "Put " + card.getName() + " onto the battlefield or into your hand?",
null, "Battlefield", "Hand", source, game
) ? Zone.BATTLEFIELD : Zone.HAND, source, game);
}
}

View file

@ -1,88 +0,0 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.TransformIntoSourceTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.keyword.FlyingAbility;
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.game.Game;
import mage.players.Player;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class SkyclaveInvader extends CardImpl {
public SkyclaveInvader(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.PHYREXIAN);
this.subtype.add(SubType.MERFOLK);
this.subtype.add(SubType.SCOUT);
this.power = new MageInt(2);
this.toughness = new MageInt(4);
this.color.setBlue(true);
this.color.setGreen(true);
this.nightCard = true;
// Flying
this.addAbility(FlyingAbility.getInstance());
// When this creature transforms into Skyclave Invader, look at the top card of your library. If it's a land card, you may put it onto the battlefield. If you don't put the card onto the battlefield, put it into your hand.
this.addAbility(new TransformIntoSourceTriggeredAbility(new SkyclaveInvaderEffect()));
}
private SkyclaveInvader(final SkyclaveInvader card) {
super(card);
}
@Override
public SkyclaveInvader copy() {
return new SkyclaveInvader(this);
}
}
class SkyclaveInvaderEffect extends OneShotEffect {
SkyclaveInvaderEffect() {
super(Outcome.Benefit);
staticText = "look at the top card of your library. If it's a land card, you may put it onto the battlefield. " +
"If you don't put the card onto the battlefield, put it into your hand";
}
private SkyclaveInvaderEffect(final SkyclaveInvaderEffect effect) {
super(effect);
}
@Override
public SkyclaveInvaderEffect copy() {
return new SkyclaveInvaderEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
if (player == null) {
return false;
}
Card card = player.getLibrary().getFromTop(game);
if (card == null) {
return false;
}
player.lookAtCards(source, null, new CardsImpl(card), game);
return player.moveCards(card, card.isLand(game) && player.chooseUse(
Outcome.PutCardInPlay, "Put " + card.getName() + " onto the battlefield or into your hand?",
null, "Battlefield", "Hand", source, game
) ? Zone.BATTLEFIELD : Zone.HAND, source, game);
}
}

View file

@ -1,59 +0,0 @@
package mage.cards.s;
import java.util.UUID;
import mage.MageInt;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.abilities.keyword.LivingMetalAbility;
import mage.abilities.keyword.FirstStrikeAbility;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
import mage.abilities.common.delayed.AtTheEndOfCombatDelayedTriggeredAbility;
import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
/**
* @author grimreap124
*/
public final class SlicerHighSpeedAntagonist extends CardImpl {
public SlicerHighSpeedAntagonist(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[] { CardType.ARTIFACT }, "");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.VEHICLE);
this.power = new MageInt(3);
this.toughness = new MageInt(2);
this.color.setRed(true);
this.nightCard = true;
// Living metal
this.addAbility(new LivingMetalAbility());
// First strike
this.addAbility(FirstStrikeAbility.getInstance());
// Haste
this.addAbility(HasteAbility.getInstance());
// Whenever Slicer deals combat damage to a player, convert it at end of combat.
this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(
new CreateDelayedTriggeredAbilityEffect(
new AtTheEndOfCombatDelayedTriggeredAbility(new TransformSourceEffect()))
.setText("convert it at end of combat"),
false));
}
private SlicerHighSpeedAntagonist(final SlicerHighSpeedAntagonist card) {
super(card);
}
@Override
public SlicerHighSpeedAntagonist copy() {
return new SlicerHighSpeedAntagonist(this);
}
}

View file

@ -1,56 +1,76 @@
package mage.cards.s;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.keyword.MoreThanMeetsTheEyeAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.keyword.DoubleStrikeAbility;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.common.delayed.AtTheEndOfCombatDelayedTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.combat.GoadTargetEffect;
import mage.abilities.effects.common.continuous.CantBeSacrificedSourceEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.effects.common.continuous.GainControlTargetEffect;
import mage.abilities.effects.common.continuous.CantBeSacrificedSourceEffect;
import mage.abilities.effects.OneShotEffect;
import mage.cards.CardImpl;
import mage.abilities.keyword.*;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardSetInfo;
import mage.game.Game;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.targetpointer.FixedTarget;
import mage.players.Player;
import mage.abilities.common.SimpleStaticAbility;
import mage.target.targetpointer.FixedTarget;
import java.util.UUID;
/**
* @author grimreap124
*/
public final class SlicerHiredMuscle extends CardImpl {
public final class SlicerHiredMuscle extends TransformingDoubleFacedCard {
public SlicerHiredMuscle(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[] { CardType.ARTIFACT, CardType.CREATURE }, "{4}{R}");
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, new SubType[]{SubType.ROBOT}, "{4}{R}",
"Slicer, High-Speed Antagonist",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ARTIFACT}, new SubType[]{SubType.VEHICLE}, "R"
);
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.ROBOT);
this.power = new MageInt(3);
this.toughness = new MageInt(4);
this.secondSideCardClazz = mage.cards.s.SlicerHighSpeedAntagonist.class;
// Slicer, Hired Muscle
this.getLeftHalfCard().setPT(3, 4);
// More Than Meets the Eye {2}{R}
this.addAbility(new MoreThanMeetsTheEyeAbility(this, "{2}{R}"));
this.getLeftHalfCard().addAbility(new MoreThanMeetsTheEyeAbility(this, "{2}{R}"));
// Double strike
this.addAbility(DoubleStrikeAbility.getInstance());
this.getLeftHalfCard().addAbility(DoubleStrikeAbility.getInstance());
// Haste
this.addAbility(HasteAbility.getInstance());
this.getLeftHalfCard().addAbility(HasteAbility.getInstance());
// At the beginning of each opponent's upkeep, you may have that player gain
// control of Slicer until end of turn. If you do, untap Slicer, goad it, and it
// can't be sacrificed this turn. If you don't, convert it.
this.addAbility(new BeginningOfUpkeepTriggeredAbility(TargetController.OPPONENT, new SlicerHiredMuscleUpkeepEffect(),
this.getLeftHalfCard().addAbility(new BeginningOfUpkeepTriggeredAbility(TargetController.OPPONENT, new SlicerHiredMuscleUpkeepEffect(),
false));
// Slicer, High-Speed Antagonist
this.getRightHalfCard().setPT(3, 2);
// Living metal
this.getRightHalfCard().addAbility(new LivingMetalAbility());
// First strike
this.getRightHalfCard().addAbility(FirstStrikeAbility.getInstance());
// Haste
this.getRightHalfCard().addAbility(HasteAbility.getInstance());
// Whenever Slicer deals combat damage to a player, convert it at end of combat.
this.getRightHalfCard().addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(
new CreateDelayedTriggeredAbilityEffect(
new AtTheEndOfCombatDelayedTriggeredAbility(new TransformSourceEffect()))
.setText("convert it at end of combat"),
false));
}
private SlicerHiredMuscle(final SlicerHiredMuscle card) {
@ -104,8 +124,8 @@ class SlicerHiredMuscleUpkeepEffect extends OneShotEffect {
// Goad
game.addEffect(new GoadTargetEffect()
.setDuration(Duration.EndOfTurn)
.setTargetPointer(new FixedTarget(sourcePermanent, game)),
.setDuration(Duration.EndOfTurn)
.setTargetPointer(new FixedTarget(sourcePermanent, game)),
source);
// Can't be sacrificed

View file

@ -1,6 +1,5 @@
package mage.cards.s;
import mage.MageInt;
import mage.Mana;
import mage.abilities.Ability;
import mage.abilities.AbilityImpl;
@ -11,19 +10,21 @@ import mage.abilities.costs.mana.ManaCost;
import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.effects.common.RemoveAllCountersSourceEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.DefenderAbility;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.counters.CounterType;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.stack.Spell;
import mage.target.common.TargetAnyTarget;
import java.util.Optional;
import java.util.UUID;
@ -31,24 +32,24 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class SmolderingEgg extends CardImpl {
public final class SmolderingEgg extends TransformingDoubleFacedCard {
private static final Condition condition = new SourceHasCounterCondition(CounterType.EMBER, 7);
public SmolderingEgg(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}");
super(ownerId, setInfo,
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.DRAGON, SubType.EGG}, "{1}{R}",
"Ashmouth Dragon",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.DRAGON}, "R"
);
this.subtype.add(SubType.DRAGON);
this.subtype.add(SubType.EGG);
this.power = new MageInt(0);
this.toughness = new MageInt(4);
this.secondSideCardClazz = mage.cards.a.AshmouthDragon.class;
// Smoldering Egg
this.getLeftHalfCard().setPT(0, 4);
// Defender
this.addAbility(DefenderAbility.getInstance());
this.getLeftHalfCard().addAbility(DefenderAbility.getInstance());
// Whenever you cast an instant or sorcery spell, put a number of ember counters on Smoldering Egg equal to the amount of mana spent to cast that spell. Then if Smoldering Egg has seven or more ember counters on it, remove them and transform Smoldering Egg.
this.addAbility(new TransformAbility());
Ability ability = new SpellCastControllerTriggeredAbility(
new AddCountersSourceEffect(CounterType.EMBER.createInstance(), SmolderingEggValue.instance)
.setText("put a number of ember counters on {this} equal to the amount of mana spent to cast that spell"),
@ -58,7 +59,20 @@ public final class SmolderingEgg extends CardImpl {
new RemoveAllCountersSourceEffect(CounterType.EMBER), condition,
"Then if {this} has seven or more ember counters on it, remove them and transform {this}"
).addEffect(new TransformSourceEffect()));
this.addAbility(ability);
this.getLeftHalfCard().addAbility(ability);
// Ashmouth Dragon
this.getRightHalfCard().setPT(4, 4);
// Flying
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
// Whenever you cast an instant or sorcery spell, Ashmouth Dragon deals 2 damage to any target.
Ability ability2 = new SpellCastControllerTriggeredAbility(
new DamageTargetEffect(2), StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY, false
);
ability2.addTarget(new TargetAnyTarget());
this.getRightHalfCard().addAbility(ability2);
}
private SmolderingEgg(final SmolderingEgg card) {

View file

@ -1,17 +1,17 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.target.common.TargetAnyTarget;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
@ -19,25 +19,33 @@ import java.util.UUID;
/**
* @author fireshoes
*/
public final class SmolderingWerewolf extends CardImpl {
public final class SmolderingWerewolf extends TransformingDoubleFacedCard {
public SmolderingWerewolf(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}{R}");
this.subtype.add(SubType.WEREWOLF);
this.subtype.add(SubType.HORROR);
this.power = new MageInt(3);
this.toughness = new MageInt(2);
super(ownerId, setInfo,
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF, SubType.HORROR}, "{2}{R}{R}",
"Erupting Dreadwolf",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.ELDRAZI, SubType.WEREWOLF}, ""
);
this.secondSideCardClazz = mage.cards.e.EruptingDreadwolf.class;
// Smoldering Werewolf
this.getLeftHalfCard().setPT(3, 2);
// When Smoldering Werewolf enters the battlefield, it deals 1 damage to each of up to two target creatures.
Ability ability = new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(1, "it"));
ability.addTarget(new TargetCreaturePermanent(0, 2));
this.addAbility(ability);
this.getLeftHalfCard().addAbility(ability);
// {4}{R}{R}: Transform Smoldering Werewolf.
this.addAbility(new TransformAbility());
this.addAbility(new SimpleActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{4}{R}{R}")));
this.getLeftHalfCard().addAbility(new SimpleActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{4}{R}{R}")));
// Erupting Dreadwolf
this.getRightHalfCard().setPT(6, 4);
// Whenever Erupting Dreadwolf attacks, it deals 2 damage to any target.
Ability ability2 = new AttacksTriggeredAbility(new DamageTargetEffect(2, "it"), false);
ability2.addTarget(new TargetAnyTarget());
this.getRightHalfCard().addAbility(ability2);
}
private SmolderingWerewolf(final SmolderingWerewolf card) {

View file

@ -1,10 +1,9 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.common.WerewolfBackTriggeredAbility;
import mage.abilities.common.WerewolfFrontTriggeredAbility;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
@ -13,22 +12,26 @@ import java.util.UUID;
/**
* @author LevelX2
*/
public final class SolitaryHunter extends CardImpl {
public final class SolitaryHunter extends TransformingDoubleFacedCard {
public SolitaryHunter(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.WARRIOR);
this.subtype.add(SubType.WEREWOLF);
super(ownerId, setInfo,
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WARRIOR, SubType.WEREWOLF}, "{3}{G}",
"One of the Pack",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "G"
);
this.power = new MageInt(3);
this.toughness = new MageInt(4);
this.secondSideCardClazz = mage.cards.o.OneOfThePack.class;
// Solitary Hunter
this.getLeftHalfCard().setPT(3, 4);
// At the beginning of each upkeep, if no spells were cast last turn, transform Solitary Hunter.
this.addAbility(new TransformAbility());
this.addAbility(new WerewolfFrontTriggeredAbility());
this.getLeftHalfCard().addAbility(new WerewolfFrontTriggeredAbility());
// One of the Pack
this.getRightHalfCard().setPT(5, 6);
// At the beginning of each upkeep, if a player cast two or more spells last turn, transform One of the Pack.
this.getRightHalfCard().addAbility(new WerewolfBackTriggeredAbility());
}
private SolitaryHunter(final SolitaryHunter card) {

View file

@ -1,21 +1,24 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbility;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.continuous.ControlEnchantedEffect;
import mage.abilities.keyword.EnchantAbility;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.TransformAbility;
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.filter.StaticFilters;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.Target;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
import mage.target.targetadjustment.ThatPlayerControlsTargetAdjuster;
import java.util.UUID;
@ -23,26 +26,36 @@ import java.util.UUID;
/**
* @author BetaSteward
*/
public final class SoulSeizer extends CardImpl {
public final class SoulSeizer extends TransformingDoubleFacedCard {
public SoulSeizer(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}{U}");
this.subtype.add(SubType.SPIRIT);
super(ownerId, setInfo,
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.SPIRIT}, "{3}{U}{U}",
"Ghastly Haunting",
new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.AURA}, "U"
);
this.secondSideCardClazz = mage.cards.g.GhastlyHaunting.class;
// Soul Seizer
this.getLeftHalfCard().setPT(1, 3);
this.power = new MageInt(1);
this.toughness = new MageInt(3);
this.addAbility(FlyingAbility.getInstance());
// Flying
this.getLeftHalfCard().addAbility(FlyingAbility.getInstance());
// When Soul Seizer deals combat damage to a player, you may transform it. If you do, attach it to target creature that player controls.
this.addAbility(new TransformAbility());
TriggeredAbility ability = new DealsCombatDamageToAPlayerTriggeredAbility(new SoulSeizerEffect(), true, true);
ability.setTriggerPhrase("When {this} deals combat damage to a player, ");
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_PERMANENT_CREATURE));
ability.setTargetAdjuster(new ThatPlayerControlsTargetAdjuster());
this.addAbility(ability);
this.getLeftHalfCard().addAbility(ability);
// Ghastly Haunting
// Enchant creature
Target auraTarget = new TargetCreaturePermanent();
this.getRightHalfCard().getSpellAbility().addTarget(auraTarget);
this.getRightHalfCard().addAbility(new EnchantAbility(auraTarget));
// You control enchanted creature.
this.getRightHalfCard().addAbility(new SimpleStaticAbility(new ControlEnchantedEffect()));
}
private SoulSeizer(final SoulSeizer card) {

View file

@ -1,6 +1,7 @@
package mage.cards.s;
import mage.abilities.Ability;
import mage.abilities.common.CanBlockOnlyFlyingAbility;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.PutCardIntoGraveFromAnywhereAllTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
@ -9,17 +10,15 @@ import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.effects.common.DrawDiscardControllerEffect;
import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.effects.common.counter.RemoveCounterSourceEffect;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.PutCards;
import mage.constants.TargetController;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.counters.CounterType;
import mage.filter.StaticFilters;
@ -28,16 +27,20 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class SoulcipherBoard extends CardImpl {
public final class SoulcipherBoard extends TransformingDoubleFacedCard {
private static final Condition condition = new SourceHasCounterCondition(CounterType.OMEN, ComparisonType.EQUAL_TO, 0);
public SoulcipherBoard(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}{U}");
this.secondSideCardClazz = mage.cards.c.CipherboundSpirit.class;
super(ownerId, setInfo,
new CardType[]{CardType.ARTIFACT}, new SubType[]{}, "{1}{U}",
"Cipherbound Spirit",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.SPIRIT}, "U"
);
// Soulcipher Board
// Soulcipher Board enters the battlefield with three omen counters on it.
this.addAbility(new EntersBattlefieldAbility(
this.getLeftHalfCard().addAbility(new EntersBattlefieldAbility(
new AddCountersSourceEffect(CounterType.OMEN.createInstance(3)),
"with three omen counters on it"
));
@ -47,19 +50,32 @@ public final class SoulcipherBoard extends CardImpl {
new LookLibraryAndPickControllerEffect(2, 1, PutCards.GRAVEYARD, PutCards.TOP_ANY),
new ManaCostsImpl<>("{1}{U}"));
ability.addCost(new TapSourceCost());
this.addAbility(ability);
this.getLeftHalfCard().addAbility(ability);
// Whenever a creature card is put into your graveyard from anywhere, remove an omen counter from Soulcipher Board. Then if it has no omen counters on it, transform it.
this.addAbility(new TransformAbility());
ability = new PutCardIntoGraveFromAnywhereAllTriggeredAbility(
Ability ability2 = new PutCardIntoGraveFromAnywhereAllTriggeredAbility(
new RemoveCounterSourceEffect(CounterType.OMEN.createInstance()),
false, StaticFilters.FILTER_CARD_CREATURE_A, TargetController.YOU
);
ability.addEffect(new ConditionalOneShotEffect(
ability2.addEffect(new ConditionalOneShotEffect(
new TransformSourceEffect(), condition,
"Then if it has no omen counters on it, transform it"
));
this.addAbility(ability);
this.getLeftHalfCard().addAbility(ability2);
// Cipherbound Spirit
this.getRightHalfCard().setPT(3, 2);
// Flying
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
// Cipherbound Spirit can block only creatures with flying.
this.getRightHalfCard().addAbility(new CanBlockOnlyFlyingAbility());
// {3}{U}: Draw two cards, then discard a card.
this.getRightHalfCard().addAbility(new SimpleActivatedAbility(
new DrawDiscardControllerEffect(2, 1), new ManaCostsImpl<>("{3}{U}")
));
}
private SoulcipherBoard(final SoulcipherBoard card) {

View file

@ -1,48 +0,0 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.abilities.keyword.NightboundAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.StaticFilters;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class SpellruneHowler extends CardImpl {
public SpellruneHowler(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.WEREWOLF);
this.power = new MageInt(3);
this.toughness = new MageInt(4);
this.color.setRed(true);
this.nightCard = true;
// Whenever you cast an instant or sorcery spell, Spellrune Howler gets +2/+2 until end of turn.
this.addAbility(new SpellCastControllerTriggeredAbility(
new BoostSourceEffect(2, 2, Duration.EndOfTurn),
StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY, false
));
// Nightbound
this.addAbility(new NightboundAbility());
}
private SpellruneHowler(final SpellruneHowler card) {
super(card);
}
@Override
public SpellruneHowler copy() {
return new SpellruneHowler(this);
}
}

View file

@ -1,11 +1,11 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.abilities.keyword.DayboundAbility;
import mage.cards.CardImpl;
import mage.abilities.keyword.NightboundAbility;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
@ -16,26 +16,38 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class SpellrunePainter extends CardImpl {
public final class SpellrunePainter extends TransformingDoubleFacedCard {
public SpellrunePainter(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}");
super(ownerId, setInfo,
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.SHAMAN, SubType.WEREWOLF}, "{2}{R}",
"Spellrune Howler",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "R"
);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.SHAMAN);
this.subtype.add(SubType.WEREWOLF);
this.power = new MageInt(2);
this.toughness = new MageInt(3);
this.secondSideCardClazz = mage.cards.s.SpellruneHowler.class;
// Spellrune Painter
this.getLeftHalfCard().setPT(2, 3);
// Whenever you cast an instant or sorcery spell, Spellrune Painter gets +1/+1 until end of turn.
this.addAbility(new SpellCastControllerTriggeredAbility(
this.getLeftHalfCard().addAbility(new SpellCastControllerTriggeredAbility(
new BoostSourceEffect(1, 1, Duration.EndOfTurn),
StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY, false
));
// Daybound
this.addAbility(new DayboundAbility());
this.getLeftHalfCard().addAbility(new DayboundAbility());
// Spellrune Howler
this.getRightHalfCard().setPT(3, 4);
// Whenever you cast an instant or sorcery spell, Spellrune Howler gets +2/+2 until end of turn.
this.getRightHalfCard().addAbility(new SpellCastControllerTriggeredAbility(
new BoostSourceEffect(2, 2, Duration.EndOfTurn),
StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY, false
));
// Nightbound
this.getRightHalfCard().addAbility(new NightboundAbility());
}
private SpellrunePainter(final SpellrunePainter card) {

View file

@ -1,42 +0,0 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.keyword.MenaceAbility;
import mage.abilities.keyword.NightboundAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class StalkingPredator extends CardImpl {
public StalkingPredator(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.WEREWOLF);
this.power = new MageInt(4);
this.toughness = new MageInt(4);
this.color.setBlack(true);
this.nightCard = true;
// Menace
this.addAbility(new MenaceAbility());
// Nightbound
this.addAbility(new NightboundAbility());
}
private StalkingPredator(final StalkingPredator card) {
super(card);
}
@Override
public StalkingPredator copy() {
return new StalkingPredator(this);
}
}

View file

@ -1,45 +0,0 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import java.util.UUID;
/**
* @author nantuko
*/
public final class StalkingVampire extends CardImpl {
public StalkingVampire(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.VAMPIRE);
this.color.setBlack(true);
this.nightCard = true;
this.power = new MageInt(5);
this.toughness = new MageInt(5);
// At the beginning of your upkeep, you may pay {2}{B}{B}. If you do, transform Stalking Vampire.
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new DoIfCostPaid(
new TransformSourceEffect(),
new ManaCostsImpl<>("{2}{B}{B}")
)));
}
private StalkingVampire(final StalkingVampire card) {
super(card);
}
@Override
public StalkingVampire copy() {
return new StalkingVampire(this);
}
}

View file

@ -1,17 +1,19 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.BecomesMonarchSourceControllerTriggeredAbility;
import mage.abilities.common.CombatDamageDealtToYouTriggeredAbility;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
import mage.abilities.common.DrawCardControllerTriggeredAbility;
import mage.abilities.condition.common.MonarchIsNotSetCondition;
import mage.abilities.condition.common.MonarchIsSourceControllerCondition;
import mage.abilities.effects.common.BecomesMonarchTargetEffect;
import mage.abilities.effects.common.LoseLifeTargetEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.hint.common.MonarchHint;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.MoreThanMeetsTheEyeAbility;
import mage.cards.CardImpl;
import mage.abilities.keyword.*;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
@ -22,31 +24,57 @@ import java.util.UUID;
/**
* @author Susucr
*/
public final class StarscreamPowerHungry extends CardImpl {
public final class StarscreamPowerHungry extends TransformingDoubleFacedCard {
public StarscreamPowerHungry(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{3}{B}");
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, new SubType[]{SubType.ROBOT}, "{3}{B}",
"Starscream, Seeker Leader",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ARTIFACT}, new SubType[]{SubType.VEHICLE}, "B"
);
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.ROBOT);
this.power = new MageInt(2);
this.toughness = new MageInt(3);
this.secondSideCardClazz = mage.cards.s.StarscreamSeekerLeader.class;
// Starscream, Power Hungry
this.getLeftHalfCard().setPT(2, 3);
// More Than Meets the Eye {2}{B}
this.addAbility(new MoreThanMeetsTheEyeAbility(this, "{2}{B}"));
this.getLeftHalfCard().addAbility(new MoreThanMeetsTheEyeAbility(this, "{2}{B}"));
// Flying
this.addAbility(FlyingAbility.getInstance());
this.getLeftHalfCard().addAbility(FlyingAbility.getInstance());
// Whenever you draw a card, if you're the monarch, target opponent loses 2 life.
Ability ability = new DrawCardControllerTriggeredAbility(new LoseLifeTargetEffect(2), false)
.withInterveningIf(MonarchIsSourceControllerCondition.instance);
ability.addTarget(new TargetOpponent());
this.addAbility(ability.addHint(MonarchHint.instance));
this.getLeftHalfCard().addAbility(ability.addHint(MonarchHint.instance));
// Whenever one or more creatures deal combat damage to you, convert Starscream.
this.addAbility(new CombatDamageDealtToYouTriggeredAbility(
this.getLeftHalfCard().addAbility(new CombatDamageDealtToYouTriggeredAbility(
new TransformSourceEffect().setText("convert {this}")
));
// Starscream, Seeker Leader
this.getRightHalfCard().setPT(2, 3);
// Living metal
this.getRightHalfCard().addAbility(new LivingMetalAbility());
// Flying
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
// Menace
this.getRightHalfCard().addAbility(new MenaceAbility(false));
// Haste
this.getRightHalfCard().addAbility(HasteAbility.getInstance());
// Whenever Starscream deals combat damage to a player, if there is no monarch, that player becomes the monarch.
this.getRightHalfCard().addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(
new BecomesMonarchTargetEffect().setText("that player becomes the monarch"), false, true
).withInterveningIf(MonarchIsNotSetCondition.instance).addHint(MonarchHint.instance));
// Whenever you become the monarch, convert Starscream.
this.getRightHalfCard().addAbility(new BecomesMonarchSourceControllerTriggeredAbility(
new TransformSourceEffect().setText("convert {this}")
));
}

View file

@ -1,68 +0,0 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.common.BecomesMonarchSourceControllerTriggeredAbility;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
import mage.abilities.condition.common.MonarchIsNotSetCondition;
import mage.abilities.effects.common.BecomesMonarchTargetEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.hint.common.MonarchHint;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.keyword.LivingMetalAbility;
import mage.abilities.keyword.MenaceAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
import java.util.UUID;
/**
* @author Susucr
*/
public final class StarscreamSeekerLeader extends CardImpl {
public StarscreamSeekerLeader(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.VEHICLE);
this.power = new MageInt(2);
this.toughness = new MageInt(3);
this.color.setBlack(true);
this.nightCard = true;
// Living metal
this.addAbility(new LivingMetalAbility());
// Flying
this.addAbility(FlyingAbility.getInstance());
// Menace
this.addAbility(new MenaceAbility(false));
// Haste
this.addAbility(HasteAbility.getInstance());
// Whenever Starscream deals combat damage to a player, if there is no monarch, that player becomes the monarch.
this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(
new BecomesMonarchTargetEffect().setText("that player becomes the monarch"), false, true
).withInterveningIf(MonarchIsNotSetCondition.instance).addHint(MonarchHint.instance));
// Whenever you become the monarch, convert Starscream.
this.addAbility(new BecomesMonarchSourceControllerTriggeredAbility(
new TransformSourceEffect().setText("convert {this}")
));
}
private StarscreamSeekerLeader(final StarscreamSeekerLeader card) {
super(card);
}
@Override
public StarscreamSeekerLeader copy() {
return new StarscreamSeekerLeader(this);
}
}

View file

@ -1,18 +1,21 @@
package mage.cards.s;
import mage.Mana;
import mage.abilities.common.OneOrMoreCombatDamagePlayerTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.dynamicvalue.common.ArtifactYouControlCount;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.mana.DynamicManaEffect;
import mage.abilities.hint.common.ArtifactYouControlHint;
import mage.abilities.keyword.TransformAbility;
import mage.abilities.mana.AnyColorManaAbility;
import mage.abilities.mana.SimpleManaAbility;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.SuperType;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.filter.common.FilterControlledArtifactPermanent;
import mage.game.permanent.token.TreasureToken;
@ -21,26 +24,34 @@ import java.util.UUID;
/**
* @author LevelX2
*/
public final class StormTheVault extends CardImpl {
public final class StormTheVault extends TransformingDoubleFacedCard {
private static final Condition condition = new PermanentsOnTheBattlefieldCondition(
new FilterControlledArtifactPermanent("you control five or more artifacts"), ComparisonType.MORE_THAN, 4
);
public StormTheVault(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}{R}");
this.supertype.add(SuperType.LEGENDARY);
this.secondSideCardClazz = mage.cards.v.VaultOfCatlacan.class;
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ENCHANTMENT}, new SubType[]{}, "{2}{U}{R}",
"Vault of Catlacan",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.LAND}, new SubType[]{}, ""
);
// Whenever one or more creatures you control deal combat damage to a player, create a colorless Treasure artifact token with "{T}, Sacrifice this artifact: Add one mana of any color."
this.addAbility(new OneOrMoreCombatDamagePlayerTriggeredAbility(new CreateTokenEffect(new TreasureToken())));
this.getLeftHalfCard().addAbility(new OneOrMoreCombatDamagePlayerTriggeredAbility(new CreateTokenEffect(new TreasureToken())));
// At the beginning of your end step, if you control five or more artifacts, transform Storm the Vault.
this.addAbility(new TransformAbility());
this.addAbility(new BeginningOfEndStepTriggeredAbility(new TransformSourceEffect())
this.getLeftHalfCard().addAbility(new BeginningOfEndStepTriggeredAbility(new TransformSourceEffect())
.withInterveningIf(condition).addHint(ArtifactYouControlHint.instance));
// Vault of Catlacan
// {T}: Add one mana of any color.
this.getRightHalfCard().addAbility(new AnyColorManaAbility());
// {T}: Add {U} for each artifact you control.
this.getRightHalfCard().addAbility(new SimpleManaAbility(Zone.BATTLEFIELD,
new DynamicManaEffect(Mana.BlueMana(1), ArtifactYouControlCount.instance),
new TapSourceCost()).addHint(ArtifactYouControlHint.instance));
}
private StormTheVault(final StormTheVault card) {

View file

@ -1,34 +1,46 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateTokenCopyTargetEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.keyword.TransformAbility;
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.counters.CounterType;
import mage.game.Game;
import mage.game.permanent.Permanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class SunBlessedGuardian extends CardImpl {
public final class SunBlessedGuardian extends TransformingDoubleFacedCard {
public SunBlessedGuardian(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}");
super(ownerId, setInfo,
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.CLERIC}, "{1}{W}",
"Furnace-Blessed Conqueror",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.PHYREXIAN, SubType.CLERIC}, "WR"
);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.CLERIC);
this.power = new MageInt(2);
this.toughness = new MageInt(2);
this.secondSideCardClazz = mage.cards.f.FurnaceBlessedConqueror.class;
// Sun-Blessed Guardian
this.getLeftHalfCard().setPT(2, 2);
// {5}{R/P}: Transform Sun-Blessed Guardian. Activate only as a sorcery.
this.addAbility(new TransformAbility());
this.addAbility(new ActivateAsSorceryActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{5}{R/P}")));
this.getLeftHalfCard().addAbility(new ActivateAsSorceryActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{5}{R/P}")));
// Furnace-Blessed Conqueror
this.getRightHalfCard().setPT(3, 3);
// Whenever Furnace-Blessed Conqueror attacks, create a tapped and attacking token that's a copy of it. Put a +1/+1 counter on that token for each +1/+1 counter on Furnace-Blessed Conqueror. Sacrifice that token at the beginning of the next end step.
this.getRightHalfCard().addAbility(new AttacksTriggeredAbility(new SunBlessedGuardianEffect()));
}
private SunBlessedGuardian(final SunBlessedGuardian card) {
@ -40,3 +52,44 @@ public final class SunBlessedGuardian extends CardImpl {
return new SunBlessedGuardian(this);
}
}
class SunBlessedGuardianEffect extends OneShotEffect {
SunBlessedGuardianEffect() {
super(Outcome.Benefit);
staticText = "create a tapped and attacking token that's a copy of it. " +
"Put a +1/+1 counter on that token for each +1/+1 counter on {this}. " +
"Sacrifice that token at the beginning of the next end step";
}
private SunBlessedGuardianEffect(final SunBlessedGuardianEffect effect) {
super(effect);
}
@Override
public SunBlessedGuardianEffect copy() {
return new SunBlessedGuardianEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Permanent permanent = source.getSourcePermanentIfItStillExists(game);
if (permanent == null) {
return false;
}
CreateTokenCopyTargetEffect effect = new CreateTokenCopyTargetEffect(
null, null, false, 1, true, true
);
effect.setSavedPermanent(permanent);
effect.apply(game, source);
effect.sacrificeTokensCreatedAtNextEndStep(game, source);
int counters = permanent.getCounters(game).getCount(CounterType.P1P1);
if (counters < 1) {
return true;
}
for (Permanent token : effect.getAddedPermanents()) {
token.addCounters(CounterType.P1P1.createInstance(counters), source, game);
}
return true;
}
}

View file

@ -1,192 +0,0 @@
package mage.cards.s;
import mage.MageInt;
import mage.Mana;
import mage.ObjectColor;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.continuous.SetBasePowerToughnessSourceEffect;
import mage.abilities.effects.mana.ManaEffect;
import mage.abilities.hint.Hint;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.keyword.VigilanceAbility;
import mage.abilities.mana.SimpleManaAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.game.ExileZone;
import mage.game.Game;
import mage.util.CardUtil;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
import java.util.stream.Collectors;
/**
* @author TheElk801
*/
public final class SunbirdEffigy extends CardImpl {
public SunbirdEffigy(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "");
this.subtype.add(SubType.BIRD);
this.subtype.add(SubType.CONSTRUCT);
this.power = new MageInt(0);
this.toughness = new MageInt(0);
this.nightCard = true;
// Flying
this.addAbility(FlyingAbility.getInstance());
// Vigilance
this.addAbility(VigilanceAbility.getInstance());
// Haste
this.addAbility(HasteAbility.getInstance());
// Sunbird Effigy's power and toughness are each equal to the number of colors among the exiled cards used to craft it.
this.addAbility(new SimpleStaticAbility(
Zone.ALL, new SetBasePowerToughnessSourceEffect(SunbirdEffigyValue.instance)
).addHint(SunbirdEffigyHint.instance));
// {T}: For each color among the exiled cards used to craft Sunbird Effigy, add one mana of that color.
this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new SunbirdEffigyEffect(), new TapSourceCost()));
}
private SunbirdEffigy(final SunbirdEffigy card) {
super(card);
}
@Override
public SunbirdEffigy copy() {
return new SunbirdEffigy(this);
}
}
enum SunbirdEffigyValue implements DynamicValue {
instance;
@Override
public int calculate(Game game, Ability sourceAbility, Effect effect) {
return Optional
.ofNullable(getColor(game, sourceAbility))
.filter(Objects::nonNull)
.map(ObjectColor::getColorCount)
.orElse(0);
}
@Override
public SunbirdEffigyValue copy() {
return this;
}
@Override
public String getMessage() {
return "colors among the exiled cards used to craft it";
}
@Override
public String toString() {
return "1";
}
static ObjectColor getColor(Game game, Ability source) {
ExileZone exileZone = game
.getExile()
.getExileZone(CardUtil.getExileZoneId(
game,
source.getSourceId(),
game.getState().getZoneChangeCounter(source.getSourceId()) - 2
));
return exileZone == null ? null : exileZone
.getCards(game)
.stream()
.map(card -> card.getColor(game))
.reduce(new ObjectColor(), ObjectColor::union);
}
}
enum SunbirdEffigyHint implements Hint {
instance;
@Override
public String getText(Game game, Ability ability) {
ObjectColor color = SunbirdEffigyValue.getColor(game, ability);
if (color == null) {
return null;
}
if (color.isColorless()) {
return "No colors among exiled cards.";
}
return color
.getColors()
.stream()
.map(ObjectColor::getDescription)
.collect(Collectors.joining(", ", "Colors among exiled cards: ", ""));
}
@Override
public Hint copy() {
return this;
}
}
class SunbirdEffigyEffect extends ManaEffect {
SunbirdEffigyEffect() {
super();
staticText = "for each color among the exiled cards used to craft {this}, add one mana of that color";
}
private SunbirdEffigyEffect(final SunbirdEffigyEffect effect) {
super(effect);
}
@Override
public SunbirdEffigyEffect copy() {
return new SunbirdEffigyEffect(this);
}
@Override
public Mana produceMana(Game game, Ability source) {
Mana mana = new Mana();
if (game == null) {
return mana;
}
ExileZone exileZone = game
.getExile()
.getExileZone(CardUtil.getExileZoneId(game, source, -2));
if (exileZone == null) {
return mana;
}
ObjectColor color = exileZone
.getCards(game)
.stream()
.map(card -> card.getColor(game))
.reduce(new ObjectColor(), ObjectColor::union);
if (color.isWhite()) {
mana.increaseWhite();
}
if (color.isBlue()) {
mana.increaseBlue();
}
if (color.isBlack()) {
mana.increaseBlack();
}
if (color.isRed()) {
mana.increaseRed();
}
if (color.isGreen()) {
mana.increaseGreen();
}
return mana;
}
}

View file

@ -1,30 +1,76 @@
package mage.cards.s;
import mage.Mana;
import mage.ObjectColor;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.continuous.SetBasePowerToughnessSourceEffect;
import mage.abilities.effects.mana.ManaEffect;
import mage.abilities.hint.Hint;
import mage.abilities.keyword.CraftAbility;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.keyword.VigilanceAbility;
import mage.abilities.mana.AnyColorManaAbility;
import mage.cards.CardImpl;
import mage.abilities.mana.SimpleManaAbility;
import mage.cards.Card;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.game.ExileZone;
import mage.game.Game;
import mage.util.CardUtil;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
import java.util.stream.Collectors;
/**
* @author TheElk801
*/
public final class SunbirdStandard extends CardImpl {
public final class SunbirdStandard extends TransformingDoubleFacedCard {
public SunbirdStandard(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}");
this.secondSideCardClazz = mage.cards.s.SunbirdEffigy.class;
super(ownerId, setInfo,
new CardType[]{CardType.ARTIFACT}, new SubType[]{}, "{3}",
"Sunbird Effigy",
new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, new SubType[]{SubType.BIRD, SubType.CONSTRUCT}, ""
);
// {T}: Add one mana of any color.
this.addAbility(new AnyColorManaAbility());
this.getLeftHalfCard().addAbility(new AnyColorManaAbility());
// Craft with one or more {5}
this.addAbility(new CraftAbility(
this.getLeftHalfCard().addAbility(new CraftAbility(
"{5}", "one or more", "other permanents " +
"you control and/or cards in your graveyard", 1, Integer.MAX_VALUE
));
// Sunbird Effigy
this.getRightHalfCard().setPT(0, 0);
// Flying
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
// Vigilance
this.getRightHalfCard().addAbility(VigilanceAbility.getInstance());
// Haste
this.getRightHalfCard().addAbility(HasteAbility.getInstance());
// Sunbird Effigy's power and toughness are each equal to the number of colors among the exiled cards used to craft it.
this.getRightHalfCard().addAbility(new SimpleStaticAbility(
Zone.ALL, new SetBasePowerToughnessSourceEffect(SunbirdEffigyValue.instance)
).addHint(SunbirdEffigyHint.instance));
// {T}: For each color among the exiled cards used to craft Sunbird Effigy, add one mana of that color.
this.getRightHalfCard().addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new SunbirdEffigyEffect(), new TapSourceCost()));
}
private SunbirdStandard(final SunbirdStandard card) {
@ -36,3 +82,132 @@ public final class SunbirdStandard extends CardImpl {
return new SunbirdStandard(this);
}
}
enum SunbirdEffigyValue implements DynamicValue {
instance;
@Override
public int calculate(Game game, Ability sourceAbility, Effect effect) {
return Optional
.ofNullable(getColor(game, sourceAbility))
.filter(Objects::nonNull)
.map(ObjectColor::getColorCount)
.orElse(0);
}
@Override
public SunbirdEffigyValue copy() {
return this;
}
@Override
public String getMessage() {
return "colors among the exiled cards used to craft it";
}
@Override
public String toString() {
return "1";
}
static ObjectColor getColor(Game game, Ability source) {
Card sourceCard = game.getCard(source.getSourceId());
if (sourceCard == null) {
return null;
}
ExileZone exileZone = game
.getExile()
.getExileZone(CardUtil.getExileZoneId(
game,
sourceCard.getMainCard().getId(),
sourceCard.getMainCard().getZoneChangeCounter(game) - 1
));
return exileZone == null ? null : exileZone
.getCards(game)
.stream()
.map(card -> card.getColor(game))
.reduce(new ObjectColor(), ObjectColor::union);
}
}
enum SunbirdEffigyHint implements Hint {
instance;
@Override
public String getText(Game game, Ability ability) {
ObjectColor color = SunbirdEffigyValue.getColor(game, ability);
if (color == null) {
return null;
}
if (color.isColorless()) {
return "No colors among exiled cards.";
}
return color
.getColors()
.stream()
.map(ObjectColor::getDescription)
.collect(Collectors.joining(", ", "Colors among exiled cards: ", ""));
}
@Override
public Hint copy() {
return this;
}
}
class SunbirdEffigyEffect extends ManaEffect {
SunbirdEffigyEffect() {
super();
staticText = "for each color among the exiled cards used to craft {this}, add one mana of that color";
}
private SunbirdEffigyEffect(final SunbirdEffigyEffect effect) {
super(effect);
}
@Override
public SunbirdEffigyEffect copy() {
return new SunbirdEffigyEffect(this);
}
@Override
public Mana produceMana(Game game, Ability source) {
Mana mana = new Mana();
if (game == null) {
return mana;
}
Card sourceCard = game.getCard(source.getSourceId());
if (sourceCard == null) {
return mana;
}
ExileZone exileZone = game
.getExile()
.getExileZone(CardUtil.getExileZoneId(game, sourceCard.getMainCard().getId(),
sourceCard.getMainCard().getZoneChangeCounter(game) - 1));
if (exileZone == null) {
return mana;
}
ObjectColor color = exileZone
.getCards(game)
.stream()
.map(card -> card.getColor(game))
.reduce(new ObjectColor(), ObjectColor::union);
if (color.isWhite()) {
mana.increaseWhite();
}
if (color.isBlue()) {
mana.increaseBlue();
}
if (color.isBlack()) {
mana.increaseBlack();
}
if (color.isRed()) {
mana.increaseRed();
}
if (color.isGreen()) {
mana.increaseGreen();
}
return mana;
}
}

View file

@ -1,12 +1,13 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.DrawDiscardControllerEffect;
import mage.abilities.keyword.CantBeBlockedSourceAbility;
import mage.abilities.keyword.DayboundAbility;
import mage.cards.CardImpl;
import mage.abilities.keyword.NightboundAbility;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
@ -15,28 +16,42 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class SuspiciousStowaway extends CardImpl {
public final class SuspiciousStowaway extends TransformingDoubleFacedCard {
public SuspiciousStowaway(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}");
super(ownerId, setInfo,
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.ROGUE, SubType.WEREWOLF}, "{1}{U}",
"Seafaring Werewolf",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "G"
);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.ROGUE);
this.subtype.add(SubType.WEREWOLF);
this.power = new MageInt(1);
this.toughness = new MageInt(1);
this.secondSideCardClazz = mage.cards.s.SeafaringWerewolf.class;
// Suspicious Stowaway
this.getLeftHalfCard().setPT(1, 1);
// Suspicious Stowaway can't be blocked.
this.addAbility(new CantBeBlockedSourceAbility());
this.getLeftHalfCard().addAbility(new CantBeBlockedSourceAbility());
// Whenever Suspicious Stowaway deals combat damage to a player, draw a card, then discard a card.
this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(
this.getLeftHalfCard().addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(
new DrawDiscardControllerEffect(1, 1), false
));
// Daybound
this.addAbility(new DayboundAbility());
this.getLeftHalfCard().addAbility(new DayboundAbility());
// Seafaring Werewolf
this.getRightHalfCard().setPT(2, 1);
// Seafaring Werewolf can't be blocked.
this.getRightHalfCard().addAbility(new CantBeBlockedSourceAbility());
// Whenever Seafaring Werewolf deals combat damage to a player, draw a card.
this.getRightHalfCard().addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(
new DrawCardSourceControllerEffect(1), false
));
// Nightbound
this.getRightHalfCard().addAbility(new NightboundAbility());
}
private SuspiciousStowaway(final SuspiciousStowaway card) {

View file

@ -1,69 +0,0 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.TransformIntoSourceTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.keyword.CantBeBlockedSourceAbility;
import mage.abilities.keyword.ProtectionAbility;
import mage.abilities.triggers.BeginningOfFirstMainTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.filter.FilterCard;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.ColorlessPredicate;
import mage.target.common.TargetControlledCreaturePermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class SyggWanderbrineShield extends CardImpl {
private static final FilterCard filter = new FilterCard("each color");
static {
filter.add(Predicates.not(ColorlessPredicate.instance));
}
public SyggWanderbrineShield(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.MERFOLK);
this.subtype.add(SubType.ROGUE);
this.power = new MageInt(2);
this.toughness = new MageInt(2);
this.color.setWhite(true);
this.nightCard = true;
// Sygg can't be blocked.
this.addAbility(new CantBeBlockedSourceAbility());
// Whenever this creature transforms into Sygg, Wanderbrine Shield, target creature you control gains protection from each color until your next turn.
Ability ability = new TransformIntoSourceTriggeredAbility(new GainAbilityTargetEffect(new ProtectionAbility(filter)));
ability.addTarget(new TargetControlledCreaturePermanent());
this.addAbility(ability);
// At the beginning of your first main phase, you may pay {U}. If you do, transform Sygg.
this.addAbility(new BeginningOfFirstMainTriggeredAbility(
new DoIfCostPaid(new TransformSourceEffect(), new ManaCostsImpl<>("{U}"))
));
}
private SyggWanderbrineShield(final SyggWanderbrineShield card) {
super(card);
}
@Override
public SyggWanderbrineShield copy() {
return new SyggWanderbrineShield(this);
}
}

View file

@ -1,8 +1,8 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.DealsCombatDamageToAPlayerOrPlaneswalkerTriggeredAbility;
import mage.abilities.common.TransformIntoSourceTriggeredAbility;
import mage.abilities.common.TransformsOrEntersTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.DoIfCostPaid;
@ -10,14 +10,18 @@ import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.keyword.CantBeBlockedSourceAbility;
import mage.abilities.keyword.TransformAbility;
import mage.abilities.keyword.ProtectionAbility;
import mage.abilities.triggers.BeginningOfFirstMainTriggeredAbility;
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.FilterCard;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.ColorlessPredicate;
import mage.target.common.TargetControlledCreaturePermanent;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
@ -25,20 +29,26 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class SyggWanderwineWisdom extends CardImpl {
public final class SyggWanderwineWisdom extends TransformingDoubleFacedCard {
private static final FilterCard filter = new FilterCard("each color");
static {
filter.add(Predicates.not(ColorlessPredicate.instance));
}
public SyggWanderwineWisdom(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}");
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.MERFOLK, SubType.WIZARD}, "{1}{U}",
"Sygg, Wanderbrine Shield",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.MERFOLK, SubType.ROGUE}, "W"
);
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.MERFOLK);
this.subtype.add(SubType.WIZARD);
this.power = new MageInt(2);
this.toughness = new MageInt(2);
this.secondSideCardClazz = mage.cards.s.SyggWanderbrineShield.class;
// Sygg, Wanderwine Wisdom
this.getLeftHalfCard().setPT(2, 2);
// Sygg can't be blocked.
this.addAbility(new CantBeBlockedSourceAbility());
this.getLeftHalfCard().addAbility(new CantBeBlockedSourceAbility());
// Whenever this creature enters or transforms into Sygg, Wanderwine Wisdom, target creature gains "Whenever this creature deals combat damage to a player or planeswalker, draw a card" until end of turn.
Ability ability = new TransformsOrEntersTriggeredAbility(new GainAbilityTargetEffect(
@ -47,13 +57,28 @@ public final class SyggWanderwineWisdom extends CardImpl {
), Duration.EndOfTurn
), false);
ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability);
this.getLeftHalfCard().addAbility(ability);
// At the beginning of your first main phase, you may pay {W}. If you do, transform Sygg.
this.addAbility(new TransformAbility());
this.addAbility(new BeginningOfFirstMainTriggeredAbility(
this.getLeftHalfCard().addAbility(new BeginningOfFirstMainTriggeredAbility(
new DoIfCostPaid(new TransformSourceEffect(), new ManaCostsImpl<>("{W}"))
));
// Sygg, Wanderbrine Shield
this.getRightHalfCard().setPT(2, 2);
// Sygg can't be blocked.
this.getRightHalfCard().addAbility(new CantBeBlockedSourceAbility());
// Whenever this creature transforms into Sygg, Wanderbrine Shield, target creature you control gains protection from each color until your next turn.
Ability ability2 = new TransformIntoSourceTriggeredAbility(new GainAbilityTargetEffect(new ProtectionAbility(filter), Duration.UntilYourNextTurn));
ability2.addTarget(new TargetControlledCreaturePermanent());
this.getRightHalfCard().addAbility(ability2);
// At the beginning of your first main phase, you may pay {U}. If you do, transform Sygg.
this.getRightHalfCard().addAbility(new BeginningOfFirstMainTriggeredAbility(
new DoIfCostPaid(new TransformSourceEffect(), new ManaCostsImpl<>("{U}"))
));
}
private SyggWanderwineWisdom(final SyggWanderwineWisdom card) {

View file

@ -1,114 +0,0 @@
package mage.cards.t;
import mage.abilities.Ability;
import mage.abilities.common.SagaAbility;
import mage.abilities.dynamicvalue.common.StaticValue;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.abilities.effects.common.ExileSourceAndReturnFaceUpEffect;
import mage.abilities.effects.common.MillCardsEachPlayerEffect;
import mage.abilities.effects.common.discard.DiscardEachPlayerEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.Cards;
import mage.cards.CardsImpl;
import mage.constants.*;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.players.Player;
import mage.target.common.TargetCreatureOrPlaneswalker;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer;
import java.util.Collection;
import java.util.Objects;
import java.util.UUID;
import java.util.stream.Collectors;
/**
* @author TheElk801
*/
public final class TheTrueScriptures extends CardImpl {
public TheTrueScriptures(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "");
this.subtype.add(SubType.SAGA);
this.color.setBlack(true);
this.nightCard = true;
// (As this Saga enters and after your draw step, add a lore counter.)
SagaAbility sagaAbility = new SagaAbility(this);
// I -- For each opponent, destroy up to one target creature or planeswalker that player controls.
sagaAbility.addChapterEffect(
this, SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_I, false,
ability -> {
ability.addEffect(new DestroyTargetEffect().setTargetPointer(new EachTargetPointer())
.setText("for each opponent, destroy up to one target creature or planeswalker that player controls"));
ability.addTarget(new TargetCreatureOrPlaneswalker(0,1));
ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
}
);
// II -- Each opponent discards three cards, then mills three cards.
sagaAbility.addChapterEffect(
this, SagaChapter.CHAPTER_II,
new DiscardEachPlayerEffect(StaticValue.get(3), false, TargetController.OPPONENT),
new MillCardsEachPlayerEffect(3, TargetController.OPPONENT).setText(", then mills three cards")
);
// III -- Put all creature cards from all graveyards onto the battlefield under your control. Exile The True Scriptures, then return it to the battlefield.
sagaAbility.addChapterEffect(
this, SagaChapter.CHAPTER_III,
new TheTrueScripturesEffect(),
new ExileSourceAndReturnFaceUpEffect()
);
this.addAbility(sagaAbility);
}
private TheTrueScriptures(final TheTrueScriptures card) {
super(card);
}
@Override
public TheTrueScriptures copy() {
return new TheTrueScriptures(this);
}
}
class TheTrueScripturesEffect extends OneShotEffect {
TheTrueScripturesEffect() {
super(Outcome.Benefit);
staticText = "put all creature cards from all graveyards onto the battlefield under your control";
}
private TheTrueScripturesEffect(final TheTrueScripturesEffect effect) {
super(effect);
}
@Override
public TheTrueScripturesEffect copy() {
return new TheTrueScripturesEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
if (player == null) {
return false;
}
Cards cards = new CardsImpl(game
.getState()
.getPlayersInRange(source.getControllerId(), game)
.stream()
.map(game::getPlayer)
.filter(Objects::nonNull)
.map(Player::getGraveyard)
.map(gy -> gy.getCards(StaticFilters.FILTER_CARD_CREATURE, game))
.flatMap(Collection::stream)
.collect(Collectors.toList()));
return player.moveCards(cards, Zone.BATTLEFIELD, source, game);
}
}

View file

@ -1,50 +0,0 @@
package mage.cards.v;
import mage.Mana;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.dynamicvalue.common.ArtifactYouControlCount;
import mage.abilities.effects.mana.DynamicManaEffect;
import mage.abilities.hint.common.ArtifactYouControlHint;
import mage.abilities.mana.AnyColorManaAbility;
import mage.abilities.mana.SimpleManaAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SuperType;
import mage.constants.Zone;
import java.util.UUID;
/**
* @author LevelX2
*/
public final class VaultOfCatlacan extends CardImpl {
public VaultOfCatlacan(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
this.supertype.add(SuperType.LEGENDARY);
this.nightCard = true;
// <i>(Transforms from Storm the Vault.)</i>
// {T}: Add one mana of any color.
this.addAbility(new AnyColorManaAbility());
// {T}: Add {U} for each artifact you control.
this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD,
new DynamicManaEffect(Mana.BlueMana(1), ArtifactYouControlCount.instance),
new TapSourceCost())
.addHint(ArtifactYouControlHint.instance));
}
private VaultOfCatlacan(final VaultOfCatlacan card) {
super(card);
}
@Override
public VaultOfCatlacan copy() {
return new VaultOfCatlacan(this);
}
}

View file

@ -1,61 +0,0 @@
package mage.cards.w;
import mage.MageInt;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.common.WerewolfBackTriggeredAbility;
import mage.abilities.condition.common.NotTransformedCondition;
import mage.abilities.decorator.ConditionalContinuousEffect;
import mage.abilities.dynamicvalue.common.CardsInAllHandsCount;
import mage.abilities.effects.common.continuous.SetBasePowerToughnessSourceEffect;
import mage.abilities.keyword.TrampleAbility;
import mage.abilities.keyword.VigilanceAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
import java.util.UUID;
/**
* @author fireshoes
*/
public final class WerewolfOfAncientHunger extends CardImpl {
public WerewolfOfAncientHunger(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.WEREWOLF);
this.power = new MageInt(0);
this.toughness = new MageInt(0);
this.color.setGreen(true);
this.nightCard = true;
// Vigilance
this.addAbility(VigilanceAbility.getInstance());
// Trample
this.addAbility(TrampleAbility.getInstance());
// Werewolf of Ancient Hunger's power and toughness are each equal to the total number of cards in all players' hands.
this.addAbility(new SimpleStaticAbility(
Zone.ALL,
new ConditionalContinuousEffect(
new SetBasePowerToughnessSourceEffect(CardsInAllHandsCount.instance), NotTransformedCondition.instance,
"{this}'s power and toughness are each equal to the total number of cards in all players' hands"
)
));
// At the beginning of each upkeep, if a player cast two or more spells last turn, transform Werewolf of Ancient Hunger.
this.addAbility(new WerewolfBackTriggeredAbility());
}
private WerewolfOfAncientHunger(final WerewolfOfAncientHunger card) {
super(card);
}
@Override
public WerewolfOfAncientHunger copy() {
return new WerewolfOfAncientHunger(this);
}
}

View file

@ -1,50 +0,0 @@
package mage.cards.w;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.continuous.BoostEquippedEffect;
import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
import mage.abilities.keyword.DoubleStrikeAbility;
import mage.abilities.keyword.EquipAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.AttachmentType;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class WorldChampionCelestialWeapon extends CardImpl {
public WorldChampionCelestialWeapon(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.EQUIPMENT);
this.nightCard = true;
this.color.setRed(true);
// Double Overdrive -- Equipped creature gets +2/+0 and has double strike.
Ability ability = new SimpleStaticAbility(new BoostEquippedEffect(2, 0));
ability.addEffect(new GainAbilityAttachedEffect(
DoubleStrikeAbility.getInstance(), AttachmentType.EQUIPMENT
).setText("and has double strike"));
this.addAbility(ability.withFlavorWord("Double Overdrive"));
// Equip {3}
this.addAbility(new EquipAbility(3));
}
private WorldChampionCelestialWeapon(final WorldChampionCelestialWeapon card) {
super(card);
}
@Override
public WorldChampionCelestialWeapon copy() {
return new WorldChampionCelestialWeapon(this);
}
}

View file

@ -1,65 +0,0 @@
package mage.cards.y;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.TapSourceEffect;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.keyword.IndestructibleAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.filter.FilterPermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.AnotherPredicate;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class YiazmatUltimateMark extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent("another creature or artifact");
static {
filter.add(AnotherPredicate.instance);
filter.add(Predicates.or(
CardType.CREATURE.getPredicate(),
CardType.ARTIFACT.getPredicate()
));
}
public YiazmatUltimateMark(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.DRAGON);
this.power = new MageInt(5);
this.toughness = new MageInt(6);
this.nightCard = true;
this.color.setBlack(true);
// {1}{B}, Sacrifice another creature or artifact: Yiazmat gains indestructible until end of turn. Tap it.
Ability ability = new SimpleActivatedAbility(
new GainAbilitySourceEffect(IndestructibleAbility.getInstance(), Duration.EndOfTurn), new ManaCostsImpl<>("{1}{B}")
);
ability.addCost(new SacrificeTargetCost(filter));
ability.addEffect(new TapSourceEffect().setText("tap it"));
this.addAbility(ability);
}
private YiazmatUltimateMark(final YiazmatUltimateMark card) {
super(card);
}
@Override
public YiazmatUltimateMark copy() {
return new YiazmatUltimateMark(this);
}
}

View file

@ -96,7 +96,6 @@ public final class DarkAscension extends ExpansionSet {
cards.add(new SetCardInfo("Gavony Ironwright", 9, Rarity.UNCOMMON, mage.cards.g.GavonyIronwright.class));
cards.add(new SetCardInfo("Geralf's Messenger", 63, Rarity.RARE, mage.cards.g.GeralfsMessenger.class));
cards.add(new SetCardInfo("Geralf's Mindcrusher", 37, Rarity.RARE, mage.cards.g.GeralfsMindcrusher.class));
cards.add(new SetCardInfo("Ghastly Haunting", 50, Rarity.UNCOMMON, mage.cards.g.GhastlyHaunting.class));
cards.add(new SetCardInfo("Ghoultree", 115, Rarity.RARE, mage.cards.g.Ghoultree.class));
cards.add(new SetCardInfo("Grafdigger's Cage", 149, Rarity.RARE, mage.cards.g.GrafdiggersCage.class));
cards.add(new SetCardInfo("Gravecrawler", 64, Rarity.RARE, mage.cards.g.Gravecrawler.class));
@ -139,7 +138,6 @@ public final class DarkAscension extends ExpansionSet {
cards.add(new SetCardInfo("Midnight Guard", 14, Rarity.COMMON, mage.cards.m.MidnightGuard.class));
cards.add(new SetCardInfo("Mikaeus, the Unhallowed", 70, Rarity.MYTHIC, mage.cards.m.MikaeusTheUnhallowed.class));
cards.add(new SetCardInfo("Mondronen Shaman", 98, Rarity.RARE, mage.cards.m.MondronenShaman.class));
cards.add(new SetCardInfo("Moonscarred Werewolf", 125, Rarity.COMMON, mage.cards.m.MoonscarredWerewolf.class));
cards.add(new SetCardInfo("Moonveil Dragon", 99, Rarity.MYTHIC, mage.cards.m.MoonveilDragon.class));
cards.add(new SetCardInfo("Mystic Retrieval", 42, Rarity.UNCOMMON, mage.cards.m.MysticRetrieval.class));
cards.add(new SetCardInfo("Nearheath Stalker", 100, Rarity.COMMON, mage.cards.n.NearheathStalker.class));

View file

@ -104,7 +104,6 @@ public final class EldritchMoon extends ExpansionSet {
cards.add(new SetCardInfo("Emrakul's Influence", 157, Rarity.UNCOMMON, mage.cards.e.EmrakulsInfluence.class));
cards.add(new SetCardInfo("Emrakul, the Promised End", 6, Rarity.MYTHIC, mage.cards.e.EmrakulThePromisedEnd.class));
cards.add(new SetCardInfo("Enlightened Maniac", 58, Rarity.COMMON, mage.cards.e.EnlightenedManiac.class));
cards.add(new SetCardInfo("Erupting Dreadwolf", 142, Rarity.UNCOMMON, mage.cards.e.EruptingDreadwolf.class));
cards.add(new SetCardInfo("Eternal Scourge", 7, Rarity.RARE, mage.cards.e.EternalScourge.class));
cards.add(new SetCardInfo("Extricator of Sin", 23, Rarity.UNCOMMON, mage.cards.e.ExtricatorOfSin.class));
cards.add(new SetCardInfo("Exultant Cultist", 59, Rarity.COMMON, mage.cards.e.ExultantCultist.class));
@ -142,7 +141,6 @@ public final class EldritchMoon extends ExpansionSet {
cards.add(new SetCardInfo("Harmless Offering", 131, Rarity.RARE, mage.cards.h.HarmlessOffering.class));
cards.add(new SetCardInfo("Haunted Dead", 92, Rarity.UNCOMMON, mage.cards.h.HauntedDead.class));
cards.add(new SetCardInfo("Heron's Grace Champion", 185, Rarity.RARE, mage.cards.h.HeronsGraceChampion.class));
cards.add(new SetCardInfo("Howling Chorus", 168, Rarity.UNCOMMON, mage.cards.h.HowlingChorus.class));
cards.add(new SetCardInfo("Identity Thief", 64, Rarity.RARE, mage.cards.i.IdentityThief.class));
cards.add(new SetCardInfo("Impetuous Devils", 132, Rarity.RARE, mage.cards.i.ImpetuousDevils.class));
cards.add(new SetCardInfo("Imprisoned in the Moon", 65, Rarity.RARE, mage.cards.i.ImprisonedInTheMoon.class));

View file

@ -74,7 +74,6 @@ public final class FinalFantasy extends ExpansionSet {
cards.add(new SetCardInfo("Battle Menu", 9, Rarity.UNCOMMON, mage.cards.b.BattleMenu.class));
cards.add(new SetCardInfo("Beatrix, Loyal General", 426, Rarity.RARE, mage.cards.b.BeatrixLoyalGeneral.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Beatrix, Loyal General", 554, Rarity.RARE, mage.cards.b.BeatrixLoyalGeneral.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Black Chocobo", 201, Rarity.UNCOMMON, mage.cards.b.BlackChocobo.class));
cards.add(new SetCardInfo("Black Mage's Rod", 90, Rarity.COMMON, mage.cards.b.BlackMagesRod.class));
cards.add(new SetCardInfo("Black Waltz No. 3", 214, Rarity.UNCOMMON, mage.cards.b.BlackWaltzNo3.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Black Waltz No. 3", 478, Rarity.UNCOMMON, mage.cards.b.BlackWaltzNo3.class, NON_FULL_USE_VARIOUS));
@ -137,14 +136,11 @@ public final class FinalFantasy extends ExpansionSet {
cards.add(new SetCardInfo("Coliseum Behemoth", 181, Rarity.UNCOMMON, mage.cards.c.ColiseumBehemoth.class));
cards.add(new SetCardInfo("Combat Tutorial", 48, Rarity.COMMON, mage.cards.c.CombatTutorial.class));
cards.add(new SetCardInfo("Commune with Beavers", 182, Rarity.COMMON, mage.cards.c.CommuneWithBeavers.class));
cards.add(new SetCardInfo("Cooking Campsite", 31, Rarity.UNCOMMON, mage.cards.c.CookingCampsite.class));
cards.add(new SetCardInfo("Coral Sword", 134, Rarity.UNCOMMON, mage.cards.c.CoralSword.class));
cards.add(new SetCardInfo("Cornered by Black Mages", 93, Rarity.COMMON, mage.cards.c.CorneredByBlackMages.class));
cards.add(new SetCardInfo("Crossroads Village", 276, Rarity.COMMON, mage.cards.c.CrossroadsVillage.class));
cards.add(new SetCardInfo("Crystal Fragments", 13, Rarity.UNCOMMON, mage.cards.c.CrystalFragments.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Crystal Fragments", 357, Rarity.UNCOMMON, mage.cards.c.CrystalFragments.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Crystallized Serah", 240, Rarity.RARE, mage.cards.c.CrystallizedSerah.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Crystallized Serah", 506, Rarity.RARE, mage.cards.c.CrystallizedSerah.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Dark Confidant", 334, Rarity.MYTHIC, mage.cards.d.DarkConfidant.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Dark Confidant", 94, Rarity.MYTHIC, mage.cards.d.DarkConfidant.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Dark Knight's Greatsword", 95, Rarity.UNCOMMON, mage.cards.d.DarkKnightsGreatsword.class));
@ -316,7 +312,6 @@ public final class FinalFantasy extends ExpansionSet {
cards.add(new SetCardInfo("Machinist's Arsenal", 23, Rarity.RARE, mage.cards.m.MachinistsArsenal.class));
cards.add(new SetCardInfo("Magic Damper", 61, Rarity.COMMON, mage.cards.m.MagicDamper.class));
cards.add(new SetCardInfo("Magic Pot", 263, Rarity.COMMON, mage.cards.m.MagicPot.class));
cards.add(new SetCardInfo("Magicked Card", 73, Rarity.UNCOMMON, mage.cards.m.MagickedCard.class));
cards.add(new SetCardInfo("Magitek Armor", 24, Rarity.UNCOMMON, mage.cards.m.MagitekArmor.class));
cards.add(new SetCardInfo("Magitek Infantry", 25, Rarity.COMMON, mage.cards.m.MagitekInfantry.class));
cards.add(new SetCardInfo("Magitek Scythe", 562, Rarity.RARE, mage.cards.m.MagitekScythe.class));
@ -425,11 +420,6 @@ public final class FinalFantasy extends ExpansionSet {
cards.add(new SetCardInfo("Sephiroth, Fabled SOLDIER", 382, Rarity.MYTHIC, mage.cards.s.SephirothFabledSOLDIER.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Sephiroth, Fabled SOLDIER", 451, Rarity.MYTHIC, mage.cards.s.SephirothFabledSOLDIER.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Sephiroth, Fabled SOLDIER", 527, Rarity.MYTHIC, mage.cards.s.SephirothFabledSOLDIER.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Sephiroth, One-Winged Angel", 115, Rarity.MYTHIC, mage.cards.s.SephirothOneWingedAngel.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Sephiroth, One-Winged Angel", 317, Rarity.MYTHIC, mage.cards.s.SephirothOneWingedAngel.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Sephiroth, One-Winged Angel", 382, Rarity.MYTHIC, mage.cards.s.SephirothOneWingedAngel.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Sephiroth, One-Winged Angel", 451, Rarity.MYTHIC, mage.cards.s.SephirothOneWingedAngel.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Sephiroth, One-Winged Angel", 527, Rarity.MYTHIC, mage.cards.s.SephirothOneWingedAngel.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Sephiroth, Planet's Heir", 505, Rarity.MYTHIC, mage.cards.s.SephirothPlanetsHeir.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Sephiroth, Planet's Heir", 553, Rarity.MYTHIC, mage.cards.s.SephirothPlanetsHeir.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Serah Farron", 240, Rarity.RARE, mage.cards.s.SerahFarron.class, NON_FULL_USE_VARIOUS));
@ -615,15 +605,12 @@ public final class FinalFantasy extends ExpansionSet {
cards.add(new SetCardInfo("White Auracite", 579, Rarity.COMMON, mage.cards.w.WhiteAuracite.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("White Mage's Staff", 42, Rarity.COMMON, mage.cards.w.WhiteMagesStaff.class));
cards.add(new SetCardInfo("Windurst, Federation Center", 292, Rarity.COMMON, mage.cards.w.WindurstFederationCenter.class));
cards.add(new SetCardInfo("World Champion, Celestial Weapon", 158, Rarity.UNCOMMON, mage.cards.w.WorldChampionCelestialWeapon.class));
cards.add(new SetCardInfo("World Map", 270, Rarity.COMMON, mage.cards.w.WorldMap.class));
cards.add(new SetCardInfo("Xande, Dark Mage", 516, Rarity.RARE, mage.cards.x.XandeDarkMage.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Xande, Dark Mage", 561, Rarity.RARE, mage.cards.x.XandeDarkMage.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Y'shtola Rhul", 443, Rarity.MYTHIC, mage.cards.y.YshtolaRhul.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Y'shtola Rhul", 577, Rarity.MYTHIC, mage.cards.y.YshtolaRhul.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Y'shtola Rhul", 86, Rarity.MYTHIC, mage.cards.y.YshtolaRhul.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Yiazmat, Ultimate Mark", 119, Rarity.UNCOMMON, mage.cards.y.YiazmatUltimateMark.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Yiazmat, Ultimate Mark", 453, Rarity.UNCOMMON, mage.cards.y.YiazmatUltimateMark.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("You're Not Alone", 44, Rarity.COMMON, mage.cards.y.YoureNotAlone.class));
cards.add(new SetCardInfo("Yuna, Hope of Spira", 250, Rarity.MYTHIC, mage.cards.y.YunaHopeOfSpira.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Yuna, Hope of Spira", 404, Rarity.MYTHIC, mage.cards.y.YunaHopeOfSpira.class, NON_FULL_USE_VARIOUS));

View file

@ -259,7 +259,6 @@ public final class Innistrad extends ExpansionSet {
cards.add(new SetCardInfo("Spider Spawning", 203, Rarity.UNCOMMON, mage.cards.s.SpiderSpawning.class));
cards.add(new SetCardInfo("Spidery Grasp", 204, Rarity.COMMON, mage.cards.s.SpideryGrasp.class));
cards.add(new SetCardInfo("Splinterfright", 205, Rarity.RARE, mage.cards.s.Splinterfright.class));
cards.add(new SetCardInfo("Stalking Vampire", 114, Rarity.UNCOMMON, mage.cards.s.StalkingVampire.class));
cards.add(new SetCardInfo("Stensia Bloodhall", 247, Rarity.RARE, mage.cards.s.StensiaBloodhall.class));
cards.add(new SetCardInfo("Stitched Drake", 80, Rarity.COMMON, mage.cards.s.StitchedDrake.class));
cards.add(new SetCardInfo("Stitcher's Apprentice", 81, Rarity.COMMON, mage.cards.s.StitchersApprentice.class));

View file

@ -109,7 +109,6 @@ public final class InnistradCrimsonVow extends ExpansionSet {
cards.add(new SetCardInfo("Change of Fortune", 375, Rarity.RARE, mage.cards.c.ChangeOfFortune.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Child of the Pack", 234, Rarity.UNCOMMON, mage.cards.c.ChildOfThePack.class));
cards.add(new SetCardInfo("Chill of the Grave", 51, Rarity.COMMON, mage.cards.c.ChillOfTheGrave.class));
cards.add(new SetCardInfo("Cipherbound Spirit", 79, Rarity.UNCOMMON, mage.cards.c.CipherboundSpirit.class));
cards.add(new SetCardInfo("Circle of Confinement", 329, Rarity.UNCOMMON, mage.cards.c.CircleOfConfinement.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Circle of Confinement", 7, Rarity.UNCOMMON, mage.cards.c.CircleOfConfinement.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Cloaked Cadet", 192, Rarity.UNCOMMON, mage.cards.c.CloakedCadet.class));

View file

@ -48,7 +48,6 @@ public final class InnistradDoubleFeature extends ExpansionSet {
cards.add(new SetCardInfo("Arm the Cathars", 270, Rarity.UNCOMMON, mage.cards.a.ArmTheCathars.class));
cards.add(new SetCardInfo("Arrogant Outlaw", 84, Rarity.COMMON, mage.cards.a.ArrogantOutlaw.class));
cards.add(new SetCardInfo("Ascendant Packleader", 453, Rarity.RARE, mage.cards.a.AscendantPackleader.class));
cards.add(new SetCardInfo("Ashmouth Dragon", 159, Rarity.RARE, mage.cards.a.AshmouthDragon.class));
cards.add(new SetCardInfo("Augur of Autumn", 168, Rarity.RARE, mage.cards.a.AugurOfAutumn.class));
cards.add(new SetCardInfo("Avabruck Caretaker", 454, Rarity.MYTHIC, mage.cards.a.AvabruckCaretaker.class));
cards.add(new SetCardInfo("Baithook Angler", 42, Rarity.COMMON, mage.cards.b.BaithookAngler.class));
@ -118,7 +117,6 @@ public final class InnistradDoubleFeature extends ExpansionSet {
cards.add(new SetCardInfo("Chaplain of Alms", 13, Rarity.UNCOMMON, mage.cards.c.ChaplainOfAlms.class));
cards.add(new SetCardInfo("Child of the Pack", 501, Rarity.UNCOMMON, mage.cards.c.ChildOfThePack.class));
cards.add(new SetCardInfo("Chill of the Grave", 318, Rarity.COMMON, mage.cards.c.ChillOfTheGrave.class));
cards.add(new SetCardInfo("Cipherbound Spirit", 346, Rarity.UNCOMMON, mage.cards.c.CipherboundSpirit.class));
cards.add(new SetCardInfo("Circle of Confinement", 274, Rarity.UNCOMMON, mage.cards.c.CircleOfConfinement.class));
cards.add(new SetCardInfo("Clarion Cathars", 14, Rarity.COMMON, mage.cards.c.ClarionCathars.class));
cards.add(new SetCardInfo("Clear Shot", 176, Rarity.UNCOMMON, mage.cards.c.ClearShot.class));
@ -436,7 +434,6 @@ public final class InnistradDoubleFeature extends ExpansionSet {
cards.add(new SetCardInfo("Sawblade Slinger", 484, Rarity.UNCOMMON, mage.cards.s.SawbladeSlinger.class));
cards.add(new SetCardInfo("Scattered Thoughts", 341, Rarity.COMMON, mage.cards.s.ScatteredThoughts.class));
cards.add(new SetCardInfo("Screaming Swarm", 342, Rarity.UNCOMMON, mage.cards.s.ScreamingSwarm.class));
cards.add(new SetCardInfo("Seafaring Werewolf", 80, Rarity.RARE, mage.cards.s.SeafaringWerewolf.class));
cards.add(new SetCardInfo("Search Party Captain", 32, Rarity.COMMON, mage.cards.s.SearchPartyCaptain.class));
cards.add(new SetCardInfo("Secrets of the Key", 73, Rarity.COMMON, mage.cards.s.SecretsOfTheKey.class));
cards.add(new SetCardInfo("Seize the Storm", 158, Rarity.UNCOMMON, mage.cards.s.SeizeTheStorm.class));
@ -471,13 +468,11 @@ public final class InnistradDoubleFeature extends ExpansionSet {
cards.add(new SetCardInfo("Soul-Guide Gryff", 35, Rarity.COMMON, mage.cards.s.SoulGuideGryff.class));
cards.add(new SetCardInfo("Soulcipher Board", 346, Rarity.UNCOMMON, mage.cards.s.SoulcipherBoard.class));
cards.add(new SetCardInfo("Spectral Adversary", 77, Rarity.MYTHIC, mage.cards.s.SpectralAdversary.class));
cards.add(new SetCardInfo("Spellrune Howler", 160, Rarity.UNCOMMON, mage.cards.s.SpellruneHowler.class));
cards.add(new SetCardInfo("Spellrune Painter", 160, Rarity.UNCOMMON, mage.cards.s.SpellrunePainter.class));
cards.add(new SetCardInfo("Spiked Ripsaw", 487, Rarity.UNCOMMON, mage.cards.s.SpikedRipsaw.class));
cards.add(new SetCardInfo("Splendid Reclamation", 488, Rarity.RARE, mage.cards.s.SplendidReclamation.class));
cards.add(new SetCardInfo("Spore Crawler", 489, Rarity.COMMON, mage.cards.s.SporeCrawler.class));
cards.add(new SetCardInfo("Sporeback Wolf", 490, Rarity.COMMON, mage.cards.s.SporebackWolf.class));
cards.add(new SetCardInfo("Stalking Predator", 120, Rarity.COMMON, mage.cards.s.StalkingPredator.class));
cards.add(new SetCardInfo("Startle", 78, Rarity.COMMON, mage.cards.s.Startle.class));
cards.add(new SetCardInfo("Steelclad Spirit", 347, Rarity.COMMON, mage.cards.s.SteelcladSpirit.class));
cards.add(new SetCardInfo("Stensia Uprising", 445, Rarity.RARE, mage.cards.s.StensiaUprising.class));

View file

@ -51,8 +51,6 @@ public final class InnistradMidnightHunt extends ExpansionSet {
cards.add(new SetCardInfo("Arlinn, the Pack's Hope", 279, Rarity.MYTHIC, mage.cards.a.ArlinnThePacksHope.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Arlinn, the Pack's Hope", 307, Rarity.MYTHIC, mage.cards.a.ArlinnThePacksHope.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Arrogant Outlaw", 84, Rarity.COMMON, mage.cards.a.ArrogantOutlaw.class));
cards.add(new SetCardInfo("Ashmouth Dragon", 159, Rarity.RARE, mage.cards.a.AshmouthDragon.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ashmouth Dragon", 358, Rarity.RARE, mage.cards.a.AshmouthDragon.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Augur of Autumn", 168, Rarity.RARE, mage.cards.a.AugurOfAutumn.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Augur of Autumn", 360, Rarity.RARE, mage.cards.a.AugurOfAutumn.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Baithook Angler", 42, Rarity.COMMON, mage.cards.b.BaithookAngler.class));
@ -332,8 +330,6 @@ public final class InnistradMidnightHunt extends ExpansionSet {
cards.add(new SetCardInfo("Sacred Fire", 239, Rarity.UNCOMMON, mage.cards.s.SacredFire.class));
cards.add(new SetCardInfo("Saryth, the Viper's Fang", 197, Rarity.RARE, mage.cards.s.SarythTheVipersFang.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Saryth, the Viper's Fang", 304, Rarity.RARE, mage.cards.s.SarythTheVipersFang.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Seafaring Werewolf", 288, Rarity.RARE, mage.cards.s.SeafaringWerewolf.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Seafaring Werewolf", 80, Rarity.RARE, mage.cards.s.SeafaringWerewolf.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Search Party Captain", 32, Rarity.COMMON, mage.cards.s.SearchPartyCaptain.class));
cards.add(new SetCardInfo("Secrets of the Key", 73, Rarity.COMMON, mage.cards.s.SecretsOfTheKey.class));
cards.add(new SetCardInfo("Seize the Storm", 158, Rarity.UNCOMMON, mage.cards.s.SeizeTheStorm.class));
@ -366,12 +362,8 @@ public final class InnistradMidnightHunt extends ExpansionSet {
cards.add(new SetCardInfo("Soul-Guide Gryff", 35, Rarity.COMMON, mage.cards.s.SoulGuideGryff.class));
cards.add(new SetCardInfo("Spectral Adversary", 341, Rarity.MYTHIC, mage.cards.s.SpectralAdversary.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Spectral Adversary", 77, Rarity.MYTHIC, mage.cards.s.SpectralAdversary.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Spellrune Howler", 160, Rarity.UNCOMMON, mage.cards.s.SpellruneHowler.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Spellrune Howler", 295, Rarity.UNCOMMON, mage.cards.s.SpellruneHowler.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Spellrune Painter", 160, Rarity.UNCOMMON, mage.cards.s.SpellrunePainter.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Spellrune Painter", 295, Rarity.UNCOMMON, mage.cards.s.SpellrunePainter.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Stalking Predator", 120, Rarity.COMMON, mage.cards.s.StalkingPredator.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Stalking Predator", 291, Rarity.COMMON, mage.cards.s.StalkingPredator.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Startle", 78, Rarity.COMMON, mage.cards.s.Startle.class));
cards.add(new SetCardInfo("Stolen Vitality", 161, Rarity.COMMON, mage.cards.s.StolenVitality.class));
cards.add(new SetCardInfo("Storm Skreelix", 243, Rarity.UNCOMMON, mage.cards.s.StormSkreelix.class));

View file

@ -114,8 +114,6 @@ public class InnistradRemastered extends ExpansionSet {
cards.add(new SetCardInfo("Chalice of Life", 471, Rarity.UNCOMMON, mage.cards.c.ChaliceOfLife.class, RETRO_ART_USE_VARIOUS));
cards.add(new SetCardInfo("Chandra, Dressed to Kill", 148, Rarity.MYTHIC, mage.cards.c.ChandraDressedToKill.class));
cards.add(new SetCardInfo("Chittering Host", "123b", Rarity.COMMON, mage.cards.c.ChitteringHost.class));
cards.add(new SetCardInfo("Cipherbound Spirit", 459, Rarity.UNCOMMON, mage.cards.c.CipherboundSpirit.class, RETRO_ART_USE_VARIOUS));
cards.add(new SetCardInfo("Cipherbound Spirit", 85, Rarity.UNCOMMON, mage.cards.c.CipherboundSpirit.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Clear Shot", 188, Rarity.UNCOMMON, mage.cards.c.ClearShot.class));
cards.add(new SetCardInfo("Cobbled Lancer", 56, Rarity.UNCOMMON, mage.cards.c.CobbledLancer.class));
cards.add(new SetCardInfo("Cobbled Wings", 258, Rarity.COMMON, mage.cards.c.CobbledWings.class));
@ -185,8 +183,6 @@ public class InnistradRemastered extends ExpansionSet {
cards.add(new SetCardInfo("Emrakul, the Promised End", 481, Rarity.MYTHIC, mage.cards.e.EmrakulThePromisedEnd.class, FULL_ART_USE_VARIOUS));
cards.add(new SetCardInfo("Emrakul, the Promised End", 5, Rarity.MYTHIC, mage.cards.e.EmrakulThePromisedEnd.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Epitaph Golem", 262, Rarity.COMMON, mage.cards.e.EpitaphGolem.class));
cards.add(new SetCardInfo("Erupting Dreadwolf", 171, Rarity.UNCOMMON, mage.cards.e.EruptingDreadwolf.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Erupting Dreadwolf", 465, Rarity.UNCOMMON, mage.cards.e.EruptingDreadwolf.class, RETRO_ART_USE_VARIOUS));
cards.add(new SetCardInfo("Essence Flux", 354, Rarity.COMMON, mage.cards.e.EssenceFlux.class, RETRO_ART_USE_VARIOUS));
cards.add(new SetCardInfo("Essence Flux", 64, Rarity.COMMON, mage.cards.e.EssenceFlux.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Evolving Wilds", 278, Rarity.COMMON, mage.cards.e.EvolvingWilds.class));
@ -264,8 +260,6 @@ public class InnistradRemastered extends ExpansionSet {
cards.add(new SetCardInfo("Honeymoon Hearse", 159, Rarity.UNCOMMON, mage.cards.h.HoneymoonHearse.class));
cards.add(new SetCardInfo("Hopeful Initiate", 27, Rarity.RARE, mage.cards.h.HopefulInitiate.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Hopeful Initiate", 343, Rarity.RARE, mage.cards.h.HopefulInitiate.class, RETRO_ART_USE_VARIOUS));
cards.add(new SetCardInfo("Howling Chorus", 214, Rarity.UNCOMMON, mage.cards.h.HowlingChorus.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Howling Chorus", 469, Rarity.UNCOMMON, mage.cards.h.HowlingChorus.class, RETRO_ART_USE_VARIOUS));
cards.add(new SetCardInfo("Howlpack of Estwald", 224, Rarity.COMMON, mage.cards.h.HowlpackOfEstwald.class));
cards.add(new SetCardInfo("Howlpack Resurgence", 204, Rarity.UNCOMMON, mage.cards.h.HowlpackResurgence.class));
cards.add(new SetCardInfo("Hullbreaker Horror", 303, Rarity.RARE, mage.cards.h.HullbreakerHorror.class, NON_FULL_USE_VARIOUS));
@ -342,8 +336,6 @@ public class InnistradRemastered extends ExpansionSet {
cards.add(new SetCardInfo("Moonlight Hunt", 209, Rarity.UNCOMMON, mage.cards.m.MoonlightHunt.class));
cards.add(new SetCardInfo("Moonrise Intruder", 179, Rarity.COMMON, mage.cards.m.MoonriseIntruder.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Moonrise Intruder", 466, Rarity.COMMON, mage.cards.m.MoonriseIntruder.class, RETRO_ART_USE_VARIOUS));
cards.add(new SetCardInfo("Moonscarred Werewolf", 212, Rarity.COMMON, mage.cards.m.MoonscarredWerewolf.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Moonscarred Werewolf", 468, Rarity.COMMON, mage.cards.m.MoonscarredWerewolf.class, RETRO_ART_USE_VARIOUS));
cards.add(new SetCardInfo("Morbid Opportunist", 124, Rarity.UNCOMMON, mage.cards.m.MorbidOpportunist.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Morbid Opportunist", 388, Rarity.UNCOMMON, mage.cards.m.MorbidOpportunist.class, RETRO_ART_USE_VARIOUS));
cards.add(new SetCardInfo("Morkrut Banshee", 125, Rarity.UNCOMMON, mage.cards.m.MorkrutBanshee.class));

View file

@ -47,7 +47,6 @@ public final class Ixalan extends ExpansionSet {
cards.add(new SetCardInfo("Ashes of the Abhorrent", 2, Rarity.RARE, mage.cards.a.AshesOfTheAbhorrent.class));
cards.add(new SetCardInfo("Atzocan Archer", 176, Rarity.UNCOMMON, mage.cards.a.AtzocanArcher.class));
cards.add(new SetCardInfo("Axis of Mortality", 3, Rarity.MYTHIC, mage.cards.a.AxisOfMortality.class));
cards.add(new SetCardInfo("Azcanta, the Sunken Ruin", 74, Rarity.RARE, mage.cards.a.AzcantaTheSunkenRuin.class));
cards.add(new SetCardInfo("Belligerent Brontodon", 218, Rarity.UNCOMMON, mage.cards.b.BelligerentBrontodon.class));
cards.add(new SetCardInfo("Bellowing Aegisaur", 4, Rarity.UNCOMMON, mage.cards.b.BellowingAegisaur.class));
cards.add(new SetCardInfo("Bishop of Rebirth", 5, Rarity.RARE, mage.cards.b.BishopOfRebirth.class));

View file

@ -28,7 +28,6 @@ public class IxalanPromos extends ExpansionSet {
cards.add(new SetCardInfo("Ashes of the Abhorrent", "2p", Rarity.RARE, mage.cards.a.AshesOfTheAbhorrent.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ashes of the Abhorrent", "2s", Rarity.RARE, mage.cards.a.AshesOfTheAbhorrent.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Axis of Mortality", "3s", Rarity.MYTHIC, mage.cards.a.AxisOfMortality.class));
cards.add(new SetCardInfo("Azcanta, the Sunken Ruin", "74s", Rarity.RARE, mage.cards.a.AzcantaTheSunkenRuin.class));
cards.add(new SetCardInfo("Bishop of Rebirth", 5, Rarity.RARE, mage.cards.b.BishopOfRebirth.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Bishop of Rebirth", "5s", Rarity.RARE, mage.cards.b.BishopOfRebirth.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Bloodcrazed Paladin", "93s", Rarity.RARE, mage.cards.b.BloodcrazedPaladin.class));

View file

@ -49,8 +49,6 @@ public final class LorwynEclipsed extends ExpansionSet {
cards.add(new SetCardInfo("Overgrown Tomb", 350, Rarity.RARE, mage.cards.o.OvergrownTomb.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Steam Vents", 267, Rarity.RARE, mage.cards.s.SteamVents.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Steam Vents", 348, Rarity.RARE, mage.cards.s.SteamVents.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Sygg, Wanderbrine Shield", 288, Rarity.RARE, mage.cards.s.SyggWanderbrineShield.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Sygg, Wanderbrine Shield", 76, Rarity.RARE, mage.cards.s.SyggWanderbrineShield.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Sygg, Wanderwine Wisdom", 288, Rarity.RARE, mage.cards.s.SyggWanderwineWisdom.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Sygg, Wanderwine Wisdom", 76, Rarity.RARE, mage.cards.s.SyggWanderwineWisdom.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Temple Garden", 268, Rarity.RARE, mage.cards.t.TempleGarden.class, NON_FULL_USE_VARIOUS));

View file

@ -174,7 +174,6 @@ public class MagicOnlinePromos extends ExpansionSet {
cards.add(new SetCardInfo("Ashiok, Dream Render", 72259, Rarity.UNCOMMON, mage.cards.a.AshiokDreamRender.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ashiok, Dream Render", 77993, Rarity.UNCOMMON, mage.cards.a.AshiokDreamRender.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ashiok, Nightmare Muse", 79847, Rarity.MYTHIC, mage.cards.a.AshiokNightmareMuse.class));
cards.add(new SetCardInfo("Ashmouth Dragon", 94012, Rarity.RARE, mage.cards.a.AshmouthDragon.class));
cards.add(new SetCardInfo("Ashnod the Uncaring", 105806, Rarity.MYTHIC, mage.cards.a.AshnodTheUncaring.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ashnod the Uncaring", 105808, Rarity.MYTHIC, mage.cards.a.AshnodTheUncaring.class, RETRO_ART_USE_VARIOUS));
cards.add(new SetCardInfo("Ashnod, Flesh Mechanist", 105688, Rarity.RARE, mage.cards.a.AshnodFleshMechanist.class));

View file

@ -153,7 +153,6 @@ public final class MarchOfTheMachine extends ExpansionSet {
cards.add(new SetCardInfo("Furnace Gremlin", 139, Rarity.UNCOMMON, mage.cards.f.FurnaceGremlin.class));
cards.add(new SetCardInfo("Furnace Host Charger", 140, Rarity.COMMON, mage.cards.f.FurnaceHostCharger.class));
cards.add(new SetCardInfo("Furnace Reins", 141, Rarity.UNCOMMON, mage.cards.f.FurnaceReins.class));
cards.add(new SetCardInfo("Furnace-Blessed Conqueror", 38, Rarity.UNCOMMON, mage.cards.f.FurnaceBlessedConqueror.class));
cards.add(new SetCardInfo("Furtive Analyst", 59, Rarity.COMMON, mage.cards.f.FurtiveAnalyst.class));
cards.add(new SetCardInfo("Ghalta and Mavren", 225, Rarity.RARE, mage.cards.g.GhaltaAndMavren.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ghalta and Mavren", 307, Rarity.RARE, mage.cards.g.GhaltaAndMavren.class, NON_FULL_USE_VARIOUS));
@ -344,7 +343,6 @@ public final class MarchOfTheMachine extends ExpansionSet {
cards.add(new SetCardInfo("Seedpod Caretaker", 325, Rarity.UNCOMMON, mage.cards.s.SeedpodCaretaker.class));
cards.add(new SetCardInfo("Seer of Stolen Sight", 330, Rarity.UNCOMMON, mage.cards.s.SeerOfStolenSight.class));
cards.add(new SetCardInfo("Seraph of New Capenna", 36, Rarity.UNCOMMON, mage.cards.s.SeraphOfNewCapenna.class));
cards.add(new SetCardInfo("Seraph of New Phyrexia", 36, Rarity.UNCOMMON, mage.cards.s.SeraphOfNewPhyrexia.class));
cards.add(new SetCardInfo("Serpent-Blade Assailant", 205, Rarity.COMMON, mage.cards.s.SerpentBladeAssailant.class));
cards.add(new SetCardInfo("Shatter the Source", 164, Rarity.COMMON, mage.cards.s.ShatterTheSource.class));
cards.add(new SetCardInfo("Sheoldred", 125, Rarity.MYTHIC, mage.cards.s.Sheoldred.class, NON_FULL_USE_VARIOUS));
@ -354,7 +352,6 @@ public final class MarchOfTheMachine extends ExpansionSet {
cards.add(new SetCardInfo("Sigiled Sentinel", 37, Rarity.COMMON, mage.cards.s.SigiledSentinel.class));
cards.add(new SetCardInfo("Skittering Surveyor", 264, Rarity.COMMON, mage.cards.s.SkitteringSurveyor.class));
cards.add(new SetCardInfo("Skyclave Aerialist", 78, Rarity.UNCOMMON, mage.cards.s.SkyclaveAerialist.class));
cards.add(new SetCardInfo("Skyclave Invader", 78, Rarity.UNCOMMON, mage.cards.s.SkyclaveInvader.class));
cards.add(new SetCardInfo("Stasis Field", 79, Rarity.COMMON, mage.cards.s.StasisField.class));
cards.add(new SetCardInfo("Stoke the Flames", 166, Rarity.UNCOMMON, mage.cards.s.StokeTheFlames.class));
cards.add(new SetCardInfo("Storm the Seedcore", 206, Rarity.UNCOMMON, mage.cards.s.StormTheSeedcore.class));
@ -389,9 +386,6 @@ public final class MarchOfTheMachine extends ExpansionSet {
cards.add(new SetCardInfo("The Great Work", 169, Rarity.MYTHIC, mage.cards.t.TheGreatWork.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Great Work", 299, Rarity.MYTHIC, mage.cards.t.TheGreatWork.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Great Work", 341, Rarity.MYTHIC, mage.cards.t.TheGreatWork.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The True Scriptures", 125, Rarity.MYTHIC, mage.cards.t.TheTrueScriptures.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The True Scriptures", 297, Rarity.MYTHIC, mage.cards.t.TheTrueScriptures.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The True Scriptures", 340, Rarity.MYTHIC, mage.cards.t.TheTrueScriptures.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Thornwood Falls", 274, Rarity.COMMON, mage.cards.t.ThornwoodFalls.class));
cards.add(new SetCardInfo("Thrashing Frontliner", 167, Rarity.COMMON, mage.cards.t.ThrashingFrontliner.class));
cards.add(new SetCardInfo("Thunderhead Squadron", 81, Rarity.COMMON, mage.cards.t.ThunderheadSquadron.class));

View file

@ -229,7 +229,6 @@ public final class RivalsOfIxalan extends ExpansionSet {
cards.add(new SetCardInfo("Twilight Prophet", 88, Rarity.MYTHIC, mage.cards.t.TwilightProphet.class));
cards.add(new SetCardInfo("Vampire Champion", 198, Rarity.COMMON, mage.cards.v.VampireChampion.class));
cards.add(new SetCardInfo("Vampire Revenant", 89, Rarity.COMMON, mage.cards.v.VampireRevenant.class));
cards.add(new SetCardInfo("Vault of Catlacan", 173, Rarity.RARE, mage.cards.v.VaultOfCatlacan.class));
cards.add(new SetCardInfo("Vona's Hunger", 90, Rarity.RARE, mage.cards.v.VonasHunger.class));
cards.add(new SetCardInfo("Voracious Vampire", 91, Rarity.COMMON, mage.cards.v.VoraciousVampire.class));
cards.add(new SetCardInfo("Vraska, Scheming Gorgon", 197, Rarity.MYTHIC, mage.cards.v.VraskaSchemingGorgon.class));

View file

@ -103,7 +103,6 @@ public class RivalsOfIxalanPromos extends ExpansionSet {
cards.add(new SetCardInfo("Tomb Robber", "87s", Rarity.RARE, mage.cards.t.TombRobber.class));
cards.add(new SetCardInfo("Trapjaw Tyrant", "29s", Rarity.MYTHIC, mage.cards.t.TrapjawTyrant.class));
cards.add(new SetCardInfo("Twilight Prophet", "88s", Rarity.MYTHIC, mage.cards.t.TwilightProphet.class));
cards.add(new SetCardInfo("Vault of Catlacan", "173s", Rarity.RARE, mage.cards.v.VaultOfCatlacan.class));
cards.add(new SetCardInfo("Vona's Hunger", "90p", Rarity.RARE, mage.cards.v.VonasHunger.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Vona's Hunger", "90s", Rarity.RARE, mage.cards.v.VonasHunger.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Warkite Marauder", "60p", Rarity.RARE, mage.cards.w.WarkiteMarauder.class, NON_FULL_USE_VARIOUS));

View file

@ -1461,7 +1461,6 @@ public class SecretLairDrop extends ExpansionSet {
cards.add(new SetCardInfo("Time Stop", "1500*", Rarity.RARE, mage.cards.t.TimeStop.class, FULL_ART_USE_VARIOUS));
cards.add(new SetCardInfo("Lara Croft, Tomb Raider", 1501, Rarity.MYTHIC, mage.cards.l.LaraCroftTombRaider.class));
cards.add(new SetCardInfo("Search for Azcanta", 1502, Rarity.RARE, mage.cards.s.SearchForAzcanta.class));
cards.add(new SetCardInfo("Azcanta, the Sunken Ruin", 1502, Rarity.RARE, mage.cards.a.AzcantaTheSunkenRuin.class));
cards.add(new SetCardInfo("Anger of the Gods", 1503, Rarity.RARE, mage.cards.a.AngerOfTheGods.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Bow of Nylea", 1504, Rarity.RARE, mage.cards.b.BowOfNylea.class));
cards.add(new SetCardInfo("Shadowspear", 1505, Rarity.RARE, mage.cards.s.Shadowspear.class));

View file

@ -220,7 +220,6 @@ public final class ShadowsOverInnistrad extends ExpansionSet {
cards.add(new SetCardInfo("Odric, Lunarch Marshal", 31, Rarity.RARE, mage.cards.o.OdricLunarchMarshal.class));
cards.add(new SetCardInfo("Olivia's Bloodsworn", 127, Rarity.UNCOMMON, mage.cards.o.OliviasBloodsworn.class));
cards.add(new SetCardInfo("Olivia, Mobilized for War", 248, Rarity.MYTHIC, mage.cards.o.OliviaMobilizedForWar.class));
cards.add(new SetCardInfo("One of the Pack", 229, Rarity.COMMON, mage.cards.o.OneOfThePack.class));
cards.add(new SetCardInfo("Ongoing Investigation", 77, Rarity.UNCOMMON, mage.cards.o.OngoingInvestigation.class));
cards.add(new SetCardInfo("Open the Armory", 32, Rarity.UNCOMMON, mage.cards.o.OpenTheArmory.class));
cards.add(new SetCardInfo("Ormendahl, Profane Prince", 281, Rarity.RARE, mage.cards.o.OrmendahlProfanePrince.class));
@ -272,7 +271,6 @@ public final class ShadowsOverInnistrad extends ExpansionSet {
cards.add(new SetCardInfo("Sinister Concoction", 135, Rarity.UNCOMMON, mage.cards.s.SinisterConcoction.class));
cards.add(new SetCardInfo("Skeleton Key", 263, Rarity.UNCOMMON, mage.cards.s.SkeletonKey.class));
cards.add(new SetCardInfo("Skin Invasion", 182, Rarity.UNCOMMON, mage.cards.s.SkinInvasion.class));
cards.add(new SetCardInfo("Skin Shedder", 182, Rarity.UNCOMMON, mage.cards.s.SkinShedder.class));
cards.add(new SetCardInfo("Slayer's Plate", 264, Rarity.RARE, mage.cards.s.SlayersPlate.class));
cards.add(new SetCardInfo("Sleep Paralysis", 87, Rarity.COMMON, mage.cards.s.SleepParalysis.class));
cards.add(new SetCardInfo("Solitary Hunter", 229, Rarity.COMMON, mage.cards.s.SolitaryHunter.class));
@ -341,7 +339,6 @@ public final class ShadowsOverInnistrad extends ExpansionSet {
cards.add(new SetCardInfo("Watcher in the Web", 239, Rarity.COMMON, mage.cards.w.WatcherInTheWeb.class));
cards.add(new SetCardInfo("Weirding Wood", 240, Rarity.UNCOMMON, mage.cards.w.WeirdingWood.class));
cards.add(new SetCardInfo("Welcome to the Fold", 96, Rarity.RARE, mage.cards.w.WelcomeToTheFold.class));
cards.add(new SetCardInfo("Werewolf of Ancient Hunger", 225, Rarity.RARE, mage.cards.w.WerewolfOfAncientHunger.class));
cards.add(new SetCardInfo("Westvale Abbey", 281, Rarity.RARE, mage.cards.w.WestvaleAbbey.class));
cards.add(new SetCardInfo("Wicker Witch", 268, Rarity.COMMON, mage.cards.w.WickerWitch.class));
cards.add(new SetCardInfo("Wild-Field Scarecrow", 269, Rarity.UNCOMMON, mage.cards.w.WildFieldScarecrow.class));

View file

@ -110,7 +110,6 @@ public class ShadowsOverInnistradPromos extends ExpansionSet {
cards.add(new SetCardInfo("Triskaidekaphobia", "141s", Rarity.RARE, mage.cards.t.Triskaidekaphobia.class));
cards.add(new SetCardInfo("Ulvenwald Hydra", "235s", Rarity.MYTHIC, mage.cards.u.UlvenwaldHydra.class));
cards.add(new SetCardInfo("Welcome to the Fold", "96s", Rarity.RARE, mage.cards.w.WelcomeToTheFold.class));
cards.add(new SetCardInfo("Werewolf of Ancient Hunger", "225s", Rarity.RARE, mage.cards.w.WerewolfOfAncientHunger.class));
cards.add(new SetCardInfo("Westvale Abbey", "281s", Rarity.RARE, mage.cards.w.WestvaleAbbey.class));
cards.add(new SetCardInfo("Wolf of Devil's Breach", "192s", Rarity.MYTHIC, mage.cards.w.WolfOfDevilsBreach.class));
}

View file

@ -167,7 +167,6 @@ public class ShadowsOverInnistradRemastered extends ExpansionSet {
cards.add(new SetCardInfo("Highland Lake", 272, Rarity.UNCOMMON, mage.cards.h.HighlandLake.class));
cards.add(new SetCardInfo("Hinterland Logger", 201, Rarity.COMMON, mage.cards.h.HinterlandLogger.class));
cards.add(new SetCardInfo("Hope Against Hope", 33, Rarity.UNCOMMON, mage.cards.h.HopeAgainstHope.class));
cards.add(new SetCardInfo("Howling Chorus", 214, Rarity.UNCOMMON, mage.cards.h.HowlingChorus.class));
cards.add(new SetCardInfo("Howlpack Resurgence", 202, Rarity.UNCOMMON, mage.cards.h.HowlpackResurgence.class));
cards.add(new SetCardInfo("Howlpack Wolf", 162, Rarity.COMMON, mage.cards.h.HowlpackWolf.class));
cards.add(new SetCardInfo("Humble the Brute", 34, Rarity.UNCOMMON, mage.cards.h.HumbleTheBrute.class));
@ -323,7 +322,6 @@ public class ShadowsOverInnistradRemastered extends ExpansionSet {
cards.add(new SetCardInfo("Voracious Reader", 58, Rarity.UNCOMMON, mage.cards.v.VoraciousReader.class));
cards.add(new SetCardInfo("Weirded Vampire", 139, Rarity.COMMON, mage.cards.w.WeirdedVampire.class));
cards.add(new SetCardInfo("Weirding Wood", 226, Rarity.COMMON, mage.cards.w.WeirdingWood.class));
cards.add(new SetCardInfo("Werewolf of Ancient Hunger", 211, Rarity.RARE, mage.cards.w.WerewolfOfAncientHunger.class));
cards.add(new SetCardInfo("Westvale Abbey", 275, Rarity.RARE, mage.cards.w.WestvaleAbbey.class));
cards.add(new SetCardInfo("Wharf Infiltrator", 96, Rarity.RARE, mage.cards.w.WharfInfiltrator.class));
cards.add(new SetCardInfo("Wild-Field Scarecrow", 263, Rarity.COMMON, mage.cards.w.WildFieldScarecrow.class));

View file

@ -261,7 +261,6 @@ public final class TheLostCavernsOfIxalan extends ExpansionSet {
cards.add(new SetCardInfo("Marauding Brinefang", 64, Rarity.COMMON, mage.cards.m.MaraudingBrinefang.class));
cards.add(new SetCardInfo("Market Gnome", 22, Rarity.UNCOMMON, mage.cards.m.MarketGnome.class));
cards.add(new SetCardInfo("Master's Guide-Mural", 233, Rarity.UNCOMMON, mage.cards.m.MastersGuideMural.class));
cards.add(new SetCardInfo("Mastercraft Raptor", 164, Rarity.UNCOMMON, mage.cards.m.MastercraftRaptor.class));
cards.add(new SetCardInfo("Matzalantli, the Great Door", 256, Rarity.RARE, mage.cards.m.MatzalantliTheGreatDoor.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Matzalantli, the Great Door", 387, Rarity.RARE, mage.cards.m.MatzalantliTheGreatDoor.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Mephitic Draught", 112, Rarity.COMMON, mage.cards.m.MephiticDraught.class));
@ -387,7 +386,6 @@ public final class TheLostCavernsOfIxalan extends ExpansionSet {
cards.add(new SetCardInfo("Stinging Cave Crawler", 124, Rarity.UNCOMMON, mage.cards.s.StingingCaveCrawler.class));
cards.add(new SetCardInfo("Subterranean Schooner", 365, Rarity.RARE, mage.cards.s.SubterraneanSchooner.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Subterranean Schooner", 80, Rarity.RARE, mage.cards.s.SubterraneanSchooner.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Sunbird Effigy", 262, Rarity.UNCOMMON, mage.cards.s.SunbirdEffigy.class));
cards.add(new SetCardInfo("Sunbird Standard", 262, Rarity.UNCOMMON, mage.cards.s.SunbirdStandard.class));
cards.add(new SetCardInfo("Sunfire Torch", 167, Rarity.COMMON, mage.cards.s.SunfireTorch.class));
cards.add(new SetCardInfo("Sunken Citadel", 285, Rarity.RARE, mage.cards.s.SunkenCitadel.class, NON_FULL_USE_VARIOUS));

View file

@ -29,10 +29,8 @@ public final class Transformers extends ExpansionSet {
cards.add(new SetCardInfo("Optimus Prime, Hero", 13, Rarity.MYTHIC, mage.cards.o.OptimusPrimeHero.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Optimus Prime, Hero", 27, Rarity.MYTHIC, mage.cards.o.OptimusPrimeHero.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ratchet, Field Medic", 2, Rarity.MYTHIC, mage.cards.r.RatchetFieldMedic.class));
cards.add(new SetCardInfo("Slicer, High-Speed Antagonist", 6, Rarity.MYTHIC, mage.cards.s.SlicerHighSpeedAntagonist.class));
cards.add(new SetCardInfo("Slicer, Hired Muscle", 6, Rarity.MYTHIC, mage.cards.s.SlicerHiredMuscle.class));
cards.add(new SetCardInfo("Starscream, Power Hungry", 5, Rarity.MYTHIC, mage.cards.s.StarscreamPowerHungry.class));
cards.add(new SetCardInfo("Starscream, Seeker Leader", 5, Rarity.MYTHIC, mage.cards.s.StarscreamSeekerLeader.class));
cards.add(new SetCardInfo("Ultra Magnus, Armored Carrier", 15, Rarity.MYTHIC, mage.cards.u.UltraMagnusArmoredCarrier.class));
cards.add(new SetCardInfo("Ultra Magnus, Tactician", 15, Rarity.MYTHIC, mage.cards.u.UltraMagnusTactician.class));
}

View file

@ -21,7 +21,6 @@ public class XLNTreasureChest extends ExpansionSet {
this.hasBasicLands = false;
cards.add(new SetCardInfo("Arguel's Blood Fast", 90, Rarity.RARE, mage.cards.a.ArguelsBloodFast.class));
cards.add(new SetCardInfo("Azcanta, the Sunken Ruin", 74, Rarity.RARE, mage.cards.a.AzcantaTheSunkenRuin.class));
cards.add(new SetCardInfo("Conqueror's Galleon", 234, Rarity.RARE, mage.cards.c.ConquerorsGalleon.class));
cards.add(new SetCardInfo("Dowsing Dagger", 235, Rarity.RARE, mage.cards.d.DowsingDagger.class));
cards.add(new SetCardInfo("Growing Rites of Itlimoc", 191, Rarity.RARE, mage.cards.g.GrowingRitesOfItlimoc.class));

View file

@ -0,0 +1,67 @@
package org.mage.test.cards.single.lci;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author Jmlundeen
*/
public class SaheelisLatticeTest extends CardTestPlayerBase {
/*
Saheeli's Lattice
{1}{R}
Artifact
When Saheeli's Lattice enters the battlefield, you may discard a card. If you do, draw two cards.
Craft with one or more Dinosaurs {4}{R}
Mastercraft Raptor
Artifact Creature - Dinosaur
Mastercraft Raptor's power is equal to the total power of the exiled cards used to craft it.
0/4
*/
private static final String saheelisLattice = "Saheeli's Lattice";
private static final String mastercraftRaptor = "Mastercraft Raptor";
/*
Balamb T-Rexaur
{4}{G}{G}
Creature - Dinosaur
Trample
When this creature enters, you gain 3 life.
Forestcycling {2}
6/6
*/
private static final String balambTRexaur = "Balamb T-Rexaur";
/*
Zetalpa, Primal Dawn
{6}{W}{W}
Legendary Creature - Elder Dinosaur
Flying, double strike, vigilance, trample, indestructible
4/8
*/
private static final String zetalpaPrimalDawn = "Zetalpa, Primal Dawn";
@Test
public void testSaheelisLattice() {
addCard(Zone.BATTLEFIELD, playerA, saheelisLattice);
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 5);
addCard(Zone.GRAVEYARD, playerA, balambTRexaur);
addCard(Zone.GRAVEYARD, playerA, zetalpaPrimalDawn);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Craft with one");
addTarget(playerA, balambTRexaur + "^" + zetalpaPrimalDawn);
setStrictChooseMode(true);
setStopAt(1, PhaseStep.PRECOMBAT_MAIN);
execute();
assertPermanentCount(playerA, mastercraftRaptor, 1);
assertPowerToughness(playerA, mastercraftRaptor, 6 + 4, 4);
assertExileCount(playerA, balambTRexaur, 1);
assertExileCount(playerA, zetalpaPrimalDawn, 1);
}
}