From 4e7495a8f249d3835332512708d99fad83f6fe54 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Sun, 11 May 2025 18:21:33 -0400 Subject: [PATCH] [FIN] Implement Firion, Wild Rose Warrior --- .../mage/cards/f/FirionWildRoseWarrior.java | 131 ++++++++++++++++++ Mage.Sets/src/mage/sets/FinalFantasy.java | 4 + 2 files changed, 135 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/f/FirionWildRoseWarrior.java diff --git a/Mage.Sets/src/mage/cards/f/FirionWildRoseWarrior.java b/Mage.Sets/src/mage/cards/f/FirionWildRoseWarrior.java new file mode 100644 index 00000000000..b70c409f3da --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FirionWildRoseWarrior.java @@ -0,0 +1,131 @@ +package mage.cards.f; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateTokenCopyTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.effects.common.cost.CostModificationEffectImpl; +import mage.abilities.keyword.EquipAbility; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.EquippedPredicate; +import mage.filter.predicate.permanent.TokenPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.util.CardUtil; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class FirionWildRoseWarrior extends CardImpl { + + private static final FilterPermanent filter + = new FilterCreaturePermanent("equipped creatures"); + private static final FilterPermanent filter2 + = new FilterControlledPermanent(SubType.EQUIPMENT, "a nontoken Equipment you control"); + + static { + filter.add(EquippedPredicate.instance); + filter2.add(TokenPredicate.FALSE); + } + + public FirionWildRoseWarrior(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.REBEL); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Equipped creatures you control have haste. + this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect( + HasteAbility.getInstance(), Duration.WhileOnBattlefield, filter + ))); + + // Whenever a nontoken Equipment you control enters, create a token that's a copy of it, except it has "This Equipment's equip abilities cost {2} less to activate." Sacrifice that token at the beginning of the next upkeep. + this.addAbility(new EntersBattlefieldAllTriggeredAbility(new FirionWildRoseWarriorEffect(), filter2)); + } + + private FirionWildRoseWarrior(final FirionWildRoseWarrior card) { + super(card); + } + + @Override + public FirionWildRoseWarrior copy() { + return new FirionWildRoseWarrior(this); + } +} + +class FirionWildRoseWarriorEffect extends OneShotEffect { + + FirionWildRoseWarriorEffect() { + super(Outcome.Benefit); + staticText = "create a token that's a copy of it, except it has " + + "\"This Equipment's equip abilities cost {2} less to activate.\" " + + "Sacrifice that token at the beginning of the next upkeep"; + } + + private FirionWildRoseWarriorEffect(final FirionWildRoseWarriorEffect effect) { + super(effect); + } + + @Override + public FirionWildRoseWarriorEffect copy() { + return new FirionWildRoseWarriorEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = (Permanent) getValue("permanentEnteringBattlefield"); + if (permanent == null) { + return false; + } + CreateTokenCopyTargetEffect effect = new CreateTokenCopyTargetEffect(); + effect.addAdditionalAbilities(new SimpleStaticAbility(new FirionWildRoseWarriorReductionEffect())); + effect.setSavedPermanent(permanent); + effect.apply(game, source); + effect.sacrificeTokensCreatedAtNextEndStep(game, source); + return true; + } +} + +class FirionWildRoseWarriorReductionEffect extends CostModificationEffectImpl { + + FirionWildRoseWarriorReductionEffect() { + super(Duration.WhileOnBattlefield, Outcome.Benefit, CostModificationType.REDUCE_COST); + staticText = "this Equipment's equip abilities cost {2} less to activate"; + } + + private FirionWildRoseWarriorReductionEffect(final FirionWildRoseWarriorReductionEffect effect) { + super(effect); + } + + @Override + public FirionWildRoseWarriorReductionEffect copy() { + return new FirionWildRoseWarriorReductionEffect(this); + } + + @Override + public boolean apply(Game game, Ability source, Ability abilityToModify) { + CardUtil.reduceCost(abilityToModify, 2); + return true; + } + + @Override + public boolean applies(Ability abilityToModify, Ability source, Game game) { + return abilityToModify instanceof EquipAbility + && source.getSourceId().equals(abilityToModify.getSourceId()); + } +} diff --git a/Mage.Sets/src/mage/sets/FinalFantasy.java b/Mage.Sets/src/mage/sets/FinalFantasy.java index ce3e8b54698..838d1c998e9 100644 --- a/Mage.Sets/src/mage/sets/FinalFantasy.java +++ b/Mage.Sets/src/mage/sets/FinalFantasy.java @@ -71,6 +71,10 @@ public final class FinalFantasy extends ExpansionSet { cards.add(new SetCardInfo("Fang, Fearless l'Cie", 526, Rarity.UNCOMMON, mage.cards.f.FangFearlessLCie.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Fang, Fearless l'Cie", 99, Rarity.UNCOMMON, mage.cards.f.FangFearlessLCie.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Fire Magic", 136, Rarity.UNCOMMON, mage.cards.f.FireMagic.class)); + cards.add(new SetCardInfo("Firion, Wild Rose Warrior", 137, Rarity.RARE, mage.cards.f.FirionWildRoseWarrior.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Firion, Wild Rose Warrior", 386, Rarity.RARE, mage.cards.f.FirionWildRoseWarrior.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Firion, Wild Rose Warrior", 459, Rarity.RARE, mage.cards.f.FirionWildRoseWarrior.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Firion, Wild Rose Warrior", 531, Rarity.RARE, mage.cards.f.FirionWildRoseWarrior.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Forest", 306, Rarity.LAND, mage.cards.basiclands.Forest.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Forest", 307, Rarity.LAND, mage.cards.basiclands.Forest.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Forest", 308, Rarity.LAND, mage.cards.basiclands.Forest.class, FULL_ART_BFZ_VARIOUS));