Объявления

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

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

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineRoseKavalier  
Мастер
Мастер
 
Сообщения: 331
Зарегистрирован: 23 сен 2017, 17:00
Пол: Не указан
Поблагодарили: 234 раз.

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

Сообщение RoseKavalier » 05 апр 2020, 14:50

I should have written down the reference address but as I recall this bit was set when an entrance was detected through iteration on the mask bitfields.
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1315
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

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

Сообщение Ben80 » 08 апр 2020, 05:11

Адреса 0x63B780, 0x63B788, 0x63B790, 0x63B790 связаны с расчетом вероятностей удачи/неудачи, морали/дизморали (по всей видимости, используются в ИИ расчетах).

Полагаю, в 0x63B788 значение верное (-0.0833), а в 0x63B780, 0x63B790, 0x63B790 - неверные (баг).
Лечим так:
_PI->WriteHexPatch(0x63B780, "94 F6 06 5F 98 4C A5 3F");
_PI->WriteHexPatch(0x63B790, "C3 64 2A 3D");
_PI->WriteHexPatch(0x63B794, "31 99 AA BD");

(есть конвертер по адресу https://gregstoll.com/~gregstoll/floattohex/)

Может ли кто-нибудь подтвердить или опровергнуть вышеизложенное ? :smile1:

UPD. После правки бага ИИ в бою иногда начинает применять массовые Fortune, Misfortune, Mirth, Sorrow. До правки бага ИИ веса у этих заклинаний были микроскопическими.

Правда, нужно сказать, что процедура ИИ взвешивания для Misfortune sub_00438BB0 работает так, как если бы в игре была отрицательная удача. Поэтому, если в вашей версии игры ее нет, то как вариант в sub_00438BB0 можно вызывать не sub_004354A0, а вашу собственную кастомную процедуру (очень маленькую).
Но поскольку не совсем понятно, как это правильно сделать, есть такой рабочий вариант:

Код: Выделить всё
int __stdcall misfortuneWeighting(LoHook* h, HookContext* c)
{
   int luck0 = c->eax;
   int decLuck = c->edx;
   int luck = luck0 - decLuck;

   if(luck0 < 0)
      luck0 = 0;

   if(luck < 0)
      luck = 0;

   c->edx = luck - luck0;

   return EXEC_DEFAULT;
}
...
_PI->WriteLoHook(0x438C07, misfortuneWeighting);


Аналогично для Fortune sub_004380E0:
Код: Выделить всё
int __stdcall fortuneWeighting(LoHook* h, HookContext* c)
{
   int luck0 = c->ebx;
   int incLuck = c->esi;
   int luck = luck0 + incLuck;

   if(luck0 < 0)
      luck0 = 0;

   if(luck < 0)
      luck = 0;

   c->esi = luck - luck0;

   return EXEC_DEFAULT;
}
...
_PI->WriteLoHook(0x438131, fortuneWeighting);
Вернуться к началу

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

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

Сообщение RoseKavalier » 08 апр 2020, 13:11

0x63B780 is a double (QWORD) 0.0173
0x63B788 is a double (QWORD) -0.0833

0x63B790 is a float 0.0173
0x63B794 is a float -0.0122

Doesn't look like a bug, but I did not spend time to look at the AI weighting functions.
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1315
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

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

Сообщение Ben80 » 08 апр 2020, 13:49

May be not a bug, but sooner is a bug, so if a bug - very crude.
After code analysing I think 0x63B780 and 0x63B790 should be 0.0416 and 0x63B794 should be -0.0833.
(they are probabilities for luck/disluck or morale/dismorale)

No need to do careful analysis of AI weighting in this case, all is quite obvious. It is enough to think in terms of AI profit.

For example, another bug (very minor) - in CombatAI_0043C450_SpellsAI.
There:
Код: Выделить всё
                    if ( v21 < 7 * v20 )
                    {
                      v41 = (long double)(v21 / v20);
                      result = sqrt(v41);
                      v41 = (long double)v38;
                      v22 = (signed __int64)(result * v41);
                    }
                    else
                    {
                      LODWORD(v22) = 5 * v38 / 2;
                    }


However v22 should be v38 * sqrt(7), not a 5 * v38 / 2.
sqrt(7) = 2.65 - a little bigger than 2.5
Вернуться к началу

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 апр 2020, 16:56

Цитата:
However v22 should be v38 * sqrt(7), not a 5 * v38 / 2.

Да, здесь корень из 7 выглядит, как кап для возрастающей функции. Возможно, действительно пропустили 6. Я бы так и написал: sqrt(7), но программеры Героев очень любили округлять, так что вполне вероятно число 2.65 набиралось руками и превратилось в 2.5 в результате ошибки набора. Как-то нелогично делать кап меньше максимума функции :smile3:

Цитата:
0x63B780 is a double (QWORD) 0.0173
0x63B788 is a double (QWORD) -0.0833

0x63B790 is a float 0.0173
0x63B794 is a float -0.0122

Здесь сложнее. На вероятность похоже только число -0.0833 по модулю. Не уверен, что здесь симметрия. Например, 0.0173 может быть sqrt(3) / 100, т.е. специально подобранная константа.
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1315
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

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

Сообщение Ben80 » 08 апр 2020, 17:07

0.0173 и -0.0122 на вероятности действительно не похожи.
Но эти вероятности там вроде как должны быть :smile1: Поскольку расчет выгоды для ИИ в данном случае подразумевает расчет некоего математического ожидания. Ну и мы знаем, что для такого расчета используются константы 0.0833 (для отрицат.) и 0.0416 (для положит.).

***
Расчетом вероятности (как коэффициента для расчета МО) собственно занимается функция sub_004354A0.
Вернуться к началу

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 апр 2020, 17:13

А 0.0122 выглядит, как sqrt(3 / 2) / 100. Уже два совпадения (?). Так что я склоняюсь к тому, что с моралями/удачами не баг.

Деление на 100 нужно затем, что далее по коду бросается 100-гранная кость. 3 - это кап морали/удачи. 3/2 - поправка на эффект (половина).
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1315
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

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

Сообщение Ben80 » 08 апр 2020, 17:29

Ну, чисто математически согласен, выглядит убедительно.
Но если посмотреть, как эти константы используются (sub_004354A0 и др.) - откуда они взяты ? И причем тут тогда -0.0833 ?

В смысле вот это вот в ваших рассуждениях убедительно - sqrt(3 / 2) / 100 и sqrt(3) / 100.
А почему 3 - это кап морали/удачи, не очень понятно.

***

И, кстати, какой код вы имеете в виду, в котором кидается 100-гранная кость ? В sub_004354A0 и в функциях, из которых она вызывается, вроде ничего не кидается :smile1:
Вернуться к началу

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 апр 2020, 17:39

Мораль и удача от -3 до 3. Если константа с минусом для отрицательной морали/удачи, то тогда всё понятно: в подавляющем большинстве случаев снижение морали/удачи гораздо эффективнее их повышения, т.к., в основном, мораль/удачу повышать особо и некуда (отряды обычно уже с +1 или даже +2), а вот опускать всегда есть куда.
Вернуться к началу

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 апр 2020, 17:40

Цитата:
И, кстати, какой код вы имеете в виду, в котором кидается 100-гранная кость ? В sub_004354A0 и в функциях, из которых она вызывается, вроде ничего не кидается


CombatAI_0043C450_SpellsAI
Вернуться к началу

Пред.След.

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

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

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