Документация Nyxtale

Платформа NyxtaleСправочник

Контракт scene.json

Типы узлов и их поля — контракт между компилятором и обоими интерпретаторами.

Скомпилированная сцена — это граф узлов. Типов узлов девять, и это закрытый список: всё, что умеет история, выражено ими и ничем больше.

Читать эту страницу нужно, если вы пишете инструмент над форматом, разбираете экспорт или хотите понимать, во что превращается ваш текст. Для письма достаточно синтаксиса.

Оболочка сцены

format_version   версия контракта узлов
nsx_version      версия языка, на котором написан исходник
scene            имя сцены
render           тема оформления: база + примеси
entry            узел, с которого начинается сцена
nodes            все узлы, по идентификаторам
meta             метки, схема флагов, предупреждения о контенте

entry — единственная точка входа. Достижимость считается от неё: узел, до которого нет пути от entry, недостижим по определению, а не по мнению.

Девять типов

line — реплика

Говорящий, необязательная эмоция, текст и следующий узел. next: null означает конец сцены — что будет дальше, решает уровень главы, а не сцена.

Говорящий narrator зарезервирован: это повествование, а не персонаж по имени «narrator». Разница не косметическая — по ней считается доля диалога в главе, и считать её по кавычкам в тексте означало бы разойтись с тем, что рисует редактор.

choice — выбор

Список опций, необязательный таймер и опция, которая срабатывает по его истечении. У каждой опции: текст, необязательное условие @if, необязательная цена @cost и следующий узел.

Условие делает опцию недоступной, а не невидимой на уровне контракта — как её показать (спрятать или показать серой), решает приложение.

set — присваивание

Имя флага, оператор (=, +=, -=), выражение и следующий узел. Один узел — одно присваивание.

branch — ветвление

Условие и две дороги: then и else. Любая из них может быть null — тогда ветка ведёт в конец сцены.

effect — эффект

Имя эффекта, позиционные аргументы, именованные аргументы, следующий узел. Все 94 директивы оформления компилируются сюда: узел хранит имя и аргументы, а что означает @bg или @heartbeat, знает приложение.

input — ввод читателя

Флаг, подсказка, вид ввода (text или number), следующий узел. Останавливает выполнение до тех пор, пока значение не придёт — как выбор, но без ветвления.

hold_to_act — удержание

Длительность жеста, необязательная подпись и признак fallback. Блокирующий узел: сцена ждёт, пока читатель удержит.

fallback: true (по умолчанию) добавляет доступную альтернативу — нажатие или подтверждение. При fallback: false валидатор помечает узел как риск доступности: у части читателей удержания нет физически (интенсивность).

jump — переход

Только цель. Метки в исходнике — это адреса; в скомпилированной сцене они превращаются в переходы и таблицу meta.labels.

end — концовка

Необязательное имя. Именованная концовка — это то, что читатель «нашёл»; она считается в прогрессе и в отчёте бот-обхода. Безымянная просто заканчивает сцену.

Текст локализуем

Всякий текст для читателя — реплика, текст опции, подсказка ввода, подпись удержания — хранится объектом с исходником и переводами. Перевод кладётся рядом, исходник остаётся авторским.

Что дальше