IPB

Здравствуйте, гость ( Вход | Регистрация )

11 страниц V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> Обучение ERM, ERM для чайников :)
Ennin
сообщение 27 Aug 2006, 12:28
Сообщение #21

strange thing
Сообщений: 2 586
Спасибо сказали: 94 раза




Код
все команды делятся на две принципиальные части - триггеры и реакторы.
триггеры - это особые команды, принимающие на себя обработку события.
код триггера состоит из двух частей: заголовка (собственно команда
триггера) и последующий код обработчика, составленный из реакторов.
формат триггера: !{?|$}WW[p][c];
где XX - имя триггера, p - параметры, а c - условия.
львиная доля триггеров работает для формата !?, но для некоторых
есть и формат !$, означающий ПОСТ-триггер. например, !?OB выполнится
ПЕРЕД посещением объекта, а !$OB - ПОСЛЕ.
реакторы, в свою очередь, делятся на собственно реакторы и инструкции.
формат реактора: !{!|#}WW[p][c]:[X];
где WW - имя реактора, p - параметры, а c - условия.
!! означает обычный реактор, !# - инструкцию. отличие инструкций в том,
что они не требуют вышестоящего триггера и выполняются при старте карты.
X - это раздел команд. общий формат команд реактора: W[p]
где W - имя команды, p - параметры. в одном реакторе может быть несколько команд.

параметры, как видно, присущи как основным командам, так и подкомандам
и имеют общий формат.
V[/V[/V[/V[/V[/V[/V[/V[/V[/V[/V[/V[/V[/V[/V[/V]]]]]]]]]]]]]]]
то есть до 16 параметров, разделенных слешем. V может быть нулем, числом,
переменной. второй и последующие параметры могут быть пустыми. последний
параметр может быть строковым, причем тогда он НЕ отделяется от предыдущего
слешем.
строки в ERM выделяются символами "^" и не могут содержать символов "^" или ";".
примеры команд реактора:
T          //без параметров
R0         //параметр1=0
P1/v1      //параметр1=1;параметр2=значению переменной v1
M1/5^text^ //параметр1=1;параметр2=5;параметр3=строка "text";
для каждого триггера, реактора, инструкции или команд реактора или инструкции
требуется свой набор параметров - смотри соответствующие страницы справки

условия определяют, будут ли выполняться подкоманды реактора или нижележащий код
триггера. общий формат условий: {AND[OR]|OR}
то есть может быть до двух секций условий. три возможных варианта:
AND
AND+OR
OR
никаких других вариантов, типа OR+AND и дублирования секций быть не может.
формат AND: &C[/C[/C[/C[/C[/C[/C[/C[/C[/C[/C[/C[/C[/C[/C[/C]]]]]]]]]]]]]]]
и выполняется только когда ВСЕ условия истинны
формат OR:  |C[/C[/C[/C[/C[/C[/C[/C[/C[/C[/C[/C[/C[/C[/C[/C]]]]]]]]]]]]]]]
и выполняется, когда хотя бы одно условие истинно.
связка AND+OR выполняется, когда истинны ВСЕ условия AND и/или хотя бы одно
из условий OR
C может быть условием флага или сравнения.
флаги в ERM - это массив логических значений 1..1000;
чтобы проверить флаг на истинность, условие содержит его номер. чтобы проверить
на ложность, условие содержит номер*-1.
условие сравнение выглядит в виде V1?V2, где V1,V2 - данные для сравнения,
которые могут быть числами, переменными, строками, а ? - знак сравнения в виде
= равно
<> не равно
> больше
< меньше
>= больше или равно
<= меньше или равно
в ERM имеется большое количество переменных. все переменные имеют вид T[i]
где i - индекс. подробнее о типах и количестве переменных каждого типа смотри
на странице VR;
примеры условий:
&1                //если флаг 1 true
&5/-15/1000/v1<>5 //если флаги 5, 1000 true И флаг 15 false И v1 не равна 5
|y1=7/z1=^Result^ //если y1 равно 7 ИЛИ z1 равно строке "Result"
&v1=1/1|2         //если (флаг 1 true И v1 равно 1) ИЛИ флаг 2 false
условия пишутся после параметров триггера, реактора или инструкции


--------------------
anyway the wind blows...


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
gamecreator
сообщение 28 Aug 2006, 15:59
Сообщение #22

Яблочный произвол!
Сообщений: 11 080
Спасибо сказали: 3988 раз




Цитата(Soul Reaver @ 23 Aug 2006, 15:01)
!?OB1/1/0;
!!IF&v1=0:M^Текст.^;
!!VRv1&v1=0:S1;
!!IF&v1=1:M^Текст 2.^;

Чтобы при первом посещении не показывались оба текста нужно строчку с "Текст 2." поставить перед строчкой "Текст". Вот так:
!?OB1/1/0;
!!IF&v1=1:M^Текст 2.^;
!!IF&v1=0:M^Текст.^;
!!VRv1&v1=0:S1;
Скриптеры, не забывайте об этом! kap.gif


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
DracoLich
сообщение 23 Sep 2006, 11:03
Сообщение #23

Banished
Сообщений: 1 782
Спасибо сказали: 116 раз




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


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

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

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

Наконец, вы должны дать имя событию и описанию скрипта.
Теперь вставьте скрипт в сообщение события. Вы можете делать скрипт прямо здесь или в скрипт-редакторе и затем вставлять его в окно события.
Если вы будете использовать скрипт-редактор, это поможет вам избежать многих проблем:
1) Если вы делаете какие-либо изменения в скрипте, вы сможете сохранить его снова.
2) Выбрать целый скрипт (ctrl+A), и скопировать его (ctrl+C)
3) Идите в редактор карт, и вставляйте скрипт (ctrl+V)

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

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

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

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

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

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

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

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

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

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

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

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

... v1 ...
операция проходит над переменной v1

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

... S0 ...
Выбрать опцию S для VR. Это сообщает, что вы хотите установить значение переменной. В данном случае мы устанавливает его на 0.

... ;
Как я упоминал выше, точка с запятой заканчивает команду.

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

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

