Skip to content

Subscenes & Navigation

A fragment can span several scenes. @ scene_id declares a subscene; it runs until the next @, the next ===, or the end of the file. Jump to one with -> from a choice body, or from the end of another scene:

> Follow the dog
-> alley
@ alley
The alley smells of rain.
> Keep following
...
> Turn back
...

Navigation never interrupts the reader: once the prose before a -> is revealed, the target scene’s content follows in the same flow - no Continue button between scenes. The only thing that ever asks for a Continue is a ... pause. Write scene breaks for reading rhythm; use ... when you want an actual stop.

The entry scene may end in a -> of its own, which is how a fragment whose first menu is a hub gets written:

The sheet goes up on the corridor wall in the first week back.
-> pick
@ pick
So: what's it going to be?
>* The sports column
-> sport
>* The music column
-> music

Because navigation is seamless the player sees no join at all: setup prose, then the menu, as one scene. What it buys you is that the menu is now a -> target, which the entry can never be, so every choice in the fragment can send the player back to it.

A fragment still has to offer the player a choice somewhere. It just no longer has to offer one in the entry: the build checks that some scene reachable from the entry has choices, and fails with never offers the player a choice when none does.

  • A nav target must match a subscene in the same fragment. The one exception is the special target death, which ends the life immediately.

  • -> ends the current body’s execution - nothing after it runs. Content written below a -> in the same body is a build warning, because it can never be reached; a choice written there simply never appears. A second -> down there is an error rather than a warning, whatever sits between them: dead prose is visibly missing when you read the scene, while a jump that never fires just sends the player somewhere else and says nothing. A -> inside an *if arm only ends the body when that arm fires, so it strands nothing.

  • A jump takes no condition of its own. To route on state, put the -> inside an *if block, which is where every other branch in the format lives:

    *if VIT <= 20
    -> death
    *else
    -> alley
    *endif
  • A subscene that’s never navigated to is a build warning.

A hub is a subscene the player comes back to. It is not a special construct, just a subscene whose choice bodies navigate back to it.

@ market
*set: visits += 1
*if visits = 1
The market is louder than you expected.
*else
You drift back into the noise, visit number {visits}.
*endif
> Ask about the miller's daughter
She left in spring, they say.
-> market
> Price the good knife
*requires: WEA >= 40
More than you have. Barely.
-> market
>* Head home
You go, pockets no lighter.
*exhausted: leaving

What the runtime does with that:

  • Taken choices come back marked “Taken” instead of vanishing, so the player can see what they already spent. Sticky (>*) choices stay pickable forever.
  • The scene body runs again on every visit. Prose repeats unless you gate it, which is what the visits counter is for: count, then branch on the count. See Counting with +=.
  • When only spent and locked doors are left, the scene follows its *exhausted: target, or ends the fragment if it has none. Nobody is ever stranded, but that ending is abrupt.
  • Effects in a hub body re-fire every visit. *effects: HAP+2 at the top level of a revisitable subscene grants HAP on every loop. Gate it behind *if visits = 1, or move it into a choice. (*set: lines are exempt: a counter is supposed to run every visit.)
  • A sticky choice that grants stats is farmable. >* Busk for coins with *effects: WEA+1 and a loop back is free money forever. Drop the *, or gate the reward with *if !busked*set: busked*endif.

*exhausted: - the way out when a scene runs dry

Section titled “*exhausted: - the way out when a scene runs dry”
@ market
> Ask about the fire
She left in spring.
-> market
> Price the knife
*requires: WEA >= 40
-> market
*exhausted: leaving

It fires when the scene has nothing live left to offer: every choice taken, or every remaining one locked. Spent-only is seamless, the way -> is; all-locked keeps the Continue button, so the player sees the doors they could not open before moving on. Without it, a dry hub just ends the fragment.

It is the scene’s property, not a choice’s, so it belongs at the top level of a subscene. Put it anywhere there: after the choices reads best, and unlike a bare -> in that spot it cannot be mistaken for the last choice’s navigation. Inside an *if or *random block it is a build error, and one scene can declare only one. The target is checked like any -> target and counts as a reference, so it will not be flagged as an unreachable scene.

A subscene with prose and no choices ends the fragment after its prose - or follows a trailing -> if it has one. Use these for endings and connective tissue.