Перейти на:  

Обучение

Основы (общий формат)

Все триггеры, ресиверы и инструкции имеют общий формат: Заголовок [:Тело] ;
Опциональные элементы - в квадратных скобках. В частности, триггеры не имеют тела.
Заголовок содержит информацию о цели команды: Триггер (T), Ресивер (Р) или Инструкция (И), также он содержит дополнительную информацию об исполняемом объекте.
Тело содержит исполняемые ERM-команды, соответствующие типу объекта (Р или И).
Все ресиверы и инструкции должны иметь, как минимум, один параметр для корректной работы.

Заголовок имеет следующий формат: !{?|!|#}AB [ Идентификатор ] [ Условия ]
Выберите один из разделённых "|" элементов из скобок ( '?','!','#'- означают Триггер, Ресивер, Инструкцию соответственно ).
'AB' определяет тип Т, Р или И (см. дальше).
Идентификатор - номер определённого объекта.
Условия - условия "выполнения" дальнейшей части (тела) для Р и И или всех ресиверов триггера.
Если условий нет, Т, Р, И выполняются без проверок.

Идентификаторы имеют следующий формат: N[/N[/N[…]]]
Символы 'N' означают целые числа, значение которых зависит от типа Т, Р, И (см. дальше).

Условия имеют следующий формат: &N[/N[/N[…]]]
Символ '&' отделяет числа условия от идентификатора.
Выполнение может зависеть от флагов (F) (общее их число - 1000). Если вы желаете сделать Т, Р или И зависимой от флага, вы должны вставить его номер (1..1000) вместо N.
Если номер флага положителен, тогда условие - "флаг активирован (Истина)", если отрицательный - "флаг деактивирован (Ложь)".
Сравнение переменных так же может использоваться как условие выполнения.

Тело имеет формат, зависящий от типа T, Р, И (см. дальше).

Если параметр команды показан как $ - значение можно сохранить в переменную.
Если показан как # - её можно только установить, но не прочитать.
Если он показан как ?$ - его можно лишь прочитать, но не установить.

Пример: Это ресивер типа LE (событие на карте) с координатами X=10, Y=33, Уровень=Подземелье. Тело имеет 3 команды: E, O и L (см: ресивер LE). Эти команды (в теле) выполнятся, только лишь если в момент выполнения 1ый и 5ый флаги будут Истина, а 2й - Ложь. Иначе, ничего не выполнится.

Триггеры, ресиверы и инструкции

Когда игрок активирует триггер, он вызывает один или множество ресиверов. Триггером может быть событие, объект или герой-посетитель, или это может быть ERM-функция, вызываемая другим ERM-кодом, или даже таймер, установленный на срабатывание в определённый интервал времени (например, каждые 14 дней). Параметры триггера или объекта не влияют на предназначение триггера. Действие триггера должно быть описано во временно́м событии. Инструкции используют практически тот же формат, что и ресиверы, за исключением того, что отличаются в начале кода. В отличие от ресиверов, Инструкции выполняются лишь единожды, при загрузке карты.

Для детальной информации о триггерах, см.Триггеры.
Для детальной информации о ресиверах, см. Ресиверы.

Разное
Вы не можете использовать ; или ^ внутри текстовых сообщений (текст, заключённый между ^^, выводится на экран).
Так, ^Это сообщение, понятно?^ правильно.
А ^Это сообщение; понятно?^ некорректно.

Как создать свой первый скрипт
ERM для чайников, Qurqirish Dragon

Первое, что вы должны знать в любом случае - скрипт должен помещаться в карте во временны́х событиях. Для этого зайдите в редактор карт, заходите в "Спецификации карты" и нажмите на табличку "События".

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

Также рекомендуется использовать наибольший день появления (672). В этом случае будет удобней заходить в событие, находящееся в конце списка, да и редко карта длится дольше года.

Наконец, вы должны дать имя событию и описанию скрипта.
Теперь вставьте скрипт в сообщение события. Вы можете делать скрипт прямо здесь или в скрипт-редакторе и затем вставлять его в окно события.
Если вы будете использовать скрипт-редактор, это поможет вам избежать ошибок кода:

  1. Если вы сделаете какие-либо изменения в скрипте, снова сохраните его;
  2. Выберите целый скрипт - Ctrl+A - и скопируйте его - Ctrl+C;
  3. Идите в редактор карт, и вставляйте скрипт - Ctrl+V.

Если вы используете любой другой редактор (типа блокнота), чтобы написать скрипт, затем откройте скрипт-редактор, скопируйте туда скрипт и сохраните. Многие редакторы - особенно WordPad помещают невидимые символы и визуальные коды в файл, и это может привести к ошибкам ERM.

* * *

Теперь, собственно, о скриптинге. Я приму за факт, что вы используете последнюю версию ERM-редактора, и включили подсветку команд (кнопка 'H' у основания окна редактора). Кроме того, я не буду предполагать, знаете ли вы ЧТО-НИБУДЬ, из того, что я напишу здесь.

Первое - каждый раз, когда вы работаете над скриптом, я предлагаю писать на листе бумаги - именно на листе, не в текстовом редакторе, - требования к скрипту, т.е. его действия. Сделайте "мозговую атаку", чтобы понять, что именно вы хотите от скрипта.

Например, я написал скрипт Карт Пророчества (Папка_героев/data/s/script34.erm) для игры с параметрами героя при начале сражения. К счастью, у меня были мои примечания относительно скрипта, и могу разделить их здесь. Заметьте, что когда я начинал скрипт, я прежде ВООБЩЕ не видел ERM-скриптинга.

Сначала я записал это:
Артефакт, который в начале каждой битвы даёт от -1 до +4 очка случайного первичного навыка.
Это было целой идеей. Выглядит просто, правда? Я думал также. Затем я описал основные шаги:
Начало битвы - проверка на артефакт. Имеется?
нет - выход
да - установить флаг, выбрать случайный номер параметра (1, 2, 3, 4)

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

Теперь время писать код!
Первая строка скрипта:
ZVSE
Это говорит WoG'у, что это не простое событие, а скрипт. Без этой строки вся ваша работа будет игнорироваться игрой.
Все команды состоят из четырёх символов, и одного из трех основных типов, не включая ZVSE. В редакторе скриптов команды подсвечиваются разными цветами.

Триггеры - команды, которые означают "Если что-то происходит в игре, я начинаю работу". Все триггеры начинаются со знаков !?
Например, возьмите эту линию кода из моего скрипта Карт (помните, скрипт 34):
!?BA0&v1321=1; [начало битвы]
Это первый триггер в моем скрипте. Не беспокойтесь о действии команды, я объясню действие попозже. Но заметьте точку с запятой в конце строки (;). Все ERM-команды оканчиваются точкой с запятой (!). После этого знака дальнейший текст считается комментарием, здесь он будет окрашиваться зелёным.

Ресиверы - команды, которые устанавливают, проверяют или изменяют что-либо в игре. Они не сработают, если перед ними нет триггера. Все ресиверы начинаются с !!
Пример:
!!BA:E?v1331; [проверить на мультиплеерную игру]
Опять заметьте точку с запятой в конце команды. В комментарии вы можете объяснить значение команды, но об этом позже.

Наконец, инструкции - как и ресиверы, за исключением того, что они работают только один раз - при начале карты. Они начинаются на !#
Пример:
!#UN:P34/?v1321; [скрипт включен?]
Для тех, кто смотрит на мой скрипт: отметьте, что есть и просто "зелёные" строки - комментарии. Для этого я использовал **. Это необходимо, и другие авторы ERM-скриптов используют в большинстве такой же метод. Пока вы не начинаете строку с команды, ERМ игнорирует её.

Для закругления введения, я объясню вам пару простых команд, с помощью каких вы сможете сделать что-нибудь. Второй урок даст немного больше - но не бойтесь экспериментировать.

Этот скрипт просто рассчитает, как часто герои посещали левый верхний угол верхнего уровня карты (координаты 0, 0, 0). Всякий раз, когда я ввожу команды, я всегда включаю ERM-помощь.

Первая линия, конечно:
ZVSE
Далее, мы должны установить счётчик на 0. Так как мы хотим начать счёт с 0, нам нужна инструкция. Инструкция должна быть назначена на переменную (!#VR)
Прежде чем двигаться дальше, мы должны выбрать переменную для записи счёта. Обычно вы должны сверяться со списком использованных переменных, находящихся там же, где и скрипты, и выбрать неиспользованную переменную. Но в целях обучения я буду всегда пользоваться v-переменными с малыми номерами.
V-переменные - это те, которые вы будете использовать чаще всего. Я введу другие типы по необходимости.
Так, теперь используем команду: Давайте разберём, что есть что:
!#VR Выполнить команду в начале карты, команда работает с переменными
v1 Операция проходит над переменной v1
: Любая команда, которая что-либо делает, используется двоеточие для отделения команды от опции. Триггеры не имеют этого знака, но остальные - имеют.
S0 Выбрать опцию S для команды VR. Это сообщает, что вы хотите установить значение переменной. В данном случае мы устанавливает его на 0.
; Как я упоминал выше, точка с запятой оканчивает команду.

Теперь мы должны установить триггер. На карте поместите событие в координатах [0,0,0]. Это нужно, чтобы позволить всем игрокам активировать событие, и позволить событию повторяться несколько раз.

Теперь установим триггер: Триггер LE - "Когда событие в данных координатах активируется…" Эти три числа - координаты соответственно x, y и уровня. Если вы откроете помощь для триггера !?LE, вы заметите, что также есть триггер !$LE (знак $ вместо ?). Это - "После того, как событие в координатах посещено…". Если событие на карте делает что-либо без ERM, вы можете запустить его до или после кода (соответственно !$ и !?). В нашем случае это не имеет значения, т.к. событие пустое.

Далее, теперь мы должны добавить единицу к значению. Для этого используем другую опцию команды VR, но теперь мы используем ресивер (!! вместо !#): ERM использует "+" для указания действия прибавления. Таким образом, эта команда обозначает "добавить 1 к переменной v1".
Другие математические операции:

Заметьте, что кроме e-переменных все числа целые, т.е. 7, разделённое на 4, будет равняться 1, а не 1,75.

Наконец, мы должны показать сообщение игроку, в котором будет указано, какой раз посещается это место: IF - команда для диалогов с игроком. Они могут быть простыми, как обычное сообщение, или задавать вопросы, показывать картинки и даже давать выбор.
Опция M - "Показ сообщения". Есть только несколько ограничений того, что может быть в сообщении. Вы не можете использовать "^" или ";". Вы также должны быть осторожны с процентом. Если вы хотите показать знак %, вы должны напечатать %%.
Вы, вероятно, заметили, что в сообщении есть %. Если вы используете один %, то дальше должны написать, что (какую переменную) хотите показать. В данном случае %V1 (заметьте, что здесь вместо строчных букв используются Заглавные): вместо этих символов будет показано значение переменной v1. Если вы посмотрите на ресивер IF, вы увидите список команд для %.

Это весь скрипт.
Так, объединяя всё вместе, мы получаем следующее:

Как создать свой первый скрипт #2
ERM для чайников, Qurqirish Dragon

Я собираюсь взять скрипт, сделанный ранее, и расширить его действие - каждый герой, посещающий северо-западный угол карты в десятый раз, станет сказочно сильным, слабым или обычным (циклически). Другими словами, после того, как 10 героев посетят событие, все герои удвоят свою силу магии во время битвы. После 20го сила магии в бою будет установлена на 1, и после 30го станет обычной. Затем цикл повторится.

Сначала мы собираемся вставить строку, между командами !!VR и !!IF. Эта строка проверит на то, какой по счёту вы посетитель. Так как это значение необходимо, чтобы сохранять счёт, я использую временную переменную. Временные переменные в ERM - это y-переменные. Они не сохраняются между скриптами, так что вы не можете использовать эту переменную для длительного хранения. Но зато вы можете не беспокоиться о том, что испортите другие скрипты, используя эти переменные.
Так, давайте добавим строку:

Эта команда использует два оператора в одной команд. Все действия в ERM идут слева направо. Помните, что если у вас несколько операций для выполнения - лучше разбить их на несколько строк. В этом случае мы сначала устанавливаем переменную y1 в значение переменной v1, и затем находим остаток при делении на 10. Если y1 = 0, значит v1 - число, кратное 10.

Теперь, если это число не кратно 10, мы должны только показать сообщение, уже указанное прежде. Нужно сделать небольшое изменение:

Кроме изменения в комментарии, я добавил перед двоеточием условие & (амперсанд) и y1<>0. Амперсанд - "позволю команде работать, если мое условие выполнено".

Дальнейшее выражение y1<>0 говорит об условии (здесь нужно, чтобы y1 был больше или меньше 0). Таким образом это сообщение будет показано только если y1 больше или меньше 0.

Теперь, если v1 - число, кратное десяти, мы хотим сообщить, что волшебство изменяет мир. Но для этого мы должны узнать, какое изменение делается. Мы будем использовать другую y-переменную для проверки на это:

Эта команда возьмет v1 и разделит его на 10, затем возьмет остаток при делении на 3. Это даст значение переменной y2: если v1 будет меньше 10 или между 30 и 39, 60 и 69 и т.д., то значение y2 будет равно 0. y2 будет равно 1, если v1 будет между 10 и 19, 40 и 49 и т.д., и тот же принцип при y2 = 2. Заметьте, что даже если v1 - число, не кратное 10, оно всё равно посчитается.

Теперь нам нужно ещё три команды !!IF - одна для каждого типа изменения. Но я могу ввести ещё несколько понятий, при этом пойдя по чуть более длинному пути.
Нам нужно сообщение, в котором говорится "Вы [число] посетитель, вы чувствуете, что сила магии в мире увеличилась!"
Также нужно сообщение, содержащее "Вы [число] посетитель, вы чувствуете, что сила магии в мире ослабевает."
И последнее, что нам нужно: "Вы [число] посетитель, вы чувствуете, что магия в мире стабилизируется."
Заметьте, что эти три предложения говорят почти одно и то же самое, но с небольшими изменениями. Нам точно не нужны лишние символы. Это особо важно, если позже мы захотим добавить больше возможностей.

Для этого мы собираемся использовать z-переменную.
Z-переменные - единственные переменные, способные хранить текстовые данные. Точно так же, как и v-переменные, z-переменные постоянно сохраняются.
Но есть несколько z-переменных, являющиеся временными, как y-переменные. Быстрый взгляд на "Флаги и переменные" в ERM-помощи, и вам известно, что временные z-переменные обозначаются немного по-другому: от z-1 до z-10. Давайте используем переменную z-1, чтобы записать кусок текста, который изменяется.
Это будет три строки:

Здесь вы полностью должны понять эти строчки. Вместе они устанавливают переменную z-1 в тот текст, который нужен в данном случае.
Отметьте, что правила помещения текста в z-переменную аналогичны правилам для текста в команде !!IF:M, вы можете использовать команду % для показа значения других переменных, и вы должны напечатать %% для знака процентов. Символы "^" и ";" не позволительны!.

Теперь мы должны показать новое

В этот раз условие состоит в том, что y1 равняется 0. Мы только хотим, чтобы это сообщение появилось и изменялось.
Теперь у нас готовы все сообщения. Затем нужен код, чтобы изменить параметры героя в битве.
Я хочу добавить, что строка ниже - комментарий, т.е. в редакторе скриптов будет изображаться "зелёным": Нам нужна проверка на начало битвы. Это означает, что нам нужен новый триггер: Так как мы использовали новый триггер, предыдущий код прекратит работу при достижении этого места. Триггер !?BA активируется при битвах. !?BA0 (здесь '0' это "ноль", а не 'о') - триггер на начало сражения. Нам понадобится так же триггер на конец битвы.

Знайте, что многие скрипты часто имеют проблемы в игре человек против человека и мультиплеерных битв. Хотя данный скрипт не должен иметь проблем, я всё равно собираюсь проверить на этот случай и не позволить коду работать в этом случае.
Есть специальная команда для этой проверки: Это ресивер BA. Опция E - "я узнаю, какое это сражение". В ?y1 запишется результат проверки.
Отметьте, что я многократно использую y1 с самого начала - это и есть преимущество временных переменных: вы можете не волноваться о старом значении, если вы хотите использовать переменную.

Если вы просмотрите ERM-помощь по ресиверу BA, то узнаете, что y1 может принимать значения:

Теперь нам нужно, чтобы код работал в последнем случае. Пока вы не знаете, какие типы скриптов сражений работают в случаях 1 и 2, самое безопасное - сделать это.
Теперь мы имеем следующую строку:

Это - новый ресивер. Ресивер FU вызывает другие строки кода, в этом случае - кода под функцией 1. Опять же, условие для этого - y1 = 0. Иначе функция не начнётся.
Опция P означает, что следующие параметры нужно передать в функцию. Хотя в этом случае они не необходимы, я передал переменную v1. Это позволит мне управлять переменной v1 внутри функции, не изменяя сохранённое значение.
Мы не должны делать что-либо ещё в начале сражения, таким образом мы можем перейти прямо к функции.

Мы начинаем триггер функции (!?FU), указывая новую секцию кода вместе с комментариями:

Так как мы хотим изменить силу магии каждого героя в сражении, мы должны знать, какие герои борются, если они вообще имеются. Это делается двумя ресиверами для сражений:

Опция H узнает номер героя. H0 записывает номер нападающего, H1 - защищающегося. Если героя-защитника нет, то BA:H1 устанавливается на -2.

Все номера героев перечислены в ERM-помощи, но так как мы применяем это действие ко всем героям, мы не заботимся об определённом герое.
Я выбрал переменные v5 и v6 для записи номеров, потому что переменным v3 и v4 я оставил другое назначение.

Теперь мы должны узнать силу магии для изменения. Наша y-переменная выше, которая хранила силу магии для изменения, уже потеряла своё значение. Но у нас есть доступ к переменной v1. Давайте снова получим тип изменения:

Это выглядит знакомо, но несколько изменений всё же есть. Первое - использована переменная x1, а не v1.
Это потому, что значение переменной v1 теперь сохранилось в x1. x-переменные пронумерованы от x1 до x15, и содержат параметры, в которые их передавали ресивером FU.
Так как я передал v1, x1 получила своё значение.
Так же существует x16, и вы можете передать значение этой переменной, но она имеет особое назначение (дело с которым мы будем иметь чуть позже), т.е. вы должны пытаться избегать использования этой переменной. Также отметьте, что эти переменные могут содержать только целые числа, т.е. вы не можете передать z-переменную.
Кроме того, не волнуйтесь из-за двойного двоеточия. Первое двоеточие отделяет команду от опции, а второе - производит операцию деления. Теперь x1 содержит значение, которое мы записывали в первой части скрипта.

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

Ресивер HE используется для изменений аспектов любого героя. Первая строка просматривает героя номер v5, а вторая - v6.

Во второй строке мы добавили проверку v6>=0, чтобы, если нет героя-защитника, WoG не пробовал искать героя -2. Это бы вызвало ошибку при запуске скрипта.
Опция F смотрит параметры героя. Следующие четыре числа разделены слэшами "/" - атака, защита, сила магии, знания, в именно таком порядке.
Если вы поместите число или переменную туда, это изменит параметр на значение числа или переменной. Если вы помещаете знак ? перед именем переменной, тогда берётся текущее значение навыка и хранится в этой переменной. В этом случае переменные y3 и y4 будут содержать силу магии героев.
Переменные y5, y6, и y7 - просто удерживают значение, и я могу использовать их повторно.

Здесь я хочу отметить, что хорошая идея - записывать на отдельной бумаге то, что хранит каждая переменная. Это поможет, если вы вдруг это забыли.
Теперь мы должны настроить изменения силы магии. Так как мы должны знать, какие параметры восстанавливать после изменений (для восстановления старых параметров),мы будем записывать их в две v-переменных. Я буду использовать переменные v3 и v4, соответствуя y3 и y4. Это - причина того, почему я пропустил их ранее.

Новое, что вы заметили здесь в третьей и четвёртой строке - слэш в условиях - то же самое, что и логическое "и". Так, &x1=1/v6>=0 означает "если x1=1 и v6>=0, тогда команда работает".

Теперь мы должны только сделать изменения: Здесь мы изменяем параметры героев, но только если x1 не 0. Помните, что если x1 = 0, то наш счётчик определяет "нет никаких изменений".
Снова мы используем команду HE:F. Знак d перед любым числом или переменной говорит, что число или переменная должны быть добавлены к параметру.
d0 (d) оставляет параметр без изменений.

Мы теперь завершили до-битвенную функцию!
Теперь наш скрипт таков: Заметьте, как комментарии помогают пониманию происходящего.

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

Выглядит схоже, да? Хорошо, изменения находятся в триггере и номере функции. Триггер теперь BA1, это означает, что триггер сработает в конце битвы.
И, так как нам нужно вернуть изменения обратно, нам нужна отдельная функция. К счастью, мы сохранили номер героев и изменений в v-переменных, так что нам не нужно снова вычислять их.
Давайте начнём уборку:

Чтобы v3 и v4 изменились, мы умножили их на -1. Теперь, если мы добавим их, как мы сделали прежде, то это уничтожит наши изменения. Опять же имеется проверка на изменение и существование героя-защитника.
Мы должны были хранить числа героев, потому что если герой убежал с поля битвы, мы бы уже не смогли найти его параметры.
Наш скрипт готов!

Как создать свой первый скрипт #3
ERM для чайников, Qurqirish Dragon

До сих пор скрипт, который мы спроектировали, активизирует герой, когда посещает северо-западный угол карты. Зачем бы кто-то отправлял туда героя?

Конечно, вы могли бы всегда помещать событие на карту, уведомляя об этом игрока, но я не стану следовать этим путём. Вместо этого, я собираюсь создать нечто, что привлечёт игрока. Когда вы зайдёте в редактор карт, посмотрите на страницу городов…
Если вы не заглядывали сюда прежде, то увидите, что здесь много объектов после этих 10-ти (9 типов и случайный) городов.
Большинство этих объектов незаскриптованно, т.е. даже если вы поместите их на карту, они ничего не будут делать, даже при WoG'ификации на старте.
Мы используем один из них.

Для этого скрипта я собираюсь использовать 4ый объект из новых объектов WoG.
Поместите это на карту максимально близко к углу, не отрезая никакого изображения. Если вы этого обычно не делали, включите инструмент "проходимость" - Ctrl+P - разбивку карты на красные и жёлтые площади. Любой красный квадрат герой не может посетить или пройти сквозь него. Любой жёлтый квадрат - это квадрат выполнения триггера объекта.
Вот что мы видим в редакторе…
Как я вижу, жёлтый квадрат располагается в координатах [2,2,0].

Теперь давайте изменять скрипт, чтобы использовать этот объект вместо события, помещённого ранее. Если вы сделали эту часть обучения, вы можете удалить событие - я не буду снова использвать его.

Теперь мы собираемся заменить строку !?LE, чтобы подогнать наш скрипт к жёлтому квадрату. Помните, старая строка была: Теперь мы просто изменяем местоположение на координаты жёлтого квадрата [2,2,0] и меняем триггер LE на OB:
Заметьте, что фактически триггер OB похож на триггер LE. Если вы не имели никаких проблем с LE, значит у вас не будет проблем и с OB.

Только помните, что LE поддерживает только события, а OB поддерживает любые объекты, и вы будете знать, когда и какой нужен триггер.
Теперь скрипт будет работать так же, как и прежде, кроме точки запуска. Но я собираюсь сделать ещё одно изменение строки:

Я изменил эту строку из триггера посещения (!?) на пост-посещение (!$). Сейчас это не имеет никаких последствий для скрипта, но теперь скрипт сработает после того, что мы ещё добавим: мы сделаем дополнительную возможность, что когда вы посетите магический счётчик, за 100 золота вы сможете получить сразу пять посещений вместо одного.
Далее есть смысл заменить пентаграмму на Звёздную Ось.
Это только мой выбор, если хотите, заменяйте на какой-либо другой объект, имеющий свою функцию. Только убедитесь, что помещённый объект имеет лишь одну точку входа, и этот вход расположен в [2,2,0].

Если вы теперь запустите карту, то когда вы посещаете эту Звёздную ось (и только ЭТУ!), вы получите, как обычно, +1 к силе магии (или ничего, если ваш герой уже посетил ось ранее), и затем счётчик увеличится.

Теперь давайте поместим существо "Магический Сторож" где-либо возле Звёздной Оси. Я думаю, что из-за природы скрипта нам подойдет Сказочный дракон.

Так или иначе, давайте начинать скриптинг: Это простой триггер пред-посещения.

Теперь мы должны закодировать вопрос да или нет.
Первое, что мы должны понять - мы собираемся задать вопрос, на который нужно ответить. Это вызывает проблему, если ИИ посылает героя, чтобы посетить точку.
Так что мы должны посмотреть, является ли текущий игрок человеком или ИИ. Мы делаем эту операцию ресивером OW, который позволяет нам проверять или устанавливать почти все параметры игрока (но не героя).
Итак, пишем: Опция C? проверяет цвет текущего игрока. Вы не можете изменить текущего игрока, так что знак ? - это часть кода.
Я записываю этот цвет в y1. Следующей строкой я использую опцию I. Эта команда проверяет цвет на управляющего: человек это или игрок ИИ. Первое число - это цвет игрока для проверки, в нашем случае - y1. Второе число - значение: 1, если ИИ, или 0, если человек.
Вы можете установить этот параметр, чтобы добавить или удалить игрока-человека с карты! Но сейчас мы хотим лишь узнать это значение. Если это герой ИИ, то y2 получит значение 1, иначе - 0.

Теперь мы можем задать вопрос.
Так как мы должны показать вопрос, нам понадобится ресивер IF: Как вы видите, здесь я добавил условие y2=0. Если ИИ посетит ось, то вопрос не будет задаваться!
В любом случае, в этой команде много чисел, не так ли? Их восемь. Я собираюсь разобрать их ниже по частям.
Зайдите в описание команды !!IF и найдите опцию !!IF:Q#1/#2/#3/#4/#5/#6/#7/#8^текст^; для точной информации.

Сначала опция Q. Это стандартный вопрос. Дальше - число 1. Это флаг, в который занесётся ваш ответ. Флаги похожи на переменные, но могут принимать только два значения: 0 (ложь) и 1 (истина). В отличие от переменных, здесь нет указателя переменной. Например, v-переменная 1 пишется как "v1", z-переменная 1 как "z1", а флаг 1 просто 1. Я ещё вернусь к этому моменту позднее.

Следующие шесть чисел добавляют картинки к диалогу под написанным текстом. Каждая пара чисел обозначает одну картинку. Первое число - тип картинки, а второе число - подтип. Все возможные картинки для использования в диалогах можно найти на странице ресивера !!IF.
В этом случае мы описали первое изображение как 6/0. Тип 6 - это ресурс, золото. Подтип для ресурса - это его кол-во, которое будет показано.
Так как я установил подтип 0, то кол-во не будет отображаться - просто картинка.
Второе изображение - 21/134. Тип 21 - это монстр, подтип - номер монстра. В данном случае подтип 134 - это Сказочный дракон.
Третье изображение - это 33/0. Тип 33 это один из первичных навыков, в данном случае - колдовская сила. Опять же подтип ставим 0, то есть без какого-либо кол-ва.
Когда скрипт будет запущен, под текстом будут изображения золота, Сказочного Дракона и Колдовской силы.

Последнее число 2 говорит о том, что эта команда - вопрос да или нет. Когда скрипт запустится, внизу картинок будут привычные кнопки <Да> или <Нет>. Если вы выберете «Да», флаг флаг установится на "Истина" (1), если вы выбрали «Нет», флаг установится на "Ложь" (0).

Теперь мы должны проверить, имеет ли игрок 100 золота для оплаты. Используем ресивер !!OW. Вот код следующей строки: Опция R означает, что мы хотим сделать что-либо с ресурсами игрока. Первое число - цвет игрока, у которого мы будем менять ресурсы. Это значение не-побитно, т.е. 0 для красного, 1 для синего, и так далее. Также можете посмотреть цвета в разделе помощи, но все они пронумерованы от 0 до 7 в порядке том же, что и в игре.
Для этого скрипта я устанавливаю игрока -1. Это значит, что мы узнаем опции текущего игрока, кто бы это ни был.
Мы уже проверили цвет текущего игрока выше (он сохранен в y1, если вы забыли), но я хотел использовать именно -1, чтобы показать эту возможность.
Вы должны проверить синтаксис для каждой опции, чтобы узнать, может ли -1 использоваться для текущего игрока. Хотя это может обратиться к нейтральному игроку, т.е. никому.
Число 6 - номер ресурса, здесь - золото. Последнее число - переменная, в которую мы хотим записать кол-во.
В этом случае мы используем переменную y3, и перед ней ставим знак ? , что означает "Записать значение в эту переменную".

Затем мы проверяем, что ответил игрок, и может ли он позволить себе покупку. Мы покажем соответствующий ответ для каждого случая. Для этого используем 3 команды IF - первая, если нажата кнопка <Нет>, ещё одна для <Да> и если игрок может позволить себе покупку, и последняя, если "Да" и игрок не может позволить себе покупку:

Здесь условие "Это именно человеческий игрок" находится во всех трех командах. Второе условие проверяет флаг 1, который устанавливается в зависимости от ответа игрока
В первой строке номер флага отрицателен. Это означает, что мы делаем условие "Если флаг - Ложь, то проверка пройдена". В двух других строках флаг положителен, что означает "Если флаг - Истина, то проверка пройдена".
Ещё во второй и третьей строке есть проверка на кол-во золота "Значение больше или меньше?". Прежде чем вычесть 100 золота у игрока, мы должны решить, что сделает ИИ.
Позвольте ИИ тоже купить пять посещений - 50%-ый шанс, что он сделает это. Мы сделаем это двумя командами:

Здесь вы признаете первую строку, но с новой опцией, которую мы прежде не использовали - R. Опция R генерирует случайное значение между 0 и числом после R (в нашем случае 1), и добавляет его к старому значению. Данный ресивер VR устанавливает y4 на 0, и затем добавляет 0 или 1.
Это и является нашим генерируемым шансом.
Следующая строка - наш старый знакомый, ресивер IF. На этот раз условие состоит в том, что ходит игрок-ИИ. Опция V используется для установки значения флага. В данном случае, флаг 1 устанавливается на результат генерации.

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

Эти два условия должны быть ясны, но мы всё равно резюмируем: первое условие для флага, т.е. если он Истина, независимо от того, был ли это сгенерированный флаг или сам игрок выбрал его.
Второе условие - проверка, достаточно ли золота у игрока. Как и с колдовской силой, мы используем оператор d для вычитания 100 от текущего значения золота
(ну, фактически мы добавляем -100).

Мы должны сделать ещё несколько строк - сейчас, например, добавление счётчика при оплате. Так как мы не использовали v2, я сделаю это здесь:

Заметьте, что хотя золото игрока и изменилось, y3 всё ещё содержит значение золота до оплаты. Таким образом, та же самая проверка, которую мы делали в команде OW, будет работать и здесь.
Эта часть кода теперь сделана. Но мы ещё должны изменить часть кода, который мы уже написали, так как мы должны добавить эти четыре посещения и получить соответствующее сообщение.

Вспомните следующие строки из начала скрипта:

В этой части скрипта y1 - значение счётчика посещений. Для начала мы изменим первую строку:

Если оплата была произведена, то это добавит 5 к v1, иначе - только 1.
Далее добавим строку после вычисления y1:

Если дополнительные пять посещений перескочили через число, кратное десяти, то означает, что v2 была равна 4, таким образом y1 между 1 и 4.
Так, если y1 меньше или равен v2, это означает, что магический статус должен сработать - таким образом мы устанавливаем y1 на 0.
Оставшаяся часть кода может оставаться без изменений!

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

Как создать свой первый скрипт #4
ERM для чайников, Qurqirish Dragon

Я ввёл множество команд в последнем скрипте. Как вы можете видеть в справке, многие команды имеют куда больше опций, чем мы использовали. Я хочу более детально разобрать некоторые.
По скрипту, первая команда - VR.
Синтаксис начала строки
!!VR@:XXXX
Где бы вы не увидели в помощи @ - это

Создание магического поющего камня
Fnord the Wizard

В этом примере мы сделаем волшебный поющий камень, который может быть посещён героем. Камень даст герою маны в кол-ве [Знание×40] и заберёт все очки хода.

  1. Используя редактор, выберите камень покрасивее и поместите его куда-нибудь на карту. Для наглядности, поместим его в x=10, y=12, уровень=0 (поверхность).
  2. Создадим глобальное событие, куда вы введете ERM-код. Установим день появления на 500 и назовем его "Поющий камень". Начинаться событие будет так:
    ZVSE
  3. Используем инструкцию для возможности посещения камня:
    !#TR10/12/0:P1;
  4. Также, сделаем инструкцию, чтобы была возможность посещать камень (жёлтый квадрат):
    !#TR10/12/0:E0;
  5. Сделаем инструкцию на превращение камня в другой объект (важно!), скажем, колодца:
    !#OB10/12/0:T49;
  6. Инструкцией отключим стандартные свойства объекта (колодца):
    !#OB10/12/0:S;
  7. Изменим текст-подсказку нового объекта:
    !#VRz1:S^Поющий камень^; [присвоить текст переменной z1]
    !#OB10/12/0:H1; [установить текст-подсказку из z1]
  8. Используем триггер на посещение нашего объекта:
    !?OB10/12/0;
  9. Покажем сообщение:
    !!IF:M^Камень призывает вас отдохнуть своей приятной магической мелодией.^;
  10. Установим ману героя:
    !!HE-1:Fd0/d0/d0/?v1; [запишем знания в v1]
    !!VRv1:*40; [умножим v1 на 40]
    !!HE-1:Iv1; [установим кол-во маны на v1]
    !!IF:Q1/35/v1/1^^; [покажем картинку бонуса маны]
  11. Заберём очки хода:
    !!HE-1:W0;
  12. Готово! :-)

Если пропустить шаги 5 и 6, курсор всё ещё будет превращаться в лошадь на дыбах (как на обычный жёлтый квадрат), но когда вы зайдете героем  квадрат, ничего не произойдет, *пока* вы не нажмёте пробел для повторного посещения. Это допустимо для некой загадки, но для нового объекта, который должен работать как и все другие, вы должны включить шаги 5 и 6. Это действительно при любом превращении непосещаемого по умолчанию объекта в помещаемый.

Полный код:

Помещение жилищ 8го уровня
Anders

В этом примере мы поместим жилище 8го уровня в выбранном месте. Жилище будет привязано к выбранному городу.
Сначала, поместим на карте замок (желательно случайный), в x=2, y=4, z=0 (поверхность).
Затем, создайте глобальное событие, установите дату на 500 день, дайте имя "8ой уровень", ну или какое хотите, и напишите стандартную первую строку ZVSE.
Замечание: скрипт будет полностью состоять из инструкций, жилище появится на карте ещё во время загрузки оной.
Теперь, проверим, какой тип города получился (все города имеют одинаковый тип объекта, но разные подтипы: Замок = 0, Инферно = 4) и запишем значение в переменную v1:
!#OB2/4/0:U?v1;
Теперь добавим 80 к числу для получения корректного номера жилища:
!#VRv1:+80;
(Вы могли бы сделать список для записи числа в зависимости от типа города, вроде:
!#VRv1&v1=0:S80;
!#VRv1&v1=1:S81;

!#VRv1&v1=8:S88;
… но это длиннее и не влияет на итоговый результат)
Теперь, определим, где поставить жилище. Запишите точку в переменные, потому что разные жилища имеют разный размер - вы можете увидеть это в редакторе. В данном примере, запишите X=27 в v2, Y=3 в v3 и Уровень (0 = поверхность) в v4:
!#VRv2:S27;
!#VRv3:S3;
!#VRv4:S0;
Теперь вы должны упредить разницу в размере жилищ. Если это НЕ жилище Громовержцев (Башня) или Антихристов (Инферно), оно должно быть помещено на 1 клетку правее для точного попадания на точку:
!#VRv2&v1<>82/v1<>83:+1;
Теперь помещаем жилище:
!#UN:Iv2/v3/v4/17/v1;

Полный скрипт: Он, конечно, может быть повторен снова и снова, если вы хотите привязать больше жилищ к карте. Если вы привязываете более одного жилища к одному городу, вам нужно лишь копировать последние 5 строк и поместить их под остальным, и изменить координаты появления на нужные. Если вы желаете привязать жилище к другому городу, скопируйте всё, кроме ZVSE, и измените координаты города и жилища.

Показ мифрила при его подборе
Anders

Этот скрипт будет показывать диалоговое окно, когда игрок подберёт Мифрил на карте, показывая кол-во мифрила в кучке и его общее кол-во у игрока.
Поместите несколько мифриловых кучек на карту, и создайте глобальное событие, день срабатывания установите на 500, первая строка - ZVSE.
Теперь вам нужно включить кучки мифрила, иначе они будут собираться как золото. Сделаем это инструкцией:
!#UN:B0/1;
Затем, триггер для всех кучек мифрила, но не для других ресурсов:
!?OB79/7;
Затем, проверим, кто подобрал мифрил и запомним его имя в z1:
!!HE-1:B0/?z1;
Теперь проверим, сколько мифрила в кучке (триггер срабатывает прямо перед подбором и добавлением к общему кол-ву). Сохраним в y1:
!!ARv998/v999/v1000:V?y1;
Теперь, проверим, сколько мифрила имеет игрок до подбора кучки, и добавим кол-во в кучке к этому числу:
!!OW:R-1/7/?y2; [записать текущее кол-во мифрила игрока в y2]
!!VRy2:+y1; [добавить новый мифрил к имеющемуся в y2]
Теперь добавим корректные сообщения при подборе кучек. Если в ней 1 мифрил, пишем "брусок", если больше 1 но меньше 5 то пишем "бруска", если больше 4 пишем "брусков". А также подумаем об суммарном кол-ве: если 1, пишем "брусок", если 1<x<5 пишем "бруска", если 5<x<21 пишем "брусков", а дальше используем функцию нахождения остатка от деления чисел, и к соответственному значению настраиваем соответствующую форму слова.
!!VRy3:Sy2; присвоим кол-во имеющихся брусков переменной y3
!!VRy3&y3>20:%10; если она больше 20, найдём остаток от деления на 10 (получатся числа от 0 до 9)
Далее формы для "кучки":
!!VRz3&y1=1:S^брусок^;
!!VRz3&y1>1/y1<5:S^бруска^;
!!VRz3&y1>4:S^брусков^;

А теперь формы для общего кол-ва
!!VRz2|y2=1/y3=1:S^брусок^; используя условие ИЛИ ( | ), устанавливаем фору слова, если число имеющихся брусков равно 1 ИЛИ остаток от деления на 10 равен 1
!!VRz2&y2>1/y2<5:S^бруска^; используем два условия - брусков больше 1 И меньше 5
!!VRz2&y2>4/y2<21:S^брусков^; используем 2 условия - брусков больше 4 И меньше 21
!!VRz2&y2>20/y3>1/y3<5:S^бруска^; используем 3 условия - брусков больше 20, остаток от деления меньше 5, но больше 1
!!VRz2&y2>20/y3>4:S^брусков^; если брусков больше 20 и остаток от деления в пределах 4..9
!!VRz2&y2>20/y3=0:S^брусков^; если брусков больше 20 и остаток равен 0.

Вы можете установить проверку на остаток и для "кучки", но редко встречаются кучки с содержанием мифрила 20+
Теперь осталось лишь вывести сообщение, если текущий игрок не компьютер.
!!IF&1000:Q1/7/y1/1^{Мифрил}

%Z1 подобрал %Y1 %Z3 волшебного Мифрила.

{Всего у вас %Y2 %Z2 Мифрила.}^;

Полностью скрипт:

Показ мифрила
Anders

Этот скрипт будет показывать текущее кол-во мифрила игрока при правом клике по кнопка "Просмотр королевства".
Начнём с создания глобального события с текстом ZVSE. Затем, триггер на правый клик:
!?CM;
Теперь узнаем, куда кликнули, и запишем в y1:
!!CM:I?y1;
И выйдем, если не на кнопку "просмотр королевства"
!!FU&y1<>3:E;
Затем узнаем, кто сейчас ходит и сколько мифрила он имеет:
!!OW:C?y3; [записать номер ходящего игрока в y3]
!!OW:Ry3/7/?y2; [сохранить мифрил текущего игрока в y2]
Временная переменная z-1 будет хранить форму слова "брусок" в зависимости от их кол-ва.
!!VRy1:Sy2;
!!VRy1&y1>20:%10;

!!VRz2|y2=1/y1=1:S^брусок^;
!!VRz2&y2>1/y2<5:S^бруска^;

!!VRz2&y2>4/y2<21:S^брусков^;
!!VRz2&y2>20/y1>1/y1<5:S^бруска^;
!!VRz2&y2>20/y1>4:S^брусков^;
!!VRz2&y2>20/y1=0:S^брусков^;

Для деталей смотрите скрипт выше.
Теперь уточним, что кликнул именно текущий игрок (только для мультиплеера).
!!OW:Gy3/?y4;
Теперь, если всё правильно, покажем сообщение:
!!IF&y1=3/y3=y4:Q1/7/y2/4^{Мифрил}

У вас %Y2 %Z2 мифрила.^;

Затем остаётся лишь отключить стандартное сообщение правого клика по кнопке "просмотр королевства":
!!CM&y1=3/y3=y4:R0;

Полный скрипт:

Методика создания уникальных способностей для ваших существ
Salamandre

Уникальные способности – наиболее привлекательная составляющая WoG. Их изменение делает сценарий более динамичным и реиграбельным.
Понятно, что данная тема адресована людям без высоких навыков скриптописания, и здесь будут описаны довольно элементарные вещи для любого опытного скриптера.
Необязательно быть Fnord'ом, чтобы сделать нечто подобное, всё довольно легко исполняется и описывается.

К примеру, заставим Чародеев колдовать Волну Смерти в бою, а также дадим им иммунитет к вражеским заклинаниям 1го уровня и Волне Смерти.
Итак, вам нужно открыть таблицу бонусов опыта существ для EA:B (при $3=119).

  1. Сначала вы должны пояснить игре, что она должна выполнить команды при загрузке карты. Это делается с помощью команды !?PI;
  2. Теперь нужно удалить все способности существ, с которыми они начинают, и установить нужные. Очистим таблицу способностей с помощью следующих строк: (Мы используем Чародеев, их номер = 136)
  3. Итак, имеем: Это значит, что Чародеи не будут иметь способностей опыта с первого дня.

Теперь давайте настроим нужное.
Посмотрим на первую пустую линию: Мы должны заполнить пространство между слэшами для корректного показа способности.
Судя по таблице опыта существ, номер способности "Иммунитет к вражеским заклинаниям 1го уровня" = 49.
!!EA136 - необходимое начало команды, которое объясняет, что таблица опыта монстра 136 будет изменяться.
B5 определяет, что это первая линия.
!!EA136:B5/1 означает установку новой способности (1). Ноль означает удаление способности, что мы уже проделали.
Дальнейшие числа относятся к способности и её шансу на срабатывание на разных уровнях опыта. Нам нужно указать число 119 перед настройкой любой способности из таблицы иммунитетов.
!!EA136:B5/1/119/49.. → иммунитет к вражеским заклинаниям 1го уровня.
Теперь мы должны указать % шанс, но, т.к. это не заклинание, а иммунитет, то мы можем указать лишь 1 (есть) или 0 (нету).
!!EA136:B5/1/119/49/0/0/0/0/1/1/1/1/1/1/1; - всего 11 уровней опыта
У нас иммунитет будет с 4го уровня (27600)

Теперь о процентах.
Пусть Чародеи будут колдовать заклинание Волна Смерти.
Из таблицы опыта имеем: колдует заклинание перед атакой = 112. Можно также сделать, чтобы оно колдовалось после атаки, выставив соответствующий номер.
В таблице заклинаний находим знеачение для Волны Смерти → 24.

Т.к. первая бонусная линия занята иммунитетом, пойдём на вторую (В6): !!EA136:B6/1/112/24..

Дальше указываем процентный шанс существа наколдовать заклинание на каждом уровне опыта. Вы можете указывать какие захотите процентные значения, хоть 100% на 1-ом уровне. В этом примере будет немного сбалансировано:
Теперь Чародеи имеют 50% шанс наколдовать Волну Смерти на 10 уровне опыта.

Вот что у нас сейчас имеется:

Продолжим добавлять способности.
Теперь добавим иммунитет ко всем вражеским заклинаниям. Код, в принципе, останется таким же, за исключением чисел.
Т.к. полный иммунитет к магии (53) это не шутка, нельзя давать его так же рано, как к 1-ому уровню.
Настроим третью строку: !!EA136:B7
Сделаем способность доступной с 10 уровня (105000 опыта)
Код:

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

А теперь обратимся к другой таблице. Процентный шанс здесь работает как нужно, поэтому настройка здесь более тонкая. Вы не должны давать существу с полным иммунитетом к магии 100% шанс блока, только если не хотите помучить тестеров вашей карты.

Настроим блок Чародеям, поработаем с четвёртой линией: !!EA136:B8

В таблице Блок - это номер 66. Также мы напишем 61 (установить) на 4ой позиции: B8/1/66/61

Теперь Чародеи имеют потрясающий шанс заблокировать атаку врага на уровне Ас. Более половины атак будут неудачны. Осторожно, т.к. бой с такими монстрами может быть фатальным ;)

Чародеи всё ещё довольно слабы по здоровью, не так ли? Так пусть они вызывают Клон (108).

Но, нам нужно определить, какое существо они будут вызывать: они даже могут вызывать Лазурных драконов. Я бы установил на вызов тех же Чародеев (номер 136).

Процент в примере очень велик: на последнем уровне Чародеи будут вызывать 90% самих себя. Используйте меньшие числа, чтобы не поломать баланс игры.

Наложить заклинание на существо.

Мы будем накладывать Молитву. По таблице, "очаровывает заклинанием" = 115. Мы должны настроить заклинание, взяв номер из таблицы заклинаний.

Молитва - 48, имеем: !!EA136:B10/1/115/48

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

0 = ещё не активировано
1 = базовый
2 = продвинутый
3 = эксперт

В итоге:

И, наконец, флаговые способности.

Они тоже довольно полезны, и мы установим две из них, чтобы завершить нашу «машину смерти»: Двойная атака и Безответный удар.

Из-за новой таблицы, третий параметр - 102, а сама способной будет четвёртой.

Двойной удар (68) настраивается как и иммунитеты (0 = способность недоступна, 1 = активирована).

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

Принцип для "Безответный" такой же (82)

В общем и целом, наш итоговый код будет таким:


Самое главное, что вы можете давать эти способности после срабатывания какого-либо триггера, вместе с сообщением.

Например: