Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

DF2 :: ФОРУМЫ _ Моды _ Обсуждение инженерного анализа

Автор: easy-to-kill 26 Sep 2007, 15:32

Думаешь тебе так прямо кто-то и скажет? Чертас-два.
Ну а если серьезно то надо формулировать свой вопрос поконкретнее.
Меня к примеру интересует как в вог организована интерпретация ерм команд.

Автор: gamecreator 26 Sep 2007, 17:32

Цитата(easy-to-kill @ 26 Sep 2007, 15:32)
Меня к примеру интересует как в вог организована интерпретация ерм команд.

hard coded

Автор: Чёртос-2 (Chortos-2) 26 Sep 2007, 21:15

Игродел, твой ответ немного не в тему. Потому что тема как раз таки про то, как игра устроена изнутри. Я вот знаю, что Сергей (который SergRoj) знает, в какой структуре данных хранится информация о существах. В принципе, я хочу собрать всё, что можно — начиная от структур данных и заканчивая адресами этих самых структур данных и функций.

Автор: gamecreator 26 Sep 2007, 21:46

Борн упорно молчит?

Автор: pokrik1 30 Sep 2007, 00:22

Господин Irh, а случаем не посещали темку Магические заклинания в WoG? Про заклинания что-нибудь знаете на таком же уровне? (где сидят, как поменять и т.д.)

Автор: Irh 30 Sep 2007, 00:34

Нет, с заклинаниями не разбирался.

sergroj, +

Добавлено ([mergetime]1191101640[/mergetime]):
Может, стоит сразу разбить тему на две? unsure.gif Данные и обсуждения... А то будет как в остальных - десять страниц, из них 9 - вопросы и обсуждения. Что тоже важно, но когда нужна инфа, искать неудобно.

Автор: Black Phantom 30 Sep 2007, 20:17

Цитата(sergroj @ 28 Sep 2007, 22:30)
Таблица монстров состоит из таких структур: (одинакова для игры и редактора карт)
Код
   Town: int;
   Level: int;
   SoundName: PChar; // 4 буквы, с которых начинаются звуки монстра
   DefName: PChar;
   Flags: int;
   Name: PChar;
   PluralName: PChar;
   Features: PChar; // (описание способностей)
   CostWood: int;
   CostMercury: int;
   CostOre: int;
   CostSulfor: int;
   CostCrystal: int;
   CostGems: int;
   CostGold: int;
   FightValue: int;
   AIValue: int;
   Growth: int;
   HordeGrowth: int;
   HitPoints: int;
   Speed: int;
   Attack: int;
   Defence: int;
   DamageLow: int;
   DamageHigh: int;
   Shots: int;
   Spells: int;
   AdvLow: int;  // ?
   AdvHigh: int; // ?


В файле h3wog.exe таблица стандартных монстров находится по адресу $2703B8, а новые монстры - $31C188.

Таблица артефактов (проверял только в редакторе)
Код
   ArTraits: array[0..6] of int;
   CantAdd: int;

ArTraits я не описывал, но он полностью соответствует столбцам файла ArTraits.txt
CantAdd - если не 0, то в Редакторе карт артефакт не показывается в списке тех, которые можно дать герою, поставить наградой за задание провидца и т.п.


А почему всё-таки никто кроме ZVS не умеет добавлять новых монстров, если структура EXE известна многим? Ведь есть же на форуме много толковых людей хорошо владеющих прграммированием на C++.

Автор: Berserker 30 Sep 2007, 20:25

Дело вовсе не в языке программирования. Подойдёт любой язык программирования, который разрешает прямую записаь и чтение из памяти. Чтобы встроить монстра, надо во многих местах ввести дополнительный код, чтобы игра корректно обрабатывала его. Остальное - к ZVS

Автор: easy-to-kill 01 Oct 2007, 13:28

У меня вопрос насчет пресловутого лимита существ. Кто-нибудь пытался найти ячейку памяти где храниться их кол-во?

Чертас-Два каким дизассемблером пользуешься? Можешь ссылку кинуть?

Автор: sergroj 01 Oct 2007, 21:14

Лимит существ нигде не хранится. Просто когда номер существа записан в один байт, он никак не может быть больше 255.

Цитата(Berserker @ 01 Oct 2007, 00:25)
Чтобы встроить монстра, надо во многих местах ввести дополнительный код, чтобы игра корректно обрабатывала его.

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

Автор: Чёртос-2 (Chortos-2) 01 Oct 2007, 21:41

Цитата(easy-to-kill @ 01 Oct 2007, 13:28)
Чертас-Два каким дизассемблером пользуешься? Можешь ссылку кинуть?
Пользуюсь двумя сразу — одним, встроенным в PE Explorer от компании Heaventools (в свое время я о нём узнал от Bourn’а), который полноценно дизассемблирует весь код, пытаясь эмулировать выполнение кода процессором, и другим, встроенным в Hiew, который дизассемблирует на ходу то, что влезает в буфер, зато позволяет код не только смотреть, но сразу и менять (в том числе, можно писать не только машинный код, но и ассемблерный). [Оба продукта платные, что немного осложняет их использование.] Хочу попробовать IDA, в первую очередь, сравнить его с поделкой Heaventools.

Автор: Bisik 02 Oct 2007, 03:12

У меня вот такой вопрос: для нового мода людского замка я хотел бы поменять абилки некоторым юнитам, поэтому не мог бы кто нибудь мне рассказать где это меняется? Я уже получил много ответов типа "это невозможно", но ведь разработчики ВоГа сделали нейтральный замок и добились полностью перепотрошить элементалей, поэтому, если кто нибудь из вас что нибудь об этом знает, плиз не утаивайте smile.gif

Автор: easy-to-kill 02 Oct 2007, 08:48

Цитата
Лимит существ нигде не хранится. Просто когда номер существа записан в один байт, он никак не может быть больше 255.

Так я и не спрашиваю где лимит монстров хранится. Я спрашиваю где хранится количество монстров.

Автор: Arseny 02 Oct 2007, 14:56

В этом байте и хранится их количество.

Автор: easy-to-kill 02 Oct 2007, 15:21

По какому адресу этот байт?

Автор: Irh 02 Oct 2007, 21:09

Где-то в коде программы - в нескольких местах и в различных видах - кроме того, оно влияет на расположение данных. Поэтому поменять его непросто. Точно сказать не могу.

Автор: Чёртос-2 (Chortos-2) 02 Oct 2007, 23:13

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

Автор: Docent Picolan 02 Oct 2007, 23:17

может сам анализ прилепить? тема-то важная

Автор: sergroj 03 Oct 2007, 20:13

Цитата(easy-to-kill @ 02 Oct 2007, 12:48)
Так я и не спрашиваю где лимит монстров хранится. Я спрашиваю где хранится количество монстров.

А про это написано ниже в том же посте smile.gif Это маленькая константа, поэтому всюду, где она используется, она подставлена своим значением. + для введения новых монстров, вероятно, потребуется менять адрес таблицы монстров, а это еще такая же куча адресов на таблицу.

Автор: Demiurg 12 Oct 2007, 23:06

Адрес (или указатель на) таблицы с героями подскажите плз.
Тоже относится к битве. Интересуют адреса копий героев. (Доступ к которым осуществляется через !!HE-10, !!HE-20)

Автор: Irh 13 Oct 2007, 22:38

Хм... Попробуй задать герою, скажем, первичные навыки, а потом найти эти числа с помощью Art Money или hex редактора. Значение первичного навыка хранится в одном байте.

Автор: gamecreator 14 Oct 2007, 11:26

нех редакторы вроде не умеют память редактировать

Автор: Irh 14 Oct 2007, 12:37

010 Editor

Автор: Irh 17 Nov 2007, 20:17

