forked from External/mage
refactor: improved damaged batch events, added todo to fix (related to #10870)
This commit is contained in:
parent
d056f81ecc
commit
316e0dc1f3
27 changed files with 138 additions and 125 deletions
|
|
@ -4,9 +4,7 @@ import mage.abilities.TriggeredAbilityImpl;
|
|||
import mage.abilities.effects.Effect;
|
||||
import mage.constants.Zone;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.DamagedEvent;
|
||||
import mage.game.events.DamagedPlayerBatchEvent;
|
||||
import mage.game.events.DamagedPlayerEvent;
|
||||
import mage.game.events.DamagedBatchForPlayersEvent;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.target.targetpointer.FixedTarget;
|
||||
|
||||
|
|
@ -65,12 +63,12 @@ public class CombatDamageDealtToYouTriggeredAbility extends TriggeredAbilityImpl
|
|||
|
||||
@Override
|
||||
public boolean checkEventType(GameEvent event, Game game) {
|
||||
return event.getType() == GameEvent.EventType.DAMAGED_PLAYER_BATCH;
|
||||
return event.getType() == GameEvent.EventType.DAMAGED_BATCH_FOR_PLAYERS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
DamagedPlayerBatchEvent damageEvent = (DamagedPlayerBatchEvent) event;
|
||||
DamagedBatchForPlayersEvent damageEvent = (DamagedBatchForPlayersEvent) event;
|
||||
boolean check = damageEvent.getEvents()
|
||||
.stream()
|
||||
.anyMatch(c -> c.isCombatDamage() && c.getPlayerId() == this.controllerId);
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ public class DealCombatDamageControlledTriggeredAbility extends TriggeredAbility
|
|||
|
||||
@Override
|
||||
public boolean checkEventType(GameEvent event, Game game) {
|
||||
return event.getType() == GameEvent.EventType.DAMAGED_PLAYER_BATCH_ONE_PLAYER;
|
||||
return event.getType() == GameEvent.EventType.DAMAGED_BATCH_FOR_ONE_PLAYER;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import mage.abilities.effects.Effect;
|
|||
import mage.constants.AbilityWord;
|
||||
import mage.constants.Zone;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.DamagedPermanentBatchEvent;
|
||||
import mage.game.events.DamagedBatchForPermanentsEvent;
|
||||
import mage.game.events.GameEvent;
|
||||
|
||||
/**
|
||||
|
|
@ -36,12 +36,12 @@ public class DealtDamageToSourceTriggeredAbility extends TriggeredAbilityImpl {
|
|||
|
||||
@Override
|
||||
public boolean checkEventType(GameEvent event, Game game) {
|
||||
return event.getType() == GameEvent.EventType.DAMAGED_PERMANENT_BATCH;
|
||||
return event.getType() == GameEvent.EventType.DAMAGED_BATCH_FOR_PERMANENTS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
DamagedPermanentBatchEvent dEvent = (DamagedPermanentBatchEvent) event;
|
||||
DamagedBatchForPermanentsEvent dEvent = (DamagedBatchForPermanentsEvent) event;
|
||||
int damage = dEvent
|
||||
.getEvents()
|
||||
.stream()
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ import mage.constants.Zone;
|
|||
import mage.game.Controllable;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.DamagedEvent;
|
||||
import mage.game.events.DamagedPlayerBatchEvent;
|
||||
import mage.game.events.DamagedBatchForPlayersEvent;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.target.targetpointer.FixedTarget;
|
||||
|
||||
|
|
@ -57,12 +57,12 @@ class InitiativeDamageTriggeredAbility extends TriggeredAbilityImpl {
|
|||
|
||||
@Override
|
||||
public boolean checkEventType(GameEvent event, Game game) {
|
||||
return event.getType() == GameEvent.EventType.DAMAGED_PLAYER_BATCH;
|
||||
return event.getType() == GameEvent.EventType.DAMAGED_BATCH_FOR_PLAYERS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
DamagedPlayerBatchEvent dEvent = (DamagedPlayerBatchEvent) event;
|
||||
DamagedBatchForPlayersEvent dEvent = (DamagedBatchForPlayersEvent) event;
|
||||
UUID playerId = dEvent
|
||||
.getEvents()
|
||||
.stream()
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
package mage.game;
|
||||
|
||||
import static java.util.Collections.emptyList;
|
||||
import mage.MageObject;
|
||||
import mage.MageObjectReference;
|
||||
import mage.abilities.*;
|
||||
|
|
@ -45,6 +44,8 @@ import java.util.*;
|
|||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static java.util.Collections.emptyList;
|
||||
|
||||
/**
|
||||
* @author BetaSteward_at_googlemail.com
|
||||
* <p>
|
||||
|
|
@ -816,53 +817,44 @@ public class GameState implements Serializable, Copyable<GameState> {
|
|||
}
|
||||
|
||||
public void addSimultaneousDamage(DamagedEvent damagedEvent, Game game) {
|
||||
// This method does look for Batch Event in simultaneousEvents to batch
|
||||
// damagedEvent with. For each kind of batch, either there is a batch
|
||||
// of the proper class fitting the damagedEvent, or there is not.
|
||||
// Combine multiple damage events in the single event (batch)
|
||||
// * per damage type (see GameEvent.DAMAGED_BATCH_FOR_PERMANENTS, GameEvent.DAMAGED_BATCH_FOR_PLAYERS)
|
||||
// * per player (see GameEvent.DAMAGED_BATCH_FOR_ONE_PLAYER)
|
||||
//
|
||||
// If there is not one of the batched event (i.e. if the respective flag is
|
||||
// at false after the loop), then a batched event is created for future
|
||||
// events to be batched with.
|
||||
// Warning, one event can be stored in multiple batches,
|
||||
// example: DAMAGED_BATCH_FOR_PLAYERS + DAMAGED_BATCH_FOR_ONE_PLAYER
|
||||
|
||||
// All damage from any source to anything
|
||||
// the batch is of class DamagedBatchEvent
|
||||
boolean flagBatchAll = false;
|
||||
|
||||
// All damage from any source to a specific player (damagedEvent.getPlayerId())
|
||||
// the batch is of class DamagedPlayerBatchOnePlayerEvent
|
||||
boolean flagBatchForPlayer = false;
|
||||
boolean isPlayerDamage = damagedEvent instanceof DamagedPlayerEvent;
|
||||
|
||||
// existing batch
|
||||
boolean isDamageBatchUsed = false;
|
||||
boolean isPlayerBatchUsed = false;
|
||||
for (GameEvent event : simultaneousEvents) {
|
||||
|
||||
// per damage type
|
||||
if ((event instanceof DamagedBatchEvent)
|
||||
&& ((DamagedBatchEvent) event).getDamageClazz().isInstance(damagedEvent)) {
|
||||
|
||||
// existing batch for damage of that damage class.
|
||||
((DamagedBatchEvent) event).addEvent(damagedEvent);
|
||||
flagBatchAll = true;
|
||||
isDamageBatchUsed = true;
|
||||
}
|
||||
|
||||
if (event instanceof DamagedPlayerBatchOnePlayerEvent) {
|
||||
DamagedPlayerBatchOnePlayerEvent eventForPlayer = (DamagedPlayerBatchOnePlayerEvent) event;
|
||||
if (eventForPlayer.getDamageClazz().isInstance(damagedEvent)
|
||||
// per player
|
||||
if (isPlayerDamage && event instanceof DamagedBatchForOnePlayerEvent) {
|
||||
DamagedBatchForOnePlayerEvent oldPlayerBatch = (DamagedBatchForOnePlayerEvent) event;
|
||||
if (oldPlayerBatch.getDamageClazz().isInstance(damagedEvent)
|
||||
&& event.getPlayerId().equals(damagedEvent.getTargetId())) {
|
||||
|
||||
// existing batch for damage of that damage class to the same player
|
||||
eventForPlayer.addEvent(damagedEvent);
|
||||
flagBatchForPlayer = true;
|
||||
oldPlayerBatch.addEvent(damagedEvent);
|
||||
isPlayerBatchUsed = true;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (!flagBatchAll) {
|
||||
// new batch for any kind of damage, creating a fresh one with damagedEvent inside.
|
||||
// new batch
|
||||
if (!isDamageBatchUsed) {
|
||||
addSimultaneousEvent(DamagedBatchEvent.makeEvent(damagedEvent), game);
|
||||
}
|
||||
if (!flagBatchForPlayer && damagedEvent.getPlayerId() != null && damagedEvent.getPlayerId().equals(damagedEvent.getTargetId())) {
|
||||
// new batch for damage from any source to the specific damaged player,
|
||||
// creating a fresh one with damagedEvent inside.
|
||||
DamagedBatchEvent event = new DamagedPlayerBatchOnePlayerEvent(damagedEvent.getPlayerId());
|
||||
if (!isPlayerBatchUsed && isPlayerDamage) {
|
||||
DamagedBatchEvent event = new DamagedBatchForOnePlayerEvent(damagedEvent.getTargetId());
|
||||
event.addEvent(damagedEvent);
|
||||
addSimultaneousEvent(event, game);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import java.util.HashSet;
|
|||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
|
|
@ -30,8 +31,19 @@ public abstract class DamagedBatchEvent extends GameEvent {
|
|||
.sum();
|
||||
}
|
||||
|
||||
public Set<UUID> getTargetIds() {
|
||||
return events
|
||||
.stream()
|
||||
.map(GameEvent::getTargetId)
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
@Override
|
||||
@Deprecated // events can store a diff value, so search it from events list instead
|
||||
public UUID getTargetId() {
|
||||
// TODO: replace it by getTargetIds or seearch in getEvents, enable exception
|
||||
//throw new IllegalStateException("Wrong code usage. Must search batch value from a list");
|
||||
return events
|
||||
.stream()
|
||||
.map(GameEvent::getTargetId)
|
||||
|
|
@ -40,8 +52,19 @@ public abstract class DamagedBatchEvent extends GameEvent {
|
|||
.orElse(null);
|
||||
}
|
||||
|
||||
public Set<UUID> getSourceIds() {
|
||||
return events
|
||||
.stream()
|
||||
.map(GameEvent::getSourceId)
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
@Override
|
||||
@Deprecated // events can store a diff value, so search it from events list instead
|
||||
public UUID getSourceId() {
|
||||
// TODO: replace it by getSourceIds or seearch in getEvents, enable exception
|
||||
//throw new IllegalStateException("Wrong code usage. Must search batch value from a list");
|
||||
return events
|
||||
.stream()
|
||||
.map(GameEvent::getSourceId)
|
||||
|
|
@ -61,10 +84,10 @@ public abstract class DamagedBatchEvent extends GameEvent {
|
|||
public static DamagedBatchEvent makeEvent(DamagedEvent damagedEvent) {
|
||||
DamagedBatchEvent event;
|
||||
if (damagedEvent instanceof DamagedPlayerEvent) {
|
||||
event = new DamagedPlayerBatchEvent();
|
||||
event = new DamagedBatchForPlayersEvent();
|
||||
event.addEvent(damagedEvent);
|
||||
} else if (damagedEvent instanceof DamagedPermanentEvent) {
|
||||
event = new DamagedPermanentBatchEvent();
|
||||
event = new DamagedBatchForPermanentsEvent();
|
||||
event.addEvent(damagedEvent);
|
||||
} else {
|
||||
event = null;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,14 @@
|
|||
package mage.game.events;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author Susucr
|
||||
*/
|
||||
public class DamagedBatchForOnePlayerEvent extends DamagedBatchEvent {
|
||||
|
||||
public DamagedBatchForOnePlayerEvent(UUID playerId) {
|
||||
super(EventType.DAMAGED_BATCH_FOR_ONE_PLAYER, DamagedPlayerEvent.class);
|
||||
this.setPlayerId(playerId);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
package mage.game.events;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public class DamagedBatchForPermanentsEvent extends DamagedBatchEvent {
|
||||
|
||||
public DamagedBatchForPermanentsEvent() {
|
||||
super(EventType.DAMAGED_BATCH_FOR_PERMANENTS, DamagedPermanentEvent.class);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
package mage.game.events;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public class DamagedBatchForPlayersEvent extends DamagedBatchEvent {
|
||||
|
||||
public DamagedBatchForPlayersEvent() {
|
||||
super(GameEvent.EventType.DAMAGED_BATCH_FOR_PLAYERS, DamagedPlayerEvent.class);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
package mage.game.events;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public class DamagedPermanentBatchEvent extends DamagedBatchEvent {
|
||||
|
||||
public DamagedPermanentBatchEvent() {
|
||||
super(EventType.DAMAGED_PERMANENT_BATCH, DamagedPermanentEvent.class);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
package mage.game.events;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public class DamagedPlayerBatchEvent extends DamagedBatchEvent {
|
||||
|
||||
public DamagedPlayerBatchEvent() {
|
||||
super(GameEvent.EventType.DAMAGED_PLAYER_BATCH, DamagedPlayerEvent.class);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
package mage.game.events;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author Susucr
|
||||
*/
|
||||
public class DamagedPlayerBatchOnePlayerEvent extends DamagedBatchEvent {
|
||||
|
||||
public DamagedPlayerBatchOnePlayerEvent(UUID playerId) {
|
||||
super(EventType.DAMAGED_PLAYER_BATCH_ONE_PLAYER, DamagedPlayerEvent.class);
|
||||
this.setPlayerId(playerId);
|
||||
}
|
||||
}
|
||||
|
|
@ -118,15 +118,16 @@ public class GameEvent implements Serializable {
|
|||
*/
|
||||
DAMAGED_PLAYER,
|
||||
|
||||
/* DAMAGED_PLAYER_BATCH
|
||||
combines all player damaged events in one single event
|
||||
/* DAMAGED_BATCH_FOR_PLAYERS,
|
||||
combines all player damage events to a single batch (event)
|
||||
*/
|
||||
DAMAGED_PLAYER_BATCH,
|
||||
DAMAGED_BATCH_FOR_PLAYERS,
|
||||
|
||||
/* DAMAGED_PLAYER_BATCH_ONE_PLAYER
|
||||
combines all player damaged events for a single player in one single event
|
||||
/* DAMAGED_BATCH_FOR_ONE_PLAYER
|
||||
combines all player damage events to a single batch (event) and split it per damaged player
|
||||
playerId the id of the damaged player
|
||||
*/
|
||||
DAMAGED_PLAYER_BATCH_ONE_PLAYER,
|
||||
DAMAGED_BATCH_FOR_ONE_PLAYER,
|
||||
|
||||
/* DAMAGE_CAUSES_LIFE_LOSS,
|
||||
targetId the id of the damaged player
|
||||
|
|
@ -406,10 +407,10 @@ public class GameEvent implements Serializable {
|
|||
DAMAGE_PERMANENT,
|
||||
DAMAGED_PERMANENT,
|
||||
|
||||
/* DAMAGED_PERMANENT_BATCH
|
||||
combine all permanent damage events to single event
|
||||
/* DAMAGED_BATCH_FOR_PERMANENTS
|
||||
combine all permanent damage events to a single batch (event)
|
||||
*/
|
||||
DAMAGED_PERMANENT_BATCH,
|
||||
DAMAGED_BATCH_FOR_PERMANENTS,
|
||||
|
||||
DESTROY_PERMANENT,
|
||||
/* DESTROY_PERMANENT_BY_LEGENDARY_RULE
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue