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

Full Version: ERA PLUS
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
(26.05.2021 14:07)igrik Wrote: [ -> ]Ну вот же - работает!
Только да - без прозрачности.

Если из скрипта удалить команду !!IF:F, то да - вызывается WND-диалог и PNG читается без глюков. НО если оставить !!IF:F - уже вызывается диалог из zvslib1.dll с вышеописанными глюками. В общем удаляю !!IF:F. Благо особо он не влияет, это просто подсказки, ну и фиг с ними, надоело уже эта возьня. Буду ждать, когда добавят альфа-канал, всю графику потихоньку перегоню из gif в png.
Опа! А вот это уже баг репорт. Буду дома - проверю.
Добрый день всем!

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
(26.05.2021 17:25)Berserker Wrote: [ -> ]3) Правильный путь к файлу "..\Mods\ERA+\anim\obj%X2.gif": "anim\obj%X2.gif".

Две точки и обратная черта обязательны. Правильный путь - "..\anim\obj%X2.gif"

(26.05.2021 17:25)Berserker Wrote: [ -> ]5) Для поддержки png с полупрозрачностью в вог-диалогах нужно в WoG Native Dialogs добавить поддержку файлов с расширением *.pcx, для которых создавать элемент Pcx8 или Pcx16. Первый более распространён в ресурсах игры, так что pcx8 даже круче. Либо сделать поддержку двойных расширений: '****.pcx.pcx16' преобразовывается в '****.pcx', но создаётся pcx16 элемент формы.

Всё, все игровые pcx будут поддерживаться, а любой pcx можно заменить на png на лету, поместив его в Data\Pcx\[***\***\***\]имя.png

Попробовал. Работает. Альфа-канал есть, но... почему размер такой маленький??? Отчего размер нельзя брать из заголовка png??? Откуда ERA вообще его берёт??? Что за свинство какое-то с этими диалогами... какое-то всё недотестированное-недоделанное... 141

Image: 5d5aa7355df6.png
XEPOMAHT, у меня это окно маленькое, у тебя оно почему-то совсем гигантское... поэтому наверн и кажется маленьким 148
(26.05.2021 18:25)Panda Wrote: [ -> ]у меня это окно маленькое, у тебя оно почему-то совсем гигантское... поэтому наверн и кажется маленьким 148

Неа, ERA берёт размеры с default.pcx наверное, т.е. того, что показывают при ненайденности pcx. Короче всё как обычно, спасибо что не вылетает. 148 Попробую его заменить, может поможет. 148
XEPOMAHT, Эра не масштабирует png при отрисовке вообще. То есть DrawPcx16 => получаем имя pcx, находим соответствующий png, отрисоываем его часть без масштабирования.
Второе — функции загрузки pcx8/pcx16 перехватываются, создаются болванки с теми же размерами, что и png.
Третье — WND не должен быть поддерживать *.pcx картинки вообще. Покажи весь код с путями.
(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 как ни крути. 148
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 была с корректными размерами. То есть всё будет работать «из коробки».
Обновление Тифона из ERA+. Добавлено исправление воговского косяка, выводящего диалог-подсказку к объектам карты по ПКМ: теперь координаты диалога не тупо по центру экрана, а зависят от координат клика мыши, как в оригинальном SoD-е, код которого по существу и затирался WoG-ом - теперь он восстановлен. Ну и сама функция по оставлению монстров и артефактов на карте тоже срабатывает как положено.
Так это был баг вога, а я думал фича. Поделись микропатчем, тоже применю. А то подсказку для смешанных нейтралов вручную позиционировал.
(27.05.2021 17:02)Berserker Wrote: [ -> ]Поделись микропатчем, тоже применю.

Там просто 2 хука - первый сохраняет координаты, второй применяет их в воговском коде:

Code:
Hook 415AD2h, WoG_PlaceCreature,        TJump; замена концовки функции SoD_HintMessage
Hook 7575A3h, Fix_PlaceCreature,        TJump; исправить функцию WoG_PlaceCreature

Code:
proc WoG_PlaceCreature
    mov [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
Понял, спасибо.
Обновление Тифона из ERA+. Добавлен новый ERM-триггер 30378, срабатывающий по ПКМ конкретно по игровой карте. Адрес на структуру кликнутой клетки карты записывается в v997, после выполнения триггера, содержимое v997 удаляется.
По мини-карте?
Reference URL's