Примеры использования
В данном разделе представлены типовые сценарии использования серверных скриптов для реализации игровой логики. Для каждого примера предполагается, что используемые переменные (особенно те, что выводятся в клиент) предварительно созданы в Редакторе переменных.
1. Инициализация глобальных настроек при старте игры
Контекст перехода:
- Событие: Старт
- Условие: Без условий
- Действие: Выполнить скрипт
Поскольку событие «Старт» срабатывает для каждой команды, скрипт выполнится несколько раз. Для предотвращения перезаписи глобальных настроек используется проверка на существование объекта.
// Инициализация глобального состояния (выполнится один раз)
// Проверяем, инициализирован ли уже глобальный объект config.
// Условия !ctx.game.config недостаточно, поскольку в редакторе переходов
// может быть указано начальное значение примитива,
// например, "0" для строки.
if (!(ctx.game.config && ctx.game.config.intitialized)) {
ctx.game.config = {
intitialized: true,
startingMoney: 500,
maxInventorySize: 5,
bossHealth: 10000,
// кешируем идентификаторы уровней для ускорения выполнения скриптов
caveLevelId: GetLevelIdByAlias('cave'),
shopLevelId: GetLevelIdByAlias('shop'),
roomLevelId: GetLevelIdByAlias('room'),
};
}
// Инициализация командных переменных (выполнится для каждой команды)
// Переменные money и displayBossHealth должны быть заведены в Редакторе переменных
ctx.team.money = ctx.game.config.startingMoney;
// Копируем значение из глобального объекта в примитивную переменную
// для отображения здоровья босса в интерфейсе клиента.
// В этом примере здоровье можно вести и сразу в displayBossHealth,
// здесь так сделано только для примера.
ctx.game.displayBossHealth = ctx.game.config.bossHealth;2. Обработка введенного кода и управление уровнями
Контекст перехода:
- Событие: Прошёл код
- Условие: На уровне «Магазин»
- Действие: Выполнить скрипт
В этом сценарии используются системные переменные codeAlias, teamId, rivals и функции движка FlashMessage, AddAction для изменения игрового процесса.
// Проверяем, какой именно код ввела команда
if (codeAlias === "buy_key") {
// Проверяем наличие достаточного количества валюты
if (ctx.team.money >= 100) {
ctx.team.money -= 100;
// Вывод сообщения в клиент для информирования игроков
FlashMessage({
level: 'SUCCESS',
message: "Вы успешно купили ключ!",
});
// Открываем команде доступ к новому уровню
AddAction({
action: 'LevelOpen',
ids: ctx.game.config.caveLevelId,
teams: teamId,
});
// Закрываем текущий уровень магазина для соперников,
// кроме той, которая совершила покупку.
// Это гипотетический пример для случая,
// когда только одна команда может попасть в бонусную пещеру.
AddAction({
action: 'LevelClose',
ids: ctx.game.config.shopLevelId,
teams: rivals,
});
} else {
FlashMessage({
level: 'ERROR',
message: "Недостаточно средств для покупки ключа.",
});
CancelAction();
}
}3. Подготовка данных для клиента
Контекст перехода:
- Событие: Прошёл код
- Условие: На уровне «Поиск улик»
- Действие: Выполнить скрипт
Массивы и объекты нельзя напрямую вывести в игровой клиент. Если логика требует сбора нескольких предметов, их необходимо хранить в массиве, а для вывода формировать строковую переменную.
// Инициализируем массив инвентаря для команды, если его еще нет
if (!ctx.team.inventory) {
ctx.team.inventory = [];
}
// Добавляем найденную улику (введенный код), если ее еще нет в массиве
if (!ctx.team.inventory.includes(code)) {
ctx.team.inventory.push(code);
}
// Подготавливаем данные для вывода в клиент.
// Переменная displayInventory (строка) должна быть заведена в Редакторе переменных.
// Метод join преобразует массив в единую строку, разделенную запятыми.
ctx.team.displayInventory = ctx.team.inventory.join(", ");
// Проверяем условие победы на уровне
if (ctx.team.inventory.length >= 3) {
FlashMessage({
level: 'SUCCESS',
message: "Все улики собраны!",
});
AddAction({
action: 'LevelOpen',
ids: ctx.game.config.roomLevelId,
teams: teamId,
});
} else {
FlashMessage({
level: 'WARNING',
message: "Найдена улика. Продолжайте поиски.",
});
}