Объявления

Друзья, если не получается зарегистрироваться, напишите на почту vdv_forever@bk.ru.
Я оторву свою задницу от всех дел и обязательно Вас активирую! :smile10:
Добро пожаловать на геройский форум! :smile25:

База данных IDA от void17

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineАватара пользователя
void_17  
имя: имя
Ветеран
Ветеран
 
Сообщения: 548
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 132 раз.

Re: База данных IDA от void17

Сообщение void_17 » 12 май 2024, 15:23

Добрый день, @Evgeni! Я на некоторое время отлучился от интернета. Готов ответить на ваши вопросы.

Evgeni писал(а):

Уважаемый DM.

Можно просто void_17, DM — это мое ФИ ^)

Evgeni писал(а):

Когда вижу, что Вы выложили код ai_tactical.cpp - правильно понимаю, что благодаря некому коду, скомпилированнному для MAC Вам удалось с использованием старого компилятора получить нормально читаемый исходный код компонента, отвечающего за логику работы искусственного интеллекта компьютера, согласно которой он воюет в бою с человеком и с другими компьютерами?


Нет, к сожалению база Mac мало чем полезна. Те два сообщения не связаны между собой. Я использую базу игры x86, скачать оную можно в первом посте этого треда. Требуется версия 7.7 программе IDA Pro.

Я использую обычный декомпилятор IDA Pro 7.7 — Hex-Rays, — для декомпиляции кода. Используя мои (весьма скудные, но достаточные) знания информатики и языка программирования Си(а так же старого C++98), я сворачиваю компиляторные оптимизации и полирую код до удобочитаемого вида.

Evgeni писал(а):

На сколько это сложно делается? (Если Вас не затруднит - хотя бы кратко объясните)
Можно ли эту методу научить и применить его группой программистов для получения в итоге всех cpp файлов героев в удобочитаемостям виде, поскольку Ubisoft код кажется не даёт никому? (И затем скомпилировать игру со своими модификациями, в частности очень интересен AI?)

Можно ли декомпилировать всю игру? Теоретически да, можно, но не вижу смысла декомпилировать все, например CRT(реализацию стандартной библиотеки Си, зашитой линкером в экзешник) . Научить методике? Честно говоря не знаю что можно придумать. Просто смотреть листинг кода, который выдает декомпилятор Hex-Rays, понять логику кода и переписать на чистом C++, желательно без запутанных goto и прочих оптимизаций.

Что насчет выборочной декомпиляции игры — она нужна только для чтения, так сказать, для справки. Читаешь и делаешь выводы. Я не против если кто-то использует декомпилированный мною код для своих проектов, по сути я публикую их без лицензии.

Evgeni писал(а):

Мне всегда было интересно, возможно ли изменить AI компьютера в HOMM 3 в сторону усложнения и усиления, чтобы компьютер мог играть более сильно. Делить стеки существ, отделяя «единички» для принятия удара. И научить компьютер действовать более интеллектуально.

Да что угодно, серьёзно. Вопрос только где найти столько времени и сил, а первого особенно не хватает. Я занимаюсь только тем, что мне самому интересно. На заказ ничего не делаю. Делюсь(в отличие от HotA Crew) своими наработками свободно, я — за развитие коммьюнити, но не в одиночку. Хочу чтобы подтянулись энтузиасты.

Evgeni писал(а):

Но главный вопрос - можете ли Вы, в теории, извлечь с помощью «волшебной» методики код игры, чтобы можно было дописать логику AI?

"Извлечь" — в смысле декомпилировать? Как видите я уже умею, иногда делюсь кодом. Пользуйтесь на здоровье. Но делаю я это добровольно. И декомпилирую я отдельные вещи, в игре свыше 2000 функций, уйдет очень много времени чтобы декомплировать вообще всё, а я к тому же такой цели не ставлю.

Дополнить ИИ можно. Я работаю над библиотекой для C++ под названием NH3API, которая облегчит труд программиста моддера. Все гайды я составлю, просто подождите немного, может быть пару недель или месяц.

Evgeni писал(а):

Или чтобы можно было взяв графические ресурсы героев и исходные коды - повторить проект, но в unity?

Во-первых, это нарушение интеллектуальной собственности. Во-вторых, исходники графики и кода только у Ubisoft и их подрядчиков dotemu, и должны оставаться у них по закону. А вообще мне лично не интересен клон героев, интересен моддинг на их основе.

Evgeni писал(а):

Вообще на основе героев + unity можно было бы сделать уникальный проект по обучению созданию игр.


