Wake of Gods Forum | Форум Во Имя Богов

Full Version: Ошибки, баги и недочёты WoG 3.58f
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
На мой взгляд, исправить стоит, но не хуком, а бинарником - можно просто скопировать байт-код, поменяв его части местами. Так, при желании, любой сможет это отключить, а также не будет потенциальных конфликтов с другими модами, которые захотят повлиять на вероятности старости.
Я дурак, забыл скинуть адрес функции 148 75DE21
(21.08.2021 23:22)Raistlin Wrote: [ -> ]На мой взгляд, исправить стоит, но не хуком, а бинарником - можно просто скопировать байт-код, поменяв его части местами.

На мой взгляд, этот корявый хук вообще можно выключить. Т.к. он и установлен неудачно (ставить надо было непосредственно на 440253h), и выполняет мусор. А вообще, данная штука может быть реализована обычным бинарным пачтем, т.к. выше данной функции можно освободить место для кода (9 байт как минимум), задействуя +10 байт кода самой функции, который будет затёрт. Итого, 19 байт, в которые может без проблем уместиться проверка на монстра.

(21.08.2021 23:22)Raistlin Wrote: [ -> ]Так, при желании, любой сможет это отключить, а также не будет потенциальных конфликтов с другими модами, которые захотят повлиять на вероятности старости.

В Тифоне расширены сами кейсы, поэтому что есть этот воговский хук, что его нет - особой разницы нет. Т.к. % срабатывания старения выставляется непосредственно в редакторе монстров (20, 40 и 100), ну и можно "старить" без проверки на "живность" (например Анубис старит всех без разбору 148 ).
(22.08.2021 00:01)XEPOMAHT Wrote: [ -> ](например Анубис старит всех без разбору 148 ).

Пусть только сам будет с иммунитетом к старостиYes
Реализовал, спасибо. Патч в память из кода Эры, но без хуков. Войдёт в следующую версию.
Найден серьёзный Баг (оригинала), сработает и в WOG/ERA

Как все мы знаем, ограничение числа стеков в бою с каждой стороны - 20 ед.
Призыв элементалей хоть и занимает число стеков, но где-то за 3 ед до лимита эта величина подчищается.

Но с опытом существ/санта гремлинами/прочими скриптами доступно заполнение массива другими существами. + добавим поднятие Пит-лордами.

Проще говоря, на таких значениях можно выйти сверх лимита. И это возможно сделать подняв отряд пит-лордами либо призвав элементалей (для ИИ - нет проверки!!!), так понимаю, воскрешением тоже - 0x005A777B - адрес ошибки (v12->SlotIndex = this; )

Может, через ERM оно решается, но лучше через плагинYes
(19.09.2021 15:59)daemon_n Wrote: [ -> ]Проще говоря, на таких значениях можно выйти сверх лимита. И это возможно сделать подняв отряд пит-лордами либо призвав элементалей (для ИИ - нет проверки!!!), так понимаю, воскрешением тоже - 0x005A777B - адрес ошибки (v12->SlotIndex = this118

Может, через ERM оно решается, но лучше через плагинYes

Проверки на лимит количества отрядов должны быть в коде, если их там нет (например в ВоГе не всегда, в скриптах - тем более), то нужно добавлять. combatManager врядли кто-то станет патчить для увеличения количества стеков - там куча данных, использующихся в плагинах, в общем совместимость будет практически никакая. В рамках обособленного мода типа HoA или MoP такую штуку можно сделать, но для ERA - абсолютно лишено смысла 105
XEPOMAHT, проверка есть только для суммона, и только для человека.
daemon_n, призыв элементалей ИИ не скриптом?
Berserker, нет - всё вручную. Я выдал ему в книгу только 1 заклинание.
Уточняю, что краш может быть вызван и человеком, если увеличить число стеков всем, кроме призыва - проверял в SoD также;
А для ИИ вообще нет такой проверки, но для SoD она и не нужна, а вот для ERA - да, так как там на старте боя можно спокойно иметь 15+ стеков.

Если надо, скину сейв и/или видео
Вообще то такая проверка есть (0x479A54)
Но она не работает и выход из функции ни на что не влияет (функции вызывающие эту продолжают выполнять свой код не обращая внимание на "неуспех" текущей. Отсюда и вылеты)
Code:
////// начальная часть кода функции BattleMgr_Add_New_StackBySpell ////

  stackFlags = &bm->stacks[21 * Side].Flags;
  // (132-80)=52 -> creature_id != NONE
  while ( *(stackFlags - 80) != -1 )
  {
    // !count && flag_DIE && flag_SUMMON
    if ( !*(stackFlags - 38) && ((unsigned int)*stackFlags >> 21) & 1 && ((unsigned int)*stackFlags >> 22) & 1 )
    {
      stackID = i;
      bool_isFindNewStackID = TRUE;
      goto ifFindStack;
    }
    // try to find next
    ++i;
    stackFlags += 338;
    // if maximum
    if ( i >= 20 )
      return 0;
  }
  stackID = i;
ifFindStack:

UPD: И что в итоге: например разберём код воскрешения пит-лордов (0x5A776F)

Code:
// (тут, если id нового стека не найдет, в v12 будет возвращён ноль)
v12 = BattleMgr_Add_New_StackBySpell(bm, v11, 48, v10, v5->hex_ix, 0, 1);
// просто перезапись адреса стека (в данном случае нуля)
v13 = v12;
// и тут закономерно получаем вылет при попытке взятия смещения у нуля:
v12->SlotIndex = (int)this;
Понял, будем исправлять.
Берс исправление я вижу так:
Патчим лоухуком 3 ВЫЗОВА функции BattleMgr_Add_New_StackBySpell (0x479A30)
И если у этой функции результат равен нулю, завершаем вызывающие функции (благо они все типа void, и их завершение не критично для игры. Можно и сообщение добавить о невозможности вызова, призыва или воскрешения)

Кстати, в ВОГе тоже есть всего один вызов такой функции (0x714DA7), который обрабатывает ВСЕ вызовы монстров в ВОГе, и после идёт проверка на ноль, так что ВОГ это сделал безопасно, в отличие от СОДа.
igrik, видимо, добавили, когда делали санта-гремлинов)
igrik, так и планировал, спасибо за разъяснения 132
Reference URL's