Current time: 18.05.2024, 07:27 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
HD-mod. Баги и доработки
Author Message
Berserker Offline
Administrators

Posts: 16511
Post: #16

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

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


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
23.11.2020 03:33
Find all posts by this user Quote this message in a reply
Raistlin Away
Moderators

Posts: 1348
Post: #17

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


Создал новый глобальный мод: WoG Ultra Edition
23.11.2020 03:36
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2284
Post: #18

(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.
(This post was last modified: 23.11.2020 11:14 by XEPOMAHT.)
23.11.2020 11:12
Find all posts by this user Quote this message in a reply
Raistlin Away
Moderators

Posts: 1348
Post: #19

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


Создал новый глобальный мод: WoG Ultra Edition
23.11.2020 20:02
Find all posts by this user Quote this message in a reply
feanor Offline

Posts: 622
Post: #20

Господи. Какие пятьдесят хуков, один на общую функцию отрисовки кадров оО
Но давайте с этим в проекты, это к HD реально отношения не имеет?
(This post was last modified: 23.11.2020 21:14 by feanor.)
23.11.2020 21:10
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16511
Post: #21

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


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
23.11.2020 22:16
Find all posts by this user Quote this message in a reply
feanor Offline

Posts: 622
Post: #22

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

Альфа вообще хуки ставит, кмк, чуть ниже, чем надо - на отрисовку структуры DefCadre вместо практически повсеместно используемых оберток DefDraw, которые в качестве параметров принимают _Def_*, номер группы и номер кадра. Надо по дереву вызовов, конечно, посмотреть, а то забыл уже - но, по-моему, они действительно покрывают все использования.
Из-за этого, например, возникло такое сомнительное решение, как использование внутренних имен кадра вместо какого-нибудь деф_группа_кадр.png
23.11.2020 22:45
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2284
Post: #23

(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).
(This post was last modified: 23.11.2020 23:03 by XEPOMAHT.)
23.11.2020 22:54
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16511
Post: #24

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


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
23.11.2020 23:29
Find all posts by this user Quote this message in a reply
feanor Offline

Posts: 622
Post: #25

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

pcx'ы, если говорить о конкретном случае, можно вообще создать заранее, 999 восьмибитных 56*64 (или сколько там кадр) много памяти не сожрут. Если не о конкретном, а вообще, то либо на loaddef ставить, либо в отрисовке же - ленивая инициализация в словарь
24.11.2020 00:06
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2284
Post: #26

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

Верно, так проще, но работать будет медленно, если каждый def проверять на имя спрайта (т.к. проверка будет на все дефы в игре). И совместимость с фильтрами HD-мода будет под вопросом (та же история, что с плагином альфа.длл, в котором графика может не отрисовываться, например у меня она не отрисовывалась ни в какую).
24.11.2020 00:20
Find all posts by this user Quote this message in a reply
daemon_n Offline
Administrators

Posts: 4338
Post: #27

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


Image: widget.png?style=banner2

Новейший Heroes Launcher
24.11.2020 02:50
Visit this user's website Find all posts by this user Quote this message in a reply
baratorch Offline

Posts: 197
Post: #28

(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 в Хд и Хота и все это работает как задумано вместе.
(This post was last modified: 24.11.2020 14:25 by baratorch.)
24.11.2020 14:25
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16511
Post: #29

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


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
24.11.2020 17:45
Find all posts by this user Quote this message in a reply
baratorch Offline

Posts: 197
Post: #30

(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);
24.11.2020 21:32
Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Forum Jump:

Powered by MyBB Copyright © 2002-2024 MyBB Group