SDK для 4A Engine своими руками |
Здравствуйте, гость ( Авторизация | Регистрация )
SDK для 4A Engine своими руками |
01.03.2019, 00:36
Сообщение
#781
|
|
. Репутация: 750 Куратор темы Сообщений: 7072 Регистрация: 30.07.2010 |
Мне тут предложили создать отдельную тему по поводу редактора уровней который я показывал в теме "Вскрытие ресурсов Метро 2033", так что теперь все новости и прочее будет здесь.
Скачать актуальную версию можно тут: Скачать последнюю тестовую версию можно тут: Чейнджлог Версия от 28 февраля 2019:
Версия от 17 марта 2019:
Версия от 23 марта 2019:
Версия от 30 апреля 2019:
Версия от 18 августа 2019:
Версия от 25 августа 2019:
Версия от 20 января 2020:
Версия от 30 марта 2020:
Версия от 28 июня 2021:
Версия от 20 сентября 2021:
Версия от 4 ноября 2021:
Версия от 18 ноября 2021:
Версия от 6 февраля 2022:
Консольные утилиты Полноценный распаковщик и запаковщик для Last Light, readme в архиве Программы для работы с конфигами и конвертер моделей Исходники можно найти в исходниках level_editor'а. В архиве содержится три программы: split.exe, binunp.exe и model.exe. Первая split.exe, предназначена для разбития scripts.bin на отдельные файлы и сборки обратно. Для разбития поместить файл scripts.bin в рабочей папке и запустить без параметров или с одним параметром -d(без разницы). Код split.exe Если всё прошло хорошо должна появится папка scripts с большим количеством .bin файлов в ней. Для обратной сборки запустить с ключом -c: Код split.exe -c Скрипты при сборке опять таки берутся из папки scripts в рабочей папке. Вторая binunp.exe, предназначена для конвертирования .bin конфигов(файлы добытые из scripts.bin, level.bin и некоторые другие) в человеко-читаемый формат и обратно. Именно на её основе строится редактор уровней. Что умеет:
Распаковка level.bin осуществляется следующим образом: Код binunp.exe -l -d level.bin level.txt Где level.bin - имя файла для распаковки. Где level.txt - имя распакованного текстового файла. Запаковка level.bin: Код binunp.exe -l [-k N] -c level.txt level.bin Где level.txt - имя текстового файла для запаковки. Где level.bin - имя нового двоичного файла. Параметр -k необязательный, на месте N указывается тип .bin файла, по умолчанию 5. В 2033 используется 5, в last light 4, в следующих играх 36. Распаковка конфигов с отладочной инфой: Код binunp.exe -l -d file.bin file.txt Где file.bin - имя файла для распаковки. Где file.txt - имя распакованного текстового файла. При попытке распаковать таким образом конфиг без отладочной информации будет выведено сообщение об ошибке следующего вида: Код Exception: Cannot decompile config with kind=4 Распаковка конфигов без отладочной инфы(при помощи скрипта): Код binunp [-v] -s js\script.js file.bin file.txt Где js\script.js - имя скрипта в папке js используемого для разбора конфига. Где file.bin - имя файла для распаковки. Где file.txt - имя распакованного текстового файла. Параметр -v необязательный, если указать то будет выводиться предупреждение в том случае если данные были прочитаны не до конца. Есть специальный случай, если имя файла для распаковки textures.bin, то скрипт не используется, вместо него нужно указать пустую строчку. Код binunp -s "" textures.bin textures.txt Запаковка конфигов: Код binunp.exe [-k N] -c file.txt file.bin Где file.txt - имя текстового файла для запаковки. Где file.bin - имя нового двоичного файла. Параметр -k необязательный, на месте N указывается тип .bin файла, по умолчанию 5. Желательно указывать такой же какой был показан при распаковке. Последняя model.exe, конвертер моделей. Умеет следующее:
Краткая справка доступна при запуске без параметров. Эта инструкция будет дописываться. Сторонние утилиты Сообщение отредактировал Modera - 06.02.2022, 08:21 |
 
