Wake of Gods Forum | Форум Во Имя Богов
Новая реализация виртуальной файловой системы - Printable Version

+- Wake of Gods Forum | Форум Во Имя Богов (http://wforum.heroes35.net)
+-- Forum: Герои Меча и Магии 3.5 WoG/ERA (/forumdisplay.php?fid=99)
+--- Forum: Моды (/forumdisplay.php?fid=104)
+---- Forum: ЭРА / ERA (/forumdisplay.php?fid=182)
+---- Thread: Новая реализация виртуальной файловой системы (/showthread.php?tid=5296)


Новая реализация виртуальной файловой системы - Berserker - 09.05.2019 01:27

Доброго времени суток, дорогие друзья!
Спасибо вам всем огромное за всё, что вы делали и делаете 119

У меня просьба к пользователям операционных систем Windows XP/Vista/7/8/10, Linux скачать архив, распаковать в любую папку (для Linux с желательно латинскими путями) и запустить файл VfsTest.exe, а в нём нажать на зелёную кнопку. Интересует версия ОС и прошли ли тесты.

Данная операция прогонит все написанные мною тесты новой реализации виртуальной файловой системы, которую, в случае успеха, я буду распространять свободно в качестве DLL. Она работает на самом низком уровне (NTDLL.DLL), поддерживает Юникод и огромное количество API, писалась с учётом Wine. С помощью библиотеки можно спроецировать содержимое множество одних папок на любые другие, как сейчас работает Эра, только с полным предварительным кэшированием спроецированных папок для скорости работы и поддержкой многозадачности.

Ну и где же ссылка на скачивание?


RE: Новая реализация виртуальной файловой системы - Algor - 09.05.2019 02:26

Berserker, перезалей куда-нить еще, закрыт доступ Bad


RE: Новая реализация виртуальной файловой системы - fireman - 09.05.2019 05:43

Algor, https://drive.google.com/file/d/1ib0vsduGJYBDqZEXsdKazEGWGGyMGhsL/view?usp=sharing


RE: Новая реализация виртуальной файловой системы - daemon_n - 09.05.2019 08:22

win 10x64 1709/ тесты прошли, но что-то не так, судя по окошку с ошибкой:
Image: JEdbR
Если не выбирать TestAssertHandler, окошко не вылезает


RE: Новая реализация виртуальной файловой системы - wessonsm - 09.05.2019 10:12

Windows 8.1 (x64), Windows 7 (x86). Папка с тестами на рабочем столе.
В обоих случаях такое же окошко, как у daemon_n.
Далее после нажатия ОК:
Windows 8:
Windows 7:
Кроме того, на Windows 7 при закрытии окна пишет "cannot create file dunit.ini".

Да, от админа.
Я так понял, на win8 у меня не проходит тест TestApiDigger,
а на win7 - тесты из группы TestIntegrated.


RE: Новая реализация виртуальной файловой системы - PerryR - 09.05.2019 10:19

win 10x64
same error MSG as Daemon
Test 12, Run 1, Failure 0, 8% :P
....Test.pas" on line 46.


RE: Новая реализация виртуальной файловой системы - daemon_n - 09.05.2019 13:29

(09.05.2019 10:12)wessonsm Wrote:  Кроме того, на Windows 7 при закрытии окна пишет "cannot create file dunit.ini".

От администратора запускал?
Поскольку программа от администратора, то и запускать надо соответствующе



RE: Новая реализация виртуальной файловой системы - Elmore - 09.05.2019 14:25

Windows 10 x64 (1809)
Та же ошибка, что и у daemon_n


RE: Новая реализация виртуальной файловой системы - Berserker - 09.05.2019 15:20

Большое спасибо всем!

daemon_n, всё верно. TestAssertHandler должен выдать сообщение. Его можно отключить.
wessonsm, странно, что не сработал тест на получение реальных адресов в Win 8. Если не сложно, нажми в нижнем окне на фиолетовую строчку с ошибкой и в самом нижнем скопируй её полный текст.

И запусти, пожалуйста, тесты с C:\Test или D:\Test и от админа, поскольку на рабочем столе даже прав на создание файла почему-то нет.

PerryR, thanks. All tests passed on your Win 10 x64.

Mr.S, тоже отлично.

У меня нет под рукой XP и перестал в виртуалке работать LUbuntu. На Win 7 x64 от администратора все тесты проходят.


RE: Новая реализация виртуальной файловой системы - igrik - 09.05.2019 15:31

У меня всё так же как и у daemon_n на Win 7 x64
Жаль на рабочем компе тимка не обновлена - не могу зайти. Там XP. Смогу проверить только в понедельник.
Сегодня на Ubuntu 18.04 поставлю вайн и отпишусь по этой системе.


RE: Новая реализация виртуальной файловой системы - XEPOMAHT - 09.05.2019 16:04

На Windows 2003

Image: 885c5668516d.png

Первые 2 ошибки в тестах со скрина - из-за запуска с корня диска. Остальные возникают всегда (полностью точно так же как на Windows 7 у daemon_n).


RE: Новая реализация виртуальной файловой системы - Algor - 09.05.2019 18:37

WinXP SP3 32bit, запуск с правами админа из c:\

Image: e1.JPG
Image: e2.JPG


RE: Новая реализация виртуальной файловой системы - wessonsm - 09.05.2019 19:16

(09.05.2019 15:20)Berserker Wrote:  wessonsm, странно, что не сработал тест на получение реальных адресов в Win 8. Если не сложно, нажми в нижнем окне на фиолетовую строчку с ошибкой и в самом нижнем скопируй её полный текст.

И запусти, пожалуйста, тесты с C:\Test или D:\Test и от админа, поскольку на рабочем столе даже прав на создание файла почему-то нет.
Полный текст:
DetermineRealApiAddress: ETestFailure
at $004AC256
Failed to get real api address. Normal address: 758022D0, Real address: 7637CEE0, Got address: 758022D0

При запуске с C:\Test и D:\Test то же самое (cannot create file при закрытии окна).


RE: Новая реализация виртуальной файловой системы - daemon_n - 09.05.2019 20:02

Я тут прикинул, не связаны ли такие расхождения с максимальной версией .net framework, установленной у того или иного юзера? Или каких-либо библиотек, которые необязательны.


RE: Новая реализация виртуальной файловой системы - Berserker - 09.05.2019 22:45

igrik, спасибо, буду очень признателен.
XEPOMAHT, Algor, спасибо за отчёты.

Улучшил обработку путей, исправил проблему с запуском из корня диска, добавил журналирование в _LOG_.txt, который будет интересовать, если интеграционные тесты не будут пройдены.

Rghost
DropMeFiles

daemon_n, нет, .NET не при делах )

wessonsm, большое спасибо. Данный тест можно игнорировать. Очевидно, между версиями Windows есть различия в том, какая библиотека из какой какие функции импортирует. Поэтому остановился на самом низкоуровневой — ntdll.dll.


RE: Новая реализация виртуальной файловой системы - igrik - 10.05.2019 14:05

Тест на Ubuntu 18.04 с Wine 4.0
LOG ошибки.
Image: 111.png


RE: Новая реализация виртуальной файловой системы - Algor - 10.05.2019 14:23

(09.05.2019 22:45)Berserker Wrote:  Улучшил обработку путей...

Win7Pro SP1, 64 bit - всё чисто

WinXP SP3, 32bit

Image: e3.JPG

Лог


RE: Новая реализация виртуальной файловой системы - Berserker - 10.05.2019 17:36

Большое спасибо, логи получил.
У Алгора все функция твердят о неверном выравнивании данных. Попробую поставить XP на виртуалку, изучил тему, но пока явного ответа нет.
Интересная ошибка у Игрика на Lubuntu.

igrik, скопируй пожалуйста весь текст ошибки из фиолетовой строки (если её выбрать, отобразится полностью).


RE: Новая реализация виртуальной файловой системы - igrik - 10.05.2019 18:16

Всё замирает на 92% и дальше не двигается.
Code:
TestFilesOpenClose: ETestFailure
at  $004AFA9B
There must be created a corresponding TOpenedFile record for opened file handle with valid virtual path when relative path was used, expected: <Z:\home\igrik\Bers\VfsTest_09_05_2019\Tests\Fs\Hobbots\mms.cfg> but was: <Z:\home\igrik\Bers\VfsTest_09_05_2019\Tests\Fs\Mods\FullyVirtual_2\Hobbots\mms.cfg>



RE: Новая реализация виртуальной файловой системы - Berserker - 11.05.2019 03:08

Спасибо, так гораздо лучше.
Поставил XP SP 3 на виртуалку. Нашёл проблему в копиляторе Delphi — локальные переменные не выравнены в отдельных случаях по границе в 4 байта. Это ужасно, но исправил. Сразу следующая проблема возникла с блокировкой на входе в критическую секцию после двойного выхода из неё. Пока до конца причину не установил, отлаживаю.

