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
RDV, в папке Heroes 3 Era\Tools\VfsTest.
2.75 не нашел
играю 2.75 т.к 2.88 вылетает стабильно каждый новый месяц на 1 день
Тесты на Win 10 64 EN 1703
https://ibb.co/Y864xwt
https://ibb.co/WvZDYkP
https://dropmefiles.com/ljEXh
Да, всё верно, тесты у тебя проходят.
Как с помощью новой виртуальной системы заставить редактор карт читать *.msk из *.paс любых модов? Перенаправления на чтение def из *.pac, как я понял, реализовано в eramap.dll, но по *.msk для Дельфы никаких готовых решений для патча к редактору карт похоже нет и для новых объектов происходит порча масок объеков карты при загрузке def-а (т.е. def редактор карт находит в любом *.paс, а аналогичный *.msk ищется редактором исключительно только в H3sprite.lod, полностью игнорируя *.pac). Данный недостаток каким-то образом устранял Кавалерист у себя в патче к редактору, но вот как он это сделал - не ясно. 112
Тут дело не в виртуальной файловой системе, скорее всего. Все 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
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...
Pages: 1 2 3 4
Reference URL's