Здесь будут разбираться разные скрипты (сложные и не очень) и объясняться сам процесс ЕРМ'ирования с самого начало и со всеми деталями и подробностями. Soul Reaver у нас назначается главным по обучению новичков

Таааккссс... Поработаю на благо настоящих героев. Что бы такое бы написать интересное?? Щас, полазию по своим картам, может чё-нить вспомню... Ничё интересного... Ну ладно, давайте например, создадим из пустого артефакта номер 168 (такая кожаная бронька из Диабло 2), к примеру, плащ глины. А лучше плащ в глине

А то грязный он какой-то... Будет, например, приносить носящему герою по 13 земляных элементалей в неделю, прибавлять ко всем первичным параметрам по 3, давать герою экспертную магию земли и защищать всё войско героя заклинанием Защита от земли. Предупреждаю сразу, скрипт не для новичков, а так, для более менее среднего уровня. Для самых новеньких в ЕРМ должен писать Soul Reaver. Следующим постом посмотрим

И так, приступим:
ZVSE
(Ну как вы должны знать, без этого не обходится ни один скрипт)Настройки самого артефакта!#VRz10:S^Плащ из глины^;
(Запомним в переменную z10 название артефакта)!#VRz11:S^Приносит герою по 13 земляных элементалей в неделю, прибавляет ко всем первичным параметрам по 3, даёт герою экспертную магию земли и защищает всё его войско заклинанием Защита от земли.^;
(Запомним в переменную z11 описние плаща)!#UN:A168/1/5000;
(Даём нашему артефакту цену 5000 золотых)!#UN:A168/3/16;
(Ценность нашего плаща. Он у нас реликт. Это 16)!#UN:A168/9/10;
(Присвоим нашему плащу название, запомненное в z10)!#UN:A168/10/11;
(Присвоим нашему плащу описание, запомненное в z11)Установка прибавления земляных элементалей!#VRv20:S13*65536+113;
(Дадим заранее перенной v20 такое значение. Если вставить его в окно !!IF:Q под подтип картинки, то у нас под картинкой будет написано не просто элементали земли, а будет указано их точное колличество. 13.)!#TM10:S1/999/7/255;
(Сперва создадим таймер. Пронумеруем его 10-тым номером. 1 - это день первого появления, 999 - последнего, 7 - это интервал появлений (т.е. неделя), 255 - значит, что появляется для игроков каждого цвета.)!?TM10;
(Всё что будет написано дальше - это условия, выполняющиеся после пояления нашего таймера.)!!OW:I-1/?v10;
(Проверяем, игрок текущего цвета AI или человек. Если v10=0, значит человек. Если v10=1, то компьютер.)!!VRv11:S0;
(Ставим переменной v10 значение 0. Позже объясню зачем.)!!DO10/0/155/1&v10=0:P;
(Если текущий игок - человек, а не ИИ, то запускаем функцию номер 10. Приёмник !!DO отличается от !!FU тем, что одну и ту же функцию выполняет несколько раз подряд. Мы поставили 155. Именно столько в игре существует героев.)!?FU10;
(Так, теперь сама эта функция 10. Которая повторится 155 раз.)!!HEv11:A2/168/d/?v12;
(Проверяем, надет ли плащ у героя под номером v11 (v11 изначально мы установили на 0). Если v12=1, то надет.)!!HEv11&v12=1:С2/113/13/0;
(Если плащ одет, то даём этому герою 13 элементалей. 113 - это номер земляных элементалей.)!!HEv11&v12=1:O?v13;
(Теперь узнаем, какому цвету принадлежит герой, получивший войско.)!!OW&v12=1:Iv13/?v14;
(Определяем полученный цвет на AI или игрока.)!!HEv11&v12=1/v14=0:B0/?z10;
(Если игрок, который получил элементалей, человек, а не ИИ, то определяем его имя.)!!IF&v12=1/v14=0:Q1/21/v20/1^К герою по имени %Z10 присоединяются земляные элементали благодаря плащу из глины.^;
(Сообщение с текстом и картинкой элементалей. Выводится только если героем, которому даются существа, владеет игрок, а не компьютер. Вместо "%Z10" будет отображаться имя героя, которое мы узнали чуть раньше.)!!VRv11:Sd1;
(После всего этого в любом случае увеличиваем переменную v11 на 1, чтобы при следующем повторе функции проверялся уже герой не под номером 0, а следующий по списку. И так все 155 героев.)Прибавление к параметрам первичных навыков(Здесь вообще всё просто.)!?AE1&v998=168;
(Триггер на одевание артефакта номер 168 (наш плащ).)!!HE-1:Fd3/d3/d3/d3;
(Когда герой его одевает - получает по три ко всем параметрам.)!?AE0&v998=168;
(Триггер на снятие артефакта номер 168 (наш плащ).)!!HE-1:Fd-3/d-3/d-3/d-3;
(Когда герой его снимает - теряет по три ко всем параметрам.)Экспертная магия земли.!?AE1&v998=168;
(Триггер на одевание артефакта номер 168 (наш плащ).)!!HE-1:S17/?v21;
(Запоминаем наличие у героя навыка магии земли до артефакта (v21=0 - нет навыка, v21=1 - базовый, v21=2 - продвинутый, v21=3 - эксперт)!!HE-1:S17/3;
(В любом случае даём герою эксперт земли.Если был базовый или продвинутый уровень, то он заменяется на экспертный.)!?AE0&v998=168;
(Триггер на снятие артефакта номер 168 (наш плащ).)!!HE-1:S17/v21;
(При снятии плаща возвращаем ему его старое значение навыка земли.)Защита от земли во время боя.!?BA0;
(Триггер на начало битвы.)!!BA:H0/?v30;
(Определяем номер героя-нападающего (слева).)!!BA:H1/?v31;
(Определяем номер героя-защищающегося (справа).)!!HEv30&v30<>-2:A2/168/d/?v32;
(Если герой слева присутствует (v30<>-2), то проверяем у него наличие плаща.)!!HEv31&v31<>-2:A2/168/d/?v33;
(Если герой справа присутствует (v31<>-2), то проверяем у него наличие плаща.)!!VRv25&v30<>-2/v32=1:S0;
(Если плащ надет у левого героя, ставим v25 на 0.)!!DO23/0/20/1&v30<>-2/v32=1:P;
(Если плащ надет, запускаем функцию 23 на 20 раз.)!!VRv25&v31<>-2/v33=1:S21;
(Если плащ надет у правого героя, ставим v25 на 21.)!!DO23/0/20/1&v31<>-2/v33=1:P;
(Если плащ надет, запускаем функцию 23 на 20 раз.)!?FU23;
(Функция 23.)!!BMv25:M33/99/3;
(Ставим монстру v25 (если он есть) заклинание защита от земли экспертного уровня на 99 раундов.)!!VRv25:Sd1;
(Увеличиваем переменную v25 на один, чтобы при следующем обороте наложить заклинание уже на следующего монстра. Заметьте, что у правого и у левого героя переменная v25 будет принимать разные значения.)Вот как будет выглядеть рабочий скрипт:
Код
ZVSE
!#VRz10:S^Плащ из глины^;
!#VRz11:S^Приносит герою по 13 земляных элементалей в неделю, прибавляет ко всем первичным параметрам по 3, даёт герою экспертную магию земли и защищает всё его войско заклинанием Защита от земли.^;
!#UN:A168/1/5000;
!#UN:A168/3/16;
!#UN:A168/9/10;
!#UN:A168/10/11;
!#VRv20:S13*65536+113;
!#TM10:S1/999/7/255;
!?TM10;
!!OW:I-1/?v10;
!!VRv11:S0;
!!DO10/0/155/1&v10=0:P;
!?FU10;
!!HEv11:A2/168/d/?v12;
!!HEv11&v12=1:С2/113/13/0;
!!HEv11&v12=1:O?v13;
!!OW&v12=1:Iv13/?v14;
!!HEv11&v12=1/v14=0:B0/?z10;
!!IF&v12=1/v14=0:Q1/21/v20/1^К герою по имени %Z10 присоединяются земляные элементали благодаря плащу из глины.^;
!!VRv11:Sd1;
!?AE1&v998=168;
!!HE-1:Fd3/d3/d3/d3;
!?AE0&v998=168;
!!HE-1:Fd-3/d-3/d-3/d-3;
!?AE1&v998=168;
!!HE-1:S17/?v21;
!!HE-1:S17/3;
!?AE0&v998=168;
!!HE-1:S17/v21;
!?BA0;
!!BA:H0/?v30;
!!BA:H1/?v31;
!!HEv30&v30<>-2:A2/168/d/?v32;
!!HEv31&v31<>-2:A2/168/d/?v33;
!!VRv25&v30<>-2/v32=1:S0;
!!DO23/0/20/1&v30<>-2/v32=1:P;
!!VRv25&v31<>-2/v33=1:S21;
!!DO23/0/20/1&v31<>-2/v33=1:P;
!?FU23;
!!BMv25:M33/99/3;
!!VRv25:Sd1;
Вот, вроде всё
Вообще кому интересно, могут зайти
сюда. Здесь (на форуме WST

) есть эти же скрипты и плюс ещё другие всякие-разные. В общем, там их побольше. Для всех уровней.
Soul Reaver
04 Jun 2006, 09:57
Здесь же будем выкладывать простенькие и не очень скрипты. По этой статье мы напишем простенький, но достаточно нужный скрипт о перемещении. Ну? Начнём?
1)Где писать скрипт? Есть два способа: через редактор скриптов (я им пользоваться не умею так что ничего сказать не могу), и собственно в саму карту. Открываем редактор, и открываем меню Инструменты - Спецификация карты. Выбираем вкладыш событие, и создадим новое (добавить). Вот тут то и пишутся скрипты. Начнём писать наш скрипт. Первым делом выбираем английскую раскладку и пишем:
ZVSE
ZVSE? Это что ещё за ерунда? Это что то типа волшебного слова. Это даёт компу понять что это скрипт а не просто сообщение. Запомните его хорошенько. Без него ни один скрипт не пашет!
Идём дальше… Есть 3 вида команд.
!? – триггер
!! – реактор
!# - инструкция
Разбираем по порядку. Триггер – это условия выполнение команды. Реактор – сама команда. Всегда идёт после триггера. Инструкция – тот же реактор, но может стоять где угодно. Триггер для его использования не требуется. Действует с самого начала игры.
Идём дальше. Для создания нашего скрипта нам нужно условие выполнение команды. То есть телепортация будет выполняться только при выполнении этого условия. Одним из этих условий является посещение объекта. Добавим в наш скрипт это условие.
ZVSE
!?OB5/28/0;
Разбираемся … !? – условие выполнение команды. OB – приёмник объекта. Это значит что условие будет связано с объектом. 5/28/0 – точка расположения объекта где 5 число клеток сверху, а 28 слева. 0 означает то что объект на поверхности, а если было бы не 0 а 1 то под землёй. Точки 5, и 28 должны указывать точно в точку входа в объект. Чтобы узнать количество клеток с верху и с лева взгляните на разметку у вас в редакторе.
; - означает конец этой строчки.
Поставьте любой объект не имеющий свойств в эту точку (или в свою но тогда впишите в скрипт новые координаты объекта вместо старых. Например !?OB1/1/0. Не забудьте сохранить скрипт перед тем как выйти в редактор!
Вот и готово. Это означает то что при посещении объекта в точке 5/28/0 будет выполняться команда.
Пришло время написать саму команду. Пишем:
ZVSE
!?OB5/28/0;
!!IF:Q1^Хотите телепортироваться? ^;
Снова разбираемся. !! – реактор, или команда. IF – приёмник вывода сообщений. :Q1 – сообщение с вариантом «Да», «Нет». ^Хотите телепортироваться?^ - само сообщение. ; -конец строчки. Кстати если прописать так !!IF:^Текст^, то просто появиться сообщение без «да», и «нет».
Что у нас получилось теперь? Это означает то что при посещении объекта в точке 5/28/0 выдать сообщение с двумя вариантами «ДА», и «НЕТ»
Теперь нужно прописать саму телепортацию если ответ «ДА».
ZVSE
!?OB5/28/0;
!!IF:Q1^Хотите телепортироваться? ^;
!!HE-1&1:P48/58/0;
Разбираемся: !! – команда. HE-1 – приёмник героя. То есть команда связана с героем ( а -1 означает текущего героя. Тоесть команда произойдёт с тем героем который подошёл к объекту). &1 – сработает если объект «Да». Если нет то вроде 0 хотя не уверен. :P48/58/0; – Телепортация в точку 48/58/0; Вот и всё!
Что у на получилось? ? Это означает то что при посещении объекта в точке 5/28/0 выдать сообщение с двумя вариантами «ДА», и «НЕТ», и если ответ «да», то телепортировать героя в точку 48/58/0: Поставьте день выполнения события 600 внизу окна и нажмите окей. Зачем 600? Чтобы скрипт не появился в первый же день как простое сообщение с текстом. Не забудьте сохранить карту. Готово. Можете тестить. Если что не ясно пишите. Отвечу. Как видите всё очень просто!
BloodPhoeniX
08 Jun 2006, 11:31
Я здесь вот скрипт доработал по созданию Драколича. Теперь можно улучшать и в экране города и в экране героя. Немного изменил цену и добавил полное описание. Может его тоже разместить?
Только вот не смог настроить его включение и отключение в опциях. Где можно почитать про это?
Есть скрипты вогификации (
scriptNN.erm, лежат в папке
Data\s), которые выполняются, если вы при старте игры вогифицируете карту, а есть скрипты, предназначенные для конкретных карт (если включены оба типа, то скрипт карты выполняется раньше скриптов вогификации).
Подключить скрипт карты можно двумя способами, у каждого из них есть свои плюсы и минусы. Один способ (в тексте глобального события) уже был описан выше
Soul Reaver'ом. В этом случае текст скрипта хранится в карте, а значит, и в созданных на этой карте сейвах. Поэтому если вам после месяца игры встретится критическая ошибка - даже если ее исправить в скрипте, прохождение придется начать заново. Зато в этом варианте игрок может не вдаваться ни в какие тонкости, плюс меньше возможностей для нечестной игры.
Второй способ - создать скрипт в отдельном файле, имя которого должно совпадать с именем карты, расширение "erm", и лежать он тоже должен в папке Maps. Для его написания лучше всего пользоваться редактором скриптов (
erm_s.exe в папке
erm_s).
Блокнот не годится из-за одной маленькой особенности - в текстовых файлах и в скриптах чуть различаются концы строк. Но редактор ничем не хуже Блокнота, наоборот, там есть дополнительные удобства, а интерфейс столь же прост.
Если скрипт хранится во внешнем файле, то его можно изменить, потом загрузить игру, и изменения вступят в силу! Только надо закрыть Героев и запустить их заново.
Что бы я посоветовал исходя из личного опыта? На этапе разработки и отладки мне кажется более удобным второй способ. А вот когда скрипт полностью готов, его можно уже вставить в событие, а erm-файл переименовать или удалить.
Soul Reaver
16 Jun 2006, 15:07
Писал письмо Гудвину. Он просил сделать так чтоб в замке нанимались те существа которых он хочет. Писал письмо а получилась статья. Читайте! Написанно как письмо а не как статья! Сразу извиняюсь за такой ОГРОМНЫЙ пост. Из за таблицы так.
Таблицу обрезал, т.к. ее любой желающий найдет по адресу папки_героев/erm_help
Не знаю как. Я скриптер не такой профессионал как кажется. Но могу сделать так чтоб в жилище (то что на карте), нанимались те существа какие ты хочешь... А в замке вроде тоже можно но мне это никогда небыло нужно. И я в это не влазил. Навсякий случай напишу скрипт чтоб в жилищах нанимались другие существа.
ZVSE
!#DW140/138/0:M0/53/2;
Вот и всё! Одна строчка! Объясняю...
!# - Означает то что строчка будет выполняться с самого начала игры.
DW - инструкция управления жилищем.
140/138/0 - координаты жилища в котором мы хотим установить новых существ для найма.
M0/53/2; - MO (управление монстром, 53(номер монстра который будет наниматься. В данном случаи Эфрит султан.) 2 - (количество эфритов для найма за неделю. В данном случаи 2 штуки). Значит что в жилище 140/138/0 будут наниматься Эфрит султаны по 2 штуки в неделю... Всё. Тут возникает вопрос, а какие номера у других существ? *Ответ: смотри таблицы*
Вот и всё! И ещё. Пока писал письмо разобрался с заменой монстров в замке. Все что ты просил но учти, что если на карте есть другие замки такие-же что и у тебя, то вних будут наниматься те же существа что и в твоём.
ZVSE
!#UN:T0/0/1/172;
Так-же всего одна строчка. Объясняю.
!# - Означает то что строчка будет выполняться с самого начала игры.
UN - Инструкця универсальных команд.
T - Приёмник города (от слова Town).
0 - Номер города (В данном случаи это Замок (люди)).
0 - Уровень жилища в городе.( от 0 до 6. Тоесть 0 - жилище копейщиков. 1 - жилище лучников и. т. п.)
1 - Существо улучшенное или не улучшенное для найма.(0 не улучшенное, 1 улучшенное). Это значит что если улучшить жилище копейщиков, то будут наниматься те монстры которых мы укажем.
172 - Номер существа которое будет наниматься. Таблицу я уже давал. В данном случаи это Кошмары.
Вот таблица городов.
№ Название и комментарии
0 Замок (люди)
1 Оплот (Эльфы)
2 Башня (Маги)
3 Инферно (демоны)
4 Некрополис (нежить)
5 Темница (Подземелье)
6 Цитадель (Орки)
7 Крепость (ящеры)
8 Сопряжение (элементали).
Soul Reaver
16 Jun 2006, 17:36
А откуда ещё? Прикол я бы всё писал это сам? Каждого монстра...
Добавлено ([mergetime]1150468580[/mergetime]):
Ещё одна моя статья с нашего форума WST.
Новый скрипт!!!
Ну? Поняли основы? Надеюсь что да. Переходим дальше.
Вот один простенький, но очень нужный скрипт.
!#OW:D1/254 D-2/254; Он позволяет не умирать после истечения 7 дней без замка. Объяснять что где не буду, ибо что где не помню. Да и надо ли?
Далее идёт симпатичный скрипт. При загрузке вашей карты появляется сообщение. Какое уже ваше дело. Можно написать благодарность, описание карты, просто что-то от вас. Также скрипт проверяет версию WoG и может указать если ваша версия для него не подходит.
ZVSE
!#MA:P7/?v100;
!#UN:V?v1/?v2;
!#IF&v1<357:V4/1;
!#IF&v1<250:V4/1;
!#IF&4:M^{ВНИМАНИЕ!} Эта карта создавалась с использованием WoG 3.58f и ERM 2.50! Поскольку у вас обнаружена более ранняя версия, то во время игры возможны ошибки!
{(Ваша версия WoG - %V1, ERM - %V2)}^;
!#IF:M^{Название карты } - © 2006-02 by {Имя автора карты }
{Примечания автора:}
{Само примечание автора .}
{Версия карты:} 1.0 (10.01.2006)^;
Далее… Поговорим о переменных. Я конечно надеюсь что о них расскажут или SnoRT или Fly так как вних я меньше всего и смыслю. Но пока расскажу о текстовых переменных. Переменные обозначаются приёмником VR. Переменные делятся на несколько видов. Сейчас поговорим о текстовых переменных. Они обозначаются буквой «z». Помните наш прошлый скрипт о телепортации? Давайте немного его модифицируем.
Добавим в него несколько новых строчек.
ZVSE
!#VRz1:S^Портал ^;
!?OB5/28/0;
!!IF:Q1^Хотите телепортироваться? ^;
!!HE-1&1:P48/58/0;
Разбираемся: !# - инструкция. Она работает с самого начала карты. VR – приёмник переменной. z – текстовая переменная. 1 – записать в текстовую переменную 1:S. ^Портал^ - описание. Мы записали этот текст в переменную 1. Это что-то типа карты памяти. Текст «портал» будет храниться в ней. Идём дальше. Добавим в наш скрипт ещё одну строчку.
ZVSE
!#VRz1:S^Портал ^;
!#OB5/28/0:H1;
!?OB5/28/0;
!!IF:Q1^Хотите телепортироваться? ^;
!!HE-1&1:P48/58/0;
Разбираемся: !# - инструкция. OB5/28/0 – объект в точке 5/28/0 (наш телепортёр). :H1 – дать объекту описание из переменной 1. Как вы поняли у объекта теперь будет название «портал». Если раньше в игре наш телепортёр назывался просто «объект», то теперь он носит гордое название «портал»! Сохраните карту и вернитесь в игру. Наведите курсором на наш объект и взгляните на его название. Круто? Текст может быть любой. Но если у вас на карте будет несколько объектов с названиями то всегда создавая новую переменную меняйте её номер. То есть 2, 3, 4…
Также можно интегрировать текст переменной прямо в сообщение. Давайте сделаем это.
ZVSE
!#VRz1:S^Портал ^;
!#OB5/28/0:H1;
!?OB5/28/0;
!!HE-1:R2/?v32;
!!VRz50&v32=1:S^Парень^;
!!VRz50&v32=0:S^Девушка^;
!!IF:Q1^Хотите телепортироваться %Z50? ^;
!!HE-1&1:P48/58/0;
Разбираем всё новое: Чтоб наглядно показать зачем это может пригодиться определим пол героя !!HE-1:R2/?v32; !! –реактор. HE – приёмник героя. -1 текущего героя. :R2/?v32; - определить пол героя и записать в переменную 32. Мы в первый раз сталкиваемся с логическими переменными. Обозначаются они буквой v. У них может очень много значений. Но о них потом. Я в этом к сожалению не очень понимаю. Может другие объяснят… Идём дальше.
!!VRz50&v32=1:S^Парень^;
!!VRz50&v32=0:S^Девушка^;
Записать в переменную 50, значение переменной 32. Если значение 1 то Парень, если 0 то Девушка.
!!IF:Q1^Хотите телепортироваться %Z50? ^;
Тоже сообщение что и раньше, но теперь добавлено %Z50. Тоесть текст в переменной z50 теперь будет в сообщении, но сама строчка %Z50 отображаться не будет. НО УЧТИТЕ!!!! Если вы интегрируете текст в сообщение как в нашем случае, в самом сообщении буква Z пишется с большой буквы!!!
%Z50 – Правильно!
%z50 – Неправильно!
А в коде пишется как обычно с маленькой. Вот мы и познакомились с текстовыми переменными. Надеюсь что всё понятно. Если нет то спрашиваете.
Также меня интересует ваше мнение. А нужна ли эта темка? Учиться писать ERM кто-то будет? Очень хочу знать…
Объясните ктонить как скрипт едитором пользоваться
gamecreator
18 Jun 2006, 20:32
Цитата(Soul Reaver @ 16 Jun 2006, 18:36)
Объясните ктонить как скрипт едитором пользоваться
Может скриптером? Скрипт едитор не разрешен.
Ща попытаюсь.
ERM Scripter поставляется дополнительным пакетом улучшений. Он необходим для написания и изменения скриптов (*.erm).
Для начала работы нужно нажать кнопку "новый", что на панели вверху окна. Далее нужно выбрать тип файла.
ERM Document - содержит тело скрипта
Text Document - стандартные текстовые документы
CMD Document - используется для написания таблиц, например rmg.txt и подобных
ERS Document - необходим для подключения авторских скриптов в меню
ERT Document - используется для записи содержимого строковых z-переменных (о них вам уже рассказал Soul Reaver)
Также вы можете нажать на кнопку "открыть" для изменения существующих файлов.
DracoLich
02 Jul 2006, 18:43
Теперь разберем создание артефактов. Возьмем, например, артефакт № 170 (пустой). Он должен находиться в одном из пяти слотов для различных артефактов.
Дадим для каждого слота свои свойства:
!#VRz80:S^{Рог} {Божественного} {благословления}^; - дадим артефакту название, записанное в z80
!#VRz81:S^{Рог} {Божественного} {благословления}
дает:
1-ый слот: +2 к атаке, +2 к защите
2-ой слот: +2 к знаниям, +2 к силе магии
3-ий слот: дает навык Лидерства
4-ый слот: дает герою специальность по родным существам первого уровня
5-ый слот: дает герою максимум удачи^; - мы только что дали описание артефакту в z80
!#UN:A170/1/10000 A170/9/z80 A170/10/z81; - разберем по порядку. А170 - означает артефакт № 170, 1 - означает цену, 10000 - значение, 9 - это имя артефакта, 10 - описание. z80 и z81 - переменные с тектами.
!?AE1&v998=170; - проверяем, надет ли артефакт, в переменную v998 ВСЕГДА заносится номер ставящегося/снимающегося артефакта, АЕ1 проверяет, если надевается артефакт.
!!HE-1&v998=170/v999=9:Fd+2/d+2/d/d; - Если артефакт № 170 надет в слот № 9 (первый слот под разное), добавляем +2 к атаке и защите
!!HE-1&v998=170/v999=10:Fd/d/d+2/d+2; - если артефакт № 170 надет в слот № 10 (второй слот под разное), добавляем +2 к силе магии и знаниям
!!HE-1&v998=170/v999=11:S6/?v99; - в переменную v99 заносим уровень лидерства у героя
!!HE-1&v998=170/v999=11:S6/3; - установить герою навык лидерства уровня эксперт
!!UN&v998=170/v999=11:R3/-1; - обновить данные
!!HE-1&v998=170/v999=12:B2/?v107 X?v100/?v101/?v102/?v103/?v104/?v105/?v106; - занести специальность героя в переменные (X) и узнать расу героя (В2) в переменную v107
!!VRv108&v107<2:S0; - установить значения переменной v108 в зависимости от класса героя: если раса Люди, установить 0
!!VRv108&v107>1/v107<4:S14; - если Эльфы, установить 14
!!VRv108&v107>3/v107<6:S28; - если Башня, установить 28
!!VRv108&v107>5/v107<8:S42; - если Инферно, установить 42
!!VRv108&v107>7/v107<10:S56; - если Некрополис, установить 56
!!VRv108&v107>9/v107<12:S70; - если Темница, установить 70
!!VRv108&v107>11/v107<14:S84; - если Цитадель, установить 84
!!VRv108&v107>13/v107<16:S98; - если Крепость, установить 98
!!VRv108&v107>15/v107<18:S118; - если Сопряжение, установить 118
!!HE-1&v998=170/v999=12:X1/v108/0/0/0/0/0; - установить специальность героя на монстра расы
!!UN&v998=170/v999=12:R3/-1; - обновить данные
!!HE-1&v998=170/v999=18:R6/1; - если слот 5, дать максимум удачи
!?AE0&v998=170; - проверяем, если снимается артефакт (АЕ0) под номером v998=170
!!HE-1&v998=170/v999=9:Fd-2/d-2/d/d; - если верно, отнимаем добавленные бонусы
!!HE-1&v998=170/v999=10:Fd/d/d-2/d-2;
!!HE-1&v998=170/v999=11:S6/v99; - установить значение Лидерства до артефакта
!!HE-1&v998=170/v999=12:Xv100/v101/v102/v103/v104/v105/v106; - возвратить специальность
!!HE-1&v998=170/v999=18:R6/0; - убрать удачу
DracoLich
03 Jul 2006, 13:03
При посещении объекта используются в основном его координаты. Но можно также сделать, чтобы при посещении ЛЮБОГО из этих объектов срабатывал один и тот же скрипт. Все добавленные объекты имеют тип 63, и какой-то подтип. Например, чтобы скрипт срабатывал при посещении холмика из черепов, нужно прописать:
!?OB63/15; - где 63 - тип объекта, а 15 - его подтип (черепки)
!?OB98/1; - будет срабатывать при посещении города (98) Оплота (1)
!?OB98; - будет срабатывать при посещении любого города
И так далее...
Наверно что-нибудь напишу ещё. Наверное, многие хотели бы размещать свои объекты на карте. На любой карте. Объекты со своими свойствами, со своими названиями.
Во-первых, нам нужно выбрать новый объект. Конечно, можно взять старый, или используемый WOG'ом и затереть его свойства, поставив свои. Но конечно же, лучше на роль подопытного кролика брать пустой объект. Я взял маленький домик Zyzop2.def, повёрнутый вправо. Этот объект имеет тип 63 и подтип 56 (вообще, все ВОГ'овские объекты имеют 63-й тип). Пойдём дальше, о размещении. Конечно, можно размещать этот объект произвольно при создании карты, но так мы рискуем загородить какие-нибудь важные проходы или доступы. Поэтому, как сделано в большинстве ВОГ'овских скриптов, мы заменим уже имеющиеся на карте объекты. Конечно, заменим не все, а в процентном соотношении. Естественно, если вы недолюбливаете какое-то строение, вы можете заменить их полностью. Важно иметь в виду, что желательно, чтобы заменяемый и новый объекты занимали одинаковое пространство, т.е. имели одинаковое количество клеточек. Это можно проверить в редакторе.
И так, мы заменим 25% колодцев на домики. Не буду мудрить со свойствами нового объекта, суть этого поста не в этом. В избушке нам будут просто говорить: "Здесь был колодец."
Использовать буду свободные переменные, поэтому скрипт спокойно можно будет вставлять в любую карту.
ZVSE!#VRz730:S^Типа Избушка^; Создадим название домика.!#VRv7133:C0/0/0/0/0/0/0; На всякий случай обнуляем все используемые переменные.!#TM93:S1/999/998/255; Создаём таймер, который подействует в первый день и больше никогда. То есть он то и вызовет замену.!?TM93;!!FU873&v7133=0:P;!!VRv7133&v7133=0:S1;!?FU873; Начинаем замену.!!UN:U49/-1/?v7134; Считаем в переменную v7134, сколько на карте заменяемых объектов, т.е. колодцев.!!VRv7135:Sv7134:4;Считаем 25% от всех колодцев, проще говоря, определяем, сколько поставим домиков.!!DO874/1/v7135/1:P; Запускаем функцию 874 столько раз, сколько домиков нам нужно поставить.!?FU874;!!VRv7134:-1; От количества колодцев отнимаем один, чтобы после замены одного из них не попытатся заменить колодец по счёту, которого уже нет.!!VRv7136:S0Tv7134; Задаём случайное число от нуля до количества колодцев, чтобы заменять случайный колодец на карте, а не все поочереди, чтобы не было такого, что заменятся только в одном районе.!!UN:U49/-1/v7136/v7137; В определим координаты случайного колодца в переменные v7137/v7138/v7139.!!UN:Ov7137/v7138/v7139; Удаляем этот колодец.!!UN:Iv7137/v7138/v7139/63/56/d/1; Ставим на его место домик.!!OBv7137/v7138/v7139:H730; Поставим нашему домику название "Типа Избушка".!?OB63/56; Посещение любой избушки.!!IF:M^Здесь был колодец.^;Вот, скрипт готов

Если нужно, вот чистая версия:
Код
ZVSE
!#VRz730:S^Типа Избушка^;
!#VRv7133:C0/0/0/0/0/0/0;
!#TM93:S1/999/998/255;
!?TM93;
!!FU873&v7133=0:P;
!!VRv7133&v7133=0:S1;
!?FU873;
!!UN:U49/-1/?v7134;
!!VRv7135:Sv7134:4;
!!DO874/1/v7135/1:P;
!?FU874;
!!VRv7134:-1;
!!VRv7136:S0Tv7134;
!!UN:U49/-1/v7136/v7137; v7137/v7138/v7139.
!!UN:Ov7137/v7138/v7139;
!!UN:Iv7137/v7138/v7139/63/56/d/1;
!!OBv7137/v7138/v7139:H730;
!?OB63/56;
!!IF:M^Здесь был колодец.^;
DracoLich
11 Jul 2006, 12:10
Рассмотрим использование переменных
Основные типы переменных:
Переменные с текстами (z$). Используются, если один и тот же текст нужно вызвать в нескольких разных местах.
Например, нужно, чтобы при посещении артефакта или монстра, выводился текст "Вы нарушили условия пребывания в этой зоне."
!#VRz50:S^Вы нарушили условия пребывания в этой зоне.^; - в текстовую переменную № 50 заносим текст
!?OB54; - проверяем, посетил ли игрок какого-либо монстра (54)
!!IF:Mz50; - вывести на экран сообщение
!?OB5; - проверяем, посетил ли игрок какой-либо артефакт (подобрал)
!!IF:Mz50; - выводим на экран ссобщение
Как видно, переменные z помогают снизить количество печатной работы.
Переменные с числами (v$). Используются для записи числовых значений.
Например, нужно узнать номер артефакта в слоте № 18 (разное, 5-ый слот)
!!HE-1:A1/?v100/18; - проверяем, что находится у героя в слоте № 18, и заносим номер артефакта в числовую переменную v100
Далее идет проверка: если номер артефакта больше -1, то скрипт работает дальше. Если равно -1 (т.е. когда там нет артефакта), то скрипт прекращается
!!UN&v100>-1:N0/z35/v100; - с помощью команды узнаем название артефакта под номером v100 и записываем название в z35
!!IF&v100>-1:M^В слоте № 5 находится артефакт %Z35^; - Сообщаем название артефакта.
Теперь в переменной v100 хранится номер артефакта, в переменной z35 - название.
Дополнительные переменные:
с - номер дня с начала игры. Поэтому !!VRv100:Sc; означает, что в переменную v100 заносится текущий день
Теперь разберем использование переменных для определения положения на карте
!?OB27; - посещен ли объект Глаз мага
!!HE-1:P?v96/?v97/?v98; - занести координаты Глаза, посещенного героем и заносим его координаты в v96 (96) v97 v98
!!UN:U49/-1/-1/99; - строка задает счет положения колодца (49), любого (-1). Здесь первого (-1) и заносит его координаты в v99 (99), v100 и v101
!?OBv99/v100/v101; - посещен ли первый колодец
!!HE-1:Pv96/v97/v98; - если посещен, телепортируем героя на посещенный Глаз мага
DracoLich
11 Jul 2006, 18:53
y$ - переменная функции, уникальная для каждой
x$ - параметр функции, зависит от функции
w$ - переменная героя. Например
!?OBx/y/l; - посещен ли объект в ккординатах
!!IF:Wx16; - выбрать героя х16 для переменных w, т.е. в х16 будет храниться номер героя
!!VRw62:S-1; - установить переменную w62 для текущего героя на -1
Переменные героя (w1-w200) хранят некий тип информации как переменные v, но уникальные для каждого героя. Это значит, что два разных героя будут иметь разные значения в переменной w1 (или w2, w10 или какое-либо еще до w200 включительно). Чтобы установить или проверить одну или более w-переменных, вы должны сначала указать номер героя с помощью команды IF:W. Например, если вы хотите установить или проверить w5 у героя номер 27 (Джем), вы должны сначала написать !!IF:W27; прежде чем устанавливать/проверять его (героя) w5-переменную. Для текущего героя используйте -1 как номер. Так, !!IF:W-1 значит что далее идущие значения w-переменных будут привязаны к текущему герою (до того момента, пока другая функция IF:W не заработает, будет работать для текущих героев).
Функциональные параметры - тип переменных (x1-x16) так же хранят некоторые типы значений (числовых) как v и w переменные. Однако, эти переменные существуют только вместе с функцией (код, следующий за триггером функции) и первоначально устанавливаются на значения текущей функции в ресейвере (код функции)после команды P. Если вы вызываете функцию из другой функции, любая x-переменная, которая не была установлена (как новый параметр), будет поддержана как значение в новой функции. Когда используется с DO-ресейвером, параметр x16 устанавливается как текущий круг функции.
Функциональные переменные (y1-y100) похожи на x-переменные, т.е. нормально работают только с использованием функции. Однако, они (y-переменные) уникальны для каждой функции, так, если вы имеете 4 различных функции, каждая будет иметь y-переменную одного и того же номера для каждой функции разную. Как и другие переменные, они записывают только числовые значения.
PS. Плюс/минус ставится только после 10 сообщений.
DracoLich
13 Jul 2006, 17:34
Введение
Флаги и переменные - это главнейшая особенность ERM для трансформации Гроев в высокодинамичную игру, что отвечает действию и выбору игрока. Пока ERM скрипты могут быть прочитанны без использования флагов и переменных, у вас есть великолепный шанс повысить свои навыки, и как факт, количество команд, требующие использование флагов и переменных.
Условные флаги
Условные флаги еще называют сокращенно CFs. Флаг - это условный рычаг, который имеет положение правду (1) или ложь (0). Как и двойные числа, они имеют только два положение и не больше. В начале все флаги установлены на Ложь (0). Значение 1 (правда) называют "установлен", 0 (ложь) - "не установлен".
Установка флагов
В ERM есть 1000 условных флагов и каждый из них обладает номером от 1 до 1000. Флаги устанавливаются с помощью IF-ресейвера, используя V-команду. Чтобы установить флаг на правду, используйте значение 1, а чтобы на ложь, значение 0.
Например: установим флагу 4 правду (1): !!IF:V4/1;
В дополнение к V-команде, еще есть несколько IF-команд для установки первых 10 флагов за раз. Смотрите IF-ресейвер для подробной информации.
Использование условных флагов
Обычно используют флаги для контроля, есть или отсутствует код ERM (например, как триггер или ресейвер). Например, если вы хотите, чтобы при посещении объекта на карте показывалось сообщение ТОЛЬКО в первый раз любому герою, и никогда больше, вы можете использовать флаги для этой цели; это сообщение будет показываться, если флаг был ложь (не установлен) и дальнейшей командой вы изменили его значение на правду (1), так, если в следйющий раз объект будет посещен, сообщение не будет показываться. Символ для определения флага (или переменной) - & (амперсанд), который помещается обязательно предшествуя значению флага (переменной) в ресейверах, или предшествуя точке с запятой в триггерах. Амперсанд указывает, что нужно следовать флагу, используемому для теста. Если тест для флага-"правды" (т.е. установленного на 1), просто используется номер флага. Если тестдля флага-"лжи" (т.е. установленного на 0), используют негативный знак (-) перед номером. Так, если флаг №5 правда, вы должны использовать &5, и если флаг №5 - ложь, вы должны использовать &-5.
Пример кода:
ZVSE
!?OB10/14/0; - проверим, посещается ли объект в 10/14/0
!!IF&-5:M^Входи. Я ждал тебя.^; - показать это сообщение, если флаг №5 - ложь
!!IF:V5/1; - установить флаг №5 на правду
Проверить несколько флагов
Иногда вам требуется проверить более одного флага или переменных. Чтобы сделать это, отделите каждый флаг (переменную) дробью (/). Когда несколько флагов или переменных, ВСЕ они должны быть установлены до сообщения. Например, если вы хотите, чтобы действовало, когда флаг №7 - правда, флаг №8 - ложь, и флаг 10 - правда, если хоть один из флагов будет иметь другое значение, сообзение не будет показываться.
Пример кода:
ZVSE
!?OB10/14/0; - проверим, посещается ли объект в 10/14/0
!!IF&7/-8/10:M^Входи. Я ждал тебя.^; - данное сообщение будет показано, только если флаги 7 и 10 будут правдой, а флаг 8 - ложью.
Инициализация флагов
Пока все флаги установленны как ложь (т.е, значение 0 или не установленно), флаги от 501 до 1000 будут сохранять их последнее значение, когда вы начинаете новую карту без выхода и перезапуска самой игры. Они могут быть использованы для кампаний, в которых вы хотите использовать значения флагов для последующих карт в кампаниях. Если вы избегаете потенциальной возможности того, что флаги будут отличатся от лжи (т.е, вам нужно, чтобы все флаги были 0), установите флаги от 500 и дальше на 0 в начале карты или скрипта (команда IF:V), т.е. все флаги, которые вы хотите использовать.
Специальные флаги
Некоторые флаги имеют специализированные значения в игре.
Флаг 1 используется используется некоторыми командами для определения результата и определения результата условных флагов (проверить значение)(см. выше). Следовательно, это хорошая идея - никогда не использовать флаг 1 для любого значения, нужного на долгое время. Или для верности, не используйте это и используйте вышестоящие флаги.
Флаг 996 автоматически очищается (устанавливается на ложь), когда любая !!LE-команда исполняется и устанавливается на 1 (правда) если там (в локации, определенной командой LE) не локальное событие (вы знаете, что события удаляются после первого посещения?).
Флаг 997 и 998 хранят следующее:
Флаг 997 хранит мультиплееровский статус битвы.
=0 (ложь) если это локальная битва,
=1 (правда) если это Интеренетная битва.
Значит, если флаг 997=1, тогда флаг 998=0 если AI атакует игрока-человека на отдаленном компьютере.
Флаг 998=1 если битва Человек на Человека. Здесь у нас реальная мультиплеерная битва.
Вы можете использовать оба флага в триггерах BA0 или BA50, например:
!?BA0&997/998;
...
Здесь скрипт идет, если битва Человек на Человека (мультиплеер)
Флаг 999, который устанавливается на 1, если текущий игрок (который активировал триггер) - игрок "здесь" и 0, если он или она на другом PC. AI имеет всегда значение 0. Если флаг 999 установлен, вы можете быть уверены, что эта битва - человек против ИИ, причем человек за данным компьютером. Это работает для всех триггеров.
Флаг 1000 имеет два значения, зависящих от места использования (триггер битвы или нет). Для не-битвы этот флаг будет установлен на правду, когда хозяин героя, игрок-человек, посетит объект на карте триггер, как объект или субъект. Если компьютерный (AI) герой посетил объект, флаг 1000 будет установлен на ложь. Опять же, вы можете установить значение этого флага, но это не безопасно, поскольку вы можете проверить это значение в определенном скрипте, если этогерой игрока или ИИ.
Поэтому, если проверять условные флаги, -1000 значит AI, а 1000 значит человек.
Для боевых триггеров (например, !?BA, !?BG, !?BF, и т.д.) флаг 1000 проверяет, настоящая или теоритическая (AI) битва. Если флаг 1000=1 (правда), это значит, что настоящая битва (человек). Если 1000=0 (ложь), это значит, что теоритическая AI-битва.
Показ данных флагов и переменных
Чтобы показать значение флага (0 или 1) в сообщении, исползуйте %F, сразу после этой команды выберите № флага для показа (от 1 до 1000). Для показа значения флага №4 без сообщения, вы должны использовать %F4. Показ значения флага может быть полезен, особенно при помощи в крахе игры для помощи в определении ошибки.
Пример:
!!IF:M^Значение флага 4 равно %F4.^;
Сравнение значений
Для сравнения игровых параметров к особенному значению, вы можете использовать следующий способ: ...[оператор сравнений] значение...
Результат сравнения записывается во флаг 1. Вы можете использовть это для дальнейших сообщений.
Пример сравнения значений, используя GE-ресейвер:
!!GE100:F5 - установить день первого появления: 5 для Глобального события (стандартный синтаксис)
!!GE100:F=5 - проверить, если день первого появления 5 и установить условный флаг 1 (CF1)
!!GE100:F<>5 - проверить, если день первого появления НЕ 5 и установить условный флаг 1 (CF1)
!!GE100:F><5 - см. выше
!!GE100:F>5 - проверить, если день первого появления более 5 и установить CF1
!!GE100:F>=5 - проверить, если день первого появления более или равный 5 и становить CF1
!!GE100:F=>5 - см. выше
!!GE100:F<5 - проверить, если день первого появления менее 5 и установить CF1
!!GE100:F<=5 - проверить, если день первого появления меньше или равно 5 и установить CF1
!!GE100:F=<5 - см. выше
Переменные
Пременные похожи на флаги, т.к. они могут быть установлены и проверены, но не похожи на флаги из-за того, что они могут принимать гораздо большее количество значений, чем правда или ложь. В большинстве случаев, переменные используют как номер. Так же, содержимое переменных (установленные значения) могут быть изменены в любое время простым установлением нового значения, следовательно, и имя переменной. Есть еще несколько различных типов переменных, которые могут быть использованы для различных мест скрипта.
Если параметр команд показывается как $, это значит, что это значение может быть установлено в переменную. Если это показано как #, это значит, что это можно только установить, но не прочитать. И если это показывается как ?$, это значит, что это можно прочитать, но не установить.
Типы переменных и их возможные значения
Все числовые переменные варьируются в значениях от -2147483647 до +2147483647
a - еще не используется
b - еще не используется
c - устанавливает значение текущего дня (номер игрового дня)
d - добаляет или убавляет значения от переменной
e1...e100 - функциональные переменные с плавающей запятой
e-1...e-100 - основные триггерные переменные с плавающей запятой
f...t - стандартные переменные (еще называются быстрыми переменными)
v1...v10000 - стандартные переменные
w1...w200 - переменные героя (уникальны для каждого героя)
x1...x16 - параметры функции (зависит от функции)
y1...y100 - функциональные переменные (уникальны для каждой функции)
y-1...y-100 - основные триггерные переменные
z1...z1000 - текстовые переменные
z-1...z-10 - функциональные текстовые переменные (уникальны для каждой функции)
Установка переменных
Есть несколько путей установки значений переменной. VR-ресейвер может быть использован для установки значения любой переменной и может быть еще использована для арифметических операций с переменными, такими как сложение, вычитание, умножение или деление. Исключение - переменные z, которые используются для установления текста, в отличии он числовых переменныз.
Пример установки значение 18 переменной v5: !!VRv5:S17;
Второй путь установки значений переменных - это считывание значений с объектов или установок игры, таких, как номер героя, значения прироста золота, количество драг. камней у игрока 4, или тип или подтип любого объекта. Для установки значения через этот путь, после команды используется знак вопроса (?), далее следует переменная, в которой и будет храниться значение.
Пример установки типа объекта в координатах x=10, y=15, уровень=1 (подземелье) в переменную j: !!OB10/15/1:T?j;
Пример установки количества кристаллов (тип ресурса - 4), которые на данный момент есть у игрока зеленого (номер 3) в переменную v12:
!!OW:R3/4/?v12;
Третий способ установки переменной - внутренняя ссылка. Некоторые ERM команды требуют номер переменной для v или z. В этом случае, вместо использования знака вопроса, вы просто вводите номер параметра и значение командой для данной переменной (например, если команде нужен номер для v-переменной, вы ставите значение 17, которое будет установленно в переменную v17).
Триггерные переменные
y-1...y-100 - основные триггерные переменные
e-1...e-100 - переменные с плавающей запятой
Вы можете использовать эти переменные в некоторых местах.
Характерные особенности:
1. Они НЕ сохраняются при сохранении игры. Фактически каждая секция триггера будет полность завершена и вы не сможете сохранить и загрузить игру, пока работает секция триггера.
2. Эти переменные "местные" для каждого триггера и если один триггер работает вне другого триггера, они будут иметь разные значения. Как вы можете видеть, вы не можете передавать значения из триггера к триггеру используя эти переменные.
3. Все переменные установлены на 0 при старте любого триггера, так вы можете использовать это как значение по умолчанию.
Использование переменных взамен чисел
Раз вы можете устанавливать значения переменных, вы можете использовать эти переменные в определенных местах своего кода. Почти везде, где вы можете просто ввести число, вы можете использовать любую переменную, содержащую значение, которое будет использоваться с приемлиевым значением для команд или параметров. Опять же, исключения - это переменные z, использующиеся для текстовых значений, таких, как имя героя, название артефакта, или слово или фраза. В большинстве случаев это будет очевидно, когда переменная z будет использоваться с командой, подразумевающей использование с числовыми параметрами (т.е. любых других переменных).
Пример использования v-переменных для установки баллов заклинания героев
!!VRv200:R50; - генерировать случайное значение между 0 и 50 в переменную v200
!!HE155:Iv200; - установить герою № 155 баллы заклинания на значение, сгенерированное в переменной v200
Пример использования z-переменных: добавление "Сэр" к начальному имени героя
!!VRz50:S^Сэр ^; - установить слово Сэр в переменную z50
!!HE-1:B0/?z51; - установить текущее имя героя в переменную z51
!!VRz52:S50 +z51; - добавить содержимое z51 к z50 и записать в переменную z52
!!HE-1:B0/z52; - установить текущему герою имя, находящееся в переменной z52
Замечание: оба предыдущих примера кода должны будут предшествовать событию триггера.
Сообщения с переменными
Как и флаги, вы можете использовать значения одной или более переменных для определения, запущен ли триггер. И фактически, синтаксы схожи. Однако, взамен номера флага (с или без знака минуса впереди), вы можете заменять имя переменной, следующей за сравнительным символом (=, >, <, <>, >=, или <=) и номером (или переменной), которую вы хотите сравнить.
Пример сообщения, сравнивающего v1, и если v1 больше либо =7, показать сообщение:
!!IF&v1>=7:M^Вы были мудры, сделав этот выбор, герой!^;
Пример сообщения, сравнивающего текст, установленный в переменную z1 с текстом, в переменной z2, и если они одинаковы, показать сообщение:
!!IF&z1=z2:M^Итак, вы ввели одинаковые значения!^;
Проверка нескольких переменных
Это выполняется просто: через знак деления (/) ставим переменные, флаги и приравнивание:
!!HE-1&7/v2>6/-1/y4=v8:A31;
В примере выше, если выполнятся следующие условия, герой получит артефакт:
1. Флаг 7 должен быть правда (1);
2. v2-переменная должна быть установлена на значение 6 или выше;
3. Флаг 1 должен быть ложью (0);
4. y4-переменная должна быть установлена, как и переменная v8.
Только если ВСЕ четыре условия будут выполнены, герой получит артефакт.
DracoLich
14 Jul 2006, 10:42
Синтаксис проверки - значение ИЛИ: |
!(!|?|#)XX&c1/c2/c3|c4/c5/c6:...;
Полное значение будет таким: (c1 И c2 И c3) ИЛИ c4 ИЛИ c5 ИЛИ c6
Комментарии
- секция ИЛИ может быть одна либо обязательно после секции И
- если есть только секция ИЛИ, полное значение будет истиной, если хотя бы одно состояние ИЛИ - истина
- может быть до 16 состояний И и до 16 состояний ИЛИ
Другие типы переменных
Как ранее упоминалось, есть несколько различных типов переменных, каждая используется в разных местах кода.
Стандартные переменные (f-t) и (v1-v10000) годятся для большого количества взаимозаменяющих частей, кроме "быстрых переменных", т.к. они не имеют номера, в отличии от v-переменных, и определенные команды требуют номер v-переменной для записи результата. Оба типа используются для записи числовых значений. В ERM нет переменных, способных записывать числа с десятичными знаками.
Функциональные переменные с плавающей запятой (e1..e100) Они используются в основном как y-переменные:
- не записываются в сохраненной игре;
- уникальны для каждой функции;
- установленны на 0 при старте каждой функции;
- сохраняются при вызове другой функции.
Вы можете использовать их для установки параметров, но главная особенность - использование счета плавающих запятых, выражение и сохранение результата в другую переменную.
Вы можете использовать +,-,* и : команды VR-ресейвера для e-переменных с плавающей запятой.
Вы также можете показать значение e-переменной в сообщении, ислользуйте команду %E#.
Пример:
!#VRe5:S32;
!#IF:M^e5 теперь имеет значение "%E5"^; [ e5=32.0 ]
!#VRe5:*5;
!#IF:M^e5 теперь имеет значение "%E5"^; [ e5=160.0 ]
!#VRe5::200;
!#IF:M^e5 теперь имеет значение "%E5"^; [ e5=0.8 ]
!#VRe5:+e5*10+5:10;
!#IF:M^e5 теперь имеет значение "%E5"^; [ e5=2.1 ]
!#VRv100:Se5;
!#IF:M^v100 теперь имеет значение "%V100"^; [ v100=2 ]
Текстовые переменные (z1-z1000) записывают символы (один или более) и не может быть использованны для записи числовых переменных; они могут записывать число как текст, но число нельзя будет приравняьт или выполнить с ним арифметические действия в любом виде. z-переменные могут быть соединены, но имеют ограничение в 512 символов. Они могут быть сравнены с другими z-переменными, чтобы убедиться, чот они одинаковы. Когда сравниваются две z-переменных, сравнение НЕ зависит от регистра. Так, если в переменной z1 записано "Это", это будет схоже с переменной z2, в которой записано "эТО" или любая другая комбинация больших и малых символов. Пустые линии или строки игнорируются z-переменными при сравнении. 500 новых z-переменных добавлено в ERM 2.60 (WoG 3.57) к уже существующим 500, но помните, что z501-z1000 не сохраняют их значение между разными картами.
Для этого используйте z301-z500.
Замечание: сообщения в тестовых переменных не должны содержать символов ; и ^
Пример:
!!VRz567:S^Неправильный текст ; Он содержит ^специальные элементы^. ^;
!!VRz567:S^Это правильный текст. Он не содержит "специальных элементов". ^;
!!IF:M^Это правильный текст. Он не содержит специальных элементов. ^;
Функциональные текстовые переменные (z-1-z-10) похожи на y-переменные, но записывают значение как z-переменные. Они уникальны для каждой функции. Однако, они отличаются от y-переменных тем, что они удерживают свое значение, когда вы вызываете другую функцию, так вы можете использовать передавание переменной от функции к функции, но не можете использовать старое значение. Как обычные z-переменные, они имеют максимум 512 символов.
Специальные переменные
В ERM есть несколько переменных, имеющих специальное значение. Как флаги 1 и 1000, специальные переменные могут установлены как ы захотите и в любое время, но это не советованно, т.к. есть степень риска, что другие команды могут использовать их.
v1-переменная иногда ипользуется для записи результата некоторых команд. Так, вы можете использовать ее в своих скриптах, но на непродолжительное время для хранения выражения; другими словами, не устанавливайте значение в переменную v1, если вы хотите использовать ее значение неизменным на долгое время.
z1-переменная используется для записи текста, введеного игроком в расширенном окне диалога. Если вы не используете расширенные диалоговые окна, вы можете не беспокоиться об этом, но все же это хорошая идея - не использовать z1 для долговременного хранения.
v-переменные v998, v999, и v1000 всегда запиывают позицию объекта или события, которое посетил текущий герой, или в некоторых случаях позицию героя (например, триггер !?HM). Лучше оставить эти переменные исключительно для сравнения их значений или копировать их значения в другие переменные
x16-переменная (используется в функциях, вызываемых ресейвером DO), записывает текущий номер круга функции. Например, если функция повторяется 12 раз (от 1 до 12), первый раз x16 будет равна значению 1, второй раз - 2 и т.д. Если вы измените значение переменной x16, вы сможете "ускорить" или "замедлить" выполнение функции, или выйти из функции, установив значение x16 на последнее значение (наибольшее), использованное в ресейвере DO.
Инициализация переменных
Как и флаги, все переменные в начале игры имеют значение 0. Однако, как и флаги, определенные переменные НЕ будут сброшены между картами без рестарта Героев (игры). Опять же, это может помочь вам в создании кампаний.
Когда вы начинаете игру, следующие переменные будут установлены на 0 или примут значение "" для z-переменных: f...t, v1...v500, v1001-v10000, z1...z300, z501-z1000, w1-w50.
Следующие переменные будут сохранять свое текущее значение между играми (только если вы не перезапустите Героев): v501-v1000, z301-z500, w51-w200.
Показать сообщение из переменных
Как и флаги, значения переменных может быть показано в сообщениях, используя специальный код для типа переменной, следуемый после типа переменной:
%V# показать быструю или v-переменную определенного номера. # = от f до t или от 1 до 10000
%W# показать переменную героя определенного номера. # = от 1 до 200
%X# показать параметр переменной определенного номера. # = от 1 до 16
%Y# показать значение функциональной переменной y. # = от 1 до 100
%Z# показать текстовую переменную определенного номера. # = от 1 до 500
%$macro$ показать переменную, схожую с макро-именем "macro"
Это важно - для показа значение переменных всегда используются большая буква после знака %.
Пример показа сообщения с быстрой переменной j, обычной переменной v21 и z-переменной z100 в текстовой переменной:
!!IF:M^Простите, %Z100, но вы имеете только %Vj золота, вам еще не хватает %V21 золота для покупки этого артефакта.^;
Здесь подразумевается, что в переменной z100 хранится имя героя (скажем, это Клэнси) и в переменной j хранится количество золота у игрока (скажем, 750) и переменная v21 содержит цену артефакта (скажем, 2000), сообщение будет выглядеть так:
Простите, Клэнси, но вы имеете только 750 золота, вам еще не хватает 2000 золота для покупки этого артефакта.
Внедрение переменных как часть текстовых переменных
Используя некоторые команды для показа сообщений (см. выше), вы можете добавлять переменные как часть текстовой переменной.
Это удобный способ сделать определенную переменную z, и, возможно, некоторые другие переменные.
Пример комбинирования нескольких z-переменных и v-переменных вместе в одной z-переменной:
!!VRz10:S^Клэнси^; - установить в z10 значение "Клэнси"
!!VRz11:S^зеленый^; - установить в z11 значение "зеленый"
!!VRz12:S^красный^; - установить в z12 значение "красный"
!!VRv25:S1 R1000; - установить случайное значение от 1 до 1000 в переменную v25
!!VRz100:S^%Z10 всегда хотел иметь %Z11 артефакт, но его артефакт был %Z12. Ему было %V25 лет, и %Z10 никогда не видел %Z11 артефакт за всю свою жизнь!^; - установить этот текст в переменную z100
!!IF:M^%Z100.^; - показать текст, записанный в переменной z100
Здесь подразумевается создание случайного числа и запоминания его в переменную v25 (пусть будет 247), сообщение ниже будет показано игроку:
Клэнси всегда хотел иметь зеленый артефакт, но его артефакт был красный. Ему было 247 лет, и Клэнси никогда не видел зеленый артефакт за всю свою жизнь!
Косвенные ссылки на переменные
Некоторые ресейверы локации карты (x, y и уровнеь) могут быть использованны с косвенными ссылками на переменные. Это номер, который идет первым и последующие переменные v содержат x, y и уровень для использования. Например, если у вас значение x записано в переменную v100, y - в v101 и уровень в v102, вы можете использовать номер 100 в ресейвере для места, находящегося в этих значениях.
Пример использования локальных событий с косвенными ссылками:
!!VRv100:S10; - число, используемое как х
!!VRv101:S15; - число, используемое как y
!!VRv102:S0; - число, используемое как уровень
!!LE100:M^Странно... Здесь нет ни звука жизни.^; - установить сообщение в событии, координаты которого лежат в значениях v100, v101, v102
Переменные с индексом
Иногда полезно разрешить ссылку на номер переменной (например, номер между 1 и 1000 для v-переменной) из другой переменной. В этом случае вы можете использовать повторение функции как в DO-ресейвере для записи информации в переменную. Взамен вставки номера после v, вы можете вставить другую переменную и значение, сохраненное в ней, будет номером переменной.
Пример индексных переменных v, используя y-переменные:
!!VRy10:S7;
!!VRvy10:S5;
!!IF:M^Значение переменной v7 равно %V7.^;
Будет показано следущее сообщение:
Значение переменной v7 равно 5.
Это потому, что y10 равно 7. И vy10 значит, что v-переменная имеет номер, сохраненный в переменной y10, которая имеет значение 7. Следовательно, v7 становится равной 5.
Макросы
Если вы хотите дать переменной много кодовых имен, вы можете установить макрос с помощью MС-ресейвера.
Макрос может быть использован почти в любом месте, где используется переменная и взаимодействует с переменной.
Макрос - это ссылка с имене, ограниченная знаками доллара: $сокровище$.
Для большей информации смотрите MC-ресейвер.
Дополнительные примеры:
Как использовать переменные героя?
Для использования w-переменных, сперва вы должны использовать !!IF-команду для героя, у которого и будете изменять (используйте -1 для текущего героя). Раз использовав эту команду, вы не сможете использовать ее снова, пока не переключитесь на другого героя. Перед использованием этой команды установите или проверьте переменную w. Так, если вам нужно использовать w-переменную героя #147 (Дракон), команды будет такова: !!IF:W147;
Тогда вы сможете установить переменную w1 в точности так же, как и любую другую переменную (см. пример ниже).
Вы имеете 1 объект и 1 событие. Если герой посетил объект, событие узнает это.
Хорошо, поставим объект Волшебный колодец в позицию 10/15/0.
Поставим событие в 27/18/0.
ZVSE
!?OB10/15/0;
!!IF:W-1;
!!VRw1:S1;
!?LE27/18/0;
!!IF:W-1;
!!IF&w1=0:M^Принесите мне воды из волшебного колодца!^;
!!IF&w1=1:M^Вы принесли мне воды! Я отблагодарю вас!^;
Как я могу узнать номер текущего дня?
Это просто.
!!VRv123:Sc;
Изменяя 'c' можно несколькими путями, например, 'd' в виде добавления "the current day".
Вы можете добавлять текущий день к любым другим значениям.
!!HE-1:Fcd/c/1/2;
Добавить в атаке текущего героя текущий день, установить защиту равную номеру текущего дня.
Способы генерации случайных значений
Давайте поговорим о генерировании чисел от 1-100, но кроме 42, 81, или 99.
Здесь 3 ненужных номера, так что генерируется число от 1 до 97. Затем если это 42 или выше, добавляем 1. Затем, если это 81 или выше, добавляем 1. Если это 99 или выше, добавляем 1. Вы теперь имеете случайное значение, от 1 до 100, но кроме 42, 81, или 99.
Так, если вы хотите генерировать число от 1 до 100, исключая 10-19 и 73, вы генерируете число от 1 до 89, затем, если оно 10 или выше, добаляете 10, если 73 или выше, добавляете 1.
DracoLich
14 Jul 2006, 11:05
Вот все про флаги и переменные:
PS. Стоит писать про ресиверы или триггеры?
DracoLich
21 Jul 2006, 08:48
Введение
Если игрок активирует триггер, это вызывает некоторые действия (ресейверы). Триггером может быть событие, объект или герой, который посещает герой игрока, или это может быть ERM-функцией, вызываемой из другого ERM-кода или события, установленного на определенное время или интервал. Ресейвером может быть событие, герой, объект на карте или другие вещи. Поскольку многие вещи в игре могут быть использоваться как триггеры или ресейверы, важно не перепутать, что куда относится.
Как использовать триггеры
Свойства триггеров событий или объектов не связаны с целью существования триггера. Действие триггера должно быть описано во временных событиях. В скриптах ERM триггер идет как главный (начальный), и следующие после триггера строки - ресейверы. Если вы помещаете более одного триггера в некоторое событие, ресейверы будут следовать по последнему триггеру.
Синтаксис триггеров
Каждый триггер начинается со знаков (!?) и заканчивается (

. После !? следует двубуквенное имя триггера , например BA, OB или HE. После имени триггера идут параметры, показанные как # на листе хелпа. Каждый параметр (#) должен иметь определенный номер в вашем коде, например !?HE47;. Значение чисел для каждого типа триггеров разное. Для HE-триггера, число - это номер героя (у каждого героя есть собственный порядковый номер) для LE-триггера число - это положение события на карте по x, y и l.
Использование переменных в триггерах
Переменные не могут быть использованы в местах параметров триггера. Если вы попробуете, переменная будет игнорирорваться или приниматься за ноль. Если вы используете постоянные переменные, например v4, буква (v) будет игнорироваться, и это будет принято за число 4.
Двойные триггеры
Если некоторые триггеры используются более чем один раз на карте, в этом случае ВСЕ ресейверы для этого триггера будут выполняться, следуя ресейверам с первого триггера (т.е. если у вас при посещении события X/Y/L сначала идет один кусок скрипта, а после другой, то работать все равно будет первый, и после заканчиваться последним.)
Заметьте, что !?BA0; - это отличный от !?BA1; триггер, и также !?HE47; - это отличный от !?HE48; триггер.
Условия триггеров
Условия могут быть добавлены к триггеру, так что ресейверы к этому триггеру будут работать только если условие правильно. Для этого используют знак (&) сразу после последнего параметра и до точки с запятой. После &, вставьте ваше условие. Это условие должно содержать флаг или переменную, сравнивающие знаки (=, >, <, >=, <=, или <>) и вторую переменную либо значение.
Пример:
!?BA0&v10=51; это значит, что ресейверы для этого триггера будут работать, только если v10 имеет значение 51. Вы можете включать несколько проверок, используя (/), например !?BA0&v10=51/v2>=5; ресейверы будут работать только если v10 равно 51, и если v2 равно 5 или более. См. флаги и переменные для более продвинутого обучения.
Введение
Ресейверы - ЕRM-коды, действующие на героев, объекты, события таймеры, функции, сообщения или игровые установки. Большинство ресейверов имеют несколько команд, что может быть использованно для самых разных вещей. Например, LE-ресейвер действует на локальные события на карте и имеет несколько различных команд для изменения свойств события.
Как использовать ресейверы
Ресейверы помещаются во временнЫх событиях после триггера, который их запускает. Триггер может быть только один. На одну строчку можно писать одну команду или более, но для ясности и понятности вашего скрипта (так же для поиска ошибок), лучше писать на каждую строку по команде.
Синтаксис ресейвера
Все ресейверы начинаются с двойного восклицательного знака (!!) и заканчиваются точкой с запятой (

. Немедленное исполнение !! - это функция ресейвера, например, для артефактов - AR, HE - для героев, LE - для локальных событий или OB для объектов. Следующая часть этого кода зависит от типа ресейвера. Ресейверы имеют один или более параметров, находящихся до (

. После двоеточия идет команда ресейвера. Команды могут принимать много форм и могут включать один или более параметров каждый; они представляются (у меня) как ZZZZZ. Изменяйте ZZZZZ на нужную команду или команды. После последней команды вы должны поставить (

, что будет означать конец ресейвера.
Все ERM команды (ресейверы и инструкции) имеют лист доступных команд.
Если параметр команды показан как $, это значит, что это значение может быть устанловлено в переменную. Если показано как #, это значит, что это можно только установить, но не прочитать. И если показывается как ?$, это значит, что может быть ТОЛЬКО прочитано, но не установлено.
Пример синтаксиса ресейвера:
!!LE12/21/0:E1000;
В примере выше, событие в координатах x=12, y=21 и уровень=0 (верх) станет модифицированным и будет давать 1000 опыта для героя.
Родственный синтаксис
Часто вам нужно добавить или убавить значение. Например, если вы хотите дать герою опыт, вы установите герою количество опыта без учета текущего значения, т.е. опыт будет установлен на новое, установленное значение. Так же будет и с ресурсами игроков. Для добавления, мы используем расширенный синтаксис: ставим d как первое значение.
Пример расширенного синтаксиса:
!!HE-1:Ed+500;
В этом примере 500 опыта будет добавленно к уже имеющемуся опыту. Если бы мы использовали E500, а не Ed+500,
у героя опыт стал бы равняться 500, а не увеличен на 500. Для отнимания 500 опыта, используйте Ed-500 соответственно. если вы хотите оставить
параметр неизменнным, используйте d+0 или просто d.
Инструкции
Инструкции - ресейверы, которые действуют только один раз, при загрузке карты, обозначаются (!#). Не все ресейверы могут стать инструкциями, поэтому будьте осторожны.
Пример инструкции:
!#VRv10:S25; - установить v10 на 25
DracoLich
21 Jul 2006, 14:50
Разберем простенький скрипт с участием монстра - квестора
v9 - хранит переменную с артефактом
v10 - хранит номер посещения (первый или дальнейший)
ZVSE
!#OBx/y/l:S; - отключаем свойства объекта для всех игроков
!?OBx/y/l; - посещается ли объект?
!!HE-1&v9<>-5:A2/7/?v9/d; - проверяем наличие артефакта 7, причем только если v9 не равна -5
!!IF&v10=1/v9=0:Q11/8/7/1^Тебе что, жизнь не дорога? Принеси артефакт, потом поговорим!^; - если это не первое посещение, и артефакта нет, выводим это сообщение
!!IF&v10=0/v9=0:Q10/8/7/1^Если хочешь пройти, принеси сперва артефакт.^; - если это первое сообщение, и арта нет, выводим это сообщение
!!IF&v9>0:M^Молодец. Можешь идти.^; - если артефакт присутствует, выводим это сообщение
!!UN&v9>0:Ox/y/l; - если артефакт присутствует, убираем монстра
!!VRv9&v9>0:S-5; - если артефакт присутствует, ставим v9 в -5, чтобы больше не проверялось наличие артефакта (это необходимо, если объект можно посещать несколько раз, здесь это не обязательно, но если это объект, который не должен удаляться, лучше сделать так)
!!VRv10&v10=0:S1; - если первое посещение, установить, что оно уже было
DracoLich
23 Jul 2006, 14:54
Так... Сейчас мы разберем способ заставить убежать монстра...
Пусть в 18/12/0 стоит ЛЮБОЙ монстр...
ZVSE
!#OB18/12/0:S; - деактивировать монстра
!?OB18/12/0; - посещается монстр?
!!OB18/12/0:U?v10; - узнаем, что за монстр (если там случайный монстр, то в самый раз

) в v10
!!MO18/12/0:G?v11; - узнаем их кол-во, заносим в v11
!!UN:N3/z50/v10/1; - узнаем имя, заносим в z50
!!IF:Q5/21/v10/2^Вы видите что %Z50 убегают, хотите догнать их и подраться?^; - спрашиваем игрока с картинкой монстра
!!HE-1&5:O?v53 T18/12/0/v10/v11 O?v54; - по порядку: узнаем хозяина героя (1-ый раз), провоцируем битву с монстром v10 и количеством v11, проверяем хозяина героя (2-ой раз)
!!UN&v53=v54:O18/12/0; - если герой выиграл и жив, убираем монстра
Монстр мертв, и мы только что симулировали битву с настоящим монстром!
Soul Reaver
23 Aug 2006, 14:01
Вот решил наскоро объяснить переменные. Они уже конечно были объяснены, но всё же этого не достаточно. Так что такое переменные? Это числа которые могут менять своё значение. Если вы читали мои уроки в самом начале темки, то уже знаете основы. Есть условия при выполнении которых выполняются команды. Возьмём к примеру простенький диалог.
!?OB#/#/#;
!!IF:M^Текст.^;
Это означает что при посещении объекта в точке #/#/#, выдать сообщение с надписью «Текст». Вроде всё просто. А если вам хочется чтоб после посещения этого объекта, и посещении его повторно выдавалось другое сообщение? Как это сделать? Вот тут нам и помогут переменные. Как уже было сказано переменные это числа которые могут менять своё значение. Так сделаем так чтоб в зависимости от значений переменной выдавались разные сообщения. Сразу скажу что «целые» переменные обозначаются маленькой буквой v. В данный момент существует 10000 переменных (вроде, если нет то модеры подправят) Остальное объясню на примере.
!?OB1/1/0;
!!IF&v1=0:M^Текст.^;
Вот она переменная! Сначала о способе записи. Разберу всю команду. !! – реактор, & - после этого знака как правило идут переменные, v – знак переменной, 1- номер переменной, =0 – значение переменной. Остальное вроде понятно. Как видите переменные могут иметь разные значения. К тому же они являются дополнительным условием для команды (помимо триггера). В данном случаи сообщение будет выдаваться только если переменная 1 будет равна 0. Так как с самого начала игры все переменные всегда = 0. То сообщение будет выдаваться. Теперь объясню пример сложнее.
!?OB1/1/0;
!!IF&v1=0:M^Текст.^;
!!IF&v1=1:M^Текст 2.^;
!!VRv1&v1=0:S1;
Как видите добавилось 2 новые строчки. Объясняю четыертую. !!VRv1&v1=0:S1;
!! – реактор (ресивер), VR – приемник операций с переменными (это значит что строка будет посвящена переменным), v – знак целых переменных, 1 – будем править переменную 1,
&v1=0 – условие ( если переменная 1=0), S1 – установить переменную в 1. Прочитаем строку.
Если переменная 1 равна 0, то установить её значение в единицу (1).
Третья строка практически не отличается от то второй, за исключением того что теперь сообщение будет выдаваться если переменная 1=1. Всё это означает что при втором посещении объекта будет выдаваться второе сообщение. Прочитаем всё это вместе.
При посещении объекта в точке B1/1/0, выдать сообщение «Текст», при условии что переменная 1=0, и после выдачи сообщения если переменная 1=0, то установить её в 1. Если посетить этот объект второй раз, то так как переменная 1уже равна 1 (1=1) выдать сообщение «Текст 2».
Так как переменная 1=1, то сообщение «Текст» не будет выдано ( потому что по условию выдачи сообщения переменная 1 должна ровняться 0 (v1=0)).
Видите, ничего сложного. Причём не обязательно чтоб при посещении именно объекта в точке 1/1/0 установить 1 в единицу. Можно сделать и так:
!?OB1/1/0;
!!IF&v1=0:M^Текст.^;
!!IF&v1=1:M^Текст 2.^;
!?OB2/2/0;
!!VRv1&v1=0:S1;
Это означает что при посещении объекта в точке 1/1/0 будет выдаваться сообщение «Текст» до тех пор пока не будет посещён объект в точке 2/2/0 (при посещении этого объекта переменная 1 будет установлена в 1 (1=1)). После посещения объекта в точке 2/2/0, при посещении объекта в точке 1/1/0 будет выдаваться сообщение «Текст 2».
Как видите это очень полезно. Также при записи можно использовать не только знак =. Можно и знаки больше и меньше (< >). То есть 1>1, или 1<1 (если переменная 1 больше 1, или меньше 1).
Но переменные могут использоваться не только для выдачи сообщений. Очень много команд используют переменные. Допустим приведу пример для выдачи артефакта.
!?OB1/1/0;
!!IF&v1=0:M^Текст.^;
!!IF&v1=1:M^Текст 2.^;
!!HE-1&v1=1:A7;
!?OB2/2/0;
!!VRv1&v1=0:S1;
Как видите в наш пример добавилась ещё одна строчка. Разберём её.
!!- реактор, HE-1 – приёмник героя (-1 означает текущего героя, то есть команда будет срабатывать для любого героя), &v1=1 – если переменная 1=1, A7 – дать герою артефакт номер 7 (секира кентавра).
Вот. Это значит что артефакт будет выдаваться только если переменная 1=1(а для этого нужно посетить объект в точке 2/2/0. Правда у этого скрипта есть не большая оплошность. При КАЖДОМ посещении объекта в точке 1/1/0 если переменная 1=1 ВЫДАВАТЬ герою «Секиру кентавра»!!! Вот читерство! Сколько не зайди, столько артов и получишь. Будем исправлять.
!?OB1/1/0;
!!IF&v1=0:M^Текст.^;
!!IF&v1>=1:M^Текст 2.^;
!!HE-1&v1=1:A7;
!!VRv1&v1=1:S2;
!?OB2/2/0;
!!VRv1&v1=0:S1;
Добавилась строчка !!VRv1&v1=1:S2;
Как видите после посещения объекта в точке 1/1/0, а 1=1 поставить переменную 1 в 2, но так как команда о смене значения переменной стоит после команды о выдачи артефакта, то артефакт будет выдан, и только после значение переменной измениться.
Также немного изменена строчка о выдачи сообщения «Текст 2». Теперь сообщение будет выдаваться если переменная 1 больше или = 1. Так как после получения артефакта переменная 1 будет равна 2 (1=2), то старое сообщение переставало бы работать (потому что условием для работы сообщение было значение переменной 1 (1=1)). Теперь сообщение будет работать при любом значении переменной 1 ели это значение больше или ровно 1.
Вообще всё это не очень сложно и быстро запоминается. Если что-то не понятно то спрашиваете. Вот и всё. Там конечно ещё куча всего но основы объяснил. Нужно ещё объяснить флаги. Надёюсь это сделает кто-то другой. Если нет… Эх! Придётся и это объяснять.
[sergroj] Исправил ошибку, которую нашел gamecreator
Рогатый Змий
23 Aug 2006, 14:34
Цитата
Soul Reaver:А если вам хочется чтоб после посещения этого объекта, и посещении его повторно выдавалось другое сообщение?
Еще можно то же самое сделать c помощью флагов...
Вот так
!?OB1/1/0;
!!IF&-10:M^Текст при первом посещении^;
!!IF:V10/1;
!!IF&10:M^Текст при последующих посещениях^;
Ну это понятно уже что
!?OB1/1/0; - проверка посещения объекта.
!!IF&-10:M^Текст при первом посещении^; - !!IF- менеджер флагов, &-10 ресейвер сработает если флаг 10 установлен на ложь
(по умолчанию это так)
!!IF:V10/1; - После первого сообщения ставим флаг 10 на правду
и при последдующих посещениях будет срабатывать только
вот этот ресейвер:
!!IF&10:M^Текст при последующих посещениях^;и соответственно этот ресейвер
!!IF&-10:M^Текст при первом посещении^;срабатывать больше не будет...
Код
все команды делятся на две принципиальные части - триггеры и реакторы.
триггеры - это особые команды, принимающие на себя обработку события.
код триггера состоит из двух частей: заголовка (собственно команда
триггера) и последующий код обработчика, составленный из реакторов.
формат триггера: !{?|$}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
условия пишутся после параметров триггера, реактора или инструкции
gamecreator
28 Aug 2006, 15:59
Цитата(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;
Скриптеры, не забывайте об этом!
DracoLich
23 Sep 2006, 11:03
Как создать свой первый скрипт
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 в этом северо-западном углу поверхности!^; [показать сообщение]
DracoLich
23 Sep 2006, 18:58
Как создать свой первый скрипт (часть 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; [восстановить силу защищающегося]
Опять же имеется проверка на изменение и существование героя-защитника.
Мы должны были хранить числа героев, потому что если герой убежал с поля битвы, мы бы уже не смогли найти его параметры.
Наш скрипт готов!
DracoLich
05 Oct 2006, 15:05
Как создать свой первый скрипт (часть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, если плата произведена]
Demiurg
13 Jun 2007, 23:54
Получение/Определение/Установка типа артефакта у утопающего:
!!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#;
sergroj
09 Sep 2007, 12:45
Код
В: Как установить, что имеется в "Обломках", находящихся на воде?
О: Используем команду OB:C, возможные значения:
0 - ничего ценного
1 - 5 древесины
2 - 5 древесины, 200 золота
3 - 10 древесины, 500 золота
(с) пост DracoLich'а
Demiurg
11 Sep 2007, 20:31
Как управлять содержимым пандоры?
Для пандоры работает ресивер !!LE
Данное свойство уже используется в скрипте 25 WoG в разделе spell banning.
Demiurg
15 Sep 2007, 14:25
Как пользоваться !!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 с помощью этой команды можно сделать больше. Но в любом случае вы ее используете на свой страх и риск.
Demiurg
27 Sep 2007, 22:46
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
sergroj
07 Oct 2007, 18:17
Передача переменных между картами компании
Для передачи информации между картами можно использовать только переменные v501-v997, z301-z500, w51-w100 и "полученные" переменные нельзя менять не протяжении карты. Если есть желание их изменить, их нужно копировать в новые переменные на старте карты и работать с новыми, спокойно их меняя.
Причина:
Переходят между картами только переменные v501-v997, z301-z500, w51-w100, остальные обнуляются на старте карты. Более того, если изменить переходящие переменные внутри карты, то при рестарте карты они останутся измененными, а не загрузятся из состояния перехода между картами.
основные исследования by Druin
DracoLich
18 Oct 2007, 13:04
Документы 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.
В справке не совсем понятно, как работает арсширенный синтаксис !!EA:F
Вот что там сказано:
Цитата(ERM-Help © DracoLich)
F$1/$2/$3 $1 -
номер способности $2 - модификатор (-1 = не имеет значения, выбирается самая первая подходящая линия)
$3 - переменная для записи результата
Здесь не понятно, что писать для $2 (толи как для модификатора 6 в HE:C; толи как для модификатор в EA:

И с $3 не совсем понятно, что там писать... либо номер v-переменной, либо полностью переменную (типа y5) причём не указано, какую именно переменную здесь использовать (можно ли любую, или опять же только v#)

Разъясните кто-нибудь
DracoLich
31 Oct 2007, 10:31
2Bes
Ну, раз мы имеем ПОИСК линии бонуса, то логично предположить (хоть это и не указано в справке

), что модификатор - не что иное, как модификатор способности к EA:B.
А переменная $3 может быть любой (по крайней мере, обратное не указано)
gamecreator
31 Oct 2007, 16:05
так:
$1 - номер способности (формат SE1)
$2 - номер подспособности (форматы расширения SE2-5)
$3 - номер линии
т.е. подспособность - это параметр способности, т.е. например способность иммунитет к спелам - подспособность ко всем
Д'якон
09 Nov 2007, 15:48
Решил поделиться небольшим опытом в использовании !!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.


Вывод: определится с целью поиска, постараться чтобы в игре изменялся только этот параметр.Ну вот с первым примером закончили.
Д'якон
09 Nov 2007, 16:21
Задача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ричную систему исчисления.






Вывод: обычно похожие по смыслу значения хранятся в близком диапазоне - блоке памяти или массиве значений. Чтобы найти откланения между значениями, в данном случае между значением стоимости двелингов, нужно найти еще значение стоимости второго двелинга и найти разницу между адресами. Можно быть уверенным, что и остальные стоимости двелингов находятся на одинаковом смещении друг от друга.
Д'якон
09 Nov 2007, 21:26
Задача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. За объяснениями в использовании ресивера или приведенных уроков пишите в ПМ.
Цитата
Но, оказалось, что понятия номер стэка вообще отсутствует в коде. Т.е. как бы Вы не старались найти в коде значения номеров стэка - ничего не выйдет.
Присутствуют. Два массива, номера стёков: 0..20/21.
MasterOfPuppets
19 Feb 2009, 12:39
Просто открыл для себя, когда делал кнопки передачи отрядов в городе.
Команды !!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;
Здравствуйте уважаемые.
А не могли бы вы подсказать, как еаписать скрипт (конечно если это возможно) как бы наделить юнита новой спасобностью ну например при атаки этот юнит имеет шанс кастануть магию на того которого атакует ну например взрыв.
И если можно описать все шаги по подробнее.
Зарание благодарен.
MasterOfPuppets
01 Mar 2009, 10:07
Операция удаления бит из переменной не вопринимает переменные с отрицательным знаком перед ними. То есть, команда типа !!VRv1:&-y1; выдаст вам ошибку. Минус должен быть "внутри", в самой переменной:
!!VRy1:S0-65;!!VRv1:&y1; - удалить 7-ой бит из переменной v1.
MasterOfPuppets
08 Mar 2009, 06:07
В подавляющем большинстве случаев индекс z-переменной для синтаксиса "Установить" вообще не нужен. Вместо этого можно поставить либо просто её номер, либо переменную, куда этот номер занесён. К примеру, прекрасно работают такие конструкции:
Код
!!VRz999:S^button.wav^;!!SN:P999;
Код
!!VRz-1:S^mop.txt^;!!DL:N-1;
Код
!#HT63/27:V590/0/2419;
А эти две команды лучше не путать:
Код
!!VRz-1:S2430+1; - установить z-1 на z2430(ERT)+z1
!!VRy1:S2320+x16;!!VRz1:Sy1; - прибавить к номеру ERT-переменной значение текущего круга функции и передать значение y1, после чего установить z1 на значение ERT, чей номер хранит y1.
Широкий простор для круговых функций и возможность использовать ERT-файл вместо ini:
Код
!!DO1/0/155/1:P180000/180156;
!?FU1;
!!VRy1:Sx1+x16;!!VRy2:Sx2+x16;
!!HEx16:B0/y1 B1/y2;
Установить героям имена из секций 180000-180155 и биографии из секций 180156-180310 ERT-файла.
Код
*towns building, dialog box
!?FU2040;
!!VRvx3&x16=0:S2;
!!VRy1:Sx1+x16;!!VRy2:Sx2+x16;
!!VRvx3&vy1>=vy2:+1;
!!if&x16=7:;!!DL159&vx3<>10:Ax4/4/2;!!DL159&vx3=10:Ax4/4/1;!!en:;
!?FU2041;
!!if&x16<>x1:;!!VRy1:S30+x16;!!VRy2:S10+x16;!!VRz1:S^^;!!DL159:Ay1/3/z1;!!DL159&vx16=10:Ay2/4/1;!!DL159&vx16<>10:Ay2/4/2;!!en:;
!?FU2042;
!!if&v999=x16:;!!VRy1:S30+x16;!!VRy2:S10+x16;!!VRy3:S2320+x16;!!VRz1:Sy3;!!VRz2:S2331;
!!DL159:A98/3/z2 Ay1/3/z1;!!DO2041/1/10/1:Px16;
!!if&vx16=10:;!!DL159:Ay2/4/0 E100/1;!!SN:P999;!!VRv9022:S-1+x16;!!en:;
!!if&vx16<>10:;!!DL159:E100/0;!!VRy66:S0 R1;!!VRz-1:S^no%Y66.wav^;!!SN:P-1;!!en:;!!en:;
!?FU2043;
!!VRy1:Sx1+x16;!!VRz1:Sy1;!!VRy2:Sx2+x16;!!VRvy2:Vz1;
!!DO2040/0/7/1&x16=7:P24;
!?FU2044;
!!VRy1:Sx1+x16;!!VRz-1:Sy1;!!VRy2:Sx2+x16;!!DL159:Ay2/3/z-1; - всего 5 функции, описывающие у меня диалог постройки города. Сжатие, на мой взгляд, шедевральное.)
В подсказках для объектов стоит "ограничение" на z32000. Учитывая это, а также использование почти повсеместно локальных переменных, жалобы Aleee на недостаток 1000 глобальных стрингов несколько беспочвенны.
!!IF:Q1/9999999998;
!!FU&-1:E;
!!VRz1:S^^;
!!IF:D1/1/9999999999/1/1/1/1/1/1/1/1/1/1/1/1/1; - здесь ограничение по номеру бог знает где. Если ERT с таким номером есть, то диалог её покажет.
Прим.: команда, в которой ни ERT-номер, ни отсутствие индекса z-переменной не действуют - VR:V. Однако косвенного обращения вроде !!VRv2:Vzv1; - никто не отменял.
Юзайте ERT-формат и пишите хоть целые романы по слову на переменную.)
Попробуй через статические переменные названия артов и их описания поставить.
Пытаюсь вспомнить ерм... не получается... а ведь когда-то такие скрипты писал...
так вот. скрипт в файле в папке мапс.
1. #UN:G1/170/0/S^Наёмные стрелки^;
На команду не ругается, но имя снайперов остаётся тем же. Почему?
Не работает так же
!#VRz179:S^Наёмные стрелки^;
!!UN:G1/170/0/z179;
2. Попытка вставить любой ресивер или триггер потом ресивер кончается ошибкой. пример
!#TM4:1/1/0/1;
!?TM4;
!!UN:G1/171/0/z179;
Что делать?
Добавлено ([mergetime]1237630611[/mergetime]):
Пытаюсь вспомнить ерм... не получается... а ведь когда-то такие скрипты писал...
так вот. скрипт в файле в папке мапс.
1. #UN:G1/170/0/S^Наёмные стрелки^;
На команду не ругается, но имя снайперов остаётся тем же. Почему?
Не работает так же
!#VRz179:S^Наёмные стрелки^;
!!UN:G1/170/0/z179;
2. Попытка вставить любой ресивер или триггер потом ресивер кончается ошибкой. пример
!#TM4:1/1/0/1;
!?TM4;
!!UN:G1/171/0/z179;
Что делать?
Мурсинушка
21 Mar 2009, 14:32
Надо так наверное
!#UN:G1/170/0/S^Наёмные стрелки^;
В общем проблема в первых двух символах.
наверно так надо
!#VRz178:S^Наёмный стрелок^;
!#VRz179:S^Наёмные стрелки^;
!#UN:G1/170/0/178;
!#UN:G1/170/1/179;
Цитата(major @ 21 Mar 2009, 19:22)
наверно так надо
!#VRz178:S^Наёмный стрелок^;
!#VRz179:S^Наёмные стрелки^;
!#UN:G1/170/0/178;
!#UN:G1/170/1/179;
Большое спасибо, отлично работает!!!
Только непонятно, почему только с переменными - где же я столько переменных подряд возьму? Ужасно неудобно!!!
Цитата(Virsavia @ 21 Mar 2009, 15:32)
Надо так наверное
!#UN:G1/170/0/S^Наёмные стрелки^;
В общем проблема в первых двух символах.
Нет, так увы не работает, хотя очень хотелось бы. Эта инструкция "не ест" строки, только строковые переменные
Добавлено ([mergetime]1237661241[/mergetime]):
А есть какая-нибудь нормальная справка по ерм для программеров? Я когда начинал много лет назад, как раз читал такую

Только сейчас я уже всё забыл, а справки кривые и для чайников. А то обычные справки сначала тебе описание для новичков дают, а потом списки триггеров и ресиверов. Ни тебе синтаксиса, ни переменных - никакой системы, царя в голове вообще нет. Я понимаю, что ерм скрипты пишут одни гуманитарии и ламеры

, но всё-таки? Как сообщения выводить (для отладки искал) нашёл только случайно и в примерах

Серьёзных вещей с такими справками не сделаешь, приходится в стандартных скриптах лазать, а это неприлично долго

Подскажите плиз "правильную" справку, буду очень благодарен
hippocamus
21 Mar 2009, 22:46
Да, переменные будут использоваться.
Есть выход - создать ERT-файл. Там будут использоваться уникальные z-переменные с очень большими номерами.
!!UN статические переменные не берет зараза.