По Ubuntu идеи есть, буду ещё думать.


RE: Новая реализация виртуальной файловой системы - igrik - 11.05.2019 03:28

(10.05.2019 17:36)Berserker Wrote:  Интересная ошибка у Игрика на Lubuntu.
Berserker, у меня не Lubuntu. У меня стоит чистая Ubuntu 18.04 и на ней Wine 4.0

Погонял сегодня сборку на этой системе. Всё отлично за 4 часа теста, кроме одного фактора: нельзя играть с музыкой (с эффектами можно, с музыкой нет).


RE: Новая реализация виртуальной файловой системы - Berserker - 11.05.2019 04:44

Исправил злостный баг. Теперь на Windows XP все тесты полностью проходят, что не может не радовать. Завтра загружу обновление и попробую что-нибудь с Wine поставить.
С учётом политики крупных ТНК, уже очень скоро придётся ютиться на ReactOS, виртуалках и дистрибутивах Linux.

igrik, что не так с музыкой? LUbuntu была у меня, как Ubuntu, только облегчённая для более слабых ПК.


RE: Новая реализация виртуальной файловой системы - Berserker - 11.05.2019 17:45

На Wine удалось получить результат, аналогичный Игриковскому.

P.S. Как же летает Windows XP даже на вируталке, как она удобна и быстра! И что за мрак всё же Ubuntu, что по работоспособности, что по скорости установки и настройки.
P.S.S. На виртуалке при работе с сетевого диска некорректно срабатывали функции поиска файлов по маске, *.???? находил что угодно. Пришлось добавить дублирующую программную проверку для каждого найденного файла. Теперь 100% тестов на XP проходят.


RE: Новая реализация виртуальной файловой системы - Berserker - 12.05.2019 02:57

Исправил недочёты, улучшил тесты. У меня проходят на Win 7 x64, Windows XP SP 3 x86 и LUbuntu 18.04 x86 (WineHQ).

https://dropmefiles.com/5Vxse
http://rgho.st/77M5YZv8h


RE: Новая реализация виртуальной файловой системы - SyDr - 12.05.2019 11:30

Win 10 (1809) + UAC (но и под админом также)
Всё остальное зелёненькое.


RE: Новая реализация виртуальной файловой системы - Berserker - 12.05.2019 14:14

SyDr, а _LOG_.txt не покажешь? )
/Проверю десятку на виртуалке.


RE: Новая реализация виртуальной файловой системы - Berserker - 12.05.2019 15:42

