События

Добавлен , опубликован
Раздел:
Общее
Сегодня мы познакомимся с тем, что в Весноте называется event, а в старом добром варкрафте - триггер.

Коротко о главном

Событие - это блок [event] внутри сценария (разница между сценарием и картой заключается в том, что карта это лишь набор тайлов и стартовых точек).
Событие, как и блоки описания, имеет свои параметры.
id - уникальный идентификатор. Не обязателен! Последующие события с уже использующимся идентификатором не работают. События с идентификатором можно удалять.
first_time_only=[yes|no] - определяет, является событие разовым или повторяющимся. По умолчанию - yes.
name - в отличие от описательных блоков, здесь под именем подразумевается событие, произошедшее в игре (Начало хода, покупка юнита, попадание по цели).
Список стандартных имён
preload
	Срабатывает перед prestart и при загрузке игры - перед тем, как что-либо появится на экране. Может использоваться для языка Lua: подгрузить библиотеки, создать функции и т.д.
	Примечание: В отличие от prestart и start, событие preload должно срабатывать более одного раза! Потому что событие должно срабатывать каждый раз при загрузке сохраненной игры, а не только перед prestart. Это означает, что параметр first_time_only=no обязателен.
prestart
	Срабатывает перед start - перед тем, как что-либо появится на экране. Может использоваться для таких вещей, как установление деревням владельцев.
	Примечание: в таком событии параметр first_time_only не имеет смысла, так как событие вызывается лишь раз за игру. 
start
	Срабатывает после загрузки сценария, но до начала игры - до того, как игроки смогут что-либо делать. 
	Примечание: в таком событии параметр first_time_only не имеет смысла, так как событие вызывается лишь раз за игру 
new turn
	Срабатывает в начале каждого хода игры(не игрока). Перед вызовом таких событий, менятся значение WML-переменной turn_number. 
turn end
	Срабатывает в конце каждого хода игры(не игрока). WML-переменная side_number будет содержать номер игрока, ходившего последним. 
turn X end
	Срабатывает в конце хода X.
side turn
	Срабатывает, в начале хода игрока. Перед вызовом таких событий, значение WML-переменной side_number присваивается номер игрока, чей ход наступает. Срабатывает до лечений, получения золота и восстановления действий и статуса юнитов. 
ai turn
	Срабатывает перед ходом компьютерного игрока. Вызывается после side turn. Может срабатывать несколько раз за один ход игры. Нарпимер, если игрок решит отдать часть своего хода на усмотрение компьютера, событие сработает после нажатия соответствющей кнопки.
	Примечание: ломает реплеи.
turn refresh
	Как и side turn, срабатывает в начале хода, но после лечения, дохода и восстановления движения и статуса.
	Примечание: срабатывает даже на первом ходу.
turn X
	Срабатывает при наступлении энного хода. Вызывается на игроке, начинающем этот игровой ход.
Порядок срабатывания вышеописанных событий:
  1. turn X
  2. new turn
  3. side turn
  4. side X turn
  5. side turn X
  6. side X turn Y
  7. turn refresh
  8. side X turn refresh
  9. turn X refresh
  10. side X turn Y refresh
side X turn Y
	Срабатывает в начале энного хода игрока Y.
side X turn
	Срабатывает в начале каждого хода игрока Х.
	Примечание: разумеется, если установлен параметр first_time_only=no. Не забывайте про этот параметр.
side turn X
	Срабатывает в начале энного хода каждого игрока.
side X turn Y refresh
	Срабатывает после turn refresh для игрока X на энном ходу.
side X turn refresh
	Срабатывает после turn refresh для игрока X на каждом ходу.
turn X refresh
	Срабатывает после turn refresh на энном ходу.
side turn end
	Срабатывает в конце хода.
Как и side turn, имеет несколько вариаций:
  1. side turn end
  2. side X turn end
  3. side turn X end
  4. side X turn Y end
  5. turn end
  6. turn X end
time over
	Срабатывает по истечении таймера ходов. Т.е. если в сценарии стоит лимит на 20 ходов, то триггер сработает при завершении двадцатого хода игры.
enemies defeated
	Срабатывает, когда все юниты с параметром canrecruit=yes (словом, лидеры), несоюзные игроку 1 убиты. 
