Flow tags and markup
Inline markers in dialogue text. {@…} tags are processed by the typewriter; BBCode stays for rich text.
Slow.{@cps=5} Fast.{@cps}
Wait…{@w=1.0} Go.
Page break.{@p}
Fine.{@c1} Then not.
Usually you need
| Tag | Effect |
|---|---|
{@w} | Soft pause (skipped in fast / hold) |
{@w=N} | Timed pause N seconds |
{@cps=N} / {@cps} | Mid-line speed / reset |
{@cN} | Run flow batch N while typing (1-based) |
{flag} | Print a flag value |
All {@…} tags
| Tag | Effect |
|---|---|
{@w} | Pause; click resumes; skipped in fast/hold |
{@w=N} | Timed pause N seconds |
{@p} | Pause + clear page on resume (not skipped by fast) |
{@cN} | Run flow_commands[N-1] when typing reaches this mark (1-based; does not pause). Script mid-line […] inserts these for you — Command flow, Pacing |
{@cps} | Reset CPS to theme / typing default |
{@cps=N} | Override characters per second |
{@talk:id} | Switch talking / focus (parser also inserts on speaker change) |
{@phN} | Mode B: phrase from script line N (1-based) |
{@auto} | Labelplate speaker expansion |
Flag interpolate: {flag}. Escape braces with {{ / }}.
Typing defaults: Typing · typing.
BBCode
Known tags are markup (skipped by the typing clock). Common ones: b, i, u, s, color, url, code, center, right, left, img, font, font_size, cell, table, ol, ul, p, br, indent, bgcolor, fgcolor, outline_color, outline_size, opentype_features.
Unknown [word] (for example [alt]) stays literal on the panel so typing stays in sync — it is not treated as a command or as hidden markup.
To show real square brackets (or to print a tag name literally), use [lb] / [rb] → [ / ]. Example: [lb]b[rb]bold[lb]/b[rb] displays [b]bold[/b].
Clickable [url] (body metas)
Authors write [url=META]label[/url] in dialogue text. Clicks run only on the primary panel, after the line is waiting (typing finished or paused on {@w} / {@p}), and only when the press was a tap (not a scroll drag). Wheel and drag still scroll; empty body taps still Continue.
Map keys with node text_metas (Mode B / JSON; Mode A overlay on a script node):
{
"id": "inspect_desk",
"text": "See the [url=codex]Codex[/url].",
"text_metas": {
"codex": "url:https://example.com/codex",
"door": { "type": "jump", "to": "shed" }
}
}
| Resolution | Result |
|---|---|
text_metas has key META | Run that payload |
Else META is http:// or https:// | Open as url:META |
| Else | Ignore (warning once per key) |
Allowed map values: url:… strings, or a single { "type": "jump", "to": "…" } / { "type": "set_flag", "values": { … } } object. No command arrays.
| Payload | After a successful click |
|---|---|
url:… / bare http(s) | Stay waiting — Continue still needed |
{ "type": "set_flag", … } | Stay waiting |
{ "type": "jump", … } (or a screen push that leaves the beat) | Consume wait — no second body tap |
[hint] stays visual-only (no click wiring). Append history / readonly panels do not fire metas.