Wake of Gods Forum | Форум Во Имя Богов
HD-mod. Баги и доработки - Printable Version

+- Wake of Gods Forum | Форум Во Имя Богов (http://wforum.heroes35.net)
+-- Forum: Герои Меча и Магии 3.5 WoG/ERA (/forumdisplay.php?fid=99)
+--- Forum: Моды (/forumdisplay.php?fid=104)
+---- Forum: HD-форум (/forumdisplay.php?fid=190)
+---- Thread: HD-mod. Баги и доработки (/showthread.php?tid=5912)


HD-mod. Баги и доработки - Berserker - 22.11.2020 06:32

Давайте писать здесь, что в первую очередь хотелось бы исправить в HD моде.

Мой список:
-) Отключить долбанную телеметрию, когда без пункта «проверять обновления» процесс постоянно стучится в интернет.

-) Сделать какой-нибудь механизм уведомления при загрузке из боя. Например, генерация события Эры. Сейчас из-за этого страдают OnGameEnter/OnGameLeave.

-) У меня игра после возвращения из фона и щелчка по любой кнопке или нажатии F12 подвисает от 5 секунд до 30 и более. Процесс виснет на WaitForSingleObject. Если подтвердится, что такое поведение только на новых версиях HD-мода, то стоит обратить внимание. Снятие твиков на звуки не помогло.


RE: HD мод - daemon_n - 22.11.2020 06:47

-) нет ERM-поддержки ПКМ кликов на новых кнопках интерфейса на экране Карты приключений
-) не отключается SmoothMovement через <OpenGL.SmoothMovement> = 0 в режиме OpenGL от Verokster
-) 100% краш при нажатии ПКМ на стрелочке "перелистывания артефактов" на экране жертвенного алтаря (Click to View)



+) на днях я переименовал HD_SOD.dll в HD_WOG.dll - почти всё работало как надо. Я прошу добавить эти же функции в оригинальный HD_WOG.dll, поскольку они точно работают без нареканий:
  • Быстрая Экипировка артефактов на экране героя
  • Открытие "зоны Двери измерений" на клавишу "R"
  • Открытие меню настроек в главном меню нажатием на "колёсико"
  • Возможность собирать и разбирать артефакты прямо в рюкзаке
  • Настройка шахматного таймера и отображение классического (В чистой ЭРЕ он работает, но не отображается)
  • Отображение текщего количества и остатка очков передвижения героя при наведении на его портрет рядом с его именем.
  • Online lobby! Работает PvE!!! - я проверил) (безусловно надо отключить некоторые моды и скрипты, но сам факт возможности играть вдвоём без всяких хамачи!!!)
       Во время PVP битвы вылезает sz = 24193! (type = 1005), но это всё потому что dll от СоД, я так понимаю, либо с чем ещё проблема.



RE: HD мод - Grossmaster - 22.11.2020 09:57

Хотелось бы, чтобы исправили отсутствие онлайн лобби для версии wog/Era 148


RE: HD мод - daemon_n - 22.11.2020 10:15

Grossmaster, я уже написал, что лобби можно сделать, точнее, оно уже сделано, и относительно работает для Эры. На базе Сод, что:
а) имеет недостатаки в качестве работы
б) имеет недостатки в качестве обслуживания
в) платное (хотя нам ОХ не нужны: не сработают, потому 190 р/мес на одного хоста (второй игрок присоединиться может без оплаты) не так и жалко)

(22.11.2020 06:32)Berserker Wrote:  -) У меня игра после возвращения из фона и щелчка по любой кнопке или нажатии F12 подвисает от 5 секунд до 30 и более. Процесс виснет на WaitForSingleObject. Если подтвердится, что такое поведение только на новых версиях HD-мода, то стоит обратить внимание. Снятие твиков на звуки не помогло.

Не встречал. А какой список модов и версия hd? Могу порекомендовать удалить настройки ЭРЫ (файл era.ini) из \HoMM 3 ERA\_HD3_Data\Settings и запустить hd launcher ещё раз, затем уже игру.


RE: HD мод - baratorch - 22.11.2020 12:08

(22.11.2020 06:32)Berserker Wrote:  Давайте писать здесь, что в первую очередь хотелось бы исправить в HD моде.

Мой список:
-) Отключить долбанную телеметрию, когда без пункта «проверять обновления» процесс постоянно стучится в интернет.
Это не телеметрия (пока Spiteful ). ХД просто проверяет наличие более новой версии. И использует полученную инфу при краше. Если версия актуальная - предлагает отправить крашлог, если нет - предлагает обновиться.
Очень полезно. Однако слишком поздно я это сделал, меня продолжают заваливать крашлогами от очень неактуальных версий ХД.

Но если очень прям мешает, могу сделать твик на отключение этого.

(22.11.2020 06:32)Berserker Wrote:  -) Сделать какой-нибудь механизм уведомления при загрузке из боя. Например, генерация события Эры. Сейчас из-за этого страдают OnGameEnter/OnGameLeave.
Без проблем. Где, кого и как мне уведомлять? Какой приблизиительный код мне нужно выполнять?

(22.11.2020 06:32)Berserker Wrote:  -) У меня игра после возвращения из фона и щелчка по любой кнопке или нажатии F12 подвисает от 5 секунд до 30 и более. Процесс виснет на WaitForSingleObject. Если подтвердится, что такое поведение только на новых версиях HD-мода, то стоит обратить внимание. Снятие твиков на звуки не помогло.
что-то странное, не припомню чтобы кто-то жаловался на это.
какая ОС? какой графический режим в ХД?
можно же выяснить где эта WaitForSingleObject? место вызова будет полезнее для понимания проблемы.

P.S. прости Берс, что не ответил на твое письмо. Очень занят на тот момент был, а потом забыл про него.


RE: HD мод - baratorch - 22.11.2020 12:24

(22.11.2020 06:47)daemon_n Wrote:  -) нет ERM-поддержки ПКМ кликов на новых кнопках интерфейса на экране Карты приключений
Не представляю что нужно сделать, чтобы она появилась.
(22.11.2020 06:47)daemon_n Wrote:  +) на днях я переименовал HD_SOD.dll в HD_WOG.dll - почти всё работало как надо. Я прошу добавить эти же функции в оригинальный HD_WOG.dll, поскольку они точно работают без нареканий:
  • Быстрая Экипировка артефактов на экране героя
  • Открытие "зоны Двери измерений" на клавишу "R"
  • Открытие меню настроек в главном меню нажатием на "колёсико"
  • Возможность собирать и разбирать артефакты прямо в рюкзаке
  • Настройка шахматного таймера и отображение классического (В чистой ЭРЕ он работает, но не отображается)
  • Отображение текщего количества и остатка очков передвижения героя при наведении на его портрет рядом с его именем.
  • Online lobby! Работает PvE!!! - я проверил) (безусловно надо отключить некоторые моды и скрипты, но сам факт возможности играть вдвоём без всяких хамачи!!!)
       Во время PVP битвы вылезает sz = 24193! (type = 1005), но это всё потому что dll от СоД, я так понимаю, либо с чем ещё проблема.

Онлайн лобби для Эры я давно планирую сделать. Модели монетизации как в сод не будет. Скорее всего я либо повешу отдельный донат-гол как в Хоте. Либо сделаю гол + модель: "плати сколько хочешь" (от нуля и больше)

Не уверен, что Одновременный ход получится/захочется сделать для Эры. Но если когда-нибудь он будет сделан, то будет платным (не по моей воле).

P.S. daemon_n, донатить мне на развитие ХД под Эру через сод-лобби не надо, пожалуйста.


RE: HD мод - daemon_n - 22.11.2020 12:32

baratorch, понял всё и принял) Спасибо большое за ответ!
Что касается ПКМ - я сам не знаю, так понимаю, требуется вызвать окно текста на ПКМ, которого нет (Click to View)
) - Просто наблюдение, что нет возможности перехватить некоторые клики.
Например, клик на окошки существ для найма имеет высший приоритет. Если подумать, hd mod перехватывает нужные ему клики на себя полностью. Ну, к сожалению, я не программист.

В общем, если наёду ещё что-нибудь, отпишу. Ещй раз ОГРОМНОЕ СПАСИБО!!!

(22.11.2020 12:24)baratorch Wrote:  P.S. daemon_n, донатить мне на развитие ХД под Эру через сод-лобби не надо, пожалуйста.

Принял144


RE: HD мод - Raistlin - 22.11.2020 13:35

-) Сделать опциональным использование twcrport.def, то есть чтобы можно было переключаться на большие иконки из pcx (в старых версиях HotA как раз использовались отдельные иконки, а потому код наверняка сохранился. По крайней мере я на это надеюсьAb). Это на самом деле очень важно, так как если существ становится штук 220, то на всех кадрах получается каша.


RE: HD мод - Berserker - 22.11.2020 16:29

Бара, привет, рад тебя видеть!
Отвечу чуть позже по пунктам всем. Главное, чтобы был хотя бы один резервный канал связи. Остальное всё решаемо 177


RE: HD мод - igrik - 22.11.2020 18:27

(22.11.2020 12:24)baratorch Wrote:  
(22.11.2020 06:47)daemon_n Wrote:  -) нет ERM-поддержки ПКМ кликов на новых кнопках интерфейса на экране Карты приключений
Не представляю что нужно сделать, чтобы она появилась.
Нужно просто всегда выполнять код этой функции 0x402E70.
После реализации кнопок HD мода в ряде случаев ты не даёшь ей выполниться. А Вог использует её вызов как аля HiHook с перехватом типа CALL:
Code:
// клики мауса на карте
// 0x74EEA6 char __stdcall MouseClick(_EventMsg_* msg)
  {0x408955,0,DP(MouseClick)},



RE: HD мод - Berserker - 22.11.2020 18:34

Quote:Мне нужно было события входа/выхода в основной цикл игры. Модеры в нём ставят/снимают патчи на лету.

(* MainGameCycle: OnEnterGame, OnLeaveGame and MapFolder settings*)
Core.p.WriteHiHook(Ptr($4B0BA0), PatchApi.SPLICE, PatchApi.EXTENDED, PatchApi.THISCALL_, @Hook_MainGameLoop);

Там корректный сплайсинг твоей функцией. Веду подсчёт числа входов и выходов. Когда счётчик на 0 — точно выход из последнего диалога в основное меню.
Но вот беда, в ХД-моде есть возможность загрузки игры во время боя. И каким-то образом там идёт манипуляция регистрами что-ли, но мод обработчик не получает управления, счётчик сбивается.
В качестве решения мне бы подошёл вызов события

procedure FireEvent (EventName: pchar; {n} EventData: pointer; DataSize: integer); stdcall;
из era.dll

FireEvent('$OnGameLeave', nil, 0);

Буквально GetProcAddress(LoadLibrary(...), ...) + вызов.

Quote:Один хороший модер очень просит возможность получить функцию загрузки сохранённой игры прямо с карты приключений без сторонних диалогов. Возможно ли?
Это просто теоретический вопрос. Если можно сразу же загрузить игру без промежуточных диалогов, то такая функция была бы востребована весьма. Именно программно.

Quote:»» Нет, цветной текст никогда не работал в 32-bit TRUE режимах в ХД. Для этого нужно переписывать код цветного текста под 32 бита. Я считаю, это лучше сделать со стороны Эры, с помощью моих консультаций.
Поддержку цветного текста для режимов 32 бита делал RoseKavalier, но там он динамически патчит код HD. Хотелось бы более цивилизованно.

Сейчас Эра перехватывает следующие адреса:
Core.Hook(@Hook_HandleTags, Core.HOOKTYPE_BRIDGE, 7, Ptr($4B509B));
Core.Hook(@Hook_GetCharColor, Core.HOOKTYPE_BRIDGE, 8, Ptr($4B4F74));
Core.Hook(@Hook_BeginParseText, Core.HOOKTYPE_BRIDGE, 6, Ptr($4B5255));

В BeginParseText весь текст парсится на блоки (пробельные символы игнорируются). Запоминаются размеры блоков и цвета. Сами цвета вырезаются, остаются только фигурные скобки.
В Hook_GetCharColor возвращает цвет из текущего блока и текущей позиции.
В Hook_HandleTags увеличивается позиция для непробельных символов, смена блока при необходимости и обработка "{", "}"


RE: HD мод - igrik - 22.11.2020 18:42

