From 7f8c7a2c89dbbaf224fae4a0fbfe195c6c026b0e Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 13 Sep 2024 11:13:36 -0400 Subject: [PATCH] [DSC] Implement Persistent Constrictor --- .../mage/cards/p/PersistentConstrictor.java | 86 +++++++++++++++++++ .../sets/DuskmournHouseOfHorrorCommander.java | 1 + .../java/mage/constants/TargetController.java | 4 + 3 files changed, 91 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/p/PersistentConstrictor.java diff --git a/Mage.Sets/src/mage/cards/p/PersistentConstrictor.java b/Mage.Sets/src/mage/cards/p/PersistentConstrictor.java new file mode 100644 index 00000000000..3644e3288e7 --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/PersistentConstrictor.java @@ -0,0 +1,86 @@ +package mage.cards.p; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.abilities.keyword.PersistAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.TargetController; +import mage.counters.CounterType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class PersistentConstrictor extends CardImpl { + + private static final FilterPermanent filter = new FilterCreaturePermanent("creature they control"); + + static { + filter.add(TargetController.ACTIVE.getControllerPredicate()); + } + + public PersistentConstrictor(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{B}"); + + this.subtype.add(SubType.ZOMBIE); + this.subtype.add(SubType.SNAKE); + this.power = new MageInt(5); + this.toughness = new MageInt(3); + + // At the beginning of each opponent's upkeep, they lose 1 life and you put a -1/-1 counter on up to one target creature they control. + Ability ability = new BeginningOfUpkeepTriggeredAbility( + new PersistentConstrictorEffect(), TargetController.OPPONENT, false + ); + ability.addEffect(new AddCountersTargetEffect(CounterType.M1M1.createInstance()).concatBy("and you")); + ability.addTarget(new TargetPermanent(0, 1, filter)); + this.addAbility(ability); + + // Persist + this.addAbility(new PersistAbility()); + } + + private PersistentConstrictor(final PersistentConstrictor card) { + super(card); + } + + @Override + public PersistentConstrictor copy() { + return new PersistentConstrictor(this); + } +} + +class PersistentConstrictorEffect extends OneShotEffect { + + PersistentConstrictorEffect() { + super(Outcome.Benefit); + staticText = "they lose 1 life"; + } + + private PersistentConstrictorEffect(final PersistentConstrictorEffect effect) { + super(effect); + } + + @Override + public PersistentConstrictorEffect copy() { + return new PersistentConstrictorEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(game.getActivePlayerId()); + return player != null && player.loseLife(1, game, source, false) > 0; + } +} diff --git a/Mage.Sets/src/mage/sets/DuskmournHouseOfHorrorCommander.java b/Mage.Sets/src/mage/sets/DuskmournHouseOfHorrorCommander.java index c569f356e27..78956ea15ad 100644 --- a/Mage.Sets/src/mage/sets/DuskmournHouseOfHorrorCommander.java +++ b/Mage.Sets/src/mage/sets/DuskmournHouseOfHorrorCommander.java @@ -116,6 +116,7 @@ public final class DuskmournHouseOfHorrorCommander extends ExpansionSet { cards.add(new SetCardInfo("Overflowing Basin", 293, Rarity.RARE, mage.cards.o.OverflowingBasin.class)); cards.add(new SetCardInfo("Oversimplify", 228, Rarity.RARE, mage.cards.o.Oversimplify.class)); cards.add(new SetCardInfo("Overwhelming Stampede", 192, Rarity.RARE, mage.cards.o.OverwhelmingStampede.class)); + cards.add(new SetCardInfo("Persistent Constrictor", 22, Rarity.RARE, mage.cards.p.PersistentConstrictor.class)); cards.add(new SetCardInfo("Ponder", 73, Rarity.COMMON, mage.cards.p.Ponder.class)); cards.add(new SetCardInfo("Portent", 74, Rarity.COMMON, mage.cards.p.Portent.class)); cards.add(new SetCardInfo("Primordial Mist", 123, Rarity.RARE, mage.cards.p.PrimordialMist.class)); diff --git a/Mage/src/main/java/mage/constants/TargetController.java b/Mage/src/main/java/mage/constants/TargetController.java index ffd672f28f8..2737b52adba 100644 --- a/Mage/src/main/java/mage/constants/TargetController.java +++ b/Mage/src/main/java/mage/constants/TargetController.java @@ -83,6 +83,8 @@ public enum TargetController { return card.isOwnedBy(input.getSource().getControllerId()); case SOURCE_TARGETS: return card.isOwnedBy(input.getSource().getFirstTarget()); + case ACTIVE: + return card.isOwnedBy(game.getActivePlayerId()); case MONARCH: return card.isOwnedBy(game.getMonarchId()); case ANY: @@ -126,6 +128,8 @@ public enum TargetController { return player.getId().equals(input.getSource().getControllerId()); case SOURCE_TARGETS: return player.getId().equals(input.getSource().getFirstTarget()); + case ACTIVE: + return game.isActivePlayer(player.getId()); case MONARCH: return player.getId().equals(game.getMonarchId()); default: