vn_selftest
`vn.vn` runs whatever `Game.registerDialogue` was handed and knows no characters. This is the throwaway script it proves itself against: one voice, Echo**, that exists only to walk every branch of the runner.
vn_selftest — the conversation layer's own proof
vn.vn runs whatever Game.registerDialogue was handed and knows no
characters. This is the throwaway script it proves itself against: one voice,
Echo, that exists only to walk every branch of the runner.
local T = require("vn.vn_selftest")
T.install() -- portraits from the sheet
T.install(T.IMAGES_KEY) -- the same script, portraits from five images
require("game.Game").startDialogue(T.SCRIPT_ID)
Nothing loads this at boot.
What one run exercises
- every emotion frame, in order —
neutral → warm → hurt → angry → broken - a four-way choice list, and a loop back to it
- a branch ending
done = "refused" - a node carrying
grant, then a node endingdone = "granted" - a node with no
next/choices/done, which ends with outcome"end" startFaded, a two-line set used instead whenGame.fading()is pastGame.tuning.fadedThreshold
The grant node hands over T.PROBE_RESONANCE, which belongs to no ending, so
proving the grant path never puts a real Resonance in the player's hands.
The art
/zero/source/vn/art/ — five emotion frames drawn for this harness, published
twice over: echo_sheet (a 5×1 strip) and echo_<emotion> (five singles). The
two registrations T.install makes are the two shapes Game.registerPortrait
accepts, so one script proves both paths through vn_view.
Scoped to this part · feeds back into the world's score.