Триггеры:  

Новые события (триггеры)

В ERA была реализована возможность использовать для ERM-функций буквенное обозначение (имя) в виде !?FU(имя).
Именованные функции – это всегда произвольный текст между скобками, который заменяется на этапе загрузки карты на автоматические свободные номера (всегда уникальные).
Примеры (показать)

Важно также знать, что можно и так: Работает это так: как только встретили не в строке, но в ЕРМ коде скобки с текстом (…) - выделить под это (имя) номер функции или взять уже выделенный ранее, после чего вставить в код. Также, по умолчанию создаётся одноимённая SN:W-переменная со значением номера функции, выделенного для данного имени (т.е. в примере имеем y1=y2). Но при этом, соответствие имён функций и выделенных для них ID хранится вне ассоциативной памяти.

В ERA была убрана привязка к диапазону 0..30000 для ERM-функций. Функции, кроме FU1..FU29999, должны быть только именованные для максимальной совместимости.
ERA резервирует для своих нужд функции с номерами 77000..77999. Скриптописцы и создатели плагинов могут использовать значения в диапазоне 40000..134217727.

Новые события вводятся в игру не в виде привычных ERM триггеров вида !?XX, а в виде именованных функций вида !?FU(OnXXXX).

Все новые события обладают набором из 16 локальных (неизменяемых, повторно генерируемыми событиями) параметров, которые можно читать/записывать, обращаясь напрямую к x1..x16 (или же через устаревшую команду SN:X).
Пример:

См. также: Логика срабатывания событий.


!?FU(OnSavegameWrite);
Запись данных в сохранение.

Параметры: нет

В этом событии возможна запись пользовательских данных в файловые секции при помощи машинной функции WriteSavegameSection. Все ЕРМ переменные к этому моменту уже сохранены.


!?FU(OnSavegameRead);
Загрузка данных из сохранения.

Параметры: нет

В этом событии возможно чтение пользовательских данных из файловых секций при помощи машинной функции ReadSavegameSection. Все ЕРМ переменные к этому моменту уже загружены.


!?FU(OnKeyPressed);
Нажатие клавиши.

Параметры:
 1:  код клавиши
 2:  блокировать обработку игрой? (0 - нет, 1 - да)

Для определения того, в каком игровом окне мы сейчас находимся, служит функция GetGameState.
Переменные v1..v10 и z1 после события OnKeyPressed автоматически восстанавливают свои прежние значения.

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


!?FU(OnOpenHeroScreen);
Открытие окна героя.

!?FU(OnCloseHeroScreen);
Закрытие окна героя.

Параметры:
 1:  номер героя

В событии OnCloseHeroScreen значение параметра x1 такое же, как и в OnOpenHeroScreen, т.е. это номер первоначального героя, для которого был открыт экран героя.
Окно героя даёт возможность переключаться между героями игрока без генерации новых событий открытия/закрытия.
Для обоих событий работает синтаксис !!HE-1:….


!?FU(OnBattleStackObtainsTurn);
Отряд получает ход в бою.

Параметры:
 1:  сторона (0 - левая, 1 - правая)
 2:  номер отряда (0..21)

Пример:


!?FU(OnBattleRegeneratePhase);
Фаза регенерации в бою.

Параметры:
 1:  номер отряда (0..41)
 2:  указатель на структуру TBattleMonster
 3:  блокировать регенерацию? (0 - нет, 1 - да)

В этом событии происходит регенерация Кошмарных Гидр, Троллей, Призраков.
Пример:


!?FU(OnAfterSaveGame);
После сохранения игры.

Параметры: нет

Пример:


!?FU(OnBeforeHeroInteraction);
До взаимодействия героя с героем.

Параметры:
 1:  номер героя-инициатора
 2:  номер героя-цели
 3:  разрешить взаимодействие? (1 - да, 0 - нет)

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


!?FU(OnAfterHeroInteraction);
После взаимодействия героя с героем.

Параметры:
 1:  номер героя-инициатора
 2:  номер героя-цели


!?FU(OnStackToStackDamage);
Происходит при подсчёте урона, наносимого одним стеком другому стеку (включая стрельбу).

Параметры:
 1:  атакующий отряд (0..41) или -1
 2:  защищающийся отряд (0..41) или -1
 3:  конечный урон (НЕ МЕНЯТЬ!)
 4:  конечный урон (ИЗМЕНЯЕМЫЙ)
 5:  базовый урон
 6:  бонус урона (из-за разницы атака/защиты, кавалеристского блонуса или любого настроенного бонуса)
 7:  дальняя атака? (0 - рукопашная атака, 1 дистанционнаяесли не 0 или 1, то содержит мусор)
 8:  расстояние (только для теоретических атак установлено)
 9:  теоретическая атака? (расчёт для подсказки или ИИ: 0 - реальный урон, 1 - расчётный)


!?FU(OnAICalcStackAttackEffect);
Возникает, когда ИИ вычисляет эффект от атаки стека.

