A short, monochrome puzzle platformer about what remains.
Play it in the browser: rfhickey.github.io/static-game
Something ended the world. Nobody remembers what, and the game never says. What's left: ash, fog, the ruins of cities, and the machines, still running, still following their last instruction. You are one small silhouette crossing all of it, looking for proof that you are not the only one left.
The look and feel chase the same targets as Playdead's Limbo: everything near the camera is black silhouette, everything far is pale haze, film grain and fog sit over the whole frame, there is no HUD, no dialogue, no tutorial, and death is instant, frequent, and cheap to retry.
The machines see motion, not people.
Every sentry in the game (patrol drones, wall turrets) detects movement only. When a searchlight lands on you, stop. Hold still while it stares, and it will decide you are debris and move on. Run, and you have less than half a second. The whisper you see the first time is the only hint the game gives.
The hunter in the fifth stretch is the exception. It already knows you are alive. Run.
No build, no dependencies. Either:
- Double-click
index.html(any modern browser), or - Serve it:
python -m http.serverin this folder, then openhttp://localhost:8000
Sound starts after the first keypress (browser autoplay rules).
| Key | Action |
|---|---|
| A / D or arrows | move |
| Space / W / Up | jump (hold for full height) |
| E / S / Down | use levers |
| M | mute |
| R | return to the last lamp (or restart from the end screen) |
Lit lamps are checkpoints. Everything between lamps resets when you die.
- Ash forest: learn to walk, hop the bus, clear the first pit.
- Outskirts: a crate, a wall too tall to jump, and the first drone.
- The fences: one cycles on a timer, one has a lever, and a searchlight owns the ground between them. Machines cannot see you pull a lever if you are standing still while you do it.
- The works: a turret you cannot outrun, an EMP floor plate, and three pistons on offset timers.
- The hunter: something big wakes up behind you. There is a chasm it does not see coming. Look closely at what is lying beside the cold campfire on the way in.
- The hill: a light at the top that is not a machine.
node test/sim.js proves the level against the live physics constants:
every gap is checked against the simulated jump arc, every rise against the
jump height, every entity against the ground it needs, the EMP against the
turret it must silence, and the mech against the player's top speed. If a
tuning change in js/config.js makes any part of the level impossible, the
test fails before a playtest ever would.
| File | What it holds |
|---|---|
js/config.js |
every tuning constant |
js/util.js |
math, PRNG, geometry queries |
js/physics.js |
AABB movement and the jump simulator |
js/levels.js |
the world: solids, entities, props, testable claims |
js/entities.js |
drones, turrets, fences, crushers, the hunter, the fire |
js/render.js |
parallax ruins, fog, grain, vignette, the player silhouette |
js/audio.js |
procedural wind, rumble, hums and one-shots (no asset files) |
js/main.js |
loop, input, camera, states, particles |
Plain script tags, no modules, so file:// works. The DOM-free files
(config, util, physics, levels) also load in Node for the tests.