convert transforming "R" cards to single class file

part of #14099
This commit is contained in:
jmlundeen 2025-12-02 20:17:30 -06:00
parent 23dc279b9b
commit 6906072ec4
28 changed files with 400 additions and 759 deletions

View file

@ -1,54 +0,0 @@
package mage.cards.a;
import mage.MageInt;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.effects.common.DamageControllerEffect;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.TapSourceEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.TrampleAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.common.FilterControlledPermanent;
import java.util.UUID;
/**
* @author anonymous
*/
public final class ArchdemonOfGreed extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent(SubType.HUMAN, "Human");
public ArchdemonOfGreed(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.DEMON);
this.color.setBlack(true);
this.nightCard = true;
this.power = new MageInt(9);
this.toughness = new MageInt(9);
this.addAbility(FlyingAbility.getInstance());
this.addAbility(TrampleAbility.getInstance());
// At the beginning of your upkeep, sacrifice a Human. If you can't, tap Archdemon of Greed and it deals 9 damage to you.
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new DoIfCostPaid(
null, new TapSourceEffect(), new SacrificeTargetCost(filter), false
).addOtherwiseEffect(new DamageControllerEffect(9))
.setText("sacrifice a Human. If you can't, tap {this} and it deals 9 damage to you")));
}
private ArchdemonOfGreed(final ArchdemonOfGreed card) {
super(card);
}
@Override
public ArchdemonOfGreed copy() {
return new ArchdemonOfGreed(this);
}
}

View file

@ -1,64 +0,0 @@
package mage.cards.b;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.YouGainedLifeCondition;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.LoseLifeOpponentsEffect;
import mage.abilities.hint.ConditionHint;
import mage.abilities.hint.Hint;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.TargetController;
import mage.game.permanent.token.BloodToken;
import mage.watchers.common.PlayerGainedLifeWatcher;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class BloodsoakedReveler extends CardImpl {
private static final Condition condition = new YouGainedLifeCondition();
private static final Hint hint = new ConditionHint(condition, "You gained life this turn");
public BloodsoakedReveler(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.VAMPIRE);
this.power = new MageInt(3);
this.toughness = new MageInt(3);
this.color.setBlack(true);
this.nightCard = true;
// At the beginning of your end step, if you gained life this turn, create a Blood token.
this.addAbility(new BeginningOfEndStepTriggeredAbility(
TargetController.YOU, new CreateTokenEffect(new BloodToken()),
false, condition
).addHint(hint), new PlayerGainedLifeWatcher());
// {4}{B}: Each opponent loses 2 life and you gain 2 life.
Ability ability = new SimpleActivatedAbility(
new LoseLifeOpponentsEffect(2), new ManaCostsImpl<>("{4}{B}")
);
ability.addEffect(new GainLifeEffect(2).concatBy("and"));
this.addAbility(ability);
}
private BloodsoakedReveler(final BloodsoakedReveler card) {
super(card);
}
@Override
public BloodsoakedReveler copy() {
return new BloodsoakedReveler(this);
}
}

View file

@ -1,98 +0,0 @@
package mage.cards.k;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateTokenCopyTargetEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterAttackingCreature;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.TargetPermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class KrothussLordOfTheDeep extends CardImpl {
private static final FilterPermanent filter = new FilterAttackingCreature("another attacking creature");
static {
filter.add(AnotherPredicate.instance);
}
public KrothussLordOfTheDeep(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.KRAKEN);
this.subtype.add(SubType.HORROR);
this.power = new MageInt(3);
this.toughness = new MageInt(5);
this.color.setBlue(true);
this.color.setBlack(true);
this.nightCard = true;
// Flying
this.addAbility(FlyingAbility.getInstance());
// Whenever Krothuss, Lord of the Deep attacks, create a tapped and attacking token that's a copy of another target attacking creature. If that creature is a Kraken, Leviathan, Octopus, or Serpent, create two of those tokens instead.
Ability ability = new AttacksTriggeredAbility(new KrothussLordOfTheDeepEffect());
ability.addTarget(new TargetPermanent(filter));
this.addAbility(ability);
}
private KrothussLordOfTheDeep(final KrothussLordOfTheDeep card) {
super(card);
}
@Override
public KrothussLordOfTheDeep copy() {
return new KrothussLordOfTheDeep(this);
}
}
class KrothussLordOfTheDeepEffect extends OneShotEffect {
KrothussLordOfTheDeepEffect() {
super(Outcome.Benefit);
staticText = "create a tapped and attacking token that's a copy of another target attacking creature. " +
"If that creature is a Kraken, Leviathan, Octopus, or Serpent, create two of those tokens instead";
}
private KrothussLordOfTheDeepEffect(final KrothussLordOfTheDeepEffect effect) {
super(effect);
}
@Override
public KrothussLordOfTheDeepEffect copy() {
return new KrothussLordOfTheDeepEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getFirstTarget());
if (permanent == null) {
return false;
}
int count = permanent.hasSubtype(SubType.KRAKEN, game)
|| permanent.hasSubtype(SubType.LEVIATHAN, game)
|| permanent.hasSubtype(SubType.OCTOPUS, game)
|| permanent.hasSubtype(SubType.SERPENT, game) ? 2 : 1;
return new CreateTokenCopyTargetEffect(
null, null,
false, count, true, true
).apply(game, source);
}
}

View file

@ -1,40 +0,0 @@
package mage.cards.m;
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 MercilessPredator extends CardImpl {
public MercilessPredator(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(2);
// At the beginning of each upkeep, if a player cast two or more spells last turn, transform Merciless Predator.
this.addAbility(new WerewolfBackTriggeredAbility());
}
private MercilessPredator(final MercilessPredator card) {
super(card);
}
@Override
public MercilessPredator copy() {
return new MercilessPredator(this);
}
}

View file

@ -1,49 +0,0 @@
package mage.cards.o;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.LoseLifeTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SetTargetPointer;
import mage.constants.SubType;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class OdiousWitch extends CardImpl {
public OdiousWitch(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.WARLOCK);
this.power = new MageInt(3);
this.toughness = new MageInt(3);
this.color.setBlack(true);
this.nightCard = true;
// Whenever Odious Witch attacks, defending player loses 1 life and you gain 1 life.
Ability ability = new AttacksTriggeredAbility(
new LoseLifeTargetEffect(1)
.setText("defending player loses 1 life"),
false, null, SetTargetPointer.PLAYER
);
ability.addEffect(new GainLifeEffect(1).concatBy("and"));
this.addAbility(ability);
}
private OdiousWitch(final OdiousWitch card) {
super(card);
}
@Override
public OdiousWitch copy() {
return new OdiousWitch(this);
}
}

View file

@ -5,18 +5,21 @@ import mage.abilities.common.DiesAttachedTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.PermanentsEnterBattlefieldTappedEffect;
import mage.abilities.effects.common.continuous.BoostEnchantedEffect;
import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
import mage.abilities.keyword.EnchantAbility;
import mage.abilities.keyword.TransformAbility;
import mage.abilities.keyword.VigilanceAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.DoubleFacedCardHalf;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.filter.common.FilterCreaturePermanent;
import mage.game.Game;
import mage.players.Player;
import mage.target.TargetPermanent;
import mage.target.TargetPlayer;
import mage.target.common.TargetCreaturePermanent;
import mage.target.common.TargetOpponent;
@ -25,34 +28,52 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class RadiantGrace extends CardImpl {
public final class RadiantGrace extends TransformingDoubleFacedCard {
private static final FilterCreaturePermanent filter
= new FilterCreaturePermanent("creatures enchanted player controls");
static {
filter.add(TargetController.ENCHANTED.getControllerPredicate());
}
public RadiantGrace(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{W}");
this.subtype.add(SubType.AURA);
this.secondSideCardClazz = mage.cards.r.RadiantRestraints.class;
super(ownerId, setInfo,
new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.AURA}, "{W}",
"Radiant Restraints",
new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.AURA, SubType.CURSE}, "W"
);
// Radiant Grace
// Enchant creature
TargetPermanent auraTarget = new TargetCreaturePermanent();
this.getSpellAbility().addTarget(auraTarget);
this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
this.addAbility(new EnchantAbility(auraTarget));
this.getLeftHalfCard().getSpellAbility().addTarget(auraTarget);
this.getLeftHalfCard().getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
this.getLeftHalfCard().addAbility(new EnchantAbility(auraTarget));
// Enchanted creature gets +1/+0 and has vigilance.
Ability ability = new SimpleStaticAbility(new BoostEnchantedEffect(1, 0));
ability.addEffect(new GainAbilityAttachedEffect(
VigilanceAbility.getInstance(), AttachmentType.AURA
).setText("and has vigilance"));
this.addAbility(ability);
this.getLeftHalfCard().addAbility(ability);
// When enchanted creature dies, return Radiant Grace to the battlefield transformed under your control attached to target opponent.
this.addAbility(new TransformAbility());
ability = new DiesAttachedTriggeredAbility(
new RadiantGraceEffect(), "enchanted creature", false
);
ability.addTarget(new TargetOpponent());
this.addAbility(ability);
this.getLeftHalfCard().addAbility(ability);
// Radiant Restraints
// Enchant player
TargetPlayer auraTarget2 = new TargetPlayer();
this.getRightHalfCard().getSpellAbility().addTarget(auraTarget2);
this.getRightHalfCard().getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
this.getRightHalfCard().addAbility(new EnchantAbility(auraTarget2));
// Creatures enchanted player controls enter the battlefield tapped.
this.getRightHalfCard().addAbility(new SimpleStaticAbility(new PermanentsEnterBattlefieldTappedEffect(filter)));
}
private RadiantGrace(final RadiantGrace card) {
@ -90,13 +111,13 @@ class RadiantGraceEffect 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(), player.getId());
game.getState().setValue("attachTo:" + card.getOtherSide().getId(), player.getId());
if (controller.moveCards(card, Zone.BATTLEFIELD, source, game)) {
player.addAttachment(card.getId(), source, game);
}

View file

@ -1,56 +0,0 @@
package mage.cards.r;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.PermanentsEnterBattlefieldTappedEffect;
import mage.abilities.keyword.EnchantAbility;
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.common.FilterCreaturePermanent;
import mage.target.TargetPlayer;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class RadiantRestraints extends CardImpl {
private static final FilterCreaturePermanent filter
= new FilterCreaturePermanent("creatures enchanted player controls");
static {
filter.add(TargetController.ENCHANTED.getControllerPredicate());
}
public RadiantRestraints(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "");
this.subtype.add(SubType.AURA);
this.subtype.add(SubType.CURSE);
this.color.setWhite(true);
this.nightCard = true;
// Enchant player
TargetPlayer auraTarget = new TargetPlayer();
this.getSpellAbility().addTarget(auraTarget);
this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
this.addAbility(new EnchantAbility(auraTarget));
// Creatures enchanted player controls enter the battlefield tapped.
this.addAbility(new SimpleStaticAbility(new PermanentsEnterBattlefieldTappedEffect(filter)));
}
private RadiantRestraints(final RadiantRestraints card) {
super(card);
}
@Override
public RadiantRestraints copy() {
return new RadiantRestraints(this);
}
}

View file

@ -1,40 +1,54 @@
package mage.cards.r;
import mage.MageInt;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.condition.common.ControllerDiscardedThisTurnCondition;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.LoseLifeTargetEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.hint.common.ControllerDiscardedHint;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SetTargetPointer;
import mage.constants.SubType;
import mage.constants.TargetController;
import mage.watchers.common.DiscardedCardWatcher;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class RaggedRecluse extends CardImpl {
public final class RaggedRecluse extends TransformingDoubleFacedCard {
public RaggedRecluse(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.PEASANT}, "{1}{B}",
"Odious Witch",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WARLOCK}, "B"
);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.PEASANT);
this.power = new MageInt(2);
this.toughness = new MageInt(1);
this.secondSideCardClazz = mage.cards.o.OdiousWitch.class;
// Ragged Recluse
this.getLeftHalfCard().setPT(2, 1);
// At the beginning of your end step, if you discarded a card this turn, transform Ragged Recluse.
this.addAbility(new TransformAbility());
this.addAbility(new BeginningOfEndStepTriggeredAbility(
this.getLeftHalfCard().addAbility(new BeginningOfEndStepTriggeredAbility(
TargetController.YOU, new TransformSourceEffect(),
false, ControllerDiscardedThisTurnCondition.instance
).addHint(ControllerDiscardedHint.instance), new DiscardedCardWatcher());
).addHint(ControllerDiscardedHint.instance));
// Odious Witch
this.getRightHalfCard().setPT(3, 3);
// Whenever Odious Witch attacks, defending player loses 1 life and you gain 1 life.
Ability ability = new AttacksTriggeredAbility(
new LoseLifeTargetEffect(1)
.setText("defending player loses 1 life"),
false, null, SetTargetPointer.PLAYER
);
ability.addEffect(new GainLifeEffect(1).concatBy("and"));
this.getRightHalfCard().addAbility(ability);
}
private RaggedRecluse(final RaggedRecluse card) {

View file

@ -1,23 +1,28 @@
package mage.cards.r;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.DiesCreatureTriggeredAbility;
import mage.abilities.common.GainLifeControllerTriggeredAbility;
import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.keyword.LifelinkAbility;
import mage.abilities.keyword.LivingMetalAbility;
import mage.abilities.keyword.MoreThanMeetsTheEyeAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.filter.FilterCard;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterArtifactCard;
import mage.filter.common.FilterControlledArtifactPermanent;
import mage.filter.predicate.Predicate;
import mage.filter.predicate.permanent.TokenPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.common.TargetCardInYourGraveyard;
@ -28,27 +33,51 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class RatchetFieldMedic extends CardImpl {
public final class RatchetFieldMedic extends TransformingDoubleFacedCard {
private static final FilterPermanent filterNontokenArtifacts = new FilterControlledArtifactPermanent();
static {
filterNontokenArtifacts.add(TokenPredicate.FALSE);
}
public RatchetFieldMedic(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{2}{W}");
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, new SubType[]{SubType.ROBOT}, "{2}{W}",
"Ratchet, Rescue Racer",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ARTIFACT}, new SubType[]{SubType.VEHICLE}, "W"
);
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.ROBOT);
this.power = new MageInt(2);
this.toughness = new MageInt(4);
this.secondSideCardClazz = mage.cards.r.RatchetRescueRacer.class;
// Ratchet, Field Medic
this.getLeftHalfCard().setPT(2, 4);
// More Than Meets the Eye {1}{W}
this.addAbility(new MoreThanMeetsTheEyeAbility(this, "{1}{W}"));
this.getLeftHalfCard().addAbility(new MoreThanMeetsTheEyeAbility(this, "{1}{W}"));
// Lifelink
this.addAbility(LifelinkAbility.getInstance());
this.getLeftHalfCard().addAbility(LifelinkAbility.getInstance());
// Whenever you gain life, you may convert Ratchet. When you do, return target artifact card with mana value less than or equal to the amount of life you gained this turn from your graveyard to the battlefield tapped.
this.addAbility(new GainLifeControllerTriggeredAbility(
Ability ability = new GainLifeControllerTriggeredAbility(
new RatchetFieldMedicEffect(), true
), new PlayerGainedLifeWatcher());
);
ability.addWatcher(new PlayerGainedLifeWatcher());
this.getLeftHalfCard().addAbility(ability);
// Ratchet, Rescue Racer
this.getRightHalfCard().setPT(1, 4);
// Living metal
this.getRightHalfCard().addAbility(new LivingMetalAbility());
// Lifelink
this.getRightHalfCard().addAbility(LifelinkAbility.getInstance());
// Whenever one or more nontoken artifacts you control are put into a graveyard from the battlefield, convert Ratchet. This ability triggers only once each turn.
this.getRightHalfCard().addAbility(new DiesCreatureTriggeredAbility(
new TransformSourceEffect().setText("convert {this}"), false, filterNontokenArtifacts
).setTriggerPhrase("Whenever one or more nontoken artifacts you control are put into a graveyard from the battlefield, ")
.setTriggersLimitEachTurn(1));
}
private RatchetFieldMedic(final RatchetFieldMedic card) {

View file

@ -1,61 +0,0 @@
package mage.cards.r;
import mage.MageInt;
import mage.abilities.common.DiesCreatureTriggeredAbility;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.keyword.LifelinkAbility;
import mage.abilities.keyword.LivingMetalAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledArtifactPermanent;
import mage.filter.predicate.permanent.TokenPredicate;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class RatchetRescueRacer extends CardImpl {
private static final FilterPermanent filter = new FilterControlledArtifactPermanent();
static {
filter.add(TokenPredicate.FALSE);
}
public RatchetRescueRacer(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.VEHICLE);
this.power = new MageInt(1);
this.toughness = new MageInt(4);
this.color.setWhite(true);
this.nightCard = true;
// Living metal
this.addAbility(new LivingMetalAbility());
// Lifelink
this.addAbility(LifelinkAbility.getInstance());
// Whenever one or more nontoken artifacts you control are put into a graveyard from the battlefield, convert Ratchet. This ability triggers only once each turn.
this.addAbility(new DiesCreatureTriggeredAbility(
new TransformSourceEffect().setText("convert {this}"), false, filter
).setTriggerPhrase("Whenever one or more nontoken artifacts you control " +
"are put into a graveyard from the battlefield, ").setTriggersLimitEachTurn(1));
}
private RatchetRescueRacer(final RatchetRescueRacer card) {
super(card);
}
@Override
public RatchetRescueRacer copy() {
return new RatchetRescueRacer(this);
}
}

View file

@ -1,12 +1,16 @@
package mage.cards.r;
import mage.MageInt;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.effects.common.DamageControllerEffect;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.TapSourceEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.TrampleAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.common.FilterControlledPermanent;
@ -16,22 +20,37 @@ import java.util.UUID;
/**
* @author intimidatingant
*/
public final class RavenousDemon extends CardImpl {
public final class RavenousDemon extends TransformingDoubleFacedCard {
private static final FilterControlledPermanent filter = new FilterControlledPermanent(SubType.HUMAN, "Human");
public RavenousDemon(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}{B}");
this.subtype.add(SubType.DEMON);
super(ownerId, setInfo,
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.DEMON}, "{3}{B}{B}",
"Archdemon of Greed",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.DEMON}, "B"
);
this.secondSideCardClazz = mage.cards.a.ArchdemonOfGreed.class;
this.power = new MageInt(4);
this.toughness = new MageInt(4);
// Ravenous Demon
this.getLeftHalfCard().setPT(4, 4);
// Sacrifice a Human: Transform Ravenous Demon. Activate this ability only any time you could cast a sorcery.
this.addAbility(new TransformAbility());
this.addAbility(new ActivateAsSorceryActivatedAbility(new TransformSourceEffect(), new SacrificeTargetCost(filter)));
this.getLeftHalfCard().addAbility(new ActivateAsSorceryActivatedAbility(new TransformSourceEffect(), new SacrificeTargetCost(filter)));
// Archdemon of Greed
this.getRightHalfCard().setPT(9, 9);
// Flying
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
// Trample
this.getRightHalfCard().addAbility(TrampleAbility.getInstance());
// At the beginning of your upkeep, sacrifice a Human. If you can't, tap Archdemon of Greed and it deals 9 damage to you.
this.getRightHalfCard().addAbility(new BeginningOfUpkeepTriggeredAbility(new DoIfCostPaid(
null, new TapSourceEffect(), new SacrificeTargetCost(filter), false
).addOtherwiseEffect(new DamageControllerEffect(9))
.setText("sacrifice a Human. If you can't, tap {this} and it deals 9 damage to you")));
}
private RavenousDemon(final RavenousDemon card) {

View file

@ -1,14 +1,15 @@
package mage.cards.r;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.keyword.DayboundAbility;
import mage.abilities.keyword.HasteAbility;
import mage.cards.CardImpl;
import mage.abilities.keyword.NightboundAbility;
import mage.abilities.keyword.TrampleAbility;
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;
@ -19,16 +20,17 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class RecklessStormseeker extends CardImpl {
public final class RecklessStormseeker extends TransformingDoubleFacedCard {
public RecklessStormseeker(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}");
super(ownerId, setInfo,
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WEREWOLF}, "{2}{R}",
"Storm-Charged Slasher",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "R"
);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.WEREWOLF);
this.power = new MageInt(2);
this.toughness = new MageInt(3);
this.secondSideCardClazz = mage.cards.s.StormChargedSlasher.class;
// Reckless Stormseeker
this.getLeftHalfCard().setPT(2, 3);
// At the beginning of combat on your turn, target creature you control gets +1/+0 and gains haste until end of turn.
Ability ability = new BeginningOfCombatTriggeredAbility(
@ -39,10 +41,30 @@ public final class RecklessStormseeker extends CardImpl {
HasteAbility.getInstance(), Duration.EndOfTurn
).setText("and gains haste until end of turn"));
ability.addTarget(new TargetControlledCreaturePermanent());
this.addAbility(ability);
this.getLeftHalfCard().addAbility(ability);
// Daybound
this.addAbility(new DayboundAbility());
this.getLeftHalfCard().addAbility(new DayboundAbility());
// Storm-Charged Slasher
this.getRightHalfCard().setPT(3, 4);
// At the beginning of combat on your turn, target creature you control gets +2/+0 and gains trample and haste until end of turn.
Ability ability2 = new BeginningOfCombatTriggeredAbility(
new BoostTargetEffect(2, 0)
.setText("target creature you control gets +2/+0")
);
ability2.addEffect(new GainAbilityTargetEffect(
TrampleAbility.getInstance(), Duration.EndOfTurn
).setText("and gains trample"));
ability2.addEffect(new GainAbilityTargetEffect(
HasteAbility.getInstance(), Duration.EndOfTurn
).setText("and haste until end of turn"));
ability2.addTarget(new TargetControlledCreaturePermanent());
this.getRightHalfCard().addAbility(ability2);
// Nightbound
this.getRightHalfCard().addAbility(new NightboundAbility());
}
private RecklessStormseeker(final RecklessStormseeker card) {

View file

@ -1,10 +1,9 @@
package mage.cards.r;
import mage.MageInt;
import mage.abilities.common.WerewolfBackTriggeredAbility;
import mage.abilities.common.WerewolfFrontTriggeredAbility;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
@ -13,22 +12,26 @@ import java.util.UUID;
/**
* @author nantuko
*/
public final class RecklessWaif extends CardImpl {
public final class RecklessWaif extends TransformingDoubleFacedCard {
public RecklessWaif(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{R}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.ROGUE);
this.subtype.add(SubType.WEREWOLF);
super(ownerId, setInfo,
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.ROGUE, SubType.WEREWOLF}, "{R}",
"Merciless Predator",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "R"
);
this.secondSideCardClazz = mage.cards.m.MercilessPredator.class;
this.power = new MageInt(1);
this.toughness = new MageInt(1);
// Reckless Waif
this.getLeftHalfCard().setPT(1, 1);
// At the beginning of each upkeep, if no spells were cast last turn, transform Reckless Waif.
this.addAbility(new TransformAbility());
this.addAbility(new WerewolfFrontTriggeredAbility());
this.getLeftHalfCard().addAbility(new WerewolfFrontTriggeredAbility());
// Merciless Predator
this.getRightHalfCard().setPT(3, 2);
// At the beginning of each upkeep, if a player cast two or more spells last turn, transform Merciless Predator.
this.getRightHalfCard().addAbility(new WerewolfBackTriggeredAbility());
}
private RecklessWaif(final RecklessWaif card) {

View file

@ -1,30 +1,34 @@
package mage.cards.r;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.YouGainedLifeCondition;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.LoseLifeOpponentsEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.hint.ConditionHint;
import mage.abilities.hint.Hint;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.TargetController;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.permanent.TokenPredicate;
import mage.game.permanent.token.BloodToken;
import mage.watchers.common.PlayerGainedLifeWatcher;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class RestlessBloodseeker extends CardImpl {
public final class RestlessBloodseeker extends TransformingDoubleFacedCard {
private static final Condition condition = new YouGainedLifeCondition();
private static final Hint hint = new ConditionHint(condition, "You gained life this turn");
@ -36,25 +40,42 @@ public final class RestlessBloodseeker extends CardImpl {
}
public RestlessBloodseeker(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}");
super(ownerId, setInfo,
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.VAMPIRE}, "{1}{B}",
"Bloodsoaked Reveler",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.VAMPIRE}, "B"
);
this.subtype.add(SubType.VAMPIRE);
this.power = new MageInt(1);
this.toughness = new MageInt(3);
this.secondSideCardClazz = mage.cards.b.BloodsoakedReveler.class;
// Restless Bloodseeker
this.getLeftHalfCard().setPT(1, 3);
// At the beginning of your end step, if you gained life this turn, create a Blood token.
this.addAbility(new BeginningOfEndStepTriggeredAbility(
this.getLeftHalfCard().addAbility(new BeginningOfEndStepTriggeredAbility(
TargetController.YOU, new CreateTokenEffect(new BloodToken()),
false, condition
).addHint(hint), new PlayerGainedLifeWatcher());
).addHint(hint));
// Sacrifice two Blood tokens: Transform Restless Bloodseeker. Activate only as a sorcery.
this.addAbility(new TransformAbility());
this.addAbility(new ActivateAsSorceryActivatedAbility(
this.getLeftHalfCard().addAbility(new ActivateAsSorceryActivatedAbility(
new TransformSourceEffect(),
new SacrificeTargetCost(2, filter)
));
// Bloodsoaked Reveler
this.getRightHalfCard().setPT(3, 3);
// At the beginning of your end step, if you gained life this turn, create a Blood token.
this.getRightHalfCard().addAbility(new BeginningOfEndStepTriggeredAbility(
TargetController.YOU, new CreateTokenEffect(new BloodToken()),
false, condition
).addHint(hint));
// {4}{B}: Each opponent loses 2 life and you gain 2 life.
Ability ability = new SimpleActivatedAbility(
new LoseLifeOpponentsEffect(2), new ManaCostsImpl<>("{4}{B}")
);
ability.addEffect(new GainLifeEffect(2).concatBy("and"));
this.getRightHalfCard().addAbility(ability);
}
private RestlessBloodseeker(final RestlessBloodseeker card) {

View file

@ -1,28 +1,34 @@
package mage.cards.r;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.DrawDiscardControllerEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.UntapSourceEffect;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.abilities.keyword.TrampleAbility;
import mage.cards.Card;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.filter.FilterSpell;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.players.Player;
import mage.target.targetpointer.FixedTarget;
import mage.util.CardUtil;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class RonaHeraldOfInvasion extends CardImpl {
public final class RonaHeraldOfInvasion extends TransformingDoubleFacedCard {
private static final FilterSpell filter = new FilterSpell("a legendary spell");
@ -31,26 +37,34 @@ public final class RonaHeraldOfInvasion extends CardImpl {
}
public RonaHeraldOfInvasion(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}");
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WIZARD}, "{1}{U}",
"Rona, Tolarian Obliterator",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.PHYREXIAN, SubType.WIZARD}, "UB"
);
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.WIZARD);
this.power = new MageInt(1);
this.toughness = new MageInt(3);
this.secondSideCardClazz = mage.cards.r.RonaTolarianObliterator.class;
// Rona, Herald of Invasion
this.getLeftHalfCard().setPT(1, 3);
// Whenever you cast a legendary spell, untap Rona, Herald of Invasion.
this.addAbility(new SpellCastControllerTriggeredAbility(new UntapSourceEffect(), filter, false));
this.getLeftHalfCard().addAbility(new SpellCastControllerTriggeredAbility(new UntapSourceEffect(), filter, false));
// {T}: Draw a card, then discard a card.
this.addAbility(new SimpleActivatedAbility(
this.getLeftHalfCard().addAbility(new SimpleActivatedAbility(
new DrawDiscardControllerEffect(1, 1), new TapSourceCost()
));
// {5}{B/P}: Transform Rona. Activate only as a sorcery.
this.addAbility(new TransformAbility());
this.addAbility(new ActivateAsSorceryActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{5}{B/P}")));
this.getLeftHalfCard().addAbility(new ActivateAsSorceryActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{5}{B/P}")));
// Rona, Tolarian Obliterator
this.getRightHalfCard().setPT(5, 5);
// Trample
this.getRightHalfCard().addAbility(TrampleAbility.getInstance());
// Whenever a source deals damage to Rona, Tolarian Obliterator, that source's controller exiles a card from their hand at random. If it's a land card, you may put it onto the battlefield under your control. Otherwise, you may cast it without paying its mana cost.
this.getRightHalfCard().addAbility(new RonaTolarianObliteratorTriggeredAbility());
}
private RonaHeraldOfInvasion(final RonaHeraldOfInvasion card) {
@ -62,3 +76,75 @@ public final class RonaHeraldOfInvasion extends CardImpl {
return new RonaHeraldOfInvasion(this);
}
}
class RonaTolarianObliteratorTriggeredAbility extends TriggeredAbilityImpl {
RonaTolarianObliteratorTriggeredAbility() {
super(Zone.BATTLEFIELD, new RonaTolarianObliteratorEffect());
}
private RonaTolarianObliteratorTriggeredAbility(final RonaTolarianObliteratorTriggeredAbility ability) {
super(ability);
}
@Override
public RonaTolarianObliteratorTriggeredAbility copy() {
return new RonaTolarianObliteratorTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.DAMAGED_PERMANENT;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getTargetId().equals(getSourceId())) {
this.getEffects().setTargetPointer(new FixedTarget(game.getControllerId(event.getSourceId())));
return true;
}
return false;
}
@Override
public String getRule() {
return "Whenever a source deals damage to {this}, that source's controller exiles a card " +
"from their hand at random. If it's a land card, you may put it onto the battlefield " +
"under your control. Otherwise, you may cast it without paying its mana cost.";
}
}
class RonaTolarianObliteratorEffect extends OneShotEffect {
RonaTolarianObliteratorEffect() {
super(Outcome.Benefit);
}
private RonaTolarianObliteratorEffect(final RonaTolarianObliteratorEffect effect) {
super(effect);
}
@Override
public RonaTolarianObliteratorEffect copy() {
return new RonaTolarianObliteratorEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
Player player = game.getPlayer(getTargetPointer().getFirst(game, source));
if (controller == null || player == null) {
return false;
}
Card card = player.getHand().getRandom(game);
if (card == null) {
return false;
}
player.moveCards(card, Zone.EXILED, source, game);
if (!card.isLand(game)) {
return CardUtil.castSpellWithAttributesForFree(controller, source, game, card);
}
return controller.chooseUse(Outcome.PutLandInPlay, "Put " + card.getIdName() + " onto the battlefield?", source, game)
&& controller.moveCards(card, Zone.BATTLEFIELD, source, game);
}
}

View file

@ -1,124 +0,0 @@
package mage.cards.r;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.keyword.TrampleAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.players.Player;
import mage.target.targetpointer.FixedTarget;
import mage.util.CardUtil;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class RonaTolarianObliterator extends CardImpl {
public RonaTolarianObliterator(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.PHYREXIAN);
this.subtype.add(SubType.WIZARD);
this.power = new MageInt(5);
this.toughness = new MageInt(5);
this.color.setBlue(true);
this.color.setBlack(true);
this.nightCard = true;
// Trample
this.addAbility(TrampleAbility.getInstance());
// Whenever a source deals damage to Rona, Tolarian Obliterator, that source's controller exiles a card from their hand at random. If it's a land card, you may put it onto the battlefield under your control. Otherwise, you may cast it without paying its mana cost.
this.addAbility(new RonaTolarianObliteratorTriggeredAbility());
}
private RonaTolarianObliterator(final RonaTolarianObliterator card) {
super(card);
}
@Override
public RonaTolarianObliterator copy() {
return new RonaTolarianObliterator(this);
}
}
class RonaTolarianObliteratorTriggeredAbility extends TriggeredAbilityImpl {
RonaTolarianObliteratorTriggeredAbility() {
super(Zone.BATTLEFIELD, new RonaTolarianObliteratorEffect());
}
private RonaTolarianObliteratorTriggeredAbility(final RonaTolarianObliteratorTriggeredAbility ability) {
super(ability);
}
@Override
public RonaTolarianObliteratorTriggeredAbility copy() {
return new RonaTolarianObliteratorTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.DAMAGED_PERMANENT;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getTargetId().equals(getSourceId())) {
this.getEffects().setTargetPointer(new FixedTarget(game.getControllerId(event.getSourceId())));
return true;
}
return false;
}
@Override
public String getRule() {
return "Whenever a source deals damage to {this}, that source's controller exiles a card " +
"from their hand at random. If it's a land card, you may put it onto the battlefield " +
"under your control. Otherwise, you may cast it without paying its mana cost.";
}
}
class RonaTolarianObliteratorEffect extends OneShotEffect {
RonaTolarianObliteratorEffect() {
super(Outcome.Benefit);
}
private RonaTolarianObliteratorEffect(final RonaTolarianObliteratorEffect effect) {
super(effect);
}
@Override
public RonaTolarianObliteratorEffect copy() {
return new RonaTolarianObliteratorEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
Player player = game.getPlayer(getTargetPointer().getFirst(game, source));
if (controller == null || player == null) {
return false;
}
Card card = player.getHand().getRandom(game);
if (card == null) {
return false;
}
player.moveCards(card, Zone.EXILED, source, game);
if (!card.isLand(game)) {
return CardUtil.castSpellWithAttributesForFree(controller, source, game, card);
}
return controller.chooseUse(Outcome.PutLandInPlay, "Put " + card.getIdName() + " onto the battlefield?", source, game)
&& controller.moveCards(card, Zone.BATTLEFIELD, source, game);
}
}

View file

@ -1,25 +1,29 @@
package mage.cards.r;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateTokenCopyTargetEffect;
import mage.abilities.effects.common.PutOnLibraryTargetEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.TransformAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.CardsImpl;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
import mage.filter.common.FilterAttackingCreature;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.TargetPermanent;
import mage.target.common.TargetCardInYourGraveyard;
import java.util.UUID;
@ -27,29 +31,45 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class RunoStromkirk extends CardImpl {
public final class RunoStromkirk extends TransformingDoubleFacedCard {
private static final FilterPermanent filter = new FilterAttackingCreature("another attacking creature");
static {
filter.add(AnotherPredicate.instance);
}
public RunoStromkirk(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}{B}");
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.VAMPIRE, SubType.CLERIC}, "{1}{U}{B}",
"Krothuss, Lord of the Deep",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.KRAKEN, SubType.HORROR}, "UB"
);
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.VAMPIRE);
this.subtype.add(SubType.CLERIC);
this.power = new MageInt(1);
this.toughness = new MageInt(4);
this.secondSideCardClazz = mage.cards.k.KrothussLordOfTheDeep.class;
// Runo Stromkirk
this.getLeftHalfCard().setPT(1, 4);
// Flying
this.addAbility(FlyingAbility.getInstance());
this.getLeftHalfCard().addAbility(FlyingAbility.getInstance());
// When Runo Stromkirk enters the battlefield, put up to one target creature card from your graveyard on top of your library.
Ability ability = new EntersBattlefieldTriggeredAbility(new PutOnLibraryTargetEffect(true));
ability.addTarget(new TargetCardInYourGraveyard(0, 1, StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD));
this.addAbility(ability);
this.getLeftHalfCard().addAbility(ability);
// At the beginning of your upkeep, look at the top card of your library. You may reveal that card. If a creature card with mana value 6 or greater is revealed this way, transform Runo Stromkirk.
this.addAbility(new TransformAbility());
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new RunoStromkirkEffect()));
this.getLeftHalfCard().addAbility(new BeginningOfUpkeepTriggeredAbility(new RunoStromkirkEffect()));
// Krothuss, Lord of the Deep
this.getRightHalfCard().setPT(3, 5);
// Flying
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
// Whenever Krothuss, Lord of the Deep attacks, create a tapped and attacking token that's a copy of another target attacking creature. If that creature is a Kraken, Leviathan, Octopus, or Serpent, create two of those tokens instead.
Ability ability2 = new AttacksTriggeredAbility(new KrothussLordOfTheDeepEffect());
ability2.addTarget(new TargetPermanent(filter));
this.getRightHalfCard().addAbility(ability2);
}
private RunoStromkirk(final RunoStromkirk card) {
@ -104,3 +124,38 @@ class RunoStromkirkEffect extends OneShotEffect {
return true;
}
}
class KrothussLordOfTheDeepEffect extends OneShotEffect {
KrothussLordOfTheDeepEffect() {
super(Outcome.Benefit);
staticText = "create a tapped and attacking token that's a copy of another target attacking creature. " +
"If that creature is a Kraken, Leviathan, Octopus, or Serpent, create two of those tokens instead";
}
private KrothussLordOfTheDeepEffect(final KrothussLordOfTheDeepEffect effect) {
super(effect);
}
@Override
public KrothussLordOfTheDeepEffect copy() {
return new KrothussLordOfTheDeepEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getFirstTarget());
if (permanent == null) {
return false;
}
int count = permanent.hasSubtype(SubType.KRAKEN, game)
|| permanent.hasSubtype(SubType.LEVIATHAN, game)
|| permanent.hasSubtype(SubType.OCTOPUS, game)
|| permanent.hasSubtype(SubType.SERPENT, game) ? 2 : 1;
return new CreateTokenCopyTargetEffect(
null, null,
false, count, true, true
).apply(game, source);
}
}

View file

@ -1,60 +0,0 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.keyword.NightboundAbility;
import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.target.common.TargetControlledCreaturePermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class StormChargedSlasher extends CardImpl {
public StormChargedSlasher(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.WEREWOLF);
this.power = new MageInt(3);
this.toughness = new MageInt(4);
this.color.setRed(true);
this.nightCard = true;
// At the beginning of combat on your turn, target creature you control gets +2/+0 and gains trample and haste until end of turn.
Ability ability = new BeginningOfCombatTriggeredAbility(
new BoostTargetEffect(2, 0)
.setText("target creature you control gets +2/+0")
);
ability.addEffect(new GainAbilityTargetEffect(
TrampleAbility.getInstance(), Duration.EndOfTurn
).setText("and gains trample"));
ability.addEffect(new GainAbilityTargetEffect(
HasteAbility.getInstance(), Duration.EndOfTurn
).setText("and haste until end of turn"));
ability.addTarget(new TargetControlledCreaturePermanent());
this.addAbility(ability);
// Nightbound
this.addAbility(new NightboundAbility());
}
private StormChargedSlasher(final StormChargedSlasher card) {
super(card);
}
@Override
public StormChargedSlasher copy() {
return new StormChargedSlasher(this);
}
}

View file

@ -42,7 +42,6 @@ public final class DarkAscension extends ExpansionSet {
cards.add(new SetCardInfo("Alpha Brawl", 82, Rarity.RARE, mage.cards.a.AlphaBrawl.class));
cards.add(new SetCardInfo("Altar of the Lost", 144, Rarity.UNCOMMON, mage.cards.a.AltarOfTheLost.class));
cards.add(new SetCardInfo("Archangel's Light", 1, Rarity.MYTHIC, mage.cards.a.ArchangelsLight.class));
cards.add(new SetCardInfo("Archdemon of Greed", 71, Rarity.RARE, mage.cards.a.ArchdemonOfGreed.class));
cards.add(new SetCardInfo("Artful Dodge", 27, Rarity.COMMON, mage.cards.a.ArtfulDodge.class));
cards.add(new SetCardInfo("Avacyn's Collar", 145, Rarity.UNCOMMON, mage.cards.a.AvacynsCollar.class));
cards.add(new SetCardInfo("Bar the Door", 2, Rarity.COMMON, mage.cards.b.BarTheDoor.class));

View file

@ -20,7 +20,6 @@ public class DarkAscensionPromos extends ExpansionSet {
this.hasBoosters = false;
this.hasBasicLands = false;
cards.add(new SetCardInfo("Archdemon of Greed", "71*", Rarity.RARE, mage.cards.a.ArchdemonOfGreed.class));
cards.add(new SetCardInfo("Gravecrawler", "64*", Rarity.RARE, mage.cards.g.Gravecrawler.class));
cards.add(new SetCardInfo("Mondronen Shaman", "98*", Rarity.RARE, mage.cards.m.MondronenShaman.class));
cards.add(new SetCardInfo("Ravenous Demon", "71*", Rarity.RARE, mage.cards.r.RavenousDemon.class));

View file

@ -185,7 +185,6 @@ public final class Innistrad extends ExpansionSet {
cards.add(new SetCardInfo("Mayor of Avabruck", 193, Rarity.RARE, mage.cards.m.MayorOfAvabruck.class));
cards.add(new SetCardInfo("Memory's Journey", 66, Rarity.UNCOMMON, mage.cards.m.MemorysJourney.class));
cards.add(new SetCardInfo("Mentor of the Meek", 21, Rarity.RARE, mage.cards.m.MentorOfTheMeek.class));
cards.add(new SetCardInfo("Merciless Predator", 159, Rarity.UNCOMMON, mage.cards.m.MercilessPredator.class));
cards.add(new SetCardInfo("Midnight Haunting", 22, Rarity.UNCOMMON, mage.cards.m.MidnightHaunting.class));
cards.add(new SetCardInfo("Mikaeus, the Lunarch", 23, Rarity.MYTHIC, mage.cards.m.MikaeusTheLunarch.class));
cards.add(new SetCardInfo("Mindshrieker", 67, Rarity.RARE, mage.cards.m.Mindshrieker.class));

View file

@ -75,8 +75,6 @@ public final class InnistradCrimsonVow extends ExpansionSet {
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("Bloodsoaked Reveler", 128, Rarity.UNCOMMON, mage.cards.b.BloodsoakedReveler.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Bloodsoaked Reveler", 295, Rarity.UNCOMMON, mage.cards.b.BloodsoakedReveler.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Bloodsworn Squire", 289, Rarity.UNCOMMON, mage.cards.b.BloodswornSquire.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Bloodsworn Squire", 97, Rarity.UNCOMMON, mage.cards.b.BloodswornSquire.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Bloodtithe Harvester", 232, Rarity.UNCOMMON, mage.cards.b.BloodtitheHarvester.class, NON_FULL_USE_VARIOUS));
@ -271,9 +269,6 @@ public final class InnistradCrimsonVow extends ExpansionSet {
cards.add(new SetCardInfo("Kessig Wolfrider", 165, Rarity.RARE, mage.cards.k.KessigWolfrider.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Kessig Wolfrider", 379, Rarity.RARE, mage.cards.k.KessigWolfrider.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Kindly Ancestor", 22, Rarity.COMMON, mage.cards.k.KindlyAncestor.class));
cards.add(new SetCardInfo("Krothuss, Lord of the Deep", 246, Rarity.RARE, mage.cards.k.KrothussLordOfTheDeep.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Krothuss, Lord of the Deep", 316, Rarity.RARE, mage.cards.k.KrothussLordOfTheDeep.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Krothuss, Lord of the Deep", 327, Rarity.RARE, mage.cards.k.KrothussLordOfTheDeep.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Lacerate Flesh", 166, Rarity.COMMON, mage.cards.l.LacerateFlesh.class));
cards.add(new SetCardInfo("Laid to Rest", 207, Rarity.UNCOMMON, mage.cards.l.LaidToRest.class));
cards.add(new SetCardInfo("Lambholt Raconteur", 167, Rarity.UNCOMMON, mage.cards.l.LambholtRaconteur.class));
@ -309,7 +304,6 @@ public final class InnistradCrimsonVow extends ExpansionSet {
cards.add(new SetCardInfo("Necroduality", 70, Rarity.MYTHIC, mage.cards.n.Necroduality.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Nurturing Presence", 26, Rarity.COMMON, mage.cards.n.NurturingPresence.class));
cards.add(new SetCardInfo("Oakshade Stalker", 212, Rarity.UNCOMMON, mage.cards.o.OakshadeStalker.class));
cards.add(new SetCardInfo("Odious Witch", 127, Rarity.COMMON, mage.cards.o.OdiousWitch.class));
cards.add(new SetCardInfo("Odric, Blood-Cursed", 243, Rarity.RARE, mage.cards.o.OdricBloodCursed.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Odric, Blood-Cursed", 314, Rarity.RARE, mage.cards.o.OdricBloodCursed.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Old Rutstein", 244, Rarity.RARE, mage.cards.o.OldRutstein.class, NON_FULL_USE_VARIOUS));
@ -339,7 +333,6 @@ public final class InnistradCrimsonVow extends ExpansionSet {
cards.add(new SetCardInfo("Pointed Discussion", 126, Rarity.COMMON, mage.cards.p.PointedDiscussion.class));
cards.add(new SetCardInfo("Pyre Spawn", 173, Rarity.COMMON, mage.cards.p.PyreSpawn.class));
cards.add(new SetCardInfo("Radiant Grace", 31, Rarity.UNCOMMON, mage.cards.r.RadiantGrace.class));
cards.add(new SetCardInfo("Radiant Restraints", 31, Rarity.UNCOMMON, mage.cards.r.RadiantRestraints.class));
cards.add(new SetCardInfo("Ragged Recluse", 127, Rarity.COMMON, mage.cards.r.RaggedRecluse.class));
cards.add(new SetCardInfo("Reckless Impulse", 174, Rarity.COMMON, mage.cards.r.RecklessImpulse.class));
cards.add(new SetCardInfo("Reclusive Taxidermist", 214, Rarity.UNCOMMON, mage.cards.r.ReclusiveTaxidermist.class, NON_FULL_USE_VARIOUS));

View file

@ -73,7 +73,6 @@ public final class InnistradDoubleFeature extends ExpansionSet {
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("Bloodsoaked Reveler", 395, Rarity.UNCOMMON, mage.cards.b.BloodsoakedReveler.class));
cards.add(new SetCardInfo("Bloodsworn Squire", 364, Rarity.UNCOMMON, mage.cards.b.BloodswornSquire.class));
cards.add(new SetCardInfo("Bloodthirsty Adversary", 129, Rarity.MYTHIC, mage.cards.b.BloodthirstyAdversary.class));
cards.add(new SetCardInfo("Bloodtithe Collector", 90, Rarity.UNCOMMON, mage.cards.b.BloodtitheCollector.class));
@ -312,7 +311,6 @@ public final class InnistradDoubleFeature extends ExpansionSet {
cards.add(new SetCardInfo("Kessig Naturalist", 231, Rarity.UNCOMMON, mage.cards.k.KessigNaturalist.class));
cards.add(new SetCardInfo("Kessig Wolfrider", 432, Rarity.RARE, mage.cards.k.KessigWolfrider.class));
cards.add(new SetCardInfo("Kindly Ancestor", 289, Rarity.COMMON, mage.cards.k.KindlyAncestor.class));
cards.add(new SetCardInfo("Krothuss, Lord of the Deep", 513, Rarity.RARE, mage.cards.k.KrothussLordOfTheDeep.class));
cards.add(new SetCardInfo("Lacerate Flesh", 433, Rarity.COMMON, mage.cards.l.LacerateFlesh.class));
cards.add(new SetCardInfo("Laid to Rest", 474, Rarity.UNCOMMON, mage.cards.l.LaidToRest.class));
cards.add(new SetCardInfo("Lambholt Harrier", 145, Rarity.COMMON, mage.cards.l.LambholtHarrier.class));
@ -368,7 +366,6 @@ public final class InnistradDoubleFeature extends ExpansionSet {
cards.add(new SetCardInfo("Nurturing Presence", 293, Rarity.COMMON, mage.cards.n.NurturingPresence.class));
cards.add(new SetCardInfo("Oakshade Stalker", 479, Rarity.UNCOMMON, mage.cards.o.OakshadeStalker.class));
cards.add(new SetCardInfo("Obsessive Astronomer", 152, Rarity.UNCOMMON, mage.cards.o.ObsessiveAstronomer.class));
cards.add(new SetCardInfo("Odious Witch", 394, Rarity.COMMON, mage.cards.o.OdiousWitch.class));
cards.add(new SetCardInfo("Odric's Outrider", 29, Rarity.UNCOMMON, mage.cards.o.OdricsOutrider.class));
cards.add(new SetCardInfo("Odric, Blood-Cursed", 510, Rarity.RARE, mage.cards.o.OdricBloodCursed.class));
cards.add(new SetCardInfo("Old Rutstein", 511, Rarity.RARE, mage.cards.o.OldRutstein.class));
@ -406,7 +403,6 @@ public final class InnistradDoubleFeature extends ExpansionSet {
cards.add(new SetCardInfo("Purifying Dragon", 155, Rarity.UNCOMMON, mage.cards.p.PurifyingDragon.class));
cards.add(new SetCardInfo("Pyre Spawn", 440, Rarity.COMMON, mage.cards.p.PyreSpawn.class));
cards.add(new SetCardInfo("Radiant Grace", 298, Rarity.UNCOMMON, mage.cards.r.RadiantGrace.class));
cards.add(new SetCardInfo("Radiant Restraints", 298, Rarity.UNCOMMON, mage.cards.r.RadiantRestraints.class));
cards.add(new SetCardInfo("Ragged Recluse", 394, Rarity.COMMON, mage.cards.r.RaggedRecluse.class));
cards.add(new SetCardInfo("Raze the Effigy", 156, Rarity.COMMON, mage.cards.r.RazeTheEffigy.class));
cards.add(new SetCardInfo("Reckless Impulse", 441, Rarity.COMMON, mage.cards.r.RecklessImpulse.class));
@ -489,7 +485,6 @@ public final class InnistradDoubleFeature extends ExpansionSet {
cards.add(new SetCardInfo("Stolen Vitality", 161, Rarity.COMMON, mage.cards.s.StolenVitality.class));
cards.add(new SetCardInfo("Storm Skreelix", 243, Rarity.UNCOMMON, mage.cards.s.StormSkreelix.class));
cards.add(new SetCardInfo("Storm the Festival", 200, Rarity.RARE, mage.cards.s.StormTheFestival.class));
cards.add(new SetCardInfo("Storm-Charged Slasher", 157, Rarity.RARE, mage.cards.s.StormChargedSlasher.class));
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));

View file

@ -377,8 +377,6 @@ public final class InnistradMidnightHunt extends ExpansionSet {
cards.add(new SetCardInfo("Storm Skreelix", 243, Rarity.UNCOMMON, mage.cards.s.StormSkreelix.class));
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("Storm-Charged Slasher", 157, Rarity.RARE, mage.cards.s.StormChargedSlasher.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Storm-Charged Slasher", 294, Rarity.RARE, mage.cards.s.StormChargedSlasher.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));

View file

@ -81,8 +81,6 @@ public class InnistradRemastered extends ExpansionSet {
cards.add(new SetCardInfo("Bloodline Keeper", 461, Rarity.MYTHIC, mage.cards.b.BloodlineKeeper.class, RETRO_ART_USE_VARIOUS));
cards.add(new SetCardInfo("Bloodline Keeper", 98, Rarity.MYTHIC, mage.cards.b.BloodlineKeeper.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Bloodmad Vampire", 145, Rarity.COMMON, mage.cards.b.BloodmadVampire.class));
cards.add(new SetCardInfo("Bloodsoaked Reveler", 128, Rarity.UNCOMMON, mage.cards.b.BloodsoakedReveler.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Bloodsoaked Reveler", 463, Rarity.UNCOMMON, mage.cards.b.BloodsoakedReveler.class, RETRO_ART_USE_VARIOUS));
cards.add(new SetCardInfo("Bloodtithe Harvester", 233, Rarity.UNCOMMON, mage.cards.b.BloodtitheHarvester.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Bloodtithe Harvester", 427, Rarity.UNCOMMON, mage.cards.b.BloodtitheHarvester.class, RETRO_ART_USE_VARIOUS));
cards.add(new SetCardInfo("Boarded Window", 255, Rarity.UNCOMMON, mage.cards.b.BoardedWindow.class, NON_FULL_USE_VARIOUS));

View file

@ -135,7 +135,6 @@ public class MagicOnlinePromos extends ExpansionSet {
cards.add(new SetCardInfo("Arcbound Ravager", 72888, Rarity.RARE, mage.cards.a.ArcboundRavager.class));
cards.add(new SetCardInfo("Archaeomancer's Map", 90008, Rarity.RARE, mage.cards.a.ArchaeomancersMap.class));
cards.add(new SetCardInfo("Archangel of Wrath", 103392, Rarity.RARE, mage.cards.a.ArchangelOfWrath.class));
cards.add(new SetCardInfo("Archdemon of Greed", 43503, Rarity.RARE, mage.cards.a.ArchdemonOfGreed.class));
cards.add(new SetCardInfo("Archelos, Lagoon Mystic", 86334, Rarity.RARE, mage.cards.a.ArchelosLagoonMystic.class));
cards.add(new SetCardInfo("Archfiend of Depravity", 55711, Rarity.RARE, mage.cards.a.ArchfiendOfDepravity.class));
cards.add(new SetCardInfo("Archfiend of Ifnir", 64422, Rarity.RARE, mage.cards.a.ArchfiendOfIfnir.class));

View file

@ -326,8 +326,6 @@ public final class MarchOfTheMachine extends ExpansionSet {
cards.add(new SetCardInfo("Render Inert", 123, Rarity.UNCOMMON, mage.cards.r.RenderInert.class));
cards.add(new SetCardInfo("Rona, Herald of Invasion", 295, Rarity.RARE, mage.cards.r.RonaHeraldOfInvasion.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Rona, Herald of Invasion", 75, Rarity.RARE, mage.cards.r.RonaHeraldOfInvasion.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Rona, Tolarian Obliterator", 295, Rarity.RARE, mage.cards.r.RonaTolarianObliterator.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Rona, Tolarian Obliterator", 75, Rarity.RARE, mage.cards.r.RonaTolarianObliterator.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Rugged Highlands", 271, Rarity.COMMON, mage.cards.r.RuggedHighlands.class));
cards.add(new SetCardInfo("Ruins Recluse", 336, Rarity.UNCOMMON, mage.cards.r.RuinsRecluse.class));
cards.add(new SetCardInfo("Saiba Cryptomancer", 76, Rarity.COMMON, mage.cards.s.SaibaCryptomancer.class));

View file

@ -29,7 +29,6 @@ public final class Transformers extends ExpansionSet {
cards.add(new SetCardInfo("Optimus Prime, Hero", 13, Rarity.MYTHIC, mage.cards.o.OptimusPrimeHero.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Optimus Prime, Hero", 27, Rarity.MYTHIC, mage.cards.o.OptimusPrimeHero.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ratchet, Field Medic", 2, Rarity.MYTHIC, mage.cards.r.RatchetFieldMedic.class));
cards.add(new SetCardInfo("Ratchet, Rescue Racer", 2, Rarity.MYTHIC, mage.cards.r.RatchetRescueRacer.class));
cards.add(new SetCardInfo("Slicer, High-Speed Antagonist", 6, Rarity.MYTHIC, mage.cards.s.SlicerHighSpeedAntagonist.class));
cards.add(new SetCardInfo("Slicer, Hired Muscle", 6, Rarity.MYTHIC, mage.cards.s.SlicerHiredMuscle.class));
cards.add(new SetCardInfo("Starscream, Power Hungry", 5, Rarity.MYTHIC, mage.cards.s.StarscreamPowerHungry.class));