(22.11.2020 12:08)baratorch Wrote:  
(22.11.2020 06:32)Berserker Wrote:  -) У меня игра после возвращения из фона и щелчка по любой кнопке или нажатии F12 подвисает от 5 секунд до 30 и более. Процесс виснет на WaitForSingleObject. Если подтвердится, что такое поведение только на новых версиях HD-мода, то стоит обратить внимание. Снятие твиков на звуки не помогло.
что-то странное, не припомню чтобы кто-то жаловался на это.
какая ОС? какой графический режим в ХД?
можно же выяснить где эта WaitForSingleObject? место вызова будет полезнее для понимания проблемы.
Берс, ты сейчас не говоришь о том, когда используются фильтры 16- 32-bit OpenGL by Verok? Если да, то данные подвисания очень хорошо можно "увидеть" при использовании Olly, например в момент ввода адреса при прыжке (клавиша G, потом вставка скопированного адреса). Но данная проблема была всегда в OpenGL by Verok, т.е. даже без использования HD мода (на плагине ddraw.dll), во всяком случае на моей Win7 x64).


RE: HD мод - Berserker - 22.11.2020 19:08

В основном 16 bit Direct Draw + GDI. Но пробовал и 32 bit Direct Draw. Всё в оконном режиме (!) и без strethable. Когда установлю старую версию, скажу, не моя ли это проблема в системе. Я сворачиваю окно, правлю ЕРМ файлы, возвращась через секунд 10 к окну. При нажатии на кнопку опций могут по 15 секунд зависание ловить. То же самое с F12. Если кто столкнётся — отпишитесь.

Кстати, крайне желательно сохранять архив версий HD мода, как в Эре. Очень часто нужно что-то потестировать или поиграть на стабильном варианте, а есть только последний.

У меня VFS.dll при изменении файлов в папкам мода обновляет VFS, временно блокируя файловую систему. Буквально на микродолю секунды. Если файлы не меняются — всё ок. Но стоит раза три сохранить документ, развернуть игру, нажать на кнопку — фриз. Странно, что началась проблема несколько недель назад, а VFS в Эре с версии 2.8 переписана. Такое чувство, что кто-то в неудачный момент WaitForSingleObject вызывает или тоже отслеживает изменения в файлах.


RE: HD мод - Berserker - 23.11.2020 00:45

Quote:-) Сделать опциональным использование twcrport.def, то есть чтобы можно было переключаться на большие иконки из pcx (в старых версиях HotA как раз использовались отдельные иконки, а потому код наверняка сохранился. По крайней мере я на это надеюсьAb). Это на самом деле очень важно, так как если существ становится штук 220, то на всех кадрах получается каша.
Не стоит возлагать на HD эту задачу. Её решать будет Эра/плагины универсально для всех дефов.


RE: HD мод - Raistlin - 23.11.2020 03:00

(17.08.2020 18:08)XEPOMAHT Wrote:  
(17.08.2020 16:53)Dalion Wrote:  в теме Эры + ты писал о возможности вывода портретов из pcx, чтобы палитра для каждого портрета была своя, а не общая для всех. Можно это как-то прикрутить к тифону? Сейчас кастомные портреты которые я делаю для добавляемых существ ломают цвета всем стандартным, хотя они в той же битности...

Можно, но это ~50 мест в коде, которые нужно пропатчить. И то, будет не полностью (в диалогах Жертвенного Алтаря и Трансформатора Скелетов от def-ов так просто не избавиться, увы). К Тифону можно, только опять HD-мод будет вылетать (т.к. он меняет координаты элементов диалога).

Berserker, XEPOMAHT, я вот из этого сообщения сделал такой вывод... Если я что-то неправильно понял, то беру просьбу назад.


RE: HD мод - Berserker - 23.11.2020 03:33

Raistlin, если для одного случая менять, то да. Нужен общий механизм для замены кадров дефов.

Бара, есть у тебя список всех функций для отрисовки def и pcx? Я бы сплайсил, подменяя для большинства def-ов вызов отрисовки кадра на вызов отрисовки pcx16/24


RE: HD мод - Raistlin - 23.11.2020 03:36

Berserker, спасибо, я понял.


RE: HD мод - XEPOMAHT - 23.11.2020 11:12

(23.11.2020 03:00)Raistlin Wrote:  я вот из этого сообщения сделал такой вывод...

Да и я о том же, что реализация чистого вывода из pcx с HD-модом дружить не будет, т.к. в MoP сделана замена кода инициализации элемента диалога, соответственно, HD-мод будет ожидать там def, а на самом деле там будет pcx, что приведёт к вылету. Поэтому для ERA прокатит только старый хотовский метод, в котором def собирается из pcx-ов (от чего они благополучно избавились в новых версиях HoA), т.е. по сути от def-а никуда не деться в рамках ограничений платформы ERA+HDmod.

Естественно, что код на 32-битные def тоже вряд ли стоит ждать для ERA ("расборщик" этого формата давно написан, "сборщик" написать можно без проблем, не хватает только самой поддержки в ERA).

Ну или вот ещё вариант - довести до ума плагин alpha.dll, в котором уже, хоть и криво, но работает замена кадров для def.


RE: HD мод - Raistlin - 23.11.2020 20:02

XEPOMAHT, а Вам удалось решить эту проблему в ERA+? Насколько я помню, у Вас там используются отдельные кадры.


RE: HD мод - feanor - 23.11.2020 21:10

Господи. Какие пятьдесят хуков, один на общую функцию отрисовки кадров оО
Но давайте с этим в проекты, это к HD реально отношения не имеет?


RE: HD мод - Berserker - 23.11.2020 22:16

feanor, даже в альфе первой версии пяток перехватов отрисовки кадров. Где там одна функция?


RE: HD мод - feanor - 23.11.2020 22:45

Ну конкретно для twcport точно одна, одна из семейства DefDraw_*, потому что он всегда рисуется одной и той же функцией. Там можно поставить сплайс, проверять на имя дефа и кадр, и сразу вызывать отрисовку pcx. С чем бы другим было сложнее, а у twcport даже прозрачности не бывает.

Альфа вообще хуки ставит, кмк, чуть ниже, чем надо - на отрисовку структуры DefCadre вместо практически повсеместно используемых оберток DefDraw, которые в качестве параметров принимают _Def_*, номер группы и номер кадра. Надо по дереву вызовов, конечно, посмотреть, а то забыл уже - но, по-моему, они действительно покрывают все использования.
Из-за этого, например, возникло такое сомнительное решение, как использование внутренних имен кадра вместо какого-нибудь деф_группа_кадр.png


RE: HD мод - XEPOMAHT - 23.11.2020 22:54

(23.11.2020 20:02)Raistlin Wrote:  удалось решить эту проблему в ERA+? Насколько я помню, у Вас там используются отдельные кадры.

В ERA+ стандартный def на всех монстров. Т.к. монстров добавлено немного: фракция Причала + пяток нейтралов + удалена половина воговских монстров, поэтому качество портретов примерно соответствует воговскому. На ERA+ эта проблема не существенна.

(23.11.2020 21:10)feanor Wrote:  Какие пятьдесят хуков, один на общую функцию отрисовки кадров

Перед тем как отрисовывать, надо pcx ещё создать как pcx и привязать к id диалога. Для портретов монстров это ~50 бинарных патчей, хуки там не нужны (т.к. код получится меньше оригинального, для def-ов используется больше данных). И функция отрисовки при этом не изменяется (игра просто рисует pcx вместо def).


RE: HD мод - Berserker - 23.11.2020 23:29

feanor, полностью согласен, что решение должно опираться на индекс кадра, а не имя картинки внутри def.


RE: HD мод - feanor - 24.11.2020 00:06

Quote:Перед тем как отрисовывать, надо pcx ещё создать как pcx и привязать к id диалога.
Не нужно привязывать.
Когда мы хукаем отрисовку кадра дефа, нам уже абсолютно пофигу на диалоги - у нас есть скринбуфер и есть что-то, что в него надо нарисовать. Как в альфе, да.

pcx'ы, если говорить о конкретном случае, можно вообще создать заранее, 999 восьмибитных 56*64 (или сколько там кадр) много памяти не сожрут. Если не о конкретном, а вообще, то либо на loaddef ставить, либо в отрисовке же - ленивая инициализация в словарь


RE: HD мод - XEPOMAHT - 24.11.2020 00:20

(24.11.2020 00:06)feanor Wrote:  у нас есть скринбуфер и есть что-то, что в него надо нарисовать. Как в альфе, да.

Верно, так проще, но работать будет медленно, если каждый def проверять на имя спрайта (т.к. проверка будет на все дефы в игре). И совместимость с фильтрами HD-мода будет под вопросом (та же история, что с плагином альфа.длл, в котором графика может не отрисовываться, например у меня она не отрисовывалась ни в какую).


RE: HD мод - daemon_n - 24.11.2020 02:50

Berserker, попросил добавить в HD mod нативной фунцией, чтобы игроки могли настроить у себя в твиках hd mod.


RE: HD мод - baratorch - 24.11.2020 14:25

(23.11.2020 23:29)Berserker Wrote:  feanor, полностью согласен, что решение должно опираться на индекс кадра, а не имя картинки внутри def.

В хота с 32 битными def и def из 8-битных pcx-ов , в хд-моде с def из 16(32)-битных pcx-ов (иконки свитков-артефактов в слотах, иконки существ в очереди битвы, которые создаются программно из имеющейся в оригинальной игре графики)
используется создание своего кастомного def, с нужным форматом кадра
и хук на отрисовку кадра, в котором проверяем поле type, которое есть у всех ресурсов, и, в зависимости от значения type используем нужную функцию отрисовки.

Вот 1 функция создания дефа иконок для очереди существ и 1 хук:
Code:
        // Виртуальные методы PcxSprite: никогда не уничтожаем и не уменьшаем ref_count.
        __HOOK_FUNC void __fastcall PcxSprite_Destroy(_Def_* this_, _dword_ no_used, _bool8_ delete_) {}
        __HOOK_FUNC void __fastcall PcxSprite_DerefOrDestruct(_Def_* this_, _dword_ no_used) {}
        // Виртуальная таблица PcxSprite.
        _ptr_ PcxSprite_v_table[3] = { (_ptr_)PcxSprite_Destroy, (_ptr_)PcxSprite_DerefOrDestruct, 0x47B670/*_Def_::get_mem_usage*/ };

        void CreateBqCreaturesDef()
        {
            auto s = _Def_::Load("TwCrPort.def");

            _Def_* d = (_Def_*)o_New(sizeof(_Def_));
            MemZero(d, sizeof(_Def_));

            // Выгрузка-уничтожение не предполагается.
            d->v_table = PcxSprite_v_table;

            // Тип def`а - интерфейс.
            d->type = 0x47; // Interface def

            strcpy(d->name, "def.BqCrPort"); //-V512

            // Создаём 1 группу.
            d->groups_count = 1;
            d->groups = (_DefGroup_**)o_New(4 * d->groups_count);
            d->active_groups = (_ptr_)o_New(4 * d->groups_count);
            // _Def_::AllocGroup(this, group_index, frames_num)
            CALL_3(void, __thiscall, 0x47B410, d, 0, s->groups[0]->frames_count);

            _Pcx16_* ps = _Pcx16_::CreateNew("", s->width, s->height);

            // Добавляем pcx`ы вместо кадра.
            for (int i = 0; i < s->groups[0]->frames_count; i++)
            {
                s->DrawInterfaceToPcx16(0, i, ps, 0, 0);
                _Pcx16_* pd = _Pcx16_::CreateNew("", 37, 39);
                pd->DrawPcx16ResizedBicubic(ps, ps->width, ps->height, 0, 0, 37, 39);
                pd->Sharpen(0.14);

                // _Def_::AddFrame(this, group_index, frame)
                pd->type = 0x12;
                CALL_3(void, __thiscall, 0x47B480, d, 0, pd);
            }

            _Pcx16_::Delete(ps);
            s->DerefOrDestruct();

            d->width = 37;
            d->height = 39;

            def_BqCrPort = hdv(_Def_*, "HD.def.BqCrPort") = d;
            o_BinTreeHead.AddItem(def_BqCrPort, def_BqCrPort->name);
            def_BqCrPort->ref_count = 1;
        }

Code:
        // Делаем возможной отрисовку кадра def`а - pcx.
        __HOOK_FUNC void __stdcall N_DefFrame_DrawUI(HiHook* h, _DefFrame_* this_, int sx, int sy, int sw, int sh, _ptr_ dst, int dx, int dy, int dw, int dh, int dpitch, _Palette16_* p16, _bool8_ hflip, _bool8_ tblit)
        {
            // Тип ресурса - _Pcx16_.
            if (this_->type == 0x12 /*_Pcx16_ type*/)
            {
                //D_OFF(g, "DefFrame type == 0x12 from 0x%.8X", h->GetReturnAddress() - 5);
                // Рисуем _Pcx16_.
                CALL_12(void, __thiscall, 0x44DF80, this_, sx, sy, sw, sh, dst, dx, dy, dw, dh, dpitch, 3);
            }
            else
            {
                CALL_14(void, __thiscall, h->GetDefaultFunc(), this_, sx, sy, sw, sh, dst, dx, dy, dw, dh, dpitch, p16, hflip, tblit);
            }
        }

