foul-magics/Mage/src/main/java/mage/watchers/common/ProwlWatcher.java
Evan Kranzler dacf30f4b9
Refactoring subtypes to make Maskwood Nexus work (ready for review) (#7432)
* removed and renamed SubTypeList

* updated subtype test

* refactored Changeling to be an ability that actually does something

* moved isAllCreatureTypes into SubTypes class

* renamed copyTo method to copyFrom

* added removeAllCreatureTypes where usable

* replaced some subtype methods

* replaced some more subtype methods

* replaced subtype mass add/remove methods

* updated more subtype methods

* fixed some errors

* made common shared creature type predicate

* refactored another card involving subtypes

* Added usage of object attribute in subTypes's write operations;

* Refactor: use same param styles in subtype methods

* Refactor: simplified usage of copy appliers;

* Refactor: fixed code usage in CopyApplier

Co-authored-by: Oleg Agafonov <jaydi85@gmail.com>
2021-01-26 08:52:35 -05:00

72 lines
2.1 KiB
Java

package mage.watchers.common;
import mage.cards.Card;
import mage.constants.SubType;
import mage.constants.SubTypeSet;
import mage.constants.WatcherScope;
import mage.game.Game;
import mage.game.events.DamagedPlayerEvent;
import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
import mage.game.permanent.Permanent;
import mage.watchers.Watcher;
import java.util.*;
/**
* Watcher stores with which creature subtypes a player made combat damage to
* other players during a turn.
*
* @author LevelX
*/
public class ProwlWatcher extends Watcher {
private final Map<UUID, Set<SubType>> damagingSubtypes = new HashMap<>();
private final Set<UUID> allSubtypes = new HashSet<>();
public ProwlWatcher() {
super(WatcherScope.GAME);
}
@Override
public void watch(GameEvent event, Game game) {
if (event.getType() != EventType.DAMAGED_PLAYER) {
return;
}
DamagedPlayerEvent dEvent = (DamagedPlayerEvent) event;
if (!dEvent.isCombatDamage()) {
return;
}
Permanent creature = game.getPermanent(dEvent.getSourceId());
if (creature == null || allSubtypes.contains(creature.getControllerId())) {
return;
}
if (creature.isAllCreatureTypes(game)) {
allSubtypes.add(creature.getControllerId());
return;
}
damagingSubtypes
.computeIfAbsent(creature.getControllerId(), m -> new LinkedHashSet<>())
.addAll(creature.getSubtype(game));
}
@Override
public void reset() {
super.reset();
damagingSubtypes.clear();
allSubtypes.clear();
}
public boolean hasSubtypeMadeCombatDamage(UUID playerId, Card card, Game game) {
if (allSubtypes.contains(playerId)) {
return true;
}
Set<SubType> subtypes = damagingSubtypes.get(playerId);
return subtypes != null
&& subtypes
.stream()
.filter(subType -> subType.getSubTypeSet() == SubTypeSet.CreatureType)
.anyMatch(subType -> card.hasSubtype(subType, game));
}
}