Цитата(Д'якон @ 17 Nov 2007, 17:00)
По указателю 0х004С2001  +224091

содержаться адреса с шагом 4 отвечающие за подсказку в гильдии
1. Хм... не совсем понял, это адрес в памяти? Я там как-то не нашел ничего похожего. lupa.gif idontno.gif
2. Прикол с русскими буквами заценил.

Автор: Д'якон 18 Nov 2007, 14:00

Вобщем я пока плохо разбираюсь в коде игры, поэтому обьясню в виде скрипта, который меняет заклы в гильдии вместе с описанием:

Код
!!FU1:Pх1/х2/х3; - где х1 - порядковый номер замка (как на карте), х2 - номер слота в гильдии, х3 - закл, который Вы бы хотели там видеть
!?FU1;
!!VRy1:S360 *x1;
!!VRy2:S4 *x2;
!!UN:C61871708/4/?y3;
!!VRy3:+428;
!!VRy4:Sy1 +y2 +y3;
!!UN:Cy4/4/x3;

Для ТЕ.

Автор: Д'якон 18 Nov 2007, 15:15

Причем в каждом уровне по 6 слотов. Т.е. если хотите менять 1 слот 2-го уровня - номер слота 7.

Автор: Irh 18 Nov 2007, 21:13

Ну... это сами заклинания в гильдии - их, кстати, грааль не меняет, просто стоят проверки при отображении и посещении гильдии героем. Ладно, спасибо.

Автор: Entuser 20 Jan 2008, 10:25

А как можно поменять exe навсегда? Я хочу поменять значение, отвечающее за число загружаемых строк в ZCRTARITS.txt, но его переписывает другая часть кода. Может, где-то храниться таблица(в файле) ответственная за правку кода?

Цитата
нех редакторы вроде не умеют память редактировать


Я пользуюсь OllyDbg - он умеет дизассемблировать и изм. код прямо в процессе редактирования, ставить брекпойнты на память и редактировать её.

Автор: Irh 20 Jan 2008, 14:16

Мой первый пост в http://forum.df2.ru/index.php?showtopic=6803 - кое-что есть про копирование таблиц; хотя там, по-моему, про 357.
А вообще, как я понял, указатель на таблицу существ хранится по адресу 0x6747B0 в памяти - но в этом направлении я не изучал, так что конкретнее сказать не могу.

Автор: Entuser 21 Jan 2008, 11:46

7AD78 - тут в екзишнеке храниться число 5 - после загрузки изменяется на 34(HEX) - влияет на число загружаемых строк в ZCRTRAITS.
mem 007012A4 / file 29C2A4 - изменяет это значение и много других

А как подключить свою библиотеку к h3wog?

Автор: Irh 21 Jan 2008, 12:16

Цитата(Entuser @ 21 Jan 2008, 11:46)
А как подключить свою библиотеку к h3wog?
Можно, например, как в теме Изменение Вида Города - заменить библиотеку rhook.dll на свою. Там, кажется, это описано в дистрибутиве, но только под ТЕ.

Автор: gamecreator 21 Jan 2008, 20:35

Можно поспрашивать Берсеркера.

Автор: Чёртос-2 (Chortos-2) 22 Jan 2008, 00:30

Цитата(Entuser @ 21 Jan 2008, 11:46)
7AD78 - тут в екзишнеке храниться число 5 - после загрузки изменяется на 34(HEX) - влияет на число загружаемых строк в ZCRTRAITS.
mem 007012A4 / file 29C2A4 - изменяет это значение и много других
Отпиши это, пожалуйста, в основную тему инженерного анализа.

Автор: Entuser 22 Jan 2008, 18:48

Попытался изменить значение 7AD78 (после того, как оно изменяется на 34) на другое (пробовал 33,35 - соответственно добавляя строки). Игра загружалась нормально, но при загрузке карты ошибка по адресу mem 00764678. Код в этом месте абсолютно не логичен:

Код
00774675 C3 - RETN
00774676 2BC3 - SUB EAX, EBX
00774678 8900 - MOV DWORD PTR DS:[EAX],EAX - здесь ошибка
0077467A CC - INT 3
0077467B CC - INT 3


Причем EAX равен единице. Но даже если бы не было этой ошибки, то все равно бы код уперся в бреакпойнт.

Прямых ссылок на эти адреса нет(типа call 00774678) , так что скорее всего был вызов непрямой (из библиотеки или относительный). Можно как-нибудь узнать, что за функция вызывалась перед этим? Кто-нибудь сталкивался с этой проблемой?

Автор: sergroj 22 Jan 2008, 20:31

Могу сказать только что это Славин код. А какая версия exe'шника?

Автор: Irh 22 Jan 2008, 23:40

ТЕ? Угадал? Просто весьма похоже на его защиту... Модифицировать код ехе нельзя - попробуй либо под 358, либо скачай в теме "Изменение вида города" патченный h3te Берсеркера - где-то ближе к концу темы. yes.gif

Автор: Чёртос-2 (Chortos-2) 08 Mar 2008, 18:51

Кто-нибудь может пояснить, что за адреса указал major? Не нахожу ничего такого, как ни пытаюсь над ними издеваться, ни в 3.58f, ни в «Полном собрании». sad.gif

Автор: sergroj 09 Mar 2008, 16:11

Это адреса в exe'шнике 3.58f. В самом файле. Адрес в памяти - на 400000 больше.

Автор: Чёртос-2 (Chortos-2) 09 Mar 2008, 16:16

Я понял: виртуальные адреса на самом деле на 465000 больше. smile.gif

Автор: Irh 09 Mar 2008, 17:50

Это зависит от сегмента, насколько я помню... а их известно два.
http://forum.df2.ru/index.php?showtopic=6803&pid=230542&st=3

Автор: Чёртос-2 (Chortos-2) 09 Mar 2008, 20:40

А ведь я это читал! banghead.gif

Автор: major 01 Jul 2008, 16:30

А все же как подключить библиотеку dll к h3wog? У меня проблема: нашел в нем пустую часть кода (может там и должно быть пусто) в районе 0031А55А и изменил так кое-что. В результате все, что я хотел стало работать, но появился жесткий баг - нельзя ни зайти, ни выйти из подземелья, пишет, что проход типа завален, будто нет другого туннеля. Так на всех картах. Пробовал в другой части кода ближе к концу - та же ерунда. НИД ХЕЛП.

Автор: gamecreator 01 Jul 2008, 16:33

может эта область внутри какой-то функции, а ты нарушил что-то там.

Автор: major 01 Jul 2008, 20:36

Вот отрывок кода

Код
0031A342   8D42 FF          LEA EAX,DWORD PTR DS:[EDX-1]
0031A345   5B               POP EBX
0031A346   C3               RETN
0031A347   8D42 FE          LEA EAX,DWORD PTR DS:[EDX-2]
0031A34A   5E               POP ESI
0031A34B   5F               POP EDI
0031A34C   5B               POP EBX
0031A34D   C3               RETN
0031A34E   8D42 FD          LEA EAX,DWORD PTR DS:[EDX-3]
0031A351   5E               POP ESI
0031A352   5F               POP EDI
0031A353   5B               POP EBX
0031A354   C3               RETN
0031A355   8D42 FC          LEA EAX,DWORD PTR DS:[EDX-4]
0031A358   5E               POP ESI
0031A359   5F               POP EDI
0031A35A   5B               POP EBX
0031A35B   C3               RETN
0031A35C   CC               INT3
0031A35D   CC               INT3
0031A35E   CC               INT3
0031A35F   CC               INT3
0031A360   FF25 A4007800    JMP DWORD PTR DS:[7800A4]
0031A366   0000             ADD BYTE PTR DS:[EAX],AL
0031A368   0000             ADD BYTE PTR DS:[EAX],AL
0031A36A   0000             ADD BYTE PTR DS:[EAX],AL
0031A36C   0000             ADD BYTE PTR DS:[EAX],AL

Дальше идут сплошные нули, а затем

Код
0031AFF8   0000             ADD BYTE PTR DS:[EAX],AL
0031AFFA   0000             ADD BYTE PTR DS:[EAX],AL
0031AFFC   0000             ADD BYTE PTR DS:[EAX],AL
0031AFFE   0000             ADD BYTE PTR DS:[EAX],AL
0031B000   EE               OUT DX,AL
0031B001   0D 0800B00B      OR EAX,0BB00008
0031B006   0800             OR BYTE PTR DS:[EAX],AL
0031B008   C40B             LES ECX,FWORD PTR DS:[EBX]
0031B00A   0800             OR BYTE PTR DS:[EAX],AL
0031B00C   FC               CLD
0031B00D   0D 0800000C      OR EAX,0C000008
0031B012   0800             OR BYTE PTR DS:[EAX],AL
0031B014   0E               PUSH CS
0031B015   0C 08            OR AL,8
0031B017   0022             ADD BYTE PTR DS:[EDX],AH
0031B019   0C 08            OR AL,8
0031B01B   00340C           ADD BYTE PTR SS:[ESP+ECX],DH
0031B01E   0800             OR BYTE PTR DS:[EAX],AL
0031B020   44               INC ESP

На функцию не особо похоже. Хотя может я и ошибаюсь.
Поэтому и нид хелп.

Автор: FakerNeo 01 Jul 2008, 21:12

Цитата
Дальше идут сплошные нули, а затем

Код
0031AFF8   0000             ADD BYTE PTR DS:[EAX],AL
0031AFFA   0000             ADD BYTE PTR DS:[EAX],AL
0031AFFC   0000             ADD BYTE PTR DS:[EAX],AL
0031AFFE   0000             ADD BYTE PTR DS:[EAX],AL
0031B000   EE               OUT DX,AL
0031B001   0D 0800B00B      OR EAX,0BB00008
0031B006   0800             OR BYTE PTR DS:[EAX],AL
0031B008   C40B             LES ECX,FWORD PTR DS:[EBX]
0031B00A   0800             OR BYTE PTR DS:[EAX],AL
0031B00C   FC               CLD
0031B00D   0D 0800000C      OR EAX,0C000008
0031B012   0800             OR BYTE PTR DS:[EAX],AL
0031B014   0E               PUSH CS
0031B015   0C 08            OR AL,8
0031B017   0022             ADD BYTE PTR DS:[EDX],AH
0031B019   0C 08            OR AL,8
0031B01B   00340C           ADD BYTE PTR SS:[ESP+ECX],DH
0031B01E   0800             OR BYTE PTR DS:[EAX],AL
0031B020   44               INC ESP

На функцию не особо похоже. Хотя может я и ошибаюсь.
Поэтому и нид хелп.

Это больше похоже на данные чем на код. Ткие участки кода в дизассемблере не смотрятся. Посмотри его в дампе. Больше похоже на какую-то структуру данных...


Вот те код где лично я вносил изменения

Код
0050CA4A  |> /8B43 20       /MOV EAX,DWORD PTR [EBX+20]
0050CA4D  |. |8BCF          |MOV ECX,EDI
0050CA4F  |. |8B14B0        |MOV EDX,DWORD PTR [EAX+ESI*4]
0050CA52  |. |E8 99010000   |CALL h3wog.0050CBF0
0050CA57  |. |47            |INC EDI
0050CA58  |. |46            |INC ESI
0050CA59  |. |83FF 0E       |CMP EDI,0E
0050CA5C  |.^\7C EC         \JL SHORT h3wog.0050CA4A
0050CA5E  |.  83C6 03       ADD ESI,3
0050CA61  |.  C745 FC 0E000>MOV [LOCAL.1],0E
0050CA68  |>  8B4B 20       /MOV ECX,DWORD PTR [EBX+20]
0050CA6B  |.  8B14B1        |MOV EDX,DWORD PTR [ECX+ESI*4]
0050CA6E  |.  8BCF          |MOV ECX,EDI
0050CA70  |.  E8 7B010000   |CALL h3wog.0050CBF0
0050CA75  |.  8B45 FC       |MOV EAX,[LOCAL.1]
0050CA78  |.  47            |INC EDI
0050CA79  |.  46            |INC ESI
0050CA7A  |.  48            |DEC EAX
0050CA7B  |.  8945 FC       |MOV [LOCAL.1],EAX
0050CA7E  |.^ 75 E8         \JNZ SHORT h3wog.0050CA68
0050CA80  |.  83C6 03       ADD ESI,3
0050CA83  |.  C745 FC 0E000>MOV [LOCAL.1],0E
0050CA8A  |>  8B53 20       /MOV EDX,DWORD PTR [EBX+20]
0050CA8D  |.  8BCF          |MOV ECX,EDI
0050CA8F  |.  8B14B2        |MOV EDX,DWORD PTR [EDX+ESI*4]
0050CA92  |.  E8 59010000   |CALL h3wog.0050CBF0
0050CA97  |.  8B45 FC       |MOV EAX,[LOCAL.1]
0050CA9A  |.  47            |INC EDI
0050CA9B  |.  46            |INC ESI
0050CA9C  |.  48            |DEC EAX
0050CA9D  |.  8945 FC       |MOV [LOCAL.1],EAX
0050CAA0  |.^ 75 E8         \JNZ SHORT h3wog.0050CA8A
0050CAA2  |.  83C6 03       ADD ESI,3
0050CAA5  |.  C745 FC 0E000>MOV [LOCAL.1],0E
0050CAAC  |>  8B43 20       /MOV EAX,DWORD PTR [EBX+20]
0050CAAF  |.  8BCF          |MOV ECX,EDI
0050CAB1  |.  8B14B0        |MOV EDX,DWORD PTR [EAX+ESI*4]
0050CAB4  |.  E8 37010000   |CALL h3wog.0050CBF0
0050CAB9  |.  8B45 FC       |MOV EAX,[LOCAL.1]
0050CABC  |.  47            |INC EDI
0050CABD  |.  46            |INC ESI
0050CABE  |.  48            |DEC EAX
0050CABF  |.  8945 FC       |MOV [LOCAL.1],EAX
0050CAC2  |.^ 75 E8         \JNZ SHORT h3wog.0050CAAC
0050CAC4  |.  83C6 03       ADD ESI,3
0050CAC7  |.  C745 FC 0E000>MOV [LOCAL.1],0E
0050CACE  |>  8B4B 20       /MOV ECX,DWORD PTR [EBX+20]
0050CAD1  |.  8B14B1        |MOV EDX,DWORD PTR [ECX+ESI*4]
0050CAD4  |.  8BCF          |MOV ECX,EDI
0050CAD6  |.  E8 15010000   |CALL h3wog.0050CBF0
0050CADB  |.  8B45 FC       |MOV EAX,[LOCAL.1]
0050CADE  |.  47            |INC EDI
0050CADF  |.  46            |INC ESI
0050CAE0  |.  48            |DEC EAX
0050CAE1  |.  8945 FC       |MOV [LOCAL.1],EAX
0050CAE4  |.^ 75 E8         \JNZ SHORT h3wog.0050CACE
0050CAE6  |.  83C6 03       ADD ESI,3
0050CAE9  |.  C745 FC 0E000>MOV [LOCAL.1],0E
0050CAF0  |>  8B53 20       /MOV EDX,DWORD PTR [EBX+20]
0050CAF3  |.  8BCF          |MOV ECX,EDI
0050CAF5  |.  8B14B2        |MOV EDX,DWORD PTR [EDX+ESI*4]
0050CAF8  |.  E8 F3000000   |CALL h3wog.0050CBF0
0050CAFD  |.  8B45 FC       |MOV EAX,[LOCAL.1]
0050CB00  |.  47            |INC EDI
0050CB01  |.  46            |INC ESI
0050CB02  |.  48            |DEC EAX
0050CB03  |.  8945 FC       |MOV [LOCAL.1],EAX
0050CB06  |.^ 75 E8         \JNZ SHORT h3wog.0050CAF0
0050CB08  |.  83C6 03       ADD ESI,3
0050CB0B  |.  C745 FC 0E000>MOV [LOCAL.1],0E
0050CB12  |>  8B43 20       /MOV EAX,DWORD PTR [EBX+20]
0050CB15  |.  8BCF          |MOV ECX,EDI
0050CB17  |.  8B14B0        |MOV EDX,DWORD PTR [EAX+ESI*4]
0050CB1A  |.  E8 D1000000   |CALL h3wog.0050CBF0
0050CB1F  |.  8B45 FC       |MOV EAX,[LOCAL.1]
0050CB22  |.  47            |INC EDI
0050CB23  |.  46            |INC ESI
0050CB24  |.  48            |DEC EAX
0050CB25  |.  8945 FC       |MOV [LOCAL.1],EAX
0050CB28  |.^ 75 E8         \JNZ SHORT h3wog.0050CB12


А вот сами изменения, с подгруженными библиотеками. Как видно высвободилось туева хуча куда

Код
0050CA41   > \56            PUSH ESI
0050CA42   .  57            PUSH EDI
0050CA43   .  33FF          XOR EDI,EDI
0050CA45   .  BE 02000000   MOV ESI,2
0050CA4A   >  8B43 20       MOV EAX,DWORD PTR [EBX+20]
0050CA4D   .  8BCF          MOV ECX,EDI
0050CA4F   .  8B14B0        MOV EDX,DWORD PTR [EAX+ESI*4]
0050CA52   .  E8 99010000   CALL h3te_cra.0050CBF0
0050CA57   .  47            INC EDI
0050CA58   .  46            INC ESI
0050CA59   .  83FF 0E       CMP EDI,0E
0050CA5C   .^ 7C EC         JL SHORT h3te_cra.0050CA4A
0050CA5E   >  83C6 03       ADD ESI,3
0050CA61   .  C745 FC 0E000>MOV DWORD PTR [EBP-4],0E
0050CA68   >  8B4B 20       MOV ECX,DWORD PTR [EBX+20]
0050CA6B   .  8B14B1        MOV EDX,DWORD PTR [ECX+ESI*4]
0050CA6E   .  8BCF          MOV ECX,EDI
0050CA70   .  E8 7B010000   CALL h3te_cra.0050CBF0
0050CA75   .  8B45 FC       MOV EAX,DWORD PTR [EBP-4]
0050CA78   .  47            INC EDI
0050CA79   .  46            INC ESI
0050CA7A   .  48            DEC EAX
0050CA7B   .  8945 FC       MOV DWORD PTR [EBP-4],EAX
0050CA7E   .^ 75 E8         JNZ SHORT h3te_cra.0050CA68
0050CA80   .  83FE 32       CMP ESI,32
0050CA83   .^ 7C D9         JL SHORT h3te_cra.0050CA5E
0050CA85   .  83FE 43       CMP ESI,43
0050CA88   .^ 7C D4         JL SHORT h3te_cra.0050CA5E
0050CA8A   .  83FE 54       CMP ESI,54
0050CA8D   .^ 7C CF         JL SHORT h3te_cra.0050CA5E
0050CA8F   .  83FE 65       CMP ESI,65
0050CA92   .^ 7C CA         JL SHORT h3te_cra.0050CA5E
0050CA94   .  83FE 76       CMP ESI,76
0050CA97   .^ 7C C5         JL SHORT h3te_cra.0050CA5E
0050CA99   .  E9 AE000000   JMP h3te_cra.0050CB4C
0050CA9E   .  4D 6F 6E 73 7>ASCII "Monstr.dll",0
0050CAA9   .  4D 6E 73 74 7>ASCII "MnstrStr",0
0050CAB2   >  60            PUSHAD
0050CAB3   .  9C            PUSHFD
0050CAB4   .  68 9ECA5000   PUSH h3te_cra.0050CA9E                 ; /FileName = "Monstr.dll"
0050CAB9   .  E8 B9522F7C   CALL kernel32.LoadLibraryA             ; \LoadLibraryA
0050CABE   .  68 A9CA5000   PUSH h3te_cra.0050CAA9                 ; /ProcNameOrOrdinal = "MnstrStr"
0050CAC3   .  50            PUSH EAX                               ; |hModule
0050CAC4   .  E8 D7E22F7C   CALL kernel32.GetProcAddress           ; \GetProcAddress
0050CAC9   .  FFD0          CALL NEAR EAX
0050CACB   .  9D            POPFD
0050CACC   .  61            POPAD
0050CACD   .  E9 CE600F00   JMP h3te_cra.00602BA0
0050CAD2   .  48 61 6C 6C 5>ASCII "HallStr",0
0050CADA      90            NOP
0050CADB      90            NOP
0050CADC      90            NOP
0050CADD      90            NOP
0050CADE      90            NOP
0050CADF   .  60            PUSHAD
0050CAE0   .  9C            PUSHFD
0050CAE1   .  8BD8          MOV EBX,EAX
0050CAE3   .  68 9ECA5000   PUSH h3te_cra.0050CA9E                 ; /FileName = "Monstr.dll"
0050CAE8   .  E8 8A522F7C   CALL kernel32.LoadLibraryA             ; \LoadLibraryA
0050CAED   .  68 D2CA5000   PUSH h3te_cra.0050CAD2                 ; /ProcNameOrOrdinal = "HallStr"
0050CAF2   .  50            PUSH EAX                               ; |hModule
0050CAF3   .  E8 A8E22F7C   CALL kernel32.GetProcAddress           ; \GetProcAddress
0050CAF8   .  90            NOP
0050CAF9   .  FFD0          CALL NEAR EAX
0050CAFB   .  9D            POPFD
0050CAFC   .  61            POPAD
0050CAFD   .- FF25 0BA95C00 JMP NEAR DWORD PTR [5CA90B]
0050CB03      90            NOP
0050CB04      90            NOP
0050CB05      90            NOP
0050CB06      90            NOP
0050CB07      90            NOP
0050CB08      90            NOP
0050CB09      90            NOP
0050CB0A      90            NOP
0050CB0B      90            NOP
0050CB0C      90            NOP
0050CB0D      90            NOP
0050CB0E      90            NOP
0050CB0F      90            NOP
0050CB10      90            NOP
0050CB11      90            NOP
0050CB12      90            NOP
0050CB13      90            NOP
0050CB14      90            NOP
0050CB15      90            NOP
0050CB16      90            NOP
0050CB17      90            NOP
0050CB18      90            NOP
0050CB19      90            NOP
0050CB1A      90            NOP
0050CB1B      90            NOP
0050CB1C      90            NOP
0050CB1D      90            NOP
0050CB1E      90            NOP
0050CB1F      90            NOP
0050CB20      90            NOP
0050CB21      90            NOP
0050CB22      90            NOP
0050CB23      90            NOP
0050CB24      90            NOP
0050CB25      90            NOP
0050CB26      90            NOP
0050CB27      90            NOP
0050CB28      90            NOP
0050CB29      90            NOP
0050CB2A      90            NOP
0050CB2B      90            NOP
0050CB2C      90            NOP
0050CB2D      90            NOP
0050CB2E      90            NOP
0050CB2F      90            NOP
0050CB30      90            NOP
0050CB31      90            NOP
0050CB32      90            NOP
0050CB33      90            NOP
0050CB34      90            NOP
0050CB35      90            NOP
0050CB36      90            NOP
0050CB37      90            NOP
0050CB38      90            NOP
0050CB39      90            NOP
0050CB3A      90            NOP
0050CB3B      90            NOP
0050CB3C      90            NOP
0050CB3D      90            NOP
0050CB3E      90            NOP
0050CB3F      90            NOP
0050CB40      90            NOP
0050CB41      90            NOP
0050CB42      90            NOP
0050CB43      90            NOP
0050CB44      90            NOP
0050CB45      90            NOP
0050CB46      90            NOP
0050CB47      90            NOP
0050CB48      90            NOP
0050CB49      90            NOP
0050CB4A      90            NOP
0050CB4B      90            NOP


И таких мест в героях валом. Успехов.

Автор: major 02 Jul 2008, 09:46

Да, не очень понятно.

Код
0050CA7E   .^ 75 E8         JNZ SHORT h3te_cra.0050CA68
0050CA80   .  83FE 32       CMP ESI,32
0050CA83   .^ 7C D9         JL SHORT h3te_cra.0050CA5E
0050CA85   .  83FE 43       CMP ESI,43
0050CA88   .^ 7C D4         JL SHORT h3te_cra.0050CA5E
0050CA8A   .  83FE 54       CMP ESI,54
0050CA8D   .^ 7C CF         JL SHORT h3te_cra.0050CA5E
0050CA8F   .  83FE 65       CMP ESI,65
0050CA92   .^ 7C CA         JL SHORT h3te_cra.0050CA5E
0050CA94   .  83FE 76       CMP ESI,76
0050CA97   .^ 7C C5         JL SHORT h3te_cra.0050CA5E
0050CA99   .  E9 AE000000   JMP h3te_cra.0050CB4C

Это чтоб сократить код как я понял?

Код
0050CA9E   .  4D 6F 6E 73 7>ASCII "Monstr.dll",0
0050CAA9   .  4D 6E 73 74 7>ASCII "MnstrStr",0
0050CAB2   >  60            PUSHAD
0050CAB3   .  9C            PUSHFD
0050CAB4   .  68 9ECA5000   PUSH h3te_cra.0050CA9E                ; /FileName = "Monstr.dll"
0050CAB9   .  E8 B9522F7C   CALL kernel32.LoadLibraryA            ; \LoadLibraryA
0050CABE   .  68 A9CA5000   PUSH h3te_cra.0050CAA9                ; /ProcNameOrOrdinal = "MnstrStr"
0050CAC3   .  50            PUSH EAX                              ; |hModule
0050CAC4   .  E8 D7E22F7C   CALL kernel32.GetProcAddress          ; \GetProcAddress
0050CAC9   .  FFD0          CALL NEAR EAX

А это подгружаются библиотеки? Типа Monstr.dll. А что такое MnstrStr? Я в библиотеках не очень.

Автор: FakerNeo 02 Jul 2008, 11:53

//Это чтоб сократить код как я понял?
именно

//А это подгружаются библиотеки? Типа Monstr.dll. А что такое MnstrStr? Я в библиотеках не очень.

Ты ж вроде подгружал библиотеку? MnstrStr - это название процедуры вызываемой из библиотеки

Автор: major 02 Jul 2008, 19:55

2FakerNeo

Цитата(FakerNeo @ 02 Jul 2008, 15:53)
Ты ж вроде подгружал библиотеку?

Нет не приходилось. Вот и хотел узнать, как это делать. Хотя наверно лучше найти/очистить часть кода, к которому бы игра не обращалась, и использовать его по своей нужде. Сможешь помочь?

Автор: sergroj 07 Jul 2008, 13:53

В конце секции кода Героев, как и во всех прогах, есть место. А для чего тебе?

Автор: major 07 Jul 2008, 14:29

Мне нужно поменять некоторые параметры монстров. Ну к примеру поставить регенерацию, количество контратак, выстрел облаком смерти и т.д. Не хочу использовать ЕРМ.

Автор: hippocamus 07 Jul 2008, 18:24

А ерм здесь не поможет. Может ты можешь выделить эти свойства в формат опыта существ? И добавить в ерм-команду.

Автор: major 07 Jul 2008, 19:44

Зависимость от опыта не хочу ставить. Регенерацию и контратаку организовать не сложно с помощью ЕРМ (уже делал), а вот с облаком смерти точно не поможет. Плюс еще кое-какие абилки добавить.

2sergroj
А где находится конец секции кода? Самый простой вариант - открыл h3wog, перешел в самый конец, изменил, загрузил, - сразу вылет в бою при выстреле (что-то типа не может записать в недопустимую область памяти).

Автор: hippocamus 08 Jul 2008, 15:45

Цитата(major @ 07 Jul 2008, 19:44)
Зависимость от опыта не хочу ставить.


Можно поставить линию опыта, которая с самого начала имеет 100%
Я это говорю для того, чтобы подобные линии можно было давать и другим существам. Регенерация и ответки действительно есть, а вот облако... Неплохо бы сделать. И давать на высшем уровне каким-нибудь Злобоглазам..

Автор: FakerNeo 08 Jul 2008, 16:40

Цитата(major @ 07 Jul 2008, 19:44)
изменил, загрузил, - сразу вылет в бою при выстреле (что-то типа не может записать в недопустимую область памяти).

Видать так изменил...

Автор: major 09 Jul 2008, 08:02

Цитата(FakerNeo @ 08 Jul 2008, 20:40)
Видать так изменил...

Вот оригинальный код
Код
002FF990   83F8 40          CMP EAX,40
002FF993   74 12            JE SHORT 002FF9A7
002FF995   83F8 41          CMP EAX,41
002FF998   74 0D            JE SHORT 002FF9A7
002FF99A   3D C4000000      CMP EAX,0C4
002FF99F   74 06            JE SHORT 002FF9A7
002FF9A1   B8 00000000      MOV EAX,0
002FF9A6   C3               RETN

Вот так работает (но появляется баг с подземельем)
Код
002FF990   E9 13AD0100      JMP 0031A6A8
002FF995   83F8 41          CMP EAX,41
002FF998   74 0D            JE SHORT 002FF9A7
002FF99A   3D C4000000      CMP EAX,0C4
002FF99F   74 06            JE SHORT 002FF9A7
002FF9A1   B8 00000000      MOV EAX,0
002FF9A6   C3               RETN
002FF9A7   B8 41000000      MOV EAX,41
002FF9AC   C3               RETN
...
0031A6A8   83F8 08          CMP EAX,8
0031A6AB  ^0F84 F652FEFF    JE 002FF9A7
0031A6B1   83F8 09          CMP EAX,9
0031A6B4  ^0F84 ED52FEFF    JE 002FF9A7
0031A6BA   3D A9000000      CMP EAX,0A9
0031A6BF  ^0F84 E252FEFF    JE 002FF9A7
0031A6C5   83F8 40          CMP EAX,40
0031A6C8  ^0F84 D952FEFF    JE 002FF9A7
0031A6CE  ^E9 C252FEFF      JMP 002FF995

А вот гарантирован вылет
Код
002FF990   E9 DB850400      JMP 00347F70
002FF995   83F8 41          CMP EAX,41
002FF998   74 0D            JE SHORT 002FF9A7
002FF99A   3D C4000000      CMP EAX,0C4
002FF99F   74 06            JE SHORT 002FF9A7
002FF9A1   B8 00000000      MOV EAX,0
002FF9A6   C3               RETN
...
00347F70   83F8 08          CMP EAX,8
00347F73  ^0F84 2E7AFBFF    JE 002FF9A7
00347F79   83F8 09          CMP EAX,9
00347F7C  ^0F84 257AFBFF    JE 002FF9A7
00347F82   83F8 40          CMP EAX,40
00347F85  ^0F84 1C7AFBFF    JE 002FF9A7
00347F8B  ^E9 057AFBFF      JMP 002FF995

с сообщением вот такого содержания
Код
EIP = 0x007ACF70, Access Violation. Attempt to [B]read[/B] the inaccessible data at 0x00000092

Автор: FakerNeo 09 Jul 2008, 18:11

Ну тут нет никаких загадок. 0x007ACF70 - это твой джамп JMP 00347F70 на вроде как прописанный код. Но игра данный адрес использует для своих целей и заносит туда данные. На моей машине там dd 32 , а это равнозначно команде

007ACF70 3200 XOR AL,BYTE PTR [EAX]

где в eax у тебя хранится номер монстра стреляющего. В твоем случае - это 92, т.е. балиста. естественно обращение по этому адресу запрещено.

Короче игра затирает твой код... smile.gif

Автор: FakerNeo 09 Jul 2008, 18:33

Похожий случай и с подземельем

Автор: CrackedMind 10 Jul 2008, 10:55

уж лучше добавить еще одну секцию кода, и джамп делать ту да smile.gif

Автор: sergroj 12 Jul 2008, 13:47

Секция .idata начинается по адресу 63A000, секция кода заканчивается на 639BF2. 1038 байта свободны. Так что в 639BF2 без проблем можно писать код загрузки dll.

Автор: major 21 Jul 2008, 17:21

Цитата(sergroj @ 12 Jul 2008, 17:47)
Секция .idata начинается по адресу 63A000, секция кода заканчивается на 639BF2. 1038 байта свободны. Так что в 639BF2 без проблем можно писать код загрузки dll.

А можно делать jump в эту часть кода? Попробовал, все равно вылетает с той же ошибкой. Куда можно джампнуть? Мне и 500 байт хватило бы.

Автор: sergroj 23 Jul 2008, 14:18

дело не в том, куда, а в том, откуда

Автор: major 25 Jul 2008, 18:18

Ниче не помогает. banghead.gif

Цитата(sergroj @ 12 Jul 2008, 17:47)
Секция .idata начинается по адресу 63A000, секция кода заканчивается на 639BF2. 1038 байта свободны. Так что в 639BF2 без проблем можно писать код загрузки dll.
А что насчет диапазона 77F366 (31A366) - 780000 (31B000). Мне кажется там структура так же идет, т.е. код заканчивается на 77F366, а с 780000 идут данные. Или это мне только кажется?

Автор: sergroj 27 Jul 2008, 00:54

Да, скорее всего, верно. (лень проверять) Только это место находится в ВоГовской части .exe'шника и в других версиях оно по другим адресам.

Автор: major 28 Jul 2008, 06:45

yahoo.gif Подземелья работают!
Почему-то оказалось, что вместо

Код
000CDBA4   83F9 67          CMP ECX,67

у меня написано

Код
000CDBA4   83F9 66          CMP ECX,66

Отсюда и баг.
Все равно всем спасибо за помощь!

Автор: hippocamus 28 Jul 2008, 09:47

А что это? Можно также третий уровень добавить?

Автор: major 29 Jul 2008, 08:08

Вряд ли, просто так не работают туннели, которые связывают верхний мир с подземкой.

Автор: major 31 Jul 2008, 08:03

Может кто-нибудь знает, где в коде находятся проверки на тип существа при выкачивании 2 очков маны (привидения), атаку смертельным взглядом и кастование различных заклинаний, а еще на проверку иммунитета к заклам (троглодиты, элементалы). Очень, очень нужно. Никак не могу найти.

Автор: hippocamus 31 Jul 2008, 08:48

Ну и пусть туннели не работают. Сделать их порталами.
Я выкладывал где-то карту с 4 уровнями.

Добавлено ([mergetime]1217483315[/mergetime]):
Но при загрузке возникает ошибка.
Могу перевыложить.

Автор: FakerNeo 31 Jul 2008, 15:48

Цитата(major @ 31 Jul 2008, 08:03)
Может кто-нибудь знает, где в коде находятся проверки на тип существа при выкачивании 2 очков маны (привидения), атаку смертельным взглядом и кастование различных заклинаний, а еще на проверку иммунитета к заклам (троглодиты, элементалы). Очень, очень нужно. Никак не могу найти.

Есть две таблицы, которые отвечают за некоторые св-ва (а может и за все, до конца так и не проверил) св-ва монстров при атаке и при защите. 9 св-в при атаке и 9 при защите.

Автор: major 31 Jul 2008, 16:12

А не можешь подсказать, где они находятся? Ну или хотя бы намекнуть, как они выглядят...

2hippocamus
Т.е. карта не работает? Третий уровень прикольно, хотя и XL с подземкой за глаза хватает. Можешь выложить.

Автор: FakerNeo 31 Jul 2008, 16:16

Домой приду кину адреса...

Автор: FakerNeo 31 Jul 2008, 17:35

атака 44065C - таблица для монстров начиная с 16h монстра
защита 4412D8 - начиная с 3Fh монстра.

Но я расширял таблицу на всех монстров

Автор: major 31 Jul 2008, 18:20

КЛЕВО!!!
Только в 44065C находятся наложения заклинаний на монстров, а в 4412D8 - уникальные способности, как я понял.
По аналогии нашел таблицу, включающую WOG существ.
mem332AD8 - наложение заклов
mem332A4C - способности

Автор: FakerNeo 31 Jul 2008, 18:37

Я думал туда и Вог входят sad.gif

Автор: major 31 Jul 2008, 19:52

Еще нашел
mem332СС4 - таблица сопротивляемости магии существ начинается с гнома 10h
магические способности существ начинается с Архангела 0Dh почему то по трем адресам 332990, 3328D4 и 332818.

Автор: major 01 Aug 2008, 15:23

Осталось найти кавалерийский бонус, отсос 2 очков маны, магический канал, смертельный удар, подавление магии, ну и атаку тремя головами.
А кстати, FakerNeo, не подскажешь, как расширить таблицу существ?

Автор: hippocamus 01 Aug 2008, 21:21

А снижение стоимости заклов? Ауру сопротивления?

Автор: FakerNeo 01 Aug 2008, 21:35

Удар тремя головами - я где-то писал скрипт. Я находил данный флаг в структуре стека на поле боя. На счет таблицы не знаю. Но можно посмотреть какая часть кода выставляет данный флаг. Где скрипт - не помню.

Расширить таблицу существ - элементарно. Прописываешь свою таблицу, например в файле. Убираешь ограничение на кол-во монстров. Т.е. там где вычитается кол-во монстров (например add eax, -10h) ставишь 0.
Потом подгружаешь длл, віделяешь память для файла и копируешь в выделенный диапазон файл. Ну и из длл меняешь указатели существующие на свои (т.е. указатель на выделенную память). Меняешь во всех местах где встречаются старые указатели (в этом тебе артмани поможет, очень удобно искать). Все.

Автор: hippocamus 01 Aug 2008, 22:11

Эх, так убери ограничение на количество заклов, почв, уровней карты smile.gif

Автор: FakerNeo 01 Aug 2008, 22:18

Вот люди наивные smile.gif

Автор: hippocamus 01 Aug 2008, 22:26

А что? Уже сделал? wink.gif
Или слабо?

Автор: major 03 Aug 2008, 07:35

А как выглядят указатели, ну например, на таблицу 4412D8?
И может посмотришь про церберов с их атакой?

Автор: FakerNeo 03 Aug 2008, 09:55

00440914 MOV CL,BYTE PTR [EAX+4412D8]

по адресу 00440916 находится значение 4412D8 (только отображается как D81244)

Т.е. по адресу 00440916 размером dword нужно поставить свой указатель на таблицу.

Возможно указатель не один поэтому в артмани ищешь 4412D8h только в десятиричном виде и она тебе выдаст все места в памяти которые нужно заменить на свои.

Автор: major 03 Aug 2008, 12:47

Спасибо, очень помог! Вот еще бы помог найти, где находится смертельный удар и аура магического сопротивления...

Автор: FakerNeo 04 Aug 2008, 09:51

Цитата(major @ 03 Aug 2008, 12:47)
Спасибо, очень помог! Вот еще бы помог найти, где находится смертельный удар и аура магического сопротивления...

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

Автор: major 13 Sep 2008, 18:45

скажите следующие два кода одинаковы или есть принципиальные отличия?

Код
002F2983   837D 08 1A       CMP DWORD PTR SS:[EBP+8],1A
002F2987   75 02            JNZ SHORT 002F298B
002F2989   EB 3D            JMP SHORT 002F29C8
002F298B   837D 08 1B       CMP DWORD PTR SS:[EBP+8],1B
...
002F29C8   B8 01000000      MOV EAX,1
002F29CD   5D               POP EBP
002F29CE   C3               RETN


Код
002F2983   837D 08 1A       CMP DWORD PTR SS:[EBP+8],1A
002F2987   74 3F            JE SHORT 002F29C8
002F2989   837D 08 1B       CMP DWORD PTR SS:[EBP+8],1B
...
002F29C8   B8 01000000      MOV EAX,1
002F29CD   5D               POP EBP
002F29CE   C3               RETN

Автор: hippocamus 13 Sep 2008, 21:57

Одинаковы.
JNZ и JNE это вообще одно и то же, ну а в 1-м просто перепрыгивается безусловный.

Автор: major 14 Sep 2008, 06:57

Ну я так и думал...

Почему любое изменение в ТЕ-шном exe ведет к такой ошибке?

Код
EIP = 0x00774678,  Access Violation. Attempt to write the inaccessible data at 0x00000001


Это типа защита что ли? Как можно это исправить?

И еще как можно поменять зависимость очередности построек в городе? Ну например, чтоб улучш. Чудища строились при наличии Цитадели? Или улучш. волчий загон не требовал улучш. казарм гоблинов?

Автор: hippocamus 14 Sep 2008, 14:20

Да. А ты не знал? Он защищён. Используй экзешник от Феникс-мода. Это тот же ТЕ, но с него Берсеркер снял защиту.

Добавлено ([mergetime]1221391219[/mergetime]):
major, всё это сделано уже, но не распространяется, т.к. приберегается для релизов HotA и Wog3.59 smile.gif (про очерёдность построек)
хотя, если хочешь - напиши FakerNeo, может он чем-то поможет.

Автор: Чёртос-2 (Chortos-2) 28 Sep 2008, 16:07

Убедительная просьба ко всем, кто владеет хоть какой-нибудь информацией, скидывать её в тему «Инженерный анализ». smile.gif

Автор: hippocamus 16 Oct 2008, 11:06

А что нужно сделать, чтобы добавить в окно найма существ 8-й слот?
Без Портала, в другом городе? Это возможно, или там идёт чистая проверка на город №5 и постройку №19?

Автор: Хмм.. 16 Oct 2008, 17:38

А зачем тебе 8-й слот?

Автор: Docent Picolan 16 Oct 2008, 17:43

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

Автор: Хмм.. 16 Oct 2008, 17:48

Если и можно (вероятнее всего что можно), то:
1. Что делать с порталом вызова у Данжеона
2. Разберется ли с этим AI. Иначе придется прописывать и его действия

Автор: major 18 Oct 2008, 20:06

как перевести дробное число 2.5 из десятичной системы в шестнадцатеричную?

Автор: Хмм.. 18 Oct 2008, 20:40

вроде целая часть и дробная переводится отдельно

http://www.lyceum95.ru/inform/ss_drob.htm

Автор: hippocamus 19 Oct 2008, 22:12

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

Хмм! А какая для АИ разница, сколько слотов для покупки будет в диалоговом окне??? А скупку Хранителя можно им дать автоматом.

Автор: Tamerlan 20 Oct 2008, 12:56

а зачем ваще ио?и как его ис?

Добавлено ([mergetime]1224496563[/mergetime]):

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

Хмм! А какая для АИ разница, сколько слотов для покупки будет в диалоговом окне??? А скупку Хранителя можно им дать автоматом.

80% шанс взять родного
15% другого?
5% содовой?

Автор: major 20 Oct 2008, 20:15

Цитата(major @ 18 Oct 2008, 23:06)
как перевести дробное число 2.5 из десятичной системы в шестнадцатеричную?

Цитата(Хмм.. @ 18 Oct 2008, 23:40)

вроде целая часть и дробная переводится отдельно

http://www.lyceum95.ru/inform/ss_drob.htm


Точнее меня интересует, как это делается в героях.
За 3F800000 принимается единица, а как идет расчет исходя из этого?

Автор: sergroj 20 Oct 2008, 23:25

А, дак это в каком-нибудь языке программирования можно посмотреть - присвой single'у это значение и потом приведи указатель на число к указателю на DWORD и выведи число.
Для 2.5 будет 40200000.

Автор: major 03 Nov 2008, 20:47

а как с помощью ЕРМ сделать?
по некоторому адресу стоит 8-байтное значение 0.5, мне надо его поменять на 0.6. !!UN:C 8-байт не принимает, дробные значения не вписывает и переменные с плавающей точкой 4-байтные.
Как быть???

Автор: Хмм.. 03 Nov 2008, 21:08

Цитата(major @ 03 Nov 2008, 20:47)
!!UN:C 8-байт не принимает

8 - это 2*4 dry.gif

Цитата(major @ 03 Nov 2008, 20:47)
переменные с плавающей точкой 4-байтные.

Это все условно. Может и 8-байт.

Цитата(major @ 03 Nov 2008, 20:47)
Как быть???

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

Либо посмотри как число используется в коде и прикинь чему равно 0,6.

Автор: Хмм.. 03 Nov 2008, 22:52

0099999999999998 - вот такое чило получил при переводе в 16-ную систему числа 0,6

Автор: Aнгeл 04 Nov 2008, 14:56

Цитата
Почему любое изменение в ТЕ-шном exe ведет к такой ошибке?

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

Вы можете воспользоваться этим файлом вместо того, что идёт в поставке с ТЕ: http://letitbit.net/download/3f2e6b633237/Rebirth-002.rar.html.

Там же убрана стандартная реакция на ошибки в виде отключения части скрипта, что находится ниже кода, вызвавшего ошибку, а также исправлены недочёты с дорогами, которыми теперь можно управлять через ЕРМ.

Примечательно, что изменяя параметр Road на, например, 5, можно добиться, что чуть ниже указанной клетки будет нарисован обычный стрелочный курсор-метка, которым мы указываем путь героям. Чтобы не было вылета, эту метку стоит убрать до того, как игра продолжится.

Если кого-то из участников интересуют другие неофициальные модификации платформы, то можете посмотреть следующий архив: http://letitbit.net/download/b507f4784499/Era-001-Demo.RAR.html

Платформа Era базируется на изменённом выполняемом файле, ссылка на который была приведена выше. Среди основных целей:
Код
- Вызов WinAPI из ЕРМ
- Использование авторских внешних DLL
- Интеграция с наноассемблером для написания быстрых функций, для которых сейчас используется !!UN:C (Используется лишь для доступа к самым основным переменных игры)
- Новые события и двусторонняя связь между ЕРМ и бинарным кодом

В данной демонстрационной версии показаны основные аспекты платформы, но ещё не всё реализовано из задуманного.

Автор: hippocamus 11 Nov 2008, 01:28

Цитата
Для распаковки сейва переименуйте его в GOOD BOY.gz и воспользуйтесь WinRar, игнорируя ошибки


Добавлено ([mergetime]1226356131[/mergetime]):
Цитата
Для распаковки сейва переименуйте его в GOOD BOY.gz и воспользуйтесь WinRar, игнорируя ошибки

Вот это верно. Но я не понимаю, почему h3m - это нормальный gz-архив, а gm1 - некорректный. Это уж кому нужно было?

И ещё - я понимаю, что со столькими коментариями не понять - признак тупости, но почему для записи используется триггер музыки?

Автор: Aнгeл 11 Nov 2008, 02:32

Цитата
Вот это верно. Но я не понимаю, почему h3m - это нормальный gz-архив, а gm1 - некорректный. Это уж кому нужно было?

Хиппо, а ты подумай, нужны ли разрабам читеры, что сразу же распакуют и начнут менять сейвы. А так, сейв не распаковывается как бы. Карты тоже в формате GZ, но там верная crc пишется. Разрабы просто попытались защитить сейвы хотя бы от совсем несведущих. Хотя и не ахти вышло.

Цитата
И ещё - я понимаю, что со столькими коментариями не понять - признак тупости, но почему для записи используется триггер музыки?

В Эре триггер SN используется для новых событий. Ресивер SN - для команд.

Вот что было в оригинальной концепции, позже наноассемблер был исключён:

Код
DLL с дополнительным функционалом называется ANGEL.DLL.
Её загрузка происходит сразу после инициализации ВОГа и патчинга нужных функций.
DLL патчит zPlaySound так, что v50..v99 становятся ключевыми переменными.

v50 - номер команды
v51..v99 - параметры.
v99 - результат вызова функции API (Call Proc)

0 - стандартный ZPlaySound
1 - LoadLibrary (команда обнуляется)
2 - GetProcAddress (команда обнуляется)
3 - Call Proc (команда обнуляется)
4 - Call Nasm Function (команда обнуляется)
5 - вызов zPlaySound без ЕРМ-триггера. (команда обнуляется)
Другое: - вызвать !?SN-триггер без вызова функции zPlaySound (команда не обнуляется)


Что происходит?

На zPlaySound, иначе процедуре проигрывания звука, стоит мой перехватчик, а до этого был перехватчик ZVS. Перехватчик анализирует v50 и если это 0, то реакция стандартна, иначе см. выше.

Как программировать. Значение команды (v50) варьируется в небольшом диапазоне:

Код
0 - стандартный ZPlaySound]
[1 - LoadLibrary (команда обнуляется)
Name: ZIndex; VAR Result: VIndex;

[2 - GetProcAddress (команда обнуляется)]
hModule: INTEGER; ProcName: ZIndex; Result: VIndex;

[3 - Call Proc (команда обнуляется)]
Proc: POINTER; PushType: TPushType; Params: TParams;

TParms = RECORD
 Number: INTEGER;
 Params: ARRAY Number OF INTEGER;
END;

Через !!VR:C мы сразу настраиваем команду и параметры. Инициализируем, если нужно, строковые ерм переменные и выполняем команду: !!SN:Pz1; Звука не будет, ЕРМ триггер тоже не активируется. Вдобавок, ядро само обнулит v50.

TParams, если говорить проще - это: кол-во параметров/параметр1/параметр2/...;
В демке Era использует PASCAL-соглашение о передаче параметров в стёк и очистке мусора. В более поздних вариантах соглашение (CDECL, STDCALL, PASCAL) нужно будет указывать после адреса вызываемой функции. Дело в том, что большинство кода Героев юзает STDCALL/REGISTER, Слава - CDECL, а я - PASCAL. Единственное, DELPHI юзает убойный REGISTER (передача параметров через регистры), что, увы, не поддерживается.

Приведу для примера кусок из демки:

Цитата
!!VRz1:S^Angel.dll^; Скрипт получает дескриптор библиотеки ядра технической платформы
!!VRv50:C1/1/2; ...
!!SN:Pz1; ... v2 = дескриптор


!!VRv50:C/1/2;

Если бы демка была под SCVS, что возможно и будет в будущем (скомпилированный вариант тоже будет), то шаблон выглядел бы так:

Код
!!VR$Команда$:C(Загрузить библиотеку)/(Индекс z-переменной с названием)/(индекс v-переменной, куда поместить результат)


Что касается новых событий, то теперь должно быть понятно, что их довольно просто вводить. Я вставляю перехватчики в определённых местах, сохраняю регистры и флаги, устанавливаю v50 в номер события (должен быть > 4, >5 в демке) и вызываю zPlaySound. Ессно, звука нет, а вот ЕРМ триггер ловит событие. Соответственно в скрипте мы пишем:

!?SN&v50=(Событие_Х);
!!VRv50:S0; - это важно, иначе вместо звука (ведь скрипты часто проигрывают реальный звук) мы ещё раз сгенерируем это событие.

Как вывод, всё в принципе довольно стандартно.

Код
!!VRv50:Cкоманды и параметры
!!SN:Pz1; выполнили
....
!?SN&v50=событие_х;
!!VRv50:S0;
....


Например, ты можешь написать тестовую DLL, экспортировать функцию по имени:

Код
EXPORTS
 TestFunc NAME 'TestFunc';


По аналогии подгрузить DLL, получить адрес функции и вызвать её. Не забудь только при объявлении:

Код
FUNCTION TestFunc(i: INTEGER); PASCAL;


Поставить тип соглашения. А то Делфи будет ожидать параметров в регистрах, а мы ей стёк smile.gif

Автор: SAG19330184 17 Dec 2008, 10:42

специалисты, подсткажите: нужен адрес для таблицы героев, поля этой таблицы. В частности это позарез нужно для фиксирования геморройного бага со времен SOD - бага со стартовыми героями непервого уровня на случайных картах. Такой баг проявляется если стартовые герои совпадают с одним из героев в тюрьме (генератор некорректно наполняет тюрьмы). В таблице должно быть поле "доступен герой на карте" и для части героев это поле без галочки (герои из кампаний). Т.е. если пропатчить эту таблицу в момент, когда нажимается кнопка "BEGIN" но до начала генерации карты (пометить стартовых героев недоступными к генерации на карте), то генератор их не засунет в тюрьму и не будет бага smile.gif Если подобный патч можно реализовать не только для ТЕ но и для SOD то всемирную славу создателю патча я обеспечу

Автор: GORynytch 17 Dec 2008, 19:07

А меня прикалывал этот баг... Он срабатывает очень редко, но плохо чтоли стартовать с 15 уровнем, если играешь на высшей сложности...

Автор: SAG19330184 17 Dec 2008, 19:27

он срабатывает очень часто если много тюрем. А тюрем много на картах XL с подземельем. Часто идет 2-3 рестарта подряд, а это лишних 10 минут. Конечно неплохо стартовать с 15 уровнем, но противник почему то считает это слегка нечестным smile.gif На высшей сложности сейчас живые противники не играют, это только замедляет игру и увеличивает влияние совершенно случайных факторов.

Автор: Хмм.. 17 Dec 2008, 19:43

А обнулять начальных героев скриптом?

Автор: SAG19330184 18 Dec 2008, 12:49

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

Автор: gamecreator 21 Jan 2009, 00:18

кто-нибудь знает где в памяти хранится карта?

Автор: Master Of Puppets 13 Nov 2009, 21:20

Где в памяти или в exe хранятся заклинания, даваемые артефактами?

Автор: tolich 13 Nov 2009, 21:55

Боюсь, что это не единая таблица, а функция, проверяющая наличие и уровень заклинания у героя, имеет специальные ветки, включающиеся при наличии определенных артефактов (по их номерам). Это проще, чем хранить пустые списки для почти всех артефактов, кроме маленькой группы.

Автор: Master Of Puppets 13 Nov 2009, 22:05

А у тебя есть конкретные адреса, указатели?

Автор: tolich 13 Nov 2009, 22:21

Нет. Но я подозреваю, искать надо в сегменте кода.

Автор: Master Of Puppets 29 Dec 2009, 11:31

Почему при изменении указателя на таблицу монстров, даже на +/-116 байт, свойства командиров полностью аннулируются? Как их вернуть?

Автор: Astaroth 29 Dec 2009, 15:00

Цитата
Почему при изменении указателя на таблицу монстров, даже на +/-116 байт, свойства командиров полностью аннулируются? Как их вернуть?

А ты вместо этого какой ставишь указатель? На другую таблицу что ль?

Вопрос совершенно не в тему: кто хорошо умеет работать с графикой в C++ Builder. Просто назревает кое какой проект в миру героев, но с графикой хлопот очень и очень много

Автор: Дьяк 29 Dec 2009, 15:27

Нуты даешь MOP. Ты же смещаешь всех существ на +/- 1, что тут непонятного.

Как их вернуть - не трогать указатель.

Автор: Master Of Puppets 02 Jan 2010, 13:37

Дьяк, ты не так понял. Я переносил и всю таблицу в доп. память, crAnim тоже. Указатель, естественно, меняю, и не один. Но результаты те же. Менял указатель на начало таблицы вог-монстров - эффекта ноль. Искал возможный указатель на начало таблицы командиров - ничего не нашёл. Как вообще связан указатель на таблицу монстров со свойствами командиров - это меня и интересует. А так всё нормально - новые монстры работают. С проблемой хинта разберусь, возможно, сам, а вот проблема с командирами...

Автор: Дьяк 03 Jan 2010, 17:45

Покажи как ты переносишь - у меня таких проблем не возникало

Автор: Master Of Puppets 04 Jan 2010, 11:21

Кода при себе нет, обьясню на пальцах:
1. Выделяю буфер памяти (с помощью EraUtils.dll Берсеркера, но неважно как, хоть в z-переменные), запоминаю его адрес.
2. Копирую таблицу монстров через КопиМемори, начиная с 8195216h, в этот буфер.
3. Забиваю в 6768560h ссылку на этот буфер.
Такие же манипуляции с crAnim-ом.

Цитата(Master Of Puppets @ 13 Nov 2009, 21:20)
Где в памяти или в exe хранятся заклинания, даваемые артефактами?

Кстати (память):
004D977Ch - номер заклинания, даваемого Клинком Армагеддона (по умолчанию - 26).
004D9794h - номер заклинания, даваемого Грохотом Титанов (по умолчанию - 57)
Если изменить заклинание, когда артефакт уже надет, то при снятии старое заклинание всё равно исчезает из книжки (если герой его не знает).
Действительно, ничего похожего на таблицу. Но, возможно, на основе этих скудных данных, кто-то сможет создать функцию, чтобы свойство "дать заклинание" можно было применять к любому артефакту?

Автор: Дьяк 04 Jan 2010, 15:21

Можно в виде длл наделить любой артефакт заклом, просто немного расширить цикл case в ехе, который касается артов. На счет командиров - не знаю, не сталкивался. Если в ходе тестирования городов чет всплывет - отпишусь.
Но а вообще адрес 8195216d (он же 7D0C90h) в коде во многих местах (13 раз). Часть адресов - структуры патчинга, часть адреса для ЕРМ и т.п. Я с трудом представляю как они могут конфликтовать, но я думаю, если ты заменишь все 13 адресов указателем на свой буфер, то проблемы пропадут (возможно появятся новые )))), например английское название монстров и т.п. ))))) )

