Объявления

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

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

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

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

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

AlexSpl писал(а):

Вот тут уже главная, на мой взгляд проблема. Почему я и убрал потери вовсе при С[w] > 0.75. На турнирах (сейчас уже почти не актуально) можно было "играть" с потерями. Даже если комп гарантированно выигрывает, он с большой вероятностью теряет минимум 1 воина (а при С[w] > 0.75 это будет далеко не 1 воин). И этой единицей может быть как самый слабый, так и самый сильный воин. На турнирах это неприемлемо, так как от героя с 10 Драконами, например, за несколько боёв с какими-нибудь гоблинами можно "наотщипывать" Драконов так, что их вообще у героя не останется. Если играть for fun и не проверять, что там теряет комп, то, может быть, и сносно. Хотя я против такого подхода. Поэтому три предложенных Вами пункта нужно дополнить четвёртым, который будет регулировать потери. В бою против жалких гоблинов или крестьян герой с Драконами не должен их терять ни с какой вероятностью. Да, если там гоблинов сотня, ещё можно подумать, но не на 20 гоблинах. В общем, нужно переделать armyGroup::DamageGroup(), причём серьёзно.


Герой с Драконами ни в коем случае не понесет потерь в битве с Гоблинами, потому что коэффициент победы будет 1 и сработает код, приводящий к нулевым потерям:
Код: Выделить всё
  if(winningDegree > 0.96 && (1.0 - winningDegree) / 2.0 < casualties)
    casualties = (1.0 - winningDegree) / 2.0;


Но для этого действительно нужно не выпиливать то что я хотел выпилить, а наоборот симметрично добавить для подстраховки:
Цитата:
int __stdcall fixQuickBattle(LoHook* h, HookContext* c)
{
if(*(float*)(*(float**)(c->ebp + 0x28)) >= (float)0.92)
*(float*)(*(float**)(c->ebp + 0x28)) = (float)1.0;
else
if(*(float*)(*(float**)(c->ebp + 0x28)) >= (float)0.88)
*(float*)(*(float**)(c->ebp + 0x28)) += (float)0.07;
else
if(*(float*)(*(float**)(c->ebp + 0x28)) >= (float)0.80)
*(float*)(*(float**)(c->ebp + 0x28)) += (float)0.05;
else
if(*(float*)(*(float**)(c->ebp + 0x28)) >= (float)0.70)
*(float*)(*(float**)(c->ebp + 0x28)) += (float)0.04;
else
if(*(float*)(*(float**)(c->ebp + 0x28)) >= (float)0.60)
*(float*)(*(float**)(c->ebp + 0x28)) += (float)0.02;

return EXEC_DEFAULT;
}


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

AlexSpl писал(а):

В общем, нужно переделать armyGroup::DamageGroup(), причём серьёзно.


Ну я бы не стал этого делать, но это ваше дело, конечно. А вообще, я все-таки боюсь что у вас получиться довольно читерская система с неправдоподобно низкими потерями у ИИ в битвах.

Я также посмотрю еще повнимательнее какие в среднем потери победителю дает эта система в сравнении с тем, на что рассчитывает комп, прежде чем ввязаться в драку (не должно быть большого расхождения). Вроде норм, по первым прикидкам.
Код: Выделить всё
  *probableApproxCasualtiesA = (1.0 - *probWinnerA) * simpleStrengthA;
  *probableApproxCasualtiesD = *probWinnerA * simpleStrengthD;
  *probablePreciseCasualtiesA = (1.0 - *probWinnerA * *probWinnerA) * simpleStrengthA;
  *probablePreciseCasualtiesD = (1.0 - (1 - *probWinnerA)*(1 - *probWinnerA)) * simpleStrengthD;


(это из philAI_ProbableOutcomeOfBattle)
Вернуться к началу

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

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

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

AlexSpl писал(а):

В общем, нужно переделать armyGroup::DamageGroup(), причём серьёзно.


Хотя на самом деле интересно, что вы задумали :smile1:

AlexSpl писал(а):

Цитата:
Тогда будет как вы задумывали - если коэф. победы > 75, то эта сторона не может проиграть.

Да, отличное решение :smile11:


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

offlineАватара пользователя
void_17  
имя: имя
Ветеран
Ветеран
 
Сообщения: 548
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 132 раз.

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

Сообщение void_17 » 14 авг 2023, 16:15

Цитата:
(float)0.92


Достаточно префикса f, 0.92f
Вернуться к началу

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

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

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

Кстати, еще думаю, нужно поправить
Код: Выделить всё
  if(casualties > 0.6 && casualties < 0.99)
    casualties = casualties - 0.1;


Убрать условие "casualties < 0.99" - на случай если probDelta будет равно 0, а casualties равно 1.0
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5588
Зарегистрирован: 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 » 14 авг 2023, 16:57

