Overwatch 2

Представляем «Мастерскую» Overwatch

Blizzard Entertainment

Создавайте нестандартные матчи благодаря поражающим воображение возможностям «Мастерской»! Этот простой редактор скриптов расширяет возможности пользовательской настройки игры. Попасть в «Мастерскую» можно через «Браузер матчей». В ней вы сможете создавать и добавлять собственные скрипты, правила и уникальные условия в уже существующие и любимые режимы Overwatch. Правилами можно изменить многое. Например, они могут влиять на передвижение и способности героев, вносить поправки в урон и лечение, а то и показывать игрокам текст при соблюдении нужных условий.

Так, вы можете создать режим игры «Пол — это лава» с простым правилом: находясь на земле, герой загорается:

Содержание

Как попасть в «Мастерскую»

Мастерская находится по адресу Игра > Браузер матчей > Создать > Настройки > Мастерская.

Создание скрипта

Чтобы создать скрипт, нужно:

  1. добавить правило;
  2. выбрать событие;
  3. добавить условие (необязательно);
  4. добавить действие.

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

Добавление правила

Правила — это очень гибкие в настройке элементы скрипта. В каждом скрипте должно быть хотя бы одно правило.

Правило можно дополнить комментарием. Давайте узнаем, из чего оно состоит.

  • Событие: описывает момент применения правила. Подробнее об этом смотрите в разделе «Выбор события».
  • Условия: необязательный список условий, которые должны соблюдаться для применения правила. Подробнее об этом смотрите в разделе «Добавление условия».
  • Действия: список действий, которые должны происходить при появлении события и соблюдении условий. Подробнее об этом смотрите в разделе «Добавление действия» .

Для добавления правила нажмите кнопку Добавить правило.

Выбор события

Событие определяет момент применения правила. В момент события в игре создается экземпляр правила. Каждый экземпляр проверяет условия и выполняет действия независимо от других экземпляров.

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

Чтобы выбрать тип события:

  1. Откройте раскрывающийся список справа от строки Событие.
  2. Выберите один из вариантов:

    Тип события Описание
    Ongoing — Global

    Создает один экземпляр данного правила в начале матча. Этот экземпляр остается активным на протяжении всего матча.

    • Поскольку экземпляр остается активным весь матч, то определенное в нем условие в один момент может соблюдаться, а в другой — нет. Первое же соблюдения условия приводит к выполнению действий.
    • Если условия из списка перестают соблюдаться, при последующем их соблюдении происходит повторная попытка выполнения действий.
    Ongoing — Each Player

    Создает экземпляр данного правила для каждого присоединившегося к матчу игрока. Этот экземпляр остается активным до выхода игрока или до завершения матча. Каждый из экземпляров проверяет условия и выполняет действия отдельно от других.

    • Поскольку экземпляр остается активным до тех пор, пока игрок не покинет матч, условие в какой-то момент может соблюдаться, а в другой – нет. Первое же соблюдения условия приводит к выполнению действий.
    • Если условия из списка перестают соблюдаться, при последующем их соблюдении происходит повторная попытка выполнения действий.
    Player Earned Elimination

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

    • После каждого убийства, в котором участвовал игрок, происходит проверка условий. Если каждое из них соблюдается, то выполняются определенные действия. Если одно из условий не соблюдается, то действия не выполняются.
    Player Dealt Final Blow

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

    • После каждого смертельного удара, нанесенного игроком сопернику, происходит проверка условий. Если каждое из них соблюдается, то выполняются определенные действия. Если одно из условий не соблюдается, то действия не выполняются.
    Player Dealt Damage

    Применяет правило при каждом нанесении урона игроком. Одновременно для игрока может выполняться только один экземпляр такого правила.

    • Когда игрок наносит урон сопернику, происходит проверка условий. Если каждое из них соблюдается, то выполняются определенные действия. Если одно из условий не соблюдается, то действия не выполняются.
    Player Took Damage

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

    • Когда игрок принимает урон от соперника, происходит проверка условий. Если каждое из них соблюдается, то выполняются определенные действия. Если одно из условий не соблюдается, то действия не выполняются.
    Player Died

    Применяет правило после каждой смерти игрока. Одновременно для игрока может выполняться только один экземпляр такого правила.

    • В случае смерти игрока происходит проверка условий. Если каждое из них соблюдается, то выполняются определенные действия. Если одно из условий не соблюдается, то действия не выполняются.
  3. При необходимости можно выбрать команду или игрока, к которым будет применяться это событие. Возможны приводимые ниже варианты.

    Вариант Описание
    All Событие применяется к всем командам и всем игрокам в режимах схватки.
    Team 1 (или имя текущей команды) Событие применяется только к участникам данной команды.
    Team 2 (или имя текущей команды) Событие применяется только к участникам данной команды.
    Вариант Описание
    All Событие применяется к всем игрокам.
    Slot 0 — Slot 5 Событие применяется только к игрокам, занимающим указанную ячейку. В командных режимах одну и ту же ячейку могут занимать по два игрока (по одному на каждую команду).
    Slot 6 — Slot 11 Событие применяется только к игрокам в указанной ячейке. Этот вариант применим только в режимах схватки.
    Определенный герой Событие применяется только к игрокам, выбравших данного героя.

