Branching dialogue

Goal: a scene with a real branch — a skill check whose failure still moves the story — plus the canvas skills you'll use every day. ~15 minutes. Prereq: your first project — this picks up the gatekeeper and dlg_gate_first from there.

1. Lay down the beats

A check needs a skill to roll against, and a new project has none. Select Skills → + New → id rhetoric, then set its Name to Rhetoric and Save.

Now open dlg_gate_first. Its entry node, node_start, already carries the gatekeeper's opening line — "The gatekeeper looks you over." Click + Node twice. You get two blank nodes to the right of the graph; click each and fill its Text in the inspector:

The canvas names nodes for you — node_2, node_3, and so on — and the inspector shows the id read-only; the script view is where you can rename them. Both new nodes show red in the validation bar for now: a node nothing leads to is unreachable, and one that leads nowhere strands the player. Wiring fixes both.

Drag nodes by their headers to arrange them; positions save automatically to a gitignored sidecar, so your layout never pollutes the content diff. Auto layout reflows everything left-to-right whenever things get messy.

2. Add a choice

Select node_start. It was created as an end node, so first untick Is End — this node branches onward now. Then click + Add choice and type the choice's Text: "Talk your way past." (Its id, ch_1, is generated too.)

Every choice has a small source handle dot on its right edge — drag from it to the left edge of a target node to wire a goto. That's the whole connection model. Don't wire this one yet: the check below replaces a plain goto with two routes.

3. Turn it into a check

With the choice selected, click + Add skill check and set:

The choice now shows two handles — green (success) and red (failure). Drag green → node_2, red → node_3. On the canvas the choice wears a generated rhetoric / 12 badge — don't type [Rhetoric] into the choice text; badges derive from the data and the prose stays clean.

The inspector's probability bar previews P(success) at any stat value — difficulty tuning without spreadsheets.

Failure is content. node_3 isn't a dead end in the story — give it its own choices when you're ready (bribe? climb the wall?). The demo's body-examination scene is the pattern done well: failing the check costs a detail, never the plot.

4. Add a choiceless beat

Click + Node once more for node_4 — "Somewhere beyond the gate, a bell counts four." Now look at node_2: it has no choices, so it shows a single continue handle. Drag it to node_4: that's a next — a listen-only narration beat the player advances with one Continue → click. The player who talks their way past hears the bell; the order matters, because a beat nothing leads to is unreachable.

A node either advances with next or offers choices, never both, and a node with a next can't also be an end. The canvas only shows the continue handle on a node with no choices that isn't marked Is End.

Last, tick Is End on node_3 and node_4 so the conversation can actually finish. An unmarked dead end — no choices, no next, not an end — is a FLOW error ("player stuck"), and it keeps the validation bar red until you fix it. The Pacing panel (click empty canvas) counts your dead ends alongside scene size, branch shape, and check density.

5. Meet the script view

Flip the toolbar's Graph · Text toggle. Your scene, as editable text:

~ speaker: npc_gatekeeper
~ offer

== node_start entry ==
The gatekeeper looks you over.
- ch_1: "Talk your way past."
    check rhetoric >= 12 -> node_2 / node_3

== node_2 next=node_4 ==
'Go on through, then.'

== node_3 end ==
'Papers. Real ones. Come back with them.'

== node_4 end ==
Somewhere beyond the gate, a bell counts four.

Node attributes sit bare inside the == … == header (entry, end, next=…), and a check goes on its own indented line under its choice, with the success and failure targets after the arrow.

The script is a lossless representation — saving reproduces the JSON byte-for-byte except what you edited, and a syntax error blocks the save pointing at the line. It's also where you give nodes readable ids: change node_2 to node_pass in its header and everywhere it's targeted (here, the check line), then save. Some scenes are faster typed than clicked; use whichever fits the moment.

6. Effects, if you're ready

Anything a choice does to the world — set a flag, adjust reputation, give an item — is an effect on the choice, or an On Enter effect on a node. Record that the player talked their way past: select node_2, and under On Enter Effects click + Add effect. The type is already set flag; in the flag picker type talked_past_gate and pick the + New flag “talked_past_gate” row to create the flag inline, value true. (Until something reads the flag, it's a FLAG warning — set but never read. The next tutorial reads it.)

There are twelve effect types: set flag, adjust reputation, adjust relationship, adjust counter, give item, take item, advance quest, grant XP, set active dialogue, play cutscene, set text, and engine command. The effects reference covers each.

Where next