Skip to content
Arcbreak
Live demo of tickroom

Drop a bomb. The fuse is a tick number.

Up to a hundred players on a tile grid. Blasts travel in a cross, take out soft blocks and people, and the last one alive takes the round. It runs on an authoritative 20Hz server that lives inside serverless functions and survives them dying.

No account. No download. WASD to move, space to bomb.

Play with people you know

A private room has a code instead of a queue. Host one and send the link, or type the code somebody sent you. Nobody else can join it.

The arena you host
Arena size

One frame of a real round

Not a drawing of the game. This page runs the simulation, seats a full room, drives them with the same policy that fills empty seats live, and draws the frame it lands on. A blast is crossing, stopped by hard blocks and by the one soft block it eats at the end of each arm. Every outlined square is a tile a running fuse will reach: the client works those out itself, which is the whole reason this game is the demo. The ringed token with the caret is the seat you would hold.

How to play

Six rules, and one of them is the whole game

Bombs go off on a fuse you can count. Everything else is about where you are standing when they do, and about whether you can get out of a corridor you just made. Play the public arena, or host a private room and send the code: a private room waits in its lobby until the host starts the round, nobody without the code can join it, and the host picks its arena out of six shapes at five sizes, which decides both how the fighting goes and how many people it seats.

  • The lattice never moves

    Hard blocks sit on a fixed lattice and are never destroyed, so the skeleton of the arena is the same every round. Soft blocks fill most of the rest and are the part you break. Every spawn is kept clear, so nobody is walled in at tick zero.

  • Free movement, with the corner nudge

    You move continuously and collide with the grid, no tile snapping. Push into a wall while nearly lined up with a gap and you slide into the gap instead of sticking. That one rule is most of the feel.

  • A bomb is a fuse and a cross

    Drop a bomb on the tile you stand on. When the fuse runs out the blast travels in four directions, stops dead on a hard block, and eats one soft block per arm. A blast that reaches another bomb sets it off too, which is how one bad decision becomes four.

  • Broken blocks pay

    Some soft blocks hide a powerup: another bomb, another tile of range, more speed. They keep whoever is losing still gaining something, and they are why the map opening up changes the game rather than just clearing it.

  • Dying does not stop you playing

    Caught in a blast and you are out of the arena, not out of the round. You move to the walls, the border plus every tile sudden death seals, walk them, and lob bombs over them at whoever is left. As the arena closes you follow it in, and a kill from out there still scores.

  • Sudden death closes the walls

    Past a threshold the arena closes in, hard blocks dropping from the outside inward, until somebody wins. A round ends when one player is left, not when a clock runs out, and this is what makes sure it gets there.

Architecture

A bomb’s fuse is a tick number, and that changes what has to cross the wire

This is the whole reason the game is a grid and bombs. A fuse is integer arithmetic on a tick the client already has, so there is no physics to approximate and no other player’s input to guess at.

bomb downblastticker killed heresuccessor restores, and continues the tick countthe fuse: a whole number of ticks, never a wall clock

The client predicts all of it

A client that knows when a bomb was placed knows exactly when and where it goes off, so the whole bomb and blast system is predicted locally, exactly rather than approximately.

Blast cells never travel

The blast is derived from the bomb and the bomb from a tick, so the most visually expensive thing in the game costs nothing on the wire.

And when the function dies

Every fuse in the room resumes on exactly the tick it was on. “A function dying is a non-event” stops being a sentence on a page and becomes something you can watch happen to a bomb that is about to kill you.

The shape underneath

Three pieces, one of which is allowed to die

Serverless functions are the wrong shape for realtime multiplayer in exactly one way: they die, on a schedule, at a duration cap measured in minutes. Arcbreak runs on tickroom, which is the set of pieces that makes that death boring.

  1. 01

    Relay

    Holds the WebSocket and nothing else. It decodes input, publishes it, and forwards whatever the room publishes back. A relay dying costs one reconnect.

  2. 02

    Redis

    The bus and the filing cabinet: the input and snapshot channels, the lease, the checkpoint. One publish reaches every subscriber, so the command count does not grow with the population. Bandwidth does, which is why the wire is binary.

  3. 03

    Ticker

    Holds a short lease, runs the simulation at a fixed 20Hz, checkpoints the room every second, and spawns its own successor before it exits. Two tickers racing resolve to one.

What you see when it happens

Nothing. Your socket is held by a relay, a different function with a different lifetime, so it never closed. The replacement ticker takes the lease, restores the checkpoint, and carries on from the tick the old one stopped at. The simulation is a pure function of state, inputs and a fixed dt, with no clock read and no unseeded randomness, which is why a restore reproduces the room instead of forking it, and why src/game/ runs unchanged in a browser, in a unit test, and on the server.

Same tick

Handoff

The predecessor died at tick 26 and the successor restored at tick 26. Longest gap in the snapshot stream: 10ms.
20.45 Hz

Tick rate

Against a 20Hz target, over real wall time, driving a real ticker against a real Redis.
50 to 50

Fan-out

Fifty publishes issued exactly fifty Redis commands and were delivered to five subscribers. Command count is flat in the population; only the bytes are not.

Those three figures come from tickroom’s verification record, and they are the only measurements this page quotes. Read the handoff as a floor: it is loopback Redis with no network hop and no cold start, so production is slower. What it demonstrates is the mechanism: a successor takes the lease, restores the checkpoint, and continues the tick count rather than resetting the room.

Six arena shapes, five sizes, up to a hundred seats.

The public arena is always open and always has a chair free: turn up alone and the simulation plays the empty seats itself, spread across the grid rather than bunched beside you, and hands each one back the moment a person wants it. Host a private room instead and you pick the arena, from a nine seat diamond up to a hundred seat rectangle.