Last Stop Play

In development

Last Stop

Hollow St Canal St City Hall

The last train left an hour ago. Something else is still running on the line.

A first-person wave-survival shooter in a late-night subway station. Every wave arrives by train.

Free, no install. A desktop browser with a mouse and keyboard.

The line

Three stations, one train, no way out but forward

Waves come in by train. Clear the platform, grab the supply crate, take one of three perks, and every fifth train brings a boss. Survive it, board, and ride the tunnel to the next stop.

Hollow St

Every wave arrives by train

The board counts down, the tunnel lights up, and the doors open on whatever came in from the dark. The train brakes, chimes, unloads and leaves on its own schedule; the announcer has opinions about your aim.

The platform

Shamblers, runners, brutes and worse

Five weapons, a crowbar shove and frag grenades against crawlers that duck under police tape, spitters, screamers and riot cops with shields. Headshots, limb hits and kill combos all count, and the station takes the damage with you.

Every fifth train

The Conductor, the Track Worker, the Motorman

Bosses telegraph a charge lane and a stomp ring. The Track Worker throws live rail that keeps sparking on the floor. The Motorman drives his own train in on the far track and comes back around with a fresh crew when he is hurt.

Between stops

The ride is a fight too

Board after the boss and the train pulls out through the tunnel. Things climb in through the end doors and the roof hatch, an express thunders past on the other track, and the next station is rebuilt around you before the doors open again.

City Hall

The end of the line

Each stop has its own palette and layout: Hollow St's grimy local platform, Canal St's flooded trackbed and raised deck, and City Hall's tiled vault. Every one of them is generated in code from a short list of numbers.

Watch a run

The Motorman, the ride and Canal St, unedited

Three minutes of a fifth-wave boss fight, the boarding call and the ride to the next station, played by the game's own test bot and filmed one simulation step per frame. The bot is a balance tester, not a showman. Jump to a moment below.

    Controls

    Mouse and keyboard

    Mouse
    Look (click to capture the cursor)
    WASD
    Move
    Shift / Ctrl
    Sprint / crouch
    Space
    Jump
    LMB / RMB
    Fire / aim down sights
    1 to 5, Q, wheel
    Pistol, carbine, shotgun, revolver, SMG
    R
    Reload
    G
    Frag grenade
    V
    Shove
    L
    Flashlight
    Esc
    Pause and options

    How it was made

    No engine, no bundler, almost no asset files

    Procedural everything

    three.js r185 and plain ES modules. Every texture (tile, mosaic bands, terrazzo with puddles, painted steel, posters, signs, the line map) is drawn on a canvas at boot, and every station, train and prop is built in code from a preset of numbers, with a seeded random generator so screenshots stay comparable.

    Light on a budget

    A forward renderer with a fixed light count: a pool of three shadowed spotlights follows the player, fixtures flicker, and a blackout drops the station to red emergency lamps. Bloom, SMAA, grain and a damage shader do the rest. Shader programs are warmed up at load so the first wave never stalls.

    Baked audio and a voice

    Web Audio synthesizes most effects, with positional panners and a convolution reverb sized to the station. Gunshots, the train horn and groans are baked with ElevenLabs sound generation, the music beds with Google's Lyria, and the announcer lines were picked from takes on a local review board.

    A bot, a critic and a film camera

    A bot plays the game for balance soaks, logging clear times, accuracy and ammo per wave. A blind critic agent sees only screenshots and the pitch and names the five worst problems. The videos on this page come from a film tool that holds the game loop and steps the simulation once per frame, so every clip plays at true game speed.

    Designed and directed by Stewart Gregerson, built with Claude Code.