Nyxtale Documentation

The Nyxtale platformReference

Directives

Every @ directive: signature, arguments, bounds, safety marks.

Every directive the engine has — 96 across 16 categories. This page is generated from the DIRECTIVES registry at build time: the same registry the compiler, the validator and Studio's mechanics palette read. A new directive appears here on its own; there is nothing to update.

⚡ photosensitive ◐ scales with intensity

Text 16

@autoadvance [mode]

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

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

modeenum, optional
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

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

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

No arguments.

The reader seesСтрока возникает сразу.

@instant
narrator: БЕГИ

@lineheight <scale>

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

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

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

@redact

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

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

No arguments.

The reader seesТекст закрыт полосой.

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

@shout

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

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

No arguments.

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

@stagger [per_word_ms]

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

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

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

@text_corrupt [amount]

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

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

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

@text_erase

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

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

No arguments.

The reader seesТекст исчезает с экрана сам.

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

@text_fade [dir]

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

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

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

@text_shake [amount]

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

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

amountfloat, optional
Амплитуда, 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, optional
Настроение бабла: dusk (по умолчанию, сумрачный), dark (почти чёрный), light (светлый, тёмным по светлому), blood (кровавый), ember (тёплый, как свеча), cold (холодный серый). Цвета берутся из палитры темы истории, поэтому тон везде свой.dusk · dark · light · blood · ember · cold

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

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

@unredact

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

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

No arguments.

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

@whisper

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

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

No arguments.

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

Timing 5Nightfall Stories

@cut

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

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

No arguments.

The reader seesКадр меняется мгновенно.

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

@delay <seconds>

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

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

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

@hold_black [seconds]

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

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

secondsfloat, optional
Сколько держать черноту.

The reader seesЭкран чернеет на заданное время.

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

@pause <seconds>

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

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

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

@slowmo

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

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

No arguments.

The reader seesВсё замедляется.

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

Audio 6Nightfall Stories

@ambient <audio> [loop] [volume]

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

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

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

The reader seesЗвук идёт фоном.

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

@dissonance [amount]

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

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

amountfloat, optional
Сила, 0…1.0…1

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

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

@heartbeat [bpm]

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

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

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

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

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

@pan <x>

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

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

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

The reader seesЗвук смещается в одно ухо.

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

@silence

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

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

No arguments.

The reader seesЗвук пропадает.

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

@sound <audio> [volume]

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

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

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

The reader seesЗвук проигрывается один раз.

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

Visuals 18Nightfall Stories

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

Фон сцены

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

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

The reader seesФон меняется под текстом.

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

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

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

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

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

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

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

@desaturate [amount]

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

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

amountfloat, optional
Сколько цвета убрать, 0…1.0…1

The reader seesКадр обесцвечивается.

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

@flash [@reduce_motion <reduce_motion>]

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

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

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

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

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

@flashlight [mode] [aim]

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

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

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

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

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

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

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

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

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

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

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

@fog [density]

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

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

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

The reader seesКадр затягивает дымкой.

@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, optional
Сила, 0…1. Без неё берётся значение по умолчанию для этого эффекта.0…1
@reduce_motionstring, named
Что делать при сниженном движении: off — не играть, keep — играть как есть, либо имя другого, спокойного эффекта на замену.

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

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

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

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

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

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

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

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

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

Джампскейр

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

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

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

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

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

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

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

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

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

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

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

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

@sprite_hide [slot]

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

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

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

@sprite_shake [slot] [amount]

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

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

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

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

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

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

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

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

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

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

VHS-развёртка

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

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

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

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

@vignette [amount] [tint]

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

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

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

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

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

Camera 5Nightfall Stories

@dutch [degrees]

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

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

degreesfloat, optional
Угол наклона в градусах.0…12

The reader seesКадр наклоняется.

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

@letterbox [amount]

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

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

amountfloat, optional
Высота полос, 0…1.0…1

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

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

@pan_cam <x> [y]

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

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

xfloat
Смещение по горизонтали.-1…1
yfloat, optional
Смещение по вертикали.-1…1

The reader seesКадр плавно смещается.

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

@shake [amount]

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

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

amountfloat, optional
Амплитуда.0…1

The reader seesЭкран трясёт.

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

@zoom <scale>

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

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

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

The reader seesКадр приближается или отдаляется.

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

Interaction 4Nightfall Stories

@choice_shake [amount]

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

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

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

@choices_fade [seconds]

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

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

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

@haptic

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

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

No arguments.

The reader seesКороткая вибрация.

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

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

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

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

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

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

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

Reveal 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.

The reader seesnothing — a silent marker that shows up later.

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

@reveal <key>

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

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

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

Meta 6

@arg_code <code>

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

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

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

@fake_crash [@reduce_motion <reduce_motion>]

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

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

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

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

@fake_crash
narrator: …

@meta_break

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

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

No arguments.

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

@notify [text]

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

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

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

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

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

@persona <field>

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

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

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

@terminal

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

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

No arguments.

The reader seesЭкран принимает вид терминала.

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

Theme 1Nightfall Stories

@sanity_show

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

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

No arguments.

The reader seesНа экране появляется шкала рассудка.

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

Meters 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

The reader seesНа экране появляется шкала с текущим значением.

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

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

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

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

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

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

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

Resources 6Nightfall Stories

@craft <result>

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

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

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

The reader seesПлашка «Собрано» с именем предмета.

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

@currency <op> <amount>

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

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

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

The reader seesПлашка «Получено» или «Потрачено» с суммой.

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

@inventory_show

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

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

No arguments.

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

@item_get <item>

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

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

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

The reader seesПлашка «Получено» с именем предмета.

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

@item_lose <item>

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

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

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

@item_use <item>

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

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

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

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

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

Choice 2Nightfall Stories

@skill_check <stat> <difficulty>

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

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

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

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

@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…∞

The reader seesПод меню идёт полоса времени.

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

Occult 7Nightfall Stories

@divine [spread]

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

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

spreadenum, optional
Чем гадают.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, optional
Что получают взамен.

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

@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, optional
Идентификатор изображения, если видение показывает кадр.
@altstring, named
@vision drowned_hall
narrator: Вода стояла вровень с потолком, и в ней кто-то ждал.

Investigation 7Nightfall Stories

@accuse <target>

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

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

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

@cipher <puzzle>

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

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

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

The reader seesПлашка «Замок» с именем головоломки.

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

@clue_add <clue>

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

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

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

The reader seesПлашка «Улика» с именем улики.

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

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

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

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

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

@interrogate <npc>

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

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

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

The reader seesПлашка «Допрос» с именем персонажа.

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

@map_move <location>

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

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

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

Relationships 3Nightfall Stories

@companion <npc> <action>

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

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

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

The reader seesПлашка «Спутник с тобой» или «Спутник ушёл» с именем персонажа.

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

@npc_remember <npc> <key>

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

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

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

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

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

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

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

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

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

The reader seesПлашка «Отношение» с именем персонажа и направлением изменения.

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

Progression 3Nightfall Stories

@achievement <id>

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

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

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

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

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

@codex_unlock <entry>

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

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

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

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

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

@ending_mark <ending>

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

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

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

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

@ending_mark buried_alive
@end buried_alive