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


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

Герои 2 (разные версии) с плагинами

Не запускается игра? Проблемы со звуком? Где, в конце концов, взять игру, скачать патчи, приложения и карты? Как установить все это? Все проблемы обсуждаем в этом разделе
offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1318
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

Re: Герои 2 (разные версии) с плагинами

Сообщение Ben80 » 13 авг 2023, 18:18

AlexSpl писал(а):

Не с потолка же Фил их брал (тем более, что они не являются "красивыми", вроде 0.25, 0.5 и т.п.). Реально хочется понять, откуда он их достал, т.е. какая идея стоит за ними.


Прикол в том, что в Героях 2 эти коэффициенты еще и подкорректированы по сравнению с Героями 1. То есть я имею в виду, что это как бэ реально не с потолка. Но жизнь (быстрый бой) эти формулы разбивает в пух и прах.
Пожалуй я впервые задумался над этой зависимостью мю(N), когда понял, что у меня не получается настроить ИИ так чтобы он нормально убегал в битве - например, он имеет много гоблинов, которые помрут скоро от моих Драконов - а он считает, что он не слабее (то есть эта мю(N) - она же используется в philAI_FightValueOfStack, а уже эта функция много где используется - и в теор. битве, и в расчете убегания ИИ из битвы с человеком и тд).
Вернуться к началу

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

Re: Герои 2 (разные версии) с плагинами

Сообщение Ben80 » 13 авг 2023, 18:20

AlexSpl писал(а):

В HD моде автобой вместо теоретической. Но я не знаю про оценки. Зато видел плагины для Тройки, которые заменяют теоретические битвы 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: Герои 2 (разные версии) с плагинами

Сообщение AlexSpl » 13 авг 2023, 18:23

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

Да, я видел. Он расширил диапазон существ. Т.е. у него была какая-то формула/алгоритм для мю.
Вернуться к началу

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

Re: Герои 2 (разные версии) с плагинами

Сообщение Ben80 » 13 авг 2023, 18:40

Ну либо "кэшировать" результаты оценки по итогам автобоя нужно эффективно - смотреть, не изменился ли состав армии ИИ героя. Если изменился, то апдейтить оценки битв.
И тогда ваша мечта могла бы сбыться - полный уход от теоретических битв. Но все-таки для этого боевой ИИ должен быть адекватным - если он не умеет толком использовать абилки типа прожига, то не факт что такой автобой будет лучше теоретической битвы.
Но и все равно наверняка в игре остается куча ситуаций, когда нужно оценить силу армии, без битвы. Такая функция как philAI_FightValueOfStack в игре все равно останется, а с ней и разные неоднозначные моменты.
Последний раз редактировалось Ben80 13 авг 2023, 18:46, всего редактировалось 1 раз.
Вернуться к началу

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: Герои 2 (разные версии) с плагинами

Сообщение AlexSpl » 13 авг 2023, 18:46

Цитата:
Ну либо "кэшировать" результаты оценки по итогам автобоя нужно эффективно - смотреть, не изменился ли состав армии ИИ героя. Если изменился, то апдейтить оценки битв.

У меня была ещё идея о гибридном подходе: автобой 10 раундов (условно, но обычно битвы против нейтралов и столько не длятся), а потом уже - теоретическая оценка. После 10 раундов оценить силы намного проще, ибо у одной из сторон появится ощутимый перевес.
Вернуться к началу

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

Re: Герои 2 (разные версии) с плагинами

Сообщение Ben80 » 13 авг 2023, 19:19

AlexSpl писал(а):

Да, я видел. Он расширил диапазон существ. Т.е. у него была какая-то формула/алгоритм для мю.


Он добавил еще диапазон 180-300 и диапазон 300-500. Но и для старых диапазонов изменил коэффициенты. Например, для диапазона 100-140 было 1.1, стало 2.42, для диапазона 140-180 было 1.3, стало 3.08. Я как-то упустил это из виду, когда предлагал вам столкнуть в теоретической битве Гоблинов с Гигантами. То есть Гоблины "теоретически выиграют" еще более разгромно.
Вернуться к началу

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: Герои 2 (разные версии) с плагинами

Сообщение AlexSpl » 13 авг 2023, 19:29

Цитата:
Например, для диапазона 100-140 было 1.1, стало 2.42, для диапазона 140-180 было 1.3, стало 3.08.

Это вообще очень странно. Сейчас пересматриваю philAI::ProbableOutcomeOfBattle() в Героях 1. Хочу всё-таки разобраться, откуда идея таких коэффициентов. Если найду логику, поделюсь позже :smile1:
Вернуться к началу

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

Re: Герои 2 (разные версии) с плагинами

Сообщение Ben80 » 13 авг 2023, 19:33

AlexSpl писал(а):

Это вообще очень странно. Сейчас пересматриваю philAI::ProbableOutcomeOfBattle() в Героях 1. Хочу всё-таки разобраться, откуда идея таких коэффициентов. Если найду логику, поделюсь позже :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: Герои 2 (разные версии) с плагинами

Сообщение AlexSpl » 13 авг 2023, 20:08

По багам слива, если интересно. Код Героев 2:

