Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Тонкости ЕРМ, использование UN:C
DF2 :: ФОРУМЫ > Игровые форумы > Heroes of Might & Magic III > Моды > Скрипты
Страницы: 1, 2, 3, 4
sergroj
Тема явно назрела. Информация разбросана по форуму, пора ее собрать воедино.

Темы по сабжу:
ERM Artifact Manager
Флаги монстров
Скрипт: Функция замены некоторых константных строк
Баги в ЕРМ
Функции для расширенной настройки стрельбы
Secondary skills manager for TE
Подгрузка дефов для монстров, звуков монстров и дефов строений в замке

Особенность !!BG
Если монстр совершает действие 6 (подойти и ударить), то с помощью BG:S можно проверять и менять позицию, с которой он будет бить.

P.S. тоже не забывайте про жирный шрифт.
ShadowTheAge
Недокументированная особенность !!AR:V;

Для артефактов можно устанавливать тип подбора:
0 - Арт просто без базара поднимается
1 - Предложение купить арт за 2000 монет
2 - Для поднятия арта требуется мудрость
3 - Для поднятия арта требуется лидерство (некромантам не повезло...)
4 - Предложение купить арт за 2500 монет и 3 дерева
5 - Предложение купить арт за 3000 монет и 5 дерева
6 - У арта есть охрана (еще один способ ее включить)
Все значения большие 6 делают артефакт неподнимаемым.
Demiurg
Особенность !!BG
Если существо может кастовать магию (Архангелы, Питлорды, etc.), то ее можно скастовать с помощью
!!BG:A10 S-1 Dx1;
(На позиции x1 должен располагаться объект, на который кастуется магия)
sergroj
!!BF:O может ставить невидимые препятствия
!!BF:O можно подавать -1 в качестве препятствия. Оно невидимо и занимает 1 клетку. Так что можно сделать картинку для поля боя с рассчетом на непроходимость некоторых мест, и сделать их непроходимыми с помощью невидимых препятствий.

Уточнение DracoLich'а: Убрать Препятствие не работает на такие препятствия; диспел не имеет воздействия тоже.
sergroj
Безопасная проверка !!MO:M, B, A
При использовании даже get синтаксиса этих команд для монстра, не имеющего сообщения или награды, вылетает ошибка.
Но можно проверить, имеет ли их монстр. Это хранится в старшем бите OB:C. Так что достаточно проверить знак OB:C:
!!OBx/y/z:O?v1;
!!IF&v1<0:M^Монстр настроен^;

Если установить этот бит, монстр будет иметь те же настройки, что первый монстр, настроенный в редакторе (настроенный - в смысле имеющий сообщение или награду).
В 3-м байте хранится индекс в массиве настроек (M, B, A) монстров, умноженный на 8. Точнее, он хранится не умноженным, а смещенным на 3 бита. Сам массив выделяется динамически.
В младших 12 битах OB:O хранится количество монстров.
Еще, артефкт в награду можно убрать с помощью !!MO:A-1.
sergroj
Неописанные заклинания
В списке заклинаний (формат SP) нет вот этих заклов:

Указанные в !!BM:M
70. Stone
71. Poison
72. Bind (permanent)
73. Disease
74. Paralyze
75. Age

Нигде не указанные
76. Death Cloud
77. Thunderbolt
DracoLich
В моей справке все это указано. И еще:
78 Снять полезные заклинания
79 Смертельный взгляд
80 Кислотное дыхание
Миханик
Незадокументированный параметр для !!MN:R
Кроме дерева..золота 0..6, можно указать 100. По-видимому, такая шахта вообще ничего не производит.
И ещё:
Возможность создания объектов с синхронными параметрами
хм.. я правильно сказал - синхронными? Смысл в том, что у некоторых объектов с большим числом параметров (напр. шахты, гарнизоны) контрольное слово не хранит эту информацию, а только указывает на нее, т. е. для каждой шахты и т. п. указан свой номер. И вот если его сделать одинаковым, то их параметры будут храниться в одном месте, и синхронно изменяться. Это могут применить мапмейкеры для создания "существообменника", как во второй миссии "Самаритянина". Правда проверял это я только для шахт.
И ещё: было бы неплохо выложить результаты наложения !!BM:M для мгновенных заклинаний. Например, я слышал, что ледяная молния окрашивает в синий свет. Кстати, насчёт !!BM:M уже писал ShadowTheAge вот здесь.
Demiurg
Функция для установки преобразований существ в Skeleton Transformer (TE).
Код
!?FU#;
;x1 - monster's number
;x2 - mode ( 0 - read, 1 - write)
;x3 - number of creature transformed
!!VRy1:S8142080;// table's address
!!VRy2:Sx1*4;
!!VRy1:+y2;
!!UN&x2=0:Cy1/4/?x3;
!!UN&x2=1:Cy1/4/x3;
ShadowTheAge
Особеность реализации !!BM:G
!!BM:G - это "неаккуратно" сделанная функция, позволяет менять сотни характеристик существа, не только наложенные заклинания.

Вызов: !!BM:G#/$/d;
# - некоторый номер, если это 0..65 то будет работа с заклинаниями (нормальное функционирование ресивера), но если использовать другие значения, можно изменять любую информацию о монстре, как доступную (атака, здоровье), так и недоступную (например, звуки, анимацию)

$ - номер. Во избежание ошибок, "/d" в конце обязательно.

Таблица:
-100: Видимость существа (4 - виден, 8 - не виден)
Комментарий DracoLich'а: Отряды теряют невидимость при любом действии на поле боя. Но ее межно восстановить в триггере !?BG1 - ShadowTheAge
-90:  Есть ли цифры количества существ? 0-есть, 1-нет.
Комментарий DracoLich'а: отряд не имеет обозначения кол-ва существ, пока не походит. При этом на него можно колдовать магию и бить. Кол-во показывается при щелчке правой кнопки в нижнем правом углу картинки (где обычно, в общем). Аналогичное возражение - ShadowTheAge
-89:  Тип существа
Комментарий DracoLich'а: параметры отряда становятся как у существа, номер которого поставлен, но сразу же снижаются до стандартных параметров сущ-ва, которое меняют. имя отряда в меню при щелчке правой кнопкой по существу меняется; когда его бьют - имя остается измененным. когда битва окончена - на картинке будет показан настроенный отряд, а не старый. Если изменить тип существа, битву становится невозможно выиграть (вроде как комп требует убить того, на кого нападал, и изменения типа существ = вызову изменнного существа). Действительно проблема, делающая параметр почти бесполезным - ShadowTheAge
-88:  Позиция существа (если сменить, на старом месте останется стоять копия. Копия не может ходить и быть атакованой, занимает место)
-87:  Номер анимации
Комментарий DracoLich'а: при значение 2,6,9... (много еще где) игра выдает черный экран; кадры берутся в том порядке, как и при создании (надо бы найти хелп по дефмейкеру, где описан каждый шаг, и выдрать оттуда). Не сталкивался почему-то... - ShadowTheAge
-86:  Номер кадра в анимации
     Анимация возвращается к нормальной, если навести мышкой
-83:  Количество существ
-82:  Количество существ для отображения (может не совпадать с количеством. В этом случае написано будет одно, а реально другое). По умолчанию -1 - значит "полностью совпадает с реальным".
Комментарий DracoLich'а: после того, как любое сущ-во попадет под атаку, данному значению станет равно количество реальное; в итогах битвы показывается реальное количество убитых; при атаке измененного существа фантомные монстры не учитываются (т.е. если изменить 10 монстров на 100 этой командой, то урон будет нанесен именно этим 10). Поступаем как и с невидимостью - ShadowTheAge
-81 - безвозвратные потери. Количество существ после выигранной битвы (или после откупа) равно "текущее количество существ" минус "безвозвратные потери". Потери могут быть записаны в безвозвратные при использовании, например, после воскрешения на уровне none или basic. - by Demiurg
-80:  Разнича между текущим здоровьем и полным. Если 0 значит стек здоров.
-78:  Количество существ в начале боя
-73:  Город-владелец
-71:  Флаги существа
-68:  Название существа
-67:  Название существа (множественное число)
-66:  Строка состояния (например "Нет штрафа рукопашной")
-54:  Здоровье (полное)
-53:  Скорость
-52:  Атака
-51:  Защита
-50:  Мин. урон
-49:  Макс. урон
-48:  Боезапас
-41:  Владелец глючит
-40:  Что делает ХЗ. Но явно чето делает. Попробуйте, смотрится прикольно smile.gif
-38:  Смещение существа по Y
-37:  Смещение существа по X
     От того места где должен быть. В пикселях
-19:  Смещение по оси OX прямоугольника с количеством существ.
-17:  Частота проигрывания случайной анимации.
     Чем меньше тем чаще. Поставьте 200, будет без перерыва
-13:  Анимация существа
-12:  Анимация снаряда
-10:  Звук перемещения
-9:   Звук атаки
-8:   Звук урона
-7:   Звук выстрела
-6:   Звук смерти
-5:   Звук защиты
-1:   Кол-во активных заклинаний (для отображения цвета кол-ва существ)
173:  Кол-во активных заклинаний (Для отображения при щелчке правой кнопкой)
212:  Мораль существа
213:  Удача существа
Комментарий Demiurg'а: Мораль и удача пересчитывается при передаче хода другому существу. Поэтому полезно только для получения или проверки. Если очень нужно менять то можно делать это или перед атакой, или каждый ход - ShadowTheAge

Что-нибудь еще желаете увидеть в таблице? Пишите мне в асю или личку.
Синим выделены не мои исследования (спасибо всем за помощь)
Красным выделены строковые параметры - для изменения вам потребуются функции для работы со строками на низком уровне - см. следующий пост.
Серым выделено то, что менять проблемно - я могу только посоветовать прочитать данные у одного монстра и поставить их другому.
ShadowTheAge
Прелюдия:
Функция для работы со строками на низком уровне
Иногда при работе с !!UN:C требуется работать со строками. Приходится писать для этого функции. Написать их несложно, но так как я (наверно) буду часто их использовать в своих скриптах, то выложу их здесь:
Код
!?FU12925; Получение адреса z переменной номер x1 (возврат в x2)
Поддерживаются версии: 3.58, ТЕ
!!UN:V?y1/?y2;
!!VRy3&y1=358:S40225400;
!!VRy3&y1=359:S9597416;
!!VRx2&y3=0:S0;
!!FU&y3=0:E;
!!VRx2:Sx1*512+y3;

