From 5cc38a1225ed272716df3e39cac26eb0b0c7e04f Mon Sep 17 00:00:00 2001 From: Susucre <34709007+Susucre@users.noreply.github.com> Date: Sat, 25 May 2024 19:07:44 +0200 Subject: [PATCH] implement [MH3] Shifting Woodland --- .../src/mage/cards/s/ShiftingWoodland.java | 104 ++++++++++++++++++ Mage.Sets/src/mage/sets/ModernHorizons3.java | 1 + 2 files changed, 105 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/ShiftingWoodland.java diff --git a/Mage.Sets/src/mage/cards/s/ShiftingWoodland.java b/Mage.Sets/src/mage/cards/s/ShiftingWoodland.java new file mode 100644 index 00000000000..1f7bb8c4c16 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/ShiftingWoodland.java @@ -0,0 +1,104 @@ +package mage.cards.s; + +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.DeliriumCondition; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.decorator.ConditionalActivatedAbility; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.hint.common.CardTypesInGraveyardHint; +import mage.abilities.mana.GreenManaAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.filter.FilterCard; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.common.FilterPermanentCard; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.permanent.PermanentCard; +import mage.target.common.TargetCardInYourGraveyard; +import mage.util.functions.EmptyCopyApplier; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class ShiftingWoodland extends CardImpl { + + private static final FilterPermanent filter = new FilterControlledPermanent(SubType.FOREST); + private static final Condition condition + = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.EQUAL_TO, 0); + + private static final FilterCard filterCard = new FilterPermanentCard("permanent card in your graveyard"); + + public ShiftingWoodland(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); + + // Shifting Woodland enters the battlefield tapped unless you control a Forest. + this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect( + new TapSourceEffect(), condition + ), "tapped unless you control a Forest")); + + // {T}: Add {G}. + this.addAbility(new GreenManaAbility()); + + // Delirium -- {2}{G}{G}: Shifting Woodland becomes a copy of target permanent card in your graveyard until end of turn. Activate only if there are four or more card types among cards in your graveyard. + Ability ability = new ConditionalActivatedAbility( + new ShiftingWoodlandCopyEffect(), + new ManaCostsImpl<>("{2}{G}{G}"), + DeliriumCondition.instance + ); + ability.addTarget(new TargetCardInYourGraveyard(1, filterCard)); + ability.setAbilityWord(AbilityWord.DELIRIUM); + this.addAbility(ability.addHint(CardTypesInGraveyardHint.YOU)); + } + + private ShiftingWoodland(final ShiftingWoodland card) { + super(card); + } + + @Override + public ShiftingWoodland copy() { + return new ShiftingWoodland(this); + } +} + +class ShiftingWoodlandCopyEffect extends OneShotEffect { + + ShiftingWoodlandCopyEffect() { + super(Outcome.Copy); + this.staticText = "{this} becomes a copy of target permanent card in your graveyard until end of turn"; + } + + private ShiftingWoodlandCopyEffect(final ShiftingWoodlandCopyEffect effect) { + super(effect); + } + + @Override + public ShiftingWoodlandCopyEffect copy() { + return new ShiftingWoodlandCopyEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent sourcePermanent = game.getPermanent(source.getSourceId()); + if (sourcePermanent == null) { + return false; + } + Card copyFromCard = game.getCard(getTargetPointer().getFirst(game, source)); + if (copyFromCard == null) { + return false; + } + Permanent blueprint = new PermanentCard(copyFromCard, source.getControllerId(), game); + game.copyPermanent(Duration.EndOfTurn, blueprint, sourcePermanent.getId(), source, new EmptyCopyApplier()); + return true; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/ModernHorizons3.java b/Mage.Sets/src/mage/sets/ModernHorizons3.java index 540a3df150b..916ddfeb19d 100644 --- a/Mage.Sets/src/mage/sets/ModernHorizons3.java +++ b/Mage.Sets/src/mage/sets/ModernHorizons3.java @@ -124,6 +124,7 @@ public final class ModernHorizons3 extends ExpansionSet { cards.add(new SetCardInfo("Scurrilous Sentry", 108, Rarity.COMMON, mage.cards.s.ScurrilousSentry.class)); cards.add(new SetCardInfo("Scurry of Gremlins", 203, Rarity.UNCOMMON, mage.cards.s.ScurryOfGremlins.class)); cards.add(new SetCardInfo("Serum Visionary", 69, Rarity.COMMON, mage.cards.s.SerumVisionary.class)); + cards.add(new SetCardInfo("Shifting Woodland", 228, Rarity.RARE, mage.cards.s.ShiftingWoodland.class)); cards.add(new SetCardInfo("Sink into Stupor", 241, Rarity.UNCOMMON, mage.cards.s.SinkIntoStupor.class)); cards.add(new SetCardInfo("Six", 169, Rarity.RARE, mage.cards.s.Six.class)); cards.add(new SetCardInfo("Skoa, Embermage", 138, Rarity.COMMON, mage.cards.s.SkoaEmbermage.class));