IPB

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

9 страниц V  < 1 2 3 4 5 > »   
Reply to this topicStart new topic
> Тонкости ЕРМ, использование UN:C, ERM для профессионалов :)
MasterOfPuppets
сообщение 17 Aug 2009, 09:29 (Сообщение отредактировал Master Of Puppets - 17 Aug 2009, 09:53)
Сообщение #41

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




Небольшой пример изменения внешнего вида города на карте:

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
Во-первых, команда эта глючная сама по себе.
Во-вторых, в случае с городами она глючнее во сто раз.
В-третьих, чтобы изменить вид отстроенного города, нужно копировать кучу информации о нём (здания, монстры, герои в гарнизоне), чтобы возвести его снова точь-в точь таким же. Здесь же легко и просто меняется внешний вид.

Какие дефы можно использовать?
Объектные и предпочтительно с той же конфигурацией, что и у города.


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



Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
MasterOfPuppets
сообщение 18 Aug 2009, 08:30 (Сообщение отредактировал Master Of Puppets - 18 Aug 2009, 08:30)
Сообщение #42

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




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


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

Go to the top of the pageAdd Nick
 
+Quote Post
MasterOfPuppets
сообщение 27 Dec 2009, 06:03
Сообщение #43

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




Простенькая функция, с помощью которой можно заставить пункт "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; - возврат исходного текста в памяти. Обязательная строка.


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



Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
MasterOfPuppets
сообщение 02 Jan 2010, 13:23
Сообщение #44

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




Вместо 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;


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

Go to the top of the pageAdd Nick
 
+Quote Post
Гость_Berserker_*
сообщение 02 Jan 2010, 13:39 (Сообщение отредактировал Berserker - 02 Jan 2010, 13:40)
Сообщение #45







!?MM1;
!!MM:M
Go to the top of the pageAdd Nick
 
+Quote Post
MasterOfPuppets
сообщение 02 Jan 2010, 13:52
Сообщение #46

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




А что, так работает? Думал, что нет, поэтому и функцию накатал. Если работает, можно пост потереть как бесполезный.


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

Go to the top of the pageAdd Nick
 
+Quote Post
Гость_Berserker_*
сообщение 02 Jan 2010, 17:49 (Сообщение отредактировал Berserker - 02 Jan 2010, 17:50)
Сообщение #47







Кнопка Банка, если не ошибаюсь, меняет подсказку. Сам менял когда-то так.
Стирать не нужно.
Go to the top of the pageAdd Nick
 
+Quote Post
MasterOfPuppets
сообщение 03 Jan 2010, 07:26
Сообщение #48

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




Установка-то работает, только тут речь не об установке, а о получении. А получение через MM:M? выдаёт в любом месте лишь прирост существ в двеллинге, старшем по уровню.


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

Go to the top of the pageAdd Nick
 
+Quote Post
Гость_Berserker_*
сообщение 03 Jan 2010, 19:55
Сообщение #49







А зачем тебе получение?
Go to the top of the pageAdd Nick
 
+Quote Post
MasterOfPuppets
сообщение 04 Jan 2010, 11:01
Сообщение #50

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




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


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

Go to the top of the pageAdd Nick
 
+Quote Post
hippocamus
сообщение 04 Jan 2010, 15:16
Сообщение #51

пират с чёрной меткой
Сообщений: 23 627
Спасибо сказали: 12908 раз




Цитата(Master Of Puppets @ 17 Aug 2009, 09:29)
Какие дефы можно использовать?
Объектные и предпочтительно с той же конфигурацией, что и у города.

Так эта функция позволит менять внешний вид города в зависимости от отстроенности? Например: Сельская управа - Префектура - Муниципалитет- Капитолий; Форт - Цитадель - Замок?
Меняется навсегда или до следующей отстройки, как при разрушении городов?


--------------------
Давший быка на убой не выпросил и печень на жаркое.
Go to the top of the pageAdd Nick
 
+Quote Post
MasterOfPuppets
сообщение 05 Jan 2010, 10:13 (Сообщение отредактировал Master Of Puppets - 05 Jan 2010, 10:41)
Сообщение #52

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




Вид меняется, как при команде CA:I. Я просто подменяю деф на время этой процедуры. При заходе и выходе из города информация обновляется, поэтому нужно её восстанавливать в триггере и пост-триггере. Зато можно менять вид в зависимости от чего угодно.
При загрузке игры виды городов не обновляются, поэтому восстанавливать ничего не надо. А ещё - для заменяющих дефов не нужны файлы *msg и *msk.
При постройке в городе оборонительных зданий вид тоже меняется на соответствующий стандартный.
В идеале нужно просто расширить таблицу видов городов, и заморочки отпадут. Но указателя на неё я лично не нашёл.


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

Go to the top of the pageAdd Nick
 
+Quote Post
Дьяк
сообщение 05 Jan 2010, 15:06
Сообщение #53

Member
Сообщений: 97
Спасибо сказали: 80 раз




Отрываю от сердца (шучу)

AVCtown0 db 'DATA_CASTLE/AVCtown0.str',0
BufAVCtown0 dd 4C9823h
AVCtowx0 db 'DATA_CASTLE/AVCtowx0.str',0
BufAVCtowx0 dd 4C9810h
AVCtowz0 db 'DATA_CASTLE/AVCtowz0.str',0
;BufAVCtowz0 dd 1 dup (4C97C4h,70AA21h)
BufAVCtowz0 dd 4C97C4h

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


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
MasterOfPuppets
сообщение 06 Jan 2010, 06:30
Сообщение #54

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




Спасибо большое! :-)

Ещё: при работе с !!DL (и не только), часто бывает нужно получить название портрета героя. Так как ни один из HE:L не работает с синтаксисом получения, то...

*x1 - номер героя
*x2 - номер z-переменной для записи названия малого портрета
*x3 - номер z-переменной для записи названия большого портрета
!?FU1;
!!VRx1:*92+8144112;
!!UN:Cx1/4/?y1;
!!VRx1:+4;
!!UN:Cx1/4/?y2;
!!VRx2:*512+9597416;
!!VRx3:*512+9597416;
!!DO2/1/512/1:Py1/x2 Py2/x3;

!?FU2;
!!UN:Cx1/1/?y1 Cx2/1/y1;
!!VRx16&y1=0:S600;
!!VRx1:+1;
!!VRx2:+1;


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



Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 11 Jan 2010, 22:01 (Сообщение отредактировал feanor - 29 Jan 2010, 10:01)
Сообщение #55

laughed as one fey
Сообщений: 12 166
Спасибо сказали: 20585 раз




Работа с функциями WinAPI.
Скрипт по правому клику на панельке с игровой датой выводит реальное время и заряд батарейки.

Код
ZVSE
!?CM0;
!!CM:I?y1 F?y2;
!!if&y1=1008/y2=512:;
!!CM:R0;
!!VRz1:S^kernel32.dll^;
!!SN:Lz1/?y2;
!!VRz1:S^GetSystemPowerStatus^;
!!SN:Ay2/z1/?y3;
!!SN:Ey3/1/?y4;

сейчас в y4-y6 структура SystemPowerStatus.
http://msdn.microsoft.com/en-us/library/aa373232(VS.85).aspx

!!VRy10:Sy4;
!!VRy10::65536;

берем только заряд, остальные параметры в печку

!!VRz1:S^GetLocalTime^;
!!SN:Ay2/z1/?y3;
!!SN:Ey3/1/?y4;

y4-y7 - структура SystemTime
http://msdn.microsoft.com/en-us/library/ms724950(VS.85).aspx

!!VRy8:Sy6;
!!VRy9:Sy6;
!!VRy8::65536;
!!VRy9:%65536;

выдираем из нее время

!!IF:M0/4/^Time:%Y9:%Y8 Capacity:%Y10%%^;
!!en:;


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
SAG19330184
сообщение 20 Jan 2010, 14:19
Сообщение #56

Организатор лиги WCL
Сообщений: 981
Спасибо сказали: 632 раза




положительные у-переменные вроде не рекомендуется использовать в Эре/ТЕ?


--------------------
Постоянно играю на рейтинг www.heroes-III.com в онлайне через сервер GameRanger - в HoMM3 SOD или WT. Присоединяйтесь! Чужие подписи и аватары не читаю - отключил
Go to the top of the pageAdd Nick
 
+Quote Post
Гость_Berserker_*
сообщение 20 Jan 2010, 18:02
Сообщение #57







Отрицательные.
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 14 Feb 2010, 01:22 (Сообщение отредактировал feanor - 14 Feb 2010, 01:31)
Сообщение #58

laughed as one fey
Сообщений: 12 166
Спасибо сказали: 20585 раз




И еще раз о Граале. Точнее, о неуспешных попытках его выкопать.

Код
ZVSE
!#UN:C4255839/4/262170720;
!#UN:C4255843/4/817364992;
!#UN:C4255847/4/4278219982;
!#UN:C4255851/4/79987664;
!#UN:C4255855/4/2416896865;
!#UN:C4255859/4/90909090;
!#UN:C4255863/4/90909090;


вместо окна "Ничего нет. Куда подевалось?" вызывается функция #4000. (Номер можно переопределить в байтах 40F061-65)

Cуть в подмене участка кода с вызовом этого мессагбокса на код

CODE
CPU Disasm
Address Hex dump Command Comments
0040F05F 60 PUSHAD
0040F060 68 A00F0000 PUSH 0FA0
0040F065 B8 30CE7400 MOV EAX,Era_1_6.0074CE30 ; Entry point
0040F06A FFD0 CALL EAX
0040F06C 83C4 04 ADD ESP,4
0040F06F 61 POPAD
0040F070 EB 0E JMP SHORT 0040F080
0040F072 90 NOP
0040F073 90 NOP
0040F074 90 NOP
0040F075 90 NOP
0040F076 90 NOP
0040F077 90 NOP
0040F078 90 NOP
0040F079 90 NOP
0040F07A 90 NOP
, где 0074CE30 - адрес C_FUNC_ZVS_CALLFU.

Огромное спасибо Берсеркеру за сорцы Эры.

Добавлено ([mergetime]1266099741[/mergetime]):
Added: код неоптимален - можно убрать PUSHAD, POPAD и MOV EAX, 74CE30, CALL EAX заменить на CALL 74CE30.
Added again: код для Эры. Теоретически можно адаптировать для 3.58 - но есть ли в этом смысл?
Go to the top of the pageAdd Nick
 
+Quote Post
tolich
сообщение 14 Feb 2010, 08:41 (Сообщение отредактировал tolich - 14 Feb 2010, 08:42)
Сообщение #59

😸🧡✊✌️
Сообщений: 16 023
Спасибо сказали: 2659 раз




@feanor: просто так ничего не делается. В машкоде для
Код
MOV EAX, 74CE30, CALL EAX

74СE30 - абсолютное значение, а в
Код
CALL 74CE30

представляется смещением относительно адреса следующей инструкции, то есть патчить исполнимый файл чуточку проблемнее.


--------------------
Я слежу за тобой!
* tolic.narod.ru

Lu...pa...gamhi...dho?


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 18 Feb 2010, 21:42 (Сообщение отредактировал feanor - 18 Feb 2010, 21:43)
Сообщение #60

laughed as one fey
Сообщений: 12 166
Спасибо сказали: 20585 раз




Две функции для работы со спецкнопкой юнита (кнопка колдовства у Волшебных Драконов)



Код
!?FU3000; [x1 - hook func number]
[del checks]
!!UN:C6241623/4/2425393296;
!!UN:C6241627/2/37008;

!!UN:C6241637/4/2425393296;
!!UN:C6241641/2/37008;

[set hook]
!!UN:C5894083/1/104;
!!UN:C5894084/4/x1; [erm-func num]
!!UN:C5894088/4/1959669944;
!!UN:C5894092/4/2211512064;
!!UN:C5894096/4/2425357508;

!?FU3001;
[restore original code]
!!UN:C6241623/4/11896079;
!!UN:C6241627/2/0;

!!UN:C6241637/4/10980879;
!!UN:C6241641/2/0;

!!UN:C5894083/1/81;
!!UN:C5894084/4/3431369867;
!!UN:C5894088/4/1392509011;
!!UN:C5894092/4/4100136936;
!!UN:C5894096/4/138775039;



!!FU3000:P3002; - поставить всем юнитам эту кнопку, по нажатию на ней выполнять !?FU3002
!!FU3001:P; - вернуть оригинальный механизм действия.


Код
[button fix]
!#UN:C6241781/1/236;
!#UN:C6241786/1/74;

правка координат для более аккуратного отображения. (На скрине заметно, что кнопка чуть смещена вниз и вправо - этот код это фиксит.
кстати, о координатах и вообще внешнем виде этой кнопки.
За них отвечают:

за Box46x32.pcx (подложка под кнопку)
5F3D9F - y (4 байта)
5F3DA4 - х (1 байт)

за непосредственно кнопку:
5F3DE7 - указатель на имя дефа.
5F3DF5 - y (4 байта)
5F3DFA - x (1 байт)
5F3DE0 - байт, отвечающий за вид кнопки, выглядит она нажатой, или нет. 0 или 1.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post

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

 



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