Скрипты и мини-игры

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

Когда нужны скрипты

Почти всё в новелле собирается без кода: реплики, выборы, шаги «Действий», условия, расширения. Скрипт нужен, когда хочется своего — мини-игры, необычного расчёта, механики, которой нет в настройках.

Скрипты пишутся на JavaScript. Всё, что умеет движок, доступно через объект engine: переменные, сцена, звук, уведомления. Например, две строки дают читателю золото и сообщают об этом:

engine.vars.gold += 10 — и следом engine.ui.notify('Золото +10'). Переменная gold должна быть заведена во вкладке «Перемен.».

Где пишется код

Шаг «Скрипт» во вкладке «Основные» блока «Действия» — код в своей точке ленты. Рядом с шагом выбирается, когда он выполняется: «В ленте», «При входе» в ноду, до реплик, или «При выходе» из неё.

Те же скрипты входа и выхода видны в «Параметрах» ноды, в разделе «Скрипты (JS)»: кнопки «onOpen - при входе» и «onClose - при выходе» правят те же шаги.

Нода «Custom JS» — отдельная нода-скрипт на графе. Её код открывает кнопка «Редактировать код» на карточке ноды.

Скрипт «init» лежит первой строкой во вкладке «Скрипты» с пометкой «при входе». Он выполняется каждый раз, когда читатель входит в новеллу: новая игра, продолжение, «Начать заново». Удалить и переименовать его нельзя.

  1. Выберите ноду и под лентой нажмите «Действие».
  2. Во вкладке «Основные» нажмите «Скрипт» — откроется редактор.
  3. Напишите код или вставьте его из палитры справа.
  4. Нажмите «Сыграть» и пройдите ноду.

Редактор и палитра

Справа от кода — палитра функций движка. Щелчок по строке вставляет готовый кусок кода туда, где стоит курсор. Группы — «Переменные», «Сцена и узлы», «Камера и эффекты», «Звук», «Сигналы», «События», «Мини-игры» и другие; установленные расширения добавляют свои. Сверху поиск по названию и описанию. Полный список того, что умеет движок, — это и есть палитра.

Рядом с кодом — живое превью 9:16: скрипт идёт в нём на том же движке, что у читателя, мини-игру можно сыграть прямо там, а фон, камера и музыка отмечаются в логе. «Запуск» перезапускает скрипт, галка «авто» перезапускает его на каждой правке, а внизу «Логи» — что происходило. Если в коде ошибка, она появится в полосе превью со значком ⛔.

«Импорт скрипта…» над палитрой подключает модуль из вкладки «Скрипты», а «Развернуть» открывает редактор на весь экран.

Готовые мини-игры

В группе «Мини-игры» палитры шесть игр, их вставляют целиком: «Поймай монетки», «Точный удар», «Найди пару», «Повтори узор», «Уворот» и «Кодовый замок». Каждая держит читателя, пока партия не кончится, и заканчивается сама — по времени, попыткам или проигрышу.

Итог игра пишет в переменную: очки у «Поймай монетки» — score, попадания у «Точного удара» — hits, ходы у «Найди пару» — moves. Заведите во вкладке «Перемен.» переменную с таким же ID, и по ней можно ветвить историю обычной нодой «Условие».

  1. Выберите экран, где будет игра, и откройте его «Параметры».
  2. В разделе «Скрипты (JS)» нажмите «onOpen - при входе».
  3. В палитре раскройте «Мини-игры» и щёлкните по игре — код встанет целиком.
  4. Сыграйте партию в превью рядом, потом пройдите сцену в «Сыграть».

Модули и скиллы

Вкладка «Скрипты» — папки с кодом новеллы. Кнопка «Скрипт» создаёт модуль: общий код, который подключается в любой скрипт строкой import "Папка/имя". В те же папки можно положить картинки и звуки для мини-игр — в «Библиотеке» они не мешаются среди фонов. Переименовали папку или модуль — путь в import изменится, его надо поправить.

«Скилл» — папка-рецепт для ИИ-агента: «Название», «Когда применять», «Инструкция для агента» и теги, а внутри скрипты, картинки и звуки. По описанию агент сам находит нужный скилл.

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

Безопасно ли это

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

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

Частые вопросы

Нужно ли уметь программировать? Для готовых мини-игр — нет: они вставляются целиком из палитры. Для своей механики можно попросить агента.

Скрипт не работает — где посмотреть ошибку? В превью рядом с кодом: ошибка появится в его полосе со значком ⛔, а «Логи» покажут, что успело выполниться.

Читатель застрял на мини-игре — почему? Игра держит экран, пока не закончится. Готовые игры отпускают читателя сами; своя игра должна сделать то же — вызвать engine.flow.unlock().

Где найти все функции движка? В палитре справа от кода: щелчок вставляет пример, а поиск ищет по названию и описанию.

Можно удалить init? Нет, он есть в каждой новелле. Не нужен — оставьте пустым.