Φ

NUMEN-1 · cartridge 001

The Last Flight Of
The Dragolich

A whole arcade game, written straight onto silicon we designed ourselves. There is no game engine under this. There is no sprite sheet, no tilemap, no audio file, no texture, no shader, no physics library. There are 2,105 instruction words. Every mountain, every star, every wing beat, every note of the soundtrack is arithmetic executed at sixty frames a second by a processor that did not exist until we wrote it.

score 0gate 1 / 6lives 3frame 00 fpsinstructions 0attract modeaudio idle

arrows or WASD move · space fires · enter starts. Click the canvas area first so the page has keyboard focus.

booting the machine…

The machine

NUMEN-1 is our console. Freestanding integer-only C, compiled to WebAssembly, running in your browser tab right now. No floating point anywhere in the machine — the sine table, the physics, the audio phase accumulators are all fixed-point integers.

screen
256 x 192 pixels, 64-colour fixed palette
processor
16 registers, fixed 32-bit instruction words
program store
8,192 instruction words
memory
16,384 bytes of RAM
frame budget
400,000 instructions per frame
sound
4 voices — square, saw, sine, noise
font
4 x 6, forty glyphs, no lowercase
assets
none — there is no image or sound file anywhere in the cartridge

What the cartridge costs

Measured, not estimated. These are the numbers the machine reports about itself while the game runs.

cartridge size
11,916 bytes
program
2,105 of 8,192 instruction words (26%)
data segment
3,432 of 16,384 bytes (21%)
peak load, title screen
3,830 instructions per frame
peak load, in flight
3,906 instructions per frame
headroom
about 1% of the machine’s per-frame budget
distinct colours on the title screen
53 of 64

NUMEN plays it

The same rollout-and-rewind search we use on power grids, orbital debris and physics control plays this game. There is no neural network, no training, no learned weights, no gradient. On every decision the brain snapshots the entire machine state, plays eight candidate button holds forward through the real game for a fixed horizon, scores what it finds, rewinds the machine, and commits to the best one. It is direct search over the actual future, nothing else.

Press LET NUMEN PLAY above and it takes the controls in front of you. Drag the horizon slider to watch it get better and worse.

controlleroutcomeresult
random button masherdied at frame 1,414score 1,700 — gate 1
pacifist (never fires)died at frame 554
hold-fire wigglerdied at frame 1,227score 2,025 — gate 1
search brain, horizon 8alive at frame 25,000score 38,500 — gate 5
search brain, horizon 14alive at frame 25,000score 17,515 — gate 3
search brain, horizon 28CLEARED ALL SIX GATES at frame 15,122score 46,300 — 1 life left

Read the middle rows honestly: horizon 14 did worse than horizon 8. A deeper look is not automatically a better one. At 14 frames the brain can see the boss’s spread fire coming but cannot yet see far enough to be rewarded for closing the distance, so it hovers safely out of range and the fight stalls. At 28 frames the payoff finally fits inside the window and it commits. That non-monotonic dip is a real property of finite-horizon search and we are publishing it rather than quietly dropping the row.

The winning run: 15,122 frames of real play, 120,976 rollouts, 3,387,000 simulated frames, 35.5 seconds of wall clock on one core. In the browser the brain re-decides every fourth frame so it can keep pace with the display; the benchmark above re-decides every frame.

How a picture gets made here

The sky

A vertical gradient, then forty-eight stars in four parallax bands, each one a single pixel with a two-pixel streak on the fastest band. Two mountain ridges built from triangles, scrolling at different rates against the same integer clock.

The dragon

No sprite. A body of stacked discs, a neck, a head, a horn, an eye, and two wings whose span is a sine of the frame counter. It is redrawn from parameters every single frame, which is why it can flap.

The Sixth

The boss is six nodes orbiting a core on a shared phase, two pulsing rings, and an eye that tracks your ship. Its health bar is a rectangle. It fires a five-way spread that tightens as the gates go on.

Where the sound comes from

Four voices. Three of them are effects with hand-written decay envelopes — a saw chirp when you fire, a noise burst when something dies, a low noise hit when a gate opens. The fourth is a four-step sine arpeggio that only sounds while you are actually flying, and its root note rises with the gate number. The browser pulls raw sixteen-bit samples out of the machine’s sound chip and hands them to your speakers untouched.

Honest caveat: the sound chip’s phase increments assume a 44,100 Hz sample rate. We ask your browser for a 44,100 Hz audio context and it usually agrees — the readout above tells you what you actually got. If your device forces 48,000 Hz, everything plays about nine percent sharp. We have not resampled it.

What this is not

  • — It is not an emulator of anybody else’s hardware. The instruction set is ours.
  • — It is not a game made with a toolkit. The cartridge is emitted by a compiler we wrote, one instruction at a time.
  • — The search brain has learned nothing. Reset the page and it is exactly as good as it was.
  • — It is not conscious, and neither is anything else here. It is arithmetic, done quickly and in the right order.