Пожалуйста, вбивайте в гугл "Open-Source Games", тысячи их.
Моя любимая, наверное, Battle for Wesnoth — опубликована под GNU GPL.
Кросс-платформерная стратегия со звуком, мультиплеером, редактором уровней. Пожалуйста изучайте, я иногда сам заглядываю, подчерпнуть приемы при работе с библиотекой SDL.
Вернуться к началу

offlineEvgeni  
имя: Evgeni
 
Сообщения: 2
Зарегистрирован: 04 май 2024, 08:55
Пол: Мужчина
Поблагодарили: 0 раз.

Re: База данных IDA от void17

Сообщение Evgeni » 15 май 2024, 00:09

Void_17, спасибо за такой объёмный и развёрнутый ответ!
В Вашем ответе много полезной информации!

В оригинальной версии Героев III меня всегда очень интересовал именно вопрос работы AI.
Конечно области работы AI можно подразделить на несколько вещей:
1) Выбор как строить город
2) Выбор как исследовать карту
3) Тактика боя с человеком/компьютером
И прочие сферы работы AI

Возможно я не до конца понимаю трудоемкость того, что сейчас спрошу, поэтому заранее извиняюсь за вопрос.

Вы можете показать пример, как действовать, чтобы в exe файле героев найти ту часть, которая отвечает за выбор компьютером решения о расстановке армии в ячейках перед боем и о делении или не делении стека на части?

На сколько сложно эту логику, прописанную в exe - модифицировать по своему усмотрению?

Если возможно объяснить принцип действий по такому примеру, то мне кажется - этого урока будет достаточно для понимания как работать над модификацией игры.

Заранее спасибо за ответ! С уважением, Евгений.
Вернуться к началу

offlineMmxportal  
имя: Леонид
 
Сообщения: 2
Зарегистрирован: 14 май 2024, 10:58
Пол: Мужчина
Поблагодарили: 0 раз.

Re: База данных IDA от void17

Сообщение Mmxportal » 16 май 2024, 10:23

Здравствуйте. Играю в HoTA только с друзьями. Для себя сделали много изменений, то, что м.б. подправить в текстовых файлах без знания программирования. Теперь появилось желание изменить свойства некоторых вторичных навыков и артефактов. Ищу кто может это сделать.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: База данных IDA от void17

Сообщение AlexSpl » 16 май 2024, 14:56

Моддинг HotA официально не приветствуется. Кроме того, HotA уже давно не поддерживает плагины, что делает моддинг этого аддона неэффективным. Есть, конечно, потуги энтузиастов, редактирующих код с помощью шестнадцатеричных редакторов, но такие правки быстро становятся неактуальными. Я предлагал сделать билд специально для моддинга (с выпиленным лобби) и пусть он даже на одну версию ниже будет, чем последняя (хотя даже это некоторых не устраивает: все хотят моддить актуальный контент). TL;DR: Моддинг HotA возможен, даже с помощью тех же кастомных плагинов, но вряд ли кто-то будет этим заниматься всерьёз, т.к. нужно патчить динамические библиотеки, которые часто изменяются при обновлении HD мода (игра не стоит свеч).
Вернуться к началу

offlineMmxportal  
имя: Леонид
 
Сообщения: 2
Зарегистрирован: 14 май 2024, 10:58
Пол: Мужчина
Поблагодарили: 0 раз.

Re: База данных IDA от void17

Сообщение Mmxportal » 17 май 2024, 10:25

AlexSpl, спасибо за разъяснения. Жаль, что с моддингом так сложно.
Вернуться к началу

offlineАватара пользователя
void_17  
имя: имя
Ветеран
Ветеран
 
Сообщения: 548
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 132 раз.

Re: База данных IDA от void17

Сообщение void_17 » 21 май 2024, 06:33

Несмотря на очень ограниченное время(у меня сессия), работа над NH3API продолжается.
1. Почти полностью переписан exe_vector и хорошо оптимизирован для C++11, в целом работа над контейнерами практически полностью завершена(кроме map<Key, T>, там достаточно сложно :smile5: ). (Теоретически, костяк NH3API можно теперь использовать не только для героев 3, но и для любой игры написанной под VC6, стоит лишь только поменять адреса в пару местах)

2. Работа с allocator-ами генерализирована с помощью класса __nh3api::allocator_adaptor, можно написать свой allocator (например такой, что будет считать ссылки или контролировать утечки памяти) и он будет работать как родной в любом контейнере NH3API. Это нужно в т.ч. для соответствия стандарту C++ и для поддержки новых компиляторов.