Далее, теперь мы должны добавить один к значению. Для этого используем другую опцию команды VR, но теперь мы используем ресейвер (!! вместо !#):
!!VRv1:+1;
ERM использует + для указания действия прибавления. Таким образом, эта команда обозначает "добавить 1 к переменной v1". Другие математические операции:
отнимание: используйте "-"
умножение: используйте "*"
деление: используйте ":"
для остатка от деления: используйте "%"
Заметьте, что кроме e-переменных все числа целые, т.е. 7, деленое на 4, будет равняться 1, а не 1.75.

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

Это весь скрипт. Так, объединя все вышенаписанное, мы имеем следующее:
ZVSE
!#VRv1:S0; [установить переменную v1 на 0]
!?LE0/0/0; [посещение события в северо-западном углу поверхности]
!!VRv1:+1; [добавить 1 к v1]
!!IF:M^Вы посетитель номер %V1 в этом северо-западном углу поверхности!^; [показать сообщение]


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
DracoLich
сообщение 23 Sep 2006, 18:58
Сообщение #24

Banished
Сообщений: 1 782
Спасибо сказали: 116 раз




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

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

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

Так давайте добавим линию:
!!VRy1:Sv1%10; [переменная v1 делится на 10?]

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

Теперь, если это число не кратно 10, мы должны только показать сообщение, уже указанное прежде. Но нужно сделать мелочь:
!!IF&y1<>0:M^Вы посетитель номер %V1 северо-западного угла поверхности!^; [показать это сообщение, если ничего более не происходит]

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

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

Теперь, если v1 - число, кратное десяти, мы хотим сообщить, что волшебство изменяет мир. Но для этого мы должны узнать, какое изменение делается. Мы будем использовать другую y-переменную для проверки на это:
!!VRy2:Sv1:10%3; [найти номер изменения]

Эта команда возьмет 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, чтобы записать кусок текста, который изменяется.
Это будет три линии:
!!VRz-1&y2=0:S^магия Мира стабилизируется.^; [для визита 30, 60, 90, ...]
!!VRz-1&y2=1:S^магические влияния увеличились!^; [для визита 10, 40, 70,...]
!!VRz-1&y2=2:S^магия мира ослабевает.^; [для визита 20, 50, 80, ...]

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

Теперь мы должны показать новое сообщение:
!!IF&y1=0:M^Вы посетитель номер %V1, вы чувствуете, что %Z-1.^; [показать измененное сообщение]

В этот раз условие состоит в том, что y1 равняется 0. Мы только хотим, чтобы это сообщение появилось и изменялось.
Теперь у нас готовы все сообщения. Затем нужен код, чтобы изменить статистику героя в битве.
Я хочу добавить, что линия ниже - комментарий, т.е. в редакторе скриптов будет изображаться зеленым:
** начало кода эффектов в битвах

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

Знайте, что многие скрипты часто имеют проблемы в игре человек-против-человека и мультиплеерных битв. Хотя данный скрипт не должен иметь проблем, я все равно собираюсь проверить на этот случай и не позволить коду работать в этом случае.
Есть специальная команда для этой проверки:

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

Если вы просмотрите ERM-помощь по ресейверу BA, то узнаете, что y1 может принимать значения:
Если битва - между ИИ и игроком-человеком, ход ИИ на компьютере хозяина игры, то y1 будет равна 2.
Если это битва человек-на-человека, кроме Хот-сита, y1 установится на 1.
Если иначе, то y1 устанавливается на 0.
Теперь нам нужно, чтобы код работал в последнем случае. Пока вы не знаете, какие типы скриптов сражений работают в случаях 1 и 2, самое безопасное - сделать это.
Теперь мы имеем следующую линию:
!!FU1&y1=0:Pv1; [если нет, продолжить скрипт]

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

Мы начинаем триггер функции, указывая новую секцию кода вместе с комментариями:
** за миг до сражения
!?FU1;

Так как мы хотим изменить силу магии каждого героя в сражении, мы должны знать, какие герои борются, если они вообще имеются. Это делается двумя ресейверами для сражений:
!!BA:H0/?v5; [получить номер героя-атакующего]
!!BA:H1/?v6; [получить номер героя-защищающегося]

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

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

Теперь мы должны узнать силу магии для изменения. Наша y-переменная выше, которая хранила силу магии для изменения, уже потеряла свое значение. Но у нас есть доступ к переменной v1. Давайте снова получим тип изменения:
!!VRx1::10%3; [получить тип изменения]

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

Теперь мы почти готовы. Мы просто должны узнать силу магии героев:
!!HEv5:F?y5/?y6/?y3/?y7; [получить параметры атакующего]
!!HEv6&v6>=0:F?y5/?y6/?y4/?y7; [получить параметры защищающегося]

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

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

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

!!VRv3&x1=1:Sy3; [если волшебство усилилось - увеличение силы магии]
!!VRv3&x1=2:S1-y3; [если волшебство ослабилось, установить силу магии на 1]
!!VRv4&x1=1/v6>=0:Sy4; [если волшебство усилилось, увеличить силу магии]
!!VRv4&x1=2/v6>=0:S1-y4; [если волшебство ослабилось, установить силу магии на 1]

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

Теперь мы должны только сделать изменения:
!!HEv5&x1<>0:Fd0/d0/dv3/d0; [изменить силу магии]
!!HEv6&x1<>0/v6>=0:Fd0/d0/dv4/d0; [то же для защищающегося]
Здест вы изменяем параметры героев, но только если x1 не 0. Помните, чот если x1 = 0, то наш счетчик определяет "нет никаких изменений".
Снова мы используем команду HE:F. Знак d перед любым числом или переменной говорит, что число или переменная должны быть добавлены к параметру.
d0 оставляет параметр без изменений.

Мы теперь завершили до-битвенную функцию!
Теперь наш скрипт похож на:

ZVSE
!#VRv1:S0; [установить v1 на 0]
!?LE0/0/0; [когда посещается событие в северо-западном углу карты]
!!VRv1:+1; [добавить 1 к v1]
!!VRy1:Sv1%10; [v1 делится на 10?]
!!IF&y1<>0:M^Вы посетитель номер %V1 северо-западного угла повехности!^; [показать сообщение, если более ничего не происходит]
!!VRy2:Sv1:10%3; [найти тип изменения]
!!VRz-1&y2=0:S^магия Мира стабилизируется.^; [для визита 30, 60, 90, ...]
!!VRz-1&y2=1:S^магические влияния увеличились!^; [для визита 10, 40, 70,...]
!!VRz-1&y2=2:S^магия мира ослабевает.^; [для визита 20, 50, 80, ...]
!!IF&y1=0:M^Вы посетитель номер %V1, вы чувствуете, что %Z-1.^; [show change message]

** эффект скрипта в битве

!?BA0;
!!BA:E?y1; [это сетевая битва?]
!!FU1&y1=0:Pv1; [если нет, продолжить скрипт]

** за миг до битвы

!?FU1;
!!BA:H0/?v5; [получить номер героя - атакующего]
!!BA:H1/?v6; [получить номер героя-защитника]
!!VRx1::10%3; [получить тип изменения]
!!HEv5:F?y5/?y6/?y3/?y7; [получить параметры атакующего]
!!HEv6&y2>0:F?y5/?y6/?y4/?y7; [получить параметры защитника]
!!VRv3&x1=1:Sy3; [если магия усилилась, увеличить силу магии]
!!VRv3&x1=2:S1-y3; [если магия ослабла, уменьшить силу магии до 1]
!!VRv4&x1=1/v6>=0:Sy4; [Если магия усилилась, увеличить силу магии]
!!VRv4&x1=2/v6>=0:S1-y4; [если магия ослабла, уменьшить силу магии до 1]
!!HEv5&x1<>0:Fd0/d0/dv3/d0; [изменить силу магии]
!!HEv6&x1<>0/v6>=0:Fd0/d0/dv4/d0; [мо же для защищающегося]

Заметьте, как линии комментария помогают просмотру секций.

Теперь, после битвы, мы должны вернуть изменения обратно. Сначала мы делаем триггер конца битвы:
** пост-триггер битвы
!?BA1;
!!BA:E?y1; [сетевая битва?]
!!FU2&y1=0:Pv1; [если нет - уничтожить изменения]

Выглядит схоже, да? Хорошо, изменения находятся в триггере и номере функции. Триггер теперь BA1, это означает, что триггер сработает в конце битвы.
И, так как нам нужно вернуть изменения обратно, нам нужна отдельная функция. К счастью, мы сохранили номер героев и изменений в v-переменных, так что нам не нужно снова вычислять их.
Давайте начнем уборку:
!?FU2;
!!VRx1::10%3; [получить тип изменений]
!!VRv3:*-1; [перевернем параметр нападавшего]
!!VRv4:*-1; [перевернем параметр защищающегося]

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

!!HEv5&x1<>0:Fd0/d0/dv3/d0; [восстановить силу атакующего]
!!HEv6&x1<>0/v6>=0:Fd0/d0/dv4/d0; [восстановить силу защищающегося]
Опять же имеется проверка на изменение и существование героя-защитника.
Мы должны были хранить числа героев, потому что если герой убежал с поля битвы, мы бы уже не смогли найти его параметры.
Наш скрипт готов!


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
DracoLich
сообщение 05 Oct 2006, 15:05
Сообщение #25

Banished
Сообщений: 1 782
Спасибо сказали: 116 раз




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


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

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

Для этого скрипта я собираюсь использовать 4ый объект в 3ем ряду. Это похоже на пентаграмму с маленькими обелисками на лучах, и большим обелиском в середине.
Поместите это на карту максимально близко к углу, не отключая никакого изображения. Если вы этого обычно не делали, включите инструмент "проходимость" (Ctrl+P) - разбивку карты на красные и желтые площади. Любой красный квадрат герой не может посетить или пройти сквозь него. Любой желтый квадрат - это квадрат триггера объекта.
Если C=свободно, R=красный, и Y=желтый, тогда этот объект в редакторе будет выглядеть так:
CCCCC
CRCRC
RCYCR
CCRCC
Как я предполагаю, желтый квадрат должен быть расположен в (2,2,0).

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

Теперь мы собираемся заменить линию !?LE, чтобы чтобы подогнать наш скрипт к желтому квадрату. Помните, старая линия была:
!?LE0/0/0; [когда событие в северо-западном углу поверхности посещено]
Теперь мы просто изменяем местоположение на желтый квадрат (2,2,0) и изменяем команду LE на OB:
!?OB2/2/0; [когда объект в (2,2,0) посещен]

Заметьте, что фактически триггер OB похож на триггер LE. Если вы не имели никаких проблем с LE, значит у вас не будет проблем и с OB.

Только помните, что LE поддерживает только события, а OB поддерживает любые объекты, и вы будете знать, когда и какой нужен триггер.
Теперь скрипт будет работать так же, как и прежде, кроме точки запуска. Но я собираюсь сделать еще одно изменение линии:
!$OB2/2/0; [ПОСЛЕ того, как объект (2,2,0) посещен]

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

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

Теперь давайте скрипт с "мистическим солшебным колесом" установим вне звездной оси. Я думаю, что из-за природы скрипта нам подойдет Сказочный дракон.

Так или иначе, давайте начинать скриптинг:
!?OB2/2/0; [Когда объект в (2,2,0) посещается]
Это простой триггер предпосещения.

Теперь мы должны закодировать вопрос да или нет.
Первое, что мы должны понять - мы собираемся задать вопрос, на который нужно ответить. Это вызывает проблему, если ИИ посылает героя, чтобы посетить точку.
Так что мы должны посмотреть, является ли текущий игрок человеком или ИИ. Мы делаем эту операцию ресейвером OW. OW позволяет нам проверять или устанавливать почти все параметры игрока (но не героя).
Ну, пишем:

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

Теперь мы можем задать вопрос.
Так как мы должны показать вопрос, нам понадобится ресейвер IF:
!!IF&y2=0:Q1/6/0/21/134/33/0/2^Вы замечаете маленький стенд, настроенный около Зведной Оси. Сказочных Дракон подзывает вас:
- Позабавьтесь с магией! За сто золота счетчик магии прыгнет на целых пять единиц посещений!
Вы согласны?^;

Как вы видите, здесь я добавил условие y2=0. Если ИИ посетит ось, то вопрос не будет задаваться!
В любом случае, в этой команде много чисел, не так ли? Их восемь. Я собираюсь разобрать их ниже по частям.
Если у вас есть ERM-помощь, зайдите в раздел !!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 - это монстр, подтип - номер монстра. Если вы нажмете на гиперссылку в файле помощи по !!IF:Q, вы получите таблицу их номеров. В данном случае подтип 134 - это Сказочный дракон.
Третье изображение - это 33/0. Тип 33 это один из первичных навыков, в данном случае - колдовская сила. Опять же подтип ставим 0, то есть без какого-либо количества.
Когда скрипт будет запущен, под текстом будут изображения золота, Сказочного Дракона и Колдовской силы.

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

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

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

Затем мы проверяем, что ответил игрок, и может ли он позволить себе покупку. Мы покажем соответствующий ответ для каждого случая. Для этого используем 3 команды IF -первая, если нажата кнопка "Нет", еще одна для "Да" и если игрок может позводить себе покупку, и последняя, если "Да" и игрок не может позволить себе покупку:
!!IF&y2=0/-1:M^Дракон разочарованно поворачивается к другому потенциальному клиенту.^;
!!IF&y2=0/1/y3>=100:M^"Отлично! Я знал, что вам понравится предложение!"^;
!!IF&y2=0/1/y3<100:M^"Я рад, что вы заинтересовались, но у вас недостаточно золота для покупки. Возвращайтесь позднее!"^;

Здесь условие "Это именно человеческий игрок" находится во всех трех командах. Второе условие проверяет флаг 1, который устанавливается в зависимости от ответа игрока
В первой линии число флага отрицательно. Это означает, что мы делаем условие "Если флаг - Ложь, то проверка пройдена". В двух других линиях
флаг положителен, что означает "Если флаг - Истина, то проверка пройдена"?
Еще во второй и третьей линии есть проверка на количество золота "Значение больше или меньше?". Прежде чем вычесть 100 золота у игрока, мы должны решить, что сделает ИИ.
Позвольте ИИ тоже купить пять посещений - 50%-ый шанс, что он сделает это. Мы сделаем это двумя командами:
!!VRy4:S0R1; [генерируем значение от 0 до 1 включительно]
!!IF&y2=1:V1/y4; [установить флаг в y4]

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

Теперь, когда мы сделали все возможные пути, мы кодируем вычитание золота командой OW.
!!OW&1/y3>=100:R-1/6/d-100; [вычесть 100 золота, если все правильно: игрок согласился, золота хватает]

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

Мы должны сделать еще несколько строк - сейчас, например, добавление счетчика при оплате. Так как мы не использовали v2, я сделаю это здесь:
!!VRv2:S0; [установить v2 на 0]
!!VRv2&1/y3>=100:+4; [установить v2 на 4 если оплата была произведена]

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

Вспомните следующие линии из начала скрипта:
!!VRv1:+1; [Добавить 1 к v1]
!!VRy1:Sv1%10; [v1 делится на 10?]

В этой части скрипта y1 - значение счетчика посещений. Для начала мы изменим первую линию:
!!VRv1:+1+v2; [добавить 1+v2 к v1]

Если опалта была произведена, то это добавит 5 к v1, иначе - только 1.
Далее добавим линию после вычисления y1:
!!VRy1&y1<=v2:S0; [сброс y1, если число уже не кратно 10]

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

Теперь, после небольших изменений скрипт выглядит так:
ZVSE
!#VRv1:S0; [установить v1 на 0]

** триггер пост-посещения

!$OB2/2/0; [ПОСЛЕ посещения объекта в (2,2,0)]
!!VRv1:+1+v2; [добавить 1+v2 к v1]
!!VRy1:Sv1%10; [v1 делится на 10?]
!!VRy1&y1<=v2:S0; [сброс y1, если число, кратное 10 уже перепрыгнули]
!!IF&y1<>0:M^Добро пожаловать на звездную ось. Магический счетчик показывает значение %V1^; [Показать сообщение, если ничего не произошло]
!!VRy2:Sv1:10%3; [найти тип изменения магии]
!!VRz-1&y2=0:S^return to normal.^; [для визита 30, 60, 90, ...]
!!VRz-1&y2=1:S^strengthen.^; [для визита 10, 40, 70,...]
!!VRz-1&y2=2:S^weaken.^; [для визита 20, 50, 80, ...]
!!IF&y1=0:M^Магический счетчик теперь равен %V1... Вы чувствуете, что магия %Z-1.^; [показать измененное сообщение]

** эффект скрипта в битве

!?BA0;
!!BA:E?y1; [это сетевая битва?]
!!FU1&y1=0:Pv1; [если нет, запускаем скрипт]

** за миг до битвы

!?FU1;
!!BA:H0/?v5; [получить номер героя - атакующего]
!!BA:H1/?v6; [получить номер героя - защитника]
!!VRx1::10%3; [получить тип изменения магии]
!!HEv5:F?y5/?y6/?y3/?y7; [получить параметры атакующего]
!!HEv6&v6>0:F?y5/?y6/?y4/?y7; [получить параметры защищающегося]
!!VRv3&x1=1:Sy3; [если магия усилена, увеличить значение]
!!VRv3&x1=2:S1-y3; [если магия ослаблена, установить на 1]
!!VRv4&x1=1/v6>=0:Sy4; [если магия усилена, увеличить значение]
!!VRv4&x1=2/v6>=0:S1-y4; [если магия ослаблена, установить на 1]
!!HEv5&x1<>0:Fd0/d0/dv3/d0; [изменить силу магии]
!!HEv6&x1<>0/v6>=0:Fd0/d0/dv4/d0; [то же для защитника]

** пост-битвенный триггер

!?BA1;
!!BA:E?y1; [это сетевая битва?]
!!FU2&y1=0:Pv1; [если нет, продолжить]

!?FU2;
!!VRx1::10%3; [получить тип изменений]
!!VRv3:*-1; [изменим параметр атакующего на отрицательный]
!!VRv4:*-1; [изменим параметр защищающегося на отрицательный]
!!HEv5&x1<>0:Fd0/d0/dv3/d0; [восстановим силу атакубщего]
!!HEv6&x1<>0/v6>=0:Fd0/d0/dv4/d0; [восстановим силу защищающегося]

** триггер посещения объекта
!?OB2/2/0; [объект (2,2,0) посещен]
!!OW:C?y1; [получить текущий цвет]
!!OW:Iy1/?y2; [текущий игрок - ИИ?]
!!IF&y2=0:Q1/6/0/21/134/33/0/2^Вы замечаете маленький стенд, настроенный около Зведной Оси. Сказочных Дракон подзывает вас:
- Позабавьтесь с магией! За сто золота счетчик магии прыгнет на целых пять единиц посещений!
Вы согласны?^;
!!OW:R-1/6/?y3; [Найти количество золота игрока]
!!IF&y2=0/-1:M^Дракон разочарованно поворачивается к другому потенциальному клиенту.^;
!!IF&y2=0/1/y3>=100:M^"Отлично! Я знал, что вам понравится предложение!"^;
!!IF&y2=0/1/y3<100:M^"Я рад, что вы заинтересовались, но у вас недостаточно золота для покупки. Возвращайтесь позднее!"^;
!!VRy4:S0R1; [генерируем значение]
!!IF&y2=1:V1/y4; [устанавливаем флаг в значение]
!!OW&1/y3>=100:R-1/6/d-100; [забираем 100 золота, если согласны]
!!VRv2:S0; [устанавливаем v2 на 0]
!!VRv2&1/y3>=100:+4; [устанавливаем v2 на 4, если плата произведена]


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Demiurg
сообщение 13 Jun 2007, 23:54 (Сообщение отредактировал Demiurg - 13 Jun 2007, 23:55)
Сообщение #26

Immortal
Сообщений: 670
Спасибо сказали: 14 раз




Получение/Определение/Установка типа артефакта у утопающего:
!!OBx/y/l:C#; # - номер артефакта, x, y, l - координаты утопающего.
Получение/Определение/Установка типа сундука:
!!OBx/y/l:C#;
Если # = -7, то сундук +1500 золота
Если # = -8, то сундук пустой
Если # < -8, то сундук содержит артефакт + золото
Для определения типа артефакта
!!VR@:S#+2147483648%2048:8; После этого @ - номер артефакта
Для установки в сундук артефакта
!!VR#:S@*8+4294959106; @ - тип устанавливаемого артефакта
!!OBx/y/l:C#;


--------------------
Самый страшный, кого можно встретить на экзамене, – факер Нео



Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
sergroj
сообщение 09 Sep 2007, 12:45
Сообщение #27

В миру GrayFace
Сообщений: 2 528
Спасибо сказали: 817 раз




Код
В: Как установить, что имеется в "Обломках", находящихся на воде?
О: Используем команду OB:C, возможные значения:
0 - ничего ценного
1 - 5 древесины
2 - 5 древесины, 200 золота
3 - 10 древесины, 500 золота

(с) пост DracoLich'а


--------------------
ДНК банана на 50% состоит из человека.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Demiurg
сообщение 11 Sep 2007, 20:31
Сообщение #28

Immortal
Сообщений: 670
Спасибо сказали: 14 раз




Как управлять содержимым пандоры?
Для пандоры работает ресивер !!LE
Данное свойство уже используется в скрипте 25 WoG в разделе spell banning.


--------------------
Самый страшный, кого можно встретить на экзамене, – факер Нео

Go to the top of the pageAdd Nick
 
+Quote Post
Demiurg
сообщение 15 Sep 2007, 14:25
Сообщение #29

Immortal
Сообщений: 670
Спасибо сказали: 14 раз




Как пользоваться !!UN:C?
!!UN:C#/#/$;
1) Чтение
!!UN:C<address>/<number of bytes>/?<value>;
2) Запись
!!UN:C<address>/<number of bytes>/<value>;

