Screens
The presentation slice of THE EIGHTH KETYL, on the `Interface` host entity. It owns every authored screen the game has — the title card, the how-to-play card, the heads-up display, the pause card and the two end cards — and it owns menu FOCUS: the ordered ring a controller walks,…
Screens
The presentation slice of THE EIGHTH KETYL, on the Interface host entity. It
owns every authored screen the game has — the title card, the how-to-play card,
the heads-up display, the pause card and the two end cards — and it owns menu
FOCUS: the ordered ring a controller walks, the ring you can see, and the rule
that a mouse crossing a row moves the focus there so the pad, the keyboard, the
mouse and a finger never disagree about what is selected.
It never runs the game. A chosen item leaves here as
Still.emit("uiIntent", name) — "start", "howto", "resume", "restart",
"quitToTitle" — and the core slice decides what that means. The phase that
comes back is what this component draws. The only game state it touches is
Still.state, and only to read it.
Input. It activates /source/input/console.inputMap while a menu is open —
group ui, which stands the whole player group down, so the ketyl does not
drift across the plate behind a menu — and releases it the moment the last menu
closes. navigate walks the focus, confirm acts on it, back leaves, and
resume closes the pause card. The touch overlay's own Confirm / Back / Resume
buttons come from those same bindings, which is why the menu screen draws BELOW
them.
Layout. Every number comes from the live ui.screenSize() through ui.Kit.
The filmed shape is 1080x1440 and the same screens land on a phone held either
way, a laptop and a television.
Public fields
consoleMap: assetRef(inputMap)— the menu controls. Defaults toinput.console.previewInEdit: string— an author's window onto the screens while the engine sits in edit. Empty (the shipping value) means nothing of this slice paints until play runs, so a title card never covers another slice's scene work. Set it to"title","howto","pause","sealed","quenched"or"hud"to hold that card on the glass in edit.ownCaptions: boolean— draw this slice's own caption band. Off, because the staging slice ships one (still-captions) and two bands anchored to the same edge would print every line twice. Turn it on if that band ever stops appearing: the words must be on screen whether or not the audio played.
Lifecycle
awake()— registers theInterfaceanchor, registers the three screens (ketyl_hudat 20,ketyl_captionat 40,ketyl_menuat 150), subscribes toline/lineEnd/phase, and drops any control subscription left behind by a previous instance.update(dt)/editorUpdate(dt)— readsStill.state.phase, decides which card is on the glass, keeps the console map live exactly while one is, lets the pointer move the focus, and republishes the trees. The menus rebuild only when something they draw changed; the HUD is live data and rebuilds every frame.onCallback(id)— everymi:<item>a row carries lands here.onDestroy()— unsubscribes, deactivates the map, unregisters the screens.
Usage
It is placed by still.scene on the Interface entity and needs no setup.
local iface = require("Still").anchor("Interface")
iface.component.get("Screens").previewInEdit = "title"
Scoped to this part · feeds back into the world's score.