!?FU12926; Копирование строки по адресу. x1 - источник, x2 - приемник.
!!DO12927/0/511/1:Px1/x2;

!?FU12927;
!!VRy1:Sx1+x16;
!!VRy2:Sx2+x16;
!!UN:Cy1/1/?y3Cy2/1/y3;
!!VRx16&y3=0:S511;


А теперь сразу же полезный скрипт, использующий их.
Проигрывание любой .def анимации на юните в бою

Данный скрипт позволяет проигрывать любую анимацию на люьом юните в бою (то есть не только из списка формата AC)
Код
!?FU12930;
!!UN:V?y10/?y11;
!!VRy12&y10=358:S69016332;
!!VRy12&y10=359:S61479692;
!!UN&y12<>0:Cy12/4/-1;
!!UN:C4454270/4/?y1;
!!VRy1:+660;
!!VRy2:Sy1+8;
!!VRx4:*256+x3;
!!FU12925:Px2/?y5;
!!UN:Cy1/4/?y3Cy2/4/?y4Cy1/4/y5Cy2/4/x4;
!!BMx1:V55;
!!UN:Cy1/4/y3Cy2/4/y4;


Использование функции:
x1 - номер стека в бою
x2 - номер z переменной, в которой хранится имя .def файла для проигрывания
примечание: Для работы требуется функция 12925 из функций работы со строками
x3 - позиция относительно монстра:
0: Нижняя часть анимации совпадает с нижней частью существа (например, молитва)
1: Центр анимации совпадает с центром существа (например, инферно)
2: Анимация находится сверху существа (пример в голову не лезет)
3: Анимация находится спереди существа (срабатывание гномского сопротивления)
4: Анимация находится в углу возле атакующего героя
x4 - Полупрозрачность (0 - нету, т.е. анимация непрозрачна, 1 - анимация полупрозрачна)

Работают любые деф файлы, хоть с карты приключений, любые. Анимация проигрывается один раз, после чего пропадает.

Это, кстати, мой сотый пост
ShadowTheAge
Поправил скрипт для проигрывания любой анимации - теперь анимация не кешируется (по крайней мере я на это очень надеюсь).

Добавил в таблицу комментарии Demiurg'а и DrakoLich'а (с указанием авторства). Этот и два предыдущих поста можно удалить.

З.Ы. Я (в принципе) могу сделать редактирование таблицы Combat Animations. Нужно это?
gamecreator
что означает полупрозрачность? как воскрешение?
а можно проиграть анимацию с кадра по кадр?
ShadowTheAge
Полупрозрачность - как молитва, воскрешение, лечение, страх, ...
Непрозрачное: Мораль, проклятие, старость, болезнь, ...

К сожалению скрипт сейчас лучше не использовать, т.к. имеют место некоторые проблемы с кешированием. "Хорошее" решение этой проблемы к сожалению найти не удалось...

Проиграть анимацию с кадра по кадр нельзя, т.к. для проигрывания анимации я пользуюсь штатным !!BM:V;

Скрипт сегодня-завтра поправлю чтобы работал. Я уже и забыл про эту ошибку.
hippocamus
Написано Deo
Он эту тему стёр, но я считаю, что это нужная функция, записал её сюда.


Простенькая функция для работы с календарем. Можно узнавать и задавать текущую дату.
Проверено на ТЕ 1.03 и Phoenix Mod 1.5
Да, действительно, на 3.58 не работает...

Код
!!FU#:P1/?день/?неделю/?месяц;    узнать текущую дату
!!FU#:P0/день/неделя/месяц;        задать текущую дату


!?FU#;
!!VRy1:S8654048;!!UN:Cy1/4/?y1;
!!VRy2:Sy1+2;
!!VRy3:Sy2+2;
!!UN&x1=0:Cy1/2/x2;!!UN&x1=0:Cy2/2/x3;!!UN&x1=0:Cy3/2/x4;
!!UN&x1=1:Cy1/2/?x2;!!UN&x1=1:Cy2/2/?x3;!!UN&x1=1:Cy3/2/?x4;
Bes
А у меня твоя функция, как и Део под ВоГ не работает smile.gif

