From 4e648a29a9bfd5793a718f08b9f825998eca5b39 Mon Sep 17 00:00:00 2001 From: PurpleCrowbar <26198472+PurpleCrowbar@users.noreply.github.com> Date: Sat, 17 Feb 2024 18:30:00 +0000 Subject: [PATCH] [MKC] Implement Watcher of Hours (#11808) --- .../src/mage/cards/w/WatcherOfHours.java | 51 +++++++++++++++++++ .../sets/MurdersAtKarlovManorCommander.java | 2 + ...FromSourceWhileExiledTriggeredAbility.java | 16 ++++-- 3 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/w/WatcherOfHours.java diff --git a/Mage.Sets/src/mage/cards/w/WatcherOfHours.java b/Mage.Sets/src/mage/cards/w/WatcherOfHours.java new file mode 100644 index 00000000000..5f83a9d1dbf --- /dev/null +++ b/Mage.Sets/src/mage/cards/w/WatcherOfHours.java @@ -0,0 +1,51 @@ +package mage.cards.w; + +import mage.MageInt; +import mage.abilities.common.CounterRemovedFromSourceWhileExiledTriggeredAbility; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.keyword.SurveilEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.SuspendAbility; +import mage.abilities.keyword.WardAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.counters.CounterType; + +import java.util.UUID; + +/** + * @author PurpleCrowbar + */ +public final class WatcherOfHours extends CardImpl { + + public WatcherOfHours(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{U}"); + this.subtype.add(SubType.SPHINX); + this.power = new MageInt(6); + this.toughness = new MageInt(6); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Ward {3} + this.addAbility(new WardAbility(new GenericManaCost(3), false)); + + // Whenever you remove a time counter from Watcher of Hours while it's exiled, surveil 1. + this.addAbility(new CounterRemovedFromSourceWhileExiledTriggeredAbility(CounterType.TIME, new SurveilEffect(1, false), false, true)); + + // Suspend 6—{1}{U} + this.addAbility(new SuspendAbility(6, new ManaCostsImpl<>("{1}{U}"), this)); + } + + private WatcherOfHours(final WatcherOfHours card) { + super(card); + } + + @Override + public WatcherOfHours copy() { + return new WatcherOfHours(this); + } +} diff --git a/Mage.Sets/src/mage/sets/MurdersAtKarlovManorCommander.java b/Mage.Sets/src/mage/sets/MurdersAtKarlovManorCommander.java index 84dd9f1ab65..a7258cf0d20 100644 --- a/Mage.Sets/src/mage/sets/MurdersAtKarlovManorCommander.java +++ b/Mage.Sets/src/mage/sets/MurdersAtKarlovManorCommander.java @@ -270,6 +270,8 @@ public final class MurdersAtKarlovManorCommander extends ExpansionSet { cards.add(new SetCardInfo("Vow of Lightning", 164, Rarity.UNCOMMON, mage.cards.v.VowOfLightning.class)); cards.add(new SetCardInfo("Wall of Omens", 90, Rarity.UNCOMMON, mage.cards.w.WallOfOmens.class)); cards.add(new SetCardInfo("War Room", 310, Rarity.RARE, mage.cards.w.WarRoom.class)); + cards.add(new SetCardInfo("Watcher of Hours", 25, Rarity.RARE, mage.cards.w.WatcherOfHours.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Watcher of Hours", 335, Rarity.RARE, mage.cards.w.WatcherOfHours.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Wavesifter", 220, Rarity.COMMON, mage.cards.w.Wavesifter.class)); cards.add(new SetCardInfo("Welcoming Vampire", 91, Rarity.RARE, mage.cards.w.WelcomingVampire.class)); cards.add(new SetCardInfo("Whirler Rogue", 124, Rarity.UNCOMMON, mage.cards.w.WhirlerRogue.class)); diff --git a/Mage/src/main/java/mage/abilities/common/CounterRemovedFromSourceWhileExiledTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/CounterRemovedFromSourceWhileExiledTriggeredAbility.java index 682af94b300..4d4812e77d7 100644 --- a/Mage/src/main/java/mage/abilities/common/CounterRemovedFromSourceWhileExiledTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/CounterRemovedFromSourceWhileExiledTriggeredAbility.java @@ -1,4 +1,3 @@ - package mage.abilities.common; import mage.abilities.TriggeredAbilityImpl; @@ -14,20 +13,29 @@ import mage.game.events.GameEvent; public class CounterRemovedFromSourceWhileExiledTriggeredAbility extends TriggeredAbilityImpl { private final CounterType counterType; + private final boolean onlyController; public CounterRemovedFromSourceWhileExiledTriggeredAbility(CounterType counterType, Effect effect) { this(counterType, effect, false); } public CounterRemovedFromSourceWhileExiledTriggeredAbility(CounterType counterType, Effect effect, boolean optional) { + this(counterType, effect, optional, false); + } + + public CounterRemovedFromSourceWhileExiledTriggeredAbility(CounterType counterType, Effect effect, boolean optional, boolean onlyController) { super(Zone.EXILED, effect, optional); this.counterType = counterType; - setTriggerPhrase("Whenever a " + counterType.getName() + " counter is removed from {this} while it's exiled, "); + this.onlyController = onlyController; + setTriggerPhrase("Whenever " + ( + onlyController ? ("you remove a " + counterType.getName() + " counter") : ("a " + counterType.getName() + " counter is removed") + ) + " from {this} while it's exiled, "); } private CounterRemovedFromSourceWhileExiledTriggeredAbility(final CounterRemovedFromSourceWhileExiledTriggeredAbility ability) { super(ability); this.counterType = ability.counterType; + this.onlyController = ability.onlyController; } @Override @@ -42,6 +50,8 @@ public class CounterRemovedFromSourceWhileExiledTriggeredAbility extends Trigger @Override public boolean checkTrigger(GameEvent event, Game game) { - return event.getData().equals(counterType.getName()) && event.getTargetId().equals(this.getSourceId()); + return event.getData().equals(counterType.getName()) + && event.getTargetId().equals(this.getSourceId()) + && (!onlyController || event.getPlayerId().equals(getControllerId())); } }