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

Full Version: Плагины. Обсуждение
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
(11.11.2025 21:09)daemon_n Wrote: [ -> ]
(11.11.2025 12:25)XEPOMAHT Wrote: [ -> ]Так же у тебя отсутствует получение максимального количества героев в игре, т.е. данный код с Тифоном несовместим:

Code:
if (heroID >= 0 && heroID < 156)

Как именно (откуда и когда) предлагаешь получать число героев?

В теме базовой адресации можно узнать:

(03.12.2021 23:32)XEPOMAHT Wrote: [ -> ]2. Структура героев:

* Базовый адрес - не потребуется, т.к. в рамках совместимости с плагинами он сохранён неизменным.
* Количество героев в игре = [4BD145h]

Считывать адрес можно после триггера AfterWog, но не в самом триггере, т.к. Тифон все патчи ставит после эровского AfterWog.
(11.11.2025 12:25)XEPOMAHT Wrote: [ -> ]
текст сообщения

Всё исправил, но "полуросликов" заменил на
Code:
if (Era::IsCommanderId(stack->creature_id))
        {
            // может иметь двойную атаку
            c->return_address = 0x441BB1;
        }

UPD: Сборка обновлена:
Вот ссылка на файл .dll:
game bug fixes extended.dll

Вот ссылка на файл .dbgmap:
game bug fixes extended.dbgmap
(13.11.2025 06:31)daemon_n Wrote: [ -> ]   if (Era::IsCommanderId(stack->creature_id))

Спасибо, теперь осталось узнать у Берсеркера, откуда он берёт IsCommanderId, т.к. в исходниках ЭРЫ я ничего об этом не нашёл. В ERA+ командиры имеют индексы 174..186 (левосторонние) и 256..268 (правосторонние), ну и в Тифоне командиры тоже никак не помечены аналогично ВоГ-у. 105

(13.11.2025 06:31)daemon_n Wrote: [ -> ]Сборка обновлена:

Спасибо за поддерку!
Code:
function IsCommanderId (MonId: integer): TInt32Bool; stdcall;
function SetIsCommanderIdFunc (NewImpl: TIsCommanderIdFunc): {n} TIsCommanderIdFunc; stdcall;
function IsCommanderId (MonId: integer): TInt32Bool; stdcall;
begin
  result := IsCommanderIdFunc(MonId);
end;

function SetIsCommanderIdFunc (NewImpl: TIsCommanderIdFunc): {n} TIsCommanderIdFunc; stdcall;
begin
  result            := @IsCommanderIdFunc;
  IsCommanderIdFunc := @NewImpl;
end;

function ImplIsCommanderId (MonId: integer): TInt32Bool; stdcall;
begin
  result := ord((MonId >= Heroes.MON_COMMANDER_FIRST_A) and (MonId <= Heroes.MON_COMMANDER_LAST_D));
end;

Это функция, которую можно заменить на свою, вызвав SetIsCommanderIdFunc и передав адрес новой функции с тем же соглашением вызова (stdcall).
По умолчанию сравнивает ИД монстра с начальным и конечным ИД командиров в вог 3.58. Но моды-расширения могут её заменить.
Так же последняя версия плагина "wog native dialogs.era" начала терять текст в команде "!!IF:D#/$1/$2/$3/$4/$5/$6/$7/$8/$9/$10/$11/$12/$13/$14/$15", а именно здесь:

Code:
$12 – выбор 1 (окно ввода) – текст кнопки
        $13 – выбор 2 (окно ввода) – текст кнопки
        $14 – выбор 3 (окно ввода) – текст кнопки
        $15 – выбор 4 (окно ввода) – текст кнопки

Пример ERM-команды, в которой плагин теряет текст (не с 1 раза, а обычно с 3 при вызове команды в разных местах, если вызывать в 1, т.е. один и тот же по нескольку раз, то вылета нет):

Code:
!!IF:D99/z100040/0/z100041/^Zmap%X2.pcx^/0/0/0/z1/0/0/0/z100042/z100043/z100044/z100045 E1/99;

К сожалению, старую версию плагина от Игрика последняя ЭРА не грузит без объяснения причин (старая ЭРА ругалась при фаталити в загрузке плагина, новая - предательски молчит), поэтому проверить эту утечку памяти там невозможно (но на моей памяти версия от Игрика с такой ошибкой не вылетала).

Без плагина (т.е. через zvslib1.dll) текст не теряется.

По итогу, "wog native dialogs.era" не может выгрузить текстовые переменные и падает:

Посмотрел по исходному коду плагина.

Данный код, с проверкой на itemText, работает всегда:

