Berserker
Posts: 16658
|
|
02.12.2019 20:56 |
|
RDV
Posts: 23
|
(This post was last modified: 02.12.2019 21:53 by RDV.)
|
|
02.12.2019 21:14 |
|
Berserker
Posts: 16658
|
|
02.12.2019 21:33 |
|
Berserker
Posts: 16658
|
Тут дело не в виртуальной файловой системе, скорее всего. Все pac-и подгружаются вместе с lod-ми и формируют одну таблицу архивов. Скорее всего GrayFace или авторы оригинального редактора вместо цикла линейного поиска по архивам ищут только в одном конкретном лоде.
$4DACE6 — здесь лежит указатель на таблицу лодов.
Нужно прибавить к указателю 99(макс число поддерживаемых архивов - 1) * 400. Получим ссылку на последний lod/pac.
Оттуда цикл вызова 4E48F0 (проверка ресурса в архиве) с вычитанием 400 из указателя на каждом шаге. Как только что-то нашлось или достигли конца — выходим.
Скорее всего, уже есть готовая функция в редакторе, но в оригинальной игре повторяющиеся циклы в каждой функции загрузки ресурса определённого типа.
Code:
function FindFileLod (const FileName: string; out LodPath: string): boolean;
const
MAX_LOD_COUNT = 100;
type
PLod = ^TLod;
TLod = packed record
Dummy: array [0..399] of byte;
end;
var
Lod: PLod;
i: integer;
begin
Lod := Ptr(integer(ppointer($4DACE6)^) + sizeof(TLod) * (MAX_LOD_COUNT - 1));
// * * * * * //
result := false;
i := MAX_LOD_COUNT - 1;
while not result and (i >= 0) do begin
if ppointer(Lod)^ <> nil then begin
result := FileIsInLod(FileName, Lod);
end;
if not result then begin
Dec(Lod);
Dec(i);
end;
end;
if result then begin
LodPath := pchar(integer(Lod) + 8);
end;
end; // .function FindFileLod
Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
|
|
22.11.2021 15:47 |
|
RoseKavalier
Posts: 118
|
If you give me an address, I can take a look at what I did. It's been so long that I worked in the editor that I have forgotten much...
|
|
22.11.2021 16:28 |
|