Объявления

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

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

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

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

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

В этой функции кидается, но к решению данного вопроса это отношения не имеет.
В этой функции (CombatAI_0043C450_SpellsAI) для каждого заклинания, кроме "твердой" оценки/взвешивания применяется еще и случайный множитель, как и в некоторых других функциях битвы (при выборе цели для удара, например).
Причем диапазон от 75 до 100 - некий стандарт для Г3. Кстати, именно для заклинаний было бы интересно расширить этот диапазон, скажем, от 50 до 100...
Вернуться к началу

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

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

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

AlexSpl писал(а):

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


Я понимаю, что мораль и удача от -3 до 3 :smile1: Но тогда причем здесь 100 ? Почему 3 или -3 из 100 ?
Если говорить про 100-гранный бросок, то кап для морали/удачи мы знаем - это 12.5, а не 3.
Вернуться к началу

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:50

Я бы эти константы не трогал. На описку не похожи. На корни из 3 очень даже.

Цитата:
Но тогда причем здесь 100 ? Почему 3 или -3 из 100 ?

Потому что дальше идёт умножение на бросок кости: Random(75, 100).

Цитата:
Если говорить про 100-гранный бросок, то кап для морали/удачи мы знаем - это 12.5, а не 3.

Я про кап в единицах морали/удачи, а не про их вероятности.
Вернуться к началу

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

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

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

AlexSpl писал(а):

Потому что дальше идёт умножение на бросок кости: Random(75, 100).


Так я же говорю, что к морали/удачи этот бросок (Random(75, 100)) никакого отношения не имеет (абсолютно разные участки кода, далекие друг от друга как Арктика от Антарктиды).

AlexSpl писал(а):

Цитата:
Если говорить про 100-гранный бросок, то кап для морали/удачи мы знаем - это 12.5, а не 3.

Я про кап в единицах морали/удачи, а не про их вероятности.


Если вы про кап в единицах морали/удачи, то числу 100 здесь взяться неоткуда.

***

Я приводил пример бага в CombatAI_0043C450_SpellsAI просто как пример еще одного бага, не более того.
Вернуться к началу

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, 18:01

Код: Выделить всё
if ( v41 > 0 )
{
  v24 = *(signed __int16 *)&_this->NextManager->ManagerName[4];
  if ( v24 < 7 * v22 )
  {
   v44 = (long double)(v24 / v22);
   v26 = sqrt(v44);
   v44 = (long double)v41;
   result = v26 * v44;
   v25 = (signed __int64)result;
  }
  else
  {
   LODWORD(v25) = 5 * v41 / 2;
  }
  v41 = v25;
  v41 = (signed int)v25 * Random(75, 100) / 100;
  if ( v41 > v32 )
  {
   qmemcpy(&v29, &a2a, 0x24u);
   v18 = v46;
  }
}

Я про этот участок кода сейчас. Умножение на бросок следует сразу же.
Вернуться к началу

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

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

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

Ну при желании можно и этот участок кода обсуждать, я не против. Только причем тут мораль/удача и соответствующие коэффициенты ?
Цитата:
Умножение на бросок следует сразу же


Сразу же после чего ? После расчета коэффициента (причем для любого заклинания вообще), учитывающего цену заклинания (расход маны).
Вернуться к началу

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, 18:14

С моралью/удачей то же. Деление на 100 - это процент. Кость 100-гранная. Типа 1/100 * 100 = 1 (избавляемся от знаменателя).

Можно было бы и не делить. но в игре Random - целочисленный от 1 до 100. Вот поэтому и делят константы на 100. Использовали бы рандом от 0 до 1, не нужно было бы делить константы на 100.
Вернуться к началу

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, 19:25

Рассмотрим код для Misfortune:

Код: Выделить всё
long double __fastcall sub_004354A0(int Luck, int LuckBonus, double c1, double c2)
{
  long double result; // fst7
  int LuckVar; // [esp+Ch] [ebp-4h]

  LuckVar = LuckBonus;
  if ( LuckBonus <= 0 )
  {
    if ( Luck > -3 )
    {
      if ( Luck + LuckBonus < -3 )
      {
        LuckBonus = -3 - Luck;
        LuckVar = -3 - Luck;
      }
      if ( Luck > 0 )
      {
        if ( -LuckBonus > Luck )
          result = -((double)Luck * c1) - (double)(LuckBonus + Luck) * c2;
        else
          result = (double)LuckVar * c1;
      }
      else
      {
        result = -((double)LuckVar * c2);
      }
    }
    else
    {
      result = 0.0;
    }
  }
  else if ( Luck < 3 )
  {
    if ( Luck + LuckBonus > 3 )
    {
      LuckBonus = 3 - Luck;
      LuckVar = 3 - Luck;
    }
    if ( Luck < 0 )
    {
      if ( LuckBonus > Luck )
        result = (double)(LuckBonus + Luck) * c1 + (double)Luck * c2;
      else
        result = -((double)LuckVar * c2);
    }
    else
    {
      result = (double)LuckVar * c1;
    }
  }
  else
  {
    result = 0.0;
  }
  return result;
}


Обе константы c1 и c2 играют свою роль в зависимости от текущего значения Удачи и кол-ва ед., на которые её снижает заклинание.

А именно - интересен фрагмент:

Код: Выделить всё
if ( -LuckBonus > Luck )
   result = -((double)Luck * c1) - (double)(LuckBonus + Luck) * c2;
else
   result = (double)LuckVar * c1;
}
else
{
   result = -((double)LuckVar * c2);
}


Из которого следует, что коэффициенты не есть вероятности. Конкретно для данного фрагмента мы имеем три возможных значения функции:

а) Luck * (-c1) - (LuckBonus + Luck) * c2;
б) LuckVar * c1;
в) LuckVar * (-c2).
Вернуться к началу

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

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

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

AlexSpl писал(а):

Рассмотрим код для Misfortune:
...
Из которого следует, что коэффициенты не есть вероятности. Конкретно для данного фрагмента мы имеем три возможных значения функции:

а) Luck * (-c1) - (LuckBonus + Luck) * c2;
б) LuckVar * c1;
в) LuckVar * (-c2)


Нет, Александр, из этого никак не следует, что коэффициенты не есть вероятности. Наоборот, этот код показывает, что при "уходе" удачи в минус либо плюс следует использовать разные коэффициенты. При "уходе" из плюса в плюс используется с1, при "уходе" из минуса в минус с2, а при изменении с плюса на минус либо наоборот - смешанная формула.
Что как раз и соответствует известной геройской игромеханике, связанной с вероятностями , в плюс это 4, 8, 12 из 96 возможных, в минус это 8, 16, 24 из 96 возможных.

И, кстати, это не для код для Misfortune. Это универсальная функция для Fortune, Misfortune, Mirth, Sorrow (причем необязательно для спеллов).

На самом деле, я укрепился во мнении, что тут имеет место серьезный косяк NWC кодеров. Вернее, не то что серьезный, скорее нелепый. По последствиям то несерьезный. Похоже в коде для ИИ у них прилично ошибок - ведь их и выявить было трудно.
Последний раз редактировалось Ben80 08 апр 2020, 19:51, всего редактировалось 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, 19:41

Ну да, код общий. Я расписал для Misfortune. А с1 и с2 - это оценки эффективности. Мы же на выходе получаем не вероятность, а именно эффективность заклинания.
Вернуться к началу

Пред.След.

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

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

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

cron