05.12.2020, 00:37
05.12.2020, 06:55
(05.12.2020 00:37)Berserker Wrote: [ -> ]Бара, в HD моде поле _int_ height в структуре _Fnt_ неверное. Там байт, а не int32.
Спасибо, но оно уже давно там байт.
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
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)
Code:
struct H3Font : public H3BinaryItem
{
struct H3SymbolSize
{
INT32 width;
INT32 left;
INT32 right;
};
// * +1C
UINT8 first;
// * +1D
UINT8 last;
// * +1E
UINT8 depth;
// * +1F
INT8 xspace;
// * +20
INT8 yspace;
// * +21
UINT8 height;
h3unk _f_22[26];
// * +3C
// UINT8 width[3072]; // used to calculate line width
H3SymbolSize symbolSizes[256]; // used to calculate line width
// * +C3C
UINT32 bufferOffsets[256]; // referenced at 0x4B4F1C
// * +103C
H3Palette565 palette;
// * 1258
PUINT8 bitmapBuffer; // how the characters look
// * +125C
INT32 bufferSize;
};
struct H3Palette888 : public H3BinaryItem
{
// * +1C
H3RGB888 color[256];
};
05.12.2020, 17:51
igrik, спасибо, палитра тоже наследуется от узла в дереве ресурсов.
05.12.2020, 18:20
(05.12.2020 09:09)Berserker Wrote: [ -> ]Я полностью заменил функцию отрисовки символов для 16/32 режимов.Ну, тогда выпиливай Hota.FontColor из Эры. Я в хд для эры переведу все на эровское расцвечивание. Если теперь есть нормально работающая ф-ия измерения длины строки текста, то этот костыль, да еще и с HotA в названии, точно не к чему.
05.12.2020, 19:03
baratorch, функцию измерения строки в ближайшее время сделаю через парсинг текста до основного кода. Я вынес парсер текстов в отдельную функцию и провёл рефакторинг. А вот муторная функция разбивки большого текста на массив строк в векторе пока работает по старинке: считает все символы при расчёте, где обрывать строку. Эта функция используется в диалогах с прокруткой и некоторых других текстах.
05.12.2020, 20:59
Бара, в коде вставки текста в поля ввода по CTRL+V есть фильтрация символов "{" и "}". Можно завести какую-нибудь переменную в патчере, которая бы могла отключить фильтрацию фигурных скобок?
И сама вставка происходит с полной заменой содержимого поля ввода вне зависимости от положения курсора. Так задумано было или проще реализовать?
И сама вставка происходит с полной заменой содержимого поля ввода вне зависимости от положения курсора. Так задумано было или проще реализовать?
06.12.2020, 08:31
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;
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;
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);
06.12.2020, 10:29
(06.12.2020 08:31)Berserker Wrote: [ -> ]baratorch, я проверил, но пока по старому проблема загрузки из боя:Я попробовал решить вопрос без участия 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;
Мой 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);
06.12.2020, 17:31
igrik, а что там тянуть?
if GetModuleHandle(...) then CALL_3(...GetProcAddress(...)).
Обработки кнопок — не выход. Костылища. Если с любого места можно прыгнуть в меню верхних уровней вне текущего диалога карты приключений, то лучше сгенерировать событие.
if GetModuleHandle(...) then CALL_3(...GetProcAddress(...)).
Обработки кнопок — не выход. Костылища. Если с любого места можно прыгнуть в меню верхних уровней вне текущего диалога карты приключений, то лучше сгенерировать событие.
06.12.2020, 19:24
Я в хд для эры заменил способ выхода из битвы на другой (разработан он был давно).
Без низкоуровневой магии с регистрами и джампами.
Для каждого окна (опции битвы, битва, окно приключений) оконная процедура (процедура менеджера в случае битвы и приключений) возвращает стандартный код завершения,
так же как это происходит в оригинале.
Опции битвы:
Битва:
Приключения:
То есть, после закрытия битвы, выход из окна приключений происходит в точности так, как это происходит при выходе через системные опции окна приключений.
Забыл написать об этом изменении. Но если эра при этом все-равно не узнаёт о выходе. Значит она узнаёт о выходе неправильно.
Мне добвавить вызов FireEvent('$OnGameLeave', nil, 0);
не проблема. Но я думал, что изменение способа выхода из битвы сделает это не нужным.
Без низкоуровневой магии с регистрами и джампами.
Для каждого окна (опции битвы, битва, окно приключений) оконная процедура (процедура менеджера в случае битвы и приключений) возвращает стандартный код завершения,
так же как это происходит в оригинале.
Опции битвы:
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);
не проблема. Но я думал, что изменение способа выхода из битвы сделает это не нужным.
06.12.2020, 20:04
Всё в порядке. Обновился. Событие больше не нужно. Такой выход очень корректен и оптимален.
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);