IPB

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

8 страниц V  « < 3 4 5 6 7 > »   
Reply to this topicStart new topic
> Инженерный анализ, Reverse Engineering
tolich
сообщение 07 May 2011, 20:31
Сообщение #81

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




Цитата(MasterOfPuppets @ 07 May 2011, 13:34) *
sub_617F94 - возможно, самая частовстречающаяся функция (451 вызов). Округляет float ST0 в меньшую сторону и возвращает результат в виде integer.
Точно в меньшую? Или всё же банально в сторону нуля? Проверь на отрицательных числах, я более чем уверен, что это operator int(double).


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

Цитата
Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел.
Борис "Бонус" Репетур, "От винта!", выпуск 38.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Etoprostoya
сообщение 07 May 2011, 20:48
Сообщение #82

Etoslozhnostatus
Сообщений: 8 761
Спасибо сказали: 16432 раза




Моя ИДА распознала эту функцию как __ftol (convert float to long). tolich прав.


--------------------
- Да ну!?
- Horn of the Argali гну!


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
MasterOfPuppets
сообщение 10 Jun 2011, 14:44
Сообщение #83

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




[[0x699420]+0x132C4]
0 - человек сам управляет боем, 1 - человек нажал кнопку "Автобой" и вышел покурить.
Только чтение.


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



Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
tolich
сообщение 10 Jun 2011, 15:05
Сообщение #84

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




А разве автобой с человеком не по той же схеме считается, что и с компом? (Это я про курение, по времени он даже сигарету не достанет.)


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

Цитата
Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел.
Борис "Бонус" Репетур, "От винта!", выпуск 38.
Go to the top of the pageAdd Nick
 
+Quote Post
MasterOfPuppets
сообщение 10 Jun 2011, 15:07
Сообщение #85

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




Имеется в виду реальный бой, но в авторежиме. Когда видишь всё действия.


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



Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
tolich
сообщение 10 Jun 2011, 15:10
Сообщение #86

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




Цитата(MasterOfPuppets @ 10 Jun 2011, 15:07) *
Имеется в виду реальный бой, но в авторежиме. Когда видишь всё действия.
А, вкурил понял.


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

Цитата
Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел.
Борис "Бонус" Репетур, "От винта!", выпуск 38.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
MasterOfPuppets
сообщение 05 Jul 2011, 13:30
Сообщение #87

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




Кстати, ошибся. Установка тоже работает.


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

Go to the top of the pageAdd Nick
 
+Quote Post
Berserker
сообщение 05 Jul 2011, 14:46
Сообщение #88

Immortal
Сообщений: 1 468
Спасибо сказали: 1153 раза




Полезная штука.


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
Valery
сообщение 17 Jul 2011, 17:30
Сообщение #89

Immortal
Сообщений: 447
Спасибо сказали: 782 раза




Is there any way to remove the 48 towns limit in game/editor? Those new 252x252 maps need a lot more.


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
Sav
сообщение 11 Feb 2012, 14:50 (Сообщение отредактировал Sav - 21 Feb 2012, 00:10)
Причина редактирования: большие блоки кода вынес под спойлер
Сообщение #90

Immortal
Сообщений: 9 474
Спасибо сказали: 4198 раз




Цитата(Dead @ 05 Nov 2011, 02:55 (Сообщение отредактировал Dead - 05 Nov 2011, 03:02))
.data:00681FB2 конец тоблицы координатоф карты загадки , PuzTOWNxx.bmp, пишу адрес конца таблицы потому что неуверен нащёт начала, штота неочень там сходитса, лень проверять, порядок: например .data:00681EF4 здесь PuzEle00.bmp координаты х, 2 баита на координаты, перва идут координаты х всех рысунков , потом у ..



Цитата(Dead @ 07 Nov 2011, 02:58 (Сообщение отредактировал Dead - 07 Nov 2011, 03:02))



Цитата(feanor @ 24 Nov 2011, 19:03)
О выстрелах по стенам.


Код
CPU Disasm
Address   Hex dump          Command                                  Comments
00445AA6  |> \8B7F 34       MOV EDI,DWORD PTR DS:[EDI+34]  ;edi до этого момента - указатель на структуру стека, после - номер монстра
00445AA9  |.  8B0D 20946900 MOV ECX,DWORD PTR DS:[699420]
00445AAF  |.  83EF 5E       SUB EDI,5E                             ; Switch (cases 5E..91, 4 exits)
00445AB2  |.  74 1F         JE SHORT 00445AD3
00445AB4  |.  4F            DEC EDI
00445AB5  |.  74 15         JE SHORT 00445ACC
00445AB7  |.  83EF 32       SUB EDI,32
00445ABA  |.  75 1E         JNE SHORT 00445ADA
00445ABC  |.  8B9481 CC5300 MOV EDX,DWORD PTR DS:[EAX*4+ECX+53CC]  ; Case 91 of switch Era_1_6_exe_HD.445AAF - катапульта
00445AC3  |.  0FBE82 D30000 MOVSX EAX,BYTE PTR DS:[EDX+0D3];D3 - смещение баллистики в структуре героя
00445ACA  |.  EB 11         JMP SHORT 00445ADD
00445ACC  |>  B8 02000000   MOV EAX,2                              ; Case 5F of switch Era_1_6_exe_HD.445AAF - циклопы
00445AD1  |.  EB 0A         JMP SHORT 00445ADD
00445AD3  |>  B8 01000000   MOV EAX,1                              ; Case 5E of switch Era_1_6_exe_HD.445AAF
00445AD8  |.  EB 03         JMP SHORT 00445ADD
00445ADA  |>  8B45 08       MOV EAX,DWORD PTR SS:[ARG.1]           ; Default case of switch Era_1_6_exe_HD.445AAF


Тут добавлю немного. Если стреляющее по стене существо - не циклоп, король-циклоп, катапульта, т. е. попадает в Default case, то в качестве навыка "артиллерия" для него берётся номер атакуемого сооружения. По этому уровню навыка впоследствии, как по индексу, берётся структура параметров баллистического выстрела, которая содержит в себе количество выстрелов, шансы не промахнуться и шансы нанести урон. Если номер атакуемого сооружения > 3, то вместо всего этого будет взят мусор. Вылета это не вызовет, т. к., с одной стороны, номера атакуемых сооружений находятся в пределах двух десятков, а памяти после массива структур параметров баллистического выстрела выделено достаточно, а с другой стороны, структура параметров баллистического выстрела не содержит в себе указателей. Самое неприятное, что может случиться - большое количество выстрелов с нулевым шансом нанесения урона.



Цитата(Berserker @ 18 Dec 2011, 21:17 (Сообщение отредактировал Berserker - 18 Dec 2011, 21:04))
Обновим тень перемещения:
493350 - F (0, 1); THISCALL;

Код
!!UN:C6919200/4/?y2;
!!SN:E4797616/2/y2/0/1;
!!BU:R;


Теперь если поменять скриптом скорость монстра, можно и сеточку обновить...

Цитата
[edit]
Вычисляет ценность удара по монстру:
.text:004357E0 ; int __thiscall CombatUnk_004357E0_AI_GetRawWeightOfMonAttack(int this, _CombatMonster_ *MonStr, int monHealth, _CombatMonster_ *enemy, int enemyHealth, signed int canShoot, signed int NotRealDamage)

Последний параметр - расстояние, 0 - теоретически.



Цитата(Berserker @ 25 Dec 2011, 11:51)
IsTacticPhase: CombatManager($699420) -> $13D68
Battle stacks: CombatManager($699420) -> 21708 (1352 на отряд)
ZvsCursorLocked: $840E10
StackToStackDamageCalculation: $443C88
MM Damage trigger: $492409



Цитата(Berserker @ 07 Jan 2012, 18:26)
50b970 - чтение настроек из реестра
50b420 - настройки по умолчанию
50bfd0 - сохранить все настройки

Show Intro - 699410
Music Volume - 6987B0
Sound Volume - 6987B4
Last Music Volume - 6987B8
Last Sound Volume - 6987BC
Walk Speed - 6987AC
Computer Walk Speed - 6987A8
Show Route - 6987C4
Move Reminder - 6987C8
Quick Combat - 6987CC
Video Subtitles - 6987D0
Town Outlines - 6987D4
Animate SpellBook - 6987D8
Window Scroll Speed - 6987DC
Blackout Computer - 6987E0
First Time - 699574
Test Decomp - 699578
Test Read - 69957C
Test Blit - 699580
Bink Video - 6987F8
Unique System ID - 698838
Network Default Name - 698867
Autosave - 6987C0
Show Combat Grid - 69880C
Show Combat Mouse Hex - 698810
Combat Shade Level - 698814
Combat Army Info Level - 698818
Combat Auto Creatures - 6987E4
Combat Auto Spells - 6987E8
Combat Catapult - 6987EC
Combat Ballista - 6987F0
Combat First Aid Tent - 6987F4
Combat Speed - 69883C
Main Game Show Menu - 6987FC
Main Game X - 698800
Main Game Y - 698804
Main Game Full Screen - 698808
AppPath - 698614
CDDrive - 698888



Цитата(etoprostoya @ 07 Jan 2012, 19:10)
MoP вроде эти адреса уже указывал, по крайней мере, некоторые.



Цитата(Berserker @ 07 Jan 2012, 19:21 (Сообщение отредактировал Berserker - 07 Jan 2012, 19:39))
http://forum.df2.ru/index.php?showtopic=68...st&p=490895

Не все и без оригинальных имён в реестре. Пока у меня не было инета, находил и пепепроверял вручную в рамках переноса настроек в heroes3.ini.

Код
[Settings]
Show Intro=1
AppPath="C:\h\"
Music Volume=0
Sound Volume=0
Last Music Volume=0
Last Sound Volume=0
Walk Speed=2
Computer Walk Speed=3
Show Route=0
Move Reminder=0
Quick Combat=0
Video Subtitles=0
Town Outlines=0
Animate SpellBook=0
Window Scroll Speed=0
Bink Video=0
Blackout Computer=0
First Time=0
Test Decomp=0
Test Read=0
Test Blit=0
Unique System ID="LOVE"
Network Default Name="Player"
Autosave=0
Show Combat Grid=0
Show Combat Mouse Hex=0
Combat Shade Level=0
Combat Army Info Level=0
Combat Auto Creatures=0
Combat Auto Spells=0
Combat Catapult=0
Combat Ballista=0
Combat First Aid Tent=0
Combat Speed=0
Main Game Show Menu=0
Main Game X=0
Main Game Y=0
Main Game Full Screen=0
CDDrive="C:"
WoG_Version="3.58f, 01 November 2004"
Era Version = "2.0"



Цитата(Berserker @ 09 Jan 2012, 03:07)
int 6911880d - индекс текущего выделенного слота в окне героя или -1.
int 6916756d - 0-1 - включён ли режим разделения существ? (кнопка такая)



Цитата(Berserker @ 09 Jan 2012, 17:27)
$06775888 - Heroes Meeting, selected side (0..1) or -1
$06775890 - Heroes Meeting, selected slot or -1
$0675254C - Visiting Hero, selected slot or -2
$067525CC - Town Garrison, selected slot or -2



Цитата(Sav @ 24 Jan 2012, 20:37 (Сообщение отредактировал Sav - 24 Jan 2012, 20:42))
Код
signed int __thiscall A0_Battle_Stack_get_Speed_sub_4489F0(struct_BattleStack *this)
{
  signed int result; // eax@1
  float Speed_v2; // ST00_4@4

  result = this->Speed_dwordC4;
  if ( this->Spells_Lengths_a198[54] )          // Если наложена Медлительность...
                                                // (а иначе - просто возвращаем скорость)
  {
    if ( (this->Flags_dword84 >> 6) & 1 )       // Осадное орудие
    {
      result = 0;
    }
    else
    {
      Speed_v2 = (double)(signed int)this->Speed_dwordC4;
      result = A0_to_signed_int_sub_617F94(Speed_v2 * this->SlowSpell_Modif_dword4C8);
      if ( result <= 0 )
        result = 1;                             // Минимальная скорость при медлительности - 1
    }
  }
  return result;
}