Добавление условия

После добавления правила и события можно будет добавить одно или несколько условий. Условия — это список моментов, которые должны соблюдаться для выполнения списка действий правилом. Если условие принадлежит правилу, в котором выбран тип события Ongoing — Global или Ongoing — Each Player, то оно проверяется постоянно. Если условие принадлежит правилу любого другого типа, то оно проверяется каждый раз, когда происходит указанное событие. Если правило не имеет условий, то попытка выполнения действий будет происходить каждый раз, когда происходит событие. Каждое из условий состоит из двух значений, использующих оператор для сравнения и проверки истинности этих значений. Подробнее об этом можно узнать в разделе «Значения».

Как добавить условие

  1. Нажмите кнопку Добавить справа от столбца Условия.
  2. Заполните поля значений.
    • Примечание: если само значение содержит аргумент (например, значение Hero of, требующее указать игрока интересующего героя), то аргумент отобразится с отступом под значением.
  3. Выберите оператор. Возможны следующие варианты:
    • == равно
    • != не равно
    • > больше
    • >= больше или равно
    • < меньше
    • <= меньше или равно

Это условие проверяет, равно ли количество всех игроков в матче количеству живых игроков.

  • Значение: Number of Living Players, описывает общее количество живых игроков.
    • Команда: Team, проверяет всех игроков в команде.
    • Команда: All, проверяет всех игроков во всех командах.
  • Оператор: ==, означает, что для соблюдения условия первое значение должно быть равно второму.
  • Значение: Number of Living Players, описывает общее количество живых игроков.
    • Команда: Team, проверяет всех игроков в команде.
    • Команда: All, проверяет всех игроков во всех командах.

Другие примеры

  • IsFlagBeingCarried(Victim) == False: убитый игрок не должен был нести флаг.
  • IsCrouching(Event Player) == True: игрок, к которому применяется событие, должен красться.
  • NumberOfFinalBlows(Attacker) > 10: атаковавший игрок набрал более 10 смертельных ударов.

Добавление действия

Действие вносит изменения в игру. Действия выполняются по порядку от первого к последнему. Для начала выполнения списка действий...

  • должно произойти событие, связанное с данным правилом;
  • должны быть соблюдены все условия данного правила (если таковые указаны).
    • Если выбран тип события Ongoing — Global или Ongoing — Each Player, то выполнение действий по списку начнется после первого соблюдения всех условий. Если условия из списка условий перестают соблюдаться, при последующем их соблюдении происходит повторная попытка выполнения действий.

За исключением действия Wait (подробнее об этом в описании действия Wait), выполнение каждого действия происходит мгновенно. Некоторые действия не имеют аргументов, а другие предусматривают несколько, каждый из которых описывает изменение матча. Каждому аргументу присваивается значение, то есть информация или инструкция по ее получению. Подробнее об этом смотрите в разделе «Значения».

Как добавить действие

  1. Нажмите кнопку Добавить справа от столбца Действия.
  2. Выберите действие, которое описывает способ изменения матча.
  3. Выберите значение из раскрывающегося списка для каждого появившегося аргумента.
    • Примечание: некоторые действия создают объект или состояние. Такие действия могут содержать аргумент пересчета. Он определяет, являются ли другие аргументы действия фиксированными (не меняют объект или состояние) или динамическими (меняют объект или состояние по мере изменения значения, присвоенного аргументу).

Действия

  • Pause Match Time: приостанавливает отсчет времени текущего матча.
  • Modify the Global Variable(T, Add, 5): увеличивает значение глобальной переменной T на 5.
  • Set Invisible(Event Player, Enemies): делает игрока, выполняющего это правило, невидимым для противников.

Действия с аргументом пересчета

  • Create Icon(All Players(All Teams), Global Variable(P), Alert, Position): создает видимый для всех значок оповещения в точке, обозначенной глобальной переменной P. Местоположение постоянно пересчитывается, поэтому если глобальная переменная P изменится, значок переместится в новую точку.
  • Create Icon(All Players(All Teams), Global Variable(P), Alert, None): создает видимый для всех значок оповещения в точке, обозначенной глобальной переменной P. Ничего не пересчитывается, поэтому даже если глобальная переменная P изменится, значок останется в исходном месте.

