Конвертирование уровня в формат Метро 2033 — S.T.A.L.K.E.R. Inside Wiki

Конвертирование уровня в формат Метро 2033

Материал из S.T.A.L.K.E.R. Inside Wiki

Перейти к: навигация, поиск

Подготовка

Нам понадобится:

  • Какой-нибудь уровень от сталкера
  • Текстуры от этого уровня
  • Распакованный уровень 000 из Metro 2033
  • Конвертер моделей в формат 4A Engine
  • Запаковщик ресурсов

Скачать конвертер можно тут.
Скачать запаковщик можно тут.

Конвертирование геометрии и запуск

В виду того что для добавления действительно нового уровня необходимо изменять scripts.bin, а инструментов для этого нет, в этом туториале мы будем заменять уже имеющийся уровень 000, то есть уровень меню, который загружается сразу при запуске игры. Как вручную добавить уровень не заменяя уже имеющиеся я напишу ниже.

И так, для того чтобы сконвертировать геометрию нужно папку с уровнем от сталкера переместить в папку с конвертером моделей model.exe, там же нужно создать папку в которую сохранится сконвертированный уровень. Так как мы будем заменять уровень 000 папку назовём так-же, 000. Когда всё скопировано и создано можно запускать конвертер из батника или командной строки:

model.exe -level2level xray_level 000

Где xray_level - имя папки уровня от сталкера. В случае запуска батником я рекомендую добавить второй строчкой pause, т.к. в будущем понадобится информация которую конвертер выводит в консоль. Ещё можно добавить ключ -nomu, в таком случае конвертер удалит с уровня все MU-модели. Это такие объекты как машины, деревья, мумии дохлых сталкиров.

model.exe -nomu -level2level xray_level 000

Если всё прошло хорошо, конвертер напишет размеры вершинного и индексного буферов. Например такие:

vertex buffer size: 22304928
index buffer size: 3093594

Теперь можно приступать к созданию игрового архива. Для начала нужно в папке content запаковщика создать папку maps и скопировать туда папку с оригинальным уровнем 000, после чего заменить там файлы level, level.geom_pc и level.nxcform_pc на те что выдал конвертер. Следующим шагом нужно записать размеры вершинного и индексного буфера в файл level.pf. Открыв этот файл текстовым редактором в первой строчке можно увидеть что-то такое:

*32,16785696,16785736,2360094
Attention.gif Внимание
Если вы вместо подобной строчки видите кракозябру распаковщик ресурсов следует сменить на другой.

Число 32 трогать не нужно, второе число нужно заменить на размер вершинного буфера, третье число заменить на размер вершинного буфера плюс сорок, четвёртое число заменить на размер индексного буфера. Если этого не делать вместо уровня в игре будет каша из треугольников.

Всё, теперь можно копировать текстуры и создавать архив. Текстуры преобразовывать в файлы .512, .1024, .2048 не нужно, без настроек в textures.bin движок будет читать их из .dds. Когда текстуры скопированы в content\textures можно запускать make_upk.bat и, дождавшись окончания его работы, копировать файл content.upk9 в папку с игрой. Если всё было сделано правильно то теперь вместо привычной комнаты меню будет то что мы наконвертировали с висящими в воздухе человеками, дверью и прочим хламом. Чтобы была возможность ходить по уровню нужно отредактировать файл level.bin, об этом следующий раздел.

Редактирование level.bin

Я не буду подробно описывать как редактировать level.bin, вместо этого приведу пример такого файла где заспаунен только игрок в нулевой точке с некоторым снаряжением.
Скачать пример.

Может возникнуть вопрос как изменить позицию игрока. Для этого находим в файле playeronly.txt секцию player_0004 и ищем там параметр с пустым именем и типом pose, matrix, он находится прямо перед параметром name : name. Это матрица трансформации, состоит из 16 чисел, с её помощью можно указывать позицию, поворот, масштаб, и даже другие трансформации. Про матрицы инфы в интернете полно, я лишь скажу что последние 4 числа являются позицией, то есть X, Y, Z, 1. Последнее должно быть единицей, на него по идее делятся остальные, но это не точно.

Скомпилировать playeronly.txt в level.bin можно с помощью утилиты binunp, вот так:

binunp.exe -l -c playeronly.txt level.bin

Как добавить новый уровень не заменяя уже имеющиеся

Для того чтобы добавить новый уровень нужно добавить его конфиг в scripts.bin, иначе игра не запустится. Scripts.bin состоит из такого вида записей: 4 байта CRC32 хэш от имени файла, 4 байта размер файла, и сам файл указанного размера. Хэш считается от полного имени файла, для уровня 000 имя конфига будет content\scripts\000.bin. Так что считаем хэш, делаем конфиг своему уровню и через хекс-редактор дописываем его в конец scripts.bin. После того как всё добавлено и запаковано уровень можно запустить такой командой:

metro2033.exe -server -map имяуровня

Назначение шейдеров и материалов

По умолчанию все поверхности на уровне являются непрозрачными и имеют деревянный материал. Это не очень хорошо. Назначить шейдеры и материалы можно в файлах shadersbytextures.txt и materialsbytextures.txt. Как понятно из названия, назначение происходит по имени текстуры. Например если в shadersbytextures.txt добавить строчку mtl\mtl_fence1=geometry\default_aref то все поверхности с текстурой mtl\mtl_fence1 станут поддерживать прозрачность. Так же можно удалить некоторые поверхности указав вместо шейдера или материала <none>. В случае указания вместо шейдера поверхность будет удалена вообще, а в случае указания вместо материала будет удалена только из коллизии, такие поверхности будут видимы но сквозь них можно будет свободно проходить. Узнать список доступных шейдеров и материалов можно из конфигов в scripts.bin. Имена шейдеров есть в render_subst_all.bin, а имена материалов в game_materials.bin. Первый можно распаковать и прочитать, второй распаковать нельзя и придётся в нём искать строки начинающиеся с material\. Искать можно хекс-редактором или лучше утилитой Search&Replace.

Список статических материалов
Другие места
LANGUAGE