From f9467d5142e3315606b1bd1f7b9247c92f562a23 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Fri, 16 Apr 2021 18:48:40 -0400 Subject: [PATCH] [STX] Implemented Strict Proctor --- .../src/mage/cards/f/ForceProjection.java | 2 +- .../src/mage/cards/h/HiddenPredators.java | 4 +- .../src/mage/cards/l/LurkingJackals.java | 4 +- Mage.Sets/src/mage/cards/o/OpalAvenger.java | 4 +- Mage.Sets/src/mage/cards/s/StrictProctor.java | 84 +++++++++++++++++++ .../src/mage/cards/v/VeiledCrocodile.java | 4 +- .../mage/sets/StrixhavenSchoolOfMages.java | 1 + .../src/main/java/mage/abilities/Ability.java | 4 +- .../abilities/DelayedTriggeredAbilities.java | 2 +- .../mage/abilities/StateTriggeredAbility.java | 4 +- .../mage/abilities/TriggeredAbilities.java | 2 +- .../java/mage/abilities/TriggeredAbility.java | 5 +- .../mage/abilities/TriggeredAbilityImpl.java | 19 ++++- .../abilities/keyword/SoulshiftAbility.java | 5 +- Mage/src/main/java/mage/game/Game.java | 2 +- Mage/src/main/java/mage/game/GameImpl.java | 4 +- .../main/java/mage/game/events/GameEvent.java | 1 + .../main/java/mage/players/PlayerImpl.java | 16 +++- 18 files changed, 140 insertions(+), 27 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/s/StrictProctor.java diff --git a/Mage.Sets/src/mage/cards/f/ForceProjection.java b/Mage.Sets/src/mage/cards/f/ForceProjection.java index 179f02725ef..e185fe46d15 100644 --- a/Mage.Sets/src/mage/cards/f/ForceProjection.java +++ b/Mage.Sets/src/mage/cards/f/ForceProjection.java @@ -82,7 +82,7 @@ class ForceProjectionEffect extends OneShotEffect { Effect sacrificeEffect = new SacrificeSourceEffect(); sacrificeEffect.setTargetPointer(new FixedTarget(effect.getAddedPermanent().get(0), game)); TriggeredAbility ability = new BecomesTargetTriggeredAbility(sacrificeEffect, new FilterSpell()); - game.addTriggeredAbility(ability); + game.addTriggeredAbility(ability, null); return true; } diff --git a/Mage.Sets/src/mage/cards/h/HiddenPredators.java b/Mage.Sets/src/mage/cards/h/HiddenPredators.java index 1b12439e2f0..238b72434fd 100644 --- a/Mage.Sets/src/mage/cards/h/HiddenPredators.java +++ b/Mage.Sets/src/mage/cards/h/HiddenPredators.java @@ -78,10 +78,10 @@ class HiddenPredatorsStateTriggeredAbility extends StateTriggeredAbility { } @Override - public void trigger(Game game, UUID controllerId) { + public void trigger(Game game, UUID controllerId, GameEvent triggeringEvent) { //20100716 - 603.8 game.getState().setValue(this.getSourceId().toString() + "triggered", Boolean.TRUE); - super.trigger(game, controllerId); + super.trigger(game, controllerId, triggeringEvent); } @Override diff --git a/Mage.Sets/src/mage/cards/l/LurkingJackals.java b/Mage.Sets/src/mage/cards/l/LurkingJackals.java index 46542b54fa4..cdb3803a9df 100644 --- a/Mage.Sets/src/mage/cards/l/LurkingJackals.java +++ b/Mage.Sets/src/mage/cards/l/LurkingJackals.java @@ -79,10 +79,10 @@ class LurkingJackalsStateTriggeredAbility extends StateTriggeredAbility { } @Override - public void trigger(Game game, UUID controllerId) { + public void trigger(Game game, UUID controllerId, GameEvent triggeringEvent) { //20100716 - 603.8 game.getState().setValue(this.getSourceId().toString() + "triggered", Boolean.TRUE); - super.trigger(game, controllerId); + super.trigger(game, controllerId, triggeringEvent); } @Override diff --git a/Mage.Sets/src/mage/cards/o/OpalAvenger.java b/Mage.Sets/src/mage/cards/o/OpalAvenger.java index 1552029b914..6484a5527b9 100644 --- a/Mage.Sets/src/mage/cards/o/OpalAvenger.java +++ b/Mage.Sets/src/mage/cards/o/OpalAvenger.java @@ -75,10 +75,10 @@ class OpalAvengerStateTriggeredAbility extends StateTriggeredAbility { } @Override - public void trigger(Game game, UUID controllerId) { + public void trigger(Game game, UUID controllerId, GameEvent triggeringEvent) { //20100716 - 603.8 game.getState().setValue(this.getSourceId().toString() + "triggered", Boolean.TRUE); - super.trigger(game, controllerId); + super.trigger(game, controllerId, triggeringEvent); } @Override diff --git a/Mage.Sets/src/mage/cards/s/StrictProctor.java b/Mage.Sets/src/mage/cards/s/StrictProctor.java new file mode 100644 index 00000000000..b6b6034074a --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/StrictProctor.java @@ -0,0 +1,84 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.CounterUnlessPaysEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.target.targetpointer.FixedTarget; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class StrictProctor extends CardImpl { + + public StrictProctor(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); + + this.subtype.add(SubType.SPIRIT); + this.subtype.add(SubType.CLERIC); + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Whenever a permanent entering the battlefield causes a triggered ability to trigger, counter that ability unless its controller pays {2}. + this.addAbility(new StrictProctorTriggeredAbility()); + } + + private StrictProctor(final StrictProctor card) { + super(card); + } + + @Override + public StrictProctor copy() { + return new StrictProctor(this); + } +} + +class StrictProctorTriggeredAbility extends TriggeredAbilityImpl { + + StrictProctorTriggeredAbility() { + super(Zone.BATTLEFIELD, new CounterUnlessPaysEffect(new GenericManaCost(2))); + } + + private StrictProctorTriggeredAbility(final StrictProctorTriggeredAbility ability) { + super(ability); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.ABILITY_TRIGGERED; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + GameEvent triggeringEvent = (GameEvent) game.getState().getValue(event.getId().toString()); + if (triggeringEvent == null || triggeringEvent.getType() != GameEvent.EventType.ENTERS_THE_BATTLEFIELD) { + return false; + } + getEffects().setTargetPointer(new FixedTarget(triggeringEvent.getTargetId(), game)); + return true; + } + + @Override + public StrictProctorTriggeredAbility copy() { + return new StrictProctorTriggeredAbility(this); + } + + @Override + public String getRule() { + return "Whenever a permanent entering the battlefield causes a triggered ability to trigger, " + + "counter that ability unless its controller pays {2}."; + } +} diff --git a/Mage.Sets/src/mage/cards/v/VeiledCrocodile.java b/Mage.Sets/src/mage/cards/v/VeiledCrocodile.java index 152e7b7f45e..74ebd459c6f 100644 --- a/Mage.Sets/src/mage/cards/v/VeiledCrocodile.java +++ b/Mage.Sets/src/mage/cards/v/VeiledCrocodile.java @@ -80,10 +80,10 @@ class VeiledCrocodileStateTriggeredAbility extends StateTriggeredAbility { } @Override - public void trigger(Game game, UUID controllerId) { + public void trigger(Game game, UUID controllerId, GameEvent triggeringEvent) { //20100716 - 603.8 game.getState().setValue(this.getSourceId().toString() + "triggered", Boolean.TRUE); - super.trigger(game, controllerId); + super.trigger(game, controllerId, triggeringEvent); } @Override diff --git a/Mage.Sets/src/mage/sets/StrixhavenSchoolOfMages.java b/Mage.Sets/src/mage/sets/StrixhavenSchoolOfMages.java index 583d85f59d1..a7ce87199cc 100644 --- a/Mage.Sets/src/mage/sets/StrixhavenSchoolOfMages.java +++ b/Mage.Sets/src/mage/sets/StrixhavenSchoolOfMages.java @@ -269,6 +269,7 @@ public final class StrixhavenSchoolOfMages extends ExpansionSet { cards.add(new SetCardInfo("Stonebound Mentor", 239, Rarity.COMMON, mage.cards.s.StoneboundMentor.class)); cards.add(new SetCardInfo("Stonerise Spirit", 32, Rarity.COMMON, mage.cards.s.StoneriseSpirit.class)); cards.add(new SetCardInfo("Storm-Kiln Artist", 115, Rarity.UNCOMMON, mage.cards.s.StormKilnArtist.class)); + cards.add(new SetCardInfo("Strict Proctor", 33, Rarity.RARE, mage.cards.s.StrictProctor.class)); cards.add(new SetCardInfo("Strixhaven Stadium", 259, Rarity.RARE, mage.cards.s.StrixhavenStadium.class)); cards.add(new SetCardInfo("Study Break", 34, Rarity.COMMON, mage.cards.s.StudyBreak.class)); cards.add(new SetCardInfo("Sudden Breakthrough", 116, Rarity.COMMON, mage.cards.s.SuddenBreakthrough.class)); diff --git a/Mage/src/main/java/mage/abilities/Ability.java b/Mage/src/main/java/mage/abilities/Ability.java index cd411416cc7..967164cfbce 100644 --- a/Mage/src/main/java/mage/abilities/Ability.java +++ b/Mage/src/main/java/mage/abilities/Ability.java @@ -48,7 +48,7 @@ public interface Ability extends Controllable, Serializable { * * @see mage.players.PlayerImpl#playAbility(mage.abilities.ActivatedAbility, * mage.game.Game) - * @see mage.game.GameImpl#addTriggeredAbility(mage.abilities.TriggeredAbility) + * @see Game#addTriggeredAbility(TriggeredAbility, GameEvent) * @see mage.game.GameImpl#addDelayedTriggeredAbility(mage.abilities.DelayedTriggeredAbility) */ void newId(); @@ -58,7 +58,7 @@ public interface Ability extends Controllable, Serializable { * * @see mage.players.PlayerImpl#playAbility(mage.abilities.ActivatedAbility, * mage.game.Game) - * @see mage.game.GameImpl#addTriggeredAbility(mage.abilities.TriggeredAbility) + * @see Game#addTriggeredAbility(TriggeredAbility, GameEvent) * @see mage.game.GameImpl#addDelayedTriggeredAbility(mage.abilities.DelayedTriggeredAbility) */ void newOriginalId(); diff --git a/Mage/src/main/java/mage/abilities/DelayedTriggeredAbilities.java b/Mage/src/main/java/mage/abilities/DelayedTriggeredAbilities.java index c1d4d0e7f01..1bb564fc292 100644 --- a/Mage/src/main/java/mage/abilities/DelayedTriggeredAbilities.java +++ b/Mage/src/main/java/mage/abilities/DelayedTriggeredAbilities.java @@ -37,7 +37,7 @@ public class DelayedTriggeredAbilities extends AbilitiesImpl