3. Настройка NH3API будет очень гибкой. На данный момент существуют три флага:
- NH3API_FLAG_NO_CPP_EXCEPTIONS: отключить поддержку исключений C++ и их обработку внутри NH3API. Это может сильно уменьшить количество генерируемого кода, но если например exe_vector::at(n) выйдет за пределы, то программа завершит свое выполнение(пройдя предварительно через фильтр SEH-исключений, т.е. в MSVC их всё еще можно будет поймать с помощью __try, __except). Отключен по умолчанию. Не рекоммендуется. Автоматически включает NH3API_FLAG_NOTHROW_NEW.
- NH3API_FLAG_NOTHROW_NEW: перегрузка оператора new, используемая allocator-ами и соответственно контейнерами по умолчанию проверяет на нулевой указатель и может выбросить std::bad_alloc(или std::bad_array_new_length для new[])
Ну и наверное самый интересный флаг, доступный только с C++17. Позволяет использовать NH3API только как header-only библиотеку, без системы сборки. Отключен по умолчанию. Не рекоммендуется. Лучше всего использовать в связке с NH3API_FLAG_NO_CPP_EXCEPTIONS, однако может работать и без него.
- NH3API_INLINE_HEADERS: все standalone функции и глобальные переменные NH3API помечаются как inline, что позволяет просто прописать где-то этот флаг, добавить #include <nh3api.hpp> и можно полноценно пользоваться библиотекой без каких-либо CMake и прочего! :smile11:
(Работает только на C++17 и выше)
Такой флаг не рекоммендуется для больших проектов. Лучше всего подходит для helloworld-ов, мелких багфиксов и плагинов-примеров что тут постят.
Те же newspells будем собирать CMake-ом.
- _CRT_SECURE_NO_WARNINGS: Если этот флаг прописан, это отключает предупреждения об использовании deprecated функционала библиотеки.

4. Из главного: patcher_x86 обновлен до версии 5.0
- Добавлены новые функции WriteSafeLoHook и CreateSafeLoHook для PatcherInstance. Они доступны в новых версиях patcher_x86 начиная примерно с 2021. Бараторч рекоммендует использовать именно их. Старые LoHook-и помечены как deprecated.
Изменения:
- Другой контекст хука, SafeHookContext. По-сути это тот же HookContext, только регистры идут задом наперед. ВНИМАНИЕ: esp теперь readonly. Если вам /действительно/ нужно его изменить, используйте старые LoHook.
- thread-safety. По сравнению со старым LoHook он будет работать в многопоточном контексте. :smile16:
- Быстродействие. Установка SafeLoHook требует меньше ассемблерного кода, соответственно SafeLoHook будет немного быстрее LoHook.

5. Реализация функций отладки C++26 https://en.cppreference.com/w/cpp/header/debugging
std::breakpoint(), std::breakpoint_if_debugging(), std::is_debugger_present()
Доступны на любом компиляторе.

И много чего еще! :smile27:
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: База данных IDA от void17

Сообщение AlexSpl » 22 май 2024, 18:56

Это здорово, что Вы совмещаете учёбу и работу над геройским проектом :smile20: Я считаю это самым правильным путём саморазвития - до мельчайших деталей изучать язык программирования, при этом получая удовольствие от процесса. Этого никакое чтение специализированной литературы не заменит. Может, в будущем перепрофилируетесь в высокооплачиваемого программиста на C++ (да и не только; сейчас си-подобные в тренде). Будет что показать в резюме.

Цитата:
Другой контекст хука, SafeHookContext. По-сути это тот же HookContext, только регистры идут задом наперед. ВНИМАНИЕ: esp теперь readonly. Если вам /действительно/ нужно его изменить, используйте старые LoHook.

Я знаю, что патчер иногда обновляется, но есть ли новые хедеры в свободном доступе? Я бы обновил первую страничку темы о том, как создать плагин.

Цитата:
std::breakpoint(), std::breakpoint_if_debugging(), std::is_debugger_present()

Главное не удаляться совсем в дебри. Достаточно, чтобы работа с основными классами была удобной и эффективной. Может, кто-то и напишет однажды плагин "по фэн-шую", но я прогнозирую, что это будут единичные случаи, и лучше сконцентрироваться на вещах, которые будут реально использоваться, а не пытаться объять необъятное (только что для саморазвития).
Вернуться к началу

offlineАватара пользователя
void_17  
имя: имя
Ветеран
Ветеран
 
Сообщения: 548
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 132 раз.

Re: База данных IDA от void17

Сообщение void_17 » 23 май 2024, 15:21

Цитата:
Это здорово, что Вы совмещаете учёбу и работу над геройским проектом :smile20: Я считаю это самым правильным путём саморазвития - до мельчайших деталей изучать язык программирования, при этом получая удовольствие от процесса. Этого никакое чтение специализированной литературы не заменит. Может, в будущем перепрофилируетесь в высокооплачиваемого программиста на C++ (да и не только; сейчас си-подобные в тренде). Будет что показать в резюме.

