[MKM] Implement Kaya, Spirits' Justice and new zone change batch event (#11753)

---------

Co-authored-by: Matthew Wilson <matthew_w@vaadin.com>
This commit is contained in:
Matthew Wilson 2024-02-22 03:55:51 +02:00 committed by GitHub
parent 4ce2e7debe
commit 9bad12e6cd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 406 additions and 0 deletions

View file

@ -952,9 +952,11 @@ public class GameState implements Serializable, Copyable<GameState> {
Map<ZoneChangeData, List<GameEvent>> eventsByKey = new HashMap<>();
List<GameEvent> groupEvents = new LinkedList<>();
ZoneChangeBatchEvent batchEvent = new ZoneChangeBatchEvent();
for (GameEvent event : events) {
if (event instanceof ZoneChangeEvent) {
ZoneChangeEvent castEvent = (ZoneChangeEvent) event;
batchEvent.addEvent(castEvent);
ZoneChangeData key = new ZoneChangeData(
castEvent.getSource(),
castEvent.getSourceId(),
@ -999,6 +1001,9 @@ public class GameState implements Serializable, Copyable<GameState> {
groupEvents.add(event);
}
}
if (!batchEvent.getEvents().isEmpty()) {
groupEvents.add(batchEvent);
}
return groupEvents;
}

View file

@ -73,6 +73,7 @@ public class GameEvent implements Serializable {
*/
ZONE_CHANGE,
ZONE_CHANGE_GROUP,
ZONE_CHANGE_BATCH,
DRAW_CARDS, // event calls for multi draws only (if player draws 2+ cards at once)
DRAW_CARD, DREW_CARD,
EXPLORE, EXPLORED, // targetId is exploring permanent, playerId is its controller

View file

@ -0,0 +1,54 @@
package mage.game.events;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
public class ZoneChangeBatchEvent extends GameEvent implements BatchGameEvent<ZoneChangeEvent> {
private final Set<ZoneChangeEvent> events = new HashSet<>();
public ZoneChangeBatchEvent() {
super(EventType.ZONE_CHANGE_BATCH, null, null, null);
}
@Override
public Set<ZoneChangeEvent> getEvents() {
return events;
}
@Override
public Set<UUID> getTargets() {
return events
.stream()
.map(GameEvent::getTargetId)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
}
@Override
public int getAmount() {
return events
.stream()
.mapToInt(GameEvent::getAmount)
.sum();
}
@Override
@Deprecated // events can store a diff value, so search it from events list instead
public UUID getTargetId() {
throw new IllegalStateException("Wrong code usage. Must search value from a getEvents list or use CardUtil.getEventTargets(event)");
}
@Override
@Deprecated // events can store a diff value, so search it from events list instead
public UUID getSourceId() {
throw new IllegalStateException("Wrong code usage. Must search value from a getEvents list.");
}
public void addEvent(ZoneChangeEvent event) {
this.events.add(event);
}
}