Код
// Сравнение приоритета хода стеков (если у первого приоритетнее - возврат 1)
char __thiscall A0_Battle_CompareStacksTurnPriority_sub_464B30(int this, struct_BattleStack *Stack1, struct_BattleStack *Stack2)
{
  int MoraleFlag1_v3; // eax@1
  bool res; // eax@2
  int Type2_v5; // edx@3
  int Type1_v6; // ecx@3
  signed int Speed1_v7; // ebx@5
  signed int v8; // esi@7
  signed int v9; // esi@8
  int Owner1_v10; // eax@9
  int this_v12; // [sp+Ch] [bp-4h]@1

  this_v12 = this;
  MoraleFlag1_v3 = Stack1->Flags_dword84 >> 24;
  if ( ((_BYTE)MoraleFlag1_v3 ^ (unsigned __int8)(Stack2->Flags_dword84 >> 24)) & 1 )// В этом ходу одному и только одному из отрядов выпала мораль
  {
    LOBYTE(res) = MoraleFlag1_v3 & 1;           // Если мораль выпала первому, возвращаем 1, иначе 0
  }
  else
  {
    Type1_v6 = Stack1->CreatureType_dword34;
    Type2_v5 = Stack2->CreatureType_dword34;
    res = Type1_v6 == 149;                      // Если первый - стрелковая башня, а второй - нет, возвращаем 1, наоборот - 0
    if ( res == (Type2_v5 == 149) )             // Стрелковая башня
    {
      res = Type1_v6 == 145;                    // Аналогично с катапультой
      if ( res == (Type2_v5 == 145) )           // Катапульта
      {                                         // Одинаковы по выпавшей морали, явлении катапультой и стрелковой башней
        Speed1_v7 = A0_Battle_Stack_get_Speed_sub_4489F0(Stack1);
        if ( Speed1_v7 == A0_Battle_Stack_get_Speed_sub_4489F0(Stack2) )// Скорости равны
        {
          Owner1_v10 = Stack1->Owner_dwordF4;
          if ( Owner1_v10 == Stack2->Owner_dwordF4 )
            LOBYTE(res) = Stack1->StackNum_dwordF8 < Stack2->StackNum_dwordF8;// Если хозяева одинаковы, раньше ходит тот, у кого номер стека меньше
          else
            LOBYTE(res) = res != *(_DWORD *)(this_v12 + 78520);// res = Stack1->OwnerF4 != (this_v12 + 78520)
                                                // Последнее - сторона последнего ходившего монстра (в особых же случаях устанавливается в 1)
                                                // Т. е. больший приоритет имеет существо другого владельца, чем только что ходивший (в особых случаях - нападающего)
        }
        else
        {
          if ( *(_BYTE *)(this_v12 + 81380) )   // Фаза ожидания
          {
            v8 = A0_Battle_Stack_get_Speed_sub_4489F0(Stack1);
            LOBYTE(res) = v8 < A0_Battle_Stack_get_Speed_sub_4489F0(Stack2);// У кого меньше, тот имеет преимущество
          }
          else                                  // Не фаза ожидания
          {
            v9 = A0_Battle_Stack_get_Speed_sub_4489F0(Stack1);
            LOBYTE(res) = v9 > A0_Battle_Stack_get_Speed_sub_4489F0(Stack2);// У кого больше, тот имеет преимущество
          }
        }
      }
    }
  }
  return res;
}



Цитата(tolich @ 24 Jan 2012, 20:53)
Вот поэтому охранники снеговика, будучи замедленными, начинают двигаться.



Цитата(etoprostoya @ 24 Jan 2012, 21:03)
Цитата(Sav @ 24 Jan 2012, 20:37)
Код
signed int __thiscall A0_Battle_Stack_get_Speed_sub_4489F0(struct_BattleStack *this)
{
  this->Speed_dwordC4;
}

Для полноты кода нужно описать и структуру "this" (struct_BattleStack).

P.S. "this" кириллицей будет "ершы"! smile.gif



Цитата(Sav @ 24 Jan 2012, 21:08 (Сообщение отредактировал Sav - 24 Jan 2012, 21:09))
Всё из BM:G с минимумом правок (не уверен, что всё верно, но многое точно). Кстати, в информации по BM:G (из справки Драколича), похоже, ошибка: флаги существ - это не -71, а -69.
Если поле обозначено массивом байтов с названием f, то что там находится, мне неизвестно.

Код
struct struct_BattleStack
{
  _BYTE f0[8];
  _DWORD Visiblity_dword8;
  _BYTE fC[40];
  _DWORD CreatureType_dword34;
  _DWORD GexNum_dword38;
  _DWORD AnimNum_dword3C;
  _DWORD AnimFrameNum_dword40;
  _BYTE f44[8];
  _DWORD Count_dword4C;
  _DWORD VisibleCount_dword50;
  _DWORD LosesAfterBattle_dword54;
  _DWORD HealthLoses_dword58;
  _BYTE f5C[4];
  _DWORD Count_At_BattleStart_dword60;
  _BYTE f64[16];
  _DWORD CreatureTown_dword74;
  _BYTE f78[12];
  _DWORD Flags_dword84;
  _DWORD Creature_NameSingle_dword88;
  _DWORD Creature_NameMulti_dword8C;
  _DWORD Creature_Description_dword90;
  _BYTE f94[44];
  _DWORD Health_dwordC0;
  _DWORD Speed_dwordC4;
  _DWORD Attack_dwordC8;
  _DWORD Defense_dwordCC;
  _DWORD Damage_Min_dwordD0;
  _DWORD Damage_Max_dwordD4;
  _DWORD Ammo_dwordD8;
  _BYTE fDC[24];
  _DWORD Owner_dwordF4;
  _DWORD StackNum_dwordF8;
  _BYTE fFC[4];
  _DWORD X_Shift_dword100;
  _DWORD Y_Shift_dword104;
  _BYTE f108[68];
  _DWORD X_CountShowingRect_Shift_dword14C;
  _BYTE f150[4];
  _DWORD RandomAnim_Freq_dword154;
  _BYTE f158[12];
  _DWORD CreatureAnim_dword164;
  _DWORD CreatureBulletAnim_dword168;
  _BYTE f16C[4];
  _DWORD Move_Sound_dword170;
  _DWORD Attack_Sound_dword174;
  _DWORD Damage_Sound_dword178;
  _DWORD Shot_Sound_dword17C;
  _DWORD Death_Sound_dword180;
  _DWORD Defense_Sound_dword184;
  _BYTE f188[12];
  _DWORD ActiveSpells_CountForColor_dword194;
  _DWORD Spells_Lengths_a198[80];
  _BYTE f2D8[372];
  _DWORD ActiveSpells_dword44C;
  _BYTE f450[120];
  float SlowSpell_Modif_dword4C8;
  _BYTE f4CC[28];
  _DWORD Morale_dword4E8;
  _DWORD Luck_dword4EC;
  _BYTE f4F0[88];
};



Цитата(tolich @ 24 Jan 2012, 21:20)
Есть подозрение, что, большей частью, все неизвестные поля на самом деле те же дворды. Больно уж у них размеры кратные 4.



Цитата(feanor @ 24 Jan 2012, 22:15)
Неа, там просто компилятор сделал округление. Кое-где именно char и short, ибо в старших байтах остатки от BAADF00D видны.



Цитата(Berserker @ 24 Jan 2012, 22:29)
А чем описание от ZVS не нравится?

Код
struct _CombatMon_{  // размер 0x548
                     // +00 db (1) когда отаковал уже(?)
                     // +01 db
                     // +02 db (0C) 44188C
                     // +03 db
                     // +08 dd = полное число стеков у игрока
                     // +10 dd =-1 после атаки и/или ответа(????)
                     // +1С dd = позиция на поле боя (куда бежать/стрелять)
                     // +20 db = огненный щит
                     // +28 dd = -1 (номер стэка клона этого)  
                     // +30 db 43E33C
  int   Type;        // +34 dd = тип монстра
  int   Pos;         // +38 dd = позиция монстра на поле боя (куда атакует)
                     // +3C dd = заклинания
                     // +40 dd 43E236
                     // +44 dd (=1) сдвиг в сторону второй занятой клетки для монстра с двумя клетками
  int   MonNum;      // +4C - число монстров
                     // +50 - число монстров до удара по ним в тек. атаку
  int   LostLastHP;  // +58 - потери здоровья последнего монстра
                     // +5C - номер слота героя (0...6), -1 - будет удален после битвы
  int   MonNum0;     // +60 - число монстров в начале битвы
                     // +6C - полное здоровье (исп. как база для лечения)
                     // +70 dd 44150F 441744
                     // +74 dd -1 для продвинутых элементалей
                     // +78 dd = уровень существа (0...6)
  Dword Flags;       // +84
    // 00000001 - 0x00 DOUBLE_WIDE - занимает 2 клетки
    // 00000002 - 0x01 летает
    // 00000004 - 0x02 стреляет
    // 00000008 - 0x03 расширенный радиус атаки (на две клетки)
    // 00000010 - 0x04 живое существо (можно восстанавливаться вампиру)
    // 00000020 - 0x05 CATAPULT - может разрушать стены
    // 00000040 - 0x06 SIEGE_WEAPON - осадное оружие - не двигается (5508CB)
    // 00000080 - 0x07 KING_1
    // 00000100 - 0x08 KING_2
    // 00000200 - 0x09 KING_3
    // 00000400 - 0x0A ??? 00020000 + 40,41,83 - не чуствителен к псих атаке
    // 00000800 - 0x0B нет описания (35,74,75)
    // 00001000 - 0x0C в ближнем бою бьет как в дальнем
    // 00002000 - 0x0D ----
    // 00004000 - 0x0E ??? IMMUNE_TO_FIRE_SPELLS
    // 00008000 - 0x0F стреляет дважды
    // 00010000 - 0x10 атака без ответа
    // 00020000 - 0x11 ... не подвержен низкой морали (?)
    // 32,33,56-69,112-117,120,121,123,,125,127,129,141,145-149
    // 00040000 - 0x12 нечисть
    // 00080000 - 0x13 бьет всех врагов рядом
    // 00100000 - 0x14 расширенный радиус стреляющих юнитов
    // 00200000 - 0x15 стэк убит? 41E617 чародей,firebird - может еще кастовать?
    // 00400000 - 0x16 421BDC,421FC4 (что-то с вызовом)
    // 00800000 - 0x17 копия стэку - умирает сразу
    // 01000000 - 0x18 гарпии-ведьмы
    // 02000000 - 0x19 остался(уже) ждать СБРОСИТЬ - МОЖЕТ ЖДАТЬ СНОВА
    // 04000000 - 0x1A уст. после атаки СБРОСИТЬ - ВНОВЬ МОЖЕТ ОТАКОВАТЬ
    // 08000000 - 0x1B - выбрал защиту
    // 10000000 - 0x1C - не может быть ресуректен ???
    // 20000000 - 0x1D + 43DFAF
    // 40000000 - 0x1E + 43E06F
    // 80000000 - 0x1F дракон
//  int   FullHP;      // +B0 dd = ???
  int   HitPoints;   // +C0 dd = здоровье монстра
  int   Speed;       // +С4 dd = скорость монстра
  int   Attack;      // +C8 dd = атака с бонусами
  int   Defence;     // +CC dd = защита с бонусами
                     // +D0 dd = мин. дамэдж
                     // +D4 dd = макс. дамэдж
                     // +D8 dd = количество выстрелов
                     // +DC dd = количество заклинаний 0=нет ДЛЯ ВОСКРЕШЕНИЯ УВЕЛИЧИТЬ
                     // +E8 db =
                     // +E9 db = 1, если умирал хоть один
                     // +EA db = 1, если был убит весь стэк
                     // +EC dd = номер заклинания существа в тек раунде 0x50 Acid breath
                     // +F0 db=1 перед атакой на него 441434
                     // +F4 dd (0,1) индекс игрока 0 или 1 4414AF 443D69
                     // +F8 dd = номер стэка у стороны на поле боя
                     // +FC dd = ? что-то с магией
                     // +100 dd 43DEA4
                     // +104 dd 43DEAD
                     // +108 dd
                     // +158 dd =?
                     // +164 dd -> ctroll.def (троль)
  Byte *ShootDef;    // +168 - загруж.деф. для стреляющих (иниц в 43DA8E)
                     // +16C
                     // +194 dd = количество уже наложенных заклинаний
                     // +198 dd*? (есть заклинание (длительность) или нет по номерам)
                     //  +198 dd = Summon Boat
                     //  +19C dd = Scuttle Boat
                     //  +1A0 dd = Visions
                     //  +1A4 dd = View Earth
                     //  +1A8 dd = Disguise
                     //  +1AC dd = View Air
                     //  +1B0 dd = Fly
                     //  +1B4 dd = Water Walk
                     //  +1B8 dd = Dimension Door
                     //  +1BC dd = Town Portal

                     //  +1C0 dd = Quicksand
                     //  +1C4 dd = Land Mine
                     //  +1C8 dd = Force Field
                     //  +1CC dd = Fire Wall
                     //  +1D0 dd = Earthquake
                     //  +1D4 dd = Magic Arrow
                     //  +1D8 dd = Ice Bolt
                     //  +1DC dd = Lightning Bolt
                     //  +1E0 dd = Implosion
                     //  +1E4 dd = Chain Lightning
                     //  +1E8 dd = Frost Ring
                     //  +1EC dd = Fireball
                     //  +1F0 dd = Inferno
                     //  +1F4 dd = Meteor Shower
                     //  +1F8 dd = Death Ripple
                     //  +1FC dd = Destroy Undead
                     //  +200 dd = Armageddon
                     //  +204 dd = Shield
                     //  +208 dd = Air Shield
                     //  +20C dd = fire Shield
                     //  +210 dd = Protection from Air
                     //  +214 dd = Protection from Fire
                     //  +218 dd = Protection from Water
                     //  +21C dd = Protection from Earth
                     //  +220 dd = Anti-Magic
                     //  +224 dd = Dispel
                     //  +228 dd = Magic Mirror
                     //  +22C dd = Cure
                     //  +230 dd = Resurrection
                     //  +234 dd = Animate Dead
                     //  +238 dd = Sacrifice
                     //  +23C dd = Bless
                     //  +240 dd = Curse
                     //  +244 dd = Bloodlust
                     //  +248 dd = Precision
                     //  +24C dd = Weakness
                     //  +250 dd = Stone Skin
                     //  +254 dd = Disrupting Ray
                     //  +258 dd = Prayer
                     //  +25C dd = Mirth
                     //  +260 dd = Sorrow
                     //  +264 dd = Fortune
                     //  +268 dd = Misfortune
                     //  +26C dd = Haste
                     //  +270 dd = Slow
                     //  +274 dd = Slayer
                     //  +278 dd = Frenzy
                     //  +27C dd = Titan's Lightning Bolt
                     //  +280 dd = Counterstrike
                     //  +284 dd = Berserk
                     //  +288 dd = Hypnotize
                     //  +28C dd = Forgetfulness
                     //  +290 dd = Blind
                     //  +294 dd = Teleport
                     //  +298 dd = Remove Obstacle
                     //  +29C dd = Clone
                     //  +2A0 dd = Fire Elemental
                     //  +2A4 dd = Earth Elemental
                     //  +2A8 dd = Water Elemental
                     //  +2AC dd = Air Elemental

                     //  +2B0 dd = Stone   443D3A 43E0EB 441B0D (!= не отв. на атаку)
                     //  +2B4 dd = Poison
                     //  +2B8 dd = Bind
                     //  +2BC dd = Desease
                     //  +2C0 dd = Paralyze
                     //  +2C4 dd = Aging
                     //  +2C8 dd = Death Cloud
                     //  +2CC dd = Thunderbolt
                     //  +2D0 dd = Dispel
                     //  +2D4 dd = Death Stare
                     //  +2D8 dd = Acid Breath
                  // +2DC dd*? (сила действия заклинания)
                     //  +2DC dd = Summon Boat
                     //  +2E0 dd = Scuttle Boat
                     //  +2E4 dd = Visions
                     //  +2E8 dd = View Earth
                     //  +2EC dd = Disguise
                     //  +2F0 dd = View Air
                     //  +2F4 dd = Fly
                     //  +2F8 dd = Water Walk
                     //  +2FC dd = Dimension Door
                     //  +300 dd = Town Portal

                     //  +304 dd = Quicksand
                     //  +308 dd = Land Mine
                     //  +30C dd = Force Field
                     //  +310 dd = Fire Wall
                     //  +314 dd = Earthquake
                     //  +318 dd = Magic Arrow
                     //  +31C dd = Ice Bolt
                     //  +320 dd = Lightning Bolt
                     //  +324 dd = Implosion
                     //  +328 dd = Chain Lightning
                     //  +32C dd = Frost Ring
                     //  +330 dd = Fireball
                     //  +334 dd = Inferno
                     //  +338 dd = Meteor Shower
                     //  +33C dd = Death Ripple
                     //  +340 dd = Destroy Undead
                     //  +344 dd = Armageddon
                     //  +348 dd = Shield
                     //  +34C dd = Air Shield
                     //  +350 dd = fire Shield
                     //  +354 dd = Protection from Air
                     //  +358 dd = Protection from Fire
                     //  +35C dd = Protection from Water
                     //  +360 dd = Protection from Earth
                     //  +364 dd = Anti-Magic
                     //  +368 dd = Dispel
                     //  +36C dd = Magic Mirror
                     //  +370 dd = Cure
                     //  +374 dd = Resurrection
                     //  +378 dd = Animate Dead
                     //  +37C dd = Sacrifice
                     //  +380 dd = Bless
                     //  +384 dd = Curse
                     //  +388 dd = Bloodlust
                     //  +38C dd = Precision
                     //  +390 dd = Weakness
                     //  +394 dd = Stone Skin
                     //  +398 dd = Disrupting Ray
                     //  +39C dd = Prayer
                     //  +3A0 dd = Mirth
                     //  +3A4 dd = Sorrow
                     //  +3A8 dd = Fortune
                     //  +3AC dd = Misfortune
                     //  +3B0 dd = Haste
                     //  +3B4 dd = Slow
                     //  +3B8 dd = Slayer
                     //  +3BC dd = Frenzy
                     //  +3C0 dd = Titan's Lightning Bolt
                     //  +3C4 dd = Counterstrike
                     //  +3C8 dd = Berserk
                     //  +3CC dd = Hypnotize
                     //  +3D0 dd = Forgetfulness
                     //  +3D4 dd = Blind
                     //  +3D8 dd = Teleport
                     //  +3DC dd = Remove Obstacle
                     //  +3E0 dd = Clone
                     //  +3E4 dd = Fire Elemental
                     //  +3E8 dd = Earth Elemental
                     //  +3EC dd = Water Elemental
                     //  +3F0 dd = Air Elemental

                     //  +3F4 dd = Stone   443D3A 43E0EB 441B0D (!= не отв. на атаку)
                     //  +3F8 dd = Poison
                     //  +3FC dd = Bind
                     //  +400 dd = Desease
                     //  +404 dd = Paralyze
                     //  +408 dd = Aging
                     //  +40C dd = Death Cloud
                     //  +410 dd = Thunderbolt
                     //  +414 dd = Dispel
                     //  +418 dd = Death Stare
                     //  +41C dd = Acid Breath
                          