Типы действий

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

Loop — это действие, которое перезапускает выполнение действий по списку с самого начала этого списка. Есть четыре типа действий Loop.

  • Loop: всегда перезапускает выполнение действий по списку.
  • Loop If: перезапускает выполнение действий по списку, если значение аргумента условия данного действия будет отличаться от 0 или будет ложным (False).
  • Loop if Condition Is True: перезапускает выполнение действий по списку, если в данный момент соблюдаются все условия правила.
  • Loop if Condition Is False: перезапускает выполнение действий по списку, если в данный момент хотя бы одно из условий правила не соблюдается.

Действие Loop можно использовать только при условии выполнения действия Wait до начала выполнения действий по списку.

Правильно Неправильно

Этот вариант допустим, поскольку перед циклом предусмотрено ожидание.

Этот вариант недопустим, поскольку без ожидания цикл будет повторяться бесконечно.

Wait — это действие, которое включает определенную задержку перед выполнением следующего действия. Наименьшая задержка равна 0,25 сек.

Возможны три варианта действия Wait.

  • Ignore Condition: этот вариант не позволяет прервать выполнение действий различным условиям или другим событиям.
    • Если выбран тип события Ongoing — Global или Ongoing — Each Player, то переход от несоблюдения к соблюдению условий ни к чему не приводит.
    • Если выбран любой другой тип события, и если событие этого типа произойдет с тем же игроком события, то событие игнорируется полностью.
  • Abort When False: этот вариант прерывает выполнение действий по списку, если условия перестают соблюдаться.
  • Restart When True: этот вариант перезапускает выполнение действий по списку, если происходит что-нибудь из перечисленного:
    • выбран тип события Ongoing — Global или Ongoing — Each Player, а условия, которые раньше не соблюдались, теперь соблюдаются;
    • выбран другой тип события, которое происходит с тем же игроком события, а все условия соблюдаются.

Дополнительная информация

Значение String создает текстовый элемент. Это значение имеет приводимые ниже аргументы.

  • String: отображаемый текст. Если текст содержит число в фигурных скобках, то оно будет заменено на значение, присвоенное соответствующему аргументу.
  • {0}: значение, которое будет преобразовано в текст перед заменой {0} в аргументе String. Это значение может быть любого типа.
  • {1}: значение, которое будет преобразовано в текст перед заменой {1} в аргументе String. Это значение может быть любого типа.
  • {2}: значение, которое будет преобразовано в текст перед заменой {2} в аргументе String. Это значение может быть любого типа.
  • String(“Привет”, Null, Null, Null): создает текст «Привет».
  • String(“{0} vs {1}”, Hero(Ana), Hero(Pharah), Null): создает текст «Ana vs Pharah»

Текстовые значения можно сочетать для получения сложного текста.

  • String(“{0} vs {1}”, Hero(Ana), String(“{0} and {1}”, Hero(Pharah), Hero(Genji), Null), Null): создает текст «Ana vs Pharah and Genji»

Текстовые значения нельзя использовать в условиях или хранить в переменных. Это связано с тем, что в вашем матче могут быть игроки, говорящие на разных языках.

Значение — это элемент информации или инструкция о том, как получить информацию. Значение указывается в аргументе условия, действия или другого значения. Их можно сочетать друг с другом.

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

Значение Описание
Number Действительное число в диапазоне, который определяется аргументом.
Vector Трехмерное значение в диапазоне, который определяется аргументом. Такие значения используются для описания местоположения и направления.
Team Определяет команду (например, Team 1, Team 2, или All Teams).
Hero Определяет конкретного героя.
Null Означает отсутствие игрока или экземпляра.
True Логическое значение «верно» (True).
False Логическое значение «ложно» (False).
Compare Возвращает значение «верно» (True) или «ложно» (False) в зависимости от того, верно или ложно сравнение, описываемое этим значением.
Event Player Игрок, для которого применяется экземпляр правила. Если такой игрок отсутствует, используется значение Null.
Attacker Игрок, который является атакующим для данного экземпляра правила. Если атакующий отсутствует, используется значение Null.
Victim Игрок, который является жертвой для данного экземпляра правила. Если жертва отсутствует, используется значение Null.
Current Array Element Возвращает актуальное рассматриваемое значение при использовании со значениями If True For Any, If True For All, Filtered Array или Sorted Array.

