Wake of Gods Forum | Форум Во Имя Богов
Стандартизированная база героев 3 - Printable Version

+- Wake of Gods Forum | Форум Во Имя Богов (http://wforum.heroes35.net)
+-- Forum: Герои Меча и Магии 3.5 WoG/ERA (/forumdisplay.php?fid=99)
+--- Forum: Библиотека по моддингу (/forumdisplay.php?fid=186)
+--- Thread: Стандартизированная база героев 3 (/showthread.php?tid=6419)


Стандартизированная база героев 3 - void_17 - 21.11.2021 18:08

Приветствую коммьюнити мододелов! Представляю вашему вниманию свою базу данных героев, содержащую скромное количество оригинальных сигнатур. Суть в том, чтобы восстановить остальные неизведанные сигнатуры игры, применяя знания STL C++, общие наблюдения о работе игры и, собственно, источник сигнатур - базу данных RoE Dreamcast. К сожалению, IDA не имеет встроенного декомпилятора для SH-4(RISC-процессора Sega Dreamcast), поэтому приходится анализировать только ассемблерный листинг. Ghidra имеет декомпилятор SH-4, но он очень кривой.

Image: Screenshot-functions.png
Image: Screenshot-pseudocode.png
Image: Screenshot-types.png

Ссылки для скачивания:
SoD-База by Void_17: https://drive.google.com/file/d/1MY28K8cVbAeBzAbBBBf5ZeK-0aLMfz_d/view?usp=sharing
RoE-Dreamcast-база: https://drive.google.com/file/d/1rAWaKjzy8q23wUBiHs_SlifPGuJ1U2B-/view?usp=sharing

ТЕХНИЧЕСКИЕ ОСОБЕННОСТИ ОРИГИНАЛЬНОЙ ПК-ВЕРСИИ ГЕРОЕВ МЕЧА И МАГИИ 3:
Как продолжить восстановление сигнатур и типов?
Я применяю примерно следующие тактики:
1. Захожу в область интересующего класса
2. Нахожу "пробелы" ввиде неизученных методов/функций
3. Смотрю где они применяются
4. Сравниваю функцию по внутреннему устройству с функцией в дримкаст базе по ассемблерному листингу. Зачастую, вызовы функций идут по порядку. БУДЬТЕ ПРЕДЕЛЬНО ВНИМАТЕЛЬНЫ СО ВСТРОЕННЫМИ ФУНКЦИЯМИ!
5. Называю относительно базы Dreamcast. (Нажимаете на кнопку n и копируете функцию со всеми странными символами(это называется деманглер, позволяет в строке зашифровать сигнатуру функции https://en.wikiversity.org/wiki/Visual_C%2B%2B_name_mangling )
Но это если очень поверхностно, мне честно говоря трудно описать абсолютно все в деталях, я уже как-то интутивно это все делаю.
Сложности:
>STL функции и контейнеры, их методы. Затрудняют изучение засчет загромождения встроенными(inline) функциями.
>Встроенные функции. Основная попаболь всех тех, кто изучает внутреннее устройство программ.
Совет: помечайте повторяющимся комментарием(кнопка ";") и цветом те функции, которые встроены в SoD, но не в RoE-Dreamcast. (я помечал некоторые голубым цветом и комментарием "inline function")
>Dreamcast база -- RoE. А моя база -- ПК-SoD. Но впринципе, это не особо страшно, так как новведения относительно легко заметить.
>Не все функции идут друг за другом так, как в Dreamcast-базе. Есть одна из тактик, при которой можно просто брать сигнатуры из Dreamcast-базы, но нужно быть предельно осторожным, т.к. это не всегда так и там, где, казалось бы, в Dreamcast-базе по порядку идут методы одного класса, в SoD прямо посреди этого "ряда" может быть кусок другого класса.


Остальное распишу потом. Отвечу на все вопросы и дам рекоммендации ИТТ. Надеюсь, что коммьюнити продолжит мое дело по приведению базы игры в порядок и систематизации всего, что известно об игре. Будем сотрудничать. Тред на другом форуме: https://handbookhmm.ru/forum/viewtopic.php?f=56&t=968

Соглашения об именах:

1. Функции
Если вы не знаете, что метод точно принадлежит классу, но пока не до конца знаете, что это за сигнатура(или ее вообще нет в Dreamcast), следует переименовать функцию по следующему шаблону: имякласса_адрес
пример: combatManager_46A150
Если вы узнали, что эта сигнатура есть и функция с данной сигнатурой совпадает или почти полностью совпадает с функцией в Dreamcast-базе, скопируйте сигнатуру из Dreamcast-базы вместо имени этой функции. Если функция была добавлена в AB/SoD, отразите это перед именем метода.
Пример: combatManager::SOD_is_in_fear

2. Поля структур/классов:
Называть поля согласно CamelCase.
Пример: SoundFileName.
Неизвестные поля называть field_смещение или f_смещение
Неиспользуемые поля называть unused_смещение или u_смещение

3. Аргументы функций и локальные переменные:
Аргументы функций называть с заглавной буквы(искл.: this)
Локальные переменны со строчной. Желательно избегать snake_case.

4. Глобальные переменные
Приставка g — global, перед каждой глобальной переменной,
после нее p — pointer, если переменная является указателем или первая буква в названии типа, если НЕ указатель и НЕ целый класс/структура. Например глобальная int-переменная будет giVar


RE: Стандартизированная база героев 3 - void_17 - 21.11.2021 18:20

Прошу обратить внимание, что сигнатуры шифруются с помощью манглера Visual Studio. https://en.m.wikiversity.org/wiki/Visual_C%2B%2B_name_mangling
На стадии компиляции, если включен debug-режим(что и сделали по ошибке программисты NWC при выпуске DreamCast версии героев 3), сигнатуры функций сохраняются в памяти программы и их можно использовать для изучения работы программы.

Например:
Code:
abc<def<int>,void*>::xyz
манглер превратит и представит ввиде
Code:
xyz@?$abc@V?$def@H@@PAX@@

Но сохраненных в памяти SoD сигнатур нет, поэтому приходится вручную сравнивать и копировать имена из Dreamcast версии, что позволяет ну, во-первых, видеть более красивые функции, а также изучать и называть неизведанные функции, которые в воговской базе вообще имели вид sub_адрес.


RE: Стандартизированная база героев 3 - daemon_n - 21.11.2021 19:15

void_17, приветствую новое лицо на нашем форуме!

Огромное спасибо за вклад и желание помочь любимому [мне] комьюнитиYes

Знаю по ida и дизассемблированию не так много, потому спрашиваю, есть ли возможность смержить твою базу сигнатур с уже имеющейся на форуме базой из этого поста?

UPD: какая версия IDA необходима для открытия данного файла? 7-ой явно не хватает


RE: Стандартизированная база героев 3 - Raistlin - 21.11.2021 19:32

Без комментариев. 132


RE: Стандартизированная база героев 3 - XEPOMAHT - 21.11.2021 19:33

Кто-нибудь может выгрузить имена с адресами функций в текстовый вид? Ибо эту базу невозможно открыть из Windows 2003. Moral У меня старая от WoG Team, с именами функций от Сава, хотелось бы постепенно дополнить её и оригинальными именами.

(21.11.2021 18:08)void_17 Wrote:  Код игры можно разделить на две большие части:
Интерфейс и Игровая Логика.

Вообще-то там 140 частей, по количеству *.cpp файлов с сишным кодом.


(21.11.2021 18:20)void_17 Wrote:  что и сделали по ошибке программисты NWC при выпуске DreamCast версии героев 3

Программисты из NWC не имеют к этому отношения. Портом занимались непосредственно подрядчики из Юбисофт (а чужой код обычно не ценят и не редко допускают утечки).


RE: Стандартизированная база героев 3 - Berserker - 21.11.2021 23:20

void_17, большое спасибо за базы. 7-ая ИДА не открыла.


RE: Стандартизированная база героев 3 - void_17 - 22.11.2021 00:08

Если быть точнее, это версия 7.6.

Извиняюсь. Просто только в версиях 7.х IDA поддерживает инструкции SH-4. Еще там стоит парочку плагинов для удобства, поэтому сижу на новейшей версии.

(21.11.2021 19:33)XEPOMAHT Wrote:  Кто-нибудь может выгрузить имена с адресами функций в текстовый вид? Ибо эту базу невозможно открыть из Windows 2003. Moral У меня старая от WoG Team, с именами функций от Сава, хотелось бы постепенно дополнить её и оригинальными именами.

Блин, я даже предположить не мог, что в наше время используют такую версию Windows. Вроде был где-то скрипт для импорта и экспорта имен. Если таковой имеется, отправлю вам.


RE: Стандартизированная база героев 3 - void_17 - 22.11.2021 00:16

(21.11.2021 19:15)daemon_n Wrote:  Знаю по ida и дизассемблированию не так много, потому спрашиваю, есть ли возможность смержить твою базу сигнатур с уже имеющейся на форуме базой из этого поста?


Если я не ошибаюсь, это — та самая база, на которой я основывался. Дойдут руки, сделаю соответствующий список типов по шаблону:
оригинальное название — воговская база;

Но учтите, что я еще не все типы изучил и переименовал. К тому же, в моей базе есть типы, которых нет в воговской; также поудалил "мусорные" типы в воговской. Основные продвижения есть в области ИИ и нетолько. Надеюсь мне в этом деле кто-то поможет.


RE: Стандартизированная база героев 3 - Bes - 23.11.2021 23:21

void_17, стало любопытно, раз ты так глубоко, не побоюсь этого слова, копнул игру, то значит была тому причина, а не простое любопытство? 116
над чем работал/работаешь по части моддинга Героев3 ?Unsure


RE: Стандартизированная база героев 3 - void_17 - 28.11.2021 14:52

(23.11.2021 23:21)Bes Wrote:  void_17, стало любопытно, раз ты так глубоко, не побоюсь этого слова, копнул игру, то значит была тому причина, а не простое любопытство? 116
над чем работал/работаешь по части моддинга Героев3 ?Unsure

Извините, что отвечаю через неделю, я просто на другом форуме активничаю.

На самом деле я особо конкретно моддингом не интересуюсь. Хотелось бы игру переписать, чтобы упростить жизнь моддерам, а пока не все еще изучено, эта база будет служить на верность моддерам. Да, я знаю, что есть VCMI.

Хотя, все же давно, год так назад, хотел сделать мод Heroes 3 Cup of Titan.
Там были бы новые кампании, баланс и прочее, но особо много нововведений не было бы. По-сути, это был бы "соревновательный" SoD.

Потом мне захотелось игру переписать, но это офигеть можно самому делать, поэтому создал тред, в котором мы помогаем друг другу.


RE: Стандартизированная база героев 3 - Elmore - 28.11.2021 17:45

Если есть желание и/или необходимость, можем создать отдельный канал в дискорде ERA (ссылка в подписи).


RE: Стандартизированная база героев 3 - void_17 - 28.11.2021 18:29

У меня уже свой есть.
https://discord.gg/BrbwGNFYgP


RE: Стандартизированная база героев 3 - void_17 - 16.12.2021 17:37

Ковырял разные версии героев. Оказывается, все это время у нас под носом лежала андроид версия HD edition с дебажными символами.
Image: Screen1.png

Image: Screen-2.png

dotemu это разработчики Heroes 3 HD edition если что.

Весь кайф в том, что IDA умеет декомпилировать little endian ARM. Из недостатков пожалуй отличие от оригинальных структур и классов и еще огромное количество встроенных функций, прямо как в SoD, поэтому дримкаст все еще актуален, так как меньше всего подвергся оптимизации.

Качайте и смотрите сами: https://drive.google.com/file/d/1zA5cjRc5lO3w9AfT_FKGvin8FzXBV9UU/view?usp=sharing


RE: Стандартизированная база героев 3 - void_17 - 23.01.2022 12:21

https://drive.google.com/file/d/1MY28K8cVbAeBzAbBBBf5ZeK-0aLMfz_d/view?usp=sharing

Обновил базу до версии BETA 2.0
Перевел на новый экзешник и добавил типов, которых не было. Разобрано много типов, которые не были разобраны в старой базы или были разобраны не до конца. Надеюсь на помощь коммьюнити на улучшение базы, в первую очередь восстановление типов.


RE: Стандартизированная база героев 3 - pobr - 23.01.2022 15:10

(23.01.2022 12:21)void_17 Wrote:  Обновил базу до версии BETA 2.0

CSequence это массив указателей:

Code:
struct CSequence
{
  int numFrames;
  int allocatedFrames;
  CSpriteFrame **f;
};



RE: Стандартизированная база героев 3 - pobr - 23.01.2022 15:18

И еще насчет таблиц виртуальных функций, можно сделать еще красивей. На примере класса resource:

Code:
struct resource_vtbl
{
    resource *(__thiscall *delete)(resource *__hidden this, uint flags);
};

struct __cppobj resource
{
    resource_vtbl *__vftable;
};

В псевдокоде будет выглядеть натурально как вызов функции C++.


RE: Стандартизированная база героев 3 - void_17 - 24.01.2022 07:40

(23.01.2022 15:10)pobr Wrote:  
(23.01.2022 12:21)void_17 Wrote:  Обновил базу до версии BETA 2.0

CSequence это массив указателей:

Code:
struct CSequence
{
  int numFrames;
  int allocatedFrames;
  CSpriteFrame **f;
};

Пока переписывал с RoE, звездочку забыл... 147
Сейчас обновлю и еще парочку ошибок исправлю.

(23.01.2022 15:18)pobr Wrote:  И еще насчет таблиц виртуальных функций, можно сделать еще красивей.

Хорошая идея кстати говоря, думал об этом, но никак руки не дошли. Чуть позже запилю.


RE: Стандартизированная база героев 3 - void_17 - 24.01.2022 09:24

https://drive.google.com/file/d/1MY28K8cVbAeBzAbBBBf5ZeK-0aLMfz_d/view?usp=sharing

Обновил базу (2.1 -> 2.1.1)
Исправил типы:
game,
combatManager,
CSequence,
CSprite.


Добавил парочку сигнатур, а также типы некоторых таблиц виртуальных функций.


RE: Стандартизированная база героев 3 - pobr - 24.01.2022 09:53

В классе resource судя по дампу поле Name равно не 16 байт, но четыре байта никогда не используются.


RE: Стандартизированная база героев 3 - void_17 - 24.01.2022 13:42

Еще раз обновил базу, т.к. в очередной раз наткнулся на собственную невнимательность. Сместились поля дальше worldMap. Пофиксил это дело.


RE: Стандартизированная база героев 3 - igrik - 25.01.2022 05:59

(24.01.2022 15:38)void_17 Wrote:  Получается, combatManager разобран абсолютно полностью(кроме поля unknown1). Спустя стольких лет..
Агонь, мужики! Это очень круто!

UPD: я не могу быть уверен на 100%, но склоняюсь что тут пропущено 2 байта (если говорить о SoD)
Code:
int iNextActionGridIndex2;
uchar iLastDrawGridShade[187];
uchar iCurDrawGridShade[187];
.. вот тут пропущено 2 байта (в SOD)
struct hexcell cell[187];
int combatTerrain;



RE: Стандартизированная база героев 3 - void_17 - 26.01.2022 08:19

В SoD-овской базе я делал combatManager как раз под SoD, сверяя с тем, что есть у sav-a. Согласно оператору new ( см. функцию InitMainClasses() ), размер combatManager - 0x140EC, что собственно у меня в базе и есть. Да и доступ к переменным не сбивается. Поэтому все ок, не волнуйтесь.


RE: Стандартизированная база героев 3 - igrik - 26.01.2022 08:53

Ты ко мне на вы? И я немного о другом говорю...

Доступ в базе то не сбивается, потому что эти 2 байта как раз в базе и указаны.
А в описанном тобой классе - нет. Т.е. нельзя просто взять и сходу использовать указанный класс, что в свою очередь неосвещённых может поставить в тупик. И таких мест далеко не одно (видимо из-за выравнивания).

... Я о том, что такой важный момент желательно указывать.


RE: Стандартизированная база героев 3 - pobr - 28.01.2022 12:01

То, что сейчас называется SpriteResourceFile, это не LODFile, как было в Dreamcast версии. Теперь это структура из указателя на имя файла и собственно LODFile (400 байт):

Code:
struct LODFileMapItem
{
  const char *path;
  LODFile lod;
};

Сам LODFile выглядит так (396 байт):

Code:
struct LODFile
{
  FILE *fileptr;
  char LODFileName[256];
  int opened;
  uchar *dataBuffer;
  ulong dataBufferSize;
  int dataItemIndex;
  int dataPos;
  int matchindex;
  LODHeader header;
  int numEntries;
  std::vector subindex;
};

И таких структур 8 штук, возможно массив.


RE: Стандартизированная база героев 3 - Berserker - 29.01.2022 01:13

Да, массив.