Правильный адрес дня под Вог имеет следующий вид:
!!UN:C8579100/4/?y1;
!!UN:Cy1/2/?@текущий день@
ИМХО
sergroj
Установка объектов с произвольным видом с помощью ERM
Несколько раз возникали вопросы про установку объектов типа/подтипа, у которого есть несколько вариантов с разными def'ами.
Это можно сделать:
1) На своей карте. Для этого надо поставить куда-нибудь на карту объект одного из неиспользуемых типов с каким-нибудь уникальным подтипом и нужным дефом. Затем использовать эти тип/подтип в качестве внешнего вида в UN:I (параметры #6 и #7 в версии с 9 параметрами)
2) В общем скрипте. Для этого придется модифицировать zobjcts.txt. Точно также, надо добавить объект незанятого типа/подтипа с нужным дефом и использовать в качестве внешнего вида в UN:I.
Так же можно использовать новый def в скрипте.
Миханик
Представляю общественному вниманию плоды моих графоманских изысканий. Это описание контрольных слов разных типов объектов в формате RTF. Появилось как развитие моего поста от 8 октября в этой теме, но там не только персональные номера. Есть кое-что новое, в том числе - описание КС Фонтана удачи (ранее я его не встречал). В конце файла небольшой списочек, там сжато некоторые интересные факты. Документ расчитан скорее на рядовых пользователей ВоГ, возможно, его стоили выложить в "Обучении ЕРМ"? Так что вот так.
Файл можно ; залил бы в архив на woggrad.ru, но что-то не допёр, как туда закачивать. Хотя ранее я туда уже что-то выкладывал, но вот забыл. или браузер глючит, подло не показывая кнопку закачки. никто не просветит на эту тему (лучше в ПМ, дабы не флудить)?
Возможно, потом выложу содержимое файла прямо в этот пост.
sergroj
Мощно!
Дополнение: Маяк и Шахта (и Заброшенная шахта) обладают одинаковыми контрольными словами и мояк можно редактировать через !!MN. Его ресурс (MN:R) имеет номер 100. Если поставить номер 0..6, то маяк начнет приносить ресурсы, как шахта smile.gif Охрана маяка игнорируется. Также интересно менять охрану заброшенной шахты - после стандартного сообщения о троглодитах будет происходить драка с заданными монстрами в заданных количествах. Если охрану убрать, то шахта берется без боя. А если поставить шахте ресурс 7, то при взятии будет выводиться сообщение про золото и картинка мифрила с подписью "-33652069". К сожалению, мифрил добавляться не будет.
sergroj
Получение адресов переменных ВоГа
При работе с UN:C бывает нужно получить адрес какой-то Z-переменной. Вот скрипт, записывающий адрес z1 в v4138: (работает в 3.58, TE и в любой версии ВоГа, поддерживающей используемые команды)
Код
ZVSE

* This code puts address of z1 to v4138

!#UN:A0/9/?y10; [backup Z var number]
!#UN&y10<0:A0/9/?z-1; [backup string (3.59)]

!#UN:A0/9/1; [art0.Name = z1]
!#UN:C6687592/4/?y1; [get artifacts array address]
!#UN:Cy1/4/?v4138; [get art0.Name which is z1 address. Name goes first in art info, so y1 points to art0.Name]
[v4138 holds address of z1 now]

!#UN&y10>=0:A0/9/y10; [resture Z var number]
!#UN&y10<0:A0/9/z-1; [restore string (3.59)]

Адрес других Z-переменных: v4138 + 512*(номер_переменной - 1). Например для z50: v4138 + 512*49.
Если понадобится адрес иной (не Z) переменной, то просто найдите в AtrMoney ее адрес, вычтите адрес z1 и используйте v4138 + разница_адресов. Правда, в 3.59 эта разница изменится.
sergroj
Вместо MR:N для TE
MR:N не работает в 3.58f и TE. Эта функция его заменяет. Только для exe'шника TE:
Код
!?FU8229;
!!UN:C42231940/4/?x1; [TE only - get MR stack]
!!UN:C6919200/4/?y1; [get combatManager]
!!VRx1:-y1 -21708 :1352;

Соответственно, вызывается так:
!?MR0;
!!FU8229:P?v1;
!!IF:M^%V1^;

