Skip to content
Blog
TechnicalAugust 21, 2026

The cab is the menu

Sillon has no driving screen. A control desk, a four-notch lever, a whistle, a firebox: everything you operate is operated from the cab, by walking up to the organ. What this commitment demands, and how I verify it holds.

No driving screen

Sillon is my contemplative train game: a small country line, six stations, passengers to punch tickets for, coal to shovel. The 0.1.0 demo shipped on itch on August 7, 2026. And from the start, one rule holds everything else together: there is no driving screen. No speed panel overlay, no radial menu, no HUD that drives. The driver's post is a place. You enter it, you sit down, and the controls are objects.

The regulator lever has four notches, from dead stop to full cruise. The whistle is a cord you pull. The brake is an organ you arm. The firebox is fed with a shovel. Each one occupies a spot in the cab, and to act on any of them, the driver has to be within reach. Driving means inhabiting a space of a few square meters.

The click is not a cursor

The working version accepted click-to-walk: tap the ground, watch the driver go. I removed it. Movement belongs to the keys, and the click now does exactly one thing: it acts on what is within reach. Clicking an organ that is out of reach triggers nothing, not even a step.

That refusal has a reason. If the click teleports intent, the driver's body stops mattering, and the cab becomes a menu with set dressing. By forcing the walk, every gesture regains a cost: lowering the regulator and then whistling means two different spots at the desk. That is exactly the rhythm I want for a game about slow journeys.

The legend lives on the desk

Without a menu, one question becomes sharp: how does the player know which key drives what? The answer followed the logic all the way down: the legend lives in the cab too. Every function of the panel carries a key cap, with its word, resting on the desk's shelf, the only strip that crosses the full width without carrying anything.

Two details of that legend taught me something. First, the regulator's group sits at the left of its sector: placed in the middle, it looked perfect on my mockup, captured at notch 2; but the lever's arm sweeps the whole inside of the sector and would have crossed it at the low notch. A mockup is a frozen pose; it hides what moves. Second, the pressure gauge and the embers have no key cap: nothing actuates them. Giving them a key would have been an interface lie, the promise of a gesture that does not exist.

A key reminder is true if it works. My assertion does not compare the key cap against the input configuration: it reads the letter as it is displayed and requires that this key actuate the organ. Comparing the label to its source means reading the same data on both sides; the only proof is the gesture.

What the commitment costs

An interface that lives in space is paid for in pixels. In play, the cab's interaction zones were stepping on each other: six overlapping pairs, 196 pixels of zones inside 102 pixels of cab, nearly double the available room. The firebox claimed a radius of four times its own width and contained the chest entirely.

The way out was not to regenerate the locomotive sprite: it carries the game's art direction, and its palette was used to recalibrate everything else. The cab was lengthened by 58 copies of a column already drawn, inserted where the seam is exactly zero, and every zone received a computed radius, half the sprite's width plus three pixels of grace. Zero overlap, a little air between each pair. The assertion guarding this property reads the live positions and radii, never the constants that placed them.

What I take away

A diegetic interface is not a visual flourish, it is a contract: everything that looks actionable must be, everything that is not must say so, and the space must give every organ room for its gesture. The contract is verified like any other: with assertions that play the gesture instead of re-reading the configuration. If your interface promises something, test the promise on the side where the player receives it.