Tutorial 3 — Scoring & Multiple Endings
This is where branching gets powerful. Instead of each choice hard-wiring a path, you’ll track a hidden score that goes up when the reader is kind, and at the end a Variable Router sends them to the ending they earned. Two readers making different choices reach different endings — without you drawing a separate branch for every combination.
What you’ll use: an int variable,
Change Variable Value blocks, and a
Variable Router with
conditions.
Set up the story and the score
Create a story called The Lost Puppy. Open the Variables tab and create:
- Name:
kindness - Type:
int(whole number)
It starts at 0 automatically, so you can add to it from the very first
choice — no need to initialize it.
Write two scenes with choices
Add a starting Text block:
You find a shivering puppy in the rain. Two kids are arguing over who found it first.
Give it two choices (in Branching):
Comfort the puppy first→ leads to a kindness step (next).Ask the kids to settle down→ leads to a neutral step (next).
Add a second Text block for a later beat — The puppy’s owner appears, frantic and grateful — with two more choices:
Reunite them warmly→ another kindness step.Hand it over and leave→ a neutral step.
Don’t worry about wiring the endings yet — you’ll do that last.
Add kindness with Change Variable Value blocks
Between a kind choice and the block it leads to, drop a Change Variable Value block:
- variable_name:
kindness - delta:
1
These blocks are instant — the reader never sees them. They just bump the score by 1 and move on. Point each kind choice at one of these blocks, and have the block continue to the next scene. Leave the neutral choices going straight through without a bump.
To subtract instead, use a negative delta (e.g. -1) — handy for a
“cruelty” or “suspicion” score.
Route to an ending based on the score
After the last scene, add a Variable Router block:
- routing_variable_name:
kindness
A router’s branches aren’t buttons — each is a condition (an operator and a value), checked top to bottom, and the reader jumps to the first one that matches. Add three branches in this order:
> 1→ connect to a Best ending Text block (The whole town hears how kind you were. The End.)== 1→ connect to an Okay ending block (You did right by the pup. The End.)- Otherwise → connect to a Neutral ending block (You went on your way. The End.)
The last branch, Otherwise, always matches, so it’s a catch-all for
everyone who didn’t hit the ones above (including a score of 0).
Always end a router with an Otherwise branch. If no condition matches, the story has nowhere to go and gets stuck. Test every path in preview to be sure each score lands somewhere.
Point the start block and preview
Make sure your first scene is the starting block (Set as start). Then open the preview and play it a few ways:
- Make both kind choices →
kindnessreaches2→ Best ending (> 1). - Make one kind choice →
kindnessis1→ Okay ending. - Make no kind choices →
kindnessstays0→ Neutral ending (Otherwise).
To double-check the score, temporarily add Kindness so far: {{kindness}} to a
scene’s text — you’ll see the number climb as you play. Remove it before
publishing.
What you learned
- A hidden
intvariable can track a score across the whole story. - Change Variable Value blocks adjust it invisibly, mid-branch.
- A Variable Router reads the score and picks an ending via conditions — with a catch-all so no reader is ever stranded.
- This scales: a handful of scoring choices produces many possible endings without drawing every path by hand.
Where to go from here
You now know every building block Skaz offers. Combine them: score several
traits, gate a secret scene behind a bool flag with a
Set Variable Value block, or personalize
endings with the reader’s name from
Tutorial 2. When it plays clean in
preview, publish it and watch the
sessions roll in.