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

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

Директивы

Все директивы @: сигнатура, аргументы, границы, пометки безопасности.

Все директивы движка — 96 в 16 категориях. Эта страница собирается из реестра DIRECTIVES при сборке сайта: это тот же реестр, который читают компилятор, валидатор и палитра механик в Studio. Появилась директива — она здесь, править нечего.

⚡ фоточувствительно ◐ масштабируется интенсивностью

Текст 16

Подробнее: Синтаксис

@autoadvance [mode]

Авто-адванс vs тап — темп чтения

Переключает чтение между автопрокруткой и тапом. Автопрокрутка забирает у читателя контроль над темпом, поэтому включайте её на короткий отрезок и выключайте явно.

modeenum, необязательный
on — само, off — по тапу.on · off
@autoadvance on
narrator: Дальше всё шло без него.
@autoadvance off

@font <face>

Смена гарнитуры (serif/mono/sans)

Меняет гарнитуру: с засечками (чтение), машинописная (терминал, документ) или рубленая. Держится до следующей смены.

faceenum
serif, mono или sans — гарнитуры, которые в приложении есть.serif · mono · sans
@font mono
narrator: ОТЧЁТ № 114. СТРАНИЦА 2 ОТСУТСТВУЕТ.

@instant

Мгновенный вывод реплики

Следующая реплика появляется целиком, без набора.

Без аргументов.

Читатель видитСтрока возникает сразу.

@instant
narrator: БЕГИ

@lineheight <scale>

Межстрочный ритм (дыхание строк)

Межстрочный интервал — дыхание абзаца. Держится до следующей смены.

scalefloat
Множитель, 0.5…3. Больше — просторнее.0.5…3
@lineheight 2
narrator: Между строками было слишком много места.

@redact

Редакция: [ДАННЫЕ УДАЛЕНЫ]

Включает редакцию: следующие реплики выходят вымаранными. Снимается @unredact. Вымаранная строка сообщает больше написанной — читатель видит, что здесь что-то было.

Без аргументов.

Читатель видитТекст закрыт полосой.

@classify keter
@redact
narrator: Субъект был доставлен в 03:40 в сопровождении двух сотрудников.
@unredact
narrator: Остальное в деле отсутствует.

@shout

Крик — крупный резкий текст

Следующая реплика выходит крупным резким текстом.

Без аргументов.

@shout
mark: УХОДИ ОТТУДА!

@stagger [per_word_ms]

Стаггер: слова проступают по одному

Следующая реплика проступает по одному слову.

per_word_msint, необязательный
Задержка между словами в миллисекундах.0…∞
@stagger 300
narrator: Кто-то. Стоял. В коридоре.

@text_corrupt [amount]

Порча текста — буквы искажаются

Порча букв в строке — символы подменяются. Знак того, что источник текста ненадёжен.

amountfloat, необязательный
Доля искажённых символов, 0…1.0…1
@text_corrupt 0.3
narrator: Он написал имя, но прочесть его было уже нельзя.

@text_erase

Самостирающийся текст

Строка стирает сама себя после того, как её прочли.

Без аргументов.

Читатель видитТекст исчезает с экрана сам.

@text_erase
narrator: Запомни это. Второй раз не покажу.

@text_fade [dir]

Проявление/растворение строки

Строка проявляется или растворяется.

direnum, необязательный
in — проявиться, out — раствориться.in · out
@text_fade out
narrator: Голос стих раньше, чем закончил фразу.

@text_shake [amount]

Дрожь текста — нестабильная реплика

Дрожь самой строки — реплика, произнесённая нетвёрдо.

amountfloat, необязательный
Амплитуда, 0…1.0…1
@text_shake 0.5
mark: Я н-ничего не видел.

@textsize <level>

Размер текста — уровень 1–6

Размер текста уровнем от 1 до 6. Держится до следующей смены.

levelint
Уровень 1…6, где 1 — самый мелкий.1…6
@textsize 5
narrator: ОН СТОЯЛ ПРЯМО ЗА НЕЙ.

@textspeed <cps>

Скорость печати текста

Скорость набора текста в символах в секунду. Держится до следующей смены.

cpsint
Символов в секунду. Обычное чтение — 30…60, медленное — 10.
@textspeed 12
narrator: Он. Читал. Каждое. Слово.

@thought <who> <text> [tone]

Мысль персонажа — бабл рядом с ним

То, что персонаж думает, но не говорит. Пишется отдельной строкой под репликой: @thought <кто> "<мысль>" — мысль ОБЯЗАТЕЛЬНО в кавычках, без них она обрывается на первом пробеле. Выходит баблом рядом с персонажем, а не в панели реплик: сторона выбирается сама — персонаж слева, бабл справа; справа — бабл слева; в центре — сверху. Мысль — это текст, который читают, поэтому она держит кадр как обычная реплика, и на это время панель реплик уходит в тень, чтобы читалось одно: сначала реплика, потом мысль. Две мысли подряд не затирают друг друга — первая ещё пару секунд висит и растворяется, вторая встаёт под ней.

whostring
Тот же id, что стоит в @sprite, без кавычек. Если персонажа сейчас нет на сцене, бабл выйдет по центру.
textstring
Сама мысль, в кавычках — целиком, вместе с пробелами и знаками.
toneenum, необязательный
Настроение бабла: dusk (по умолчанию, сумрачный), dark (почти чёрный), light (светлый, тёмным по светлому), blood (кровавый), ember (тёплый, как свеча), cold (холодный серый). Цвета берутся из палитры темы истории, поэтому тон везде свой.dusk · dark · light · blood · ember · cold

Читатель видитРядом с персонажем всплывает овальный бабл с его мыслью, с тёмной дымкой за ним.

@sprite elena left
elena: Всё в порядке.
@thought elena "Он врёт."
@thought elena "И всегда врал." blood

@unredact

Снять редакцию — раскрыть скрытый текст

Снимает редакцию, включённую @redact. Без предшествующего @redact не делает ничего — снимать нечего.

Без аргументов.

@redact
narrator: Имя оператора: [вымарано]
@unredact
narrator: Дальше страница чистая.

@whisper

Шёпот — мелкий тусклый текст

Следующая реплика выходит мелким тусклым текстом.

Без аргументов.

@whisper
narrator: он всё ещё здесь

Время 5Nightfall Stories

Подробнее: Темп и длина

@cut

Резкий склейка-кат (flash-cut)

Резкая склейка, в том числе посреди фразы. Приём монтажа: обрыв на полуслове читается как смена кадра, а не как ошибка.

Без аргументов.

Читатель видитКадр меняется мгновенно.

narrator: Он успел сказать только «не открывай»
@cut
@bg kitchen_day
narrator: Утром никто об этом не вспомнил.

@delay <seconds>

Отложенное появление элемента

Откладывает появление следующего элемента, не останавливая сцену целиком.

secondsfloat
Задержка в секундах.0…∞
@delay 1.5
narrator: И только потом стало слышно шаги.

@hold_black [seconds]

Fade-to-black и держать

Кадр уходит в чёрное и держится. Граница между сценами или удар по паузе.

secondsfloat, необязательный
Сколько держать черноту.

Читатель видитЭкран чернеет на заданное время.

@hold_black 3
narrator: Когда свет вернулся, стул стоял иначе.

@pause <seconds>

Пауза/удержание

Пауза до следующей строки. Перед репликой работает сильнее любого выделения: читатель успевает поднять голову.

secondsfloat
Длительность в секундах.
narrator: Он позвал её по имени.
@pause 2
narrator: Никто не ответил.

@slowmo

Замедление момента

Растягивает происходящее. За эпизод работает один раз, дальше читается как торможение.

Без аргументов.

Читатель видитВсё замедляется.

@slowmo
narrator: Стакан шёл к полу целую жизнь.

Звук 6Nightfall Stories

Подробнее: Атмосфера как материал

@ambient <audio> [loop] [volume]

Фоновый эмбиент

Фоновый звук. С loop играет петлёй, пока его не снимут @silence или другим @ambient.

audioasset
Идентификатор звука — из базовой библиотеки или из ресурсов истории.
loopenum, необязательный
Слово loop, если звук должен идти петлёй.loop
volumeint, необязательный
Громкость 0…100. Без неё — громкость по умолчанию.0…100

Читатель видитЗвук идёт фоном.

@ambient wind_howl loop 60
narrator: Ветер не прекращался с самого вечера.

@dissonance [amount]

Нарастание диссонанса (↔ рассудок)

Нарастающий диссонирующий гул отдельным слоем, тоже синтезированный. Обычно связывают со шкалой рассудка: чем ниже, тем выше значение.

amountfloat, необязательный
Сила, 0…1.0…1

Читатель видитПод сценой появляется гул, тем резче, чем выше значение.

@set sanity = 0
@dissonance 0.7
narrator: Звук шёл как будто из стен.

@heartbeat [bpm]

Сердцебиение (темп ↔ напряжение)

Сердцебиение отдельным слоем. Звук синтезируется движком, файл загружать не нужно; темпом показывают напряжение.

bpmint, необязательный
Ударов в минуту. Спокойное — около 60, паника — за 120.

Читатель видитСлышно сердцебиение в заданном темпе.

@heartbeat 120
narrator: Он не слышал ничего, кроме себя.

@pan <x>

Бинауральный пан — «звук за спиной»

Смещает звук влево или вправо — «звук за спиной». Работает в наушниках.

xfloat
От −1 (слева) до 1 (справа), 0 — по центру.-1…1

Читатель видитЗвук смещается в одно ухо.

@pan -0.8
@sound footstep
narrator: Шаг был слева, хотя слева была стена.

@silence

Тишина — обнулить аудио-слои

Обрывает все звуковые слои. Обрыв слышен сильнее удара: петля шла десять минут, читатель перестал её замечать, и вдруг её нет.

Без аргументов.

Читатель видитЗвук пропадает.

@ambient wind_howl loop
narrator: Ветер не прекращался с самого вечера.
@silence
narrator: А потом прекратился.

@sound <audio> [volume]

Разовый звук/стингер

Разовый звук: удар, скрип, стингер. Играет один раз и заканчивается.

audioasset
Идентификатор звука — из базовой библиотеки или из ресурсов истории.
volumeint, необязательный
Громкость 0…100.0…100

Читатель видитЗвук проигрывается один раз.

@sound door_creak
narrator: Дверь открылась сама.

Изображение 18Nightfall Stories

Подробнее: Атмосфера как материал

@bg <image> [@alt <alt>]

Фон сцены

Ставит фон сцены. Держится, пока другой @bg его не сменит, и переживает реплики, выборы и переходы по меткам; при переходе в другую сцену кадр сбрасывается.

imageasset
Идентификатор изображения из ресурсов истории, а не имя файла.
@altstring, именованный
Описание изображения для скринридера. Без него валидатор даёт NSX_ALT_TEXT_MISSING.

Читатель видитФон меняется под текстом.

@bg corridor_night @alt "Больничный коридор ночью, лампы горят через одну"
narrator: Свет доставал метра на три и там кончался.

@chromatic [amount] [@reduce_motion <reduce_motion>]

Хроматическая аберрация

Хроматическая аберрация — цветные каналы расходятся по краям.

amountfloat, необязательный
Сила расхождения, 0…1.0…1
@reduce_motionstring, именованный
Что делать при сниженном движении: off — не играть, keep — играть как есть, либо имя другого, спокойного эффекта на замену.

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

@chromatic 0.4
narrator: Глаза не держали фокус.

@desaturate [amount]

Слив цвета — обесцвечивание кадра

Сливает цвет из кадра. Держится, пока не снимете: @desaturate 0 возвращает цвет.

amountfloat, необязательный
Сколько цвета убрать, 0…1.0…1

Читатель видитКадр обесцвечивается.

@desaturate 0.8
narrator: Всё стало цвета мокрого бетона.

@flash [@reduce_motion <reduce_motion>]

Вспышка-раскрытие (молния)

Короткая вспышка на весь кадр — молния, свет фар, срабатывание вспышки.

@reduce_motionstring, именованный
Что делать при сниженном движении: off — не играть, keep — играть как есть, либо имя другого, спокойного эффекта на замену.

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

@flash
narrator: В зеркале, за секунду до темноты, стояли двое.

@flashlight [mode] [aim]

Луч фонаря — видно только конус света

Гасит кадр и оставляет видимым только конус света — он расходится от руки читателя вглубь сцены, поэтому углы кадра остаются тёмными. Свет холодный, в отличие от тёплой свечи, которая горит в сцене сама по себе. Это состояние, а не вспышка: держится, пока автор не сменит кадр. Снимается сменой фона (@bg), сменой сцены или явным @flashlight off.

modeenum, необязательный
off — убрать фонарь. Без аргумента — включить.on · off
aimenum, необязательный
aimed — луч ведёт читатель: он ходит за пальцем по кадру, и видно только то, на что читатель посветил. Без аргумента — fixed, луч стоит там, где его поставил автор.fixed · aimed

Читатель видитКадр виден только в конусе света; с aimed читатель водит лучом сам.

@flashlight
narrator: Луч дрожал вместе с рукой.
narrator: За кругом света что-то переступило с ноги на ногу.
@flashlight on aimed
narrator: Свети сам. Где-то здесь были дрова.
@flashlight off

@flicker [tint] [@reduce_motion <reduce_motion>]

Мерцание источника света

Мерцание источника света. Свяжите его с состоянием: фонарь, начавший мигать в третьей главе, к пятой должен сесть.

tintenum, необязательный
Цвет: black (по умолчанию), red, green, amber. Оттенок берётся из темы истории, поэтому «красный» одной истории и «красный» другой — разные красные.black · red · green · amber
@reduce_motionstring, именованный
Что делать при сниженном движении: off — не играть, keep — играть как есть, либо имя другого, спокойного эффекта на замену.

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

@flicker red
narrator: Лампа моргнула дважды и передумала.

@fog [density]

Туман/дымка — глубина и сокрытие

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

densityfloat, необязательный
Плотность, 0…1. @fog 0 убирает дымку.0…1

Читатель видитКадр затягивает дымкой.

@fog 0.6
narrator: Другой берег угадывался только по огням.

@fx <kind> [amount] [@reduce_motion <reduce_motion>]

Пост-эффект

Общая форма записи для пяти пост-эффектов: то же самое можно написать отдельной директивой (@fx glitch 0.4 и @glitch 0.4 дают одно и то же).

kindenum
Какой эффект наложить.film_grain · glitch · vhs · chromatic · desaturate
amountfloat, необязательный
Сила, 0…1. Без неё берётся значение по умолчанию для этого эффекта.0…1
@reduce_motionstring, именованный
Что делать при сниженном движении: off — не играть, keep — играть как есть, либо имя другого, спокойного эффекта на замену.

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

@fx film_grain 0.4
narrator: Плёнка шла с шумом, будто её уже кто-то смотрел.

@glitch [amount] [@reduce_motion <reduce_motion>]

Глитч-искажение кадра

Искажение кадра — разрывы развёртки, сдвиги. Знак того, что запись повреждена.

amountfloat, необязательный
Сила, 0…1. Без неё берётся значение по умолчанию.0…1
@reduce_motionstring, именованный
Что делать при сниженном движении: off — не играть, keep — играть как есть, либо имя другого, спокойного эффекта на замену.

Читатель видитКадр рвётся и смещается. Фоточувствительный эффект: при мягких настройках он не сыграет вообще, поэтому смысл сцены должен читаться и без него.

@glitch 0.5
narrator: Запись дёрнулась, и на секунду в кадре был кто-то третий.

@jumpscare <image> [@sound <audio>] [@reduce_motion <reduce_motion>] [@alt <alt>]

Джампскейр

Резкий показ изображения со звуком. На историю его хватает одного: второй уже не пугает, третий раздражает.

imageasset
Идентификатор изображения из ресурсов истории.
@soundasset, именованный
Идентификатор звука, который играет вместе с кадром.
@reduce_motionstring, именованный
Что делать при сниженном движении: off — не играть, keep — играть как есть, либо имя другого, спокойного эффекта на замену.
@altstring, именованный
Описание изображения для скринридера. Без него валидатор даёт NSX_ALT_TEXT_MISSING.

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

@jumpscare face_in_window @sound stinger_01 @alt "Лицо в окне, вплотную к стеклу"

@reveal_bg <image> [@alt <alt>]

Явить/скрыть фон — что показано

Показывает или прячет фон — то, что было скрыто, становится видно.

imageasset
Идентификатор изображения из ресурсов истории.
@altstring, именованный
Описание изображения для скринридера. Без него валидатор даёт NSX_ALT_TEXT_MISSING.
@reveal_bg cellar_full @alt "Погреб целиком: у дальней стены стоят ящики"

@sprite <image> [slot] [scale] [@alt <alt>]

Спрайт персонажа

Показывает персонажа поверх фона. Слот определяет место на экране: повторный @sprite в тот же слот заменяет того, кто там стоял.

imageasset
Идентификатор изображения из ресурсов истории.
slotstring, необязательный
Место на экране (left, center, right). Без него берётся слот по умолчанию.
scalefloat, необязательный
Множитель размера, 1 — обычный. Картинка всегда вписывается в отведённую полосу экрана, поэтому размер задаётся множителем, а не пикселями: 1.4 — крупнее (ближе к камере), 0.7 — мельче (в глубине кадра). Персонаж растёт вверх, ноги остаются на месте.0.25…3
@altstring, именованный
Описание изображения для скринридера. Без него валидатор даёт NSX_ALT_TEXT_MISSING. Для спрайта описывайте СОСТОЯНИЕ: «Марк, весь в грязи, держится за плечо».
@sprite mark_hurt left 1.3 @alt "Марк, весь в грязи, держится за плечо"
mark: Я в порядке.

@sprite_hide [slot]

Убрать спрайт из слота

Убирает персонажа из слота. Без аргумента очищает слот по умолчанию.

slotstring, необязательный
Слот, который нужно освободить.
@sprite_hide left
narrator: Он ушёл, не дожидаясь ответа.

@sprite_shake [slot] [amount]

Тремор спрайта персонажа

Тремор персонажа в слоте. Без спрайта в слоте ничего не делает.

slotstring, необязательный
Слот, чей спрайт трясётся.
amountfloat, необязательный
Амплитуда, 0…1.0…1
@sprite shivering_man left @alt "Мужчина в мокрой куртке"
@sprite_shake left 0.4

@strobe [hz] [@reduce_motion <reduce_motion>]

Строб — резкое мерцание (частота ограничена §17)

Резкое мерцание с заданной частотой. Частота ограничена жёстко: выше безопасного порога значение зажимается на стороне читателя, а валидатор предупреждает.

hzfloat, необязательный
Вспышек в секунду. Выше безопасного порога валидатор даёт NSX_PHOTOSENSITIVE_LIMIT.0…∞ безопасно до 3
@reduce_motionstring, именованный
Что делать при сниженном движении: off — не играть, keep — играть как есть, либо имя другого, спокойного эффекта на замену.

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

@strobe 2
narrator: Аварийный свет считал секунды за него.

@vhs [amount] [@reduce_motion <reduce_motion>]

VHS-развёртка

Развёртка видеокассеты: полосы, дрожание строк. Заявляет носитель — читатель смотрит запись.

amountfloat, необязательный
Сила, 0…1. Без неё берётся значение по умолчанию.0…1
@reduce_motionstring, именованный
Что делать при сниженном движении: off — не играть, keep — играть как есть, либо имя другого, спокойного эффекта на замену.

Читатель видитКадр идёт как с кассеты. Фоточувствительный эффект: при мягких настройках он не сыграет вообще, поэтому смысл сцены должен читаться и без него.

@vhs
narrator: Счётчик в углу шёл назад.

@vignette [amount] [tint]

Виньетка — сжатие поля зрения

Затемняет края кадра, сужая поле зрения. Хорошо работает вместе с @flashlight: конус света и темнота вокруг него.

amountfloat, необязательный
Сила затемнения, 0…1.0…1
tintenum, необязательный
Цвет: black (по умолчанию), red, green, amber. Оттенок берётся из темы истории, поэтому «красный» одной истории и «красный» другой — разные красные.black · red · green · amber

Читатель видитКрая кадра темнеют — в чёрное или в названный цвет.

@vignette 0.7 green
@flashlight
narrator: Дальше конуса не было ничего.

Камера 5Nightfall Stories

Подробнее: Атмосфера как материал

@dutch [degrees]

Голландский угол — тревога

Заваливает горизонт. Классический приём тревоги — кадр перестаёт стоять ровно.

degreesfloat, необязательный
Угол наклона в градусах.0…12

Читатель видитКадр наклоняется.

@dutch 8
narrator: Комната стояла неправильно, и он не сразу понял чем.

@letterbox [amount]

Киношные полосы на пике

Кинематографические полосы сверху и снизу. Не гасится настройкой интенсивности — это рамка кадра. @letterbox 0 убирает полосы.

amountfloat, необязательный
Высота полос, 0…1.0…1

Читатель видитКадр обрезается полосами сверху и снизу.

@letterbox 0.8
narrator: Дальше всё шло как в чужом фильме.

@pan_cam <x> [y]

Панорама камеры по фону

Панорама камеры по фону — кадр едет, не меняя изображения.

xfloat
Смещение по горизонтали.-1…1
yfloat, необязательный
Смещение по вертикали.-1…1

Читатель видитКадр плавно смещается.

@pan_cam 0.5
narrator: Взгляд прошёл вдоль стены до самого угла.

@shake [amount]

Тряска экрана

Тряска всего экрана: удар, взрыв, толчок.

amountfloat, необязательный
Амплитуда.0…1

Читатель видитЭкран трясёт.

@shake 0.6
@sound impact_low
narrator: Что-то ударило в дверь с той стороны.

@zoom <scale>

Наезд/отъезд камеры

Наезд или отъезд камеры по фону.

scalefloat
Больше 1 — наезд, меньше 1 — отъезд.

Читатель видитКадр приближается или отдаляется.

@zoom 1.4
narrator: На снимке, в углу, было ещё одно лицо.

Взаимодействие 4Nightfall Stories

Подробнее: Дизайн ветвления

@choice_shake [amount]

Дрожащая кнопка выбора

Дрожь кнопки выбора — опция, которая даётся тяжело.

amountfloat, необязательный
Амплитуда, 0…1.0…1
@choice_shake 0.5
* choice "Признаться"
    -> confess
* choice "Молчать"
    -> silent

@choices_fade [seconds]

Опции проступают с задержкой

Опции выбора проступают с задержкой. Даёт прочитать сцену прежде, чем читатель потянется к кнопке.

secondsfloat, необязательный
Задержка перед появлением опций.0…∞
@choices_fade 1.5
* choice "Открыть"
    -> inside
* choice "Уйти"
    -> away

@haptic

Тактильная отдача

Тактильная отдача на телефоне. На устройствах без вибрации не делает ничего.

Без аргументов.

Читатель видитКороткая вибрация.

@haptic
@sound impact_low
narrator: Пол под ногами дёрнулся.

@hold_to_act [duration_ms] [label] [@fallback <fallback>]

Удержание для действия — блокирующий жест (§17: с доступной альтернативой)

Блокирующий жест: сцена ждёт, пока читатель удержит нажатие. Рядом по умолчанию идёт доступная альтернатива — обычное нажатие.

duration_msint, необязательный
Сколько держать, в миллисекундах (200…10000).200…10000
labelstring, необязательный
Подпись для читателя, например «Удерживай».
@fallbackenum, именованный
on (по умолчанию) — есть альтернатива нажатием. off валидатор помечает как риск: у части читателей удержания нет физически.on · off

Читатель видитПоявляется элемент, который нужно удерживать.

@hold_to_act 2000 "Держи дверь"
narrator: С той стороны перестали толкать.

Раскрытие 4Nightfall Stories

Подробнее: Атмосфера как материал

@classify <class>

Классификация объекта (Safe/Euclid/Keter…)

Класс объекта в духе засекреченного досье. Заявляет носитель — читатель смотрит дело.

classenum
Класс объекта.safe · euclid · keter · thaumiel · apollyon
@classify keter
narrator: Условия содержания пересмотрены после инцидента 12/04.

@clearance_gate <level>

Гейт контента по уровню допуска

Гейт по уровню допуска: часть материала показывается только тем, кто дошёл до нужного уровня. Язык документа — работает вместе с @classify и @redact.

levelint
Требуемый уровень допуска, целое число.0…∞
@clearance_gate 4
@redact
narrator: Приложение 4-B доступно с уровня 4.

@foreshadow <key>

Предзнаменование/обратный вызов (маркер)

Маркер предзнаменования: помечает деталь, которая выстрелит позже. Помогает вам самому проверить, что обещание было дано до того, как исполнилось.

keystring
Имя предзнаменования, латиницей — то же, что потом в @reveal.

Читатель видитничего — это скрытая пометка, она проявится позже.

@foreshadow the_second_key
narrator: На гвозде у двери висел лишний ключ.

@reveal <key>

Контролируемое раскрытие (маркер)

Маркер контролируемого раскрытия: отмечает, что читателю здесь стало известно нечто. Ставится для себя и для отчётов, ветвление на нём не строится — для этого есть флаги.

keystring
Имя того, что раскрыто, латиницей.
@reveal who_sent_the_letter
narrator: Подпись внизу была её.

Мета 6

Подробнее: Что такое Nyx

@arg_code <code>

ARG-код: внешняя загадка/гейт

Код внешней загадки: строка, которую читатель ищет вне истории. Сам по себе гейтом не является — гейт вы строите условием.

codestring
Код, который читатель должен найти.
@arg_code SEVEN_DOORS
narrator: На обороте снимка было написано семь букв.

@fake_crash [@reduce_motion <reduce_motion>]

Поддельный краш

Поддельный сбой приложения. Сильный и рискованный приём: часть читателей решит, что сломалось.

@reduce_motionstring, именованный
Что делать при сниженном движении: off — не играть, keep — играть как есть, либо имя другого, спокойного эффекта на замену.

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

@fake_crash
narrator: …

@meta_break

Слом 4-й стены

Слом четвёртой стены: история обращается к читателю напрямую. Приём одноразовый — второй раз он читается как манера, а не как событие.

Без аргументов.

@meta_break
narrator: Ты ведь уже читал это однажды.

@notify [text]

Поддельное системное уведомление

Поддельное системное уведомление — сообщение будто бы не от истории.

textstring, необязательный
Текст уведомления. Показывается читателю как есть, без обработки.

Читатель видитПлашка «Уведомление» с вашим текстом. Несколько уведомлений подряд читатель видит по очереди — одно за другим, в порядке записи, а не пачкой поверх друг друга.

@notify "Батарея 4%. Подключите зарядное устройство."

@persona <field>

Персонализация: имя/время/устройство/дата

Подставляет в текст данные читателя: имя, время, устройство, дату. Сильнее всего работает один раз и в тот момент, когда история якобы не должна этого знать.

fieldenum
Что подставить.name · time · device · date
@persona time
narrator: Сейчас у тебя ровно это время. Проверь.

@terminal

Диегетический терминал/консольный ввод

Диегетический терминал — текст выходит как консольный вывод.

Без аргументов.

Читатель видитЭкран принимает вид терминала.

@terminal
@font mono
narrator: > доступ разрешён
narrator: > загружаю журнал за 12/04

Тема 1Nightfall Stories

Подробнее: Атмосфера как материал

@sanity_show

Показать индикатор рассудка

Показывает индикатор рассудка. Постоянно держать его не обязательно: часто сильнее, когда индикатор появляется в тот момент, когда стало плохо.

Без аргументов.

Читатель видитНа экране появляется шкала рассудка.

@sanity_show
@set sanity = 0
@set sanity -= 20

Шкалы 3Nightfall Stories

Подробнее: Шкалы состояния

@meter_hide <meter>

Скрыть шкалу состояния

Убирает шкалу с экрана. Значение флага при этом не меняется.

meterenum
Какая шкала.sanity · fear · health · infection · will · faith · curse · suspicion · reputation · morale · hunger · thirst · fatigue · warmth · oxygen · battery · noise · visibility
@meter_hide sanity
narrator: Считать перестало иметь смысл.

@meter_show <meter>

Показать шкалу состояния в HUD

Выводит шкалу состояния на экран. Сама шкала — обычный целый флаг с границами, объявленный в схеме флагов; директива только показывает его читателю.

meterenum
Какая шкала. Имя должно совпадать с флагом в схеме.sanity · fear · health · infection · will · faith · curse · suspicion · reputation · morale · hunger · thirst · fatigue · warmth · oxygen · battery · noise · visibility

Читатель видитНа экране появляется шкала с текущим значением.

@set sanity = 0
@meter_show sanity
@set sanity -= 15

@sanity_distort [amount] [@reduce_motion <reduce_motion>]

Искажение восприятия при низком рассудке

Искажает восприятие — подача меняется вместе с состоянием. Обычно связывают со шкалой рассудка: чем ниже, тем выше значение.

amountfloat, необязательный
Сила искажения, 0…1.0…1
@reduce_motionstring, именованный
Что делать при сниженном движении: off — не играть, keep — играть как есть, либо имя другого, спокойного эффекта на замену.

Читатель видитКадр и текст искажаются. Фоточувствительный эффект: при мягких настройках он не сыграет вообще, поэтому смысл сцены должен читаться и без него.

@set sanity = 0
@set sanity -= 20
@sanity_distort 0.6
narrator: Руки не слушались, и буквы расползались.

Ресурсы 6Nightfall Stories

Подробнее: Предметы и ресурсы

@craft <result>

Крафт: собрать предмет из частей

Объявляет, что предмет собран из частей. Проверку наличия частей делаете вы условием.

resultstring
Имя получившегося предмета, латиницей. Идентификатор показывается читателю: подчёркивания заменяются пробелами, первая буква становится заглавной (old_photo → «Old photo»). Поэтому пишите его так, как он должен читаться.

Читатель видитПлашка «Собрано» с именем предмета.

@craft makeshift_torch
narrator: Тряпка, ветка и остаток керосина.

@currency <op> <amount>

Внутриигровая валюта (мир, не монетизация §07)

Внутриигровая валюта: монеты, патроны, свечи. К реальным покупкам отношения не имеет и в одной шкале с ними не считается.

openum
add — начислить, spend — потратить.add · spend
amountint
Сколько.0…∞

Читатель видитПлашка «Получено» или «Потрачено» с суммой.

@currency add 5
narrator: В кармане пальто нашлась мелочь.

@inventory_show

Открыть инвентарь

Открывает список предметов читателю.

Без аргументов.

@inventory_show
narrator: Всё, что у него было, помещалось в один карман.

@item_get <item>

Получить предмет в инвентарь

Кладёт предмет в инвентарь. Инвентарь — флаг типа set, повторное добавление ничего не меняет.

itemstring
Имя предмета, латиницей. Идентификатор показывается читателю: подчёркивания заменяются пробелами, первая буква становится заглавной (old_photo → «Old photo»). Поэтому пишите его так, как он должен читаться.

Читатель видитПлашка «Получено» с именем предмета.

@item_get candle
narrator: Свеча была тёплой, будто её только что задули.

@item_lose <item>

Убрать предмет из инвентаря

Убирает предмет из инвентаря — потерян, отобран, оставлен.

itemstring
Имя предмета, латиницей — то же, что в @item_get.
@item_lose candle
narrator: Свеча осталась там, на ступеньках.

@item_use <item>

Применить/израсходовать предмет

Применяет предмет. Расходуется он или нет, решаете вы — директива объявляет действие.

itemstring
Имя предмета, латиницей.

Читатель видитПлашка «Использовано» с именем предмета.

@item_use candle
narrator: Огонь дошёл до фитиля и остановился.

Выбор 2Nightfall Stories

Подробнее: Дизайн ветвления

@skill_check <stat> <difficulty>

Проверка навыка: стат против сложности (± RNG)

Объявляет проверку навыка. Исход считает не она, а ваше условие: директива показывает читателю, что проверка произошла, и с каким значением.

statstring
Имя флага-навыка, латиницей.
difficultyint
Порог сложности, целое число.0…∞

Читатель видитПлашка «Проверка» с именем навыка, текущим значением и порогом.

@set nerve = 0
@set roll = 0
@skill_check nerve 14
@set roll = rand(1, 20) + nerve
@if roll >= 14 -> steady
-> shaking

@timer <duration_ms>

Таймер-бар на выборе, мс (§17 — доступное окно)

Таймер на выборе. Пишется ТОЛЬКО в шапке опции (* choice "…" @timer 8000) — отдельной строкой валидатор его отклонит. Истечение таймера должно быть осмысленным исходом, а не наказанием.

duration_msint
Миллисекунды: 8000 — это восемь секунд.0…∞

Читатель видитПод меню идёт полоса времени.

* choice "Успеть закрыть" @timer 8000
    -> closed
* choice "Отступить"
    -> back

Мистика 7Nightfall Stories

Подробнее: Мистика

@divine [spread]

Гадание/таро — расклад влияет на путь

Гадание: расклад красит главу. Хорошее место для случайности — предсказание, которое может не сбыться, создаёт напряжение, а решающее судьбу читается как несправедливость.

spreadenum, необязательный
Чем гадают.tarot · runes · bones
@divine tarot
narrator: Верхняя карта легла рубашкой вверх, и переворачивать её никто не стал.

@incantation <spell>

Заклинание: компоненты → эффект

Заклинание: компоненты складываются в результат. Тот же гейт, что и ритуал, но словами.

spellstring
Имя заклинания, латиницей.
@incantation open_the_seventh
narrator: Слова он произнёс правильно. Это и было ошибкой.

@pact <id>

Пакт/сделка: выгода сейчас, цена потом

Выгода сейчас, цена потом. Технически это флаг, который ставится здесь и читается далеко; если цена не придёт, пакт обманывает читателя, а не персонажа.

idstring
Имя пакта, латиницей — по нему вы потом строите условие.
@pact debt_to_the_ferryman
narrator: «Позже», — сказал он. И это было согласие.

@ritual <id>

Ритуал: порядок действий/символов как гейт

Ритуал как гейт: открывается не предметом, а порядком действий. Порядок должен называться в истории, а не подбираться читателем.

idstring
Имя ритуала, латиницей.
@sign_add salt
@sign_add ash
@ritual circle
narrator: Круг замкнулся, и в комнате стало на градус холоднее.

@sacrifice <give> [gain]

Жертва/обмен: отдать X ради Y

Отдать одно ради другого. Отдавать должно быть дорого — персонаж, воспоминание, возможность вернуться; «минус пять свечей» решением не становится.

givestring
Что отдают.
gainstring, необязательный
Что получают взамен.

Читатель видитПлашка «Жертва» с тем, что отдано и получено.

@sacrifice memory_of_her_voice safe_passage
narrator: Он перестал помнить, как она смеялась. Дверь открылась.

@sign_add <sign>

Собрать знак/символ

Добавляет знак или символ в набор — как улику в расследовании.

signstring
Имя знака, латиницей. Идентификатор показывается читателю: подчёркивания заменяются пробелами, первая буква становится заглавной (old_photo → «Old photo»). Поэтому пишите его так, как он должен читаться.
@sign_add salt
narrator: Соль легла ровной линией у порога.

@vision [image] [@alt <alt>]

Сон/видение — альтернативный слой реальности

Сон или видение — слой реальности рядом с основным.

imageasset, необязательный
Идентификатор изображения, если видение показывает кадр.
@altstring, именованный
@vision drowned_hall
narrator: Вода стояла вровень с потолком, и в ней кто-то ждал.

Расследование 7Nightfall Stories

Подробнее: Расследование

@accuse <target>

Обвинение/дедукция по собранному

Обвинение — момент, когда версия становится действием. Неполная версия должна вести к другой развязке, а не к худшей: расследование интереснее, когда ошибиться можно, не проиграв.

targetstring
Кого обвиняют, латиницей.
@accuse the_caretaker
narrator: Смотритель не стал спорить. Это и было страшнее всего.

@cipher <puzzle>

Шифр/головоломка/замок как гейт

Шифр или замок как гейт. Работает, когда решение лежит в тексте истории, а не в изобретательности читателя; оставляйте обходной путь.

puzzlestring
Имя головоломки, латиницей.

Читатель видитПлашка «Замок» с именем головоломки.

@cipher cellar_padlock
narrator: Четыре цифры. Дата на надгробии подходила.

@clue_add <clue>

Добавить улику/доказательство

Добавляет улику. Улики — флаг типа set, поэтому условие на них пишется обычным способом, а повтор ничего не портит.

