From 817e1a813ac276a366d661345b1fae95c472ab60 Mon Sep 17 00:00:00 2001 From: xenohedron Date: Sat, 12 Aug 2023 20:40:49 -0400 Subject: [PATCH] put getCount method in SpellsCastWatcher and use it where applicable --- .../src/mage/cards/f/FlockchaserPhantom.java | 45 ++---------------- Mage.Sets/src/mage/cards/h/HellishRebuke.java | 1 - .../mage/cards/j/JaceUnravelerOfSecrets.java | 2 - .../mage/cards/m/MarshlandBloodcaster.java | 3 +- Mage.Sets/src/mage/cards/m/MonkClass.java | 2 +- .../src/mage/cards/p/PainDistributor.java | 3 +- .../mage/cards/r/RashmiEternitiesCrafter.java | 16 +++---- .../mage/cards/v/VialSmasherTheFierce.java | 15 +++--- .../src/mage/cards/w/WandOfTheWorldsoul.java | 46 ++----------------- ...rstSpellOpponentsTurnTriggeredAbility.java | 12 +---- .../emblems/JaceUnravelerOfSecretsEmblem.java | 1 - .../watchers/common/SpellsCastWatcher.java | 5 ++ 12 files changed, 32 insertions(+), 119 deletions(-) diff --git a/Mage.Sets/src/mage/cards/f/FlockchaserPhantom.java b/Mage.Sets/src/mage/cards/f/FlockchaserPhantom.java index 17bee7f163b..57424efeb17 100644 --- a/Mage.Sets/src/mage/cards/f/FlockchaserPhantom.java +++ b/Mage.Sets/src/mage/cards/f/FlockchaserPhantom.java @@ -11,15 +11,11 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; import mage.game.Game; -import mage.game.events.GameEvent; import mage.game.stack.Spell; import mage.game.stack.StackObject; import mage.players.Player; -import mage.util.CardUtil; -import mage.watchers.Watcher; +import mage.watchers.common.SpellsCastWatcher; -import java.util.HashMap; -import java.util.Map; import java.util.UUID; /** @@ -43,7 +39,7 @@ public final class FlockchaserPhantom extends CardImpl { this.addAbility(VigilanceAbility.getInstance()); // Whenever Flockchaser Phantom attacks, the next spell you cast this turn has convoke. - this.addAbility(new AttacksTriggeredAbility(new FlockchaserPhantomEffect()), new FlockchaserPhantomWatcher()); + this.addAbility(new AttacksTriggeredAbility(new FlockchaserPhantomEffect())); } private FlockchaserPhantom(final FlockchaserPhantom card) { @@ -59,7 +55,6 @@ public final class FlockchaserPhantom extends CardImpl { class FlockchaserPhantomEffect extends ContinuousEffectImpl { private int spellsCast; - private final Ability convokeAbility = new ConvokeAbility(); FlockchaserPhantomEffect() { super(Duration.EndOfTurn, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility); @@ -74,7 +69,7 @@ class FlockchaserPhantomEffect extends ContinuousEffectImpl { @Override public void init(Ability source, Game game) { super.init(source, game); - FlockchaserPhantomWatcher watcher = game.getState().getWatcher(FlockchaserPhantomWatcher.class); + SpellsCastWatcher watcher = game.getState().getWatcher(SpellsCastWatcher.class); if (watcher != null) { spellsCast = watcher.getCount(source.getControllerId()); } @@ -82,7 +77,7 @@ class FlockchaserPhantomEffect extends ContinuousEffectImpl { @Override public boolean apply(Game game, Ability source) { - FlockchaserPhantomWatcher watcher = game.getState().getWatcher(FlockchaserPhantomWatcher.class); + SpellsCastWatcher watcher = game.getState().getWatcher(SpellsCastWatcher.class); if (watcher == null) { return false; } @@ -99,7 +94,7 @@ class FlockchaserPhantomEffect extends ContinuousEffectImpl { for (StackObject stackObject : game.getStack()) { if ((stackObject instanceof Spell) && !stackObject.isCopy() && stackObject.isControlledBy(source.getControllerId())) { Spell spell = (Spell) stackObject; - game.getState().addOtherAbility(spell.getCard(), convokeAbility); + game.getState().addOtherAbility(spell.getCard(), new ConvokeAbility()); return true; } } @@ -113,33 +108,3 @@ class FlockchaserPhantomEffect extends ContinuousEffectImpl { return new FlockchaserPhantomEffect(this); } } - -class FlockchaserPhantomWatcher extends Watcher { - - private final Map playerMap = new HashMap<>(); - - FlockchaserPhantomWatcher() { - super(WatcherScope.GAME); - } - - @Override - public void watch(GameEvent event, Game game) { - if (event.getType() != GameEvent.EventType.SPELL_CAST) { - return; - } - Spell spell = game.getSpell(event.getSourceId()); - if (spell != null) { - playerMap.compute(event.getPlayerId(), CardUtil::setOrIncrementValue); - } - } - - @Override - public void reset() { - super.reset(); - playerMap.clear(); - } - - int getCount(UUID playerId) { - return playerMap.getOrDefault(playerId, 0); - } -} diff --git a/Mage.Sets/src/mage/cards/h/HellishRebuke.java b/Mage.Sets/src/mage/cards/h/HellishRebuke.java index ad9198aaf4d..01253e9e005 100644 --- a/Mage.Sets/src/mage/cards/h/HellishRebuke.java +++ b/Mage.Sets/src/mage/cards/h/HellishRebuke.java @@ -62,7 +62,6 @@ class HellishRebukeEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - MageObject mageObject = source.getSourceObject(game); game.addEffect(new GainAbilityAllEffect( new HellishRebukeTriggeredAbility(source, game), Duration.EndOfTurn, StaticFilters.FILTER_OPPONENTS_PERMANENT diff --git a/Mage.Sets/src/mage/cards/j/JaceUnravelerOfSecrets.java b/Mage.Sets/src/mage/cards/j/JaceUnravelerOfSecrets.java index 2f4d274f402..1d3f03db477 100644 --- a/Mage.Sets/src/mage/cards/j/JaceUnravelerOfSecrets.java +++ b/Mage.Sets/src/mage/cards/j/JaceUnravelerOfSecrets.java @@ -1,4 +1,3 @@ - package mage.cards.j; import java.util.UUID; @@ -18,7 +17,6 @@ import mage.game.command.emblems.JaceUnravelerOfSecretsEmblem; import mage.target.common.TargetCreaturePermanent; /** - * import mage.game.command.emblems.JaceUnravelerOfSecretsEmblem; * * @author LevelX2 */ diff --git a/Mage.Sets/src/mage/cards/m/MarshlandBloodcaster.java b/Mage.Sets/src/mage/cards/m/MarshlandBloodcaster.java index dcd9161dc70..57fe83b1205 100644 --- a/Mage.Sets/src/mage/cards/m/MarshlandBloodcaster.java +++ b/Mage.Sets/src/mage/cards/m/MarshlandBloodcaster.java @@ -70,6 +70,7 @@ class MarshlandBloodcasterEffect extends ContinuousEffectImpl { public MarshlandBloodcasterEffect(final MarshlandBloodcasterEffect effect) { super(effect); + this.spellsCast = effect.spellsCast; } @Override @@ -99,7 +100,7 @@ class MarshlandBloodcasterEffect extends ContinuousEffectImpl { private static int getSpellsCast(UUID playerId, Game game) { SpellsCastWatcher watcher = game.getState().getWatcher(SpellsCastWatcher.class); - return watcher != null ? watcher.getSpellsCastThisTurn(playerId).size() : 0; + return watcher != null ? watcher.getCount(playerId) : 0; } } diff --git a/Mage.Sets/src/mage/cards/m/MonkClass.java b/Mage.Sets/src/mage/cards/m/MonkClass.java index d3df2c17432..0c9348862c4 100644 --- a/Mage.Sets/src/mage/cards/m/MonkClass.java +++ b/Mage.Sets/src/mage/cards/m/MonkClass.java @@ -142,7 +142,7 @@ class MonkClassCastEffect extends AsThoughEffectImpl { Card card = game.getCard(sourceId); SpellsCastWatcher watcher = game.getState().getWatcher(SpellsCastWatcher.class); return card != null && watcher != null && !card.isLand(game) - && !watcher.getSpellsCastThisTurn(affectedControllerId).isEmpty(); + && watcher.getCount(affectedControllerId) > 0; } @Override diff --git a/Mage.Sets/src/mage/cards/p/PainDistributor.java b/Mage.Sets/src/mage/cards/p/PainDistributor.java index c1454c0b3e7..cb50f2654e1 100644 --- a/Mage.Sets/src/mage/cards/p/PainDistributor.java +++ b/Mage.Sets/src/mage/cards/p/PainDistributor.java @@ -79,8 +79,7 @@ enum PainDistributorPredicate implements Predicate { public boolean apply(StackObject input, Game game) { return game.getState() .getWatcher(SpellsCastWatcher.class) - .getSpellsCastThisTurn(input.getControllerId()) - .size() == 1; + .getCount(input.getControllerId()) == 1; } } diff --git a/Mage.Sets/src/mage/cards/r/RashmiEternitiesCrafter.java b/Mage.Sets/src/mage/cards/r/RashmiEternitiesCrafter.java index 543da7c8c27..004524ad2cb 100644 --- a/Mage.Sets/src/mage/cards/r/RashmiEternitiesCrafter.java +++ b/Mage.Sets/src/mage/cards/r/RashmiEternitiesCrafter.java @@ -1,6 +1,5 @@ package mage.cards.r; -import java.util.List; import java.util.UUID; import mage.ApprovingObject; import mage.MageInt; @@ -72,16 +71,13 @@ class RashmiEternitiesCrafterTriggeredAbility extends SpellCastControllerTrigger public boolean checkTrigger(GameEvent event, Game game) { if (super.checkTrigger(event, game)) { SpellsCastWatcher watcher = game.getState().getWatcher(SpellsCastWatcher.class); - if (watcher != null) { - List spells = watcher.getSpellsCastThisTurn(event.getPlayerId()); - if (spells != null && spells.size() == 1) { - Spell spell = game.getStack().getSpell(event.getTargetId()); - if (spell != null) { - for (Effect effect : getEffects()) { - effect.setValue("RashmiEternitiesCrafterCMC", spell.getManaValue()); - } - return true; + if (watcher != null && watcher.getCount(event.getPlayerId()) == 1) { + Spell spell = game.getStack().getSpell(event.getTargetId()); + if (spell != null) { + for (Effect effect : getEffects()) { + effect.setValue("RashmiEternitiesCrafterCMC", spell.getManaValue()); } + return true; } } } diff --git a/Mage.Sets/src/mage/cards/v/VialSmasherTheFierce.java b/Mage.Sets/src/mage/cards/v/VialSmasherTheFierce.java index c1374d2fede..244a493e6fa 100644 --- a/Mage.Sets/src/mage/cards/v/VialSmasherTheFierce.java +++ b/Mage.Sets/src/mage/cards/v/VialSmasherTheFierce.java @@ -78,16 +78,13 @@ class VialSmasherTheFierceTriggeredAbility extends SpellCastControllerTriggeredA public boolean checkTrigger(GameEvent event, Game game) { if (super.checkTrigger(event, game)) { SpellsCastWatcher watcher = game.getState().getWatcher(SpellsCastWatcher.class); - if (watcher != null) { - List spells = watcher.getSpellsCastThisTurn(event.getPlayerId()); - if (spells != null && spells.size() == 1) { - Spell spell = game.getStack().getSpell(event.getTargetId()); - if (spell != null) { - for (Effect effect : getEffects()) { - effect.setValue("VialSmasherTheFierceCMC", spell.getManaValue()); - } - return true; + if (watcher != null && watcher.getCount(event.getPlayerId()) == 1) { + Spell spell = game.getStack().getSpell(event.getTargetId()); + if (spell != null) { + for (Effect effect : getEffects()) { + effect.setValue("VialSmasherTheFierceCMC", spell.getManaValue()); } + return true; } } } diff --git a/Mage.Sets/src/mage/cards/w/WandOfTheWorldsoul.java b/Mage.Sets/src/mage/cards/w/WandOfTheWorldsoul.java index 7e777b3abdf..d74c9b75914 100644 --- a/Mage.Sets/src/mage/cards/w/WandOfTheWorldsoul.java +++ b/Mage.Sets/src/mage/cards/w/WandOfTheWorldsoul.java @@ -11,15 +11,11 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; import mage.game.Game; -import mage.game.events.GameEvent; import mage.game.stack.Spell; import mage.game.stack.StackObject; import mage.players.Player; -import mage.util.CardUtil; -import mage.watchers.Watcher; +import mage.watchers.common.SpellsCastWatcher; -import java.util.HashMap; -import java.util.Map; import java.util.UUID; /** @@ -37,8 +33,7 @@ public final class WandOfTheWorldsoul extends CardImpl { this.addAbility(new WhiteManaAbility()); // {T}: The next spell you cast this turn has convoke. - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new WandOfTheWorldsoulEffect(), new TapSourceCost()), - new WandOfTheWorldsoulWatcher()); + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new WandOfTheWorldsoulEffect(), new TapSourceCost())); } private WandOfTheWorldsoul(final WandOfTheWorldsoul card) { @@ -53,7 +48,6 @@ public final class WandOfTheWorldsoul extends CardImpl { class WandOfTheWorldsoulEffect extends ContinuousEffectImpl { private int spellsCast; - private final Ability convokeAbility = new ConvokeAbility(); WandOfTheWorldsoulEffect() { super(Duration.EndOfTurn, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility); @@ -68,7 +62,7 @@ class WandOfTheWorldsoulEffect extends ContinuousEffectImpl { @Override public void init(Ability source, Game game) { super.init(source, game); - WandOfTheWorldsoulWatcher watcher = game.getState().getWatcher(WandOfTheWorldsoulWatcher.class); + SpellsCastWatcher watcher = game.getState().getWatcher(SpellsCastWatcher.class); if (watcher != null) { spellsCast = watcher.getCount(source.getControllerId()); } @@ -76,7 +70,7 @@ class WandOfTheWorldsoulEffect extends ContinuousEffectImpl { @Override public boolean apply(Game game, Ability source) { - WandOfTheWorldsoulWatcher watcher = game.getState().getWatcher(WandOfTheWorldsoulWatcher.class); + SpellsCastWatcher watcher = game.getState().getWatcher(SpellsCastWatcher.class); if (watcher == null) { return false; } @@ -93,7 +87,7 @@ class WandOfTheWorldsoulEffect extends ContinuousEffectImpl { for (StackObject stackObject : game.getStack()) { if ((stackObject instanceof Spell) && !stackObject.isCopy() && stackObject.isControlledBy(source.getControllerId())) { Spell spell = (Spell) stackObject; - game.getState().addOtherAbility(spell.getCard(), convokeAbility); + game.getState().addOtherAbility(spell.getCard(), new ConvokeAbility()); return true; } } @@ -107,33 +101,3 @@ class WandOfTheWorldsoulEffect extends ContinuousEffectImpl { return new WandOfTheWorldsoulEffect(this); } } - -class WandOfTheWorldsoulWatcher extends Watcher { - - private final Map playerMap = new HashMap<>(); - - WandOfTheWorldsoulWatcher() { - super(WatcherScope.GAME); - } - - @Override - public void watch(GameEvent event, Game game) { - if (event.getType() != GameEvent.EventType.SPELL_CAST) { - return; - } - Spell spell = game.getSpell(event.getSourceId()); - if (spell != null) { - playerMap.compute(event.getPlayerId(), CardUtil::setOrIncrementValue); - } - } - - @Override - public void reset() { - super.reset(); - playerMap.clear(); - } - - int getCount(UUID playerId) { - return playerMap.getOrDefault(playerId, 0); - } -} diff --git a/Mage/src/main/java/mage/abilities/common/FirstSpellOpponentsTurnTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/FirstSpellOpponentsTurnTriggeredAbility.java index 84aef8d67f7..e83a49b724a 100644 --- a/Mage/src/main/java/mage/abilities/common/FirstSpellOpponentsTurnTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/FirstSpellOpponentsTurnTriggeredAbility.java @@ -4,11 +4,8 @@ import mage.abilities.effects.Effect; import mage.filter.FilterSpell; import mage.game.Game; import mage.game.events.GameEvent; -import mage.game.stack.Spell; import mage.watchers.common.SpellsCastWatcher; -import java.util.List; - /** * @author TheElk801 */ @@ -19,7 +16,6 @@ public class FirstSpellOpponentsTurnTriggeredAbility extends SpellCastController public FirstSpellOpponentsTurnTriggeredAbility(Effect effect, boolean optional) { super(effect, defaultFilter, optional); - this.addWatcher(new SpellsCastWatcher()); } private FirstSpellOpponentsTurnTriggeredAbility(final FirstSpellOpponentsTurnTriggeredAbility ability) { @@ -38,13 +34,7 @@ public class FirstSpellOpponentsTurnTriggeredAbility extends SpellCastController || !game.getOpponents(this.getControllerId()).contains(game.getActivePlayerId())) { return false; } - SpellsCastWatcher watcher = game.getState().getWatcher(SpellsCastWatcher.class); - if (watcher == null) { - return false; - } - - List spells = watcher.getSpellsCastThisTurn(event.getPlayerId()); - return spells != null && spells.size() == 1; + return watcher != null && watcher.getCount(event.getPlayerId()) == 1; } } diff --git a/Mage/src/main/java/mage/game/command/emblems/JaceUnravelerOfSecretsEmblem.java b/Mage/src/main/java/mage/game/command/emblems/JaceUnravelerOfSecretsEmblem.java index f768760d5ec..54384ee8efb 100644 --- a/Mage/src/main/java/mage/game/command/emblems/JaceUnravelerOfSecretsEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/JaceUnravelerOfSecretsEmblem.java @@ -29,7 +29,6 @@ public final class JaceUnravelerOfSecretsEmblem extends Emblem { Effect effect = new CounterTargetEffect(); effect.setText("counter that spell"); Ability ability = new JaceUnravelerOfSecretsTriggeredAbility(effect, false); - ability.addWatcher(new SpellsCastWatcher()); this.getAbilities().add(ability); } diff --git a/Mage/src/main/java/mage/watchers/common/SpellsCastWatcher.java b/Mage/src/main/java/mage/watchers/common/SpellsCastWatcher.java index 24acfb71ca4..21474f1ba8e 100644 --- a/Mage/src/main/java/mage/watchers/common/SpellsCastWatcher.java +++ b/Mage/src/main/java/mage/watchers/common/SpellsCastWatcher.java @@ -89,4 +89,9 @@ public class SpellsCastWatcher extends Watcher { } return null; } + + public int getCount(UUID playerId) { + return spellsCast.getOrDefault(playerId, new ArrayList<>()).size(); + } + }