(13.10.2022 09:06)daemon_n Wrote: [ -> ]Berserker, из "Start Battle", кажется.
Позднее гляну адрес
Berserker, 0x462E26
Berserker, я понимаю, что можно сменить один png другим с относительным путём:
!!SN:R^cefres.def:1_0.png^/^Data\Defs\cefres.def\5_6.png^;
но можно ли сделать то же с def файлом?
!!SN:R^cefres.def^/^Data\Defs\customPath\cefres_a.def^;
а то не хочу покадрово делать SN:R - ещё не факт, что кол-во кадров будет соответствовать
проще говоря, можно ли обычные def расположить в субкаталогах, чтобы через sn:r выбирать к ним нужный путь?
Berserker, ну, ничего - буду работать через циклы тогда - как оказалось, можно подменять png даже там, где нет png))
Как вызвать эровскую внешнюю функцию GetButtonID? Т.к. эта фишка с автоматической выдачей номеров кнопок платформой ЭРА, на которую моддер не может повлиять, немножко бесит.
В данный момент Тифон использует фиксированные эровские ID для новых кнопок, но если кто-то добавит собственный *.btn, то тифоновские кнопки в лучшем случае перестанут работать (т.к. их индексы автоматически будут заняты другими кнопками), в худшем - игра будет вылетать. Можно конечно поставить перехват на конструктор нужного диалога и ставить в нём свои кнопки, но в этом есть минус: на конструкторах диалогов и так весит вереница хуков от кучи плагинов, аккуратно вклиниваться Тифоном в этот хаос так, чтобы ничего не поломать, совершенно не хочется.
Поэтому очень желательно, чтобы была возможность ручного указания номера новой кнопки в эровском *.btn, т.к. с вызовом эровских функций я таки разобраться толком по-прежнему не могу - на выходе либо Ашибки в era.dll или buttons.era, либо -1, либо мусор.
PS: когда же в ЭРЕ наконец-то появится окошко при запуске с автоматическим предложением подключить к ЭРЕ моды, не прописанные/не закомментированные в list.txt??? Очень, очень многие не знают, что моды подключаются к ЭРЕ в list.txt, поэтому каждый раз приходится объяснять. А хотелось бы, чтобы движок ЭРЫ сам находил новые моды в папке mods и спрашивал игрока о том, надо их подключать или нет.
Автоматические ID кнопок Эры начинаются с 400. Может начать свои ID с 2000000. Проблема-то.
Вызвать просто:
push 'имя кнопки'
call Era.GetButtonID
eax = ID или -1, если кнопки с таким именем в *.btn файлах не было.
Quote:PS: когда же в ЭРЕ наконец-то появится окошко при запуске с автоматическим предложением подключить к ЭРЕ моды, не прописанные/не закомментированные в list.txt???
По изначальной задумке то, что не прописано в list.txt, и должно быть отключено. Это просто архивы. Так называемое комментирование заставляет движок VFS искать несуществующие папки. Загрузка модов по списку вынесена на библиотеку VFS.dll. Эра не занимается проверкой, какая папка существует, какая указана и т.д. Из-за этого сложнее получить список реально загруженных модов.
Можешь написать такой плагин сам (правда успехов с определением, что такое закомментированное имя мода и как его отличить от отсутствия имени мода в списке).
Читаешь список каталогов, читаешь содержимое list.txt, парсишь, сравниваешь. Для сканирования папок в обход VFS код сканирования нужно выделить в отдельную функцию, после чего вызвать VFS.dll:: CallWithoutVfs(адрес функции, аргумент для функции).
Сегодня день вопросов по-видимому

У меня тоже есть вопрос, и тоже связан с перенаправлением:
как можно сделать так, чтобы вместо ресурса XXX загружался ресурс YYY, если он существует,
а если не существует, загружался оригинальный ресурс XXX?
Идеи есть, но они кажутся мне слишком сложными (хукать функции загрузки def и pcx), может есть простой способ, которого я не вижу?
С этим сложно. Есть механизм перенаправления, если ресурс не существует (Redirect Missing) и его Эра использует.
А какова область применения и решаемая задача?
(20.10.2022 11:39)Berserker Wrote: [ -> ]С этим сложно. Есть механизм перенаправления, если ресурс не существует (Redirect Missing) и его Эра использует.
А какова область применения и решаемая задача?
Пытаюсь сделать загрузку отмасштабированных заранее ресурсов для HD-мода без использования стретч фильтров в реальном времени.
Я знаю, что такая идея не раз звучала, но всерьез за нее никто особо браться не захотел.
Да и у меня нет уверенности, что из этого что-то получится, но попробовать хочется.
Пока все в зачаточном состоянии, и в принципе, рано еще о чем-то говорить.
Но сама реализация не такая уж сложная: я не лезу глубоко внутрь HD-мода и просто изменяю координаты элементов диалогов (для этого вполне достаточно функционала patcher_x86) и заменяю сами ресурсы.
А нужен такой способ перенаправления вот для чего:
Допустим, у нас нет отмасштабированного дефа или pcx (например он в моде каком-то или просто не сделали пока).
В этом случае берем оригинальный ресурс (неотмасштабированный) и масштабируем при загрузке.
Изначально я хотел дописывать к имени ресурса суффикс какой-то (например GamSelBk_150.pcx) или может лучше с тем же именем, но в отдельную папку класть.
Пока никакого такого механизма у меня вообще нет, и я просто заменяю оригинальные ресурсы масштабированными, оно все в одной куче получается.
Не забудь про ограничение длины имени в 11 символов.
Видишь ли, проверка существования ресурса тоже не дешёвый вопрос. Все лоды обойти + на диске поискать.
Тогда может лучше свой лод подгружать и искать сначала только в нем, а уже в случае неудачи - во всех остальных.
В Эре есть неэскпортированная функция function FileIsInLods (const FileName: string): boolean;
Могу сделать её эскпортный аналог, если нужна проверка на существование файла в лодах.
Если будешь для начала свой лод грузить, то вот функция для поиска файлов в нём:
Code:
function FileIsInLod (const FileName: string; Lod: Heroes.PLod): boolean;
begin
{!} Assert(Lod <> nil);
result := false;
if FileName <> '' then begin
asm
MOV ECX, Lod
ADD ECX, 4
PUSH FileName
MOV EAX, $4FB100
CALL EAX
MOV result, AL
end; // .asm
end;
end; // .function FileIsInLod
4FB100 в IDA базе.
Berserker, спасибо большое. Это надо хорошо всё обдумать сначала.