Объявления

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

Как создать плагин для HD мода

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

Re: Как создать плагин для HD мода

Сообщение as239 » 07 фев 2019, 17:01

AlexSpl писал(а):

Цитата:
Написал RoseKavalier просьбу, дать код функции, возвращающей порядок хода.

Я уважаю чужой труд и не удивлюсь, если он откажет. Всё-таки это часть его мода. Я не утверждаю, что сделать красивую очередь ходов - это проблема, ничего сложного там нет. При желании можно было бы сделать даже разделение на раунды. Я думаю, baratorch давно бы добавил очередь, но самая трудоёмкая часть - корректно обновлять эту "ленту": можно мгновенно, а можно по типу бегущей строки (плавный скроллинг), но не уверен, что движок Героев такое позволяет, т.е. придётся писать свой кастомный код. Если без анимации, то можно было бы попытаться, но как-то не хочется, когда уже есть готовое решение в SoD_SP. И, естественно, это время: одно дело вывести порядок ходов в статусную строку в текстовом виде по нажатию на горячую клавишу, другое - нарисовать окошко в оригинальном стиле с картинками юнитов и обеспечить его корректное обновление. Но, безусловно, при грамотной реализации очередь ходов была бы желанной фичей в HD моде.


Я не хочу делать панель очереди ходов, зачем если это есть в SOD_SP.
И есть еще вопрос насколько это будет надежно работать, удобно в использовании и приятно взгляду в сетевой игре.
Я просто хочу вывести очередность хода цифрой в окно отряда по ПКМ.
Т.е. с выводом здесь никаких проблем нет, вопрос только в функции, которая вернет корректную очередность хода для отряда.
И естественно, для данного пункта я укажу авторство RoseKavalier.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5547
Зарегистрирован: 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)
Поблагодарили: 2162 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 07 фев 2019, 17:10

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

Скорее всего, такой функции нет. Я думаю (могу ошибаться), что игра определяет стек, который будет ходить следующим, сразу после хода предыдущего. Т.е., если я прав, то придётся полностью разобрать алгоритм и повторить его в плагине. И, конечно, учесть все возможные эффекты, влияющие на порядок ходов (например, Blind/плохую мораль и т.п.). Если LMOracle способен определять в каждый конкретный момент, пропустит ли отряд ход, то в плагине такое недопустимо. Не будешь же ты менять порядок ходов в зависимости от времени. Остаётся только отображать порядок ходов так, как если бы ничего такого не происходило (и обновлять информацию постфактум).
Вернуться к началу

offlineRoseKavalier  
Мастер
Мастер
 
Сообщения: 331
Зарегистрирован: 23 сен 2017, 17:00
Пол: Не указан
Поблагодарили: 234 раз.

Re: Как создать плагин для HD мода

Сообщение RoseKavalier » 07 фев 2019, 17:51

For now, BattleQueue code will remain private as it uses code elements that I was asked not to share.
For the logic itself, you can check out VCMI, it is much clearer than what I've done.

If you simply are looking for a basic move order hint in the status bar, like this, then I can share it.
(Beware, this part of the code was written a long time ago and it is about 90% accurate.)
Изображение

I have been writing my own documentation and header files based on WoG, IDA disassembly and my own findings so that I do not have to refrain from sharing in the future.
Once this step is complete and I have converted current code to my own headers, I will no longer have to abide with this request and will open source good portions of SoD_SP. Naturally, things which could ease cheating will never be open source.

Also in SoD_SP 1.17 I will include preview of all "random" map objects. The code has been mostly done for a while, I just couldn't decide to include it.
 images
Изображение
Изображение
Изображение


@AlexSpl
Do you happen to know how to resolve these type of issues in IDA? I have looked at manual but no success with this one (and other similar)
Изображение
This one is from 0x407AE0.

Also, there is a "safe" way to patch other modules so that even after they are recompiled you generally don't have to modify your plugins.

#1 - Get code base and size
Код: Выделить всё
void GetDllInfo(const char *name, DWORD& PDLL, DWORD& PSIZE)
{
   HMODULE hm = GetModuleHandleA(name);
   if (!hm)
      return;
   IMAGE_DOS_HEADER* pDOSHeader = (IMAGE_DOS_HEADER*)hm;
   IMAGE_NT_HEADERS* pNTHeaders = (IMAGE_NT_HEADERS*)((BYTE*)pDOSHeader + pDOSHeader->e_lfanew);
   PDLL = (DWORD)hm + pNTHeaders->OptionalHeader.BaseOfCode;
   PSIZE = pNTHeaders->OptionalHeader.SizeOfCode;
}


e.g.
DWORD HW_SOD_DLL, HW_SOD_SIZE; // global
GetDllInfo("HW_SOD.dll", HW_SOD_DLL, HW_SOD_SIZE); // after HW_SOD is installed, around 0x4F823F

#2 - Use needle to find code.
e.g. Code by linked author in comments.
Basically, you use a unique (or not, depends) series of mnemonics which is unlikely to change through recompilation
Write a needle and an offset to the location you want to patch... if found then you can patch at this location easily.

Of course, it's not 100% safe due to recompilation, but if you have a strong needle then it should be fine. I have some needles for HD_SOD that have been valid for over a year of updates, and some others which I had to change recently.
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

Re: Как создать плагин для HD мода

Сообщение as239 » 08 фев 2019, 06:13

Цитата:
If you simply are looking for a basic move order hint in the status bar, like this, then I can share it.

Yes, I need only this.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5547
Зарегистрирован: 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)
Поблагодарили: 2162 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 08 фев 2019, 15:15

Цитата:
Do you happen to know how to resolve these type of issues in IDA?

Well, I've just successfully decompiled sub_407AE0 and had no such issues.
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

Re: Как создать плагин для HD мода

Сообщение as239 » 10 фев 2019, 09:33

Как я понял, RoseKavalier написал методику относительно безболезненного патчинга HW_SOD.dll.
Можно ли переделать код перестройки ГМ по ней?

А то в я сомнениях, перестройка ГМ с любого уровня очень важный и нужный пункт для следующего релиза.
Однако, то что практически любое обновление HD мода ломает перестройку, оттолкнет очень много игроков.
Т.е. с одной стороны очень хочется включить это изменение, а с другой получается нельзя этого делать.
Вернуться к началу

offlineRoseKavalier  
Мастер
Мастер
 
Сообщения: 331
Зарегистрирован: 23 сен 2017, 17:00
Пол: Не указан
Поблагодарили: 234 раз.

Re: Как создать плагин для HD мода

Сообщение RoseKavalier » 11 фев 2019, 15:26

You could try this needle. It's not great but it should work for a while.
Код: Выделить всё
{ 0xB8, 0xA0, 0x05, 0x43, 0x00, 0xFF, 0xD0, 0x85, 0xC0, 0x75 }
offset = 9


I have looked at the old queue code... it's a big mess. I can either share it now in a state where you might have trouble using it ... or you can wait some time for me to clean it up as part of my rewrite and open sourcing.
I wrote it from my own reversing so you have horrible things like this over and over:
Код: Выделить всё
creatureInfo.creature_address = combat_manager_address + 0x54CC + 0x548 * i;


@AlexSpl
Which version of IDA do you use? Systematic fail on my end.

Even in original disassembly from Grayface there is this message (and it shows up in more places).
Цитата:
//----- (00407AE0) --------------------------------------------------------
#error "FFFFFFFF: variables would overlap: ah@1/1 and ah@1/2 (funcsize=894)"
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5547
Зарегистрирован: 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)
Поблагодарили: 2162 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 12 фев 2019, 08:58

This is what's written in the manual about this error:

Цитата:
variables would overlap

This is a variant of the variable allocation failure error. You will see this error message only if you have enabled HO_IGNORE_OVERLAPS in the configuration file. If overlapped variables are allowed in the output, they are displayed in red.


Check your config (hexrays.cfg).

Anyways, here is 40A7E0 decompiled (from heroes3f.idb):

407AE0.zip
(3.63 КБ) Скачиваний: 208
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

Re: Как создать плагин для HD мода

Сообщение as239 » 13 фев 2019, 09:06

Цитата:
or you can wait some time for me to clean it up as part of my rewrite and open sourcing.

Ok, I'll wait.
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

Re: Как создать плагин для HD мода

Сообщение as239 » 15 фев 2019, 07:16

Хотел попросить помощи в решении главной проблемы сетевой игры в СОД.
Это багнутые генерации и блоки дорог.
Вот пример блоков из одной игры (шаблон Jebus Cross), когда закончились рестарты:

Изображение
Изображение

Т.е. у игрока заблокированы 2-а направления, но так как есть обход вокруг замка, по правилам он это должен играть.
При этом, если эти охраны сдвинуть всего на одну клетку, то все было бы отлично.
Соответственно, можно ли написать код, который после генерации карты (только для одно шаблона -Jebus Cross), обходит охраны и смотрит если слева\справа от охраны есть дорога, а справа\слева свободная клетка, то сдвигаем охрану на нее?
Конечно, полноценный алгоритм будет гораздо сложнее, но с вышеописанным кодом, я сам смогу этим заняться.
Вернуться к началу

Пред.След.

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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7