Значение можно сохранить в массив, представляющий собой множество значений.

  • В «Мастерской» предусмотрено несколько действий и значений, которые могут создавать или изменять массивы.
    • Например, значение All Players дает массив, включающий всех игроков в матче.
    • Также можно создавать собственные массивы с помощью операции Append To Array действия Modify Global Variable или Modify Player Variable.
  • Если в аргументе ожидается массив, но получено какое-то другое значение, оно копируется в массив из одного элемента для соблюдения требований к значению аргумента. Аналогично, если в аргументе ожидается другое значение, но получен массив, то из массива берется первое значение (или 0, если массив пуст).

Переменные предназначены для хранения любых значений, кроме текстовых. Все переменные начинаются с числового значения 0.

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

  • Глобальная переменная: в игре есть 26 глобальных переменных от A до Z. Каждая из них хранит отдельное значение или массив значений.
  • Переменная игрока: для каждого игрока предусмотрено 26 переменных от A до Z. Каждая из них хранит отдельное значение или массив значений.

Для переменных доступно три вида операций.

  • Присвоение: операции Set Global Variable и Set Player Variable присваивают переменной новое значение, которое заменяет предыдущее.
  • Изменение: операции Modify Global Variable и Modify Player Variable изменяют значение переменной путем различных арифметических операций (сложение, умножение, и т. д.) или операций с массивами (добавление, удаление).
  • Постепенное изменение: операции Chase Global Variable Over Time, Chase Player Variable Over Time, Chase Global Variable at Rate и Chase Player Variable at Rate постепенно меняют значение переменной со временем или с заданной скоростью.
    • Конечное значение операции может быть числом или вектором (или любым значением, которое сводится к числу или вектору).
      • Если конечное значение представляет собой число, то для правильного выполнения операции исходное значение переменной тоже должно быть числовым.
      • Если конечное значение представляет собой вектор, то для правильного выполнения операции исходное значение переменной тоже должно быть векторным.
      • Если для конечного значения предусмотрен пересчет, то операция Chase будет повторяться с установленным интервалом, даже если конечное значение уже было достигнуто раньше. Подробнее о пересчете см. в разделе «Добавление действия».
    • Операцию Chase можно отменить с помощью действия Stop Chasing Global Variable или Stop Chasing Player Variable.
      • После отмены переменная сохраняет текущее значение, которое будет принадлежать к диапазону между исходным и конечным значениями.

Примеры

Готовы испытать «Мастерскую» в деле? Попробуйте создать один из этих игровых режимов! Мы подскажем, что и зачем потребуется добавить.

