From 488e91edd460b46c2367f217fce18c9f2339ae41 Mon Sep 17 00:00:00 2001 From: ciaccona007 Date: Wed, 6 Nov 2024 14:17:39 -0500 Subject: [PATCH] [PIP] Implement Grim Reaper's Sprint --- .../src/mage/cards/g/GrimReapersSprint.java | 140 ++++++++++++++++++ Mage.Sets/src/mage/sets/Fallout.java | 1 + 2 files changed, 141 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/g/GrimReapersSprint.java diff --git a/Mage.Sets/src/mage/cards/g/GrimReapersSprint.java b/Mage.Sets/src/mage/cards/g/GrimReapersSprint.java new file mode 100644 index 000000000000..0ac00b642aa2 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GrimReapersSprint.java @@ -0,0 +1,140 @@ +package mage.cards.g; + +import mage.abilities.Ability; +import mage.abilities.SpellAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.common.MorbidCondition; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.AdditionalCombatPhaseEffect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.UntapAllControllerEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.effects.common.cost.CostModificationEffectImpl; +import mage.abilities.hint.common.MorbidHint; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; +import mage.util.CardUtil; + +import java.util.UUID; + +/** + * + * @author ciaccona007 + */ +public final class GrimReapersSprint extends CardImpl { + + public GrimReapersSprint(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{R}"); + + this.subtype.add(SubType.AURA); + + // Morbid -- This spell costs {3} less to cast if a creature died this turn. + this.addAbility( + new SimpleStaticAbility(Zone.ALL, new GrimReapersSprintCostModificationEffect()) + .addHint(MorbidHint.instance) + .setAbilityWord(AbilityWord.MORBID) + ); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + this.addAbility(new EnchantAbility(auraTarget)); + + // When Grim Reaper's Sprint enters the battlefield, untap each creature you control. If it's your main phase, there is an additional combat phase after this phase. + Ability triggeredAbility = new EntersBattlefieldTriggeredAbility( + new UntapAllControllerEffect( + StaticFilters.FILTER_CONTROLLED_CREATURES, + "untap each creature you control" + ), false + ); + triggeredAbility.addEffect(new GrimReapersSprintEffect()); + this.addAbility(triggeredAbility); + + // Enchanted creature gets +2/+2 and has haste. + Effect effect = new GainAbilityAttachedEffect(HasteAbility.getInstance(), AttachmentType.AURA); + effect.setText("and has haste"); + Ability staticAbility = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(2, 2)); + staticAbility.addEffect(effect); + this.addAbility(staticAbility); + } + + private GrimReapersSprint(final GrimReapersSprint card) { + super(card); + } + + @Override + public GrimReapersSprint copy() { + return new GrimReapersSprint(this); + } +} + +class GrimReapersSprintCostModificationEffect extends CostModificationEffectImpl { + + GrimReapersSprintCostModificationEffect() { + super(Duration.EndOfGame, Outcome.Benefit, CostModificationType.REDUCE_COST); + staticText = "this spell costs {3} less to cast if a creature died this turn"; + } + + private GrimReapersSprintCostModificationEffect(final GrimReapersSprintCostModificationEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source, Ability abilityToModify) { + CardUtil.reduceCost(abilityToModify, 3); + return true; + } + + @Override + public boolean applies(Ability abilityToModify, Ability source, Game game) { + if (abilityToModify.getSourceId().equals(source.getSourceId()) + && (abilityToModify instanceof SpellAbility)) { + return MorbidCondition.instance.apply(game, abilityToModify); + } + return false; + } + + @Override + public GrimReapersSprintCostModificationEffect copy() { + return new GrimReapersSprintCostModificationEffect(this); + } +} + +class GrimReapersSprintEffect extends OneShotEffect { + + GrimReapersSprintEffect() { + super(Outcome.Benefit); + } + + private GrimReapersSprintEffect(final GrimReapersSprintEffect effect) { + super(effect); + } + + @Override + public GrimReapersSprintEffect copy() { + return new GrimReapersSprintEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null + && game.isActivePlayer(source.getControllerId()) + && game.getTurnPhaseType().isMain()) { + return new AdditionalCombatPhaseEffect().apply(game, source); + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/Fallout.java b/Mage.Sets/src/mage/sets/Fallout.java index e73900a6874f..d8c805944a4f 100644 --- a/Mage.Sets/src/mage/sets/Fallout.java +++ b/Mage.Sets/src/mage/sets/Fallout.java @@ -153,6 +153,7 @@ private Fallout() { cards.add(new SetCardInfo("Glimmer of Genius", 176, Rarity.UNCOMMON, mage.cards.g.GlimmerOfGenius.class)); cards.add(new SetCardInfo("Glowing One", 76, Rarity.UNCOMMON, mage.cards.g.GlowingOne.class)); cards.add(new SetCardInfo("Grave Titan", 346, Rarity.MYTHIC, mage.cards.g.GraveTitan.class)); + cards.add(new SetCardInfo("Grim Reaper's Sprint", 58, Rarity.RARE, mage.cards.g.GrimReapersSprint.class)); cards.add(new SetCardInfo("Guardian Project", 199, Rarity.RARE, mage.cards.g.GuardianProject.class)); cards.add(new SetCardInfo("Gunner Conscript", 77, Rarity.UNCOMMON, mage.cards.g.GunnerConscript.class)); cards.add(new SetCardInfo("HELIOS One", 149, Rarity.RARE, mage.cards.h.HELIOSOne.class));