From 4c4168ac1f04ca7003b8decd41bec5d33c2aa4ab Mon Sep 17 00:00:00 2001 From: Evan Kranzler <theelk801@gmail.com> Date: Mon, 16 Aug 2021 09:26:25 -0400 Subject: [PATCH] [AFC] Implemented Hurl Through Hell --- Mage.Sets/src/mage/cards/f/FallenShinobi.java | 2 +- .../mage/cards/g/GolosTirelessPilgrim.java | 2 +- .../src/mage/cards/h/HurlThroughHell.java | 71 +++++++++++++++++++ .../src/mage/cards/i/IgniteTheFuture.java | 2 +- .../src/mage/cards/k/KheruSpellsnatcher.java | 2 +- .../src/mage/cards/m/MagusOfTheMind.java | 2 +- Mage.Sets/src/mage/cards/m/MindsDesire.java | 2 +- Mage.Sets/src/mage/cards/o/OraclesVault.java | 4 +- .../mage/cards/r/RadiantScrollwielder.java | 2 +- .../mage/cards/r/RagavanNimblePilferer.java | 2 +- .../src/mage/cards/r/ReleaseToTheWind.java | 2 +- .../mage/cards/u/UrzaLordHighArtificer.java | 2 +- .../mage/sets/ForgottenRealmsCommander.java | 1 + .../PlayFromNotOwnHandZoneTargetEffect.java | 13 +++- 14 files changed, 94 insertions(+), 15 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/h/HurlThroughHell.java diff --git a/Mage.Sets/src/mage/cards/f/FallenShinobi.java b/Mage.Sets/src/mage/cards/f/FallenShinobi.java index 19b61ebf61..032694f8e9 100644 --- a/Mage.Sets/src/mage/cards/f/FallenShinobi.java +++ b/Mage.Sets/src/mage/cards/f/FallenShinobi.java @@ -71,6 +71,6 @@ class FallenShinobiEffect extends OneShotEffect { return false; } return PlayFromNotOwnHandZoneTargetEffect.exileAndPlayFromExile(game, source, player.getLibrary().getTopCards(game, 2), - TargetController.YOU, Duration.EndOfTurn, true, false); + TargetController.YOU, Duration.EndOfTurn, true, false, false); } } diff --git a/Mage.Sets/src/mage/cards/g/GolosTirelessPilgrim.java b/Mage.Sets/src/mage/cards/g/GolosTirelessPilgrim.java index b448c00551..d0c592f14a 100644 --- a/Mage.Sets/src/mage/cards/g/GolosTirelessPilgrim.java +++ b/Mage.Sets/src/mage/cards/g/GolosTirelessPilgrim.java @@ -75,7 +75,7 @@ class GolosTirelessPilgrimEffect extends OneShotEffect { } Set<Card> cards = player.getLibrary().getTopCards(game, 3); return PlayFromNotOwnHandZoneTargetEffect.exileAndPlayFromExile(game, source, cards, - TargetController.YOU, Duration.EndOfTurn, true, false); + TargetController.YOU, Duration.EndOfTurn, true, false, false); } @Override diff --git a/Mage.Sets/src/mage/cards/h/HurlThroughHell.java b/Mage.Sets/src/mage/cards/h/HurlThroughHell.java new file mode 100644 index 0000000000..fc1f0389e4 --- /dev/null +++ b/Mage.Sets/src/mage/cards/h/HurlThroughHell.java @@ -0,0 +1,71 @@ +package mage.cards.h; + +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.asthought.PlayFromNotOwnHandZoneTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.TargetController; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class HurlThroughHell extends CardImpl { + + public HurlThroughHell(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{B}{R}"); + + // Exile target creature. Until the end of your next turn, you may cast that card and you may spend mana as though it were mana of any color to cast that spell. + this.getSpellAbility().addEffect(new HurlThroughHellEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + private HurlThroughHell(final HurlThroughHell card) { + super(card); + } + + @Override + public HurlThroughHell copy() { + return new HurlThroughHell(this); + } +} + +class HurlThroughHellEffect extends OneShotEffect { + + HurlThroughHellEffect() { + super(Outcome.Benefit); + staticText = "exile target creature. Until the end of your next turn, you may cast that card " + + "and you may spend mana as though it were mana of any color to cast that spell"; + } + + private HurlThroughHellEffect(final HurlThroughHellEffect effect) { + super(effect); + } + + @Override + public HurlThroughHellEffect copy() { + return new HurlThroughHellEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanent(source.getFirstTarget()); + if (permanent == null) { + return false; + } + PlayFromNotOwnHandZoneTargetEffect.exileAndPlayFromExile( + game, source, permanent.getMainCard(), TargetController.YOU, + Duration.UntilEndOfYourNextTurn, + false, true, true + ); + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/i/IgniteTheFuture.java b/Mage.Sets/src/mage/cards/i/IgniteTheFuture.java index 828ada18fa..9fdf7a6aaa 100644 --- a/Mage.Sets/src/mage/cards/i/IgniteTheFuture.java +++ b/Mage.Sets/src/mage/cards/i/IgniteTheFuture.java @@ -69,6 +69,6 @@ class IgniteTheFutureEffect extends OneShotEffect { } Set<Card> cards = controller.getLibrary().getTopCards(game, 3); return PlayFromNotOwnHandZoneTargetEffect.exileAndPlayFromExile(game, source, cards, - TargetController.YOU, Duration.UntilEndOfYourNextTurn, Zone.GRAVEYARD.equals(spell.getFromZone()), false); + TargetController.YOU, Duration.UntilEndOfYourNextTurn, Zone.GRAVEYARD.equals(spell.getFromZone()), false, false); } } diff --git a/Mage.Sets/src/mage/cards/k/KheruSpellsnatcher.java b/Mage.Sets/src/mage/cards/k/KheruSpellsnatcher.java index 5d42560d90..f2d1aa45cd 100644 --- a/Mage.Sets/src/mage/cards/k/KheruSpellsnatcher.java +++ b/Mage.Sets/src/mage/cards/k/KheruSpellsnatcher.java @@ -78,7 +78,7 @@ class KheruSpellsnatcherEffect extends OneShotEffect { MageObject card = game.getObject(stackObject.getSourceId()); if (card instanceof Card) { return PlayFromNotOwnHandZoneTargetEffect.exileAndPlayFromExile(game, source, (Card) card, - TargetController.YOU, Duration.Custom, true, true); + TargetController.YOU, Duration.Custom, true, false, true); } } } diff --git a/Mage.Sets/src/mage/cards/m/MagusOfTheMind.java b/Mage.Sets/src/mage/cards/m/MagusOfTheMind.java index 0a1286ea30..d008b35c54 100644 --- a/Mage.Sets/src/mage/cards/m/MagusOfTheMind.java +++ b/Mage.Sets/src/mage/cards/m/MagusOfTheMind.java @@ -80,7 +80,7 @@ class MagusOfTheMindEffect extends OneShotEffect { if (controller.getLibrary().hasCards()) { Set<Card> cards = controller.getLibrary().getTopCards(game, stormCount); return PlayFromNotOwnHandZoneTargetEffect.exileAndPlayFromExile(game, source, cards, - TargetController.YOU, Duration.EndOfTurn, true, false); + TargetController.YOU, Duration.EndOfTurn, true, false, false); } return true; } diff --git a/Mage.Sets/src/mage/cards/m/MindsDesire.java b/Mage.Sets/src/mage/cards/m/MindsDesire.java index 745f7137c7..148fc78008 100644 --- a/Mage.Sets/src/mage/cards/m/MindsDesire.java +++ b/Mage.Sets/src/mage/cards/m/MindsDesire.java @@ -62,7 +62,7 @@ class MindsDesireEffect extends OneShotEffect { if (controller != null) { controller.shuffleLibrary(source, game); return PlayFromNotOwnHandZoneTargetEffect.exileAndPlayFromExile(game, source, controller.getLibrary().getFromTop(game), - TargetController.YOU, Duration.EndOfTurn, true, false); + TargetController.YOU, Duration.EndOfTurn, true, false, false); } return false; } diff --git a/Mage.Sets/src/mage/cards/o/OraclesVault.java b/Mage.Sets/src/mage/cards/o/OraclesVault.java index 4342bf440b..20fda3923a 100644 --- a/Mage.Sets/src/mage/cards/o/OraclesVault.java +++ b/Mage.Sets/src/mage/cards/o/OraclesVault.java @@ -75,7 +75,7 @@ class OraclesVaultEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { return PlayFromNotOwnHandZoneTargetEffect.exileAndPlayFromExile(game, source, controller.getLibrary().getFromTop(game), - TargetController.YOU, Duration.EndOfTurn, false, false); + TargetController.YOU, Duration.EndOfTurn, false, false, false); } return false; } @@ -101,7 +101,7 @@ class OraclesVaultFreeEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { return PlayFromNotOwnHandZoneTargetEffect.exileAndPlayFromExile(game, source, controller.getLibrary().getFromTop(game), - TargetController.YOU, Duration.EndOfTurn, true, false); + TargetController.YOU, Duration.EndOfTurn, true, false, false); } return false; } diff --git a/Mage.Sets/src/mage/cards/r/RadiantScrollwielder.java b/Mage.Sets/src/mage/cards/r/RadiantScrollwielder.java index bd2a6a217e..fc7baddd30 100644 --- a/Mage.Sets/src/mage/cards/r/RadiantScrollwielder.java +++ b/Mage.Sets/src/mage/cards/r/RadiantScrollwielder.java @@ -104,7 +104,7 @@ class RadiantScrollwielderEffect extends OneShotEffect { } PlayFromNotOwnHandZoneTargetEffect.exileAndPlayFromExile( game, source, card, TargetController.YOU, - Duration.EndOfTurn, false, true + Duration.EndOfTurn, false, false, true ); game.addEffect(new RadiantScrollwielderReplacementEffect(card, game), source); return true; diff --git a/Mage.Sets/src/mage/cards/r/RagavanNimblePilferer.java b/Mage.Sets/src/mage/cards/r/RagavanNimblePilferer.java index a1e75b1cfd..8d5751714f 100644 --- a/Mage.Sets/src/mage/cards/r/RagavanNimblePilferer.java +++ b/Mage.Sets/src/mage/cards/r/RagavanNimblePilferer.java @@ -80,7 +80,7 @@ class RagavanNimblePilfererEffect extends OneShotEffect { return false; } return PlayFromNotOwnHandZoneTargetEffect.exileAndPlayFromExile( - game, source, card, TargetController.YOU, Duration.EndOfTurn, false, true + game, source, card, TargetController.YOU, Duration.EndOfTurn, false, false, true ); } } diff --git a/Mage.Sets/src/mage/cards/r/ReleaseToTheWind.java b/Mage.Sets/src/mage/cards/r/ReleaseToTheWind.java index 9bb67dd540..0aa6a88c45 100644 --- a/Mage.Sets/src/mage/cards/r/ReleaseToTheWind.java +++ b/Mage.Sets/src/mage/cards/r/ReleaseToTheWind.java @@ -62,7 +62,7 @@ class ReleaseToTheWindEffect extends OneShotEffect { Permanent targetPermanent = game.getPermanent(getTargetPointer().getFirst(game, source)); if (targetPermanent != null) { return PlayFromNotOwnHandZoneTargetEffect.exileAndPlayFromExile(game, source, targetPermanent, - TargetController.OWNER, Duration.Custom, true, true); + TargetController.OWNER, Duration.Custom, true, false, true); } } return false; diff --git a/Mage.Sets/src/mage/cards/u/UrzaLordHighArtificer.java b/Mage.Sets/src/mage/cards/u/UrzaLordHighArtificer.java index ffb049223c..71cf2f8041 100644 --- a/Mage.Sets/src/mage/cards/u/UrzaLordHighArtificer.java +++ b/Mage.Sets/src/mage/cards/u/UrzaLordHighArtificer.java @@ -99,7 +99,7 @@ class UrzaLordHighArtificerEffect extends OneShotEffect { controller.shuffleLibrary(source, game); Card card = controller.getLibrary().getFromTop(game); return PlayFromNotOwnHandZoneTargetEffect.exileAndPlayFromExile(game, source, card, - TargetController.YOU, Duration.EndOfTurn, true, false); + TargetController.YOU, Duration.EndOfTurn, true, false, false); } } diff --git a/Mage.Sets/src/mage/sets/ForgottenRealmsCommander.java b/Mage.Sets/src/mage/sets/ForgottenRealmsCommander.java index dcf4c2a207..dae80c2852 100644 --- a/Mage.Sets/src/mage/sets/ForgottenRealmsCommander.java +++ b/Mage.Sets/src/mage/sets/ForgottenRealmsCommander.java @@ -129,6 +129,7 @@ public final class ForgottenRealmsCommander extends ExpansionSet { cards.add(new SetCardInfo("High Market", 246, Rarity.RARE, mage.cards.h.HighMarket.class)); cards.add(new SetCardInfo("Hoard-Smelter Dragon", 128, Rarity.RARE, mage.cards.h.HoardSmelterDragon.class)); cards.add(new SetCardInfo("Hostage Taker", 186, Rarity.RARE, mage.cards.h.HostageTaker.class)); + cards.add(new SetCardInfo("Hurl Through Hell", 48, Rarity.RARE, mage.cards.h.HurlThroughHell.class)); cards.add(new SetCardInfo("Ignite the Future", 129, Rarity.RARE, mage.cards.i.IgniteTheFuture.class)); cards.add(new SetCardInfo("Imprisoned in the Moon", 85, Rarity.RARE, mage.cards.i.ImprisonedInTheMoon.class)); cards.add(new SetCardInfo("Indomitable Might", 40, Rarity.RARE, mage.cards.i.IndomitableMight.class)); diff --git a/Mage/src/main/java/mage/abilities/effects/common/asthought/PlayFromNotOwnHandZoneTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/asthought/PlayFromNotOwnHandZoneTargetEffect.java index 1ec1a91e7a..6bd0983a7a 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/asthought/PlayFromNotOwnHandZoneTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/asthought/PlayFromNotOwnHandZoneTargetEffect.java @@ -9,6 +9,7 @@ import mage.cards.Card; import mage.constants.*; import mage.game.Game; import mage.players.Player; +import mage.target.targetpointer.FixedTarget; import mage.target.targetpointer.FixedTargets; import mage.util.CardUtil; @@ -140,13 +141,13 @@ public class PlayFromNotOwnHandZoneTargetEffect extends AsThoughEffectImpl { } public static boolean exileAndPlayFromExile(Game game, Ability source, Card card, TargetController allowedCaster, - Duration duration, boolean withoutMana, boolean onlyCastAllowed) { + Duration duration, boolean withoutMana, boolean anyColor, boolean onlyCastAllowed) { if (card == null) { return true; } Set<Card> cards = new HashSet<>(); cards.add(card); - return exileAndPlayFromExile(game, source, cards, allowedCaster, duration, withoutMana, onlyCastAllowed); + return exileAndPlayFromExile(game, source, cards, allowedCaster, duration, withoutMana, anyColor, onlyCastAllowed); } /** @@ -158,11 +159,12 @@ public class PlayFromNotOwnHandZoneTargetEffect extends AsThoughEffectImpl { * @param allowedCaster * @param duration * @param withoutMana + * @param anyColor * @param onlyCastAllowed true for rule "cast that card" and false for rule "play that card" * @return */ public static boolean exileAndPlayFromExile(Game game, Ability source, Set<Card> cards, TargetController allowedCaster, - Duration duration, boolean withoutMana, boolean onlyCastAllowed) { + Duration duration, boolean withoutMana, boolean anyColor, boolean onlyCastAllowed) { if (cards == null || cards.isEmpty()) { return true; } @@ -196,6 +198,11 @@ public class PlayFromNotOwnHandZoneTargetEffect extends AsThoughEffectImpl { ContinuousEffect effect = new PlayFromNotOwnHandZoneTargetEffect(Zone.EXILED, allowedCaster, duration, withoutMana, onlyCastAllowed); effect.setTargetPointer(new FixedTargets(cardsToPlay, game)); game.addEffect(effect, source); + if (anyColor) { + for (Card card : cardsToPlay) { + game.addEffect(new YouMaySpendManaAsAnyColorToCastTargetEffect(duration).setTargetPointer(new FixedTarget(card, game)), source); + } + } return true; } }