2 BUCK SALOON

Point your phone like a light gun.

Play it2bucksaloon.hobel.dev

2 BUCK SALOON in play

Walk into a saloon, see who else is at the rail, drop two bucks, take the gun off the wall, and hunt a shared herd against everybody else in the room in real time. Ten waves, five sites, and something very large in the last one.

Everybody in the room shoots the same herd, and the first shot on a buck takes it. Lose one by a hair and the game tells you who beat you to it — and your streak survives, because losing a buck to ninety milliseconds of latency should not also cost you a multiplier.

Point the phone and tilt to move the sight, or drag with a thumb. The two modes are equals with the same accuracy ceiling and the same leaderboard, switchable at any time including mid-wave.

Worth knowing

The herd has no simulation state

A deer's entire life is a pure function of its spawn record and the clock. The server broadcasts a spawn once and thereafter sends only outcomes — killed, escaped. It never streams positions.

Four things fall out of that

Bandwidth per saloon is a few hundred bytes per wave, and an idle saloon costs a heartbeat — which matters on a box hosting five other sites. Lag compensation is exact and O(1): rewinding a shot 140 ms is calling the pose function with a smaller t, with no history buffer and no resolution lost to having sampled at 20 Hz. Clients render at their own frame rate with no interpolation artefacts, because they evaluate the same function the server does. And a client that stalls for 400 ms comes back correct rather than behind.

The cost, stated plainly

Motion must be expressible in closed form, which rules out deer that react to being shot at. An arcade herd runs its pattern regardless, so that was a cheap thing to give up.

The server owns every score

A client may send an aim ray and a time. That is the entire score-affecting surface it is trusted with.

Screens

Built with

ReactTypeScriptwsNodeDeviceOrientationDocker + Caddy

Play 2 BUCK SALOON