mirror of
https://github.com/magefree/mage.git
synced 2026-01-26 13:19:18 -08:00
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).
This commit is contained in:
parent
45c875384c
commit
0579ddc1bd
6 changed files with 51 additions and 42 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -57,15 +57,15 @@ public class DamagedPlayerThisTurnPredicate implements ObjectPlayerPredicate<Obj
|
|||
switch (controller) {
|
||||
case YOU:
|
||||
PlayerDamagedBySourceWatcher watcher = (PlayerDamagedBySourceWatcher) game.getState().getWatchers().get("PlayerDamagedBySource",playerId);
|
||||
if (watcher != null && watcher.damageSources.contains(object.getId())) {
|
||||
return true;
|
||||
if (watcher != null ) {
|
||||
return watcher.hasSourceDoneDamage(object.getId(), game);
|
||||
}
|
||||
break;
|
||||
case OPPONENT:
|
||||
for (UUID opponentId : game.getOpponents(playerId)) {
|
||||
watcher = (PlayerDamagedBySourceWatcher) game.getState().getWatchers().get("PlayerDamagedBySource",opponentId);
|
||||
if (watcher != null && watcher.damageSources.contains(object.getId())) {
|
||||
return true;
|
||||
if (watcher != null ) {
|
||||
return watcher.hasSourceDoneDamage(object.getId(), game);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
|
@ -75,8 +75,8 @@ public class DamagedPlayerThisTurnPredicate implements ObjectPlayerPredicate<Obj
|
|||
for (UUID notYouId : you.getInRange()) {
|
||||
if (!notYouId.equals(playerId)) {
|
||||
watcher = (PlayerDamagedBySourceWatcher) game.getState().getWatchers().get("PlayerDamagedBySource",notYouId);
|
||||
if (watcher != null && watcher.damageSources.contains(object.getId())) {
|
||||
return true;
|
||||
if (watcher != null ) {
|
||||
return watcher.hasSourceDoneDamage(object.getId(), game);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -87,8 +87,8 @@ public class DamagedPlayerThisTurnPredicate implements ObjectPlayerPredicate<Obj
|
|||
if (you != null) {
|
||||
for (UUID anyId : you.getInRange()) {
|
||||
watcher = (PlayerDamagedBySourceWatcher) game.getState().getWatchers().get("PlayerDamagedBySource",anyId);
|
||||
if (watcher != null && watcher.damageSources.contains(object.getId())) {
|
||||
return true;
|
||||
if (watcher != null ) {
|
||||
return watcher.hasSourceDoneDamage(object.getId(), game);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,16 +27,16 @@
|
|||
*/
|
||||
package mage.watchers.common;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import mage.constants.WatcherScope;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.game.events.GameEvent.EventType;
|
||||
import mage.util.CardUtil;
|
||||
import mage.watchers.WatcherImpl;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* Watcher stores whitch sources did damage to a player
|
||||
*
|
||||
|
|
@ -44,16 +44,16 @@ import java.util.UUID;
|
|||
*/
|
||||
public class PlayerDamagedBySourceWatcher extends WatcherImpl<PlayerDamagedBySourceWatcher> {
|
||||
|
||||
public List<UUID> damageSources = new ArrayList<UUID>();
|
||||
private Set<String> damageSourceIds = new HashSet<String>();
|
||||
|
||||
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<PlayerDamagedBySou
|
|||
@Override
|
||||
public void watch(GameEvent event, Game game) {
|
||||
if (event.getType() == EventType.DAMAGED_PLAYER) {
|
||||
if (event.getTargetId().equals(controllerId) && !damageSources.contains(event.getSourceId())) {
|
||||
damageSources.add(event.getSourceId());
|
||||
}
|
||||
}
|
||||
if (event.getTargetId().equals(controllerId)) {
|
||||
damageSourceIds.add(CardUtil.getCardZoneString(null, event.getSourceId(), game));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the current object with sourceId has damaged the player during the current turn.
|
||||
* The zoneChangeCounter will be taken into account.
|
||||
*
|
||||
* @param sourceId
|
||||
* @param game
|
||||
* @return
|
||||
*/
|
||||
public boolean hasSourceDoneDamage(UUID sourceId, Game game) {
|
||||
return damageSourceIds.contains(CardUtil.getCardZoneString(null, sourceId, game));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reset() {
|
||||
super.reset();
|
||||
damageSources.clear();
|
||||
damageSourceIds.clear();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue