Тут дело не в виртуальной файловой системе, скорее всего. Все 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