Phaser Lab piece 02 · verified playthrough, desktop + mobile

Bighorn Bluff

High on an alpine plateau, a pink salt lick crowns the summit — and every bighorn ram on the mountain wants it. Hold your ground, wind up, and RAM: clashes trade real momentum, losers stagger, and the bluff has edges. A complete top-down knockback arena authored end-to-end by AI agents in Phaser 3, built feel-first: the charge curve, the clash physics and the camera's response to impact were all tuned and measured on gray shapes before a single sprite existed.

Play it now

Arrows / WASD to move · hold Space, release to RAM · touch joystick + RAM button on phones · ~8 MB · M sound · P pause

▶  Play

Concept as contract

The piece was concepted first — an aerial plateau arena with a worn dirt ring, a low-poly bighorn hero, a props sheet and a head-on clash action board set the palette: saturated meadow greens, granite gray, one pink crystal. Every named element in those sheets was authored as a real asset, and every audit round compared the build against them. The rival rams wear a russet coat re-rendered from a second authored material — never an engine tint.

Bighorn Bluff plateau concept
The arena concept — the contract the plateau is audited against
Bighorn Bluff win state in-engine
"King of the Bluff" — the win state, live in the engine at the salt lick

Feel first, art later

The whole game ran and was beaten as gray shapes before any art existed. This cycle's research: momentum-exchange clashes with mass and restitution, closing-speed-tiered hit-stop, and a directional camera kick — the camera is displaced along the impact normal and spring-returned, replacing the random shake of side-scrollers with a signal that carries the hit's direction. Every constant is recorded in FEEL_NOTES.md with the reason it holds its value and what the rejected values measured. An automated player beats every build end to end on each audit round.

gray-box blockout tier-3 clash
The blockout: a tier-3 clash frozen mid hit-stop, feel complete, zero art
From FEEL_NOTES.md — the lab's research output
Charge power curve t0.72, front-loaded: 250 ms hold → 581 px/s and 354 px of travel. Rejected back-loaded t1.6: the same hold collapsed to 174 px (−36%) — it punished exactly the quick reads the game rewards.
Camera kick spring 19 rad/s, critically damped — measured settle 201–296 ms by tier. Rejected 6 rad/s: settle measured 5.2–9.4 seconds; every clash mortgaged the next five seconds of readability.
Hit-stop 28/60/96 ms by closing speed — and first-person only: a rival-vs-rival bump across the arena gets a distance-faded thud, never a camera hit. The first blockout probe had AI jostling firing full juice 8 times in 15 s; the screen read as haunted.

A Blender pipeline, rendered to top-down sprites

The ram is a voxel-fused Blender build — six audited rounds against its concept with render-sampled palette checks — rigged as a true quadruped and driven by retargeted CMU motion capture. New ground this cycle: a human run clip retargeted onto four legs by mapping limbs only at damped influence (the horizontal spine stays authored), so the clip's natural arm-leg anti-phase lands as a diagonal-pair trot, with hand-keyed lateral spine sway — the quadruped motion an overhead camera actually sees. Salt lick, boulders, tufts, signpost and crown are kit-built Blender renders at one shared pixel scale; the plateau itself is a Blender ortho bake whose cliff edge is the physics rim. Audio is the platform's sampled-instrument engine: an accordion-and-fiddle alpine round, wood-crack and taiko clash tiers, a glockenspiel crown ladder, procedural mountain wind underneath.

shipped sprite rows: hero and rival trot cycles and poses
The shipped rows: hero + russet rival — mocap trot cycle · graze, windup, charge, stagger, tumble poses

The measured feel

The piece ships its own benchmark harness (Playwright, canvas renderer, raw performance.now() frame deltas — this lab's audit host has no GPU, and headless frame throttling plus engine delta smoothing otherwise fake a clean 60). Numbers below are from the quietest observed windows on that shared host; sim-space distances are load-robust.

MetricMeasuredConditions
Input → windup / release → charge10.6–29.5 ms (≤2 frames)DOM key timestamp → state change applied
Charge power curvefeint <110 ms · 250 ms → 581 px/s / 354 px · 650 ms → 692 px/s / 468 pxhold-and-release trials, sim-space
Clash ladder (closing → knockback / stagger / hit-stop)214 → 9 px / 319 ms / 14 ms · 535 → 41 px / 353 ms / 51 ms · 978 → 77 px / 527 ms / 108 msstaged head-on clashes at three speeds
Directional kickpeak 3.4–11.7 px along the hit normal · settle 201–296 mscritically damped spring, 19 rad/s
Event feedback≤34 ms, every interactive eventbudget 100 ms; same-tick visual response
Automated playthroughcrown 100%, win in 64.8 s / 118.1 s, zero errors, zero fallsreactive input bot; second run = confirming audit
Frame cost (this audit host)best 19.3 ms avg · 33 ms p95software canvas, no GPU, shared box at load ~17 — real hardware runs the WebGL renderer at 60
Payload~8 MB · ~100 filesengine 1.2 MB + art 2.4 MB + sampled audio ~4 MB

Real engine features, earned

Hand-rolled clash physics

1-D elastic momentum exchange along the contact normal with mass and restitution 0.58 — arcade separation would eat the very thing the game is about.

Directional contact shape

A ram is long, not round: contact radius blends 17 px side-on to 40 px along the heading, so horn-to-horn connects where the art shows horns meeting.

Directional camera kick

Displacement along the impact normal with a critically damped spring return; zoom punch reserved for tier-3. Rotation never; translation only.

Top-down depth, full treatment

Y-sorted actors and props, drop shadows that stay on the rim when a ram tumbles, a parallax valley far below, and drifting cloud shadows over everything.

Sumo AI with manners

Grazing home anchors, one rotating challenger, retreat after a lost bout and a respect window — measured out of a perma-contested stalemate (240 s, crown 0%) into a 2-minute win path.

Sampled-instrument audio

The platform Web Audio engine: an alpine accordion-fiddle round, closing-speed-tiered clash voices, distance-faded AI bumps, a glockenspiel crown ladder, procedural wind.

windup 110–620 ms, t^0.72charge 470–880 px/s restitution 0.58hit-stop 28/60/96 ms kick 5/11/17 px @ 19 rad/szoom punch 1.045, tier 3 only stagger 200–520 ms by closing speedvelocity lookahead 0.30 s deadzone 36 pxcrown 20 s, decay 0.25/s knockout bonus +1.6 sreduced-motion 0.2× arrows + WASD + touch joysticklocalization-ready strings