[edit] Необходимо проверять, что номер полученного стека находится в диапазоне 0..41, т.к. иногда игра вызывает MR:N для временной копии какого-нибудь монстра - номер её оригинала так не получить.
Миханик
Функция для управления подтипом дороги
вообще-то этим должен заниматься 6й параметр TR:T, но он этого почему-то не делает. пришлось самому искать. таблица, где записан подтип (и не только он), располагается по адресу, на к-рый указывает указатель, к-рый располагается по адресу, к-рый на 130112 больше, чем тот, на к-рый указывает указатель, находящийся по адресу 69953816. записи имеют длину 38 и сортированы по XYL, подтип дороги в них на смещении 9. просто и понятно. на сием и основана функция:
Код
!?FU20113;
!!UN:C6919480/4/?y1;
!!VRy1:+130112;
!!UN:Cy1/4/?y2 X?y3/?y4;
!!VRx3:*y3 +x2 *y3 +x1 *38 +9 +y2;
!!UN&x5=0:Cx3/1/x4;
!!UN&x5<>0:Cx5/1/?x4;
Вызов:
!!FU20113:P#1#2/#3/$/#4;
!!FU20113:P#1/#2/#3/$; (#4=0)
#1/#2/#3 - X/Y/L - координаты
$ - значение подтипа дороги
#4 - 0 - установить $, любое другое значение - получить $.
кстати, можете меня поздравить - это первое моё опубликованное достижение в области артманелогии.
hippocamus
Отлично! Спачибо.
Кстати, "получить" подтип по-моему вполне воззможно было бы с TR:T
Нет разве?
sergroj
Нет, в TR:T параметр подтип дороги работал, как подтип реки.
Еще можно получить тип и подтип объекта, находящегося на клетке - это 2-байтовые числа по смещениям 30 и 34 (вместо 9 для типа дорги).
Миханик
Контроль типа нанимаемого в Портале Вызова существа
Код
!?FU20114&x1=-1;
!!UN:C6919500/4/?y1;
!!VRy1:+56;
!!UN:Cy1/4/?y2;
!!VRy2:+60;
!!UN&x3=0:Cy2/4/x2;
!!UN&x3<>0:Cy2/4/?x2;
!?FU20114&x1<>-1;
!!UN:C6933756/4/?y1;
!!VRy1:+2884;
!!UN:Cy1/4/?y2;
!!VRx1:*360 +60 +y2;
!!UN&x3=0:Cx1/4/x2;
!!UN&x3<>0:Cx1/4/?x2;
Вызов:
!!FU20114:P#1/$/#2;
!!FU20114:P#1/$; (#2=0)
#1 - № города (-1 - текущий)
$ - тип существа. -1 - значит нет Портала или ещё не сгенерирован тип (сгенерируется при заходе).
#2 - 0 - установить $, любое другое значение - получить $.
Ещё кое-что насчёт картинок для IF
Опыт с подтипом -1 даёт картинку опыта с подписью "+1 уровень", как у Древа Знаний.
З. Ы. 2sergroj: там вообще много чего есть. чуть ли не все !!OB и !!TR. но, афаик, усё это уже раскопали в WoG Team до нас.
Миханик
Контроль количества нанимаемых в Портале Вызова существ
Код
!?FU20115&x1=-1;
!!UN:C6919500/4/?y1;
!!VRy1:+56;
!!UN:Cy1/4/?y2;
!!VRy2:+64;
!!UN&x3=0:Cy2/2/x2;
!!UN&x3<>0:Cy2/2/?x2;
!?FU20115&x1<>-1;
!!UN:C6933756/4/?y1;
!!VRy1:+2884;
!!UN:Cy1/4/?y2;
!!VRx1:*360 +64 +y2;
!!UN&x3=0:Cx1/2/x2;
!!UN&x3<>0:Cx1/2/?x2;
Вызов:
!!FU20115:P#1/$/#2;
!!FU20115:P#1/$; (#2=0)
#1 - № города (-1 - текущий)
$ - кол-во существ
#2 - 0 - установить $, любое другое значение - получить $.
примечание. если на первой неделе в город ни разу не заходили (или нет Портала), тип и кол-во существ ещё не сгенерены и количество будет выдавать всякий мусор.
sergroj
Поправка к Порталу Призвания:
Монстр не определен в начале только первой недели. При отсутствии монстра тип равен -1, а кол-во любое.
Миханик
Прочтение результатов диалога HE:C
вот, ещё наковырял. скрипт позволяет после команды HE:C посмотреть, что осталось в верхних (добавляемых) слотах, и, т. о. юзать его не только для добавления существ, но и для оставления, без особых трудностей. Для WoG 3.58 и TE.
CODE
!?FU20116;
!!UN:V=358/?i;
!!VRy1&1:S8585652;
!!VRy1&-1:S8647508;
!!UN:Cy1/4/?x1;
!!VRy1:+4;
!!UN:Cy1/4/?x3;
!!VRy1:+4;
!!UN:Cy1/4/?x5;
!!VRy1:+4;
!!UN:Cy1/4/?x7;
!!VRy1:+4;
!!UN:Cy1/4/?x9;
!!VRy1:+4;
!!UN:Cy1/4/?x11;
!!VRy1:+4;
!!UN:Cy1/4/?x13;
!!VRy1:+4;
!!UN:Cy1/4/?x2;
!!VRy1:+4;
!!UN:Cy1/4/?x4;
!!VRy1:+4;
!!UN:Cy1/4/?x6;
!!VRy1:+4;
!!UN:Cy1/4/?x8;
!!VRy1:+4;
!!UN:Cy1/4/?x10;
!!VRy1:+4;
!!UN:Cy1/4/?x12;
!!VRy1:+4;
!!UN:Cy1/4/?x14;
Вызов:
!!FU20116:P?1/?2/?3/?4/?5/?6/?7/?8/?9/?10/?11/?12/?13/?14;
?1,?3..?13 - типы существ 1..7, ?2,?4..?14 - их количество.
Миханик
Функции для работы с дефами объектов
позволяют менять № данного дефа, и узнавать, какому имени этот № соответствует. сами скрипты не проверял. для WoG 3.58 и TE.
CODE
!?FU20117;
!!UN:C6919480/4/?y1;
!!VRy1:+129924;
!!UN:Cy1/4/?y2;
!!VRy1:+4;
!!UN:Cy1/4/?y3;
!!VRy2:+4;
!!VRy3:-8;
!!DO20118/y2/y3/12:Px1/x2/x3/=y4/?y4;
!!VRx4:Sy4;
!?FU20118;
!!VRx5:Sx4;
!!UN:Cx16/1/=x1;
!!FU&-1:E;
!!VRy1:Sx16 +1;
!!UN:Cy1/1/=x2;
!!FU&-1:E;
!!VRy1:+1;
!!UN:Cy1/1/=x3;
!!VRx5&1:+1;
!?FU20119;
!!UN:C6919480/4/?y1;
!!VRy1:+129924;
!!UN:Cy1/4/?y2;
!!VRy1:+4;
!!UN:Cy1/4/?y3;
!!VRy2:+4;
!!VRy3:-8;
!!VRi:Sx4;
!!DO20120/y2/y3/12:Px1/x2/x3/y3/?y5;
!!VRy5:+2;
!!UN&x6<>0:Cy5/2/x5;
!!UN&x6=0:Cy5/2/?x5;
!?FU20120;
!!UN:Cx16/1/=x1;
!!FU&-1:E;
!!VRx5:Sx16 +1;
!!UN:Cx5/1/=x2;
!!FU&-1:E;
!!VRx5:+1;
!!UN:Cx5/1/=x3;
!!VRi&1:-1;
!!VRx16&i=0:Sx4;
!?FU20121;
!!UN:C2257160/4/?y1;
!!VRy1:+4;
!!UN:Cy1/4/?y2;
!!VRx2:*68 +4 +y2;
!!UN:Cx2/4/?y3;
!!VRz1:S^8+3 символов^;
!!FU12925:Px1/?y4;
!!FU12926:Py3/y4;
!?FU20122;
!!UN:C2257160/4/?y1;
!!VRy1:+4;
!!UN:Cy1/4/?y2;
!!VRy2:+4;
!!VRy1:+4;
!!UN:Cy1/4/?y3;
!!VRy3:+4;
!!VRz1:S^8+3 символов^;
!!FU12925:P1/?y4;
!!DO20123/y2/y3/68:Px1/y3/y4/?y5;
!!VRx2&y5>0:Sy5 -y2 :68;
!!VRx2&y5=0:S-1;
!?FU20123;
!!UN:Cx16/4/?y1;
!!FU12926:Py1/x3;
!!FU&zx1<>z1:E;
!!VRx4:Sx16;
!!VRx16:Sx2;
вызов:
!!FU20117:P#1/#2/#3/?;
получить в ? кол-во дефов, обретающихся по координатам #1/#2/#3; координаты дефа считаются по нижней правой клетке.
!!FU20119:P#1/#2/#3/#4/$/#5;
установить/получить в $ номер #4го дефа на координатах #1/#2/#3. соответственно #5=0 - установить, остальные значения - получить.
!!FU20121:P#1/#2;
получить в z#1 имя дефа №#2. стандартные дефы:
№0 - AVWmrnd0.def
№1 - AVLholg0.def
остальные номера зависят от карты и характера использования UN:I.
!!FU20122:P#/?;
получить в ? номер дефа с именем z#. если деф ни разу не юзался, он не подгружен и номера не имеет. в таких случаях возвращается -1.
используются строчные функции ShadowTheAge. не забудьте их скопировать тоже, если хотите юзать эти.
sergroj
Проверка, доступна ли клетка монстру

!?FU#:Pv1/?v2;
v1 - номер клетки на поле боя
v2:
= 0 - клетка недоступна (из-за радиуса ходьбы или препятствий по пути, или занята препядствием или дружественным монстром)
= 1 - стоит вражеский монстр, которого можно ударить (в том числе, выстрелить), либо сам монстр, который собирается ходить
= 3 - клетка свободна

Код
!?FU#;
!!UN:C6919200/4/?y1;  [y1 = combatManager]
!!VRx1:+y1 +76;
!!UN:Cx1/1/?x2;


[edit] Оказалось, что это информация о затененности клеток, поэтому её нет когда отключен показ полей, на которые может ходить монстр.

Номер клетки 2хклеточного монстра

!?FU#:Pv1/?v2;
v1 - номер клетки на поле боя
v2:
= -1 - одноклеточный монстр или нет монстра
= 0 - левая клетка
= 1 - правая клетка

Код
!?FU#;
!!UN:C6919200/4/?y1;  [y1 = combatManager]
!!VRx1:*112 +y1 +478;
!!UN:Cx1/1/?x2;


Соседи клетки

!?FU#:Pv1/v2/?v3; - возвращает одну из 6 соседних клеток
v1 - номер клетки на поле боя
v2 - индекс соседа (0..5) (порядок - по часовой стрелке, начиная с клетки справа-сверху)
v3 - возвращает номер соседней клетки (-1 если того соседа нет или он вне поля боя, например, клетка 0, клетка 16, ...)

