convert transforming "V" cards to single class file

part of #14099
This commit is contained in:
jmlundeen 2025-12-05 13:48:37 -06:00
parent 59cf680abc
commit e39c0b8852
46 changed files with 566 additions and 1162 deletions

View file

@ -1,51 +0,0 @@
package mage.cards.a;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.TransformIntoSourceTriggeredAbility;
import mage.abilities.effects.common.SacrificeEffect;
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.TargetOpponent;
import java.util.UUID;
/**
* @author fireshoes
*/
public final class AbolisherOfBloodlines extends CardImpl {
public AbolisherOfBloodlines(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.ELDRAZI);
this.subtype.add(SubType.VAMPIRE);
this.power = new MageInt(6);
this.toughness = new MageInt(5);
// this card is the second face of double-faced card
this.nightCard = true;
// Flying
this.addAbility(FlyingAbility.getInstance());
// When this creature transforms into Abolisher of Bloodlines, target opponent sacrifices three creatures.
Ability ability = new TransformIntoSourceTriggeredAbility(new SacrificeEffect(
StaticFilters.FILTER_PERMANENT_CREATURES, 3, "target opponent"
));
ability.addTarget(new TargetOpponent());
this.addAbility(ability);
}
private AbolisherOfBloodlines(final AbolisherOfBloodlines card) {
super(card);
}
@Override
public AbolisherOfBloodlines copy() {
return new AbolisherOfBloodlines(this);
}
}

View file

@ -1,68 +0,0 @@
package mage.cards.b;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.abilities.effects.common.continuous.BecomesCreatureTargetEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.HasteAbility;
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.common.FilterControlledPermanent;
import mage.filter.predicate.permanent.TokenPredicate;
import mage.game.permanent.token.custom.CreatureToken;
import mage.target.TargetPermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class BloodbatSummoner extends CardImpl {
private static final FilterPermanent filter
= new FilterControlledPermanent(SubType.BLOOD, "Blood token you control");
static {
filter.add(TokenPredicate.TRUE);
}
public BloodbatSummoner(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.VAMPIRE);
this.subtype.add(SubType.WIZARD);
this.power = new MageInt(3);
this.toughness = new MageInt(3);
this.color.setBlack(true);
this.nightCard = true;
// Flying
this.addAbility(FlyingAbility.getInstance());
// At the beginning of combat on your turn, up to one target Blood token you control becomes a 2/2 black Bat creature with flying and haste in addition to its other types.
Ability ability = new BeginningOfCombatTriggeredAbility(new BecomesCreatureTargetEffect(
new CreatureToken(2, 2, "", SubType.BAT)
.withAbility(FlyingAbility.getInstance())
.withAbility(HasteAbility.getInstance())
.withColor("B"),
false, false, Duration.Custom
).setText("up to one target Blood token you control becomes a " +
"2/2 black Bat creature with flying and haste in addition to its other types"));
ability.addTarget(new TargetPermanent(0, 1, filter));
this.addAbility(ability);
}
private BloodbatSummoner(final BloodbatSummoner card) {
super(card);
}
@Override
public BloodbatSummoner copy() {
return new BloodbatSummoner(this);
}
}

View file

@ -1,59 +0,0 @@
package mage.cards.d;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.keyword.HasteAbility;
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 mage.target.TargetPlayer;
import mage.target.common.TargetCreaturePermanent;
import mage.target.common.TargetPlaneswalkerPermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class DireStrainAnarchist extends CardImpl {
public DireStrainAnarchist(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(5);
this.color.setRed(true);
this.nightCard = true;
// Menace
this.addAbility(new MenaceAbility(false));
// Haste
this.addAbility(HasteAbility.getInstance());
// Whenever Dire-Strain Anarchist attacks, it deals 2 damage to each of up to one target creature, up to one target player, and/or up to one target planeswalker.
Ability ability = new AttacksTriggeredAbility(new DamageTargetEffect(2).setText("it deals 2 damage to each of up to one target creature, up to one target player, and/or up to one target planeswalker"));
ability.addTarget(new TargetCreaturePermanent(0, 1));
ability.addTarget(new TargetPlayer(0, 1, false));
ability.addTarget(new TargetPlaneswalkerPermanent(0, 1));
this.addAbility(ability);
// Nightbound
this.addAbility(new NightboundAbility());
}
private DireStrainAnarchist(final DireStrainAnarchist card) {
super(card);
}
@Override
public DireStrainAnarchist copy() {
return new DireStrainAnarchist(this);
}
}

View file

@ -1,47 +0,0 @@
package mage.cards.d;
import mage.MageInt;
import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility;
import mage.abilities.effects.common.MillCardsControllerEffect;
import mage.abilities.keyword.MenaceAbility;
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 DreadOsseosaur extends CardImpl {
public DreadOsseosaur(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.DINOSAUR);
this.subtype.add(SubType.SKELETON);
this.subtype.add(SubType.HORROR);
this.power = new MageInt(5);
this.toughness = new MageInt(4);
this.nightCard = true;
this.color.setBlack(true);
// Menace
this.addAbility(new MenaceAbility(false));
// Whenever Dread Osseosaur enters the battlefield or attacks, you may mill two cards.
this.addAbility(new EntersBattlefieldOrAttacksSourceTriggeredAbility(
new MillCardsControllerEffect(2), true
));
}
private DreadOsseosaur(final DreadOsseosaur card) {
super(card);
}
@Override
public DreadOsseosaur copy() {
return new DreadOsseosaur(this);
}
}

View file

@ -1,48 +0,0 @@
package mage.cards.d;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Duration;
import mage.constants.Zone;
/**
*
* @author fireshoes
*/
public final class DronepackKindred extends CardImpl {
public DronepackKindred(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(5);
this.toughness = new MageInt(7);
// this card is the second face of double-faced card
this.nightCard = true;
// Trample
this.addAbility(TrampleAbility.getInstance());
// {1}: Dronepack Kindred gets +1/+0 until end of turn.
this.addAbility(new SimpleActivatedAbility(new BoostSourceEffect(1, 0, Duration.EndOfTurn), new GenericManaCost(1)));
}
private DronepackKindred(final DronepackKindred card) {
super(card);
}
@Override
public DronepackKindred copy() {
return new DronepackKindred(this);
}
}

View file

@ -1,51 +0,0 @@
package mage.cards.g;
import mage.MageInt;
import mage.abilities.common.DiesSourceTriggeredAbility;
import mage.abilities.effects.common.ReturnSourceFromGraveyardToBattlefieldEffect;
import mage.abilities.keyword.LifelinkAbility;
import mage.abilities.keyword.TrampleAbility;
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 TheElk801
*/
public final class GalianBeast extends CardImpl {
public GalianBeast(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.WEREWOLF);
this.subtype.add(SubType.BEAST);
this.power = new MageInt(3);
this.toughness = new MageInt(2);
this.nightCard = true;
this.color.setBlack(true);
// Trample
this.addAbility(TrampleAbility.getInstance());
// Lifelink
this.addAbility(LifelinkAbility.getInstance());
// When Galian Beast dies, return it to the battlefield tapped.
this.addAbility(new DiesSourceTriggeredAbility(new ReturnSourceFromGraveyardToBattlefieldEffect(true)
.setText("return it to the battlefield tapped")));
}
private GalianBeast(final GalianBeast card) {
super(card);
}
@Override
public GalianBeast copy() {
return new GalianBeast(this);
}
}

View file

@ -1,40 +0,0 @@
package mage.cards.h;
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 nantuko
*/
public final class HowlpackOfEstwald extends CardImpl {
public HowlpackOfEstwald(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.WEREWOLF);
this.color.setGreen(true);
// this card is the second face of double-faced card
this.nightCard = true;
this.power = new MageInt(4);
this.toughness = new MageInt(6);
// At the beginning of each upkeep, if a player cast two or more spells last turn, transform Howlpack of Estwald.
this.addAbility(new WerewolfBackTriggeredAbility());
}
private HowlpackOfEstwald(final HowlpackOfEstwald card) {
super(card);
}
@Override
public HowlpackOfEstwald copy() {
return new HowlpackOfEstwald(this);
}
}

View file

@ -1,89 +0,0 @@
package mage.cards.h;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
import mage.abilities.keyword.IndestructibleAbility;
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.counters.CounterType;
import mage.filter.StaticFilters;
import mage.game.Controllable;
import mage.game.Game;
import mage.target.TargetPermanent;
import java.util.Optional;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class HydaelynTheMothercrystal extends CardImpl {
public HydaelynTheMothercrystal(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.GOD);
this.power = new MageInt(4);
this.toughness = new MageInt(4);
this.nightCard = true;
this.color.setWhite(true);
// Indestructible
this.addAbility(IndestructibleAbility.getInstance());
// Blessing of Light -- At the beginning of combat on your turn, put a +1/+1 counter on another target creature you control. Until your next turn, it gains indestructible. If that creature is legendary, draw a card.
Ability ability = new BeginningOfCombatTriggeredAbility(new AddCountersTargetEffect(CounterType.P1P1.createInstance()));
ability.addEffect(new GainAbilityTargetEffect(
IndestructibleAbility.getInstance(), Duration.UntilYourNextTurn
).setText("Until your next turn, it gains indestructible"));
ability.addEffect(new HydaelynTheMothercrystalEffect());
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_ANOTHER_TARGET_CREATURE_YOU_CONTROL));
this.addAbility(ability.withFlavorWord("Blessing of Light"));
}
private HydaelynTheMothercrystal(final HydaelynTheMothercrystal card) {
super(card);
}
@Override
public HydaelynTheMothercrystal copy() {
return new HydaelynTheMothercrystal(this);
}
}
class HydaelynTheMothercrystalEffect extends OneShotEffect {
HydaelynTheMothercrystalEffect() {
super(Outcome.Benefit);
staticText = "If that creature is legendary, draw a card";
}
private HydaelynTheMothercrystalEffect(final HydaelynTheMothercrystalEffect effect) {
super(effect);
}
@Override
public HydaelynTheMothercrystalEffect copy() {
return new HydaelynTheMothercrystalEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
return Optional.ofNullable(getTargetPointer().getFirst(game, source))
.map(game::getPermanent)
.filter(permanent -> permanent.isLegendary(game))
.isPresent()
&& Optional
.ofNullable(source)
.map(Controllable::getControllerId)
.map(game::getPlayer)
.filter(player -> player.drawCards(1, source, game) > 0)
.isPresent();
}
}

View file

@ -1,43 +0,0 @@
package mage.cards.i;
import mage.MageInt;
import mage.abilities.common.WerewolfBackTriggeredAbility;
import mage.abilities.keyword.FirstStrikeAbility;
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 Ironfang extends CardImpl {
public Ironfang(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.WEREWOLF);
this.color.setRed(true);
// this card is the second face of double-faced card
this.nightCard = true;
this.power = new MageInt(3);
this.toughness = new MageInt(1);
this.addAbility(FirstStrikeAbility.getInstance());
// At the beginning of each upkeep, if a player cast two or more spells last turn, transform Ironfang.
this.addAbility(new WerewolfBackTriggeredAbility());
}
private Ironfang(final Ironfang card) {
super(card);
}
@Override
public Ironfang copy() {
return new Ironfang(this);
}
}

