Three openings for games that do not exist
Five quests on Solarus, a 2D action-RPG engine from 2003, all of them 320 × 240 and built out of its free resource pack. Two of them are games. The other three are openings — six minutes of prologue ending on a chapter card for something that will never have a chapter two. That started as running out of steam and turned into the actual method: an opening is the cheapest way to find out whether a world is worth the rest of the work. If the first six minutes do not make you want the seventh, nothing downstream was going to save it.
A shelf of voices, so the question is asked once
Every project kept re-deciding what it should sound like, and drifting away from whatever it decided. So the answer moved out of the projects and into one file that they all pick from. The default is called SNES, and it makes exactly one commitment: a ten-year-old follows every sentence, and an adult is not bored.
Those are not in tension. The vocabulary is simple; the situation is not. A fifteen-year-old is responsible for whether six hundred people live. "Six hundred and thirty-one people were not found" is a sentence a child can read and an adult has to sit with. The rules that fall out of it:
- Say what happened — not what it was like, not what it meant. If something came up out of a hill, write "something came up out of the hill".
- Say the stakes out loud, once. Withholding them is not mystery, it is the reader not knowing why to care.
- A mystery must be stated as a mystery. "Nobody knows what it was" tells the reader they are not being cheated. Silence tells them nothing.
- Numbers are your friend. Nine, six hundred and forty, four hours, nineteen years. Children and adults both read numbers as true.
- End pointing at the player. "Today is the ninth. It is your turn, Tam."
There is a second voice documented mostly as a warning. Chronicle is the Tolkien register, and the note against it is that it reads as meaning more than it says — a whole prologue in it is unreadable. One project's own style guide puts the same idea more bluntly: if a line would look good on a poster, cut it.
Two thirds of style is arithmetic, so it gets asserted
Here is the part I would steal for anything with words in it. "A ten-year-old follows every sentence" sounds like a judgement call, and mostly it is — but not entirely. So the measurable part became a test that runs with the game:
- Flesch-Kincaid grade level over everything the player reads — the prologue beats and every dialogue in the language file — with a ceiling of 6.0.
- A cap on the longest single sentence, 20 words, because an average hides the one paragraph nobody can follow.
- Every line measured in its own font against the thing it is drawn into: 292 px for narration, 205 px and three lines for the dialog box, 308 px for a 320-pixel screen with six pixels of air either side.
A run prints the numbers and fails the build if they drift — the note in the source is that this is the difference between "this feels simple" and "this is grade 4.1 and the longest sentence in the game is seventeen words". The width check earns its place for a reason worth writing down: narration that runs off the side of the screen is the one bug that no amount of playing finds, because the person playing wrote the line and knows what it says.
The other things the test learned the hard way
The smoke test drives the whole game to the end, and its header is a list of ways an automated playthrough lies to you:
- Never set the savegame value a trigger is supposed to set. Doing that hides triggers too small to stand in — a dead end for the player and a green tick for the test, which is the worst possible pair.
- Never move the hero with
hero:walk(). The engine does not activate sensors while the hero is in its forced-walking state, so a scripted walk strolls straight through a trigger without firing it. Drive it with simulated button holds instead — which is what a player does. - Measure frame rate as a ratio, not a floor. The perf pass compares the frame rate with text on screen against the same machine with none, so a busy computer cancels out. It was catching a real bug: something being rebuilt every frame held the game at 27 % of its clean rate, and 78–100 % after the fix, even on a machine pegged at full CPU.
The five
- Emberwatch — half an hour of light left and four lanterns to see to. A tutorial that never names a button: every lantern is blocked by something you can see, so the obstacle is the lesson and no villager ever says "press". Levels are authored as ASCII terrain and compiled to map data with autotiling.
- The Unnaming — a world written into being by two sisters, one who named things and one who unnamed them to make room. You are staff: the most consequential conversation in nine thousand years happens over your head while you carry a tray. The credits are printed on a map that loses three places, letter by letter, while you read them.
- The Thaw — nine hundred people standing on two miles of ice on the morning it starts to go. The free resource pack has no snow in it, so a script generates an entire tileset: twenty-eight patterns, sheet and data file together.
- The Dead Hour — Max Payne with a sword, which is the same contract as the browser one elsewhere on this site, in 2D. Hold a button and the world drops to a fifth speed while you stay at three quarters. The visible light pools are drawn at exactly the radius the code measures, because a stealth game where the light you see is not the light they see you in is a stealth game that lies.
- The Ninth Bell — it has been rung eight times and it has always held. It works this time too, and eight seconds later, from under the hill, something rings back. The world-map flyover is Mode 7: a generated continent sampled per scanline, with the clouds projected onto a plane above the camera by the same maths, which is the difference between flying and scrolling.
These run in the actual Solarus engine, so unlike most of what is on this site there is no browser build — the gallery below has one plate per quest with the copy, the controls and a launcher link, and it is the fastest way to see what is in there.