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.