Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

When the script is not enough

Lives in: story/script.txt and (when needed) story/story.json

Most of a game stays in the script: speakers, lines, jumps, choices, and short stage directions. Add a direction file only when a moment needs more than brackets can say cleanly.

What the script is good at

JobIn the script
Who speaks, what they sayHANA:, lines, (silent), joints
Simple stage[bg …], [hana left], [bgm …]
Flow:: id, ->, >, [if …]
Pacing{@w}, {@cps=…}, [auto …], mid-line […] / {@cN}

That is enough for a whole first draft — Writing your story.

When brackets get awkward

Reach for story/story.json when you need things like:

  • An object or widget tied to a flag (a meter, a lamp)
  • Choice menus with custom layout or look packs in detail
  • Dense animation, shaders, or panel chrome on one beat
  • A command that should run only if a condition is true (when)
  • Something that sticks for the session, or lasts only this moment (apply)

If you can say it in one clear bracket line, keep it in the script.

Three ways to work

WayFilesUse when
Script onlyscript.txtMost games, most moments
Script + directionscript.txt + story.jsonDialogue in the script; heavy staging in data
Data onlystory.json aloneRare — whole story as data entries

With script + direction, each direction entry matches a scene by id (the same name as :: park). Dialogue and jumps stay in the script; the data file adds or overrides what that moment needs.

Start in the script

  1. Write and play the scene as script.
  2. Give important moments a stable :: id.
  3. Only then add a story.json patch for the moments that need it.

Next: see one moment in both shapes — The same beat as data.