                     // +444 dd ->
                     // +448 dd (2)
                     // +44C dd
                     // +454 dd 441B17 (кол-во ответов на атаку 0= не отв. на атаку)
// настройка для грифонов 46D6A0
// КОЛИЧЕСТВО ОТВЕТОВ НВ АТАКУ
                     // +458 dd Bless добавка к Max. Damage
                     // +45C dd Curse убавка к Min. Damage
                     // +464 dd Bloodlast добавка к Атаке с бонусами
                     // +468 dd Precision добавка к Атаке с бонусами
                     // +48C dd KING_123 тип (1=KING_1,2=KING_2,3=KING_3)
                     //   исп для расчета Slayer. Бонус 8 к Атаке: 0x4421D2    
                     // +490 dd номер атакера по порядку??? уже атаковал??? (сбрасывается после первого удара)
                     // +494 dd кол. доп. ответов на атаку, добавленных Counerstrike заклом
                     // +4A4 dd
                     // +4C0 db Blinded - снизить защиту (сбросить после?) при атаке на него (уст. перед ударом)
                     // +4C1 db Paralized - снизить защиту (сбросить после?) при атаке на него (уст. перед ударом)
                     // +4C2 dd Forgetfulness - уровень (>2 - не может стрелять)
                     // +4DC dd = величина бонуса при выборе защиты
                     // +4E0 dd заклинание для сказ дракона
                     // +4EC dd 44152A
                     // +4F1 db 43DF88

                     // +514 dd
                     // +518 dd -> dd first \ adjusted stacks pointers
                     // +51C dd -> dd last  /

                     // +524 dd
                     // +528 dd -> dd first \ adjusted to wich stacks pointers
                     // +52C dd -> dd last  /
};



Цитата(tolich @ 24 Jan 2012, 22:34)
Это называется выравнивание данных, а не округление. Да, о нём не подумал, считал, что все нормальные программисты "#pragma pack(1)". gigi.gif



Цитата(Sav @ 24 Jan 2012, 22:36 (Сообщение отредактировал Sav - 24 Jan 2012, 22:37))
Цитата(Berserker)
А чем описание от ZVS не нравится?

Хм, я ведь даже смотрел его. smile.gif Но почему-то вовремя не вспомнилось. Ну, хотя бы что-то новое у меня есть: float SlowSpell_Modif_dword4C8. smile.gif

Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 31 Jul 2012, 15:08
Сообщение #91

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




Работа с моралью и удачей.
Наконец-то добрался до хинтов, угу, не прошло и двух лет
Код
extern int GetLuckBonus(int art, int customdata);
extern int GetMoraleBonus(int art, int customdata);
extern int GetLuckBonusFromBP(int art, int customdata);
extern int GetMoraleBonusFromBP(int art, int customdata);


int __stdcall LuckTextHook(LoHook* h, HookContext* c)
{
    HERO *hero = (HERO*)(c->ebx);

    /*char *s = "\x0AВрожденное везение +1";
    
    CALL_3(void, __thiscall, 0x41B2A0, (int*)(c->ebp-0x28), s, strlen(s));
    *(int*)(c->ebp-0x10) += 1;*/

    char buf[256];


    for (int i=0; i!=19; i++)
    {
        int l = 0;
        if(hero->IArt[i][0]!=-1 && (l=GetLuckBonus(hero->IArt[i][0],hero->IArt[i][1])))
        {
            sprintf(buf,"\x0A%s %s%i",GetArtifactRecord(hero->IArt[i][0])->name, l>0?"+":"",l);
            CALL_3(void, __thiscall, 0x41B2A0, (int*)(c->ebp-0x28), buf, strlen(buf));
            *(int*)(c->ebp-0x10) += l;
        }
    }


    for (int i=0; i!=64; i++)
    {
        int l = 0;
        if(hero->OArt[i][0]!=-1 && (l=GetLuckBonusFromBP(hero->OArt[i][0],hero->OArt[i][1])))
        {
            sprintf(buf,"\x0A%s %s%i",GetArtifactRecord(hero->OArt[i][0])->name, l>0?"+":"",l);
            CALL_3(void, __thiscall, 0x41B2A0, (int*)(c->ebp-0x28), buf, strlen(buf));
            *(int*)(c->ebp-0x10) += l;
        }
    }

    return EXEC_DEFAULT;
}


int __stdcall LuckValueHook(LoHook* h, HookContext* c)
{
    HERO *hero = (HERO*)(c->esi);
    
    for (int i=0; i!=19; i++)
    {
        int l = 0;
        if(hero->IArt[i][0]!=-1 && (l=GetLuckBonus(hero->IArt[i][0],hero->IArt[i][1])))
        {
            *(int*)(c->ebp+0x0C) += l;
        }
    }


    
    for (int i=0; i!=64; i++)
    {
        int l = 0;
        if(hero->OArt[i][0]!=-1 && (l=GetLuckBonusFromBP(hero->OArt[i][0],hero->OArt[i][1])))
        {
            *(int*)(c->ebp+0x0C) += l;
        }
    }

    return EXEC_DEFAULT;
}



int __stdcall MoraleTextHook(LoHook* h, HookContext* c)
{
    HERO *hero = (HERO*)(c->ebx);

    /*char *s = "\x0AВрожденное везение +1";
    
    CALL_3(void, __thiscall, 0x41B2A0, (int*)(c->ebp-0x28), s, strlen(s));
    *(int*)(c->ebp-0x10) += 1;*/

    char buf[256];


    for (int i=0; i!=19; i++)
    {
        int l = 0;
        if(hero->IArt[i][0]!=-1 && (l=GetMoraleBonus(hero->IArt[i][0],hero->IArt[i][1])))
        {
            sprintf(buf,"\x0A%s %s%i",GetArtifactRecord(hero->IArt[i][0])->name, l>0?"+":"",l);
            CALL_3(void, __thiscall, 0x41B2A0, (int*)(c->ebp-0x28), buf, strlen(buf));
            *(int*)(c->ebp-0x10) += l;
        }
    }

    for (int i=0; i!=64; i++)
    {
        int l = 0;
        if(hero->OArt[i][0]!=-1 && (l=GetMoraleBonusFromBP(hero->OArt[i][0],hero->OArt[i][1])))
        {
            sprintf(buf,"\x0A%s %s%i",GetArtifactRecord(hero->OArt[i][0])->name, l>0?"+":"",l);
            CALL_3(void, __thiscall, 0x41B2A0, (int*)(c->ebp-0x28), buf, strlen(buf));
            *(int*)(c->ebp-0x10) += l;
        }
    }
    return EXEC_DEFAULT;
}


