[LCI] Implement The Millennium Calendar (#11359)

new UNTAPPED_BATCH event.
This commit is contained in:
Susucre 2023-10-29 12:43:24 +01:00 committed by GitHub
parent 9ff307cefa
commit 0c485ec593
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 319 additions and 6 deletions

View file

@ -880,6 +880,27 @@ public class GameState implements Serializable, Copyable<GameState> {
}
}
public void addSimultaneousUntapped(UntappedEvent untappedEvent, Game game) {
// Combine multiple untapped events in the single event (batch)
boolean isUntappedBatchUsed = false;
for (GameEvent event : simultaneousEvents) {
if (event instanceof UntappedBatchEvent) {
// Adding to the existing batch
((UntappedBatchEvent) event).addEvent(untappedEvent);
isUntappedBatchUsed = true;
break;
}
}
// new batch
if (!isUntappedBatchUsed) {
UntappedBatchEvent batch = new UntappedBatchEvent();
batch.addEvent(untappedEvent);
addSimultaneousEvent(batch, game);
}
}
public void handleEvent(GameEvent event, Game game) {
watchers.watch(event, game);
delayed.checkTriggers(event, game);

View file

@ -360,8 +360,19 @@ public class GameEvent implements Serializable {
combine all TAPPED events occuring at the same time in a single event
*/
TAPPED_BATCH,
UNTAP, UNTAPPED,
UNTAP,
/* UNTAPPED,
targetId untapped permanent
sourceId not used for this event // TODO: add source for untap?
playerId controller of permanent // TODO: replace by source controller of untap? need to check every usage if so.
amount not used for this event
flag true if untapped during untap step (event is checked at upkeep so can't trust the current Phase)
*/
UNTAPPED,
/* UNTAPPED_BATCH
combine all UNTAPPED events occuring at the same time in a single event
*/
UNTAPPED_BATCH,
FLIP, FLIPPED,
TRANSFORMING, TRANSFORMED,
ADAPT,

View file

@ -0,0 +1,56 @@
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;
/**
* @author Susucr
*/
public class UntappedBatchEvent extends GameEvent implements BatchGameEvent<UntappedEvent> {
private final Set<UntappedEvent> events = new HashSet<>();
public UntappedBatchEvent() {
super(EventType.UNTAPPED_BATCH, null, null, null);
}
@Override
public Set<UntappedEvent> 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(UntappedEvent event) {
this.events.add(event);
}
}

View file

@ -0,0 +1,16 @@
package mage.game.events;
import java.util.UUID;
/**
* @author Susucr
*/
public class UntappedEvent extends GameEvent {
public UntappedEvent(UUID targetId, UUID playerId, boolean duringUntapPhase) {
super(EventType.UNTAPPED, targetId, null, playerId, 0, duringUntapPhase);
}
public boolean isAnUntapStepEvent() {
return this.flag;
}
}

View file

@ -545,7 +545,14 @@ public abstract class PermanentImpl extends CardImpl implements Permanent {
//20091005 - 701.15b
if (tapped && !replaceEvent(EventType.UNTAP, game)) {
this.tapped = false;
fireEvent(EventType.UNTAPPED, game);
UntappedEvent event = new UntappedEvent(
objectId, this.controllerId,
// Since triggers are not checked until the next step,
// we use the event flag to know if untapping was done during the untap step
game.getTurnStepType() == PhaseStep.UNTAP
);
game.fireEvent(event);
game.getState().addSimultaneousUntapped(event, game);
return true;
}
return false;