Примечание.
Обычно адреса записываются в 16ричной системе счисления. Так что прийдется перевести в 10чную.
Количество байт может быть прочитано или записано от 1 до 4.
Значение записывается или считывается в 10чной системе счисления.
---
Под WoG данная команда не всегда работает в записывающем режиме. Под TE с помощью этой команды можно сделать больше. Но в любом случае вы ее используете на свой страх и риск.


--------------------
Самый страшный, кого можно встретить на экзамене, – факер Нео

Go to the top of the pageAdd Nick
 
+Quote Post
Demiurg
сообщение 27 Sep 2007, 22:46
Сообщение #30

Immortal
Сообщений: 670
Спасибо сказали: 14 раз




MR2 Trigger features

Для понимания дальнейшего повествования пригодится этот простенький код. Этот код заставляет игру при каждом вызове триггера MR2 спрашивать нас, будет ли этот стек Сопротивляться магии или нет.
!?MR2&999;
!!IF:Q1/-1/-1/2^kill it?^;
!!MR&1:F0;// not resistance
!!MR&-1:F100;// max resistance

"Да" - !!MR:F0;(0% сопротивление)
"Нет" - !!MR:F100;(100% сопротивление)

Некоторые мелкие особенности работы MR2 описаны в конце документа в разделе Другие особенности.
1) После выбора заклинания в книге для каждого стека срабатывает !?MR2 триггер при проверке, может ли заклинание применяться на этот стек. Если заклинание может применяться только на дружественные существа, то срабатывает для каждого дружественного. Аналогично для действующих на существа противника и на всех. Если действует хотя бы на одно существо, то остальные стеки не проверяются, происходит переход к следующей фазе и герой замахивает руку для каста заклинания. Иначе выдается сообщение, что заклинание ни на кого не подействует и заклинание отменяется.

2) Срабатывает при наведении на потенциальную цель. Если нажать да, то курсор меняется на книгу и можно кастовать на этот стек. Если нажать нет, то курсор не меняется на книгу и нельзя кастовать на этот стек. При нажатии мышки или при последующем наведении на стек будет опять дан выбор.

Далее срабатывает триггер !?BG0;

3) Срабатывает при использовании заклинания на цель. Если "Да", то заклинание применяется. Если "Нет", то заклинание блокируется (анимация сопротивления магии).

Порядок срабатывания на стеки для площадной магии*:
#(3)(6)
(1)(4)(7)
#(2)(5)

от центра (в скобочках для нечетной строки):
(1) = -1
(2) = +17(+16)
(3) = -17(-18)
(4) = 0
(5) = +18(+17)
(6) = -16(-17)
(7) = +1

####(8)(13)(17)
##(4)(9)(14)(18)
(1)(5)(10)(15)(19)
##(2)(6)(11)(16)
####(3)(7)(12)

от центра (в скобочках для нечетной строки):
(1) = -2
(2) = +16(+15)
(3) = +33
(4) = -18(-19)
(5) = -1
(6) = +17(+16)
(7) = +34
(8) = -35
(9) = -17(-18)
(10) = 0
(11) = +18(+17)
(12) = +35
(13) = -34
(14) = -16(-17)
(15) = +1
(16) = +19(+18)
(17) = -33
(18) = -15(-16)
(19) = +2

*Для Берсерка порядок срабатывания обратный описанному.
Для двухклеточного стек срабатывает только на большей позиции. Например пусть для инферно грифон занимает позиции 14 и 18. Тогда !?MR2 для грифона сработает только на позиции 18.


Другие особенности MR2
1) MR2 не срабатывает никогда для стеков под антимагией.
2) При касте Массовой Дружественной магии MR2 не срабатывает на дружественных существ, на которых враг наложил гипноз. А также не срабатывает на существ противника, на которых мы наложили гипноз, при касте Массовой Враждебной магии.
3) MR2 не перехватывает массовый Dispel и некоторые другие заклинания. Впрочем для других заклинаний это очевидно.


Цепная Молния и MR2
Рассмотрим срабатывание триггера MR2 при касте цепной молнии, в 3ей фазе (цель уже выбрана, !?BG0 уже отработал).
0) MR2 срабатывает для самой цели. Если мы заблокируем заклинание здесь, то цепная молнии сразу отразится и никуда дальше не пойдет.
1) Далее на каждом шаге MR2 срабатывает для каждого, еще не пораженного Цепной Молнией (с учетом других особенностей MR2) стека. Из всех стеков, для которых выпало (или мы выбрали), что они могут быть сейчас поражены, выбирается 1 стек по принципам выбора стека для Цепной Молнии. Эта особенность позволяет нам на очередном шаге направить Цепную Молнию на любой стек, для которого срабатывает MR2 на данном шаге.