int __stdcall MoraleValueHook(LoHook* h, HookContext* c)
{
    HERO *hero = (HERO*)(c->edi);
    
    for (int i=0; i!=19; i++)
    {
        int l = 0;
        if(hero->IArt[i][0]!=-1 && (l=GetMoraleBonus(hero->IArt[i][0],hero->IArt[i][1])))
        {
            *(int*)(c->ebp+0x0C) += l;
        }
    }

    for (int i=0; i!=64; i++)
    {
        int l = 0;
        if(hero->OArt[i][0]!=-1 && (l=GetMoraleBonusFromBP(hero->OArt[i][0],hero->OArt[i][1])))
        {
            *(int*)(c->ebp+0x0C) += l;
        }
    }

    return EXEC_DEFAULT;
}

...


//удача
emerald->WriteLoHook(0x4DCDA6, (void*)LuckTextHook);
emerald->WriteLoHook(0x4E3A46, (void*)LuckValueHook);

//мораль
emerald->WriteLoHook(0x4DC606, (void*)MoraleTextHook);
emerald->WriteLoHook(0x4E3C9E, (void*)MoraleValueHook);


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 14 Aug 2012, 19:31 (Сообщение отредактировал etoprostoya - 17 Aug 2012, 11:29)
Сообщение #92

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




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

Код на замену анимации нового дня/недели.



Для активации 8 слота, требует дополнительной обвязки для нормальной работы.


Для расширения таблицы препятствий




Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 04 Nov 2012, 21:02 (Сообщение отредактировал etoprostoya - 06 Nov 2012, 00:24)
Причина редактирования: уточнение
Сообщение #93

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




В рантайме же палитра {цвета игрока для интерфейса} лежит в [6AAD10]+1C, массив int16, кодирующих 32*8 цвета (rgb565, little endian)
Изменение действует сразу же.

Чо бы такого с этим сотворить..


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 18 Jan 2013, 22:34
Сообщение #94

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




О анимации почв и рек.

Как известно, вода, лава и реки в тройке анимируются древним и утраченным ныне искусством color-cycling'a, то бишь, циклической смены цветов в палитре.

Происходит оная смена в функции 0x4EDB20, char __cdecl Dlg_Redraw1(), в которой:
- для watrtl.def циклично двигаются цвета 229-240, 242-253
- для lavatl.def - 246-254
- для clrrvr.def - 183-194, 195-200
- для mudrvr.def - 183-188, 240-245
- для lavrvr.def - 240-248


Код
//----- (004EDB20) --------------------------------------------------------
char __cdecl Dlg_Redraw1()
{
  int v0; // eax@1
  int v1; // eax@5
  _Def_ *v2; // ecx@8
  _Def_ *v3; // ecx@10
  _Def_ *v4; // ecx@12
  _Def_ *v5; // ecx@14
  _Def_ *v6; // ecx@16

  LOBYTE(v0) = dword_006995C8;
  if ( !dword_006995C8 )
  {
    dword_006995C8 = 1;
    sub_0050D880((int)pMouseManager);
    if ( timeGetTime() - NextPaletteRotate >= 0 )
    {
      if ( dword_00698A68 == 1 || dword_00698A68 == 3 )
        v1 = timeGetTime() + 110;
      else
        v1 = timeGetTime() + 200;
      NextPaletteRotate = v1;
      if ( (_BYTE)TownsHallDefs_ST )
      {
        v2 = *(_Def_ **)(pAdvManager + 128);
        if ( v2 )                               // watrtl.def
        {
          Def_RotateColors(v2, 229, 240, -1);
          Def_RotateColors(*(_Def_ **)(pAdvManager + 128), 242, 253, -1);
        }
        v3 = *(_Def_ **)(pAdvManager + 124);
        if ( v3 )                               // lavatl.def
          Def_RotateColors(v3, 246, 254, -1);
        v4 = *(_Def_ **)(pAdvManager + 140);
        if ( v4 )
        {                                       // clrrvr.def
          Def_RotateColors(v4, 183, 194, -1);
          Def_RotateColors(*(_Def_ **)(pAdvManager + 140), 195, 200, -1);
        }
        v5 = *(_Def_ **)(pAdvManager + 148);
        if ( v5 )
        {                                       // mudrvr.def
          Def_RotateColors(v5, 228, 239, -1);
          Def_RotateColors(*(_Def_ **)(pAdvManager + 148), 183, 188, -1);
          Def_RotateColors(*(_Def_ **)(pAdvManager + 148), 240, 245, -1);
        }
        v6 = *(_Def_ **)(pAdvManager + 152);
        if ( v6 )                               // lavrvr.def
          Def_RotateColors(v6, 240, 248, -1);
      }
    }
    v0 = timeGetTime() - dword_006989FC[0];
    if ( v0 >= 0 )
    {
      dword_006989FC[0] = timeGetTime() + 60;
      sub_00554AA0();
      LOBYTE(v0) = MPProcessTimeAndRemind((int)&MPTimeStructure);
    }
    dword_006995C8 = 0;
  }
  return v0;
}
// 6989FC: using guessed type int dword_006989FC[2];
// 698A04: using guessed type int NextPaletteRotate;
// 698A68: using guessed type int dword_00698A68;
// 6995C8: using guessed type int dword_006995C8;

Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 05 Apr 2013, 22:32
Сообщение #95

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




Все забываю.

https://dl.dropbox.com/u/61759222/HoMM/Heroes3f.c

Декомпилировано по воговской idb-базе.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 12 Apr 2014, 00:49
Сообщение #96

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




Обновил файл на тот, что с новой базы

Чуть-чуть по отстройке.

66CF98 - SoD-таблица индексов строений в окне холла (девять массивов по восемнадцать байтовых индексов). Вог использует адрес 836A20, содержимое по которому восстанавливается после каждой загрузки игры.
Функция 460D70 берет эту таблицу за основу и делает из неё актуальную таблицу, которая потом будет в процессе работы окна холла доступна по адресу 694EC0. Если нужно её динамически менять (третий грейд двеллинга сделать, к примеру) - врезаться можно где-то после 0046102B.

