В 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: значение эффекта (НЕ МЕНЯТЬ)
Первый параметр определяет тип события и остальные параметры: 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: номер героя
Оба события происходят для определённого героя и независимо от того, открывается/закрывается экран героя или идёт переключение между героями.
Их можно использовать для предварительного изменения существ/названий/навыков героя и отмены изменений впоследствии.
Расширенные стандартные события также обладают собственными SN:X параметрами и дополнительными возможностями.
!?GM1
Триггер на сохранение игры.
Параметры: 1: имя сохранения
Пример:
Если красный игрок выбрал newgame
, то игра будет сохранена в файл newgame_Красный.gm1.
!?MM0
Триггер для контроля над текстом в битве.
Параметры: 1: номер текущего отряда или -1 2: номер вражеского отряда, на который наведён курсор или -1 3: минимальный урон 4: максимальный урон
Пример:
Триггер удобен для замены стандартной подсказки в бою на расширенную с указанием, сколько единиц противника будет убито при ударе.