From a6bb37a1b00686356fa20ca87f65b56b0bb2ce93 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Sun, 1 Jun 2025 11:33:09 -0400 Subject: [PATCH] [MIR] Implement Discordant Spirit --- .../src/mage/cards/d/DiscordantSpirit.java | 118 ++++++++++++++++++ Mage.Sets/src/mage/sets/Mirage.java | 2 +- 2 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 Mage.Sets/src/mage/cards/d/DiscordantSpirit.java diff --git a/Mage.Sets/src/mage/cards/d/DiscordantSpirit.java b/Mage.Sets/src/mage/cards/d/DiscordantSpirit.java new file mode 100644 index 00000000000..eef2f224c88 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DiscordantSpirit.java @@ -0,0 +1,118 @@ +package mage.cards.d; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.RemoveAllCountersSourceEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.hint.Hint; +import mage.abilities.hint.ValueHint; +import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.TargetController; +import mage.constants.WatcherScope; +import mage.counters.CounterType; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.watchers.Watcher; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class DiscordantSpirit extends CardImpl { + + public DiscordantSpirit(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}{R}"); + + this.subtype.add(SubType.SPIRIT); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // At the beginning of each end step, if it's an opponent's turn, put a +1/+1 counter on this creature for each 1 damage dealt to you this turn. + this.addAbility(new BeginningOfEndStepTriggeredAbility( + TargetController.OPPONENT, + new AddCountersSourceEffect(CounterType.P1P1.createInstance(), DiscordantSpiritValue.instance), + false + ).setTriggerPhrase("At the beginning of each end step, if it's an opponent's turn, ") + .addHint(DiscordantSpiritValue.getHint()), new DiscordantSpiritWatcher()); + + // At the beginning of your end step, remove all +1/+1 counters from this creature. + this.addAbility(new BeginningOfEndStepTriggeredAbility(new RemoveAllCountersSourceEffect(CounterType.P1P1))); + } + + private DiscordantSpirit(final DiscordantSpirit card) { + super(card); + } + + @Override + public DiscordantSpirit copy() { + return new DiscordantSpirit(this); + } +} + +enum DiscordantSpiritValue implements DynamicValue { + instance; + private static final Hint hint = new ValueHint("Damage dealt to you this turn", instance); + + public static Hint getHint() { + return hint; + } + + @Override + public int calculate(Game game, Ability sourceAbility, Effect effect) { + return DiscordantSpiritWatcher.getCount(game, sourceAbility); + } + + @Override + public DiscordantSpiritValue copy() { + return this; + } + + @Override + public String getMessage() { + return "1 damage dealt to you this turn"; + } + + @Override + public String toString() { + return "1"; + } +} + +class DiscordantSpiritWatcher extends Watcher { + + private final Map map = new HashMap<>(); + + DiscordantSpiritWatcher() { + super(WatcherScope.GAME); + } + + @Override + public void watch(GameEvent event, Game game) { + if (event.getType() == GameEvent.EventType.DAMAGED_PLAYER) { + map.compute(event.getTargetId(), (u, i) -> i == null ? event.getAmount() : Integer.sum(i, event.getAmount())); + } + } + + @Override + public void reset() { + super.reset(); + map.clear(); + } + + static int getCount(Game game, Ability source) { + return game + .getState() + .getWatcher(DiscordantSpiritWatcher.class) + .map + .getOrDefault(source.getControllerId(), 0); + } +} diff --git a/Mage.Sets/src/mage/sets/Mirage.java b/Mage.Sets/src/mage/sets/Mirage.java index 8809b4ec2b5..a35daacfe45 100644 --- a/Mage.Sets/src/mage/sets/Mirage.java +++ b/Mage.Sets/src/mage/sets/Mirage.java @@ -96,7 +96,7 @@ public final class Mirage extends ExpansionSet { cards.add(new SetCardInfo("Decomposition", 212, Rarity.UNCOMMON, mage.cards.d.Decomposition.class, RETRO_ART)); cards.add(new SetCardInfo("Delirium", 260, Rarity.UNCOMMON, mage.cards.d.Delirium.class, RETRO_ART)); cards.add(new SetCardInfo("Dirtwater Wraith", 117, Rarity.COMMON, mage.cards.d.DirtwaterWraith.class, RETRO_ART)); -// cards.add(new SetCardInfo("Discordant Spirit", 261, Rarity.RARE, mage.cards.d.DiscordantSpirit.class, RETRO_ART)); + cards.add(new SetCardInfo("Discordant Spirit", 261, Rarity.RARE, mage.cards.d.DiscordantSpirit.class, RETRO_ART)); cards.add(new SetCardInfo("Disempower", 9, Rarity.COMMON, mage.cards.d.Disempower.class, RETRO_ART)); cards.add(new SetCardInfo("Disenchant", 10, Rarity.COMMON, mage.cards.d.Disenchant.class, RETRO_ART)); cards.add(new SetCardInfo("Dissipate", 61, Rarity.UNCOMMON, mage.cards.d.Dissipate.class, RETRO_ART));