Параметры:
 1:  атакующий отряд (0..41)
 2:  защищающийся отряд (0..41)
 3:  значение эффекта (ИЗМЕНЯЕМОЕ)
 4:  значение эффекта (НЕ МЕНЯТЬ)


!?FU(OnChat);
Событие чата.

Первый параметр определяет тип события и остальные параметры:
0 (Вход в чат)
	Запретить вход? (0..1)
1 (Ввод)
	Строка ввода
	Действие: 0 (очистить панель), 1 (закрыть панель) или 2 (по умолчанию)
2 (Выход из чата)


!?FU(OnGameEnter);
Возникает после загрузки/начала новой игры (игрок получил контроль над мышью).

!?FU(OnGameLeave);
Возникает при выходе в главное меню/закрытии игры.

Параметры: нет


!?FU(OnEveryDay);
Возникает в начале нового игрового дня (до таймеров).

Параметры: нет

То же, что и OnErmTimer N (он же !?TM), но происходит каждый день для каждого игрока (включая ИИ) без каких-либо настроек и раньше всех остальных триггеров !?TM.
Пример:


!?FU(OnBeforeBattlefieldVisible);
Возникает в тёмной фазе загрузки боя (прямо перед !?BR&v997=-1).

Параметры: нет

В этом событии WoG применяет заклинания к стекам и начальные настройки стрельбы/рукопашнной/удар-возврат.
ВАЖНО! Нельзя использовать ресиверы BM и EA до OnBeforeBattlefieldVisible, т.к. бой ещё не начался, и весь боевой менеджер либо не инициализирован, либо имеет старые структуры данных с прошлого боя.


!?FU(OnBattlefieldVisible);
Возникает при отображении поля боя.

Параметры: нет

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


!?FU(OnAfterTacticsPhase);
Возникает сразу после окончания тактической фазы (или после OnBeforeBattlefieldVisible, если тактической фазы не было).

Параметры: нет

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


!?FU(OnCombatRound);
Возникает перед началом нового раунда (только для видимых реальных раундов).

Параметры: нет

v997 - номер раунда. Для тактической фазы оно начинается с -1000000000. Для обычной фазы боя отсчёт начинается с 0. Каждый раунд v997 увеличивается на единицу, поэтому он может служить постоянно растущим уникальным идентификатором раунда.
Замечание: значение v997 в других триггерах может быть другим!
Пример:


!?FU(OnTownHallMouseClick);
Возникает при клике в экране "Городской холл".

!?FU(OnKingdomOverviewMouseClick);
Возникает при клике в экране "Обзор королевства".

Параметры: нет

Все параметры, как обычно, можно получать с помощью !!CM. Реакцию по умолчанию можно отключать.


!?FU(OnLoadHeroScreen);
Возникает до открытия экрана героя (тёмная фаза).

Параметры:
 1:  номер героя

Событие происходит непосредственно перед отрисовкой экрана героя для конкретного героя: после события OnOpenHeroScreen и при каждом переключении в одном диалоге между героями игрока. Также, событие происходит во время нажатия на героя в таверне и в бою (со специальными плагинами).
Событие может быть использовано для изменения информации/навыков/войск героя ТОЛЬКО в окне героя.


!?FU(OnBuildTownBuilding);
Постройка зданий в городе.

Параметры:
 1:  номер города
 2:  номер здания

Событие происходит, когда текущий игрок (включая ИИ) строит здание в замке.


!?FU(OnOpenTownScreen);
Возникает до загрузки экрана города (тёмная фаза).

!?FU(OnCloseTownScreen);
Возникает после закрытия экрана города (тёмная фаза).

Параметры:
 1:  номер города, который был открыт изначально.

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


!?FU(OnSwitchTownScreen);
Возникает при переключении замков в окне города.

Параметры:
 1:  номер города


!?FU(OnPreTownScreen);
Возникает до отображения экрана города (тёмная фаза).

!?FU(OnPostTownScreen);
Возникает когда закрывается экран города (тёмная фаза).

Параметры:
 1:  номер города

Оба события происходят для определённого замка и независимо от того, открывается/закрывается или переключается экран города.
Их можно использовать, например, для предварительного изменения названий/зданий/жилищ и отмены изменений впоследствии.


!?FU(OnPreHeroScreen);
Возникает перед загрузкой экрана героя (тёмная фаза).

!?FU(OnPostHeroScreen);
Возникает после закрытия экрана героя (тёмная фаза).

Параметры:
 1:  номер героя

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


Расширенные стандартные события в ERA

Расширенные стандартные события также обладают собственными SN:X параметрами и дополнительными возможностями.

!?GM1
Триггер на сохранение игры.

Параметры:
 1:  имя сохранения

Пример: Если красный игрок выбрал newgame, то игра будет сохранена в файл newgame_Красный.gm1.


!?MM0
Триггер для контроля над текстом в битве.

Параметры:
 1:  номер текущего отряда или -1
 2:  номер вражеского отряда, на который наведён курсор или -1
 3:  минимальный урон
 4:  максимальный урон

Пример:
Триггер удобен для замены стандартной подсказки в бою на расширенную с указанием, сколько единиц противника будет убито при ударе.