From 31064f2604f194215191b7ed8734cdece1096dbe Mon Sep 17 00:00:00 2001 From: ciaccona007 Date: Mon, 4 Nov 2024 10:23:48 -0500 Subject: [PATCH] [FDN] Implement Nine-Lives Familiar --- .../src/mage/cards/n/NineLivesFamiliar.java | 106 ++++++++++++++++++ Mage.Sets/src/mage/sets/Foundations.java | 1 + .../main/java/mage/counters/CounterType.java | 1 + 3 files changed, 108 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/n/NineLivesFamiliar.java diff --git a/Mage.Sets/src/mage/cards/n/NineLivesFamiliar.java b/Mage.Sets/src/mage/cards/n/NineLivesFamiliar.java new file mode 100644 index 00000000000..97210e23d9d --- /dev/null +++ b/Mage.Sets/src/mage/cards/n/NineLivesFamiliar.java @@ -0,0 +1,106 @@ +package mage.cards.n; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.DiesSourceTriggeredAbility; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.CastFromEverywhereSourceCondition; +import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.ReturnSourceFromGraveyardToBattlefieldWithCounterEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.counters.CounterType; +import mage.game.Game; +import mage.game.permanent.Permanent; + +import java.util.UUID; + +/** + * + * @author ciaconna007 + */ +public final class NineLivesFamiliar extends CardImpl { + + public NineLivesFamiliar(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}{B}"); + + this.subtype.add(SubType.CAT); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // This creature enters with eight revival counters on it if you cast it. + this.addAbility(new EntersBattlefieldAbility( + new AddCountersSourceEffect(CounterType.REVIVAL.createInstance(8)), + CastFromEverywhereSourceCondition.instance, null, + "with eight revival counters on it if you cast it" + )); + + // When this creature dies, if it had a revival counter on it, return it to the battlefield with one fewer revival counter on it at the beginning of the next end step. + this.addAbility(new ConditionalInterveningIfTriggeredAbility( + new DiesSourceTriggeredAbility(new CreateDelayedTriggeredAbilityEffect( + new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new NineLivesFamiliarEffect()) + )), + NineLivesFamiliarCondition.instance, + "When this creature dies, if it had a revival counter on it, " + + "return it to the battlefield with one fewer revival counter on it " + + "at the beginning of the next end step." + )); + } + + private NineLivesFamiliar(final NineLivesFamiliar card) { + super(card); + } + + @Override + public NineLivesFamiliar copy() { + return new NineLivesFamiliar(this); + } +} + +enum NineLivesFamiliarCondition implements Condition { + instance; + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = (Permanent) source.getEffects().get(0).getValue("permanentLeftBattlefield"); + return permanent != null && permanent.getCounters(game).getCount(CounterType.REVIVAL) > 0; + } +} + +class NineLivesFamiliarEffect extends OneShotEffect { + + NineLivesFamiliarEffect() { + super(Outcome.Benefit); + staticText = "return it to the battlefield"; + } + + private NineLivesFamiliarEffect(final NineLivesFamiliarEffect effect) { + super(effect); + } + + @Override + public NineLivesFamiliarEffect copy() { + return new NineLivesFamiliarEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = (Permanent) getValue("permanentLeftBattlefield"); + if (permanent == null) { + return false; + } + final int counters = permanent.getCounters(game).getCount(CounterType.REVIVAL) - 1; + ReturnSourceFromGraveyardToBattlefieldWithCounterEffect effect = new ReturnSourceFromGraveyardToBattlefieldWithCounterEffect(CounterType.REVIVAL.createInstance(counters), false); + effect.setText("return it to the battlefield with one fewer revival counter on it"); + effect.apply(game, source); + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/Foundations.java b/Mage.Sets/src/mage/sets/Foundations.java index e9ca02ab6ff..305ab83188d 100644 --- a/Mage.Sets/src/mage/sets/Foundations.java +++ b/Mage.Sets/src/mage/sets/Foundations.java @@ -345,6 +345,7 @@ public final class Foundations extends ExpansionSet { cards.add(new SetCardInfo("Negate", 710, Rarity.COMMON, mage.cards.n.Negate.class)); cards.add(new SetCardInfo("Nessian Hornbeetle", 229, Rarity.UNCOMMON, mage.cards.n.NessianHornbeetle.class)); cards.add(new SetCardInfo("New Horizons", 557, Rarity.COMMON, mage.cards.n.NewHorizons.class)); + cards.add(new SetCardInfo("Nine-Lives Familiar", 66, Rarity.RARE, mage.cards.n.NineLivesFamiliar.class)); cards.add(new SetCardInfo("Niv-Mizzet, Visionary", 123, Rarity.MYTHIC, mage.cards.n.NivMizzetVisionary.class)); cards.add(new SetCardInfo("Nullpriest of Oblivion", 611, Rarity.RARE, mage.cards.n.NullpriestOfOblivion.class)); cards.add(new SetCardInfo("Obliterating Bolt", 629, Rarity.UNCOMMON, mage.cards.o.ObliteratingBolt.class)); diff --git a/Mage/src/main/java/mage/counters/CounterType.java b/Mage/src/main/java/mage/counters/CounterType.java index 46fc28b961b..67402fc7489 100644 --- a/Mage/src/main/java/mage/counters/CounterType.java +++ b/Mage/src/main/java/mage/counters/CounterType.java @@ -187,6 +187,7 @@ public enum CounterType { REPAIR("repair"), REPRIEVE("reprieve"), REV("rev"), + REVIVAL("revival"), RIBBON("ribbon"), RITUAL("ritual"), ROPE("rope"),