Автор: scrackan
Чеки (Checks) | События (Instances) |
---|---|
|
|
Приложения: |
|
Trigger Manager - мощнейший инструмент для написания игровых сценариев сингл-миссий. Как бы пафосно это ни звучало, но его возможности почти безграничны, а простор для фантазии - огромен. Каждый триггер состоит из чека (check) и события (instance), т.е. кратко можно выразить его суть так: при определенном чеке (проверка: выполняется ли ряд условий?) происходит какое-либо событие.
Для начала триггер нужно озаглавить. Введите название в поле "Trigger Name"; разумеется, оно должно быть кратким и понятным (например, Start, Come to ogre first time). Во избежание проблем, пожалуйста, не используйте кириллицу! Затем необходимо выбрать соответствующий чек выполнения триггера: if условие = какому-либо значению (кстати, вместо знака "=" можно использовать ">", "<", "!=" (не равно), ">=" (больше или равно) и "<=" (меньше или равно)), происходят определенные события.
Примечание: на самом деле в Trigger Manager'е для трех понятий применяется только одно слово - "check". Для удобства будем использовать несколько терминов: чек - это непосредственно проверка: равно (больше, меньше, не равно, больше или равно, меньше или равно) ли какое-то условие (верхнее поле) определенному значению (нижнее поле).
Максимальное количество чеков в одном триггере - три (объединяются флажком and), а событий может быть до четырех. Если необходимо выполнить более 4 событий, создается еще один триггер (для удобства к названию первого тригера добавляется "2" - например Start2) с аналогичнымы чеками - туда и входят события, которые "не поместились" в предыдущий. Кстати, у большинства чеков должен стоять флажок Run Once (выполнять один раз).
Прежде чем выбрать необходимые условия и значения для какого-либо чека, их нужно создать. Делается это в Check Manager (кнопка Manage Checks). Там представлено 27 базовых типов условий и значений (Check types), которым можно присваивать свои названия и ряд параметров.
В данной документации будут описаны все типы чеков, их параметры, примеры применения, а также возникающие проблемы и замеченные баги. Информация будет появляться постепенно (следите за версией руководства!), в зависимости от прогресса "анализа" сингл-миссий.
Сколько юнитов содержит группа (единственный параметр - номер группы). Если группа состоит из одного юнита, то чек "if ogres number (условие "How many units contains this group") = FALSE" равнозначен чеку "if Is ogre alive? (условие "Is unit alive?") = FALSE. По непонятным причинам разработчики "Аллодов" больше склоняются к первому варианту.
Возвращает значение какого-либо параметра определенного юнита. Параметры условия:
Например, чек "if Trolls health (условие "Get unit parameter", Unit=23 (ID тролля на карте), Parameter=6 ("Жизнь")) < 1229 - max trolls hp (значение "Constant Value", Value=1229 (максимальная жизнь 4-го тролля))" означает "4-й тролль поврежден хотя бы на 1 единицу жизни".
Проверка, жив ли какой-то конкретный юнит. Единственный параметр: Unit (ID юнита).
Это условие принимает значение TRUE (если жив) или FALSE (если мертв).
Расстояние между двумя юнитами. Параметры:
В качестве второй части чека используется значение "Constant Value". Дистанция для разговора, как правило, <= 4.
Расстояние от точки на карте до юнита. Параметры:
Например, чтобы создать условие "герой заходит на мост", необходимо ввести: "if Hero to bridge distance (условие "Distance from point to unit", Unit=10001, X=51, Y=39 (координаты точки на мосту)) <= 2 (значение "Constant Value", Value=2)".
Постоянное значение (просто число). Используется в качестве второй части у большинства чеков. Для удобства его название делают таким же, как и само постоянное значение. Например, "if Hero to ogre distance (условие "Distance between units" между героем и людоедом) <= 4 (условие "Constant Value")" означает "герой подошел к людоеду на 4 клетки или ближе".
Расстояние от точки с коодинатами X и Y до ближайшего юнита конкретного игрока. Параметры:
Без комментариев. :)
Тоже без комментариев. :) Хотя при создании триггера "start" иногда используется чек "if FALSE = FALSE". С таким же успехом можно сделать и что-нибудь вроде "if 4 = 4" (т.е. в любом случае какой-то чек должен быть).
Очень странно работает. Единственный параметр: Unit (ID юнита). Если в качестве значения поставить =TRUE - ничего не пройзойдет (даже если юнит на кого-нибудь нападет), если поставить =FALSE - чек сработает в любом случае.
Не рекомендую пользоваться этим чеком, пока мы не разберемся с ним окончательно! Для подобных целей есть много других интересных вариантов исполнения.
Проверка, нарушена ли изначально установленная дипломатия между игроками (players). Параметры:
Get diplomacy принимает значения TRUE (если дипломатия изменилась) или FALSE. Кстати, не забывайте, что "!= FALSE" это то же самое, что и "= TRUE".
Например, условие "if Skrakan is friendly (чек "Get diplomacy", Player 1 = "1" (self), Player 2 = "8" (Skrakan)) = TRUE" будет нарушено, если герой нападет на Скракана.А последствия не заставят себя ждать. :)
Проверка, поднял ли кто-нибудь мешок, лежащий в точке с координатами X и Y. Параметры:
Обратите внимание на странную особенность: условие "Get sack = FALSE" сработает в том случае, если кто-нибудь поднимет мешок!
Расстояние от точки с кординатами X и Y до юнита, который несет конкретный предмет. Параметры:
Проверка, имеется ли у конкретного юнита необходимый предмет. Параметры:
Это условие принимает значение TRUE (если необходимый предмета у юнита есть) или FALSE (если предмета нет).
Самый сложный для понимания чек, но и самый необходимый. Если перевести название, получится "Вернуть значение переменной". Это не совсем так; правильнее было бы сказать "Значение, на которое возросла переменная". Параметры:
Данный чек работает в тесном сотрудничестве с событием Increment variable. Вместе они используются для того, чтобы проверить: был ли уже персонаж в определенном месте, сделал ли что-то до этого, и т.д.?
Объяснить их взаимодействие проще всего на примере - см. в описании события Increment variable.
Прежде чем выбрать необходимые события, их нужно создать. Делается это в Instance Manager (кнопка Manage Instances). Там представлено 49 базовых типов событий (Instance types), которым можно присваивать свои названия и ряд параметров.
В данной документации будут описаны все типы событий, их параметры, примеры применения, а также возникающие проблемы и замеченные баги. Информация будет появляться постепенно (следите за версией!), в зависимости от прогресса "анализа" сингл-миссий.
Вызвать определенный диалог, либо прочитать текст на дорожном указателе. Единственный параметр: Message number (номер диалога). Номер диалога прописывается в текстовом файле, который относится непосредственно к этой миссии (данному вопросу уделено отдельное внимание в Приложении 2); например, строка #event2 соответствует диалогу номер 2.
Если в качестве номера диалога поставить 250, в верхней части экрана вылетит сообщение "Вы получили дополнительную миссию!"
Чтобы присвоить надпись дорожному указателю, выберите конкретный указатель (Usable Pointer) в диалоге выбора здания, и нажмите кнопку "Special". Затем выделите событие Send message, которое ему соответствует.
Без параметров. Появляется табличка "Миссия выполнена".
Появляется табличка "Миссия провалена". Параметры: Cause number (номер причины проигрыша). Номер причины прописывается в текстовом файле, который относится непосредственно к этой миссии (данному вопросу уделено отдельное внимание в Приложении 2); например, строка #failure5 соответствует причине номер 5.
Самое сложное для понимания событие, но и самое необходимое. Приращение переменной - переменная увеличивается на 1. Параметры:
Данное событие работает в тесном сотрудничестве с чеком Return value of variable. Вместе они используются для того, чтобы проверить: был ли уже персонаж в определенном месте, сделал ли что-то до этого, и т.д.?
Объяснить их взаимодействие проще всего на примере. Возьмем "Аллоды 2", 1-ю миссию - там есть мирный людоед.
Checks | if | Hero to ogre distance <= 4 | Если герой подошел к людоеду на 4 клетки и ближе... |
and | v70 = FALSE | ...и приращения переменной номер 70 ещё не было (т.е. герой до этого не подходил к людоеду). | |
Instance | Send message 4 - ogre first | Людоед говорит "Оставь меня в покое!"... | |
v70++ | ...а переменная номер 70 увеличилась на 1. |
Checks | if | Hero to ogre distance > 4 | Если герой отошел от людоеда на 4 клетки... |
and | v70 = 1 | ...и переменная номер70 уже увеличилась на 1 (она увеличилась в первом триггере, когда герой подошел к людоеду). | |
Instance | v70++ | Переменная номер 70 увеличивается еще на 1 (т.е. теперь уже на 2). |
Checks | if | Hero to ogre distance <= 4 | Если герой подошел к людоеду на 4 клетки и ближе... |
and | v70 = 2 | ...и переменная номер70 уже увеличилась на 2 (она увеличилась на 2 во втором триггере, когда герой отошел от людоеда). | |
Instance | Send message 5 - ogre attacks | Людоед в ярости кричит "Где моя дубина?!" | |
Make ogre angry | С помощью события Change diplomacy людоед становится врагом по отношению к герою. | ||
v70++ | Переменная номер 70 увеличивается еще на 1 (т.е. теперь уже на 3). Следовательно, тригерры 1,2,3 больше никогда не сработают... |
Изменяет дипломатию одного игрока по отношению к другому. Параметры:
Кстати, если вы ввели событие, в котором враг становится нейтральным к вам, сделайте и себя нейтральным по отношению к нему!
Группа юнитов двигается в точку с координатами X и Y, уничтожая всех врагов на своём пути (т.е. "идет в боевой готовности"). Параметры:
Группа, которая получит такую команду, будет стоять на месте, и не сдвинется с места ни при каких обстоятельствах. Впрочем, атаковать слишком близко подошедших врагов (т.е. на расстояние выстрела или удара) они всё равно будут. Параметры:
Данная команда всегда отдаётся овцам на старте миссии. Это делается для того, чтобы при нападении на одну бедную овечку, ей на помощь не сбежалось всё стадо (т.к. весь скот на карте, как правило, объединен в одну группу).
Группа юнитов двигается в точку с координатами X и Y. Параметры:
Группа юнитов двигается в точку с координатами X и Y, уничтожая всех врагов на своём пути (т.е. "идет в боевой готовности"). Параметры:
Группа юнитов защищает другого юнита, т.е. если на него нападут, эта группа кинется убивать подлого негодяя. Параметры:
Группа юнитов начинает патрулировать - т.е. перемещаться туда-сюда между какой-то отдаленной точкой (с координатами X и Y) и местом, в котором эта группа находилась непосредственно перед отдачей команды. Параметры:
Место на карте, с которого будет начинать игру герой. Параметры: X и Y (соответствующие координаты). Несмотря на общую простоту, имеет ряд особенностей. Во-первых, для "Drop Location" не нужно вводить отдельный триггер (и, следовательно, чек) - достаточно всего лишь создать это событие в Instance Manager'е. Во-вторых, это единственное событие, использование которого обязательно в сетевых картах.
"Drop Location" может быть несколько - при заходе на карту место старта выберется случайным образом (в сетевой игре полезно против нуления на старте), - а может и не быть вовсе, но тогда игрока выкинет где попало (под монстра, над водой и т.п.), поэтому рекомендуется его все-таки ставить.
Добавить какой-либо предмет в инвентарь юнита. Параметры:
С помощью этого события в инвентарь юнита можно добавить только те предметы, которые нельзя надеть, т.е. книги, свитки, пузырьки и квестовые вещи. Номера этих предметов (всего - 96 штук) см. Приложение 1.
Обратите внимание, предмет можно дать любому юниту (даже монстру). Этот предмет, конечно же, не будет виден в инвентаре, но выпадет с трупа.
Для того, чтобы добавить в инвентарь остальные вещи (доспехи, оружие и т.п.), необходимо использовать событие Give All.
Удаляет определенный предмет (если он есть) из инвентаря юнита. Параметры:
Удаляет определенный предмет из инвентаря одного юнита и добавляет его в инвентарь другого. Параметры:
Не забывайте, событие сработает только в том случае, если у первого юнита имеется искомый предмет!
Исчезнувший (с помощью события Phase out unit) юнит появляется на карте. Параметр: Unit (ID юнита).
Юнит исчезает с карты (т.е. он становится не просто невидимым, но и неосязаемым). Параметр: Unit (ID юнита).
На месте одного юнита появляется другой (т.е. первый как бы "превращается" во второго). Параметры:
Чтобы превращение выглядело более естественным, вторую "форму" юнита (Unit's polymorphed) необходимо заранее убрать с карты с помощью события Phase out unit. Кстати "вторая форма" может принадлежать совершенно иной группе (и даже игроку), нежели "оригинал", - т.о. можно, например, из доброго крестьянина сделать злобного орка! :)
Игрок получает деньги. Параметры:
Все вещи передаются от одного юнита к другому. Параметры:
Не забывайте, добавить Giving Unit'у какие-то конкретные вещи можно в редакторе карт (в режиме Place Items) либо с помощью события Add item to unit's inventory.
Группа юнитов исчезает с карты (т.е. они становятся не просто невидимыми, но и неосязаемыми). Параметр: Group (номер группы).
Исчезнувшая группа юнитов появляется на карте. Параметр: Group (номер группы).
Задает определенному юниту новое значение какого-либо параметра. Параметры события:
Как правило, это событие используется для того, чтобы повергнуть определенного юнита (в самом начале миссии) в бессознательное состояние - т.е. Parameter = 6, New value = 0.
Сложное событие. Чтобы понять его полностью, необходимо копаться в исходниках. Приведу лишь пример его использования:
В миссии 20 разбойник расказывает герою о сокровище, т.е. персонаж получает дополнительную миссию. Для этого используется событие Set Scenario Variable (озаглавленное "Get mission 21") с параметрами:
А уже потом появляется надпись "Вы получили дополнительную миссию!" (см. Send message).
В списке заданий появляется новая подцель. Параметры:
Номер подцели прописывается в текстовом файле, который относится непосредственно к этой миссии (данному вопросу уделено отдельное внимание в Приложении 2); например, строка #subobjective2 соответствует подцели номер 2. Для удобства событие "Set Subobjective" со значением "1" (появилась подцель) называется Sub2+ или Sub2 - st, со значением "2" (подцель выполнена) - Sub2 - ok или Sub2!, а со значением "4" (подцель провалена) - Sub2-.
Номер | Книга | Англ. название |
---|---|---|
-23 | Воздух | Book Air |
-22 | Вода | Book Water |
-21 | Огонь | Book Fire |
-20 | Земля | Book Earth |
-19 | Астрал | Book Astral |
Заклинание |
Номер свитка | |
---|---|---|
Обычного | Эльфийского | |
Огненная стрела | -18 |
11 |
Огненный шар | -17 |
12 |
Огненная стена | -16 |
13 |
Защита от магии огня | -15 |
14 |
Ледяная стрела | -14 |
15 |
Ядовитый туман | -13 |
16 |
Град | -12 |
17 |
Защита от магии воды | -11 |
18 |
Кислотная атака | -10 |
19 |
Молния | -9 |
20 |
Радужная молния | -8 |
21 |
Невидимость | -7 |
22 |
Защита от магии воздуха | -6 |
23 |
Тьма | -5 |
24 |
Свечение | -4 |
25 |
Каменная стрела | -3 |
26 |
Каменная стена | -2 |
27 |
Каменное проклятие | -1 |
28 |
Защита от магии земли | 0 |
29 |
Благословение | 1 |
30 |
Ускорение | 2 |
31 |
Перерождение | 3 |
32 |
Телепорт | 4 |
33 |
Исцеление | 5 |
34 |
Зов | 6 |
35 |
Вампиризм | 7 |
36 |
Магический щит | 8 |
37 |
Проклятие | 9 |
38 |
Замедление | 10 |
39 |
Номер | Зелье | Англ. название |
---|---|---|
40 | Зелье Неуязвимости | Potion Antipoison |
41 | Зелье Силы | Potion Body |
42 | Зелье Ловкости | Potion Reaction |
43 | Зелье Разума | Potion Mind |
44 | Зелье Духа | Potion Spirit |
45 | Лечебная Мазь | Potion Health Regeneration |
46 | Целебное Снадобье | Potion Medium Healing |
47 | Сильнодействующее Целебное Снадобье | Potion Big Healing |
48 | Магическая Мазь | Potion Mana Regeneration |
49 | Запас Маны | Potion Medium Mana |
50 | Большой Запас Маны | Potion Big Mana |
51 | Снадобье для Воина | Potion Fighter Bonus |
52 | Снадобье для Мага | Potion Mage Bonus |
Номер | Предмет | Англ. название |
---|---|---|
53 | Официальные Документы | Quest Documents |
54 | Знамя | Quest Banner |
55 | Часть короны | Quest Crown1 |
56 | Две части короны | Quest Crown12 |
57 | Две части короны | Quest Crown13 |
58 | Ингредиент | Quest Ingredient |
59 | Сокровище !!! | Quest Treasure |
60 | Загадочный Амулет | Quest Amulet |
61 | Записки Звездочета | Quest Map |
62 | Трофей | Quest Head |
63 | Кристалл | Quest Stone |
64 | Пустая Колба | Quest Meta1 |
65 | Наполненная Колба | Quest Meta2 |
66 | Элексир Превращения | Quest Meta3 |
67 | Элексир Драконьего Превращения | Quest Meta4 |
68 | Руна Воздуха | Quest RuneA |
69 | Руна Земли | Quest RuneE |
70 | Руна Огня | Quest RuneF |
71 | Руна Воды | Quest RuneW |
72 | Кольцо | Quest Ring |
Речь идет о файлах "missionXX.txt", которые находятся в "main.res\text\". "ХХ" в данном случае - номер конкретной миссии, которой соответствует этот текстовый файл.
Итак, в файле "missionXX.txt" описываются:
Слова, начинающиеся с символа "#" (например, #briefing, #failure2, #subobjective1, #event5), будем условно называть открывающими тэгами (т.к. некоторое сходство с HTML-тэгами всё-таки имеется), а отдельно стоящий символ "#" - закрывающим тэгом. Всё, что находится между ними (основной текст), как раз и представляет интерес для нас (подробнее - см. ниже). Кстати, закрывающий тэг можно не ставить, если сразу после основного текста (т.е. со следующей строки) начинается новый открывающий тэг.
Текст, начинающийся после символа "=" является комментарием. Комментарии, естественно, никак не влияют на игру, и создаются только для удобства разработчиков. Для еще большего удобства (точнее, для большей заметности) несколько знаков "=" ставятся и до, и после текста комментария (например, ===Герой погиб===).
Все тэги, комментарии, а также основной текст должны начинаться с новой строки!
Начинается с тэга #briefing . Всё, что написано между ним и закрывающим тэгом, будет выводиться в окошке "Задание на миссию".
Открывающий тэг имеет вид #subobjectiveX, где X - номер соответствующей подцели (начиная с #subobjective1). Текст, находящийся между открывающим и закрывающим тэгами, будет выводиться в окошке "Задание на миссию" при получении дополнительных подцелей в ходе выполнения миссии (см. событие Set Subobjective).
Открывающий тэг имеет вид #failureX, где X - номер соответствующей причины проигрыша. Текст, находящийся между открывающим и закрывающим тэгами, будет выводиться в окошке "Миссия провалена", в зависимости от того, какую ошибку допустил игрок (см. событие Force "Mission Fail" state).
По умолчанию, тэг #failure2 соответствует смерти главного героя, #failure3 - Иглеза, #failure4 - Дайны (т.е их смерть не нужно дополнительно прописывать в триггерах миссии).
Структура всех диалогов такова. Сначала идёт открывающий тэг #eventX (где X - номер соответствующего диалога), затем - специальная строка, выделенная угловыми скобками, затем - текст первого сообщения (под "сообщением" понимается часть диалога, помещающаяся в одном окошке), затем опять специальная строка, затем - текст второго сообщения и т.д. А уже потом - закрывающий тэг.
Рассмотреть эту самую строчку в угловых скобках проще всего на примере:
<npc=21, iammale, iamfighter, part=1>
"21" в приведённом примере - это номер персонажа, который "говорит" в данный момент. Обратите внимание: это не ID юнита на карте!!! Это всего лишь номер картинки соответствующего NPC (но он обязан присутствовать на карте)! Например, на карте может находиться несколько безоружных мужчин-крестьян (одинаковых); для всех них используется один и тот же номер - 2108, т.к. в окошке диалога показывается не сам персонаж, а его картинка.
Итак, 21 - номер главного героя, 22 - Иглеза, 23 - Дайны. Номера монстров (кроме 5-го уровня) и некоторых NPC можно посмотреть здесь, остальные номера на данный момент уточняются.
"iammale" ("iamfemale") означает, что сообщение будет выводиться только в том случае, если главный герой - мужчина (женщина).
"iamfighter" ("iammage") означает, что сообщение будет выводиться только в том случае, если главный герой - воин (маг).
Использование iammale (iamfemale) и iamfighter (iammage) необязательно.
"part=1" - порядковый номер сообщения в данном диалоге.
Как вызвать определенный диалог в ходе миссии - см. событие Send message.
Структура такая же как у диалогов. Всё тот же тэг #eventX, всё та же строчка в угловых скобках (но в ней присутствует только "part="). Пример:
=======Указатель к башне=======
#event19
<part=1>
Башня Великого Скракана
#
Как присвоить определенному указателю конкретную надпись - см. событие Send message.