Puppet
A character, a controller and a camera on a small shadowed map — and a walk driven by the speed the controller actually achieved, not by the key you are holding.
controls
It is already walking. Press anything and it is yours.
- Walk, relative to where the camera is looking W A S D
- Or the arrows, which do the same thing ↑ ← ↓ →
- Swing the camera about the character Q E
- Raise and lower it R F
- Pause and resume Esc
- Fullscreen F11
- Debug overlay F3
- Debug console `
- Pause, fullscreen and the debug overlay keys — unless a control for them is listed above
- Debug console, and its on-screen keyboard the CONSOLE button, once you have touched the canvas
what is actually running
One capsule, swept against the world, sliding along what it hits.
The character is a capsule the size of a person, and every metre it covers goes through one call: a world-space displacement in, and whatever the world left of it out. That call sweeps the capsule rather than moving it and testing afterwards, so it cannot pass through anything at any speed; when it is blocked it collects the planes it hit and slides along them, and where two planes meet it runs the crease between them instead of wedging.
Everything on the map is there to make one of that call's own decisions visible. The green mound is gentle enough to walk up and the red one is not, and the cut between them is a single number — the steepest surface the character will stand on. The blue step is inside the height it will climb without leaving the ground and the orange one is over it, so walking into the first puts the character on top of it and walking into the second stops them dead. Neither is scripted: the same displacement goes into the same call whichever surface is under the capsule.
The slopes are rounded rather than wedges, and that is the physics being honest rather than a style: the engine's colliders are a sphere, an axis-aligned box and an upright capsule, and a sphere cut by the ground is the only real slope that set can make. A flat ramp needs a collider that does not exist yet.
The controller does not know the camera exists. It takes a direction in the world and holds no view, no yaw and no facing at all — so the demo is what turns "forward" into a direction, using the angle the camera happens to be at, and the demo is what turns the body toward wherever it actually ended up going. That is why the character leans into its turns while the camera stays where you left it, and why the same controller would serve a first-person game without a line of it changing.
The sun turns once a minute or so, and that is not decoration either: a shadow that never moves is indistinguishable from a dark patch painted on the ground, and whether the character reads as standing on the map rather than in front of it is the thing this milestone is really for.
The walk runs on the authoritative server, over the same in-memory transport every demo here uses: the keys are sealed into a five-byte move command, the client sends it, and the server decodes it and steps the character on a fixed timestep. The camera is the one thing on the other side of that seam, because it is presentation — the only part of it the simulation is ever told is the one angle above.
console.log, so log lines are queued
inside wasm and drained by the page each frame. crcbl.audio(),
crcbl.saves() and crcbl.logLevel(4) are there too.