From f04786ee53e825841729f62a8463adfc7b68f14e Mon Sep 17 00:00:00 2001 From: Jmlundeen <98545818+Jmlundeen@users.noreply.github.com> Date: Tue, 25 Feb 2025 08:21:53 -0600 Subject: [PATCH] [DFT] Implement Coalstoke Gearhulk (#13385) --- .../src/mage/cards/c/CoalstokeGearhulk.java | 116 ++++++++++++++++++ Mage.Sets/src/mage/sets/Aetherdrift.java | 4 + 2 files changed, 120 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/CoalstokeGearhulk.java diff --git a/Mage.Sets/src/mage/cards/c/CoalstokeGearhulk.java b/Mage.Sets/src/mage/cards/c/CoalstokeGearhulk.java new file mode 100644 index 00000000000..8e04f69764a --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CoalstokeGearhulk.java @@ -0,0 +1,116 @@ +package mage.cards.c; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.DelayedTriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldWithCounterTargetEffect; +import mage.abilities.effects.common.SacrificeTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.HasteAbility; +import mage.cards.Card; +import mage.constants.ComparisonType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.abilities.keyword.MenaceAbility; +import mage.abilities.keyword.DeathtouchAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.Filter; +import mage.filter.StaticFilters; +import mage.filter.common.FilterCreatureCard; +import mage.filter.predicate.card.ManaValueLessThanControlledLandCountPredicate; +import mage.filter.predicate.mageobject.ManaValuePredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetCardInGraveyard; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author anonymous + */ +public final class CoalstokeGearhulk extends CardImpl { + private static final FilterCreatureCard filter = new FilterCreatureCard("creature card with mana value 4 or less from a graveyard"); + + static { + filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, 5)); + } + public CoalstokeGearhulk(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{1}{B}{B}{R}{R}"); + + this.subtype.add(SubType.CONSTRUCT); + this.power = new MageInt(5); + this.toughness = new MageInt(4); + + // Menace + this.addAbility(new MenaceAbility()); + + // Deathtouch + this.addAbility(DeathtouchAbility.getInstance()); + + // When this creature enters, put target creature card with mana value 4 or less from a graveyard onto the battlefield under your control with a finality counter on it. That creature gains menace, deathtouch, and haste. At the beginnning of your next end step, exile that creature. + Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnFromGraveyardToBattlefieldWithCounterTargetEffect(CounterType.FINALITY.createInstance())) + .setTriggerPhrase("When this creature enters, "); + ability.addEffect(new GainAbilityTargetEffect(new MenaceAbility()) + .setText("That creature gains menace")); + ability.addEffect(new GainAbilityTargetEffect(DeathtouchAbility.getInstance()) + .setText("deathtouch") + .concatBy(",")); + ability.addEffect(new GainAbilityTargetEffect(HasteAbility.getInstance()) + .setText("haste") + .concatBy(", and")); + ability.addEffect(new CoalstokeGearhulkEffect()); + ability.addTarget(new TargetCardInGraveyard(filter)); + this.addAbility(ability); + } + + private CoalstokeGearhulk(final CoalstokeGearhulk card) { + super(card); + } + + @Override + public CoalstokeGearhulk copy() { + return new CoalstokeGearhulk(this); + } +} + +class CoalstokeGearhulkEffect extends OneShotEffect { + public CoalstokeGearhulkEffect() { + super(Outcome.Benefit); + this.staticText = "At the beginning of your next end step, exile that creature."; + } + + public CoalstokeGearhulkEffect(final CoalstokeGearhulkEffect effect) { + super(effect); + } + + @Override + public CoalstokeGearhulkEffect copy() { + return new CoalstokeGearhulkEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanent(source.getFirstTarget()); + if (permanent == null) { + return false; + } + ExileTargetEffect exileEffect = new ExileTargetEffect("At the beginning of your next end step, exile " + permanent.getLogName()); + exileEffect.setTargetPointer(new FixedTarget(permanent, game)); + DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(exileEffect, TargetController.YOU); + game.addDelayedTriggeredAbility(delayedAbility, source); + return true; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/Aetherdrift.java b/Mage.Sets/src/mage/sets/Aetherdrift.java index dfcef6ecbec..16d9f565e22 100644 --- a/Mage.Sets/src/mage/sets/Aetherdrift.java +++ b/Mage.Sets/src/mage/sets/Aetherdrift.java @@ -68,6 +68,10 @@ public final class Aetherdrift extends ExpansionSet { cards.add(new SetCardInfo("Clamorous Ironclad", 117, Rarity.COMMON, mage.cards.c.ClamorousIronclad.class)); cards.add(new SetCardInfo("Cloudspire Captain", 9, Rarity.UNCOMMON, mage.cards.c.CloudspireCaptain.class)); cards.add(new SetCardInfo("Cloudspire Coordinator", 196, Rarity.UNCOMMON, mage.cards.c.CloudspireCoordinator.class)); + cards.add(new SetCardInfo("Coalstoke Gearhulk", 198, Rarity.MYTHIC, mage.cards.c.CoalstokeGearhulk.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Coalstoke Gearhulk", 349, Rarity.MYTHIC, mage.cards.c.CoalstokeGearhulk.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Coalstoke Gearhulk", 477, Rarity.MYTHIC, mage.cards.c.CoalstokeGearhulk.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Coalstoke Gearhulk", 548, Rarity.MYTHIC, mage.cards.c.CoalstokeGearhulk.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Collision Course", 10, Rarity.COMMON, mage.cards.c.CollisionCourse.class)); cards.add(new SetCardInfo("Count on Luck", 118, Rarity.RARE, mage.cards.c.CountOnLuck.class)); cards.add(new SetCardInfo("Country Roads", 253, Rarity.UNCOMMON, mage.cards.c.CountryRoads.class));