Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SDK для 4A Engine своими руками
GAMEINATOR forums > Общие разделы > Создание и модификация игр. Геймдев.
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18
Modera
TheStalkerNest, вот блин. Ладно, щас попробую сам на стим версии запустить.
Modera
Короче выяснил что вылетает из за фашистов в начале уровня, убрал их, и переделал scripts.bin для стим версии.
https://drive.google.com/file/d/1hoXBsXKu3O...iew?usp=sharing
https://drive.google.com/file/d/1HsHcB-Ufxq...iew?usp=sharing

Надеюсь теперь заработает.
TheStalkerNest
Цитата(Modera @ 29.10.2021, 21:20) *
Короче выяснил что вылетает из за фашистов в начале уровня, убрал их, и переделал scripts.bin для стим версии.
https://drive.google.com/file/d/1hoXBsXKu3O...iew?usp=sharing
https://drive.google.com/file/d/1HsHcB-Ufxq...iew?usp=sharing

Надеюсь теперь заработает.


Не заметил сообщение, сам решил проверить, подменив уровень 000. Так получилось запустить. Фашистов с уровня не удалял.
Побегал по секторам на слабом ноуте, разницы в фпс не заметил. Попробую потом затестить порталы на индоре из билда.
Уровень оттуда тяжеловат, даже с учётом его разбивки на 2 отдельных уровня как в релизе, и с учётом оптимизаций компилятором xray.
TheStalkerNest
Поправленная версия для стима, работает.
Сравнил уровень с порталами и без, стоя в одной точке и смотря в одну точку.

Результаты с порталами:

visible: deffered: s-static 90000
visible: deffered: instances 25000
visible: forward: s-static 2000

Результаты без порталов:

visible: deffered: s-static 170000
visible: deffered: instances 90000
visible: forward: s-static 20000

Если в режиме "fly 1" вылететь за пределы уровня, то видно, что порталы работают, и не прорисовывают весь уровень, а только нужные сектора, в то время как на уровне без порталов, отрисовывается весь уровень.
Modera
TheStalkerNest, ну короче порталы всё-таки пригодятся. Надо только со звуком разобраться.
Modera
Цитата(TheStalkerNest @ 25.10.2021, 14:10) *
С добавлением этой функции, у меня появилась новая идея для level editor'a:

