From 1f21d6e7166791e886423bf76194e0917a5caad6 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Tue, 25 Nov 2025 15:02:40 -0500 Subject: [PATCH] [TLA] Implement Foggy Swamp Visions --- .../src/mage/cards/f/FoggySwampVisions.java | 94 +++++++++++++++++++ .../src/mage/sets/AvatarTheLastAirbender.java | 2 + 2 files changed, 96 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/f/FoggySwampVisions.java diff --git a/Mage.Sets/src/mage/cards/f/FoggySwampVisions.java b/Mage.Sets/src/mage/cards/f/FoggySwampVisions.java new file mode 100644 index 00000000000..f1ad9b03694 --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FoggySwampVisions.java @@ -0,0 +1,94 @@ +package mage.cards.f; + +import mage.abilities.Ability; +import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; +import mage.abilities.costs.common.WaterbendCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateTokenCopyTargetEffect; +import mage.abilities.effects.common.SacrificeTargetEffect; +import mage.cards.*; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetCardInGraveyard; +import mage.target.targetadjustment.XManaValueTargetAdjuster; +import mage.target.targetpointer.FixedTarget; +import mage.target.targetpointer.FixedTargets; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class FoggySwampVisions extends CardImpl { + + public FoggySwampVisions(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{B}{B}"); + + // As an additional cost to cast this spell, waterbend {X}. + this.getSpellAbility().addCost(new WaterbendCost("{X}")); + + // Exile X target creature cards from graveyards. For each creature card exiled this way, create a token that's a copy of it. At the beginning of your next end step, sacrifice those tokens. + this.getSpellAbility().addEffect(new FoggySwampVisionsEffect()); + this.getSpellAbility().addTarget(new TargetCardInGraveyard(StaticFilters.FILTER_CARD_CREATURES)); + this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster()); + } + + private FoggySwampVisions(final FoggySwampVisions card) { + super(card); + } + + @Override + public FoggySwampVisions copy() { + return new FoggySwampVisions(this); + } +} + +class FoggySwampVisionsEffect extends OneShotEffect { + + FoggySwampVisionsEffect() { + super(Outcome.Benefit); + staticText = "exile X target creature cards from graveyards. For each creature card exiled this way, " + + "create a token that's a copy of it. At the beginning of your next end step, sacrifice those tokens."; + } + + private FoggySwampVisionsEffect(final FoggySwampVisionsEffect effect) { + super(effect); + } + + @Override + public FoggySwampVisionsEffect copy() { + return new FoggySwampVisionsEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + Cards cards = new CardsImpl(getTargetPointer().getTargets(game, source)); + if (player == null || cards.isEmpty()) { + return false; + } + player.moveCards(cards, Zone.EXILED, source, game); + cards.retainZone(Zone.EXILED, game); + Set permanents = new HashSet<>(); + for (Card card : cards.getCards(game)) { + CreateTokenCopyTargetEffect effect = new CreateTokenCopyTargetEffect(); + effect.setTargetPointer(new FixedTarget(card, game)); + effect.apply(game, source); + permanents.addAll(effect.getAddedPermanents()); + } + game.addDelayedTriggeredAbility(new AtTheBeginOfNextEndStepDelayedTriggeredAbility( + new SacrificeTargetEffect("sacrifice those tokens") + .setTargetPointer(new FixedTargets(permanents, game)), + TargetController.YOU + ), source); + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/AvatarTheLastAirbender.java b/Mage.Sets/src/mage/sets/AvatarTheLastAirbender.java index dc90febe893..8515ac92cc3 100644 --- a/Mage.Sets/src/mage/sets/AvatarTheLastAirbender.java +++ b/Mage.Sets/src/mage/sets/AvatarTheLastAirbender.java @@ -190,6 +190,8 @@ public final class AvatarTheLastAirbender extends ExpansionSet { cards.add(new SetCardInfo("Foggy Swamp Hunters", 101, Rarity.COMMON, mage.cards.f.FoggySwampHunters.class)); cards.add(new SetCardInfo("Foggy Swamp Spirit Keeper", 222, Rarity.UNCOMMON, mage.cards.f.FoggySwampSpiritKeeper.class)); cards.add(new SetCardInfo("Foggy Swamp Vinebender", 180, Rarity.COMMON, mage.cards.f.FoggySwampVinebender.class)); + cards.add(new SetCardInfo("Foggy Swamp Visions", 102, Rarity.RARE, mage.cards.f.FoggySwampVisions.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Foggy Swamp Visions", 339, Rarity.RARE, mage.cards.f.FoggySwampVisions.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Forecasting Fortune Teller", 51, Rarity.COMMON, mage.cards.f.ForecastingFortuneTeller.class)); cards.add(new SetCardInfo("Forest", 286, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Forest", 291, Rarity.LAND, mage.cards.basiclands.Forest.class, FULL_ART_BFZ_VARIOUS));