SDK для 4A Engine своими руками |
Здравствуйте, гость ( Авторизация | Регистрация )
SDK для 4A Engine своими руками |
01.03.2019, 00:36
Сообщение
#761
|
|
. Репутация: 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 |
 
|
|
|
|
21.10.2021, 01:34
Сообщение
#762
|
|
. Репутация: 750 Куратор темы Сообщений: 7072 Регистрация: 30.07.2010 |
TheStalkerNest, пожалуйста:
В наличии также загрузичик моделей игрового формата (.model) вместо .raw |
 
|
|
21.10.2021, 10:51
Сообщение
#763
|
|
Опытный Игрок Репутация: 3 Группа: Участник Сообщений: 67 Регистрация: 06.02.2016 |
TheStalkerNest, пожалуйста: В наличии также загрузичик моделей игрового формата (.model) вместо .raw Спасибо. Думал у меня где-то ошибка в коде, а оказалось, в ll ещё больше переписали pathengine, из-за чего у меня методы в нём не работают. Видимо, так и придётся генерировать навмеши для ll через оригинал 2033. Сообщение отредактировал TheStalkerNest - 21.10.2021, 10:54 |
 
|
|
21.10.2021, 15:34
Сообщение
#764
|
|
. Репутация: 750 Куратор темы Сообщений: 7072 Регистрация: 30.07.2010 |
TheStalkerNest, а у тебя не работает именно генерация (buildMeshFromContents) или сохранение (saveGround, saveCollisionPreprocessFor, savePathfindPreprocessFor)?
|
 
|
|
21.10.2021, 16:46
Сообщение
#765
|
|
Опытный Игрок Репутация: 3 Группа: Участник Сообщений: 67 Регистрация: 06.02.2016 |
|
 
|
|
21.10.2021, 16:50
Сообщение
#766
|
|
. Репутация: 750 Куратор темы Сообщений: 7072 Регистрация: 30.07.2010 |
TheStalkerNest, плохо. Если б не работало сохранение у меня есть идея как с ним разобраться, а с этим нет.
|
 
|
|
21.10.2021, 16:53
Сообщение
#767
|
|
Опытный Игрок Репутация: 3 Группа: Участник Сообщений: 67 Регистрация: 06.02.2016 |
TheStalkerNest, плохо. Если б не работало сохранение у меня есть идея как с ним разобраться, а с этим нет. Закомментировав метрошный метод loadMeshFromStream, успешно удалось пройти стадию ctx = real_mesh->newContext(); Дальше краш на burnContextIntoMesh. Тут я пока не разобрался. |
 
|
|
21.10.2021, 17:44
Сообщение
#768
|
|
. Репутация: 750 Куратор темы Сообщений: 7072 Регистрация: 30.07.2010 |
|
 
|
|
21.10.2021, 19:15
Сообщение
#769
|
|
Опытный Игрок Репутация: 3 Группа: Участник Сообщений: 67 Регистрация: 06.02.2016 |
TheStalkerNest, а разве loadMeshFromStream это не загрузка уже скомпилированной модели? Дальше краш на burnContextIntoMesh. Тут я пока не разобрался. Этим я думаю можно пренебречь для тестов, главное чтоб сама модель и все препроцессы к ней создались. Этот метод я взял из твоего кастомного хедера. Я использую другой хедер от 5.14 с добавленными методами из 5.16 по официальному changelog'у. На оригинальном метро он не заводился, а с добавлением этого метода и dummy методов, всё заработало, я и подумал, что это метрошный метод :/ На дллке 5.16 из JustCause 2, этого метода, тоже не было. Пока эксперементирую с смещениями в хедере, в надежде завести его на ll. |
 
|
|
21.10.2021, 19:39
Сообщение
#770
|
|
. Репутация: 750 Куратор темы Сообщений: 7072 Регистрация: 30.07.2010 |
я и подумал, что это метрошный метод :/ Так и есть, это метрошный метод, 4А добавляли там всякое для себя, поэтому хедеры и не подходят. Я методом тыка разбирался с этим, dummy это новые методы, и возможно они даже не в тех местах где должны быть на самом деле. В ласт лайте ещё как я понял функции сохранения (saveGround, saveCollisionPreprocessFor, ...) принимают не родной для pathengine интерфейс iOutputStream (или как там его?) а движковый iwriter. С этим тоже придётся поплясать. Зато модель должна сохранится сразу в нужном формате, не придётся перегонять из tok в bin. |
 
|
|
22.10.2021, 00:32
Сообщение
#771
|
|
Опытный Игрок Репутация: 3 Группа: Участник Сообщений: 67 Регистрация: 06.02.2016 |
я и подумал, что это метрошный метод :/ Так и есть, это метрошный метод, 4А добавляли там всякое для себя, поэтому хедеры и не подходят. Я методом тыка разбирался с этим, dummy это новые методы, и возможно они даже не в тех местах где должны быть на самом деле. В ласт лайте ещё как я понял функции сохранения (saveGround, saveCollisionPreprocessFor, ...) принимают не родной для pathengine интерфейс iOutputStream (или как там его?) а движковый iwriter. С этим тоже придётся поплясать. Зато модель должна сохранится сразу в нужном формате, не придётся перегонять из tok в bin. Возможно всё-таки получится реализовать отдельную утилиту. Я как-то писал пол-года назад, что удалось инициализировать дллку 5.16, хукнув методы аллокации, однако дальше дело тогда не пошло. Сейчас пореверсил её, заменил хуки на полноценную эмуляцию игрового аллокатора, и обнаружил ещё одно изменение в iFaceVertexMesh. Там перед методом faces, был добавлен ещё какой-то метод. На данный момент добавил пустой метод-затычку, и вроде-бы всё успешно дошло до метода saveGround. В нём дллка кидает ошибку. Завтра покопаюсь ещё. Исходники оставляю тут, если интересно глянуть (пути до файлов, прописаны в исходнике, для отладки). Сообщение отредактировал TheStalkerNest - 22.10.2021, 00:34 |
 
|
|
23.10.2021, 21:57
Сообщение
#772
|
|
Опытный Игрок Репутация: 3 Группа: Участник Сообщений: 67 Регистрация: 06.02.2016 |
Публикую новую версию игрового плагина MetroDeveloper.
Интегрирована поддержка генерации навмеша для metro last light, через metro 2033 (by Modera). Интегрирована поддержка формата .model для генерации навмеша (by Modera). Исправлен неправильный алгоритм генерации навмеша (by Modera). Исправлено некорректное закрытие игры при генерации навмеша с включенным параметром exitwhendone. Теперь при генерации навмеша, intro ролики не запускаются, вне зависимости от того, включен-ли параметр nointro. Убрана 5-ти секундная задержка при генерации навмеша (теперь навмеш генерируется сразу, как только загрузится игра). Всем функциям кроме nav_map, добавлена полная поддержка last light. Внешнее окно консоли, теперь открывается только при генерации навмеша. Добавлен звуковой сигнал при загрузке плагина (Можно отключить в конфиге. Параметр beep). Переименован конфиг. Обновлена инструкция по генерации навмеша. Прочие незначительные правки кода. По идее, плагин теперь должен работать и на Windows XP. Сообщение отредактировал TheStalkerNest - 23.10.2021, 22:00 |
 
|
|
24.10.2021, 19:10
Сообщение
#773
|
|
Опытный Игрок Репутация: 3 Группа: Участник Сообщений: 67 Регистрация: 06.02.2016 |
Пытался реализовать чтение ресурсов из папки content, для оригинального метро, и даже удалось вывести список файлов, однако хук некорректно работает из-за __usercall соглашения.
Modera, поможешь в реализации asm хука и вызова функции читающей файлы с диска? Ниже адреса функций для твоего exe. Судя по выведенной инфе, функция читает абсолютно все файлы, в отличии от redux. Адрес функции читающей файлы с архивов: metro2033.exe + 0x538B70 Адрес функции читающей файлы с диска: metro2033.exe + 0x538920 |
 
|
|
24.10.2021, 21:54
Сообщение
#774
|
|
. Репутация: 750 Куратор темы Сообщений: 7072 Регистрация: 30.07.2010 |
TheStalkerNest, 2033 чё-то не хочет у меня запускаться если вызывать vfs::ropen_os вместо vfs::ropen. Просто сразу крашится и всё.
Ласт лайт получше себя чувствует, но геометрия и текстуры не грузятся. Похоже та же песня что и с редаксом. Копипаст кода хука можно лицезреть в блокноте справа. Походу заменять только одну функцию мало, там есть ещё какая-то vfs::rbuffered, которой грузится геометрия и текстуры. Кстати эта функция есть и в 2033, даже на твоём скрине видно что нет сообщения о загрузке level.geom_pc. |
 
|
|
24.10.2021, 22:28
Сообщение
#775
|
|
Опытный Игрок Репутация: 3 Группа: Участник Сообщений: 67 Регистрация: 06.02.2016 |
TheStalkerNest, 2033 чё-то не хочет у меня запускаться если вызывать vfs::ropen_os вместо vfs::ropen. Просто сразу крашится и всё. Ласт лайт получше себя чувствует, но геометрия и текстуры не грузятся. Похоже та же песня что и с редаксом. Копипаст кода хука можно лицезреть в блокноте справа. Походу заменять только одну функцию мало, там есть ещё какая-то vfs::rbuffered, которой грузится геометрия и текстуры. Кстати эта функция есть и в 2033, даже на твоём скрине видно что нет сообщения о загрузке level.geom_pc. Т.е. на ласт лайте vfs::ropen_os не все перехваченные файлы грузит? Если да, то может попробовать для тестов не всю распакованную папку грузить, а например какие-то отдельные файлы (например level.bin подменить)? По поводу краша на 2033, то там регистры у обоих функций отличаются. Возможно ты это не учёл. Для сравнения, инфа из ida для 2033 int __usercall vfs::ropen_package@<eax>(int a1@<esi>, void *Src) _DWORD *__usercall vfs::ropen_os@<eax>(_DWORD *a1@<edi>, int a2) В ласт лайте vfs::ropen_os имеет нормальное __cdecl соглашение _DWORD *__cdecl vfs::ropen_os(_DWORD *a1, int a2) Сообщение отредактировал TheStalkerNest - 24.10.2021, 22:32 |
 
|
|
24.10.2021, 22:46
Сообщение
#776
|
|
. Репутация: 750 Куратор темы Сообщений: 7072 Регистрация: 30.07.2010 |
Т.е. на ласт лайте vfs::ropen_os не все перехваченные файлы грузит? Если да, то может попробовать для тестов не всю распакованную папку грузить, а например какие-то отдельные файлы (например level.bin подменить)? Ну я как-то так и сделал, что сначала проверяется есть ли нужный файл в распакованной папке content, если есть то вызывается vfs::ropen_os, иначе вызывается оригинальная функция для чтения из архива. level.bin подменять таким образом можно. По поводу краша на 2033, то там регистры у обоих функций отличаются. Возможно ты это не учёл. Ну я вроде переставлял esi в edi. Можно ещё раз попробовать. |
 
|
|
24.10.2021, 23:51
Сообщение
#777
|
|
. Репутация: 750 Куратор темы Сообщений: 7072 Регистрация: 30.07.2010 |
|
 
|
|
25.10.2021, 02:45
Сообщение
#778
|
|
Опытный Игрок Репутация: 3 Группа: Участник Сообщений: 67 Регистрация: 06.02.2016 |
Всё-таки получилось хукнуть 2033, надо было оказывается сохранять значение edi. История та же самая что и с ЛЛ и с редаксом, геометрия не грузится. Можешь пожалуйста, написать готовый хук в дллку под синтаксис intel? Я всё правильно переписал с скриншота, однако при компиляции, добавляются левые команды, которые вообще непонятно откуда берутся :/ |
 
|
|
25.10.2021, 02:48
Сообщение
#779
|
|
. Репутация: 750 Куратор темы Сообщений: 7072 Регистрация: 30.07.2010 |
TheStalkerNest, попробуй указать для своей функции __declspec(naked).
А так, я сам точно не знаю как чисто ассемблерную функцию сделать в майкрософтовском компиляторе. Разве что в отдельном .asm файле писать. |
 
|
|
25.10.2021, 02:55
Сообщение
#780
|
|
Опытный Игрок Репутация: 3 Группа: Участник Сообщений: 67 Регистрация: 06.02.2016 |
|
 
|
|
25.10.2021, 14:10
Сообщение
#781
|
|
Опытный Игрок Репутация: 3 Группа: Участник Сообщений: 67 Регистрация: 06.02.2016 |
Публикую новую версию игрового плагина MetroDeveloper от 25.10.2021.
Добавлена частичная разблокировка чтения ресурсов из папки content (спасибо Modera за помощь в реализации). Очень удобная функция, при редактировании level.bin. Включается в конфиге, параметром unlock_content_folder. Поддерживается как 2033 так и last light. ======================= С добавлением этой функции, у меня появилась новая идея для level editor'a: 1. Кнопка запуска игры, для быстрого тестирования изменений level.bin и т.д, без сворачивания редактора. 2. Строка пути к exe'шнику игры (пример "C:\Metro2033\metro2033.exe") 3. Строка пути рабочей папки игры (мало-ли, пригодится) (пример "C:\Metro2033\") 4. Строка аргументов запуска игры (пример "-dx9") Ну и соответственно пункты 2, 3 и 4, свои для каждой игры. Сообщение отредактировал TheStalkerNest - 25.10.2021, 14:22 |
 
|
|
Текстовая версия | Сейчас: 24.04.2024, 14:19 |