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


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

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

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

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

Сообщение Ben80 » 12 окт 2017, 20:38

Someday admin will turn on all functions for you :smile1:
Did you saw somewhen teleserial "Due South" ?
Вернуться к началу

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

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

Сообщение RoseKavalier » 12 окт 2017, 21:02

A few times, but I was not a big fan. Funny you know this series)
Изображение
Вернуться к началу

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

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

Сообщение Ben80 » 13 окт 2017, 04:40

Заинтересовало, каким образом используются AI_value в SPTRAITS.txt.
Многим заклинаниям NWC справедливо поставили низкие оценки. Оказывается, они понимали, что многие заклинания не айс, но тем не менее, не стали их усиливать.
Однако есть и заклинания, которым поставлены явно завышенные оценки - Воздушный щит, Гипноз, Вызов элементалов. А каким-то заклинаниям - заниженные оценки. Тут, возможно, есть потенциал, для того чтобы улучшить работу AI.
Правда, не все так просто - например, Землетрясению сопоставлено минимальное AI_value, но AI его применяет, и очень даже неплохо, когда нужно. То есть каким образом используется AI_value, пока мало понятно.

Кстати, для TownPortal, оказывается, AI value - 5/70/70 в зависимости от уровня Магии земли. Так что меняю в плагине и эти значения - на 40/50/60, чисто интуитивно.
Обновил плагин NewTownPortal, добавил описания на русском.
viewtopic.php?f=56&t=529&start=4
Вернуться к началу

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

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

Сообщение Ben80 » 14 окт 2017, 03:46

Удалось подойти к пониманию того, как, например, можно вмешаться в процесс вычисления AI "выгоды" заклинания Blind, напишу позже.
Вернуться к началу

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

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

Сообщение AlexSpl » 23 окт 2017, 00:02

Попробуйте менять описания заклинаний сразу после загрузки sptraits.txt:

 
Код: Выделить всё
#include "HotA\homm3.h"

Patcher* _P;
PatcherInstance* _PI;

static _bool_ plugin_On = 0;

struct SpellDesc
{
   char* DefaultDesc;
   char* BasicDesc;
   char* AdvancedDesc;
   char* ExpertDesc;
};

SpellDesc DisguiseDesc =
{
   "{Disguise}n\nYour description here",
   "{Basic Disguise}\n\nYour description here",
   "{Advanced Disguise}\n\nYour description here",
   "{Expert Disguise}\n\nYour description here"
};

int __stdcall changeSpellDesc(LoHook* h, HookContext* c)
{
   *(SpellDesc*)(o_Spell + SPL_DISGUISE)->description = DisguiseDesc;

   return EXEC_DEFAULT;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
   if ( DLL_PROCESS_ATTACH == ul_reason_for_call )
   {
       if ( !plugin_On )
       {
           plugin_On = 1;
           _P = GetPatcher();
           _PI = _P->CreateInstance("HD.Plugin.NewSpellDescriptions");

           _PI->WriteLoHook(0x59E437, changeSpellDesc);
       }
   }

   return TRUE;
}
Вернуться к началу

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

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

Сообщение Ben80 » 25 окт 2017, 17:15

Проапдейтил viewtopic.php?f=56&t=532&p=16981#p16981
Смысл многих переменных стал понятен, есть очень интересные моменты.

1) Перед каждой битвой с участием AI комп вычисляет соотношение сил армий, причем чем ближе оно к 1, тем большее число сопоставляет компьютер. То есть он рассматривает эту величину приблизительно как ожидаемую продолжительность битвы (вернее, ее решающей фазы).

2) Комп создает и апдейтит набор битов (1 набор на всю армию - армию противника компа), отражающих возможность каждого отряда "дотянуться" до противника.