Код
!?FU#;
!!UN:C6919200/4/?y1;  [y1 = combatManager]
!!VRx1:*12 +y1 +78952 + x2;
!!UN:Cx1/1/?x3;
sergroj
FU20119 все-равно не работает. Вылетает с Access Violation.
Код
!?CM;
!!CM:P?v1/?v2/?v3;
!!FU20119:Pv1/v2/v3/0/?v1/1;
!!IF:M^%V1^;
MasterOfPuppets
Прошу, так сказать, проверить домашнюю работу (может, адреса разнятся в разных системах).
Скрипт позволяет создавать новые двеллинги существ с подтипами >100, с корректными названиями как по ПКМ, так и во внутренних текстах. Существа и охрану же в них можно настраивать обычным путём - через DW.
Для теста, конечно же, двеллинг с нужным подтипом нужно разместить на карте.
У меня работает (под ТЕ).

Код
ZVSE
!?PI;
!!UN:I27/22/0/17/101/17/101/-1/0;
!!VRz906:S^Обитель Страха^; название нового двеллинга
!!UN:C4240673/4/?y-1; найти таблицу по одному из указателей
!!VRy-2:S905*512+9597416; адрес z905
!!DO7777/0/103/1:Py-1/y-2; копировать таблицу ссылок на названия двеллингов в z905
!!VRy-3:S101*4+y-2; адрес ссылки на название двеллинга 101
!!VRy-4:S906*512+9597416; адрес z906
!!UN:Cy-3/4/y-4; забить адрес ссылки в нужное место таблицы
!!UN:C4240673/4/y-2; название двеллинга во внутреннем тексте сообщения, указатели на подсказки по правому клику и внизу экрана.
!!UN:C4275832/4/y-2;
!!UN:C4855123/4/y-2;
!!UN:C4240663/4/y-2; подсказка внизу экрана, если объект принадлежит игроку
!!UN:C4275821/4/y-2; подсказка по правому клику, если объект принадлежит игроку
!?FU7777;
!!UN:Cx1/4/?y1 Cx2/4/y1;
!!VRx1:+4;!!VRx2:+4;
Дьяк
Вроде адреса все статические, наверное должно работать. Как раз мне пригодится для новых замков... скоро собирался этим заняться... Спасибо...
MasterOfPuppets
Тут два больших недостатка:
1)Обновления адреса таблицы при рестарте карты или начале новой игры без перезапуска не происходит - никто ведь не рассчитывал, что эти данные будут менять. Поэтому приходиться хранить в памяти старый адрес таблицы в возвращать его указателям при выходе в главное меню по клику и клавишам. То есть, та же проблема, что и с NOT USED-ами, даже малость сложнее.
2)В функции должно быть, видимо, больше кругов, ибо копировать надо не только таблицу ссылок на названия двеллингов, но и связанные с нею ссылки на названия некоторых других объектов. "Откуда и докуда", я ещё не разобрался. К примеру, если на карте Пирамида, то при попытке навести на неё мышь будет вылет.

Первую проблему я решил. Со второй требуется помощь.
MasterOfPuppets
В общем, тут замануха ещё та. Перенос таблицы или просто её дописывание ("внаглую") крашит внутренние опции ВОГа - к примеру, разрушение городов и сброс артефактов на карту. Копаться уже лень стало. Кому не лень - можете продолжить. А мне придётся делать новые двеллинги ещё более геморными, но более безопасными способами...
Jelu
Увеличение в exe или просто ERM?
sergroj
Пара функций работы с диалогами в Эре:

1) Показ диалога, пока зажата клавиша мыши (левая или правая).
x1 = номер диалога
Код
!?FU<номер>;
!!VRy1:Sv1;
!!SN:E7510739/1/x1; [find HDlg -> v1]
!!VRy2:Sv1; [v2 = HDlg]
!!if&y2<>0:;
 !!SN:E5864096/1; [stop animation]
 !!UN:Cy2/4/?v1; [v1 = dialog]
 !!SN:E6245264/2/v1; [show while holding mouse button]
 !!SN:E5864272/1; [continue animation]
 !!SN:E7518240/2/y2; [destroy HDlg]
!!en:;
!!VRv1:Sy1;

(после показа диалог уничтожается - перед следующим показом надо загружать снова)

2) Уничтожение диалога.
x1 = номер диалога
Полезно при редактировании диалогового темплейта, чтобы при каждом показе диалог загружался заново.
Код
!?FU<номер>;
!!VRy1:Sv1;
!!SN:E7510739/1/x1; [find HDlg -> v1]
!!SN&v1<>0:E7518240/2/v1; [destroy HDlg]
!!VRv1:Sy1;
MasterOfPuppets
Цитата(sergroj @ 06 Aug 2009, 20:47)
2) Уничтожение диалога.
x1 = номер диалога
Полезно при редактировании диалогового темплейта, чтобы при каждом показе диалог загружался заново.
Код
!?FU<номер>;
!!VRy1:Sv1;
!!SN:E7510739/1/x1; [find HDlg -> v1]
!!SN&v1<>0:E7518240/2/v1; [destroy HDlg]
!!VRv1:Sy1;

