Полные исходники проекта WoG - Berserker - 11.01.2012 17:28
Исходники Вога
Автор проекта WoG Слава Сальников и лидер CoreWoG команды Corwin дали согласие на публикацию исходников общественности, за что им большое спасибо. Теперь каждый модостроитель или энтузиаст может использовать функции, адреса, структуры данных и другую полезную информацию по игре.
Скачать: Исходники WoG 3.58f
Скачать: База HoMM3 и IDA_7
Скачать: База Редактора карт
Скачать: OB:C (by Миханик)
edit by igrik (14.03.2020)
RE: Полные исходники проекта WoG - Sav - 11.01.2012 17:53
Ого. Неожиданно. Спасибо большое ZVS, CoreWoG и тебе!
RE: Полные исходники проекта WoG - FallenAngel - 11.01.2012 18:27
А сюрпризы продолжаются...
RE: Полные исходники проекта WoG - Berserker - 11.01.2012 18:38
Да не за что, но больше всего это заслуга автора, за то что дал добро, при условии, что согласится Корвин, и Корвина, за то, что адекватно воспринимает нужды сообщества.
RE: Полные исходники проекта WoG - baratorch - 13.01.2012 13:12
давно пора! )
спасибо
RE: Полные исходники проекта WoG - totkotoriy - 19.01.2012 23:17
Зачем они согласились? Щас опять работы прибавиться на пол года как минимум.
И еще прошу прощения за резкие высказывания на счет ВОГа Корвину пол года назад... я не знал что он делал ВОГ... хочу сказать, что все мои замечания это таки мелочи на фоне ограмных новых возможностей... Придется опять лезть в CPP, с которым обращаюсь методом тыка - хочу все-таки пару вещей поменять .
RE: Полные исходники проекта WoG - Sav - 20.01.2012 00:41
Мне кажется, методом тыка вряд ли получится что-то поменять. Надо конкретно изучать исходники, с дизассемблером под рукой.
RE: Полные исходники проекта WoG - totkotoriy - 20.01.2012 05:46
(20.01.2012 00:41)Sav Wrote: Мне кажется, методом тыка вряд ли получится что-то поменять. Надо конкретно изучать исходники, с дизассемблером под рукой.
Не знаю я практически все в программировании делаю методом тыка, и ведь получается же...
RE: Полные исходники проекта WoG - Flashback - 20.01.2012 07:06
А что ты хочешь поменять? Тебе что ли ЕРМа мало?
RE: Полные исходники проекта WoG - totkotoriy - 20.01.2012 07:58
(20.01.2012 07:06)Flashback Wrote: А что ты хочешь поменять? Тебе что ли ЕРМа мало?
Поменять некоторые абилки существ и командиров, и может что ещё...
RE: Полные исходники проекта WoG - Sav - 20.01.2012 09:05
Ну, если это "поменять местами", то метод тыка может помочь. Иначе - вряд ли.
База для IDA и исходники последней Славиной версии ВоГа - GrayFace - 17.06.2012 13:37
У меня пока не получилось заняться ВоГом, чтобы довести до ума и выложить в опен-сорс, но базу для IDA давно можно было выложить: https://dl.dropbox.com/u/44735333/wog/Heroes3f.rar
Это база, начатая Славой, и продолженная мной.
Еще здесь я почему-то не нашел тему с исходниками версии 3.59 от Славы, 2006 года, вот они: http://wogarchive.ru/file.php?id=189
Моя база для редактора карт: https://tools.hmm35.ru/soft/h3maped%20IDA%20database%20by%20GrayFace.rar
RE: База для IDA и исходники последней Славиной версии ВоГа - Berserker - 17.06.2012 15:46
И на дф2 тема умерла после обвала форума. Спасибо. Базу тоже постараюсь на вог-архив залить.
RE: База для IDA и исходники последней Славиной версии ВоГа - Sav - 17.06.2012 16:23
А что такое "Ref" в структурах?
Например тут:
PHP Code:
#pragma pack(push, 1) struct _Vector_ { int Ref; int p; int End; int MemEnd; }; #pragma pack(pop)
Или тут:
PHP Code:
#pragma pack(push, 1) struct _MainStruct_ { ... char Towns_Ref; char gap_21611[3]; _TownSetup_ *Towns; int Towns_End; int Towns_MemEnd; ... } #pragma pack(pop)
Или название поля дано от балды?
RE: База для IDA и исходники последней Славиной версии ВоГа - Berserker - 17.06.2012 16:55
Указатель, ссылка. Скорее всего номер или ID. Reference - обращение.
RE: База для IDA и исходники последней Славиной версии ВоГа - Sav - 17.06.2012 17:04
Проблема в том, что в этих полях хранится какая-то фигня, которая инициализируется неинициализированной стековой переменной (т. е. мусором) и потом нигде не используется.
Они есть у таких полей, как строки, списки и т. п., т. е., грубо говоря, у контейнеров.
RE: База для IDA и исходники последней Славиной версии ВоГа - etoprostoya - 17.06.2012 18:39
Поле Ref обычно является счётчиком обращений к какому-либо массиву данных, но только если в той же структуре (классе) есть указатель на этот массив, иначе Ref просто не имеет смысла. Конструктор класса обнуляет эту переменную, функции копирования увеличивают её на единицу, а деструкторы уменьшают на единицу и, если поле равно нулю, удаляют массив.
RE: База для IDA и исходники последней Славиной версии ВоГа - Berserker - 17.06.2012 19:21
Это RefCount.
RE: База для IDA и исходники последней Славиной версии ВоГа - etoprostoya - 17.06.2012 19:27
>>Это RefCount.
Ты возразил или согласился?
RE: База для IDA и исходники последней Славиной версии ВоГа - Berserker - 17.06.2012 19:29
То, что ты описал - это RefCount, а что ZVS назвал - хз )
RE: База для IDA и исходники последней Славиной версии ВоГа - NIKr0m@nceR - 17.06.2012 20:18
тема с исходниками тут есть, на 2й страничке же.
http://wforum.heroes35.net/showthread.php?tid=3549
moderator Wrote:темы объединены
RE: База для IDA и исходники последней Славиной версии ВоГа - GrayFace - 17.06.2012 23:03
В векторе это счетчик ссылок, по идее. Towns_Ref - не знаю. Обновил базу. Добавил базу редактора.
RE: База для IDA и исходники последней Славиной версии ВоГа - baratorch - 10.08.2013 18:15
Огромное спасибо!
RE: База для IDA и исходники последней Славиной версии ВоГа - RoseKavalier - 27.06.2017 07:00
(17.06.2012 13:37)GrayFace Wrote: У меня пока не получилось заняться ВоГом, чтобы довести до ума и выложить в опен-сорс, но базу для IDA давно можно было выложить: https://dl.dropbox.com/u/44735333/wog/Heroes3f.rar
Это база, начатая Славой, и продолженная мной.
Еще здесь я почему-то не нашел тему с исходниками версии 3.59 от Славы, 2006 года, вот они: http://wogarchive.ru/file.php?id=189
Моя база для редактора карт: https://dl.dropboxusercontent.com/u/44735333/wog/h3maped.rar
Links are not working ... does anyone have mirror or backup ?
Ссылки не работают ... есть ли у кого-нибудь зеркало или резервное копирование?
RE: База для IDA и исходники последней Славиной версии ВоГа - igrik - 27.06.2017 11:19
Скачать: База HoMM3 + IDA 7
Справка по OB:C от Миханика: Скачать
(04.10.2019 19:53)Berserker Wrote: igrik, я хочу твой... базу IDA ...
Моя база IDA, основанная на базе sergroj, но уже хорошенько перелопаченная, хотя ещё и не достаточно. Скачать (в txt)
Внутри сама база и торрент файл на ИДУ 7-й версии (база откроется только в 7 версии)
RE: Ваши вопросы по ERM-скриптам - XEPOMAHT - 07.10.2019 13:02
(07.10.2019 11:46)igrik Wrote: Моя база IDA, основанная на базе sergroj, но уже хорошенько перелопаченная, хотя ещё и не достаточно.
А структуры данных от туда можно выгрузить в txt? (Феанор как-то выгружал и выкладывал, но там, увы, всё скромно. Особенно очень мало информации о combatManager-е и структуре гекса на поле боя).
RE: Ваши вопросы по ERM-скриптам - Berserker - 07.10.2019 14:54
igrik, большое тебе нечеловеческое спасибо. А HexRays внутри идёт?
RE: Ваши вопросы по ERM-скриптам - igrik - 07.10.2019 15:02
(07.10.2019 14:54)Berserker Wrote: igrik, большое тебе нечеловеческое спасибо. А HexRays внутри идёт?
Да, идет.
(07.10.2019 13:02)XEPOMAHT Wrote: А структуры данных от туда можно выгрузить в txt? (Феанор как-то выгружал и выкладывал, но там, увы, всё скромно. Особенно очень мало информации о combatManager-е и структуре гекса на поле боя).
Наверное можно выгрузить. Но как - я не знаю. Нужно спросить у Феанора.
Вот данные из заголовочников by RoseKavalier
PHP Code:
// * the manager of the battlefield struct H3CombatManager : public H3Manager { protected: h3unk _f_0038[4]; public: // * +3C // * see BATTLE_ACTION INT32 action;
enum BATTLE_ACTION { BA_CANCEL, //0 = Cancel Action(the stack can do a different action now but it may still be impossible to force it to do most actions through ERM). BA_CAST_SPELL, //1 = Hero casts a spell BA_WALK, BA_DEFEND, BA_RETREAT, BA_SURRENDER, BA_WALK_ATTACK, BA_SHOOT, BA_WAIT, BA_CATAPULT, BA_MONSTER_SPELL, BA_FIRST_AID_TENT, BA_NOTHING //12 = No action(can be to disable stack for this round) };
// * +40 INT32 actionParameter; // * +44 INT32 actionTarget; // * +48 INT32 actionParameter2; // * +4C INT8 accessibleSquares[187]; // * +107 INT8 accessibleSquares2[187]; protected: h3unk _f_01C2[2]; public: // * +1C4 H3CombatSquare squares[187]; // * +5394 INT32 landType; protected: h3unk _f_5398[12]; public: // * +53A4 INT32 siegeKind; // * +53A8 INT32 hasMoat; protected: h3unk _f_53AC[4]; public: // * +53B0 H3LoadedPCX16 *drawBuffer; protected: h3unk _f_53B4[4]; public: // * +53B8 BOOL doNotDrawShade; // * +53BC // * H3MapItem where combat is taking place H3MapItem *mapitem; // * +53C0 // * special terrain type used INT32 specialTerrain; // * +53C4 BOOL antiMagicGarrison; // * +53C8 // * town structure where combat is taking place H3Town *town; // * +53CC // * hero structures from each side H3Hero *hero[2]; // * +53D4 // * spell power from each side INT32 heroSpellPower[2]; protected: h3unk _f_53DC[8]; // * +53E4 UINT32 HeroAnimation[2]; // * +53EC UINT32 HeroAnimationCadre[2]; h3unk _f_53F4[16]; // * +5404 H3LoadedDEF *heroDefLoaded[2]; // * +540C H3LoadedDEF *heroFlagLoaded[2]; // * +5414 INT32 heroFlagFrame[2]; // * +541C RECT heroUpdateRect[2]; // * +543C RECT heroFlagUpdateRect[2]; // * +545C // * eagle eye 2x vector H3Vector<INT32> eagleEyeSpells[2]; // * chain lightning? h3unk _f_547C[40]; public: // * +54A4 UINT8 isNotAI[2]; // * +54A6 UINT8 isHuman[2]; // * +54A8 INT32 heroOwner[2]; // * +54B0 BOOL8 artifactAutoCast[2]; protected: h3unk _f_54B2[2]; public: // * +54B4 BOOL heroCasted[2]; // * +54BC INT32 heroMonCount[2]; // * +54C4 H3Army *army[2]; // * +54CC // * a two-sided array of 21 stacks for each side of combat H3CombatMonster stacks[2][21]; protected: h3unk _f_1329C[4]; public: // * +132A0 INT32 turnsSinceLastEnchanterCast[2]; protected: h3unk _f_132A8[16]; public: // * +132B8 INT32 currentMonSide; // * +132BC INT32 currentMonIndex; // * +132C0 INT32 currentActiveSide; // * +132C4 INT32 autoCombat; // * +132C8 H3CombatMonster *activeStack; // * +132CC INT8 blueHighlight; protected: h3unk _f_132CD[3]; public: // * +132D0 INT32 creature_at_mouse_pos; // * +132D4 INT32 mouse_coord; // * +132D8 INT32 attacker_coord; // * +132DC // * the icons of CRCOMBAT.def, see H3MouseManager::H3MouseBattleFieldCursorType INT32 move_type; protected: h3unk _f_132E0[20]; public: // * +132F4 INT32 siegeKind2; // * +132F8 BOOL finished; // * +132FC struct H3Dlg *dlg; protected: h3unk _f_13300[356]; // * +13464 PCHAR backgroundPcxName; // * +13468 //INT16 AdjascentSquares[1122]; public: H3AdjacentSquares adjacentSquares[187]; protected: h3unk _f_13D2C[12]; // * +132E8 RECT updateRect; h3unk _f_13D48[12]; // * +13D54 INT cmNumWinPcxLoaded; public: // * +13D58 // * information about obstacles on battlefield H3Vector<H3Obstacle> obstacleInfo; // * +13D68 BOOL tacticsPhase; // * +13D6C INT32 turn; // * +13D70 INT32 tacticsDifference; protected: h3unk _f_13D74[4]; // spell related? // * +13D78 TownTowerLoaded Towers[3]; public: // * +13DE4 INT32 waitPhase; protected: // * +13DE8 INT32 HeroDAttack; // * +13DEC INT32 HeroDDefence; // * +13DF0 INT32 HeroDSpellPower2; // * +13DF4 INT32 HeroDSpellPoints; // * +13DF8 INT32 TownPicturesLoaded[90]; public: // * +13F60 // * hit points of town walls INT32 fort_walls_hp[18]; // * +13FA8 INT32 fort_walls_alive[18]; protected: UINT8 f13FF0[4]; public: // * +13FF4 // * pcx of grids H3LoadedPCX *CCellGrdPcx; // * +13FF8 // * pcx to shade in blue using cheat menu H3LoadedPCX *CCellShdPcx; protected: // * +13FFC INT32 GlobalCardeIndex; h3unk _f_14000[268]; public: // functions void SimulateMouseAtHex(int hex_id) { return THISCALL_2(void, 0x477550, this, hex_id); } BOOL8 CanCastSpellAtCoord(int spell_id, int spell_expertise, int coordinates) { return THISCALL_7(BOOL8, 0x5A3CD0, this, spell_id, spell_expertise, coordinates, currentActiveSide, 1, 0); } void WinBattle(void) { return THISCALL_2(void, 0x468F80, this, 1 - currentActiveSide); } void LoadSpell(INT32 spell_id) { return THISCALL_3(void, 0x59EF60, this, spell_id, 0); } void CastSpell(int spell_id, int hex_ix, int cast_type_012, int hex2_ix, int skill_level, int spell_power) { THISCALL_7(void, 0x5A0140, this, spell_id, hex_ix, cast_type_012, hex2_ix, skill_level, spell_power); } H3CombatMonster *GetResurrectionTarget(INT32 coordinate) { return THISCALL_4(H3CombatMonster*, 0x5A3FD0, this, currentActiveSide, coordinate, 0); } H3CombatMonster *GetAnimateDeadTarget(INT32 coordinate) { return THISCALL_3(H3CombatMonster*, 0x5A4260, this, currentActiveSide, coordinate); } int NextCreatureToMove(void) { return THISCALL_2(int, 0x464C60, this, 1); } BOOL8 IsHiddenBattle(void) { return THISCALL_1(BOOL8, 0x46A080, this); } BOOL8 IsBattleOver(void) { return THISCALL_1(BOOL8, 0x46A080, this); } void Refresh() { Refresh(1, 0, 1); } void Refresh(BOOL redrawScreen, INT timeDelay, BOOL redrawBackground) { THISCALL_7(void, 0x493FC0, this, redrawScreen, 0, 0, timeDelay, redrawBackground, 0); } void ShadeSquare(int index); };
PHP Code:
// * data for a single battlefield square struct H3CombatSquare { // * +0 // * pixel position on screen INT16 x; // * +2 // * pixel position on screen INT16 y; // * +4 // * pixel position on screen INT16 left; // * +6 // * pixel position on screen INT16 top; // * +8 // * pixel position on screen INT16 right; // * +A // * pixel position on screen INT16 bottom; h3unk _f_0C[4]; // * +10 UINT8 obstacleBits; UINT8 _f_11[3]; // * +14 INT32 obstacleIndex; // * +18 // * the side of stack on this square INT8 stackSide; // * +19 // * the index of stack on this square INT8 stackIndex; // * +1A // * true if a wide creature is here BOOL8 twoHexMonsterSquare; h3unk _f_1B; // * +1C INT32 deadStacksNumber; // * +20 INT8 DeadStackSide[14]; // * +2E INT8 DeadStackIndex[14]; // * +3C h3unk _f_3C[14]; // * +4A INT8 AvailableForLeftSquare; // * +4B INT8 AvailableForRightSquare; h3unk _f_4C[32]; h3unk _f_6C[4];
H3CombatMonster *GetMonster() { return THISCALL_1(H3CombatMonster*, 0x4E7230, this); } };
RE: Ваши вопросы по ERM-скриптам - feanor - 07.10.2019 17:19
Quote:Наверное можно выгрузить. Но как - я не знаю. Нужно спросить у Феанора.
в шестой иде Produce C file и Produce C headers, кажется.
Позже посмотрю.
RE: База для IDA и исходники последней Славиной версии ВоГа - Berserker - 14.03.2020 17:50
feanor Wrote:А для редактора карт ни у кого не осталось?
Первый пост обновлён со ссылкой на БД редактора карт.
RE: Разные вопросы - XEPOMAHT - 17.07.2020 16:51
(17.07.2020 16:12)Bes Wrote: может кто выложить на форуме структуру героя
Code:
struct _Hero_{
Word x; // +00 dw = x position
Word y; // +02 dw = y position
Word l; // +04 dw = ? уровень старшая часть y (y<<2>>C)
Byte Visible; // +06 db = 1 - есть на карте (внутри города или не активен)
// Byte _u1[17];
// +07 db - x
// +08 db - (?) мусор (к x)
// +09 db - y
// +0A db - l(?) мусор (к y)
Dword PlMapItem; // MixedPos
// +0B db - (?) l
Byte _u1;
// +0C dd - тип объекта на котором герой стоял
long PlOType; // dd +1E с карты
// +10 db - бит занятости во флагах поверхности 00001000
// это бит означающий, что здесь есть/была точка входа (желтая клетка)
Dword Pl0Cflag;
// +14 dd - SetUp с карты
Dword PlSetUp; // dd +0 с карты
Word SpPoints; // +18 dw = баллы заклинаний
int Number; // +1A dd = номер подтипа (конкретный герой)
Dword _unk_Id; // +1E dd = Id (при чём тут Id???)
char Owner; // +22 db = нозяин (цвет)
char Name[13]; //* +23 db*D = имя,0
long Spec; // +30 dd = str[8] str=(*[67CD08])[номер подтипа *5C]
Byte Pic; //* +34 db = номер картинки
// dw +35 ???
// dw +41 ???
// db +43 0
Byte _u2[15];
// +3E db -??? 4E3BB5 - used in luck calculation
Byte x0; // +44 db = базовый x для обегания (FF-не ограничен)
Byte y0; // +45 db = базовый y для обегания (FF-не ограничен)
Byte Run; // +46 db = радиус обегания (FF-не ограничен)
Byte _u3; // +47 db = ???
Byte Flags; // +48 8*bb (463253)
// 01 - тип группировки юнитов
// 02 - разрешена тактика для героя
int Movement0;// +49 dd = полное перемещение начальное
int Movement; //* +4D dd = оставшиеся перемещения
Dword Exp; //* +51 dd = опыт
Word ExpLevel; //* +55 dw = уровень
// Dword VStones; // +57 32 камня (1-посещен,2-нет)
// Dword VMTower; // +5B Башня Мардетто
// Dword VGarden; // +5F сад откровения
// Dword VMCamp; // +63 лагерь наемников
// Dword VSAxis; // +67 звездное колесо
// Dword VKTree; // +6B дерево знаний
// Dword VUniver; // +6F университет
// Dword VArena; // +73 арена
// Dword VSMagic; // +77 школа магов
// Dword VSWar; // +7B школа войны
Dword Visited[10];
Byte _u4[18]; // +7F
int Ct[7]; // +91 dd*7 = тип существ (-1 - нет)
int Cn[7]; // +AD dd*7 = количество
Byte SSkill[28];// +C9 db*1C = уровень 2-х скилов (один байт - уровень этого номера скила 1,2,3) 0-нет
// C9=Pathfinding CA=Archery CB=Logistics CC=Scouting CD=Diplomacy CE=Navigation CF=Leadership
// D0=Wisdom D1=Mysticism D2=Luck D3=Ballistics D4=Eagle Eye D5=Necromancy D6=Estates D7=Fire Magic
// D8=Air Magic D9=Water Magic DA=Earth Magic DB=Scholar DC=Tactics DD=Artillery DE=Learning DF=Offence
// E0=Armorer E1=Intelligence E2=Sorcery E3=Resistance E4=First Aid
Byte SShow[28]; // +E5 db*1C = порядок отображения 2-х скилов в окне героя (1,2,3,4,5,6)
Dword SSNum; // +101 dd = количество 2-х скилов
// Word RefData1; // +105 4814D3+...
// Word RefData2; // +107 4DA466
Dword TempMod; // +105 временные модификаторы
// нач. иниц. при найме 0xFFF9FFFF
// 00000002 = конющня 3.59 ERM
// 00000008 = лебединое озеро swan pond 3.59 ERM
// 00000020 = (???) фонтан удачи fountain of fortune 3.59 ERM
// 00000080 = оазис
// 00002000 = домик фей
// 00040000 = в лодке на воде
// 00200000 = -3morale в вариор томб
// 00400000 = Give Maximum Luck
// 00800000 = Give Maximum Moral
// 38000000 = конкретный тип фонтана удачи
Byte _u6[9]; // +109
Dword _u7; // +112
char DMorale; // +116 модификаторы морали (накапливаются)
Byte _u60[3];
char DMorale1; // +11A модиф морали (оазис)
char DLuck; // +11B модиф удачи до след битвы
Byte _u6a[17];
int IArt[19][2]; //+12D dd*2*13h = артифакты dd-номер,dd-номер закла(или -1) (книга 3,FF)
Byte FreeAddSlots; //+1C5 количество пустых доп. слотов слева
char LockedSlot[14]; //+1C6
int OArt[64][2]; //+1D4 dd*2*40 = арт в рюкзаке dd-номер, dd-номер закла(или -1)
Byte OANum; // +3D4 db = число артифактов в рюкзаке
Dword Sex; // +3D5 dd = пол
Byte fl_B; // +3D9 db = есть биография
// char *Bibl; // +3DA dd -> биография
// Byte _u7[12]; // +3DE
Dword _5b; // +3DA
_AMes_ Bibl; // +3DE
Byte Spell[70]; // +3EA db*46 = заклинание (есть/нет)
Byte LSpell[70];// +430 db*46 = уровень заклинания (>=1)
char PSkill[4]; // +476 db*4 = первичные навыки
Byte _u8[24];
};
edited by igrik
Code:
NOALIGN struct _Hero_: _Struct_
{
_int16_ x; // +0
_int16_ y; // +2
_int16_ z; // +4
_byte_ visible; // +6
_dword_ mui_xyz; // +7
_byte_ miu_is; // +11
// miu = map_item under hero
_dword_ miu_object_type; // +12
_dword_ miu_object_c_flag; // +16
_dword_ miu_UnderHero; // +20
_word_ spell_points; // +24
_dword_ id; // +26
_dword_ id_wtf; // +30
_int8_ owner_id; // +34
_char_ name[13]; // +35
_dword_ _class; // +48
_byte_ pic; // +52
_dword_ targetX; // +53
_dword_ targetY; // +57
_dword_ targetZ; // +61
_word_ last_magic_school_level; // +65
_byte_ target_is_critical; // +67
_byte_ patrol_x; // +68
_byte_ patrol_y; // +69
_byte_ patrolRadius; // +70
_byte_ facing; // +71
_byte_ flags; // +72
_dword_ movement_max; // +73
_dword_ movement_curr; // +77
_dword_ expa; // +81
_word_ level; // +85
_dword_ visited[10]; // +87 (0-learningStones, 1-marlettoTower, 2-gardenRevelation, 3-mercenaryCamp, 4-starAxis, 5-treeKnowldge, 6-libraryEnlightenment, 7-arena, 8-schoolMagic, 9-schoolWar)
_dword_ shrineFlags[4]; // +127
_byte_ levelSeed; // +143
_byte_ lastWisdom; // +144
_Army_ army; // +145
_byte_ second_skill[28]; // +201
_byte_ second_skill_show[28]; // +229 // secSkillPosition[28]
_dword_ second_skill_count; // +257
_dword_ temp_mod_flags; // + 261
// _HeroFlags_ temp_mod_flags; // + 261
float turnExperienceToRVRatio; // +265
_byte_ dd_cast_this_turn; // +269
_int32_ disguise_cast_power; // +270
_int32_ fly_cast_power; // +274
_int32_ waterwalk_cast_power; // +278
_byte_ moraleBonus; // +282
_byte_ luckBonus; // +283
_byte_ is_sleeping; // +284
_int32_ bounty; // +285
_byte_ TownSpecialGrantedMask[8]; // +289 std::bitset<48> TownSpecialGrantedMask;
_int32_ VisionsPower; // +297
_Artifact_ doll_art[19]; // +301
_byte_ free_add_slots; // +453
_byte_ locked_slot[14]; // +454
_Artifact_ backpack_art[64]; // +468
_byte_ backpack_arts_count; // +980
_dword_ female; // +981
_bool8_ is_castom_biography; // +985
_HStringF_ biography; // +986 std::string biography;
_byte_ spells_spellbook[70]; // +1002
_byte_ spells_available[70]; // +1072
_byte_ primary_skill[4]; // +1142
_int32_ aggression; // +1146
_int32_ value_of_power; // +1150
_int32_ value_of_duration; // +1154
_int32_ value_of_knowledge; // +1158
_int32_ value_of_spring; // +1162
_int32_ value_of_well; // +1166
Code:
// * Hero structure on the adventure map
struct H3Hero
{
// * +0
INT16 x;
// * +2
INT16 y;
// * +4
INT16 z;
// * +6
// * used when the current hero is active and appears on H3MapItem
BOOL8 isVisible;
// * +7
// * used to show / hide active hero
H3Position mixedPosition;
// * +B
// * true if there is an object below the hero
BOOL8 objectBelow;
// * +C
// * the type of H3MapItem under hero
INT32 objectTypeUnder;
protected:
// * +10
// * ??? related to H3MapItem under hero
UINT32 _flag;
public:
// * +14
// * setup of H3MapItem under the hero
UINT32 objectBelowSetup;
// * +18
// * the number of spellpoints
INT16 spellPoints;
public:
// * +1A
// * 0~156, has to match class, cannot be used to change specialty
INT32 id;
protected:
h3unk _f_1E[4]; // set at 4D8DB1, unknown
public:
// * +22
// * 0 ~ 7 Red ~ Pink
INT8 owner;
// * +23
// * the hero's name
CHAR name[13];
// * +30
// * 0 ~ 0x11 Knight ~ Elementalist
// * 0x12 boat sprite no class - can't navigate water (more sprites after but can crash)
INT32 hero_class;
// * +34
// * the id of the hero's portrait, 0 ~ 156
UINT8 picture;
// * +35
// * the planned x destination
INT32 dest_x;
// * +39
// * the planned y destination
INT32 dest_y;
// * +3D
// * the planned z destination
INT32 dest_z;
protected:
h3unk _f_41[3];
public:
// * +44
// * starting x position
UINT8 patrol_x;
// * +45
// * starting y position
UINT8 patrol_y;
// * +46
// * the radius for patrolling, -1 means no range limit
UINT8 patrolRadius;
protected:
h3unk _u3; // +47 = ???
UINT8 _flags; // +48 = ???
public:
// * +49
// * the maximum movement points of the hero on a given turn
INT32 maxMovement;
// * +4D
// * the remaining movement points of the hero on a given turn
INT32 movement;
// * +51
// * the current experience of the hero
INT32 experience;
// * +55
// * the current level of the hero
INT16 level;
protected:
// * +57
// * bitfields of 32 visited object types per hero
H3Bitfield learningStones;
// * +5B
// * bitfields of 32 visited object types per hero
H3Bitfield marlettoTower;
// * +5F
// * bitfields of 32 visited object types per hero
H3Bitfield gardenRevelation;
// * +63
// * bitfields of 32 visited object types per hero
H3Bitfield mercenaryCamp;
// * +67
// * bitfields of 32 visited object types per hero
H3Bitfield starAxis;
// * +6B
// * bitfields of 32 visited object types per hero
H3Bitfield treeKnowldge;
// * +6F
// * bitfields of 32 visited object types per hero
H3Bitfield libraryEnlightenment;
// * +73
// * bitfields of 32 visited object types per hero
H3Bitfield arena;
// * +77
// * bitfields of 32 visited object types per hero
H3Bitfield schoolMagic;
// * +7B
// * bitfields of 32 visited object types per hero
H3Bitfield schoolWar;
UINT8 _7F[16];
public:
// * +8F
// * the seed for skill tree, 1~255
UINT8 levelSeed; // +8F
protected:
UINT8 _f90;
public:
// * +91
// * the creatures of the hero
H3Army army;
// * +C9
// * the level of each secondary skill
INT8 secSkill[28];
// * +E5
// * the order in which to display SSkills (1,2,3,...)
INT8 secSkillPosition[28];
// * +101
// * the number of secondary skills the hero has
INT32 secSkillCount;
// * +105
// * temporary hero flags
H3HeroFlags flags;
protected:
UINT8 _u6[4]; // +109
public:
// * +10D
// * the number of times dimension door was cast this day
INT8 dimDoorCastCount; // +10D
// * +10E
// * the spell expertise of disguise that was cast
INT32 disguisePower; // +10E
// * +112
// * the spell expertise of fly that was cast
INT32 flyPower; // +112
// * +116
// * the spell expertise of waterwalk that was cast
INT32 waterwalkPower; // +116
protected:
INT8 _DMorale1; // +11A ???
INT8 _DLuck; // +11B
INT8 isSleeping; // +11C
UINT8 _u7[12]; // 11D
INT32 visionPower; // +129
public:
// * +12D
// * the 19 artifacts on a hero
H3Artifact bodyArtifacts[19];
protected:
// * +1C5
// * ?
UINT8 freeAddSlots;
public:
// * +1C6
// * whether an artifact slot is blocked or not
UINT8 blockedArtifacts[14];
// * +1D4
// * the 64 artifacts in the backpack
H3Artifact backpackArtifacts[64];
// * +3D1
// * the number of artifacts in the backpack
UINT8 backpackCount;
// * +3D5
// * male or female
INT32 gender;
// * +3D9
// * has custom bibliography?
BOOL8 customBiblio;
// * +3DA
// * custom bibliography
H3String bibliography;
// * +3EA
// * Spells the hero has learned
INT8 learned_spell[70];
// * +430
// * Spells the hero has access to through artifacts
INT8 available_spell[70];
// * +476
// * the four primary skills, attack, defense, spell power, knowledge
INT8 primarySkill[4];
protected:
// * +47A
// * AI stuff
UINT8 _u8[24];
Code:
struct _Hero_
Word X ; 00
Word Y ; 02
Word L ; 04
Byte Visible ; 06 1 - есть на карте (внутри города или не активен)
Dword MapItemXYZ ; 07 mui_xyz - used to show / hide active hero
Byte objectBelow ; 0B true if there is an object below the hero
Dword Тип_объекта_в_котором_стоит_герой ; 0C miu_object_type
Dword Маска_доступа ; 10 miu_object_c_flag (бит 10h - вход)
Dword Контрольное_слово_объекта_в_котором_стоит_герой; 14 miu_setup
Word Баллы_заклинаний ; 18 spell_points
Dword Номер ; 1A id
Dword Индекс ; 1E hero_code
Byte Хозяин ; 22 owner_id
Char Имя, 13 ; 23 name[13]
Dword Класс ; 30 class
Byte Номер_портрета ; 34 pic
Dword dest_x ; 35 aim_x - the planned x destination - targetX
Dword dest_y ; 39 aim_y - the planned y destination - targetY
Word dest_z ; 3D aim_z - the planned z destination - targetZ
Word last_magic_school_level ; 3F last_magic_school_level - Последний из уровней, на переходе на который предложили магию стихии
db ?,?,? ; 41 target_is_critical
Byte patrol_x ; 44 starting x position
Byte patrol_y ; 45 starting y position
Byte patrolRadius ; 46 the radius for patrolling, -1 means no range limit
Byte facing ; 47
Byte formation ; 48 flags
Dword Полные_MovePoints ; 49 movement_points_max - maxMobility
Dword Оставшиеся_MovePoints ; 4D movement_points - currMobility
Dword Опыт ; 51 expa - experience
Word Уровень ; 55 level
Dword Биты_посещённости_Камней_Знаний ; 57 visited.learningStones - TrainingGroundFlags
Dword Биты_посещённости_Башен_Марлетто ; 5B visited.marlettoTower - DefenseTowerFlags
Dword Биты_посещённости_Садов_Откровения ; 5F visited.gardenRevelation - GardenOfRevelationFlags
Dword Биты_посещённости_Лагерей_Наёмников ; 63 visited.mercenaryCamp - MercCampFlags
Dword Биты_посещённости_Звёздных_Колёс ; 67 visited.starAxis - starAxisFlags
Dword Биты_посещённости_Древ_Знаний ; 6B visited.treeKnowldge - treeOfKnowledgeFlags
Dword Биты_посещённости_Библиотек_Просвещения ; 6F visited.libraryEnlightenment - libraryOfEnlightmentFlags
Dword Биты_посещённости_Арен ; 73 visited.arena - ArenaFlags
Dword Биты_посещённости_Школ_Магии ; 77 visited.schoolMagic - MagicSchoolFlags
Dword Биты_посещённости_Школ_Войны ; 7B visited.schoolWar - WarSchoolFlags
Dword Биты_посещённости_Колизеев_Магов ; 7F UniversityFlags
Dword Биты_посещённости_Беседки ; 83 Shrine1Flags
Dword Биты_посещённости_Толкователя_Снов ; 87 Shrine2Flags
Dword Биты_посещённости_Лачуги_Отшельника ; 8B Shrine3Flags
Byte random_number_for_level_up_seed ; 8F iLevelSeed
Byte last_wisdom_level ; 90 lastWisdom - Последний из уровней, на переходе на который предложили мудрость
Dword Тип_существ_в_слоте_0 ; 91 heroArmy
Dword Тип_существ_в_слоте_1
Dword Тип_существ_в_слоте_2
Dword Тип_существ_в_слоте_3
Dword Тип_существ_в_слоте_4
Dword Тип_существ_в_слоте_5
Dword Тип_существ_в_слоте_6
Dword Количество_существ_в_слоте_0
Dword Количество_существ_в_слоте_1
Dword Количество_существ_в_слоте_2
Dword Количество_существ_в_слоте_3
Dword Количество_существ_в_слоте_4
Dword Количество_существ_в_слоте_5
Dword Количество_существ_в_слоте_6
Byte Уровень_Поиска_Пути ; C9 second_skill[28] - SSLevel[28]
Byte Уровень_Меткости ; CA
Byte Уровень_Логистики ; CB
Byte Уровень_Разведки ; CC
Byte Уровень_Дипломатии ; CD
Byte Уровень_Навигации ; CE
Byte Уровень_Лидерства ; CF
Byte Уровень_Мудрости ; D0
Byte Уровень_Мистицизма ; D1
Byte Уровень_Удачи ; D2
Byte Уровень_Осадное_дело ; D3
Byte Уровень_Зоркости ; D4
Byte Уровень_Некромантии ; D5
Byte Уровень_Имущества ; D6
Byte Уровень_Магии_Огня ; D7
Byte Уровень_Магии_Воздуха ; D8
Byte Уровень_Магии_Воды ; D9
Byte Уровень_Магии_Земли ; DA
Byte Уровень_Грамотности ; DB
Byte Уровень_Тактики ; DC
Byte Уровень_Артиллерии ; DD
Byte Уровень_Обучаемости ; DE
Byte Уровень_Нападения ; DF
Byte Уровень_Обороны ; E0
Byte Уровень_Интеллекта ; E1
Byte Уровень_Волшебства ; E2
Byte Уровень_Сопротивления ; E3
Byte Уровень_Первой_Помощи ; E4
Порядок_отображения_вторичных_навыков db 28 dup (?) ;E5 second_skill_show[28] - SSOrder[28]
Dword Количество_вторичных_навыков ; 101 second_skill_count - numSSs
Dword Временные_модификаторы ; 105 temp_mod_flags (HE:R7) - flags
dd ? ; 109 turnExperienceToRVRatio
Byte dimDoorCastCount ; 10D dWalkSpellsCast - the number of times dimension door was cast this day
Dword disguisePower ; 10E disguiseLevel - the spell expertise of disguise that was cast
Dword flyPower ; 112 flightLevel - the spell expertise of fly that was cast
Dword waterwalkPower ; 116 waterWalkPower - the spell expertise of waterwalk that was cast
Byte Мораль_до_следующей_битвы ; 11A d_morale_1 - moraleBonus
Byte Удача_до_следующей_битвы ; 11B d_luck_1 - luckBonus
Byte isSleeping ; 11C IsSleeping
dd ? ; 11D bounty
dd ? ; 121 std::bitset<48> TownSpecialGrantedMask
dd ?
Dword visionPower ; 129 visionsPower
Dword Артефакт_в_слоте_головы ; 12D doll_art[19] - type_artifact equipped[19]
Dword CustomData_в_слоте_головы
Dword Артефакт_в_слоте_плеч
Dword CustomData_в_слоте_плеч
dd ?; слот амулет
dd ?
dd ?; слот оружия
dd ?
dd ?; слот щит
dd ?
dd ?; слот доспех
dd ?
Dword Артефакт_в_слоте_правого_кольца
Dword CustomData_в_слоте_правого_кольца
Dword Артефакт_в_слоте_левого_кольца
Dword CustomData_в_слоте_левого_кольца
Dword Артефакт_в_слоте_ног
Dword CustomData_в_слоте_ног
Dword Артефакт_в_слоте_разного_1
Dword CustomData_в_слоте_разного_1
Dword Артефакт_в_слоте_разного_2
Dword CustomData_в_слоте_разного_2
Dword Артефакт_в_слоте_разного_3
Dword CustomData_в_слоте_разного_3
Dword Артефакт_в_слоте_разного_4
Dword CustomData_в_слоте_разного_4
Dword Артефакт_в_слоте_Баллисты
Dword CustomData_в_слоте_Баллисты
Dword Артефакт_в_слоте_Подводы
Dword CustomData_в_слоте_Подводы
Dword Артефакт_в_слоте_Палатки
Dword CustomData_в_слоте_Палатки
Dword Артефакт_в_слоте_Катапульты
Dword CustomData_в_слоте_Катапульты
Dword Артефакт_в_слоте_Книги
Dword CustomData_в_слоте_Книги
Dword Артефакт_в_слоте_разного_5
Dword CustomData_в_слоте_разного_5
Byte Количество_пустых_доп_слотов_слева ; 1C5 freeAddSlots
Маска_заблокированных_слотов db 14 dup (?) ; 1C6 locked_slot[14] - whether an artifact slot is blocked or not
Артефакты_рюкзака dd 64*2 dup (?) ; 1D4 type_artifact artifacts[64] - the 64 artifacts in the backpack
Byte Количество_артефактов_в_рюкзаке ; 3D4 backpackArtsAmount - the number of artifacts in the backpack
Dword Пол ; 3D5 gender - female
Byte Есть_пользовательская_биография ; 3D9 has_biography - bioCustomized
Dword Биография_строка ; 3DA std::string biography
Dword Биография_строка_ ; 3DE
Dword Биография_строка__ ; 3E2
Dword Биография_строка___ ; 3E6
Заклинания_в_книге_магии db 70 dup (?) ; 3EA available_spells_in_spellbook[70]
Заклинания_от_артов db 70 dup (?) ; 430 available_spells_with_arts[70]
Byte Атака ; 476 primarySkill[4]
Byte Защита ; 477
Byte Колдовская_Сила ; 478
Byte Знание ; 479
db 24 dup (?) ; 47A aggression
ends
Попросили выложить сюда и структуру стека - выкладываю.
Code:
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 /
};
Code:
bm+54CC Монстры (42 штуки) (см. _CombatMon_)
размер 548h
+00 db (1) когда отаковал уже(?)
+01 db
+02 db (0C) 44188C
+03 db
+08 dd = полное число стеков у игрока
+08 db = Видимость существа (4 - виден, 8 - не виден)
Комментарий DracoLich'а: Отряды теряют невидимость при любом действии на поле боя. Но ее межно восстановить в триггере !?BG1 - ShadowTheAge
// +10 dd =-1 после атаки и/или ответа(????)
// +1С dd = позиция на поле боя (куда бежать/стрелять)
// +20 db = огненный щит
+10 dd = ? (-1 когда существо может атаковать стены замка и курсор над стеной, когда курсор над клеткой)
+14 dd = ? (255 когда существо может атаковать стены замка и курсор над стеной)
+20 db = Анимация закла показывается на этом монстре
+21 db = В движении??
+24 dd = ?
+28 dd = Номер стека-клона
+2C dd = ?
// +30 db 43E33C
+30 dd? = Есть ли цифры количества существ? 0-есть, 1-нет.
Комментарий DracoLich'а: отряд не имеет обозначения кол-ва существ, пока не походит. При этом на него можно колдовать магию и бить. Кол-во показывается при щелчке правой кнопки в нижнем правом углу картинки (где обычно, в общем). Аналогичное возражение - ShadowTheAge
+34 dd = Тип существа
Комментарий DracoLich'а: параметры отряда становятся как у существа, номер которого поставлен, но сразу же снижаются до стандартных параметров сущ-ва, которое меняют. имя отряда в меню при щелчке правой кнопкой по существу меняется; когда его бьют - имя остается измененным. когда битва окончена - на картинке будет показан настроенный отряд, а не старый. Если изменить тип существа, битву становится невозможно выиграть (вроде как комп требует убить того, на кого нападал, и изменения типа существ = вызову изменнного существа). Действительно проблема, делающая параметр почти бесполезным - ShadowTheAge
+38 dd = Позиция существа (если сменить, на старом месте останется стоять копия. Копия не может ходить и быть атакованой, занимает место)
+3C dd = Номер анимации
Комментарий DracoLich'а: при значение 2,6,9... (много еще где) игра выдает черный экран; кадры берутся в том порядке, как и при создании (надо бы найти хелп по дефмейкеру, где описан каждый шаг, и выдрать оттуда). Не сталкивался почему-то... - ShadowTheAge
+40 dd = Номер кадра в анимации
Анимация возвращается к нормальной, если навести мышкой
// +44 dd (=1) сторона сдвига второй занятой клетки для монстра с двумя клетками
+48 dd = ?
+4C dd = Количество существ
+50 dd = Число монстров до удара по ним в тек. атаку. Количество существ для отображения (может не совпадать с количеством. В этом случае написано будет одно, а реально другое). По умолчанию -1 - значит "полностью совпадает с реальным".
Комментарий DracoLich'а: после того, как любое сущ-во попадет под атаку, данному значению станет равно количество реальное; в итогах битвы показывается реальное количество убитых; при атаке измененного существа фантомные монстры не учитываются (т.е. если изменить 10 монстров на 100 этой командой, то урон будет нанесен именно этим 10). Поступаем как и с невидимостью - ShadowTheAge
+54 dd = безвозвратные потери. Количество существ после выигранной битвы (или после откупа) равно "текущее количество существ" минус "безвозвратные потери". Потери могут быть записаны в безвозвратные при использовании, например, после воскрешения на уровне none или basic. - by Demiurg
+58 dd = Разница между текущим здоровьем и полным. Если 0 значит стек здоров.
+5C dd = номер слота героя (0...6), -1 - будет удален после битвы
+60 dd = Количество существ в начале боя
+64 dd = ?
+68 dd = ?
+6C dd = полное здоровье (исп. как база для лечения)
+70 dd = выпала удача
+74 dd = Город-владелец
+78 dd = Уровень существа
+7C dd = У ShadowTheAge тут флаги существа
+80 dd = ?
+84 dd = Флаги существа (BM:F)
+88 dd = Название существа
+8C dd = Название существа (множественное число)
+90 dd = Строка состояния (например "Нет штрафа рукопашной")
+C0 dd = Здоровье (полное)
+C4 dd = Скорость
+C8 dd = Атака
+CC dd = Защита
+D0 dd = Мин. урон
+D4 dd = Макс. урон
+D8 dd = Боезапас
+DC dd = Casts left
+E0 dd = ?
+E4 dd = ?
+E8 dd = ? монстра нужно ударить Fire Shield'ом
+E9 db = 1, если хоть раз монстра били
+EA db = 1, если умирал хоть один
+EB db = ? (возможно, 1, если был убит весь стэк)
// +EC dd = номер заклинания существа в тек раунде 0x50 Acid breath
// +F0 db=1 перед атакой на него 441434, 44016F
+F4 dd = Сторона (BM:I)
+F8 dd = Номер стэка у стороны на поле боя
// +FC dd = ? что-то с магией
+100 dd = Смещение существа по Y
+104 dd = Смещение существа по X
От того места где должен быть. В пикселях
+14C dd = Смещение по оси OX прямоугольника с количеством существ.
+150 dd = ?
+154 dd = Частота проигрывания случайной анимации.
Чем меньше тем чаще. Поставьте 200, будет без перерыва
+158 dd = ?
+15C dd = ?
+160 dd = ?
+164 dd = Анимация существа (загруженный def?)
+168 dd = Анимация снаряда (загруженный def?)
+16C dd = ?
+170 dd = Звук перемещения (загруженный wav?)
+174 dd = Звук атаки (загруженный wav?)
+178 dd = Звук урона (загруженный wav?)
+17C dd = Звук выстрела (загруженный wav?)
+180 dd = Звук смерти (загруженный wav?)
+184 dd = Звук защиты (загруженный wav?)
+188 dd = ?
+18C dd = ?
+190 dd = ?
+194 dd = Кол-во активных заклинаний (для отображения цвета кол-ва существ)
+198 dd*51h = Spells duration (81 spell)
+2DC dd*51h = Spells level (81 spell)
+420 dd = ?
+44C dd = Кол-во активных заклинаний (Для отображения при щелчке правой кнопкой)
+454 dd = Number of retaliations
+458 dd Bless добавка к Max. Damage
+45C dd Curse убавка к Min. Damage
+460 dd AntiMagicEffect
+464 dd Bloodlust добавка к Атаке с бонусами
+468 dd Precision добавка к Атаке с бонусами
+46C dd WeaknessAddedEffect
+470 dd StoneSkinAddedBonus
+478 dd PrayerAddedBonus
+47C dd MirthEffect
+480 dd SorrowEffect
+484 dd FortuneEffect
+488 dd MisfortuneEffect
+48C dd KING_123 тип (1=KING_1, 2=KING_2, 3=KING_3) исп для расчета Slayer. Бонус 8 к Атаке: 0x4421D2
+490 dd Кол-во пройденных клеток до удара
+494 dd кол. доп. ответов на атаку, добавленных Counerstrike заклом
+49C float = BlindCounterattackDamageMul
+4A0 float = Fire Shield multiplier
+4A8 float = ProtAirMul
+4AC float = ProtFireMul
+4B0 float = ProtWaterMul
+4B4 float = ProtEarthMul
+4B8 float = ShieldMul
+4BC float = AirShieldMul
+4C0 db Blinded - снизить дамаг удара при оживании (сбросить после?) при атаке на него (уст. перед ударом)
+4C1 db Paralized - снизить дамаг удара при оживании (сбросить после?) при атаке на него (уст. перед ударом)
+4C4 dd = forgetfulness level (>2 - не может стрелять)
+4C8 float = slow multiplier
+4CC dd = HasteAddedBonus (вычитается из скорости при снятии)
+4D0 dd = DeseaseAddedEffect_Defence
+4D4 dd = DeseaseAddedEffect_Attack
// +4DC dd = величина бонуса при выборе защиты
// +4E0 dd заклинание для сказ дракона
+4E4 dd = MagicMirrorEffect
+4E8 dd = Мораль существа
+4EC dd = Удача существа (44152A)
Комментарий Demiurg'а: Мораль и удача пересчитывается при передаче хода другому существу. Поэтому полезно только для получения или проверки. Если очень нужно менять то можно делать это или перед атакой, или каждый ход - ShadowTheAge
// +4F1 db 43DF88
+508 dd = используется при снятии корней Дендроидов
+50C dd = используется при снятии корней Дендроидов
// +514 dd
// +518 dd -> dd first \ adjusted stacks pointers
// +51C dd -> dd last /
// +524 dd
// +528 dd -> dd first \ adjusted to wich stacks pointers (used when Hypnotize is removed)
// +52C dd -> dd last /
edited by igrik
Code:
NOALIGN struct _BattleStack_ : _Struct_ // размер 0x548 = 1352 байта
{
_byte_ bShowAttackFrames; // +0
_byte_ bShowRangeFrames; // +1
_byte_ iShowAttackFrameType; // +2
_byte_ iNextFrameType; // +3
_byte_ iRemainingFrames; // +4
_byte_ field_05[3]; // +5 выравнивание стуктуры
_int32_ iDrawPriority; // +8
_byte_ bShowTroopCount; // +12 0x0C
_byte_ field_0D[3]; // +13 0x0D выравнивание стуктуры
_dword_ targetStackSide; // +16 0x10
_dword_ targetStackIndex; // +20 0x14
_dword_ targetAttackLimit; // +24 0x18
_int32_ targetGexID; // 28 +0x1C позициякуда бежать/стрелять
_byte_ isFireshield; // +32 0x20 огненный щит
_byte_ field_21[3]; // +33 0x21 выравнивание стуктуры
_int32_ clone_owner_stack_ix; //+36
_int32_ clone_index; // +40 0x28 (номер стэка клона этого)
// _List_<_int32_>* clones; // Заменяем поле. Теперь это список клонов стека.
_dword_ clone_rounds_left_to_vanish; // +44 0x2C (число раундов до исчезновения)
_byte_ isMoving; // +48 0x30
_byte_ letsPretendImNotHere; // +49 0x31
_byte_ field_32[2]; // +50 0x30 выравнивание стуктуры
_int32_ creature_id; // +52 0x34 (тип монстра)
_int32_ hex_ix; // +56 0x38 (позиция на поле боя)
_int32_ def_group_ix; // +60 0x3C
_int32_ def_frame_ix; // +64 0x40
_dword_ orientation; // +68 0x44 направление монстра (0-как атакующий, 1-как защитник)
_dword_ walkDirection; // +72 0x48 ?
_int32_ count_current; // +76 0x4C (число монстров)
_int32_ count_before_attack; // +80 0x50 (число монстров до удара по ним в тек. атаку)
_dword_ count_battle_resurrected; // +84 0x54
_int32_ lost_hp; // +88 0x58 потери здоровья последнего монстра
_int32_ army_slot_ix; // +92 0x5C номер слота of _Army_ (0...6), -1 - будет удален после битвы
_int32_ count_at_start; // +96 0x60 число монстров в начале битвы
_dword_ base_speed; // +100 0x64 базовая скорость с бонусами земли, спецов и т.д. По ней видимо вычисляются ускорение и замедление
_dword_ anim_value; // +104 0x68 = cranim.f[15] при инициализации
_int32_ full_hp; // +108 0x6C полное здоровье (исп. как база для лечения)
_bool32_ isLucky; // +112 0x70 в этом раунде была удача
//////////////////////////////////////////////////////////////////////////////////
_CreatureInfo_ creature;
//////////////////////////////////////////////////////////////////////////////////
//_int_ town; //+116 0x74
//_int_ level; //+120 0x78
//_char_* sound_name; //+124 0x7C
//_char_* def_name; //+128 0x80
//_int_ flags; //+132 0x84
//_char_* name_single; //+136 0x88
//_char_* name_plural; //+140 0x8C
//_char_* specification_description; //+144 0x90
//_int_ cost_wood; //+148 0x94
//_int_ cost_mercury; //+152 0x98
//_int_ cost_ore; //+156 0x9C
//_int_ cost_sulfur; //+160 0xA0
//_int_ cost_crystal; //+164 0xA4
//_int_ cost_jems; //+168 0xA8
//_int_ cost_gold; //+172 0xAC
//_int_ fight_value; //+176 0xB0
//_int_ AI_value; //+180 0xB4
//_int_ growth; //+184 0xB8
//_int_ horde_growth; //+188 0xBC
//_int_ hit_points; //+192 0xC0
//_int_ speed; //+196 0xC4
//_int_ attack; //+200 0xC8
//_int_ defence; //+204 0xCC
//_int_ damage_min; //+208 0xD0
//_int_ damage_max; //+212 0xD4
//_int_ shots; //+216 0xD8
//_int_ spells_count; //+220 0xDC
//_int_ advmap_low; //+224 0xE0
//_int_ advmap_high; //+228 0xE4
///////////////////////////////////////////////////////////////////////////////
_byte_ show_fire_shield; // +232 0xE8 (например у Ифритов он не отображается)
_bool8_ isSomeKilled; // +233 0xE9 =1, если умирал хоть один
_bool8_ isAllKilled; // +234 0xEA =1, если был убит весь стэк
_byte_ field_EB; // +235 0xEB выравнивание структуры
_int32_ spellAfterAttack; // +236 0xEC номер заклинания существа в тек раунде 0x50 Acid breath
_int32_ hitByCreature; // +240 0xF0 _byte_=1 перед атакой на него 441434
_int32_ side; // +244 0xF4 0 - attacker, 1 - defender
_dword_ index_on_side; // +248 F8 dd = номер стэка у стороны на поле боя
_dword_ iLastFidgetTime; // +252 FC dd = ? что-то с магией
_dword_ ySpecialMod; // +256 100 dd 43DEA4
_dword_ xSpecialMod; // +260 104 dd 43DEAD
_dword_ bPowSequenceComplete; // +264 108 dd
_dword_ yModify; // +268 10C dd
_CreatureAnim_ cr_anim; // +272 0x110
_Def_* def; // +356 0x164 def монстра, загрузка: 43DA8E
_Def_* def_shot; // +360 0x168 def выстрела, загрузка: 43DA8E
_dword_ image_height; // +364 0x16С
_Wav_* wav_move; // +368 0x170 звук перемещения (move), загрузка: 43DA8E
_Wav_* wav_attack; // +372 0x174 звук атаки (attk/wnce/shot), загрузка: 43DA8E
_Wav_* wav_wnce; // +376 0x178 звук 'колдует' (wnce), загрузка: 43DA8E
_Wav_* wav_shot; // +380 0x17C звук выстрела (shot), загрузка: 43DA8E
_Wav_* wav_kill; // +384 0x180 звук смерти (kill), загрузка: 43DA8E
_Wav_* wav_defend; // +388 0x184 звук обороны (wnce/dfnd), загрузка: 43DA8E
_Wav_* wav_ext1; // +392 0x188 звук дополнительный 1 (ext1), загрузка: 43DA8E
_Wav_* wav_ext2; // +396 0x18С звук дополнительный 2 (ext2), загрузка: 43DA8E
_dword_ turnsToNextMove; // +400 0x190
_int32_ active_spells_count; // +404 0x194 dd = количество уже наложенных заклинаний
_int32_ active_spell_duration[81]; // +408 0x198 есть заклинание (длительность) или нет
_int32_ active_spells_power[81]; // +732 0x2DC (сила действия заклинания)
_byte_ SpellInfluenceQueue[48]; // +1056 0x420 std::deque
_int32_ PaletteEffect; // +1104 0x450
_int32_ retaliations; // +1108 0x454 // 441B17 (кол-во ответов на атаку 0= не отв. на атаку)// настройка для грифонов 46D6A0
_int32_ bless_value; // +1112 0x458 Bless добавка к Max. Damage
_int32_ curse_value; // +1116 0x45C Curse убавка к Min. Damage
_int32_ antimagic_value; // +1120 0x460
_int32_ bloodlast_value; // +1124 0x464 Bloodlast добавка к Атаке с бонусами
_int32_ precision_value; // +1128 0x468 Precision добавка к Атаке с бонусами
_int32_ weaknessPenalty; // +1132 0x46C
_int32_ stoneSkinBonus; // +1136 0x470
_int32_ disruptiverayPenalty; // +1140 0x474
_int32_ prayerBonus; // +1144 0x478
_int32_ mirthBonus; // +1148 0x47C
_int32_ sorrowPenalty; // +1152 0x480
_int32_ fortuneBonus; // +1156 0x484
_int32_ misfortunePenalty; // +1160 0x488
_int32_ slayerLevel; // +1164 0x48C
_int32_ steps_to_target; // +1168 0x490 dd (шаги до цели)
_int32_ counerstrike_retaliations; // +1172 0x494 dd кол. доп. ответов на атаку, добавленных Counerstrike заклом
_int32_ frenzyAdjust; // +1176 0x498
_int32_ blindFactor; // +1180 0x49C
_int32_ fire_shield_strength; // +1184 0x4A0
_int32_ poison_penalty; // +1188 0x4A4
_int32_ protectionFromAirFactor; // +1192 0x4A8
_int32_ protectionFromFireFactor; // +1196 0x4AC
_int32_ protectionFromWaterFactor; // +1200 0x4B0
_int32_ protectionFromEarthFactor; // +1204 0x4B4
_int32_ shieldDamageFactor; // +1208 0x4B8
_int32_ airShieldDamageFactor; // +1212 0x4BC
_bool8_ residualBlindness; // +1216 0x4C0 db Blinded - снизить защиту (сбросить после?) при атаке на него (уст. перед ударом)
_bool8_ residualParalyze; // +1217 0x4C1 db Paralized - снизить защиту (сбросить после?) при атаке на него (уст. перед ударом)
_bool8_ field4C2[2]; // +1218 0x4C2 выравнивание структур
_int32_ forgetfulness_level; // +1220 0x4C4 dd Forgetfulness - уровень (>2 - не может стрелять)
_int32_ slowPenalty; // +1224 0x4C8
_int32_ hasteBonus; // +1228 0x4CС
_int32_ diseaseDefensePenalty; // +1232 0x4D0
_int32_ diseaseAttackPenalty; // +1236 0x4D4
_byte_ isNativeTerrain; // +1240 0x4D8
_byte_ field_4C9[3]; // +1241 0x4D9 выравнивание структуры
_int32_ defend_bonus; // +1244 0x4DC dd = величина бонуса при выборе защиты
_int32_ faerie_dragon_spell; // +1248 0x4E0 dd заклинание для сказ дракона
_int32_ magicMirrorChance; // +1252 0x4E4
_int32_ morale; // +1256 0x4E8
_int32_ luck; // +1260 0x4EC
_byte_ resetOnThisRound; // +1264 0x4F0
_byte_ isAreaEffectTarget; // +1265 0x4F1
_byte_ field_4F2[2]; // +1266 0x4F2 выравнивание структуры
_List_<_int32_> binder_clients; // +1268 0x4F4 (bound_armies std::vector)
_List_<_int32_> binder_sources; // +1284 0x504 (binder std::vector)
_List_<_int32_> aura_clients; // +1300 0x514 (aura_clients std::vector)
_List_<_int32_> aura_sources; // +1316 0x524 (aura_clients std::vector)
_int32_ AI_expected_damage; // +1332 0x534
_int32_ AI_target; // +1336 0x538
_int32_ AI_target_value; // +1340 0x53C
_int32_ AI_target_distance; // +1344 0x540
_int32_ AI_possible_targets; // +1348 0x544
Code:
// * monster information on battlefield
struct H3CombatMonster
{
protected:
h3unk _f_000[52];
public:
// * +34
INT32 type;
// * +38
// * position on battlefield
INT32 position;
// * +3C
INT32 animation;
// * +40
INT32 animationFrame;
// * +44
// * left or right
INT32 secondHexOrientation;
protected:
h3unk _f_048[4];
public:
// * +4C
// the number of creatures that are currently alive
INT32 numberAlive;
// * +50
INT32 previousNumber;
protected:
h3unk _f_054[4];
public:
// * +58
// * the number of lost hitpoints of top creature in stack
INT32 healthLost;
// * +5C
// * ?reference to position on side?
INT32 slotIndex;
// * +60
// * the number of creatures in this stack to compare against resurrection
INT32 numberAtStart;
protected:
h3unk _f_064[8];
public:
// * +6C
// * maximum hit points
INT32 baseHP;
// * +70
INT32 isLucky;
public:
// * +74
// * a copy of H3CreatureInformation using combat values in some places
H3CreatureInformation info;
protected:
h3unk _f_0E8[4];
public:
// * +EC
// * set in After-Hit spell subroutine 0x440220
INT32 spellToApply;
protected:
h3unk _f_0F0[4];
public:
// * +F4
// * left or right
INT32 side;
// * +F8
// * reference to position on side
INT32 sideIndex;
protected:
// * +FC
UINT32 last_animation_time;
// * +100
INT32 yOffset;
// * +104
INT32 xOffset;
h3unk _f_108[8];
// * +110 from cranim
H3MonsterAnimation cranim;
public:
// * +164
H3LoadedDef* def;
protected:
// * +168
H3LoadedDef* shootingDef;
h3unk _f_16C[4];
// * +170
UINT32 moveSound;
// * +174
UINT32 attackSound;
// * +178
UINT32 getHitSound;
// * +17C
UINT32 shotSound;
// * +180
UINT32 deathSound;
// * +184
UINT32 defendSound;
// * +188
UINT32 extraSound1;
// * +18C
UINT32 extraSound2;
h3unk _f_190[4];
public:
// * +194
// * the number of spells currently active
INT32 activeSpellsNumber;
// * +198
// * the remaining number of turns of any spells
INT32 activeSpellsDuration[81];
// * +2DC
// * the secondary skill level of applied spells
INT32 activeSpellsLevel[81];
protected:
h3unk _f_420[52];
public:
// * +454
// * number of retaliations left
INT32 retaliations;
// * +458
// * information about some spell effects
INT32 bless_damage; // 0x458
INT32 curse_damage; // 0x45C
INT32 anti_magic; // 0x460
INT32 bloodlust_effect; // 0x464
INT32 precision_effect; // 0x468
INT32 weakness_effect; // 0x46C
INT32 stone_skin_effect; // 0x470
INT32 unknown13; // 0x474
INT32 prayer_effect; // 0x478
INT32 mirth_effect; // 0x47C
INT32 sorrow_effect; // 0x480
INT32 fortune_effect; // 0x484
INT32 misfortune_effect; // 0x488
INT32 slayer_type; // 0x48C - called KING_1/2/3
INT32 unknown14; // 0x490 - Max traversed cells before hitting?
INT32 counterstrike_effect; // 0x494
FLOAT frenzyMultiplier; // 0x498
INT32 blind_effect; // 0x49C - for calculating damage retaliation damage?
FLOAT fire_shield_effect; // 0x4A0
INT32 unknown16; // 0x4A4
FLOAT protection_air_effect; // 0x4A8 - in % as below
FLOAT protection_fire_effect; // 0x4AC
FLOAT protection_water_effect; // 0x4B0
FLOAT protection_earth_effect; // 0x4B4
INT32 shield_effect; // 0x4B8
INT32 air_shield_effect; // 0x4BC
INT8 blinded; // 0x4C0 - to reduce damage?
INT8 paralyzed; // 0x4C1 - to reduce damage?
h3unk _f_4C2[2]; // 0x4C2-0x4C3
INT32 forgetfulness_level; // 0x4C4
FLOAT slow_effect; // 0x4C8
INT32 haste_effect; // 0x4CC - value added/removed
INT32 disease_attack_effect; // 0x4D0
INT32 disease_defense_effect; // 0x4D4
h3unk _f_4D8[8]; // 0x4D8-0x4DC
INT32 faerie_dragon_spell; // +4E0
INT32 magic_mirror_effect; // 0x4E4
INT32 morale; // +4E8
INT32 luck; // +4EC
h3unk _f_4F0[4];
H3Vector<H3CombatMonster*> dendroidBinder; // +4F4 which dendroids have binded the current target (used for animation requirement)
H3Vector<H3CombatMonster*> dendroidBinds; // +504 a list of H3CombatMonsters binded by this dendroid
h3unk _f_514[20];
INT32 Hypnotize_528;
INT32 Hypnotize_52C;
h3unk _f_530[24];
RE: Полные исходники проекта WoG - ZVS - 07.06.2021 22:07
Интересно, но WoG, вплоть до 3.58f я делал вообще не используя IDA. В то время по моему опыту казалось, что она очень слаба и мало чем поможет. Начал я разбор в IDA только когда начал работать над 3.59 и тогда понял, что много мог бы упростить в своей предыдущей работе.
RE: Полные исходники проекта WoG - Berserker - 07.06.2021 22:52
ZVS, для большинства наоборот. База IDA — спасение, декомпилятор — чудо, а дизассемблерный листинг читается с трудом. Спасибо тебе и Сержу за IDA базу.
RE: Полные исходники проекта WoG - XEPOMAHT - 14.03.2023 10:28
структура стека из предыдущего сообщения, которую данный форум обрезал:
Code:
struct Структура_стека
ShowAttackFrames db ?; 0 - already_attack, Стек_более_не_является_атакующим_в_текущем_действии
ShowRangeFrames db ?
ShowAttackFrameType db ?
NextFrameType db ?
RemainingFrames db ?
Null1 db ?
Null2 db ?
Null3 db ?
Порядок_анимации dd ?; 8 - DrawPriority (стандарт = 4)
ShowTroopCount db ?
Null4 db ?
Null5 db ?
Null6 db ?
EnemySide dd ?; 10 - принадлежность врага
EnemyIndexOnSide dd ?; 14 - номер стека врага
ManaDrain dd ?; 18 - кол-во краденной манны (2 байта), 2 байта свободно
Позиция_куда_бежать_стрелять dd ?; 1C - aim_to_move_or_shoot
Анимация_на_стеке dd ?; 20 - только первый байт, 3 байта свободно
Номер_стека_клона_родительского dd ?; 24 - clone_owner_stack_ix
Номер_стека_клона_дочернего dd ?; 28 - clone_index
timeToLive dd ?; 2C
isMoving dd ?; 30 - (2 байта), 2 байта свободно
Тип_существа dd ?; 34
Позиция dd ?; 38 - hex
def_group_ix dd ?; 3C - animation
def_frame_ix dd ?; 40 - animationFrame
Ориентация dd ?; 44 - secondHexOrientation
dd ?
Текущее_количество dd ?; 4C - numberAlive
Отображаемое_количество dd ?; 50 - previousNumber, -1 - совпадает с настоящим
dd ?
Потерянное_здоровье dd ?; 58 - потери здоровья последнего монстра
Номер_слота_в_армии_героя dd ?; 5C - slotIndex
Количество_в_начале_битвы dd ?; 60 - numberAtStart
Полная_Скорость dd ?; 64 - baseSpeed
anim_value dd ?; 68 - walkAnimationTime
Полное_Здоровье dd ?; 6C - полное здоровье (исп. как база для лечения)
Флаг_применения_удачи dd ?; 70 - Luck_Value
;загруженная копия _CreatureInfo_
Город dd ?; 74
Уровень dd ?; 78
Озвучка dd ?; 7C
Боевой_деф dd ?; 80
Флаги dd ?; 84
Имя_ед_ч dd ?; 88
Имя_мн_ч dd ?; 8C
Описание_способностей dd ?; 90
Цена_в_дереве dd ?; 94
Цена_в_ртути dd ?; 98
Цена_в_камнях dd ?; 9C
Цена_в_сере dd ?; A0
Цена_в_кристаллах dd ?; A4
Цена_в_драг_камнях dd ?; A8
Цена_в_золоте dd ?; AC
Fight_Value dd ?; B0
AI_Value dd ?; B4
Прирост dd ?; B8
Доп_прирост dd ?; BC
Максимальное_здоровье dd ?; C0
Скорость dd ?; C4
Атака dd ?; C8
Защита dd ?; CC
Мин_урон dd ?; D0
Макс_урон dd ?; D4
Количество_боеприпасов dd ?; D8
Количество_магических_зарядов dd ?; DC
Мин_кол_во_на_карте dd ?; E0
Макс_кол_во_на_карте dd ?; E4
;конец копии
Флаг_если_хоть_раз_монстра_били db ?; E8
Флаг_если_умирал_хоть_один db ?; E9
Флаг_если_был_убит_весь_стек db ?; EA
Номер_перекраски_стека db ?; EB - 1 = красный + с флагом на призванность дерётся до конца
Номер_закла_существа_в_тек_раунде dd ?; EC - current_creatures_spell_id
dd ?
Принадлежность dd ?; F4 - side
Номер_стека dd ?; F8 - sideIndex
last_animation_time dd ?; FC
yOffset dd ?; 100
xOffset dd ?; 104
dd ?
dd ?
CrAnim db 84 dup (?); 110
Загруженный_деф_мостра dd ?; 164
Загруженный_деф_снаряда dd ?; 168
dd ?; 16C
Загруженный_звук_перемещения dd ?; 170
Загруженный_звук_атаки dd ?; 174
Загруженный_звук_урона dd ?; 178
Загруженный_звук_выстрела dd ?; 17C
Загруженный_звук_смерти dd ?; 180
Загруженный_звук_защиты dd ?; 184
Загруженный_звук_экстра1 dd ?; 188
Загруженный_звук_экстра2 dd ?; 18C
turnsToNextMove dd ?; 190
Количество_наложенных_заклинаний dd ?; 194 - activeSpellsNumber
Длительность_заклинаний dd 96 dup (?); 198 - activeSpellDuration[81]
Сила_заклинаний db 264 dup (?); 318 (ex.2DC) - activeSpellMastery[81]
dd ?; 420 - vector chunkVector, deque spellDeque
dd ?,?,?,?,?,?,?
dd ?
dd ?
dd ?
dd ?
Сдвиг_красного_для_жажды_крови dd ?; 450 - colorSaturation (float)
Контрудары dd ?; 454 - retaliations
Бонус_Благословления dd ?; 458 - blessDamageBonus
Бонус_Проклятия dd ?; 45C - curseDamagePenalty
Параметр_Антимагии dd ?; 460 - antiMagicLevel
Бонус_Кровожадности dd ?; 464 - bloodlustEffect
Бонус_Точности dd ?; 468 - precisionEffect
WeaknessAddedEffect dd ?; 46C
StoneSkinAddedBonus dd ?; 470
dd ?; 474
Бонус_Молитвы dd ?; 478 - prayerEffect
Бонус_Радости dd ?; 47C - mirthEffect
Бонус_Печали dd ?; 480 - sorrowEffect
Бонус_Удачи dd ?; 484 - fortuneEffect
Бонус_Неудачи dd ?; 488 - misfortuneEffect
Флаги_KING_123 dd ?; 48C - slayerType
Кол_во_пройденных_клеток_до_удара dd ?; 490 - pathLength
Бонус_контрударов_от_заклинания dd ?; 494 - counterstrikeEffect
Бонус_Бешенства dd ?; 498 - frenzyMultiplier (float)
BlindCounterattackDamageMul dd ?; 49C - blindEffect
Бонус_Огненного_Щита dd ?; 4A0 - fireShieldEffect (float)
Бонус_Яда dd ?; 4A4 - healthMod (float)
Бонус_Защиты_от_Воздуха dd ?; 4A8 - protAirEffect (float)
Бонус_Защиты_от_Огня dd ?; 4AC - protFireEffect (float)
Бонус_Защиты_от_Воды dd ?; 4B0 - protWaterEffect (float)
Бонус_Защиты_от_Земли dd ?; 4B4 - protEarthEffect (float)
Бонус_Щита dd ?; 4B8 - effectShield (float)
Бонус_Воздушного_Щита dd ?; 4BC - effectAirShield (float)
Флаги_снижения_защиты_от_заклов dd ?; 4C0 - blinded (0 byte) & paralyzed (1 byte)
Бонус_Забывчивости dd ?; 4С4 - forgetfulnessMastery
Бонус_Медлительности dd ?; 4C8 - slowEffect (float)
Бонус_Ускорения dd ?; 4CC - hasteEffect
DeseaseAddedEffect_Defence dd ?; 4D0 - diseaseAttackPenalty
DeseaseAddedEffect_Attack dd ?; 4D4 - diseaseDefensePenalty
Бонус_Родной_Земли dd ?; 4D8 - hasNativeTerrainBonuses
Бонус_при_выборе_защиты dd ?; 4DC - defensiveStanceBonus
Текущее_заклинание dd ?; 4E0 - то, что будет колдовать монстр
MagicMirrorEffect dd ?; 4E4 - magicMirrorEffect
Мораль dd ?; 4E8
Удача dd ?; 4EC
db 88 dup (?); 4F0 - специфические данные корней и магауры
ends
И
напоследок
бонус:
Раритетная база под IDA Pro 6.1 (для счастливых обладателей Windows 2000/XP/2003, не поддерживаемых IDA 7), немного обновлённая структурами героя и стека и именами для нескольких функций: https://vk.com/s/v1/doc/DYRUZ17_Md5x-_LNJgjV92_Y_FQpucyZNhtArX34jyhSzuaeIbY
RE: Полные исходники проекта WoG - avt - 17.04.2023 19:06
А исходники диалогов вот где. Не знаю, правда, кого это ещё может заинтересовать
Писано на C++ Builder`е.
А багрепорты до сих пор приходят. Последний - в конце прошлого года. Поправочка - 15 февраля этого.
тут
RE: Полные исходники проекта WoG - Berserker - 17.04.2023 21:47
avt, спасибо!
RE: Полные исходники проекта WoG - MOP - 25.07.2023 14:19
Поставил ИДУ 5.5 - версия стара, чтобы открыть базу.
Скачал с торрента 7-ую ИДУ - не запускается ни 32-bit, ни 64-bit. "Версия файла несовместима с используемой версией Windows".
Ну, видимо, в который раз не судьба познакомиться с чудесными возможностями этой программы.
RE: Полные исходники проекта WoG - igrik - 25.07.2023 15:42
У меня где-то была старая версия под 5.5, да и неплохо наполненная. Завтра постараюсь не забыть - скину
RE: Полные исходники проекта WoG - MOP - 26.07.2023 01:16
Было бы замечательно.
RE: Полные исходники проекта WoG - igrik - 26.07.2023 07:18
Нет, к сожалению не осталось у меня под 5.5 с моими наработками. Очень жаль, блин. ток под седьмую версию иды
Но я нашёл старую версию под 5.5 (но она без моих наработок). Ничего более наполненного у меня под 5.5 нет
RE: Полные исходники проекта WoG - myoffice91 - 26.07.2023 10:13
Давно скачал архив Heroes3f.7z - 31.05.2019, внутри файл 17.06.2018, размер 91 412 035 байт
У меня IDA 7.0, запустил файл, но появился диалог "Please confirm", "The format of the database is obsolete (550). IDA will now upgrade it into format 700. Continue?". Значит файл версия 5.0.
Скачать https://disk.yandex.ru/d/NOBVNmRYTcQVPw
Посмотрел в архиве от Igrik, размер 90 067 422 байт, 27.12.2013, значит старая база.
RE: Полные исходники проекта WoG - XEPOMAHT - 26.07.2023 10:18
(26.07.2023 10:13)myoffice91 Wrote: Посмотрел в архиве от Igrik, размер 90 067 422 байт, 27.12.2013, значит старая база.
У меня база весит 103 696 068 байт, но она под IDA 6.1.
RE: Полные исходники проекта WoG - MOP - 26.07.2023 11:08
(26.07.2023 07:18)igrik Wrote: Нет, к сожалению не осталось у меня под 5.5 с моими наработками. Очень жаль, блин. ток под седьмую версию иды
В ИДЕ есть функция сохранения в одном из старых форматов? Или она каждый раз отказывается от обратной совместимости?
(26.07.2023 07:18)igrik Wrote: Но я нашёл старую версию под 5.5 (но она без моих наработок). Ничего более наполненного у меня под 5.5 нет
У меня вообще завалялась какая-то база размером в 89 478 279 байт, датированная ажно 31 октября 2011 г.
(26.07.2023 10:13)myoffice91 Wrote: Скачать https://disk.yandex.ru/d/NOBVNmRYTcQVPw
О, спасибо, скачал и открыл в версии 5.5. Думаю, сойдёт на первое время. Хотя найду ли я там то, что ищу - тот ещё вопрос.
(26.07.2023 10:18)XEPOMAHT Wrote: У меня база весит 103 696 068 байт, но она под IDA 6.1.
Вот и поди пойми, где вообще последняя, новейшая база.
RE: Полные исходники проекта WoG - igrik - 26.07.2023 12:37
Нет, обратной совместимости нет.
Но можно и базу в txt файл размотать (так Херомант пользуется). Если нужно - сделаю.
А вообще, ты скажи что ищешь - может уже давным давно разобрано, и если это так - подскажем
RE: Полные исходники проекта WoG - igrik - 05.12.2023 04:26
Так, ввиду того, что пост XEPOMAHT'a обрезается (первый пост в этой странице) - размещу ещё раз.
Полностью! разобранные структуры Героя, Битвы и Стека
PHP Code:
NOALIGN struct _Hero_: _Struct_ { _int16_ x; // +0 _int16_ y; // +2 _int16_ z; // +4 _byte_ visible; // +6 _dword_ mui_xyz; // +7 _byte_ miu_is; // +11 // miu = map_item under hero _dword_ miu_object_type; // +12 _dword_ miu_object_c_flag; // +16 _dword_ miu_UnderHero; // +20 _word_ spell_points; // +24 _dword_ id; // +26 _dword_ id_wtf; // +30 _int8_ owner_id; // +34 _char_ name[13]; // +35 _dword_ _class; // +48 _byte_ pic; // +52 _dword_ targetX; // +53 _dword_ targetY; // +57 _dword_ targetZ; // +61 _word_ last_magic_school_level; // +65 _byte_ target_is_critical; // +67 _byte_ patrol_x; // +68 _byte_ patrol_y; // +69 _byte_ patrolRadius; // +70 _byte_ facing; // +71 _byte_ flags; // +72 _dword_ movement_max; // +73 _dword_ movement_curr; // +77 _dword_ expa; // +81 _word_ level; // +85 _dword_ visited[10]; // +87 (0-learningStones, 1-marlettoTower, 2-gardenRevelation, 3-mercenaryCamp, 4-starAxis, 5-treeKnowldge, 6-libraryEnlightenment, 7-arena, 8-schoolMagic, 9-schoolWar) _dword_ shrineFlags[4]; // +127 _byte_ levelSeed; // +143 _byte_ lastWisdom; // +144 _Army_ army; // +145 _byte_ second_skill[28]; // +201 _byte_ second_skill_show[28]; // +229 // secSkillPosition[28] _dword_ second_skill_count; // +257 _dword_ temp_mod_flags; // + 261 // _HeroFlags_ temp_mod_flags; // + 261 float turnExperienceToRVRatio; // +265 _byte_ dd_cast_this_turn; // +269 _int32_ disguise_cast_power; // +270 _int32_ fly_cast_power; // +274 _int32_ waterwalk_cast_power; // +278 _byte_ moraleBonus; // +282 _byte_ luckBonus; // +283 _byte_ is_sleeping; // +284 _int32_ bounty; // +285 _byte_ TownSpecialGrantedMask[8]; // +289 std::bitset<48> TownSpecialGrantedMask; _int32_ VisionsPower; // +297 _Artifact_ doll_art[19]; // +301 _byte_ free_add_slots; // +453 _byte_ locked_slot[14]; // +454 _Artifact_ backpack_art[64]; // +468 _byte_ backpack_arts_count; // +980 _dword_ female; // +981 _bool8_ is_castom_biography; // +985 _HStringF_ biography; // +986 std::string biography; _byte_ spells_spellbook[70]; // +1002 _byte_ spells_available[70]; // +1072 _byte_ primary_skill[4]; // +1142 _int32_ aggression; // +1146 _int32_ value_of_power; // +1150 _int32_ value_of_duration; // +1154 _int32_ value_of_knowledge; // +1158 _int32_ value_of_spring; // +1162 _int32_ value_of_well; // +1166
// normal void Hide() {CALL_1(void, __thiscall, 0x4D7950, this);} void Show(_int_ mapitem_type, _int_ mapitem_setup) {CALL_3(void, __thiscall, 0x4D7840, this, mapitem_type, mapitem_setup);} char* Get_className() {return CALL_1(char*, __thiscall, 0x4D91E0, this);} int GetLandModifierUnder() {return CALL_1(int, __thiscall, 0x4E5210, this);} void CastFly(int powerCast) {CALL_2(void, __thiscall, 0x4E5C10, this, powerCast);}
// телепортировать героя _byte_ Teleport(_dword_ xyz) { return CALL_6(_byte_, __thiscall, 0x41DAB0, o_AdvMgr, this, xyz, 0, 1, 0); } // дать армию герою _bool_ AddStack(_int_ type, _int_ amount, _int_ slot = -1) { return CALL_4(_bool_, __thiscall, 0x44A9B0, &this->army, type, amount, slot); }
// обучение грамотностью между героями void TeachScholar(_Hero_* heroRight) { CALL_2(void, __fastcall, 0x4A25B0, this, heroRight); }
void GiveArtifact(_Artifact_* art, int is_need_build_combo, int check_win_game) {CALL_4(void, __thiscall, 0x4E32E0, this, art, is_need_build_combo, check_win_game);} void GiveArtifact(_int_ art_id, int is_need_build_combo, int check_win_game) { _Artifact_ art; art.id = art_id; art.mod = 0xFFFF; GiveArtifact(&art, is_need_build_combo, check_win_game); }
_bool_ DoesHasArtifact(int art_id) {return CALL_2(_bool_, __thiscall, 0x4D9420, this, art_id);} _bool_ DoesWearArtifact(int art_id) {return CALL_2(_bool_, __thiscall, 0x4D9460, this, art_id);} void RemoveBattleMachine(int creature_id) {CALL_2(void, __thiscall, 0x4D94D0, this, creature_id);} int RemoveDollArtifact(int doll_slot_index) {return CALL_2(int, __thiscall, 0x4E2E40, this, doll_slot_index);} int AddDollArtifact(_Artifact_* art, int doll_slot_index) {return CALL_3(int, __thiscall, 0x4E2C70, this, art, doll_slot_index);} int RemoveBackpackArtifact(int index) {return CALL_2(int, __thiscall, 0x4E2FC0, this, index);} int AddBackpackArtifact(_Artifact_* art, int index) {return CALL_3(int, __thiscall, 0x4E3200, this, art, index);}
// открытие окна героя _int_ ShowHeroScreen(_int_ noDissmiss, _int_ noRedrawAdvMap, _byte_ rightClickDlg) { return CALL_4(_int_, __fastcall, 0x4E1A70, this->id, noDissmiss, noRedrawAdvMap, rightClickDlg); }
// получить стоимость маны за заклинание _int_ GetSpellCost(_int_ spell_id, _Army_* army, _int_ land_modifier) { return CALL_4(_int_, __thiscall, 0x4E54B0, this, spell_id, army, land_modifier); }
// Получение уровня силы магии в бою _int_ Get_School_Level_Of_Spell(_int_ spell_id, _int_ land_modifier) { return CALL_3(_int_, __thiscall, 0x4E52F0, this, spell_id, land_modifier); }
// Получение силы спелла от бонуса артов (длительность действия) _int_ Get_Spell_Rounds_Bonus_Arts() { return CALL_1(_int_, __thiscall, 0x4E5020, this); } // Получение силы спелла от бонуса втор.навыка Волшебство _int64_ Get_Spell_Power_Bonus_Arts_And_Sorcery(int spell, signed int damage, _BattleStack_* stack) { return CALL_4(_int64_, __thiscall, 0x4E59D0, this, spell, damage, stack); }
// Получение бонуса к эффекту заклинания за специализацию. _int_ GetSpell_Specialisation_PowerBonuses(int Spell_id, signed int damage, int Creature_level) { return CALL_4(_int_, __thiscall, 0x4E6260, this, Spell_id, Creature_level, damage); }
_int_ GetSpecialTerrain() {return CALL_1(_int_, __thiscall, 0x4E5130, this); }
// СПЕЦИАЛИЗАЦИИ ГЕРОЕВ // float SS_GetArcheryPower = CALL_1(float, __thiscall, 0x4E43D0, hero); // Стрельба (Archery) // float SS_GetDiplomacyPower = CALL_1(float, __thiscall, 0x4E47F0, hero); // Дипломатия (Diplomacy) // float SS_GetEagleEyePower = CALL_1(float, __thiscall, 0x4E4690, hero); // Зоркость (Eagle Eye) // float SS_GetNecromancyPower = CALL_1(float, __thiscall, 0x4E3F40, hero, _bool8_ isSetMaxValuePower); // Некромантия (Necromancy) // float SS_GetEstatesPower = CALL_1(float, __thiscall, 0x4E4600, hero); // Имущество (Estates) // float SS_GetLearningPower = CALL_1(float, __thiscall, 0x4E4AB0, hero); // Обучение (Learning) // float SS_GetOffensePower = CALL_1(float, __thiscall, 0x4E4520, hero); // Нападение (Offense) // float SS_GetArmorerPower = CALL_1(float, __thiscall, 0x4E4580, hero); // Доспехи (Armorer) // float SS_GetIntelligencePower = CALL_1(float, __thiscall, 0x4E4B20, hero); // Интеллект (Intelligence) // float SS_GetResistancePower = CALL_1(float, __thiscall, 0x4E4950, hero); // Сопротивление (Resistance) // float SS_GetFirstAidPower = CALL_1(float, __thiscall, 0x4E4B90, hero); // Первая помощь (First Aid) // _int_ SS_GetEstatesPower = CALL_1(_int_, __thiscall, 0x4E4600, hero); // Имущество // _int_ SS_GetMysticismPower = CALL_1(_int_, __thiscall, 0x4E41B0, hero); // Мистицизм // _int_ SS_GetScoutingRadius = CALL_1(_int_, __thiscall, 0x4E42E0, hero); // Разведка // _int_ ReCalculateMovementPoints = CALL_1(_int_, __thiscall, 0x4E4C00, hero, _bool8_ inOnBoat); // Пересчитать мувпоинты //my 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());} };
PHP Code:
NOALIGN struct _BattleMgr_ : _Struct_ { _Manager_ mgr; // 0...56 _byte_ field_38[4]; // +56 (что-то из manager)
enum BATTLE_ACTION { BA_CANCEL, BA_HERO_CAST_SPELL, BA_WALK, BA_DEFEND, BA_RETREAT, BA_SURRENDER, BA_WALK_ATTACK, BA_SHOOT, BA_WAIT, BA_CATAPULT, BA_MONSTER_SPELL, BA_FIRST_AID_TENT, BA_NOTHING //12 = No action(can be to disable stack for this round) };
_int32_ action; // +60 (BG:A) _int32_ actionParam; // +64 _int32_ actionTarget; // +68 _int32_ actionParam2; // +72 _byte_ iLastDrawGridShade[187]; // +76 _byte_ iCurDrawGridShade[187]; // +263 _byte_ f_1C2[2]; // +450 (выравнивание) _BattleHex_ hex[187]; // +452 (112*187) _int32_ combatTerrain; // +21396 _int32_ combatFringe; // +21400 _int32_ iCombatCycleType; // +21404 _int32_ iElevationOverlay; // +21408 _bool32_ iDoorStatus; // +21412 _bool32_ bMoatOn; // +21416 _bool32_ moatIsWide; // +21420 _Pcx16_* saveScreenPreGrid; // +21424 (Bitmap16Bit*) _Pcx16_* saveScreenPostGrid; // +21428 _Pcx16_* combatMouseBackground; // +21432 _MapItem_* MapItem; // +21436 _int32_ special_Ground; // +21440 _bool8_ antiMagic_Garrison; // +21444 _bool8_ isBank; // +21445 _bool8_ f_53C6[2]; // +21446 (выравнивание) _Town_* town; // +21448 _Hero_* hero[2]; // +21452 _int32_ heroSpellPower[2]; // +21460 _bool32_ playDoh; // +21468 _bool32_ playYeah; // 21472 _int32_ heroFrameType[2]; // +21476 _int32_ heroFrameIndex[2]; // +21484 _int32_ heroDataSet[2]; // +21492 _dword_ heroLastFidgetTime[2]; // +21500 _Def_* heroDefLoaded[2]; // +21508 _Def_* heroFlagLoaded[2]; // +21516 _int32_ heroFlagCadre[2]; // +21524 _int32_ heroUpdateRect[2][4]; // +21532 _int32_ heroFlagUpdateRect[2][4]; // +21564 _List_<_int32_> EagleEyeSpellLearned[2]; // +21596 (H3Vector<INT32>) _byte_ armyEffected[2][20]; // +21668 _bool8_ isHuman[2]; // +21668 (isNotAI[2]) _bool8_ isLocalHuman[2]; // +21670 (isHuman[2]) _int32_ playerID[2]; // +21672 (owner_id[2]) _bool8_ hasArtifactAutoCast[2]; // 21680 _byte_ f_54B2[2]; // +21682 (выравнивание) _bool32_ isCasted[2]; // +21684 _int32_ countMonsters[2]; // +21692 _Army_* army[2]; // +21700 _BattleStack_ stack[2][21]; // +21708 _bool8_ onNativeTerrain[2]; // +78492 _byte_ f_1329E[2]; // +78494 (выравнивание) _int32_ turnsSinceLastEnchanterCast[2]; // +78496 _int32_ summonedElemental[2]; // +78504 _bool8_ sideRetreated[2]; // +78512 _bool8_ sideSurrendered[2]; // +78514 _int32_ gbThisNetHasControl; // +78516 (netControl_BG_A) _int32_ currentStackSide; // +78520 _int32_ currentStackIndex; // +78524 _int32_ currentActiveSide; // +78528 _int32_ autoCombatOn; // +78532 _BattleStack_* activeStack; // +78536 _int32_ highlighterOn; // +78540 _int32_ lastHexIndex; // +78544 _int32_ lastMoveToIndex; // +78548 _int32_ attackerHexIndex; // +78552 _int32_ lastCommand; // +78556 _int32_ combatCommand; // +78560 _int32_ castleAttackDone; // +78564 _Def_* currentSpellDef; // +78568 _int32_ currentSpellID; // +78572 _int32_ currentSpellDefFrame; // +78576 _int32_ numShootingTowers; // +78580 _int32_ isBattleOver; // +78584 _Dlg_* dlg; // +78588 _int32_ bCombatShowIt; // +78592 _dword_* iconWidgetWL[25]; // +78596 (iconWidget = _DlgStaticDef_?) _dword_* textWidgetWL[25]; // +78696 (textWidget = _DlgStaticText_?) _int32_ attackCursorEnumType[12]; // +78796 _int32_ attackHex[12]; // +78844 _int32_ lastAttackCursorEnumType; // +78892 _int32_ iTtlCombatDirections; // +78896 _int32_ iBackgroundFrame; // +78900 _bool8_ bCreatureIsDead[2][20]; // +78904 _bool8_ bSomeCreaturesVanish; // +78944 _byte_ f_13461[3]; // +78945 (выравнивание) char* backPcxName; // +78948 _BattleHexAdjacent_ adjacentSquares[187]; // +78952 (_BattleHexAdjacent_ adjacentSquares[187]) _int32_ saveBiggestExtent; // +81196 _int32_ limitToExtent; // +81200 _int32_ computeExtentOnly; // +81204 _int32_ extent[4]; // +81208 (RECT = size 16 bytes) _int32_ sideWinner; // +81224 _int32_ necromanty_Count; // +81228 _int32_ necromanty_Type; // +81232 _dword_* NumberWindow; // +81236 _List_<_int32_> Obstacles; // +81240 (_H3Vector_<H3Obstacle>) _bool8_ isTactics; // +81256 _byte_ f_13D69[3]; // +81257 (выравнивание) _int32_ round; // +81260 _int32_ tacticsDifference; // +81264 _bool8_ cheatNoSpellLimit; // +81268 _bool8_ cheatShowHiddenObjects; // +81269 _bool8_ cheatShowBlockedHexes; // +81270 _byte_ f_13D77; // +81271 (выравнивание) _dword_* Towers[3]; // +81272 ( struct TownTowerLoaded (size 0x24h) _bool8_ waitPhase; // +81380 _byte_ f_13DE5[3]; // +81381 (выравнивание) _int32_ defenderHeroOriginalPSkill[4]; // +81384 (герой защитник: сохранить атаку до битвы) char* wallImagesNames[90]; // +81400 _int32_ wallLevel[18]; // +81760 _int32_ wallFrame[18]; // +81832 _int32_ mapPoint; // +81904 (пакованные координаты битвы) _Pcx8_* combatCellGrid; // +81908 _Pcx8_* combatCellShaded; // +81912 _int32_ obstacleAnimationFrame; // +81916 _bool8_ redrawCreatureFrame[40];// +81920 _bool8_ redrawHeroFrame[2]; // +81960 _bool8_ redrawFlagFrame[2]; // +81962 _bool8_ redrawTowersFrame[3]; // +81964 _bool8_ askRunBattle; // +81967 _bool8_ anyActionTaken; // +81968 _byte_ creaturePath[187]; // +81969
// normal //inline _Def_* LoadSpellAnimation(int spell_anim_ix) inline int GetHexIxAtXY(int x, int y) {return CALL_2(int, __stdcall, 0x464380, x - dlg->x, y - dlg->y);} inline void CastSpell(int spell_id, int hex_ix, int cast_type_012, int hex2_ix /*для телепорта и жертвы*/, int skill_level, int spell_power) {CALL_7(void, __thiscall, 0x5A0140, this, spell_id, hex_ix, cast_type_012, hex2_ix, skill_level, spell_power);}
// может ли впринципе сторона колдовать любое заклинание inline _bool8_ CanUseAnySpell(int side, _byte_ isHeroCaster) { return CALL_3(_bool8_, __thiscall, 0x41FA10, this, side, isHeroCaster); }
// даём игроку управление для поиска цели уже выбранного заклинания inline void UserChooseSpellTarget(int spell, int position) { return CALL_4(void, __fastcall, 0x59EF60, this, position, spell, 0); }
// скрытая ли битва: 0=видимая, 1=скрытая inline _bool8_ IsHiddenBattle() { return CALL_1(_bool8_, __thiscall, 0x46A080, this); } // Проверка необходимости отрисовки битвы. // При необходимости отрисовки возвращает FALSE, иначе TRUE. inline _bool8_ ShouldNotRenderBattle() { return CALL_1(_bool8_, __thiscall, 0x46A080, this); }
// проиграть анимацию заклинания на активном стеке inline _byte_ StackActive_PlaySpellAnimation(_int_ spell_anim_id, _int_ play_damage_to_stack = 0) { return CALL_3(_byte_, __thiscall, 0x468570, this, spell_anim_id, play_damage_to_stack); }
// поставить тень курсора на гекс inline _int32_ SetCursorShadowOnGex(_int32_ GexID) { return CALL_1(_int32_, __fastcall, 0x59FA10, GexID); }
// получить тип курсора в бою inline _int32_ GetCursorFrame(_int32_ GexID) { return CALL_2(_int32_, __thiscall, 0x475DC0, this, GexID); }
// добавить хинт действия в битве (в лог битвы) НЕ сохранится в логе // в зависимости от типа действия (считывается из кадра курсора мыши) inline void AddHintMessage_ByCursorFrame(_int32_ cursor_frame) { CALL_2(void, __thiscall, 0x4923C0, this, cursor_frame); }
// добавить статус действия в битве (в лог битвы) сохранится в логе inline void AddStatusMessage(const char* statusbar_text) { return CALL_4(void, __thiscall, 0x4729D0, this->dlg, statusbar_text, 1, 0); }
// добавить хинт действия в битве (в лог битвы) НЕ сохранится в логе inline void AddHintMessage(const char* statusbar_text) { return CALL_4(void, __thiscall, 0x4729D0, this->dlg, statusbar_text, 0, 1); }
// получить в текст урона, который можно записать в лог битвы inline _HStr_* GetHintMessage_AttackDamage(_HStr_* H3Str, _BattleStack_* atacker, _BattleStack_* target, _bool8_ isShoot, _int32_ stepsToTarget) { return CALL_5(_HStr_*, __fastcall, 0x492F50, H3Str, atacker, target, isShoot, stepsToTarget); }
// Сделать стек активным inline void SetActiveStack(_int_ side, _int_ index_on_side) { return CALL_3(void, __thiscall, 0x464F10, this, side, index_on_side); }
// Проиграть магическую анимацию на определенном гексе поля боя inline _byte_ PlayMagicAnimationOnGEX(_int_ anim_id, _int_ gex_id) { return CALL_5(_byte_, __thiscall, 0x496590, this, anim_id, gex_id, 100, 1); } // Сброс полей необходимости перерисовки. inline void ClearRedrawFields() { return CALL_1(void, __thiscall, 0x493290, this); } // Указание необходимости перерисовки при следующей отрисовке для стека - стрелковой башни. inline void SetArrowTowerToRedraw(_BattleStack_* Stack) { return CALL_2(void, __thiscall, 0x46A040, this, Stack); }
// получение прямого расстояния между двумя гексами (без учёта препятствий) inline _int_ GetDistance(_int_ gex_start, _int_ gex_finish) { return CALL_2(_int_, __fastcall, 0x469250, gex_start, gex_finish); } // Определение границ перерисовки для кадра def`а. inline void SetSpecRedrawBorders(_Def_* Def, _int_ DefGroupNum, _int_ FrameNum, _int_ X_Pos, _int_ Y_Pos, _RedrawBorders_* out_Borders, _bool_ Reflected, _bool_ NeedAddToGlobalBorders) { CALL_9(void, __thiscall, 0x495AD0, this, Def, DefGroupNum, FrameNum, X_Pos, Y_Pos, out_Borders, Reflected, NeedAddToGlobalBorders); } // Вычисление границ необходимости обновления экрана на основе полей необходимости перерисовки боевых элементов. inline void SetRedrawBorders() { CALL_1(void, __thiscall, 0x495770, this); } // Отрисовка поля боя. // Flip - необходимость обновления экрана. // SetBattleRedraws - необходимость настройки границ обновления экрана. // UseBattleRedraws - необходимость использования границ обновления экрана (при SetBattleRedraws = TRUE игнорируется, считаясь TRUE). // WaitingTime - время, на ожидание которого надо настроить следующую отрисовку (игнорируется при Wait = FALSE). // RedrawBackground - необходимость перерисовки заднего плана (и стёрки старого изображения). // Wait - необходимость ожидания. В случае FALSE время ожидания для следующей отрисовки не меняется. inline void RedrawBattlefield(_bool8_ Flip, _bool8_ SetBattleRedraws, _bool8_ UseBattleRedraws, _int_ WaitingTime, _bool8_ RedrawBackground, _bool8_ Wait) { return CALL_7(void, __thiscall, 0x493FC0, this, Flip, SetBattleRedraws, UseBattleRedraws, WaitingTime, RedrawBackground, Wait); } inline _int32_ RedrawGrid() { return CALL_3(_int32_, __thiscall, 0x4934B0, o_BattleMgr, 0, 1); }
inline void Redraw() { return RedrawBattlefield(1, 0, 0, 0, 1, 0); }
// Обновление всего поля боя. inline void FlipBattlefield() { CALL_1(void, __fastcall, 0x493300, this); }
inline void Highlight_Hex(int gex_id = -1, signed int item = -1) { CALL_3(void, __thiscall, 0x493F10, this, gex_id, item); } // Инициализация переменных, управляющих временем случайных анимаций. inline void InitRandAnimsTimes() { CALL_1(void, __thiscall, 0x479860, this); } // Проигрывание одного кадра анимации ожидания поля боя. // Это анимация флагов героев, анимация самих героев, случайная анимация существ, мигающая рамка вокруг стеков. inline void PlayWaitAnim() { CALL_1(void, __thiscall, 0x495C50, this); } // Проигрывание одного кадра анимации ожидания поля боя только в случае наступления времени. inline void PlayWaitAnimOnce() { CALL_1(void, __thiscall, 0x473970, this); } // Нанесение урона элементу замка по его номеру. inline void DamageCastleElement(_int_ CastleElementNum, _int_ Damage) { CALL_3(void, __thiscall, 0x465570, this, CastleElementNum, Damage); }
inline _bool8_ Get_StackShoot_ObstacklePenalty(_BattleStack_* stack, _int32_ stackHexID, _int32_ gexTargetID) { return CALL_4(_bool8_, __thiscall, 0x4670F0, this, stack, stackHexID, gexTargetID); } inline _bool8_ Get_StackShoot_DistancePenalty(_BattleStack_* stack, _BattleStack_* target) { return CALL_3(_bool8_, __thiscall, 0x4671E0, this, stack, target); } // Удаление стека с гекса, на котором он стоит. inline void RemoveStackFromGexes(_BattleStack_* stack) { CALL_2(void, __thiscall, 0x468310, this, stack); } // Постановка стека на гекс. inline void PutStackToGex(_BattleStack_* Stack, _int_ GexNum) { CALL_3(void, __thiscall, 0x4683A0, this, Stack, GexNum); } // Удаление препятствия. inline void RemoveObstacle(_int_ ObstacleNum) { CALL_2(void, __thiscall, 0x466710, this, ObstacleNum); }
// проверка препятствий на гексе (0-пуст, 1-занят) inline _byte_ IsGexNotObstacle(_int_ gexID) { // проверяем, правильно ли передали в функцию номер гекса if (gexID <= 0 || gexID > 187) return 1; // не правильно, значит гекс занят
return CALL_2(_byte_, __thiscall, 0x4695F0, this, gexID); } }
PHP Code:
NOALIGN struct _BattleStack_ : _Struct_ // размер 0x548 = 1352 байта { _byte_ bShowAttackFrames; // +0 _byte_ bShowRangeFrames; // +1 _byte_ iShowAttackFrameType; // +2 _byte_ iNextFrameType; // +3 _byte_ iRemainingFrames; // +4 _byte_ field_05[3]; // +5 выравнивание стуктуры
_int32_ iDrawPriority; // +8 _byte_ bShowTroopCount; // +12 0x0C _byte_ field_0D[3]; // +13 0x0D выравнивание стуктуры
_dword_ targetStackSide; // +16 0x10 _dword_ targetStackIndex; // +20 0x14 _dword_ targetAttackLimit; // +24 0x18
_int32_ targetGexID; // 28 +0x1C позициякуда бежать/стрелять
_byte_ isFireshield; // +32 0x20 огненный щит _byte_ field_21[3]; // +33 0x21 выравнивание стуктуры
_int32_ clone_owner_stack_ix; //+36 _int32_ clone_index; // +40 0x28 (id стэка клона) _dword_ clone_rounds_left_to_vanish; // +44 0x2C (число раундов до исчезновения)
_byte_ isMoving; // +48 0x30 _byte_ letsPretendImNotHere; // +49 0x31 _byte_ field_32[2]; // +50 0x30 выравнивание стуктуры
_int32_ creature_id; // +52 0x34 (тип монстра) _int32_ hex_ix; // +56 0x38 (позиция на поле боя) _int32_ def_group_ix; // +60 0x3C _int32_ def_frame_ix; // +64 0x40
_dword_ orientation; // +68 0x44 направление монстра (1-как атакующий, 0-как защитник) _dword_ walkDirection; // +72 0x48 ?
_int32_ count_current; // +76 0x4C (число монстров) _int32_ count_before_attack; // +80 0x50 (число монстров до удара по ним в тек. атаку) _dword_ count_battle_resurrected; // +84 0x54 _int32_ lost_hp; // +88 0x58 потери здоровья последнего монстра _int32_ army_slot_ix; // +92 0x5C номер слота of _Army_ (0...6), -1 - будет удален после битвы _int32_ count_at_start; // +96 0x60 число монстров в начале битвы _dword_ base_speed; // +100 0x64 базовая скорость с бонусами земли, спецов и т.д. По ней видимо вычисляются ускорение и замедление _dword_ anim_value; // +104 0x68 = cranim.f[15] при инициализации _int32_ full_hp; // +108 0x6C полное здоровье (исп. как база для лечения) _bool32_ isLucky; // +112 0x70 в этом раунде была удача
////////////////////////////////////////////////////////////////////////////////// _CreatureInfo_ creature; ////////////////////////////////////////////////////////////////////////////////// //_int_ town; //+116 0x74 //_int_ level; //+120 0x78 //_char_* sound_name; //+124 0x7C //_char_* def_name; //+128 0x80 //_int_ flags; //+132 0x84 //_char_* name_single; //+136 0x88 //_char_* name_plural; //+140 0x8C //_char_* specification_description; //+144 0x90 //_int_ cost_wood; //+148 0x94 //_int_ cost_mercury; //+152 0x98 //_int_ cost_ore; //+156 0x9C //_int_ cost_sulfur; //+160 0xA0 //_int_ cost_crystal; //+164 0xA4 //_int_ cost_jems; //+168 0xA8 //_int_ cost_gold; //+172 0xAC //_int_ fight_value; //+176 0xB0 //_int_ AI_value; //+180 0xB4 //_int_ growth; //+184 0xB8 //_int_ horde_growth; //+188 0xBC //_int_ hit_points; //+192 0xC0 //_int_ speed; //+196 0xC4 //_int_ attack; //+200 0xC8 //_int_ defence; //+204 0xCC //_int_ damage_min; //+208 0xD0 //_int_ damage_max; //+212 0xD4 //_int_ shots; //+216 0xD8 //_int_ spells_count; //+220 0xDC //_int_ advmap_low; //+224 0xE0 //_int_ advmap_high; //+228 0xE4 ///////////////////////////////////////////////////////////////////////////////
_byte_ show_fire_shield; // +232 0xE8 (например у Ифритов он не отображается) _bool8_ isSomeKilled; // +233 0xE9 =1, если умирал хоть один _bool8_ isAllKilled; // +234 0xEA =1, если был убит весь стэк
_byte_ field_EB; // +235 0xEB выравнивание структуры
_int32_ spellAfterAttack; // +236 0xEC номер заклинания существа в тек раунде 0x50 Acid breath _int32_ hitByCreature; // +240 0xF0 _byte_=1 перед атакой на него 441434 _int32_ side; // +244 0xF4 0 - attacker, 1 - defender _dword_ index_on_side; // +248 F8 dd = номер стэка у стороны на поле боя
_dword_ iLastFidgetTime; // +252 FC dd = ? что-то с магией _dword_ ySpecialMod; // +256 100 dd 43DEA4 _dword_ xSpecialMod; // +260 104 dd 43DEAD _dword_ bPowSequenceComplete; // +264 108 dd _dword_ yModify; // +268 10C dd _CreatureAnim_ cr_anim; // +272 0x110 _Def_* def; // +356 0x164 def монстра, загрузка: 43DA8E _Def_* def_shot; // +360 0x168 def выстрела, загрузка: 43DA8E _dword_ image_height; // +364 0x16С _Wav_* wav_move; // +368 0x170 звук перемещения (move), загрузка: 43DA8E _Wav_* wav_attack; // +372 0x174 звук атаки (attk/wnce/shot), загрузка: 43DA8E _Wav_* wav_wnce; // +376 0x178 звук 'колдует' (wnce), загрузка: 43DA8E _Wav_* wav_shot; // +380 0x17C звук выстрела (shot), загрузка: 43DA8E _Wav_* wav_kill; // +384 0x180 звук смерти (kill), загрузка: 43DA8E _Wav_* wav_defend; // +388 0x184 звук обороны (wnce/dfnd), загрузка: 43DA8E _Wav_* wav_ext1; // +392 0x188 звук дополнительный 1 (ext1), загрузка: 43DA8E _Wav_* wav_ext2; // +396 0x18С звук дополнительный 2 (ext2), загрузка: 43DA8E _dword_ turnsToNextMove; // +400 0x190 _int32_ active_spells_count; // +404 0x194 dd = количество уже наложенных заклинаний _int32_ active_spell_duration[81]; // +408 0x198 есть заклинание (длительность) или нет _int32_ active_spells_power[81]; // +732 0x2DC (сила действия заклинания) _byte_ SpellInfluenceQueue[48]; // +1056 0x420 std::deque
_int32_ PaletteEffect; // +1104 0x450 _int32_ retaliations; // +1108 0x454 // 441B17 (кол-во ответов на атаку 0= не отв. на атаку)// настройка для грифонов 46D6A0 _int32_ bless_value; // +1112 0x458 Bless добавка к Max. Damage _int32_ curse_value; // +1116 0x45C Curse убавка к Min. Damage _int32_ antimagic_value; // +1120 0x460 _int32_ bloodlast_value; // +1124 0x464 Bloodlast добавка к Атаке с бонусами _int32_ precision_value; // +1128 0x468 Precision добавка к Атаке с бонусами _int32_ weaknessPenalty; // +1132 0x46C _int32_ stoneSkinBonus; // +1136 0x470 _int32_ disruptiverayPenalty; // +1140 0x474 _int32_ prayerBonus; // +1144 0x478 _int32_ mirthBonus; // +1148 0x47C _int32_ sorrowPenalty; // +1152 0x480 _int32_ fortuneBonus; // +1156 0x484 _int32_ misfortunePenalty; // +1160 0x488 _int32_ slayerLevel; // +1164 0x48C _int32_ steps_to_target; // +1168 0x490 dd (шаги до цели) _int32_ counerstrike_retaliations; // +1172 0x494 dd кол. доп. ответов на атаку, добавленных Counerstrike заклом _int32_ frenzyAdjust; // +1176 0x498 _int32_ blindFactor; // +1180 0x49C _int32_ fire_shield_strength; // +1184 0x4A0 _int32_ poison_penalty; // +1188 0x4A4
_int32_ protectionFromAirFactor; // +1192 0x4A8 _int32_ protectionFromFireFactor; // +1196 0x4AC _int32_ protectionFromWaterFactor; // +1200 0x4B0 _int32_ protectionFromEarthFactor; // +1204 0x4B4
_int32_ shieldDamageFactor; // +1208 0x4B8 _int32_ airShieldDamageFactor; // +1212 0x4BC _bool8_ residualBlindness; // +1216 0x4C0 db Blinded - снизить защиту (сбросить после?) при атаке на него (уст. перед ударом) _bool8_ residualParalyze; // +1217 0x4C1 db Paralized - снизить защиту (сбросить после?) при атаке на него (уст. перед ударом) _bool8_ field4C2[2]; // +1218 0x4C2 выравнивание структур
_int32_ forgetfulness_level; // +1220 0x4C4 dd Forgetfulness - уровень (>2 - не может стрелять) _int32_ slowPenalty; // +1224 0x4C8 _int32_ hasteBonus; // +1228 0x4CС
_int32_ diseaseDefensePenalty; // +1232 0x4D0 _int32_ diseaseAttackPenalty; // +1236 0x4D4 _byte_ isNativeTerrain; // +1240 0x4D8 _byte_ field_4C9[3]; // +1241 0x4D9 выравнивание структуры _int32_ defend_bonus; // +1244 0x4DC dd = величина бонуса при выборе защиты _int32_ faerie_dragon_spell; // +1248 0x4E0 dd заклинание для сказ дракона
_int32_ magicMirrorChance; // +1252 0x4E4 _int32_ morale; // +1256 0x4E8 _int32_ luck; // +1260 0x4EC
_byte_ resetOnThisRound; // +1264 0x4F0 _byte_ isAreaEffectTarget; // +1265 0x4F1
_byte_ field_4F2[2]; // +1266 0x4F2 выравнивание структуры
_List_<_int32_> binder_clients; // +1268 0x4F4 (bound_armies std::vector) _List_<_int32_> binder_sources; // +1284 0x504 (binder std::vector) _List_<_int32_> aura_clients; // +1300 0x514 (aura_clients std::vector) _List_<_int32_> aura_sources; // +1316 0x524 (aura_clients std::vector)
_int32_ AI_expected_damage; // +1332 0x534 _int32_ AI_target; // +1336 0x538 _int32_ AI_target_value; // +1340 0x53C _int32_ AI_target_distance; // +1344 0x540 _int32_ AI_possible_targets; // +1348 0x544
// normal inline void Construct(int creature_id, int count, _Hero_* hero_owner, int side, int index_on_side/*0 - 21*/, int position_hex_ix, int army_slot_ix) {CALL_8(void, __thiscall, 0x43D5D0, this, creature_id, count, hero_owner, side, index_on_side, position_hex_ix, army_slot_ix);}
inline _BattleStack_* Create() {return CALL_1(_BattleStack_*, __thiscall, 0x43CF70, this);} // need (_BattleStack_*)o_New(sizeof(_BattleStack_)) inline void InitDefsAndWavs() {CALL_1(void, __thiscall, 0x43D710, this);} inline _int32_ InitSpells() {return CALL_1(_int32_, __thiscall, 0x43D2E0, this);} inline _int32_ Delete() {return CALL_1(_int32_, __thiscall, 0x43D120, this);}
inline _int32_ GetFullHealth(_bool_ isAI) {return CALL_2(_int32_, __thiscall, 0x442DA0, this, isAI);} inline _int32_ GetSide() {return CALL_1(_int32_, __thiscall, 0x43FE60, this);}
// получение базового урона монстром inline _int32_ Calc_Damage_Base(_bool_ isTeoretic = TRUE) { return CALL_2(_int32_, __thiscall, 0x442E80, this, isTeoretic); } // Подсчёт добавок к наносимому урону (возвращается новый урон). // Enemy - указатель на атакуемый стек. // BaseDamage - начальный урон. // IsShot - является ли атака выстрелом (TRUE - является). // Virtual - является ли подсчёт производимым ИИ (TRUE - является). // WayLength - пройденный путь до цели (для расчёта кавалерийского бонуса). // out_FireshieldDamage - указатель на переменную, в которую в результате работы функции запишется урон от огненного щита (0 - не подсчитывать). inline _int32_ Calc_Damage_Bonuses(_BattleStack_* enemy, _int32_ BaseDamage, _bool8_ IsShot, _bool8_ Virtual, _int32_ WayLength, _int32_* out_FireshieldDamage) { return CALL_7(_int32_, __thiscall, 0x443C60, this, enemy, BaseDamage, IsShot, Virtual, WayLength, out_FireshieldDamage); }
// Проиграть анимацию заклинания на стеке inline _int_ PlayMagicAnimation(_int_ spell_anim_id, _byte_ is_show_damage = 0) { return CALL_5(_int_, __thiscall, 0x4963C0, o_BattleMgr, spell_anim_id, this, 100, is_show_damage); }
// проиграть анимацию заклинания на активном стеке (почему их 2 функции?) inline _byte_ PlayMagicAnimation2(_int_ spell_anim_id, _int_ is_show_damage = 0) { return CALL_3(_byte_, __thiscall, 0x468570, o_BattleMgr, spell_anim_id, is_show_damage); }
// Проиграть анимацию самого стека inline _byte_ PlayStackAnimation(_int_ anim_id, _int_ is_restore_state) { if (is_restore_state) // если необходимо восстановить исходную стойку { CALL_4(_byte_, __thiscall, 0x446660, this, anim_id, -1, 0); return CALL_4(_byte_, __thiscall, 0x446660, this, 2, 1, 0); } else return CALL_4(_byte_, __thiscall, 0x446660, this, anim_id, -1, 0); }
// Сделать этот стек активным inline void SetActiveThisStack() { return CALL_3(void, __thiscall, 0x464F10, o_BattleMgr, this->side, this->index_on_side); }
// переместить стек (если не хватает дальности хода, стек не двинется) inline _byte_ Move(_int_ gex_id) { return CALL_3(_byte_, __thiscall, 0x445A30, this, gex_id, 0); }
// поворот стека в противоположную сторону inline _byte_ Rotate() { return CALL_2(_byte_, __thiscall, 0x445A30, this, 1); }
// Атаковать стеком (врукопашную) inline _byte_ Attack_Melee(_BattleStack_* enemy) { return CALL_3(_byte_, __thiscall, 0x441330, this, enemy, 2); }
// Атаковать стеком (стрелять) inline void Attack_Shoot(_BattleStack_* enemy) { return CALL_2(void, __thiscall, 0x43F620, this, enemy); }
// Отрисовка выстрела стека по противнику и полёта снаряда. inline void Draw_Shot(_BattleStack_* enemy) { CALL_2(void, __thiscall, 0x43EFE0, this, enemy); }
// может ли стрелять с проверкой на врага рядом _bool8_ CanShoot(_BattleStack_* aim = NULL) { return CALL_2(_bool_, __thiscall, 0x442610, this, aim); }
// впринципе умеет ли стрелять (без проверки на врага рядом) _bool8_ CanShoot2(_BattleStack_* aim = NULL) { if (this->creature_id == CID_ARROW_TOWER) return TRUE; if ( (this->creature.flags & BCF_CAN_SHOOT) && this->creature.shots > 0) return TRUE;
return FALSE; } // Получение второго гекса, занимаемого стеком (если стек 1-клеточный, первого). inline _int32_ GetSecondGexID() { return CALL_1(_int32_, __thiscall, 0x4463C0, this); } // Уничтожение стека. // dead_itself - умер ли стек сам собой (например, как клон при гибели хозяина или окончании длительности заклинания). inline void Die(_bool8_ dead_itself) { CALL_2(void, __thiscall, 0x443E40, this, dead_itself); }
// получение скорости стека inline _int_ GetSpeed() { return CALL_1(_int_, __thiscall, 0x4489F0, this); }
// может ли дойти стек до цели inline _int_ CanReachToTarget(int gex_target, int a3 = 0, int a4 = 0) { return CALL_4(_int_, __thiscall, 0x446960, this, gex_target, a3, a4); }
// получить иммунитет существа // caster_type: 0 - герой 1 - монстр, 2 - арт inline double GetResistMagic(int spell_id, int side, char a5, char a6, int caster_type) { return CALL_7(double, __thiscall, 0x5A83A0, o_BattleMgr, spell_id, side, this, a5, a6, caster_type); }
// получить ослабление силы магии (големы) inline int GetResistGolem(int spell_id, int damage) { return CALL_3(int, __fastcall, 0x44B180, damage, spell_id, this->creature_id); }
// получить получить ослабление силы магии (защита от воды и т.п.) inline int GetResistSpellProtection(int spell_id, signed int damage) { return CALL_3(int, __stdcall, 0x5A7EC0, damage, spell_id, this); }
// может ли колдовать как Сказочный Дракон inline _bool8_ CanCastSpellAkaFaerieDragon() { if (this->faerie_dragon_spell && this->creature.spells_count) { return TRUE; } return FALSE; }
// может ли монстр колдовать на позицию inline _bool8_ CanCastToGex(int targetPos) { return CALL_2(_bool8_, __thiscall, 0x4473E0, this, targetPos); }
// может ли монст колдовать на поле боя (расширенная функция указанной выше) _bool8_ CanCastToBattleField() { _bool8_ result = FALSE; for(int i=0; i<=187; i++) { if(this->CanCastToGex(i)) { result = TRUE; break; } } return result; }
// можно ли кастовать на монстра // 5A3F90 bool __thiscall CombatMan_CanUseSpell(_BattleMgr_ *this, int spell, int side, _BattleStack_ *targetMon, int a5, int a6) inline bool CanUseSpell(int spell_id, int side, char a5, int caster_type) { return CALL_6(bool, __thiscall, 0x5A3F90, o_BattleMgr, spell_id, side, this, a5, caster_type); }
// получить кол-во воскрешаемых существ (Архангелы или Пит-Лорды) inline int Get_Resurrect_Count(_BattleStack_* stack_target) { return CALL_2(int, __thiscall, 0x447050, this, stack_target); } // Получение номера стрелковой башни стека (-1 - стек не является стрелковой башней). inline _int32_ Get_ArrowTowerNum() { // Выбираем номер стрелковой башни в зависимости от её позиции (стандартный способ игры). switch (this->hex_ix) { case 254: return 0; case 251: return 1; case 255: return 2; default: return -1; } }
// WOG ФУНКЦИИ #define WOG_IS_HARPY *(_byte_*)0x75E05B #define WOG_IS_HARPY_HAG *(_byte_*)0x75E060 #define WOG_IS_DARKNESS_DRAGON *(_dword_*)0x75E064 _bool8_ WOG_isHarpy() { if( this->creature_id == WOG_IS_HARPY || this->creature_id == WOG_IS_HARPY_HAG || this->creature_id == WOG_IS_DARKNESS_DRAGON || CALL_1(int, __cdecl , 0x71E433, this) ) { return TRUE; } return FALSE; } };
PHP Code:
NOALIGN struct _AdvMgr_: _Struct_ // size: 952 bytes = 0x3B8 { _Manager_ mgr; // 0...56 _ptr_ pNetMsgHandler; // +56 0x38 _byte_ DebugShowFPS; // +60 0x3C _byte_ DebugViewAll; // +61 0x3D _byte_ f_3E[2]; // +62..63 выравнивание _int_ advCommand; // +64 0x40 _ptr_ advWindow; // +68 0x44 _ptr_ pRouteArray; // +72 0x48 _int_ bShowRoute; // +76 0x4C _int_ seedingValid; // +80 0x50 _int_ fullySeeded; // +84 0x54 _int_ lastTerrain; // +88 0x58 _GameMap_* map; // +92 0x5C _Def_* groundTileset[10]; // +96 0x60 _Def_* riverTileset[5]; // +136 0x88 _Def_* roadTileset[4]; // +156 0x9C _Def_* borderTileset; // +172 0xAC _Def_* arrowTileset; // +176 0xB0 _Def_* gemIcons[4]; // +180 0xB4 _Def_* starTileset; // +196 0xC4 _Def_* radarIcons; // +200 0xC8 _Def_* cloudIcons; // +204 0xCC _H3Vector_ CachedGraphics; // +208 0xD0 _Def_* monAttackSprites; // +224 0xE0 type_point mapOrigin; // +228 0xE4 type_point lastMapHover; // +232 0xE8 _int_ lastHoverX; // +236 0xEC _int_ lastHoverY; // +240 0xF0 _int_ scrollX; // +244 0xF4 _int_ scrollY; // +248 0xF8 _int_ animFrame; // +252 0xFC _int_ animCtr; // +256 0x100 _byte_ animCtrPaused; // +260 0x104 _byte_ f_105[3]; // +261...263 выравнивание _int_ flagFrame; // +264 0x108 _Def_* cursorIcons[18]; // +268 0x10C _Def_* boatIcons[3]; // +340 0x154 _Def_* boatFrothIcons[3]; // +352 0x160 _Def_* flagIcons[8]; // +364 0x16C _Def_* boatFlagIcons[24]; // +396 0x18C _byte_ heroVisible; // +492 0x1EC _byte_ f_1ED[3]; // +493...495 выравнивание _int_ heroType; // +496 0x1F0 _int_ heroDirection; // +500 0x1F4 _int_ heroBaseFrame; // +504 0x1F8 _int_ heroSequence; // +508 0x1FC _int_ heroFrameCount; // +512 0x200 _int_ heroTurning; // +516 0x204 _int_ heroDrawn; // +520 0x208 _byte_ bCurHeroMobile; // +524 0x20C _byte_ f_20D[3]; // +525...527 выравнивание _int_ iShowMode; // +528 0x210 _int_ bForceCompleteDraw; // +532 0x214 _int_ monAttackObjIndex; // +536 0x218 _int_ monAttackSpriteIndex; // +540 0x21C _int_ monAttackFlip; // +544 0x220 _int_ touchedSounds; // +548 0x224 _SoundNode_ soundArray[4]; // +552 0x228 _Wav_* loopedSample[70]; // +584 0x248 _Wav_* heroSamples[11]; // +864 0x360 _int_ bHeroLogoShowing; // +908 0x38C _byte_ bHeroMoving; // +912 0x390 _byte_ f_391[3]; // +913...915 выравнивание _int_ CurrentBottomView; // +916 0x394 (enum EBottomViewType) _int_ BottomViewOverride; // +920 0x398 (enum EBottomViewType) _int_ BottomViewOverrideEndTime; // +924 0x39C _int_ BottomViewResource; // +928 0x3A0 _int_ BottomViewResourceQty;// +932 0x3A4 _H3Str_ BottomViewText; // +936 0x3A8 (std::string) // end: +952 0x3B8 };
_SoundNode_ // Size = 8 { _int_ soundId; // enum e_looping_sound_id _int_ priority; }
enum AdvManager::EBottomViewType { BVTYPE_NONE = 0, BVTYPE_NEW_TURN = 1, BVTYPE_KINGDOM = 2, BVTYPE_HERO = 3, BVTYPE_TOWN = 4, BVTYPE_ENEMY_TURN = 5, BVTYPE_RESOURCE_MESSAGE = 6, BVTYPE_MESSAGE = 7, BVTYPE_HOLD = 8 }
RE: Полные исходники проекта WoG - daemon_n - 05.12.2023 17:25
igrik Wrote:_int32_ spellAfterAttack; // +236 0xEC номер заклинания существа в тек раунде 0x50 Acid breath
данное поле отвечает за номер заклинания, наложенного на отряд, чтобы применить эффект и проиграть анимацию здесь:
Code:
0x468570 char __thiscall BattleMgr_DrawAction_Play(_BattleMgr_ *this, int a2, int a3)
а если точнее, то здесь 0x468CAE. Так что предлагаю переименовать параметр или сменить/добавить уточнение к описанию.
RE: Полные исходники проекта WoG - IDK - 27.12.2023 11:42
Оно не открывается, что делать?
Ошибка 0x8096002A, ОС windows 11, извлекал архив с помощью встроенного проводника.
RE: Полные исходники проекта WoG - daemon_n - 27.12.2023 14:00
IDK, ты пытаешься открыть архив виндой, вот она и ругается.
Windows не умеет работать с архивами. Используй 7z, например. Он даже с ЭРА поставляется, в папке Мод-менеджера, а лучше скачай и установи - программа абсолютно бесплатная
RE: Полные исходники проекта WoG - IDK - 28.12.2023 07:52
ОК, спс
RE: Полные исходники проекта WoG - IDK - 28.12.2023 08:08
Т.е. теперь я могу скомпилить это все и получу готовый мод?
RE: Полные исходники проекта WoG - IDK - 28.12.2023 08:15
Или надо что-то еще скачать? И где все спрайты?
Попробовал скачать IDA pro с торрента который был вместе с БД, но там версия на Mac OS, а IDA freeware не поддерживает формат idb. Что делать? Есть ли пиратка IDA pro на windows или БД другом формате?
|