Behind the Game

Frame data across a memory wipe

"A 3D hand to hand combat in the spirit and vein of street fighter mortal combat tekken etc" — the most ambitious brief in the thread, and the first time the studio reached for a third dimension.

The doctrine says no downloads, so Three.js came to the game: r128 bundled locally as a single file, chosen deliberately as the classic global build that works even over file://. The fighters are humanoids assembled from primitive boxes, spheres and cylinders parented into a joint hierarchy — pelvis to torso to shoulders to forearms — with poses as per-joint Euler targets and animation as interpolation between them. No rigs, no skinning, no assets: twenty-one scene objects per fighter, articulated enough to jab, sweep, and fall over convincingly.

Two geometric fighters frozen at the instant of impact.
Cover art generated from the build record.

Under the geometry sits an orthodox fighting game, specified by an R&D department (Opus) that returned real frame data: startup, active and recovery windows per move, hitboxes alive only during active frames, hitstop freezing both fighters on contact, height-checked blocking where lows beat standing guard, best-of-three rounds with KO slow-motion. Specials parse motion inputs from a buffered history — quarter-circle-forward plus punch for the fireball, the dragon-punch motion for the rising uppercut. The Audio department (Sonnet) delivered eleven procedural methods, with hit(power) singled out in its brief as "the money sound."

Mid-build, the session ran out of context and compacted — the conversation was summarized and the AI effectively rebooted inside its own task. The transcript resumes with audio integration continuing as if nothing happened, because everything load-bearing lived outside the context window: the doctrine in memory files, the R&D reference on disk, the code in the folder. The build's continuity was an artifact property, not a memory property.

QA interrogated the mechanics directly: blocks chip exactly 1 damage and apply blockstun; clean hits stagger; lows correctly beat standing block; the fireball travels and connects for −8. Two "failures" turned out to be test artifacts — the AI opponent overwriting a manually posed defender, and a round-end timer that can't fire inside a synchronous test loop — both diagnosed as such rather than "fixed," which is its own kind of discipline.

The ending belongs to the operations story. Asked "what about the drupal live site?", the session treated its own nine-day-old memory as stale and checked reality — and found the property had already synced the fighter, CI had already built it, and the live site was already serving it. The final verification hashed all three copies: the local build, the property's copy, and the bytes coming off the public URL. Identical. The first WebGL game in the cabinet went out the door mathematically indistinguishable from the one on the workbench.

Built 2026-07-22/23: one prompt, one bundled engine, one mid-build memory wipe survived, and a byte-exact handshake between workbench and world.