Until this week the game started by simply existing. You pressed Land on Verge, the
title screen went away, and there you were on a frozen surface with two crew and a task queue —
no idea who those two people were, why they were on that rock, or what the thing on the ridge had
to do with anything. The story was all in the game: nine objectives, nine recoverable log
entries, an ending that reads the colony back. None of it was at the front, where a new player
decides in about six seconds whether this is worth their afternoon.
So there is a cutscene now. Six shots, about forty seconds, and then you are digging.

It was already written
The temptation with an intro is to invent a bigger story for it. I did not need to: the first
log fragment in the game, the one the crew wrote before landing, already says exactly what
happened, and it is more interesting than a crash.
For the record, because someone will ask: the descent was not a failure. We were
three weeks out from the relay when the carrier tone came up through the hull — steady, patterned,
coming from the surface of a world that no survey has ever cleared for landing. Command said hold
course. I put us down.
That is the cutscene. The tone arriving through the hull, the pattern that is too tidy to be
geology, the order that said do not descend, and one commander deciding to ignore it. Every line
of narration is taken from that fragment, so the intro cannot drift away from the story the rest
of the game tells — and a player who reads the log twenty hours later finds the words they already
heard on the way down.
The signal shot is the one I kept fiddling with. The tone in this game has a specific rhythm —
fifty-one seconds of pressure, nine of silence — and it turns up in the geyser fragment, in the
ending, and in what the monolith finally does with it. So the oscilloscope counts. It really is
51 on and 9 off, with the counter running, because a shape that looks like a signal is
worth much less than one the rest of the game agrees with.

The last three shots are your world, not a stock planet
This is the part I would defend hardest. There are twenty seeded worlds, and the intro plays
after the one you picked has been generated — so the entry burn comes down onto that
world’s real height map, the touchdown sits on the actual cleared landing site the generator chose
for your pod, and the sky, haze and weather are that region’s. Land on the Fungal Basin and the
air has spores drifting in it. Land on Ash Flats and dust blows sideways past the hull. The
closing card reads the world number, the seed, the region, the temperature you are about to stand
in, and how much rock is underneath you.

Nothing in those frames is an illustration of the game. They are the game, at a different
camera height, which is why they cost about seven kilobytes of code and no assets at all. The
whole file is still one HTML document.

Rules I set for it before writing a line
Cutscenes are the most easily hated thing in games, and always for the same reasons. So:
- It plays on a fresh landing only. Continue an existing base and you go
straight into the hole. Nobody watches the descent on their fortieth visit. - Skip is on screen from the first frame, top right, plus Escape. Tap, click,
space or the right arrow advances a shot for people who want to read at their own speed. - It is replayable — “Watch the descent again” sits in the signal log next to
the fragments, so skipping is not a permanent decision. - The world is frozen while it runs. The main loop returns early, so nobody
loses forty seconds of warmth, fuel or crop growth to a cutscene. Measured: the game clock drifts
under 200 ms across a full replay. - If it breaks, it gets out of the way. The draw call is wrapped, and any error
ends the cinematic and drops you into the game instead of trapping you in a black screen.
The bug worth writing down
The title screen now advertises the intro in its feature line, which meant reading
CINE.length inside the boot screen’s setup — and the cinematic module was defined
below that function in the file. In JavaScript the variable exists at that point but is
undefined, so reading a property off it threw, and the throw took out the rest of the setup
routine with it. The title screen still rendered; the intro simply did not exist. Everything
passed locally because the local run happened before the line was added, and I found it on the
live site a minute after deploying. Old lesson, freshly relearned: the run that matters is the one
after the last edit, not the one before it.
Live now at orbit2d.co as v0.7.1 — pick any of the twenty
worlds and it opens on that world. Feedback form is still on the title screen and still comes
straight to me.
Leave a Reply