Current time: 23.04.2024, 10:55 Hello There, Guest! (LoginRegister)
Language: english | russian  

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

Posts: 16488
Post: #91

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


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

Posts: 197
Post: #92

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

Спасибо, но оно уже давно там байт.
05.12.2020 06:55
Find all posts by this user Quote this message in a reply
Berserker Online
Administrators

Posts: 16488
Post: #93

Я полностью заменил функцию отрисовки символов для 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


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

Posts: 2814
Post: #94

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


game bug fixes extended.dll || My Plugins || My GitHub
05.12.2020 15:22
Visit this user's website Find all posts by this user Quote this message in a reply
Berserker Online
Administrators

Posts: 16488
Post: #95

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


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

Posts: 197
Post: #96

(05.12.2020 09:09)Berserker Wrote:  Я полностью заменил функцию отрисовки символов для 16/32 режимов.
Ну, тогда выпиливай Hota.FontColor из Эры. Я в хд для эры переведу все на эровское расцвечивание. Если теперь есть нормально работающая ф-ия измерения длины строки текста, то этот костыль, да еще и с HotA в названии, точно не к чему.
05.12.2020 18:20
Find all posts by this user Quote this message in a reply
Berserker Online
Administrators

Posts: 16488
Post: #97

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


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

Posts: 16488
Post: #98

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

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


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

Posts: 16488
Post: #99

baratorch, я проверил, но пока по старому проблема загрузки из боя:
http://wforum.heroes35.net/showthread.ph...#pid119151

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

из era.dll

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


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

Posts: 16488
Post: #100

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);
У меня даже для той же игры всё портится. Загрузить сохранение таким образом не выходит.


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

Posts: 2814
Post: #101

(06.12.2020 08:31)Berserker Wrote:  baratorch, я проверил, но пока по старому проблема загрузки из боя:
http://wforum.heroes35.net/showthread.ph...#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);


game bug fixes extended.dll || My Plugins || My GitHub
06.12.2020 10:29
Visit this user's website Find all posts by this user Quote this message in a reply
Berserker Online
Administrators

Posts: 16488
Post: #102

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

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

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


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

Posts: 197
Post: #103

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

Опции битвы:
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);
не проблема. Но я думал, что изменение способа выхода из битвы сделает это не нужным.
(This post was last modified: 06.12.2020 19:34 by baratorch.)
06.12.2020 19:24
Find all posts by this user Quote this message in a reply
Berserker Online
Administrators

Posts: 16488
Post: #104

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


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

Posts: 2814
Post: #105

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


game bug fixes extended.dll || My Plugins || My GitHub
12.12.2020 16:51
Visit this user's website 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