From c0ccbe2a2baa6e1439deddf9c0444f98b643005d Mon Sep 17 00:00:00 2001 From: theelk801 Date: Mon, 3 Feb 2025 14:19:17 -0500 Subject: [PATCH] [DFT] Implement Chandra, Spark Hunter --- .../src/mage/cards/c/ChandraSparkHunter.java | 78 +++++++++++++++++++ Mage.Sets/src/mage/sets/Aetherdrift.java | 1 + .../emblems/ChandraSparkHunterEmblem.java | 38 +++++++++ .../game/permanent/token/VehicleToken.java | 30 +++++++ 4 files changed, 147 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/ChandraSparkHunter.java create mode 100644 Mage/src/main/java/mage/game/command/emblems/ChandraSparkHunterEmblem.java create mode 100644 Mage/src/main/java/mage/game/permanent/token/VehicleToken.java diff --git a/Mage.Sets/src/mage/cards/c/ChandraSparkHunter.java b/Mage.Sets/src/mage/cards/c/ChandraSparkHunter.java new file mode 100644 index 00000000000..e6a2666cf20 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/ChandraSparkHunter.java @@ -0,0 +1,78 @@ +package mage.cards.c; + +import mage.abilities.Ability; +import mage.abilities.LoyaltyAbility; +import mage.abilities.costs.OrCost; +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.DoIfCostPaid; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.GetEmblemEffect; +import mage.abilities.effects.common.continuous.AddCardTypeTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.HasteAbility; +import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.filter.FilterPermanent; +import mage.filter.StaticFilters; +import mage.filter.common.FilterControlledPermanent; +import mage.game.command.emblems.ChandraSparkHunterEmblem; +import mage.game.permanent.token.VehicleToken; +import mage.target.TargetPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class ChandraSparkHunter extends CardImpl { + + private static final FilterPermanent filter = new FilterControlledPermanent(SubType.VEHICLE); + + public ChandraSparkHunter(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{3}{R}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.CHANDRA); + this.setStartingLoyalty(4); + + // At the beginning of combat on your turn, choose up to one target Vehicle you control. Until end of turn, it becomes an artifact creature and gains haste. + Ability ability = new BeginningOfCombatTriggeredAbility(new AddCardTypeTargetEffect( + Duration.EndOfTurn, CardType.ARTIFACT, CardType.CREATURE + ).setText("choose up to one target Vehicle you control. Until end of turn, it becomes an artifact creature")); + ability.addEffect(new GainAbilityTargetEffect(HasteAbility.getInstance()).setText("and gains haste")); + ability.addTarget(new TargetPermanent(0, 1, filter)); + this.addAbility(ability); + + // +2: You may sacrifice an artifact or discard a card. If you do, draw a card. + this.addAbility(new LoyaltyAbility(new DoIfCostPaid( + new DrawCardSourceControllerEffect(1), + new OrCost( + "sacrifice an artifact or discard a card", + new SacrificeTargetCost(StaticFilters.FILTER_PERMANENT_ARTIFACT), + new DiscardCardCost() + ) + ), 2)); + + // +0: Create a 3/2 colorless Vehicle artifact token with crew 1. + this.addAbility(new LoyaltyAbility(new CreateTokenEffect(new VehicleToken()), 0)); + + // -7: You get an emblem with "Whenever an artifact you control enters, this emblem deals 3 damage to any target." + this.addAbility(new LoyaltyAbility(new GetEmblemEffect(new ChandraSparkHunterEmblem()))); + } + + private ChandraSparkHunter(final ChandraSparkHunter card) { + super(card); + } + + @Override + public ChandraSparkHunter copy() { + return new ChandraSparkHunter(this); + } +} diff --git a/Mage.Sets/src/mage/sets/Aetherdrift.java b/Mage.Sets/src/mage/sets/Aetherdrift.java index 1f8f9fb0183..c7181184ac6 100644 --- a/Mage.Sets/src/mage/sets/Aetherdrift.java +++ b/Mage.Sets/src/mage/sets/Aetherdrift.java @@ -55,6 +55,7 @@ public final class Aetherdrift extends ExpansionSet { cards.add(new SetCardInfo("Caelorna, Coral Tyrant", 40, Rarity.UNCOMMON, mage.cards.c.CaelornaCoralTyrant.class)); cards.add(new SetCardInfo("Camera Launcher", 232, Rarity.COMMON, mage.cards.c.CameraLauncher.class)); cards.add(new SetCardInfo("Caradora, Heart of Alacria", 195, Rarity.RARE, mage.cards.c.CaradoraHeartOfAlacria.class)); + cards.add(new SetCardInfo("Chandra, Spark Hunter", 116, Rarity.MYTHIC, mage.cards.c.ChandraSparkHunter.class)); 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)); diff --git a/Mage/src/main/java/mage/game/command/emblems/ChandraSparkHunterEmblem.java b/Mage/src/main/java/mage/game/command/emblems/ChandraSparkHunterEmblem.java new file mode 100644 index 00000000000..8e986516110 --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/ChandraSparkHunterEmblem.java @@ -0,0 +1,38 @@ +package mage.game.command.emblems; + +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.constants.Zone; +import mage.filter.StaticFilters; +import mage.game.command.Emblem; +import mage.target.common.TargetAnyTarget; + +/** + * @author TheElk801 + */ +public final class ChandraSparkHunterEmblem extends Emblem { + + /** + * Emblem with "Whenever an artifact you control enters, this emblem deals 3 damage to any target." + */ + + public ChandraSparkHunterEmblem() { + super("Emblem Chandra"); + Ability ability = new EntersBattlefieldAllTriggeredAbility( + Zone.COMMAND, new DamageTargetEffect(3), + StaticFilters.FILTER_CONTROLLED_PERMANENT_ARTIFACT_AN, false + ); + ability.addTarget(new TargetAnyTarget()); + this.getAbilities().add(ability); + } + + private ChandraSparkHunterEmblem(final ChandraSparkHunterEmblem card) { + super(card); + } + + @Override + public ChandraSparkHunterEmblem copy() { + return new ChandraSparkHunterEmblem(this); + } +} diff --git a/Mage/src/main/java/mage/game/permanent/token/VehicleToken.java b/Mage/src/main/java/mage/game/permanent/token/VehicleToken.java new file mode 100644 index 00000000000..58a5031d0c6 --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/VehicleToken.java @@ -0,0 +1,30 @@ +package mage.game.permanent.token; + +import mage.MageInt; +import mage.abilities.keyword.CrewAbility; +import mage.constants.CardType; +import mage.constants.SubType; + +/** + * @author TheElk801 + */ +public final class VehicleToken extends TokenImpl { + + public VehicleToken() { + super("Vehicle Token", "3/2 colorless Vehicle artifact token with crew 1"); + cardType.add(CardType.ARTIFACT); + subtype.add(SubType.VEHICLE); + power = new MageInt(3); + toughness = new MageInt(2); + + this.addAbility(new CrewAbility(1)); + } + + private VehicleToken(final VehicleToken token) { + super(token); + } + + public VehicleToken copy() { + return new VehicleToken(this); + } +}