Сейчас мы расскажем вам о том, как создать режим «Пол — это лава», в котором герои воспламеняются и получают урон при контакте с землей.

  1. Для начала выберите одно или несколько интересующих вас полей боя.
    • Перейдите по адресу Игра > Браузер матчей > Создать > Настройки > Поля боя.
    • Выберите поле боя, на котором хотите испытать свой режим, после чего отключите остальные.
  2. Войдите в «Мастерскую».
    • Нажмите кнопку Назад.
    • Нажмите кнопку Мастерская.
  3. Самое время создать скрипт! Давайте добавим первое правило.
    • Нажмите кнопку Добавить правило.
    • В разделе «Комментарий» напишите «Воспламеняет героя, находящегося на земле». Так вы запомните, что из-за этого правила герои горят во время контакта с землей.
    • Измените тип события, чтобы игра понимала, когда выполнять это правило.
      • В раскрывающемся списке события выберите тип Ongoing — Each Player. Это означает, что правило будет проверяться для каждого игрока в матче по отдельности.
      • В остальных полях оставьте значения по умолчанию.
    • Добавьте условие. Оно будет определять, в каком случае правило применяется, а в каком — нет. Если хотите, чтобы правило применялось всегда, то оставьте поле пустым.
      • Нажмите кнопку Добавить в правой части столбца Условия.
      • В раскрывающемся списке первого значения выберите пункт Is On Ground. Это значение будет верно (True), когда игрок соприкасается с землей.
      • В остальных полях оставьте значения по умолчанию и нажмите кнопку OK.
        • Значение Event Player означает «Игрок, для которого выполняется проверка правила».
    • Под конец добавим действие. Действия — это то, что будет происходить, когда условия соблюдаются.
      • Это действие будет воспламенять героя, который находится на земле.
        • Нажмите кнопку Добавить в правой части столбца Действия.
        • В раскрывающемся списке действий выберите пункт Set Status.
        • В раскрывающемся списке статусов выберите пункт Burning.
        • В поле длительности передвиньте ползунок, установив значение 10 000.
        • В остальных полях оставьте значения по умолчанию и нажмите кнопку OK.
  4. Теперь давайте проверим, загорится ли стоящий на земле герой!
    • Дважды нажмите кнопку Назад.
    • На экране создания матча нажмите кнопку Начать.
    • Выберите героя.
    • Ваш герой должен загореться сразу же после начала игры.
    • Нажмите клавишу Esc, затем нажмите кнопку Открыть редактор Мастерской, чтобы продолжить разработку скрипта.
  5. Давайте добавим еще одно правило для тушения героя, который находится в воздухе.
    • Мы не будем писать новое правило с нуля, а скопируем то, которое уже создали.
    • Нажмите кнопку Скопировать рядом с созданным правилом.
      • Нажмите кнопку Вставить правило.
      • Измените текст описания на следующий: «Тушит, если герой в воздухе». Так вы запомните, что это правило снимает эффект воспламенения, когда герой находится в воздухе.
      • Оставьте тип события без изменений.
      • Теперь нужно изменить условие, которое будет определять применение правила.
        • Щелкните по уже добавленному условию Is On Ground(Event Player) == True.
        • В раскрывающемся списке значений выберите пункт False.
        • В остальных полях оставьте имеющиеся значения и нажмите кнопку OK.
      • Далее изменим действие. Теперь оно будет снимать эффект воспламенения, когда герой не находится на земле.
        • Щелкните по уже добавленному действию Set Status (Event Player, Null, Burning, 10000).
        • В раскрывающемся списке действий выберите пункт Clear Status.
        • В раскрывающемся списке статусов выберите пункт Burning.
        • В остальных полях оставьте имеющиеся значения и нажмите кнопку OK.
  6. Давайте проверим, перестанет ли герой гореть, когда он находится в воздухе!
    • Дважды нажмите кнопку Назад.
    • Когда вы войдете в игру, герой должен воспламениться. Подпрыгните, чтобы проверить, перестанет ли ваш герой гореть.
    • Нажмите клавишу Esc, затем нажмите кнопку Открыть редактор Мастерской, чтобы продолжить разработку скрипта.
  7. Под конец сделаем так, чтобы герой получал урон во время контакта с землей.
    • Разверните правило с названием «Воспламеняет героя, находящегося на земле».
    • В разделе Действия нажмите кнопку Добавить. Это действие будет отнимать у героя здоровье, пока герой находится на земле.
      • В раскрывающемся списке действий выберите пункт Damage Over Time.
      • В поле длительности измените передвиньте ползунок, установив значение 9999.
      • В поле периодического урона передвиньте ползунок на значение 30.
      • В остальных полях оставьте значения по умолчанию и нажмите кнопку OK.
    • Разверните правило с названием «Тушит, если герой в воздухе».
      • В разделе Действия нажмите кнопку Добавить. Это действие остановит нанесение периодического урона, как только герой окажется в воздухе.
      • В раскрывающемся списке действий выберите пункт Stop All Damage Over Time .
  8. Давайте проверим, будет ли герой получать урон на земле и перестанет ли получать его в воздухе.
    1. Дважды нажмите кнопку Назад.
    2. Покиньте стартовую комнату и проверьте, будет ли герой получать урон.
    3. Подпрыгните и проверьте, перестанет ли герой получать урон.
  9. Отлично! Теперь пол превратился в лаву!

Что же такое «Зеркальная схватка»? Этот игровой режим состоит из нескольких коротких раундов, в ходе которых все играют за одинаковых героев. В конце каждого раунда герой игроков заменяется на случайно выбранного следующего героя из заранее составленного списка. Побеждает тот игрок, который совершил больше всего убийств по итогам матча.

Например, в одном матче все будут играть за Маккри, а затем переключатся на Фарру. В другом матче игроки начнут с Роковой Вдовы, а потом переключатся на Эш. Благодаря алгоритмам генерации списка вы вряд ли дважды сыграете теми же героями и в том же порядке!

