Skip to content

Примеры использования ​

В данном разделе представлены типовые сценарии использования серверных скриптов для реализации игровой логики. Для каждого примера предполагается, что используемые переменные (особенно те, что выводятся в клиент) предварительно созданы в Редакторе переменных.

1. Инициализация глобальных настроек при старте игры ​

Контекст перехода:

  • Событие: Старт
  • Условие: Без условий
  • Действие: Выполнить скрипт

Поскольку событие «Старт» срабатывает для каждой команды, скрипт выполнится несколько раз. Для предотвращения перезаписи глобальных настроек используется проверка на существование объекта.

javascript
// Инициализация глобального состояния (выполнится один раз)
// Проверяем, инициализирован ли уже глобальный объект 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 для изменения игрового процесса.

javascript
// Проверяем, какой именно код ввела команда
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. Подготовка данных для клиента ​

Контекст перехода:

  • Событие: Прошёл код
  • Условие: На уровне «Поиск улик»
  • Действие: Выполнить скрипт

Массивы и объекты нельзя напрямую вывести в игровой клиент. Если логика требует сбора нескольких предметов, их необходимо хранить в массиве, а для вывода формировать строковую переменную.

javascript
// Инициализируем массив инвентаря для команды, если его еще нет
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: "Найдена улика. Продолжайте поиски.",
    });
}