Цитата:
Герой с Драконами ни в коем случае не понесет потерь в битве с Гоблинами, потому что коэффициент победы будет 1 и сработает код, приводящий к нулевым потерям:

Коэффициент победы больше 0.96 - это огромный перевес в силе. Да, армия из 10 Драконов, если исправить баг с вероятностью слива, никогда не потеряет Дракона в бою против 20 Гоблинов (коэффициент гибели будет 0). Но я утверждаю, что можно найти битву, где вероятность гибели существа уже будет отличаться от нуля, и переигровками (в турнире) можно добиться того, чтобы гибли существа, которых попросту нельзя потерять в данной битве. В обычной игре это может произойти даже незаметно для игрока и облегчить (сделать скучнее) ему прохождение карты.

Цитата:
Для удобства изложения рассмотрим конкретный случай, когда колдунья первого уровня (0-0-2-3) без магии и артефактов (мораль и удача – обычные) с армией 5 крестьян, 5 лучников, 5 копейщиков, 5 мечников и 5 циклопов (две расы – мораль 2 – 2 = 0) нападает на отряд, состоящий из 10 нейтральных гидр (2 + 2 + 2 + 2 + 2).
...
В нашем случае, P[death] = 19/101 = 18.8%.

В первом тесте колдунья слила 1 циклопа, 1 копейщика и 2 стрелков.
Во втором тесте – 2 циклопов, 1 мечника, 2 копейщиков, 2 стрелков и 1 крестьянина.
В четвёртом тесте произошёл полный слив героя, и из 10 гидр осталось только 6.
В пятом тесте колдунья слила 3 циклопов и по 4 воина из других отрядов.

И это при 18.8%! А что можно творить, скажем, при 5% или 2%? :smile2:

Цитата:
Хотя на самом деле интересно, что вы задумали

Пока только одна идея: замена теоретической битвы на скрытый автобой. Чтобы написать алгоритм теоретической битвы, который будет давать результаты, схожие с результатами реального боя (желательного с результатами боя человека), нужно очень сильно заморочиться. Не знаю, возможно ли это вообще сделать через алгоритм хотя бы в 10 раз быстрее, чем алгоритм автобоя :smile5:
Вернуться к началу

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

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

Сообщение Ben80 » 14 авг 2023, 17:06

AlexSpl писал(а):

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


Ну вот есть же функция advManager::AutoResolveCombat. Только никто не знает, работает она или нет :smile1:

Так еще раз глянул:
Код: Выделить всё
  *probablePreciseCasualtiesA = (1.0 - *probWinnerA * *probWinnerA) * simpleStrengthA;
  *probablePreciseCasualtiesD = (1.0 - (1 - *probWinnerA)*(1 - *probWinnerA)) * simpleStrengthD;


Похоже, тут явно завышены ожидания потерь. С этим нужно что-то делать...
Последний раз редактировалось Ben80 15 авг 2023, 06:03, всего редактировалось 1 раз.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5588
Зарегистрирован: 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 » 14 авг 2023, 17:09

Цитата:
Ну вот есть же функция advManager::AutoResolveCombat. Только никто не знает, работает она или нет

Она работает, но с багами. Я как-то давно писал о ней на этом форуме и как её включить. Сам лично тестировал. Она вылетает, если в армии есть лучники, но работает нормально без них. Надо поискать тот пост. Кажется, нужно запустить игру с ключом /p4, но я мог и запамятовать уже.
Вернуться к началу

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

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

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

AlexSpl писал(а):

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


А, ну да, я и забыл что у вас TE означает TE(offline). Это и дает большую разницу в подходах.

А что думаете насчет того, чтобы убрать условие "casualties < 0.99" ?
Вернуться к началу

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

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

Сообщение Ben80 » 14 авг 2023, 17:16

AlexSpl писал(а):

Кажется, нужно запустить игру с ключом /p4, но я мог и запамятовать уже.


Ну это само собой - вот же вызов этой функции:
Код: Выделить всё
  if ( giDebugLevel == 4 )
    return advManager::AutoResolveCombat(this, a2, a3, (int)a4, a5, a6, (int)a7, a8, a9, a10, a11);


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

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5588
Зарегистрирован: 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 » 14 авг 2023, 17:23

Цитата:
А что думаете насчет того, чтобы убрать условие "casualties < 0.99" ?

У меня база TE, там уже не видно, что было в оригинале. По какому адресу это условие? Кстати, у меня это winCoeff, casualties - это уже потери (в ед. существ).

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

Проще всего поймать вылет в отладчике, запустив игру и пройдясь по инструкциям функции пошагово.
Вернуться к началу

Пред.След.

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

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

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

cron