From fe8f54a64c45122818ecdd795f20b2aa52fac769 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Tue, 18 Feb 2025 10:09:40 -0500 Subject: [PATCH] [FIC] Implement Terra, Herald of Hope --- .../src/mage/cards/t/TerraHeraldOfHope.java | 68 +++++++++++++++++++ .../src/mage/sets/FinalFantasyCommander.java | 3 + 2 files changed, 71 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/t/TerraHeraldOfHope.java diff --git a/Mage.Sets/src/mage/cards/t/TerraHeraldOfHope.java b/Mage.Sets/src/mage/cards/t/TerraHeraldOfHope.java new file mode 100644 index 00000000000..4ee0be2a5ad --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TerraHeraldOfHope.java @@ -0,0 +1,68 @@ +package mage.cards.t; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.common.delayed.ReflexiveTriggeredAbility; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.DoWhenCostPaid; +import mage.abilities.effects.common.MillCardsControllerEffect; +import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.filter.FilterCard; +import mage.filter.common.FilterCreatureCard; +import mage.filter.predicate.mageobject.PowerPredicate; +import mage.target.common.TargetCardInYourGraveyard; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class TerraHeraldOfHope extends CardImpl { + + private static final FilterCard filter = new FilterCreatureCard("creature card with power 3 or less from your graveyard"); + + static { + filter.add(new PowerPredicate(ComparisonType.FEWER_THAN, 4)); + } + + public TerraHeraldOfHope(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{R}{W}{B}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.WIZARD); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Trance -- At the beginning of combat on your turn, mill two cards. Terra gains flying until end of turn. + Ability ability = new BeginningOfCombatTriggeredAbility(new MillCardsControllerEffect(2)); + ability.addEffect(new GainAbilitySourceEffect(FlyingAbility.getInstance(), Duration.EndOfTurn)); + this.addAbility(ability.withFlavorWord("Trance")); + + // Whenever Terra deals combat damage to a player, you may pay {2}. When you do, return target creature card with power 3 or less from your graveyard to the battlefield tapped. + ReflexiveTriggeredAbility reflexiveAbility = new ReflexiveTriggeredAbility( + new ReturnFromGraveyardToBattlefieldTargetEffect(true), false + ); + ability.addTarget(new TargetCardInYourGraveyard(filter)); + this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility( + new DoWhenCostPaid(reflexiveAbility, new GenericManaCost(2), "Pay {2}?") + )); + } + + private TerraHeraldOfHope(final TerraHeraldOfHope card) { + super(card); + } + + @Override + public TerraHeraldOfHope copy() { + return new TerraHeraldOfHope(this); + } +} diff --git a/Mage.Sets/src/mage/sets/FinalFantasyCommander.java b/Mage.Sets/src/mage/sets/FinalFantasyCommander.java index 135ab35a02f..2ab48df6768 100644 --- a/Mage.Sets/src/mage/sets/FinalFantasyCommander.java +++ b/Mage.Sets/src/mage/sets/FinalFantasyCommander.java @@ -1,6 +1,7 @@ package mage.sets; import mage.cards.ExpansionSet; +import mage.constants.Rarity; import mage.constants.SetType; /** @@ -17,5 +18,7 @@ public final class FinalFantasyCommander extends ExpansionSet { private FinalFantasyCommander() { super("Final Fantasy Commander", "FIC", ExpansionSet.buildDate(2025, 6, 13), SetType.SUPPLEMENTAL); this.hasBasicLands = false; + + cards.add(new SetCardInfo("Terra, Herald of Hope", 4, Rarity.MYTHIC, mage.cards.t.TerraHeraldOfHope.class)); } }