Skip to content

Story logic — conditions, changes and clocks

A branching story is only branching if it can remember. This is the half of a Narrative Flow board that keeps track: what the campaign knows, what changes it, and what reads it back.

Everything here lives on the Story panel and the node inspector in the right rail. Nothing needs a room or a live table — it all works while you write.

Open Story in the right rail and declare a variable. Three kinds cover almost everything:

Kind For
Flag Yes or no. The Duke is dead. They have the key.
Number A count. Suspicion. Gold. Favours owed.
Text A name or a word. Who they blamed.
A list of things Several. The suspects. The party. What they’re carrying.
Somebody or somewhere Points at a person or a place in your world.

Variables belong to the world, not the board — so every board and every room in that world share one campaign state. A flag set on one board is visible from another.

A list is what makes For each worth having — see Repeating, gating and calling. Edit one in the Story panel as chips you can take things out of.

A somebody or somewhere holds an actual person or place from your world, so {{ ref:suspect.display_name }} reads their name live. Rename them in your world and every line they’re in follows.

Any node can change things when the story reaches it, and any choice can change things when it’s taken. Both use the same few lines of plain text, one change per line:

suspicion += 1
gold -= 2d6
duke_dead = true
alias = "The Grey Man"
toggle alarm_raised
unset password
suspects = ["Aldren", "Mira"]
push suspects "the cook"
remove suspects "Mira"
clear suspects

That’s the whole language:

  • = sets, += adds, -= subtracts.
  • toggle flips a flag; unset forgets it entirely.
  • push adds to a list, remove takes one out, clear empties it.
  • A value can be a number, true/false, "some text", dice like 2d6, a list in [ ], or the name of another variable.

Dice are rolled when the story arrives, so gold -= 2d6 takes a different amount each time through.

If you mistype something, the line is underlined and the rest still work. The board is never left half-saved.

On a Dialogue node, each choice has an Only if… control. Pick what the condition asks about:

  • Something the campaign remembers — a variable you declared.
  • A dice rollonly if they roll 9 or more on 2d6.
  • Something about an entity — a field on an NPC or a place, read live.

You can ask about more than one thing at a time. Press …and something else and you get a group — All of these or Any of these — with a not you can flip on any line.

A gated choice a player can’t take yet is shown greyed with the reason, never hidden. You’re looking at the whole conversation; they are not.

Branch nodes work the same way, one condition per arm, checked top to bottom. The first that holds wins, and Otherwise catches the rest — so a branch is never a dead end.

Write {{ }} in any body text and it’s filled in when the line is read, not when it’s written:

"You again." {{ duke_mood }} isn't a number he'd say out loud.

You don’t have to remember the syntax. While editing a node’s text, press Insert and pick from what’s available — your declared variables, the people and places on that node, and how many times the party has been here.

Add a fallback for anything that might not be set yet:

{{ duke_title | "my lord" }}

Two nodes exist for the things a table watches happen.

Random picks one of several outcomes by weight. Wandering monsters, which door, which rumour reaches them first. Weights are relative — 1 and 3 means the second is three times as likely — and the odds are printed on the node and on each connection, so you can see the spread without opening anything.

Clock is a countdown that fills. The alarm rises. The ritual completes. Give it segments (four is usual), and it advances every time the story passes through. One connection leads onward while it’s still filling; the other fires when it fills.

By default a run starts at whichever node has nothing leading into it. Once you’ve sketched a few threads that’s ambiguous, so mark one: select a node and switch on Start here. It shows a green Start flag on the canvas, and only one node can carry it.

Press the pencil beside a variable to rename it. Every condition, every change, every cue and every {{ }} on this board moves with it, as one action you can undo in one press. It tells you how many it found before you commit.

Open the Runner and read through. Along the bottom of the prompter is a strip of your campaign’s variables, most recently changed first, with the one that just moved highlighted. Press More to see the trail: what changed, from what, to what.

To test one path without playing from the top, right-click any node and choose Play from here. If a run is already going it jumps there and keeps the variables it has accumulated — so you can test the ending as it would actually arrive, not from a clean slate.

  1. Declare suspicion as a number under Story.

  2. On a Beat, add the change suspicion += 1.

  3. On a later Dialogue choice, set Only ifSomething the campaign rememberssuspicionis at least3.

  4. Open the Runner and walk it. Watch the chip move on the strip, and the choice unlock on the third pass.