Плюс такого подхода в высокой совместимости со сторонними решениями с другими форматами кадров. Я и Сав никак не синхронизируем разработку (ну, после выбора варианта решения) своих кастомных def в Хд и Хота и все это работает как задумано вместе.


RE: HD мод - Berserker - 24.11.2020 17:45

baratorch, спасибо за информацию. У тебя есть адреса/прототипы функций отрисовки def-ов не только интерфейсных? Только монстров не нужно, с их палитрами и эффектами клонирования/окаменения.


RE: HD мод - baratorch - 24.11.2020 21:32

(24.11.2020 17:45)Berserker Wrote:  baratorch, спасибо за информацию. У тебя есть адреса/прототипы функций отрисовки def-ов не только интерфейсных? Только монстров не нужно, с их палитрами и эффектами клонирования/окаменения.

Code:
_PI->CreateHiHook(0x47BE90, SPLICE_, DIRECT_, THISCALL_, N_DefFrame_Draw);
_PI->CreateHiHook(0x47C300, SPLICE_, DIRECT_, THISCALL_, N_DefFrame_DrawCreature);
_PI->CreateHiHook(0x47C9C0, SPLICE_, DIRECT_, THISCALL_, N_DefFrame_DrawAdvObj);
_PI->CreateHiHook(0x47CE10, SPLICE_, DIRECT_, THISCALL_, N_DefFrame_DrawAdvObjWithFlagAlpha);
_PI->CreateHiHook(0x47D250, SPLICE_, DIRECT_, THISCALL_, N_DefFrame_DrawAdvObjShadow);
_PI->CreateHiHook(0x47D660, SPLICE_, DIRECT_, THISCALL_, N_DefFrame_DrawTile);
_PI->CreateHiHook(0x47E140, SPLICE_, DIRECT_, THISCALL_, N_DefFrame_DrawTileShadow);
_PI->CreateHiHook(0x47E880, SPLICE_, DIRECT_, THISCALL_, N_DefFrame_DrawSpellEffect);

        
void __fastcall N_DefFrame_Draw(_DefFrame_* this_, _dword_ no_used, int sx, int sy, int sw, int sh, unsigned short* dst, int dx, int dy, int dw, int dh, int dpitch, _Palette16_* pal, bool hflip, bool tblit);
void __fastcall N_DefFrame_DrawCreature(_DefFrame_* this_, _dword_ no_used, int sx, int sy, int sw, int sh, unsigned short* dst, int dx, int dy, int dw, int dh, int dpitch, _Palette16_* pal, bool hflip, unsigned short outcolor, bool alpha);
void __fastcall N_DefFrame_DrawAdvObj(_DefFrame_* this_, _dword_ no_used, int sx, int sy, int sw, int sh, unsigned short* dst, int dx, int dy, int dw, int dh, int dpitch, _Palette16_* pal, bool hflip, unsigned short flagcolor);
void __fastcall N_DefFrame_DrawAdvObjWithFlagAlpha(_DefFrame_* this_, _dword_ no_used, int sx, int sy, int sw, int sh, unsigned short* dst, int dx, int dy, int dw, int dh, int dpitch, _Palette16_* pal, unsigned short flagcolor, bool hflip);
void __fastcall N_DefFrame_DrawAdvObjShadow(_DefFrame_* this_, _dword_ no_used, int sx, int sy, int sw, int sh, unsigned short* dst, int dx, int dy, int dw, int dh, int dpitch, _Palette16_* pal, bool hflip);
void __fastcall N_DefFrame_DrawTile(_DefFrame_* this_, _dword_ no_used, int sx, int sy, int sw, int sh, unsigned short * dst, int dx, int dy, int dw, int dh, int dpitch, _Palette16_* pal, bool hflip, bool vflip);
void __fastcall N_DefFrame_DrawTileShadow(_DefFrame_* this_, _dword_ no_used, int sx, int sy, int sw, int sh, unsigned short * dst, int dx, int dy, int dw, int dh, int dpitch, _Palette16_* pal, bool hflip, bool vflip);
void __fastcall N_DefFrame_DrawSpellEffect(_DefFrame_* this_, _dword_ no_used, int sx, int sy, int sw, int sh, unsigned short* dst, int dx, int dy, int dw, int dh, int dpitch, _Palette16_* pal, bool hflip, bool alpha);



RE: HD мод - Raistlin - 24.11.2020 22:09

Получается, с помощью данного кода можно полностью перейти на pcx, обойдя при этом все проблемы с совместимостью?


RE: HD мод - Berserker - 24.11.2020 22:30

baratorch, спасибо! 132


RE: HD мод - RoseKavalier - 25.11.2020 02:32

(24.11.2020 22:09)Raistlin Wrote:  Получается, с помощью данного кода можно полностью перейти на pcx, обойдя при этом все проблемы с совместимостью?

Depends on the def type really, for example pcx has no specification to draw shadows, semi-transparent, flag colour etc. A bit more work is needed, in my opinion it becomes simpler to make your own format - I had looked at this a few months back and got pretty far just never managed to finish.
Image: 0guRepc.png

On the other hand, pcx can almost directly be used for interface format, provided you do not use colours 1-9. Colour 0 can be considered transparent through function argument.


RE: HD мод - daemon_n - 25.11.2020 05:13

   вот ещё парочка багов и хотелок

-) Alt+Лкм в диалоге гарнизона и шахты у верхней армии вызывает ошибку o_CreatureExpo и позволяет набрать армию (Click to View)
-) Координаты кнопок в бою смещены на 1 пиксель (и X и Y) при разрешении больше 800х600, решение (Click to View)
-) Опция "пригласить героя" показывает неверный портрет, если портрет героя был настроен в редакторе карт. ( Если не ошибаюсь, у сод/хота так же)

+) Плюс хотелось бы добавить уровень героя в хинт диалога приглашения


RE: HD мод - baratorch - 25.11.2020 11:50

(22.11.2020 18:34)Berserker Wrote:  
Quote:Один хороший модер очень просит возможность получить функцию загрузки сохранённой игры прямо с карты приключений без сторонних диалогов. Возможно ли?
Это просто теоретический вопрос. Если можно сразу же загрузить игру без промежуточных диалогов, то такая функция была бы востребована весьма. Именно программно.

Code:
    void _LoadGame(char* filename)
    {
        int v[4];
        CALL_2(void, __thiscall, 0x558320, v, 1);
        v[3] = 0;
        CALL_4(void, __thiscall, 0x4BEFF0, o_GameMgr, filename, 0, 1);
        CALL_1(void, __thiscall, 0x558360, v);
        v[3] = -1;
        CALL_1(void, __thiscall, 0x558360, v);
    }

filename - короткое имя сейва, который будет браться из папки Games
Таким образом можно загружать ТОЛЬКО сейв той же игры, что идет.
Такая загрузка проходит без экрана прогресса загрузки.

Я не пробовал загружать таким образом сейвы не текущей игры, но, уверен, если так сделать - все поломается.


RE: HD мод - baratorch - 25.11.2020 12:10

(22.11.2020 18:34)Berserker Wrote:  Поддержку цветного текста для режимов 32 бита делал RoseKavalier, но там он динамически патчит код HD. Хотелось бы более цивилизованно.

Сейчас Эра перехватывает следующие адреса:
Core.Hook(@Hook_HandleTags, Core.HOOKTYPE_BRIDGE, 7, Ptr($4B509B));
Core.Hook(@Hook_GetCharColor, Core.HOOKTYPE_BRIDGE, 8, Ptr($4B4F74));
Core.Hook(@Hook_BeginParseText, Core.HOOKTYPE_BRIDGE, 6, Ptr($4B5255));

В BeginParseText весь текст парсится на блоки (пробельные символы игнорируются). Запоминаются размеры блоков и цвета. Сами цвета вырезаются, остаются только фигурные скобки.
В Hook_GetCharColor возвращает цвет из текущего блока и текущей позиции.
В Hook_HandleTags увеличивается позиция для непробельных символов, смена блока при необходимости и обработка "{", "}"

В 32-бит режиме ХД полностью переписана функция N_font_DrawCharacter_4B4F00, внутри которой эра пытается изменить цвет символа.
Почему-то сразу не пришло в голову решение (оно уже есть):
Эре нужно создать глобальную переменную типа WORD (16 бит беззнаковое целое) - пусть CharColor. взять адрес этой переменной и выполнить с ним в качестве аргумента функцию патчера:
_P->VarInit("HotA.FontColor", (_dword_)&CharColor);
а дальше, каждый раз когда меняется цвет символа менять и CharColor.
Если так сделать, то цветной текст заработает с любой версией ХД.

Надеюсь понятно объяснил, и перевести описанное из с++ в паскаль/делфи не составит труда.


RE: HD мод - igrik - 25.11.2020 17:37

(25.11.2020 17:26)baratorch Wrote:  А вот баг вога - не знаю... м.б. будет настроение - придумаю решение.
Мне кажется, это задача Берса в рамках ЭРЫ.
Либо моя в рамках game bug fixes extended.dll

Я почему то даже и не подумал, что это баг Вога. Просто проблема не проявлялась без быстрого управления армий, и поэтому интуитивно думалось, что это недочёт HD (я сейчас не говорю о потере опыта и артефакта).


RE: HD мод - baratorch - 25.11.2020 18:46

(25.11.2020 17:37)igrik Wrote:  
(25.11.2020 17:26)baratorch Wrote:  А вот баг вога - не знаю... м.б. будет настроение - придумаю решение.
Мне кажется, это задача Берса в рамках ЭРЫ.
Либо моя в рамках game bug fixes extended.dll

Я почему то даже и не подумал, что это баг Вога. Просто проблема не проявлялась без быстрого управления армий, и поэтому интуитивно думалось, что это недочёт HD (я сейчас не говорю о потере опыта и артефакта).

Вот код для эры, который делает отображение значков опыта и артов в полоске героя в этом диалоге присоединения существ:

Code:
                _PI->WriteLoHook(0x7653C1, [](LoHook* h, HookContext* c) -> int
                    {
                        c->ecx = IntAt(0x803300);
                        if (c->ecx == 0 && o_ActivePlayer && o_ActivePlayer->selected_hero_id != -1)
                        {
                            c->ecx = (int)o_GameMgr->GetHero(o_ActivePlayer->selected_hero_id);
                        }
                        return SKIP_DEFAULT;
                    });

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


RE: HD мод - baratorch - 25.11.2020 19:41

(24.11.2020 01:26)daemon_n Wrote:  Ооо, я вспомнил

+) Не хватает твика для выбора найма сразу всех существа в диалоге набора существ, как это сделано для сод/хота. Было что-то типа
<UI.RecruitDlg.AutoSet> = 1
<UI.RecruitDlg.AutoSet.Max> = 1

Очень удобная фишка, которой не хватает
Этот функционал есть. Надо ручками добавить эти записи в твики. Но в обнове сделаю так чтобы эти записи были по-умолчанию.


RE: HD мод - igrik - 25.11.2020 19:50

(25.11.2020 18:46)baratorch Wrote:  Вот код для эры, который делает отображение значков опыта и артов в полоске героя в этом диалоге присоединения существ:

Code:
                _PI->WriteLoHook(0x7653C1, [](LoHook* h, HookContext* c) -> int
                    {
                        c->ecx = IntAt(0x803300);
                        if (c->ecx == 0 && o_ActivePlayer && o_ActivePlayer->selected_hero_id != -1)
                        {
                            c->ecx = (int)o_GameMgr->GetHero(o_ActivePlayer->selected_hero_id);
                        }
                        return SKIP_DEFAULT;
                    });

Ну а сделать нормальную работу с опытом с верхней полоской в этом диалоге, гораздо сложнее, конечно. Но я приблизительно представляю как...
Круто! Реально работает))
Я так понимаю, для верхней полоски нужно создать свою структуру опыта стеков для "гарнизон и шахты - хозяин" (при создании конструктора армий 0x5D15F7 call Army_Constuct ), и поять же поставить перехват на отображение " гарнизон и шахты - хозяин"


RE: HD мод - igrik - 26.11.2020 02:04

Какой же треш в этих исходниках опыта монстров. Просто ахтунг. Ну нахрена так именовать функции и переменные.
Как выловить то конструктор CrExpo()?
По хорошему, создать бы свой тип 0 #define CE_NONE 0 ( как #define CE_HERO 1 ) и через этот тип получать свой RealType, RealNum, SetN, а потом использовать в M2MCrExp(0)



RE: HD мод - Berserker - 26.11.2020 02:07

igrik, трэщ и угар, я оттуда выползаю как из преисподни.

baratorch, спасибо огромное за ценную информацию 132. В ближайшее время будет использовано.


RE: HD мод - Berserker - 26.11.2020 08:00

