From 2d2438ba660d7c3e66cca1a70cd697f3f39579c1 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Sun, 27 Nov 2022 17:28:33 -0500 Subject: [PATCH] fix melee ability counting planeswalkers --- .../mage/abilities/keyword/MeleeAbility.java | 68 +++++++------------ 1 file changed, 26 insertions(+), 42 deletions(-) diff --git a/Mage/src/main/java/mage/abilities/keyword/MeleeAbility.java b/Mage/src/main/java/mage/abilities/keyword/MeleeAbility.java index c123b43987..2a2f4cdb50 100644 --- a/Mage/src/main/java/mage/abilities/keyword/MeleeAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/MeleeAbility.java @@ -1,7 +1,5 @@ package mage.abilities.keyword; -import java.util.*; - import mage.abilities.Ability; import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.dynamicvalue.DynamicValue; @@ -11,17 +9,17 @@ import mage.constants.Duration; import mage.constants.WatcherScope; import mage.game.Game; import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; import mage.watchers.Watcher; +import java.util.*; + /** - * * @author emerald000 */ public class MeleeAbility extends AttacksTriggeredAbility { public MeleeAbility() { - super(new BoostSourceEffect(new MeleeDynamicValue(), new MeleeDynamicValue(), Duration.EndOfTurn), false); + super(new BoostSourceEffect(MeleeDynamicValue.instance, MeleeDynamicValue.instance, Duration.EndOfTurn), false); this.addWatcher(new MeleeWatcher()); } @@ -42,7 +40,7 @@ public class MeleeAbility extends AttacksTriggeredAbility { class MeleeWatcher extends Watcher { - private Map> playersAttacked = new HashMap<>(0); + private final Map> playersAttacked = new HashMap<>(0); public MeleeWatcher() { super(WatcherScope.GAME); @@ -50,55 +48,41 @@ class MeleeWatcher extends Watcher { @Override public void watch(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.BEGIN_COMBAT_STEP_PRE) { - this.playersAttacked.clear(); - } - else if (event.getType() == GameEvent.EventType.ATTACKER_DECLARED) { - Set attackedPlayers = this.playersAttacked.getOrDefault(event.getPlayerId(), new HashSet<>(1)); - attackedPlayers.add(event.getTargetId()); - this.playersAttacked.put(event.getPlayerId(), attackedPlayers); + switch (event.getType()) { + case BEGIN_COMBAT_STEP_PRE: + this.playersAttacked.clear(); + return; + case ATTACKER_DECLARED: + if (game.getPlayer(event.getTargetId()) == null) { + return; + } + this.playersAttacked + .computeIfAbsent(event.getPlayerId(), x -> new HashSet<>()) + .add(event.getTargetId()); } } - public int getNumberOfAttackedPlayers(UUID attackerId) { - if (this.playersAttacked.get(attackerId) != null) { - return this.playersAttacked.get(attackerId).size(); - } - return 0; + public static int getNumberOfAttackedPlayers(UUID attackerId, Game game) { + return game + .getState() + .getWatcher(MeleeWatcher.class) + .playersAttacked + .getOrDefault(attackerId, Collections.emptySet()) + .size(); } } -class MeleeDynamicValue implements DynamicValue { - - private boolean valueChecked; - private int lockedInValue; - - public MeleeDynamicValue() { - super(); - } - - protected MeleeDynamicValue(final MeleeDynamicValue dynamicValue) { - super(); - valueChecked = dynamicValue.valueChecked; - lockedInValue = dynamicValue.lockedInValue; - } +enum MeleeDynamicValue implements DynamicValue { + instance; @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { - MeleeWatcher watcher = game.getState().getWatcher(MeleeWatcher.class); - if (watcher != null) { - if (!valueChecked) { - this.lockedInValue = watcher.getNumberOfAttackedPlayers(sourceAbility.getControllerId()); - valueChecked = true; - } - return this.lockedInValue; - } - return 0; + return MeleeWatcher.getNumberOfAttackedPlayers(sourceAbility.getSourceId(), game); } @Override public MeleeDynamicValue copy() { - return new MeleeDynamicValue(this); + return this; } @Override