Объявления

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

Интересные факты

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

Re: Интересные факты

Сообщение Ben80 » 09 ноя 2020, 10:08

А я не говорил, что он не кастует Haste (Haste в исполнении ИИ сам наблюдал изредка). Не кастует он Slow. И есть общая ошибка в расчете целевого Х как для Slow, так и для Haste.
Вернуться к началу

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)
Поблагодарили: 2161 раз.

Re: Интересные факты

Сообщение AlexSpl » 09 ноя 2020, 10:31

Проверил. Slow тоже кастует.

Нужно уточнить, в каких именно случаях комп не кастовал Slow и Haste, т.е. в чём именно ошибка.
Вернуться к началу

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

Re: Интересные факты

Сообщение Ben80 » 09 ноя 2020, 10:39

AlexSpl писал(а):

Проверил. Slow тоже кастует.

Нужно уточнить, в каких именно случаях комп не кастовал Slow и Haste, т.е. в чём именно ошибка.


Ну, не знаю, как вы проверяли :smile1: - когда у компа в книге кроме Slow ничего нету ?
На практике я ни разу не видел Slow в исполнении ИИ.

В чем именно ошибка, я уже написал - забыли поставить минус. Если хотите, можете эту инфу игнорировать (скажем, если она субъективно вам чем-то не нравится), соответствие истине она от этого не потеряет.
Код: Выделить всё
int __stdcall correctSlowWeightSign(LoHook* h, HookContext* c)
{
   c->eax = c->eax * (-1);

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

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)
Поблагодарили: 2161 раз.

Re: Интересные факты

Сообщение AlexSpl » 09 ноя 2020, 10:47

Цитата:
Ну, не знаю, как вы проверяли :smile1: - когда у компа в книге кроме Slow ничего нету ?

Проверял с тремя заклинаниями: Magic Arrow, Slow, Haste. За бой комп скастовал все три.

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

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

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

Re: Интересные факты

Сообщение Ben80 » 09 ноя 2020, 11:06

Так, получается, что и для взвешивания снятия Haste при кастовании Slow он тоже знак неправильно ставит. То есть требуется еще один хук.
По идее можно обойтись без хуков, и hex кодингом заменить fsubrp на fsubp по адресу 0x466525 (ENG 2.1). Как-то так.
Получается
Код: Выделить всё
_PI->WriteHexPatch(0x466525, "DE E9");
для ENG 2.1
***
Хотя нет, не получится обойтись hex кодингом, к сожалению.
Вернуться к началу

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

Re: Интересные факты

Сообщение Ben80 » 09 ноя 2020, 14:50

AlexSpl писал(а):

Нужно уточнить, в каких именно случаях комп не кастовал Slow и Haste, т.е. в чём именно ошибка.


ИИ не обязан кастовать все, что у него есть (по очереди, в случайном порядке, или как-то еще), он кастует то, что получает максимальную оценочную функцию. Поэтому если в каком-то бою из имеющихся нескольких заклинаний было скастовано только одно (несколько раз), это необязательно говорит о каких-то имеющихся багах/ошибках. Конкретно по Slow подозрение о наличии бага возникло по той причине, что я вообще ни разу ни видел каст этого заклинания (по итогам прохождения десятков сценариев). Но если некастование Slow можно как-то объяснить тем, что он как-то считается заниженно (если так, то это нельзя было бы отнести к багам), то некастование Mass Slow вызвало уже серьезные подозрения, поскольку понятно, что заклинание мощное.
Вернуться к началу

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)
Поблагодарили: 2161 раз.

Re: Интересные факты

Сообщение AlexSpl » 10 ноя 2020, 11:32

Код: Выделить всё
case 11:
case 12:
  if ( !v45 && !v49 && !*(_BYTE *)(v50 + 267) )
  {
    v16 = sub_49716F((char *)v40, v50, 1);
    v44 = sub_4D6EF0((double)v16 * v47);
    // Здесь Вы меняете знак v44
    if ( *(_BYTE *)(v50 + 266) )
    {
      if ( v54 + *(unsigned __int8 *)(v50 + 266) >= 10 )
        v35 = 10;
      else
        v35 = v54 + *(unsigned __int8 *)(v50 + 266);
      // v17 = v44
      v17 = (double)v44;
      v18 = sub_49716F((char *)v40, v50, 0);
      // В оригинале функция принимает аргумент v17 - v18 * k[v35]
      // У вас получается: -v17 - v18 * k[v35]*
      v44 = sub_4D6EF0(v17 - (double)v18 * flt_518304[v35]);
    }
  }

*) Обычно так не пишут (например, -x - y и т.п.). -x - y = -(x + y). Это ближе, но выше аналогичный код для Haste, где знак Вы не меняете. Я не смотрел в дебаггере, какие значения выдаёт функция sub_4D6EF0() для Slow/Mass Slow, но можете объяснить, как Вы пришли к тому, чтобы изменить знак на противоположный?
Вернуться к началу

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

Re: Интересные факты

Сообщение Ben80 » 10 ноя 2020, 12:23

AlexSpl писал(а):

но можете объяснить, как Вы пришли к тому, чтобы изменить знак на противоположный?


Объяснить очень просто:
1) по итогам просмотра кода combatManager::RawEffectSpellInfluence - ветка для slow и haste. Из кода очевидно, что оценочная функция пропорциональна разнице между кол-вом необходимых ходов отряда до края поля до каста и кол-вом необходимых ходов отряда до края поля после каста. Поэтому оценочная функция всегда возвращает отрицательное значение для оценки Slow и положительное - для Haste.
p.s. В combatManager::RawEffectSpellInfluence всегда отрицательное значение возвращается только для Slow и Curse.

2) Я меняю знак уже после вызова combatManager::RawEffectSpellInfluence в теле combatManager::DetermineEffectOfSpell. Если посмотреть код в combatManager::DetermineEffectOfSpell, там ниже ветки для Slow есть ветка для Curse. И вот там не забыли поставить минус по итогам вызова combatManager::RawEffectSpellInfluence. На это я обратил внимание.
p.s. Для Curse минус поставить не забыли, зато забыли изменить минус на плюс для учета снятия заклинания Bless.

***

Небольшая проблема оригинального кода в том, что не унифицировали плюсы-минусы в combatManager::RawEffectSpellInfluence - лучше бы для всех заклинаний возвращался всегда плюс. Это уменьшило бы вероятность ошибок при расставлении плюсов и минусов к возвращаемому значению combatManager::RawEffectSpellInfluence.
Баг для 2.0 Eng и 2.1 Rus с DispelMagic в combatManager::EffectSpellCure как раз обусловлен этой путаницей.
Последний раз редактировалось Ben80 10 ноя 2020, 12:57, всего редактировалось 1 раз.
Вернуться к началу

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

Re: Интересные факты

Сообщение Ben80 » 10 ноя 2020, 12:29

А вот, кстати, фикс для масс-спеллов - они иногда не срабатывали для всех отрядов, если присутствовал хотя бы один отряд, имунный к заклинанию.
Код: Выделить всё
int __stdcall massSpellsCastFix(LoHook* h, HookContext* c)
{
    int spell = *(int*)(c->ebp - 0xC);
    int hookAddress = h->GetAddress();

    // Rus 2.1
    if(hookAddress == 0x49F074)
    if(spell == SPELL_MASS_CURE || spell == SPELL_MASS_HASTE || spell == SPELL_MASS_SLOW ||
        spell == SPELL_MASS_BLESS || spell == SPELL_MASS_CURSE || spell == SPELL_HOLY_WORD ||
        spell == SPELL_HOLY_SHOUT || spell == SPELL_MASS_DISPEL || spell == SPELL_DEATH_RIPPLE ||
        spell == SPELL_DEATH_WAVE || spell == SPELL_MASS_SHIELD)
    {
        c->return_address = 0x49F0AF;
        return NO_EXEC_DEFAULT;
    }

    // Eng 2.1
    if(hookAddress == 0x499F44)
    if(spell == SPELL_MASS_CURE || spell == SPELL_MASS_HASTE || spell == SPELL_MASS_SLOW ||
        spell == SPELL_MASS_BLESS || spell == SPELL_MASS_CURSE || spell == SPELL_HOLY_WORD ||
        spell == SPELL_HOLY_SHOUT || spell == SPELL_MASS_DISPEL || spell == SPELL_DEATH_RIPPLE ||
        spell == SPELL_DEATH_WAVE || spell == SPELL_MASS_SHIELD)
    {
        c->return_address = 0x499F72;
        return NO_EXEC_DEFAULT;
    }

    return EXEC_DEFAULT;
}

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

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)
Поблагодарили: 2161 раз.

Re: Интересные факты

Сообщение AlexSpl » 10 ноя 2020, 13:59

Получается, все эти годы мы играли в неправильных Героев 2 :smile5: Но появись эти фиксы раньше, Портал бы всё равно не играл на исправленной версии: для игроков не в теме версия "из коробки" - незыблемый эталон, и не важно, что программист просто забыл поставить знак минус, и то, что игра с этим минусом становится такой, какой её хотели видеть, а бонусом идёт ещё и улучшение качества боевого ИИ.
Вернуться к началу

Пред.След.

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

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

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

cron