baratorch, метод VarInit ещё отсутствует в том API для Delphi, что имеется.
https://dropmefiles.com/YqIvh


RE: HD мод - baratorch - 26.11.2020 09:30

Berserker, в коде класса TPatcher сразу после виртуального абстрактного метода MemCopyCodeEx добавь

Code:
// метод VarInit
  // инициализирует "переменную" с именем name и устанавливает ее значение равным value
  // если переменная с таким именем уже существует, то просто устанавливает ее значение равным value
  // возвращает переменную в случае успеха и nil в противном случае
    function VarInit(name: PAnsiChar; value: _dword_): TVariable; virtual; stdcall; abstract;
  // метод VarFind
  // возвращает переменную с именем name, если такая была инициализирована
  // если нет, возвращает nil
    function VarFind(name: PAnsiChar): TVariable; virtual; stdcall; abstract;

тип TVariable:

Code:
//тип "переменная" используется для возвращаемых методами TPatcher.VarInit
  // и TPatcher.VarFind значений
  TVariable = packed class

    // возвращает значение "переменной" (потокобезопасное обращение)
    function GetValue: _dword_; virtual; stdcall; abstract;

    // устанавливает значение "переменной" (потокобезопасное обращение)
    procedure SetValue(value: _dword_) virtual; stdcall; abstract;

    // возвращает указатель на значение "переменной" (обращение к значению "переменной" через указатеь непотокобезопасно)
    function GetPValue: Pointer; virtual; stdcall; abstract;

  end;



RE: HD мод - Berserker - 26.11.2020 09:47

Спасибо, подключил.

Quote:_P->VarInit("HotA.FontColor", (_dword_)&CharColor);
а дальше, каждый раз когда меняется цвет символа менять и CharColor.
Мне часто нужно, если вне тегов, использовать цвет по умолчанию. То есть не менять его. Цвет по умолчанию — тот, что задан для элемента в диалоге, может быть не белый. Что посоветуешь здесь? HD-мод сам устанавливает HotA.FontColor динамически? Раньше, если нужно выводить символ с цветом по умолчанию, я просто выполнял код по умолчанию:

Code:
function Hook_GetCharColor (Context: Core.PHookContext): longbool; stdcall;
begin
  result := TextBlocks[TextBlockInd].Color16 = DEF_COLOR;
  
  if not result then begin
    Context.EAX := TextBlocks[TextBlockInd].Color16;
  end;
end;



RE: HD мод - baratorch - 26.11.2020 15:45

(26.11.2020 09:47)Berserker Wrote:  Мне часто нужно, если вне тегов, использовать цвет по умолчанию. То есть не менять его. Цвет по умолчанию — тот, что задан для элемента в диалоге, может быть не белый. Что посоветуешь здесь? HD-мод сам устанавливает HotA.FontColor динамически?
HD-мод устанавливает HotA.FontColor != 0 , когда нужно что-то нарисовать особым цветом и равным нулю, когда нужно использовать цвет по-умолчанию (тот что зависит от аргумента color в N_font_DrawCharacter_4B4F00(font* this_, _dword_ edx, int c, _Pcx16_* bmp, int x, int y, int color).


RE: HD мод - Berserker - 26.11.2020 16:40

Спасибо, попробую.

Возник вопрос по моду на расширенные жилища. В диалоге быстрого найма ты получаешь настройки существ по жилищам? Люди пишут, что нет:

Воint *MonInTownBase(int Town){
    #include "templ.h"
    RETURN((int *)(0x6747B4+Town*14*4))
}




RE: HD мод - XEPOMAHT - 26.11.2020 17:32

(26.11.2020 16:40)Berserker Wrote:  Воint *MonInTownBase(int Town){
    #include "templ.h"
    RETURN((int *)(0x6747B4+Town*14*4))
}

Это не будет работать.

В Тифоне 1-2 вместо 6747B4 используется своя самопальная таблица - TownCreatures, к которой через простыню хуков привязан диалог города с наймом. HD-мод читает только содовскую и не умеет читать тифоновскую, увы (там и адрес таблицы не получишь просто так) в найме будут только то, что прописано в 6747B4.

В Тифоне 3 таблица монстров городов уже перенесена полностью, без использования хуков, соотвественно, для Тифона 3 получение адреса - только по условному базовому адресу (который HD-мод возможно и понимает, но... для новых фракций HD-мод считывает только задний план, на саму структуру монстров новых фракций он перейти не может, увы - итог вылет).




RE: HD мод - igrik - 26.11.2020 18:10

HD читает таблицу городских монстров через двойной указатель (*(_int_**)0x47AA82). Он то меняется в Тифоне? А в Аметисте?
Положите туда указатель на таблицу, и всё будет работать.

Насколько я понимаю, HD в Хоте читает именно так. И у них всё работает.

Code:
#define o_CastleCreatures (*(_int_**)0x47AA82)
o_CastleCreatures[dwelling_type + 14 * town->type];



RE: HD мод - XEPOMAHT - 26.11.2020 18:19

(26.11.2020 18:10)igrik Wrote:  Насколько я понимаю HD читает таблицу городских монстров через двойной указатель (*(_int_**)0x47AA82). Он то меняется в Тифоне?

Конечно меняется и в Тифоне (без этого ничего работать не будет).

(26.11.2020 18:10)igrik Wrote:  А в Аметисте?

Нет, в Аметисте только увеличено количество монстров. Новых фракций там нет.

(26.11.2020 18:10)igrik Wrote:  HD в Хоте читает именно так.

Знаю, что советую и Берсеркеру так же делать в ЭРЕ. Для совместимости.

(26.11.2020 18:10)igrik Wrote:  
Code:
#define o_CastleCreatures (*(_int_**)0x47AA82)
o_CastleCreatures[dwelling_type + 14 * town->type];

Это как раз и работает. Оно даже номер фракции получает и отрисовывает бэкграунд 10-й фракции, но с получением самой структуры монстров для новых фракций в HD-моде какие-то непонятки (возможно, там просто не выделена память под них где-нибудь в HD_WOG.dll).


RE: HD мод - igrik - 26.11.2020 18:25

TyphonZ точно не записывает сюда адрес новой таблицы.
Code:
Выдержка из Олли:
0047AA82  MOV EDI,DWORD PTR DS:[ESI*4+6747B4]



RE: HD мод - XEPOMAHT - 26.11.2020 18:30

(26.11.2020 18:25)igrik Wrote:  TyphonZ точно не записывает сюда адрес новой таблицы.
Code:
Выдержка из Олли:
0047AA82  MOV EDI,DWORD PTR DS:[ESI*4+6747B4]

(26.11.2020 17:32)XEPOMAHT Wrote:  В Тифоне 1-2 вместо 6747B4 используется своя самопальная таблица - TownCreatures, к которой через простыню хуков привязан диалог города с наймом. HD-мод читает только содовскую и не умеет читать тифоновскую, увы (там и адрес таблицы не получишь просто так) в найме будут только то, что прописано в 6747B4.



RE: HD мод - igrik - 26.11.2020 18:34

Так а как известить HD, что таблица перемещена? Если вы указатель не меняете 96-copy

Проверил сейчас - Аметист тоже не удосужился исправить указатель.

Поэтому и не работает правильно быстрая покупка существ в HD.


RE: HD мод - XEPOMAHT - 26.11.2020 18:50

(26.11.2020 18:34)igrik Wrote:  Так а как известить HD, что таблица перемещена? Если вы указатель не меняете 96-copy

А уже никак, старые версии Тифона всё равно не поддерживаются (а новые нахрен никому не нужны, поэтому я временно положил болт с резьбой на Тифон до релиза MoP 2.19). Нанимайте монстров стандартными содовскими диалогами и не включайте диалог найма в HD-моде. Из-за того, что приходится всё время что-то клянчить у авторов ERA/HD-мода, я выбираю MoP, где могу всё сделать сам вместо уже бесконечного попрошайничества, которое мне давно надоело (Бараторч всё равно давно записал меня в вечный игнор после того, как мне нечем было задонатить за мою первую и последнюю просьбу к нему).

(26.11.2020 18:34)igrik Wrote:  Проверил сейчас - Аметист тоже не удосужился исправить указатель.

Вы хоть знаете ЧТО это за таблица? Её указатель и не должен изменяться в Аметисте, т.к. таблица не меняется при добавлении новых монстров в игру. Её и WoG не меняет, вообще есть только 2 мода, совместимые с HD-модом, увеличивающие размер данной таблицы.


RE: HD мод - igrik - 26.11.2020 19:02

(26.11.2020 18:50)XEPOMAHT Wrote:  
(26.11.2020 18:34)igrik Wrote:  Проверил сейчас - Аметист тоже не удосужился исправить указатель.

Вы хоть знаете ЧТО это за таблица? Её указатель и не должен изменяться в Аметисте, т.к. таблица не меняется при добавлении новых монстров в игру. Её и WoG не меняет, вообще есть только 2 мода, совместимые с HD-модом, увеличивающие размер данной таблицы.
Хорошо, тогда не Аметист, а мод на расширенные жилища:

(26.11.2020 16:40)Berserker Wrote:  Возник вопрос по моду на расширенные жилища. В диалоге быстрого найма ты получаешь настройки существ по жилищам? Люди пишут, что нет:

Воint *MonInTownBase(int Town){
    #include "templ.h"
    RETURN((int *)(0x6747B4+Town*14*4))
}




RE: HD мод - daemon_n - 26.11.2020 20:58

baratorch, записал тебе на видео демонстрацию бага hd mod, который бесит чуть ли не всех стримеров Хоты. Может, о нём уже и сообщали, но данный баг всё ещё есть, и есть на всех версиях героев, поддерживаемых hd mod'ом. На разных настройках разрешения поведение отличается, но суть та же. (Click to View)

Чаще всего на стримах видел проблему, когда пытаются закрыть окно встречи, но вылезает артефакт "в руку" - на турнирных играх с таймером довольно критично. (Click to View)



RE: HD мод - Berserker - 27.11.2020 00:29

Quote:
Из-за того, что приходится всё время что-то клянчить у авторов ERA/HD-мода, я выбираю MoP, где могу всё сделать сам вместо уже бесконечного попрошайничества, которое мне давно надоело (Бараторч всё равно давно записал меня в вечный игнор после того, как мне нечем было задонатить за мою первую и последнюю просьбу к нему).
Это всё, конечно, хорошо и похвально, но здесь техническая тема, в которой мы ищем сотрудничества и по возможности решаем вопросы. Просто жалобы в воздух никак в этом процессе не помогают.

В данном случае, судя по всему, проблему прежде всего в необъяснимой на первой взгляд необходимости в Тифоне вообще эту таблицу трогать.
Тут бы ответ от МОРа не помешал. Я пока не до конца понимаю. Играю с HD модом, установка монстров по городам работает, картинки существ отрисовываются. Монстры в жилищах нанимаются. Что и зачем сделано в Typhon 2 со структурой пока не ясно.


RE: HD мод - XEPOMAHT - 27.11.2020 01:34

(27.11.2020 00:29)Berserker Wrote:  здесь техническая тема, в которой мы ищем сотрудничества и по возможности решаем вопросы. Просто жалобы в воздух никак в этом процессе не помогают.

Да, исправление EXCEPTION_ACCESS_VIOLATION в HD_WOG.dll при использовании ERA+ - дело добровольное и наверное нужное только мне (ERA+ всё равно наверно останется экспериментальным модом навечно). Может быть меня забанят на этом форуме наконец-то, тогда перестану докучать "жалобами в воздух". Но если ошибки есть, то я считаю долгом описывать их на форуме при каждом удобном случае.

(27.11.2020 00:29)Berserker Wrote:  Я пока не до конца понимаю. Играю с HD модом, установка монстров по городам работает, картинки существ отрисовываются. Монстры в жилищах нанимаются. Что и зачем сделано в Typhon 2 со структурой пока не ясно.

Там для найма добавлена поддержка альтернативных монстров. Соответственно, таблица монстров городов увеличилась в 2 раза - стандартная и альтернативная массивы с номерами монстров. HD-мод понимает только стандартный массив и считывает его по старому адресу, т.к. физически таблица перенесена в Тифоне 2 не была. Всё просто.


RE: HD мод - Berserker - 27.11.2020 01:54

XEPOMAHT,
1) Альтернативы не работают в Typhon 2. Так ведь?
2) Мод на расширенные жилища меняет через UN:T существ в основной таблице, если изменить существо в 1-м или 2-м слотах. Раз поменялась картинка, значит изменено в 1-м и 2-м слотах. А 3-й и 4-й в моде виртуальные, хранятся в ЕРМ массивах.


RE: HD мод - V_Maiko - 27.11.2020 02:45

