2026-09-02 · STARFALL: AFTERSHOCK · BUILD 3.0.0

The seat gets taken, and the title burns

Press START on an empty seat and you now join mid-level, beside the lead, with a full set of lives. The painted title screen is gone, replaced by a real biome with a wordmark that is genuinely on fire.

Project pageMore STARFALL: AFTERSHOCK updates

Two days of work, and 20MB of painted art has left the build.

The title screen is generated now

It was a 1.9MB painted PNG of a place the game does not contain. It is now one of the real biomes, rolled per visit, drifting — the same atlas and the same parallax planes the game itself uses. Back out to the title twice and you have seen two of the places you are about to play, which key art cannot do.

The wordmark is built, not painted, and it has its own face: ten letters at 12×14 on four-pixel stems. The first cut was 10×14 on three-pixel stems and still read as "the UI font, but bigger". What makes something read as a title is the ratio of ink to space inside a letter, not the size.

And it is on fire. Not a gradient pretending to be one — the demoscene fire simulation. A heat buffer seeded white-hot along its bottom row, every cell cooling toward the average of the three beneath it. Heat rises because each row reads from the row below; the flicker is the randomised cooling; the lean is a one-cell jitter.

It burns inside the strokes because the composite is destination-in — fire drawn first, letters cut out of it — so flames climb through the stems rather than glowing behind them.

Verified as a simulation and not a texture: 2,166 of 4,347 buffer cells change across six steps.

Somebody can sit down mid-level

The HUD had blinked INSERT COIN at empty seats since the arcade pass, and the game could not accept it — the squad is constructed once, when the world is.

Press START on an unused seat now and you join, beside the lead, with a full set of lives and an operative nobody else is flying. No menu, no reload.

Two things the input layer forced, both of which would otherwise have been bugs:

The player list is filtered, so a late joiner is spliced in by slot rather than pushed onto the end — the HUD plates, the revive rules and the lead-player lookup all read it in order. Joining seat 2 before seat 1 still yields 0, 1, 2.

The first thing that knows it is wet

The water query has been in the level code since the flooded level was built, and it had zero callers. Fourteen hundred water tiles were paint.

A submerged pilot now trails air — checked per point, not per level, because that level is heavily flooded by column but its waterline moves constantly. The check is on the head, not the feet, so wading with your face in the air blows nothing.

A watchdog that plays the game

Every probe in this project asks one question well. That is the wrong shape for "something is off and I do not know what".

The new watchdog asks nothing. It runs the pilot and records anomalies it can define without knowing what it is looking for: positions outside the world, non-finite numbers, impossible health, a body inside rock, an objective that un-completed itself.

Findings carry a signature keyed on what and roughly where — deliberately not the frame — so successive runs can print FIXED / STILL HERE / NEW against each other. That is the loop: run, fix, re-run, and a fix has to leave the list.

It breaks the game on purpose once per detector and requires each one to fire. Six for six.

What it found

A locked door can strand a squad holding every key it asks for.

The pilot arrived with all five, stopped fifty-six pixels short of the door, and stood there for 103 seconds — ten pixels outside the range that opens it.

The proximity check measured from the door's centre, and a door is not a point. A locked door is solid, so the squad stops on the last standable tile in front of it, which for a wide door can be outside 46px of the centre while being right up against the door.

This project had already seen this shape once, written up as a one-off: "a six-wide door whose centre sat eight pixels beyond a body's reach". It was this bug. Distance is now measured to the door's span.

Verified across four runs: idle-at-end 103s → 1–5s.

The instrument was wrong more often than the game

Three times, against that one finding — and the useful one is the second.

A flood alert fired because a stage declares its whole enemy roster at construction, so the peak occurs at t=0 with almost all of them far off screen. It was measuring how big the level is.

A no-progress alert turned out to be a budget too short: a median of 526s against a flat 420s clock. A budget that is too short does not report "inconclusive", it reports a bug — which is the most expensive kind of wrong an instrument can be.

A correction

The finale was previously reported as unwinnable. It is not, and the claim was wrong on every count: it is winnable, every one of its moves fires, and one loss ended with the boss on 358 of 12,000 health.

Two broken instruments produced the old answer. No shipped probe reached the finale by name — the boss-attack probe finds a boss via the stage's boss id, and the finale's second boss shares a stage with the first. It had been measured for weeks under the wrong name, and the two share move names.

And the rig that produced "0/3, unwinnable" ran a 600-second budget against a fight that does not start until 260 seconds, with no squad re-placement after a knockdown.

A green probe is a claim, not a result. Do not believe a measurement until the instrument has been shown failing.

Also shipped

Per-seat scoring. Seat totals call the same scoring function the squad total uses, so the two cannot drift apart. Kills, accuracy, scrap and combo are attributed; intel, time and the clear bonus stay squad-wide, so seat totals deliberately do not sum to the stage score. The leaderboard now distinguishes a four-player run from a solo one, which it previously could not.

The bosses stopped narrating themselves. Every telegraph spawned its move name as floating text. After the aggression pass that fired every couple of seconds and read as a permanent HUD element.

Bold was pushing right-aligned text past its own edge. There is no bold face in this font — weight is faked by drawing twice with a small offset, which is right for left-aligned text and wrong for right-aligned. Verified by pixels: three strings right-aligned to the same column now all end there; before, one overshot by two.