forked from External/mage
[LCI] Implement The Millennium Calendar (#11359)
new UNTAPPED_BATCH event.
This commit is contained in:
parent
9ff307cefa
commit
0c485ec593
9 changed files with 319 additions and 6 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
56
Mage/src/main/java/mage/game/events/UntappedBatchEvent.java
Normal file
56
Mage/src/main/java/mage/game/events/UntappedBatchEvent.java
Normal 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);
|
||||
}
|
||||
}
|
||||
16
Mage/src/main/java/mage/game/events/UntappedEvent.java
Normal file
16
Mage/src/main/java/mage/game/events/UntappedEvent.java
Normal 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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue