Немного теории. Вы когда-нибудь играли в пошаговую стратегию? Скорее всего что да, ведь кто не пробовал себя в шахматах? Не смотря на древность игры, над ней и в наше время ломают головы Великие гроссмейстеры. А все потому, что каждая игра, несмотря на конечное число фигур и их возможностей, является уникальной. Ясное дело, что в компьютерном мире эта игра нашла не только свое развитие, но и логическое продолжение, а именно - в пошаговых стратегиях, прародителем коих, несомненно, является King's Bounty. Сейчас есть не одна сотня пошаговых стратегий, но я хотел бы рассмотреть более подробно одну их них - Heroes of Might and Magic, точнее ее модификацию WoG. Основное отличие WoG от обычных Героев заключается в том, что вы имеете непосредственную возможность динамически менять правила игры, в зависимости от происходящих в ней событий. Также можно создавать свои собственные загадки и квесты, которые описываются в игре на языке ERM. В целом, возможности ERM ограничиваются только вашей фантазией, что позволяет создавать, например, карты с историческими событиями или карты-загадки. Язык ERM не является чем-то очень сложным, в нем есть всего лишь три типа команд: генераторы, приемники и инструкции, но их количество довольно большое. Генераторы - это такие команды, которые следят за всеми событиями в игре, и реагируют на заданные, а приемники, соответственно, выполняют все, что вы придумаете по данному событию. Инструкции же служат для начальной установки параметров к генераторам и приемникам. Запоминать нужные команды несложно, все они состоят всего лишь их двух символов. Готовый текст на ERM-е называется скриптом и размещается непосредственно в теле карты в разделе временных событий, как текстовое сообщение или во внешнем ERM-файле. Есть также множество готовых скриптов, которые считаются стандартными для WoG и их присутствие в теле карты необязательно. Их включение/отключение можно делать в настройках игры и они дают возможность гибко настроить правила и возможности по своему усмотрению. Приведу несколько примеров с возможностями ERM: представьте себе, что вашему Герою нужно пройти небольшой участок территории, который состоит из различных типов местности. Есть, скажем, четыре переключателя, с помощью которых можно менять участки местности. Пока не будет сложена одна однотипная дорожка, пройти дальше будет нельзя. Задачка чем-то напоминает puzzle. Или еще - нужно вам порвать/заключить союз с тем или другим игроком - пожалуйста, это возможно, в отличии от обычной версии игры. Можно также выбросить все артефакты с рюкзака на землю или нанять бродячих монстров и натравить их на противника…


Ближе к практике. Теперь можно более подробно рассмотреть синтаксис применения ERM-команд. Все ERM-команды имеют универсальный формат: ЗАГОЛОВОК[:ПАРАМЕТРЫ/КОМАНДЫ]. Перед заголовком ставятся два символа, которые определяют тип команды, так для генератора это !?, приемника - !!, а для инструкции - !#. После заголовка, перед заданием параметров и команд, можно использовать идентификаторы и условия, которые позволяют привязать данную команду к определенному объекту на карте или событию и задать условия выполнения данной команды соответственно. Идентификаторы имеют формат записи N[/N[/N[...]]], а условия - &N[/N[/N[...]]], где N - число, зависящее от типа применяемой команды. Для использования условий специально зарезервировано 1000 переменных, которые могут принимать значения «Правда» и «Ложь» и называются флагами. Если в условии нужно чтобы определенный флаг был «Правдой», то просто указывается его номер, если же нужен противоположный результат, то перед номером флага ставится знак минус. Рассмотрим небольшой пример: попробуем создать магическую гору, которую сможет посетить герой. При посещение такой горы герой получит некоторое количество очков магии, которое будет определяться как знания героя умноженные на 40, за что у героя будут забираться все оставшиеся очки хода. Сразу отмечу, что для наших экспериментов нужна 3.56 версия WoG-а или выше.

1. Итак, запускаем редактор карт, создаем в нем небольшой участок местности, размещаем на ней героя и любую гору из имеющихся. Например, участок горы, который будет доступным для посещения героем будет иметь координаты x=10, y=12, уровень=0 (поверхность, для подземелья уровень=1)

2. Создаем временное событие, для чего нажимаем «Ctrl+Enter» и выбираем закладку «События»/«Timed Event». Создаем новое событие, ставим день события равным 672 (чтобы наш скрипт на выводился на экран, как простое текстовое сообщение) и назовем его "Магическая скала". Первой строчкой в тексте скрипта всегда пишется ZVSE.