1. Кнопка запуска игры, для быстрого тестирования изменений level.bin и т.д, без сворачивания редактора.
2. Строка пути к exe'шнику игры (пример "C:\Metro2033\metro2033.exe")
3. Строка пути рабочей папки игры (мало-ли, пригодится) (пример "C:\Metro2033\")
4. Строка аргументов запуска игры (пример "-dx9")

Ну и соответственно пункты 2, 3 и 4, свои для каждой игры.

Добавил такую фичу, тестовая версия с ней: https://drive.google.com/file/d/1IU1esLYFDq...iew?usp=sharing
Едиственно что не придумал как различать редаксы 2033 и ласт лайт между собой, версия движка то у них одинаковая, поэтому путь к EXE и другие параметры у них будут общие.

Другие изменения по сравнению с прошлой версией:
Цитата
Исправлен баг с отображением softbody моделей при включенном режиме wireframe
Добавлена возможность вызерать выделенные объекты
Исправлена ошибка из за которой могли неправильно переназначатся ссылки и parent_id при создании или вставке групп объектов
Исправлена ошибка с тем что не сбрасывалось выделение при переоткрытии уровня
В виду появления возможности загружать моды из папки content добавлены пункты в меню Level для быстрого сохранения и запуска уровня (Save & Run, Run Options) и кнопка на тулбаре


Думаю разобраться с порталами и можно новую не-тестовую версию выпускать.
TheStalkerNest
Затестил. Класс. Наконец-то можно не сворачивая редактор, сразу запускать игру.
TheStalkerNest
Modera, как распаковывать скрипты last light?

При попытке их распаковать, вылетает исключение
Exception: Cannot decompile config with kind=4

Скрипта для распаковки без отладочной инфы, по инструкции в шапке темы, в папке js нет sad.gif
Modera
Цитата(TheStalkerNest @ 31.10.2021, 22:25) *
Скрипта для распаковки без отладочной инфы, по инструкции в шапке темы, в папке js нет sad.gif

Надо найти место в движке где читается скрипт, и переписать его в js. По другому никак.
TheStalkerNest
Цитата(Modera @ 31.10.2021, 23:30) *
Цитата(TheStalkerNest @ 31.10.2021, 22:25) *
Скрипта для распаковки без отладочной инфы, по инструкции в шапке темы, в папке js нет sad.gif

Надо найти место в движке где читается скрипт, и переписать его в js. По другому никак.


Т.е. сейчас невозможно добавлять свои уровни в ll и redux? Я пока эталон запустил подменив 000.
Modera
TheStalkerNest, возможно. Во первых файлы с загрузочными экранами можно копировать от одного уровня к другому и не парится на счёт того что в них написано неправильное имя, всё будет работать и так.
Во вторых скрипт для разбора этих файлов всё-таки есть, он называется map_params.js.
TheStalkerNest
Цитата(Modera @ 01.11.2021, 09:07) *
TheStalkerNest, возможно. Во первых файлы с загрузочными экранами можно копировать от одного уровня к другому и не парится на счёт того что в них написано неправильное имя, всё будет работать и так.
Во вторых скрипт для разбора этих файлов всё-таки есть, он называется map_params.js.


Пробовал до этого, распаковывать всеми скриптами, в т.ч. и этим скриптом, почему-то не работало.
Сейчас проверил, всё работает. Вероятно, мой косяк был :/

Теперь не работает компиляция обратно.
Exception: 4:16: unknown type 'chose'

За основу был взят l01_jail.bin

Команда
binunp -k 4 -c etalon_level.txt etalon_level.bin

Удалось решить проблему, удалив подобные строчки "caption : chose;", "text : chose;" и т.д.

Однако всплыла ещё одна проблема с неизвестным типом "color, vec4".

Удалось решить, заменив подобные строчки
color : 'color, vec4' = [1, 1, 1, 1];

на

color : vec4i = [1, 1, 1, 1];
Modera
TheStalkerNest, этот скрипт другой чувак для меня делал, видимо там несколько ошибок с названиями типов есть. scratch_one-s_head.gif
А параметр text_color вообще на самом деле text_rect называется.
TheStalkerNest
map_params.js для ll с моими правками
https://disk.yandex.ru/d/6WI6I2gji0xppw

Исправил несколько опечаток chose на choose
Исправил неправильные записи vec4
Заменил text_color на text_rect, по сообщению Modera

Скрипт собирается, и вроде работает, но текст пишется, некорректно. Причину пока не удалось найти.


Modera, как корректно запустить свой уровень батником на ll?
Запускаю командой MetroLL.exe -cfg user.cfg -server -map etalon_level, появляется загрузочный экран, после чего, сразу шлётся команда disconnect и появляется консоль. Если в консоли выполнить команду map etalon_level, то уровень нормально загружается :/

UPD: Проблему с вылетом в консоль, удалось решить. На ll не нужно указывать ключ -server
Modera
Цитата(TheStalkerNest @ 01.11.2021, 13:23) *
Исправил неправильные записи vec4

Ну там не vec4i, а vec4f на самом деле, и ещё пара ошибок в именах параметров была. Короче вроде всё сделал как надо и залил в репозиторий. https://bitbucket.org/cat-modera/4a-sdk-diy...3ca0044f90f1279

Цитата(TheStalkerNest @ 01.11.2021, 13:27) *
UPD: Проблему с вылетом в консоль, удалось решить. На ll не нужно указывать ключ -server

Да, всё верно, для ЛЛ и редакса этот ключ не нужен.
TheStalkerNest
Цитата(Modera @ 01.11.2021, 14:49) *
Цитата(TheStalkerNest @ 01.11.2021, 13:23) *
Исправил неправильные записи vec4

Ну там не vec4i, а vec4f на самом деле, и ещё пара ошибок в именах параметров была. Короче вроде всё сделал как надо и залил в репозиторий. https://bitbucket.org/cat-modera/4a-sdk-diy...3ca0044f90f1279

Цитата(TheStalkerNest @ 01.11.2021, 13:27) *
UPD: Проблему с вылетом в консоль, удалось решить. На ll не нужно указывать ключ -server

Да, всё верно, для ЛЛ и редакса этот ключ не нужен.


Теперь скрипт вроде корректно работает.

Сейчас ещё заметил то, что mujs.dll из тестовой версии сдк, теперь несовместим с binunp15.
Modera
Цитата(TheStalkerNest @ 01.11.2021, 14:21) *
Сейчас ещё заметил то, что mujs.dll из тестовой версии сдк, теперь несовместим с binunp15.

Это норма, потому что binunp собран для x64, а последний билд для x86.

Блин, нашел в движке скриптовый блок logic/delay hud, там что-то связанное с респауном для мультиплеера. Только как заставить работать это всё непонятно. sad.gif
TheStalkerNest
У меня появилась ещё одна полезная идея для сдк.
Дополнительная папка для своих ресурсов, чтобы не класть свои текстуры, модели и т.д, в основную распакованную папку content.
Ну и строка, для редактирования названия своей папки.

Обновление игрового плагина MetroDeveloper от 01.11.2021.
https://github.com/tsnest/MetroDeveloper/re...roDeveloper.zip

Добавлена поддержка dds текстур в last light.
Включается параметром ll_allow_dds в секции other.
TheStalkerNest
Обновление игрового плагина MetroDeveloper от 03.11.2021.
https://github.com/tsnest/MetroDeveloper/re...roDeveloper.zip

Реализована поддержка redux'ов.

P.S. Подгружать nav_map.bin из папки content, пока ещё нельзя.
Modera
Короче выложил новую не-тестовую версию, отличия от предыдущей такие:
Цитата
Параметры для консольных утилит model.exe и binunp.exe теперь можно задавать в любом порядке, как во всех человеческих программах
Исправлен баг с отображением softbody моделей при включенном режиме wireframe
Добавлена возможность вырезать выделенные объекты
Исправлена ошибка из за которой могли неправильно переназначатся ссылки и parent_id при создании или вставке групп объектов
Исправлена ошибка с тем что не сбрасывалось выделение при переоткрытии уровня
В виду появления возможности загружать моды из папки content добавлены пункты в меню Level для быстрого сохранения и запуска уровня (Save & Run, Run Options) и кнопка на тулбаре
Теперь model.exe конвертирует порталы из сталкеровских уровней в level.portals, если они там есть.


С нерабочим звуком из за порталов удалось разобраться. Вроде.
Формат чанка 0x0000FFFC в файле level.portals примерно такой:
Код
int version; // версия sound occlusion, в 2033 = 4, в ласт лайте и редуксе 5
int checksum; // контрольная сумма уровня, которая пишется в чанке 0x0B (11). Должна совпадать обязательно, иначе не загрузится
int size1; // ?
int table1[size1*size1]; // какая-то таблица размером в квадрат предыдущего значения

struct st_Portal
{
    const char *name;
    int unknown; // вроде всегда 0
    short size1;
    if(version == 4)
       int data1[size1][4]; // вертексы?
    if(version == 5)
       int data1[size1][3]; // вертексы?
    int data2[12]; // возможно матрица 4x3
};

int portal_count;
struct st_Portal portals[portal_count];

// а за порталами следует ещё какая-то таблица формат которой мне непонятен


И если записать заглушку в которой указана только версия, контрольная сумма и три нулевых int то впринципе игра запускается и звук и порталы работают. Но честно говоря у меня не уверенности что тут ничего не читается после конца файла, и неизвестно к чему это может привести. А работает ли такая заглушка в ласт лайте и редаксе я вообще не проверял, т.к. готовых сконвертированных уровней с порталами у меня нет и делать их мне не охота, я уже на другую задачу отвлёкся.
Berkut107
Modera, не очень понял зачем добавил "cut", я привык постоянно копипастить через пкм, а там теперь на 1 месте в списке cut какое-то. Тем более вместо cut есть же кнопка delete, или эту функцию как-то еще можно использовать? Она тупо удаляет выделенную область? Я пока не разобрался.
Modera
Berkut107, копирует и потом удаляет, так же как во всех других редакторах. По русски это называется "вырезать".
Berkut107
Цитата(Modera @ 08.11.2021, 17:38) *
Berkut107, копирует и потом удаляет, так же как во всех других редакторах. По русски это называется "вырезать".

Да это я понял, просто очень не удобное расположение честно говоря.
Modera
Как везде.
Nay Gigger
Modera, не знаю, может чем-то поможет, но тут в \бин\ лежит вроде бы чуть другая версия 4a script debugger (и утилита для работы со звуком еще со времен HoverAce).
Расковыривать этот архив желания не имею, т.к. не знаю, какие либы, кроме u****.dll нужны.
https://mega.nz/file/P05gQTTI#CJZ9MrSRSFqwA...aVkRX6RQq1cXAKs


Modera
Ubunter, врядли пригодится, т.к. в релизе луа скриптов уже не осталось. Но всё ровно спасибо.
TheStalkerNest
Цитата(Ubunter @ 09.11.2021, 02:15) *
Modera, не знаю, может чем-то поможет, но тут в \бин\ лежит вроде бы чуть другая версия 4a script debugger (и утилита для работы со звуком еще со времен HoverAce).
Расковыривать этот архив желания не имею, т.к. не знаю, какие либы, кроме u****.dll нужны.
https://mega.nz/file/P05gQTTI#CJZ9MrSRSFqwA...aVkRX6RQq1cXAKs



Кому интересно, залил отдельно, чтобы не качать гигабайт.
В архиве так-же есть pdb'шки от uai.dll и uscript.dll.
Странно, что эта версия дебагера, собрана почти на 2 месяца раньше, номер сборки больше на 6 единиц, а функционала больше, чем в версии из слитого билда.

В целом, все эти файлы имеют лишь историческую ценность.

https://drive.google.com/file/d/1ImJbWeotjo...5Aiywu6X_V/view
Modera
Выпустил новую версию. Самое большое отличие от предыдущей это полная загрузка уровней от арктики.1, впрочем я на 95% уверен что никто арктику моддить не будет и это новшество никакой пользы не принесёт. Зато теперь точно известно что следующей будет поддержка исхода, т.к. больше ничего не осталось.
Только примитивная система undo которая делает полный бекап сцены при каждом изменении себя не очень хорошо показала с уровнями арктики. Срабатывает довольно медленно (до 0,2 секунды задержка) и память жрёт как не в себя.
В общем, для таких тяжёлых уровней надо это улучшать и сохранять только изменения. Но это довольно сложно, поэтому я пока сделал просто возможность отключать undo напрочь.

Полный список изменений:
  • Level Editor:
    • Исправлена возможность создавать одинаковые связи между блоками в Script Editor'е
    • Теперь для тестуры шрифта в Script Editor'е создаются мипмапы, текст на блоках при уменьшении мастаба стало легче разобрать
    • Полноценная загрузка уровней от Арктики.1, теперь можно сохранять
    • Галочка Uniform для инструмента Scale теперь снова работает
    • Добавлена возможность изменять размер Undo-буфера (пока только через редактирование файла editor_data\level_Editor.ini, секция history, параметр undo_limit)
  • Model Editor:
    • Добавлена вкладка со списком костей скелета + подсветка выбранной кости
    • Редактировение пресетов, для моделей от ласт лайта или последующих игр
  • Image Library:
    • Исправлено дописывание папки импорта к имени текстуры
    • Исправлен краш при импорте текстур в x86 версии
    • Исправлен сброс пути к папке ресурсов при закрытии окна настроек
    • Добавлена настройка качества сжатия crunch тектсур
  • binunp
    • Для ключей -d, -c, -s имя выходного файла теперь необязательно указывать. Если имя выходнго файла не указано, в случае декомпиляции оно будет равно имени входного файла с дописанным .txt (например из level.bin получится level.bin.txt), в случае компиляции будет убрана часть до последней точки, включая саму точку (например из level.terrain.txt получится level.terrain).
Rolan96
Цитата(Modera @ 18.11.2021, 18:32) *
Только примитивная система undo которая делает полный бекап сцены при каждом изменении себя не очень хорошо показала с уровнями арктики. Срабатывает довольно медленно (до 0,2 секунды задержка) и память жрёт как не в себя.
В общем, для таких тяжёлых уровней надо это улучшать и сохранять только изменения. Но это довольно сложно, поэтому я пока сделал просто возможность отключать undo напрочь.


может в таком случае интегрировать git?
Modera
Цитата(Rolan96 @ 30.11.2021, 01:07) *
может в таком случае интегрировать git?

А как это должно работать?
Rolan96
Цитата(Modera @ 30.11.2021, 01:14) *
Цитата(Rolan96 @ 30.11.2021, 01:07) *
может в таком случае интегрировать git?

А как это должно работать?

На открытый файл локации создавать локальный репозиторий, коммитить каждое изменение файла локации. В коммент к коммиту добавлять название действия.
Modera
Цитата(Rolan96 @ 30.11.2021, 09:32) *
На открытый файл локации создавать локальный репозиторий, коммитить каждое изменение файла локации. В коммент к коммиту добавлять название действия.

Так это ведь придётся сохранять файл на диск целиком, что даст ещё большие задержки. Или есть возможность обойтись без этого?
Rolan96
Цитата(Modera @ 30.11.2021, 16:42) *
Цитата(Rolan96 @ 30.11.2021, 09:32) *
На открытый файл локации создавать локальный репозиторий, коммитить каждое изменение файла локации. В коммент к коммиту добавлять название действия.

Так это ведь придётся сохранять файл на диск целиком, что даст ещё большие задержки. Или есть возможность обойтись без этого?

я могу ошибаться, но в коммите не весь файл вроде, а только часть, которая изменилась.
Modera
Rolan96, я тоже сильно не вникал как работает гит, просто если для того чтобы закоммитить файл нужно его полностью сохранять, то для ускорения это точно нецелесообразно.
Если можно коммитить только изменения то может что-то и можно сделать. Но так я уже не уверен что будет проще чем сохранять изменения вручную. laugh.gif
Modera
Всё-таки занялся поддержкой уровней исхода. Места не хватает, для того чтобы скачать исход пришлось удалить распак арктики.1 и war thunder
Но наверно надо всё-таки доделать то что я начинал ещё в 2019-м.
В этот раз решил начать не с самого лёгкого уровня как обычно, а с самого тяжёлого, и вчера доделал распаковку level.bin от DLC Владивостока. Немного цифр:
На уровне содержится 62144 объектов, 2942 инлайновых скриптов, 250477 скриптовых блоков и 546392 связей между блоками.
Для сравнения на самом большом уровне из оригинального 2033 было всего 6682 объекта, 208 скриптов с 6148 блоками и 10357 связями.
Распакованный level.bin в текстовом формате весит 211 мегабайт и содержит 6903451 строку. Декомпиляция этого дела вместе с сохранением занимает что-то около минуты (10 секунд непосредственно декомпиляция + 40 секунд запись в текстовый файл). Компиляция изначально была около 5 минут, но я уже оптимизировал до 30 секунд, т.к. львиную долю времени отнимало составление словаря.
Скрипт для декомпиляции скриптов получился самый жирный - аж 71 килобайт. Загружает что-то около 400 классов блоков, которые встречаются на уровне владивостока. И это ещё не всё, наверняка на других уровнях есть и другие классы блоков.

Все эти 400+ классов нужно отловить и исследовать в дебагере. Время утраченное на отладку увеличивается и увеличивается, сука.


Modera
Сегодня раздолбал ещё один уровень, на этот раз пустыню. Объектов там чуть меньше, 61408 штук, а вот скриптов аж 4150, с 371955 блоками и 826631 связями, из за чего уровень получается даже более тяжёлым чем владивосток, в распакованном виде файл весит 259 мегабайт и содержит 8531653 строчки.
Чёто я всё больше и больше сомневаюсь что редактор справится с такими уровнями z_6.gif

Вообще интересно что думают о таком количестве скриптов пользователи unreal engine которые утверждают что блюпринты медленные, надо всё делать на с++ и всё такое.
TheStalkerNest
Цитата(Modera @ 05.12.2021, 20:30) *
Сегодня раздолбал ещё один уровень, на этот раз пустыню. Объектов там чуть меньше, 61408 штук, а вот скриптов аж 4150, с 371955 блоками и 826631 связями, из за чего уровень получается даже более тяжёлым чем владивосток, в распакованном виде файл весит 259 мегабайт и содержит 8531653 строчки.
Чёто я всё больше и больше сомневаюсь что редактор справится с такими уровнями z_6.gif

Вообще интересно что думают о таком количестве скриптов пользователи unreal engine которые утверждают что блюпринты медленные, надо всё делать на с++ и всё такое.


Почему-бы не редактировать .bin файлы напрямую, без декомпиляции в текстовый формат?
Modera
Цитата(TheStalkerNest @ 05.12.2021, 22:06) *
Почему-бы не редактировать .bin файлы напрямую, без декомпиляции в текстовый формат?

Потому что это сложно, без преобразования в таблицу пришлось бы создать большую такую кучу структур копирующих объекты 4A Engine с сохранением наследования, плюс потом пришлось бы писать не только код загрузки, но ещё и код сохранения, и ещё составление списка свойств, и это для всех пяти игр. Я за такую работу бы точно не взялся.
Но памяти бы жрало меньше намного, это да.
Modera
Доделал поддержку всех уровней еходуса сегодня, вот билд binunp с ней (+сорцы): https://drive.google.com/drive/folders/1Hsa...r5D?usp=sharing
Редактор как-нить попозже, там ещё надо доделывать улучшение undo, и анимация 2033 в LE поломалась из за сортировки, и вообще надо проверить хотябы открывает он уровни исхода или нет. Я пока только сами левел.бин'ы распаковывал, к редактору при разборе даже не прикасался.

Делал разбор я на основе обычного еходуса с длц, не знаю подойдёт ли к enchaned edition.
К старой версии без длц не подойдёт точно, т.к. там другая версия спауна. Но это врядли кого-то сильно волнует, так что как-нибудь потом.

Кстати отжор памяти распакованными конфигами получилось оптимизировать больше чем в два раза ! Примерно по тому же методу как работает str_shared в движке. То есть вместо того чтобы на каждый параметр хранить копии строк названия и типа(они очень часто повторяются) я завёл список и ссылаюсь всегда на него. Так при загрузке левелбина от длц два полковника стало жрать вместо 1234 мегабайт всего 702. Но это не предел.
Так как теперь есть список строк хранить два тяжеленных 64-битных указателя стало не обязательно, можно хранить индексы меньшего размера. Я запихнул индексы имени и типа в один Longint (8 бит для типа, 24 бит для имени) и потребление памяти упало ещё больше, до 558 мегабайт. Всё-ровно много конечно, но всё же.
Правда скорость загрузки конфигов упала в два раза (с 10 до 20 секунд например) из за того что теперь при добавлении каждого параметра ищутся строки в списке, но это попробовать оптимизировать если искать по CRC вместо полноценного сравнивания строк (кстати в выложенном билде именно так и сделано), но я не уверен не случится ли где коллизии. Надо нормальную хеш-таблицу сделать.
Зато скорость создания копии конфига выросла из за того что копируется индекс а не две строки, не сильно правда, где-то на четверть.
JackieR
Цитата(Modera @ 07.12.2021, 13:15) *
Доделал поддержку всех уровней еходуса сегодня, вот билд binunp с ней (+сорцы): https://drive.google.com/drive/folders/1Hsa...r5D?usp=sharing


При декомпиляции 06_bridge или 06_spring:

Код
D:\Binunps\binunp_exodus>binunp -l -d level.bin level.txt
16
[JS] Error: size-pos < count
Loaded 'level.bin' in 1.0193401000s
Saving to level.txt
Saving time: 0.8104687000s

D:\Binunps\binunp_exodus>pause
Для продолжения нажмите любую клавишу . . .


При декомпиляции же dlc_2_vladivostok никаких ошибок нет.
Modera
JackieR, а ты с какого патча взял level.bin? У меня вот если открыть игру в MetroEX есть несколько папок content, content_00, content_01, content_02, content_03.
Нормально распаковывается только взятый из content_03.
02, 01 и 00 вылетают с can't open section 'ak sammy slot'
И только из папки content вылетает с size-pos < count, но время у меня меньше гораздо.
JackieR
Цитата(Modera @ 09.12.2021, 22:08) *
JackieR, а ты с какого патча взял level.bin? У меня вот если открыть игру в MetroEX есть несколько папок content, content_00, content_01, content_02, content_03.
Нормально распаковывается только взятый из content_03.
02, 01 и 00 вылетают с can't open section 'ak sammy slot'
И только из папки content вылетает с size-pos < count, но время у меня меньше гораздо.

Аа, понял. Брал из content.
Modera
Прикрутил к редатору инстансинг в надежде на увеличение производительности на уровнях исхода (снижение кол-ва вызовов отрисовки, всё такое)



Modera
Короче по поводу добавления новых текстурок в редукс. Я чё-то это не доделал и не выложил этот хак, надо наверное всё-таки выложить. Нажмите для просмотра прикрепленного файла

Ну и наверно нужно небольшое пояснение о том как это работает. Во первых нам потребуется сконструировать str_shared, т.к. функция загрузки опций текстуры принимает её в качестве параметра.

CODE
LPVOID p4 = LPBYTE(hMetro2033) + 0x0063CC50; // str_container::do_dock
memcpy(&str_container_do_dock, &p4, sizeof(void*));

g_string_container = (void**)(LPBYTE(hMetro2033) + 0x00D00C10);


CODE
struct shared_string;
void **g_string_container;
shared_string * (*str_container_do_dock)(void *_arg1, const void *data, int length, int type);

shared_string * mk_shared_string(const char *str)
{
return str_container_do_dock(*g_string_container, str, strlen(str), 0);
}


Работают эти общие строчки вроде так же как и в сталкире, за исключением того что добавился ещё тип строки (последний параметр str_container_do_dock, который тут равен 0).

Дальше нужны ещё две функции из движка, первая, которая перебирает все опции текстур в content.vfs и загружает их, и вторая которая загружает один файл с опциями.
CODE
LPVOID p1 = LPBYTE(hMetro2033) + 0x000DE404; // texture_manager::load_all_handles

LPVOID p2 = SetHookEx(p1, LPVOID(override_texture_manager_load_all_handles), 15);
memcpy(&real_texture_manager_load_all_handles, &p2, sizeof(void*));

LPVOID p3 = LPBYTE(hMetro2033) + 0x000DE550; // texture_manager::load_handle
memcpy(&texture_manager_load_handle, &p3, sizeof(void*));

g_texture_manager = (void**)(LPBYTE(hMetro2033) + 0x00D00DE8);

CODE
void **g_texture_manager;
void (*real_texture_manager_load_all_handles)(void);
void (*texture_manager_load_handle)(void *_arg1, shared_string **name);

void process_dir(const char *dir)
{
WIN32_FIND_DATA fd;
HANDLE hFind;

char str[MAX_PATH];
char *ext;
shared_string *s;

// 1. Process subsequent directories
strcpy(str, "content\\textures\\");
if(dir[0] != '\0') {
strcat(str, dir);
strcat(str, "\\*");
} else {
strcat(str, "*");
}

hFind = FindFirstFile(str, &fd);
if(hFind != INVALID_HANDLE_VALUE) {
do {
if(strcmp(fd.cFileName, ".") == 0)
continue;
if(strcmp(fd.cFileName, "..") == 0)
continue;

if(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
if(dir[0] != '\0') {
strcpy(str, dir);
strcat(str, "\\");
strcat(str, fd.cFileName);
} else {
strcpy(str, fd.cFileName);
}

process_dir(str);
}
} while(FindNextFile(hFind, &fd));

FindClose(hFind);
}

// 2. Process .bin files
strcpy(str, "content\\textures\\");
if(dir[0] != '\0') {
strcat(str, dir);
strcat(str, "\\*.bin");
} else {
strcat(str, "*.bin");
}

hFind = FindFirstFile(str, &fd);
if(hFind != INVALID_HANDLE_VALUE) {
do {
if(strcmp(fd.cFileName, ".") == 0)
continue;
if(strcmp(fd.cFileName, "..") == 0)
continue;

if((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) {
if(dir[0] != '\0') {
strcpy(str, dir);
strcat(str, "\\");
strcat(str, fd.cFileName);
} else {
strcpy(str, fd.cFileName);
}

// cut the extension
// string is always end with ".bin", so it's safe
ext = str + strlen(str) - 4;
*ext = '\0';

// make shared string and load texture options
s = mk_shared_string(str);
texture_manager_load_handle(*g_texture_manager, &s);
}
} while(FindNextFile(hFind, &fd));

FindClose(hFind);
}
}

void override_texture_manager_load_all_handles(void)
{
// 1. call original function (load all handles in archives)
real_texture_manager_load_all_handles();

// 2. add handles fom content folder
process_dir("");
}


Честно говоря я уже не помню как я нашел эти функции. Первую толи по коллстеку из функции загрузки опций одной текстуры, толи по тому что там используется строка "*.bin". Вторая функция в оригинальном движке (в PDBшке точнее) имеет какое-то аццкое имя чуть ли не тысячу символов длинной, потому что там очень интенсивно используются всякие шаблоны, и я даже не хочу ничего об этом вспоминать.

Короче первая функция нужна нам только для того чтобы на неё повесить хук, и сразу после перебора файлов в content.vfs вызвать перебор файлов в распакованной папке. Вторая нужна по прямому назначению, для загрузки опций. Перебор файлов делается стандартными виндовыми функциями, ничего удивительного в этом нет.

У меня в такому решению есть пара вопросов. Во первых возможно тут утекает общая строка с именем текстуры, т.к. в оригинальном движке этот класс с автоматическим счётчиком ссылок, чего я не сделал. А может и не утекает, я во всех этих хитросплетениях C++ плохо ориентируюсь. Во вторых тут получается так что если вы подменяете опции текстур которые уже есть в content.vfs то они будут загружены два раза (оба раза изменённый файл из папки content). Не знаю на сколько это плохо, но у меня вроде ничего не крашится, хотя я только с один файлом проверял.
С другой стороны для того чтобы избежать повторной загрузки нужно проверять есть ли файл с таким именем в архиве прежде чем загружать, а как это сделать аккуратно я не знаю, т.к. функции vfs::exist как в арктике в редаксе ещё вроде нет, ну или я её не нашел, а если проверять функцией открытия файла то потом непонятно как его закрыть, т.к. этот момент я не исследовал.
Modera
Короче выпустил новую версию редактора и консольных утилит с накопившемися изменениями за зиму. Скорее эта версия будет последней.
Цитата(Modera @ 01.03.2019, 00:36) *
Версия от 6 февраля 2022:
  • Level Editor:
    • Переименован пункт меню Make Addon в Move selection to level.add.bin
    • Переименован пункт меню Make Global в Move selection to level.bin, а так же исправлена его работа (раньше не работало)
    • Добавлен пункт меню Select all entities from level.add.bin для выделения всех объектов которые сохраняются в level.add.bin
    • Ускорено заполнение списка свойств при выделении объектов
    • Добавлен опционально двухколоночный список свойств, включить можно в level_Editor.ini, секция properties, параметр two_column
    • Добавлена опция для скрытия объектов по удалению от камеры согласно параметру cull_distance (в меню Render -> Distance Culling)
    • Исправлена возможность редактировать уровень до того как он полностью загрузится, что приводило к ошибке
    • Переработана система Undo с целью сделать её быстрее, менее требовательной к памяти, и устранения многих странных моментов, например когда бекап делался после изменения а не до, как положено
  • binunp:
    • Добавлен подсчёт времени затраченного на загрузку и сохранение конфигов при декомпиляции и компиляции
  • Исправлена ошибка из за которой не грузился sounds.bin от ласт лайта
  • Исправлен жирный баг с неработающим перемещением в анимациях от оригинального 2033
  • Анимации от Last Light и Redux теперь загружаются
  • Полное чтение и сохранение level.bin'ов от Исхода последней версии (загрузка изменённых файлов игрой не тестировалась)
  • Оптимизирован отжор памяти распакованными конфигами
  • Оптимизирована отрисовка сцены за счёт снижения количества переключения текстур (не очень, можно и лучше)

JackieR
Шикарно.
Rolan96
Modera, похоже уровни из редактора исход не воспринимает. Ни версия с ртх, ни обычная.
Мб получилось у кого-нибудь уровень отредактировать чтобы игра воспринимала? У меня вылетает на загрузке уровня.
JackieR
Цитата(Rolan96 @ 08.02.2022, 20:44) *
Modera, похоже уровни из редактора исход не воспринимает. Ни версия с ртх, ни обычная.
Мб получилось у кого-нибудь уровень отредактировать чтобы игра воспринимала? У меня вылетает на загрузке уровня.

Уровни Исхода из content_03 считываются, насколько я понял. На последнем патче. А текущая версия MetroEX может только в запаковку content.
Rolan96
JackieR, как-то в таком случае не логично вылядит.
Если бы уровни считывались из content_03 вылета бы не было, разве не так?

чет я совсем не уверен, что уровни из контент03 читаются.
Запаковал уровень 000 без изменений в архив и подсунул игре. Все запустилось.
Внёс изменения, перепаковал архив и вылет после вступительного ролика.

Ну и есть небольшая разница в размере, если просто сохранить без изменений, мб чего-то не досохраняется?


справа оригинальный
Rolan96
JackieR, все же вы скорее всего правы по поводу content_03, то что вчера писал это проводил на версии с лучиками, там content_03 нет.
Но даже когда я запаковал изменённую локу в архив с content_03 для обычного метро, чуда не произошло. Я заметил, что в первых строках оригинальных *.vfx файлах после названия архива пишется имена уровней, которые должны быть в нем и видимо ещё где-то в файле упоминается имя уровня, поэтому уровни никак не читаются:(
MetroEx пишет очень простые vfx файлы.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.