The same beat as data
Lives in: story/script.txt and story/story.json
A moment is the same thing whether you write it as script or as a data entry. The player runs one shape either way.
Side by side
Script:
:: park
[bg street fade 0.5]
[hana left]
HANA [happy]:
Watch the meter.
-> after
Same moment as data (fields the player cares about):
{
"id": "park",
"talking": "hana",
"text": "Watch the meter.",
"commands": [
{ "type": "bg", "value": "street", "transition": "fade", "duration": 0.5 },
{ "type": "char", "name": "hana", "position": "left" },
{ "type": "char", "name": "hana", "expression": "happy" }
],
"next": "after"
}
You rarely type the whole data form by hand. The script is sugar for this. Direction files usually hold only the extra fields you could not say in brackets.
Fields most moments use
| Field | Meaning |
|---|---|
id | Scene name (:: park) |
talking | Who is speaking (one id, or several) |
label | Custom name-plate text |
text | Dialogue / narrator lines |
commands | Stage directions at the start of the moment |
choices | Choice menu |
next | Where to go after (or null to end) |
auto | Auto-advance seconds ([auto N]) |
driver_typing / driver_typing_targets | Mouth drive on/off or limited to some speakers |
Mid-line tags ({@w}, {@cN}, {@talk:…}) live inside text. Batches for {@cN} sit in flow_commands; leave actions use exit_commands — Adding direction to a script scene · Command flow.
Watch it live
In the author player, F12 → Nodes lists every moment. Open one to see the live fields after script and direction are merged. Vars shows flags; Validation catches broken jumps and missing assets — How you work.
Usually you need
| Want | Do |
|---|---|
| Read what a moment became | F12 → Nodes |
| Add only staging | Patch in story.json by id — next page |
| Invent a whole game in JSON | Possible, but script stays easier for dialogue |
Full map
Every moment field in one view: story/story.json file map. Full tables for choices, script sugar, and Mode B: Story detail.