From 8c9d285d8043dca91ac2a894d168bdec9c9cc1ed Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 12 Jan 2021 17:44:17 -0500 Subject: [PATCH] [KHM] Implemented Rise of the Dread Marn --- .../src/mage/cards/r/RiseOfTheDreadMarn.java | 100 ++++++++++++++++++ Mage.Sets/src/mage/sets/Kaldheim.java | 1 + .../permanent/token/ZombieBerserkerToken.java | 32 ++++++ 3 files changed, 133 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/r/RiseOfTheDreadMarn.java create mode 100644 Mage/src/main/java/mage/game/permanent/token/ZombieBerserkerToken.java diff --git a/Mage.Sets/src/mage/cards/r/RiseOfTheDreadMarn.java b/Mage.Sets/src/mage/cards/r/RiseOfTheDreadMarn.java new file mode 100644 index 00000000000..d43c026d0ba --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RiseOfTheDreadMarn.java @@ -0,0 +1,100 @@ +package mage.cards.r; + +import mage.abilities.Ability; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.keyword.ForetellAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.WatcherScope; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.ZoneChangeEvent; +import mage.game.permanent.PermanentToken; +import mage.game.permanent.token.ZombieBerserkerToken; +import mage.watchers.Watcher; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class RiseOfTheDreadMarn extends CardImpl { + + public RiseOfTheDreadMarn(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{B}"); + + // Create X 2/2 black Zombie Berserker creature tokens, where X is the number of nontoken creatures that died this turn. + this.getSpellAbility().addEffect(new CreateTokenEffect( + new ZombieBerserkerToken(), RiseOfTheDreadMarnValue.instance + )); + this.getSpellAbility().addWatcher(new RiseOfTheDreadMarnWatcher()); + + // Foretell {B} + this.addAbility(new ForetellAbility(this, "{B}")); + } + + private RiseOfTheDreadMarn(final RiseOfTheDreadMarn card) { + super(card); + } + + @Override + public RiseOfTheDreadMarn copy() { + return new RiseOfTheDreadMarn(this); + } +} + +enum RiseOfTheDreadMarnValue implements DynamicValue { + instance; + + @Override + public int calculate(Game game, Ability sourceAbility, Effect effect) { + RiseOfTheDreadMarnWatcher watcher = game.getState().getWatcher(RiseOfTheDreadMarnWatcher.class); + return watcher != null ? watcher.getCreaturesDied() : 0; + } + + @Override + public RiseOfTheDreadMarnValue copy() { + return instance; + } + + @Override + public String toString() { + return "X"; + } + + @Override + public String getMessage() { + return "the number of nontoken creatures that died this turn"; + } +} + +class RiseOfTheDreadMarnWatcher extends Watcher { + + private int creaturesDied = 0; + + RiseOfTheDreadMarnWatcher() { + super(WatcherScope.GAME); + } + + @Override + public void watch(GameEvent event, Game game) { + if (event.getType() == GameEvent.EventType.ZONE_CHANGE + && ((ZoneChangeEvent) event).isDiesEvent() + && !(((ZoneChangeEvent) event).getTarget() instanceof PermanentToken)) { + creaturesDied += 1; + } + } + + @Override + public void reset() { + creaturesDied = 0; + super.reset(); + } + + int getCreaturesDied() { + return creaturesDied; + } +} diff --git a/Mage.Sets/src/mage/sets/Kaldheim.java b/Mage.Sets/src/mage/sets/Kaldheim.java index 15944f57b5d..35536bf8d3a 100644 --- a/Mage.Sets/src/mage/sets/Kaldheim.java +++ b/Mage.Sets/src/mage/sets/Kaldheim.java @@ -124,6 +124,7 @@ public final class Kaldheim extends ExpansionSet { cards.add(new SetCardInfo("Renegade Reaper", 386, Rarity.UNCOMMON, mage.cards.r.RenegadeReaper.class)); cards.add(new SetCardInfo("Replicating Ring", 244, Rarity.UNCOMMON, mage.cards.r.ReplicatingRing.class)); cards.add(new SetCardInfo("Rimewood Falls", 266, Rarity.COMMON, mage.cards.r.RimewoodFalls.class)); + cards.add(new SetCardInfo("Rise of the Dread Marn", 107, Rarity.RARE, mage.cards.r.RiseOfTheDreadMarn.class)); cards.add(new SetCardInfo("Roots of Wisdom", 190, Rarity.COMMON, mage.cards.r.RootsOfWisdom.class)); cards.add(new SetCardInfo("Run Ashore", 74, Rarity.COMMON, mage.cards.r.RunAshore.class)); cards.add(new SetCardInfo("Sarulf's Packmate", 192, Rarity.COMMON, mage.cards.s.SarulfsPackmate.class)); diff --git a/Mage/src/main/java/mage/game/permanent/token/ZombieBerserkerToken.java b/Mage/src/main/java/mage/game/permanent/token/ZombieBerserkerToken.java new file mode 100644 index 00000000000..22d729de593 --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/ZombieBerserkerToken.java @@ -0,0 +1,32 @@ + + +package mage.game.permanent.token; + +import mage.MageInt; +import mage.constants.CardType; +import mage.constants.SubType; + +/** + * + * @author TheElk801 + */ +public final class ZombieBerserkerToken extends TokenImpl { + + public ZombieBerserkerToken() { + super("Zombie Berserker", "2/2 black Zombie Berserker creature token"); + cardType.add(CardType.CREATURE); + color.setBlack(true); + subtype.add(SubType.ZOMBIE); + subtype.add(SubType.BERSERKER); + power = new MageInt(2); + toughness = new MageInt(2); + } + + private ZombieBerserkerToken(final ZombieBerserkerToken token) { + super(token); + } + + public ZombieBerserkerToken copy() { + return new ZombieBerserkerToken(this); + } +}