Public: anyone can read this; the crew can change it.
forked from trevato/cs
Take updates from trevato/cs #396
Check · Review · Land · Live done — Landed and live in production.
This merges trevato/cs `main` (7513f8b, staged at `refs/following/main`) in three commits. `bun run test` passes: typecheck plus 1652 tests. The app boots and `/` answers 200 in about 9 ms.
shipped production is serving it deploy ae07c2d
Sign in to join this conversation.
This merges trevato/cs
main(7513f8b, staged atrefs/following/main) in three commits.bun run testpasses: typecheck plus 1652 tests. The app boots and/answers 200 in about 9 ms.c604121): every conflicted file keeps this repository's version, so its tree matchesmainexactly.- Earlier syncs were squashed, so git still merges from 0644e74 and replays upstream #188–#236 as 41 conflicts. - This repository already has all of those in its own form, the last through #393. - Only upstream #237, #238 and #239 are new.
Per file (merge commit):
README.md,src/client/{bots,hud,main,map,motion,report,summary,weapons,world}.tsand their tests,combat.test.ts,spectate.test.ts,src/db.ts,db.test.ts,src/pages/game.ts,game.test.ts,src/server.ts,server.test.tsandsrc/rl/arena.test.ts. Upstream's text in these files predates the engine being pulled out, and its changes up to #236 are already here.src/client/{bodies,earshot,input,physics,plan,renderer,settings}.ts, their tests,saved.test.tsandsrc/readme.test.ts: they stay deleted. Their work lives insrc/engine/(controls,renderer,physics) andsrc/plan/, as earlier syncs decided.zoom.tsandzoom.test.tsstay out.look.tsalready handles scoped sensitivity.src/client/match.tsandsrc/rl/arena.tsare dropped, as in #379–#393. This repository has no settings store for them to serve.src/escape.tsstays out.summary.tsdeliberately keeps its ownescapeHtml, because a browser bundle may not import the server's page code. The page and the final board already escape every name.recorder.test-helper.ts,reportPanel.test.ts) stays out. It only adds tests for upstream'sreportPanel.ts, which this repository doesn't have. The shared recording context it creates already exists here aspaint.test-helper.ts.#238, ported:
src/client/world.ts:FeedEntrygainskillerHealth, the killer's health at the moment of the kill. It isnullfor a death nobody else caused (a fall, your own grenade).src/rooms/wire.ts,room.ts: a room's log carries the value.- Incoming, it is validated as a finite number or
null, then rounded and clamped to 0–100. - A missing or non-numeric value is refused.src/client/hud.ts: this repository never had upstream's "X killed you with Y" line, so the port adds it asdeathLine: who killed you, with what, "headshot", and "N hp left".- It is drawn above the "Watching …" panel, or under "You are dead" when there is nobody left to watch. - A fall reads "You fell too far". Your own grenade reads "You killed yourself with HE Grenade" and gives no health. - The feed is matched by name, which is this repository's design: a room keeps names unique.
-
world.test.ts: the health is kept at the kill and doesn't change if the killer is hurt later, and a fall givesnull. -hud.test.ts: the notice's text, colour and position, and that it is absent while alive and at match over. Fall and grenade deaths say how and give no health. -wire.test.ts: validation and clamping. -room.test.ts:logSincecarries the value. -session.test.tsfixtures gain the field.#237, ported where missing:
scoreLines(the ranking the Tab board uses) and escaped.#sumboardnow scrolls insidemax-height:min(40vh,17rem), so on a phone held sideways Play again stays on screen.game.test.tschecks the rule and the README says it.rankPlayers,finalBoardandfinalBoardHtmlare not ported, becausescoreLinesandboardHtmlalready do that job.To try it: in the preview, die to a bot. The line above the spectator panel names the bot, the gun, and how much health it had left. Finish a match on a phone held sideways: the board scrolls and the buttons stay visible.
Closes #394
🤖 Generated with Claude Code
Closes #394