From 0579ddc1bddefab455e6d57c54ab4669ce798875 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 10 Oct 2013 00:01:20 +0200 Subject: [PATCH] Fixed Spear of Heliod, Dunerider Outlaw, Whirling Dervish, Reciprocate, Wicked Akuba, Giltspire Avenger only counting damage done, if the same permanent had done the damage (i.e. it cant be selected if the creature was exiled with Cloudshift). --- .../sets/championsofkamigawa/Reciprocate.java | 13 ++++--- .../sets/championsofkamigawa/WickedAkuba.java | 11 +++--- .../mage/sets/conflux/GiltspireAvenger.java | 13 ++++--- .../common/DealtDamageToAnOpponent.java | 4 +-- .../DamagedPlayerThisTurnPredicate.java | 16 ++++----- .../common/PlayerDamagedBySourceWatcher.java | 36 ++++++++++++------- 6 files changed, 51 insertions(+), 42 deletions(-) diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/Reciprocate.java b/Mage.Sets/src/mage/sets/championsofkamigawa/Reciprocate.java index c35c223381d..3bc51cb49e6 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/Reciprocate.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/Reciprocate.java @@ -31,13 +31,12 @@ package mage.sets.championsofkamigawa; import java.util.HashSet; import java.util.Set; import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Rarity; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.common.ExileTargetEffect; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.permanent.Permanent; @@ -46,7 +45,7 @@ import mage.target.common.TargetCreaturePermanent; import mage.watchers.common.PlayerDamagedBySourceWatcher; /** - * @author LevelX + * @author LevelX2 */ public class Reciprocate extends CardImpl { @@ -84,7 +83,7 @@ class ReciprocateTarget> extends TargetPerm @Override public boolean canTarget(UUID id, Ability source, Game game) { PlayerDamagedBySourceWatcher watcher = (PlayerDamagedBySourceWatcher) game.getState().getWatchers().get("PlayerDamagedBySource",source.getControllerId()); - if (watcher != null && watcher.damageSources.contains(id)) { + if (watcher != null && watcher.hasSourceDoneDamage(id, game)) { return super.canTarget(id, source, game); } return false; @@ -97,7 +96,7 @@ class ReciprocateTarget> extends TargetPerm PlayerDamagedBySourceWatcher watcher = (PlayerDamagedBySourceWatcher) game.getState().getWatchers().get("PlayerDamagedBySource", sourceControllerId); for (UUID targetId : availablePossibleTargets) { Permanent permanent = game.getPermanent(targetId); - if(permanent != null && watcher != null && watcher.damageSources.contains(targetId)){ + if(permanent != null && watcher != null && watcher.hasSourceDoneDamage(targetId, game)){ possibleTargets.add(targetId); } } @@ -115,7 +114,7 @@ class ReciprocateTarget> extends TargetPerm PlayerDamagedBySourceWatcher watcher = (PlayerDamagedBySourceWatcher) game.getState().getWatchers().get("PlayerDamagedBySource", sourceControllerId); for (Permanent permanent: game.getBattlefield().getActivePermanents(filter, sourceControllerId, sourceId, game)) { if (!targets.containsKey(permanent.getId()) && permanent.canBeTargetedBy(targetSource, sourceControllerId, game) - && watcher != null && watcher.damageSources.contains(permanent.getId())) { + && watcher != null && watcher.hasSourceDoneDamage(permanent.getId(), game)) { count++; if (count >= remainingTargets) { return true; diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/WickedAkuba.java b/Mage.Sets/src/mage/sets/championsofkamigawa/WickedAkuba.java index 828d69385ed..c95d6be99be 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/WickedAkuba.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/WickedAkuba.java @@ -28,17 +28,16 @@ package mage.sets.championsofkamigawa; import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Rarity; -import mage.constants.Zone; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ColoredManaCost; import mage.abilities.effects.common.LoseLifeTargetEffect; import mage.cards.CardImpl; +import mage.constants.CardType; import mage.constants.ColoredManaSymbol; +import mage.constants.Rarity; +import mage.constants.Zone; import mage.filter.FilterPlayer; import mage.filter.predicate.ObjectSourcePlayer; import mage.filter.predicate.ObjectSourcePlayerPredicate; @@ -89,8 +88,8 @@ class WickedAkubaPredicate implements ObjectSourcePlayerPredicate input, Game game) { PlayerDamagedBySourceWatcher watcher = (PlayerDamagedBySourceWatcher) game.getState().getWatchers().get("PlayerDamagedBySource", input.getObject().getId()); - if (watcher != null && watcher.damageSources.contains(input.getSourceId())) { - return true; + if (watcher != null) { + return watcher.hasSourceDoneDamage(input.getSourceId(), game); } return false; diff --git a/Mage.Sets/src/mage/sets/conflux/GiltspireAvenger.java b/Mage.Sets/src/mage/sets/conflux/GiltspireAvenger.java index 6979300bda0..61bc2cbe6a0 100644 --- a/Mage.Sets/src/mage/sets/conflux/GiltspireAvenger.java +++ b/Mage.Sets/src/mage/sets/conflux/GiltspireAvenger.java @@ -30,9 +30,6 @@ package mage.sets.conflux; import java.util.HashSet; import java.util.Set; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; -import mage.constants.Zone; import mage.MageInt; import mage.MageObject; import mage.abilities.Ability; @@ -41,6 +38,9 @@ import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.keyword.ExaltedAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.permanent.Permanent; @@ -48,7 +48,6 @@ import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; import mage.watchers.common.PlayerDamagedBySourceWatcher; - /** * * @author BetaSteward_at_googlemail.com @@ -103,7 +102,7 @@ class GiltspireAvengerTarget> extends Targe @Override public boolean canTarget(UUID id, Ability source, Game game) { PlayerDamagedBySourceWatcher watcher = (PlayerDamagedBySourceWatcher) game.getState().getWatchers().get("PlayerDamagedBySource",source.getControllerId()); - if (watcher != null && watcher.damageSources.contains(id)) { + if (watcher != null && watcher.hasSourceDoneDamage(id, game)) { return super.canTarget(id, source, game); } return false; @@ -116,7 +115,7 @@ class GiltspireAvengerTarget> extends Targe PlayerDamagedBySourceWatcher watcher = (PlayerDamagedBySourceWatcher) game.getState().getWatchers().get("PlayerDamagedBySource", sourceControllerId); for (UUID targetId : availablePossibleTargets) { Permanent permanent = game.getPermanent(targetId); - if(permanent != null && watcher != null && watcher.damageSources.contains(targetId)){ + if(permanent != null && watcher != null && watcher.hasSourceDoneDamage(targetId, game)){ possibleTargets.add(targetId); } } @@ -134,7 +133,7 @@ class GiltspireAvengerTarget> extends Targe PlayerDamagedBySourceWatcher watcher = (PlayerDamagedBySourceWatcher) game.getState().getWatchers().get("PlayerDamagedBySource", sourceControllerId); for (Permanent permanent: game.getBattlefield().getActivePermanents(filter, sourceControllerId, sourceId, game)) { if (!targets.containsKey(permanent.getId()) && permanent.canBeTargetedBy(targetSource, sourceControllerId, game) - && watcher != null && watcher.damageSources.contains(permanent.getId())) { + && watcher != null && watcher.hasSourceDoneDamage(permanent.getId(), game)) { count++; if (count >= remainingTargets) { return true; diff --git a/Mage/src/mage/abilities/condition/common/DealtDamageToAnOpponent.java b/Mage/src/mage/abilities/condition/common/DealtDamageToAnOpponent.java index c185837e206..192d0cf5715 100644 --- a/Mage/src/mage/abilities/condition/common/DealtDamageToAnOpponent.java +++ b/Mage/src/mage/abilities/condition/common/DealtDamageToAnOpponent.java @@ -45,8 +45,8 @@ public class DealtDamageToAnOpponent implements Condition { public boolean apply(Game game, Ability source) { for (UUID opponentId: game.getOpponents(source.getControllerId())) { PlayerDamagedBySourceWatcher watcher = (PlayerDamagedBySourceWatcher) game.getState().getWatchers().get("PlayerDamagedBySource", opponentId); - if (watcher != null && watcher.damageSources.contains(source.getSourceId())) { - return true; + if (watcher != null) { + return watcher.hasSourceDoneDamage(source.getSourceId(), game); } } return false; diff --git a/Mage/src/mage/filter/predicate/permanent/DamagedPlayerThisTurnPredicate.java b/Mage/src/mage/filter/predicate/permanent/DamagedPlayerThisTurnPredicate.java index fcb90b1a029..6e85fa29ba6 100644 --- a/Mage/src/mage/filter/predicate/permanent/DamagedPlayerThisTurnPredicate.java +++ b/Mage/src/mage/filter/predicate/permanent/DamagedPlayerThisTurnPredicate.java @@ -57,15 +57,15 @@ public class DamagedPlayerThisTurnPredicate implements ObjectPlayerPredicate { - public List damageSources = new ArrayList(); + private Set damageSourceIds = new HashSet(); public PlayerDamagedBySourceWatcher(UUID playerId) { super("PlayerDamagedBySource", WatcherScope.PLAYER); - setControllerId(playerId); + setControllerId(playerId); } public PlayerDamagedBySourceWatcher(final PlayerDamagedBySourceWatcher watcher) { super(watcher); - this.damageSources.addAll(watcher.damageSources); + this.damageSourceIds.addAll(watcher.damageSourceIds); } @Override @@ -64,15 +64,27 @@ public class PlayerDamagedBySourceWatcher extends WatcherImpl