Berserker, Extended Dwellings works fine with Typhon when I was using it. Clearly there are confusions, Typhon also has a sub-tool called "Town Editor" that allows you to choose the type of creature to recruit, this was used in The Tides of War port for ERA.
Image: Screenshot-1.png

And Extended Dwellings is for new slots for recruit creatures or alternatives (this is used by me in Third Upgrades Mod).
But in both the problem is the same with HD mod.


RE: HD мод - Berserker - 27.11.2020 07:26

В Эре 3.3 реализована поддержка цветных текстов для всех режимов HD мода. Плагин для китайского языка, использующий свои функции отрисовки, работает по-старому.


RE: HD мод - Archer30 - 27.11.2020 08:37

Berserker and Baratorch, thank you so much for improving ERA and HD to the next level!

Speaking of the Chinese plugin for ERA, there is still one major problem for the plugin to work with HD 32-bit modes. For any 32-bit modes, it looks like this with Chinese plugin loaded:
All characters supported by the Chinese plugin can't be correctly displayed with 32-bit modes.

I'd be very grateful if this could be investigated and solved. As far as I know, this Chinese plugin has a large group of users that it is also the only plugin that supports Korean characters in the game.
Unfortunately, the author of the plugin has been retired for long. the only thing I have is the
source and release of WoG CN

Thank you in advance for your kindly reseach to this.


RE: HD мод - XEPOMAHT - 27.11.2020 12:00

(27.11.2020 01:54)Berserker Wrote:  1) Альтернативы не работают в Typhon 2. Так ведь?

Альтернативы вместе с редактором города убраны начиная с Typhon 3.

Но HD-мод всё равно не видит def-ы добавленных Тифоном монстров, увы. В старой версии HD-мода вылет был напрямую из HD_WOG.dll, поэтому было не понятно из-за чего. Поставив новую версию, вылет ушёл на содовский код, по которому ясно, что на функцию-переходник, рисующую деф, подаются неверные данные. Если её выключить, то ошибка уже не происходит и отрисовка def-а пропускается в диалоге. Думаю, что для ERA+ этот диалог останется таким (т.к. как HD-мод получает и подгружает def - одному Барторчу известно, но он, увы, молчит как партизан 105 ).

Image: f8e6d66c070f.png


RE: HD мод - igrik - 27.11.2020 12:05

XEPOMAHT, так ты объясни, как должен читаться деф файл. Код приложи.


RE: HD мод - PerryR - 27.11.2020 12:06

Briefly tested the ERA update and I can confirm the colors now work in 16 and 32bit mod.

Thank you baratorch and Berserker 177
Super update


RE: HD мод - daemon_n - 27.11.2020 12:19

Ещё один баг с видеоRolleyes

До версии hd mod 5.2 RC5 последнее сохранение всегда бралось в фокус. То есть, как я понял, сортировка по дате файла.

Дальше и ныне (RC11) ПОСЛЕ загрузки сохранения оно ствновится единственным в фокусе. И сколько бы сейвов ни сделать, при открытии окна загрзки будет в фокусе тот самый первоначальный сейв (Click to View)
P.S: За видео спасибо Мишган


RE: HD мод - XEPOMAHT - 27.11.2020 12:22

(27.11.2020 12:05)igrik Wrote:  так ты объясни, как должен читаться деф файл. Код приложи.

Так же как в стандартной игре. Проблема оказалась в самих корявых хотовских дефах нимфы и океаниды. Буду пробовать пересобирать эти дефы так, чтобы HD-мод смог их нормально обработать и послать на рендер содовской функции без косяков.


RE: HD мод - baratorch - 27.11.2020 13:40

(27.11.2020 12:00)XEPOMAHT Wrote:  как HD-мод получает и подгружает def - одному Барторчу известно, но он, увы, молчит как партизан 105 ).

как, как...

#define o_CastleCreatures (*(_int_**)0x47AA82) //hota compatible
#define CREATURE_INFO_OFFSET (*(_ptr_*)0x6747B0)
#define o_CreatureInfo ((_CreatureInfo_*)CREATURE_INFO_OFFSET)

негрейд = o_CastleCreatures[от_0_до_6 + 14 * town->type]
грейд_если_есть = o_CastleCreatures[TownMgr->Field<_byte_>(460 + от_0_до_6)+ 14 * town->type]

o_CreatureInfo[негрейд].def_name
o_CreatureInfo[грейд_если_есть].def_name


RE: HD мод - baratorch - 27.11.2020 14:06

(27.11.2020 08:37)Archer30 Wrote:  Berserker and Baratorch, thank you so much for improving ERA and HD to the next level!

Speaking of the Chinese plugin for ERA, there is still one major problem for the plugin to work with HD 32-bit modes. For any 32-bit modes, it looks like this with Chinese plugin loaded:
All characters supported by the Chinese plugin can't be correctly displayed with 32-bit modes.

I'd be very grateful if this could be investigated and solved. As far as I know, this Chinese plugin has a large group of users that it is also the only plugin that supports Korean characters in the game.
Unfortunately, the author of the plugin has been retired for long. the only thing I have is the
source and release of WoG CN

Thank you in advance for your kindly reseach to this.

Я бы сам добавил в эти исходники поддержку 32 бит, но мне совершенно не хочется искать, устанавливать и настраивать то, что их может собрать..

Я могу объяснить как сделать поддержку 32 бит. Это не сложно.
Правда на с++ и именах, используемых в ХД:

В 32 битном режиме все структуры _Pcx16_ являются на самом деле "_Pcx32_"
- разница в размере и формате пикселя:
2 байта RGB565 и 4 байта XRGB8888 соответственно.

#define o_BPP (ByteAt(0x5FA228 + 3) << 3)

o_BPP будет равно 16 в оригинальном режиме и равно 32, если режим 32-битный.

вот код некоторой условной функции, который показывает разницу в форматах
и то как можно добавить поддержку 32 бит:

Code:
void _Pcx16_::DrawPcx16(_Pcx16_ *src_pcx, int dst_x, int dst_y)
{
    if (o_BPP == 32)
    {
        _dword_* src_pixels = (_dword_*)(src_pcx->buffer);
        _dword_* dst_pixels = (_dword_*)buffer;

        for (int y = 0; y < src_h; y++)
            for (int x = 0; x < src_w; x++)
                    dst_pixels[dst_x + x + (dst_y + y) * scanline_size * 4] = src_pixels[src_x + x + (src_y + y) * src_pcx->scanline_size * 4)];
    }
    else // 16
    {
        _word_* src_pixels = (_word_*)(src_pcx->buffer);
        _word_* dst_pixels = (_word_*)buffer;

        for (int y = 0; y < src_h; y++)
            for (int x = 0; x < src_w; x++)
                    dst_pixels[dst_x + x + (dst_y + y) * scanline_size * 2] = src_pixels[src_x + x + (src_y + y) * src_pcx->scanline_size * 2)];
    }
}



RE: HD мод - XEPOMAHT - 27.11.2020 14:35

(27.11.2020 13:40)baratorch Wrote:  #define o_CastleCreatures (*(_int_**)0x47AA82) //hota compatible
#define CREATURE_INFO_OFFSET (*(_ptr_*)0x6747B0)
#define o_CreatureInfo ((_CreatureInfo_*)CREATURE_INFO_OFFSET)

негрейд = o_CastleCreatures[от_0_до_6 + 14 * town->type]
грейд_если_есть = o_CastleCreatures[TownMgr->Field<_byte_>(460 + от_0_до_6)+ 14 * town->type]

o_CreatureInfo[негрейд].def_name
o_CreatureInfo[грейд_если_есть].def_name

Спасибо, это совместимо с Тифоном, оба адреса в нём обрабатываются. Ошибок нет. Хотовские дефы я исправил, всё заработало (вообще странно, что HD-мод их без проблем обрабатывает в самой HoA уже столько лет несмотря на то, что они содержат косяки, видимо, это по-прежнему секрет, который мы никогда не узнаем). Увы, такие нюансы при использовании def-файлов монстров совместно с HD-модом нигде не описаны, приходится познавать методом научного тыка, как это и не печально, но увы.

Image: e651d9b2dd22.png


RE: HD мод - Berserker - 27.11.2020 15:09

baratorch, спасибо большое. Китайский патч на цветной текст я адаптировал в своё время. Попробую исправить по примеру. В идеале и вовсе переписать. Исходник в стиле WoG.
Archer30, agree, thanks.


RE: HD мод - baratorch - 27.11.2020 15:31

(27.11.2020 14:35)XEPOMAHT Wrote:  Хотовские дефы я исправил, всё заработало (вообще странно, что HD-мод их без проблем обрабатывает в самой HoA уже столько лет несмотря на то, что они содержат косяки, видимо, это по-прежнему секрет, который мы никогда не узнаем). Увы, такие нюансы при использовании def-файлов монстров совместно с HD-модом нигде не описаны, приходится познавать методом научного тыка, как это и не печально, но увы.
Вообще-то были проблемы на этапе разработки этого диалога. Я никак не мог понять почему именно эти дэфы крашат ХД, а в хоте работают нормально. Однако, применил какую-то непонятную магию и все заработало...

Не мог бы ты сказать в чем проблема этих дэфов и как ты их поправил, я бы передал эту инфу команде Хота.


RE: HD мод - XEPOMAHT - 27.11.2020 16:49

(27.11.2020 15:31)baratorch Wrote:  Не мог бы ты сказать в чем проблема этих дэфов и как ты их поправил, я бы передал эту инфу команде Хота.

В них отсутствуют кадры анимации движения монстра (по факту, должен быть хотя бы один, как например у Дьяволов/Архидьяволов). Естественно, что Тифон подменяет соотвествующий WoG-хук на монстров-телепортёров своим хуком, давая возможность к телепорту любым монстрам в игре (там пропускается эта анимация и устанавливается допозвучка телепортации), родные содовские диалоги видимо пропускают эту анимацию автоматически, если её нет, поэтому сама игра спокойно воспринимает дефы, в которых присутствует не все типы кадров анимации.

Вот исправленные def'ы: https://vk.com/doc21300829_579054509


RE: HD мод - Archer30 - 27.11.2020 20:22

Baratorch, Thanks a lot for the enlightenment!
Although I don't know about coding except for ERM (yet?). For now, I can't test with your code, unfortunately. Dash1

Berserker, thanks a million. You always show your sincere concern to the international community. 112


RE: HD мод - Berserker - 27.11.2020 21:05

Бараторч, спасибо. Поддержка 32-битных режимов для плагина азиатских языков добавлена.


RE: HD мод - Archer30 - 27.11.2020 21:56

Berserker and Baratorch, this is just too good to be true! Now the Asian community enjoys the 32-bit mode at the same time with other parts of the world!
I cannot thank you enough for this. 132


RE: HD мод - baratorch - 28.11.2020 09:26

Berserker,

в ХД теперь не работает расцветка текста такого плана

Hota.FontColor = цвет
o_Medfont_Fnt->DrawTextToPcx16(....);

Я не видел исходники, но можно как-то в эре восстанавливать исходное значение Hota.FontColor после использования, а не обнулять?

***

И еще. В героях есть такая функция
int __thiscall Fnt_GetLineWidth_sub_4B5680(void *this, const char *text_line)
она возвращает длину строки текста в пикселях и не учитывает символы { и }

Так вот в эре она не должна учитывать эровские метки цвета (а они могут быть в несколько раз длиннее отображаемого текста!!). Сделай, пожалуйста.


RE: HD мод - Panda - 28.11.2020 14:39

Berserker, напоминаю, что сейчас в дистрибутиве Эра находятся два патча - campaign heroes as start heroes и inferno gates teleports to any town, которые не совместимы с HD mod версий RC8 и выше, и отправляют игру в краш. Лучше бы наверное удалить их, ведь всегда найдётся тот, кто активирует их.


RE: HD мод - Berserker - 28.11.2020 15:36

baratorch, понял, спасибо. Попробую оба. А с переменной нужен совет. Ты её всегда инициализируешь корректно до отрисовки текста? Могу я полагаться на её начальное значение как на цвет текста и возвращать его в качестве «рисуй оригинальным цветом»?

/Panda, удалю патч на кампании и гляну, что не так со вторым. Было очень удобно пользоваться телепортом в любой город)


RE: HD мод - Panda - 28.11.2020 16:30

Berserker, спасибо, было бы неплохо, если inferno gates teleports to any town будет исправлен, будет замечательно, т.к. без это патча постройка в городе совсем бесполезная. Что не так уже расписал Игрик:
"campaign heroes as start heroes.bin не может быть совместимым с диалогом HD, потому что он изменяет массив выбора героев, вроде бы делая этот массив по 1 или 2 байта (ЕМНИП). Краш обеспечен, потому что HD ничего о замене таких данных не знает.
   inferno gates teleports to any town.bin - я так понимаю HD создаёт свой диалог Городского Портала. При таких раскладах заплатка никак не может функционировать в диалоге HD, да и слава богу... Опять были бы краши".
