Объявления

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

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

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

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

Сообщение Ben80 » 03 май 2021, 16:55

AlexSpl писал(а):

Ещё заметил, что часто, когда у него остаётся только один свободный слот в армии, AI его не занимает слабыми существами.


Это да, игроки давно замечали, что у него часто один слот свободный.

AlexSpl писал(а):

Всё равно, чтобы качественно усилить AI, одной ребалансировки порядка скупки/постройки зданий/грейда недостаточно, но она потенциально может его усилить (с грейдами комп, как минимум, дальше бегать будет).


Естественно, никто и не говорит, что эта небольшая фишешчка перевернет ИИ и сделает революцию :smile1: Просто если кому-то (например, вам) интересно обсуждать и разрабатывать такие вещи, то предлагаю это делать иногда - я бы тогда тоже выносил какой-то код (готовый или в черновом варианте) по ИИ на обсуждение. Так постепенно и получилось бы новое качество ИИ.
Для меня, например, было очень полезно когда-то познакомиться с вашими исследованиями по получению ИИ втор. навыков. Если интересно, могу показать, что по данному вопросу я для ИИ сделал более полугода назад.
Вернуться к началу

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 » 03 май 2021, 17:08

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

Я случайно :smile1: занялся AI, потому что обнаружил, что он не скупает негрейженые войска. Это, как оказалось, не особо критично, т.к. в большинстве случаев у AI будут шахты/рынок, но пример с нескупкой Чудищ при наличии ул. постройки и отсутствия шахт/рынка показателен. Почему бы не поправить? :smile2:

Цитата:
Для меня, например, было очень полезно когда-то познакомиться с вашими исследованиями по получению ИИ втор. навыков.

Изначально я пытался добавить новую фичу в LMOracle, чтобы можно было предсказывать точно прокачку героев AI, но, как оказалось, она зависит от текущих условий.

Цитата:
Если интересно, могу показать, что по данному вопросу я для ИИ сделал более полугода назад.

Всегда интересно почитать что-то новое :smile20: Сейчас много кода, плагинов, а вот детальные описания работы алгоритмов редко встретишь.
Последний раз редактировалось AlexSpl 03 май 2021, 17:11, всего редактировалось 1 раз.
Вернуться к началу

offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 898
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 53 раз.

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

Сообщение Rolex » 03 май 2021, 17:08

AlexSpl писал(а):

Всё равно, чтобы качественно усилить AI, одной ребалансировки порядка скупки/постройки зданий/грейда недостаточно

Чтобы качественно усилить алгоритмы AI в идеале бы нужны исходники.

Кстати, спустя несколько месяцев после выхода переиздания RoE HD Edition по cети прошел слух о том, что исходники Heroes of Might and Magic III в лице Дыхания Смерти и Клинка Армагеддона были найдены, и что вслед за выпуском HD-переиздания Возрождения Эрафии последуют продолжения.

В середине 2015 Ubisoft опровергли эти слухи, заявив, что никто никаких исходных файлов AB и SoD не находил. Кстати, вину по утере исходных данных возлагают на студию Loki Software, которая была упразднена еще в 2002-м году.

Но, в конце 2017-го все таки нашлись исходники Complete: https://twitter.com/DiskBlitz/status/920801845349466113
и были отправлены Ubisoft.

Получаестя у Ubisoft сейчас есть исходники не только RoE, но и Complete. Но из-за того, что HoMM3 RoE HD Edition не оправдала ожиданий, они, видимо, решили, что никто не будет снова платить за второй HD-римейк той же игры.

Эх, вот если бы этот подрядчик слил бы в сеть исходники, было бы вообще круто. Но не может этого сделать без разрешения. На Западе у них вообще с авторскими правами все очень строго.
Последний раз редактировалось Rolex 03 май 2021, 19:16, всего редактировалось 2 раз(а).
Вернуться к началу

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 » 03 май 2021, 17:19

Я читал. Жаль, мужик не русский :smile1: Русский бы по-тихому слил фанатам. Наверное, рассчитывал, что Ubisoft заплатит. Надеюсь, заплатили.

