Инженерный анализ, Reverse Engineering |
Здравствуйте, гость ( Вход | Регистрация )
Инженерный анализ, Reverse Engineering |
08 Jan 2020, 10:46
Сообщение
#141
|
|
Legendary lover Сообщений: 628 Спасибо сказали: 307 раз |
Всем привет.
Мне казалось, я где-то видел аналогичную тему с адресами в SoD. Могу ошибаться, конечно, но если такая тема есть - ткните, пожалуйста. -------------------- ...and the music change my life
|
|
|
13 Oct 2020, 07:53
(Сообщение отредактировал Richter - 13 Oct 2020, 07:54)
Сообщение
#142
|
|
collector of time Сообщений: 159 Спасибо сказали: 73 раза |
Всем привет) Выкладываю полезную Heroes3f.idb штуку для мододелов. Раньше была на сайте, сейчас не смог найти. Случайно наткнулся при чистке диска. Думаю будет полезна.
-------------------- |
|
|
19 Dec 2020, 16:29
(Сообщение отредактировал Raistlin - 15 Feb 2021, 16:52)
Сообщение
#143
|
|
Advanced Member Сообщений: 106 Спасибо сказали: 317 раз |
Привет, друзья, я тут раскопал некоторые неопубликованные виртуальные адреса и хочу оставить их здесь. Быть может, кому-то еще пригодится.
Регенерация существ 002F55C7 83F8 3C CMP EAX,3C //стражи 002F55CA 0F84 BB000000 JE 002F568B 002F55D0 83F8 3D CMP EAX,3D //привидения 002F55D3 0F84 B2000000 JE 002F568B 002F55D9 3D 90000000 CMP EAX,90 //тролли 002F55DE 0F84 A7000000 JE 002F568B 002F55E4 3D 9D000000 CMP EAX,9D //кошмарные гидры 002F55E9 0F84 92000000 JE 002F5681 где 3C, 3D, 90, 9D - номер существа в шестнадцатеричной системе Актуальные адреса (проверено на Эре): 0075DE66 83F8 3C CMP EAX,3C 0075DE69 0F84 BB000000 JE 0075DF2A 0075DE6F 83F8 3D CMP EAX,3D 0075DE72 0F84 B2000000 JE 0075DF2A 0075DE78 3D 90000000 CMP EAX,90 0075DE7D 0F84 A7000000 JE 0075DF2A 0075DE83 3D 9D000000 CMP EAX,9D 0075DE88 0F84 92000000 JE 0075DF20 Для кошмарных гидр выполняется проверка вероятности регенерации (где 28h = 40% вероятность) 002F5681 E8 9A7EFFFF CALL 002ED520 002F5686 83F8 28 CMP EAX,28 Актуальные адреса (проверено на Эре): 0075DF20 E8 7B84FFFF CALL 007563A0 0075DF25 83F8 28 CMP EAX,28 А вот тут находится количество срегенерированных жизней (где 32h = 50 HP) 002F55BC BA 32000000 MOV EDX,32 Актуальный адрес (проверено на Эре): 0075DE5B BA 32000000 MOV EDX,32 Атака с возвращением 002F57C6 83F8 48 CMP EAX,48 //гарпия 002F57C9 74 5D JE SHORT 002F5828 002F57CB 83F8 49 CMP EAX,49 //гарпия-ведьма 002F57CE 74 58 JE SHORT 002F5828 002F57D0 3D 9B000000 CMP EAX,9B //темный дракон 002F57D5 74 21 JE SHORT 002F57F8 //доп проверка двуклеточности Актуальные адреса (проверено на Эре): 0075E059 83F8 48 CMP EAX,48 0075E05C 74 5D JE SHORT 0075E0BB 0075E05E 83F8 49 CMP EAX,49 0075E061 74 58 JE SHORT 0075E0BB 0075E063 3D 9B000000 CMP EAX,9B 0075E068 74 21 JE SHORT 0075E08B Соответствующее место в оригинальном коде: 0047832B cmp eax, 48h ; Compare Two Operands 0047832E jz short loc_00478335 ; Jump if Zero (ZF=1) 00478330 cmp eax, 49h ; Compare Two Operands 00478333 jnz short loc_00478365 ; Jump if Not Zero (ZF=0) Для выбора режима нападения после нажатия правой кнопкой на защите (атаковать и вернуться или атаковать и остаться там) 002FA2D7 837D F0 48 CMP DWORD PTR SS:[EBP-10],48 //гарпия 002FA2DB 74 23 JE SHORT 002FA300 002FA2DD 837D F0 49 CMP DWORD PTR SS:[EBP-10],49 //гарпия-ведьма 002FA2E1 74 1D JE SHORT 002FA300 002FA2E3 817D F0 9B000000 CMP DWORD PTR SS:[EBP-10],9B //темный дракон 002FA2EA 74 14 JE SHORT 002FA300 Актуальные адреса (проверено на Эре): 00762940 837D FC 48 CMP DWORD PTR SS:[LOCAL.1],48 00762944 74 23 JE SHORT 00762969 00762946 837D FC 49 CMP DWORD PTR SS:[LOCAL.1],49 0076294A 74 1D JE SHORT 00762969 0076294C 817D FC 9B000 CMP DWORD PTR SS:[LOCAL.1],9B 00762953 74 14 JE SHORT 00762969 Возрождение фениксов 002F587C 817E 34 83000000 CMP DWORD PTR DS:[ESI+34],83 //феникс 002F5883 74 38 JE SHORT 002F58BD 002F5885 817E 34 9E000000 CMP DWORD PTR DS:[ESI+34],9E //священный феникс 002F588C 74 1C JE SHORT 002F58AA Актуальные адреса (проверено на Эре): 0075E108 817E 34 83000 CMP DWORD PTR DS:[ESI+34],83 0075E10F 74 38 JE SHORT 0075E149 0075E111 817E 34 9E000 CMP DWORD PTR DS:[ESI+34],9E 0075E118 74 1C JE SHORT 0075E136 Также в какой-то момент мой взгляд упал вот на это место: 004331CB 85F6 TEST ESI,ESI 004331CD 75 14 JNZ SHORT 004331E3 004331CF 83F8 70 CMP EAX,70 004331D2 74 5D JE SHORT 00433231 004331D4 83F8 71 CMP EAX,71 004331D7 74 58 JE SHORT 00433231 004331D9 83F8 72 CMP EAX,72 004331DC 74 53 JE SHORT 00433231 004331DE 83F8 73 CMP EAX,73 004331E1 74 4E JE SHORT 00433231 Тут идет проверка на четырех неулучшенных элементалей, однако, что за ней следует, я не смотрел. Если вдруг кто-то знает, прошу поделиться, а то любопытно Кстати, можете пожалуйста помочь отключить следующее оповещение? -------------------- Создатель глобального мода WoG Ultra Edition. Тема мода на разных ресурсах:
df2: https://forum.df2.ru/index.php?showtopic=38057 Основной форум: http://wforum.heroes35.net/showthread.php?tid=5571 Группа ВКонтакте: https://vk.com/club194956360 |
|
|
21 Dec 2020, 15:54
(Сообщение отредактировал Raistlin - 21 Dec 2020, 18:49)
Сообщение
#144
|
|
Advanced Member Сообщений: 106 Спасибо сказали: 317 раз |
Пока искал одну вещь, нашел целую кучу всего другого...
00683288 - название первой выбранной карты при старте новой игры. По умолчанию "Высокомерие" (Arrogance.h3m) 0065F8AC - таблица с именами аудио-лупов, начинается с "loopocea.wav" 00687FAC - таблица с именами звуков заклинаний, начинается с "Acid.wav" 00660060 - таблица с именами дефов с иконками, показываемыми в зале совета. Начинается с HALLFORT.def (Крепость). Там же рядом находятся дефы, подгружаемые лишь единожды (twcrport.def, spells.def, artifact.def и тд.) 0068864C - названия многих текстовиков 00689004 - building.txt 0068C888 - jktext.txt 006834FC - еще пара текстовиков (условия победы, поражения, а заодно информация о турнирных правилах) 0067F154 - и еще (герои, их классы и навыки) 0067604C - таблица с именами иконок городских строений, начинается с "BoEup_6.pcx" (погребальный костер) Подгружаемые игрой файлы с ресурсами: -------------------- Создатель глобального мода WoG Ultra Edition. Тема мода на разных ресурсах:
df2: https://forum.df2.ru/index.php?showtopic=38057 Основной форум: http://wforum.heroes35.net/showthread.php?tid=5571 Группа ВКонтакте: https://vk.com/club194956360 |
|
|
21 Dec 2020, 22:06
Сообщение
#145
|
|
Advanced Member Сообщений: 106 Спасибо сказали: 317 раз |
Ну что же, раз уж я начал тему абилок, то почему бы не продолжить. В принципе, мне даже понравилось искать адреса) За окном давно стемнело, а я тут сижу за компьютером и уписываю йогурт... В общем, самое время поковырять любимую игру
Бесстрашие 002F7C6C 817F 34 84000000 CMP DWORD PTR DS:[EDI+34],84 //лазурный дракон 002F7C73 74 46 JE SHORT 002F7CBB 002F7C75 817F 34 96000000 CMP DWORD PTR DS:[EDI+34],96 //верховный архангел 002F7C7C 7C 09 JL SHORT 002F7C87 002F7C7E 817F 34 C0000000 CMP DWORD PTR DS:[EDI+34],0C0 //сильванский кентавр 002F7C85 7C 34 JL SHORT 002F7CBB Актуальные адреса (проверено на Эре): 00760481 817F 34 84000 CMP DWORD PTR DS:[EDI+34],84 //лазурный дракон 00760488 74 46 JE SHORT 007604D0 0076048A 817F 34 96000 CMP DWORD PTR DS:[EDI+34],96 //верховный архангел 00760491 7C 09 JL SHORT 0076049C 00760493 817F 34 C0000 CMP DWORD PTR DS:[EDI+34],0C0 //сильванский кентавр 0076049A 7C 34 JL SHORT 007604D0 Бесстрашием обладают Лазурный дракон и диапазон существ от Верховного архангела (150) до командира Сопряжения (191). Страх 002F7CEA 81FB 84000000 CMP EBX,84 //лазурный дракон 002F7CF0 74 75 JE SHORT 002F7D67 002F7CF2 81FB 99000000 CMP EBX,99 //антихрист 002F7CF8 74 6D JE SHORT 002F7D67 002F7CFA 81FB 9B000000 CMP EBX,9B //темный дракон 002F7D00 74 65 JE SHORT 002F7D67 Актуальные адреса (проверено на Эре): 007604F1 81FB 84000000 CMP EBX,84 //лазурный дракон 007604F7 74 75 JE SHORT 0076056E 007604F9 81FB 99000000 CMP EBX,99 //антихрист 007604FF 74 6D JE SHORT 0076056E 00760501 81FB 9B000000 CMP EBX,9B //темный дракон 00760507 74 65 JE SHORT 0076056E Вот тут мне что-то кажется, что major ошибся, и Страхом по факту обладают все командиры. Нужно это для того, чтобы они могли получить эту способность в будущем. 002F7D16 813D 68218302 AE000000 CMP DWORD PTR DS:[2832168],0AE 002F7D20 7C 21 JL SHORT 002F7D43 002F7D22 813D 68218302 BF000000 CMP DWORD PTR DS:[2832168],0BF 002F7D2C 7F 15 JG SHORT 002F7D43 Актуальные адреса (проверено на Эре): 0076051D 813D 94258302 CMP DWORD PTR DS:[2832594],0AE 00760527 7C 21 JL SHORT 0076054A 00760529 813D 94258302 CMP DWORD PTR DS:[2832594],0BF 00760533 7F 15 JG SHORT 0076054A Магическое зеркало 00048528 8179 34 86000000 CMP DWORD PTR DS:[ECX+34],86 0004852F 75 1E JNZ SHORT 0004854F Актуальные адреса (проверено на Эре): 00448528 8179 34 86000 CMP DWORD PTR DS:[ECX+34],86 0044852F 75 1E JNE SHORT 0044854F 86h = 134 - Сказочный дракон Атака огненным шаром 0003F72C 83F8 2D CMP EAX,2D 0003F72F 0F85 EA020000 JNZ 0003FA1F Актуальные адреса (проверено на Эре): 0043F72C 83F8 2D CMP EAX,2D 0043F72F 0F85 EA020000 JNE 0043FA1F 2Dh = 45 - Магог Атака облаком смерти 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 Актуальные адреса (проверено на Эре): 00767B9F 83F8 40 CMP EAX,40 00767BA2 74 12 JE SHORT 00767BB6 00767BA4 83F8 41 CMP EAX,41 00767BA7 74 0D JE SHORT 00767BB6 00767BA9 3D C4000000 CMP EAX,0C4 00767BAE 74 06 JE SHORT 00767BB6 00767BB0 B8 00000000 MOV EAX,0 00767BB5 C3 RETN 00767BB6 B8 41000000 MOV EAX,41 //во всех трех случаях просто подсовываем индекс могущественного лича и не паримся При выборе снаряда для драколича проходит отдельная проверка: 00767BE2 3D C4000000 CMP EAX,0C4 00767BE7 74 07 JE SHORT 00767BF0 //если драколич, подменяем снаряд 00767BE9 B9 B0096600 MOV ECX,006609B0 ; ASCII "plcbowx.def" 00767BEE EB 05 JMP SHORT 00767BF5 //в противном случае выходим из функции 00767BF0 B9 141B7A00 MOV ECX,OFFSET 007A1B14 ; ASCII "ZShot195.def" 00767BF5 C3 RETN Соответствующее место в оригинальном коде: 0043FA1F 83F8 40 CMP EAX,40 //лич 0043FA22 0F84 FF000000 JE 0043FB27 0043FA28 83F8 41 CMP EAX,41 //могущественный лич 0043FA2B 0F84 F6000000 JE 0043FB27 -------------------- Создатель глобального мода WoG Ultra Edition. Тема мода на разных ресурсах:
df2: https://forum.df2.ru/index.php?showtopic=38057 Основной форум: http://wforum.heroes35.net/showthread.php?tid=5571 Группа ВКонтакте: https://vk.com/club194956360 |
|
|
08 Jan 2021, 02:27
Сообщение
#146
|
|
Advanced Member Сообщений: 106 Спасибо сказали: 317 раз |
Вот они, иконки наши )
005849D0 83C0 02 ADD EAX,2 // кадр номер 2 в scselc.def (иконка SoD) 005849D3 8945 FC MOV DWORD PTR SS:[EBP-4],EAX 005849D6 EB 10 JMP SHORT 005849E8 005849D8 C745 FC 01000000 MOV DWORD PTR SS:[EBP-4],1 // кадр номер 1 в scselc.def (иконка AB) 005849DF EB 07 JMP SHORT 005849E8 005849E1 C745 FC 00000000 MOV DWORD PTR SS:[EBP-4],0 // кадр номер 0 в scselc.def (иконка RoE) Код if ( *v11 == 14 ) { cadre = 0; } else if ( v12 == 21 ) { cadre = 1; } else { v13 = -(v12 != 28); LOBYTE(v13) = v13 & 0xFD; cadre = v13 + 2; } Происходит это все в sub_00584820 В общем, если закинуть кадров в def и в нужный момент использовать их вместо стандартных, можно создать свои форматы карты -------------------- Создатель глобального мода WoG Ultra Edition. Тема мода на разных ресурсах:
df2: https://forum.df2.ru/index.php?showtopic=38057 Основной форум: http://wforum.heroes35.net/showthread.php?tid=5571 Группа ВКонтакте: https://vk.com/club194956360 |
|
|
17 Jan 2021, 23:36
(Сообщение отредактировал Raistlin - 16 Feb 2021, 21:04)
Сообщение
#147
|
|
Advanced Member Сообщений: 106 Спасибо сказали: 317 раз |
Двухклеточный ров в Крепости:
004699E0 8078 04 07 CMP BYTE PTR DS:[EAX+4],7 004699E4 75 21 JNE SHORT 00469A07 Как убрать урон от рва в принципе (с проверкой на город): Код int __stdcall NoMoatDamage(LoHook* h, HookContext* c) { if (c->eax == 7) //В eax лежит индекс города { c->return_address = 0x469AE8; return NO_EXEC_DEFAULT; } return EXEC_DEFAULT; } Код Magic->WriteLoHook(0x469A90, (void*)NoMoatDamage); Если хотите реализовать проверку на какого-то определенного монстра, то, если я ничего не путаю, структура стека в этот момент лежит в edi *Спустя 10 минут* Да, я был прав: Код if (*(int*)(c->edi + 52) == 13) //Дать Архангелам иммунитет ко рву
{ c->return_address = 0x469AE8; return NO_EXEC_DEFAULT; } -------------------- Создатель глобального мода WoG Ultra Edition. Тема мода на разных ресурсах:
df2: https://forum.df2.ru/index.php?showtopic=38057 Основной форум: http://wforum.heroes35.net/showthread.php?tid=5571 Группа ВКонтакте: https://vk.com/club194956360 |
|
|
08 Feb 2021, 12:41
(Сообщение отредактировал Raistlin - 05 Mar 2021, 13:45)
Сообщение
#148
|
|
Advanced Member Сообщений: 106 Спасибо сказали: 317 раз |
63B850 - Массив заклинаний Сказочного дракона
6608B8 - Массив заклинаний Чародея Аура сопротивления у Единорогов: 43E800 cmp eax, 18h ; Compare Two Operands 43E803 jz short loc_0043E80E ; Jump if Zero (ZF=1) 43E805 cmp eax, 19h ; Compare Two Operands 43E808 jnz loc_0043E8AB ; Jump if Not Zero (ZF=0) 43E8AE cmp eax, 18h ; Compare Two Operands 43E8B1 jz short loc_0043E8BC ; Jump if Zero (ZF=1) 43E8B3 cmp eax, 19h ; Compare Two Operands 43E8B6 jnz loc_0043E95B ; Jump if Not Zero (ZF=0) ; Снижение удачи Дьяволами 44AFFF cmp dword ptr [esi], 36h 44B00F cmp dword ptr [edx], 37h ; Телепортация Дьяволов 44571B cmp eax, 36h ; Compare Two Operands 44571E jz short loc_00445743 ; Jump if Zero (ZF=1) 445720 cmp eax, 37h ; Compare Two Operands 445723 jz short loc_00445743 ; Jump if Zero (ZF=1) 44B180 - В данной функции производятся модификации урона от заклинаний. Для големов урон снижается, для элементалей - повышается. Код int __fastcall Battle_Get_Spell_GetResistGolem(signed int a1, int spell, int MonKind) { int result; // eax switch ( MonKind ) { case 32: result = a1 / 2; break; case 33: result = a1 / 4; break; case 112: case 127: if ( spell != 26 && spell != 17 && spell != 19 && spell != 57 ) goto LABEL_20; result = 2 * a1; break; case 113: case 125: if ( spell != 23 ) goto LABEL_20; result = 2 * a1; break; case 114: case 129: if ( spell != 16 && spell != 20 ) goto LABEL_20; result = 2 * a1; break; case 115: case 123: if ( spell != 21 && spell != 22 && spell != 26 ) goto LABEL_20; result = 2 * a1; break; case 116: result = 15 * a1 / 100; break; case 117: a1 /= 20; goto LABEL_20; default: LABEL_20: result = a1; break; } return result; } Код int __stdcall ChangeSpellDamage(LoHook* h, HookContext* c) { int CreatureIndexForMR = *(_ptr_*)(c->esp + 8); if (CreatureIndexForMR == 201|| CreatureIndexForMR == 202) { c->ecx = (c->ecx / 4) * 3; //Урон от заклинания удвоен. Чтобы сделать х1.5 делим на 4 и умножаем на 3 } return EXEC_DEFAULT; } [...] Magic->WriteLoHook(0x44B1D4, (void*)ChangeSpellDamage); Обратите внимание, в таблице с типами модификаторов магического урона у существ должен стоять повышенный урон от заклинаний холода. Изначально он есть только у Огненных и Энергитических Элементалей, но может быть задан и самостоятельно с помощью патчей или плагинов вроде Тифона. Артефакт, дающий бесконечный боезапас 43F718 push 5 43F71A call Hero_ArtIsHas_OnDoll 43F71F test al, al 43F721 jnz short loc_0043F729 ; Jump if Not Zero (ZF=0) 43F723 dec dword ptr [esi+0D8h] ; Decrement by 1 (уменьшение количества снарядов) 41FA10 - функция менеджера битвы, отвечающая за блокировку колдовства (там находятся проверки на проклятую землю, антимагический гарнизон и сферу запрещения) -------------------- Создатель глобального мода WoG Ultra Edition. Тема мода на разных ресурсах:
df2: https://forum.df2.ru/index.php?showtopic=38057 Основной форум: http://wforum.heroes35.net/showthread.php?tid=5571 Группа ВКонтакте: https://vk.com/club194956360 |
|
|
02 Mar 2021, 22:24
(Сообщение отредактировал Raistlin - 02 Mar 2021, 23:13)
Сообщение
#149
|
|
Advanced Member Сообщений: 106 Спасибо сказали: 317 раз |
Вызов книги магии героя
В качестве примера взято колдовство заклинаний на карте приключений, но принцип, по идее, везде один - нужно создать диалог, дать пользователю с ним поиграться, а затем уничтожить. Код 0041C500 50 PUSH EAX; /Arg4 = 2B3FFCC 0041C501 6A 01 PUSH 1 ; |Arg3 = 1 0041C503 6A 00 PUSH 0 ; |Arg2 = 0 0041C505 56 PUSH ESI; |Arg1 0041C506 8D8D 28FFFFFF LEA ECX,[LOCAL.54]; 0041C50C E8 DFFB1700 CALL 0059C0F0 ; _Dlg_ *__thiscall Dlg_SpellBook_Create(_Dlg_ *this, _Hero_ *hero, int a3, int a4, int TypeOfLand) 0041C511 6A 00 PUSH 0 ; /Arg1 = 0 0041C513 8D8D 28FFFFFF LEA ECX,[LOCAL.54]; 0041C519 C745 FC 00000 MOV DWORD PTR SS:[LOCAL.1],0; 0041C520 E8 FB341E00 CALL 005FFA20 ; int __thiscall Dlg_ShowAndRun(void *dlg, int fadeIn) 0041C525 8D8D 28FFFFFF LEA ECX,[LOCAL.54] 0041C52B C745 FC FFFFF MOV DWORD PTR SS:[LOCAL.1],-1 0041C532 E8 B9061800 CALL 0059CBF0 ; int __thiscall DestroySpellBook_Dlg(_Dlg_ *dlg) Четвертый параметр функции Dlg_SpellBook_Create (a4) - это происхождение клика (то есть, при каких обстоятельствах диалог был создан). 0 - во время битвы, 1 - на карте приключений, 2 - в окне героя, 3 - В бою, кстати, все немного иначе: Код 00474895 call 0059EC10; BattleMgr_ShowHeroSpellBook. Создание диалога происходит уже в этой функции
-------------------- Создатель глобального мода WoG Ultra Edition. Тема мода на разных ресурсах:
df2: https://forum.df2.ru/index.php?showtopic=38057 Основной форум: http://wforum.heroes35.net/showthread.php?tid=5571 Группа ВКонтакте: https://vk.com/club194956360 |
|
|
03 Mar 2021, 09:40
(Сообщение отредактировал XEPOMAHT - 03 Mar 2021, 09:45)
Сообщение
#150
|
|
---------------------- New_Life_of_Heroes ---------------------- Сообщений: 226 Спасибо сказали: 345 раз |
Код 0041C500 50 PUSH EAX; /Arg4 = 2B3FFCC 0041C501 6A 01 PUSH 1; |Arg3 = 1 0041C503 6A 00 PUSH 0; |Arg2 = 0 0041C505 56 PUSH ESI; |Arg1 0041C506 8D8D 28FFFFFF LEA ECX,[LOCAL.54]; 0041C50C E8 DFFB1700 CALL 0059C0F0; _Dlg_ *__thiscall Dlg_SpellBook_Create(_Dlg_ *this, _Hero_ *hero, int a3, int a4, int TypeOfLand) 0041C511 6A 00 PUSH 0; /Arg1 = 0 0041C513 8D8D 28FFFFFF LEA ECX,[LOCAL.54]; 0041C519 C745 FC 00000 MOV DWORD PTR SS:[LOCAL.1],0; 0041C520 E8 FB341E00 CALL 005FFA20; int __thiscall Dlg_ShowAndRun(void *dlg, int fadeIn) 0041C525 8D8D 28FFFFFF LEA ECX,[LOCAL.54] 0041C52B C745 FC FFFFF MOV DWORD PTR SS:[LOCAL.1],-1 0041C532 E8 B9061800 CALL 0059CBF0; int __thiscall DestroySpellBook_Dlg(_Dlg_ *dlg) В IDA-базе от WoG откомментировано лучше, советую копировать код оттуда. И для открывания книги магии лучше брать более чистый ассемблерный код (представленный выше - огрызочный и сам по себе работать не будет). И сама функция открывания диалога книги магии давно есть в высокоуровневом виде: Код void ShowSpellBookDlg(int a1, int a2, int land_modifier)
{ if (this->doll_art[17].id != -1) { _Dlg_* dlg = (_Dlg_*)o_New(0xD0); // create spellbook dlg CALL_5(void, __thiscall, 0x59C0F0, dlg, this, a1, a2, land_modifier); dlg->Run(); // destroy spellbook dlg CALL_1(void, __thiscall, 0x59CBF0, dlg); o_Delete(dlg); } } void ShowSpellBookDlg(int a1, int a2) {ShowSpellBookDlg(a1, a2, this->GetLandModifierUnder());} }; -------------------- WoG + MoP + HoA + Forge + Bastion = ERA+
|
|
|
04 Mar 2021, 00:34
Сообщение
#151
|
|
пират с чёрной меткой Сообщений: 23 599 Спасибо сказали: 12880 раз |
Да пусть человек исследует. Одна голова хорошо, а две - лучше.
Что-то он сделает оптимальнее, чем было до него. А так-то можно моповские файлы взять, WERD, там очень много чего уже есть готового. -------------------- Давший быка на убой не выпросил и печень на жаркое.
|
|
|
04 Mar 2021, 09:46
Сообщение
#152
|
|
---------------------- New_Life_of_Heroes ---------------------- Сообщений: 226 Спасибо сказали: 345 раз |
Да пусть человек исследует. Одна голова хорошо, а две - лучше. Что-то он сделает оптимальнее, чем было до него. Считаю, что лучше не исследовать с 0 то, что уже было не плохо кем-то исследовано, а выбирать то, что ещё почти не исследовалось, чтобы не идти по спирали и не повторять то, что уже было лет 5-10-15 назад. А так-то можно моповские файлы взять, WERD, там очень много чего уже есть готового. Да, только код из WERD написан под MoP, поэтому под ERA его приходится почти всегда переписывать. Почти всё встраивается или когда-нибудь будет встроено непосредственно в exe-файл, поэтому моповский код с каждым годом всё дальше и дальше уходит от SoD/WoG TE, лет через 5 возможно получится уже ассемблерный аналог VCMI, т.к. может выйти так, что будет сменён весь игровой код от SoD. Поэтому лучше всё же публиковать что-то из IDA-базы от Третьих Героев, нежели из самих модов. -------------------- WoG + MoP + HoA + Forge + Bastion = ERA+
|
|
|
05 Mar 2021, 13:41
Сообщение
#153
|
|
Advanced Member Сообщений: 106 Спасибо сказали: 317 раз |
XEPOMAHT, я искренне не знал, что такая функция уже есть, а потому решил написать собственную. Для этого мне пришлось найти пример вызова книги, который я тут и выложил.
-------------------- Создатель глобального мода WoG Ultra Edition. Тема мода на разных ресурсах:
df2: https://forum.df2.ru/index.php?showtopic=38057 Основной форум: http://wforum.heroes35.net/showthread.php?tid=5571 Группа ВКонтакте: https://vk.com/club194956360 |
|
|
12 Jul 2021, 13:26
Сообщение
#154
|
|
Advanced Member Сообщений: 106 Спасибо сказали: 317 раз |
Лютый разврат, господа
Код int __stdcall GM345_off(LoHook* h, HookContext* c) { if (*(char*)(c->esi + 4) == KremlinTown) { c->return_address = 0x460F56; return NO_EXEC_DEFAULT; } return EXEC_DEFAULT; } ... // Ограничить гильдию магов вторым уровнем Magic->WriteLoHook(0x460F80, GM345_off); Для самых немагических замков на свете У Кремля, к слову, задумывалось всего два уровня, так что пусть будет - мало ли... Ну а для трехэтажки хук нужно ставить в 0x460FA6 с возвратом в 0x460F80. Для четырех - 0x460FE0 и 0x460FB1. -------------------- Создатель глобального мода WoG Ultra Edition. Тема мода на разных ресурсах:
df2: https://forum.df2.ru/index.php?showtopic=38057 Основной форум: http://wforum.heroes35.net/showthread.php?tid=5571 Группа ВКонтакте: https://vk.com/club194956360 |
|
|
08 Aug 2021, 17:26
Сообщение
#155
|
|
Advanced Member Сообщений: 106 Спасибо сказали: 317 раз |
Всякая всячина из WoG:
sub_760652(), sub_75E762() - тут производится накладывание заклинаний на воговских существ (например, 1000 раундов огненного щита у пожаров) 75C96C — накладывание заклинаний волшебницами (при выстреле) 76E71F — функция блока командиров 71C710 — воговское уклонение, блок с аниманцией 86 (см. BM:V) 70AF16 — существо, нанимаемое в разрушенном замке (привидение). 4 Байта -------------------- Создатель глобального мода WoG Ultra Edition. Тема мода на разных ресурсах:
df2: https://forum.df2.ru/index.php?showtopic=38057 Основной форум: http://wforum.heroes35.net/showthread.php?tid=5571 Группа ВКонтакте: https://vk.com/club194956360 |
|
|
18 Aug 2021, 12:56
Сообщение
#156
|
|
Advanced Member Сообщений: 106 Спасибо сказали: 317 раз |
69955C - Игрок, нашедший Грааль
Код //Отрубить бонус командира Крепости (атака и защита) Magic->WriteDword(0x76C4AE, 0x76C46A); //В бою Magic->WriteByte(0x76A685, 0xEB); //В окне командира Две функции, в которых идет проверка армии героя на наличие Темных Драконов, а также специализации "Вуаль Тьмы", для последующего затемнения карты 754584 WoG_SearchFor_HidingAreaSpecialization_AndDarknessDragons_ByHero_1 7546BC WoG_SearchFor_HidingAreaSpecialization_AndDarknessDragons_ByHero_2 Само затемнение: 712589 Проверка на возможность оставить существ на КП. См. "Привидения не хотят оставаться одни" 757045 ; signed int __cdecl CheckCreatureToLeave_WoG(signed int CreatureID) Само оставление существ вместе с помещением объекта: 7570D9 Проверка на "дружественность" 7575D5 MayHeroFightWithThisMonster И еще пара полезных функций: 714913 ; signed int __cdecl DoesHeroHaveCreatures_WoG(int HeroStruct, int CreatureID) 71168D ; int __cdecl GetHeroPtr_WoG(signed int HeroID) Вдогонку: 711209 ; int __cdecl GetMapItem_WoG(int x, int y, signed int l) 7548BC ChooseArtToLeave_WoG Получение строки из главного текстовика WoG 77710B ; char *__cdecl ReadStringFromTxt(int StringID, int a2, _DWORD *a3) Благодаря этой функции и исходникам можно выйти практически на все. -------------------- Создатель глобального мода WoG Ultra Edition. Тема мода на разных ресурсах:
df2: https://forum.df2.ru/index.php?showtopic=38057 Основной форум: http://wforum.heroes35.net/showthread.php?tid=5571 Группа ВКонтакте: https://vk.com/club194956360 |
|
|
18 Aug 2021, 14:47
Сообщение
#157
|
|
Advanced Member Сообщений: 106 Спасибо сказали: 317 раз |
Еще вдогонку:
7125DB OpenArea_WoG(int x, int y, int l, int Player, int Radius) //Открытие карты Работа с текстом: 714973 ; int __cdecl GetArtName_WoG(int ArtID) 7149AF ; int __cdecl GetSpellName_WoG(int SpellID) 7149F0 ; int __cdecl GetBuildingName_WoG(signed int TownType, int BuildingID) 714A38 ; int __cdecl GetMonName_WoG(int CreatureID, int SingleOrMany) 714B05 ; int __cdecl GetSecSkillName_WoG(int SkillID) 712171 H3Str_SetNewText_WoG //Запись текста в геройскую строку -------------------- Создатель глобального мода WoG Ultra Edition. Тема мода на разных ресурсах:
df2: https://forum.df2.ru/index.php?showtopic=38057 Основной форум: http://wforum.heroes35.net/showthread.php?tid=5571 Группа ВКонтакте: https://vk.com/club194956360 |
|
|
23 Aug 2021, 15:41
Сообщение
#158
|
|
Advanced Member Сообщений: 106 Спасибо сказали: 317 раз |
Выяснил еще кое-что интересное, а именно:
В функции 440030 BattleStack_StrikeAllAround не был указан второй параметр (я рассматриваю публичную базу для IDA), но теперь он известен - это флаг атаки тремя головами. Мне нужно было вызывать эту функцию, и я, не подумав, записал во второй параметр 1, а потом ломал голову, почему урон наносится не всем врагам. Сегодня я разрешил этот вопрос, прототип функции выглядит теперь так: void __thiscall BattleStack_StrikeAllAround(_BattleStack_ *this, int ThreeHeadedAttack, int *totalDamage, int *killedCount, int fireShieldDmg); Получение структуры гекса: 715872 ; int __cdecl GetHexStruct_WoG(signed int HexID) Выбор типа атаки при клике ПКМ по защите: 7625E5 ChooseMonAttackType Артефакт Сила монстра: 760A5A DailyMonster_Art143 Артефакт Золотая стрела: 7602D3 sub_7602D3 Проверка на артефакт Сердце Дракона: 767065 HasDragoHeartArt 762BBF SendMonOfWeek - отсюда и далее идут функции отправки и получения данных для игры по сети. Сама отправка: 763166 Add2Send Получение: 763802 Get4Receive Вызов охраны Санта-гремлинов: 75CDA2 ; int __cdecl SummonSantaGuards(int BM, _DWORD *StackStruct, int StackID) Абилки Оборотня: 7673AD ; int __cdecl WereWolf(_DWORD *BattleStack_A, int BattleStack_D) Друзья, я подготовил весьма подробную базу для IDA с разобранной WoG-секцией. Когда я ее еще немного доработаю, она будет опубликована здесь. -------------------- Создатель глобального мода WoG Ultra Edition. Тема мода на разных ресурсах:
df2: https://forum.df2.ru/index.php?showtopic=38057 Основной форум: http://wforum.heroes35.net/showthread.php?tid=5571 Группа ВКонтакте: https://vk.com/club194956360 |
|
|
27 Aug 2021, 00:51
(Сообщение отредактировал Raistlin - 27 Aug 2021, 01:04)
Сообщение
#159
|
|
Advanced Member Сообщений: 106 Спасибо сказали: 317 раз |
Ну вот, это все-таки случилось, и я закончил работать над основой для базы h3era.exe.
Разобран там в основном код, связанный с битвой, но есть и другие функции. К сожалению, часть данных, связанных с картой приключений, была потеряна, но в будущем я снова разберу этот код. Сейчас на ближайшее время я остановлюсь, так что, если хотите, можете продолжить мое дело или просто помочь мне с этим, а недели через две-три, возможно снова вернусь к этому занятию. Советы и пожелания с удовольствием выслушаю. Скачать базу Кстати: Позиции командиров на поле боя: 0076B820 |. C745 E4 58000 MOV DWORD PTR SS:[LOCAL.7],58 ; 88 0076B827 |. EB 07 JMP SHORT 0076B830 0076B829 |> C745 E4 62000 MOV DWORD PTR SS:[LOCAL.7],62 ; 98 Позиции палатки от командира на поле боя: 0076B906 C745 E4 99000 MOV DWORD PTR SS:[LOCAL.7],99 ; 153 0076B90D EB 07 JMP SHORT 0076B916 0076B90F C745 E4 A9000 MOV DWORD PTR SS:[LOCAL.7],0A9 ; 169 Позиции баллисты от командира на поле боя: 0076B9F8 C745 E4 33000 MOV DWORD PTR SS:[LOCAL.7],33 ; 51 0076B9FF EB 07 JMP SHORT 0076BA08 0076BA01 C745 E4 43000 MOV DWORD PTR SS:[LOCAL.7],43 ; 67 Убрать труп с позиции: 5A7630 ; int __stdcall BattleMgr_RemoveDeadStack(_BattleGEX_ *a1, int side, int IndexOnSide) // В ИДЕ этого нет. Убрать последний труп: CALL_3(void, __stdcall, 0x5A7630, &o_BattleMgr->hex[ваш индекс], 0, 0); -------------------- Создатель глобального мода WoG Ultra Edition. Тема мода на разных ресурсах:
df2: https://forum.df2.ru/index.php?showtopic=38057 Основной форум: http://wforum.heroes35.net/showthread.php?tid=5571 Группа ВКонтакте: https://vk.com/club194956360 |
|
|
Текстовая версия | Сейчас: 28 March 2024 - 11:52 |
Copyright by Алексей Крючков
Programming by Degtyarev Dmitry |