Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
07 May 2011, 20:31
Сообщение
#81
|
|
![]() 😸🧡✊✌️ Сообщений: 16 605 Спасибо сказали: 3590 раз |
sub_617F94 - возможно, самая частовстречающаяся функция (451 вызов). Округляет float ST0 в меньшую сторону и возвращает результат в виде integer. Точно в меньшую? Или всё же банально в сторону нуля? Проверь на отрицательных числах, я более чем уверен, что это operator int(double).-------------------- Я слежу за тобой!
tolic.narod.ru![]() Цитата Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел. Борис "Бонус" Репетур, "От винта!", выпуск 38. |
|
|
|
07 May 2011, 20:48
Сообщение
#82
|
|
![]() Etoslozhnostatus Сообщений: 8 761 Спасибо сказали: 16432 раза |
Моя ИДА распознала эту функцию как __ftol (convert float to long). tolich прав.
-------------------- - Да ну!?
- Horn of the Argali гну! |
|
|
|
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 |
|
|
|
10 Jun 2011, 15:05
Сообщение
#84
|
|
![]() 😸🧡✊✌️ Сообщений: 16 605 Спасибо сказали: 3590 раз |
А разве автобой с человеком не по той же схеме считается, что и с компом? (Это я про курение, по времени он даже сигарету не достанет.)
-------------------- Я слежу за тобой!
tolic.narod.ru![]() Цитата Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел. Борис "Бонус" Репетур, "От винта!", выпуск 38. |
|
|
|
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 |
|
|
|
10 Jun 2011, 15:10
Сообщение
#86
|
|
![]() 😸🧡✊✌️ Сообщений: 16 605 Спасибо сказали: 3590 раз |
Имеется в виду реальный бой, но в авторежиме. Когда видишь всё действия. А, -------------------- Я слежу за тобой!
tolic.narod.ru![]() Цитата Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел. Борис "Бонус" Репетур, "От винта!", выпуск 38. |
|
|
|
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 |
|
|
|
05 Jul 2011, 14:46
Сообщение
#88
|
|
![]() Immortal Сообщений: 1 468 Спасибо сказали: 1153 раза |
Полезная штука.
-------------------- |
|
|
|
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.
-------------------- |
|
|
|
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" кириллицей будет "ершы"! ![]() ![]() Цитата(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)". Цитата(Sav @ 24 Jan 2012, 22:36 (Сообщение отредактировал Sav - 24 Jan 2012, 22:37)) Цитата(Berserker) А чем описание от ZVS не нравится? Хм, я ведь даже смотрел его. |
|
|
|
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); |
|
|
|
14 Aug 2012, 19:31
(Сообщение отредактировал etoprostoya - 17 Aug 2012, 11:29)
Сообщение
#92
|
|
![]() laughed as one fey Сообщений: 12 167 Спасибо сказали: 20610 раз |
Всякие мелочи, которые я возможно допилю до инструментов в ближайшие дни.
Код на замену анимации нового дня/недели. Для активации 8 слота, требует дополнительной обвязки для нормальной работы. Для расширения таблицы препятствий |
|
|
|
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)
Изменение действует сразу же. Чо бы такого с этим сотворить.. |
|
|
|
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; Спасибо сказали: |
|
|
|
05 Apr 2013, 22:32
Сообщение
#95
|
|
![]() laughed as one fey Сообщений: 12 167 Спасибо сказали: 20610 раз |
Все забываю.
https://dl.dropbox.com/u/61759222/HoMM/Heroes3f.c Декомпилировано по воговской idb-базе. |
|
|
|
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. Спасибо сказали: |
|
|
|
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 байт, потерпел ли игрок поражение |
|
|
|
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 -------------------- |
|
|
|
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); |
|
|
|
21 Mar 2016, 23:28
Сообщение
#100
|
|
|
Immortal Сообщений: 798 Спасибо сказали: 556 раз |
Кто-нибудь знает, как в Тройке определить, что игра идёт (загружена карта приключений, а не, скажем, мы ещё/уже в меню)?
|
|
|
|
![]() ![]() |
| Текстовая версия | Сейчас: 6 May 2026 - 15:13 |
|
Copyright by Алексей Крючков
Programming by Degtyarev Dmitry |
|