3. Используем инструкцию, чтобы сделать участок горы возможным для посещения: !#TR10/12/0:P1; и еще одну инструкцию !#TR10/12/0:E0;, которая нужна, чтобы закрепить за выбранным участком горы «желтый» генератор. «Желтый» генератор нужен чтобы отличить простой участок территории от территории, занятой объектом. Также наделим скалу свойствами другого объекта, например, магического колодца !#OB10/12/0:T49; (в данном случае 49 - тип объекта, магический колодец). Теперь, чтобы гора у нас не стала обычным колодцем, нужно отключить его обычные свойства !#OB10/12/0:S;.

4. Чтобы при наведении на скалу указателя мыши и нажатия правой кнопки выводился текст "Магическая скала", нужна еще одна инструкция: !#VRz1:S^Магическая скала^; [нужный текст мы присвоим переменной z1] !#OB10/12/0:H1; [теперь по правому клику на скале будем видеть значение z1]

5. Теперь запишем генератор, срабатывающий при посещении участка нашей горы: !?OB10/12/0;

6. Если генератор сработает, то покажем сообщение: !!IF:M^При подходе к горе вы чувствуете прилив магической силы^;

7. И, наконец, даем герою очки магии: !!HE-1:Fd0/d0/d0/?v1; [запишем знания героя в переменную v1], !!VRv1:*40; [умножим v1 на 40], !!HE-1:Iv1; [даем очки магии], !!IF:Q1/35/v1/1^^; [показываем картинку с добавленным количеством очков магии].

8. Забираем у героя все очки хода: !!HE-1:W0;

Все, скрипт готов, он будет выглядеть так:

ZVSE

!#TR10/12/0:P1;

!#TR10/12/0:E0;

!#OB10/12/0:T49;

!#OB10/12/0:S;

!#VRz1:S^Магическая скала ^;

!#OB10/12/0:H1;

!?OB10/12/0;

!!IF:M^ При подходе к горе вы чувствуете прилив магической силы^;

!!HE-1:Fd0/d0/d0/?v1;

!!VRv1:*40;

!!HE-1:Iv1;

!!IF:Q1/35/v1/1^^;

!!HE-1:W0;

Можно сохранять карту и тестировать ее в игре.

Генераторы

Когда игрок активирует определенный генератор, появляется возможность активировать один или более приемников. Признаком завершения блока приемников после генератора служит любой другой генератор. Генератор вызывается без параметров и может содержать только условия, например: !?BA0&v10=51; (сработает, если переменная v10 равна 51). Вот список всех генераторов:

!?AE - генератор, срабатывающий при одевании/снятии артефакта

!?BA - контролирует процесс боя

!?BF - контролирует поле боя

!?BG - тип действия на любую группу монстров

!?BR - начало хода

!?CM - нажатие правой кнопки мыши

!?CO - для командиров

!?FU - функция

!?GE - глобальное событие

!?HE - когда герой атакует

!?HL - герой получает следующий уровень

!?HM - срабатывает перед началом движения героя

!?IP - для поддержки мультиплэйерной игры

!?LE - локальное событие

!?OB - посещение объекта

!?TM - таймер

!?MW - гуляющие монстры

(Прим.: в процессе развития ERM-а появляются новые генераторы).

Приемники

Рассмотрим подробнее приемники. В отличии от генераторов, приемники имеют вторую часть, которая располагается на знаком «:». В этой части записываются команды и параметры определенного объекты, причем значения можно не только задавать, но и считывать. Приведу пример: !!LE12/21/0:E1000; - здесь используется локальное событие (синий шарик с надписью «Event» на карте) с координатами х=2, у=21, l=0. Теперь при проходе героем этой точки на карте, он получит 1000 очков опыта. Иногда бывают случаи, когда нужно просто прибавить или отнять некоторое количество опыта у героя, тогда можно, чтоб не привязываться к локальному событию, и, соответственно к координатам на карте, использовать приставку «d»: !!HE-1:Ed1000;, где -1 будет означать, что давать опят мы будем герою, активировавшему генератор. Чтобы забрать очки опыта перед их значением ставим «-». Попутно скажу, что есть еще одна приставка «с», которая используется для работы с номером текущего дня. Например, если с=8, то это равносильно первому месяцу, второй неделе и первому дню, 30 - второй месяц, первая неделя, второй день. Также допускаются комбинации «cd» и «dc». Приемники, как и все остальные команды имеют параметры, причем есть особенность - если для определенного приемника нужно 4 параметра, то задавать обязательно все 4. Параметры разделяются символом «/» и могут быть пустыми, что позволяет их явно не указывать, например: !!IF:D1/5//4////////////;. В приведенном примере заданы только 3 параметра из 16 возможных, остальные же будут принимать значения по умолчанию - 0. Существуют также составные параметры, которые записываются после вызова приемника. Такие параметры никак друг от друга не отделяются и не поддерживаются некоторыми командами, в частности, командой-приемником VR, которая служит для работы с переменными. Если команда должна выводить какой-нибудь текст к диалогу, то такой текст помещают между символами «^», в случае составных параметров текст помещают после всех остальных параметров: !!LE10/12/0:E1000M^Любой текст^;. В готовый ERM-скрипт можно добавлять комментарии к командам. Комментарием будет считаться все, что находится между точкой с запятой одной команды и началом другой команды. Например, в записи !?LE10/23/1; Локальное событие в позиции x=10, y=23, уровень=подземелье все, что выделено синим будет восприниматься как комментарий и никакого влияния на работу скрипта не окажет. В приемниках можно использовать переменные, как в заголовке, так и в качестве параметров. Переменные бывают разных типов (численные, строковые, булевы и другие) и использовать их можно двумя методами - прямым и косвенным. В первом случае мы явно задаем переменную (или несколько переменных) соответствующего типа и указываем какой переменной что присвоить, во втором варианте мы указываем лишь одну переменную, а, в случае необходимости сохранения, скажем, трех значений, последующие будут записаны в следующие переменные, тоесть, если начальной переменной была переменная v1, то последующими двумя будут считаться переменные v2 и v3. Приемников существует очень много (около шести десятков), поэтому перечислять их все нет смысла, скажу лишь, что они охватывают все видимые объекты игровой карты и позволяют добраться до настроек практически любых игровых параметров.

Инструкции

Фактически они ничем не отличаются от приемников, единственное (что вы уже наверняка знаете), перед инструкцией пишется !#, а не !!, как в приемнике. Также, инструкции вызываются и используются в самой игре только один раз - когда непосредственно начинается сама игра (загружается карта). Пользовать инструкция удобно для предустановки различных параметров объектов, которые не могут быть установлены привычным способом в редакторе карт.

Флаги

Флаги и переменные составляют основу всех возможностей ERM-а и позволяют сделать обычную игру более динамичной и гибкой, в зависимости от выбора условий игры человеком. Это совсем не означает, что нельзя писать скрипты без использования флагов или переменных. Можно, иногда даже нужно. Просто с их использованием скрипт, как правило, становится более универсальным, и некоторые команды требуют их использования. Флаги принимают только два значения - 0 «Ложь» и 1 «Правда», поэтому их еще называют условными флагами. При инициализации, тоесть когда флагу явно не присваивается какое-либо из этих двух значений, но сам флаг описывается в тексте скрипта, ему присваивается значение «по умолчанию» - «Ложь». Всего ERM-ом поддерживается 1000 условных флагов, значения которым присваиваются при помощи !!IF-приемника и его V-команды. Например, присвоим 4-му флагу значение «Правда»: !!IF:V4/1;. Как вы уже наверное поняли, флаги используются для построения логических цепочек, и, как следствие - выполнения тех или иных команд. Например, вы хотите, чтобы при первом посещении героем определенного объекта на карте выводилось на экран сообщение, а при последующих посещениях этого сообщения уже не было бы. Используем, скажем, 5-й флаг, если его значение = 0 («Ложь»), то выводим сообщение, после чего присвоим ему 1. На языке ERM это будет выглядеть так:

ZVSE

!?OB10/14/0; [посещает ли герой объект с координатами x=10, y=15, l=поверхность]

!!IF&-5:M^Здравствуй. Я тебя ждал.^; [выводим сообщение, если 5-й флаг=0]

!!IF:V5/1; [устанавливаем 5-й флаг в 1]

Как видно из примера, для проверки значения флага в условии используется амперсанд «&», который выполняет роль логического «И». Если необходимо проверить несколько значений разных флагов или условий, то они записываются один за другим через разделитель «/». Флаги, имеющие номера от 501 до 1000 сохраняют свои значения, когда игрок начинает новую карту, что может стать весьма полезным при создании кампаний. Также есть три специальных флага: флаг №1 используется некоторыми командами для вывода результата их выполнения или для проверки значения выражения, поэтому не рекомендуется напрямую пользоваться этим зарезервированным флагом. Флаг №999 также особенный, он равен 1, если при срабатывании генератора игрок находится за данным компьютером и 0, если игрок находится за удаленным компьютером. Для компьютерного игрока (AI) флаг 999 всегда равен 0. И последний - это флаг №1000, который устанавливается в 1, если человек-игрок посещает какой-либо объект или срабатывает один из генераторов - таймер или получение героем нового уровня. При выполнении вышеперечисленных условий компьютером-игроком флаг №1000 устанавливается в 0. Для отображения значений флагов в сообщениях используется параметр %F с последующим указанием номера флага. Например: !!IF:M^Значение флага №4 %F4.^;.

