igrik
Posts: 2819
|
(01.06.2021 17:12)XEPOMAHT Wrote: Бараторч очень, ну очень любит перехватывать функции целиком, да и Берсеркер сейчас тоже так делает в ERA, из-за чего так же приходится шевелить мозгами, чтобы перехватить нужный код, очень часто какими-то дикими костылями
Потому что такой способ установки хука (а точнее это HiHook типа SPLICE в patcher_x86) наиболее безопасный и безконфликтный способ установки хуков, а также ну очень удобный.
Приведу цитату Бараторча:
Бараторч Wrote:Используя высокоуровневый хук, мы заставляем игру вызывать вместо ее функции - нашу. Наша функция при этом имеет (должна иметь) тот же интерфейс что и оригинальная, т.е. тот же возвращаемый тип и те же аргументы.
Здесь мы совершенно не запариваемся ни о каких низкоуровневых вещах - содержимом регистров и состоянием стэка, и т.п. Нам совершенно не нужно знать ассемблерный контекст вызова. Поэтому я назвал этот тип Хука - высокоуровневым
Но я в HD использую в основном именно ХайХуки - ибо с ними код гораздо более читаемый, удобный для правок, безопасный и минимально конфликтен с другими модификациями.
© тема patcher_x86
Именно поэтому Бараторч и ставит такие хуки на целые функции.
Берсеркер сейчас так же делает. Я в подавляющем большинстве случаев так делаю в своих плагинах.
game bug fixes extended.dll || My Plugins || My GitHub
|
|
01.06.2021 18:52 |
|
Berserker
Posts: 16671
|
Такой вариант подходит либо для полного переписывания кода функции, либо для действия + подмены аргументов. Много мест, где в разы менее трудозатратно только в небольшом месте сделать перехват. Тут нет единого «хорошо»/«плохо». Есть скорее плюсы и минусы. Где возможно — перехват всей функции. Где нецелесообразно — правки в отдельных местах.
Code:
(* Replace Heroes 3 PRNG with thread-safe Mersenne Twister, except of multiplayer battles *)
ApiJack.StdSplice(Ptr($50C7B0), @Hook_SRand, ApiJack.CONV_THISCALL, 1);
ApiJack.StdSplice(Ptr($50C7C0), @Hook_Rand, ApiJack.CONV_FASTCALL, 2);
(* Allow to handle dialog outer clicks and provide full mouse info for event *)
ApiJack.HookCode(Ptr($7295F1), @Hook_ErmDlgFunctionActionSwitch);
(* Add up to 10 animated DEFs support in DL-dialogs by restoring commented ZVS code *)
ApiJack.HookCode(Ptr($72A1F6), @Hook_DL_D_ItemCreation);
ApiJack.HookCode(Ptr($729513), @Hook_ErmDlgFunction_HandleAnimatedDef);
(* Move acredits.smk video positon to json config *)
ApiJack.HookCode(Ptr($706609), @Hook_ShowMainMenuVideo);
Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
|
|
01.06.2021 19:47 |
|
baratorch
Posts: 197
|
(08.05.2021 07:14)Berserker Wrote: РЕализовал в Эре поддержку png вместо def/pcx через перехват функций отрисовки. Работает отлично во всех режимах HD и без. Но есть проблема с опцией «Системные курсоры» и def-ом артефактов.
Как только курсор меняется на артефактный, появляется сизый прямоугольник. PNG выводится с полупрозрачностью, сизого цвета там нет. Не ясен механизм этой опции в HD-моде.
Если опция отключена, но есть полупрозрачные пиксели, то виден муар из сизого.
В хоте используются 32-битные с полупрозрачностью спрайты, в системных курсорах ХДмода есть специальная обработка таких спрайтов. Как там курсоры рисуются в оригинале я не помню.
В Хоте и в ХД используются 32 ARGB спрайты таким образом:
структуры _Def_, _DefGroup_, _DefFrame_ таких спрайтов не отличаются от оригинальных.
Но у _DefFrame_ пиксельный буфер должен обрабатываться по-другому. У такой структуры поле type имеет другое значение и в хуках на функции отрисовки _DefFrame_ стоит проверка на значение type. И если оно отличается от оригинального, то мы выполняем наш код.
В коде системных курсоров также стоит проверка на type кадра и выполняется свой код отрисовки в курсор.
|
|
26.06.2021 07:43 |
|
Panda
Posts: 1005
|
baratorch, и ещё просьба, можно для ERA включить следующие твики:
<UI.RecruitDlg.AutoSet> = 1
<UI.Ext.AdvMgr> = 1 , 1 , 1
Тот, кто просыпается рано - жаворонок, поздно - сова. А тот, кто плохо спит и ходит с черными кругами под глазами - панда!
|
|
30.06.2021 10:13 |
|
Berserker
Posts: 16671
|
|
18.09.2021 20:32 |
|
Berserker
Posts: 16671
|
|
19.09.2021 21:31 |
|