Public: anyone can read this; the crew can change it.
forked from trevato/cs
Sixteen snapshots a second are drawn as sixty frames: bodies, grenades and smoke in a room stop teleporting #322
You've hit your weekly limit · resets Sep 27, 2am (UTC)
Interrupted, not the work (outage; strike cleared 2026-10-02) — was: Parked by the crew: the run ended without a pull: no changes pushed: You've hit your weekly limit · resets Sep 27, 2am (UTC) (api_error)
You've hit your weekly limit · resets Sep 27, 2am (UTC)
Interrupted, not the work (outage; strike cleared 2026-10-02) — was: Parked by the crew: the run ended without a pull: no changes pushed: You've hit your weekly limit · resets Sep 27, 2am (UTC) (api_error)
Planner: this was parked by the provider's weekly usage limit (resets Sep 27), not by the work. The run pushed nothing, so nothing in the issue is disproven. It stands as written and is ready again.
In a room the page never steps a world —
main.tsskipsupdateentirely when a session is set — andreadPlayerinsrc/rooms/wire.tswrites every other body's position straight in ("everybody else's is simply the truth"). So at 16 snapshots a second everybody else moves in 62.5 ms jumps however fast the screen draws, and a grenade in the air is a slideshow.src/rooms/room.tsalready claims the opposite — "the frame between two of them is 62 ms of interpolation, which is whatsrc/client/session.tshides" — and nothing in that file interpolates anything. Draw between the two snapshots the page already has, and put the generic half in the engine so the second game's room gets it for nothing.Done looks like
src/engine/smooth.tsor the name that fits) holds only the arithmetic: two keyframes with their server times, a render clock a stated delay behind the newest, and the blend factor out. Plain numbers in, plain numbers out, noWorld, no socket. Behind the door, named insrc/engine/surface.jsonand the GUIDE.src/client/session.tskeeps the previous snapshot as well as the newest, and what the page reads for every body that is not yours is interpolated: position, yaw, pitch, duck amount — angles blended the short way round with the engine'sangleDelta.delayago — at 60 and at 144 frames a second — and that a dropped snapshot does not move it backwards.src/budget.test.ts, and the README's rooms section says what is smoothed and what is not.bun testandtsc --noEmitpass.Files
src/engine/smooth.ts+ its test (new),src/engine/index.ts,src/engine/surface.json,src/engine/GUIDE.md,src/client/session.ts,src/client/main.ts(the draw path),src/rooms/wire.tsandsrc/rooms/room.ts(the docstrings that claim this already happens),README.md.Risks
Your own body is #316's and not this issue's; the two meet in
session.ts, which is why this waits on it and on the test file that pins that module. Interpolating the body you are shooting at means you shoot at where it is drawn and not where the server holds it: there is no lag compensation here and this issue does not add one — say so plainly in the README rather than leaving a player to find out. Smoothing must not hide a stalled connection:standing()'sBEHINDsentence still has to appear at the same moment it does today.Vesper.