From e3a4e9a57de75c0e3b832fbf15714ca27e31ef83 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 12 Sep 2019 19:13:11 -0400 Subject: [PATCH] Implemented Deafening Silence --- .../src/mage/cards/d/DeafeningSilence.java | 120 ++++++++++++++++++ Mage.Sets/src/mage/sets/ThroneOfEldraine.java | 1 + 2 files changed, 121 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/d/DeafeningSilence.java diff --git a/Mage.Sets/src/mage/cards/d/DeafeningSilence.java b/Mage.Sets/src/mage/cards/d/DeafeningSilence.java new file mode 100644 index 0000000000..b6863e1c3e --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DeafeningSilence.java @@ -0,0 +1,120 @@ +package mage.cards.d; + +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.WatcherScope; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.stack.Spell; +import mage.watchers.Watcher; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class DeafeningSilence extends CardImpl { + + public DeafeningSilence(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{W}"); + + // Each player can't cast more than one noncreature spell each turn. + this.addAbility(new SimpleStaticAbility(new DeafeningSilenceEffect()), new DeafeningSilenceWatcher()); + } + + private DeafeningSilence(final DeafeningSilence card) { + super(card); + } + + @Override + public DeafeningSilence copy() { + return new DeafeningSilence(this); + } +} + +class DeafeningSilenceEffect extends ContinuousRuleModifyingEffectImpl { + + DeafeningSilenceEffect() { + super(Duration.WhileOnBattlefield, Outcome.Detriment); + staticText = "each player can't cast more than one noncreature spell each turn"; + } + + private DeafeningSilenceEffect(final DeafeningSilenceEffect effect) { + super(effect); + } + + @Override + public DeafeningSilenceEffect copy() { + return new DeafeningSilenceEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.CAST_SPELL; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + Spell spell = game.getSpell(event.getTargetId()); + if (spell == null || spell.isCreature()) { + return false; + } + DeafeningSilenceWatcher watcher = game.getState().getWatcher(DeafeningSilenceWatcher.class); + return watcher != null && watcher.castSpell(event.getPlayerId()); + } + + @Override + public String getText(Mode mode) { + return "Each player can't cast more than one noncreature spell each turn."; + } +} + +class DeafeningSilenceWatcher extends Watcher { + + private final Set castSpell = new HashSet<>(); + + DeafeningSilenceWatcher() { + super(WatcherScope.GAME); + } + + private DeafeningSilenceWatcher(final DeafeningSilenceWatcher watcher) { + super(watcher); + this.castSpell.addAll(watcher.castSpell); + } + + @Override + public void watch(GameEvent event, Game game) { + if (event.getType() != GameEvent.EventType.SPELL_CAST) { + return; + } + Spell spell = game.getSpell(event.getTargetId()); + if (spell == null || spell.isCreature()) { + return; + } + castSpell.add(event.getPlayerId()); + } + + @Override + public void reset() { + super.reset(); + castSpell.clear(); + } + + boolean castSpell(UUID playerId) { + return castSpell.contains(playerId); + } +} diff --git a/Mage.Sets/src/mage/sets/ThroneOfEldraine.java b/Mage.Sets/src/mage/sets/ThroneOfEldraine.java index 42a5d7802d..107050170d 100644 --- a/Mage.Sets/src/mage/sets/ThroneOfEldraine.java +++ b/Mage.Sets/src/mage/sets/ThroneOfEldraine.java @@ -54,6 +54,7 @@ public final class ThroneOfEldraine extends ExpansionSet { cards.add(new SetCardInfo("Corridor Monitor", 41, Rarity.COMMON, mage.cards.c.CorridorMonitor.class)); cards.add(new SetCardInfo("Crystal Slipper", 119, Rarity.COMMON, mage.cards.c.CrystalSlipper.class)); cards.add(new SetCardInfo("Curious Pair", 150, Rarity.COMMON, mage.cards.c.CuriousPair.class)); + cards.add(new SetCardInfo("Deafening Silence", 10, Rarity.UNCOMMON, mage.cards.d.DeafeningSilence.class)); cards.add(new SetCardInfo("Doom Foretold", 187, Rarity.RARE, mage.cards.d.DoomForetold.class)); cards.add(new SetCardInfo("Edgewall Innkeeper", 151, Rarity.UNCOMMON, mage.cards.e.EdgewallInnkeeper.class)); cards.add(new SetCardInfo("Elite Headhunter", 209, Rarity.UNCOMMON, mage.cards.e.EliteHeadhunter.class));