Код: Выделить всё
void __thiscall armyGroup::DamageGroup(armyGroup *this, float winCoeff)
{
  int j; // [esp+10h] [ebp-14h]
  int i; // [esp+14h] [ebp-10h]
  int v5; // [esp+18h] [ebp-Ch]
  int v6; // [esp+20h] [ebp-4h]

  v5 = 1;
  for ( i = 0; i < 5; ++i )
  {
    if ( *(this + i) == -1 )
    {
      *(this + 2 * i + 5) = 0;
    }
    else
    {
      v6 = 0;
      for ( j = 0; *(this + 2 * i + 5) > j; ++j )
      {
        if ( SRandom(0, 100) < (winCoeff * 100.0) )
          ++v6;
      }
      if ( v5 && *(this + 2 * i + 5) == v6 && winCoeff < 0.999 )
        LOWORD(v6) = v6 - 1;
      *(this + 2 * i + 5) -= v6;
      if ( *(this + 2 * i + 5) <= 0 || winCoeff >= 1.0 )
      {
        *(this + 2 * i + 5) = 0;
        *(this + i) = -1;
      }
      v5 = 0;
    }
  }
}

this - это armyGroup*. Обратите внимание на условие if ( SRandom(0, 100) < (winCoeff * 100.0) ). Даже если winCoeff будет равен 1.0, левая часть неравенства может сгенерировать 100 (слегка неправильная вероятность гибели). Далее, условие if ( v5 && *(this + 2 * i + 5) == v6 && winCoeff < 0.999 ) предотвращает исчезновение последнего воина в крайнем левом стеке, чтобы победитель не погибнул вместе с побеждённым (предотвращение одновременного слива). Но (!) при winCoeff >= 0.999 это условие не выполняется и все воины могут погибнуть. В TE я исправил так:

Код: Выделить всё
void __thiscall armyGroup::DamageGroup(armyGroup *this, float winCoeff)
{
  int losses; // [esp+4h] [ebp-14h]
  int j; // [esp+Ch] [ebp-Ch]
  int i; // [esp+10h] [ebp-8h]
  int firstStack; // [esp+14h] [ebp-4h]

  firstStack = 1;
  for ( i = 0; i < 5; ++i )
  {
    if ( this->creature[i] == eCreatureNone )
    {
      this->num[i] = 0;
    }
    else
    {
      losses = 0;
      for ( j = 0; j < this->num[i]; ++j )
      {
        if ( SRandom(0, 99) < (winCoeff * 100.0) )
          ++losses;
      }
      if ( firstStack && losses == this->num[i] )
        LOWORD(losses) = losses - 1;
      this->num[i] -= losses;
      if ( this->num[i] <= 0 || winCoeff >= 1.0 )
      {
        this->num[i] = 0;
        this->creature[i] = eCreatureNone;
      }
      firstStack = 0;
    }
  }
}
Вернуться к началу

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

Re: Герои 2 (разные версии) с плагинами

Сообщение Ben80 » 13 авг 2023, 20:46

AlexSpl писал(а):

По багам слива, если интересно.


Да, по Героям 1-2 мне все интересно.

Завтра посмотрю внимательнее то, что вы написали. Покажу то, что исправлял в своем "TE" для Героев 2 (опять же, посмотрю завтра, зачем я это наисправлял и правильно ли это):
Код: Выделить всё
int philAI_QuickCombat(armyGroup* armyGroupA, hero* heroA, armyGroup* armyGroupD, hero* heroD,
   int isSiegeBattle, int castleIndex, float* casualtiesA, float* casualtiesD)
{
  int experienceValueForDefender = game_ExperienceValueOfStack(armyGroupA, heroA);
  if (isSiegeBattle)
      experienceValueForDefender += 500; // баг - это нужно добавлять в experienceValueForAttacker

  int experienceValueForAttacker = game_ExperienceValueOfStack(armyGroupD, heroD);

  experienceValueForDefender = ((float)(gpGame->difficulty * 0.12 + 1.0) * (float)experienceValueForDefender);
  experienceValueForAttacker = ((float)(gpGame->difficulty * 0.12 + 1.0) * (float)experienceValueForAttacker);

  int isAttackerWin = false;
  armyGroup* armyWinner = 0;

  int ownerD;
  if(heroD)
     ownerD = heroD->ownerIdx;
  else
     ownerD = -1;

  float probWinnerA;
  int probableApproxCasualtiesA;
  int probableApproxCasualtiesD;
  int probablePreciseCasualtiesA;
  int probablePreciseCasualtiesD;
  int adjustedProfitA;

  philAI_ProbableOutcomeOfBattle(armyGroupA, heroA, armyGroupD,  heroD, 0, isSiegeBattle, castleIndex,
      ownerD, &probWinnerA, &probableApproxCasualtiesA, &probableApproxCasualtiesD,
     &probablePreciseCasualtiesA, &probablePreciseCasualtiesD, &adjustedProfitA);

  float probWinnerD = (float)Random(0, 100) / 100.0;


То есть я исправил Random(0, 100) на Random(0, 99) в функции philAI_QuickCombat.

Недавно попалась на глаза функция advManager::AutoResolveCombat. Там есть такое:
Код: Выделить всё
    switch ( gpCombatManager->winningSide + 1 )
    {
      case 1:
        if ( !gbRetreatWin )
          advManager::TransferArtifacts(a6, a3);
        advManager::HeroLoses((int)thisa, a6);
        break;
      case 2:
        if ( !gbRetreatWin )
          advManager::TransferArtifacts(a3, a6);
        advManager::HeroLoses((int)thisa, a3);
        break;
      case 0:
        advManager::HeroLoses((int)thisa, a3);
        advManager::HeroLoses((int)thisa, a6);
        break;
      case 4:
        break;
    }


Это значит, что одновременные сливы были предусмотрены разработчиками ? Насколько это корректно вписывается в игру ??
Вернуться к началу

Пред.След.

Вернуться в Техническая часть

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

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