Исходники помогли бы в понимании, конечно, но никто бы не пилил HD-мод с лобби заново. Максимум сделали бы мультиплатформенную версию. Сейчас код очень хорошо разобран. Единственное, хотелось бы с оригинальными классами.
Последний раз редактировалось AlexSpl 03 май 2021, 17:25, всего редактировалось 1 раз.
Вернуться к началу

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

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

Сообщение Ben80 » 03 май 2021, 17:24

AlexSpl писал(а):

Цитата:
Если интересно, могу показать, что по данному вопросу я для ИИ сделал более полугода назад.

Всегда интересно почитать что-то новое :smile20: Сейчас много кода, плагинов, а вот детальные описания работы алгоритмов редко встретишь.


Ну, если интересуют именно алгоритмы, а не усиление эффективности ИИ, то тогда наверно не буду показывать, по какому принципу я стал "взвешивать" втор. навыки. Скажу только, что сначала долго смотрел (выводил на печать) веса, которые получаются в оригинальной игре. И пришел к выводу, что в процедуре 0x527C40 где-то ошибка (может, сам алгоритм кривой). Из-за этого для "магических" втор. навыков часто веса скакали - то сильно мало (0 или чуть больше), то сильно много (но не переполнение, насколько помню). Поэтому я просто переписал все хайхуком по своему. Ну и также переписал 0x527770 хайхуком, со своими изменениями кое-где.

Так что вот :smile1:
Код: Выделить всё
int __stdcall HiHook_AI_BuffDebuffSpellEff(HiHook* h, int magicParams[9], int iSpell, int levelSpell, int nApp)
{
   double k = 0.003;
   int nAffectedStacks;
   int nStacks = 0;
   _Hero_* hero = (_Hero_*)magicParams[0];
   int armyPower = 0;

   for(int i=0; i<7; i++)
      if(hero->army.type[i] >= 0)
      {
         nStacks++;
         armyPower += hero->army.count[i] * o_pCreatureInfo[hero->army.type[i]].AI_value;
      }

   if(magicParams[3] > nApp)
      nAffectedStacks = nApp;
   else
      nAffectedStacks = magicParams[3];

   if((o_Spell[iSpell].flags & 0x00000040) && levelSpell > 2)
      nAffectedStacks = nStacks;
   else
      if(nAffectedStacks > 4)
         nAffectedStacks = 4;

   int duration = magicParams[3];
   if(duration > 7)
      duration = 7;

   int result = (o_Spell[iSpell].ai_value[levelSpell] * duration * armyPower * nAffectedStacks * k / nStacks);

   return result;
}