victory
	Срабатывает при победе в сценарии. Также вызывается блоком [endlevel] с result=victory. Сначала срабатывают [endlevel], а затем уже victory. Это может помочь в дебаге кампании (при переходе с одной карты на другую), особенно в связке с режимом команд, в частности командой ":n".
defeat
	Аналогично победе.

Следующие события применяются с фильтрами, т.е. с условиями.

moveto
	Срабатывает при движении юнита. Обычно используется с фильтром координат тайла, на который юнит наступает. Если юнит наступает на деревню, то сначала срабатывает событие capture, а потом уже moveto.
	Примечание: блок [allow_undo] внутри moveto позволит отменить движение юнита, но при этом действия события отменены не будут. Используйте с умом. Переменные $x2 и $y2 содержат координаты гекса, с которого юнит пришел. 
sighted
	Важно: события "sighted" в целом весьма баганутые, особенно если "delay shroud updates" = "yes". Рекомендуется избегать их любой ценой, особенно если вы хотите в этом событии менять игровые параметры.
	Альтернатива: moveto с фильтром координат. Фильтр filter_vision может быть полезен в некоторых случаях. Есть скрипт: ON_SIGHTING (http://www.wesnoth.org/macro-reference.xhtml).
	Событие sighted срабатывает, когда туман или пелена сходят с юнита (primary_unit), т.е. он становится видимым. Это может случиться, когда другой юнит (second_unit) подходит к главному юниту на расстояние обзора. Однако, не срабатывает, если главный юнит появляется "out of the mist". (Это один из багов)
	Примечание: Срабатывает только в случае перемещения юнита. Если в процессе движения юнит останавливается из-за обнаружения противника, событие не вызывается. Это делает событие ненадёжным: сработает или нет - зависит от игрока. (Можно назвать багом.)
Следующие события вызываются при атаке одним юнитом (primary_unit) другого (secondary_unit).

attack
	Срабатывает, когда primary unit (атакующий) атакует secondary unit (защищающийся).
attack end
	Похожа на attack, но срабатывает после битвы. Если в бою имела место смерть, то это событие вызывается до событий die. 
attacker hits
	Срабатывает, когда атакующий наносит урон защищающемуся. Переменная damage_inflicted содержит урон. 
attacker misses
	Аналогично. Но при промахе. 
defender hits
	Аналогично attacker hits, но урон наносит защищающийся.
defender misses
	Защищающийся промахивается.
petrified
	Срабатывает, когда primary unit получил урон от атаки с 'petrifies' способностью, нанесённой secondary unit. (Я полагаю, что primary unit и secondary unit являются переменными.)
last breath
	Срабатывает, когда юнит убит, но до анимации смерти. Используйте это вместо name=die, чтобы умирающий сказал свои последние слова ([message]).
die
	Срабатывает, когда primary unit убит secondary unit. Примечание: он не удаляется до завершения такого события. Им всё ещё можно управлять, он блокирует гекс, на котором стоит, и может быть найден фильтрами (кроме [have_unit]). Чтобы предотвратить это, вы можете использовать [kill] для мгновенного удаления юнита. Это событие остановит другие события (которые ещё не вызваны), которые могли быть вызваны этим юнитом.
capture
	Срабатывает, когда юнит захватывает деревню. До этого деревня может быть как нейтральной, так и принадлежать другому игроку; если юнит входит в свою деревню, то событие не вызывается. Срабатывает до moveto. Деревня, которая становится нейтральной (например, при [capture_village]) Не вызывает событие. Переменная $owner_side содержит предыдущего владельца. Если 0, то она была нейтральной.
recruit
	Срабатывает, когда primary unit завербован (юнитом secondary unit).
prerecruit
	Срабатывает, когда primary unit завербован (юнитом secondary unit), но до того, как игрок это увидит.
recall
	Primary unit вызван (юнитов secondary unit). 
prerecall
	Аналогично, но до того, как игрок это увидит.
advance
	Срабатывает перед тем, как юнит проапгрейдится (после соответствующего выбора, если есть несколько вариантов улучшения). Если в событии юнит удаляется, меняется тип юнита или кол-во опыта уменьшается настолько, что не хватает на апгрейд, то апгрейд отменяется. Баг - не отменяются AMLA улучшения.
post advance
	Срабатывает после апгрейда.
select
	Срабатывает, когда игрок выделяет юнита. До версии 1.11 также срабатывает при неожиданной остановке движения (враг обнаружен), т.к. игра сохраняет юнита выделенным до конца движения. Примечание: в сетевой игре срабатывает только для локального игрока, так что может вызвать десинхронизацию.
menu item X
	Срабатывает при выборе определенного пункта в контекстном меню. Примечание: если у пункта меню есть [command], событие может быть вызвано как до блока [command], так и после. Никаких гарантий.
remove=yes - удаляет событие с таким же идентификатором.
Пример
[event]
	id=e1
	name=side 1 turn
	first_time_only=no
	[inspect][/inspect]
[/event]
  
[event]
	id=e2
	name=side 2 turn
	first_time_only=no
	[inspect][/inspect]
	[event]
		id=e1
		remove=yes
	[/event]
[/event]
Здесь 3 события. Но по факту третье событие - часть второго, поэтому не будем рассматривать его отдельно.
Оба события срабатывают в начале хода 1 и 2 игроков соответственно.
Блок [inspect] написан для дебага. Если вы его увидели, значит событие отработало.
В начале второго хода первый игрок уже не увидит окно [inspect].
[filter] - основной фильтр (условие), обычно используется для определения юнита или координат.
[filter_second] - фильтр второго юнита.
Обычные параметры фильтра юнитов.
Обычные параметры фильтра местоположения.
[filter_attack] - фильтр атаки нападающего юнита.
[filter_second_attack] - аналогично, но теперь фильтруется защищающийся.
Параметры фильтра атак:
name - название оружия.
range - его "дальнобойность"
special - способность.
[filter_side] - фильтр игрока.
Параметры фильтра игроков:
side - № игрока.
[has_unit] - фильтр юнита.
team_name - имя команды. Строка, через запятую можно нафильтровать несколько названий.
[enemy_of] - фильтр игрока.
[allied_with] - фильтр игрока.
controller=[ai|human|human_ai|null] - собстнвенно, кем является игрок. Либо ИИ, либо человек, либо человек отдал ход на усмотрение ИИ, либо никто. Этот параметр не работает в мультиплеере. (Понятия не имею, почему на клиентах отличаются котроллёры.)
[filter_condition] - используется тогда, когда событие вызывается без переменных и не может предоставить другим фильтрам нужные данные.
Параметры фильтра условий:
[have_unit] - фильтр юнита 2 дополнительными параметрами:
	count - кол-во юнитов, которые должен иметь игрок. Может быть как числом, так и диапазоном. Допустимые варианты могут разделяться запятыми.
	search_recall_list=[yes|no] - если да, то будет поиск будет проходить ещё и в списке призываемых юнитов.
[have_location] - фильтр позиции с 1 дополнительным параметром:
	count - кол-во удовлетворяющих местоположений.
[variable] - сравнивает значения WML-переменных.
	name - имя переменной, значение которой будет проверяться.
	Проверки:
	contains - проверяет, содержится ли в переменной какой-то текст.
	equals - сравнивает строковое содержимое переменных, истинно, если значения совпадают.
	not_equals - аналогично, но наоборот.
	boolean_equals - сравнивает логическое значение.
	boolean_not_equals - аналогично.
	numerical_equals - сравнивает числовые значения.
	numerical_not_equals - аналогично.
	greater_than - больше, чем.
	greater_than_equal_to - больше либо равно.
	less_than - меньше, чем.
	less_than_equal_to - меньше либо равно.
Примечание: сравнение строк быстрее сравнения чисел и логики, потому что не разбирает типы переменных. Они сделаны для сравнения таких вещей, как "1" и "1.0", "yes" и "true".
	Булевские значения:
true: "yes" и "true".
false: "no", "false" и ""(неинициализированная переменная).
Есть также "стандартные" вещи, такие как [and], [or], [if], [then] и т.д..

Где создаются события

События создаются в сценарии карты (например, Wesnoth\data\multiplayer\maps\2p_Aethermaw.map - карта и Wesnoth\data\multiplayer\scenarios\2p_Aethermaw.cfg - её сценарий) или в однофайловом сценарии (например, userdata\editor\scenarios\myfirstmap - содержит и карту, и сценарий).

Если вы решили сделать события для обычной карты

  • Открываем кфг файл любым текстовым редактором на ваш вкус.
  • События пишем внутри блока [multiplayer].

Если вы создали в редакторе свой сценарий (именно сценарий, не карту)

  • Открываем сценарий любым текстовым редактором на ваш вкус.
  • Тут блок [multiplayer] отсутствует, а потому писать будем в конец файла, вне всяких блоков.

Событие Objectives

Блок [objectives] задаёт цели игроков. Точнее то, что они будут видеть в своих целях, т.е. просто текст. Если написано убить 10 вражеских юнитов, то это совершенно не значит, что игра закончится на убийстве десятого юнита. События победы и поражения нужно писать отдельно.
[event]
	name=prestart
	[objectives]
    	side=1
  	[objective]
    	   	description= _ "Kill 10 enemy units"
       	condition=win
    	[/objective]
     	[objective]
		description= _ "Death of your leader"
		condition=lose
     	[/objective]
     	[objective]
     		description= _ "Turns run out"
     		condition=lose
     	[/objective]
	[note]
		description="Don't kill enemy leader!"
	[/note]
    [/objectives]
[/event]
Что мы тут видим? Событие срабатывает до начала игры и меняет задачи первого игрока. Его целью становится уничтожение десяти вражеских юнитов. И проиграет он, если погибнет лидер или неуспеет нарубить врагов за отведенное кол-во ходов. Также создаётся заметка, что убивать вражеского лидера не стоит.
Параметры [objectives]
side - № игрока.
bullet - общий маркер для задач. Т.е. внутренние блоки его наследуют. По умолчанию это '• '.
summary - текст, выводимый над задачами.
note - текст, выводимый под ними.
victory_string, defeat_string, gold_carryover_string и notes_string - текст, который будет выводиться вместо слов "победа", "поражение", "золота переносится" и "заметки".
silent[yes|no] - будет ли оповещён игрок об изменениях в задании.
В [objectives] задаются всего три блока. Может быть несколько одинаковых блоков, но все они - необязательные.
[objective] - условие победы или поражения (зависит от параметра condition):
	condition=[win|lose] - определяет тип задачи. По умолчанию победные цели пишутся зелёным цветом, а условия поражения - красным.
	description - текст задачи.
	show_turn_counter=[yes|no] - будет ли показываться счетчик ходов, оставшихся на выполнение этой цели.
	[show_if] - если условие выполняется, то цель существует. Если условие перестаёт выполняться, то цель исчезает и возобновится тогда, когда результат условия снова станет истинным. Условие проверяется только блоком [show_objectives].
	bullet - маркер.
	red, green и blue - числа от 0 до 255. Отвечают за цвет, которым будет выводиться задача.
[gold_carryover] - отвечает за то, сколько золота будет переходить в следующий сценарий.
	bonus=[true|false] - будет ли бонус за быстрое выполнение сценария.
	carryover_percentage - число. Указывает, сколько процентов золота перейдет в следующий сценарий.
	bullet - маркер.
	red, green и blue - числа от 0 до 255. Отвечают за цвет, которым будет выводиться задача.
[note] - заметки.
	description - текст заметки.
	bullet - маркер.
	red, green и blue - числа от 0 до 255. Отвечают за цвет, которым будет выводиться задача.

Переменные

Имя переменной может содержать только буквы латинского алфавита, арабские цифры и знак подчеркивания. Переменные существуют пока не закончится кампания или не будут удалены.
Одиночные переменные создаются и меняются так:
[set_variable]
	name=my_variable
	value="sample value"
[/set_variable]
Значение переменной может быть переводимым (value= _ "sample value"). Различные выражения вида 2+2 тоже допустимы. Допустимые действия блока [set_variable].
Примечание
Я не уверен в необходимости блока [set_variable]. Простая строчка
my_variable="sample value"
тоже будет работать.
Массив можно записать так
[set_variable]
	name=my_awesome_array[0].x
	value=10
[/set_variable]
[set_variable]
	name=my_awesome_array[1].x
	value=12
[/set_variable]
[set_variable]
	name=my_awesome_array[2].x
	value=14
[/set_variable]
и так
[set_variables]
	name=my_awesome_array
	[value]
		x=10
	[/value]
	[value]
		x=12
	[/value]
	[value]
		x=14
	[/value]
[/set_variables]
Значение переменных достаётся таким образом
message= _ "Hello, $my_variable|... How are you?"
Игра не заморачивается поиском нужных переменных и берет сразу ту, которая находится между "$" и "|".

Теперь добавим в предстартовое событие с задачами блок
[set_variable]
	name="units_killed"
	value=0
[/set_variable]
И создадим ещё одно событие
[event]
	id=kill
	name=die
	first_time_only=no
	[filter]
		side=2
	[/filter]
	[set_variable]
		name="units_killed"
		add=1
	[/set_variable]
	[if]
		units_killed=10
		[then]
			[endlevel]
				result=victory
			[/endlevel]
		[/then]
	[/if]
[/event]
Теперь при убийстве десятого юнита сценарий будет завершен победой.
Следующее событие засчитает поражение первому игроку по окончании им тридцатого хода.
[event]
	id=time defeat
	name=side 1 turn 30 end
	[endlevel]
		result=defeat
	[/endlevel]
[/event]
Не забудьте ограничить кол-во ходов в самой карте - отсутствие счетчика может вызвать "внезапную смерть".
Потеря единственного лидера приведет к поражению независимо от наличия соответствующего триггера. Если же в вашем сценарии есть дополнительные лидеры, которых игрок может спокойно казнить, то создайте ещё одно событие смерти с фильтром на определенного юнита.

Ещё примеры событий

Перед смертью юнит скажет свои последние слова
[event]
        name=last breath
        [filter]
            id=Urugha
        [/filter]
        [message]
            speaker=unit
            message=_ "I've been bested, but the combat wasn't fair... A thousand curses on you, withered coward! May you suffer... and when my master, Rualsha, finds you may he wipe your people from the face of this earth!"
        [/message]
    [/event]
Юнит добирается до угла карты и выигрывает игру. Пр этом он сохраняется для следующего сценария
[event]
        name=moveto
        first_time_only=no

        [allow_undo]
        [/allow_undo]

        [filter]
            x=1
            y=1
            id=Kai Krellis
        [/filter]

        [store_unit]
            [filter]
                id=Kai Krellis
            [/filter]
            variable=KK
        [/store_unit]

        [if]
            [variable]
                name=KK.level
                greater_than=0
            [/variable]
            [then]
                {SCENARIO_END}
            [/then]
        [/if]
    [/event]
Юнит получает уровень и выигрывает сценарий, если находится в углу карты
[event]
        name=post_advance
        first_time_only=no

        [filter]
            x=1
            y=1
            id=Kai Krellis
        [/filter]

        {SCENARIO_END}
    [/event]
Прежде чем победить, игрок должен подобрать предмет
[event]
        name=enemies defeated

        [if]
            # If the ring is currently sitting on the map...
            [variable]
                name=ring_x
                not_equals=999
            [/variable]

            #...then make the moveto event end the scenario
            [then]
                [message]
                    speaker=narrator
                    message= _ "Have a unit pick up the ring to end the scenario."
                    image=wesnoth-icon.png
                [/message]

                [set_variable]
                    name=end_level_when_ring_picked_up
                    value=yes
                [/set_variable]

                [objectives]
                    side=1
                    silent=yes
                    [objective]
                        description= _ "Have a unit pick up the ring of power."
                        condition=win
                    [/objective]

                    {HOW_TO_LOSE}

                    [gold_carryover]
                        bonus=yes
                        carryover_percentage=40
                    [/gold_carryover]
                [/objectives]
            [/then]

            # ...Otherwise, since the ring must have been picked up
            # already, we'll end now.
            [else]
                [message]
                    speaker=Cylanna
                    message= _ "Killing these enemies was good, but there were many more on the way. It will take greater might than we have to defeat them."
                [/message]
                [message]
                    speaker=Kai Krellis
                    message= _ "Onward to TyegГ«a's island, then."
                [/message]
                {SCENARIO_END}
            [/else]
        [/if]
    [/event]
А вот так создаются юниты
[event]
        name=prestart
        [unit]
            type=Wolf
            x=20
            y=24
            side=3
        [/unit]
        [unit]
            type=Wolf
            x=20
            y=25
            side=3
        [/unit]
        [unit]
            type=Goblin Knight
            x=15
            y=5
            side=2
            id=Vrunt
            name= _ "Vrunt"
            unrenamable=yes
        [/unit]
    [/event]
Подбираем предмет, он удаляется, создаётся юнит и на него навешиваются особенности
[event]
        name=moveto
        first_time_only=yes
        [filter]
            x=23
            y=27
            side=1
        [/filter]
        [remove_item]
            x,y=$x1,$y1
        [/remove_item]
        [unit]
            type=Drake Burner
            id=Keshan
            name= _ "Keshan"
            unrenamable=yes
            x=23
            y=27
            side=1
            [modifications]
                {TRAIT_LOYAL}
                {TRAIT_INTELLIGENT}
            [/modifications]
        [/unit]
    [/event]
А вот тут много текста и всё прокомментировано
# This event shows KK on the edge of the map for a second, moves
# him to a village, pauses, then moves him to the castle. At the
# village some units are spawned with some dialog.
    [event]
        name=start

        # Store KK so we have the type for [move_unit_fake]:
        [store_unit]
            [filter]
                id=Kai Krellis
            [/filter]
            variable=KK_stored
        [/store_unit]

        # Show KK at the edge of the screen: (He actually starts in
        # the castle (hidden) to make this opening more
        # configurable. It just requires one extra teleport.)
        [teleport]
            [filter]
                id=Kai Krellis
            [/filter]
            x,y=1,14
        [/teleport]
        [scroll_to]
            x,y=1,14
        [/scroll_to]
        [unhide_unit][/unhide_unit]
        [redraw][/redraw]
        [delay]
            time=1000
        [/delay]
        [hide_unit]
            x,y=1,14
        [/hide_unit]

        # Show the move to the village:
        [move_unit_fake]
            x=2,5
            y=14,18
            type=$KK_stored.type
            side=1
        [/move_unit_fake]

        # Move KK to the village:
        [teleport]
            [filter]
                id=Kai Krellis
            [/filter]
            x,y=5,18
        [/teleport]
        [unhide_unit][/unhide_unit]
        # Capture the village KK did not stop in:
        [capture_village]
            side=1
            x,y=5,17
        [/capture_village]

        # Action at the village:
        [unit]
            side=1
            type=Merman Fighter
            x,y=5,18
            id=Nebthun
            name=Nebthun
            experience=6
            [modifications]
                {TRAIT_LOYAL}
                {TRAIT_RESILIENT}
            [/modifications]
            {IS_LOYAL}
        [/unit]
        [unit]
            side=1
            type=Merman Hunter
            x,y=5,18
            id=Jarla
            name=Jarla
            [modifications]
                {TRAIT_LOYAL}
                {TRAIT_INTELLIGENT}
            [/modifications]
            experience=10
            {IS_LOYAL}
        [/unit]
        [unit]
            side=1
            type=Merman Brawler
            x,y=5,18
            id=Tabomo
            name=Tabomo
            [modifications]
                {TRAIT_LOYAL}
                {TRAIT_STRONG}
            [/modifications]
            experience=32
            {IS_LOYAL}
        [/unit]
        [message]
            speaker=Nebthun
            message= _ "Kai Krellis! You live! We thought you and your people had all been killed when Jotha fell."
        [/message]
        [message]
            speaker=Kai Krellis
            message= _ "No, most of us escaped. I thought your settlements might be far enough away to escape harm, but you look as if you had seen battle."
        [/message]
        [message]
            speaker=Nebthun
            message= _ "Indeed, though we have not been hard pressed. The creatures have been busy fouling the waters and making the bay more to their liking. We worry that they will soon be back to finish with us, and I fear we will not survive."
        [/message]
        [message]
            speaker=Kai Krellis
            message= _ "We come prepared for battle, and have brought help. We will reclaim our home and make yours safe as well. Mal-Ravanal will pay this day."
        [/message]
        [message]
            speaker=Nebthun
            message= _ "Good. We will join you. You will be impressed with how quickly Tabomo here crushes skeletons. I think we should make the ruined castle on the mainland our base. The undead cut down many trees there to make bridges, and it is much easier to move through now."
        [/message]

        # Move KK to the keep:
        [hide_unit]
            x,y=5,18
        [/hide_unit]
        [teleport]
            [filter]
                id=Kai Krellis
            [/filter]
            x,y=16,24
        [/teleport]

        # Show the move to the keep:
        [move_unit_fake]
            x=5,16
            y=18,24
            type=$KK_stored.type
            side=1
        [/move_unit_fake]

        # ...and:
        [unhide_unit][/unhide_unit]
        # wmllint: who RECALL_LOYAL_UNITS is Tyegea
        {RECALL_LOYAL_UNITS}

        [clear_variable]
            name=KK_stored
        [/clear_variable]
    [/event]