Если выключить пункт "<UI.Ext.TownPortalDlg>" ( перевести в "0"), то патч заработает, но при этом теряется иконка города в городском портале, что совсем не айс. Ну и о стабильности такого решения как сказал уже Игрик, можно только гадать...


RE: HD мод - daemon_n - 28.11.2020 17:14

Panda, багует только с твиком <Fix.RMG.StartingHeroInPrison> = 1 , разве нет?


RE: HD мод - Berserker - 29.11.2020 03:28

Quote:Hota.FontColor = цвет
o_Medfont_Fnt->DrawTextToPcx16(....);
baratorch,
А есть причина не передавать цвет текста напрямую аргументом?
И кто возвращает значение Hota.FontColor после вызова функции таким способом?

Функцию подсчёта длина строки/линии точно нужно перехватывать? Ведь я произвожу предобработку текста, вырезая всё между { и }.


RE: HD мод - Panda - 29.11.2020 03:55

daemon_n, нет, проверил, краш есть хоть <Fix.RMG.StartingHeroInPrison> = 1, хоть =0.


RE: HD мод - daemon_n - 29.11.2020 13:15

Panda, краш ТОЛЬКО из-за нового диалога быстрого выбора замка и героя. Возможно, есть смысл расширить его.
Потому что простое переключение стрелочками ДАЁТ выбрать геря кампании. Вот я тоже проверил103


RE: HD мод - baratorch - 29.11.2020 14:28

(28.11.2020 15:36)Berserker Wrote:  А с переменной нужен совет. Ты её всегда инициализируешь корректно до отрисовки текста? Могу я полагаться на её начальное значение как на цвет текста и возвращать его в качестве «рисуй оригинальным цветом»?

Так. Смотри, ты объявляешь свою переменную (назовем ее EraFontColor) и помещаешь указатель на нее в HotA.FontColor.
После помещения ее указателя в HotA.FontColor, другие (ХД, например), могут менять значение твоей EraFontColor через указатель. Но владеешь то EraFontColor - ты. Ты можешь инициализировать EraFontColor нулем и смело полагаться на ее начальное значение.
ХД поместит указатель на свою переменную в HotA.FontColor, только если не найдет там другого. Т.е. в текущих эре и хд, ХД пользуется переменной EraFontColor.
Хд не обнуляет и не меняет переменную так, чтобы нарушалась последовательность расцвечиваний в эре.


RE: HD мод - XEPOMAHT - 29.11.2020 15:39

(28.11.2020 16:30)Panda Wrote:  "campaign heroes as start heroes.bin не может быть совместимым с диалогом HD, потому что он изменяет массив выбора героев, вроде бы делая этот массив по 1 или 2 байта (ЕМНИП). Краш обеспечен, потому что HD ничего о замене таких данных не знает.

Да, совместимости нет и не будет. Чтобы хотя бы не вылетало, нужно вместо уплотнения данных расширять стек, но HD-мод всё равно увидит только максимум 16 героев. Поэтому смысла нет.

(28.11.2020 16:30)Panda Wrote:     inferno gates teleports to any town.bin - я так понимаю HD создаёт свой диалог Городского Портала. При таких раскладах заплатка никак не может функционировать в диалоге HD, да и слава богу... Опять были бы краши".
Если выключить пункт "<UI.Ext.TownPortalDlg>" ( перевести в "0"), то патч заработает, но при этом теряется иконка города в городском портале, что совсем не айс. Ну и о стабильности такого решения как сказал уже Игрик, можно только гадать...

Бинарным патчем функцию адского портала лучше вообще не трогать. Если нужно убирать проверку на тип города, совместимую с HD-модом, то нужно делать плагином. Сам inferno gates teleports to any town.bin по-любому уже может считаться устаревшим и рекомендован к удалению.


RE: HD мод - baratorch - 29.11.2020 18:29

(29.11.2020 03:28)Berserker Wrote:  
Quote:Hota.FontColor = цвет
o_Medfont_Fnt->DrawTextToPcx16(....);
baratorch,
А есть причина не передавать цвет текста напрямую аргументом?
Есть. Универсальный, работающий годами, код ХД, который не хочется менять.

Quote:И кто возвращает значение Hota.FontColor после вызова функции таким способом?
ХД возвращает.
Hota.FontColor = цвет
o_Medfont_Fnt->DrawTextToPcx16(....);[/quote]
Hota.FontColor = 0
и делает это в тот момент, в который не страшно эре.

Quote:Функцию подсчёта длина строки/линии точно нужно перехватывать? Ведь я произвожу предобработку текста, вырезая всё между { и }.
Я много в хд использую эту функцию подсчета длины. Я могу конечно сам ее поменять или, пихать в нее текст без цветовых кодов.
Просто мне кажется раз это фича эры, то фича должна быть доделана до конца.

В игре проверил, вроде проблем из-за этого нет, однако похоже есть место где и сами разрабы косячат с подсчетом длины (не используют свою же, упомянутую ф-ию) - это элемент диалога "многострочный текст с полосой прокрутки".

Вот пример одного текста с избыточной длиной кода расцветки эры(1), без расцветки(2) и с избыточной расцветкой простыми фигурными скобками(3):
Очевидно, служебные символы участвуют в рассчете переноса слов в строках, что неправильно.


RE: HD мод - Berserker - 29.11.2020 19:28

baratorch, плагин на азиатские языки использует свою Fnt_DrawCharacter для GBK-пар символов, ничего не зная об HD. Я добавляю поддержку картинок в тексте, тоже свой перехват ставлю. Со временем, возможно, вовсе заменю вызов HD_Fnt_DrawCharacter своей с опциональной 32-битной отрисовкой. Но раз ты восстанавливаешь значение Hota.Color, то попробую использовать его в качестве значения по умолчанию, чтобы HD код работал без правок. Хотя передача параметров через глобальные переменные чуток костыльный способ со своими недостатками.

С функцией получения ширины строки, конечно, вопросы. Сам видишь, она часть внутренних функций отрисовки (как и DrawCharacter), не идеально подходящая на свободный вызов внешним кодом. Чем сложнее формат текста (простой/цветной/с тегами картинок/с выравниванием), тем геморойнее по указателю на любую часть текста вернуть ширину конкретной строки без репарсинга (точнее, невозможно). С теми картинками уже в расчёт включается ширина def/pcx, Приведи, пожалуйста, примеры кода, где ты используешь эту функцию в отрыве от вывода текста.

Планируешь ли ты добавлять её вызов в код отрисовки текста с прокруткой? И если да, что отлично, то там текст уже корректно распарсенный с заменами на обычные теги либо серию неразрывных пробелов, в случае картинок у меня.
Image: image.png


RE: HD мод - Berserker - 30.11.2020 08:08

Новое обновление: https://mods.hmm35.ru/Era%20Update.exe
-) ERA учитывает цвет, который HD-мод устанавливает для своих нужд через переменную "HotA.FontColor".
-) Исправлено вычисление ширины символов. Изображения в тексте теперь корректно центрируются, а символы не пропадают.


RE: HD мод - baratorch - 01.12.2020 15:37

Выпустил обнову ХД 5.2 RC12.
Пофиксил и добавил почти всё, о чем говорилось в этой теме. Может быть о чем-то забыл, пишите если так.
Опция HD+ добавляет отображение таймера, шахматный таймер и ряд геймплейных фиксов (не помню уже каких). Остальные фичи HD+, которые есть в Сод - недоступны.
Запилил отдельное онлайн-лобби. Правда я сомневаюсь в востребованности данной фичи...


RE: HD мод - Berserker - 05.12.2020 00:37

Бара, в HD моде поле _int_ height в структуре _Fnt_ неверное. Там байт, а не int32.


RE: HD мод - baratorch - 05.12.2020 06:55

(05.12.2020 00:37)Berserker Wrote:  Бара, в HD моде поле _int_ height в структуре _Fnt_ неверное. Там байт, а не int32.

Спасибо, но оно уже давно там байт.


RE: HD мод - Berserker - 05.12.2020 09:09

Я полностью заменил функцию отрисовки символов для 16/32 режимов. Но Hota.FontColor учитываю при инициализации как значение цвета по умолчанию, если <> 0, хотя сам больше не использую.

