frontend
Every authored screen in *The Hernsew Lingster*, and the one thing that decides which of them is on the glass. It goes on the scene's `Screens` anchor.
screens.frontend
Every authored screen in The Hernsew Lingster, and the one thing that decides
which of them is on the glass. It goes on the scene's Screens anchor.
The trees live in screens.cards (title, how-to, pause, both endings) and
screens.hud (the tide gauge, the yowe tally, the station ladder, the
phrasebook, the encounter panel, the caption band). This component owns
registration, visibility, and the callbacks the buttons raise.
Everything is laid out for 1080 × 1440 — a portrait frame. The tide gauge is a column up the left edge, the ladder is a stack at the top right, and anything that needs width is a band at the foot. There is no row of buttons anywhere.
What it reads
Off the game.rules blackboard, all of it optional — a slice that has not
landed is a missing number, never a crash:
PHASE · TIDE_T · YOWES · STATION · LEARNED · ENCOUNTER
and, when they exist, tongue.book (the encounter model and the phrasebook
records, which carry each glyph's own drawing) and sound.voice (through the
caption signal below).
Until something writes PHASE, this component drives its own copy, so the game
opens on a title card rather than cold on gameplay. It stops the moment the
real owner writes the key.
What it raises
Rules.SIGNAL.UI_CLICK(kind) on every press — begin, open, close,
resume, pause, answer — so the sound slice can answer a button.
Plus the five the run slice can act on:
| signal | when |
|---|---|
hernsew:uiBegin | BEGIN THE CROSSING on the title |
hernsew:uiPause / hernsew:uiResume | the run was held, or let go |
hernsew:uiRestart | CROSS AGAIN on an end card |
hernsew:uiQuit | the crossing was abandoned |
Answering a hernsew goes through tongue.book.answer(optionId); the panel then
holds for a beat with the right option lit and the literal reading of the call
under it, and closes itself.
Subtitles
screens.captions is the surface. Any slice with a spoken line calls
Captions.say(text, who, seconds) or emits hernsew:say — sound.voice
already does the latter for every line it speaks and every line it fails to
speak, so a failed generation is a quiet line rather than a lost one.
Looking at a screen before its slice has landed
local c = entity.find("Screens").component.get("frontend")
c:setPhase("won")
c:previewEncounter(require("tongue.book").open("drownway"))
The run slice's own PHASE wins again the moment it writes one.
Scoped to this part · feeds back into the world's score.