Объявления
Поздравляем
Roman2211


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

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

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1318
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

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

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

AlexSpl писал(а):

Т.е. смотри. Дальше же результат функции никак не модифицируется. Как этот результат поставить в один ряд с эффективностью других заклинаний, если c1 и с2 - это вероятности? Другие же заклы модифицируются коэффициентами "с потолка" :smile4:

А в случае с Моралью/Удачей коэффициенты применяются прямо в этой функции.


Кстати, важный момент. Посмотрю повнимательнее позже, но пока не нахожу признаков, что все (хотя некоторые - возможно) заклы модифицируются кэффициентами с потолка. По всей видимости ИИ в бою почти всегда считает выгоду через ущерб, выраженный в fight values.

***

Если посмотреть, например, combatMan_00437D50_BloodlustWeightAI или combatMan_004389E0_StoneSkinWeightAI - там тоже результат взвешивания находится через математическое ожидание ущерба/снижения ущерба, выраженное в едииницах fight values. Безо всяких коэффициентов, взятых с потолка (а также каких-либо "эмпирических" или основанных на суждениях о том, как примерно должна протекать игра, исходя из наиболее вероятных стратегий игроков (подобных вашим суждениям, что, например, "с минусом ходят очень редко" ) - подобные факторы кодерами NWC даже близко никогда не учитывались при программировании ИИ, тем более что и большого опыта игр накоплено еще не было в то время).

Так что и для спеллов удачи/морали, похоже, должны быть именно вероятности.

***

Кстати, в процедуре взвешивания для Удачи (но не для Неудачи) sub_004380E0 обсуждаемые константы не используются. И в итоге результат делится на 24 (то есть умножается на 0.0416).
Последний раз редактировалось Ben80 09 апр 2020, 07:35, всего редактировалось 2 раз(а).
Вернуться к началу

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

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

Сообщение Ben80 » 09 апр 2020, 06:38

Насколько я понял, для действий героя на карте (например, для "взвешивания" посещения героем объекта) коэффициенты по сути применяются.
Скажем, значимость посещения Арены по сути расчитывается как 2 * СилаАрмии / 40. То есть коэффициент 1/40 (0.025)

Возможно, баг NWC кодеров состоит в том, что для взвешивания спеллов в бою (касающихся удачи и морали) они используют те же самые константы, что и для взвешивания действий героя на карте (касающихся удачи и морали). То есть, например, должны были быть не 2 пары констант, а 4 пары (для морали на карте, для морали в бою, для удачи на карте, для удачи в бою). Причем константы для боя - это именно вероятности.

Тогда в принципе решением может быть запись дополнительных констант (для спеллов в бою) в свободные места между кодом процедур. Например, по адресам 0x46D6D1, 0x46D701, 0x46DA42.
Код: Выделить всё
// Удача
// новые константы
_PI->WriteHexPatch(0x46D6D1, "C3 64 2A 3D");
_PI->WriteHexPatch(0x46D701, "31 99 AA BD");
// загружаем именно их
_PI->WriteHexPatch(0x438C28, "01 D7 46 00");
_PI->WriteHexPatch(0x438C38, "D1 D6 46 00");

// Мораль
// новые константы
_PI->WriteHexPatch(0x46DA42, "94 F6 06 5F 98 4C A5 3F");
// загружаем именно их
_PI->WriteHexPatch(0x437E30, "46 DA 46 00");
_PI->WriteHexPatch(0x437E37, "42 DA 46 00");
_PI->WriteHexPatch(0x437FC0, "46 DA 46 00");
_PI->WriteHexPatch(0x437FC7, "42 DA 46 00");


@RoseKavalier
_u6 field in Hero structure is calculated:
ArmyStrength (+ Hero related constant) / (40 * NeedExpoToNextLevel)

I don't know how you will name this field ))
Вернуться к началу

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

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

Сообщение RoseKavalier » 09 апр 2020, 12:51

I had it named as ai_experience_float in my notes; did not include in h3api because I wasn't sure it'd be useful yet)
Вернуться к началу

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

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

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

Что такое __SETO__ из декомпилированнго кода ? Откуда вообще взялся такой причудливый синтаксис ? (в языке же Си нету такого)
Вернуться к началу

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: Как создать плагин для HD мода

Сообщение AlexSpl » 09 апр 2020, 18:29

Макрос, который генерирует переполнение (буквально - Set Overflow Flag). Декомпилятор не идеален, конечно же.

Заметил, что он иногда и с командами сопроцессора не справляется, а генерирует __asm код. Ещё часто можно видеть LOWORD, HIWORD и т.п. Трудности декомпиляции. Я обычно в таких случаях сверяюсь с ассемблерным кодом.
Вернуться к началу

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: Как создать плагин для HD мода

Сообщение AlexSpl » 09 апр 2020, 18:42

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

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

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

Сообщение Ben80 » 10 апр 2020, 04:00

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

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

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

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

AlexSpl писал(а):

Макрос, который генерирует переполнение (буквально - Set Overflow Flag). Декомпилятор не идеален, конечно же.

Заметил, что он иногда и с командами сопроцессора не справляется, а генерирует __asm код. Ещё часто можно видеть LOWORD, HIWORD и т.п. Трудности декомпиляции. Я обычно в таких случаях сверяюсь с ассемблерным кодом.


Ну, с HIWORD и подобным вроде бы понятно: HIWORD - это просто копирование 2 последних байт из какой-то переменной/диапазона адресов в памяти.

__SETO__ вроде как постоянно идет в связке с дальнейшим XOR. И то, и другое, как я понял, для моддинговых целей можно просто игнорировать. Например:
Код: Выделить всё
        v10 = v38 + 1;
        v30 = __SETO__(v38 + 1, v43);
        v29 = v38++ + 1 - v43 < 0;
        if ( !(v29 ^ v30) )
          return v10;


Можно понимать как:
Код: Выделить всё
        v10 = v38 + 1;
        v29 = v38++ + 1 - v43 < 0;
        if (!v29)
          return v10;
Вернуться к началу

offlineArmageddets  
Новичок
Новичок
 
Сообщения: 21
Зарегистрирован: 31 окт 2018, 15:05
Пол: Не указан
Поблагодарили: 2 раз.

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

Сообщение Armageddets » 10 апр 2020, 09:29

А есть ли у кого пример или руководство (как в первом посте) - как писать плагины в среде программирования Delphi 7?
Вернуться к началу

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

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

Сообщение Ben80 » 10 апр 2020, 09:52

Любителем Delphi, насколько я знаю, является Berserker c http://wforum.heroes35.net/
Можешь попробовать попросить его создать такой пост.

А так, в общих чертах, что потребуется для программирования:
1) заголовочный файл патчера Бараторча на Pascal. Таковой где-то был и при желании его можно найти.
2) заголовочные файлы для структур игры на Pascal. Таковые скорее всего придется написать самому (переписать с сишного homm3.h).

Без 2) пока можешь обойтись (в первых постах данной темы AlexSpl кодил по сути без него).
Чтобы начать кодить, самое главное - 1)
Ну и можно погуглить, как создается Dll на Delphi вообще :smile1:
https://www.google.ru/search?newwindow= ... CAw&uact=5

Ну а в целом по моему, быстрее освоить основы языка Си за неделю-другую, чем вот это вот все это делать :smile1:
Вернуться к началу

Пред.След.

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

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

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

cron