P.S. Такое вот бесхитростное описание, в очередной раз нас убеждает, что пути разработчиков Heroes 3 воистину неисповедимы.

Created by Demiurg at 2007/08/09


--------------------
Самый страшный, кого можно встретить на экзамене, – факер Нео



Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
sergroj
сообщение 07 Oct 2007, 18:17
Сообщение #31

В миру GrayFace
Сообщений: 2 528
Спасибо сказали: 817 раз




Передача переменных между картами компании
Для передачи информации между картами можно использовать только переменные v501-v997, z301-z500, w51-w100 и "полученные" переменные нельзя менять не протяжении карты. Если есть желание их изменить, их нужно копировать в новые переменные на старте карты и работать с новыми, спокойно их меняя.
Причина:
Переходят между картами только переменные v501-v997, z301-z500, w51-w100, остальные обнуляются на старте карты. Более того, если изменить переходящие переменные внутри карты, то при рестарте карты они останутся измененными, а не загрузятся из состояния перехода между картами.
основные исследования by Druin


--------------------
ДНК банана на 50% состоит из человека.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
DracoLich
сообщение 18 Oct 2007, 13:04
Сообщение #32

Banished
Сообщений: 1 782
Спасибо сказали: 116 раз




Документы ERS

Если вы создаете новый скрипт для WoGификации, вы можете добавить его в диалог WoG-опций файлом ".ers". Этот файл должен иметь имя, что и у скрипта, например, script78.erm должен иметь ers-файл script78.ers. Этот файл - таблица, содержащая информацию о номере скрипта, внутренний номер скрипта, используемый для включения или отключения (номер может отличаться от номера скрипта), место появления в диалоге настроек WoGификации и текст описания.
Быстрое описание каждого поля:
1. Комментарий - вы можете писать здесь что захотите. Обычно я вставляю имя или описание скрипта, но это поле лишь для вас, оно не влияет и не показывается в игре.
2. Номер скрипта (например, для script78.erm в поле напишите 78)
3. Страница, на которой он будет расположен (начинается со страницы 0)
4. Группа: 0=сверху справа, 1=снизу справа, 2=сверху слева, 3=снизу слева
5. Номер (первый = 0, второй = 1 и т.д.). Вы можете ввести -1, чтобы опция поместилась прямо за последним скриптом в таблице. Обычно я использую -1.
6. Статус по умолчанию: 0=отключен, 1=включен
7. Статус по умолчанию для сетевой игры (если вы нажмете на кнопку "По умолчанию для сети")
8. Код ERM для UN:P, используемый для определения статуса. Вы можете прочесть его командой UN:P#/?v1;, где # - ERM-номер. Я использовал номера 0-10 для встроенных опций (правый клик, Командиры, Стрелковые Башни и т.д.). 11-99 - для соответствующих скриптов. Если скрипт ниже 11, я добавлял 100. Так, скрипт 1 имеет номер 101, скрипт 2 - 102 и т. д. Дополнительно я использовал ERM-номера для дополнительных опций (например, много опций используют Правила карты), начиная от 111.
9. Текст - текст, показывающийся в окне опций рядом со статусом 1
0. Подсказка - текст внизу экрана опций, появляющийся при наводке мыши на опцию
11. Текстовое сообщение при правом клике по опции.
Замечание: любой скрипт WoGификации - это чекбокс (вкл. или откл.), кроме нескольких скриптов, которых Слава объединил в группы (например, Основные настройки). Вы не можете сделать такое же файлом .ers, т.к. это код WoG.


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
Bes
сообщение 30 Oct 2007, 20:14
Сообщение #33

