/* * 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 mage.MageObjectReference; import mage.constants.WatcherScope; import mage.game.Game; import mage.game.events.GameEvent; import mage.watchers.Watcher; import java.util.HashMap; import java.util.Map; import java.util.UUID; /** * @author LevelX2 */ public class DamageDoneWatcher extends Watcher { // which object did how much damage during the turn public final Map<MageObjectReference, Integer> damagingObjects; // which object received how much damage during the turn public final Map<MageObjectReference, Integer> damagedObjects; public DamageDoneWatcher() { super(DamageDoneWatcher.class.getSimpleName(), WatcherScope.GAME); this.damagingObjects = new HashMap<>(); this.damagedObjects = new HashMap<>(); } public DamageDoneWatcher(final DamageDoneWatcher watcher) { super(watcher); this.damagingObjects = new HashMap<>(watcher.damagingObjects); this.damagedObjects = new HashMap<>(watcher.damagedObjects); } @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 damageSourceRef = new MageObjectReference(event.getSourceId(), game); damagingObjects.putIfAbsent(damageSourceRef, 0); damagingObjects.compute(damageSourceRef, (k, damage) -> damage + event.getAmount()); MageObjectReference damageTargetRef = new MageObjectReference(event.getTargetId(), game); damagedObjects.putIfAbsent(damageTargetRef, 0); damagedObjects.compute(damageTargetRef, (k, damage) -> damage + event.getAmount()); } } } @Override public void reset() { super.reset(); damagingObjects.clear(); damagedObjects.clear(); } public int damageDoneBy(UUID objectId, int zoneChangeCounter, Game game) { MageObjectReference mor = new MageObjectReference(objectId, zoneChangeCounter, game); return damagingObjects.getOrDefault(mor, 0); } public int damageDoneTo(UUID objectId, int zoneChangeCounter, Game game) { MageObjectReference mor = new MageObjectReference(objectId, zoneChangeCounter, game); return damagedObjects.getOrDefault(mor, 0); } public boolean isDamaged(UUID objectId, int zoneChangeCounter, Game game) { MageObjectReference mor = new MageObjectReference(objectId, zoneChangeCounter, game); return damagedObjects.containsKey(mor); } }