| igrik   
   Posts: 2821
 
 |  | 
	| 26.05.2021 14:45 |  | 
	
		| Berserker   
   
   Posts: 16784
 
 | 
			| 
 
				Добрый день всем!
 1) LoadImageAsPcx16 загружает изображения в формате pcx16. Pcx16 — формат без поддержки полупрозрачности. Поэтому фон у png белый по умолчанию.
 
 2) В Windows какнонические пути с обратными косыми чертами. "D:\Heroes 3\Mods". Для API верхнего уровня поддерживаются и прямые косые черты с целью совместимости с Unix-программами. D:/Heroes 3/Mods. Такие пути на лету преобразовываются в канонические низкоуровневыми библиотеками системы (и VFS Эры в том числе). Я использую прямые косые черты в документации, поскольку «\» — символ экранирования во многих языках программирования и на heroescommunity.com.
 
 3) Правильный путь к файлу "..\Mods\ERA+\anim\obj%X2.gif": "anim\obj%X2.gif".
 Никогда не нужно указывать папку Mods и имя мода. Так мы нарушаем работу системы модов, обращаясь к конкретному моду. Нужно обращаться к файлам так, как будто бы папки Mods не существует вообще.
 
 4) Не исключаю багов в IF-подкомандах.
 
 5) Для поддержки png с полупрозрачностью в вог-диалогах нужно в WoG Native Dialogs добавить поддержку файлов с расширением *.pcx, для которых создавать элемент Pcx8 или Pcx16. Первый более распространён в ресурсах игры, так что pcx8 даже круче. Либо сделать поддержку двойных расширений: '****.pcx.pcx16' преобразовывается в '****.pcx', но создаётся pcx16 элемент формы.
 
 Всё, все игровые pcx будут поддерживаться, а любой pcx можно заменить на png на лету, поместив его в Data\Pcx\[***\***\***\]имя.png
 
 Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
 Поддержать проект
 
 |  | 
	| 26.05.2021 17:25 |  | 
	
		| XEPOMAHT   
   
   Posts: 2481
 
 | 
			| 
 
				 (26.05.2021 19:02)Berserker Wrote:  Эра не масштабирует png при отрисовке вообще. То есть DrawPcx16 => получаем имя pcx, находим соответствующий png, отрисоываем его часть без масштабирования. 
wog native dialogs.era масштабирует. Если размер выше 100х100, то картинка уменьшается до 100х100. Но тут я сам отмасштабировал, ибо на 32х32 не будет видно ничего.
  (26.05.2021 19:02)Berserker Wrote:  Второе — функции загрузки pcx8/pcx16 перехватываются, создаются болванки с теми же размерами, что и png. 
В случае с WND заменяющий png почему-то обрезается. Т.е. размеры изображения всё равно пушатся на функцию подготовки диалога ДО замены pcx и png, поэтому в памяти оно может и полноразмерно, но отображается всё равно в обрезанном виде, т.е. по XY из pcx, а не png.
  (26.05.2021 19:02)Berserker Wrote:  Третье — WND не должен быть поддерживать *.pcx картинки вообще. Покажи весь код с путями. 
Ну он же ставит дефолтный pcx при отсутствии pcx, при чём по имени из скрипта, ну а pcx потом по тому же имени и подменяется на png. Значит поддержка там всё-таки есть. Но да, по путям из скрипта pcx никогда не будет найден, там в 100% будет дефолтный pcx как ни крути.    |  | 
	| 26.05.2021 19:16 |  | 
	
		| Berserker   
   
   Posts: 16784
 
 | 
			| 
 
				XEPOMAHT, WND не содержит функций для работы с изображениями вообще. Сейчас pcx расширение ещё не поддерживается WND. игрик попробует его добавить. Что произошло (предположительно):
 1) WND вызывает Эровскую функцию LoadImageAsPcx16. Эра пробует найти картинку, не находит. Ранее выводилась ошибка, но Дима попросил убрать вывод ошибок. Era создаёт изображение по умолчанию 32x32 и возвращает pcx16 ресурс.
 2) WND смотрит размеры pcx16 ресурса. Это 32х32. Создаёт элемент Pcx16DlgItem для диалога с именем ресурса.
 3) При отображении диалога вызывается функция Pcx16DlgItem.Draw, а там DrawPcx16ToBuf, а там перехват Эры срабатывает. Эра находит png-файл и отрисовывает его вместо pcx. Вот при этой отрисовке вообще не поддерживается масштабирование. Должны отрисоваться пиксели из прямоугольной области [0; 0; 32; 32].
 
 Что будет?
 igrik добавит поддержку расширений *.pcx, *.pcx16, для которых не будет вызывать LoadImageAsPcx16, а будет вызывать LoadPcx8 или LoadPcx16 соответственно, после чего создавать Pcx8DlgItem или Pcx16DlgItem. Так заработает показ любых игровых pcx. А дальше в дело вступает Эра. Она перехватывает LoadPcx8/LoadPcx16 и, если для pcx есть png файл, создаёт болванку с размерами png, чтобы позже отрисовка png была с корректными размерами. То есть всё будет работать «из коробки».
 
 Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
 Поддержать проект
 
 |  | 
	| 26.05.2021 19:47 |  | 
	
		| Berserker   
   
   Posts: 16784
 
 |  | 
	| 27.05.2021 17:02 |  | 
	
		| XEPOMAHT   
   
   Posts: 2481
 
 | 
			| 
 
				 (27.05.2021 17:02)Berserker Wrote:  Поделись микропатчем, тоже применю. 
Там просто 2 хука - первый сохраняет координаты, второй применяет их в воговском коде:
 
Code:
 Hook 415AD2h, WoG_PlaceCreature,        TJump; замена концовки функции SoD_HintMessageHook 7575A3h, Fix_PlaceCreature,        TJump; исправить функцию WoG_PlaceCreature
 
Code:
 proc WoG_PlaceCreaturemov [HintWindowX], eax ; сохранить
 mov [HintWindowY], ecx ; координаты
 pushad
 mov eax, 7570D9h
 mov ecx, 697428h
 call eax
 popad
 push 415AF3h
 ret
 endp
 
 proc Fix_PlaceCreature
 push 0
 push -1
 push 0
 push -1
 push 0
 push -1
 push 0
 push -1
 push [HintWindowY]
 push [HintWindowX]
 mov eax, 4F6C00h
 mov edx, 4
 mov ecx, [ebp-38h]
 call eax
 push 7575B3h
 ret
 endp
 
				
(This post was last modified: 27.05.2021 17:13 by XEPOMAHT.)
 |  | 
	| 27.05.2021 17:12 |  | 
	
		| Berserker   
   
   Posts: 16784
 
 |  | 
	| 27.05.2021 17:16 |  |