From d93bcc12cd8515097aa49c8412e3bf14a69d8bec Mon Sep 17 00:00:00 2001 From: Daniel Bomar Date: Thu, 1 Jul 2021 10:24:32 -0500 Subject: [PATCH] [AFR] Implemented Feign Death --- Mage.Sets/src/mage/cards/f/FeignDeath.java | 41 +++++++ .../sets/AdventuresInTheForgottenRealms.java | 1 + ...dToBattlefieldWithCounterTargetEffect.java | 16 ++- ...ourceFromGraveyardToBattlefieldEffect.java | 6 +- ...aveyardToBattlefieldWithCounterEffect.java | 108 ++++++++++++++++++ 5 files changed, 163 insertions(+), 9 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/f/FeignDeath.java create mode 100644 Mage/src/main/java/mage/abilities/effects/common/ReturnSourceFromGraveyardToBattlefieldWithCounterEffect.java diff --git a/Mage.Sets/src/mage/cards/f/FeignDeath.java b/Mage.Sets/src/mage/cards/f/FeignDeath.java new file mode 100644 index 00000000000..6bb40ade691 --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FeignDeath.java @@ -0,0 +1,41 @@ +package mage.cards.f; + +import java.util.UUID; + +import mage.abilities.common.DiesSourceTriggeredAbility; +import mage.abilities.effects.common.ReturnSourceFromGraveyardToBattlefieldWithCounterEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.counters.CounterType; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author weirddan455 + */ +public final class FeignDeath extends CardImpl { + + public FeignDeath(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{B}"); + + // Until end of turn, target creature gains "When this creature dies, return it to the battlefield tapped under its owner's control with a +1/+1 counter on it." + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + this.getSpellAbility().addEffect(new GainAbilityTargetEffect( + new DiesSourceTriggeredAbility(new ReturnSourceFromGraveyardToBattlefieldWithCounterEffect(CounterType.P1P1.createInstance(), true)), + Duration.EndOfTurn, + "Until end of turn, target creature gains \"When this creature dies, return it to the battlefield tapped under its owner's control with a +1/+1 counter on it.\"" + )); + } + + private FeignDeath(final FeignDeath card) { + super(card); + } + + @Override + public FeignDeath copy() { + return new FeignDeath(this); + } +} diff --git a/Mage.Sets/src/mage/sets/AdventuresInTheForgottenRealms.java b/Mage.Sets/src/mage/sets/AdventuresInTheForgottenRealms.java index d332d8d1aa1..b4d9bb3526d 100644 --- a/Mage.Sets/src/mage/sets/AdventuresInTheForgottenRealms.java +++ b/Mage.Sets/src/mage/sets/AdventuresInTheForgottenRealms.java @@ -57,6 +57,7 @@ public final class AdventuresInTheForgottenRealms extends ExpansionSet { cards.add(new SetCardInfo("Elturgard Ranger", 182, Rarity.COMMON, mage.cards.e.ElturgardRanger.class)); cards.add(new SetCardInfo("Evolving Wilds", 256, Rarity.COMMON, mage.cards.e.EvolvingWilds.class)); cards.add(new SetCardInfo("Fates' Reversal", 102, Rarity.COMMON, mage.cards.f.FatesReversal.class)); + cards.add(new SetCardInfo("Feign Death", 103, Rarity.COMMON, mage.cards.f.FeignDeath.class)); cards.add(new SetCardInfo("Fifty Feet of Rope", 244, Rarity.UNCOMMON, mage.cards.f.FiftyFeetOfRope.class)); cards.add(new SetCardInfo("Find the Path", 183, Rarity.COMMON, mage.cards.f.FindThePath.class)); cards.add(new SetCardInfo("Flumph", 15, Rarity.RARE, mage.cards.f.Flumph.class)); diff --git a/Mage/src/main/java/mage/abilities/effects/common/ReturnFromGraveyardToBattlefieldWithCounterTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ReturnFromGraveyardToBattlefieldWithCounterTargetEffect.java index 05afdc49e84..c0ca0c890e9 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ReturnFromGraveyardToBattlefieldWithCounterTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ReturnFromGraveyardToBattlefieldWithCounterTargetEffect.java @@ -11,6 +11,10 @@ import mage.game.events.EntersTheBattlefieldEvent; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; +/** + * + * @author weirddan455 + */ public class ReturnFromGraveyardToBattlefieldWithCounterTargetEffect extends ReturnFromGraveyardToBattlefieldTargetEffect { private final Counter counter; @@ -39,7 +43,7 @@ public class ReturnFromGraveyardToBattlefieldWithCounterTargetEffect extends Ret @Override public boolean apply(Game game, Ability source) { - AddCounterReplacementEffect counterEffect = new AddCounterReplacementEffect(counter); + AddCounterTargetReplacementEffect counterEffect = new AddCounterTargetReplacementEffect(counter); game.addEffect(counterEffect, source); return super.apply(game, source); } @@ -71,23 +75,23 @@ public class ReturnFromGraveyardToBattlefieldWithCounterTargetEffect extends Ret } } -class AddCounterReplacementEffect extends ReplacementEffectImpl { +class AddCounterTargetReplacementEffect extends ReplacementEffectImpl { private final Counter counter; - public AddCounterReplacementEffect(Counter counter) { + public AddCounterTargetReplacementEffect(Counter counter) { super(Duration.EndOfStep, Outcome.BoostCreature); this.counter = counter; } - private AddCounterReplacementEffect(final AddCounterReplacementEffect effect) { + private AddCounterTargetReplacementEffect(final AddCounterTargetReplacementEffect effect) { super(effect); this.counter = effect.counter; } @Override - public AddCounterReplacementEffect copy() { - return new AddCounterReplacementEffect(this); + public AddCounterTargetReplacementEffect copy() { + return new AddCounterTargetReplacementEffect(this); } @Override diff --git a/Mage/src/main/java/mage/abilities/effects/common/ReturnSourceFromGraveyardToBattlefieldEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ReturnSourceFromGraveyardToBattlefieldEffect.java index 17c48293992..cf1c379e523 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ReturnSourceFromGraveyardToBattlefieldEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ReturnSourceFromGraveyardToBattlefieldEffect.java @@ -21,9 +21,9 @@ import mage.target.targetpointer.FixedTarget; */ public class ReturnSourceFromGraveyardToBattlefieldEffect extends OneShotEffect { - private boolean tapped; - private boolean ownerControl; - private boolean haste; + protected final boolean tapped; + protected final boolean ownerControl; + private final boolean haste; public ReturnSourceFromGraveyardToBattlefieldEffect() { this(false); diff --git a/Mage/src/main/java/mage/abilities/effects/common/ReturnSourceFromGraveyardToBattlefieldWithCounterEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ReturnSourceFromGraveyardToBattlefieldWithCounterEffect.java new file mode 100644 index 00000000000..290965dc913 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/common/ReturnSourceFromGraveyardToBattlefieldWithCounterEffect.java @@ -0,0 +1,108 @@ +package mage.abilities.effects.common; + +import mage.abilities.Ability; +import mage.abilities.effects.ReplacementEffectImpl; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.counters.Counter; +import mage.game.Game; +import mage.game.events.EntersTheBattlefieldEvent; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; + +/** + * + * @author weirddan455 + */ +public class ReturnSourceFromGraveyardToBattlefieldWithCounterEffect extends ReturnSourceFromGraveyardToBattlefieldEffect { + + private final Counter counter; + + public ReturnSourceFromGraveyardToBattlefieldWithCounterEffect(Counter counter, boolean tapped) { + super(tapped); + this.counter = counter; + setText(); + } + + private ReturnSourceFromGraveyardToBattlefieldWithCounterEffect(final ReturnSourceFromGraveyardToBattlefieldWithCounterEffect effect) { + super(effect); + this.counter = effect.counter; + } + + @Override + public ReturnSourceFromGraveyardToBattlefieldWithCounterEffect copy() { + return new ReturnSourceFromGraveyardToBattlefieldWithCounterEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + AddCounterSourceReplacementEffect counterEffect = new AddCounterSourceReplacementEffect(counter); + game.addEffect(counterEffect, source); + return super.apply(game, source); + } + + private void setText() { + StringBuilder sb = new StringBuilder("return it to the battlefield"); + if (tapped) { + sb.append(" tapped"); + } + if (ownerControl) { + sb.append(" under its owner's control"); + } + sb.append(" with "); + if (counter.getCount() == 1) { + sb.append('a'); + } else { + sb.append(counter.getCount()); + } + sb.append(' '); + sb.append(counter.getName()); + sb.append(" counter"); + if (counter.getCount() != 1) { + sb.append('s'); + } + sb.append(" on it"); + staticText = sb.toString(); + } +} + +class AddCounterSourceReplacementEffect extends ReplacementEffectImpl { + + private final Counter counter; + + public AddCounterSourceReplacementEffect(Counter counter) { + super(Duration.EndOfStep, Outcome.BoostCreature); + this.counter = counter; + } + + private AddCounterSourceReplacementEffect(final AddCounterSourceReplacementEffect effect) { + super(effect); + this.counter = effect.counter; + } + + @Override + public AddCounterSourceReplacementEffect copy() { + return new AddCounterSourceReplacementEffect(this); + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + return event.getTargetId().equals(source.getSourceId()); + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + Permanent creature = ((EntersTheBattlefieldEvent) event).getTarget(); + if (creature == null) { + return false; + } + creature.addCounters(counter.copy(), source.getControllerId(), source, game, event.getAppliedEffects()); + discard(); + return false; + } +}