From 7ba47514f0595599f25935ab19cd3245e069880c Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Sat, 5 Feb 2022 09:45:02 -0500 Subject: [PATCH] [NEO] fixed implementation of Dokuchi Silencer --- .../src/mage/cards/d/DokuchiSilencer.java | 80 ++++++++++++++----- 1 file changed, 61 insertions(+), 19 deletions(-) diff --git a/Mage.Sets/src/mage/cards/d/DokuchiSilencer.java b/Mage.Sets/src/mage/cards/d/DokuchiSilencer.java index f4e6a63b53d..88a256091b5 100644 --- a/Mage.Sets/src/mage/cards/d/DokuchiSilencer.java +++ b/Mage.Sets/src/mage/cards/d/DokuchiSilencer.java @@ -1,7 +1,7 @@ package mage.cards.d; import mage.MageInt; -import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.delayed.ReflexiveTriggeredAbility; import mage.abilities.costs.common.DiscardTargetCost; import mage.abilities.effects.common.DestroyTargetEffect; @@ -11,11 +11,15 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.constants.TargetController; +import mage.constants.Zone; import mage.filter.FilterPermanent; import mage.filter.StaticFilters; import mage.filter.common.FilterCreatureOrPlaneswalkerPermanent; -import mage.target.TargetPermanent; +import mage.filter.predicate.permanent.ControllerIdPredicate; +import mage.game.Game; +import mage.game.events.DamagedEvent; +import mage.game.events.GameEvent; +import mage.players.Player; import mage.target.common.TargetCardInHand; import java.util.UUID; @@ -25,13 +29,6 @@ import java.util.UUID; */ public final class DokuchiSilencer extends CardImpl { - private static final FilterPermanent filter - = new FilterCreatureOrPlaneswalkerPermanent("creature or planeswalker an opponent controls"); - - static { - filter.add(TargetController.OPPONENT.getControllerPredicate()); - } - public DokuchiSilencer(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}"); @@ -43,15 +40,8 @@ public final class DokuchiSilencer extends CardImpl { // Ninjutsu {1}{B} this.addAbility(new NinjutsuAbility("{1}{B}")); - // Whenever Dokuchi Silencer deals combat damage to a player, you may discard a creature card. When you do, destroy target creature or planeswalker an opponent controls. - ReflexiveTriggeredAbility ability = new ReflexiveTriggeredAbility(new DestroyTargetEffect(), false); - ability.addTarget(new TargetPermanent(filter)); - this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility( - new DoWhenCostPaid( - ability, new DiscardTargetCost(new TargetCardInHand(StaticFilters.FILTER_CARD_CREATURE)), - "Discard a creature card?" - ), false - )); + // Whenever Dokuchi Silencer deals combat damage to a player, you may discard a creature card. When you do, destroy target creature or planeswalker that player controls. + this.addAbility(new BlindZealotTriggeredAbility()); } private DokuchiSilencer(final DokuchiSilencer card) { @@ -63,3 +53,55 @@ public final class DokuchiSilencer extends CardImpl { return new DokuchiSilencer(this); } } + +class BlindZealotTriggeredAbility extends TriggeredAbilityImpl { + + BlindZealotTriggeredAbility() { + super(Zone.BATTLEFIELD, null, false); + } + + private BlindZealotTriggeredAbility(final BlindZealotTriggeredAbility ability) { + super(ability); + } + + @Override + public BlindZealotTriggeredAbility copy() { + return new BlindZealotTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.DAMAGED_PLAYER; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + Player opponent = game.getPlayer(event.getPlayerId()); + if (opponent == null + || !event.getSourceId().equals(getSourceId()) + || !((DamagedEvent) event).isCombatDamage()) { + return false; + } + FilterPermanent filter = new FilterCreatureOrPlaneswalkerPermanent( + "creature or planeswalker" + opponent.getLogName() + " controls" + ); + filter.add(new ControllerIdPredicate(opponent.getId())); + ReflexiveTriggeredAbility ability = new ReflexiveTriggeredAbility( + new DestroyTargetEffect(), false, + "destroy target creature or planeswalker that player controls" + ); + this.getEffects().clear(); + this.addEffect(new DoWhenCostPaid( + ability, + new DiscardTargetCost(new TargetCardInHand(StaticFilters.FILTER_CARD_CREATURE)), + "Discard a creature card?" + )); + return true; + } + + @Override + public String getRule() { + return "Whenever {this} deals combat damage to a player, you may discard a creature card. " + + "When you do, destroy target creature or planeswalker that player controls."; + } +}