From 1668783ba2c87b5fe82e42d8b5ff4795111c1eed Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 20 Jun 2015 19:53:41 +0200 Subject: [PATCH] Added damage done watcher. --- Mage/src/mage/MageObjectReference.java | 6 +- .../common/CardsInOpponentGraveCondition.java | 2 +- .../common/SourceDealtDamageCondition.java | 37 ++++++++++ Mage/src/mage/game/GameImpl.java | 2 + .../watchers/common/DamageDoneWatcher.java | 67 +++++++++++++++++++ 5 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 Mage/src/mage/abilities/condition/common/SourceDealtDamageCondition.java create mode 100644 Mage/src/mage/watchers/common/DamageDoneWatcher.java diff --git a/Mage/src/mage/MageObjectReference.java b/Mage/src/mage/MageObjectReference.java index b406030eb94..8242aff19ad 100644 --- a/Mage/src/mage/MageObjectReference.java +++ b/Mage/src/mage/MageObjectReference.java @@ -69,7 +69,11 @@ public class MageObjectReference implements Comparable, Ser if (mageObject != null) { this.zoneChangeCounter = mageObject.getZoneChangeCounter(game); } else { - throw new IllegalArgumentException("The provided sourceId is not connected to an object in the game"); + if (game.getPlayerList().contains(sourceId)) { + this.zoneChangeCounter = 0; + } else { + throw new IllegalArgumentException("The provided sourceId is not connected to an object in the game"); + } } } diff --git a/Mage/src/mage/abilities/condition/common/CardsInOpponentGraveCondition.java b/Mage/src/mage/abilities/condition/common/CardsInOpponentGraveCondition.java index 6c825961335..1c2d203d2c9 100644 --- a/Mage/src/mage/abilities/condition/common/CardsInOpponentGraveCondition.java +++ b/Mage/src/mage/abilities/condition/common/CardsInOpponentGraveCondition.java @@ -13,7 +13,7 @@ import java.util.UUID; * @author Loki */ public class CardsInOpponentGraveCondition implements Condition { - private int value; + private final int value; public CardsInOpponentGraveCondition(int value) { this.value = value; diff --git a/Mage/src/mage/abilities/condition/common/SourceDealtDamageCondition.java b/Mage/src/mage/abilities/condition/common/SourceDealtDamageCondition.java new file mode 100644 index 00000000000..0a4f7044e12 --- /dev/null +++ b/Mage/src/mage/abilities/condition/common/SourceDealtDamageCondition.java @@ -0,0 +1,37 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package mage.abilities.condition.common; + +import mage.abilities.Ability; +import mage.abilities.condition.Condition; +import mage.game.Game; +import mage.watchers.common.DamageDoneWatcher; + +/** + * + * @author LevelX2 + */ + +public class SourceDealtDamageCondition implements Condition { + private final int value; + + public SourceDealtDamageCondition(int value) { + this.value = value; + } + + @Override + public boolean apply(Game game, Ability source) { + DamageDoneWatcher watcher = (DamageDoneWatcher) game.getState().getWatchers().get("DamageDone"); + return watcher != null && watcher.damageDone(source.getSourceId(), source.getSourceObjectZoneChangeCounter(), game) >= value; + } + + @Override + public String toString() { + return "{this} has dealt " + value + " or more damage this turn" ; + } + + +} \ No newline at end of file diff --git a/Mage/src/mage/game/GameImpl.java b/Mage/src/mage/game/GameImpl.java index 28383956d02..49aa03847d3 100644 --- a/Mage/src/mage/game/GameImpl.java +++ b/Mage/src/mage/game/GameImpl.java @@ -122,6 +122,7 @@ import mage.watchers.Watchers; import mage.watchers.common.BlockedAttackerWatcher; import mage.watchers.common.BloodthirstWatcher; import mage.watchers.common.CastSpellLastTurnWatcher; +import mage.watchers.common.DamageDoneWatcher; import mage.watchers.common.MorbidWatcher; import mage.watchers.common.PlayerDamagedBySourceWatcher; import mage.watchers.common.PlayerLostLifeWatcher; @@ -912,6 +913,7 @@ public abstract class GameImpl implements Game, Serializable { watchers.add(new SoulbondWatcher()); watchers.add(new PlayerLostLifeWatcher()); watchers.add(new BlockedAttackerWatcher()); + watchers.add(new DamageDoneWatcher()); //20100716 - 103.5 for (UUID playerId: state.getPlayerList(startingPlayerId)) { diff --git a/Mage/src/mage/watchers/common/DamageDoneWatcher.java b/Mage/src/mage/watchers/common/DamageDoneWatcher.java new file mode 100644 index 00000000000..df94911ebc6 --- /dev/null +++ b/Mage/src/mage/watchers/common/DamageDoneWatcher.java @@ -0,0 +1,67 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package mage.watchers.common; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import mage.MageObjectReference; +import mage.constants.WatcherScope; +import mage.game.Game; +import mage.game.events.DamageEvent; +import mage.game.events.GameEvent; +import mage.watchers.Watcher; + +/** + * + * @author LevelX2 + */ + +public class DamageDoneWatcher extends Watcher { + + // which object did how much damage during the turn + public Map damagingObjects = new HashMap<>(); + + public DamageDoneWatcher() { + super("DamageDone", WatcherScope.GAME); + } + + public DamageDoneWatcher(final DamageDoneWatcher watcher) { + super(watcher); + this.damagingObjects.putAll(damagingObjects); + } + + @Override + public DamageDoneWatcher copy() { + return new DamageDoneWatcher(this); + } + + @Override + public void watch(GameEvent event, Game game) { + switch(event.getType()) { + case DAMAGED_CREATURE: + case DAMAGED_PLANESWALKER: + case DAMAGED_PLAYER: + { + MageObjectReference mor = new MageObjectReference(event.getSourceId(), game); + int count = damagingObjects.containsKey(mor) ? damagingObjects.get(mor) : 0; + damagingObjects.put(mor, count + event.getAmount()); + } + } + } + + @Override + public void reset() { + super.reset(); + damagingObjects.clear(); + } + + public int damageDone(UUID objectId, int zoneChangeCounter, Game game) { + MageObjectReference mor = new MageObjectReference(objectId, zoneChangeCounter, game); + return damagingObjects.containsKey(mor) ? damagingObjects.get(mor) : 0; + } + +}