Переменные и состояние
По умолчанию среда выполнения скриптов является изолированной. Любые локальные переменные, объявленные внутри скрипта, существуют только в момент его выполнения и уничтожаются сразу после завершения работы кода.
Для сохранения данных между запусками скриптов и передачи информации в игровой клиент используется объект контекста ctx и Редактор переменных.
Области видимости контекста
Объект ctx предоставляет доступ к двум уровням состояния:
ctx.team(Командные переменные) — хранят состояние для конкретной команды. Каждая команда имеет свой независимый набор этих переменных. Если в Редакторе переменных заведена командная переменнаяmoney, в скрипте она доступна какctx.team.money.ctx.game(Глобальные переменные) — хранят общее состояние для всего квеста, единое для всех команд. Изменение глобальной переменной одной командой отразится на данных, доступных всем остальным командам.
Редактор переменных и сохранение данных
Чтобы значение переменной сохранялось на протяжении всей игры, переменная должна быть явно заведена в Редакторе переменных.
Любые свойства, добавленные в ctx.team или ctx.game исключительно через код и не зарегистрированные в Редакторе переменных, будут уничтожены после завершения текущего запуска скрипта.
Инициализация сложных структур данных
Авторы могут использовать глобальные переменные для хранения конфигурации игры или начальных значений. В Редакторе переменных можно завести одну переменную (например, state), а в скрипте инициализировать ее как объект.
// Проверка на то, что конфигурация еще не задана
if (!(ctx.game.state && ctx.game.state.intitialized)) {
ctx.game.state = {
intitialized: true,
shots: 6,
maxHP: 1000,
items: []
};
}TIP
Вложенные свойства объекта state не нужно отдельно заводить в Редакторе переменных, достаточно зарегистрировать саму переменную state.*
Вывод данных в игровой клиент
Переменные, значения которых предполагается выводить в мобильном приложении игрока, также требуют обязательного явного указания в Редакторе переменных.
Движок накладывает строгие ограничения на типы данных для отображения в клиенте:
- В клиенте можно отображать только примитивные значения — числа и строки.
- Вывести значение свойства объекта, массив или элемент массива напрямую в клиент нельзя.
Копирование значений для вывода
Если игровая логика опирается на сложные объекты (как в примере с ctx.game.state), для отображения конкретного параметра игрокам необходимо скопировать его значение в отдельную примитивную переменную, заранее созданную в Редакторе переменных.
Пример: Предположим, необходимо показать игроку текущее количество выстрелов из глобального объекта state.
- В Редакторе переменных создается командная переменная
displayShots. - В скрипте выполняется обновление данных и копирование нужного значения:
// Игровая логика: уменьшаем количество выстрелов в объекте
ctx.game.state.shots -= 1;
// Копируем примитивное значение (число) в переменную для вывода в клиент
ctx.team.displayShots = ctx.game.state.shots;В интерфейсе игрового клиента настраивается вывод переменной displayShots.