int __stdcall HiHook_AI_Set_HeroParameters(HiHook* h, _Hero_* hero)
{

   int magicParams[9];
   CALL_2(int, __thiscall, 0x527220, magicParams, hero);

   int k = 3;

   int needExpo = CALL_1(int, __fastcall, 0x4DA690, hero->level);
   _dword_ armyPower = *(int*)(0x67814C) + CALL_1(int, __thiscall, 0x44A950, (int)(&hero->army));
   hero->ai_exp_eff_109 = (float)armyPower * 5.0f / (40.0f * (float)needExpo);

   const int allAISpellFlags = 2064384;
   const int buffdebuffAISpellFlags = 262144;
   const int mapAISpellFlags = 1048576;
   const int otherAISpellFlags = 753664;

   _dword_ spell_eff_0 = CALL_2(int, __thiscall, 0x527A90, magicParams, buffdebuffAISpellFlags) / 2
      + CALL_2(int, __thiscall, 0x527A90, magicParams, otherAISpellFlags) / 2
      + CALL_2(int, __thiscall, 0x527A90, magicParams, mapAISpellFlags) / 4;

   magicParams[2] += 1;
   magicParams[3] += 1;

   _dword_ ai_power_eff = CALL_2(int, __thiscall, 0x527A90, magicParams, buffdebuffAISpellFlags) / 2
      + CALL_2(int, __thiscall, 0x527A90, magicParams, otherAISpellFlags) / 2
      + CALL_2(int, __thiscall, 0x527A90, magicParams, mapAISpellFlags) / 4 - spell_eff_0;

   if(ai_power_eff > 10)
   {
      ai_power_eff *= k;
      hero->ai_power_eff_47E = ai_power_eff;
   }
   else
      hero->ai_power_eff_47E = 10 * k;

   magicParams[2] -= 1;

   _dword_ ai_duration_eff = CALL_2(int, __thiscall, 0x527A90, magicParams, buffdebuffAISpellFlags) / 2
      + CALL_2(int, __thiscall, 0x527A90, magicParams, otherAISpellFlags) / 2
      + CALL_2(int, __thiscall, 0x527A90, magicParams, mapAISpellFlags) / 4 - spell_eff_0;
   
   hero->ai_duration_eff_482 = k * ai_duration_eff;

   magicParams[3] -= 1;
   magicParams[4] += 30;

   _dword_ ai_knowl_eff = CALL_2(int, __thiscall, 0x527A90, magicParams, buffdebuffAISpellFlags) / 2
      + CALL_2(int, __thiscall, 0x527A90, magicParams, otherAISpellFlags) / 2
      + CALL_2(int, __thiscall, 0x527A90, magicParams, mapAISpellFlags) / 4 - spell_eff_0;

   if(ai_knowl_eff / 3 > 10)
   {
      ai_knowl_eff *= k;
      hero->ai_knowl_eff_486 = ai_knowl_eff / 3;
   }
   else
      hero->ai_knowl_eff_486 = 10 * k;

   int maxMana = magicParams[4] - 30;
   magicParams[4] = hero->spell_points;

   _dword_ spell_eff_mana = CALL_2(int, __thiscall, 0x527A90, magicParams, buffdebuffAISpellFlags) / 2
      + CALL_2(int, __thiscall, 0x527A90, magicParams, otherAISpellFlags) / 2
      + CALL_2(int, __thiscall, 0x527A90, magicParams, mapAISpellFlags) / 4;

   if(hero->spell_points >= maxMana)
      hero->ai_mana_eff_48E = 0;
   else
   {
      hero->ai_mana_eff_48E = k * (spell_eff_0 - spell_eff_mana);
      hero->ai_mana_eff_48E /= 2;
   }

   if(hero->spell_points >= maxMana * 2)
      hero->ai_dmana_eff_48A = 0;
   else
   {
      magicParams[4] = maxMana * 2;
      hero->ai_dmana_eff_48A = CALL_2(int, __thiscall, 0x527A90, magicParams, buffdebuffAISpellFlags) / 2
         + CALL_2(int, __thiscall, 0x527A90, magicParams, otherAISpellFlags) / 2
         + CALL_2(int, __thiscall, 0x527A90, magicParams, mapAISpellFlags) / 4 - spell_eff_mana;

      hero->ai_dmana_eff_48A *= k;
      hero->ai_dmana_eff_48A /= 2;
   }

    return 0;
}

...

_PI->WriteHiHook(0x527770, SPLICE_, EXTENDED_, THISCALL_, HiHook_AI_BuffDebuffSpellEff);
_PI->WriteHiHook(0x527C40, SPLICE_, EXTENDED_, THISCALL_, HiHook_AI_Set_HeroParameters);

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

offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 898
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 53 раз.

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

Сообщение Rolex » 03 май 2021, 19:10

AlexSpl писал(а):

Пока с экспериментами повременим (из нереализованного остался только найм в Portal of Summoning). Буду доделывать часть с наймом из внешних двеллингов. Там хоть понятно, что делать :smile1:

А AI в оригинале вообще не использует Portal of Summoning? То есть вообще никогда не нанимает из него существ?
Вернуться к началу

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 » 03 май 2021, 19:17

Да, если Вы видели вектор найма в плагине выше, то заметили, что в него не входят существа из Portal of Summoning. А в оригинале не входят и негрейженые существа при наличии ул. постройки.
Вернуться к началу

offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 898
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 53 раз.

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

Сообщение Rolex » 03 май 2021, 19:18

А саму постройку Portal of Summoning в городе AI отстраивает?
Вернуться к началу

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 » 03 май 2021, 19:20

Не знаю, но я тестировал на полностью отстроенном городе (Build All).
Вернуться к началу

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

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

Сообщение Ben80 » 03 май 2021, 19:31

Rolex писал(а):

А саму постройку Portal of Summoning в городе AI отстраивает?


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

Пред.След.

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

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

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