Платформа NyxtaleНачало
Первая сцена
Собрать работающую сцену с выбором, флагом и концовкой — за один присест.
История в Nyxtale — текстовый файл .nsx. Его можно открыть блокнотом, прочитать вслух и положить в
git. Движок собирает из него сцену; в Studio та же сцена доступна графом, а превью показывает её
ровно так, как увидит читатель.
Соберём сцену целиком. К концу страницы у вас будет дверь, выбор, последствие и две концовки.
Строка, которую видно
Минимальная история — это заголовок и одна реплика.
@nsx_version 1
@scene doorway
@render horror
narrator: Дверь была приоткрыта. Не настежь — именно приоткрыта, будто кто-то передумал на середине.
@end alone
Три строки заголовка и одна строка прозы. Разберём заголовок:
@nsx_version 1— версия языка. Обязательна, стоит первой.@scene doorway— имя сцены. Латиницей, без пробелов: это идентификатор, а не заголовок для читателя.@render horror— тема оформления. Пропустите — движок возьмётdefaultи предупредит.
Дальше идёт рукопись. Слово до двоеточия — говорящий. narrator зарезервирован: плашка с именем
не рисуется, читатель видит только текст. Поставьте Марк — появится плашка «Марк», и строка станет
его репликой. Подробно — реплики.
Строка @end alone завершает сцену и называет концовку. Имя концовки — ваше; движок по нему потом
покажет читателю, что он нашёл, и посчитает, сколько концовок в истории осталось ненайденными.
Развилка
Развилку даёт * — выбор:
@nsx_version 1
@scene doorway
@render horror
narrator: Дверь была приоткрыта. За ней — темнота, ровная и спокойная.
* choice "Войти"
-> inside
* choice "Уйти и не оглядываться"
-> away
@label inside
narrator: Внутри пахло пылью и чем-то ещё — тёплым, живым, неуместным.
@end trespass
@label away
narrator: Вы ушли. Дверь осталась приоткрытой ровно настолько же.
@end alone
Две строки * choice подряд дают один узел выбора с двумя опциями. Отступ под опцией — её тело:
что произойдёт, если читатель выберет её. Здесь тело — одна стрелка.
-> — переход, @label — его цель. Метка читателю не видна, это внутренний адрес. Подробно —
переходы и метки.
Подпись под примером перечисляет узлы, в которые движок собрал этот текст: line, choice, end.
Она появилась при сборке страницы — каждый пример в документации компилируется настоящим движком.
Память
Всё, что читатель сделал и что должно иметь последствия, история хранит во флагах.
@nsx_version 1
@scene doorway
@render horror
@set knows_smell = 0
narrator: Дверь была приоткрыта.
* choice "Войти"
@set knows_smell = 1
narrator: Внутри пахло тёплым. Живым.
-> hall
* choice "Уйти"
-> hall
@label hall
narrator: Через час вы стояли в коридоре и не могли объяснить, почему не уходите.
@if knows_smell == 1 -> remembers
@end alone
@label remembers
narrator: Могли. Просто не хотели произносить это вслух.
@end trespass
@set knows_smell = 0 объявляет флаг со стартовым значением, внутри опции @set knows_smell = 1 его
меняет, а @if knows_smell == 1 -> remembers читает — и уводит только того, кто действительно вошёл.
Из этих трёх шагов — присвоить, изменить, прочитать — собираются любые последствия в истории. Подробно: флаги и выражения.
Типы флагов: int, bool, str, set. Арифметика целочисленная — дробных чисел в логике нет,
чтобы превью, приложение и повтор по сохранению считали одинаково.
Атмосфера
Фон, звук, эффекты задаются директивами — строками с @:
@bg corridor_night
@ambient wind_howl loop
@fx film_grain 0.4
narrator: Свет фонаря доставал метра на три и там кончался.
@bg ставит фон, @ambient — звук петлёй, @fx — постэффект. Аргументы позиционные, порядок задан
сигнатурой. Все 94 директивы с типами и границами — в
справочнике, он собран из движка.
Ассеты пишутся идентификатором (corridor_night); файл загружается отдельно, в тексте стоит имя.
Подробно — директивы.
Этот пример — фрагмент: у него нет заголовка и концовки, поэтому проверен только синтаксис. Целые сцены проверяются целиком, включая наличие выхода.
Что проверит движок
Перед публикацией история проходит проверку на целостность:
- тупик — узел, из которого нет ни выбора, ни
@end. Читатель упирается в стену; - недостижимый узел — вы написали сцену, в которую не ведёт ни одна дорога;
- ловушка-цикл — из этого круга нельзя выйти ни к одной концовке;
- битая ссылка —
-> inside, а меткиinsideнет; - чтение флага до записи — есть путь, на котором флаг спрашивают раньше, чем задают.
Каждая проверка называет узел и предлагает починку. Все коды — в справочнике диагностик. Проверяется проходимость истории; качество текста остаётся на вас.
Дальше
Сцена собрана. Дальше — полный синтаксис: условия блоком, платные выборы, таймеры, подстановка флагов в текст и всё, что не поместилось в первый заход.