Итак, давайте попробуем создать скрипт для режима «Зеркальная схватка»!

  • Перейдите по адресу Игра > Браузер матчей > Создать > Настройки > Мастерская.
  • Для начала нужно создать правило формирования списка героев, за которых можно играть.
    • Этот список будет храниться в глобальной переменной L в виде массива.
      • Массивом может быть что угодно: список игроков, список героев, список чисел, одно значение или даже их полное отсутствие (получится пустой массив).
      • Значения массива сохраняются под уникальными индексами, которые начинаются от 0. Сочетание индекса и его значения иногда называются элементом.
      • Порядок значений в массиве имеет значение, поэтому массивы [Reaper, Winston, Mercy] и [Mercy, Winston, Reaper] — это не одно и то же.
      • Значения в массиве могут отличаться по типу. Например, массив может одновременно содержать следующие значения: [123, Reaper, True, -4.5].
      • Если в аргументе ожидается массив, но используется другое значение, то значение копируется в массив из одного элемента.
      • Если в аргументе ожидается одиночное значение, но используется массив, то из массива берется первое значение (или 0, если массив пуст).
    • Добавьте правило и введите комментарий, чтобы помнить, за что оно отвечает.
    • Выберите тип события Ongoing — Global. Это значит, что в игре будет выполняться только один экземпляр данного правила.
    • Поскольку правило пока еще не имеет условий, оно будет выполняться с самого начала матча.
    • Добавьте действие:
      • Действие: Set Global Variable
        • Переменная: L
      • Значение: Hero
        • Герой: герой, за которого вы хотите играть.
      Действие Set Global Variable создает массив героев и устанавливает первого героя из списка для переменной L.
    • Играть за одного героя довольно скучно, поэтому давайте добавим еще несколько! Добавьте столько, сколько нужно, следуя приводимому алгоритму.
      • Действие: Modify Global Variable
        • Переменная: L
      • Операция: Append
      • Значение: Hero
        • Герой: герой, за которого вы хотите играть.
      Этот алгоритм добавляет героев в созданный нами массив, присвоенный переменной L. Если бы первое действие было Modify Global Variable, а не Set Global Variable, то массив начинался бы с 0. Все переменные по умолчанию равны 0, поэтому без изменения первого значения вы получите массив наподобие [0, Pharah, Hanzo, Ana,...] .
    • Добавим последнее действие этого правила. Правило будет использовать рандомизированную копию глобальной переменной L (массив героев), копировать часть этого перемешанного массива, начиная с нулевой позиции, и включать то количество героев, которые должны использоваться в игровом режиме. Затем эта копия будет сохраняться в глобальной переменной L, таким образом представляя собой перемешанную в случайном порядке часть исходного, подготовленного вами списка героев.
      • Например, если исходный список героев выглядел так: [Ashe, Doomfist, Hanzo, McCree, Pharah, Soldier: 76, Zenyatta, Widowmaker, Ana], то рандомизированный массив может выглядеть так: [Hanzo, Pharah, Widowmaker, Ana, Ashe, Doomfist, Soldier: 76, Zenyatta, McCree], а его часть может выглядеть как [Hanzo, Pharah, Widowmaker, Ana, Ashe, Doomfist].
  • Следующее правило будет гарантировать, что все игроки раунда будут играть за одного и того же героя.
    • Добавьте правило и введите комментарий, чтобы помнить, за что оно отвечает.
    • Выберите тип события Ongoing — Each Player. Это означает, что для каждого игрока будет выполняться свой экземпляр данного правила.
    • Добавьте два условия, которые должны соблюдаться, чтобы игрокам принудительно назначался определенный герой.
      • Номер раунда (глобальная переменная R) должен быть меньше общего количества героев в списке. Если условие нельзя соблюсти, принудительное назначение прекращается, а матч завершается. Нумерация раундов начинается с 0, поэтому если раундов 6, то последним значением будет 5. В том, что глобальная переменная R не приравнивается к 0, нет ничего страшного, поскольку все переменные по умолчанию начинаются с 0.
        • Значение: Global Variable
          • Переменная: R
        • Оператор: <
        • Значение: Count Of
          • Массив: Global Variable
            • Переменная: L
      • Это условие проверяет, не отличается ли используемый данным игроком в этом раунде герой от героя, который соответствует номеру этого раунда. Данный игрок — это специальное значение Event Player. Оно означает игрока, к которому в настоящий момент применяется экземпляр правила. Имя подходящего героя для текущего раунда сохраняется под соответствующим индексом списка героев (глобальная переменная L). Поскольку номер текущего раунда сохраняется в глобальной переменной R, то имя подходящего героя можно получить с помощью значения Value In Array.
        • Значение: Hero Of
          • Игрок: Event Player
        • Оператор: !=
        • Значение: Value in Array
          • Массив: Global Variable
            • Переменная: L
          • Индекс: Global Variable
            • Переменная: R
    • Теперь, добавив логику определения момента смены героев, мы должны добавить два нужных действия.
      • Первое действие будет принудительно переключать игрока события на подходящего героя. Первый аргумент этого действия — игрок, героя которого нужно принудительно сменить. Второй аргумент — это имя подходящего героя.
        • Действие: Start Forcing Player To Be Hero
        • Игрок: Event Player
        • Герой: Value In Array
          • Массив: Global Variable
            • Переменная: L
          • Индекс: Global Variable
            • Переменная: R
      • Второе действие выполняет предварительную загрузку следующего героя из списка для ускоренной смены героев. Хотя все играют за одного и того же героя, герои всех игроков загружаются независимо друг от друга. Это связано с тем, что каждому игроку может потребоваться свой облик для данного героя. Значение Add, добавляющее 1 к глобальной переменной R, подает команду данному действию на предварительную загрузку следующего, а не текущего героя. В последнем раунде действие вернет индекс массива, который отсутствует в массиве глобальной переменной L. Это нормально, поскольку все значения, выходящие за пределы массива, приравниваются к 0. Любое действие, ожидающее имя героя, но получающее 0, никак не повлияет на игру.
        • Действие: Preload Hero
        • Игрок: Event Player
        • Герой: Value In Array
          • Массив: Global Variable
            • Переменная: L
          • Индекс: Add
            • Значение: Global Variable
              • Переменная: R
            • Значение: Number
              • Число: 1.00
  • Следующее правило будет подготавливать раунды к запуску, если они еще не инициализированы.
    • Добавьте правило и введите комментарий, чтобы помнить, за что оно отвечает.
    • Выберите тип события Ongoing — Global. Это значит, что в игре будет выполняться только один экземпляр данного правила.
    • Добавьте три условия, которые должны соблюдаться, чтобы раунд начался.
      • Матч должен идти. Это значит, что экраны выбора героев и подготовки к матчу уже были показаны, но сам матч еще не завершался.
        • Значение: Is Game In Progress
        • Оператор: ==
        • Значение: True
      • Значение глобальной переменной I должно быть ложным (False). Эта переменная используется для обозначения того, что текущий раунд инициализирован. Если глобальная переменная I не была задана, то она будет равна 0, что в таких сравнениях приравнивается к значению False.
        • Значение: Global Variable
          • Переменная: I
        • Оператор: ==
        • Значение: False
      • Округленное число. Значение глобальной переменной R должно быть меньше общего количества героев в списке.
        • Значение: Global Variable
          • Переменная: R
        • Оператор: <
        • Значение: Count Of
          • Массив: Global Variable
            • Переменная: L
    • Как только все условия будут соблюдены, потребуется инициализировать раунд. Для этого добавьте приводимые ниже действия.
      • Первое действие сообщает основному игровому режиму, что матч не должен завершаться при обычных обстоятельствах. В режиме схватки это будет означать, что игра не закончится по истечении времени или по достижении максимального количества очков. После выполнения этого действия матч не будет завершаться, пока скрипт не включит собственную логику завершения матча, или до тех пор, пока не будет объявлен победитель.
        • Действие: Disable Built-in Game Mode Completion
      • Следующее действие настраивает текущий таймер игрового режима на длительность раунда.
        • Действие: Set Match Time
        • Время: Number
        • Число: 60.00
      • Это действие устанавливает глобальной переменной I значение True, после чего инициализация не произойдет до возврата переменной значения False.
        • Действие: Set Global Variable
        • Переменная: I
        • Значение: True
  • Это правило ожидает истечения времени текущего раунда перед переходом к следующему.
    • Добавьте правило и введите комментарий, чтобы помнить, за что оно отвечает.
    • Выберите тип события Ongoing — Global. Это значит, что в игре будет выполняться только один экземпляр данного правила.
    • Добавьте два условия, которые должны соблюдаться для перехода к следующему раунду.
      • Матч должен идти. Это значит, что экраны выбора героев и подготовки к матчу уже были показаны, но сам матч еще не завершался.
        • Значение: Is Game In Progress
        • Оператор: ==
        • Значение: True
      • Время текущего раунда должно быть равно 0. Это значит, что время этого раунда истекло.
        • Значение: Match Time
        • Оператор: ==
        • Значение: Number
          • Число: 0.00
    • При соблюдении этих условий и завершении раунда матч увеличит номер раунда и пометит этот раунд как не прошедший инициализацию. Для этого нужно добавить еще два действия.
      • Это действие передаст другим правилам информацию о том, что матч переходит к следующему раунду.
        • Действие: Modify Global Variable
        • Переменная: R
        • Операция: Add
        • Значение: Number
          • Число: 1.00
      • Это действие присваивает глобальной переменной I значение False, сообщая остальным правилам о необходимости инициализировать новый раунд.
        • Действие: Set Global Variable
        • Переменная: I
        • Значение: False
  • Последнее правило завершает матч после окончания всех раундов.
    • Добавьте правило и введите комментарий, чтобы помнить, за что оно отвечает.
    • Выберите тип события Ongoing — Global. Это значит, что в игре будет выполняться только один экземпляр данного правила.
    • Добавьте одно условие, которое будет проверять, не равна ли глобальная переменная R количеству элементов в глобальной переменной L. Если условие соблюдается, то за каждого героя в списке сыграно по одному раунду. Когда условие будет соблюдено, матч завершится.
      • Значение: Global Variable
        • Переменная: R
      • Оператор: ==
      • Значение: Count Of
        • Массив: Global Variable
          • Переменная: L
    • Когда условие окажется соблюдено, это действие включит встроенную логику завершения матча для данного игрового режима. Поскольку значение таймера будет равно 0, то режим игры немедленно завершит матч с переходом к стандартной последовательности завершения матча.
      • Действие: Enable Built-in Game Mode Completion

