| igrik   
   Posts: 2821
 
 | 
			| 
 
				 (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: 16785
 
 | 
			| 
 
				Такой вариант подходит либо для полного переписывания кода функции, либо для действия + подмены аргументов. Много мест, где в разы менее трудозатратно только в небольшом месте сделать перехват. Тут нет единого «хорошо»/«плохо». Есть скорее плюсы и минусы. Где возможно — перехват всей функции. Где нецелесообразно — правки в отдельных местах. 
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: 1039
 
 | 
			| 
 
				baratorch, и ещё просьба, можно для ERA включить следующие твики: 
<UI.RecruitDlg.AutoSet> = 1 
<UI.Ext.AdvMgr> = 1 , 1 , 1
   
 Тот, кто просыпается рано - жаворонок, поздно - сова. А тот, кто плохо спит и ходит с черными кругами под глазами - панда!
 |  | 
	| 30.06.2021 10:13 |  | 
	
		| Berserker   
   
   Posts: 16785
 
 |  | 
	| 18.09.2021 20:32 |  | 
	
		| Berserker   
   
   Posts: 16785
 
 |  | 
	| 19.09.2021 21:31 |  |