Данная система использует поля _CombatMonster_ (это уже для своей армии - для каждого отряда):
0x544 - здесь набор битов, определяющих до каких номеров (отрядов) противника дотягивается данный наш отряд.
0x538 - адрес одного из отрядов, который наш отряд мог бы ударить.
У отрядов, уже сделавших ход, бит 0x544 все равно ненулевой, если в следующий ход они смогли бы нанести удар, хотя бы гипотетически. Зато отряд, который в данный момент должен ходить имеет данный бит равным нулю. Только перед началом битвы данный отряд иногда имеет бит равный 1.
Именно поэтому комп не может наложить Жажду крови, Палача и др. на юнита и сразу же пойти и ударить данным юнитом.

Еще один момент - у стрелков 0x544 нулевой, за исключением случаев рукопашной, только перед началом битвы он ненулевой.

Вообще, возможно, вся данная система далека от безупречной работы и, как и многие другие участки кода в игре, приводит к тому, что комп иногда делает не самые полезные для себя вещи (как говорится в народе, откровенно тупит).
Во всяком случае, для процедур типа combatMan_00437D50_BloodlustWeightAI можно было бы безболезненно и с пользой заменить использование поля 0x538 на актуальный расчет возможности дотянуться до противника (такой код все равно в игре где-то есть).
Вернуться к началу

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

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

Сообщение RoseKavalier » 30 окт 2017, 14:00

Anyone up for re-creating Market of Time? Doing it for human is not too complicated but I don't know how to handle AI.
There are a few more things to do of course but this is base requirement.
Изображение

I added this function to _Hero_ struct to get started.
Код: Выделить всё
int UnlearnSkill(int skill_id) {
    if (this->second_skill[skill_id] > 0) {
       this->second_skill[skill_id] = 0;
       int skill_pos = this->second_skill_show[skill_id];
       this->second_skill_show[skill_id] = 0;
       for (int i = 0; i < 28; i++) {
          if (this->second_skill_show[i] > skill_pos)
             this->second_skill_show[i] -= 1;
       }
       this->second_skill_count -= 1;
       return 1;
    }
    return 0;
 }
Вернуться к началу

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

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

Сообщение Ben80 » 30 окт 2017, 14:57

Firstly, I never write code related to event when Hero enter some map object.
However, procedure UnlearnSkill will be the same for AI, I think (may be even no need to change secondary_skill_show[]).

Simply, one should check is it AI or Human. Only interesing moment I see - which skill should be remembered by AI. It is related to one AI improvement which I would like to make in future - algorithm for AI to favorably choose sec. skills at Level-ups.
It could be simple algorithm or simply set of number prioritets for sec. skills.

If you want I can propose for you procedure
Код: Выделить всё
int getWorstSecSkill(*Hero)

Do you need this ?

BTW, do you really think that the aim of Market of time (in NWC plans) - forget sec. skill ?
Вернуться к началу

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

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

Сообщение Ben80 » 30 окт 2017, 15:26

Also, one should introduce "weight" of this map object for AI.

Procedure should be changed a little bit -
//----- (00528520) --------------------------------------------------------
int __fastcall AICalculateMapPosWeight(_Hero_ *hp, signed int *moveDist, int packedmapitem)

However, it is strange a little bit for AI - consider Market of Time as valuable object if AI always choose sec. skills horrible

So, I think if one introduce Market of Time into Game, one also should modify procedure for AI when it choose sec. skill at Level-ups.
Вернуться к началу

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

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

Сообщение RoseKavalier » 30 окт 2017, 16:58

Yes, adding weight to the building for AI is part of the process.
We also need to add it to RMG function I guess. But this one is for later I guess :)

It is difficult to be certain what Market of Time was supposed to be since NWC themselves were not sure (3rd post).
Цитата:
The Market of Time went through several revisions before we scrapped it.
I believe it was going to be a marketplace that appeared and disappeared
on the map according to a schedule.


I'm 100% open to discuss what it does, but I think fans in general believe it was supposed to let you remove secondary skills.

In the latter case, int getWorstSecSkill(*Hero) definitely makes sense - so that could help AI decide whether to go to the building in the first place.
Вернуться к началу

Пред.След.

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

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

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