Появление окна в холле не означает, что здание можно автоматически строить. Перестрах**щики из NWC запилили автоматическую выдачу масок доступности, которые исключают постройку ГМ 5 уровня в Замке, верфи в Оплоте etc. Можно убрать их через ERM CD:B0 (хотя Верфи полноценно разрешить не удастся), а можно подправить масочки по адресу 697740 (оригинал) 836AD8 (вог, опять же восстанавливается каждую загрузку).
Вообще, настройка зданий в городе (запреты, настройка точки спауна корабля, постройка зданий (в том числе и вероятностная (30% постройка второго уровня)) идет в функции 5C0CC0.
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 28 Nov 2015, 16:34 (Сообщение отредактировал feanor - 28 Nov 2015, 17:01)
Сообщение #97

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




всяческие неупомянутые вещи из геймменеджера

Окно свойств карты:
[0x699538]+1F6D0 - 8 байт, описывающие наличие или отсутствие игрока при старте карты. -1 - нету.
[0x699538]+1F864 - 8 байт, тип бонуса (00 - золото, 01 - арт, 02 - ресурс).
[0x699538]+1F6B0 - 8 dword, описывающих типы фракций на карте. 00..08 - фракции
[0x699538]+1F844 - 8 dword, стартовые герои
+1F6A8 - гандикапы?

[0x699538]+1FB40 - указатель на имя карты
[0x699538]+1FB50 - указатель на описание карты

ну и разное прочее
+1F875 - 8 байт под команды игроков, например, 00 01 02 03 04 05 06 07 - для всех против всех.
+1F636 - 8 байт, потерпел ли игрок поражение


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
igrik
сообщение 14 Jan 2016, 15:31 (Сообщение отредактировал igrik - 14 Jan 2016, 15:31)
Сообщение #98

Immortal
Сообщений: 589
Спасибо сказали: 891 раз




Многие зашитые абилки существ
by Hawaiing
; -----------------------------------------------------
some of creature magic immunitie in the following table

table address = 0079fed0 (begin with 16#)
NO.=immunitie(creatureID)
0=16#Dwarf/133#
1=17#Battle Dwarf
2=26#Green Dragon/82#Red Dragon/132#Azure Dragon
3=27#Gold Dragon
4=83#Black Dragon/121#
5=112#/127#
6=113#/125#
7=115#/123#
8=NONE

troglidite
(immune blind)
0044A28A - 83 f8 46 - cmp eax,46
0044A28D - 0f 84 0e 01 00 00 - je 0044a3a1
0044A293 - 83 f8 47 - cmp eax,47
0044A296 - 0f 84 05 01 00 00 - je 0044a3a1
(immune stone)
0044A3CA - 83 f8 46 - cmp eax,46
0044A3CD - 74 05 - je 0044a3d4
0044A3CF - 83 f8 47 - cmp eax,47
0044A3D2 - 75 42 - jne 0044a416

; -----------------------------------------------------
the "spell effect" ability depend on a table list.
00440228 - 8b 46 34 - mov eax,[esi+34]
0044022B - 83 c0 ea - add eax,ea #begin with 22
0044022E - 83 f8 af - cmp eax,af
00440231 - 77 7b - ja 004402ae
00440233 - 33 c9 - xor ecx,ecx
00440235 - 8a 88 e0 fc 79 00 - mov cl,[eax+0079fce0] #0079fce0->table list
0044023B - ff 24 8d 94 fd 79 00 - jmp dword ptr [ecx*4+0079fd94] #case_address

TABALE LIST:
79FCE0 00 00 01 01 09 09 09 09 09 09 09 09 09 09 09 09 [22-37]22=Dendroid Guard (<22# is not support)
79FCF0 09 09 09 09 09 09 09 09 09 09 09 09 09 09 09 09 [38-53]
79FD00 09 09 09 09 09 02 09 09 09 09 09 09 03 03 09 04 [54-69]
79FD10 09 09 09 09 09 09 05 05 09 09 09 06 09 09 09 09 [70-85]
79FD20 09 09 09 09 09 09 09 09 09 09 09 09 09 09 09 09 [86-101]
79FD30 09 09 09 09 05 05 09 07 09 09 09 09 09 09 09 09 [102-117]
79FD40 09 09 09 09 09 09 09 09 09 09 09 09 09 09 09 09 [118-133]
79FD50 09 08 09 09 09 09 09 03 09 09 09 09 09 09 09 09 [134-149]
79FD60 09 01 09 05 04 09 09 08 09 09 09 09 09 09 09 09 [150-165]
79FD70 09 09 09 09 09 09 09 09 06 06 06 06 06 06 06 06 [166-181]
79FD80 06 06 06 06 06 06 06 06 06 06 09 09 09 09 09 09 [182-197]

0=Bind
1=Blind
2=Disease
3=Curse
4=Age
5=Stone
6=Paralyze
7=Poison
8=Acid Breath
9=NONE

; -----------------------------------------------------
By the way, the "attack effect" also a tale list.
(address 79FC50 and begin with 63#Vampire Lord)

0=Vampire ability
1=Thunderbird ability
2=Death Stare
3=Dragon Fly ability
4=Rust Dragon ability
5=NONE


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


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 20 Mar 2016, 12:47
Сообщение #99

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







Код
int __stdcall ReadAdditionalFields(LoHook* h, HookContext* c)
{
    _CreatureInfo_* target = (_CreatureInfo_*)(c->esi);
    //char** fields = (char**)*(int*)(c->ebx+4);

     target->town = atoi(*(const char **)(*(int *)(c->ebx + 4) + 96));
    target->level = atoi(*(const char **)(*(int *)(c->ebx + 4) + 100));

    target->flags = 0;
    for(int i = 0; i!=32; i++)
        if ( (*(char **)(*(int *)(c->ebx + 4) + 104 + i * 4))[0] !=0  )
            target->flags |= 1 << i;

    return EXEC_DEFAULT;
}

*(int*) 0x47ABC6 = (int)"zcrtrait.txt";
patcher->WriteLoHook(0x47B035, (void*)ReadAdditionalFields);


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 21 Mar 2016, 23:28
Сообщение #100

Immortal
Сообщений: 798
Спасибо сказали: 556 раз




Кто-нибудь знает, как в Тройке определить, что игра идёт (загружена карта приключений, а не, скажем, мы ещё/уже в меню)?
Go to the top of the pageAdd Nick
 
+Quote Post

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

 



Текстовая версия Сейчас: 6 May 2026 - 15:13
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика