Current time: 24.01.2021, 04:55 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
Ошибки, баги и недочёты WoG 3.58f
» Собираем в эту тему всевозможные ошибки игры
Author Message
daemon_n Offline

Posts: 2749
Post: #631

Крайне неприятный баг, который до сих пор живёт и в Эре.

Опыт существ способен уйти в отрицательные значения. Только сейчас напомнили, а так это критично, я бы сказал.
Был какой-то мод на исправления - overflow fix, кажется. Но это надо на уровне exe или game bug fixes чинить.


Image: widget.png?style=banner2
HoMM3 ERA 3.0.4 HD RUS/ENG v1.35 (06.09.20) Yandex/Google
23.09.2020 11:01
Visit this user's website Find all posts by this user Quote this message in a reply
igrik Offline
Administrators

Posts: 2451
Post: #632

29.04.2020 я добавлял такой фикс в game bug fixes extended.

Code:
_int_ __stdcall Y_WoGCrExpoSet_AddExpo(LoHook* h, HookContext* c)
{
    int cr_Expo = DwordAt(c->ebp -0x8);

    if ( cr_Expo ) {
        int expoOld = IntAt(cr_Expo);
        int expoAdd = IntAt(c->ebp -0xC);

        if ( expoAdd < 0 || expoAdd > 200000 )
            expoAdd = 0;

        // если опыт по какой то причине перевалил
        // через предел (2^32)/4 и ушёл в отрицательное число
        // ставим максимальный опыт
        if (expoOld < -1073741824) {
            IntAt(cr_Expo) = 200000;
        }

        // если опыт был < 0 && > -1073741824, обнуляем опыт и добавляем только что заработанный
        if (expoOld < 0) {
           IntAt(cr_Expo) = expoAdd;
        }
    }

    return EXEC_DEFAULT;
}

Есть сейв для перепроверки?

**************

Overflow fix писал Кавалерист. Но этот фикс на кол-во существ, а не на опыт


UPD: почему то только сейчас, прочитав код, я понял, что фикс не корректный. Странно, я же проверял, когда писал фикс.
Щас будем проверять...


game bug fixes extended.dll || My Plugins
23.09.2020 11:17
Visit this user's website Find all posts by this user Quote this message in a reply
daemon_n Offline

Posts: 2749
Post: #633

igrik, есть предположение, что это связано с модом, добавляющим существ (Аметист).
Я проверю ещё сегодня без подобных модов.

P.S.: не место ли такому фиксу в оригинальном багофиксе?


Image: widget.png?style=banner2
HoMM3 ERA 3.0.4 HD RUS/ENG v1.35 (06.09.20) Yandex/Google
(This post was last modified: 23.09.2020 11:34 by daemon_n.)
23.09.2020 11:33
Visit this user's website Find all posts by this user Quote this message in a reply
igrik Offline
Administrators

Posts: 2451
Post: #634



game bug fixes extended.dll || My Plugins
23.09.2020 13:08
Visit this user's website Find all posts by this user Quote this message in a reply
Berserker Online
Administrators

Posts: 14079
Post: #635

igrik, я, видно, что-то в маг. числах не понимаю, но смысл фикса остаётся не ясен.
предел (2^32)/4? Почему делим на 4? Почему больше 200000 не добавить?
В оригинальных сорцах это что за код?


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
23.09.2020 14:39
Find all posts by this user Quote this message in a reply
igrik Offline
Administrators

Posts: 2451
Post: #636

Причем здесь магические числа? 200 000, потому что максимальный опыт отрядов 7 уровня равен 161 700. Считай, что я чуток округлил.

2^32 = 4294967296 (диапазон значений беззнакового int)
2^32/2 (диапазон положительных и отрицательных значений int)
Нам нужно править только отрицательные значения int (2^32/2)
    - и одну половину мы будем устанавливать в опыт = 0,
    - другую = в максимальный опыт существа = 200 000
... значит (2^32/2)/2 = 2^32/4,

Что не так?

Quote:В оригинальных сорцах это что за код?
Я хз. Ты о чем?


game bug fixes extended.dll || My Plugins
23.09.2020 15:29
Visit this user's website Find all posts by this user Quote this message in a reply
Berserker Online
Administrators

Posts: 14079
Post: #637

igrik, имелось в виду файл и строка в коде ВоГ функции, что ты перехватил.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
23.09.2020 18:22
Find all posts by this user Quote this message in a reply
igrik Offline
Administrators

Posts: 2451
Post: #638

Хук я ставил в 0x71924A.
Место в коде: файл crexpo.cpp (в районе стр.600)
Code:
...
    if(cr!=0 && cr->HasArt() && cr->GetSubArt()==5 ){ // Art Sub 5 - +50% experience
      val=val*1.5;
    }
    cr->Expo+=val; // 0x719225

    cr=Find(CE_HERO,MAKEHS(Hp->Number,i));
    cr->Check4Max(); // check for max experience (0x71924A: вот тут я и поставил хук перед вызовом этй функции)
  }
  RETURNV
}


game bug fixes extended.dll || My Plugins
23.09.2020 18:33
Visit this user's website Find all posts by this user Quote this message in a reply
Berserker Online
Administrators

Posts: 14079
Post: #639

igrik, спасибо за разъяснения. На мой взгляд, исправление стоит реализовать несколько другим способом. Поддержка возможности отнять опыт должна оставаться. Давай я добавлю фикс в 3.0.6 для всех? Будет корректная обработка переполнений и поддержка отрицательной «прибавки к опыту». На базе твоего кода выше.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
23.09.2020 22:25
Find all posts by this user Quote this message in a reply
igrik Offline
Administrators

Posts: 2451
Post: #640

Без проблем. Тогда я уберу эту правку в плагине.


game bug fixes extended.dll || My Plugins
24.09.2020 01:05
Visit this user's website Find all posts by this user Quote this message in a reply
Bes Away

Posts: 4649
Post: #641

igrik, Berserker, потом тогда оставьте решение бага в ЭТОЙ теме



Image: 237506073ac7.gif
24.09.2020 01:39
Visit this user's website Find all posts by this user Quote this message in a reply
Berserker Online
Administrators

Posts: 14079
Post: #642

сделал ручное выполнение операции прибавления опыта:
cr->Expo+=val; // crexpo.cpp:601

Понятия не имею, как удаётся его переполнить, не переполняя в обычном режиме опыт героя, но да ладно.
Если опыт уже был < 0 (установлен через ЕРМ?), то он считается за 0.

Значение прибавки по формуле должно быть положительным. Если ушло в отрицательное, то это ставим максимальное положительное (2147483647).
После моего кода значение опыта всегда >= 0, но может превышать разумные пределы. Вызываемая следом воговская Check4Max подстраивает итоговое значение под нужный предел.

Code:
// Fix creature experience overflow after battle
ApiJack.HookCode(Ptr($719225), @Hook_PostBattle_OnAddCreaturesExp);

function Hook_PostBattle_OnAddCreaturesExp (Context: ApiJack.PHookContext): longbool; stdcall;
var
  ExpToAdd: integer;
  FinalExp: integer;

begin
  // EAX: Old experience value
  // EBP - $C: addition
  ExpToAdd := pinteger(Context.EBP - $C)^;

  if ExpToAdd < 0 then begin
    ExpToAdd := High(integer);
  end;

  FinalExp := Math.Max(0, Context.EAX) + ExpToAdd;

  if FinalExp < 0 then begin
    FinalExp := High(integer);
  end;

  ppinteger(Context.EBP - 8)^^ := FinalExp;

  Context.RetAddr := Ptr($71922D);
  result          := false;
end; // .function Hook_PostBattle_OnAddCreaturesExp


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
25.09.2020 02:49
Find all posts by this user Quote this message in a reply
daemon_n Offline

Posts: 2749
Post: #643

Итак. За последние несколько дней я немало так провёл в игре (скриптах и иже с ними).

Нашёл довольно неприятный баг, который тоже связан с навыками существ. Суть такова:

1. Выдаём перед боем навык (Click to View)
2. Даём статы в 1 раунде (в BA не робит, ну и навыки так же не робят тут) (Click to View)
3. Нападаем на отряд, побеждаем - всё хорошо.
4. Нападаем, проигрываем - всё плохо, так как следующее нападение будет высчитывать статы от уже добавленных. То есть не сбрасываются бонусы после боя.
5. Если это применить на отряд нейтралов, проиграть 1 бой, то статы именно этого отряда будут расти экспоненциально, пока их не победишь. Если применить на героя, то статы его существ будут расти также бесконечно, пока не... (что думаете? Думаете, так и задумано?)

Кому скучно, вот несколько вариантов на подумать (несколько правильных ответов): (Click to View)
Кому нет, вот правильные ответы: (Click to View)
Казалось бы, просто неправильно написан скрипт, и надо лишь вернуть статы, которые дали в 1 раунде.
Отнюдь!
Всё куда прозаичнее: надо просто отнять Навык, который дали перед боем. (Click to View)
И после этого проблемы не возникнет. К слову, после поражения против нейтралов, герои ИИ, как защитник - имеет уже преумноженные бонусы, а если нападёт на вас, то бонусные статы будут целиком вашиYes Можно будет тупо стоять на 1-2 гоблинах, и каждое нападение ИИ будет лишь увеличивать вам статы, пока вы не нападёте хоть на кого, где познаете новые лимиты этой игры)
Ну и тот факт, что лишь перезагрузка клиента помогает сбросить счётчик, говорит нам о том, что это проблема EA.

Если потребуется, вот всё для тестов.
КАРТА и СКРИПТ в архиве
КАРТА и СКРИПТ в виде мода для установки


Image: widget.png?style=banner2
HoMM3 ERA 3.0.4 HD RUS/ENG v1.35 (06.09.20) Yandex/Google
(This post was last modified: 15.01.2021 02:47 by daemon_n.)
15.01.2021 02:46
Visit this user's website Find all posts by this user Quote this message in a reply
Berserker Online
Administrators

Posts: 14079
Post: #644

daemon_n, как оказалось, нельзя использовать команды EA для отрядов в бою, если триггер ранее OnSetupBattlefield.
Проблема в коде Mixed Neutrals, исправляю.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
Yesterday 00:17
Find all posts by this user Quote this message in a reply
daemon_n Offline

Posts: 2749
Post: #645

Berserker, понял - спасибо!
Надо все справочники под это подогнать) Ну и сделать пометку рекомендованных ресиверов для подобных триггеров. Мол, это лучше туды, а то - сюды! 96-copy


Image: widget.png?style=banner2
HoMM3 ERA 3.0.4 HD RUS/ENG v1.35 (06.09.20) Yandex/Google
(This post was last modified: Yesterday 00:42 by daemon_n.)
Yesterday 00:42
Visit this user's website Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Forum Jump:

Powered by MyBB Copyright © 2002-2021 MyBB Group