Wake of Gods Forum | Форум Во Имя Богов

Full Version: Стандартизированная база героев 3
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2 3
Приветствую коммьюнити мододелов! Представляю вашему вниманию свою базу данных героев, содержащую скромное количество оригинальных сигнатур. Суть в том, чтобы восстановить остальные неизведанные сигнатуры игры, применяя знания 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/1MY28K8c...sp=sharing
RoE-Dreamcast-база: https://drive.google.com/file/d/1rAWaKjz...sp=sharing

ТЕХНИЧЕСКИЕ ОСОБЕННОСТИ ОРИГИНАЛЬНОЙ ПК-ВЕРСИИ ГЕРОЕВ МЕЧА И МАГИИ 3:
Как продолжить восстановление сигнатур и типов?
Я применяю примерно следующие тактики:
1. Захожу в область интересующего класса
2. Нахожу "пробелы" ввиде неизученных методов/функций
3. Смотрю где они применяются
4. Сравниваю функцию по внутреннему устройству с функцией в дримкаст базе по ассемблерному листингу. Зачастую, вызовы функций идут по порядку. БУДЬТЕ ПРЕДЕЛЬНО ВНИМАТЕЛЬНЫ СО ВСТРОЕННЫМИ ФУНКЦИЯМИ!
5. Называю относительно базы Dreamcast. (Нажимаете на кнопку n и копируете функцию со всеми странными символами(это называется деманглер, позволяет в строке зашифровать сигнатуру функции https://en.wikiversity.org/wiki/Visual_C...e_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
Прошу обратить внимание, что сигнатуры шифруются с помощью манглера Visual Studio. https://en.m.wikiversity.org/wiki/Visual...e_mangling
На стадии компиляции, если включен debug-режим(что и сделали по ошибке программисты NWC при выпуске DreamCast версии героев 3), сигнатуры функций сохраняются в памяти программы и их можно использовать для изучения работы программы.

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

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

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

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

UPD: какая версия IDA необходима для открытия данного файла? 7-ой явно не хватает
Без комментариев. 132
Кто-нибудь может выгрузить имена с адресами функций в текстовый вид? Ибо эту базу невозможно открыть из 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 не имеют к этому отношения. Портом занимались непосредственно подрядчики из Юбисофт (а чужой код обычно не ценят и не редко допускают утечки).
void_17, большое спасибо за базы. 7-ая ИДА не открыла.
Если быть точнее, это версия 7.6.

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

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

Блин, я даже предположить не мог, что в наше время используют такую версию Windows. Вроде был где-то скрипт для импорта и экспорта имен. Если таковой имеется, отправлю вам.
(21.11.2021 19:15)daemon_n Wrote: [ -> ]Знаю по ida и дизассемблированию не так много, потому спрашиваю, есть ли возможность смержить твою базу сигнатур с уже имеющейся на форуме базой из этого поста?


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

Но учтите, что я еще не все типы изучил и переименовал. К тому же, в моей базе есть типы, которых нет в воговской; также поудалил "мусорные" типы в воговской. Основные продвижения есть в области ИИ и нетолько. Надеюсь мне в этом деле кто-то поможет.
void_17, стало любопытно, раз ты так глубоко, не побоюсь этого слова, копнул игру, то значит была тому причина, а не простое любопытство? 116
над чем работал/работаешь по части моддинга Героев3 ?Unsure
(23.11.2021 23:21)Bes Wrote: [ -> ]void_17, стало любопытно, раз ты так глубоко, не побоюсь этого слова, копнул игру, то значит была тому причина, а не простое любопытство? 116
над чем работал/работаешь по части моддинга Героев3 ?Unsure

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

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

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

Потом мне захотелось игру переписать, но это офигеть можно самому делать, поэтому создал тред, в котором мы помогаем друг другу.
Если есть желание и/или необходимость, можем создать отдельный канал в дискорде ERA (ссылка в подписи).
У меня уже свой есть.
https://discord.gg/BrbwGNFYgP
Ковырял разные версии героев. Оказывается, все это время у нас под носом лежала андроид версия 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/1zA5cjRc...sp=sharing
https://drive.google.com/file/d/1MY28K8c...sp=sharing

Обновил базу до версии BETA 2.0
Перевел на новый экзешник и добавил типов, которых не было. Разобрано много типов, которые не были разобраны в старой базы или были разобраны не до конца. Надеюсь на помощь коммьюнити на улучшение базы, в первую очередь восстановление типов.
(23.01.2022 12:21)void_17 Wrote: [ -> ]Обновил базу до версии BETA 2.0

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

Code:
struct CSequence
{
  int numFrames;
  int allocatedFrames;
  CSpriteFrame **f;
};
Pages: 1 2 3
Reference URL's