Автор: Master Of Puppets 06 Jan 2010, 06:37

13 раз? 0_о. Видимо, в большинстве случаев этот адрес представлен в неизвестном мне виде, так как АртМани - даже с использованием любого порядка байт и обхода защиты - нашла у меня только 4 значения, и ни одно проблемы с командирами не решило. Или я плохо ищу...
Хотя в экзешнике значение встречается раз семнадцать.

Автор: Дьяк 06 Jan 2010, 13:05

Ну вот видишь, ты сам сказал, что встречается чаще. Переведи адрес из ехе в виртуальный и проверь в артмани.

Как перевести - вот из этой темы:
http://forum.df2.ru/index.php?showtopic=6803

"1. На самом деле, Славин файл - это exe.
Для WoG 3.58f:
400000 + А, если А < 29C000,
465000 + А, если А >= 29C000."

Автор: Master Of Puppets 08 Jan 2010, 07:43

Дьяк - покорнейше благодарю. smile.gif Я и подумать не мог, что АртМани не может найти в памяти то, что может найти в экзешнике.
Изменил в общей сложности 19 указателей: 47ADD1h и 6747B0h - только в самой памяти, остальные 17 - от экзешника.
За работу командиров оказался ответственнен указатель mem76C05Ch.
Команда !!EA начинает ругаться лишь тогда, когда номер монстра превышает лимит в 256 существ. Однако, свойства опыта монстрам >196 так просто не даёт. Текстовики тоже не помогают. Очевидно, ограничение есть, но негласное.
Про таблицы особых свойств - знаю. Собственно, их можно задать различными способами, так что не страшно.
Существа нормально добавляются в слоты героя с помощью HE:C.
В общем, реальной осталась только проблема хинта (если это можно назвать проблемой). Глянул твои исходники (Monstr.asm), нашёл там:

Код
BufMonErr1 dd 447466h
BufMonErr2 dd 447467h
BufMonErr3 dd 732CA9h  

...
 
; снятие ограничений
invoke WriteAtCode,offset BufMonErr1,8,4,4  
invoke WriteAtCode,offset BufMonErr2,144,4,4  
invoke WriteAtCode,offset BufMonErr3,MaxMnstr,4,4


Оно? Если да, то что сие значит в переводе на русский? smile.gif
Вообще, я бы, наверное, смог лучше разобраться с этим (глянул хотя бы, что и на что в памяти поменялось), если бы monstr.dll работала на ЭРЕ 1.6. Но почему-то она наотрез отказывается это делать. Проблема в Monstr.bin - с его присутствием в папке плагинов игра просто не запускается. Помнится, на ЭРЕ 1.1 библиотека работала, хотя и давала вылет при вступлении в битву (несмотря на то, что всё было вроде верно сделано, и в AVWATTAK.DEF были дополнительные кадры).

Автор: Дьяк 08 Jan 2010, 12:07

1. Я не знаю на сколько новый у тебя исходник
2. В любом случае подход в том исходнике устаревший, т.к. переписываю все на С++
3. Последний исходник - это исходник к ролику о Бастионе
4. К длл идет еще две папки DATA_*** . Они тоже могут быть устаревшими - это раз, а два - в них могут быть лишние данные.
5. Те 3 адреса - это снятие ограничений с, если мне не изменяет память, хинта и команды ЕРМ, которая меняет существ в замке UN:T или чет тип того. По этим адресам должно находится число монстров. Последний адрес - точно ЕРМ потому, что - это код Славы. Но не факт, что это весь хинт.
6. Снять хинт без отладчика тебе не удасться. Придется учить азы ассемблера. Т.к. в коде идет простая проверка на кол-во монстров 197, т.е. 197 при помощи артманиты найдешь дох...на.

