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.
What the campaign remembers
Section titled “What the campaign remembers”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.
Changing it
Section titled “Changing it”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 += 1gold -= 2d6duke_dead = truealias = "The Grey Man"toggle alarm_raisedunset passwordsuspects = ["Aldren", "Mira"]push suspects "the cook"remove suspects "Mira"clear suspectsThat’s the whole language:
=sets,+=adds,-=subtracts.toggleflips a flag;unsetforgets it entirely.pushadds to a list,removetakes one out,clearempties it.- A value can be a number,
true/false,"some text", dice like2d6, 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.
Gating a choice
Section titled “Gating a choice”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 roll — only 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.
Putting state inside a line
Section titled “Putting state inside a line”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" }}Chance and pressure
Section titled “Chance and pressure”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.
Where a run begins
Section titled “Where a run begins”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.
Changing your mind about a name
Section titled “Changing your mind about a name”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.
Watching it while you play
Section titled “Watching it while you play”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.
-
Declare
suspicionas a number under Story. -
On a Beat, add the change
suspicion += 1. -
On a later Dialogue choice, set Only if → Something the campaign remembers →
suspicion→ is at least →3. -
Open the Runner and walk it. Watch the chip move on the strip, and the choice unlock on the third pass.