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

Full Version: Плагины. Обсуждение
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
(22.05.2024 01:10)Archer30 Wrote: [ -> ]XEPOMAHT, it looks like Prima didn't patch Mana Vortex. When a hero has Knowledge at above 127, Mana Vortex won't be activated.

Исправлена очепятка в адресе патча. Вместо 5 была 3. Скачать: https://dropmefiles.com/S8qUO

Спасибо за найденную ошибку.
XEPOMAHT, thanks!
igrik, in the latest game bug fixes extended.dll, we have a problem of double-wide units

Video and save game

When there's a unit behind a double-wide unit, for this double-wide unit, clicking on the rear of this unit will result in a turn skip (because not possible to move).
Disabling game bug fixes extended.dll resolves the issue.

temporary solution:
Hi Igrik,
i would like to report 2 things about your beautiful ChooseAttack plugin:

1) In Hot Seat mode, there is no ChooseAttack button for the right player.

2) The creature ids which have alternate attacks are hardcoded in your plugin. It would be could to make a configuration file or a function which can be called to add more creature. Otherwise the Choose Attack doesn't work on new creatures added by mods.

Can you look into it?

Thank you in advance,
SadnessPower
Image: 27144c8ea67c0ea02cf67ab968b38933.jpg

SoD_SP выдаёт вот такую ошибку
При использовании плагина new_battle_interface_dlg.dll от daemon_n Y-координата окна просмотра характеристик монстра почему-то сползает вверх при увеличении расширения экрана монитора.

На 800х600 координаты верные:

Image: 1.jpg

На 1280х1024 (выше монитор не поддерживает) плагин new_battle_interface_dlg.dll Y-координату обнуляет:

Image: 2.jpg

Исправьте, если не сложно.
При использовании последней версии плагина game bug fixes extended.dll от daemon_n вместе с ERA+ теперь стабильно вылетает при попытке ответного удара отряда на поле брани (бой проводился Тяжёлыми Нага-Танками против Духов):

Поэтому в состав ERA+ вынужденно возвращается старая версия game bug fixes extended.dll от 2024 года, в которой этого вылета нету. Временно, пока эта критическая ошибка не будет исправлена.
XEPOMAHT, сейчас проверю, что там.

UPD: отключил часть хуков с тифоном на обработку огненного щита. Проверь, пожалуйста, есть ли у тебя там что-то из патчей или хуков:
(07.11.2025 18:53)daemon_n Wrote: [ -> ]Проверь, пожалуйста, есть ли у тебя там что-то из патчей или хуков:

_PI->WriteLoHook(0x441982, LoHook_00441982) - этот хук затирается Тифоном и срабатывать не должен

_PI->WriteLoHook(0x441AFF, LoHook_00441AFF) - этот хук Тифону вроде б не мешает - там работает содовский код, на выполнение Тифоновского кода это никак не влияет

_PI->WriteHiHook(0x441b5d, CALL_, EXTENDED_, THISCALL_, HiHook_00441b5d); - этот хук затирается Тифоном и срабатывать не должен

(07.11.2025 18:53)daemon_n Wrote: [ -> ]if (reinterpret_cast<_BattleStack_*>(c->edi)->count_current > 0)

Не очень понимаю эту строку с аж 4 знаками сравнения (я плохо понимаю Си), но что означает в ней "reinterpret_cast"? Если это какая-то воговская переменная, то её может и не быть, т.к. Тифон некоторые ненужные воговские данные отключает.

PS: Методом научного тыка, на который я потратил 2,5 часа, удалось узнать, что глючит эта функция:

Code:
// © JackSlater
// Вампиризм не работает на клонов
_LHF_(LoHook_BattleStackVampirism)
{
    if (reinterpret_cast<H3CombatCreature *>(c->edx)->creature.clone)
    {
        c->return_address = 0x4412AB;
        return NO_EXEC_DEFAULT;
    }
    return EXEC_DEFAULT;
}

Для Тифоновских Духов в edx будет МУСОР (точнее, тифоновский флаг вампиризма, чтобы вампиры не вампирили друг у друга). Поэтому игра тут глючит! Структуру стека в этом месте для совместимости нужно извлекать из стека, а не из edx (т.к. Тифоновская вставка его не восстанавливает, т.к. в дальнейшем коде он в следующей команде затирается содовским кодом).

Пришлось перенести этот багфикс в Тифон, после чего ошибка изчезла:

Code:
proc Багфикс_вапиризма
    mov edx, dword [ebp+8]
    bt dword [edx+Структура_стека.Флаги], Флаг_Клон ; цель отсоса - не клон
    jb .нет_вампиризма
    mov ebx, dword [esi+Структура_стека.Текущее_количество]
    mov edx, dword [esi+Структура_стека.Количество_в_начале_битвы]
    push 44093Bh
    ret

.нет_вампиризма:
    push 4412ABh
    ret
endp
XEPOMAHT, perplexity/qwen/deepseek в помощь )
reinterpret_cast — это приведение типов. Дословно: интерпретировать данные по адресу как другой тип

if (reinterpret_cast<_BattleStack_*>(c->edi)->count_current > 0)

c->edi считать указателем на структуру BattleStack, далее посмотреть счётчик текущий существ в структуре и сравнить с 0.
(08.11.2025 07:25)Berserker Wrote: [ -> ]perplexity/qwen/deepseek в помощь )

perplexity открывает пустой экран в браузере.
qwen зависает, когда пытается что-то прочитать с гугла.
deepseek сразу с ходу говорит что-то на буржуйском:

Quote:Your browser is out of date. Update your browser to view this site properly.

(08.11.2025 07:25)Berserker Wrote: [ -> ]reinterpret_cast — это приведение типов. Дословно: интерпретировать данные по адресу как другой тип

В структуре тип задан как _int32_, почему его напрямую нельзя сравнивать с нулём? Т.е. написать так:

Code:
if (((_BattleStack_*)c->edi)->count_current > 0)

Особо в программировании на Си не понимаю, поэтому спрашиваю.
Это принудительное приведение типов в стиле СИ без проверок. Оно позволяет байт считать 32-битной переменной при желании. Иногда оно приводит к ошибкам. В С++ сделали явными варианты приведения:

1) С сохранением размера оригинальной переменной static_cast. Тут нельзя байт как указатель интерпретировать
2) С полной переинтерпретацией байтов и адресов. Тут можно что хочешь на свой страх и риск
XEPOMAHT, я уже закомментировал и зарелизил плагин с 3 хуками, указанными выше, если включен Тифон.
Мне их вернуть?
"Вампиризм" сейчас тоже исправлю на получение стека из стека (tautology intended)


(08.11.2025 14:23)XEPOMAHT Wrote: [ -> ]В структуре тип задан как _int32_, почему его напрямую нельзя сравнивать с нулём? Т.е. написать так:

Code:
if (((_BattleStack_*)c->edi)->count_current > 0)

Особо в программировании на Си не понимаю, поэтому спрашиваю.

Потому что я предпочитаю приведение типов, которое появилось в C++. А ещё читается проще, а не *(вот*)(((*(так)**))*)).

Вот пример исправленного кода:

Code:
// © JackSlater
// Вампиризм не работает на клонов
_LHF_(LoHook_BattleStackVampirism)
{
    if ((*reinterpret_cast<H3CombatCreature **>(c->ebp + 0x8))->creature.clone)
    {
        c->return_address = 0x4412AB;
        return NO_EXEC_DEFAULT;
    }
    return EXEC_DEFAULT;
}

UPD: Сборка обновлена:
Вот ссылка на файл .dll:
game bug fixes extended.dll

Вот ссылка на файл .dbgmap:
game bug fixes extended.dbgmap
(11.11.2025 06:23)daemon_n Wrote: [ -> ]я уже закомментировал и зарелизил плагин с 3 хуками, указанными выше, если включен Тифон.
Мне их вернуть?

Да, верни их, т.к. хук 441AFF вроде б отменяет ответный удар защитника, если атакующий умер от огненного щита в своей атаке, т.е. с Тифоном конфликта там нет и правка содовского бага сработает с Тифоном. А остальные хуки и так затираются Тифоном.

Так же Тифону мешает этот код:

Code:
// Фикс Уланда - герой имеет продвинутую мудрость на старте
    o_HeroInfo[HID_ULAND].second_skill_1_lvl = 1;
    // Фикс Димера - герой имеет продвинутую разведку на старте
    o_HeroInfo[HID_DEEMER].second_skill_2_lvl = 1;

и этот:

Code:
// © JackSlater
    // фикс бага при получении хинта от Магических Святынь
    // ранее использовался массив с заклинаиями от артефактов 0x430 -> 0x3EA
    _PI->WriteWord(0x40D979 +3, 0x3EA);

и этот:

Code:
// удаляем иммунитеты к огню у призраков
    o_CreatureInfo[CID_GHOST].fireImmunity = false;

    // удаляем иммунитеты к огню у посланников
    o_CreatureInfo[CID_FIRE_MESSENGER].fireImmunity = false;
    o_CreatureInfo[CID_EARTH_MESSENGER].fireImmunity = false;
    o_CreatureInfo[CID_AIR_MESSENGER].fireImmunity = false;
    o_CreatureInfo[CID_WATER_MESSENGER].fireImmunity = false;

и этот, т.к. индексы командиров в Тифоне сменены (т.е. этот фикс сломает Полуросликов-Гренадёров, если кто-нибудь в редакторе монстров выставит им флаг двойной атаки):

Code:
// фикс WoG'a
    // командиры, имеющие флаг стрельбы и двойной атаки, в рукопашной бъют один раз. Исправим это, ибо они уникальны
    _PI->WriteLoHook(0x441BAA, Y_NPC_FixDoubleAttackOnMelle);

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

Code:
if (heroID >= 0 && heroID < 156)
(11.11.2025 12:25)XEPOMAHT Wrote: [ -> ]Так же у тебя отсутствует получение максимального количества героев в игре, т.е. данный код с Тифоном несовместим:

Code:
if (heroID >= 0 && heroID < 156)

Как именно (откуда и когда) предлагаешь получать число героев?
Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
Reference URL's