Переменные

В отличие от флагов, переменным можно присваивать различные значения, не только «Правда» и «Ложь». В большинстве случаев это числовое значение, хотя переменной можно присвоить и строковое значение. Все числовые переменные (целочисельные) могут принимать значения из диапазона -2147483647...2147483647. Остальные переменные используются для:

c - хранится текущий номер дня;

d - для прибавления или вычитания чисел к/из переменных;

e1...e100 переменные для функций с плавающей запятой;

f...t стандартные переменные («горячие» переменные);

v1...v10000 стандартные переменные;

w1...w100 переменные героя (уникальные для каждого);

x1...x16 параметры для функций (значения, передаваемые в функцию);

y1...y100 внутренние переменные для функций (разные для разных функций);

z1...z1000 строковые переменные;

z-1...z-10 строковые переменные для функций (разные - для разных).

Существует два основных метода записи значений в переменные:

1. Можно использовать приемник VR для присвоения определенного значения любой переменной, а также для выполнения элементарных арифметических операций - сложения, вычитания, умножения и деления. Например, для записи числа 17 в переменную v5 нужно записать !!VRv5:S17;

2. Также можно установить значения переменных, читая свойства объекта или настроек игры, например, номер героя, количество золота у игрока, тип или подтип объекта и т.д. Для того, чтобы записать определенное значение в переменную, перед ее именем ставится ?, например, для записи типа объекта (целое число) с координатами х=10, у=20, l=0 в переменную n, нужно написать: !!OB10/20/0:T?n;. Или !!OW:R4/1/?v10; - в переменную v10 запишется количество ресурса «Ртуть» (тип = 1) у оранжевого (тип = 4) игрока.

