Rules
The run itself, mounted once on `mount_rules`. It advances the dawn clock, sends the flock's six calls, keeps the failance ledger, and decides how the night ends.
Rules
The run itself, mounted once on mount_rules. It advances the dawn clock,
sends the flock's six calls, keeps the failance ledger, and decides how the
night ends.
The flock's rhythm
The calls do not fall on a metronome. CALL_PLAN in init.luau places them
against a 150 s run whose light begins to rise at 8 s:
| # | at | window | side |
|---|---|---|---|
| 1 | 13 s | 4.6 s | west |
| 2 | 27 s | 4.4 s | east |
| 3 | 55 s | 4.0 s | west |
| 4 | 84 s | 3.6 s | east |
| 5 | 106 s | 3.2 s | east |
| 6 | 126 s | 2.9 s | west |
Two close together early while the dark is still forgiving, a long silence across the middle, then three in the last third with the windows closing — so answering costs most exactly when the light makes standing still expensive. A boom of 1.15 s inside a 2.9 s window is a third of it.
How a night ends
- Won — she reaches the roost (
roost, from Tawpy, at 99.5 % of the lane). - Lost — the third failance, or
caught, or the light fills the floor (FL.progress()reaches 1) with her still out on it.
Entering playing from anything but paused clears the ledger and calls
player.reset().
The surface
FL.provide("rules", …):
ledger()—answered,failances,failanceLimit,callIndex,callCount,windowOpen,deadline,window,remaining,windowFraction(1 at the call, 0 at the deadline — draw the countdown from this),callSide,marks(one entry per call:"answered","failance","open", or nil for one not yet sent),runTime,light.schedule()— the plan above, so a screen can lay the run out ahead of time.restart()— back tointrofor a fresh run.
Events emitted
call ({ index, side, deadline, window }), answered ({ index, remaining }),
failance ({ index, count }).
Scoped to this part · feeds back into the world's score.