Структура шрифта вышла такая:
Code:
{$ALIGN OFF}
  PFontItem = ^TFontItem;
  TFontItem = object (TBinaryTreeItem)
   public
    FirstChar:       char;
    LastChar:        char;
    BppDepth:        byte; // Bits per pixel, 8 for Heroes fonts
    XSpace:          byte; // 0?
    YSpace:          byte; // 0?
    Height:          byte; // In bits
    Unk1:            array [1..26] of byte;
    CharInfos:       array [#0..#255] of TFontCharInfo;
    CharDataOffsets: array [#0..#255] of integer;
    Unk2:            array [1..28] of byte;
    Color16Table:    array [0..255] of word; // 0x1058
    CharsDataPtr:    Utils.PEndlessShortIntArr;
  end; // .object TFontItem



RE: HD мод - igrik - 05.12.2020 15:22

(05.12.2020 09:09)Berserker Wrote:  Структура шрифта вышла такая:
Code:
{$ALIGN OFF}
    Unk2:            array [1..28] of byte;

Это структура H3BinaryItem, которая относится к твоему Color16Table
Code:
struct H3BinaryItem // constructor 0x558970, size 1C
{
  struct BinaryVTable
  {
      h3func destroy;        
      h3func dereference;
      h3func getSize;
  }*vTable;
  // * +4
  CHAR name[12];
  // * +10
  UINT name_end;
  // * +14
  INT32 type;
  // * +18
  INT32 ref;
};

_H3API_ by RoseKavalier (Click to View)



RE: HD мод - Berserker - 05.12.2020 17:51

igrik, спасибо, палитра тоже наследуется от узла в дереве ресурсов.


RE: HD мод - baratorch - 05.12.2020 18:20

(05.12.2020 09:09)Berserker Wrote:  Я полностью заменил функцию отрисовки символов для 16/32 режимов.
Ну, тогда выпиливай Hota.FontColor из Эры. Я в хд для эры переведу все на эровское расцвечивание. Если теперь есть нормально работающая ф-ия измерения длины строки текста, то этот костыль, да еще и с HotA в названии, точно не к чему.


RE: HD мод - Berserker - 05.12.2020 19:03

baratorch, функцию измерения строки в ближайшее время сделаю через парсинг текста до основного кода. Я вынес парсер текстов в отдельную функцию и провёл рефакторинг. А вот муторная функция разбивки большого текста на массив строк в векторе пока работает по старинке: считает все символы при расчёте, где обрывать строку. Эта функция используется в диалогах с прокруткой и некоторых других текстах.


RE: HD мод - Berserker - 05.12.2020 20:59

Бара, в коде вставки текста в поля ввода по CTRL+V есть фильтрация символов "{" и "}". Можно завести какую-нибудь переменную в патчере, которая бы могла отключить фильтрацию фигурных скобок?

И сама вставка происходит с полной заменой содержимого поля ввода вне зависимости от положения курсора. Так задумано было или проще реализовать?


RE: HD мод - Berserker - 06.12.2020 08:31

baratorch, я проверил, но пока по старому проблема загрузки из боя:
http://wforum.heroes35.net/showthread.php?tid=5844&pid=119151#pid119151

Вкратце: при выходе из текущей игры через меню боя (Load game, Restart scenario, etc) просьба вызвать
FireEvent('$OnGameLeave', nil, 0);

из era.dll

procedure FireEvent (EventName: pchar; {n} EventData: pointer; DataSize: integer); stdcall;


RE: HD мод - Berserker - 06.12.2020 09:08

Quote:int v[4];
CALL_2(void, __thiscall, 0x558320, v, 1);
v[3] = 0;
CALL_4(void, __thiscall, 0x4BEFF0, o_GameMgr, filename, 0, 1);
CALL_1(void, __thiscall, 0x558360, v);
v[3] = -1;
CALL_1(void, __thiscall, 0x558360, v);
У меня даже для той же игры всё портится. Загрузить сохранение таким образом не выходит.


RE: HD мод - igrik - 06.12.2020 10:29

(06.12.2020 08:31)Berserker Wrote:  baratorch, я проверил, но пока по старому проблема загрузки из боя:
http://wforum.heroes35.net/showthread.php?tid=5844&pid=119151#pid119151

Вкратце: при выходе из текущей игры через меню боя (Load game, Restart scenario, etc) просьба вызвать
FireEvent('$OnGameLeave', nil, 0);

из era.dll

procedure FireEvent (EventName: pchar; {n} EventData: pointer; DataSize: integer); stdcall;
Я попробовал решить вопрос без участия baratorch'а, но тут просто не за что уцепиться...
Мой HiHook в 0x46F300 Dlg_BattleOptions_Proc выполняется после HD-шного, и поэтому я не могу отловить нажатия клавиш 500, 501, 502.
Berserker, твой HiHook в ERA будет инициализироваться раньше HD-шного, возможно он и сработает...

baratorch, если тебе не хочется тянуть лишний код из era.dll, то хотя бы в функции выхода сделай доступную для эры указывающую переменную, или id кнопки выхода дай другую.
Code:
// примерный код Берса для реализации своего функционала
int __stdcall Dlg_BattleOptions_CheckExit(LoHook* h, HookContext* c)
{
    // 30722 простой выход из диалога
    // 30723 выход: главное меню, перезагрузка карты и т.п.

    if ( o_WndMgr->result_dlg_item_id == 30723 )
    {
        // тут Берс сам сделает что ему нужно
        // и вернёт
        o_WndMgr->result_dlg_item_id == 30722;
    }

    return EXEC_DEFAULT;
}

_PI->WriteLoHook(0x46F2ED, Dlg_BattleOptions_CheckExit);



RE: HD мод - Berserker - 06.12.2020 17:31

igrik, а что там тянуть?

if GetModuleHandle(...) then CALL_3(...GetProcAddress(...)).

Обработки кнопок — не выход. Костылища. Если с любого места можно прыгнуть в меню верхних уровней вне текущего диалога карты приключений, то лучше сгенерировать событие.


RE: HD мод - baratorch - 06.12.2020 19:24

Я в хд для эры заменил способ выхода из битвы на другой (разработан он был давно).
Без низкоуровневой магии с регистрами и джампами.
Для каждого окна (опции битвы, битва, окно приключений) оконная процедура (процедура менеджера в случае битвы и приключений) возвращает стандартный код завершения,
так же как это происходит в оригинале.

Опции битвы:
Code:
        msg->type = 512;
        msg->item_id = 10;
        msg->subtype = 10;
        o_WndMgr->result_dlg_item_id = 30722;
        return 2;
Битва:
Code:
            msg->type = 0x4000;
            msg->subtype = 1;
            return 2;
Приключения:
Code:
            msg->type = 0x4000;
            msg->subtype = 1;
            o_WndMgr->result_dlg_item_id = 0x66 или 0x6c или 0x6b;
            DwordAt(0x697728) = 0x66 или 0x6c или 0x6b;
            return 2;
То есть, после закрытия битвы, выход из окна приключений происходит в точности так, как это происходит при выходе через системные опции окна приключений.

Забыл написать об этом изменении. Но если эра при этом все-равно не узнаёт о выходе. Значит она узнаёт о выходе неправильно.
Мне добвавить вызов FireEvent('$OnGameLeave', nil, 0);
не проблема. Но я думал, что изменение способа выхода из битвы сделает это не нужным.


RE: HD мод - Berserker - 06.12.2020 20:04

Всё в порядке. Обновился. Событие больше не нужно. Такой выход очень корректен и оптимален.


RE: HD мод - igrik - 12.12.2020 16:51

(11.12.2020 01:19)Berserker Wrote:  У меня одного подсказка в городе отрисовывается обрезанной? Последний HD mod, 32 bits direct draw.
Именно при наведении на название города со включённым скриптом на переименование городов, когда задаётся своя подсказка. (Click to View)

Как я понимаю, для окна города baratorch меняет картинку HD_TownS.bmp, и в этом случае для хинта города видимо неправильно сделана формула подсчёта координаты Y по адресу 0x71286C.
Т.е.:
- для разрешения Y= 664 начальная координата Y должна быть 610 px
- для разрешения Y= 768 начальная координата Y должна быть 662 px
- для разрешения Y=1080 начальная координата Y должна быть 818 px


Code:
Должно быть Y=664:  (664/2)+(556/2) = 610,  а сейчас в HD  620 = 556 + (664-600 = 64)
Должно быть Y=768:  (768/2)+(556/2) = 662,  а сейчас в HD  724 = 556 + (768-600 = 168)
Должно быть Y=1080: (1080/2)+(556/2) = 818, а сейчас в HD 1036 = 556 + (1080-600 = 480)

// собственно сама формула:
_PI->WriteDword(0x71286C + 1, HD_Y_Center + 278);



RE: HD-mod - XEPOMAHT - 14.12.2020 17:13

Большая, ну просто гигантская просьба использовать в HD_WOG.dll:

1. в 2-х местах кода вызов воговской функции GetMineBase 0x71301C для получения структуры шахт вместо получения её по прямому адресу
2. в 2-х местах кода вызов воговской GetDwellingBase 0x711D66 или 0x712EEC (любую из двух) для получения структуры жилища монстра aka внешнего генератора
3. в 2-х местах кода вызов воговской GetHornBase для получения структуры гарнизона


(в данный момент приходится патчить HD_WOG.dll вручную а потом ещё учить плохому этому пользователей ERA+ после каждого обновления HD-мода, или придётся написать автоматический патчер для HD_WOG.dll).


RE: HD-mod - Berserker - 21.12.2020 02:12

Бара, в коде Delphi часть функций, оптимизированных с использованием FPU registers, время от времени работает с багами. Пишут, что это проблема дравйвера или кода, что неверно восстанавливает состояние FPU. HD-мод можно исключить?


RE: HD-mod - baratorch - 25.12.2020 12:50

(14.12.2020 17:13)XEPOMAHT Wrote:  Большая, ну просто гигантская просьба использовать в HD_WOG.dll:

1. в 2-х местах кода вызов воговской функции GetMineBase 0x71301C для получения структуры шахт вместо получения её по прямому адресу
2. в 2-х местах кода вызов воговской GetDwellingBase 0x711D66 или 0x712EEC (любую из двух) для получения структуры жилища монстра aka внешнего генератора
3. в 2-х местах кода вызов воговской GetHornBase для получения структуры гарнизона

(в данный момент приходится патчить HD_WOG.dll вручную а потом ещё учить плохому этому пользователей ERA+ после каждого обновления HD-мода, или придётся написать автоматический патчер для HD_WOG.dll).

Вроде сделал. (Только для TE/ERA. Для WoG осталось по-старому).


RE: Техническая тема по HD-mod - igrik - 24.01.2021 00:57

baratorch, в HD нужно снять хук с адреса 0x74FC45 и восстановить действие оригинальной команды
Code:
0074FC45 MOV EAX,DWORD PTR DS:[0A90D58]

В настоящее время с этим хуком некоторые команды ERM работают неправильно (например в получении координат в битве через ERM творится что-то адски неясное)


RE: Техническая тема по HD-mod - baratorch - 09.02.2021 18:04

(24.01.2021 00:57)igrik Wrote:  baratorch, в HD нужно снять хук с адреса 0x74FC45 и восстановить действие оригинальной команды
Code:
0074FC45 MOV EAX,DWORD PTR DS:[0A90D58]

В настоящее время с этим хуком некоторые команды ERM работают неправильно (например в получении координат в битве через ERM творится что-то адски неясное)
Попробуйте заново в последней RC26 версии хд проверить как там с координатами.
Хук я не убирал, но исправил.
Было:
Code:
        _EventMsg_* msg = *(_EventMsg_**)0xA90D58;
        msg->x_abs -= hdv(int, "HD.Center.X");
        msg->y_abs -= hdv(int, "HD.Center.Y");
        return EXEC_DEFAULT;
И это работало как надо, пока координаты окна битвы были такими до появления дополнительной полосы внизу окна.
Стало:
Code:
        _EventMsg_* msg = *(_EventMsg_**)0xA90D58;
        msg->x_abs -= hdv(int, "HD.Battle.X");
        msg->y_abs -= hdv(int, "HD.Battle.Y");
        return EXEC_DEFAULT;
Сам я ничего не проверял, но этот хук в свое время появился не просто так, я думаю.


RE: Техническая тема по HD-mod - daemon_n - 09.02.2021 18:26

baratorch, может, я что-то неправильно проверяю, (RC 26) но:


Разрешение 1180x664
координаты при клике на нижнем/левом гексе -68/504 (Click to View)

Разрешение 1600x900
координаты при клике на нижнем/левом гексе -254/392 (Click to View)

Разрешение 1200x800
координаты при клике на нижнем/левом гексе -95/453 (Click to View)

Разрешение 1180x664
почти 0/0 находится там, где правый верхний угол (Гора) (Click to View)

Разрешение 1600x900
почти 0/0 находится там, где тень (Click to View)

Разрешение 1200x800
почти 0/0 находится там, где тень (Click to View)



RE: Техническая тема по HD-mod - daemon_n - 09.02.2021 21:42

baratorch, прошу прощения.

Заметил вот что.

Увеличение разрешения по какой-либо оси вызывает смещение на половину от добавленного разрешения.

То есть выставили мы 1600x900 , и будет смещение на 400/145.

Задумано ли так? Главное, что есть теперь закономерность.

UPD: 664px+ по y-оси увеличивает поле на 20/22? пикселей - именно это и было исправлено

В Версии 5.21 был неверный ответ (лишь по y) из--за этой самой полоски.

Но не это вызывает дичь105


RE: Техническая тема по HD-mod - igrik - 10.02.2021 12:11

(09.02.2021 18:04)baratorch Wrote:  Сам я ничего не проверял, но этот хук в свое время появился не просто так, я думаю.
baratorch, а я проверял. И поэтому прошу - убери этот хук вообще (0x74FC45)

И ещё просьба, можно для ERA включить твик:
Code:
<UI.Battle.ShowAlwaysHeroInfo> = 1



RE: Техническая тема по HD-mod - igrik - 12.02.2021 10:55

baratorch, спасибо за внесённые изменения!


RE: Техническая тема по HD-mod - Panda - 13.02.2021 00:16

baratorch, спасибо за обновления и исправления! 132
Выявили ещё одну проблему: игра не запускается - выдаёт критическую ошибку, если в режиме "Verok" поставить фильтр "Cubic". Версия HD Mod 5.2 RC28.

Image: unknown.png


RE: HD-mod. Общая тема - Berserker - 28.03.2021 05:55

baratorch, исправь, пожалуйста, один существенный баг в твоей реализации диалога выбора файла. Игра по умолчанию считывает имя файла, который нужно выделить активным в списке, из буфера 68338C. С каких-то пор HD-мод тупо сохраняет индекс последнего выбранного файла в списке и всегда выделяет элемент по этому индексу. В результате программные сохранения через ЕРМ и плагины не выделяют файлы в списке и игроки теряются, какой файл им загружать.


RE: HD-mod. Баги и доработки - ilya - 07.05.2021 20:06

У меня игровая сборка Era 2.8.3 от igrik и точно не понимаю что относится к HD mod, а что к особенностям сборки.

1 Игнорирование опции <UI.Battle.ShowAlwaysHeroInfo> = 1 (Исправилось при обновлении с 5.2 RC7 до 5.2 RC34)
2 Игнорируются опции <UI.RecruitDlg.AutoSet> = 0 и/или <UI.RecruitDlg.AutoSet.Max> = 0 всегда дополняет до максимума.
3 Не работает подбор подходящего артефакта в слот по СКМ, при этом костюмы работают.
4 Не работает HD-ная шкала инициативы. Есть мод BattleQueue, но хочется использовать нативную HD-ную, если возможно.
5 Игнорируется директория CD Data (отсутствует ролик смерти и ролик завершения компании (огнедышащий дракон)).
Модом Видео-заставки кампаний исправляется, но не понятно почему не работает через CD Data.

6 Так же есть ещё одна проблема для любителей играть в компании RoE и AB. а также SoD.
Для компаний RoE и AB нужен один набор Heroes3.snd/Heroes3.vid из диска AB от Бука,
а для SoD другой набор из диска SoD от Бука, конечно же с одинаковыми именами и в одной директории CD Data.
В Linux я эту проблему решаю скриптами создающие симлинк на нужную в данный момент директорию, но хотелось бы или иметь
скрещенный ресурс RoE/AB/SoD или чтобы HD mod имел дополнительную директорию CD Data AB для RoE/AB и обращался к ней,
если в CD Data нет нужных ресурсов.


RE: HD-mod. Баги и доработки - Berserker - 08.05.2021 07:14

Бара, спасибо большое за исправление выделения файлов в диалоге сохранения/загрузки.

РЕализовал в Эре поддержку png вместо def/pcx через перехват функций отрисовки. Работает отлично во всех режимах HD и без. Но есть проблема с опцией «Системные курсоры» и def-ом артефактов.

Как только курсор меняется на артефактный, появляется сизый прямоугольник. PNG выводится с полупрозрачностью, сизого цвета там нет. Не ясен механизм этой опции в HD-моде.
Если опция отключена, но есть полупрозрачные пиксели, то виден муар из сизого.

Image: image.png

Image: image.png


RE: HD-mod. Баги и доработки - daemon_n - 24.05.2021 09:44

(07.05.2021 20:06)ilya Wrote:  У меня игровая сборка Era 2.8.3 от igrik и точно не понимаю что относится к HD mod, а что к особенностям сборки.

1 Игнорирование опции <UI.Battle.ShowAlwaysHeroInfo> = 1 (Исправилось при обновлении с 5.2 RC7 до 5.2 RC34)
2 Игнорируются опции <UI.RecruitDlg.AutoSet> = 0 и/или <UI.RecruitDlg.AutoSet.Max> = 0 всегда дополняет до максимума.
3 Не работает подбор подходящего артефакта в слот по СКМ, при этом костюмы работают.
4 Не работает HD-ная шкала инициативы. Есть мод BattleQueue, но хочется использовать нативную HD-ную, если возможно.
5 Игнорируется директория CD Data (отсутствует ролик смерти и ролик завершения компании (огнедышащий дракон)).
Модом Видео-заставки кампаний исправляется, но не понятно почему не работает через CD Data.

6 Так же есть ещё одна проблема для любителей играть в компании RoE и AB. а также SoD.
Для компаний RoE и AB нужен один набор Heroes3.snd/Heroes3.vid из диска AB от Бука,
а для SoD другой набор из диска SoD от Бука, конечно же с одинаковыми именами и в одной директории CD Data.
В Linux я эту проблему решаю скриптами создающие симлинк на нужную в данный момент директорию, но хотелось бы или иметь
скрещенный ресурс RoE/AB/SoD или чтобы HD mod имел дополнительную директорию CD Data AB для RoE/AB и обращался к ней,
если в CD Data нет нужных ресурсов.

1 - .
2 - wog native dialogs плагин
3 - оно и не сделано для ERA
4 - оно и не сделано для ERA
5 - это не та директория - используй \_HD3_Data\Compability\#era, или \data любого мода, или корень любого плагина для hd mod
6 - тот же ответ


RE: HD-mod. Баги и доработки - Shishgun - 30.05.2021 09:34

Quote:2 Игнорируются опции <UI.RecruitDlg.AutoSet> = 0 и/или <UI.RecruitDlg.AutoSet.Max> = 0 всегда дополняет до максимума.
Выставляешь <UI.RecruitDlg.AutoSet> = 1 <UI.RecruitDlg.AutoSet.Max> = 0 и вуаля


RE: HD-mod. Баги и доработки - Valery - 30.05.2021 17:32

bug report:

On 5.2 R36 single split stacks loses all experience.


RE: HD-mod. Баги и доработки - daemon_n - 31.05.2021 15:56

Valery, old bug - ctrl+left-click, ctrl+shift+left-click and ctrl+shift+alt+left-click.
Shift+left-click works well.

I ve tried to fix that via erm, but no succes, cause erm can't catch those clicks - we need exported functions from hd_wog.dll of those actions

P.S.: remove "-" from link in your signature at the end, cause now link is wrong.


RE: HD-mod. Баги и доработки - Berserker - 31.05.2021 16:54

Бараторч, нам бы хотелось-таки иметь возможность блокировать реакции щелчков через ЕРМ/Lua. Если HD-мод обрабатывает события раньше WoG/Era, мы полностью теряем программный контроль и расширяемость.


RE: HD-mod. Баги и доработки - daemon_n - 31.05.2021 17:44

Berserker, или, как вариант, получить доступ к выполняемым функциям?


RE: HD-mod. Баги и доработки - Berserker - 31.05.2021 18:04

daemon_n, вопрос не понял, но не думаю, что это вариант интересный. Обработчики HD нужно ставить после воговских.


RE: HD-mod. Баги и доработки - igrik - 31.05.2021 21:18

(31.05.2021 18:04)Berserker Wrote:  daemon_n, вопрос не понял, но не думаю, что это вариант интересный. Обработчики HD нужно ставить после воговских.

А как их можно контролировать/поставить после воговких?, если в HD там идут ХайХуки типа Сплайс (которые ставятся в начало функции), а Вог коряво ставит что-то вроде ЛоуХука (т.е. в середине функции):
Code:
// код в HD что-то типо этого:
_PI->WriteHiHook(0x4DD540, SPLICE_, EXTENDED_, THISCALL_, DlgHero_Proc);
_PI->WriteHiHook(0x5D3640, SPLICE_, EXTENDED_, THISCALL_, DlgTown_Proc);

Эра же грузится раньше HD-мода, значит и сплайс хуки Эры будут создаваться и выполняться раньше. И тогда уже ЭРЕ нужно обрабатывать код для подготовки оного для ERM, а потом передавать управление дальше по списку хуков другим перехватчикам.

А если в HD попробовать поставить хуки после ВОГовских (которые аля ЛоуХук), то Бараторчу придётся перелапачивать тонну кода. Сомневаюсь, что он это будет делать. Вот прям уверен на все 100, что он этого делать не будет, и тем более удалять уже с годами проверенный код в угоду контроля ERM, который нужен от силы паре единиц людей. Ему тогда уже проще вырезать Быстрое Управление Армиями, но я тогда посмотрю как народ запоёт Ab


RE: HD-mod. Баги и доработки - Berserker - 31.05.2021 21:34

igrik, не запоёт. Написать скрипты можно (десятилетия как были разные варианты), отключить HD — нет. Ничего, что у меня в Фениксе свой диалог на CTRL + ЛКМ по отряду, например? Тогда да, придётся отключать через ini быстрое управление армиями.


RE: HD-mod. Баги и доработки - igrik - 31.05.2021 22:18

(31.05.2021 21:34)Berserker Wrote:  igrik, не запоёт. Написать скрипты можно...
Здаётся мне ты максимально не дооцениваешь этот функционал и потребность людей в нём. Ну ладно, это уже из темы флуда.


RE: HD-mod. Баги и доработки - Berserker - 31.05.2021 23:30

igrik, эм, этот функционал был ещё в Heroes 3 Tournament Edition, откуда исполняемый файл Эры. На обычном ЕРМ, где ему и место. Но тогда работал перехват любых щелчков по любым элементах диалогов. А завтра Бара уедет жить в Сомали, что тогда? Хорошо, что быстрое управление отключаемо через твики.


RE: HD-mod. Баги и доработки - daemon_n - 01.06.2021 02:11

Возвращаемся к моему предложению, где просим Бараторча поделиться функциями. И вариант с Сомали уже не так страшен будет Yes


RE: HD-mod. Баги и доработки - Berserker - 01.06.2021 02:28

daemon_n, как ты себе это представляешь?


RE: HD-mod. Баги и доработки - Valery - 01.06.2021 02:38

(31.05.2021 15:56)daemon_n Wrote:  I ve tried to fix that via erm, but no succes, cause erm can't catch those clicks - we need exported functions from hd_wog.dll of those actions

Are you sure? because we already created sorta HD for Era before, with experience transfer, split equal and single, so it was doable


RE: HD-mod. Баги и доработки - daemon_n - 01.06.2021 03:58

Valery, yes, i am. ERM doesn't see Ctr/shift/alt + left mouse press on the creatures, if they were made for hd mod creatures split . It only works for Ctr/shift/alt + left mouse release, but for that mouse cursor should cover creature portrait, when you release the mouse button

Berserker, спросить лично105


RE: HD-mod. Баги и доработки - Berserker - 01.06.2021 04:54

daemon_n, твой капс нисколько не помогает воспринимать текст, жирного бы хватило. Капс — это крик.



RE: HD-mod. Баги и доработки - XEPOMAHT - 01.06.2021 17:12

(31.05.2021 16:54)Berserker Wrote:  нам бы хотелось-таки иметь возможность блокировать реакции щелчков через ЕРМ/Lua. Если HD-мод обрабатывает события раньше WoG/Era, мы полностью теряем программный контроль и расширяемость.

Поставь перехват перед перехватом HD-мода. Воговский код думаю проще поменять, нежели просить подвинуть хуки HD-мода.

Например, чтобы выводить кастомные def-ы для героев на карте, пришлось в Тифоне маневрировать, ставя перехваты "до", "во время" и "после" выполнения функций HD-мода, замещающих целые вереницы содовских функций (Бараторч очень, ну очень любит перехватывать функции целиком, да и Берсеркер сейчас тоже так делает в ERA, из-за чего так же приходится шевелить мозгами, чтобы перехватить нужный код, очень часто какими-то дикими костылями, за что программисты точно руки оторвут, поэтому я не выкладываю исходные коды, ибо стыдоба). 148

К примеру, сейчас думаю над вырезанием из Тифона функционала по окрашиванию радара нужными цветами в нужных местах радара. И всё потому, что HD-мод красит радар сам, выкинув содовскую функцию в утиль, соответственно, красить на ERA можно только без HD. Вообще много что из игрового интерфейса на ERA+HD mod хрен так просто поменяешь. 148


RE: HD-mod. Баги и доработки - igrik - 01.06.2021 18:52

(01.06.2021 17:12)XEPOMAHT Wrote:  Бараторч очень, ну очень любит перехватывать функции целиком, да и Берсеркер сейчас тоже так делает в ERA, из-за чего так же приходится шевелить мозгами, чтобы перехватить нужный код, очень часто какими-то дикими костылями
Потому что такой способ установки хука (а точнее это HiHook типа SPLICE в patcher_x86) наиболее безопасный и безконфликтный способ установки хуков, а также ну очень удобный.

Приведу цитату Бараторча:
Бараторч Wrote:Используя высокоуровневый хук, мы заставляем игру вызывать вместо ее функции - нашу. Наша функция при этом имеет (должна иметь) тот же интерфейс что и оригинальная, т.е. тот же возвращаемый тип и те же аргументы.
Здесь мы совершенно не запариваемся ни о каких низкоуровневых вещах - содержимом регистров и состоянием стэка, и т.п. Нам совершенно не нужно знать ассемблерный контекст вызова. Поэтому я назвал этот тип Хука - высокоуровневым

Но я в HD использую в основном именно ХайХуки - ибо с ними код гораздо более читаемый, удобный для правок, безопасный и минимально конфликтен с другими модификациями.
© тема patcher_x86
Именно поэтому Бараторч и ставит такие хуки на целые функции.
Берсеркер сейчас так же делает. Я в подавляющем большинстве случаев так делаю в своих плагинах.


RE: HD-mod. Баги и доработки - Berserker - 01.06.2021 19:47

Такой вариант подходит либо для полного переписывания кода функции, либо для действия + подмены аргументов. Много мест, где в разы менее трудозатратно только в небольшом месте сделать перехват. Тут нет единого «хорошо»/«плохо». Есть скорее плюсы и минусы. Где возможно — перехват всей функции. Где нецелесообразно — правки в отдельных местах.

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);



RE: HD-mod. Баги и доработки - baratorch - 26.06.2021 07:43

(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 кадра и выполняется свой код отрисовки в курсор.


RE: HD-mod. Баги и доработки - Panda - 26.06.2021 07:53

baratorch, доброго утра!
Начиная с версии HD-мод 5.2 RC41, начал ставится старый патчер "patcher_x86.dll" от 17 октября 2018, хотя раньше патчер был от 12 января 2021. Это просто баг, или была причина вернуть старую версию патчера и с новой имеются какие-то проблемы? Спасибо!


RE: HD-mod. Баги и доработки - Berserker - 26.06.2021 18:58

baratorch, функция отрисовки кадра у меня перехвачена после HD. Отрисовка идёт из BGRA буфера внешней структуры (от дефа только имя + номер кадра) по правилам PNG, то есть с поддержкой полупрозрачности. Но складывается ощущение, что рисуем по сизому фону, либо с какой-то замороченной пост-обработкой. Потому как везде рисуется корректно, а в курсорах с заливкой.

Можешь скинуть часть кода, который работает с курсорами?


RE: HD-mod. Баги и доработки - Panda - 30.06.2021 10:13

baratorch, и ещё просьба, можно для ERA включить следующие твики:
<UI.RecruitDlg.AutoSet> = 1
<UI.Ext.AdvMgr> = 1 , 1 , 1

Rolleyes


RE: HD-mod. Баги и доработки - Berserker - 18.09.2021 20:32

В окне встречи героев не срабатывает воговский код при ПКМ на артефактах в рюкзаке. ЕРМ не ловит событие. Такое поведение ломает скрипты и доп. функциониальность Эры. Другие щелчки и ПКМ на кукле обрабатываются ВоГ-ом на ура.


RE: HD-mod. Баги и доработки - Berserker - 19.09.2021 21:31

Спасибо большое. Пока что поддержка png для pcx и def отлично дружат с HD-модом, даже опция системных курсоров работает корректно. Красота! )
Разве что в окне встречи героев ПКМ на артефактах в рюкзаке перестало обрабатываться вогом.