замолкаю.
Сообщений: 2 340
Спасибо сказали: 1010 раз




В справке не совсем понятно, как работает арсширенный синтаксис !!EA:F
Вот что там сказано:
Цитата(ERM-Help © DracoLich)
F$1/$2/$3
        $1 - номер способности
        $2 - модификатор (-1 = не имеет значения, выбирается самая первая подходящая линия)
        $3 - переменная для записи результата
Здесь не понятно, что писать для $2 (толи как для модификатора 6 в HE:C; толи как для модификатор в EA:cool.gif idontno.gif
И с $3 не совсем понятно, что там писать... либо номер v-переменной, либо полностью переменную (типа y5) причём не указано, какую именно переменную здесь использовать (можно ли любую, или опять же только v#) idontno.gif

Разъясните кто-нибудь dry.gif


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
DracoLich
сообщение 31 Oct 2007, 10:31
Сообщение #34

Banished
Сообщений: 1 782
Спасибо сказали: 116 раз




2Bes
Ну, раз мы имеем ПОИСК линии бонуса, то логично предположить (хоть это и не указано в справкеsmile.gif), что модификатор - не что иное, как модификатор способности к EA:B.
А переменная $3 может быть любой (по крайней мере, обратное не указано)


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
gamecreator
сообщение 31 Oct 2007, 16:05
Сообщение #35

Яблочный произвол!
Сообщений: 11 080
Спасибо сказали: 3988 раз




так:
$1 - номер способности (формат SE1)
$2 - номер подспособности (форматы расширения SE2-5)
$3 - номер линии

т.е. подспособность - это параметр способности, т.е. например способность иммунитет к спелам - подспособность ко всем


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Гость_Д'якон_*
сообщение 09 Nov 2007, 15:48
Сообщение #36







Решил поделиться небольшим опытом в использовании !!UN:C. Вроде обучения по этому вопросу не было.
Так что я начну, а кто-нибудь продолжит. Надеюсь для новичков в этом деле будет полезно.

Немного теории

!!UN:C - ресивер позволяющий как записывать так и считывать данные по определенному адресу.
И так для работы с данным ресивером, Вам потребуется Арт Мани и Герои.

Адреса бывают статические и динамические.
Сатитеческие адреса - это адреса ехе файла, т.е. 00401000 - 006АСЕС0 и 00701000 - 0293512С.
Динамические адреса - выделяются программой во время загрузки. (Возможно совпадение динамических адресов в разных версиях героев, т.е. ТЕ и ВОГ, а также на разных компьютерах, но лучше все же привязывать динамические адреса к статическим Динамичские адреса можно привязать к статическим через указатели. Указатели, также бывают динамические и статические.).
Все это будет рассмотрено ниже. Пока просто можете запомнить

Что искать и как?
На эту тему приведенно масса примеров в руководстве к АртМани (поэтому начинать нужно с чтения данного руководства).
Памятка: лучшим прерыванием процесса является !!IF:M^^; (дальше поясню. Вообще с использованием ЕРМ поиск значительно облегчается)

Чтож я приведу пару практических примеров.

Начнем с простенького.

Задача1: найти адрес содержащий ресерс "золото".
Данная задача является наиболее простой. Ресурс отображается в определенном значении, значит и искать мы будем "точное значение".
Создайте карту для эксперементов, где Вам не будут мешать противники. (не обязательно, но желательно). Запустите героев. Запустите Вашу карту (у Вас должен быть хотя бы замок, либо золотая шахта - для того чтобы золото меняло значение). Запомните значение ресурса. Нажмите Alt+Tab. Запустите АртМани.

1. Выберите процесс:


2. Нажмите на кнопку искать. И выберите: "точное значение" , введите кол-во золота, и выберите "Целые (стандартные)" (к последнему и следующим пунктам в меню поиска еще вернемся).





3. Нажимем ОК. В левом поле отоброзятся все найденные адреса с заданным значением. В моем случае при значении золота 20000 - 542 адреса.



4. Нажимаем Alt+Tab. Возвращаемся в героев и пропускаем ход. Золото увеличилось (у меня 20500).

5. Alt+Tab. Нажимаем на кнопку "Отсеять". И вводим в поле новое значение золота. Нажимаем ОК. Остался 1 адрес. Это и есть адрес по которому содержится значение золото. Значение целое - 4 байта. Т.е. при спользовании UN:C записываем или считываем 4 байта. Полученный адресс - в 16ричной системе исчесления, переводим в 10ричную (можно при помощи стандартного калькулятора Виндоус), для записи в UN:C.





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

Ну вот с первым примером закончили.
Go to the top of the pageAdd Nick
 
+Quote Post
Гость_Д'якон_*
сообщение 09 Nov 2007, 16:21 (Сообщение отредактировал Д'якон - 09 Nov 2007, 21:17)
Сообщение #37







Задача2: найти адрес содержащий стоимость постройки в городе .
Сложность данной задачи заключается в том что, стоимость постройки есть константа.

1. Запускаем героев. Запускаем АртМани. (В данном примере возьмем Конфлюкс).

2. Цену лучше искать по золоту, т.к. получаем меньше адресов. Поиск по другим ресурсам даст более 30000 адресов, что не очень удобно.

3. Итак. Смотрим стоимость первого, допустим двелинга, - 300 золота и по 5 дерева и руды. В поиске выбираем: "точное значение" , "300" , "Целые (стандартные)". Выполняем поиск. Найдено 376 адресов.

4. Добавляем все адреса в правое поле. Если адресов больше тысячи, то нужно изменить значение отображаемых адресов в правом поле. Данная опция находится в меню "искать", в "настройках" в закладке "дополнительные". И перезапустить АртМани.




5. Т.к. адресов в данном случае не более 376. То выставлять данную опцию не следует (а вообще рекомендую поставить сразу тысяч на 8-10 для удобства).

6. После добавления адресов в правое поле. Выбираем следующее: "изменить" - "выбрать все". Далее в контекстном меню выделенных адресов выбираем "установить значение" 1 с шагом 1. Можете увидеть как становились значения в адресах. Далее заходим в героев и смотрим цену двелинга. Цена в золоте 85. Находим адрес со значением 85, это и будет наш искомый адрес 06АА4D8. Для того чтобы найти адреса дерева и руды войдем в меню адреса, двойной щелчок на адресе и при помощи скролинга стрелками вниз (т.е. на уменьшение адреса) будем искать необходимые значения, т.е. 5 и 5. Можно заметить что ресурсы между собой находятся на смещении равное 4-ем. Соответственно дерево находится на смешении 24 от золота 06АА4С0. В этом легко убедится вычтя из адреса золота адрес дерева и переведя в 10ричную систему исчисления.









Вывод: обычно похожие по смыслу значения хранятся в близком диапазоне - блоке памяти или массиве значений. Чтобы найти откланения между значениями, в данном случае между значением стоимости двелингов, нужно найти еще значение стоимости второго двелинга и найти разницу между адресами. Можно быть уверенным, что и остальные стоимости двелингов находятся на одинаковом смещении друг от друга.
Go to the top of the pageAdd Nick
 
+Quote Post
Гость_Д'якон_*
сообщение 09 Nov 2007, 21:26
Сообщение #38







Задача3: заменить ресивер MR:N .

Задача стоит в том, чтобы определить номер стэка при наложении на него магии. Чтобы выделить данный момент в игре потребуется ЕРМ, а именно код следующего характера:

Код
ZVSE
!?MR2;
!!IF:M^^;


Данный код позволит зафиксировать необходимый момент в игре, а именно, когда герой подымает руку перед кастом магии. Именно с этим моментом и будем работать.

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

1) В виде номера стека, т.е. при касте на 21 стэк, нужно искать значение 21 и т.д. Но, оказалось, что понятия номер стэка вообще отсутствует в коде. Т.е. как бы Вы не старались найти в коде значения номеров стэка - ничего не выйдет.

2) Неизвестное значение, постоянное для каждого стека соответственно. (см. инструкцию к АртМани. Поиск неизвестного значения)

3) 40 булевых переменных со значением 1 и 0. Т.е. если магия кастится на стэк, то по определенному адресу переменная меняет значение на 1. Тоже увенчалось неудачей (хотя не совсем... Но применить это не получилось)

