IPB

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

8 страниц V  « < 6 7 8  
Reply to this topicStart new topic
> Инженерный анализ, Reverse Engineering
Sadness
сообщение 08 Jan 2020, 10:46
Сообщение #141

Legendary lover
Сообщений: 628
Спасибо сказали: 307 раз




Всем привет.

Мне казалось, я где-то видел аналогичную тему с адресами в SoD.
Могу ошибаться, конечно, но если такая тема есть - ткните, пожалуйста. smile2.gif


--------------------
...and the music change my life
Go to the top of the pageAdd Nick
 
+Quote Post
Richter
сообщение 13 Oct 2020, 07:53 (Сообщение отредактировал Richter - 13 Oct 2020, 07:54)
Сообщение #142

collector of time
Сообщений: 159
Спасибо сказали: 73 раза




Всем привет) Выкладываю полезную Heroes3f.idb штуку для мододелов. Раньше была на сайте, сейчас не смог найти. Случайно наткнулся при чистке диска. Думаю будет полезна.


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Raistlin
сообщение 19 Dec 2020, 16:29 (Сообщение отредактировал Raistlin - 15 Feb 2021, 16:52)
Сообщение #143

Advanced Member
Сообщений: 106
Спасибо сказали: 317 раз




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

Регенерация существ

Цитата(major @ 15 Nov 2007, 20:27) *
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% вероятность)
Цитата(major @ 15 Nov 2007, 20:27) *
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)
Цитата(major @ 15 Nov 2007, 20:27) *
002F55BC BA 32000000 MOV EDX,32

Актуальный адрес (проверено на Эре):
0075DE5B BA 32000000 MOV EDX,32


Атака с возвращением

Цитата(major @ 15 Nov 2007, 20:27) *
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)


Для выбора режима нападения после нажатия правой кнопкой на защите (атаковать и вернуться или атаковать и остаться там)

Цитата(major @ 15 Nov 2007, 20:27) *
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


Возрождение фениксов

Цитата(major @ 15 Nov 2007, 20:27) *
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

Тут идет проверка на четырех неулучшенных элементалей, однако, что за ней следует, я не смотрел. Если вдруг кто-то знает, прошу поделиться, а то любопытно =).gif

Кстати, можете пожалуйста помочь отключить следующее оповещение?



--------------------
Создатель глобального мода WoG Ultra Edition. Тема мода на разных ресурсах:
df2: https://forum.df2.ru/index.php?showtopic=38057
Основной форум: http://wforum.heroes35.net/showthread.php?tid=5571
Группа ВКонтакте: https://vk.com/club194956360


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Raistlin
сообщение 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


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Raistlin
сообщение 21 Dec 2020, 22:06
Сообщение #145

Advanced Member
Сообщений: 106
Спасибо сказали: 317 раз




Ну что же, раз уж я начал тему абилок, то почему бы не продолжить. 0=).gif В принципе, мне даже понравилось искать адреса) За окном давно стемнело, а я тут сижу за компьютером и уписываю йогурт... В общем, самое время поковырять любимую игру lol.gif

Бесстрашие

Цитата(major @ 01 Jul 2008, 16:57) *
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).


Страх

Цитата(major @ 01 Jul 2008, 16:57) *
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 ошибся, и Страхом по факту обладают все командиры. Нужно это для того, чтобы они могли получить эту способность в будущем.


Цитата(major @ 01 Jul 2008, 16:57) *
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


Магическое зеркало

Цитата(major @ 01 Jul 2008, 17:30) *
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 - Сказочный дракон


Атака огненным шаром

Цитата(major @ 01 Jul 2008, 17:30) *
0003F72C 83F8 2D CMP EAX,2D
0003F72F 0F85 EA020000 JNZ 0003FA1F

Актуальные адреса (проверено на Эре):
0043F72C 83F8 2D CMP EAX,2D
0043F72F 0F85 EA020000 JNE 0043FA1F
2Dh = 45 - Магог


Атака облаком смерти

Цитата(major @ 01 Jul 2008, 17:30) *
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


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Raistlin
сообщение 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 и в нужный момент использовать их вместо стандартных, можно создать свои форматы карты wink.gif


--------------------
Создатель глобального мода WoG Ultra Edition. Тема мода на разных ресурсах:
df2: https://forum.df2.ru/index.php?showtopic=38057
Основной форум: http://wforum.heroes35.net/showthread.php?tid=5571
Группа ВКонтакте: https://vk.com/club194956360


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Raistlin
сообщение 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


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Raistlin
сообщение 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


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Raistlin
сообщение 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


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
XEPOMAHT
сообщение 03 Mar 2021, 09:40 (Сообщение отредактировал XEPOMAHT - 03 Mar 2021, 09:45)
Сообщение #150

---------------------- New_Life_of_Heroes ----------------------
Сообщений: 226
Спасибо сказали: 345 раз




Цитата(Raistlin @ 02 Mar 2021, 22:24) *
Код
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+


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
hippocamus
сообщение 04 Mar 2021, 00:34
Сообщение #151

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




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

А так-то можно моповские файлы взять, WERD, там очень много чего уже есть готового.


--------------------
Давший быка на убой не выпросил и печень на жаркое.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
XEPOMAHT
сообщение 04 Mar 2021, 09:46
Сообщение #152

---------------------- New_Life_of_Heroes ----------------------
Сообщений: 226
Спасибо сказали: 345 раз




Цитата(hippocamus @ 04 Mar 2021, 00:34) *
Да пусть человек исследует. Одна голова хорошо, а две - лучше.
Что-то он сделает оптимальнее, чем было до него.


Считаю, что лучше не исследовать с 0 то, что уже было не плохо кем-то исследовано, а выбирать то, что ещё почти не исследовалось, чтобы не идти по спирали и не повторять то, что уже было лет 5-10-15 назад.

Цитата(hippocamus @ 04 Mar 2021, 00:34) *
А так-то можно моповские файлы взять, WERD, там очень много чего уже есть готового.


Да, только код из WERD написан под MoP, поэтому под ERA его приходится почти всегда переписывать. Почти всё встраивается или когда-нибудь будет встроено непосредственно в exe-файл, поэтому моповский код с каждым годом всё дальше и дальше уходит от SoD/WoG TE, лет через 5 возможно получится уже ассемблерный аналог VCMI, т.к. может выйти так, что будет сменён весь игровой код от SoD. Поэтому лучше всё же публиковать что-то из IDA-базы от Третьих Героев, нежели из самих модов.


--------------------
WoG + MoP + HoA + Forge + Bastion = ERA+


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Raistlin
сообщение 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
Go to the top of the pageAdd Nick
 
+Quote Post
Raistlin
сообщение 12 Jul 2021, 13:26
Сообщение #154

Advanced Member
Сообщений: 106
Спасибо сказали: 317 раз




Лютый разврат, господа biggrin.gif

Код
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);


Для самых немагических замков на свете biggrin.gif
У Кремля, к слову, задумывалось всего два уровня, так что пусть будет - мало ли...

Ну а для трехэтажки хук нужно ставить в 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


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Raistlin
сообщение 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


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Raistlin
сообщение 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


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Raistlin
сообщение 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


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Raistlin
сообщение 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


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Raistlin
сообщение 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
Go to the top of the pageAdd Nick
 
+Quote Post

8 страниц V  « < 6 7 8
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



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