Code:
itemText = (_DlgStaticTextPcx8ed_*)dlg->GetItem(19+i);
                    if (itemText)
                    {
                        itemText->font = (int)smalfont2;
                        itemText->color = 1;
                    }
                }

А дальше - код фигачит изменения шрифта и цвета уже без проверки на существование самого текста:

Code:
((_DlgStaticTextPcx8ed_*)dlg->GetItem(msg->item_id +4))->font = (int)medfont2;
                ((_DlgStaticTextPcx8ed_*)dlg->GetItem(msg->item_id +4))->color = 7;

По крайней мере мне это кажется подозрительным, ибо я не могу найти причину пропадания текста при клике мыши по кнопке диалога и вылете при попытке выгрузить воговский диалог из "wog native dialogs.era". Вылетает, даже если просто ничего не выделять и нажать отмену, но там по крэшлогу - уже чистая утечка памяти в какое-то молоко.
XEPOMAHT, проблема с этим диалогом вскрылась, когда я исправил утечку памяти, вызванную отсутствием удаления виджетов при закрытии диалогов. Без этого исправления текст просто не удалялся из-за памяти, а потому и казалось, что всё нормально. Сейчас посмотрю, что вызывает описанное тобой поведение. Спасибо за наводки Yes
XEPOMAHT, а ведь репорт говорит о двойном удалении картинок, судя по всему.
Попробую убрать "лишнее" удаление.

UPD: проблему удалось воспроизвести -- исследую

UPD:UPD: В общем, дело в том, что igrik прописал переназначение шрифта на уже загруженный образец, хранимый в памяти, но с новой (корректной) функцией очистки памяти уже загруженный шрифт (который постоянно должен быть в памяти) удалялся, но не занулялся (хотя ни то, ни другое не должно происходить).
Я решил проблему добавлением метода установки шрифта, хотя есть и вариант просто сохранять ссылки на оригинальный (созданный в конструкторе диалога), а в деструкторе возвращать ссылки на них, но то дольше кодить. Так что будем "жрать" оперативу при каждом клике по элементу с выбором 148
реализация метода (Click to View)
То, как теперь обрабатывается процедура (Click to View)
P.S.: теоретически такая же проблема должна возникать и в меню WoG-опций, но я пока не встречал.
АХАХАХ. ДА!!! Если закрыть диалог, когда мышка наведена на элемент меню (отображается не родной шрифт), текст так же пропадёт, а игра вылетит через пару раз.
В общем, это тоже исправлю сейчас исправил (дел на 1 минуту)

P.P.S.: XEPOMAHT, ты просто красавчик -- отличная находка и подсказка177
XEPOMAHT, daemon_n, молодцы, парни 132
UPD: Сборка обновлена:
Вот ссылка на файл .era:
wog native dialogs.era

Вот ссылка на файл .dbgmap:
wog native dialogs.dbgmap
Так как я не понимаю смысла вашего действа - зашёл просто спросить)))
А зачем удалять шрифт из памяти и постоянно его грузит/удалять?


Я грузил его один раз при старте игры, чтобы не заниматься постоянной загрузкой/выгрузкой. Причём я брал пример с того, как это делается с оригинальными игровыми шрифтами

Code:
int __stdcall Y_Hook_MainLoop(LoHook* h, HookContext* c)
{
    n_BigFont = GetEraJSON("wnd.fonts.big_font");
    n_MedFont = GetEraJSON("wnd.fonts.med_font");
    n_SmallFont = GetEraJSON("wnd.fonts.small_font");
    // загружаем необходимые русскоязычные игровые шрифты
    bigfont2 = _Fnt_::Load(n_BigFont);
    medfont2 = _Fnt_::Load(n_MedFont);
    smalfont2 = _Fnt_::Load(n_SmallFont);
}
igrik, с того, что закрытие диалога подразумевает удаление из памяти и виджетов, и загруженных ими ассетов.
Ранее виджеты не удалялись из памяти, поэтому эта проблема не возникала (утечка памяти).
Помещённые указатели на шрифт в глобальных переменных никто и не удаляет – это происходило автоматически, когда эти указатели помещались в виджеты временных диалогов.

Оригинальный код подразумевает загрузку шрифта каждый раз, когда создаётся текстовый элемент, и выгрузку — при удалении. Так что при смене одного ассета на другой должны корректно и последовательно выполняться обе эти операции (касается смены любых ассетов. Хорошо видно на примере смены def/wav у стеков в битве)
Тем более, что удаление — это просто уменьшение счётчика.
И потому проблема возникала не сразу (не после первой замены указателя на шрифт). Счётчик не того шрифта обнулялся, и происходило удаление ресурса из памяти.
Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
Reference URL's