View file

@ -1,43 +0,0 @@
package mage.cards.m;
import mage.MageInt;
import mage.abilities.common.WerewolfBackTriggeredAbility;
import mage.abilities.keyword.MenaceAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import java.util.UUID;
/**
* @author fireshoes
*/
public final class MoonriseIntruder extends CardImpl {
public MoonriseIntruder(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(2);
this.color.setRed(true);
// this card is the second face of double-faced card
this.nightCard = true;
// Menace
this.addAbility(new MenaceAbility());
// At the beginning of each upkeep, if a player cast two or more spells last turn, transform Moonrise Intruder.
this.addAbility(new WerewolfBackTriggeredAbility());
}
private MoonriseIntruder(final MoonriseIntruder card) {
super(card);
}
@Override
public MoonriseIntruder copy() {
return new MoonriseIntruder(this);
}
}

View file

@ -1,48 +0,0 @@
package mage.cards.s;
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.DamageTargetEffect;
import mage.abilities.mana.RedManaAbility;
import mage.constants.SuperType;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Zone;
import mage.target.common.TargetAnyTarget;
/**
*
* @author TheElk801
*/
public final class SpitfireBastion extends CardImpl {
public SpitfireBastion(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
this.supertype.add(SuperType.LEGENDARY);
this.nightCard = true;
// {T}: Add {R}.
this.addAbility(new RedManaAbility());
// {2}{R}, {T}: Spitfire Bastion deals 3 damage to any target.
Ability ability = new SimpleActivatedAbility(new DamageTargetEffect(3), new TapSourceCost());
ability.addCost(new ManaCostsImpl<>("{2}{R}"));
ability.addTarget(new TargetAnyTarget());
this.addAbility(ability);
}
private SpitfireBastion(final SpitfireBastion card) {
super(card);
}
@Override
public SpitfireBastion copy() {
return new SpitfireBastion(this);
}
}

View file

@ -1,113 +0,0 @@
package mage.cards.s;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.AttachEffect;
import mage.abilities.keyword.EnchantAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.constants.TargetController;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterCreatureOrPlaneswalkerPermanent;
import mage.filter.common.FilterNonlandPermanent;
import mage.filter.predicate.permanent.CanBeSacrificedPredicate;
import mage.game.Controllable;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.TargetPermanent;
import java.util.Optional;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class StranglingGrasp extends CardImpl {
private static final FilterPermanent filter
= new FilterCreatureOrPlaneswalkerPermanent("creature or planeswalker an opponent controls");
static {
filter.add(TargetController.OPPONENT.getControllerPredicate());
}
public StranglingGrasp(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "");
this.subtype.add(SubType.AURA);
this.color.setBlack(true);
this.nightCard = true;
// Enchant creature or planeswalker an opponent controls
TargetPermanent auraTarget = new TargetPermanent(filter);
this.getSpellAbility().addTarget(auraTarget);
this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
this.addAbility(new EnchantAbility(auraTarget));
// At the beginning of your upkeep, enchanted permanent's controller sacrifices a nonland permanent and loses 1 life.
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new StranglingGraspEffect()));
}
private StranglingGrasp(final StranglingGrasp card) {
super(card);
}
@Override
public StranglingGrasp copy() {
return new StranglingGrasp(this);
}
}
class StranglingGraspEffect extends OneShotEffect {
private static final FilterPermanent filter = new FilterNonlandPermanent("nonland permanent you control");
static {
filter.add(TargetController.YOU.getControllerPredicate());
filter.add(CanBeSacrificedPredicate.instance);
}
StranglingGraspEffect() {
super(Outcome.Benefit);
staticText = "enchanted permanent's controller sacrifices a nonland permanent, then that player loses 1 life";
}
private StranglingGraspEffect(final StranglingGraspEffect effect) {
super(effect);
}
@Override
public StranglingGraspEffect copy() {
return new StranglingGraspEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player player = Optional
.ofNullable(source.getSourcePermanentOrLKI(game))
.map(Permanent::getAttachedTo)
.map(game::getPermanentOrLKIBattlefield)
.map(Controllable::getControllerId)
.map(game::getPlayer)
.orElse(null);
if (player == null) {
return false;
}
TargetPermanent target = new TargetPermanent(filter);
target.withNotTarget(true);
if (target.canChoose(player.getId(), source, game)) {
player.choose(outcome, target, source, game);
Permanent permanent = game.getPermanent(target.getFirstTarget());
if (permanent != null) {
permanent.sacrifice(source, game);
}
}
player.loseLife(1, game, source, false);
return true;
}
}

View file

@ -1,108 +0,0 @@
package mage.cards.t;
import mage.abilities.Ability;
import mage.abilities.common.SagaAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.ExileSourceAndReturnFaceUpEffect;
import mage.abilities.effects.common.FightTargetSourceEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.effects.common.counter.DistributeCountersEffect;
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.TargetCard;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanentAmount;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class TheGrandEvolution extends CardImpl {
public TheGrandEvolution(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "");
this.subtype.add(SubType.SAGA);
this.color.setGreen(true);
this.nightCard = true;
// (As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)
SagaAbility sagaAbility = new SagaAbility(this);
// I -- Mill ten cards. Put up to two creature cards from among the milled cards onto the battlefield.
sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_I, new TheGrandEvolutionEffect());
// II -- Distribute seven +1/+1 counters among any number of target creatures you control.
sagaAbility.addChapterEffect(
this, SagaChapter.CHAPTER_II, SagaChapter.CHAPTER_II,
new DistributeCountersEffect(),
new TargetCreaturePermanentAmount(7, StaticFilters.FILTER_CONTROLLED_CREATURES)
);
// III -- Until end of turn, creatures you control gain "{1}: This creature fights target creature you don't control." Exile The Grand Evolution, then return it to the battlefield.
Ability ability = new SimpleActivatedAbility(
new FightTargetSourceEffect()
.setText("this creature fights target creature you don't control"),
new GenericManaCost(1)
);
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL));
sagaAbility.addChapterEffect(
this, SagaChapter.CHAPTER_III,
new GainAbilityControlledEffect(
ability, Duration.EndOfTurn, StaticFilters.FILTER_CONTROLLED_CREATURE
).setText("Until end of turn, creatures you control gain " +
"\"{1}: This creature fights target creature you don't control.\""),
new ExileSourceAndReturnFaceUpEffect()
);
this.addAbility(sagaAbility);
}
private TheGrandEvolution(final TheGrandEvolution card) {
super(card);
}
@Override
public TheGrandEvolution copy() {
return new TheGrandEvolution(this);
}
}
class TheGrandEvolutionEffect extends OneShotEffect {
TheGrandEvolutionEffect() {
super(Outcome.Benefit);
staticText = "mill ten cards. Put up to two creature cards from among the milled cards onto the battlefield";
}
private TheGrandEvolutionEffect(final TheGrandEvolutionEffect effect) {
super(effect);
}
@Override
public TheGrandEvolutionEffect copy() {
return new TheGrandEvolutionEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
if (player == null) {
return false;
}
Cards cards = player.millCards(10, source, game);
TargetCard target = new TargetCard(0, 2, Zone.ALL, StaticFilters.FILTER_CARD_CREATURE);
target.withNotTarget(true);
player.choose(Outcome.PutCreatureInPlay, cards, target, source, game);
player.moveCards(new CardsImpl(target.getTargets()), Zone.BATTLEFIELD, source, game);
return true;
}
}

View file

