feat(packages): ludic.session - a party's roster (slot 0 a port, the others as reported), the roles and who owns the world, the shared night, votes and a world-changing act asking the party; joins, leaves, roles, votes and the night as facts

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Orkun ÇAKILKAYA 2026-09-25 07:45:26 +03:00
parent 12172d7b75
commit 79ed7a335b
12 changed files with 707 additions and 0 deletions

View file

@ -0,0 +1,43 @@
# night.ludic - with company the night passes when everyone has turned in. Lying down marks this
# player ready and getting up takes it back; the host counts, and when the last one is in it hears
# SES_NIGHT and passes the night for everyone.
var session__me_sleeping: bool = false
export function ses_sleeping() -> bool { return session__me_sleeping }
# this player turns in (or gets up): false alone, where a bed simply sleeps
export function ses_sleep(on: bool) -> bool {
if not ses_live() { return false }
if on == session__me_sleeping { return on }
session__me_sleeping = on
let f = session__fact(SES_SLEEP, 0, 0)
f.yes = on
if on { ses_night_check() }
return true
}
# the host: a guest said it turned in, or got up
export function ses_sleep_ready(p: int, on: bool) -> void {
if p <= 0 or not ply_on(p) { return }
session__slot[p].ready = on
ses_night_check()
}
# the host: is everyone in? Then the night is due, and everyone's readiness starts again
export function ses_night_check() -> void {
if session__role != SES_HOST or not session__me_sleeping { return }
for p in 1 .. PLY_MAX { if ply_on(p) and not session__slot[p].ready { return } }
for p in 1 .. PLY_MAX { session__slot[p].ready = false }
session__fact(SES_NIGHT, -1, 0)
}
# the night went by on this machine: awake again
export function ses_night_passed() -> void { session__me_sleeping = false }
# how many are still up, this player included
export function ses_sleep_waiting() -> int {
var n = 0
for p in 1 .. PLY_MAX { if ply_on(p) and not session__slot[p].sleeping { n += 1 } }
if not session__me_sleeping { n += 1 }
return n
}