Спасибо. На самом деле это действительно очень помогает изучать и углубляться в тему, особенно когда тебе это самому очень и очень интересно. :smile14:

Цитата:
Я знаю, что патчер иногда обновляется, но есть ли новые хедеры в свободном доступе? Я бы обновил первую страничку темы о том, как создать плагин.

Мне baratorch разрешил и показал как и что. Так что все норм.

Цитата:
Главное не удаляться совсем в дебри. Достаточно, чтобы работа с основными классами была удобной и эффективной. Может, кто-то и напишет однажды плагин "по фэн-шую", но я прогнозирую, что это будут единичные случаи, и лучше сконцентрироваться на вещах, которые будут реально использоваться, а не пытаться объять необъятное (только что для саморазвития).


Я добавляю в NH3API только те вещи, которые мне самому нужны будут. Строгое соответствие стандартам и гибкость настройки мне нужна для своего глобального мода. Лично я из API буду выжимать максимум.
Релиз примерно через месяц, но он будет достаточно полноценным: там будет все необходимое впринципе. Всякие второстепенные классы можно будет потом с новыми версиями добавить. Еще для меня важны оптимизации, которых пока что не так много, типа memcpy для типов T, удовлетворяющих std::is_trivially_copyable<T>. Сейчас они меня не особо волнуют, в течение развития проекта их станет больше. Но пока что действительно основной упор на ключевых классах игры. :smile10:
Вернуться к началу

offlineАватара пользователя
void_17  
имя: имя
Ветеран
Ветеран
 
Сообщения: 548
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 132 раз.

Re: База данных IDA от void17

Сообщение void_17 » 11 июл 2024, 15:04

Чуточку новостей. :smile27:

1. Переписал архитектуру полиморфических типов таким образом, что можно будет безболезненно писать классы-наследники, используя привычный синтаксис с virtual и override. Теперь доступ к таблице виртуальной функции доступен через get_vftable<T>() и привязан не к объекту, а к типу.
Самым сложным остаётся вопрос ABI виртуального деструктора. Я принял решение сделать как в базе: scalar_deleting_destructor(bool). Таким образом для вызова .exe-шного operator delete есть две функции: exe_delete(void*), которая просто освобождает память, обёртка free(void*) и exe_invoke_delete<T>(T*), которая вызывает еще и деструктор.
Теперь мне стало гораздо проще и приятнее писать код.

Благодаря IDA SDK я написал плагин, который позволяет легко дампать таблицы виртуальных функций и виртуальную функцию-обёртку, что ускорило продуктивность в разы! Теперь каждый полиморфический класс имеет структуру vftable_t, что удобно. В базе данных таблицы виртуальных функций будут работать следующим образом:
 
Код: Выделить всё
union widget::vftable_union_t
{
  widget::vftable_t *widget_vftable;
  iconWidget::vftable_t *iconWidget_vftable;
  textWidget::vftable_t *textWidget_vftable;
  textEntryWidget::vftable_t *textEntryWidget_vftable;
  border::vftable_t *border_vftable;
  bitmapBorder::vftable_t *bitmapBorder_vftable;
  coloredBorderFrame::vftable_t *coloredBorderFrame_vftable;
  button::vftable_t *button_vftable;
  textButton::vftable_t *textButton_vftable;
  type_func_button::vftable_t *type_func_button_vftable;
};
Теперь в декомпиляте если навести курсор на vftable и нажать select union field, можно удобно выбрать нужный вам тип и декомпилятор правильно покажет соответствующую виртуальную функцию!

 До:
Код: Выделить всё
if ( !this->focus )
        return 0;
    if ( this->vftable[1].Open[0](this, msg) )
        return 0;

 После:
Код: Выделить всё
if ( !this->focus )
        return 0;
    if ( this->vftable.textEntryWidget_vftable->IgnoreKey(this, msg) )
        return 0;



2. Переписал с нуля exe_vector, теперь он работает великолепно! Оптимизирован лучше чем std::vector 2005/2008 студии и работает на всех компиляторах. Основан на реализации VS2010.

3. Добавлена поддержка всех версий MSVC STL с их особенностями, например такой неприятной штуки как развёртки итераторов. :smile4:

4. Заложил почву для модуля поддержки HD Mod и Era. daemon_n согласился помочь мне с модулем Era! :smile18:

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

offlineАватара пользователя
void_17  
имя: имя
Ветеран
Ветеран
 
Сообщения: 548
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 132 раз.

Re: База данных IDA от void17

Сообщение void_17 » 28 сен 2024, 10:01

Обновил шапку темы.
Вернуться к началу

Пред.След.

Вернуться в Общий раздел

Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и гости: 1