52 lines
1.7 KiB
Java
52 lines
1.7 KiB
Java
package games.dmg.spigottyrant;
|
|
|
|
import java.time.Instant;
|
|
import java.util.Optional;
|
|
import java.util.Set;
|
|
import java.util.UUID;
|
|
|
|
public final class RoleRelinquishmentService {
|
|
private final TyrantSuccessionService succession;
|
|
private final RoleMaintenanceService maintenance;
|
|
|
|
public RoleRelinquishmentService(
|
|
TyrantSuccessionService succession,
|
|
RoleMaintenanceService maintenance
|
|
) {
|
|
this.succession = succession;
|
|
this.maintenance = maintenance;
|
|
}
|
|
|
|
public RelinquishmentResult relinquish(
|
|
PersistentState state,
|
|
UUID playerId,
|
|
Set<UUID> onlinePlayerIds,
|
|
Instant now
|
|
) {
|
|
if (state.game().lifecycle() != GameLifecycle.RUNNING) {
|
|
return new RelinquishmentResult(
|
|
new LifecycleState(state.game(), state.players()),
|
|
RelinquishmentStatus.GAME_NOT_RUNNING
|
|
);
|
|
}
|
|
if (state.game().tyrantId().filter(playerId::equals).isPresent()) {
|
|
return new RelinquishmentResult(
|
|
succession.succeed(state, Optional.empty(), onlinePlayerIds, now),
|
|
RelinquishmentStatus.RELINQUISHED
|
|
);
|
|
}
|
|
if (state.game().vigilanteId().filter(playerId::equals).isPresent()) {
|
|
return new RelinquishmentResult(
|
|
maintenance.rerollVigilante(
|
|
state, Optional.of(playerId), onlinePlayerIds, now
|
|
),
|
|
RelinquishmentStatus.RELINQUISHED
|
|
);
|
|
}
|
|
return new RelinquishmentResult(
|
|
new LifecycleState(state.game(), state.players()),
|
|
RelinquishmentStatus.NO_CENTRAL_ROLE
|
|
);
|
|
}
|
|
}
|