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 увеличивается позиция для непробельных символов, смена блока при необходимости и обработка "{", "}"