From de4958a72537eb822d511336cf2a5ac60038b32d Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Sun, 1 Nov 2020 17:50:40 -0500 Subject: [PATCH] [CMR] Implemented Rakshasa Debaser --- .../src/mage/cards/g/GravenAbomination.java | 2 +- .../src/mage/cards/r/RakshasaDebaser.java | 62 +++++++++++++++++++ .../src/mage/cards/r/RysorianBadger.java | 18 ++---- Mage.Sets/src/mage/sets/CommanderLegends.java | 1 + .../DefendingPlayerOwnsCardPredicate.java | 7 +-- Utils/mtg-cards-data.txt | 2 +- 6 files changed, 73 insertions(+), 19 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/r/RakshasaDebaser.java diff --git a/Mage.Sets/src/mage/cards/g/GravenAbomination.java b/Mage.Sets/src/mage/cards/g/GravenAbomination.java index 18f67304719..27ab5d3ed81 100644 --- a/Mage.Sets/src/mage/cards/g/GravenAbomination.java +++ b/Mage.Sets/src/mage/cards/g/GravenAbomination.java @@ -24,7 +24,7 @@ public final class GravenAbomination extends CardImpl { private static final FilterCard filter = new FilterCard("card from defending player's graveyard"); static { - filter.add(new DefendingPlayerOwnsCardPredicate()); + filter.add(DefendingPlayerOwnsCardPredicate.instance); } public GravenAbomination(UUID ownerId, CardSetInfo setInfo) { diff --git a/Mage.Sets/src/mage/cards/r/RakshasaDebaser.java b/Mage.Sets/src/mage/cards/r/RakshasaDebaser.java new file mode 100644 index 00000000000..ffaea93edd0 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RakshasaDebaser.java @@ -0,0 +1,62 @@ +package mage.cards.r; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; +import mage.abilities.keyword.EncoreAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.filter.common.FilterCreatureCard; +import mage.filter.predicate.permanent.DefendingPlayerOwnsCardPredicate; +import mage.target.common.TargetCardInGraveyard; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class RakshasaDebaser extends CardImpl { + + private static final FilterCard filter + = new FilterCreatureCard("creature card from defending player's graveyard"); + + static { + filter.add(DefendingPlayerOwnsCardPredicate.instance); + } + + private static final String rule + = "put target creature card from defending player's graveyard onto the battlefield under your control"; + + public RakshasaDebaser(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{B}{B}"); + + this.subtype.add(SubType.CAT); + this.subtype.add(SubType.DEMON); + this.power = new MageInt(6); + this.toughness = new MageInt(6); + + // Whenever Rakshasa Debaser attacks, put target creature card from defending player's graveyard onto the battlefield under your control. + Ability ability = new AttacksTriggeredAbility( + new ReturnFromGraveyardToBattlefieldTargetEffect().setText(rule), false + ); + ability.addTarget(new TargetCardInGraveyard()); + this.addAbility(ability); + + // Encore {6}{B}{B} + this.addAbility(new EncoreAbility(new ManaCostsImpl<>("{6}{B}{B}"))); + } + + private RakshasaDebaser(final RakshasaDebaser card) { + super(card); + } + + @Override + public RakshasaDebaser copy() { + return new RakshasaDebaser(this); + } +} diff --git a/Mage.Sets/src/mage/cards/r/RysorianBadger.java b/Mage.Sets/src/mage/cards/r/RysorianBadger.java index 0b188d906f4..8aa05ca6330 100644 --- a/Mage.Sets/src/mage/cards/r/RysorianBadger.java +++ b/Mage.Sets/src/mage/cards/r/RysorianBadger.java @@ -1,29 +1,21 @@ package mage.cards.r; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.AttacksAndIsNotBlockedTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.AssignNoCombatDamageSourceEffect; -import mage.cards.Card; -import mage.constants.SubType; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.cards.Cards; -import mage.cards.CardsImpl; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.Zone; +import mage.cards.*; +import mage.constants.*; import mage.filter.common.FilterCreatureCard; import mage.filter.predicate.permanent.DefendingPlayerOwnsCardPredicate; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCardInGraveyard; +import java.util.UUID; + /** - * * @author TheElk801 */ public final class RysorianBadger extends CardImpl { @@ -31,7 +23,7 @@ public final class RysorianBadger extends CardImpl { private static final FilterCreatureCard filter = new FilterCreatureCard("creature cards from defending player's graveyard"); static { - filter.add(new DefendingPlayerOwnsCardPredicate()); + filter.add(DefendingPlayerOwnsCardPredicate.instance); } public RysorianBadger(UUID ownerId, CardSetInfo setInfo) { diff --git a/Mage.Sets/src/mage/sets/CommanderLegends.java b/Mage.Sets/src/mage/sets/CommanderLegends.java index aecc9fd7f1b..873fccf81e3 100644 --- a/Mage.Sets/src/mage/sets/CommanderLegends.java +++ b/Mage.Sets/src/mage/sets/CommanderLegends.java @@ -158,6 +158,7 @@ public final class CommanderLegends extends ExpansionSet { cards.add(new SetCardInfo("Radiant, Serra Archangel", 40, Rarity.UNCOMMON, mage.cards.r.RadiantSerraArchangel.class)); cards.add(new SetCardInfo("Raise the Alarm", 41, Rarity.COMMON, mage.cards.r.RaiseTheAlarm.class)); cards.add(new SetCardInfo("Rakdos, Lord of Riots", 532, Rarity.MYTHIC, mage.cards.r.RakdosLordOfRiots.class)); + cards.add(new SetCardInfo("Rakshasa Debaser", 146, Rarity.RARE, mage.cards.r.RakshasaDebaser.class)); cards.add(new SetCardInfo("Ramos, Dragon Engine", 545, Rarity.MYTHIC, mage.cards.r.RamosDragonEngine.class)); cards.add(new SetCardInfo("Ravos, Soultender", 533, Rarity.MYTHIC, mage.cards.r.RavosSoultender.class)); cards.add(new SetCardInfo("Rebbec, Architect of Ascension", 42, Rarity.UNCOMMON, mage.cards.r.RebbecArchitectOfAscension.class)); diff --git a/Mage/src/main/java/mage/filter/predicate/permanent/DefendingPlayerOwnsCardPredicate.java b/Mage/src/main/java/mage/filter/predicate/permanent/DefendingPlayerOwnsCardPredicate.java index fe044d827e1..3cb3ed7c241 100644 --- a/Mage/src/main/java/mage/filter/predicate/permanent/DefendingPlayerOwnsCardPredicate.java +++ b/Mage/src/main/java/mage/filter/predicate/permanent/DefendingPlayerOwnsCardPredicate.java @@ -1,4 +1,3 @@ - package mage.filter.predicate.permanent; import mage.cards.Card; @@ -7,10 +6,10 @@ import mage.filter.predicate.ObjectSourcePlayerPredicate; import mage.game.Game; /** - * * @author TheElk801 */ -public class DefendingPlayerOwnsCardPredicate implements ObjectSourcePlayerPredicate> { +public enum DefendingPlayerOwnsCardPredicate implements ObjectSourcePlayerPredicate> { + instance; @Override public boolean apply(ObjectSourcePlayer input, Game game) { @@ -19,6 +18,6 @@ public class DefendingPlayerOwnsCardPredicate implements ObjectSourcePlayerPredi @Override public String toString() { - return "Another"; + return ""; } } diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 9f1bf4aa66d..985767a66a0 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -39373,7 +39373,7 @@ Opposition Agent|Commander Legends|141|R|{2}{B}|Creature - Human Rogue|3|2|Flash Phyrexian Rager|Commander Legends|142|C|{2}{B}|Creature - Horror|2|2|When Phyrexian Rager enters the battlefield, you draw a card and you lose 1 life.| Plague Reaver|Commander Legends|143|R|{2}{B}|Creature - Beast|6|5|At the beginning of your end step, sacrifice each other creature you control.$Discard two cards, Sacrifice Plague Reaver: Choose target opponent. Return Plague Reaver to the battlefield under that player's control at the beginning of their next upkeep.| Profane Transfusion|Commander Legends|145|M|{6}{B}{B}{B}|Sorcery|||Two target players exchange life totals. You create an X/X colorless Horror artifact creature token, where X is the difference between those players' life totals.| -Rakshada Debaser|Commander Legends|146|R|{4}{B}{B}|Creature - Cat Demon|6|6|Whenever Rakshada Debaser attacks, put target card from defending player's graveyard onto the battlefield under your control.$Encore {6}{B}{B}| +Rakshasa Debaser|Commander Legends|146|R|{4}{B}{B}|Creature - Cat Demon|6|6|Whenever Rakshasa Debaser attacks, put target creature card from defending player's graveyard onto the battlefield under your control.$Encore {6}{B}{B}| Sanitarium Skeleton|Commander Legends|148|C|{B}|Creature - Skeleton|1|2|{2}{B}: Return Sanitarium Skeleton from your graveyard to your hand.| Sengir, the Dark Baron|Commander Legends|149|R|{4}{B}{B}|Legendary Creature - Vampire Noble|4|4|Flying$Whenever another creature dies, put two +1/+1 counters on Sengir, the Dark Baron.$Whenever another player loses the game, you gain life equal to that player's life total as the turn began.$Partner| Szat's Will|Commander Legends|152|R|{4}{B}|Instant|||Choose one. If you control a commander as you cast this spell, you may choose both.$• Each opponent sacrifices a creature they control with the greatest power.$• Exile all cards from all opponents' graveyards, then create X 0/1 black Thrull creature tokens, where X is the greatest power among creature cards exiled this way.|