Chronicles · Intermediate · Tutorial 2 of 3

Making It Branch

The demo conversation offers the player two choices and both of them end it. Turning that into an actual branch is this tutorial — and it's where Chronicles' one genuinely valuable safety check lives.

AshForge ChroniclesAfter: The Shape of a Quest~30 min

Quests were structured rows. Dialogue is a graph — nodes of speech, joined by the choices between them — and it is edited two different ways at once, which is the part worth understanding before you touch anything.

Open the demo and notice what's missing

01 Dialogues → Elder Greeting

Switch to the Dialogues tab and select Elder Greeting. The inspector splits: a node graph in the top pane, and a scrolling form beneath it. The hint under the buttons spells out the division — "node graph is the top pane; wheel zooms/pans there; this form scrolls."

There is exactly one node. The Elder says "Stranger… you carry the old mark." and offers two choices. Scroll the form down to the Choices box and you'll see why that isn't a conversation yet:

I come in peace.||
I seek the cache.||

Each line is Text | NextNodeId | Condition. Both NextNodeId slots are empty, and empty means end. The player is offered a fork where both paths stop.

Elder "…the old mark." ends ends Elder "…the old mark." Welcome The cache… what ships what you wire
Two choices with nowhere to go is a menu, not a branch. The right-hand shape is thirty seconds of work away.

Two editors, one model

The Choices box carries its own warning label: "Choices (Text|NextNodeId lines; connections in graph also update this)". That parenthesis is the important part.

The graph and the text box are two views of the same data. Drag a connection in the top pane and the text below rewrites itself. Type an id into the text and the graph redraws. Neither is the “real” one — and there is a Sync Graph <-> Model button precisely because two views over one model can drift apart.

Use whichever suits the job. The graph is better for shape — seeing where a conversation loops, spotting an orphan. The text is better for precision, and it's the only place the Condition field is reachable at all.

02 Add a node and wire it

Above the form are + NPC Node and + Player Node, plus a generic Add Dialogue Node and an Add Node (text) button lower down. Add two nodes — one reply for each existing choice.

Now connect them, either by dragging from the Elder node's right-hand port to a new node's left port, or by typing ids. To type them you need the ids, and the form gives you them: each node's header in the scrolling form reads Node 0 (5b868865) — the number is its position, the parenthesised value is its id.

I come in peace.|5b868865|
I seek the cache.|a91c3f02|

Reload the graph and the fork is real.

Ids are generated, not chosen. They're eight hex characters minted when the node is created, so yours will differ from every example here. Always read the id out of the form rather than copying one from a tutorial.

The third slot

Each choice line has room for one more field: Text | NextNodeId | Condition. A condition gates whether the choice is offered at all — the data model gives the shape of it as a prerequisite expression, quest:foo.complete.

Chronicles does not evaluate it. It doesn't parse it, check it, or warn you if it's nonsense. What it does do is carry it: the export writes each choice as { text, next, condition }, and the game is what reads the third field and decides.

If you did the Sentinel tutorials this will feel familiar, and it should. Both editors author declarations that the game fulfils — Sentinel names tasks it doesn't implement, Chronicles writes conditions it doesn't evaluate. That's the suite's shape, not a gap in either tool.

The check that earns its keep

Tutorial one said Validate is a broken-link checker. This is the link it checks, and it is the one bug in a branching conversation you genuinely cannot see by reading.

03 Break it on purpose

Point a choice at a node that doesn't exist — edit a line to read I seek the cache.|deadbeef| — click away so the edit commits, then press Validate:

Validation found 1 issue(s).

Dialogue 'Elder Greeting': choice "I seek the cache."
links to a missing node (deadbeef)

It names the dialogue, quotes the choice text, and prints the id that went nowhere. Put the real id back and it returns to “Narrative validation passed — no issues found.”

This matters more than it looks. A dangling NextNodeId is invisible in the graph — there's simply no line drawn, which looks identical to a choice that deliberately ends. It survives a read-through, because the text still makes sense. It only shows up in play, when a conversation stops dead in the middle.

Run Validate after any session of re-wiring, and especially after deleting a node. Deleting the node does not clear the choices that pointed at it — those choices are left aimed at an id that no longer exists, and this check is the only thing standing between that and a player.