SyDr, очень странно, у меня под Win 10 x64 всё прошло успешно (


RE: Новая реализация виртуальной файловой системы - SyDr - 12.05.2019 20:06




RE: Новая реализация виртуальной файловой системы - Berserker - 13.05.2019 01:32

SyDr, спасибо, какая-то фантастика. Не смог повторить на десятке. По логу FindFirstFileA не вызывает FindFirstFileW => NtCreateFile (здесь ещё вызывает) => NtQueryDirectoryFile.
Как-то не ясно, что за API тогда используется для получения содержимого папки :-(


RE: Новая реализация виртуальной файловой системы - Berserker - 14.05.2019 19:47

Если кому из программистов интересно пощупать, то вот библиотека:
Скачать 150 КБ

Все экспортируемые функции работают по соглашению STDCALL. Если в конце имени нет суффикса A (Ansi), то с UCS16-строками (L"строка" в C++).
Если с суффиксом А, то с Ansi-строками.

Примеры использования:
// Отображаем все моды из папки Mods и присутствующие в list.txt на корневую папку с игрой
MapModsFromListA('D:\Heroes 3', 'D:\Heroes 3\Mods', 'D:\Heroes 3\Mods\list.txt')

// Запускаем VFS
VfsControl.RunVfs(0); // 0 - SORT_FIFO, содержимое папок более приоритетных модов будет выводиться ДО менее приоритетных

// Читаю файл из Феникса по виртуальному пути:
ReadFileContents('D:\Heroes 3\Data\s\pHoenix.erm', s);

API:

Code:
(* Maps real directory contents to virtual path. Target must exist for success *)
function MapDir (const VirtPath, RealPath: PWideChar; OverwriteExisting: boolean; Flags: integer = 0): LONGBOOL; stdcall;

(* Maps real directory contents to virtual path. Target must exist for success *)
function MapDirA (const VirtPath, RealPath: PAnsiChar; OverwriteExisting: boolean; Flags: integer = 0): LONGBOOL; stdcall;

(* Loads mod list from file and maps each mod directory to specified root directory.
   File with mod list is treated as (BOM or BOM-less) UTF-8 plain text file, where each mod name is separated
   from another one via Line Feed (#10) character. Each mod named is trimmed, converted to UCS16 and validated before
   adding to list. Invalid or empty mods will be skipped.
   Returns true if root and mods directory existed and file with mod list was loaded successfully *)
function MapModsFromList (const RootDir, ModsDir, ModListFile: PWideChar; Flags: integer = 0): LONGBOOL; stdcall;

(* Loads mod list from file and maps each mod directory to specified root directory.
   File with mod list is treated as (BOM or BOM-less) UTF-8 plain text file, where each mod name is separated
   from another one via Line Feed (#10) character. Each mod named is trimmed, converted to UCS16 and validated before
   adding to list. Invalid or empty mods will be skipped.
   Returns true if root and mods directory existed and file with mod list was loaded successfully *)
function MapModsFromListA (const RootDir, ModsDir, ModListFile: PAnsiChar; Flags: integer = 0): LONGBOOL; stdcall;

(* Runs all VFS subsystems, unless VFS is already running *)
function RunVfs (DirListingOrder: TDirListingSortType): LONGBOOL;

(* Temporarily pauses VFS, but does not reset existing mappings *)
function PauseVfs: LONGBOOL; stdcall;

(* Stops VFS and clears all mappings *)
function ResetVfs: LONGBOOL; stdcall;

(* Calls specified function with a single argument and returns its result. VFS is disabled for current thread during function exection *)
function CallWithoutVfs (Func: TSingleArgExternalFunc; Arg: pointer = nil): integer; stdcall;

(*
  Specifies the order, in which files from different mapped directories will be listed in virtual directory.
  Virtual directory sorting is performed by priorities firstly and lexicographically secondly.
  SORT_FIFO - Items of the first mapped directory will be listed before the second mapped directory items.
  SORT_LIFO - Items of The last mapped directory will be listed before all other mapped directory items.
*)
TDirListingSortType = (SORT_FIFO = 0, SORT_LIFO = 1);



RE: Новая реализация виртуальной файловой системы - wessonsm - 15.05.2019 07:54

С последним вариантов тестов у меня все зеленое на 32-битной 7 и на 64-битной 8.1.


RE: Новая реализация виртуальной файловой системы - Berserker - 15.05.2019 14:51

wessonsm, отлично! Ab


RE: Новая реализация виртуальной файловой системы - AlexeevAV - 22.05.2019 11:46

Привет, на Windows XP SP3 все зеленые, тоже последний вариант.


RE: Новая реализация виртуальной файловой системы - Berserker - 22.05.2019 14:48

AlexeevAV, привет, прекрасно! )


RE: Новая реализация виртуальной файловой системы - Berserker - 24.05.2019 14:28

Реализовал наблюдение за папкой с модами в отдельном потоке с автообновлением, ручные тесты прошли на Win 7, XP, Win 10, Lubuntu.


RE: Новая реализация виртуальной файловой системы - Berserker - 25.05.2019 19:22

Делюсь радостью Ab. После долгой отладки и подетальной доработки запустил VFS с редактором карт в многопоточном режиме. Тормозов нет (!), при этом несуществующие папки и файлы работают, даже диалог свойств говорит, что файл расположен в D:\Heroes 3:
https://yadi.sk/i/WKoGBK9AvI5XcA

Работа идёт на уровне Native API (Родные функции ОС). WinAPI (Высокоуровневый интерфейс для пользователей) основан на Native API (ntdll).


RE: Новая реализация виртуальной файловой системы - daemon_n - 25.05.2019 21:01

(25.05.2019 19:22)Berserker Wrote:  Делюсь радостью Ab. После долгой отладки и подетальной доработки запустил VFS с редактором карт в многопоточном режиме. Тормозов нет (!), при этом несуществующие папки и файлы работают, даже диалог свойств говорит, что файл расположен в D:\Heroes 3:
https://yadi.sk/i/WKoGBK9AvI5XcA

Работа идёт на уровне Native API (Родные функции ОС). WinAPI (Высокоуровневый интерфейс для пользователей) основан на Native API (ntdll).

Это вот сейчас был анонс более плавной работы эры на многоядерных машинах?Ab
В любом случае поздравляю с полученным результатом)


RE: Новая реализация виртуальной файловой системы - Berserker - 25.05.2019 21:42

daemon_n, спасибо. Это поддержка Юникода, работа Lua, работа Lua с файловой системой.
Многопоточность несколько опасна по причине того, что ЕРМ однопоточен (частично решаемо). Бараторч в HD-моде по странной причине тоже форсирует однопоточность. Узнать бы, почему. С редактором карт проблем нет )


RE: Новая реализация виртуальной файловой системы - Berserker - 25.05.2019 23:00

Проверил и отладил работу потока слежения за изменениями в VFS, например, создаваемыми и редактируемыми скриптами, картами и другими ресурсами, которые разработчики любят менять при запущенных приложениях. Поскольку теперь VFS держит весь кэш в памяти (слепок иерархии папок с атрибутами), то такое обновление позволяет предотвращать программные ошибки, когда файл в реальной папке имеет актуальные имя, размер, атрибуты, а в виртуальной — устаревшие.

Обновлённая DLL: http://rgho.st/64PdyF6Kf

type
    (*
    Specifies the order, in which files from different mapped directories will be listed in virtual directory.
    Virtual directory sorting is performed by priorities firstly and lexicographically secondly.
    SORT_FIFO - Items of the first mapped directory will be listed before the second mapped directory items.
    SORT_LIFO - Items of The last mapped directory will be listed before all other mapped directory items.
    *)
    TDirListingSortType = (SORT_FIFO = 0, SORT_LIFO = 1);

(* Loads mod list from file and maps each mod directory to specified root directory.
    File with mod list is treated as (BOM or BOM-less) UTF-8 plain text file, where each mod name is separated
    from another one via Line Feed (#10) character. Each mod named is trimmed, converted to UCS16 and validated before
    adding to list. Invalid or empty mods will be skipped. Mods are mapped in reverse order, as compared to their order in file.
    Returns true if root and mods directory existed and file with mod list was loaded successfully *)
function MapModsFromList (const RootDir, ModsDir, ModListFile: PWideChar; Flags: integer = 0): LONGBOOL; stdcall; external 'vfs.dll';

(* Runs all VFS subsystems, unless VFS is already running *)
function RunVfs (DirListingOrder: TDirListingSortType): LONGBOOL; stdcall; external 'vfs.dll';

(* Spawns separate thread, which starts recursive monitoring for changes in specified directory.
    VFS will be fully refreshed or smartly updated on any change. Debounce interval specifies
    time in msec to wait after last change before running full VFS rescanning routine *)
function RunWatcher (const WatchDir: PWideChar; DebounceInterval: integer): LONGBOOL; stdcall; external 'vfs.dll';

(* Allocates console and install logger, writing messages to console *)
procedure InstallConsoleLogger; stdcall; external 'vfs.dll';

Пример чернового использования в любом проекте:
Code:
MapModsFromList('D:\Heroes 3', 'D:\Heroes 3\Mods', 'D:\Heroes 3\Mods\list.txt');
RunVfs(SORT_FIFO);
RunWatcher('D:\Heroes 3\Mods', 250);
Теперь файл с модами в кодировке UTF-8. Для латинских названий ничего не изменилось. Поток наблюдателя обновляет ВФС в фоне, если ресурсы изменяются. Задержка полного рескана — 250 мс.


RE: Новая реализация виртуальной файловой системы - Berserker - 26.05.2019 15:54

Добавил поддержку генерации отчёта о применённых отображениях папок.

Пример вывода:
Code:
$ <= $\Mods\WoG Native Dialogs         [Overwrite = 0, Flags = 0, $ = "D:\Heroes 3"]
$ <= $\Mods\#Dlg_ExpaMon *MISS*        [Overwrite = 0, Flags = 0, $ = "D:\Heroes 3"]
$ <= $\Mods\#WoG Native Dialogs *MISS* [Overwrite = 0, Flags = 0, $ = "D:\Heroes 3"]
$ <= $\Mods\Phoenix                    [Overwrite = 0, Flags = 0, $ = "D:\Heroes 3"]
$ <= $\Mods\#New Music Pack *MISS*     [Overwrite = 0, Flags = 0, $ = "D:\Heroes 3"]
$ <= $\Mods\#BattleHeroes *MISS*       [Overwrite = 0, Flags = 0, $ = "D:\Heroes 3"]
$ <= $\Mods\Morn battlefields          [Overwrite = 0, Flags = 0, $ = "D:\Heroes 3"]
$ <= $\Mods\Big Spellbook              [Overwrite = 0, Flags = 0, $ = "D:\Heroes 3"]
$ <= $\Mods\Vallex Portraits           [Overwrite = 0, Flags = 0, $ = "D:\Heroes 3"]
$ <= $\Mods\WoG Rus                    [Overwrite = 0, Flags = 0, $ = "D:\Heroes 3"]
$ <= $\Mods\Secondary Skills Scrolling [Overwrite = 0, Flags = 0, $ = "D:\Heroes 3"]
$ <= $\Mods\Yona                       [Overwrite = 0, Flags = 0, $ = "D:\Heroes 3"]
$ <= $\Mods\Fast Battle Animation      [Overwrite = 0, Flags = 0, $ = "D:\Heroes 3"]
$ <= $\Mods\Quick Savings              [Overwrite = 0, Flags = 0, $ = "D:\Heroes 3"]
$ <= $\Mods\WoG                        [Overwrite = 0, Flags = 0, $ = "D:\Heroes 3"]

(* Returns text with all applied mappings, separated via #13#10. If ShortenPaths is true, common part
    of real and virtual paths is stripped. Call MemFree to release result buffer *)
function GetMappingsReport: {O} PWideChar; stdcall; external 'vfs.dll';
function GetMappingsReportA: {O} pchar; stdcall; external 'vfs.dll';

(* Frees buffer, that was transfered to client earlier using other VFS API *)
procedure MemFree ({O} Buf: pointer); stdcall; external 'vfs.dll';


RE: Новая реализация виртуальной файловой системы - Berserker - 26.05.2019 17:09

Опубликован исходный код библиотеки и тестов: https://github.com/ethernidee/vfs
Там же доступен первый релиз (dll).


RE: Новая реализация виртуальной файловой системы - Berserker - 26.05.2019 17:21

Здесь можно скачать обновлённую DLL редактора карт
https://github.com/ethernidee/era-editor/releases/download/v2.8.0.0/EraMap.dll

А здесь библиотеку виртуальной файловой системы
https://github.com/ethernidee/vfs/releases/download/v1.0.0/vfs.dll

С ними двумя в корне должен открываться редактор карт из Эры 2.7.7.


RE: Новая реализация виртуальной файловой системы - daemon_n - 26.05.2019 19:56

А будет поддерживать теперь генерацию xxl карт?
Или я совсем не по теме?)


RE: Новая реализация виртуальной файловой системы - Berserker - 26.05.2019 20:29

Нет, функционал редактора не дорабатывался. Тут либо автором h3mapedpatch (GrayFace), либо сторонними плагинами.


RE: Новая реализация виртуальной файловой системы - RDV - 02.12.2019 19:54

ссылку, на тест пл3, первые 2 не работают
хоть чем-то помогу Image: awesome.png


RE: Новая реализация виртуальной файловой системы - Berserker - 02.12.2019 20:56

RDV, в папке Heroes 3 Era\Tools\VfsTest.


RE: Новая реализация виртуальной файловой системы - RDV - 02.12.2019 21:14

2.75 не нашел
играю 2.75 т.к 2.88 вылетает стабильно каждый новый месяц на 1 день
Тесты на Win 10 64 EN 1703
https://ibb.co/Y864xwt
https://ibb.co/WvZDYkP


RE: Новая реализация виртуальной файловой системы - Berserker - 02.12.2019 21:33

https://dropmefiles.com/ljEXh
Да, всё верно, тесты у тебя проходят.


RE: Новая реализация виртуальной файловой системы - XEPOMAHT - 22.11.2021 13:57

Как с помощью новой виртуальной системы заставить редактор карт читать *.msk из *.paс любых модов? Перенаправления на чтение def из *.pac, как я понял, реализовано в eramap.dll, но по *.msk для Дельфы никаких готовых решений для патча к редактору карт похоже нет и для новых объектов происходит порча масок объеков карты при загрузке def-а (т.е. def редактор карт находит в любом *.paс, а аналогичный *.msk ищется редактором исключительно только в H3sprite.lod, полностью игнорируя *.pac). Данный недостаток каким-то образом устранял Кавалерист у себя в патче к редактору, но вот как он это сделал - не ясно. 112


RE: Новая реализация виртуальной файловой системы - Berserker - 22.11.2021 15:47

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



RE: Новая реализация виртуальной файловой системы - RoseKavalier - 22.11.2021 16:28

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...