Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Writing techniques

Lives in: story/script.txt

Common visual-novel patterns, written in the script. Steal these shapes; change the words.

Inner voice vs spoken line

Use a plain line (no NAME:) for narrator voice and thoughts; a normal speaker line for speech:

The letter feels heavier than it should.

HANA:
I'm fine.

Or keep the same character, silent, so the mouth does not move (how (silent) works):

HANA (silent):
(Don't say it.)

HANA:
Everything's fine.

Flashback with a different look

A simple script-only flashback: change place, maybe hide the present cast, mark the voice, then jump back.

:: present
[bg street]
HANA:
I keep thinking about that day.
-> flashback

:: flashback
[bg park fade 0.8]
# Optional: switch dialogue-box look for this stretch — see Look / theme_style
Three years earlier.

HANA [closed]:
We should have left sooner.
-> present_return

:: present_return
[bg street fade 0.8]
HANA:
…Anyway.

For a lasting mood change (dimmer panel, different colours), use a second panel preset, a sticky panel command, or a theme_style mood file — Theme and the dialogue box · How a panel looks.

Phone or chat messages

Treat the phone as narrator lines or a dedicated “speaker” folder with its own pictures:

[phone center]
PHONE:
hey, you free?

HANA:
In a minute.

Or plain narrator with style:

[color=#88aaff]hey, you free?[/color]

Free-floating bubbles and custom layouts need direction data — Sprites and objects, Adding direction.

Split into routes, then join

:: fork
> Trust her. -> route_a
> Walk away. -> route_b

:: route_a
[trusted = true]
HANA:
Thank you.
-> join

:: route_b
[trusted = false]
HANA:
…Alright.
-> join

:: join
HANA:
Either way, we keep moving.
[if trusted -> trusted_extra]
-> after_join

:: trusted_extra
HANA:
I'm glad you stayed.
-> after_join

:: after_join
…

One merge moment (join) keeps the file readable. Optional extras use [if …].

A scene the reader can revisit

Share one labeled moment from several places with call / return:

:: hub
> Ask about the park. -> ask_park
> Leave. -> leave_hub

:: ask_park
[call park_info]
-> hub

:: park_info
HANA:
It's quieter after dark.
[return]

Normal story flow still uses ->. Call/return is for side visits that should resume where you left off.

Name entry at the start

:: start
[bg street fade 0.5]
What should we call you?
[input player_name "Your name?" default "Hero"]
-> intro

:: intro
HANA:
Nice to meet you, {player_name}.

Put name entry before the first long scene so {player_name} works everywhere after.

Where to go next

You can draft a whole game with only this part. When you need project defaults (text speed, saves, Back): Setting up your game. When brackets are not enough for one moment: Directing a scene.