Как и в случае с флагами, значения переменных можно использовать для проверки определенных условий при выполнении генераторов или приемников. Для проверки нужного условия между переменной и ее возможным значением (или другой переменной такого же типа) ставится одно из условий: =, >, <, <>, >=, или <=, смысл которых очевиден. Например: !!IF&v5>=100:M^Время пришло!^; или для строковых переменных !!IF&z3=z4:M^Вы тот, кого мы ищем.^;. Если необходима проверка нескольких условий, то используется разделитель «/». Хочется заметить, что можно комбинировать условия на основе флагов и переменных, например: !!HE-1&3/v4>7/-8/y2=v1:A21; - флаг 3 должен быть «ПРАВДА», значение переменной v4 должно быть более 7, флаг 8 должен иметь значение «ЛОЖЬ», и значение переменной у2 должно быть равным значению переменной v1, только при выполнении всех этих условий текущий герой (-1 - активировавший генератор) получит «Шлем Хаоса» (21-й номер артефакта). При проверке условий, можно пользоваться логической операцией «ИЛИ», которая в выражении обозначается знаком «|» (Shift+"\"). Общий синтаксис таков: !(!|?|#)XX&c1/c2/c3|c4/c5/c6:...;, где с1/c2/c3, c4, c5 и c6 - блоки условий, причем для выполнения команды справедливыми могут быть (с1/c2/c3) одновременно или одно из с4, c5 или c6. Оператор «ИЛИ» можно использовать в выражении только один раз и только после оператора «И», также допускается использовать до 16 условий до и после оператора «ИЛИ». Среди переменных есть специальные зарезервированные переменные: v1 обычно используется некоторыми командами для сохранения результата их работы. Все же Вы можете использовать эту переменную для своих целей, правда хранить в ней какое-либо значение продолжительное время не рекомендуется, так как оно может само по себе измениться. Переменная z1 используется для хранения текстовой информации, которую вводит игрок с клавиатуры в диалоговом окне. Если диалоговые окна не используются в скрипте, то переменной z1 можно пользоваться на свое усмотрение. Переменные v998, v999, и v1000 всегда хранят координаты объекта или локального события, которое в данный момент посещает герой. Параметр для функций x16 содержит количество вызовов функции. Как и флагам, переменным в начале игры присваиваются начальные значения - 0 (для численных) и "" (для текстовых). В начале игры обнуляются такие переменные: f...t, v1...v500, v1001-v10000, z1...z300, z501-z1000, w1-w50, остальные (v501-v1000, z301-z500, w51-w100) не обнуляются и их значения могут быть использованы для переходов между картами в кампаниях. Значения переменных можно выводить на экран в диалоговых окнах. Синтаксис отображения значения переменной такой: %[тип переменной (V, W, X, Y, Z)][номер переменной]. Например: !!IF:M^Извините, %Z10, но у Вас только %Vj золота, Вам нужно еще %V2 золота, чтобы купить этот артефакт.^;. Предположим, что в переменной Z10 хранится имя героя, (например, «Сэр Мюллих»), j - количество золота у игрока-владельца героя (например 1000), V2 - разница между стоимостью артефакта и j (например 5000). В результате в диалоговом окне мы получим текст: «Извините, Сэр Мюллих, но у Вас только 1000 золота, Вам нужно еще 5000 золота, чтобы купить этот артефакт». У переменной может быть также макро-имя, тогда для работы с ее значением записываем %$MacroName1$, где MacroName1будет являться макро-именем переменной. Макро-имя переменной присваивается при помощи MC-приемника.Несколько советов по использованию переменных:

1. Старайтесь использовать переменные, номера которых образуют последовательности, например V50…V80;

2. «Горячие» переменные используйте только для хранения временных значений, не требующихся в течении всей игры;

3. По возможности используйте локальные у-переменные для функций, не привязываясь тем самым к глобальным переменным.

Создание собственных объектов

Давайте рассмотрим конкретный пример создания собственного объекта на карте, с присущими только ему, нестандартными свойствами. Новый редактор карт содержит множество новых объектов, правда все они являются «пустыми», тоесть в редакторе нет никакой возможности настроить их свойства, и при посещении такого объекта на карте героем ничего не будет происходить, если, конечно, предварительно не придать объекту свойства ERM-скриптом. Итак, для начала, запустим редактор карт и создадим в нем наш объект и героя. Назовем наш объект «Хижина кочевника» и дадим ей такие свойства: если при посещении ее героем у него будет магия воздуха, то он получит в награду артефакт «Подзорная труба», причем, если хотя бы один герой получил трубу, то всем остальным ее уже не дадут. На ERM все будет выглядеть так:

ZVSE

!#VRz31:S^Хижина кочевника^; переменной z31 присвоим название объекта

!#OB9/6/0:T26; объекту присвоим тип 26 (локальное событие)

!#OB9/6/0:Hz31; при нажатии правой кнопки мыши на объекте увидим значение z31

!#VRv10:C0; переменной v10 присвоим значение 0

!?OB9/6/0; посещает ли герой наш объект?

!!HE-1:S15/?i; есть ли у героя магия воздуха (тип 15), ее уровень запишем в переменную i

!!IF&i=0:M^У тебя нету магии воздуха. Возвращайся когда будет.^; если i=0 (нет магии воздуха), то выдаем соответствующее сообщение

!!IF&i>0/v10=0:Q1000/8/53/1^Ну наконец-то, ты знаешь магию воздуха. Держи вот эту трубу.^; если у героя есть магия воздуха (i>0) и значение v10=0, то покажем диалог с картинкой типа 8 (артефакт) и подтип картинки 53 (подзорная труба)

!!HE-1&i>0/v10=0:A53; при выполнении тех же условий даем герою трубу (тип 53)

!!IF&i>0/v10=1:M^Я уже отдал трубу.^; если v10=1, значит мы уже отдали трубу

!!VRv10&i>0:C1; если у героя есть магия воздуха, то переменной v10 присвоим значение 1. Переменная v10 в данном примере использовалась лишь для проверки - отдали мы артефакт или еще нет.

Это довольно простой пример, давайте попробуем создать что-то посложнее. Сначала, как полагается, нужна идея. Предположим, что на карте есть три игрока: красный, синий и коричневый. Вы играете за красного игрока, синий Ваш союзник, а коричневый - противник. Вашего героя зовут Антоха и он принадлежит к «Болотному» замку. Антоха обладает уникальной способностью - умеет улучшать гноллов (существа первого уровня в «Болотном» замке) в трехглавых церберов (причем без утраты морали войск). Так вот, гуляя по своих владениях, Антоха находит Меч-Кладинец и, ощутив его силу, решает завоевать своего союзника, для чего он, вооружившись уникальным мечом, приходит в город союзника и ломает в нем все строения, после чего союзник переходит на сторону врага. Получился прямо-таки целый сценарий, для реализации которого нужно будет написать не один скрипт. Приступаем:

1. Создаем в редакторе карт заготовку к нашему сценарию, имя своему герою и его биографию мы можем задать прямо сейчас, в редакторе, также как и разместить на карте меч (обведен прямоугольником). У Вашего союзника (синего) городов немного больше, но добраться по суше можно только к одному их них. Количество городов и местонахождение коричневого противника нас меньше всего волнует, лишь бы он был подальше и не мешал Антохе (до поры до времени) разбираться с союзником. Костяк готов, теперь нужно добавить пару скриптов, которые и воплотят с жизнь наш сюжет.

2. Чтобы наш Антоха мог улучшать гноллов до церберов нужна всего лишь одна строчка: !#HE117:X6/98/98/47;. Выглядит не очень дружелюбно, не правда ли? Но можно разобраться: во-первых мы используем инструкцию (сочетание !#), чтобы наша команда выполнилась в начале игры, независимо от каких-либо генераторов. Герой должен физически существовать в игре, в нашем случае это Корбак (порядковый номер 117), имя и биографию которого мы уже поменяли. Далее, команда Х6 позволяет герою улучшать существ двух (можно разных) типов в существ одного, третьего типа. У нас два раза записано 98, что, согласно формата существ означает «Гнолл». Команда Х6 устроена так, что улучшаться будут также и сушества с номером на единичку больше заданного. Это обычно бывает удобно, когда нужно улучшать, скажем, и простых, и улучшеных существ одного уровня. 47, как Вы уже догадались - церберы. В итоге, Антоха приобрел нужную специализацию. Все бы хорошо, только есть один момент: церберы и гноллы - существа из разных замков, поэтому, когда они воюют за одну сторону, общая мораль уменьшается на 1. Чтобы этого не произошло, нужна еще одна инструкция, которой мы укажем, что церберы принадлежат именно к «Болотному» замку: !#MA:O47/7; Команда О в !#MA-инструкции имеет два параметра - номер монстра (47 - церберы) и тип замка (7 - «Болотный»).

3. С Антохой пока ясно, теперь нужно обработать наш Меч-Кладинец. В редакторе карт можно посмотреть его координаты на карте рис.13: Х=7, Y=2, L=0 (поверхность), которые нам пригодятся для настройки свойств артефакта. Добавим еще одно событие и назовем его «Меч-Кладинец». Артефакт на карте будем рассматривать как объект. Чтобы присвоить ему нужное название, запишем такие команды:

ZVSE

!#VRz10:S^Меч-Кладинец^; переменной z10 присвоим нужное название

!#OB7/2/0:Hz10; покажем это название при наведении указателя или нажатии правой кнопки мыши на объекте (координаты Х=7, Y=2, L=0)

Теперь наш меч нужно рассмотреть как артефакт в слоте у героя, для чего допишем еше несколько строк в этом же событии:

!#VRz11:S^С помощью этого меча можно разрушить замок союзника^; нужный нам текст

!#UN:A148/9/z10; название артефакта в слоте у героя

!#UN:A148/10/z11; описание артефакта

!#UN:A148/2/4; слот на теле героя (4 - правая рука)

!#UN:A148/3/8; тип артефакта (8 - ценный)

!#UN-инструкция с командой А имеет три параметра: номер артефакта, тип информации и ее значение. В данном случае 148 означает артефакт с оригинальным названием «Sword of Sharpness».

4. Теперь осталось только узнать, когда Антоха попадет в замок союзника (замок с координатами Х=39, Y=11, L=0), и, если в руке у него будет Меч-Кладинец, то замок разрушится и синий перейдет на сторону коричневого. Для этого создаем еще одно событие с таким текстом, назвав его «Замок союзника»:

ZVSE

!?OB39/11/0; сработает, когда наш герой посетит замок союзника с заданными координатами

!!HE-1:A2/148/?v10/?v11; если сработал генератор, то в v10 запишем количество артефактов 148 типа (наш Меч-Кладинец), а в v11 - количество одетых артефактов этого же типа. Реально нужно, чтобы узнать, взял ли и одел ли герой нужный артефакт

!!IF&v10=1/v11=1/v12<>5:M^Используя силу меча Вы зверски ломаете все здания в этом городе.^; если у Антохи есть Меч и он держит его в правой руке, то покажем сообщение

!!DO1/30/43/1&v10=1/v11=1/v12<>5:P44; выполнение функции в цикле. Заголовок оператора цикла !!DO имеет 4 параметра: первый - номер вызываемой функции, в данном случае 1, второй и третий - начальное и конечное значения аргумента цикла, разница между которыми определяет количество вызовов функции, четвертый - шаг цикла. Команда «Р» позволяет передавать начальное значение аргумента функции, в нашем случае это 44.

!!IF&v10=1/v11=1/v12<>5:M^Твой союзник объединился с твоим противником!^; еще одно сообщение

!!OW&v10=1/v11=1/v12<>5:T1/1; синего игрока (1) сделать участником команды 1 (Ваша команда имеет номер 0)

!!VRv12&v10=1/v11=1:S5; после того, как выполнены все команды, переменной v12 присвоим любое значение, например 5, чтобы потом знать, что все команды уже выполнялись

!?FU1; начало описания функции с номером 1

!!VRx1:-1; первый аргумент, передаваемый в функцию (х1) уменьшаем на 1

!!CA39/11/0:B2/x1; ламаем здание с номером 44-1=43 (улучшенное строение 7-го уровня)

!!CA39/11/0:B5/x1; запрещаем его постройку

Таким образом функция FU1 сломает и запретит постройку всех строений с номерами от 43 до 30 включительно. Все, сюжет готов, теперь его можно опробовать на работоспособность. Естественно, он не лишен недостатков, так как хороший рабочий скрипт, реализующий оригинальную идею обычно тянет на пару десятков килобайт, но все же для начала сгодится. Конечно, скрипт на ERM не изобилует наглядностью и простотой понимания и поэтому при его написании лучше иметь под рукой удобно организованную справочную систему по ERM-у (благо, разработчики на этом не экономили и вместе с обновлением игры распространяется html-help, правда, только на английском языкеJ). Возможно для продуктивного написания готовых скриптов нужен некий опыт программирования на языках низкого уровня, мне, например, сгодилось кое-какое знание ассемблера. Что-то меня отнесло от темы, продолжаем разговор.

Диалоговые окна

Одним из наиболее используемых приемников является приемник !!IF или, как его обычно называют, «Диалоговые окна» (ДО в дальнейшем). ДО используются всякий раз, когда нужно показать сообщение на экране, задать игроку вопрос, продемонстрировать картинку или анимацию, попросить игрока выбрать между различными опциями или ввести информацию с клавиатуры (например, имя или ответ на загадку). Существует два основных типа ДО, которые могут применяться в ЕRМ. Первый - это стандартное ДО (СДО), которое вы могли видеть в обычных "Героях". Второй - это расширенное ДО (РДО), которое можно использовать для демонстрации внешних картинок и анимационных файлов, принимающее ввод с клавиатуры, дающее возможность работать с другими ДО. Какой из этих видов использовать - зависит от типа информации, которую вы хотите показать. Оба типа можно использовать как для вывода на экран информации, так и применять для демонстрации сообщений и картинок, просить пользователя ввести один ответ или другой, которые могут быть настолько просты, как выбор между нажатием кнопок "ОК" или "Отмена". СДО проще в использовании, чем РДО, требующее дополнительной команды или нескольких для установки параметров. Для СДО используются только две команды: M, которая выводит на экран обычное сообщение и Q, которая позволяет задавать вопросы типа «Да/Нет». Пример СДО с использованием команды M показан на рис.5, а на рис. 6, 7 и 8 - с использованием команды Q. Рассмотрим подробнее возможности РДО:

1. Отображение картинок - допускаются BMP, GIF и JPG-форматы, размером до 100x100 пикселей. Если картинка меньше, чем 100х100 пикселей, то она будет автоматически расположена по центру в свободном пространстве. Если картинка больше по размерам, чем 100х100, то будет отображена только ее часть 100х100 пикселей, начиная с левого верхнего угла. Для BMP-формата цвет верхнего левого пикселя будет считаться цветом фона и на экране будет прозрачным, что дает возможность отображать произвольные объекты, не меняя фона. Обратите внимание, что под «картинками» подразумеваются изображения во внешних файлах, а не стандартные, которые можно было показывать в СДО.

2. Воспроизведение анимации AVI-формата, причем несжатой различными кодеками, типа DivX4 и т.п. Ограничения те же, что и на картинки - размер 100х100.

3. Диалог с выбором одного из четырех (или менее) вариантов и/или полем для ввода текста.

4. Диалог с выбором одного или более свойств.

Стандартные скрипты

Как я уже раньше говорил, существует целый набор уже готовых ЕRМ-скриптов, включать/выключать которые можно перед началом игры. Этими скриптами задаются параметры и правила игры. Менять можно не только рандомно создаваемые карты и написанные с использованием нового редактора карт, но и уже те, что входят в стандартный набор карт обычных HMM III. Давайте рассмотрим подробнее уже готовые скрипты (чтобы заново не изобретать велосипедJ), ведь Вас никто не ограничивает в их использовании в своих сценариях. Все стандартные скрипты находятся в папке DATA\S, которая находится в папке с установленной игрой. Файлы скриптов имеют называния типа scriptХХ.erm, где ХХ - номер скрипта. В дальнейшем будем различать все скрипты только по номерам. Также в этой папке находятся ERT-файлы, в которых обычно содержатся текстовые сообщения, используемые в скриптах. Сделано это только ради удобства, чтобы не загромождать сам скрипт текстом. Итак, 01-й скрипт называется «Правила игры» и используется практически на всех картах. С его помощью можно выбрать (один раз для всех карт или каждый раз при старте новой карты) такие правила:

1. Все летающие монстры не летают, но им не отвечают на атаки.

2. Инвертированная скорость монстров (быстрые стают медленными, а медленные - быстрыми).

3. Монстры стоят наполовину дешевле на 7-м дне недели.

4. Герои создают равнины магов вокруг себя в начале каждого нового дня.

5. Все монстры атакуют дважды.

6. Армия героя прирастает на 4% в день, если количество монстров в одном стеке не превышает 10000.

7. В большинстве внешних жилищ можно дополнительно купить кабанов.

8. Герои вступают в игру на 5-ом уровне опыта.

9. Герои поднимают все артефакты парами.

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

11. Герои имеют двойной запас хода.

12. Шахты меняют производимые ресурсы на случайные один раз в неделю.

13. «Одноразовые» объекты становятся доступными в начале нового месяца (различные повышалки, например, +1 к атаке героя).

14. Герои могут учить 10 вторичных навыков, вместо 8.

15. Все улучшенные существа героя 7-го уровня в начале следующего дня улучшаются до монстров 8-го уровня.

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

17. Воры периодически случайным образом нападают на армию героя.

18. Все монстры атакуют на две клетки.

19. Стрелки не стреляют, но их жизнь возрастает на 50%.

20. Во всех городах с самого начала игры построен Грааль (что, правда, не относится к элементальному замку, Грааль в котором в начале игры стал бы невообразимым бонусом).

Остальные скрипты влияют на свойства артефактов, делая практически ненужные из них особо ценными и, даже, незаменимыми, также некоторых дополнительных возможностей приобрели вторичные умения героя, например, экспертная «Обучаемость» героя теперь дает ему 300 очков опыта каждый день. Отдельного внимания заслуживают оборонительные башни замка, которые теперь могут учиться обороне и, при проведении нескольких удачных оборон, наносимый ими ущерб осаждающим резко возрастает. Также, много стандартных скриптов привязаны к новым объектам, наделяя их различными свойствами, или меняя свойства уже привычных объектов. Например, колодец всегда использовался для пополнения манны, а теперь в нем еще можно остановиться и порыбачить, выловив какое-то сокровище (или агрессивных монстров), а можно просто туда упасть и вывалиться из такого же колодца, только в другой части карты. Прекрасной доработкой являются «Живые свитки» с магией, которая с шансом 20% может сама сколдоваться без участия героя и траты его волшебной манны. Собрав, скажем, 5 «живых свитков» с боевой магией Вы тем самым будете каждый ход на поле боя колдовать на противника какое-либо их них. Вместе с новыми монстрами и артефактами появился и новый собираемый ресурс - мифрил, который наделен разными волшебными свойствами, такими как удвоение ресурсов шахт, изменение типов местностей и т.д. Армией героя на поле боя теперь заправляет командир - совершенно новый тип существа, который может учиться, как и герой, но приобретая при этом совершенно другие навыки и возможности. Ради интереса скажу, что командир 40 уровня и выше самостоятельно может расправиться с сотней-другой самых сильных монстров. Среди позитивных доработок также и устранение многочисленных «багов» старых версий игры, например теперь на торговце артефактами нельзя сплавлять свитки по цене комплекта, ровно как и нельзя пользоваться чит-кодами. Все перечисленные возможности и настройки опциональны, тоесть Вам самим решать, какими из них пользоваться, а какими нет. Скажу только, что тут перегибать палку не стоит. Обычно достаточно использовать 4-5 скриптов из стандартного набора, поскольку при включении большего их количества скорость игры может заметно понизиться, а при включении всех скриптов можно даже слегка озадачить самые «горячие» процессоры.

И напоследок…Для написания текста скрипта подойдет любой текстовый редактор, даже встроенного в редактор карт вполне достаточно. Как вариант, можно пользоваться специальной разработкой - ERM Scripter-ом, который обладает удобным интерфейсом и позволяет реализовывать некоторые дополнительные возможности при написании скриптов. Более подробно прочитать о всех генераторах, приемниках, инструкциях, функциях и используемых в них переменных можно в HTML-помощи, которая распространяется вместе с WoG-дистрибутивом.
Hosted by uCoz