|
|
|
|
25.10.2021, 15:16
Сообщение
#782
|
|
Опытный Игрок Репутация: 3 Группа: Участник Сообщений: 67 Регистрация: 06.02.2016 |
TheStalkerNest, 2033 чё-то не хочет у меня запускаться если вызывать vfs::ropen_os вместо vfs::ropen. Просто сразу крашится и всё. Ласт лайт получше себя чувствует, но геометрия и текстуры не грузятся. Похоже та же песня что и с редаксом. Копипаст кода хука можно лицезреть в блокноте справа. Походу заменять только одну функцию мало, там есть ещё какая-то vfs::rbuffered, которой грузится геометрия и текстуры. Кстати эта функция есть и в 2033, даже на твоём скрине видно что нет сообщения о загрузке level.geom_pc. Ещё немного покопался. Лучше не мучатся с функцией vfs::rbuffered. Эта функция вызывается из метода mesh_server::load_geom_fast. Её можно хукнуть на функцию mesh_server::load_geom_slow, которая вызывает vfs::ropen, который уже хукнут, и тогда level.geom_pc будет грузится с папки. Думаю, если ещё поискать, то можно найти аналогичные функции для всего остального. UPD: load_geom_fast можно не хукать, т.к. в движке есть условие, которое всегда его вызывает. Занопив 2 байта условного прыжка, будет всегда вызываться load_geom_slow. Правку уже проверил, геометрия уровня успешно прошла через хук vfs::ropen, и загрузилась из папки. Сообщение отредактировал TheStalkerNest - 25.10.2021, 16:55 |
 
|
|
25.10.2021, 17:47
Сообщение
#783
|
|
Опытный Игрок Репутация: 3 Группа: Участник Сообщений: 67 Регистрация: 06.02.2016 |
Ещё одно обновление плагина MetroDeveloper.
Теперь level.geom_pc тоже может грузится из папки content. ====================== Для звуков и текстур, нет готовых функций чтения с диска. Заметил, что vfs::rbuffered вызывает vfs::ropen_x_reader_1_. Есть аналогичная функция vfs::ropen_x_reader_0_, которая используется в функциях vfs::ropen и vfs::ropen_os. Предполагаю, если в функции vfs::rbuffered подменить вызов функции, то файлы будут грузится из папки. Буду копать дальше. Сообщение отредактировал TheStalkerNest - 25.10.2021, 18:16 |
 
|
|
25.10.2021, 17:48
Сообщение
#784
|
|
. Репутация: 750 Куратор темы Сообщений: 7072 Регистрация: 30.07.2010 |
Думаю, если ещё поискать, то можно найти аналогичные функции для всего остального. Ну если найдёшь аналогчиные решения для текстур и остальных случаев использования rbuffered, то можно эту функцию и не трогать. Хотя я бы предпочёл всё-таки хукнуть rbuffered, т.к. это более аккуратное решение. |
 
|
|
26.10.2021, 01:32
Сообщение
#785
|
|
. Репутация: 750 Куратор темы Сообщений: 7072 Регистрация: 30.07.2010 |
Получилось подменить функцию rbuffered для редакса, геометрия и лайтмап грузится, nav_map.bin всё ещё нет, как выяснилось есть какая-то третья функция rblock_init
Код class dummy; struct fastdelegate { dummy *object; bool (*method)(dummy *object, LPVOID &buffer, size_t size); }; void (*real_vfs_rbuffered_package)(void *_arg1, char *fina, void *_arg2); // адрес оригинальной функции void override_vfs_rbuffered_package(void *_arg1, char *fina, fastdelegate *callback) { printf("%s\n", fina); if(GetFileAttributes(fina) != 0xFFFFFFFF) { size_t size; void *buffer; buffer = malloc(0x30000); if(buffer) { FILE *f = fopen(fina, "rb"); if(f) { while(size = fread(buffer, 1, 0x30000, f)) callback->method(callback->object, buffer, size); fclose(f); } free(buffer); return; } } real_vfs_rbuffered_package(_arg1, fina, callback); } Для 32-битных 2033 и ласт лайта наверно надо будет сделать так, т.к. на самом деле callback это указатель на метод какого-то там объекта. Код class dummy; struct fastdelegate { dummy *object; bool (dummy::*method)(LPVOID &buffer, size_t size); }; void (*real_vfs_rbuffered_package)(void *_arg1, char *fina, void *_arg2); void override_vfs_rbuffered_package(void *_arg1, char *fina, fastdelegate *callback) { printf("%s\n", fina); if(GetFileAttributes(fina) != 0xFFFFFFFF) { size_t size; void *buffer; buffer = malloc(0x30000); if(buffer) { FILE *f = fopen(fina, "rb"); if(f) { while(size = fread(buffer, 1, 0x30000, f)) (callback->object->*callback->method)(buffer, size); fclose(f); } free(buffer); return; } } real_vfs_rbuffered_package(_arg1, fina, callback); } Скармливать весь файл одним вызовом нельзя - вылетает. В оригинале передаётся частями по 192 килобайта, покрайне мере в случае загрузки лайтмапа. Я сделал так же и у меня всё заработало. |
 
|
|
26.10.2021, 10:31
Сообщение
#786
|
|
Опытный Игрок Репутация: 3 Группа: Участник Сообщений: 67 Регистрация: 06.02.2016 |
Получилось подменить функцию rbuffered для редакса, геометрия и лайтмап грузится, nav_map.bin всё ещё нет, как выяснилось есть какая-то третья функция rblock_init Код class dummy; struct fastdelegate { dummy *object; bool (*method)(dummy *object, LPVOID &buffer, size_t size); }; void (*real_vfs_rbuffered_package)(void *_arg1, char *fina, void *_arg2); // адрес оригинальной функции void override_vfs_rbuffered_package(void *_arg1, char *fina, fastdelegate *callback) { printf("%s\n", fina); if(GetFileAttributes(fina) != 0xFFFFFFFF) { size_t size; void *buffer; buffer = malloc(0x30000); if(buffer) { FILE *f = fopen(fina, "rb"); if(f) { while(size = fread(buffer, 1, 0x30000, f)) callback->method(callback->object, buffer, size); fclose(f); } free(buffer); return; } } real_vfs_rbuffered_package(_arg1, fina, callback); } Для 32-битных 2033 и ласт лайта наверно надо будет сделать так, т.к. на самом деле callback это указатель на метод какого-то там объекта. Код class dummy; struct fastdelegate { dummy *object; bool (dummy::*method)(LPVOID &buffer, size_t size); }; void (*real_vfs_rbuffered_package)(void *_arg1, char *fina, void *_arg2); void override_vfs_rbuffered_package(void *_arg1, char *fina, fastdelegate *callback) { printf("%s\n", fina); if(GetFileAttributes(fina) != 0xFFFFFFFF) { size_t size; void *buffer; buffer = malloc(0x30000); if(buffer) { FILE *f = fopen(fina, "rb"); if(f) { while(size = fread(buffer, 1, 0x30000, f)) (callback->object->*callback->method)(buffer, size); fclose(f); } free(buffer); return; } } real_vfs_rbuffered_package(_arg1, fina, callback); } Скармливать весь файл одним вызовом нельзя - вылетает. В оригинале передаётся частями по 192 килобайта, покрайне мере в случае загрузки лайтмапа. Я сделал так же и у меня всё заработало. Офигеть! Чуть позже, проверю. Вчера несколько часов копался в иде, ничего с этой функцией так и не понял. А текстуры нормально подгружаются, или как раньше, с отключением проверки non streamable? В 2033, nav_map.pe загружается через vfs::ropen. Наверное где-то через неделю, буду делать порт плагина на редаксы. Вчера установил 2033, через неделю скачаю ласт лайт. =================== Кстати, как удалять отдельные плитки в Script Editor? Сообщение отредактировал TheStalkerNest - 26.10.2021, 10:34 |
 
|
|
26.10.2021, 14:04
Сообщение
#787
|
|
Опытный Игрок Репутация: 3 Группа: Участник Сообщений: 67 Регистрация: 06.02.2016 |
В дополнение к моему сообщению выше.
Проверил на оригинале 2033. Подгружаются звуки, лайтмап, геометрия, скайбокс, envmap. Текстуры и файл level через него, точно не проходят. Ещё заметил отличие от редакса. В 2033 передаются части по 128 килобайт, в ласт лайте по 64. Хотя у меня нормально заработало и с 192 килобайтами, как в редаксе, но решил всё-таки оригинальные размеры использовать. Для оригиналов, немного по другому получилось. Код typedef char (__cdecl* _method)(void* a1, void** buffer, size_t size);
typedef void (__cdecl* _vfs_rbuffered)(const char* fn, void* a1, _method method); _vfs_rbuffered vfs_rbuffered_Orig = nullptr; void __cdecl vfs_rbuffered_Hook(const char* fn, void* a1, _method method) { //printf("%s\n", fn); if (GetFileAttributes(fn) != 0xFFFFFFFF) { size_t size; size_t buffer_size = (isLL ? 0x10000 : 0x20000); void* buffer = malloc(buffer_size); if (buffer) { FILE* f = fopen(fn, "rb"); if (f) { while (size = fread(buffer, 1, buffer_size, f)) method(a1, isLL ? &buffer : (void**)buffer, size); fclose(f); } free(buffer); return; } } vfs_rbuffered_Orig(fn, a1, method); } Сообщение отредактировал TheStalkerNest - 26.10.2021, 14:52 |
 
|
|
26.10.2021, 16:59
Сообщение
#788
|
|
. Репутация: 750 Куратор темы Сообщений: 7072 Регистрация: 30.07.2010 |
А текстуры нормально подгружаются, или как раньше, с отключением проверки non streamable? Новые не подгружаются, я так понимаю дело в том что не считываются настройки из имя_текстуры.bin. Стандартные текстуры и настройки заменяются. Кстати, как удалять отдельные плитки в Script Editor? Shift + клик по тому что хочешь удалить, помоему. |
 
|
|
26.10.2021, 18:41
Сообщение
#789
|
|
Опытный Игрок Репутация: 3 Группа: Участник Сообщений: 67 Регистрация: 06.02.2016 |
Обновление игрового плагина MetroDeveloper от 26.10.2021.
Теперь звуки, level.lmap_pc, skybox и envmap, тоже могут грузится из папки content. |
 
|
|
27.10.2021, 22:26
Сообщение
#790
|
|
Игрок Репутация: 7 Группа: Участник Сообщений: 46 Регистрация: 10.10.2018 |
Обновление игрового плагина MetroDeveloper от 26.10.2021. Теперь звуки, level.lmap_pc, skybox и envmap, тоже могут грузится из папки content. Сообщение отредактировал Berkut107 - 27.10.2021, 22:27 -------------------- |
 
|
|
28.10.2021, 13:01
Сообщение
#791
|
|
. Репутация: 750 Куратор темы Сообщений: 7072 Регистрация: 30.07.2010 |
|
 
|
|
28.10.2021, 19:47
Сообщение
#792
|
|
. Репутация: 750 Куратор темы Сообщений: 7072 Регистрация: 30.07.2010 |
Короче, с навмапой разобрался, там всё просто, и одновременно не очень. У функции rblock_init оказывается есть параметр позволяющий чтение файла стандартными функциями, а не из игрового архива, так что можно эту функцию вообще не трогать. Но! Нужно поменять значение одной стековой переменной в самой функции загрузки навмеша, вот тут:
Сейчас туда записывается всегда ноль, а должна быть единичка. Причём не всегда, а только если файл на самом деле существует. Даже не знаю как эту задачу лучше решить, видимо придётся делать врезку. Патчить rblock_init смысла нет, т.к. эта переменная туда передаётся по значению, а не по указателю, а значение должно совпадать, т.к. эта переменная потом где-то вычитывается и что-то идёт не так. Самое главное что nav_map.bin от ластлайта подходят! Хоть с этим танцевать не придётся. Со второй проблемой необходимости добавления новых карт в content.vfx aka Вечная "Загрузка контента... ⓑ Выход в главное меню" тоже вроде разобрался. Можно просто запатчить вот здесь jne на jmp и всё будет грузится без записей в content.vfx тогда. Не знаю только не отразится ли это на работоспособности оригинальных карт, которые в архивах, но вроде запускаются. Короче теперь запаковщик для редакса можно не делать. |
 
|
|
29.10.2021, 14:12
Сообщение
#793
|
|
Опытный Игрок Репутация: 3 Группа: Участник Сообщений: 67 Регистрация: 06.02.2016 |
Короче, с навмапой разобрался, там всё просто, и одновременно не очень. У функции rblock_init оказывается есть параметр позволяющий чтение файла стандартными функциями, а не из игрового архива, так что можно эту функцию вообще не трогать. Но! Нужно поменять значение одной стековой переменной в самой функции загрузки навмеша, вот тут: Сейчас туда записывается всегда ноль, а должна быть единичка. Причём не всегда, а только если файл на самом деле существует. Даже не знаю как эту задачу лучше решить, видимо придётся делать врезку. Патчить rblock_init смысла нет, т.к. эта переменная туда передаётся по значению, а не по указателю, а значение должно совпадать, т.к. эта переменная потом где-то вычитывается и что-то идёт не так. Самое главное что nav_map.bin от ластлайта подходят! Хоть с этим танцевать не придётся. Со второй проблемой необходимости добавления новых карт в content.vfx aka Вечная "Загрузка контента... ⓑ Выход в главное меню" тоже вроде разобрался. Можно просто запатчить вот здесь jne на jmp и всё будет грузится без записей в content.vfx тогда. Не знаю только не отразится ли это на работоспособности оригинальных карт, которые в архивах, но вроде запускаются. Короче теперь запаковщик для редакса можно не делать. Отлично. Сегодня займусь поддержкой редаксов. Скачал last light, оказывается у обоих редаксов, одна и та-же сборка движка. Отличаются только дата сборки, секции .text и .bind (стимовская привязка). Поэтому запариваться с сигнатурами для обоих редаксов, не придётся, будет работать на обоих. Кстати, выше писал что файл level не подгружается. Я не заметил, оказывается всё норм. Сообщение отредактировал TheStalkerNest - 29.10.2021, 14:28 |
 
|
|
29.10.2021, 16:44
Сообщение
#794
|
|
. Репутация: 750 Куратор темы Сообщений: 7072 Регистрация: 30.07.2010 |
Обратил тут внимание на файлики в папках с оригинальными уровнями - "level.portals". Смею предположить что это что-то связанное с порталами и секторами, штука для отрисовки только видимой игроком геометрии. Никто не пробовал разобрать эти файлы? У нас в "Наследии" довольно увесистые уровни получаются, особенно связанные с поверхностью. Было бы не лишним там порталов натыкать. Попробовал конвертировать порталы, проверял на уровне X-16, никаких изменений в производительности не заметил, во всяком случае в лучшую сторону. Звук не работает как и ожидалось из за того что не полностью пишется файл level.portals. Однако сами порталы вроде работают - если удалить/испортить файл level.portals то вместо порталов будут дырки, если включить статистику то там меняется норме сектора при переходе из одной комнаты в другую. Кому интересно можете сами затестить (если запустится конечно ) Уровень с порталами - Уровень без порталов - Конвертер который умеет переносить порталы - |
 
|
|
29.10.2021, 17:27
Сообщение
#795
|
|
Опытный Игрок Репутация: 3 Группа: Участник Сообщений: 67 Регистрация: 06.02.2016 |
Обратил тут внимание на файлики в папках с оригинальными уровнями - "level.portals". Смею предположить что это что-то связанное с порталами и секторами, штука для отрисовки только видимой игроком геометрии. Никто не пробовал разобрать эти файлы? У нас в "Наследии" довольно увесистые уровни получаются, особенно связанные с поверхностью. Было бы не лишним там порталов натыкать. Попробовал конвертировать порталы, проверял на уровне X-16, никаких изменений в производительности не заметил, во всяком случае в лучшую сторону. Звук не работает как и ожидалось из за того что не полностью пишется файл level.portals. Однако сами порталы вроде работают - если удалить/испортить файл level.portals то вместо порталов будут дырки, если включить статистику то там меняется норме сектора при переходе из одной комнаты в другую. Кому интересно можете сами затестить (если запустится конечно ) Уровень с порталами - Уровень без порталов - Конвертер который умеет переносить порталы - Не работает как на стим версии, так и на версии без dlc. Попробую перепаковать. |
 
|
|
29.10.2021, 17:35
Сообщение
#796
|
|
. Репутация: 750 Куратор темы Сообщений: 7072 Регистрация: 30.07.2010 |
TheStalkerNest, scripts.bin не подходит скорее всего, на пиратке 2010 года без патчей у меня запускается.
|
 
|
|
29.10.2021, 17:52
Сообщение
#797
|
|
Опытный Игрок Репутация: 3 Группа: Участник Сообщений: 67 Регистрация: 06.02.2016 |
|
 
|
|
29.10.2021, 18:06
Сообщение
#798
|
|
. Репутация: 750 Куратор темы Сообщений: 7072 Регистрация: 30.07.2010 |
TheStalkerNest, да, тогда странно что не запускается.
|
 
|
|
29.10.2021, 18:19
Сообщение
#799
|
|
Опытный Игрок Репутация: 3 Группа: Участник Сообщений: 67 Регистрация: 06.02.2016 |
|
 
|
|
29.10.2021, 18:29
Сообщение
#800
|
|
. Репутация: 750 Куратор темы Сообщений: 7072 Регистрация: 30.07.2010 |
TheStalkerNest, там ничё не правилось, только 000.bin скопирован как 111.bin
|
 
|
|
29.10.2021, 18:46
Сообщение
#801
|
|
Опытный Игрок Репутация: 3 Группа: Участник Сообщений: 67 Регистрация: 06.02.2016 |
|
 
|
|
Текстовая версия | Сейчас: 25.04.2024, 22:25 |