Отладка скрипта

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

Как открыть инспектор «Мастерской»

  1. Начните игру с созданным вами скриптом.
  2. Нажмите клавишу Esc.
  3. Нажмите кнопку «Открыть отладчик скриптов».
  4. Нажмите кнопку «Включить». По умолчанию эта функция не включена.

Инспектор «Мастерской» состоит из нескольких элементов.

  • Запись: элемент Entry позволяет узнать, что происходит в игре.
  • Комментарий: этот элемент отображает комментарий, добавленный вами для правила.
  • Условие: перечисляет, какие условия должны соблюдаться для выполнения действий.
  • Действие: перечисляет выполняемые действия.
  • Перемотка: позволяет прокручивать матч вперед или назад по времени.

Публикация скрипта

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

Как опубликовать скрипт

  1. Перейдите по адресу Игра > Браузер матчей > Создать > Настройки > Поделиться .
  2. Нажмите кнопку Скопировать.
  3. Отправьте ссылку другим людям!

Открывание скрипта

Хотите попробовать скрипт, созданный другим автором?

  1. Перейдите по адресу Игра > Браузер матчей > Создать > Настройки > Импорт .
  2. Введите ссылку.
  3. Нажмите кнопку OK.

Советы и хитрости

  • Для быстрого перехода в инспектор Мастерской можно назначить ему клавишу. Для этого нажмите клавишу Esc и выберите Настройки > Управление. Прокрутите список вниз до пункта Открыть инспектор Мастерской и назначьте ему клавишу.
  • В инспекторе «Мастерской» отображаются все выполненные и невыполненные действия с указанием причины.
  • Не забывайте о шаблонах матчей! Там уже могут быть предусмотрены некоторые моменты, которые вы собираетесь добавить в игру.
  • Если событие не срабатывает так, как задумано, причина может крыться в том, что игрок события уже выполняет действия по какому-то списку. Изучите поведение действий Wait в вашем правиле, особенно если они настроены игнорировать условия.
  • Чтобы выбрать нужное место на поле боя, используйте значение Vector и щелкните по значку камеры.
  • Значение Has Spawned весьма пригодится, если вы хотите, чтобы логика правил применялась только после выбора героя игроком.
  • Если вы хотите, чтобы правила применялись исключительно после подготовки к матчу и выбора героев, то используйте значение Is Game In Progress.
  • Часто самый простой способ понять, какое значение возвращается во время игры — это присвоить переменной подходящее значение и проконтролировать ее в инспекторе Мастерской.
  • Последний созданный эффект или значок можно сохранить в переменной игрока с помощью значения Last Created Entity. В дальнейшем это позволит вам сослаться на этот экземпляр при его уничтожении.
  • Сочетая массивы с фильтрами и такие значения, как All Players On Objective или Players Within Radius, вы можете с легкостью определять игроков, соответствующих определенным критериям (погиб, жив, имеет эффект статуса и так далее).
  • Если вам нужно ветвление, то можно использовать действие Skip If для пропуска действий при соблюдении определенных условий. При этом пропускаемые действия стоит дополнить действием Abort, чтобы не было одновременного выполнения обоих веток.
  • Пункты в раскрывающихся списках можно фильтровать частичным вводом значений.
  • Если в значении ожидается массив, но используется другой элемент, то значение копируется в массив из одного элемента.
    • Справедливо и обратное — если в значении ожидается отдельный элемент данных, но используется массив, то из массива будет взято одно значение с индексом 0.
  • Чтобы легче выявлять неполадки скрипта, его можно разделить на несколько действий или условий.
  • Если вы не уверены в том, для чего нужно действие, значение или аргумент, то наведите на него указатель мыши (на PC) или выберите пункт «Показать описание» на консоли.
  • Не забывайте добавлять комментарии. Так проще запомнить, для чего нужно правило!
  • Тестируйте скрипт почаще!