Автор: Master Of Puppets 10 Jan 2010, 06:12

Цитата
1. Я не знаю на сколько новый у тебя исходник

Я тоже, ибо не подписано. Но точно не этого года.)
Цитата
4. К длл идет еще две папки DATA_***

В курсе. Но папка лишь одна - DATA_MNSTR.
Цитата
5. Те 3 адреса - это снятие ограничений с, если мне не изменяет память, хинта и команды ЕРМ, которая меняет существ в замке UN:T или чет тип того. По этим адресам должно находится число монстров. Последний адрес - точно ЕРМ потому, что - это код Славы. Но не факт, что это весь хинт.

Первые два - ХЗ, и по ним не кол-во монстров. А третий - точно UN:T.
Цитата
6. Снять хинт без отладчика тебе не удасться. Придется учить азы ассемблера. Т.к. в коде идет простая проверка на кол-во монстров 197, т.е. 197 при помощи артманиты найдешь дох...на.

Искать номера заклинаний, даваемых артефактами, было куда труднее. :-)
В exe:
003253E0 - имя существа при вопросе в двеллинге ("Вы хотите нанять...?").
0032544C - подсказка по монстру на карте при наведении мыши.
003257C4 - диалоги при нападении на монстра (предложение о присоединении, предложение догнать)
00325848 - подсказка в окнах героя и обмена героев при наведении мыши.
003258CC - подсказка по кадру дефа в диалогах и сообщениях типа IF:Q
003258FC - подсказка в Обзоре Королевства при наведении мыши на кол-во существ в армии героя.
00325908 - подсказка в Обзоре Королевства при наведении мыши на иконку существа в армии героя.
0032598C - подсказка по монстру на карте по ПКМ.
003259A4 - имя в двеллинге (заголовок "Нанять ..."). Как для уличных двеллингов, так и для городских.
00325B30 - подсказка в городе по иконкам найма - и ПКМ, и при наведении.
00325BA8 - подсказка в городе при наведении мыши на слот героя ("выбор из гарнизона:" или "выбор (визитёр):")
00325C08 - имя существа в окне вражеского стека
00325C14 - имя существа в окне отряда.
Наверняка, есть ещё какие-то хинты, о которых просто так не вспомнишь, но если столкнусь - труда найти не составит.
Помимо этого:
Найдены 4 проверки по адресам 002BF76B, 002B9F50, 002EBD8D и 002BFB15, отвечающие за показ диалога опыта армии в битве и вне её. Также, по адресу 002BFA89 находится проверка на наличие в диалоге кнопки "Просмотр бонуса для Улучш/Неулучш. существ". Правда, проверки какие-то тёмные - снятие ограничения работает лишь для существа 197, а если выше - диалог либо показывает свойства 197-го, либо (намного чаще) всё равно вылетает. Видно, нужно либо ещё что-то найти, либо где-то расширить таблицу. Кнопка просмотра бонуса для улучш. существа показывает диалог Копейщика.
002F1410h - убрать сообщение об ошибке команды !!MA. Убирается только сообщение - сама команда всё равно не работает с параметрами новых существ.
Пока вопросы кончились.

Автор: Дьяк 10 Jan 2010, 12:16

Цитата
003253E0 - имя существа при вопросе в двеллинге ("Вы хотите нанять...?").
0032544C - подсказка по монстру на карте при наведении мыши.
003257C4 - диалоги при нападении на монстра (предложение о присоединении, предложение догнать)
00325848 - подсказка в окнах героя и обмена героев при наведении мыши.
003258CC - подсказка по кадру дефа в диалогах и сообщениях типа IF:Q
003258FC - подсказка в Обзоре Королевства при наведении мыши на кол-во существ в армии героя.
00325908 - подсказка в Обзоре Королевства при наведении мыши на иконку существа в армии героя.
0032598C - подсказка по монстру на карте по ПКМ.
003259A4 - имя в двеллинге (заголовок "Нанять ..."). Как для уличных двеллингов, так и для городских.
00325B30 - подсказка в городе по иконкам найма - и ПКМ, и при наведении.
00325BA8 - подсказка в городе при наведении мыши на слот героя ("выбор из гарнизона:" или "выбор (визитёр):")
00325C08 - имя существа в окне вражеского стека
00325C14 - имя существа в окне отряда.


Эти адреса тебе ничем не помогут. Это динамические адреса и вероятность, что они совпадут на других компах - мизерна (я не удевлюсь, если они у тебя тоже не совпадут при нескольких запусках игры). Ограничения так не снимаются. Я же вроде сказал, что в коде нужно искать кол-во монстров и увеличивать их. Лучше не трать время. Я скоро перепишу монстров на С++ и дам тебе инструмент. Либо начинай изучать ассемблер. Я тоже начинал с артмани не имея о нем представления. Как видишь разобрался - ничего сложного.

Автор: Master Of Puppets 12 Jan 2010, 12:44

Я же сказал, что эти адреса находятся,

Цитата(Master Of Puppets @ 10 Jan 2010, 06:12)
В exe:

По ним и находится число 197. Увеличиваешь - и хинт приходит в порядок.
Я и ограничения с команд MA снял (у них указатели на таблицу монстров со смещением), и заставил их работать с новыми данными. И с диалогом опыта армии разобрался.

Автор: Astaroth 17 Jan 2010, 06:36

Не знал где написать, поэтому спрошу здесь: Как определить координаты, по которым расставляются здания в городах? Очень и очень нужно. Кто покажет как или хотя бы намекнет как до всего дойти своим умом заранее огромное спасибо yes.gif

Автор: Master Of Puppets 17 Jan 2010, 07:04

Можешь тут на эту тему посмотреть: http://forum.df2.ru/index.php?showtopic=7070
Координаты любой штуки ищутся довольно легко в АртМани. Но объяснять, как и что искать в каждом отдельном случае - довольно долго. Часто x - в одном байте, а y - в четырёх, и наоборот. В окнах, подобных HeroScreen, координаты ищутся от угла диалога, а не от угла экрана, и т.д.
Лучше, как говорит Дьяк, изучить азы Ассемблера.)

Автор: Astaroth 17 Jan 2010, 07:08

Цитата
Лучше, как говорит Дьяк, изучить азы Ассемблера.)

Я изучаю, по долгу учебы. Даже пятерочки частенько бывают. Хоть я его и не идеально знаю, но с большей частью команд знаком

P.S. Спасибо! yes.gif

Автор: Master Of Puppets 17 Jan 2010, 07:13

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

Автор: Дьяк 21 Apr 2010, 21:15

BufCastleDCoor1 dd 5C32E9h
BufCastleDCoor2 dd 5C32F6h

Указатель на указатель таблицы располагается по адресу 5C32E9 (там размер координат word ), но игра использует два адреса один для координаты X второй для координаты Y
При помощт OlyDbg координаты можно найти за 2 минуты. Ставишь бряк на указатель имени дефа любого строения и при входе в замок оказываешься в коде на процедуре отрисовки.

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


Добавлено ([mergetime]1271873750[/mergetime]):
Буду дома - посмотрю

Автор: tolich 17 Jan 2010, 15:43

Цитата(Дьяк @ 17 Jan 2010, 10:56)
Там указана отдаленность зданий от игрока.
depth

Автор: feanor 17 Mar 2010, 21:46

Как сделать существо кастером? Трех таблиц, упомянутых в теме, недостаточно: с их помощью можно прибить каст у элементалей/огров/шаманов/архангелов etc, можно поменять им типы заклятий (дать огру-шаману каст как у джиннов etc), но сделать кастером, скажем, дендроида или циклопа - никак sad.gif

Автор: etoprostoya 17 Mar 2010, 21:56

!!MA:B#/S - не катит?

Автор: feanor 17 Mar 2010, 22:04

Отлично. Теперь хотя бы эксепшн кидает.

Добавлено ([mergetime]1268852643[/mergetime]):
Йахху!!!!!!!!!1111111111111111111111111
Этопростоты, с меня пиво. И как я сразу не додумался, что дело в отсутствии магических зарядов...

Автор: Master Of Puppets 21 Apr 2010, 13:34

Просьба помочь с Кавалерийским бонусом.
Во-первых, баг есть в самой SUB_L0075D7F5: разбег, заданный опытом (как через текстовик, так и ERM-ом), не работает. Вертишь курсором вокруг вражеского стека - изменение вычисляемого урона в логе отображается. Но урон наносится всегда обычный.
Во-вторых, введение дополнительных проверок, превращение их в case или просто изменение номера существа в проверках - как в ВОГ, так и в СОД - даёт точно такой же результат, что и вышесказанное.
Раз ВОГ всё равно не у дел, рассмотрим СОД. Кавалерийским бонусом там занимается этот участок:

443077 mov eax,[edi+34h]
44307A test eax,eax - проверка на Копейщика
44307C jz L004430A3
44307E cmp eax,00000001h - проверка на Алебардщика
443081 jz L004430A3
443083 fild dword ptr [ebp+08h]
443086 fstp qword ptr [ebp-1Ch]
443089 fild dword ptr [ebp+18h]
44308C fstp qword ptr [ebp-14h]
44308F fld qword ptr [ebp-1Ch]
443092 fmul qword ptr [ebp-14h]
443095 fmul qword ptr [L0063AC58]
44309B call SUB_L00617F94
4430A0 mov [ebp-10h],eax

Сама SUB_L00617F94:

617F94 push ebp
617F95 mov ebp,esp
617F97 add esp,FFFFFFF4h
617F9A fstcw word ptr [ebp-02h]
617F9E wait
617F9F mov ax,[ebp-02h]
617FA3 or ah,0Ch
617FA6 mov [ebp-04h],ax
617FAA fldcw word ptr [ebp-04h]
617FAD fistp qword ptr [ebp-0Ch]
617FB0 fldcw word ptr [ebp-02h]
617FB3 mov eax,[ebp-0Ch]
617FB6 mov edx,[ebp-08h]
617FB9 leave
617FBA retn

Прошу пояснить, каким образом этот код препятствует возможности дать разбег другому существу. Или, если дело не в нём - то в чём?

Автор: etoprostoya 21 Apr 2010, 21:21

Опять проблемы с этим удалением постов. smile.gif

Автор: Дьяк 24 Apr 2010, 11:30

хм.... не знаю у меня кавалерийский бонус прекрасно работает

Добавлено ([mergetime]1272097845[/mergetime]):
0075D823 833D C0608402 2>CMP [DWORD 28460C0],27
0075D82A 75 0C JNZ SHORT Era_1_6.0075D838
0075D82C C705 20648402 0>MOV [DWORD 2846420],0B
0075D836 EB 28 JMP SHORT Era_1_6.0075D860
0075D838 833D C0608402 0>CMP [DWORD 28460C0],0B
0075D83F 75 0C JNZ SHORT Era_1_6.0075D84D
0075D841 C705 20648402 0>MOV [DWORD 2846420],0B
0075D84B EB 13 JMP SHORT Era_1_6.0075D860

проверка на монстра всего одна. поэтому менять нужно либо в инструкции 75D823 (как я поменял на нагу) либо 75D83F. А лучше вынести весь этот участок в отдельное место и написать нормальную таблицу.

Автор: Master Of Puppets 01 May 2010, 07:21

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

Код
0075D823  60                          pushad
0075D824  A1C0608402                  mov    eax,[L028460C0]
0075D829  3DE7030000                  cmp    eax,000003E7h
0075D82E  771C                        ja  CASE_03400FE2_PROC0000
0075D830  33DB                        xor    ebx,ebx
0075D832  8A98FA0B4003                mov    bl,[eax+CASE_03400BFA]
0075D838  FF249DE20F4003              jmp    [CASE_PROCTABLE_03400FE2+ebx*4]
0075D83F                           CASE_03400FE2_PROC0001:
0075D83F  61                          popad
0075D840  C705206484020B000000        mov    dword ptr [L02846420],0000000Bh
0075D84A  EB14                        jmp    L0075D860
0075D84C                           CASE_03400FE2_PROC0000:
0075D84C  61                          popad



Тютелька-в-тютельку влез. smile.gif

Автор: Master Of Puppets 05 May 2010, 14:35

О багах

Баг номер раз:

Cтрельба вплотную:

44267F 6889000000: push 00000089h - Лук Снайпера
442684 mov ecx,eax
442686 call SUB_L004D9460/SUB_L0076718F
44268B test al, al

При запуске игры вызываемая функция заменяется на вог-функцию (поэтому я привожу сразу два номера), из которой затем вызывается первоначальная функция, а далее - проверки, имеет ли стек бонус в качестве абилки опыта. Если да, в al заносится 1 (типа у героя есть Лук Снайпера).
Можно поставить туда проверки или прикрутить таблицу, тем самым сделав возможным дать существу перманентный, независимый от опыта бонус. Тип существа в стеке находится там в [esi+34h].
А сам баг заключается в том, что бродячий монстр вообще не может обладать этим бонусом. Ведь у него нет героя-хозяина, а, стало быть, и артефакта.
Проверьте, если хотите.


Баг номер два:

Кто-нибудь пробовал поставить существу Смертельный Удар со 100%-ым шансом? Он не работает.
Заинтересовавшись, я пришёл к выводу, что шанс рассчитывается и в ВОГ, и дальше, в оставшейся активной проверке СОД. В итоге, по сути, существу просто никак не поставить шанс Смертельного Удара выше 20% (ибо в СОД стоит 20).
Накодил что-то, исправляющее это недоразумение:

CODE

; НАЗВАНИЕ: DeathBlow
; ВЕРСИЯ: 1.0
; АВТОР: Master Of Puppets
; ОПИСАНИЕ: Превращение Смертельного Удара из проверки в таблицу для всех существ
; EXE: MOP

; встроить вог-функцию (только для наглядности)
;435A3 E8F7373200; CALL MOP.00766D9F
;435A8 90; NOP

; 2. Таблица, определяющая шанс срабатывания абилки:
301CE8 8B4834; MOV ECX,DWORD PTR DS:[EAX+34]
301CEB E96FE0C902; JMP MOP.03404D5F
301CF0 9090909090; NOP (5)

384D5F 33D2; XOR EDX,EDX
384D61 8A91804D4003; MOV DL,BYTE PTR DS:[ECX+3404D80]
384D67 8955FC; MOV DWORD PTR SS:[EBP-4],EDX
384D6A E9861F36FD; JMP MOP.00766CF5

; 3. Устранение бага некорректного расчёта шанса выпадения абилки в опыте существ:
; исправление СОД-проверки в соответствии с результатами ВОГ-вычислений:
436DE E98C16FC02; JMP MOP.03404D6F
436E3 90909090; NOP (4)

384D6F 3B0520028602; CMP EAX,DWORD PTR DS:[2860220] - сравнение выпавшего шанса с результатом процентовки, вычисленной в вог-функции
384D75 0F8F13EB03FD; JG MOP.0044388E
384D7B E967E903FD; JMP MOP.004436E7

; Таблица:
384DC3 14; 067 Рыцарь Смерти

В итоге всё вроде заработало правильно - и опыт, и таблицы. Но кому это тоже интересно - пробежитесь глазами. Может, я что-то напутал.

Автор: etoprostoya 19 Jun 2010, 13:25

feanor, лучи, которые ты исследовал, исходят из какой-то определённой точки, привязанной к координатам экрана? дефа? Работает ли луч для двухгексовых или только одногексовых юнитов?
Собственно нужны и сами координаты начала луча.

Автор: feanor 19 Jun 2010, 15:51

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

Автор: pHOMM 21 Jun 2010, 07:46

Я всегда думал, что местоположение точек выстрела "снаряда" прописано в Cranim.txt в колонках
Upper-right Missile Offset , Right Missile Offset , Lower-right Missile Offset , наклон снаряда прописан далее в секциях Angles (я помню пытался сделать слоумоушн эффект, ошибочно полагая, что эти колонки влияют на скорость полёта снаряда, добился только стрел летаюших плашмя и задом наперёд), большинство остальных колонок отвечают за тайминги анимаций, что и использовано для ускорения анимации в ТЕ. (т.н. ТЕ-краним)

Автор: Shihad 21 Jun 2010, 08:51

Кстати, как ты сделал стрелы задом наперед? Если снаряд архимага полетит назад, от цели к стрелку, это отличная анимация для "забирания души/маны/жизненной силы"

Автор: pHOMM 21 Jun 2010, 13:37

Ай ай ай , видать схалтурил... задом наперед вроде не было... По идее надо подобрать углы для каждого выстрела, там идут стандартно у всех 90 72 45 27 0 -27 -45 -72 -90 , 90 вверх направлен, 0 ровно вправо, можно и подобрать подходящие... но это без графики не будет работать... в графике стреляемых патронов всё равно всего 9 кадров, игра стреляет готовыми кадрами а не поворачивает (((( а вот плашмя хорошо летают, а графику и подредактировать можно )

Кстати у архимага патрон - луч, а вот у мага, да, сгусток )) и уж конечно не снаряд летит назад, а просто графика снаряда берется другая, т.е повернутая

Автор: feanor 21 Jun 2010, 15:17

Код
CPU Disasm
Address   Hex dump          Command                                  Comments
0043F2A4  |.  6A 00         PUSH 0                                  ; /Arg17 = 0
0043F2A6  |.  C1FA 03       SAR EDX,3                               ; |
0043F2A9  |.  8BC2          MOV EAX,EDX                             ; |
0043F2AB  |.  6A 0A         PUSH 0A                                 ; |Arg16 = 0A
0043F2AD  |.  C1E8 1F       SHR EAX,1F                              ; |
0043F2B0  |.  6A 00         PUSH 0                                  ; |Arg15 = 0
0043F2B2  |.  6A 01         PUSH 1                                  ; |Arg14 = 1
0043F2B4  |.  8D5402 0F     LEA EDX,[EAX+EDX+0F]                    ; |
0043F2B8  |.  8B45 CC       MOV EAX,DWORD PTR SS:[LOCAL.13]         ; |
0043F2BB  |.  52            PUSH EDX                                ; |Arg13
0043F2BC  |.  8B55 D0       MOV EDX,DWORD PTR SS:[LOCAL.12]         ; |
0043F2BF  |.  6A 00         PUSH 0                                  ; |Arg12 = 0
0043F2C1  |.  6A 00         PUSH 0                                  ; |Arg11 = 0
0043F2C3  |.  51            PUSH ECX                                ; |Arg10
0043F2C4  |.  8B4D EC       MOV ECX,DWORD PTR SS:[LOCAL.5]          ; |
0043F2C7  |.  6A 04         PUSH 4                                  ; |Arg9 = 4
0043F2C9  |.  6A 05         PUSH 5                                  ; |Arg8 = 5
0043F2CB  |.  6A 00         PUSH 0                                  ; |Arg7 = 0
0043F2CD  |.  6A 00         PUSH 0                                  ; |Arg6 = 0
0043F2CF  |.  50            PUSH EAX                                ; |Arg5 => [LOCAL.13]
0043F2D0  |.  8B45 D4       MOV EAX,DWORD PTR SS:[LOCAL.11]         ; |
0043F2D3  |.  51            PUSH ECX                                ; |Arg4 => [LOCAL.5]
0043F2D4  |.  8B0D 20946900 MOV ECX,DWORD PTR DS:[699420]           ; |
0043F2DA  |.  52            PUSH EDX                                ; |Arg3 => [LOCAL.12]
0043F2DB  |.  50            PUSH EAX                                ; |Arg2 => [LOCAL.11]
0043F2DC  |.  6A 01         PUSH 1                                  ; |Arg1 = 1
0043F2DE  |.  E8 4D6C1600   CALL 005A5F30                           ; \Era_1_6.005A5F30


вот так выглядит милый кусок кода после определения цвета луча. 17 параметров.
Arg10 - цвет.
Arg2-5 - координаты начала и конца. Щас еще с цепнухой поэкспериментирую и скажу про Arg 13.

Офф::щас мне доверять не очень стоит. Я вместо координат начала и конца чуть не написал "координаты углов наклона"

Добавлено ([mergetime]1277122322[/mergetime]):
Аргументы восьмой и девятый - толщины по х и y.

Добавлено ([mergetime]1277122654[/mergetime]):
Аргументы 11 и 12 - изломанность / кривизна линии соответственно. Лучи не только лучи, но и молнии и даже фейрверки (:

Автор: etoprostoya 21 Jun 2010, 15:17

>> Аргументы восьмой и девятый - толщины по х и y.

В смысле? Думал у луча должна быть только толщина, она же ширина.
Или это 3D-луч? shok.gif

Автор: feanor 21 Jun 2010, 15:23

Ну их раздельное изменение, в общем на толщину влияет все равно не особо, но интуиция подсказывает мне, что суть такова:

к сожалению, анимация дюже быстра и проверить это не получается sad.gif

Автор: etoprostoya 21 Jun 2010, 15:24

А может это толщина на разных концах луча?

Автор: feanor 21 Jun 2010, 15:38

Arg 11 = 0xFFFF,
Arg 12 = 0xFFFF.
http://savepic.ru/1313571.htm
однако.


Добавлено ([mergetime]1277123449[/mergetime]):

Цитата
А может это толщина на разных концах луча?

и вы выигрываете суперприз! так и есть(

Добавлено ([mergetime]1277123934[/mergetime]):
Arg 13 - скорость луча. 0 вызывает эксепшен деления на ноль. Уменьшение луч затормаживает.

Arg 16 - тоже что-то около скорости. Увеличение затормаживает луч.

Автор: Лорд Хаарт 21 Jun 2010, 15:39

Дорогая редакция, я созерцаю.

Автор: feanor 07 Jul 2010, 19:48

75D0F4 - номер существа с охранниками. По умолчанию - AD, санта-гремлин.

Автор: Master Of Puppets 09 Jul 2010, 20:16

Давно хотел написать:
Популярный адрес 69CCFCh - указатель на структуру текущего игрока. Именно текущего. Ошибка многих скриптописцев в том, что они принимают этот адрес за указатель на структуру первого, красного игрока - ибо всё тестят на красном. Да и я, был грех, когда-то так делал. rolleyes.gif
Опустившись пониже, можно найти указатели на структуры городов, шахт, гарнизонов и т.д. Ещё ниже - структуры героев. Иначе говоря, весь этот огромный и нестатичный блок памяти - единое целое. До всего в нём приходится добираться из смещений.

В отличие от артефактов или монстров, информация о статусе заклинаний в структуре героя хранится просто в виде таблицы однобайтных значений (0 = нет, 1 = есть). Значений в ней 70 (заклинания 0-69). То есть, чтобы герой изучал новые заклинания, нужно либо:
а) Увеличить размер структуры героя. Очевидно, тогда понадобится перенести весь блок структур и уведомить код игры о перенесении и расширении. В общем, фиг кто этим займётся.
б) Хранить информацию об изученных заклинаниях в другом месте. Тоже не особо легко, но, в принципе, иначе никак.

В общем, вы поняли, насколько всё печально. md_house.gif

Автор: feanor 09 Jul 2010, 20:20

ой, ё..
/me вообще не задумался об этом.

Автор: etoprostoya 09 Jul 2010, 20:40

/me задумался об этом, даже придумал способ увеличить число заклинаний в 8 раз. Как, догадаться не трудно. Нужно только уплотнить код в местах обращения к таблице заклинаний и тестить не байты а биты.
Я всегда такой умный, пока до дела не дойдёт. gigi.gif

Автор: Master Of Puppets 16 Jul 2010, 05:04

А чем этот выход лучше? Менять указатели на структуры и то проще, чем менять способ обращения к ним.

Автор: etoprostoya 16 Jul 2010, 07:41

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

А вообще, это нужно на реальном коде смотреть, а не утверждать голословно. Может получиться, что я совсем не в тему сделал предложение.

Автор: Master Of Puppets 18 Jul 2010, 19:42

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

Автор: Master Of Puppets 21 Jul 2010, 19:40

Цитата(Master Of Puppets @ 03 Jun 2010, 03:26)

!?FU@Открытие окна слотового существа@;
; конвертирование - thiscall
; x1: 0 - герой, 1 - город, 2 - гарнизон, 3 - шахта
; x2 - номер объекта: HE:N, CA:U, OB:C
; x3 - номер слота
; x4 - наличие кнопки "Уволить": 1 - да, 0 - нет
; x5 - закрыть диалог при отпускании мыши: 1 - да, 0 - нет
!!UN:C6933756/4/?y5; //получить адрес структуры текущего игрока
!!OW:C?y2; //получить цвет текущего игрока
!!VRy1:Sy2*360; //360 байт на структуру игрока
!!VRy5:-y1; //вычитаем и перемещаемся в начало структур
!!UN:C6919480/4/?y10;
!!if&x1=0; //ГЕРОЙ
!!HE-1&x2=-1:N?x2; //если герой указан как -1, получить его номер
!!VRy1:Sx2*1170+y5+3041; //1170 байт на структуру героя
!!VRy3:Sx3*4+y1; //смещение до нужного слота
!!UN:Cy3/4/<0; //проверить, есть ли в этом слоте существо
!!FU&1:E; //выход, если существа нет *тип = -1*
!!VRy3:Sy1-145;
!!SN:E5007632/2/y10/y1/x3/y3/0/119/20/x4/x5; //выполнить внутреннюю игровую функцию
!!en;
!!if&x1=1; //ГОРОД
!!VRy1:Sy5+2884; //найти указатель на структуру городов
!!UN:Cy1/4/?y2; //получить адрес структуры
!!VRy1:Sx2*360+y2+224; //360 байт на структуру города
!!VRy3:Sx3*4+y1; //смещение до нужного слота
!!UN:Cy3/4/<0; //проверить, есть ли в этом слоте существо
!!FU&1:E; //выход, если существа нет *тип = -1*
!!VRy3:Sy1-224;
!!SN:E5007632/2/y10/y1/x3/0/y3/119/20/x4/x5; //выполнить внутреннюю игровую функцию
!!en;
!!if&x1>1; //ГАРНИЗОН & ШАХТА
!!UN:C6919480/4/?y2;
!!VRy2&x1=2:+320428; //смещение для гарнизонов
!!VRy2&x1=3:+320396; //для шахт
!!UN:Cy2/4/?y1; //найти адрес начала таблицы объектов
!!VRy1:+4; //существа в слотах начинаются через 4 байта
!!VRy4:Sx2*64+y1; //64 байта на объект
!!VRy3:Sx3*4+y4; //смещение до нужного слота
!!UN:Cy3/4/>-1; //проверить, есть ли в этом слоте существо
!!SN&1:E5007632/2/y10/y4/x3/0/0/119/20/x4/x5; //если есть - выполнить внутреннюю игровую функцию
!!en;


Если кому надо - оформлено в виде асма:

239E82 A138956900; MOV EAX,DWORD PTR DS:[699538]
239E87 837D3C03; CMP DWORD PTR SS:[EBP+3C],3 - Шахта?
239E8B 0F87E3000000; JA mop.00639F74 - если параметр более 3, то сворачиваемся.
239E91 7503; JNZ SHORT mop.00639E96
239E93 83E820; SUB EAX,20
239E96 05ACE30400; ADD EAX,4E3AC
239E9B 8B18; MOV EBX,DWORD PTR DS:[EAX]
239E9D 83C304; ADD EBX,4
239EA0 8B4538; MOV EAX,DWORD PTR SS:[EBP+38]
239EA3 6BC040; IMUL EAX,EAX,40
239EA6 03C3; ADD EAX,EBX
239EA8 8B5D34; MOV EBX,DWORD PTR SS:[EBP+34]
239EAB 6BDB04; IMUL EBX,EBX,4
239EAE 03D8; ADD EBX,EAX
239EB0 833BFF; CMP DWORD PTR DS:[EBX],-1
239EB3 7441; JE SHORT mop.00639EF6
239EB5 FF752C; PUSH DWORD PTR SS:[EBP+2C]
239EB8 FF7530; PUSH DWORD PTR SS:[EBP+30]
239EBB FF7524; PUSH DWORD PTR SS:[EBP+24]
239EBE FF7528; PUSH DWORD PTR SS:[EBP+28]
239EC1 6A00; PUSH 0
239EC3 6A00; PUSH 0
239EC5 FF7534; PUSH DWORD PTR SS:[EBP+34]
239EC8 50; PUSH EAX
239EC9 EB47; JMP SHORT mop.00639F12 - на выполнение функции открытия окна слотового существа

239ECB 837D3C01; CMP DWORD PTR SS:[EBP+3C],1 - слот города?
239ECF 75B1; JNZ SHORT mop.00639E82 - нет, так проверка на Гарнизон/Шахту
239ED1 8BC6; MOV EAX,ESI
239ED3 05440B0000; ADD EAX,0B44
239ED8 8B10; MOV EDX,DWORD PTR DS:[EAX]
239EDA 8B5D38; MOV EBX,DWORD PTR SS:[EBP+38]
239EDD 69DB68010000; IMUL EBX,EBX,168
239EE3 03DA; ADD EBX,EDX
239EE5 81C3E0000000; ADD EBX,0E0
239EEB 8B5534; MOV EDX,DWORD PTR SS:[EBP+34]
239EEE 6BD204; IMUL EDX,EDX,4
239EF1 03D3; ADD EDX,EBX
239EF3 833AFF; CMP DWORD PTR DS:[EDX],-1
239EF6 745A; JE SHORT mop.00639F52
239EF8 8BC3; MOV EAX,EBX
239EFA 2DE0000000; SUB EAX,0E0
239EFF FF752C; PUSH DWORD PTR SS:[EBP+2C]
239F02 FF7530; PUSH DWORD PTR SS:[EBP+30]
239F05 FF7524; PUSH DWORD PTR SS:[EBP+24]
239F08 FF7528; PUSH DWORD PTR SS:[EBP+28]
239F0B 50; PUSH EAX
239F0C 6A00; PUSH 0
239F0E FF7534; PUSH DWORD PTR SS:[EBP+34]
239F11 53; PUSH EBX
239F12 EB5B; JMP SHORT mop.00639F6F - на выполнение функции открытия окна слотового существа

239F14 60; PUSHAD - сохраняем регистры
239F15 8BEC; MOV EBP,ESP
239F17 8B35FCCC6900; MOV ESI,DWORD PTR DS:[69CCFC] - получить адрес структуры текущего игрока
239F1D 8B15F4CC6900; MOV EDX,DWORD PTR DS:[69CCF4] - получить номер (цвет) текущего игрока
239F23 69D268010000; IMUL EDX,EDX,168 - умножить цвет на 360 (размер структуры игрока)
239F29 2BF2; SUB ESI,EDX - вычитаем и перемещаемся в начало структур
239F2B 8B0D38956900; MOV ECX,DWORD PTR DS:[699538] - параметр, который должен хранится в ecx
239F31 837D3C00; CMP DWORD PTR SS:[EBP+3C],0 - открытие ли окна существа в слоте героя?
239F35 7594; JNZ SHORT mop.00639ECB - нет, так проверяем на город
239F37 8B4538; MOV EAX,DWORD PTR SS:[EBP+38] - загрузить номер героя
239F3A 69C092040000; IMUL EAX,EAX,492 - умножить на размер структуры героя
239F40 03C6; ADD EAX,ESI - добавить смещение от начала структур игроков
239F42 05E10B0000; ADD EAX,0BE1 - смещение до слотов существ
239F47 8B5D34; MOV EBX,DWORD PTR SS:[EBP+34] - загрузить номер слота
239F4A 6BDB04; IMUL EBX,EBX,4 - умножить на 4 байта
239F4D 03D8; ADD EBX,EAX - добавить смещение
239F4F 833BFF; CMP DWORD PTR DS:[EBX],-1 - есть ли в слоте существо?
239F52 7420; JE SHORT mop.00639F74 - если нет, то завершаем функцию
239F54 8BD8; MOV EBX,EAX
239F56 81EB91000000; SUB EBX,91
239F5C FF752C; PUSH DWORD PTR SS:[EBP+2C] -
239F5F FF7530; PUSH DWORD PTR SS:[EBP+30]
239F62 FF7524; PUSH DWORD PTR SS:[EBP+24]
239F65 FF7528; PUSH DWORD PTR SS:[EBP+28]
239F68 6A00; PUSH 0
239F6A 53; PUSH EBX
239F6B FF7534; PUSH DWORD PTR SS:[EBP+34]
239F6E 50; PUSH EAX
239F6F E89CC9E8FF; CALL mop.004C6910 - запуск функции открытия окна слотового существа
239F74 61; POPAD - выталкиваем регистры
239F75 C3; RETN


Конвертирование - Pascal. Вызов через ЭРУ: !!SN:E6528788/0/x1/x2/x3/x4/x5/x6/x7;
Ранее не оговоренные параметры x6 и x7 - положение диалога по x и y.
P.S. Не обращайте внимания, что вызов из содовской секции. Я там просто некогда сократил туеву хучу кода. Кому надо, тот исправит.

Автор: feanor 05 Aug 2010, 19:20

*(char*)(0x5AFA8F+2) = 0xFF; //spell book can be exchanged
*(char*)(0x5AFA98+2) = 0xFF; //catapult can be exchanged

*(char*)0x4E3222 = 0xFF; //
*(char*)0x4E322B = 0xFF; //warfare can be putted into backpack
*(char*)0x4E3234 = 0xFF; //
*(char*)0x4E3219 = 0xFF; //

*(char*)(0x4DE112+2) = 0xFF; //unlocking catapult slot

книгами и боевыми машинами (в т.ч катапультами) можно обмениваться. Боевые машины (в т.ч катапульты) можно снимать и таскать в рюкзаке (книги - только на экране обмена).

Добавлено ([mergetime]1281024341[/mergetime]):
!!UN:C5962385/1/255;
!!UN:C5962394/1/255;
!!UN:C5124642/1/255;
!!UN:C5124651/1/255;
!!UN:C5124660/1/255;
!!UN:C5124633/1/255;
!!UN:C5103890/1/255;

в ERM

Добавлено ([mergetime]1281025208[/mergetime]):
Да, снятие катапульты никак не влияет на её наличие при осаде.
Так что мы имеем, фактически, свободный слот ^^

Автор: etoprostoya 05 Aug 2010, 19:38

Цитата(feanor @ 05 Aug 2010, 20:20)
Да, снятие катапульты никак не влияет на её наличие при осаде.
Так что мы имеем, фактически, свободный слот ^^

То есть слот катапульты можно использовать как слот "Разное 6".

Автор: feanor 05 Aug 2010, 19:58

Ну, как слот "разное" - не знаю, не знаю. Если в artraits дуром поставить у каждого артефакта для слота "разное" крестик в столбце "катапульта" - игра просто не загрузится. А вот сделать слот для знамен-поясов-имплантов-татуировок-ктулхосимбионтов можно.

Кстати, координаты отрисовки лежат по адресу 004E0A91.
______________________

Цитата
*(char*)0x4E3222 = 0xFF; //
*(char*)0x4E322B = 0xFF; //warfare can be putted into backpack
*(char*)0x4E3234 = 0xFF; //
*(char*)0x4E3219 = 0xFF; //

да, это сделает артефакт номер 255 неснимаемым.

Автор: feanor 05 Aug 2010, 20:22

0069390E: 05 - слот катапульты теперь "Разное 6". gigi.gif
Вообще, по адресу 6938E8 находится 4*15 таблица соответствия "номер позиций артефактов в формате UN:A" - "реальная позиция в формате битового поля"

Автор: feanor 05 Aug 2010, 22:59

хе-хе..
4D8BDD: 90909090 90909090 9090 - убираем катапульту.
Кому-нить нужен мод на шестой слот? (:

Автор: Master Of Puppets 12 Aug 2010, 23:29

Цены на строительство зданий в городе пробиты в BUILDING.TXT. Но что. если их требуется менять или считывать динамически? Вот и накатал:

CODE
; Контроль цен здания в городе. fastcall.
03409792 55; PUSH EBP
03409793 8BEC; MOV EBP,ESP
03409795 83F91A; CMP ECX,1A
03409798 7C60; JL SHORT mop.034097FA
0340979A 83F91D; CMP ECX,1D
0340979D 7F75; JG SHORT mop.03409814
0340979F 8B4508; MOV EAX,DWORD PTR SS:[EBP+8]
034097A2 85C0; TEST EAX,EAX
034097A4 7404; JE SHORT mop.034097AA
034097A6 8BE5; MOV ESP,EBP
034097A8 5D; POP EBP
034097A9 C3; RETN
034097AA B807000000; MOV EAX,7
034097AF 8B5D0C; MOV EBX,DWORD PTR SS:[EBP+C]
034097B2 8D1C9D64768800; LEA EBX,DWORD PTR DS:[EBX*4+887664]
034097B9 C70300000000; MOV DWORD PTR DS:[EBX],0
034097BF 83C304; ADD EBX,4
034097C2 48; DEC EAX
034097C3 85C0; TEST EAX,EAX
034097C5 75F2; JNZ SHORT mop.034097B9
034097C7 EBDD; JMP SHORT mop.034097A6
034097C9 6BC91C; IMUL ECX,ECX,1C
034097CC 8DB160816A00; LEA ESI,DWORD PTR DS:[ECX+6A8160]
034097D2 837D0802; CMP DWORD PTR SS:[EBP+8],2
034097D6 741D; JE SHORT mop.034097F5
034097D8 8B5D0C; MOV EBX,DWORD PTR SS:[EBP+C]
034097DB 8D3C9D64768800; LEA EDI,DWORD PTR DS:[EBX*4+887664]
034097E2 837D0801; CMP DWORD PTR SS:[EBP+8],1
034097E6 7409; JE SHORT mop.034097F1
034097E8 B907000000; MOV ECX,7
034097ED F3A5; REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
034097EF EBB5; JMP SHORT mop.034097A6
034097F1 87F7; XCHG EDI,ESI
034097F3 EBF3; JMP SHORT mop.034097E8
034097F5 8D7D0C; LEA EDI,DWORD PTR SS:[EBP+C]
034097F8 EBF7; JMP SHORT mop.034097F1
034097FA 83F911; CMP ECX,11
034097FD 7CCA; JL SHORT mop.034097C9
034097FF 69D2FC000000; IMUL EDX,EDX,0FC
03409805 83E911; SUB ECX,11
03409808 6BC91C; IMUL ECX,ECX,1C
0340980B 8DB41144836A00; LEA ESI,DWORD PTR DS:[ECX+EDX+6A8344]
03409812 EBBE; JMP SHORT mop.034097D2
03409814 69D288010000; IMUL EDX,EDX,188
0340981A 83E91E; SUB ECX,1E
0340981D 6BC91C; IMUL ECX,ECX,1C
03409820 8DB41180986A00; LEA ESI,DWORD PTR DS:[ECX+EDX+6A9880]
03409827 EBA9; JMP SHORT mop.034097D2


x1 - тип города
x2 - тип здания
x3 - способ (0-2)

Примеры:
!!SN:E54564754/3/4/0/0/500; получить в v500-v506 цену Гильдии Магов 5-го уровня. При этом номер города значения не имеет.
!!SN:E54564754/3/17/8/1/2; установить цену на Торговцев Артефактами в Сопряжении из переменных v2-v8.
!!SN:E54564754/3/22/4/2/0/5/0/5/5/5/5000; - установить цену Трансформатора Скелетов на 5 единиц ценных ресурсов и 5000 золота.

Функция автоматом игнорирует здания 26-29 (возвращает нули, а запись не производит). А вот о Верфи забывать не стоит - здание общее, но не во всех городах доступное.

Автор: Valery 15 Aug 2010, 12:01

(Chortos script)

ZVSE

$= ID

!?FU6000;

Make sure the creature number is valid
!!VRx3&x1=1/x2<2:S16;
!!VRx3&x1=1/x2>197:S16;
!!FU|x2<2/x2>197:E;

Get the correct address
!!VRx2:+7961526;

Do what they ask us to do
!!UN&x1=0:Cx2/1/x3;
!!UN&x1=1:Cx2/1/?x3;

!#MA:X$/?i;
!#VRi:|4;
!#MA:X$/i;
!#MA:N$/16;
!#FU6000:P0/$/11;

What is x1?
!!VRx2:+7961526; **how do we get this address?

Автор: feanor 15 Aug 2010, 14:25

x1:
0 - set missile type to creature (!!FU6000:P0/<creature ID>/<missile type>)
1 - get missile type from creature (!!FU6000:P1/<crID>/?<var for missile type>;)

Цитата
how do we get this address?

7961526 = 797BB6h, adress in memory for missile table (only for WoG358! TE and Era needs another address).
It can be got with the help of reverse engeneering.

Автор: Valery 16 Aug 2010, 22:47

Thanks. good.gif

Would it be possible to give me the ERA address for getting this script work on it please?
194 shooters, not bad!

Автор: feanor 16 Aug 2010, 22:56

7994814

Автор: Лорд Хаарт 17 Aug 2010, 04:33

Цитата
194 shooters, not bad!
Never forget that (as far as i remember) all units supposed to be shooters must have corresponding animation.

Автор: Valery 17 Aug 2010, 04:58

That's my job, adding frames, now that I have address.

Автор: Master Of Puppets 20 Aug 2010, 12:03

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

CODE

0340982B 60; PUSHAD
0340982C 8BD9; MOV EBX,ECX
0340982E 69DB00020000; IMUL EBX,EBX,200
03409834 81C3E8719200; ADD EBX,mop.009271E8
0340983A 8B158C926900; MOV EDX,DWORD PTR DS:[69928C]
03409840 53; PUSH EBX
03409841 8B02; MOV EAX,DWORD PTR DS:[EDX]
03409843 8D0440; LEA EAX,DWORD PTR DS:[EAX+EAX*2]
03409846 8B3CC5ECEF7900; MOV EDI,DWORD PTR DS:[EAX*8+79EFEC]
0340984D 8B0CC5E8EF7900; MOV ECX,DWORD PTR DS:[EAX*8+79EFE8]
03409854 8D04C5E0EF7900; LEA EAX,DWORD PTR DS:[EAX*8+79EFE0]
0340985B 894DF0; MOV DWORD PTR SS:[EBP-10],ECX
0340985E 8B07; MOV EAX,DWORD PTR DS:[EDI]
03409860 8D0480; LEA EAX,DWORD PTR DS:[EAX+EAX*4]
03409863 8D3480; LEA ESI,DWORD PTR DS:[EAX+EAX*4]
03409866 C1E604; SHL ESI,4
03409869 81C6D4778002; ADD ESI,mop.028077D4
0340986F 8BCE; MOV ECX,ESI
03409871 E88A180FFD; CALL mop.004FB100
03409876 84C0; TEST AL,AL
03409878 7529; JNZ SHORT mop.034098A3
0340987A 8B45F0; MOV EAX,DWORD PTR SS:[EBP-10]
0340987D 83C704; ADD EDI,4
03409880 48; DEC EAX
03409881 8945F0; MOV DWORD PTR SS:[EBP-10],EAX
03409884 7421; JE SHORT mop.034098A7
03409886 8B07; MOV EAX,DWORD PTR DS:[EDI]
03409888 53; PUSH EBX
03409889 8D0480; LEA EAX,DWORD PTR DS:[EAX+EAX*4]
0340988C 8D3480; LEA ESI,DWORD PTR DS:[EAX+EAX*4]
0340988F C1E604; SHL ESI,4
03409892 81C6D4778002; ADD ESI,mop.028077D4
03409898 8BCE; MOV ECX,ESI
0340989A E861180FFD; CALL mop.004FB100
0340989F 84C0; TEST AL,AL
034098A1 74D7; JE SHORT mop.0340987A
034098A3 85F6; TEST ESI,ESI
034098A5 7509; JNZ SHORT mop.034098B0
034098A7 C605E0F2910000; MOV BYTE PTR DS:[91F2E0],0
034098AE EB07; JMP SHORT mop.034098B7
034098B0 C605E0F2910001; MOV BYTE PTR DS:[91F2E0],1
034098B7 61; POPAD
034098B8 C3; RETN

В качестве единственного параметра передаётся номер z-переменной с именем файла. Результат проверки регистрирует флаг 1.

Пример использования:
!!VRz123:S^MyPicture.pcx^; //название файла
!!SN:E54564907/2/123; //проверяем его наличие в лодах
!!IF:M^%F1^; //видим "0", если файла нет, и "1", если файл есть.

Автор: feanor 29 Aug 2010, 03:45

43DFAF - определяет, какой флаг делает существо "нераскрашиваемым".
43E160 - определяет, какой флаг делает существо синим:

shr eax, 17 => 17h = 23 => 2^23 => 8388608

Автор: etoprostoya 31 Aug 2010, 11:54

В принципе, существует возможность ставить на карту большие объекты? Как понимаю, сейчас возможно ставить только объекты 256x192 пикселей (8 на 6 клеток).

Если возможность существует, то хотелось бы узнать и решение.

Автор: feanor 31 Aug 2010, 13:59

Составные, как в SGA (:

Автор: etoprostoya 23 Jan 2011, 22:58

Цитата(feanor @ 23 Jan 2011, 23:52) *
688f04 - таблица ресурсов, приносимых хранилищем. 7*4 байт для каждого города.

Пруд Драгоценностей работает точно так же, как и обычное хранилище, с небольшой поправкой на рандомность? Я раньше думал, что это совершенно разные структуры.

Автор: feanor 23 Jan 2011, 23:10

Разные.

Автор: etoprostoya 23 Jan 2011, 23:30

Блин, я имел в виду Таинственный Пруд Оплота, который раз в неделю приносит случайные ресурсы, а не Пруд Драгоценностей, который даёт драгоценности раз в день. Названиями просто ошибся. smile.gif

Автор: Лорд Хаарт 23 Jan 2011, 23:39

Подозреваю, что всё равно разные. Ибо хранилища ресурсов всё-таки работают на ежедневной основе (и без рандома).

Автор: SAG19330184 02 Feb 2011, 12:37

Цитата(feanor @ 08 Jan 2011, 16:41) *
004E4C00 - расчет мувпойнтов.

можно поподробнее? могу ли я например временно поменять стартовую точку от которой отсчитывается маршрут? подсчитать сколько мувов в текущем выделенном маршруте?

Автор: feanor 02 Feb 2011, 13:45

Цитата(SAG19330184 @ 02 Feb 2011, 12:37) *
Цитата(feanor @ 08 Jan 2011, 16:41) *
004E4C00 - расчет мувпойнтов.

можно поподробнее? могу ли я например временно поменять стартовую точку от которой отсчитывается маршрут? подсчитать сколько мувов в текущем выделенном маршруте?


нет, это именно раздача мувпойнтов в начале дня

Автор: Axolotl 14 Feb 2011, 23:22

А может знает кто-нибудь, как можно установить фрэймрейт для Дефов экрана города?

Автор: etoprostoya 15 Feb 2011, 00:23

А чем стандартный не устраивает? Ускорять, думаю, особого смысла нет, а замедлять можно и повторными кадрами, как это обычно и делается.

Автор: feanor 15 Feb 2011, 07:35

Товарищи! Ниже есть тема по обсуждению инженерного анализа!

Автор: Axolotl 15 Feb 2011, 09:16

Цитата(Axolotl @ 15 Feb 2011, 00:22) *
А может знает кто-нибудь, как можно установить фрэймрейт для Дефов экрана города?


Цитата(etoprostoya @ 15 Feb 2011, 01:23) *
А чем стандартный не устраивает? Ускорять, думаю, особого смысла нет, а замедлять можно и повторными кадрами, как это обычно и делается.


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

В общем, вопрос остается открытым. Но, возможно нужно уточнить вопрос - Знает ли кто-нибудь, фрэймрейт для Дефов экрана города - это универсальное значение для всех дефов, или же для каждого дефа - отдельный параметр. И если это отдельный параметр, то подскажите где он хранится или как вычислить эти байты.
(Если значение универсальное - то конечно, это мало смысла имеет)

Автор: Astaroth 15 Feb 2011, 13:08

Скорее всего универсальное.

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

Не согласен. Да, больше кадров ты не добавишь. Но это не важно. Все зависит лишь от навыков анимирования. Скорость проигрывания примерно 100 мксек. этого на кадр хватает выше крыши

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

Автор: Axolotl 15 Feb 2011, 13:42

Мне тоже кажется, что скорее всего универсальное, но еще до конца не уверенн. Задержка примерно 140мс.
Но дело не в проблемных местах, а как раз таки просто в желании, точно отстроить скорость определенного эффекта, сохранив при этом плавность.
Ну да, судя по всему, опять таки придется чем-то жертвовать. unsure.gif

Автор: Astaroth 15 Feb 2011, 17:24

Цитата
Мне тоже кажется, что скорее всего универсальное, но еще до конца не уверенн. Задержка примерно 140мс.

140? Так то ты прав. Я тестирую свои объекты на 100 мксек., а на деле получается все же медленнее. Ну да ладно.
Цитата
Но дело не в проблемных местах, а как раз таки просто в желании, точно отстроить скорость определенного эффекта, сохранив при этом плавность.
Ну да, судя по всему, опять таки придется чем-то жертвовать. unsure.gif

Плавность? У тебя ж задержка не 1 секунда. 140 мсек.=0,14 сек. (Да я Кэп) довольно маленькое время. Честно, я не вижу смысла увеличивать скорость. Сам посуди: даже если для городов скорость отдельная, то представь, что будет, если ускорить все? Для твоего города все может и будет выглядеть тип-топ, но для других городов все будет очень даже заметно ускорено. Представь как оторопеют игроки, когда вместо привычной скорости анимации им преподнесят такой "бонус"?

Автор: Axolotl 15 Feb 2011, 19:13

Цитата(Astaroth @ 15 Feb 2011, 18:24) *
Цитата
Мне тоже кажется, что скорее всего универсальное, но еще до конца не уверенн. Задержка примерно 140мс.

140? Так то ты прав. Я тестирую свои объекты на 100 мксек., а на деле получается все же медленнее. Ну да ладно.
Цитата
Но дело не в проблемных местах, а как раз таки просто в желании, точно отстроить скорость определенного эффекта, сохранив при этом плавность.
Ну да, судя по всему, опять таки придется чем-то жертвовать. unsure.gif

Плавность? У тебя ж задержка не 1 секунда. 140 мсек.=0,14 сек. (Да я Кэп) довольно маленькое время. Честно, я не вижу смысла увеличивать скорость. Сам посуди: даже если для городов скорость отдельная, то представь, что будет, если ускорить все? Для твоего города все может и будет выглядеть тип-топ, но для других городов все будет очень даже заметно ускорено. Представь как оторопеют игроки, когда вместо привычной скорости анимации им преподнесят такой "бонус"?


Ты меня не так понял про универсальность параметра, я имел в виду не отдельный параметр для экрана города, а отдельный - для каждого дефа в экране города (ну а вдруг, у существ же есть таблица фреймрейтов движения для каждого отдельного существа). Если параметр, один для всех дефов, то конечно, вопрос не имеет смысла, и я не стану ради одного дефа менять всю глобальную скоростьsmile.gif

Автор: Astaroth 15 Feb 2011, 23:46

Цитата
Ты меня не так понял про универсальность параметра, я имел в виду не отдельный параметр для экрана города, а отдельный - для каждого дефа в экране города (ну а вдруг, у существ же есть таблица фреймрейтов движения для каждого отдельного существа). Если параметр, один для всех дефов, то конечно, вопрос не имеет смысла, и я не стану ради одного дефа менять всю глобальную скоростьsmile.gif

Все, понял biggrin.gif Теперь я ОЧЕНЬ сильно сомневаюсь, что для каждого ДЕФа (Пусть даже города) свой собственный таймер

Автор: MasterOfPuppets 15 May 2011, 15:24

Прямо не знаю куда...

Патч для исправления Гробницы Воина при игре с артефактами >255:

Код
A7957 C1E80D;         SHR EAX,0D
A795A 25FF030000;     AND EAX,3FF
A795F 8945F8;         MOV DWORD PTR SS:[EBP-8],EAX
A7962 84DB;           TEST BL,BL
A7964 744D;           JE SHORT mop.004A79B3
A7966 8B15680B6600;   MOV EDX,DWORD PTR DS:[660B68]
A796C 8B0D686A6900;   MOV ECX,DWORD PTR DS:[696A68]
A7972 C1E005;         SHL EAX,5
A7975 FF3410;         PUSH DWORD PTR DS:[EAX+EDX]
A7978 8B5120;         MOV EDX,DWORD PTR DS:[ECX+20]
A797B FFB288020000;   PUSH DWORD PTR DS:[EDX+288]


Пояснение: при стандартном коде дешифрация контрольного числа Гробницы, в которую установлен артефакт >255, приводит к неверному, отрицательному номеру артефакта.
Возможно, такая же бодяга в других объектах. Надо посмотреть...

Автор: MasterOfPuppets 23 May 2011, 13:52

Да, не ошибся. Вот вроде полный патч:


Всё пучком и без правки в следующих объектах:
Утопия Драконов,
Ветхий Корабль,
Кораблекрушение и его Потерпевший.

Ящик Пандоры - ?

Автор: Сулейман 04 Jun 2011, 14:27

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

Автор: feanor 04 Jun 2011, 14:48

Патченый воговский редактор. Открываем карту раз, копируем кусок, открываем карту два, вставляем кусок.

Автор: Сулейман 04 Jun 2011, 14:52

Тогда может, там можно создавать создавать более чем двухуровневые карты? И задавать размер вручную, больше чем XL к примеру?

Автор: feanor 04 Jun 2011, 15:01

Нельзя.
Можно, но надо руками патчить редактор.

Автор: pHOMM 05 Jun 2011, 22:15

Тема возникает с завидной частотой... я уже выкладывал на дф2 сие дело, вот http://forum.df2.ru/index.php?showtopic=15981 Проект по поддержке карт с размерами выше 144

Автор: tolich 05 Jun 2011, 22:38

А гиппо и XS делал. smile.gif

Автор: hippocamus 06 Jun 2011, 00:02

Цитата(Сулейман @ 04 Jun 2011, 14:52) *
Тогда может, там можно создавать создавать более чем двухуровневые карты? И задавать размер вручную, больше чем XL к примеру?

Цитата(feanor @ 04 Jun 2011, 15:01) *
Нельзя.
Можно, но надо руками патчить редактор.

Нельзя. Я сделал 4-уровневую карту, она вызывает критическую ошибку. major пробовал разобраться, говорит, что получается выход за пределы массива. Т.е. байт #10 в заголовке карты имеет не тип SmallInt или Byte (количество слоёв), а тип Boolean (двуслойная ли карта?). Это, конечно можно исправить, но нужно, чтобы заинтересовался вопросом один из кодеров ...
Цитата(tolich @ 05 Jun 2011, 22:38) *
А гиппо и XS делал. smile.gif

Ага, 18х18. smile.gif

Автор: Лорд Хаарт 06 Jun 2011, 00:09

Цитата(hippocamus @ 06 Jun 2011, 01:02) *
Цитата(Сулейман @ 04 Jun 2011, 14:52) *
Тогда может, там можно создавать создавать более чем двухуровневые карты? И задавать размер вручную, больше чем XL к примеру?

Цитата(feanor @ 04 Jun 2011, 15:01) *
Нельзя.
Можно, но надо руками патчить редактор.

Нельзя. Я сделал 4-уровневую карту

Если что, первое и втолое предложение в посте Феанора относились к первому и второму предложению в посте Сулеймана соответственно. Так что многоуровневые — да, нельзя.

Автор: feanor 17 Jul 2011, 21:22

spiteful.gifО кастомных спеллбуках, молитвах Кришне и подделках под содовские артефакты.


Автор: etoprostoya 17 Jul 2011, 21:27

И что этот монстр-код делает?

Автор: feanor 17 Jul 2011, 21:35

Возносит хвалу всем индийским богам одним своим наличием.

А так - можно книжки магии сделать свои для каждой ГМ. Можно поуправлять возможностью полета/хождения по воде для героя.

Да, я там ошибся - щас исправил.

Автор: tolich 17 Jul 2011, 21:36

3/2 бита: сделай табличку, в которой перечисли все хуки и ставь их циклом. А то у меня lich-но мурашки по телу от такого.
:ant:

Автор: feanor 17 Jul 2011, 21:50

Цитата
сделай табличку, в которой перечисли все хуки и ставь их циклом.

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

Чорт, в качестве средства автоматизации выступил обыкновенный блокнот.

Автор: Axolotl 08 Aug 2011, 19:30

Не знаю, писалось об этом уже или нет, но обнаружил тут одну необычную вещь с Мана Вортексом.

Долго мучался в попытках понять, почему вылетает игра при замене Дефа мана вортекса в Дэнжене...
Потом, посмотрев на деф этого самого вортекса (20 кадров), понял, что он имеет два цикла анимации - первые 10 кадров - без гильдии 5-го уровня, следующие - 10 кадров, соответственно с гильдией.
В адресе, где указывается кол-во кадров дефа - стоит 20 кадров. Видимо, где-то про него еще отдельно прописано, какие именно из кадров в данный момент нужно циклить. Может будет полезной инфа, и это можно как-то использовать.

Автор: etoprostoya 15 Aug 2011, 12:20

В принципе, возможно увеличить число типов палаток ключников и, заодно, стражей границ с пограничными воротами? Скажем, вдвое, что для очень больших карт (>144) было бы полезно. Как на это будет реагировать AI?

Автор: etoprostoya 15 Aug 2011, 12:57

В дополнение к вопросу о палатках и стражах, тот же вопрос, но о дополнительных монолитах. Можно добавить новые монолиты?



P.S. Графика Валери.

Автор: feanor 15 Aug 2011, 13:06

Цитата
Можно добавить новые монолиты?

А просто выставить новые подтипы не канает?
У меня вроде работает.

Автор: tolich 15 Aug 2011, 13:15

А вот палатки, кажется, нельзя. sad.gif

Автор: feanor 15 Aug 2011, 13:21

Палатки нельзя. Под палатки отведен всего один байт в структуре игрока.

Автор: Vizit0r 15 Aug 2011, 13:25

дык палаток заметно меньше 256 (255, если быть точным smile.gif)

Автор: feanor 15 Aug 2011, 13:27

В современном байте таки всего 8 бит.

Автор: Vizit0r 15 Aug 2011, 13:34

а, я про другое думал.

Автор: Valery 15 Aug 2011, 14:10

Does not work, additional subtypes after 8. Will have to script manually each one.

Автор: Vaflya 31 Aug 2012, 03:06

Привет, ребят. Нужна помощь по реверсингу.
В общем-то я уже писал на этот счёт тему, но никто не отозвался
пруф
http://forum.df2.ru/index.php?showtopic=27998

Собственно там есть немного почитать, а я перейду к сути:

Охрана проходов, а так же всевозможных объектов задаётся параметром Value, который в свою очередь берётся из двух текстовиков:
Для случайных карт это rmg.txt, для объектов - crtraits.txt. Проходы задаются в rmg.txt вручную, устанавливается некоторое значение в value. Далее (видимо?) производится запрос в crtraits на предмет value монстра, тот выбирается случайно. Допустим, выпали архангелы. Их value - 8776. Таким образом проход на песок на джебусе (45000) будет выражаться следующим образом: 45000 = 8776*N*K,
где N - количество существ, K - некоторый коэффициент. Согласно Wic-у, который писал статью (ссылка в ссылке выше), 1/K для ГО лежит в интервале 2-3. Ощутимая разница, согласитесь, от 10 до 15 архангелов. Так вот, чтобы подобные охраны прикидывать не "на глаз", я просил помочь раздобыть этот K. Судя по тому, как он разнится, у него всё-таки имеется собственная зависимость от Value. Я могу ошибаться, то на rnd - не похоже, я бы сказал - это 99% не случайный коэффициент.

Так вот, я предполагаю, что где-то в коде есть адрес, на котором можно поставить брейкпоинт, и при отладке мы получим требуемую строку. Вероятнее всего, перед созданием рандомной карты, игра будет обращаться к crtraits.txt, за значением Value. Вот, сейчас сижу и пытаюсь найти строку с этим ctraits, но получается плохо.
Выручайте, на самом деле, для онлайна это будет существенный прорыв. :-)

Upd. 4:42 msk

Кое-что нашёл. Я решил поискать rmg.txt и, собственно, нашёл.
Обращение к самому текстовику идёт по адресу 682854, наиболее вероятно - берётся название шаблона, поскольку далее проглядывается текст, который используется в качестве описания рандомной карты.
seed was %i, size %i, levels %i, humans %i, computers %i, water
по тому же адресу (6828bc) и тёг monsters %i, в общем-то предмет всей ботвы.

Едем дальше.
.data:00682F08 aH3pbitma_lod db 'h3pbitma.lod',0
.data:00682F48 aH3bitmap_lod db 'h3bitmap.lod',0

первое - вообще не пойму что, а второе - надеюсь, то, что ищу (т.к. текстовик crtraits находится именно в этом лоде)

Сейчас буду пробовать брейкпоинт ставить и декомпилировать, нз, что из этого получится.

Upd. 4:57 msk
Нифига не получилось, брейкпоинт срабатывает до того, как я запускаю игру. Ну а, вообще, как я иначе хотел, без этого лода игра-то и не запустится, много в ней информации.
И всё жеж таки, как мне поставить брейкпоинт именно в начало генерации новой карты?

Upd. 8:59 msk
Тестирование шаблона с фикисрованными охранами в 3000 value и ограничением существ на равных значениях (то бишь коэффициент будет множиться на константу, на примере копейщиков: low - 30, high - 30, сделано путём редактирования crtraits.txt) показало, что всё-таки есть определённая доля рандома, поскольку полученые численные значения нейтралов разнились довольно сильно. Более того, коэффициент у Wic-а какой-то не правильный. Там ни разу не встречался коэффициент 1, всегда были значения возле 2-3. Так-то... но, правда, здесь выходит рандом на рандоме: с одной стороны рандомный коэффициент, с другой rnd [low;high] для каждого из существ. Так что даже на глаз определить с точностью до 2-3 единиц - не получится. Но отличить проход 3000 от 6000 - не составит труда. Правда, это всем давно известно. Эх, не быть мне Колумбом. :-)

Автор: feanor 14 Jan 2013, 02:07

Собственно, инженерный анализ еще интересен кому?

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

Автор: totkotoriy 18 Jan 2013, 22:49

Так, наверное, и плавнее её можно будет сделать. Было бы очень хорошо.
А то я как-то хотел сделать плавнее анимацию воды и наткнулся на вот это.

Автор: Docent Picolan 18 Jan 2013, 22:52

Цитата(totkotoriy @ 18 Jan 2013, 23:49) *
Так, наверное, и плавнее её можно будет сделать. Было бы очень хорошо.
А то я как-то хотел сделать плавнее анимацию воды и наткнулся на вот это.

обсуждения - в этой теме

Автор: totkotoriy 18 Jan 2013, 22:55

Цитата(Docent Picolan @ 18 Jan 2013, 23:52) *
Цитата(totkotoriy @ 18 Jan 2013, 23:49) *
Так, наверное, и плавнее её можно будет сделать. Было бы очень хорошо.
А то я как-то хотел сделать плавнее анимацию воды и наткнулся на вот это.

обсуждения - в этой теме

Я как понял только для меня)))

С чем категорически несогласен.

Автор: Docent Picolan 18 Jan 2013, 22:56

Цитата(totkotoriy @ 18 Jan 2013, 23:55) *
Я как понял только для меня)))

да вроде в той теме оффтоп весь вырезан. только нужные посты

Автор: totkotoriy 18 Jan 2013, 22:58

Цитата(Docent Picolan @ 18 Jan 2013, 23:56) *
Цитата(totkotoriy @ 18 Jan 2013, 23:55) *
Я как понял только для меня)))

да вроде в той теме оффтоп весь вырезан. только нужные посты

Вот и я про тоже. Я вроде по делу сказал.... ну да ладно... хозяин - барин.

Автор: feanor 18 Jan 2013, 23:06

Цитата
Я вроде по делу сказал....

По делу - это когда с адресами-паролями-кодом.

Автор: Docent Picolan 18 Jan 2013, 23:06

Цитата(totkotoriy @ 18 Jan 2013, 23:58) *
Я вроде по делу сказал....

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

Автор: totkotoriy 18 Jan 2013, 23:13

Ну вас двоих я то точно не переспорю.

Так можно будет сделать плавнее анимацию?

Автор: hippocamus 18 Jan 2013, 23:23

Хороший способ. У меня была подборка картинок tif по этой схеме/
Не радует отсутствие унификации - цвета из середины палитры, для каждого дефа свои...

Автор: feanor 19 Jan 2013, 00:19

Цитата
Так можно будет сделать плавнее анимацию?

Сожно (ошибку исправь сам, угу)

Бинарной правкой не обойдешься, надо свою реализацию DevicePalette_RotateColors писать (она кстати, используется еще и для мерцающего цвета обводок существа в битве)

Автор: hippocamus 19 Jan 2013, 00:30

Не, так резать - не пойдёт. Мой пост непонятно к чему. Если уж переносить - то со ссылкой на пост, на который был ответ...

Автор: Docent Picolan 19 Jan 2013, 01:19

Цитата(hippocamus @ 19 Jan 2013, 01:30) *
Не, так резать - не пойдёт. Мой пост непонятно к чему. Если уж переносить - то со ссылкой на пост, на который был ответ...

ну так я уже второй пост переношу)

странно вы с totkotor-ым не обращаете внимание что обсуждение анализа отродясь велось в отдельной теме. так и называющейся) раньше, как-то, проблем с этим не возникало, народ сразу писал куда надо)

Автор: feanor 19 Jan 2013, 15:31

Кстати, на машинах с аптаймом от 24,86 до 49,71 дней (а так же 24,86+49,71*n; 49,71*(n+1)) анимация почв и рек (и, возможно, еще что-то) работать не будет.

Автор: hippocamus 19 Jan 2013, 18:57

Вот это прикол. Почему? У меня правда реДко бывает больше 2 недель, но мало ли...

Автор: feanor 19 Jan 2013, 21:15

Цитата
Вот это прикол. Почему?

Да ваще.
Потому что для отсчета кадра анимации используется timeGetTime, которая возвращает uint секунд со старта винды.

А потом:
Код
    if ( timeGetTime() - NextPaletteRotate >= 0 )
    {
      if ( dword_00698A68 == 1 || dword_00698A68 == 3 )
        v1 = timeGetTime() + 110;
      else
        v1 = timeGetTime() + 200;
      NextPaletteRotate = v1;
..крутим палитры
}


И если timeGetTime() возвращает более чем 0x7FFFFFFF секунд, то: NextPaletteRotate при старте равно нулю; timeGetTime() - NextPaletteRotate = timeGetTime() < 0; крутилка палитр не выполняется; в NextPaletteRotate так и сидит ноль. Смыть, повторить.

Мораль - инициализируйте переменные ©

Автор: hippocamus 19 Jan 2013, 23:03

Ну, исправь. И дай это исправление Саву и Бараторчу. Это же явно - баг. Хотя - труднонаблюдаемый и малопонятный. Тем больший респект тебе!
Это вполне реально - компу работать больше 25 суток. С тем же hibernate особенно. У меня по полгода в XP работал. Это семёрка нудить начинает - "перегрузите!"

Автор: Throutle 20 Jan 2013, 11:04

Незнаю-незнаю, у меня как раз на семёрке аптайм капитально вырос, а ХП постоянно ребутал...

Автор: tolich 06 Apr 2013, 01:45

Цитата(feanor @ 05 Apr 2013, 23:32) *
Все забываю.
https://dl.dropbox.com/u/61759222/HoMM/Heroes3f.c
Декомпилировано по воговской idb-базе.

Код
sprintf(TextBuffer, "Heroes of Might and Magic III is already running.", "Heroes of Might and Magic III");
Пичалька.

Автор: igrik 18 Jul 2013, 19:43

Цитата
Еще об артефактах, точнее, о расчете их (и не только их) бонусов.

004E3ED0 - функция, возвращающая тип поднимаемого в результате некромантии существа.
004E3F40 - функция, определяющая процент поднятых существ
004E42E0 - функция, определяющая радиус обзора.
004E43D0 - функция, определяющая проценты бонуса Archery
004E4690 - ..Eagle Eye
004E4950 - ..Resistance
004E4C00 - расчет мувпойнтов.
004E5020 - бонус к длительности заклятий
004E59D0 - бонусы к школам магии.
004E5D10 - бонусы к скорости в бою
004E5DF0 - к хитпойнтам


Жаль не указан бонус к пополнению маны...

Автор: feanor 19 Jul 2013, 01:11

//----- (004E41B0) --------------------------------------------------------
int __thiscall GetDailyManaRestorePoints(HERO* this)

Автор: igrik 11 May 2014, 20:45

Код
**первый параметр - combatmanager
!!UN:C6919200/4/?y10;
**второй параметр - указатель на массив из сорока байт: по одному на отряд. За массив возьмем y20-y29.
!!VRy20:S1 +256*1; --первые два отряда у себя
!!VRy25:S1; --первый отряд у противника
**третий параметр - номер анимации (5 - анимация)
**четвертый параметр - нужно ли анимировать урон (0 - не надо, 1 - надо)
!!SN:E5925584/2/y10/?y20/5/1;


feanor, как анимировать не только первые 2 отряда?

Автор: feanor 11 May 2014, 22:33

!!VRy20:S1 +256 +65536 +16777216; --0-4
!!VRy21:S1 +256 +65536 +16777216; --5-8
..

Автор: gamecreator 12 May 2014, 02:04

Цитата(feanor @ 11 May 2014, 22:33) *
!!VRy20:S1 +256 +65536 +16777216; --0-4
А не 0-3 ли? И что происходит с 20-м и 41-м отрядами? Их нельзя анимировать?

Автор: Gavek 16 Jan 2015, 11:52

Как узнать, за что какая функция отвечает, как её "отловить", применить и прочее.
Например: При посещении сокровищницы, диалог c кнопками "да" или "нет", как его отключить, вызвать, управлять и всё тому подобное.

Автор: Algor 16 Jan 2015, 21:19

Чем-то ты мне раннего МоР'а напоминаешь, парень. К нему бы тебе обратиться, но он тут гость не частый (ну или анонимно-молчаливый, хз).

Автор: Ангел 16 Jan 2015, 21:22

Очень хорошо, когда в людях азарт проявляется и интерес к моддингу игры, и вообще к игре. Мы взрослеем, а радость то должна оставаться? А Радость героев с нами уже 15 лет почти

Автор: feanor 16 Jan 2015, 21:36

Вообще, где-то тут уже был тред "Обсуждение инженерного анализа", ну да фиг с ним
В данном случае проще будет заблокировать вывод окна же

Автор: Gavek 16 Jan 2015, 22:48

Цитата(feanor @ 16 Jan 2015, 23:36) *
Вообще, где-то тут уже был тред "Обсуждение инженерного анализа", ну да фиг с ним
В данном случае проще будет заблокировать вывод окна же

Для меня такое проще сказать, чем сделать. Через IDA в свободное время копаю. Правда не программист я, поэтому с "нуля" приходится думать. В ERA хорошо вроде реализовано это через !!SN:L,A,E - но как правильно пользоваться, чтобы - увидел, придумал, записал!

Автор: feanor 16 Jan 2015, 23:00

Так. Трэш-сеанс гадания по геройским внутренностям открыт

В теме есть описалово нескольких стартовых функций
В частности, есть указание на то, что 004A8160 обрабатывает вход в объекты

открываем декомпилированный код, смотрим на

Код
//----- (004A8160) --------------------------------------------------------
void __thiscall Enter2ObjectMain(int AvdManager, _Hero_ *Hero, signed int Par1, __int64 PosMixed)

видим чуть ниже свитч на обработку объектов по типам

нас интересует case 16, 16 - тип банков на карте патаму шта

Код
        case 16:
      sub_004A1210((void *)v6, (int)Hero, v5, PosMixed, SHIDWORD(PosMixed));
      return;


окау, переходим на нее

Код
char __thiscall sub_004A1210(void *this, int a2, int a3, int a4, int a5)
{
  void *v5; // edi@1
  _FMes_ *v6; // esi@1
  void *v7; // ecx@3
  void *v8; // eax@5
  _ZPrintf_ *v9; // eax@5
  int v10; // eax@8
  void *v11; // ecx@10
  void *v12; // eax@12
  _ZPrintf_ *v13; // eax@12
  char v14; // zf@15
  void *v15; // ecx@15
  char v16; // al@18
  char v17; // al@24
  char v18; // al@28
  char v19; // al@33
  _ZPrintf_ ZprPo; // [sp+Ch] [bp-3Ch]@5
  _FMes_ FMp; // [sp+1Ch] [bp-2Ch]@1
  _FMes_ FMesPo; // [sp+2Ch] [bp-1Ch]@1
  int v24; // [sp+44h] [bp-4h]@1

  v5 = this;
  v6 = (_FMes_ *)&(*off_0067029C)[*(_WORD *)(a3 + 34)];
  LOBYTE(FMp.Ref) = LOBYTE(v6->Ref);
  FMes_FreeMemoryOrDeref(&FMp, 0);
  FMes_CopyObject(&FMp, v6, 0, MinusOne);
  v24 = 0;
  LOBYTE(FMesPo.Ref) = BYTE3(a5);
  FMes_FreeMemoryOrDeref(&FMesPo, 0);
  LOBYTE(v24) = 1;
  sub_004FC620((void *)a3, *(_BYTE *)(a2 + 34));
  if ( *(_DWORD *)a3 & 0x2000000 )
  {
    if ( (_BYTE)a5 )
    {
      v7 = FMp.AMes.m.s;
      if ( !FMp.AMes.m.s )
        v7 = (void *)&EmptyString;
      v9 = ZSprintf(&ZprPo, *(char **)(*(_DWORD *)(::this.field_60 + 32) + 132), v7);
      LOBYTE(v24) = 2;
      FMes_CopyObject(&FMesPo, (_FMes_ *)v9, 0, MinusOne);
      LOBYTE(v24) = 1;
      FMes_FreeMemoryOrDeref((_FMes_ *)&ZprPo, 1);
      v8 = FMesPo.AMes.m.s;
      if ( !FMesPo.AMes.m.s )
        v8 = (void *)&EmptyString;
      MessageDialog((char *)v8, 1, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0);
    }
    LOBYTE(v24) = 0;
    FMes_FreeMemoryOrDeref(&FMesPo, 1);
    v24 = -1;
    LOBYTE(v10) = FMes_FreeMemoryOrDeref(&FMp, 1);
    return v10;
  }
  if ( (_BYTE)a5 )
  {
    v11 = FMp.AMes.m.s;
    if ( !FMp.AMes.m.s )
      v11 = (void *)&EmptyString;
    v13 = ZSprintf(&ZprPo, *(char **)(*(_DWORD *)(::this.field_60 + 32) + 128), v11);
    LOBYTE(v24) = 3;
    FMes_CopyObject(&FMesPo, (_FMes_ *)v13, 0, MinusOne);
    LOBYTE(v24) = 1;
    FMes_FreeMemoryOrDeref((_FMes_ *)&ZprPo, 1);
    sub_00415CC0((int)v5, 0, -1);
    RedrawAdvInfoPart((int)v5, 0, 1, 1);
    v12 = FMesPo.AMes.m.s;
    if ( !FMesPo.AMes.m.s )
      v12 = (void *)&EmptyString;
    MessageDialog((char *)v12, 2, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0);
    if ( pHeroWindowManager->ResultItemId != 30725 )
    {
      LOBYTE(v24) = 0;
      LOBYTE(v10) = FMes_FreeMemoryOrDeref(&FMesPo, 1);
      v15 = FMp.AMes.m.s;
      v14 = FMp.AMes.m.s == 0;
LABEL_23:
      if ( v14 )
        return v10;
      v17 = *((_BYTE *)v15 - 1);
      if ( v17 && v17 != -1 )
      {
        LOBYTE(v10) = v10 - 1;
        *((_BYTE *)v15 - 1) = v10;
        return v10;
      }
LABEL_36:
      LOBYTE(v10) = delete((char *)v15 - 1);
      return v10;
    }
  }
  else
  {
    v10 = sub_0052C1F0((_Hero_ *)a2, a4);
    if ( v10 <= 0 )
    {
      if ( FMesPo.AMes.m.s )
      {
        v16 = *((_BYTE *)FMesPo.AMes.m.s - 1);
        if ( v16 && v16 != -1 )
        {
          LOBYTE(v10) = v10 - 1;
          *((_BYTE *)FMesPo.AMes.m.s - 1) = v10;
        }
        else
        {
          LOBYTE(v10) = delete((char *)FMesPo.AMes.m.s - 1);
        }
      }
      v15 = FMp.AMes.m.s;
      FMesPo.AMes.m.s = 0;
      FMesPo.AMes.m.l = 0;
      FMesPo.AMes.a = 0;
      v14 = FMp.AMes.m.s == 0;
      goto LABEL_23;
    }
  }
  LOBYTE(v10) = sub_004ABAB0(v5, a2, (void *)a3, (int)NullString, a4, a5);
  if ( FMesPo.AMes.m.s )
  {
    v18 = *((_BYTE *)FMesPo.AMes.m.s - 1);
    if ( v18 && v18 != -1 )
    {
      LOBYTE(v10) = v10 - 1;
      *((_BYTE *)FMesPo.AMes.m.s - 1) = v10;
    }
    else
    {
      LOBYTE(v10) = delete((char *)FMesPo.AMes.m.s - 1);
    }
  }
  v15 = FMp.AMes.m.s;
  FMesPo.AMes.m.s = 0;
  FMesPo.AMes.m.l = 0;
  FMesPo.AMes.a = 0;
  if ( FMp.AMes.m.s )
  {
    v19 = *((_BYTE *)FMp.AMes.m.s - 1);
    if ( v19 && v19 != -1 )
    {
      LOBYTE(v10) = v10 - 1;
      *((_BYTE *)FMp.AMes.m.s - 1) = v10;
      return v10;
    }
    goto LABEL_36;
  }
  return v10;
}


видим горстку работы со строками и два вызова окон сообщений (MessageDialog, 0х4F6C00)

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

Код
    MessageDialog((char *)v12, 2, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0);


обращаем внимание, что кусок кода с ветвлением контринтуитивен
Код
    if ( pHeroWindowManager->ResultItemId != 30725 )
    {
..
}

проверяет не согласие, а как раз отказ, потому что 30725 - код кнопки ок.

окау, идем в ОллиДебаггер
открываем там Эру, запускаем какую-нибудь карту, wogshadowfax, wogsaruman, wogeyeofsauron, ищем, например, сокровищницу гномов
смотрим обратно в Олю, переходим на оперируемую функцию (004A1210), ищем там нужный нам кусок кода со вторым диалогом, находим, это 004A13CB

нам надо, во-первых, заблокировать вызов диалога, во-вторых, сделать так, чтобы ответом на него всегда было "да"

смотрим на асмовый код в оле



можно тупо занопить весь вызов от 4A13CB до E6 и изменить сравнение как надо; см. выше, про функционал ветвления, нам нужно заменить условный переход на безусловный

но лучше поступить по другому: вставить в 4A13CB безусловный переход на мнсто сразу после функции (004A13EB)

еще лучше внимательно посмотреть на кусок между вызовом функции и сравнением и понять, что весь код там нам тоже, в общем, не нужен, значение регистра edx используется только здесь (highlight register - edx и аудит функции), так что прыгать можно с 4A13CB сразу на указанное в переходе 004A1486

окау, сказано-сделано
рисуем в оле же бинарную правку



упс, команды ниже превратились в тыкву
кибераллах с ними

возвращаемся в гирои
тыкаемся обратно в банк

тадам, мы огребаем не спросив

пляшем танец победы

или не пляшем, а переписываем бинарную правку в UN:C

4A13CB: E9B6000000 = !!UN:C4854731/1/233; !!UN:C4854732/1/182; !!UN:C4854733/1/0; !!UN:C4854734/1/0; !!UN:C4854735/1/0;

но лучше покороче, использовав древнюю магию little-endian
если опустить подробности, а я опущу, ибо мне лень, то
!!UN:C4854731/1/233;
!!UN:C4854732/4/182;

ура, можно постить

а еще можно потестить
а потом постить
но кто так делает?

Автор: Gavek 16 Jan 2015, 23:07

Цитата(feanor @ 17 Jan 2015, 01:00) *
Так. Трэш-сеанс гадания по геройским внутренностям открыт
....
....
!!UN:C4854731/1/233;
!!UN:C4854732/4/182;

ура, можно постить

а еще можно потестить
а потом постить
но кто так делает?

Обалдеть! Такое сообщение составить ночью, уже большая работа, не говоря про анализ. Сейчас буду тестить)

Автор: feanor 16 Jan 2015, 23:10

Да, это все про банки только, которые тип 16
Пирамиды, корабли, утопы и чтотамеще затрагиваться не будут

Автор: Gavek 16 Jan 2015, 23:15

Цитата(feanor @ 17 Jan 2015, 01:10) *
Да, это все про банки только, которые тип 16
Пирамиды, корабли, утопы и чтотамеще затрагиваться не будут

Это понятно. У меня такой вопрос к Вам сегодня ещё, картинку специальности не получается перетащить дальше первой четверти экрана героя по оси х, три дня копаю и ничего не понятно.

Автор: hippocamus 16 Jan 2015, 23:57

Цитата(Gavek @ 16 Jan 2015, 21:52) *
Писал МоР'у в личку, пока нет ответа. Так что согласен полностью.

Я - тоже ) Пиши берсеркеру и Бесу, Бесу даже перспективнее )

Автор: Gavek 17 Jan 2015, 02:21

Цитата(feanor @ 17 Jan 2015, 01:00) *
Так. Трэш-сеанс гадания по геройским внутренностям открыт

!!UN:C4854731/1/233;
!!UN:C4854732/4/182;

ура, можно постить

Feanor, сейчас тестирую, по кнопке "ОК" отлично работает, а как отказаться от боя через !!UN:C?

Автор: hippocamus 17 Jan 2015, 02:43

Gavek
Молись демиургу Феанору - он изволил снизойти и помочь тебе - молись со мною!
О, великий Феаноре! Имя твое страшно, воля твоя неисповедима! Слова твои достойны записи в бессмертные фолианты! Да будут благословенны твои слова, да будет несказанна во веки твоя помощь!
Да примет твои дары великий Ассемблер, и да полижет твои стопы презренный Си++!

Автор: Gavek 17 Jan 2015, 03:00

Согласен. Feanor хорош)

Автор: Gavek 17 Jan 2015, 05:29

Назрел вопросик. Где сохраняется значение о статусе монстра при клике на нём на карте, когда в армии есть воры или при колдовстве "видения"?

Автор: igrik 17 Jan 2015, 09:30

!!! все накопал feanor

Цитата
ZVSE
!?OB16/1; посещение сокровищницы гномов
!!SN:L^EraPlugins\erm_hooker.era^/?y1 Ay1/^SetHook^/?y2;
!!SN:L^era.dll^/?y3 Ay3/^PluginExists^/?y4 Ey4/1/^erm_hooker^;
!!SN&v1>0:Ey2/1/4854731/31895;

!?FU31895;
!!SN:X?y3/0;
; EDI (0), ESI (4), EBP (8), ESP (12), EBX (16), EDX (20), ECX (24), EAX (28)
; RetAddr (32)
!!VRy4:Sy3 +32;
!!IF:Q1^Желаете ли вы посетить Сокровищницу Гномов?^;
!!UN&1:Cy4/4/4854918; // да
!!UN&-1:Cy4/4/4854782; // нет

Необходим плагин erm_hooker
скрипт на отмену стандартного диалога и создание своего

Автор: igrik 17 Jan 2015, 15:07

Цитата
Для сокровищницы если первый раз отменить, бой уже не вызывается, наверно параметры надо обратно менять?

У меня все ок. Покажи весь скрипт, который используешь для сокровищницы

Автор: feanor 17 Jan 2015, 16:45

..я вот задумался

А что, !!OB:MRS не работают для сокровищниц?

Автор: Bes 17 Jan 2015, 17:17

Цитата(hippocamus @ 16 Jan 2015, 23:57) *
Цитата(Gavek @ 16 Jan 2015, 21:52) *
Писал МоР'у в личку, пока нет ответа. Так что согласен полностью.

Я - тоже ) Пиши берсеркеру и Бесу, Бесу даже перспективнее )

чего Bes'у то писать, когда он не знает ничего по инженерному шаманству?! полный ноль! только бинарники умеет компилить при наличии адресов нужных..
и это факты, никакой его классической уничижительности в свой адрес тут нет, поверьте

Автор: MasterOfPuppets 17 Jan 2015, 18:22

Цитата(Algor @ 16 Jan 2015, 21:19) *
К нему бы тебе обратиться, но он тут гость не частый (ну или анонимно-молчаливый, хз).

Мои способности к моддингу Героев похоронены чуть более, чем полностью. О чем я, собственно, не жалею.

Автор: Algor 17 Jan 2015, 20:17

Цитата(MasterOfPuppets @ 17 Jan 2015, 18:22) *
Цитата(Algor @ 16 Jan 2015, 21:19) *
К нему бы тебе обратиться, но он тут гость не частый (ну или анонимно-молчаливый, хз).

Мои способности к моддингу Героев похоронены чуть более, чем полностью. О чем я, собственно, не жалею.

Вот за этим я и советовал обратиться к тебе ))
И да, рад видеть.

Автор: Gavek 17 Jan 2015, 20:53

Цитата(igrik @ 17 Jan 2015, 17:07) *
У меня все ок. Покажи весь скрипт, который используешь для сокровищницы

!?DL;
!!VRv9756&v998=206/v999=34:Sv999;
!!VRv9757&v998=206/v999=32:Sv999;

!?OB16;
!!SN:L^erm_hooker.era^/?y1 Ay1/^SetHook^/?y2;
!!SN:L^era.dll^/?y3 Ay3/^PluginExists^/?y4 Ey4/1/^erm_hooker^(эту строчку не пишу, т.к. пишет:"-неверный синтаксис для !!SN");
!!SN:Ey2/1/4854731/31865;

!?FU31865;
!!SN:X?y3/0;
; EDI (0), ESI (4), EBP (8), ESP (12), EBX (16), EDX (20), ECX (24), EAX (28)
; RetAddr (32)
!!VRy4:Sy3 +32;
!!UN&v9756=34:Cy4/4/4854918; // Да
!!UN&v9757=32:Cy4/4/4854782; // Нет

Автор: Gavek 17 Jan 2015, 21:14

Цитата(feanor @ 17 Jan 2015, 18:45) *
..я вот задумался

А что, !!OB:MRS не работают для сокровищниц?

!!OB:MRS; работают

только как с помощью этого:

из ERM-HELP
version 2.81d
M$1/$2/$3
Эта команда может отключить множество сообщений и вопросов для объекта в любое время:
$1 – какому игроку (-1 – для всех)
$2 – отменить (1) следующее сообщение при посещении
$3 – следующий статус $2 после виртуального или реального появления сообщения
Это не настоящая отмена, это АВТОответ (по умолчанию – «нет»). Все сообщения через IF – ресейвер будут показаны как обычно.


получить информацию о монстре, которую дают воры и "видения"? Может способность воров герою передать? Но как?

Автор: feanor 17 Jan 2015, 21:57

С помощью этого - никак.
А вот сообщения сокровищниц-пирамид и т.д. отключаются вроде именно им.


Автор: Gavek 17 Jan 2015, 22:01

Цитата(feanor @ 17 Jan 2015, 23:57) *
С помощью этого - никак.
А вот сообщения сокровищниц-пирамид и т.д. отключаются вроде именно им.

Sorry затупил, о том и речь шла.

Автор: feanor 17 Jan 2015, 22:17

Так, кажется, дружественность монстров считается непосредственно в процидурке диалога

Код
//----- (004170B0) --------------------------------------------------------
void __thiscall Dlg_MonsterRMHint(void *this, _Dlg_ *a2, int a3, int a4)
{
  int v4; // ecx@1
  void *v5; // ebx@1
  int v6; // edi@1
  int v7; // esi@1
  _Hero_ *v8; // esi@2
  int v9; // ecx@2
  __int16 v10; // cx@3
  int v11; // eax@6
  int v12; // ecx@6
  int v13; // eax@6
  int v14; // edx@6
  signed int v15; // eax@6
  int v16; // edx@6
  int v17; // eax@6
  int v18; // ecx@6
  int v19; // esi@8
  _Dlg_ *v20; // eax@15
  int v21; // ebx@15
  int v22; // eax@16
  _Dlg_ *v23; // eax@18
  int v24; // edx@21
  int v25; // ecx@21
  int v26; // esi@21
  int v27; // eax@21
  unsigned __int8 v28; // sf@21
  unsigned __int8 v29; // of@21
  void *v30; // ecx@22
  unsigned __int8 v31; // sf@23
  unsigned __int8 v32; // of@23
  int v33; // edx@25
  int v34; // ecx@25
  _Dlg_ *v35; // eax@25
  unsigned __int8 v36; // sf@25
  unsigned __int8 v37; // of@25
  void *v38; // ecx@26
  unsigned __int8 v39; // sf@27
  unsigned __int8 v40; // of@27
  __int64 v41; // [sp+Ch] [bp-24h]@3
  float v42; // [sp+14h] [bp-1Ch]@6
  float v43; // [sp+18h] [bp-18h]@1
  _PlayerSetup_ *v44; // [sp+1Ch] [bp-14h]@1
  int v45; // [sp+20h] [bp-10h]@1
  int v46; // [sp+2Ch] [bp-4h]@15

  v5 = this;
  v7 = a2->VTable & 0xFFF;
  v6 = HIWORD(a2->SizeX);
  LODWORD(v43) = this;
  v45 = v7;
  v44 = GetHumanPlayerStructure(Main_Structure);
  GetHumanPlayerIndex(Main_Structure);
  v4 = v44->ActiveHero;
  if ( v4 != -1 )
  {
    v9 = 585 * v4;
    v8 = (_Hero_ *)((char *)Main_Structure->Heroes + 2 * v9);
    if ( (_MainStruct_ *)((char *)Main_Structure + 2 * v9) != (_MainStruct_ *)-136736 )
    {
      if ( (v10 = *((_WORD *)v5 + 115),
            LOWORD(v41) = (((_WORD)a3 + ((signed __int16)(*((_WORD *)v5 + 114) << 6) >> 6)) ^ (_WORD)v41) & 0x3FF ^ v41,
            WORD1(v41) = ((((signed __int16)(4 * v10) >> 12) & 0xF) << 10) | ((_WORD)a4
                                                                            + ((signed __int16)(v10 << 6) >> 6)) & 0x3FF ^ WORD1(v41) & 0xC000,
            sub_004E6080(v8, (int)&v41))
        && sub_004E6050(v8) != -1                                //вот это как раз проверка на то, наложен ли Visions
        || *(_BYTE *)(LODWORD(v43) + 61) )
      {
        v13 = sub_004A7230((int)v8, v6);
        v14 = v8->SSkill[4];     //дипломатия игрока
        LODWORD(v41) = v13;
        v44 = (_PlayerSetup_ *)v14;   //а еще кто-то накосячил с типами
        v15 = sub_00427650(v8);
        LODWORD(v43) = v15;
        v16 = v45 * *(_DWORD *)(116 * v6 + Mon_Table_p + 64);
        v42 = (long double)v15;
        v43 = (long double)v16;
        v42 = v42 / v43;
        v17 = sub_004A7330(v42);
        v18 = a2->VTable;
        v11 = (int)((char *)v44 + v17 + v41);
        a2 = (_Dlg_ *)v18;
        v12 = v18 << 15 >> 27;
        if ( v12 > v11 )
          goto LABEL_33;
        if ( v12 <= (signed int)(&v44->HeroesCount + v41) )
        {
          v19 = 2;
          goto LABEL_15;
        }
        if ( v12 <= (_DWORD)v41 + 2 * (_DWORD)v44 + 1 )
        {
          v19 = 3;
          goto LABEL_15;
        }
        if ( (unsigned int)a2 & 0x20000 || v12 == v11 )
LABEL_33:
          v19 = 1;
        else
          v19 = 0;
LABEL_15:

..

далее не важно, потому что v19 - это как раз статус отношения группы монстров

для аутентичного результата надо переписать всю эту маету на ERM

Автор: Gavek 17 Jan 2015, 22:36

Цитата(feanor @ 18 Jan 2015, 00:17) *
Так, кажется, дружественность монстров считается непосредственно в процидурке диалога
...
...
для аутентичного результата надо переписать всю эту маету на ERM

Ок. Попробую. В IDApro декомпилированный код есть возможность открыть или нужен другой инструмент?

Автор: feanor 17 Jan 2015, 22:51

Цитата
Ок. Попробую. В IDApro декомпилированный код есть возможность открыть или нужен другой инструмент?
Ида нужна с хексрейзом. F5 на функции.
И воговская база, конечно..хотя хрен его знает, где её взять, пока вогфорум лежит.

А лучше скачай готовый декомпилят, один из последних постов в инженерном анализе

Автор: igrik 17 Jan 2015, 23:27

Цитата(feanor @ 17 Jan 2015, 22:51) *
И воговская база, конечно..хотя хрен его знает, где её взять, пока вогфорум лежит.

https://yadi.sk/d/mEGy_sMOe4FaQ

Цитата
Для сокровищницы если первый раз отменить, бой уже не вызывается, наверно параметры надо обратно менять?

Скорее всего проблема в этих переменных v9756 v9757. Походу нужно переменную, которая отвечает за "нет" обнулять. Но лень разбираться. В идеале лучше всего использовать одну, а не две

Автор: Gavek 18 Jan 2015, 16:10

Цитата(feanor @ 17 Jan 2015, 18:45) *
..я вот задумался

А что, !!OB:MRS не работают для сокровищниц?

!!OB998:M-1/1/0;
Не для всех сокровищниц работает как описано в ERM help 2.81

для склепа (тип 84) сразу выдает бой, после разграбления сообщение остается.
для утопий (тип 25) сразу дает бой, далее сообщений нет.

пробовал разные значения для третьего параметра (!!OB:M-1/1/?) от -1 до 3, ничего не происходит(.
A хочется выбирать как никак.

С помощью Ermhooker "в бой" сделал, а вот отмену не получается.

Автор: Gavek 18 Jan 2015, 17:32

Всё! Со склепом справился.
!?OB84;
!!CB998:T?y33;
!!OB998&y33=1:M-1/1/4;
!!SN:L^EraPlugins\erm_hooker.era^/?y1 Ay1/^SetHook^/?y2;
!!SN:L^era.dll^/?y3 Ay3/^PluginExists^/?y4;
!!SN&v1>0:Ey2/1/4899236/31896;
!$OB84;
!!VRv9756:S0;
!?FU31896;
!!SN:X?y3/0;
!!VRy4:Sy3 +32;
!!UN&v9756=34:Cy4/4/4899301; yes
!!UN&v9756=32:Cy4/4/4899429; no


для ветхого корабля(24) и кораблекрушения(85), аналогично.

Автор: Gavek 19 Jan 2015, 21:11

Цитата(feanor @ 18 Jan 2015, 00:17) *
Так, кажется, дружественность монстров считается непосредственно в процидурке диалога

Код
//----- (004170B0) --------------------------------------------------------
void __thiscall Dlg_MonsterRMHint(void *this, _Dlg_ *a2, int a3, int a4)
..

далее не важно, потому что v19 - это как раз статус отношения группы монстров
для аутентичного результата надо переписать всю эту маету на ERM

Feanor, не получается однако перенести строку с сообщениями: "Эти существа хотят присоединиться к Вам", "Любые существа присоединятся к Вам за %d золотых",
"Эти ничтожные существа сразу обратятся в бегство" и т.д. в самописный диалог DL.

Автор: Gavek 20 Jan 2015, 02:19

Отвечаю на свой вопрос,заданный http://forum.df2.ru/index.php?showtopic=34685&st=0. Есть возможность открыть информацию по любому существу, на примере клика на карте.


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

Автор: igrik 20 Jan 2015, 23:49

http://forum.df2.ru/index.php?s=&showtopic=6813&view=findpost&p=685807

Автор: Gavek 21 Jan 2015, 08:29

А я блин заморочился через шахту) Спасибо огромное.

Автор: feanor 21 Jan 2015, 12:53

Цитата
Feanor, не получается однако перенести строку с сообщениями: "Эти существа хотят присоединиться к Вам", "Любые существа присоединятся к Вам за %d золотых",
"Эти ничтожные существа сразу обратятся в бегство" и т.д. в самописный диалог DL.

Эм, в смысле?
Я, если чо, тоже не буду браться, слишком мутный код, свою механику сделать будет едва ли не проще.

Алсо, сообщения на самом деле лучше ловить через брякпойнт на 4F6C00, чем через поиск по коду

Автор: Gavek 21 Jan 2015, 20:58

Цитата(feanor @ 21 Jan 2015, 14:53) *
Эм, в смысле?
Я, если чо, тоже не буду браться, слишком мутный код, свою механику сделать будет едва ли не проще.

Алсо, сообщения на самом деле лучше ловить через брякпойнт на 4F6C00, чем через поиск по коду

Ок. Итак по теме ответили очень развернуто, мне лично помогло. Спасибо)

Автор: Etoprostoya 21 Jan 2015, 21:20

Может, слить эту тему с "http://forum.df2.ru/index.php?showtopic=6904", чтобы не плодить сущностей и не путаться?

Автор: igrik 21 Jan 2015, 22:11

Код
далее не важно, потому что v19 - это как раз статус отношения группы монстров

Блин, что-то я не могу въехать, где у определяется, что v19 = 0 ... 4.

Код
!?CM0;
!!CM:I?y1; куда кликнули
!!FU&y1<>37:E; если не карта приключений, то выход
!!CM:P?y1/?y2/?y3; координаты клика
!!OBy1/y2/y3:T?y4; что это за объект
!!FU&y4<>54:E; если не монстр, то выход
!!CM:R0;   отмена стандартного действия
!!OBy1/y2/y3:U?y4; узнать что за монстр?
!!MOy1/y2/y3:G?y5; сколько их?
!!FU35353:P1/y4/y5/3;

!?FU35353;
; x1 - тип диалога:
;      0 - стандартный
;      1 - как с видением
; x2 - номер монстра
; x3 - кол-во монстров
; x4 - строка с присоединением:
;      0 - в бегство
;      1 - готовы ринутся в драку
;      2 - присоединяются по холяве
;      3 - присоединятся за плату
; y10 - скоко денег они хотят
!!MA:Cx2/6/?y10; узнать скок стоит один монстр
!!VRy10:*x3; умножить на кол-во
!!UN:C6919480/4/?y1;
!!SN:E5438880/2/y1/x1/x2/x3/x4/y10;
!!SN:E6245264/2/y1;

Но еще не нашел где изменять координаты отображения диалога
Код
!?CM0;
!!CM:R0;
!!UN:C6919480/4/?y1; получить указатель
!!SN:E4782400/2/y1/50/50/256/256/18; вызвать пустой диалог с: 50/50 координаты верхнего угла, 256/256 размер диалога, 18 ???
!!SN:E6245264/2/y1; нужно для вызова диалога по ПКМ

Автор: Gavek 22 Jan 2015, 07:09

Цитата(igrik @ 22 Jan 2015, 01:11) *
Код
далее не важно, потому что v19 - это как раз статус отношения группы монстров

Блин, что-то я не могу въехать, где у определяется, что v19 = 0 ... 4.

Код
!?CM0;
!!CM:I?y1; куда кликнули
!!FU&y1<>37:E; если не карта приключений, то выход
!!CM:P?y1/?y2/?y3; координаты клика
!!OBy1/y2/y3:T?y4; что это за объект
!!FU&y4<>54:E; если не монстр, то выход
!!CM:R0;   отмена стандартного действия
!!OBy1/y2/y3:U?y4; узнать что за монстр?
!!MOy1/y2/y3:G?y5; сколько их?
!!FU35353:P1/y4/y5/3;

!?FU35353;
; x1 - тип диалога:
;      0 - стандартный
;      1 - как с видением
; x2 - номер монстра
; x3 - кол-во монстров
; x4 - строка с присоединением:
;      0 - в бегство
;      1 - готовы ринутся в драку
;      2 - присоединяются по холяве
;      3 - присоединятся за плату
; y10 - скоко денег они хотят
!!MA:Cx2/6/?y10; узнать скок стоит один монстр
!!VRy10:*x3; умножить на кол-во
!!UN:C6919480/4/?y1;
!!SN:E5438880/2/y1/x1/x2/x3/x4/y10;
!!SN:E6245264/2/y1;

Но еще не нашел где изменять координаты отображения диалога
Код
!?CM0;
!!CM:R0;
!!UN:C6919480/4/?y1; получить указатель
!!SN:E4782400/2/y1/50/50/256/256/18; вызвать пустой диалог с: 50/50 координаты верхнего угла, 256/256 размер диалога, 18 ???
!!SN:E6245264/2/y1; нужно для вызова диалога по ПКМ

Опробую будет время. С такой помощью мод можно будет закончить в скором времени.

Автор: Gavek 22 Jan 2015, 12:59

Цитата(igrik @ 22 Jan 2015, 01:11) *

Код
!?CM0;
!!CM:I?y1; куда кликнули
!!FU&y1<>37:E; если не карта приключений, то выход
!!CM:P?y1/?y2/?y3; координаты клика
!!OBy1/y2/y3:T?y4; что это за объект
!!FU&y4<>54:E; если не монстр, то выход
!!CM:R0;   отмена стандартного действия
!!OBy1/y2/y3:U?y4; узнать что за монстр?
!!MOy1/y2/y3:G?y5; сколько их?
!!FU35353:P1/y4/y5/3;

!?FU35353;
; x1 - тип диалога:
;      0 - стандартный
;      1 - как с видением
; x2 - номер монстра
; x3 - кол-во монстров
; x4 - строка с присоединением:
;      0 - в бегство
;      1 - готовы ринутся в драку
;      2 - присоединяются по холяве
;      3 - присоединятся за плату
; y10 - скоко денег они хотят
!!MA:Cx2/6/?y10; узнать скок стоит один монстр
!!VRy10:*x3; умножить на кол-во
!!UN:C6919480/4/?y1;
!!SN:E5438880/2/y1/x1/x2/x3/x4/y10;
!!SN:E6245264/2/y1;

Но еще не нашел где изменять координаты отображения диалога
Код
!?CM0;
!!CM:R0;
!!UN:C6919480/4/?y1; получить указатель
!!SN:E4782400/2/y1/50/50/256/256/18; вызвать пустой диалог с: 50/50 координаты верхнего угла, 256/256 размер диалога, 18 ???
!!SN:E6245264/2/y1; нужно для вызова диалога по ПКМ


В целом здорово! Пока правда ещё не понятно как эти значения использовать в !!DL.
!!SN:E4782400/2/y1/50/50/256/256/18; вызвать пустой диалог с: 50/50 координаты верхнего угла, 256/256 размер диалога, 18 ???
18 это наличие тени диалога, 2= отключить.

Цитата(Etoprostoya @ 22 Jan 2015, 00:20) *
Может, слить эту тему с "http://forum.df2.ru/index.php?showtopic=6904", чтобы не плодить сущностей и не путаться?


скажите как объединить.

Автор: Gavek 23 Jan 2015, 19:24

Кто нибудь знает,как сделать чтобы кнопка рекорды в главном меню вызывала диалог, значения для которого можно было бы брать из ini файла?

Автор: зачем? 04 Apr 2015, 22:41

Решил тут в хоту поиграть, захотелось однослотовых сборных артефактов, насколько я помню это можно сделать изменением пары байт в памяти (пофиг, что они не будут разбираться или давать не все статы), не подскажите адрес начинала таблицы артефатов и её структуру, поиск что то не дал результатов.... Кстати заодно может подскажете, возможно ли сделать плагин для hd мода, чтобы байтики заменялись при запуске, примеров реализации тоже не нашел нигде.

UPD: адресочки нашлись, только вот работает все не так как хотелось, сборные артефакты не только разобрать нельзя, но и собрать... в воге же (а может и сод), к примеру, если аналогичные адреса забить значением FFFFFFFF, собирались арты без проблем... просто разобрать нельзя было biggrin.gif

Автор: feanor 15 Apr 2015, 20:16

Я хотел написать пост про то, как хранятся в экзе деревья отстройки (битовое поле в памяти создается при старте из хитровыкрученных данных), но без мата не получается. Поэтому пусть полежит так.

Код
int depend_tables[] =
{
    0,                    -1, //первое число - номер здания, дальше - требования, завершаем минус единицей
    1, 0,                -1,
    2, 1,                -1,
    
    5,                    -1,

    7,                    -1,
    8,7,                -1,
    9,8,                -1,
    
    11, 5,                -1,
    12, 11, 14, 16, 0,    -1,
    13, 12, 9,            -1,
    
    14,                    -1,
    15, 14,                -1,

    16,                    -1,

    17, 16,                -1, //artif <- smith
    
    21, 0, 7,            -1, //managen <- fort, mguild

    22, 9,                -1, //moat???

    30, 7, 16,            -1,
    37, 30,                -1,
    18, 30,                -1,
    19, 30,    37,            -1,

    31, 7, 16,            -1,
    38, 31,                -1,

    32, 7, 16,            -1,
    39, 32,                -1,

    33, 31,                -1,
    40, 33,                -1,

    34, 30, 8, 14,        -1,
    41, 34, 35,            -1,

    35, 32, 8, 0,        -1,
    42, 35, 36, 17,        -1,

    36, 35, 34, 9, 1,    -1,
    43, 2,                -1,

    26,                    -1, //грааль
    -100 //конец
};


*(int*)0x4EBA98 = (int)depend_tables; //для конфлюкса. Иные адреса раньше по коду.

Автор: Gavek 04 Nov 2015, 14:22

Цитата(feanor @ 21 Jan 2015, 14:53) *
Цитата
Feanor, не получается однако перенести строку с сообщениями: "Эти существа хотят присоединиться к Вам", "Любые существа присоединятся к Вам за %d золотых",
"Эти ничтожные существа сразу обратятся в бегство" и т.д. в самописный диалог DL.

Эм, в смысле?
Я, если чо, тоже не буду браться, слишком мутный код, свою механику сделать будет едва ли не проще.

Алсо, сообщения на самом деле лучше ловить через брякпойнт на 4F6C00, чем через поиск по коду

Благодарен за "наводку" так сказать", по поводу создания своей механники, скоро будет готово.

Автор: Barin 04 Nov 2015, 19:14

Цитата(Barin @ 03 Nov 2015, 13:58) *
Цитата(igrik @ 13 Oct 2015, 01:17) *
отвечу и тут, мож кому еще пригодится
Код
сместить кнопки далеко за пределы экрана: для бин файла
; кнопка "Синглплеер"
63E6B0 FFFD
; кнопка "Мультиплеер"
63E6B8 FFFD
; кнопка "Обучение"
63E6C8 FFFD
; кнопка "Во имя богов"
456C6C AAAA
; кнопка "Клинок Армагедона"
456CE6 AAAA
; кнопка "Возраждение Эратии"
63BBF0 AAAA
; кнопка "Выбрать"
63BBF8 AAAA


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

Может кто помочь?


Автор: igrik 04 Nov 2015, 20:03

я тут хз

Автор: Gavek 05 Nov 2015, 11:42

Всем Здравствуйте!
Подскажите как закрыть окно героя и как отрыть окно найма существа (любого) вне замка?
Пробовал через "хук на эру" глядя в "компилят" героев, через ida pro... регистры и прочее... в программировании не разбираюсь.

Автор: hippocamus 05 Nov 2015, 23:36

Gavek
Ты ассемблер знаешь? В каждом конретном случае вызвано разное количество вложенных функций, которым разное количество параметров передано через стек командой push. Чтобы функцию завершить (а вызов окна героя - функция) - нужно передать управление на начало команд pop перед ret. Но в общем случае дать рекомендации нельзя - а вдруг вызвана вложенная функция (нажата кнопка например) - и эти операторы pop восстановят вовсе не то, и стек не вернётся в исходное состояние?
А окно найма можно открыть, хоть даже внутри окна героя - но это нужно в отладчике смотреть.

Автор: Gavek 06 Nov 2015, 10:52

Цитата(hippocamus @ 06 Nov 2015, 01:36) *
Gavek
Ты ассемблер знаешь? В каждом конретном случае вызвано разное количество вложенных функций, которым разное количество параметров передано через стек командой push. Чтобы функцию завершить (а вызов окна героя - функция) - нужно передать управление на начало команд pop перед ret. Но в общем случае дать рекомендации нельзя - а вдруг вызвана вложенная функция (нажата кнопка например) - и эти операторы pop восстановят вовсе не то, и стек не вернётся в исходное состояние?
А окно найма можно открыть, хоть даже внутри окна героя - но это нужно в отладчике смотреть.

Пробовал хотя бы азы изучить, интересно лично мне. Однако как и всё требует времени много, особенно если сам занимаешься. Поэтому ассемблер не знаю. Хотя за 4 года удалось очень подробно изучить ERM. Поскольку внутренности программы не знаю, то пользуюсь чужими наработками (естественно). Однако найденых мною наработок не хватает, мне.

Автор: feanor 06 Nov 2015, 22:02

Гиппо, не надо нести ерунду. Пуши, реты - начнем с того, что достаточно сымитировать нажатие кнопки (хотя бы через винапишную сендкей, ага, если не через встроенные функции диалога).
Ну и выход из диалога в принципе не может осуществляться "передачей управления на начало команд pop перед ret".

Автор: hippocamus 06 Nov 2015, 22:11

Ага, а если в этот момент поверх открыто ещё одно диалоговое окно?
Про сымитировать нажатие - это я и так понимаю, только работают ли апи-функции в героях? Неужели там не свой обработчик?

Автор: igrik 07 Nov 2015, 13:02

Цитата(feanor @ 16 Jan 2015, 22:00) *
Так. Трэш-сеанс гадания по геройским внутренностям открыт

В теме есть описалово нескольких стартовых функций
В частности, есть указание на то, что 004A8160 обрабатывает вход в объекты
Код
0x004A8160 void __thiscall Enter2ObjectMain(int AvdManager, _Hero_ *Hero, signed int Par1, __int64 PosMixed)

Код
0х00408ABF Enter2ObjectGamer(v2, a5, mip);
0х00408ABF car__thiscall Enter2ObjectGamer(int AdvManager, signed int a3, int a4)


Цитата
Щас посмотрю.
Есть mip, который указатель на тайл клетки, а есть пакованные координаты.
//здесь - да, пакованные координаты

feanor, если есть время и желание, можешь немного поподробнее расписать про эти функции и чем пакованные координаты отличаются от указателя на "тайл клетки"

Цитата
!!CM:P?y1/?y2/?y3;
!!VRy1: &1023;
!!VRy2: &1023 *65536 |y1;
!!VRy3: &15 *67108864 |y2;

Тут в y3 получаем тайл клетки?

Цитата
!!CM:P?y1/?y2/?y3;
!!UN:C6919480/4/?y15; gamemgr
!!UN:C6918840/4/?y10; advmgr
!!VRy11:Sy10 +92;
!!UN:Cy11/4/?y11; gamemap
!!SN:E4228816/2/y11/y1/y2/y3;
!!VRy12:Sv1; mapitem

А тут пакованные координаты в y12?

Автор: feanor 07 Nov 2015, 14:15

Наоборот, в первом случае упакованные в dword координаты, во втором - указатель на структуру тайла клетки.

Автор: igrik 07 Nov 2015, 21:48

http://forum.df2.ru/index.php?s=&showtopic=6813&view=findpost&p=710685

Автор: Gavek 09 Nov 2015, 11:09

Цитата(igrik @ 07 Nov 2015, 23:48) *
Окно найма существ
Код
!!FU8980050:P28/132/10/-1/0/-1/0/-1/0;
!?FU8980050;  нанять существо при активном герое
....
....
!!SN&y3<>0:E4917104/2/y1/y3;
!!en:;

Но! при попытке купить происходит вылет. Как это решить я не знаю

Очень жаль. У меня вообще курсор пропадает, активна только кнопка "отмены" (ESC). Нажимаешь, потом снова функцию активируешь: первый слот нанимать также нельзя остальные можно, но всё равно вылет при найме. Ссылается на последнюю выполненную функцию и ошибку в доступе к функции Get Mon Stack(точно название не помню)
Точно также было у меня, когда хук на Dwеллинги ставил. Хоть поступай в "Вышку" на программирование.

Автор: igrik 09 Nov 2015, 12:32

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

Форум Invision Power Board (http://nulled.cc)
© Invision Power Services (http://nulled.cc)