4) В битовой форме. Т. е. кастим на 0 стек - ищем 1, кастим на 1 - ищем 2, кастим на 3 - ищем 4 и т.д. Опять неудача.

5) Ну и последнее. Нужно искать указатель, который бы указывал на определенное постоянное значение для каждого стека. Вот здесь то и была зарыта собака.

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

Для этого воспользуемся отсеиванием по формуле (см. АртМани инструкцию). Кастим на противника цепь молнию. Когда молния поражает

1-ый отряд - сохраняем 1-ый дамп памяти
2-ой отряд - 2-ой дамп
3-ий отряд - 3-ий дамп
4-ый отряд - 4-й дамп

Далее кастим на каждый из пораженных отрядов магическую стрелу и сохраняем еще 4-ре дампа 5,6,7 и 8 соответственно. Далее записываем следующую формулу.

(M1=M4)and(M2=M6)and(M3=M7)and(M4=M8)and(M[1,2,3,4,5,6,7,8]>0)and(M1<>M[2,3,4]) - этого достаточно.

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

Удаляем указатели, которые не указывают на адрес, а также указатели, которые не изменяются при касте на новый стек. Остается один адрес.
Этот адрес - динамический указатель. Т.е. при касте на стек, по этому адресу хранится адрес с нулевым значением из массива данного стэка. Далее находим адрес координат стэка и находим между этими адресами смещение.

Вот и все.

И так что же такое указатель? Указатель - это адрес хранящий в себе 10ричное значение адреса на который он ссылается. Все об указателях можно прочесть в инструкции к АртМани.

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

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



Далее выбираем диапазон поиска. Этот диапазон должен быть из статической области (см. первый урок).



Далее найдя указатели. Выходим из одной версии героев (например ТЕ) и запускаем другую (т.е. ВОГ). И сразу отсеиваем указатели по значению адреса, которое они должны иметь. Если адресов осталось больше одного,
выбираем любой и через него записываем динамический адрес.

Все.

P.S. UN:C - ассемблер для ЕРМ. Фантазируйте.
Р.Р.S. За объяснениями в использовании ресивера или приведенных уроков пишите в ПМ.
Go to the top of the pageAdd Nick
 
+Quote Post
Гость_Aнгeл_*
сообщение 01 Dec 2008, 15:06
Сообщение #39







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

Присутствуют. Два массива, номера стёков: 0..20/21.
Go to the top of the pageAdd Nick
 
+Quote Post
MasterOfPuppets
сообщение 19 Feb 2009, 12:39 (Сообщение отредактировал Master Of Puppets - 26 Feb 2009, 02:18)
Сообщение #40

Анти-Всë
Сообщений: 2 989
Спасибо сказали: 2376 раз




Просто открыл для себя, когда делал кнопки передачи отрядов в городе.
Команды !!HE:C и !!EX:A сильно различаются и занимаются каждая своим делом. Вторую нельзя использовать для установки кол-ва и типа монстров, ею можно лишь это проверить. Поэтому, как это ни громоздко, в случае, если вы передаёте опыт и арты, нужно использовать подряд три команды: !!HE:C установит информацию по типу и количеству, !!EX:E R - по опыту и артефактам. Даже если вы обнулили слот, в нём всё равно хранится инфо для EX. Если в городе в этот слот нанять монстра, он будет иметь опыт и знамя удалённого отряда. Значит, следует делать так:
!!EX#/X:E0 R-1/-1 (или R0/d/0/0);!!HE#:C0/X/-1/-1;


--------------------
Circle of destruction, hammer comes crushing
Powerhouse of energy
Whipping up a fury, dominating flurry
We create the battery

Go to the top of the pageAdd Nick
 
+Quote Post

11 страниц V  < 1 2 3 4 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 25 April 2024 - 17:24
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика