From 6906072ec49cb51905007db717207e978d1eb0f3 Mon Sep 17 00:00:00 2001 From: jmlundeen Date: Tue, 2 Dec 2025 20:17:30 -0600 Subject: [PATCH] convert transforming "R" cards to single class file part of #14099 --- .../src/mage/cards/a/ArchdemonOfGreed.java | 54 -------- .../src/mage/cards/b/BloodsoakedReveler.java | 64 --------- .../mage/cards/k/KrothussLordOfTheDeep.java | 98 -------------- .../src/mage/cards/m/MercilessPredator.java | 40 ------ Mage.Sets/src/mage/cards/o/OdiousWitch.java | 49 ------- Mage.Sets/src/mage/cards/r/RadiantGrace.java | 51 ++++--- .../src/mage/cards/r/RadiantRestraints.java | 56 -------- Mage.Sets/src/mage/cards/r/RaggedRecluse.java | 44 ++++--- .../src/mage/cards/r/RatchetFieldMedic.java | 55 ++++++-- .../src/mage/cards/r/RatchetRescueRacer.java | 61 --------- Mage.Sets/src/mage/cards/r/RavenousDemon.java | 43 ++++-- .../src/mage/cards/r/RecklessStormseeker.java | 46 +++++-- Mage.Sets/src/mage/cards/r/RecklessWaif.java | 31 +++-- .../src/mage/cards/r/RestlessBloodseeker.java | 53 +++++--- .../mage/cards/r/RonaHeraldOfInvasion.java | 122 ++++++++++++++--- .../mage/cards/r/RonaTolarianObliterator.java | 124 ------------------ Mage.Sets/src/mage/cards/r/RunoStromkirk.java | 85 +++++++++--- .../src/mage/cards/s/StormChargedSlasher.java | 60 --------- Mage.Sets/src/mage/sets/DarkAscension.java | 1 - .../src/mage/sets/DarkAscensionPromos.java | 1 - Mage.Sets/src/mage/sets/Innistrad.java | 1 - .../src/mage/sets/InnistradCrimsonVow.java | 7 - .../src/mage/sets/InnistradDoubleFeature.java | 5 - .../src/mage/sets/InnistradMidnightHunt.java | 2 - .../src/mage/sets/InnistradRemastered.java | 2 - .../src/mage/sets/MagicOnlinePromos.java | 1 - .../src/mage/sets/MarchOfTheMachine.java | 2 - Mage.Sets/src/mage/sets/Transformers.java | 1 - 28 files changed, 400 insertions(+), 759 deletions(-) delete mode 100644 Mage.Sets/src/mage/cards/a/ArchdemonOfGreed.java delete mode 100644 Mage.Sets/src/mage/cards/b/BloodsoakedReveler.java delete mode 100644 Mage.Sets/src/mage/cards/k/KrothussLordOfTheDeep.java delete mode 100644 Mage.Sets/src/mage/cards/m/MercilessPredator.java delete mode 100644 Mage.Sets/src/mage/cards/o/OdiousWitch.java delete mode 100644 Mage.Sets/src/mage/cards/r/RadiantRestraints.java delete mode 100644 Mage.Sets/src/mage/cards/r/RatchetRescueRacer.java delete mode 100644 Mage.Sets/src/mage/cards/r/RonaTolarianObliterator.java delete mode 100644 Mage.Sets/src/mage/cards/s/StormChargedSlasher.java diff --git a/Mage.Sets/src/mage/cards/a/ArchdemonOfGreed.java b/Mage.Sets/src/mage/cards/a/ArchdemonOfGreed.java deleted file mode 100644 index 6698dcde482..00000000000 --- a/Mage.Sets/src/mage/cards/a/ArchdemonOfGreed.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/b/BloodsoakedReveler.java b/Mage.Sets/src/mage/cards/b/BloodsoakedReveler.java deleted file mode 100644 index 1c5d37419f5..00000000000 --- a/Mage.Sets/src/mage/cards/b/BloodsoakedReveler.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/k/KrothussLordOfTheDeep.java b/Mage.Sets/src/mage/cards/k/KrothussLordOfTheDeep.java deleted file mode 100644 index d58282aa09e..00000000000 --- a/Mage.Sets/src/mage/cards/k/KrothussLordOfTheDeep.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/m/MercilessPredator.java b/Mage.Sets/src/mage/cards/m/MercilessPredator.java deleted file mode 100644 index 9ea43ac8cd2..00000000000 --- a/Mage.Sets/src/mage/cards/m/MercilessPredator.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/o/OdiousWitch.java b/Mage.Sets/src/mage/cards/o/OdiousWitch.java deleted file mode 100644 index 253b38f0029..00000000000 --- a/Mage.Sets/src/mage/cards/o/OdiousWitch.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/r/RadiantGrace.java b/Mage.Sets/src/mage/cards/r/RadiantGrace.java index b725e33f23a..ae2c6055941 100644 --- a/Mage.Sets/src/mage/cards/r/RadiantGrace.java +++ b/Mage.Sets/src/mage/cards/r/RadiantGrace.java @@ -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); } diff --git a/Mage.Sets/src/mage/cards/r/RadiantRestraints.java b/Mage.Sets/src/mage/cards/r/RadiantRestraints.java deleted file mode 100644 index 9fa133903b2..00000000000 --- a/Mage.Sets/src/mage/cards/r/RadiantRestraints.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/r/RaggedRecluse.java b/Mage.Sets/src/mage/cards/r/RaggedRecluse.java index 0f6e003e7ce..fbdd9a94619 100644 --- a/Mage.Sets/src/mage/cards/r/RaggedRecluse.java +++ b/Mage.Sets/src/mage/cards/r/RaggedRecluse.java @@ -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) { diff --git a/Mage.Sets/src/mage/cards/r/RatchetFieldMedic.java b/Mage.Sets/src/mage/cards/r/RatchetFieldMedic.java index e28788178e3..79abf17bf60 100644 --- a/Mage.Sets/src/mage/cards/r/RatchetFieldMedic.java +++ b/Mage.Sets/src/mage/cards/r/RatchetFieldMedic.java @@ -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) { diff --git a/Mage.Sets/src/mage/cards/r/RatchetRescueRacer.java b/Mage.Sets/src/mage/cards/r/RatchetRescueRacer.java deleted file mode 100644 index 2d56d3c98e7..00000000000 --- a/Mage.Sets/src/mage/cards/r/RatchetRescueRacer.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/r/RavenousDemon.java b/Mage.Sets/src/mage/cards/r/RavenousDemon.java index 3feef6706d8..24c32b3ae09 100644 --- a/Mage.Sets/src/mage/cards/r/RavenousDemon.java +++ b/Mage.Sets/src/mage/cards/r/RavenousDemon.java @@ -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) { diff --git a/Mage.Sets/src/mage/cards/r/RecklessStormseeker.java b/Mage.Sets/src/mage/cards/r/RecklessStormseeker.java index 76eeb01bcc3..c4ef345feb8 100644 --- a/Mage.Sets/src/mage/cards/r/RecklessStormseeker.java +++ b/Mage.Sets/src/mage/cards/r/RecklessStormseeker.java @@ -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) { diff --git a/Mage.Sets/src/mage/cards/r/RecklessWaif.java b/Mage.Sets/src/mage/cards/r/RecklessWaif.java index dae8b27df78..20ceb9378b0 100644 --- a/Mage.Sets/src/mage/cards/r/RecklessWaif.java +++ b/Mage.Sets/src/mage/cards/r/RecklessWaif.java @@ -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) { diff --git a/Mage.Sets/src/mage/cards/r/RestlessBloodseeker.java b/Mage.Sets/src/mage/cards/r/RestlessBloodseeker.java index 25e42d18a6f..9548fa24f98 100644 --- a/Mage.Sets/src/mage/cards/r/RestlessBloodseeker.java +++ b/Mage.Sets/src/mage/cards/r/RestlessBloodseeker.java @@ -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) { diff --git a/Mage.Sets/src/mage/cards/r/RonaHeraldOfInvasion.java b/Mage.Sets/src/mage/cards/r/RonaHeraldOfInvasion.java index e7c1e9c5f58..745037e126b 100644 --- a/Mage.Sets/src/mage/cards/r/RonaHeraldOfInvasion.java +++ b/Mage.Sets/src/mage/cards/r/RonaHeraldOfInvasion.java @@ -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); + } +} diff --git a/Mage.Sets/src/mage/cards/r/RonaTolarianObliterator.java b/Mage.Sets/src/mage/cards/r/RonaTolarianObliterator.java deleted file mode 100644 index 65f8672be31..00000000000 --- a/Mage.Sets/src/mage/cards/r/RonaTolarianObliterator.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/r/RunoStromkirk.java b/Mage.Sets/src/mage/cards/r/RunoStromkirk.java index 158b4130dae..c4b16f5fa67 100644 --- a/Mage.Sets/src/mage/cards/r/RunoStromkirk.java +++ b/Mage.Sets/src/mage/cards/r/RunoStromkirk.java @@ -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); + } +} diff --git a/Mage.Sets/src/mage/cards/s/StormChargedSlasher.java b/Mage.Sets/src/mage/cards/s/StormChargedSlasher.java deleted file mode 100644 index 1da4c1b1449..00000000000 --- a/Mage.Sets/src/mage/cards/s/StormChargedSlasher.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/sets/DarkAscension.java b/Mage.Sets/src/mage/sets/DarkAscension.java index 9387a4e1c31..8e6f3d7c182 100644 --- a/Mage.Sets/src/mage/sets/DarkAscension.java +++ b/Mage.Sets/src/mage/sets/DarkAscension.java @@ -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)); diff --git a/Mage.Sets/src/mage/sets/DarkAscensionPromos.java b/Mage.Sets/src/mage/sets/DarkAscensionPromos.java index ee2b4bfeb62..9901edd99bd 100644 --- a/Mage.Sets/src/mage/sets/DarkAscensionPromos.java +++ b/Mage.Sets/src/mage/sets/DarkAscensionPromos.java @@ -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)); diff --git a/Mage.Sets/src/mage/sets/Innistrad.java b/Mage.Sets/src/mage/sets/Innistrad.java index 3936b81858a..668a62749ab 100644 --- a/Mage.Sets/src/mage/sets/Innistrad.java +++ b/Mage.Sets/src/mage/sets/Innistrad.java @@ -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)); diff --git a/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java b/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java index cb36a01e2f7..241813b7699 100644 --- a/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java +++ b/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java @@ -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)); diff --git a/Mage.Sets/src/mage/sets/InnistradDoubleFeature.java b/Mage.Sets/src/mage/sets/InnistradDoubleFeature.java index c967f93d3e5..d4894338ec2 100644 --- a/Mage.Sets/src/mage/sets/InnistradDoubleFeature.java +++ b/Mage.Sets/src/mage/sets/InnistradDoubleFeature.java @@ -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)); diff --git a/Mage.Sets/src/mage/sets/InnistradMidnightHunt.java b/Mage.Sets/src/mage/sets/InnistradMidnightHunt.java index 8589f2fecbb..fb87175a93f 100644 --- a/Mage.Sets/src/mage/sets/InnistradMidnightHunt.java +++ b/Mage.Sets/src/mage/sets/InnistradMidnightHunt.java @@ -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)); diff --git a/Mage.Sets/src/mage/sets/InnistradRemastered.java b/Mage.Sets/src/mage/sets/InnistradRemastered.java index d631078caac..90321974994 100644 --- a/Mage.Sets/src/mage/sets/InnistradRemastered.java +++ b/Mage.Sets/src/mage/sets/InnistradRemastered.java @@ -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)); diff --git a/Mage.Sets/src/mage/sets/MagicOnlinePromos.java b/Mage.Sets/src/mage/sets/MagicOnlinePromos.java index ebb225f3913..5cd3a661a05 100644 --- a/Mage.Sets/src/mage/sets/MagicOnlinePromos.java +++ b/Mage.Sets/src/mage/sets/MagicOnlinePromos.java @@ -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)); diff --git a/Mage.Sets/src/mage/sets/MarchOfTheMachine.java b/Mage.Sets/src/mage/sets/MarchOfTheMachine.java index 30f3e9845c2..9fa03ecb0f8 100644 --- a/Mage.Sets/src/mage/sets/MarchOfTheMachine.java +++ b/Mage.Sets/src/mage/sets/MarchOfTheMachine.java @@ -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)); diff --git a/Mage.Sets/src/mage/sets/Transformers.java b/Mage.Sets/src/mage/sets/Transformers.java index 2222055fb18..817ab7a94bc 100644 --- a/Mage.Sets/src/mage/sets/Transformers.java +++ b/Mage.Sets/src/mage/sets/Transformers.java @@ -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));