cluestring
Имя улики, латиницей. Идентификатор показывается читателю: подчёркивания заменяются пробелами, первая буква становится заглавной (old_photo → «Old photo»). Поэтому пишите его так, как он должен читаться.

Читатель видитПлашка «Улика» с именем улики.

@clue_add letter_without_signature
narrator: Письмо было напечатано, но подписи не было.

@examine <hotspot> [image] [@alt <alt>]

Осмотр точки интереса (hotspot)

Осмотр точки интереса. За осмотром обычно стоит улика.

hotspotstring
Что осматривают, латиницей.
imageasset, необязательный
Идентификатор изображения, если осмотр показывает картинку.
@altstring, именованный
@examine desk_drawer
narrator: В ящике лежала вторая половина фотографии.

@interrogate <npc>

Допрос с детекцией лжи/правды

Допрос. Ложь собеседника должна быть распознаваема по уликам: у каждой лжи нужна улика-опровержение, иначе это шум.

npcstring
Имя персонажа, латиницей.

Читатель видитПлашка «Допрос» с именем персонажа.

@interrogate the_caretaker
the_caretaker: Я ушёл в девять. Как всегда.

@map_move <location>

Переход по локации на карте

Перемещение по локации на карте. Хорошо работает петлёй с накоплением; следите, чтобы из круга локаций вела хотя бы одна дорога наружу.

locationstring
Имя локации, латиницей. Идентификатор показывается читателю: подчёркивания заменяются пробелами, первая буква становится заглавной (old_photo → «Old photo»). Поэтому пишите его так, как он должен читаться.
@map_move old_pier
narrator: На пирсе пахло соляркой и рыбой.

Отношения 3Nightfall Stories

Подробнее: Отношения

@companion <npc> <action>

Спутник присоединяется/уходит

Спутник присоединяется или уходит. Уход, заслуженный поведением читателя, работает сильнее ухода по сюжету — поэтому чаще всего он стоит под условием на отношение.

npcstring
Имя персонажа, латиницей — то же, что в @relation.
actionenum
Присоединяется или уходит.join · leave

Читатель видитПлашка «Спутник с тобой» или «Спутник ушёл» с именем персонажа.

@set trust_anna = 0
@if trust_anna < 2
    @companion anna leave
    anna: Дальше сам.

@npc_remember <npc> <key>

Память NPC: запомнить выбор

Записывает конкретный выбор в память персонажа, чтобы отыграть его позже репликой. Отличается от @relation тем, что хранит не число, а факт.

npcstring
Имя персонажа, латиницей.
keystring
Имя воспоминания, латиницей — по нему вы потом строите условие.

Читатель видитНичего: это скрытая пометка, которая проявится в более поздней сцене.

@npc_remember anna did_not_turn_around
narrator: Анна ничего не сказала. Но запомнила.

@relation <npc> <axis> <op> <amount>

Отношение NPC (доверие/страх/романтика/подозрение)

Меняет отношение персонажа по одной из осей. Оси независимы: страх и недоверие ведут к разному поведению, и одной общей шкалой «отношение» их не выразить.

npcstring
Имя персонажа, латиницей. Придумываете вы; связывать его с чем-либо заранее не нужно.
axisenum
Ось отношения.trust · fear · romance · suspicion
openum
Как изменить значение.+ · - · =
amountint
На сколько.0…∞

Читатель видитПлашка «Отношение» с именем персонажа и направлением изменения.

@relation anna trust + 1
anna: Ладно. Верю.

Прогрессия 3Nightfall Stories

Подробнее: Прогрессия

@achievement <id>

Разблокировать достижение

Отмечает достижение как открытое. Достижения не объявляются заранее: список собирается из того, что история назвала, и остаётся у читателя после прохождения.

idstring
Ваше имя достижения, латиницей. Идентификатор показывается читателю: подчёркивания заменяются пробелами, первая буква становится заглавной (old_photo → «Old photo»). Поэтому пишите его так, как он должен читаться.

Читатель видитВсплывающая плашка «Достижение» с именем достижения.

@achievement never_looked_back
narrator: Он не обернулся ни разу за всю дорогу.

@codex_unlock <entry>

Открыть запись кодекса/журнала лора

Открывает запись в журнале лора. Запись переживает прохождение, поэтому годится как приглашение вернуться: читатель видит ссылку на событие, которого не нашёл.

entrystring
Имя записи, латиницей. Идентификатор показывается читателю: подчёркивания заменяются пробелами, первая буква становится заглавной (old_photo → «Old photo»). Поэтому пишите его так, как он должен читаться.

Читатель видитЗапись появляется в журнале; плашки при этом нет.

@codex_unlock ritual_of_the_seventh_door
narrator: В тетради нашлась схема, нарисованная чужой рукой.

@ending_mark <ending>

Отметить коллекционируемую концовку

Отмечает концовку как найденную, для счётчика «найдено N из M». Знаменатель считается по объявленным в истории концовкам, поэтому перед публикацией проверьте бот-обходом, что все они достижимы.

endingstring
Имя концовки — то же, что стоит в @end. Идентификатор показывается читателю: подчёркивания заменяются пробелами, первая буква становится заглавной (old_photo → «Old photo»). Поэтому пишите его так, как он должен читаться.

Читатель видитПлашка «Концовка открыта» с именем концовки, счётчик найденных увеличивается.

@ending_mark buried_alive
@end buried_alive