From b65a5e0e1c8549f90b03e15adb01fd1419c33cc0 Mon Sep 17 00:00:00 2001 From: Susucre <34709007+Susucre@users.noreply.github.com> Date: Thu, 6 Jun 2024 17:36:03 +0200 Subject: [PATCH] implement [MH3] Rosheen, Roaring Prophet --- .../mage/cards/r/RosheenRoaringProphet.java | 163 ++++++++++++++++++ Mage.Sets/src/mage/sets/ModernHorizons3.java | 1 + .../abilities/mana/SimpleManaAbility.java | 12 +- 3 files changed, 172 insertions(+), 4 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/r/RosheenRoaringProphet.java diff --git a/Mage.Sets/src/mage/cards/r/RosheenRoaringProphet.java b/Mage.Sets/src/mage/cards/r/RosheenRoaringProphet.java new file mode 100644 index 00000000000..e8c44a1ae28 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RosheenRoaringProphet.java @@ -0,0 +1,163 @@ +package mage.cards.r; + +import mage.ConditionalMana; +import mage.MageInt; +import mage.Mana; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.MillThenPutInHandEffect; +import mage.abilities.effects.mana.ManaEffect; +import mage.abilities.mana.SimpleManaAbility; +import mage.abilities.mana.builder.ConditionalManaBuilder; +import mage.abilities.mana.conditional.XCostManaCondition; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.cards.CardsImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.VariableManaCostPredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.common.TargetCardInHand; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +/** + * @author Susucr + */ +public final class RosheenRoaringProphet extends CardImpl { + + private static final FilterCard filter = new FilterCard("a card with {X} in its mana cost"); + + static { + filter.add(VariableManaCostPredicate.instance); + } + + public RosheenRoaringProphet(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}{G}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.GIANT); + this.subtype.add(SubType.SHAMAN); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // When Rosheen, Roaring Prophet enters the battlefield, mill six cards. You may put a card with {X} in its mana cost from among them into your hand. + this.addAbility(new EntersBattlefieldTriggeredAbility( + new MillThenPutInHandEffect(6, filter), true + )); + + // {T}: Reveal any number of cards with {X} in their mana cost in your hand. Add {C}{C} for each card revealed this way. Spend this mana only on costs that contain {X}. + SimpleManaAbility ability = new SimpleManaAbility( + new RosheenRoaringProphetManaEffect(), + new TapSourceCost() + ); + ability.setUndoPossible(false); + this.addAbility(ability); + } + + private RosheenRoaringProphet(final RosheenRoaringProphet card) { + super(card); + } + + @Override + public RosheenRoaringProphet copy() { + return new RosheenRoaringProphet(this); + } +} + +// Mixed from [Metalworker] and [Elementalist's Palette] +class RosheenRoaringProphetManaEffect extends ManaEffect { + + private final ConditionalManaBuilder manaBuilder = new RosheenRoaringProphetManaBuilder(); + private static final FilterCard filter = new FilterCard("a card with {X} in its mana cost"); + + static { + filter.add(VariableManaCostPredicate.instance); + } + + RosheenRoaringProphetManaEffect() { + super(); + staticText = "reveal any number of cards with {X} in their mana cost in your hand. " + + "Add {C}{C} for each card revealed this way. Spend this mana only on costs that contain {X}"; + } + + private RosheenRoaringProphetManaEffect(final RosheenRoaringProphetManaEffect effect) { + super(effect); + } + + @Override + public RosheenRoaringProphetManaEffect copy() { + return new RosheenRoaringProphetManaEffect(this); + } + + @Override + public List getNetMana(Game game, Ability source) { + List netMana = new ArrayList<>(); + if (game != null) { + Player controller = getPlayer(game, source); + if (controller != null) { + int maxAmount = controller.getHand().count(filter, game); + if (maxAmount > 0) { + netMana.add( + manaBuilder.setMana( + Mana.ColorlessMana(2 * maxAmount), source, game + ).build() + ); + } + } + } + return netMana; + } + + @Override + public Mana produceMana(Game game, Ability source) { + Mana mana = new Mana(); + if (game == null) { + return mana; + } + Player controller = getPlayer(game, source); + if (controller == null) { + return mana; + } + int maxAmount = controller.getHand().count(filter, game); + if (maxAmount > 0) { + TargetCardInHand target = new TargetCardInHand(0, Integer.MAX_VALUE, filter); + if (controller.choose(Outcome.Benefit, target, source, game)) { + Cards cards = new CardsImpl(target.getTargets()); + controller.revealCards(source, cards, game); + return manaBuilder.setMana( + Mana.ColorlessMana(target.getTargets().size() * 2), source, game + ).build(); + } + } + return mana; + } +} + +class RosheenRoaringProphetManaBuilder extends ConditionalManaBuilder { + @Override + public ConditionalMana build(Object... options) { + return new RosheenRoaringProphetConditionalMana(this.mana); + } + + @Override + public String getRule() { + return "Spend this mana only on costs that contain {X}"; + } +} + +class RosheenRoaringProphetConditionalMana extends ConditionalMana { + + RosheenRoaringProphetConditionalMana(Mana mana) { + super(mana); + addCondition(new XCostManaCondition()); + } +} diff --git a/Mage.Sets/src/mage/sets/ModernHorizons3.java b/Mage.Sets/src/mage/sets/ModernHorizons3.java index 4c61932e0c5..cb78c6da8ef 100644 --- a/Mage.Sets/src/mage/sets/ModernHorizons3.java +++ b/Mage.Sets/src/mage/sets/ModernHorizons3.java @@ -235,6 +235,7 @@ public final class ModernHorizons3 extends ExpansionSet { cards.add(new SetCardInfo("Ripples of Undeath", 107, Rarity.RARE, mage.cards.r.RipplesOfUndeath.class)); cards.add(new SetCardInfo("Roil Cartographer", 67, Rarity.UNCOMMON, mage.cards.r.RoilCartographer.class)); cards.add(new SetCardInfo("Rosecot Knight", 42, Rarity.COMMON, mage.cards.r.RosecotKnight.class)); + cards.add(new SetCardInfo("Rosheen, Roaring Prophet", 202, Rarity.RARE, mage.cards.r.RosheenRoaringProphet.class)); cards.add(new SetCardInfo("Ruby Medallion", 295, Rarity.RARE, mage.cards.r.RubyMedallion.class)); cards.add(new SetCardInfo("Rush of Inspiration", 257, Rarity.UNCOMMON, mage.cards.r.RushOfInspiration.class)); cards.add(new SetCardInfo("Sage of the Unknowable", 68, Rarity.COMMON, mage.cards.s.SageOfTheUnknowable.class)); diff --git a/Mage/src/main/java/mage/abilities/mana/SimpleManaAbility.java b/Mage/src/main/java/mage/abilities/mana/SimpleManaAbility.java index f2ccea8e2da..4b02a9c1376 100644 --- a/Mage/src/main/java/mage/abilities/mana/SimpleManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/SimpleManaAbility.java @@ -1,16 +1,16 @@ package mage.abilities.mana; -import java.util.ArrayList; -import java.util.List; - import mage.Mana; import mage.abilities.costs.Cost; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.effects.mana.ManaEffect; import mage.abilities.effects.mana.BasicManaEffect; +import mage.abilities.effects.mana.ManaEffect; import mage.constants.Zone; import mage.game.Game; +import java.util.ArrayList; +import java.util.List; + /** * @author BetaSteward_at_googlemail.com */ @@ -18,6 +18,10 @@ public class SimpleManaAbility extends ActivatedManaAbilityImpl { private boolean predictable; + public SimpleManaAbility(ManaEffect effect, Cost cost) { + this(Zone.BATTLEFIELD, effect, cost); + } + public SimpleManaAbility(Zone zone, ManaEffect effect, Cost cost) { this(zone, effect, cost, true); }