Хочу спросить: малопонятные ошибки, ссылающиеся на совершенно нормальные команды DL:A и иногда ведущие к вылету - они обусловлены именно тем, что при загрузке диалога старая информация его настроек даёт о себе знать?
sergroj
Не знаю. Какие ошибки?
MasterOfPuppets
Ну вот - теперь как назло не могу их поймать...
Короче, отбой - ложная тревога.
MasterOfPuppets
Небольшой пример изменения внешнего вида города на карте:

CODE
ZVSE
!?PI;
!!VRz10:S^^; обнуляем переменную z10
!!VRz11:S^avchforx.def^; задаём значение z11 на деф обычного вида Конфлюкса
!!VRv10:S10*512+9597416; адрес z10
!!VRv11:S11*512+9597416; адрес z11
!!VRy1:S0; номер города, в данном примере - замок
!!VRv12:Sy1*16+7919680; адрес названия дефа, который подменяем
!!VRz2:S^Angel.dll^;
!!SN:Lz2/?v3; получить адрес библиотеки
!!VRz2:S^CopyMemory^;
!!SN:Av3/z2/?v2; получить адрес процедуры
!!SN:Ev2/0/16/v12/v10; запомнить название исходного дефа в z10
!!SN:Ev2/0/16/v11/v12; вставить название нового дефа из z11
!!UN:U98/y1/?y2; сосчитать Замки
!!VRv4:S-2;
!!DO20100/1/y2/1:Py1;
!!SN:Ev2/0/16/v10/v12; возвратить исходное имя дефа

!?FU20100;
!!UN:U98/x1/-2/4;
!!CA4:I1;


Ожидаемые вопросы:
Что произойдёт на старте карты, если использовать этот пример?
Внешний вид всех Замков изменится на вид Сопряжения. ТОЛЬКО внешний вид.

Почему это делается через ЭРУ? Можно ведь через UN:C...
Не знаю, но через UN:C у меня ничего не вышло - в память записался лишь мусор (защита?).

А зачем мне такие задвиги? Я могу использовать UN:O и I c 8-9 параметрами. laugh.gif
Во-первых, команда эта глючная сама по себе.
Во-вторых, в случае с городами она глючнее во сто раз.
В-третьих, чтобы изменить вид отстроенного города, нужно копировать кучу информации о нём (здания, монстры, герои в гарнизоне), чтобы возвести его снова точь-в точь таким же. Здесь же легко и просто меняется внешний вид.

Какие дефы можно использовать?
Объектные и предпочтительно с той же конфигурацией, что и у города.
MasterOfPuppets
Проблема возвращения вида города при посещении на "слабо разрушенный" решается привязкой значения вида к какому-нибудь РО-номеру города и использованием подобного приведённому выше кода в триггере в пост-триггере 98, а также в СМ-клике на кнопке ОК в экране города.
Проверено в том числе на ИИ.
MasterOfPuppets
Простенькая функция, с помощью которой можно заставить пункт "V" в шаблоне DL показать нужное нам bik-видео:

*x1 - номер z-переменной, в которой хранится название видео (раcширение *bik указывать не нужно)
!?FU1;
!!VRzx1:M4/?y1;
!!VRx1:*512+9597416;
!!DO2/0/y1/1:Px1/6834836;
!?FU2;
!!UN:Cx1/1/?y1 Cx2/1/y1;
!!VRx1:+1;!!VRx2:+1;

*Пример:
!#VRz1:S^cneutral^;
!#FU1:P1; вызвать функцию
!#DL№:N ... S; инициализировать некий диалог, провести с ним какие-то действия, закрыть
!#UN:C6834836/4/862873943 C6834840/4/0 C6834844/4/1635017060 C6834848/4/1684624988; - возврат исходного текста в памяти. Обязательная строка.
MasterOfPuppets
Вместо MM:M? для города:

!?FU@Получение подсказки в окне города@;
*x1 - номер z-переменной для получения текста
!!UN:C42231952/4/?y1; WoG 3.58f = 42144104
!!VRx1:*512+9597416;
!!DO@Копирование строк@/1/512/1:Py1/x1;

!?FU@Копирование строк@;
!!UN:Cx1/1/?y1;
!!if&y1=0;
!!UN:Cx2/1/0;
!!VRx16:S600;
!!FU:E;
!!en;
!!UN:Cx2/1/y1;
!!VRx1:+1;
!!VRx2:+1;
Berserker
!?MM1;
!!MM:M
MasterOfPuppets
А что, так работает? Думал, что нет, поэтому и функцию накатал. Если работает, можно пост потереть как бесполезный.
Berserker
Кнопка Банка, если не ошибаюсь, меняет подсказку. Сам менял когда-то так.
Стирать не нужно.
MasterOfPuppets
Установка-то работает, только тут речь не об установке, а о получении. А получение через MM:M? выдаёт в любом месте лишь прирост существ в двеллинге, старшем по уровню.
Berserker
А зачем тебе получение?
MasterOfPuppets
Понадобилось, например, для скрипта быстрого найма - для соответствия иконок существ с двеллингами. Получаю название существа из подсказки, затем узнаю его номер, затем уровень. Исходя из этого, нанимаю из нужного двеллинга. Морока, наверное, но работает.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.