[CMM] Implement Descendants' Fury (#10700)

* [CMM] Implement Descendants' Fury

* various cleanup

* reset watcher on cleanup, in case of 'end the turn' during combat damage step
This commit is contained in:
Susucre 2023-07-31 01:25:43 +02:00 committed by GitHub
parent 263b01e702
commit a53abeaf40
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 255 additions and 61 deletions

View file

@ -29,7 +29,7 @@ public class TargetControlledPermanent extends TargetPermanent {
super(minNumTargets, maxNumTargets, filter, notTarget);
}
public TargetControlledPermanent(final TargetControlledPermanent target) {
protected TargetControlledPermanent(final TargetControlledPermanent target) {
super(target);
}

View file

@ -0,0 +1,61 @@
package mage.watchers.common;
import mage.MageObjectReference;
import mage.constants.WatcherScope;
import mage.game.Game;
import mage.game.events.DamagedPlayerEvent;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.watchers.Watcher;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author notgreat
*/
public class DamagedPlayerThisCombatWatcher extends Watcher {
// Watch over creatures that dealt combat damage to a player the last damage phase of current combat.
// Gets cleared post combat damage step.
// Player ID -> List of permanents they controlled that dealt damage
private final Map<UUID, List<MageObjectReference>> permanents = new HashMap<>();
// MOR -> Player they dealt damage to
private final Map<MageObjectReference, UUID> damageTarget = new HashMap<>();
public DamagedPlayerThisCombatWatcher() {
super(WatcherScope.GAME);
}
@Override
public void watch(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.COMBAT_DAMAGE_STEP_POST
|| event.getType() == GameEvent.EventType.CLEANUP_STEP_POST) {
permanents.clear();
damageTarget.clear();
return;
}
if (event.getType() != GameEvent.EventType.DAMAGED_PLAYER
|| !((DamagedPlayerEvent) event).isCombatDamage()) {
return;
}
Permanent creature = game.getPermanent(event.getSourceId());
if (creature == null) {
return;
}
MageObjectReference mor = new MageObjectReference(creature, game);
damageTarget.put(mor, event.getPlayerId());
List<MageObjectReference> list = permanents.computeIfAbsent(creature.getControllerId(), (key) -> new ArrayList<>());
list.add(mor);
}
// Return the set of permanents that the controller controlled which dealt combat damage to the player,
// during the very last combat step. (so no first striker on normal combat damage)
// Returns empty set if there were none
public Set<MageObjectReference> getPermanents(UUID controllerID, UUID damagedPlayerID) {
return permanents.getOrDefault(controllerID, Collections.emptyList()).stream()
.filter((mor) -> damagedPlayerID.equals(damageTarget.get(mor)))
.collect(Collectors.toSet());
}
}