@ -1,19 +1,23 @@
package mage.cards.v;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
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.DamageTargetEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.keyword.TransformAbility;
import mage.abilities.mana.RedManaAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.players.Player;
import mage.target.common.TargetAnyTarget;
import mage.util.CardUtil;
import mage.watchers.common.CastSpellLastTurnWatcher;
@ -22,20 +26,31 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class VancesBlastingCannons extends CardImpl {
public final class VancesBlastingCannons extends TransformingDoubleFacedCard {
public VancesBlastingCannons(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{R}");
this.supertype.add(SuperType.LEGENDARY);
this.secondSideCardClazz = mage.cards.s.SpitfireBastion.class;
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ENCHANTMENT}, new SubType[]{}, "{3}{R}",
"Spitfire Bastion",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.LAND}, new SubType[]{}, ""
);
// Vance's Blasting Cannons
// At the beginning of your upkeep, exile the top card of your library. If it's a nonland card, you may cast that card this turn.
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new VancesBlastingCannonsExileEffect()));
this.getLeftHalfCard().addAbility(new BeginningOfUpkeepTriggeredAbility(new VancesBlastingCannonsExileEffect()));
// Whenever you cast your third spell in a turn, transform Vance's Blasting Cannons.
this.addAbility(new TransformAbility());
this.addAbility(new VancesBlastingCannonsTriggeredAbility());
this.getLeftHalfCard().addAbility(new VancesBlastingCannonsTriggeredAbility());
// Spitfire Bastion
// {T}: Add {R}.
this.getRightHalfCard().addAbility(new RedManaAbility());
// {2}{R}, {T}: Spitfire Bastion deals 3 damage to any target.
Ability ability = new SimpleActivatedAbility(new DamageTargetEffect(3), new TapSourceCost());
ability.addCost(new ManaCostsImpl<>("{2}{R}"));
ability.addTarget(new TargetAnyTarget());
this.getRightHalfCard().addAbility(ability);
}
private VancesBlastingCannons(final VancesBlastingCannons card) {

View file

@ -1,29 +1,36 @@
package mage.cards.v;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.ExileTargetEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
import mage.abilities.keyword.IndestructibleAbility;
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
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.counters.CounterType;
import mage.filter.FilterSpell;
import mage.filter.StaticFilters;
import mage.game.Controllable;
import mage.game.Game;
import mage.target.TargetPermanent;
import mage.target.common.TargetNonlandPermanent;
import java.util.Optional;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class VenatHeartOfHydaelyn extends CardImpl {
public final class VenatHeartOfHydaelyn extends TransformingDoubleFacedCard {
private static final FilterSpell filter = new FilterSpell("a legendary spell");
@ -32,27 +39,41 @@ public final class VenatHeartOfHydaelyn extends CardImpl {
}
public VenatHeartOfHydaelyn(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}{W}");
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.ELDER, SubType.WIZARD}, "{1}{W}{W}",
"Hydaelyn, the Mothercrystal",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.GOD}, "W"
);
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.ELDER);
this.subtype.add(SubType.WIZARD);
this.power = new MageInt(3);
this.toughness = new MageInt(3);
this.secondSideCardClazz = mage.cards.h.HydaelynTheMothercrystal.class;
// Venat, Heart of Hydaelyn
this.getLeftHalfCard().setPT(3, 3);
// Whenever you cast a legendary spell, draw a card. This ability triggers only once each turn.
this.addAbility(new SpellCastControllerTriggeredAbility(
this.getLeftHalfCard().addAbility(new SpellCastControllerTriggeredAbility(
new DrawCardSourceControllerEffect(1), filter, false
).setTriggersLimitEachTurn(1));
// Hero's Sundering -- {7}, {T}: Exile target nonland permanent. Transform Venat. Activate only as a sorcery.
this.addAbility(new TransformAbility());
Ability ability = new ActivateAsSorceryActivatedAbility(new ExileTargetEffect(), new GenericManaCost(7));
ability.addCost(new TapSourceCost());
ability.addEffect(new TransformSourceEffect());
ability.addTarget(new TargetNonlandPermanent());
this.addAbility(ability.withFlavorWord("Hero's Sundering"));
this.getLeftHalfCard().addAbility(ability.withFlavorWord("Hero's Sundering"));
// Hydaelyn, the Mothercrystal
this.getRightHalfCard().setPT(4, 4);
// Indestructible
this.getRightHalfCard().addAbility(IndestructibleAbility.getInstance());
// Blessing of Light -- At the beginning of combat on your turn, put a +1/+1 counter on another target creature you control. Until your next turn, it gains indestructible. If that creature is legendary, draw a card.
Ability ability2 = new BeginningOfCombatTriggeredAbility(new AddCountersTargetEffect(CounterType.P1P1.createInstance()));
ability2.addEffect(new GainAbilityTargetEffect(
IndestructibleAbility.getInstance(), Duration.UntilYourNextTurn
).setText("Until your next turn, it gains indestructible"));
ability2.addEffect(new HydaelynTheMothercrystalEffect());
ability2.addTarget(new TargetPermanent(StaticFilters.FILTER_ANOTHER_TARGET_CREATURE_YOU_CONTROL));
this.getRightHalfCard().addAbility(ability2.withFlavorWord("Blessing of Light"));
}
private VenatHeartOfHydaelyn(final VenatHeartOfHydaelyn card) {
@ -64,3 +85,34 @@ public final class VenatHeartOfHydaelyn extends CardImpl {
return new VenatHeartOfHydaelyn(this);
}
}
class HydaelynTheMothercrystalEffect extends OneShotEffect {
HydaelynTheMothercrystalEffect() {
super(Outcome.Benefit);
staticText = "If that creature is legendary, draw a card";
}
private HydaelynTheMothercrystalEffect(final HydaelynTheMothercrystalEffect effect) {
super(effect);
}
@Override
public HydaelynTheMothercrystalEffect copy() {
return new HydaelynTheMothercrystalEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
return Optional.ofNullable(getTargetPointer().getFirst(game, source))
.map(game::getPermanent)
.filter(permanent -> permanent.isLegendary(game))
.isPresent()
&& Optional
.ofNullable(source)
.map(Controllable::getControllerId)
.map(game::getPlayer)
.filter(player -> player.drawCards(1, source, game) > 0)
.isPresent();
}
}

View file

@ -1,28 +1,34 @@
package mage.cards.v;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.CantBlockAbility;
import mage.abilities.common.DiesSourceTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.AttachEffect;
import mage.abilities.keyword.EnchantAbility;
import mage.abilities.keyword.TransformAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardSetInfo;
import mage.cards.DoubleFacedCardHalf;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterCreatureOrPlaneswalkerPermanent;
import mage.filter.common.FilterNonlandPermanent;
import mage.filter.predicate.permanent.CanBeSacrificedPredicate;
import mage.game.Controllable;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.TargetPermanent;
import java.util.Optional;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class VengefulStrangler extends CardImpl {
public final class VengefulStrangler extends TransformingDoubleFacedCard {
private static final FilterPermanent filter
= new FilterCreatureOrPlaneswalkerPermanent("creature or planeswalker an opponent controls");
@ -32,22 +38,32 @@ public final class VengefulStrangler extends CardImpl {
}
public VengefulStrangler(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}");
super(ownerId, setInfo,
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.ROGUE}, "{1}{B}",
"Strangling Grasp",
new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.AURA}, "B"
);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.ROGUE);
this.power = new MageInt(2);
this.toughness = new MageInt(1);
this.secondSideCardClazz = mage.cards.s.StranglingGrasp.class;
// Vengeful Strangler
this.getLeftHalfCard().setPT(2, 1);
// Vengeful Strangler can't block.
this.addAbility(new CantBlockAbility());
this.getLeftHalfCard().addAbility(new CantBlockAbility());
// When Vengeful Strangler dies, return it to the battlefield transformed under your control attached to target creature or planeswalker an opponent controls.
this.addAbility(new TransformAbility());
Ability ability = new DiesSourceTriggeredAbility(new VengefulStranglerEffect());
ability.addTarget(new TargetPermanent(filter));
this.addAbility(ability);
this.getLeftHalfCard().addAbility(ability);
// Strangling Grasp
// Enchant creature or planeswalker an opponent controls
TargetPermanent auraTarget = new TargetPermanent(filter);
this.getRightHalfCard().getSpellAbility().addTarget(auraTarget);
this.getRightHalfCard().getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
this.getRightHalfCard().addAbility(new EnchantAbility(auraTarget));
// At the beginning of your upkeep, enchanted permanent's controller sacrifices a nonland permanent and loses 1 life.
this.getRightHalfCard().addAbility(new BeginningOfUpkeepTriggeredAbility(new StranglingGraspEffect()));
}
private VengefulStrangler(final VengefulStrangler card) {
@ -86,17 +102,65 @@ class VengefulStranglerEffect extends OneShotEffect {
return false;
}
Card card = game.getCard(source.getSourceId());
DoubleFacedCardHalf card = (DoubleFacedCardHalf) game.getCard(source.getSourceId());
if (card == null) {
return false;
}
game.getState().setValue(TransformAbility.VALUE_KEY_ENTER_TRANSFORMED + source.getSourceId(), Boolean.TRUE);
game.getState().setValue("attachTo:" + source.getSourceId(), permanent);
game.getState().setValue("attachTo:" + card.getOtherSide().getId(), permanent);
if (controller.moveCards(card, Zone.BATTLEFIELD, source, game)) {
permanent.addAttachment(card.getId(), source, game);
permanent.addAttachment(card.getOtherSide().getId(), source, game);
}
return true;
}
}
class StranglingGraspEffect extends OneShotEffect {
private static final FilterPermanent filter = new FilterNonlandPermanent("nonland permanent you control");
static {
filter.add(TargetController.YOU.getControllerPredicate());
filter.add(CanBeSacrificedPredicate.instance);
}
StranglingGraspEffect() {
super(Outcome.Benefit);
staticText = "enchanted permanent's controller sacrifices a nonland permanent of their choice, then that player loses 1 life";
}
private StranglingGraspEffect(final StranglingGraspEffect effect) {
super(effect);
}
@Override
public StranglingGraspEffect copy() {
return new StranglingGraspEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player player = Optional
.ofNullable(source.getSourcePermanentOrLKI(game))
.map(Permanent::getAttachedTo)
.map(game::getPermanentOrLKIBattlefield)
.map(Controllable::getControllerId)
.map(game::getPlayer)
.orElse(null);
if (player == null) {
return false;
}
TargetPermanent target = new TargetPermanent(filter);
target.withNotTarget(true);
if (target.canChoose(player.getId(), source, game)) {
player.choose(outcome, target, source, game);
Permanent permanent = game.getPermanent(target.getFirstTarget());
if (permanent != null) {
permanent.sacrifice(source, game);
}
}
player.loseLife(1, game, source, false);
return true;
}
}

View file

@ -1,45 +1,51 @@
package mage.cards.v;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.abilities.keyword.TrampleAbility;
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.Duration;
import mage.constants.Zone;
import mage.constants.SubType;
import java.util.UUID;
/**
* @author fireshoes
*/
public final class VildinPackOutcast extends CardImpl {
public final class VildinPackOutcast extends TransformingDoubleFacedCard {
public VildinPackOutcast(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{R}");
this.subtype.add(SubType.WEREWOLF);
this.subtype.add(SubType.HORROR);
this.power = new MageInt(4);
this.toughness = new MageInt(4);
super(ownerId, setInfo,
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF, SubType.HORROR}, "{4}{R}",
"Dronepack Kindred",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.ELDRAZI, SubType.WEREWOLF}, ""
);
this.secondSideCardClazz = mage.cards.d.DronepackKindred.class;
// Vildin-Pack Outcast
this.getLeftHalfCard().setPT(4, 4);
// Trample
this.addAbility(TrampleAbility.getInstance());
this.getLeftHalfCard().addAbility(TrampleAbility.getInstance());
// {R}: Vildin-Pack Outcast gets +1/-1 until end of turn.
this.addAbility(new SimpleActivatedAbility(new BoostSourceEffect(1, -1, Duration.EndOfTurn), new ManaCostsImpl<>("{R}")));
this.getLeftHalfCard().addAbility(new SimpleActivatedAbility(new BoostSourceEffect(1, -1, Duration.EndOfTurn), new ManaCostsImpl<>("{R}")));
// {5}{R}{R}: Transform Vildin-Pack Outcast.
this.addAbility(new TransformAbility());
this.addAbility(new SimpleActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{5}{R}{R}")));
this.getLeftHalfCard().addAbility(new SimpleActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{5}{R}{R}")));
// Dronepack Kindred
this.getRightHalfCard().setPT(5, 7);
// Trample
this.getRightHalfCard().addAbility(TrampleAbility.getInstance());
// {1}: Dronepack Kindred gets +1/+0 until end of turn.
this.getRightHalfCard().addAbility(new SimpleActivatedAbility(new BoostSourceEffect(1, 0, Duration.EndOfTurn), new GenericManaCost(1)));
}
private VildinPackOutcast(final VildinPackOutcast card) {

View file

@ -1,11 +1,10 @@
package mage.cards.v;
import mage.MageInt;
import mage.abilities.common.WerewolfBackTriggeredAbility;
import mage.abilities.common.WerewolfFrontTriggeredAbility;
import mage.abilities.keyword.FirstStrikeAbility;
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;
@ -14,23 +13,30 @@ import java.util.UUID;
/**
* @author nantuko
*/
public final class VillageIronsmith extends CardImpl {
public final class VillageIronsmith extends TransformingDoubleFacedCard {
public VillageIronsmith(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.WEREWOLF);
super(ownerId, setInfo,
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WEREWOLF}, "{1}{R}",
"Ironfang",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "R"
);
this.secondSideCardClazz = mage.cards.i.Ironfang.class;
// Village Ironsmith
this.getLeftHalfCard().setPT(1, 1);
this.power = new MageInt(1);
this.toughness = new MageInt(1);
this.addAbility(FirstStrikeAbility.getInstance());
this.getLeftHalfCard().addAbility(FirstStrikeAbility.getInstance());
// At the beginning of each upkeep, if no spells were cast last turn, transform Village Ironsmith.
this.addAbility(new TransformAbility());
this.addAbility(new WerewolfFrontTriggeredAbility());
this.getLeftHalfCard().addAbility(new WerewolfFrontTriggeredAbility());
// Ironfang
this.getRightHalfCard().setPT(3, 1);
this.getRightHalfCard().addAbility(FirstStrikeAbility.getInstance());
// At the beginning of each upkeep, if a player cast two or more spells last turn, transform Ironfang.
this.getRightHalfCard().addAbility(new WerewolfBackTriggeredAbility());
}
private VillageIronsmith(final VillageIronsmith card) {

View file

@ -1,11 +1,11 @@
package mage.cards.v;
import mage.MageInt;
import mage.abilities.common.WerewolfBackTriggeredAbility;
import mage.abilities.common.WerewolfFrontTriggeredAbility;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.abilities.keyword.MenaceAbility;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
@ -14,23 +14,32 @@ import java.util.UUID;
/**
* @author fireshoes
*/
public final class VillageMessenger extends CardImpl {
public final class VillageMessenger extends TransformingDoubleFacedCard {
public VillageMessenger(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{R}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.WEREWOLF);
this.power = new MageInt(1);
this.toughness = new MageInt(1);
super(ownerId, setInfo,
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WEREWOLF}, "{R}",
"Moonrise Intruder",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "R"
);
this.secondSideCardClazz = mage.cards.m.MoonriseIntruder.class;
// Village Messenger
this.getLeftHalfCard().setPT(1, 1);
// Haste
this.addAbility(HasteAbility.getInstance());
this.getLeftHalfCard().addAbility(HasteAbility.getInstance());
// At the beginning of each upkeep, if no spells were cast last turn, transform Village Messenger.
this.addAbility(new TransformAbility());
this.addAbility(new WerewolfFrontTriggeredAbility());
this.getLeftHalfCard().addAbility(new WerewolfFrontTriggeredAbility());
// Moonrise Intruder
this.getRightHalfCard().setPT(2, 2);
// Menace
this.getRightHalfCard().addAbility(new MenaceAbility());
// At the beginning of each upkeep, if a player cast two or more spells last turn, transform Moonrise Intruder.
this.getRightHalfCard().addAbility(new WerewolfBackTriggeredAbility());
}
private VillageMessenger(final VillageMessenger card) {

View file

@ -1,62 +0,0 @@
package mage.cards.v;
import mage.MageInt;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.keyword.HasteAbility;
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.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.Predicates;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class VillageReavers extends CardImpl {
private static final FilterPermanent filter = new FilterControlledPermanent("Wolves and Werewolves");
static {
filter.add(Predicates.or(
SubType.WOLF.getPredicate(),
SubType.WEREWOLF.getPredicate()
));
}
public VillageReavers(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.WEREWOLF);
this.color.setRed(true);
this.nightCard = true;
this.power = new MageInt(5);
this.toughness = new MageInt(4);
// Wolves and Werewolves you control have haste.
this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect(
HasteAbility.getInstance(), Duration.WhileOnBattlefield, filter
)));
// Nightbound
this.addAbility(new NightboundAbility());
}
private VillageReavers(final VillageReavers card) {
super(card);
}
@Override
public VillageReavers copy() {
return new VillageReavers(this);
}
}

View file

@ -1,35 +1,61 @@
package mage.cards.v;
import mage.MageInt;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.keyword.DayboundAbility;
import mage.abilities.keyword.HasteAbility;
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;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.Predicates;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class VillageWatch extends CardImpl {
public final class VillageWatch extends TransformingDoubleFacedCard {
private static final FilterPermanent filter = new FilterControlledPermanent("Wolves and Werewolves");
static {
filter.add(Predicates.or(
SubType.WOLF.getPredicate(),
SubType.WEREWOLF.getPredicate()
));
}
public VillageWatch(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{R}");
super(ownerId, setInfo,
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WEREWOLF}, "{4}{R}",
"Village Reavers",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "R"
);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.WEREWOLF);
this.power = new MageInt(4);
this.toughness = new MageInt(3);
this.secondSideCardClazz = mage.cards.v.VillageReavers.class;
// Village Watch
this.getLeftHalfCard().setPT(4, 3);
// Haste
this.addAbility(HasteAbility.getInstance());
this.getLeftHalfCard().addAbility(HasteAbility.getInstance());
// Daybound
this.addAbility(new DayboundAbility());
this.getLeftHalfCard().addAbility(new DayboundAbility());
// Village Reavers
this.getRightHalfCard().setPT(5, 4);
// Wolves and Werewolves you control have haste.
this.getRightHalfCard().addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect(
HasteAbility.getInstance(), Duration.WhileOnBattlefield, filter
)));
// Nightbound
this.getRightHalfCard().addAbility(new NightboundAbility());
}
private VillageWatch(final VillageWatch card) {

View file

@ -1,10 +1,9 @@
package mage.cards.v;
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,21 +12,26 @@ import java.util.UUID;
/**
* @author nantuko
*/
public final class VillagersOfEstwald extends CardImpl {
public final class VillagersOfEstwald extends TransformingDoubleFacedCard {
public VillagersOfEstwald(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.WEREWOLF);
super(ownerId, setInfo,
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WEREWOLF}, "{2}{G}",
"Howlpack of Estwald",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "G"
);
this.secondSideCardClazz = mage.cards.h.HowlpackOfEstwald.class;
this.power = new MageInt(2);
this.toughness = new MageInt(3);
// Villagers of Estwald
this.getLeftHalfCard().setPT(2, 3);
// At the beginning of each upkeep, if no spells were cast last turn, transform Villagers of Estwald.
this.addAbility(new TransformAbility());
this.addAbility(new WerewolfFrontTriggeredAbility());
this.getLeftHalfCard().addAbility(new WerewolfFrontTriggeredAbility());
// Howlpack of Estwald
this.getRightHalfCard().setPT(4, 6);
// At the beginning of each upkeep, if a player cast two or more spells last turn, transform Howlpack of Estwald.
this.getRightHalfCard().addAbility(new WerewolfBackTriggeredAbility());
}
private VillagersOfEstwald(final VillagersOfEstwald card) {

View file

@ -5,13 +5,16 @@ import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.common.DiesCreatureTriggeredAbility;
import mage.abilities.common.DiesSourceTriggeredAbility;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.ReturnSourceFromGraveyardToBattlefieldEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.abilities.keyword.LifelinkAbility;
import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
@ -26,27 +29,40 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class VincentValentine extends CardImpl {
public final class VincentValentine extends TransformingDoubleFacedCard {
public VincentValentine(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}{B}");
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.ASSASSIN}, "{2}{B}{B}",
"Galian Beast",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF, SubType.BEAST}, "B"
);
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.ASSASSIN);
this.power = new MageInt(2);
this.toughness = new MageInt(2);
this.secondSideCardClazz = mage.cards.g.GalianBeast.class;
// Vincent Valentine
this.getLeftHalfCard().setPT(2, 2);
// Whenever a creature an opponent controls dies, put a number of +1/+1 counters on Vincent Valentine equal to that creature's power.
this.addAbility(new DiesCreatureTriggeredAbility(
this.getLeftHalfCard().addAbility(new DiesCreatureTriggeredAbility(
new AddCountersSourceEffect(CounterType.P1P1.createInstance(), VincentValentineValue.instance)
.setText("put a number of +1/+1 counters on {this} equal to that creature's power"),
false, StaticFilters.FILTER_OPPONENTS_PERMANENT_A_CREATURE
));
// Whenever Vincent Valentine attacks, you may transform it.
this.addAbility(new TransformAbility());
this.addAbility(new AttacksTriggeredAbility(new TransformSourceEffect(), true));
this.getLeftHalfCard().addAbility(new AttacksTriggeredAbility(new TransformSourceEffect(), true));
// Galian Beast
this.getRightHalfCard().setPT(3, 2);
// Trample
this.getRightHalfCard().addAbility(TrampleAbility.getInstance());
// Lifelink
this.getRightHalfCard().addAbility(LifelinkAbility.getInstance());
// When Galian Beast dies, return it to the battlefield tapped.
this.getRightHalfCard().addAbility(new DiesSourceTriggeredAbility(new ReturnSourceFromGraveyardToBattlefieldEffect(true)
.setText("return it to the battlefield tapped")));
}
private VincentValentine(final VincentValentine card) {

View file

@ -1,12 +1,16 @@
package mage.cards.v;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.common.MillCardsControllerEffect;
import mage.abilities.effects.common.discard.DiscardCardYouChooseTargetEffect;
import mage.abilities.keyword.CraftAbility;
import mage.cards.CardImpl;
import mage.abilities.keyword.MenaceAbility;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.StaticFilters;
import mage.target.common.TargetOpponent;
@ -15,24 +19,39 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class VisageOfDread extends CardImpl {
public final class VisageOfDread extends TransformingDoubleFacedCard {
public VisageOfDread(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}{B}");
this.secondSideCardClazz = mage.cards.d.DreadOsseosaur.class;
super(ownerId, setInfo,
new CardType[]{CardType.ARTIFACT}, new SubType[]{}, "{1}{B}",
"Dread Osseosaur",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.DINOSAUR, SubType.SKELETON, SubType.HORROR}, "B"
);
// Visage of Dread
// When Visage of Dread enters the battlefield, target opponent reveals their hand. You choose an artifact or creature card from it. That player discards that card.
Ability ability = new EntersBattlefieldTriggeredAbility(
new DiscardCardYouChooseTargetEffect(StaticFilters.FILTER_CARD_ARTIFACT_OR_CREATURE)
);
ability.addTarget(new TargetOpponent());
this.addAbility(ability);
this.getLeftHalfCard().addAbility(ability);
// Craft with two creatures {5}{B}
this.addAbility(new CraftAbility(
this.getLeftHalfCard().addAbility(new CraftAbility(
"{5}{B}", "two creatures", "other creatures you control and/or " +
"creature cards in your graveyard", 2, 2, CardType.CREATURE.getPredicate()
));
// Dread Osseosaur
this.getRightHalfCard().setPT(5, 4);
// Menace
this.getRightHalfCard().addAbility(new MenaceAbility(false));
// Whenever Dread Osseosaur enters the battlefield or attacks, you may mill two cards.
this.getRightHalfCard().addAbility(new EntersBattlefieldOrAttacksSourceTriggeredAbility(
new MillCardsControllerEffect(2), true
));
}
private VisageOfDread(final VisageOfDread card) {

View file

@ -1,14 +1,14 @@
package mage.cards.v;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.keyword.DayboundAbility;
import mage.abilities.keyword.HasteAbility;
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;
import mage.target.TargetPlayer;
@ -20,22 +20,23 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class VolatileArsonist extends CardImpl {
public final class VolatileArsonist extends TransformingDoubleFacedCard {
public VolatileArsonist(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}{R}");
super(ownerId, setInfo,
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WEREWOLF}, "{3}{R}{R}",
"Dire-Strain Anarchist",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "R"
);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.WEREWOLF);
this.power = new MageInt(4);
this.toughness = new MageInt(4);
this.secondSideCardClazz = mage.cards.d.DireStrainAnarchist.class;
// Volatile Arsonist
this.getLeftHalfCard().setPT(4, 4);
// Menace
this.addAbility(new MenaceAbility(false));
this.getLeftHalfCard().addAbility(new MenaceAbility(false));
// Haste
this.addAbility(HasteAbility.getInstance());
this.getLeftHalfCard().addAbility(HasteAbility.getInstance());
// Whenever Volatile Arsonist attacks, it deals 1 damage to each of up to one target creature, up to one target player, and/or up to one target planeswalker.
Ability ability = new AttacksTriggeredAbility(new DamageTargetEffect(1)
@ -43,10 +44,29 @@ public final class VolatileArsonist extends CardImpl {
ability.addTarget(new TargetCreaturePermanent(0, 1));
ability.addTarget(new TargetPlayer(0, 1, false));
ability.addTarget(new TargetPlaneswalkerPermanent(0, 1));
this.addAbility(ability);
this.getLeftHalfCard().addAbility(ability);
// Daybound
this.addAbility(new DayboundAbility());
this.getLeftHalfCard().addAbility(new DayboundAbility());
// Dire-Strain Anarchist
this.getRightHalfCard().setPT(5, 5);
// Menace
this.getRightHalfCard().addAbility(new MenaceAbility(false));
// Haste
this.getRightHalfCard().addAbility(HasteAbility.getInstance());
// Whenever Dire-Strain Anarchist attacks, it deals 2 damage to each of up to one target creature, up to one target player, and/or up to one target planeswalker.
Ability ability2 = new AttacksTriggeredAbility(new DamageTargetEffect(2).setText("it deals 2 damage to each of up to one target creature, up to one target player, and/or up to one target planeswalker"));
ability2.addTarget(new TargetCreaturePermanent(0, 1));
ability2.addTarget(new TargetPlayer(0, 1, false));
ability2.addTarget(new TargetPlaneswalkerPermanent(0, 1));
this.getRightHalfCard().addAbility(ability2);
// Nightbound
this.getRightHalfCard().addAbility(new NightboundAbility());
}
private VolatileArsonist(final VolatileArsonist card) {

View file

@ -1,18 +1,21 @@
package mage.cards.v;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.DiesThisOrAnotherTriggeredAbility;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.continuous.BecomesCreatureTargetEffect;
import mage.abilities.hint.Hint;
import mage.abilities.hint.ValueHint;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.filter.FilterPermanent;
@ -23,41 +26,64 @@ import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.game.permanent.token.BloodToken;
import mage.game.permanent.token.custom.CreatureToken;
import mage.target.TargetPermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class VoldarenBloodcaster extends CardImpl {
public final class VoldarenBloodcaster extends TransformingDoubleFacedCard {
private static final FilterPermanent filter
= new FilterControlledCreaturePermanent("nontoken creature you control");
private static final FilterPermanent filter2
= new FilterControlledPermanent(SubType.BLOOD, "Blood token you control");
static {
filter.add(TokenPredicate.FALSE);
filter2.add(TokenPredicate.TRUE);
}
public VoldarenBloodcaster(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}");
super(ownerId, setInfo,
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.VAMPIRE, SubType.WIZARD}, "{1}{B}",
"Bloodbat Summoner",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.VAMPIRE, SubType.WIZARD}, "B"
);
this.subtype.add(SubType.VAMPIRE);
this.subtype.add(SubType.WIZARD);
this.power = new MageInt(2);
this.toughness = new MageInt(1);
this.secondSideCardClazz = mage.cards.b.BloodbatSummoner.class;
// Voldaren Bloodcaster
this.getLeftHalfCard().setPT(2, 1);
// Flying
this.addAbility(FlyingAbility.getInstance());
this.getLeftHalfCard().addAbility(FlyingAbility.getInstance());
// Whenever Voldaren Bloodcaster or another nontoken creature you control dies, create a Blood token.
this.addAbility(new DiesThisOrAnotherTriggeredAbility(
this.getLeftHalfCard().addAbility(new DiesThisOrAnotherTriggeredAbility(
new CreateTokenEffect(new BloodToken()), false, filter
));
// Whenever you create a Blood token, if you control five or more Blood tokens, transform Voldaren Bloodcaster.
this.addAbility(new TransformAbility());
this.addAbility(new VoldarenBloodcasterTriggeredAbility());
this.getLeftHalfCard().addAbility(new VoldarenBloodcasterTriggeredAbility());
// Bloodbat Summoner
this.getRightHalfCard().setPT(3, 3);
// Flying
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
// At the beginning of combat on your turn, up to one target Blood token you control becomes a 2/2 black Bat creature with flying and haste in addition to its other types.
Ability ability = new BeginningOfCombatTriggeredAbility(new BecomesCreatureTargetEffect(
new CreatureToken(2, 2, "", SubType.BAT)
.withAbility(FlyingAbility.getInstance())
.withAbility(HasteAbility.getInstance())
.withColor("B"),
false, false, Duration.Custom
).setText("up to one target Blood token you control becomes a " +
"2/2 black Bat creature with flying and haste in addition to its other types"));
ability.addTarget(new TargetPermanent(0, 1, filter2));
this.getRightHalfCard().addAbility(ability);
}
private VoldarenBloodcaster(final VoldarenBloodcaster card) {

View file

@ -1,29 +1,29 @@
package mage.cards.v;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.TransformIntoSourceTriggeredAbility;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.SacrificeEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.MadnessAbility;
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.filter.StaticFilters;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.target.common.TargetControlledPermanent;
import mage.target.common.TargetOpponent;
import java.util.UUID;
/**
* @author fireshoes
*/
public final class VoldarenPariah extends CardImpl {
public final class VoldarenPariah extends TransformingDoubleFacedCard {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("other creatures");
@ -32,24 +32,37 @@ public final class VoldarenPariah extends CardImpl {
}
public VoldarenPariah(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}{B}");
this.subtype.add(SubType.VAMPIRE);
this.subtype.add(SubType.HORROR);
this.power = new MageInt(3);
this.toughness = new MageInt(3);
super(ownerId, setInfo,
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.VAMPIRE, SubType.HORROR}, "{3}{B}{B}",
"Abolisher of Bloodlines",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.ELDRAZI, SubType.VAMPIRE}, ""
);
this.secondSideCardClazz = mage.cards.a.AbolisherOfBloodlines.class;
// Voldaren Pariah
this.getLeftHalfCard().setPT(3, 3);
// Flying
this.addAbility(FlyingAbility.getInstance());
this.getLeftHalfCard().addAbility(FlyingAbility.getInstance());
// Sacrifice three other creatures: Transform Voldaren Pariah.
this.addAbility(new TransformAbility());
this.addAbility(new SimpleActivatedAbility(new TransformSourceEffect(),
this.getLeftHalfCard().addAbility(new SimpleActivatedAbility(new TransformSourceEffect(),
new SacrificeTargetCost(3, filter)));
// Madness {B}{B}{B}
this.addAbility(new MadnessAbility(new ManaCostsImpl<>("{B}{B}{B}")));
this.getLeftHalfCard().addAbility(new MadnessAbility(new ManaCostsImpl<>("{B}{B}{B}")));
// Abolisher of Bloodlines
this.getRightHalfCard().setPT(6, 5);
// Flying
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
// When this creature transforms into Abolisher of Bloodlines, target opponent sacrifices three creatures.
Ability ability = new TransformIntoSourceTriggeredAbility(new SacrificeEffect(
StaticFilters.FILTER_PERMANENT_CREATURES, 3, "target opponent"
));
ability.addTarget(new TargetOpponent());
this.getRightHalfCard().addAbility(ability);
}
private VoldarenPariah(final VoldarenPariah card) {

View file

@ -1,39 +0,0 @@
package mage.cards.v;
import mage.MageInt;
import mage.abilities.common.CantBlockAbility;
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 VoltChargedBerserker extends CardImpl {
public VoltChargedBerserker(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.BERSERKER);
this.power = new MageInt(4);
this.toughness = new MageInt(3);
this.color.setRed(true);
this.nightCard = true;
// Volt-Charged Berserker can't block.
this.addAbility(new CantBlockAbility());
}
private VoltChargedBerserker(final VoltChargedBerserker card) {
super(card);
}
@Override
public VoltChargedBerserker copy() {
return new VoltChargedBerserker(this);
}
}

View file

@ -1,18 +1,17 @@
package mage.cards.v;
import mage.MageInt;
import mage.MageObjectReference;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.common.CantBlockAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.common.DamageControllerEffect;
import mage.abilities.effects.common.ExileTopXMayPlayUntilEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.keyword.TransformAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.game.ExileZone;
import mage.game.Game;
@ -26,27 +25,33 @@ import java.util.*;
/**
* @author TheElk801
*/
public final class VoltaicVisionary extends CardImpl {
public final class VoltaicVisionary extends TransformingDoubleFacedCard {
public VoltaicVisionary(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}");
super(ownerId, setInfo,
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WIZARD}, "{1}{R}",
"Volt-Charged Berserker",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.BERSERKER}, "R"
);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.WIZARD);
this.power = new MageInt(3);
this.toughness = new MageInt(1);
this.secondSideCardClazz = mage.cards.v.VoltChargedBerserker.class;
// Voltaic Visionary
this.getLeftHalfCard().setPT(3, 1);
// {T}: Voltaic Visionary deals 2 damage to you. Exile the top card of your library. You may play that card this turn. Activate only as a sorcery.
Ability ability = new ActivateAsSorceryActivatedAbility(
new DamageControllerEffect(2), new TapSourceCost()
);
ability.addEffect(new ExileTopXMayPlayUntilEffect(1, Duration.EndOfTurn));
this.addAbility(ability);
this.getLeftHalfCard().addAbility(ability);
// When you play a card exiled with Voltaic Visionary, transform Voltaic Visionary.
this.addAbility(new TransformAbility());
this.addAbility(new VoltaicVisionaryTriggeredAbility());
this.getLeftHalfCard().addAbility(new VoltaicVisionaryTriggeredAbility());
// Volt-Charged Berserker
this.getRightHalfCard().setPT(4, 3);
// Volt-Charged Berserker can't block.
this.getRightHalfCard().addAbility(new CantBlockAbility());
}
private VoltaicVisionary(final VoltaicVisionary card) {

View file

@ -1,29 +1,41 @@
package mage.cards.v;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SagaAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.ExileAndReturnSourceEffect;
import mage.abilities.effects.common.ExileSourceAndReturnFaceUpEffect;
import mage.abilities.effects.common.FightTargetSourceEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.effects.common.counter.DistributeCountersEffect;
import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
import mage.abilities.keyword.ReachAbility;
import mage.abilities.keyword.TrampleAbility;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.PutCards;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.cards.Cards;
import mage.cards.CardsImpl;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.filter.FilterCard;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.players.Player;
import mage.target.TargetCard;
import mage.target.TargetPermanent;
import mage.target.common.TargetCardInLibrary;
import mage.target.common.TargetCreaturePermanentAmount;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class Vorinclex extends CardImpl {
public final class Vorinclex extends TransformingDoubleFacedCard {
private static final FilterCard filter = new FilterCard("Forest cards");
@ -32,32 +44,62 @@ public final class Vorinclex extends CardImpl {
}
public Vorinclex(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}{G}");
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.PHYREXIAN, SubType.PRAETOR}, "{3}{G}{G}",
"The Grand Evolution",
new SuperType[]{}, new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.SAGA}, "G"
);
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.PHYREXIAN);
this.subtype.add(SubType.PRAETOR);
this.power = new MageInt(6);
this.toughness = new MageInt(6);
this.secondSideCardClazz = mage.cards.t.TheGrandEvolution.class;
// Vorinclex
this.getLeftHalfCard().setPT(6, 6);
// Trample
this.addAbility(TrampleAbility.getInstance());
this.getLeftHalfCard().addAbility(TrampleAbility.getInstance());
// Reach
this.addAbility(ReachAbility.getInstance());
this.getLeftHalfCard().addAbility(ReachAbility.getInstance());
// When Vorinclex enters the battlefield, search your library for up to two Forest cards, reveal them, put them into your hand, then shuffle.
this.addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInHandEffect(
this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInHandEffect(
new TargetCardInLibrary(0, 2, filter), true
)));
// {6}{G}{G}: Exile Vorinclex, then return it to the battlefield transformed under its owner's control. Activate only as a sorcery.
this.addAbility(new TransformAbility());
this.addAbility(new ActivateAsSorceryActivatedAbility(
this.getLeftHalfCard().addAbility(new ActivateAsSorceryActivatedAbility(
new ExileAndReturnSourceEffect(PutCards.BATTLEFIELD_TRANSFORMED),
new ManaCostsImpl<>("{6}{G}{G}")
));
// The Grand Evolution
// (As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)
SagaAbility sagaAbility = new SagaAbility(this.getRightHalfCard());
// I -- Mill ten cards. Put up to two creature cards from among the milled cards onto the battlefield.
sagaAbility.addChapterEffect(this.getRightHalfCard(), SagaChapter.CHAPTER_I, new TheGrandEvolutionEffect());
// II -- Distribute seven +1/+1 counters among any number of target creatures you control.
sagaAbility.addChapterEffect(
this.getRightHalfCard(), SagaChapter.CHAPTER_II, SagaChapter.CHAPTER_II,
new DistributeCountersEffect(),
new TargetCreaturePermanentAmount(7, StaticFilters.FILTER_CONTROLLED_CREATURES)
);
// III -- Until end of turn, creatures you control gain "{1}: This creature fights target creature you don't control." Exile The Grand Evolution, then return it to the battlefield.
Ability ability = new SimpleActivatedAbility(
new FightTargetSourceEffect()
.setText("this creature fights target creature you don't control"),
new GenericManaCost(1)
);
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL));
sagaAbility.addChapterEffect(
this.getRightHalfCard(), SagaChapter.CHAPTER_III,
new GainAbilityControlledEffect(
ability, Duration.EndOfTurn, StaticFilters.FILTER_CONTROLLED_CREATURE
).setText("Until end of turn, creatures you control gain " +
"\"{1}: This creature fights target creature you don't control.\""),
new ExileSourceAndReturnFaceUpEffect()
);
this.getRightHalfCard().addAbility(sagaAbility);
}
private Vorinclex(final Vorinclex card) {
@ -69,3 +111,34 @@ public final class Vorinclex extends CardImpl {
return new Vorinclex(this);
}
}
class TheGrandEvolutionEffect extends OneShotEffect {
TheGrandEvolutionEffect() {
super(Outcome.Benefit);
staticText = "mill ten cards. Put up to two creature cards from among the milled cards onto the battlefield";
}
private TheGrandEvolutionEffect(final TheGrandEvolutionEffect effect) {
super(effect);
}
@Override
public TheGrandEvolutionEffect copy() {
return new TheGrandEvolutionEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
if (player == null) {
return false;
}
Cards cards = player.millCards(10, source, game);
TargetCard target = new TargetCard(0, 2, Zone.ALL, StaticFilters.FILTER_CARD_CREATURE);
target.withNotTarget(true);
player.choose(Outcome.PutCreatureInPlay, cards, target, source, game);
player.moveCards(new CardsImpl(target.getTargets()), Zone.BATTLEFIELD, source, game);
return true;
}
}

View file

@ -42,7 +42,6 @@ public final class EldritchMoon extends ExpansionSet {
this.numBoosterDoubleFaced = 1;
cards.add(new SetCardInfo("Abandon Reason", 115, Rarity.UNCOMMON, mage.cards.a.AbandonReason.class));
cards.add(new SetCardInfo("Abolisher of Bloodlines", 111, Rarity.RARE, mage.cards.a.AbolisherOfBloodlines.class));
cards.add(new SetCardInfo("Abundant Maw", 1, Rarity.UNCOMMON, mage.cards.a.AbundantMaw.class));
cards.add(new SetCardInfo("Advanced Stitchwing", 49, Rarity.UNCOMMON, mage.cards.a.AdvancedStitchwing.class));
cards.add(new SetCardInfo("Alchemist's Greeting", 116, Rarity.COMMON, mage.cards.a.AlchemistsGreeting.class));
@ -95,7 +94,6 @@ public final class EldritchMoon extends ExpansionSet {
cards.add(new SetCardInfo("Docent of Perfection", 56, Rarity.RARE, mage.cards.d.DocentOfPerfection.class));
cards.add(new SetCardInfo("Drag Under", 57, Rarity.COMMON, mage.cards.d.DragUnder.class));
cards.add(new SetCardInfo("Drogskol Shieldmate", 22, Rarity.UNCOMMON, mage.cards.d.DrogskolShieldmate.class));
cards.add(new SetCardInfo("Dronepack Kindred", 148, Rarity.COMMON, mage.cards.d.DronepackKindred.class));
cards.add(new SetCardInfo("Drownyard Behemoth", 4, Rarity.UNCOMMON, mage.cards.d.DrownyardBehemoth.class));
cards.add(new SetCardInfo("Dusk Feaster", 88, Rarity.UNCOMMON, mage.cards.d.DuskFeaster.class));
cards.add(new SetCardInfo("Elder Deep-Fiend", 5, Rarity.RARE, mage.cards.e.ElderDeepFiend.class));

View file

@ -20,7 +20,6 @@ public class EldritchMoonPromos extends ExpansionSet {
this.hasBoosters = false;
this.hasBasicLands = false;
cards.add(new SetCardInfo("Abolisher of Bloodlines", "111s", Rarity.RARE, mage.cards.a.AbolisherOfBloodlines.class));
cards.add(new SetCardInfo("Assembled Alphas", 117, Rarity.RARE, mage.cards.a.AssembledAlphas.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Assembled Alphas", "117s", Rarity.RARE, mage.cards.a.AssembledAlphas.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Bedlam Reveler", "118s", Rarity.RARE, mage.cards.b.BedlamReveler.class));

View file

@ -198,10 +198,6 @@ public final class FinalFantasy extends ExpansionSet {
cards.add(new SetCardInfo("Gaelicat", 22, Rarity.COMMON, mage.cards.g.Gaelicat.class));
cards.add(new SetCardInfo("Gaius van Baelsar", 102, Rarity.UNCOMMON, mage.cards.g.GaiusVanBaelsar.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Gaius van Baelsar", 447, Rarity.UNCOMMON, mage.cards.g.GaiusVanBaelsar.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Galian Beast", 125, Rarity.RARE, mage.cards.g.GalianBeast.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Galian Beast", 383, Rarity.RARE, mage.cards.g.GalianBeast.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Galian Beast", 454, Rarity.RARE, mage.cards.g.GalianBeast.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Galian Beast", 528, Rarity.RARE, mage.cards.g.GalianBeast.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Galuf's Final Act", 186, Rarity.UNCOMMON, mage.cards.g.GalufsFinalAct.class));
cards.add(new SetCardInfo("Garland, Knight of Cornelia", 221, Rarity.UNCOMMON, mage.cards.g.GarlandKnightOfCornelia.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Garland, Knight of Cornelia", 486, Rarity.UNCOMMON, mage.cards.g.GarlandKnightOfCornelia.class, NON_FULL_USE_VARIOUS));
@ -237,9 +233,6 @@ public final class FinalFantasy extends ExpansionSet {
cards.add(new SetCardInfo("Hope Estheim", 396, Rarity.RARE, mage.cards.h.HopeEstheim.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Hope Estheim", 491, Rarity.RARE, mage.cards.h.HopeEstheim.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Hope Estheim", 541, Rarity.RARE, mage.cards.h.HopeEstheim.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Hydaelyn, the Mothercrystal", 329, Rarity.RARE, mage.cards.h.HydaelynTheMothercrystal.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Hydaelyn, the Mothercrystal", 39, Rarity.RARE, mage.cards.h.HydaelynTheMothercrystal.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Hydaelyn, the Mothercrystal", 434, Rarity.RARE, mage.cards.h.HydaelynTheMothercrystal.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ice Flan", 55, Rarity.COMMON, mage.cards.i.IceFlan.class));
cards.add(new SetCardInfo("Ice Magic", 56, Rarity.COMMON, mage.cards.i.IceMagic.class));
cards.add(new SetCardInfo("Ignis Scientia", 227, Rarity.UNCOMMON, mage.cards.i.IgnisScientia.class, NON_FULL_USE_VARIOUS));

View file

@ -150,7 +150,6 @@ public final class Innistrad extends ExpansionSet {
cards.add(new SetCardInfo("Heretic's Punishment", 147, Rarity.RARE, mage.cards.h.HereticsPunishment.class));
cards.add(new SetCardInfo("Hinterland Harbor", 241, Rarity.RARE, mage.cards.h.HinterlandHarbor.class));
cards.add(new SetCardInfo("Hollowhenge Scavenger", 188, Rarity.UNCOMMON, mage.cards.h.HollowhengeScavenger.class));
cards.add(new SetCardInfo("Howlpack of Estwald", 209, Rarity.COMMON, mage.cards.h.HowlpackOfEstwald.class));
cards.add(new SetCardInfo("Hysterical Blindness", 59, Rarity.COMMON, mage.cards.h.HystericalBlindness.class));
cards.add(new SetCardInfo("Infernal Plunge", 148, Rarity.COMMON, mage.cards.i.InfernalPlunge.class));
cards.add(new SetCardInfo("Inquisitor's Flail", 227, Rarity.UNCOMMON, mage.cards.i.InquisitorsFlail.class));
@ -158,7 +157,6 @@ public final class Innistrad extends ExpansionSet {
cards.add(new SetCardInfo("Intangible Virtue", 19, Rarity.UNCOMMON, mage.cards.i.IntangibleVirtue.class));
cards.add(new SetCardInfo("Into the Maw of Hell", 150, Rarity.UNCOMMON, mage.cards.i.IntoTheMawOfHell.class));
cards.add(new SetCardInfo("Invisible Stalker", 60, Rarity.UNCOMMON, mage.cards.i.InvisibleStalker.class));
cards.add(new SetCardInfo("Ironfang", 168, Rarity.COMMON, mage.cards.i.Ironfang.class));
cards.add(new SetCardInfo("Island", 253, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Island", 254, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Island", 255, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));

View file

@ -70,9 +70,6 @@ public final class InnistradCrimsonVow extends ExpansionSet {
cards.add(new SetCardInfo("Blood Petal Celebrant", 146, Rarity.COMMON, mage.cards.b.BloodPetalCelebrant.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Blood Petal Celebrant", 303, Rarity.COMMON, mage.cards.b.BloodPetalCelebrant.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Blood Servitor", 252, Rarity.COMMON, mage.cards.b.BloodServitor.class));
cards.add(new SetCardInfo("Bloodbat Summoner", 137, Rarity.RARE, mage.cards.b.BloodbatSummoner.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Bloodbat Summoner", 298, Rarity.RARE, mage.cards.b.BloodbatSummoner.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Bloodbat Summoner", 338, Rarity.RARE, mage.cards.b.BloodbatSummoner.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Bloodcrazed Socialite", 288, Rarity.COMMON, mage.cards.b.BloodcrazedSocialite.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Bloodcrazed Socialite", 96, Rarity.COMMON, mage.cards.b.BloodcrazedSocialite.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Bloodsworn Squire", 289, Rarity.UNCOMMON, mage.cards.b.BloodswornSquire.class, NON_FULL_USE_VARIOUS));
@ -138,8 +135,6 @@ public final class InnistradCrimsonVow extends ExpansionSet {
cards.add(new SetCardInfo("Desperate Farmer", 104, Rarity.COMMON, mage.cards.d.DesperateFarmer.class));
cards.add(new SetCardInfo("Dig Up", 197, Rarity.RARE, mage.cards.d.DigUp.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Dig Up", 387, Rarity.RARE, mage.cards.d.DigUp.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Dire-Strain Anarchist", 181, Rarity.MYTHIC, mage.cards.d.DireStrainAnarchist.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Dire-Strain Anarchist", 382, Rarity.MYTHIC, mage.cards.d.DireStrainAnarchist.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Diregraf Scavenger", 105, Rarity.COMMON, mage.cards.d.DiregrafScavenger.class));
cards.add(new SetCardInfo("Distracting Geist", 9, Rarity.UNCOMMON, mage.cards.d.DistractingGeist.class));
cards.add(new SetCardInfo("Diver Skaab", 56, Rarity.UNCOMMON, mage.cards.d.DiverSkaab.class));
@ -436,7 +431,6 @@ public final class InnistradCrimsonVow extends ExpansionSet {
cards.add(new SetCardInfo("Voldaren Estate", 267, Rarity.RARE, mage.cards.v.VoldarenEstate.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Voldaren Estate", 397, Rarity.RARE, mage.cards.v.VoldarenEstate.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Voldaren Estate", 403, Rarity.RARE, mage.cards.v.VoldarenEstate.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Volt-Charged Berserker", 183, Rarity.UNCOMMON, mage.cards.v.VoltChargedBerserker.class));
cards.add(new SetCardInfo("Voltaic Visionary", 183, Rarity.UNCOMMON, mage.cards.v.VoltaicVisionary.class));
cards.add(new SetCardInfo("Wandering Mind", 251, Rarity.UNCOMMON, mage.cards.w.WanderingMind.class));
cards.add(new SetCardInfo("Wanderlight Spirit", 86, Rarity.COMMON, mage.cards.w.WanderlightSpirit.class));

View file

@ -69,7 +69,6 @@ public final class InnistradDoubleFeature extends ExpansionSet {
cards.add(new SetCardInfo("Blood Pact", 88, Rarity.COMMON, mage.cards.b.BloodPact.class));
cards.add(new SetCardInfo("Blood Petal Celebrant", 413, Rarity.COMMON, mage.cards.b.BloodPetalCelebrant.class));
cards.add(new SetCardInfo("Blood Servitor", 519, Rarity.COMMON, mage.cards.b.BloodServitor.class));
cards.add(new SetCardInfo("Bloodbat Summoner", 404, Rarity.RARE, mage.cards.b.BloodbatSummoner.class));
cards.add(new SetCardInfo("Bloodcrazed Socialite", 363, Rarity.COMMON, mage.cards.b.BloodcrazedSocialite.class));
cards.add(new SetCardInfo("Bloodline Culling", 89, Rarity.RARE, mage.cards.b.BloodlineCulling.class));
cards.add(new SetCardInfo("Bloodsworn Squire", 364, Rarity.UNCOMMON, mage.cards.b.BloodswornSquire.class));
@ -164,7 +163,6 @@ public final class InnistradDoubleFeature extends ExpansionSet {
cards.add(new SetCardInfo("Devious Cover-Up", 48, Rarity.COMMON, mage.cards.d.DeviousCoverUp.class));
cards.add(new SetCardInfo("Devoted Grafkeeper", 218, Rarity.UNCOMMON, mage.cards.d.DevotedGrafkeeper.class));
cards.add(new SetCardInfo("Dig Up", 464, Rarity.RARE, mage.cards.d.DigUp.class));
cards.add(new SetCardInfo("Dire-Strain Anarchist", 448, Rarity.MYTHIC, mage.cards.d.DireStrainAnarchist.class));
cards.add(new SetCardInfo("Dire-Strain Rampage", 219, Rarity.RARE, mage.cards.d.DireStrainRampage.class));
cards.add(new SetCardInfo("Diregraf Horde", 96, Rarity.COMMON, mage.cards.d.DiregrafHorde.class));
cards.add(new SetCardInfo("Diregraf Rebirth", 220, Rarity.UNCOMMON, mage.cards.d.DiregrafRebirth.class));
@ -482,7 +480,6 @@ public final class InnistradDoubleFeature extends ExpansionSet {
cards.add(new SetCardInfo("Stormcarved Coast", 532, Rarity.RARE, mage.cards.s.StormcarvedCoast.class));
cards.add(new SetCardInfo("Stormchaser Drake", 349, Rarity.UNCOMMON, mage.cards.s.StormchaserDrake.class));
cards.add(new SetCardInfo("Stormrider Spirit", 79, Rarity.COMMON, mage.cards.s.StormriderSpirit.class));
cards.add(new SetCardInfo("Strangling Grasp", 126, Rarity.UNCOMMON, mage.cards.s.StranglingGrasp.class));
cards.add(new SetCardInfo("Stromkirk Bloodthief", 123, Rarity.UNCOMMON, mage.cards.s.StromkirkBloodthief.class));
cards.add(new SetCardInfo("Stuffed Bear", 259, Rarity.COMMON, mage.cards.s.StuffedBear.class));
cards.add(new SetCardInfo("Sundown Pass", 533, Rarity.RARE, mage.cards.s.SundownPass.class));
@ -536,7 +533,6 @@ public final class InnistradDoubleFeature extends ExpansionSet {
cards.add(new SetCardInfo("Vanquish the Horde", 41, Rarity.RARE, mage.cards.v.VanquishTheHorde.class));
cards.add(new SetCardInfo("Vengeful Strangler", 126, Rarity.UNCOMMON, mage.cards.v.VengefulStrangler.class));
cards.add(new SetCardInfo("Vilespawn Spider", 517, Rarity.UNCOMMON, mage.cards.v.VilespawnSpider.class));
cards.add(new SetCardInfo("Village Reavers", 165, Rarity.UNCOMMON, mage.cards.v.VillageReavers.class));
cards.add(new SetCardInfo("Village Watch", 165, Rarity.UNCOMMON, mage.cards.v.VillageWatch.class));
cards.add(new SetCardInfo("Vivisection", 83, Rarity.UNCOMMON, mage.cards.v.Vivisection.class));
cards.add(new SetCardInfo("Voice of the Blessed", 311, Rarity.RARE, mage.cards.v.VoiceOfTheBlessed.class));
@ -546,7 +542,6 @@ public final class InnistradDoubleFeature extends ExpansionSet {
cards.add(new SetCardInfo("Voldaren Epicure", 449, Rarity.COMMON, mage.cards.v.VoldarenEpicure.class));
cards.add(new SetCardInfo("Voldaren Estate", 534, Rarity.RARE, mage.cards.v.VoldarenEstate.class));
cards.add(new SetCardInfo("Voldaren Stinger", 167, Rarity.COMMON, mage.cards.v.VoldarenStinger.class));
cards.add(new SetCardInfo("Volt-Charged Berserker", 450, Rarity.UNCOMMON, mage.cards.v.VoltChargedBerserker.class));
cards.add(new SetCardInfo("Voltaic Visionary", 450, Rarity.UNCOMMON, mage.cards.v.VoltaicVisionary.class));
cards.add(new SetCardInfo("Wake to Slaughter", 250, Rarity.RARE, mage.cards.w.WakeToSlaughter.class));
cards.add(new SetCardInfo("Wandering Mind", 518, Rarity.UNCOMMON, mage.cards.w.WanderingMind.class));

View file

@ -368,7 +368,6 @@ public final class InnistradMidnightHunt extends ExpansionSet {
cards.add(new SetCardInfo("Storm the Festival", 200, Rarity.RARE, mage.cards.s.StormTheFestival.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Storm the Festival", 364, Rarity.RARE, mage.cards.s.StormTheFestival.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Stormrider Spirit", 79, Rarity.COMMON, mage.cards.s.StormriderSpirit.class));
cards.add(new SetCardInfo("Strangling Grasp", 126, Rarity.UNCOMMON, mage.cards.s.StranglingGrasp.class));
cards.add(new SetCardInfo("Stromkirk Bloodthief", 123, Rarity.UNCOMMON, mage.cards.s.StromkirkBloodthief.class));
cards.add(new SetCardInfo("Stuffed Bear", 259, Rarity.COMMON, mage.cards.s.StuffedBear.class));
cards.add(new SetCardInfo("Sungold Barrage", 36, Rarity.COMMON, mage.cards.s.SungoldBarrage.class));
@ -419,8 +418,6 @@ public final class InnistradMidnightHunt extends ExpansionSet {
cards.add(new SetCardInfo("Vanquish the Horde", 333, Rarity.RARE, mage.cards.v.VanquishTheHorde.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Vanquish the Horde", 41, Rarity.RARE, mage.cards.v.VanquishTheHorde.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Vengeful Strangler", 126, Rarity.UNCOMMON, mage.cards.v.VengefulStrangler.class));
cards.add(new SetCardInfo("Village Reavers", 165, Rarity.UNCOMMON, mage.cards.v.VillageReavers.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Village Reavers", 297, Rarity.UNCOMMON, mage.cards.v.VillageReavers.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Village Watch", 165, Rarity.UNCOMMON, mage.cards.v.VillageWatch.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Village Watch", 297, Rarity.UNCOMMON, mage.cards.v.VillageWatch.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Vivisection", 83, Rarity.UNCOMMON, mage.cards.v.Vivisection.class));

View file

@ -73,7 +73,6 @@ public class InnistradRemastered extends ExpansionSet {
cards.add(new SetCardInfo("Blood Mist", 143, Rarity.UNCOMMON, mage.cards.b.BloodMist.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Blood Mist", 395, Rarity.UNCOMMON, mage.cards.b.BloodMist.class, RETRO_ART_USE_VARIOUS));
cards.add(new SetCardInfo("Blood Petal Celebrant", 144, Rarity.COMMON, mage.cards.b.BloodPetalCelebrant.class));
cards.add(new SetCardInfo("Bloodbat Summoner", 138, Rarity.RARE, mage.cards.b.BloodbatSummoner.class));
cards.add(new SetCardInfo("Bloodhall Priest", 232, Rarity.RARE, mage.cards.b.BloodhallPriest.class));
cards.add(new SetCardInfo("Bloodline Keeper", 327, Rarity.MYTHIC, mage.cards.b.BloodlineKeeper.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Bloodline Keeper", 461, Rarity.MYTHIC, mage.cards.b.BloodlineKeeper.class, RETRO_ART_USE_VARIOUS));
@ -258,7 +257,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("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));
cards.add(new SetCardInfo("Hullbreaker Horror", 357, Rarity.RARE, mage.cards.h.HullbreakerHorror.class, RETRO_ART_USE_VARIOUS));
@ -330,8 +328,6 @@ public class InnistradRemastered extends ExpansionSet {
cards.add(new SetCardInfo("Mist Raven", 76, Rarity.UNCOMMON, mage.cards.m.MistRaven.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Moldgraf Millipede", 208, Rarity.COMMON, mage.cards.m.MoldgrafMillipede.class));
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("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

@ -269,7 +269,6 @@ public final class Ixalan extends ExpansionSet {
cards.add(new SetCardInfo("Spell Pierce", 81, Rarity.COMMON, mage.cards.s.SpellPierce.class));
cards.add(new SetCardInfo("Spell Swindle", 82, Rarity.RARE, mage.cards.s.SpellSwindle.class));
cards.add(new SetCardInfo("Spike-Tailed Ceratops", 209, Rarity.COMMON, mage.cards.s.SpikeTailedCeratops.class));
cards.add(new SetCardInfo("Spitfire Bastion", 173, Rarity.RARE, mage.cards.s.SpitfireBastion.class));
cards.add(new SetCardInfo("Spreading Rot", 125, Rarity.COMMON, mage.cards.s.SpreadingRot.class));
cards.add(new SetCardInfo("Star of Extinction", 161, Rarity.MYTHIC, mage.cards.s.StarOfExtinction.class));
cards.add(new SetCardInfo("Steadfast Armasaur", 39, Rarity.UNCOMMON, mage.cards.s.SteadfastArmasaur.class));

View file

@ -112,7 +112,6 @@ public class IxalanPromos extends ExpansionSet {
cards.add(new SetCardInfo("Sorcerous Spyglass", "248s", Rarity.RARE, mage.cards.s.SorcerousSpyglass.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Spell Swindle", "82p", Rarity.RARE, mage.cards.s.SpellSwindle.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Spell Swindle", "82s", Rarity.RARE, mage.cards.s.SpellSwindle.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Spitfire Bastion", "173s", Rarity.RARE, mage.cards.s.SpitfireBastion.class));
cards.add(new SetCardInfo("Star of Extinction", "161p", Rarity.MYTHIC, mage.cards.s.StarOfExtinction.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Star of Extinction", "161s", Rarity.MYTHIC, mage.cards.s.StarOfExtinction.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Sunbird's Invocation", "165p", Rarity.RARE, mage.cards.s.SunbirdsInvocation.class, NON_FULL_USE_VARIOUS));

View file

@ -659,7 +659,6 @@ public class MagicOnlinePromos extends ExpansionSet {
cards.add(new SetCardInfo("Dimir Guildmage", 32579, Rarity.UNCOMMON, mage.cards.d.DimirGuildmage.class));
cards.add(new SetCardInfo("Dimir Signet", 46924, Rarity.UNCOMMON, mage.cards.d.DimirSignet.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Dimir Signet", 62435, Rarity.COMMON, mage.cards.d.DimirSignet.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Dire-Strain Anarchist", 95397, Rarity.MYTHIC, mage.cards.d.DireStrainAnarchist.class));
cards.add(new SetCardInfo("Dire-Strain Rampage", 94070, Rarity.RARE, mage.cards.d.DireStrainRampage.class));
cards.add(new SetCardInfo("Diregraf Ghoul", 42882, Rarity.UNCOMMON, mage.cards.d.DiregrafGhoul.class));
cards.add(new SetCardInfo("Dirge Bat", 80935, Rarity.RARE, mage.cards.d.DirgeBat.class, NON_FULL_USE_VARIOUS));

View file

@ -379,9 +379,6 @@ public final class MarchOfTheMachine extends ExpansionSet {
cards.add(new SetCardInfo("Terror of Towashi", 378, Rarity.RARE, mage.cards.t.TerrorOfTowashi.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Thalia and The Gitrog Monster", 255, Rarity.MYTHIC, mage.cards.t.ThaliaAndTheGitrogMonster.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Thalia and The Gitrog Monster", 316, Rarity.MYTHIC, mage.cards.t.ThaliaAndTheGitrogMonster.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Grand Evolution", 213, Rarity.MYTHIC, mage.cards.t.TheGrandEvolution.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Grand Evolution", 301, Rarity.MYTHIC, mage.cards.t.TheGrandEvolution.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Grand Evolution", 342, Rarity.MYTHIC, mage.cards.t.TheGrandEvolution.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

@ -198,7 +198,6 @@ public final class ShadowsOverInnistrad extends ExpansionSet {
cards.add(new SetCardInfo("Mindwrack Demon", 124, Rarity.MYTHIC, mage.cards.m.MindwrackDemon.class));
cards.add(new SetCardInfo("Moldgraf Scavenger", 218, Rarity.COMMON, mage.cards.m.MoldgrafScavenger.class));
cards.add(new SetCardInfo("Moonlight Hunt", 219, Rarity.UNCOMMON, mage.cards.m.MoonlightHunt.class));
cards.add(new SetCardInfo("Moonrise Intruder", 190, Rarity.UNCOMMON, mage.cards.m.MoonriseIntruder.class));
cards.add(new SetCardInfo("Moorland Drifter", 27, Rarity.COMMON, mage.cards.m.MoorlandDrifter.class));
cards.add(new SetCardInfo("Morkrut Necropod", 125, Rarity.UNCOMMON, mage.cards.m.MorkrutNecropod.class));
cards.add(new SetCardInfo("Mountain", 292, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));

View file

@ -25,7 +25,6 @@ public class ShadowsOverInnistradRemastered extends ExpansionSet {
// TODO: implement special slot with x1 card from SIS - Shadows of the Past
// https://mtg.fandom.com/wiki/Shadows_over_Innistrad_Remastered/Shadows_of_the_Past
cards.add(new SetCardInfo("Abolisher of Bloodlines", 138, Rarity.RARE, mage.cards.a.AbolisherOfBloodlines.class));
cards.add(new SetCardInfo("Abundant Maw", 1, Rarity.UNCOMMON, mage.cards.a.AbundantMaw.class));
cards.add(new SetCardInfo("Accursed Witch", 97, Rarity.UNCOMMON, mage.cards.a.AccursedWitch.class));
cards.add(new SetCardInfo("Advanced Stitchwing", 54, Rarity.UNCOMMON, mage.cards.a.AdvancedStitchwing.class));
@ -207,7 +206,6 @@ public class ShadowsOverInnistradRemastered extends ExpansionSet {
cards.add(new SetCardInfo("Mirrorwing Dragon", 170, Rarity.MYTHIC, mage.cards.m.MirrorwingDragon.class));
cards.add(new SetCardInfo("Mockery of Nature", 8, Rarity.UNCOMMON, mage.cards.m.MockeryOfNature.class));
cards.add(new SetCardInfo("Moonlight Hunt", 205, Rarity.COMMON, mage.cards.m.MoonlightHunt.class));
cards.add(new SetCardInfo("Moonrise Intruder", 184, Rarity.UNCOMMON, mage.cards.m.MoonriseIntruder.class));
cards.add(new SetCardInfo("Morkrut Necropod", 125, Rarity.COMMON, mage.cards.m.MorkrutNecropod.class));
cards.add(new SetCardInfo("Mountain", 286, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Mountain", 287, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));

View file

@ -151,7 +151,6 @@ public final class TheLostCavernsOfIxalan extends ExpansionSet {
cards.add(new SetCardInfo("Disruptor Wanderglyph", 253, Rarity.COMMON, mage.cards.d.DisruptorWanderglyph.class));
cards.add(new SetCardInfo("Disturbed Slumber", 182, Rarity.COMMON, mage.cards.d.DisturbedSlumber.class));
cards.add(new SetCardInfo("Dowsing Device", 146, Rarity.UNCOMMON, mage.cards.d.DowsingDevice.class));
cards.add(new SetCardInfo("Dread Osseosaur", 129, Rarity.UNCOMMON, mage.cards.d.DreadOsseosaur.class));
cards.add(new SetCardInfo("Dreadmaw's Ire", 147, Rarity.UNCOMMON, mage.cards.d.DreadmawsIre.class));
cards.add(new SetCardInfo("Dusk Rose Reliquary", 10, Rarity.UNCOMMON, mage.cards.d.DuskRoseReliquary.class));
cards.add(new SetCardInfo("Earthshaker Dreadmaw", 183, Rarity.UNCOMMON, mage.cards.e.EarthshakerDreadmaw.class, NON_FULL_USE_VARIOUS));

View file

@ -27,7 +27,6 @@ public class XLNTreasureChest extends ExpansionSet {
cards.add(new SetCardInfo("Legion's Landing", 22, Rarity.RARE, mage.cards.l.LegionsLanding.class));
cards.add(new SetCardInfo("Primal Amulet", 243, Rarity.RARE, mage.cards.p.PrimalAmulet.class));
cards.add(new SetCardInfo("Search for Azcanta", 74, Rarity.RARE, mage.cards.s.SearchForAzcanta.class));
cards.add(new SetCardInfo("Spitfire Bastion", 173, Rarity.RARE, mage.cards.s.SpitfireBastion.class));
cards.add(new SetCardInfo("Thaumatic Compass", 249, Rarity.RARE, mage.cards.t.ThaumaticCompass.class));
cards.add(new SetCardInfo("Treasure Map", 250, Rarity.RARE, mage.cards.t.TreasureMap.class));
cards.add(new SetCardInfo("Vance's Blasting Cannons", 173, Rarity.RARE, mage.cards.v.VancesBlastingCannons.class));