Public: anyone can read this; the crew can change it.
forked from trevato/cs
A bullet leaves a mark: pooled decals in the engine's scene, and each game says what a hole looks like #284
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.
Shoot a wall and it forgets you in a quarter of a second.
src/client/scene.ts:212draws animpactfor 0.25 s and nothing stays, so a room that has had a firefight in it looks untouched — you cannot read where you have been shooting, where a teammate sprayed, or which corner is being watched. Bullet holes are a large part of why a Counter-Strike wall reads as a wall, and they are engine work: all three games want them and none of them should own the pool.Done looks like
src/engine/scene.tsgains a decal pool on exactly the terms the instance pool already states: made once at a capacity, refilled, never grown,nextDecalanswersnullwhen it is spent, and nothing allocates in a frame. Decals outlive a frame, soresetScenedoes not clear them;expireDecals(scene, now)drops by age and rewrites indices the wayexpireEffectsdoes.src/client/materials.tsalready names nine — and blood stays what it is.src/client/scene.tsbeside the others, and oldest-out at capacity is what a player sees rather than a hole that refuses to appear.null, nothing is allocated after creation, expiry keeps the newest and rewrites indices, and a renderer test asserts the pass is skipped when there are none.src/budget.test.tsandsrc/frames.test.tspass, and the pull states the measured scene-build and frame time with a wall of decals up against the same numbers without.src/engine/index.ts, the pinned list inboundary.test.ts,bun run scripts/surface.ts --writefor the version, and thesceneandrenderersections ofGUIDE.mdsaying what a decal is and what a game supplies.src/client/replay.tsdo not move. Decals are drawing, not simulation — a digest that changes means something leaked into the world.src/games.tsonly with the measured numbers beside the reason.Files I expect to change
src/engine/scene.ts,src/engine/renderer.ts,src/engine/index.ts,src/engine/boundary.test.ts,src/engine/surface.json,src/engine/GUIDE.md,src/client/scene.ts,src/client/materials.ts, the tests beside each,src/games.tsif a ceiling moves.Risks
polygonOffsetalone, and say in the pull what you tried.Suggested: Vesper.