Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SDK для 4A Engine своими руками
GAMEINATOR forums > Общие разделы > Создание и модификация игр. Геймдев.
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18
Modera
Вышла новая версия, изменения такие:
  • Исправлена ошибка с мерцающей позицией камеры в Level Editor
  • Улучшен рассчёт хеми на MU моделях на картах конвертированных из сталкера, теперь c_scale и c_bias учитываются
  • Новый редактор textures.bin - Image Library


К редактору текстур надо бы инструкцию написать, но у меня сейчас 3 часа ночи, поэтому коротко опишу что к чему.
При первом запуске он у вас попросит указать путь к папке content, который потом можно изменять в настройках. Так же в настройках можно указать папку импорта и папку патча.
В папку импорта нужно класть .dds файлы, сохраняя вложенность, потом жать Check new textures, редактор скопирует текстуры в игру и добавит настройки в textures.bin. Для того чтобы работал стриминг, т.е. вместо .dds появились файлы .512/.1024/.2048 текстура должна обладать определёнными параметрами: быть в разрешении 512х512 1024х1024 или 2048х2048, быть в формате DXT1 или DXT5, содержать полную цепочку мипмапов и не быть кубомапой. Если это условие не выполнено будет просто скопирован ддс. Изменение галки streamable также автоматически конвертирует текстуры в нужный формат.
Папка патча нужна в виду того что при моддинге метро мы работаем не с цельной папкой ресурсов, а с патч-архивами содержащими только изменённые файлы. ВСЕ изменения файлов в папке content будут продублированы в папку патча.

Хотел ещё предпросмотр материалов на 3д модели сделать, с бампами, деталями и т.п., но так у меня доделка этого редактора ещё на месяц затянется, если не больше.

А вообще этот редактор толком не тестировался, чувствую придётся скоро ещё одну баг-фикс версию выпускать.

Ссылка как всегда та же самая: https://drive.google.com/drive/folders/1lDg...5nGES42CpW3mRdg
JackieR
Красотища.
А как там дела с конвертером уровней и navmesh? Могу у себя протестировать, если нужно.
Modera
JackieR, конвертером уже давно можно конвертировать уровни для ласт лайта и даже редакса, с ключами -ll или -redux.
А с навмеш, я попробовал собрать те сорцы которые недавно выкладывал, там была пара ошибок из за несовместимости моей кодобазы и tsnest, я их исправил но чё-то у меня эта ДЛЛка не завелась, рабочий билд есть только с моей старой версией только для непатченной пиратки. Да, возможность создавать навмеш сразу из .model, без конвертирования в .raw я доделал
TheStalkerNest
Цитата(Modera @ 20.09.2021, 14:02) *
JackieR, конвертером уже давно можно конвертировать уровни для ласт лайта и даже редакса, с ключами -ll или -redux.
А с навмеш, я попробовал собрать те сорцы которые недавно выкладывал, там была пара ошибок из за несовместимости моей кодобазы и tsnest, я их исправил но чё-то у меня эта ДЛЛка не завелась, рабочий билд есть только с моей старой версией только для непатченной пиратки. Да, возможность создавать навмеш сразу из .model, без конвертирования в .raw я доделал


Моя дллка не заведётся, т.к. сигнатуры в ll другие.
Пока к сожалению нет возможности заняться сигнатурами для ll, поэтому добавление его поддержки, затянулось.
Modera
TheStalkerNest, так я на 2033 и запускал. Навмеш то сначала генерируется для 2033 как обычно, на исключением других шейпов, потом конвертируется в формат ЛЛ.

У меня при запуске вышибает исключение 0xC000007B. Наверно из за того что я 2008-ой студией собрал вместо нужной версии.
JackieR
Обратил тут внимание на файлики в папках с оригинальными уровнями - "level.portals". Смею предположить что это что-то связанное с порталами и секторами, штука для отрисовки только видимой игроком геометрии. Никто не пробовал разобрать эти файлы?
У нас в "Наследии" довольно увесистые уровни получаются, особенно связанные с поверхностью. Было бы не лишним там порталов натыкать.
Modera
JackieR, вот в этом просмотрщике разбирали: https://github.com/nta/metro2033-tools/tree...ster/level_view
Но как я понял там не полностью файл читается.

Файл с порталами ещё как-то на звук влияет, если подсунуть файл от одного уровня к другому то движок в консоли ругается на Invalid sound occlusion version из за несовпадения контрольной суммы, и звук при этом пропадает.
Билдомассон
Можно ли сделать чтобы визуал скрипты выглядели, как рестрикторы(кубы или шейпы), потому что как флажок они теряются среди других вещей с такими же флажками. unsure.gif
Berkut107
Цитата(Билдомассон @ 28.09.2021, 21:17) *
Можно ли сделать чтобы визуалы скрипты выглядели, как рестрикторы(кубы или шейпы), потому что как флажок они теряются среди других вещей с такими же флажками. unsure.gif

поддерживаю, либо хотя бы цвет флажков заменить
TheStalkerNest
Цитата(Modera @ 20.09.2021, 14:02) *
JackieR, конвертером уже давно можно конвертировать уровни для ласт лайта и даже редакса, с ключами -ll или -redux.
А с навмеш, я попробовал собрать те сорцы которые недавно выкладывал, там была пара ошибок из за несовместимости моей кодобазы и tsnest, я их исправил но чё-то у меня эта ДЛЛка не завелась, рабочий билд есть только с моей старой версией только для непатченной пиратки. Да, возможность создавать навмеш сразу из .model, без конвертирования в .raw я доделал


Можете скинуть исходники генератора навмеша не на базе моих исходников?
Я в своей дллке уже почти завершил полную поддержку ll, осталось только генерацию навмеша перенести.
С ней проблемы возникли.
Modera
TheStalkerNest, пожалуйста: https://drive.google.com/file/d/1gSoXcYvYmm...iew?usp=sharing
В наличии также загрузичик моделей игрового формата (.model) вместо .raw
TheStalkerNest
Цитата(Modera @ 21.10.2021, 02:34) *
TheStalkerNest, пожалуйста: https://drive.google.com/file/d/1gSoXcYvYmm...iew?usp=sharing
В наличии также загрузичик моделей игрового формата (.model) вместо .raw


Спасибо. Думал у меня где-то ошибка в коде, а оказалось, в ll ещё больше переписали pathengine, из-за чего у меня методы в нём не работают.
Видимо, так и придётся генерировать навмеши для ll через оригинал 2033.
Modera
TheStalkerNest, а у тебя не работает именно генерация (buildMeshFromContents) или сохранение (saveGround, saveCollisionPreprocessFor, savePathfindPreprocessFor)?
TheStalkerNest
Цитата(Modera @ 21.10.2021, 16:34) *
TheStalkerNest, а у тебя не работает именно генерация (buildMeshFromContents) или сохранение (saveGround, saveCollisionPreprocessFor, savePathfindPreprocessFor)?


buildMeshFromContent
Modera
TheStalkerNest, плохо. Если б не работало сохранение у меня есть идея как с ним разобраться, а с этим нет.
TheStalkerNest
Цитата(Modera @ 21.10.2021, 17:50) *
TheStalkerNest, плохо. Если б не работало сохранение у меня есть идея как с ним разобраться, а с этим нет.


Закомментировав метрошный метод loadMeshFromStream, успешно удалось пройти стадию ctx = real_mesh->newContext();
Дальше краш на burnContextIntoMesh. Тут я пока не разобрался.
Modera
TheStalkerNest, а разве loadMeshFromStream это не загрузка уже скомпилированной модели?

Цитата(TheStalkerNest @ 21.10.2021, 16:53) *
Дальше краш на burnContextIntoMesh. Тут я пока не разобрался.

Этим я думаю можно пренебречь для тестов, главное чтоб сама модель и все препроцессы к ней создались.
TheStalkerNest
Цитата(Modera @ 21.10.2021, 18:44) *
TheStalkerNest, а разве loadMeshFromStream это не загрузка уже скомпилированной модели?

Цитата(TheStalkerNest @ 21.10.2021, 16:53) *
Дальше краш на burnContextIntoMesh. Тут я пока не разобрался.

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


Этот метод я взял из твоего кастомного хедера. Я использую другой хедер от 5.14 с добавленными методами из 5.16 по официальному changelog'у.
На оригинальном метро он не заводился, а с добавлением этого метода и dummy методов, всё заработало, я и подумал, что это метрошный метод :/

На дллке 5.16 из JustCause 2, этого метода, тоже не было.

Пока эксперементирую с смещениями в хедере, в надежде завести его на ll.
Modera
Цитата(TheStalkerNest @ 21.10.2021, 19:15) *
я и подумал, что это метрошный метод :/

Так и есть, это метрошный метод, 4А добавляли там всякое для себя, поэтому хедеры и не подходят. Я методом тыка разбирался с этим, dummy это новые методы, и возможно они даже не в тех местах где должны быть на самом деле.

В ласт лайте ещё как я понял функции сохранения (saveGround, saveCollisionPreprocessFor, ...) принимают не родной для pathengine интерфейс iOutputStream (или как там его?) а движковый iwriter. С этим тоже придётся поплясать. Зато модель должна сохранится сразу в нужном формате, не придётся перегонять из tok в bin.
TheStalkerNest
Цитата(Modera @ 21.10.2021, 20:39) *
Цитата(TheStalkerNest @ 21.10.2021, 19:15) *
я и подумал, что это метрошный метод :/

Так и есть, это метрошный метод, 4А добавляли там всякое для себя, поэтому хедеры и не подходят. Я методом тыка разбирался с этим, dummy это новые методы, и возможно они даже не в тех местах где должны быть на самом деле.

В ласт лайте ещё как я понял функции сохранения (saveGround, saveCollisionPreprocessFor, ...) принимают не родной для pathengine интерфейс iOutputStream (или как там его?) а движковый iwriter. С этим тоже придётся поплясать. Зато модель должна сохранится сразу в нужном формате, не придётся перегонять из tok в bin.


Возможно всё-таки получится реализовать отдельную утилиту.
Я как-то писал пол-года назад, что удалось инициализировать дллку 5.16, хукнув методы аллокации, однако дальше дело тогда не пошло.
Сейчас пореверсил её, заменил хуки на полноценную эмуляцию игрового аллокатора, и обнаружил ещё одно изменение в iFaceVertexMesh. Там перед методом faces, был добавлен ещё какой-то метод. На данный момент добавил пустой метод-затычку, и вроде-бы всё успешно дошло до метода saveGround. В нём дллка кидает ошибку. Завтра покопаюсь ещё. Исходники оставляю тут, если интересно глянуть (пути до файлов, прописаны в исходнике, для отладки).



https://drive.google.com/file/d/1_yPusz67EP...iew?usp=sharing
TheStalkerNest
Публикую новую версию игрового плагина MetroDeveloper.
https://github.com/tsnest/MetroDeveloper/re...roDeveloper.zip

Интегрирована поддержка генерации навмеша для metro last light, через metro 2033 (by Modera).

Интегрирована поддержка формата .model для генерации навмеша (by Modera).

Исправлен неправильный алгоритм генерации навмеша (by Modera).

Исправлено некорректное закрытие игры при генерации навмеша с включенным параметром exitwhendone.

Теперь при генерации навмеша, intro ролики не запускаются, вне зависимости от того, включен-ли параметр nointro.

Убрана 5-ти секундная задержка при генерации навмеша (теперь навмеш генерируется сразу, как только загрузится игра).

Всем функциям кроме nav_map, добавлена полная поддержка last light.

Внешнее окно консоли, теперь открывается только при генерации навмеша.

Добавлен звуковой сигнал при загрузке плагина (Можно отключить в конфиге. Параметр beep).

Переименован конфиг.

Обновлена инструкция по генерации навмеша.

Прочие незначительные правки кода.

По идее, плагин теперь должен работать и на Windows XP.
TheStalkerNest
Пытался реализовать чтение ресурсов из папки content, для оригинального метро, и даже удалось вывести список файлов, однако хук некорректно работает из-за __usercall соглашения.



Modera, поможешь в реализации asm хука и вызова функции читающей файлы с диска? Ниже адреса функций для твоего exe.
Судя по выведенной инфе, функция читает абсолютно все файлы, в отличии от redux.

Адрес функции читающей файлы с архивов:
metro2033.exe + 0x538B70

Адрес функции читающей файлы с диска:
metro2033.exe + 0x538920
Modera
TheStalkerNest, 2033 чё-то не хочет у меня запускаться если вызывать vfs::ropen_os вместо vfs::ropen. Просто сразу крашится и всё.

Ласт лайт получше себя чувствует, но геометрия и текстуры не грузятся. Похоже та же песня что и с редаксом.

Копипаст кода хука можно лицезреть в блокноте справа.


Походу заменять только одну функцию мало, там есть ещё какая-то vfs::rbuffered, которой грузится геометрия и текстуры.
Кстати эта функция есть и в 2033, даже на твоём скрине видно что нет сообщения о загрузке level.geom_pc.
TheStalkerNest
Цитата(Modera @ 24.10.2021, 22:54) *
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)
Modera
Цитата(TheStalkerNest @ 24.10.2021, 22:28) *
Т.е. на ласт лайте vfs::ropen_os не все перехваченные файлы грузит? Если да, то может попробовать для тестов не всю распакованную папку грузить, а например какие-то отдельные файлы (например level.bin подменить)?

Ну я как-то так и сделал, что сначала проверяется есть ли нужный файл в распакованной папке content, если есть то вызывается vfs::ropen_os, иначе вызывается оригинальная функция для чтения из архива. level.bin подменять таким образом можно.

Цитата(TheStalkerNest @ 24.10.2021, 22:28) *
По поводу краша на 2033, то там регистры у обоих функций отличаются. Возможно ты это не учёл.

Ну я вроде переставлял esi в edi. Можно ещё раз попробовать.
Modera
Всё-таки получилось хукнуть 2033, надо было оказывается сохранять значение edi.


История та же самая что и с ЛЛ и с редаксом, геометрия не грузится.
TheStalkerNest
Цитата(Modera @ 25.10.2021, 00:51) *
Всё-таки получилось хукнуть 2033, надо было оказывается сохранять значение edi.


История та же самая что и с ЛЛ и с редаксом, геометрия не грузится.


Можешь пожалуйста, написать готовый хук в дллку под синтаксис intel?
Я всё правильно переписал с скриншота, однако при компиляции, добавляются левые команды, которые вообще непонятно откуда берутся :/

Modera
TheStalkerNest, попробуй указать для своей функции __declspec(naked).

А так, я сам точно не знаю как чисто ассемблерную функцию сделать в майкрософтовском компиляторе. Разве что в отдельном .asm файле писать.
TheStalkerNest
Цитата(Modera @ 25.10.2021, 03:48) *
TheStalkerNest, попробуй указать для своей функции __declspec(naked).

А так, я сам точно не знаю как чисто ассемблерную функцию сделать в майкрософтовском компиляторе. Разве что в отдельном .asm файле писать.


Спасибо, помогло!
TheStalkerNest
Публикую новую версию игрового плагина MetroDeveloper от 25.10.2021.
https://github.com/tsnest/MetroDeveloper/re...roDeveloper.zip

Добавлена частичная разблокировка чтения ресурсов из папки 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
Цитата(Modera @ 24.10.2021, 22:54) *
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
Ещё одно обновление плагина MetroDeveloper.
https://github.com/tsnest/MetroDeveloper/re...roDeveloper.zip

Теперь level.geom_pc тоже может грузится из папки content.

======================

Для звуков и текстур, нет готовых функций чтения с диска.
Заметил, что vfs::rbuffered вызывает vfs::ropen_x_reader_1_. Есть аналогичная функция vfs::ropen_x_reader_0_, которая используется в функциях vfs::ropen и vfs::ropen_os.
Предполагаю, если в функции vfs::rbuffered подменить вызов функции, то файлы будут грузится из папки. Буду копать дальше.
Modera
Цитата(TheStalkerNest @ 25.10.2021, 15:16) *
Думаю, если ещё поискать, то можно найти аналогичные функции для всего остального.

Ну если найдёшь аналогчиные решения для текстур и остальных случаев использования rbuffered, то можно эту функцию и не трогать.
Хотя я бы предпочёл всё-таки хукнуть rbuffered, т.к. это более аккуратное решение.
Modera
Получилось подменить функцию rbuffered для редакса, геометрия и лайтмап грузится, nav_map.bin всё ещё нет, как выяснилось есть какая-то третья функция rblock_init death.gif

Код
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 килобайта, покрайне мере в случае загрузки лайтмапа. Я сделал так же и у меня всё заработало.
TheStalkerNest
Цитата(Modera @ 26.10.2021, 02:32) *
Получилось подменить функцию rbuffered для редакса, геометрия и лайтмап грузится, nav_map.bin всё ещё нет, как выяснилось есть какая-то третья функция rblock_init death.gif

Код
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
В дополнение к моему сообщению выше.
Проверил на оригинале 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);
}
Modera
Цитата(TheStalkerNest @ 26.10.2021, 10:31) *
А текстуры нормально подгружаются, или как раньше, с отключением проверки non streamable?

Новые не подгружаются, я так понимаю дело в том что не считываются настройки из имя_текстуры.bin.
Стандартные текстуры и настройки заменяются.

Цитата(TheStalkerNest @ 26.10.2021, 10:31) *
Кстати, как удалять отдельные плитки в Script Editor?

Shift + клик по тому что хочешь удалить, помоему.

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

Теперь звуки, level.lmap_pc, skybox и envmap, тоже могут грузится из папки content.
Berkut107
bravo7kg.gif
Цитата(TheStalkerNest @ 26.10.2021, 18:41) *
Обновление игрового плагина MetroDeveloper от 26.10.2021.
https://github.com/tsnest/MetroDeveloper/re...roDeveloper.zip

Теперь звуки, level.lmap_pc, skybox и envmap, тоже могут грузится из папки content.

Modera
Сегодня удалось заставить редакс считывать новые настройки для текстур из папки content. Вот автобус из сталкира с наложенной на него детальной картой:


Осталось ещё разобраться с загрузкой nav_map.bin и прописыванием новых карт в content.vfx.
Modera
Короче, с навмапой разобрался, там всё просто, и одновременно не очень. У функции rblock_init оказывается есть параметр позволяющий чтение файла стандартными функциями, а не из игрового архива, так что можно эту функцию вообще не трогать. Но! Нужно поменять значение одной стековой переменной в самой функции загрузки навмеша, вот тут:

Сейчас туда записывается всегда ноль, а должна быть единичка. Причём не всегда, а только если файл на самом деле существует. Даже не знаю как эту задачу лучше решить, видимо придётся делать врезку.
Патчить rblock_init смысла нет, т.к. эта переменная туда передаётся по значению, а не по указателю, а значение должно совпадать, т.к. эта переменная потом где-то вычитывается и что-то идёт не так.

Самое главное что nav_map.bin от ластлайта подходят! biggrin.gif Хоть с этим танцевать не придётся.

Со второй проблемой необходимости добавления новых карт в content.vfx aka Вечная "Загрузка контента... Выход в главное меню" тоже вроде разобрался. Можно просто запатчить вот здесь jne на jmp и всё будет грузится без записей в content.vfx тогда.

Не знаю только не отразится ли это на работоспособности оригинальных карт, которые в архивах, но вроде запускаются.

Короче теперь запаковщик для редакса можно не делать.
TheStalkerNest
Цитата(Modera @ 28.10.2021, 20:47) *
Короче, с навмапой разобрался, там всё просто, и одновременно не очень. У функции rblock_init оказывается есть параметр позволяющий чтение файла стандартными функциями, а не из игрового архива, так что можно эту функцию вообще не трогать. Но! Нужно поменять значение одной стековой переменной в самой функции загрузки навмеша, вот тут:

Сейчас туда записывается всегда ноль, а должна быть единичка. Причём не всегда, а только если файл на самом деле существует. Даже не знаю как эту задачу лучше решить, видимо придётся делать врезку.
Патчить rblock_init смысла нет, т.к. эта переменная туда передаётся по значению, а не по указателю, а значение должно совпадать, т.к. эта переменная потом где-то вычитывается и что-то идёт не так.

Самое главное что nav_map.bin от ластлайта подходят! biggrin.gif Хоть с этим танцевать не придётся.

Со второй проблемой необходимости добавления новых карт в content.vfx aka Вечная "Загрузка контента... Выход в главное меню" тоже вроде разобрался. Можно просто запатчить вот здесь jne на jmp и всё будет грузится без записей в content.vfx тогда.

Не знаю только не отразится ли это на работоспособности оригинальных карт, которые в архивах, но вроде запускаются.

Короче теперь запаковщик для редакса можно не делать.


Отлично. Сегодня займусь поддержкой редаксов. Скачал last light, оказывается у обоих редаксов, одна и та-же сборка движка.
Отличаются только дата сборки, секции .text и .bind (стимовская привязка).
Поэтому запариваться с сигнатурами для обоих редаксов, не придётся, будет работать на обоих.

Кстати, выше писал что файл level не подгружается. Я не заметил, оказывается всё норм.
Modera
Цитата(JackieR @ 26.09.2021, 15:47) *
Обратил тут внимание на файлики в папках с оригинальными уровнями - "level.portals". Смею предположить что это что-то связанное с порталами и секторами, штука для отрисовки только видимой игроком геометрии. Никто не пробовал разобрать эти файлы?
У нас в "Наследии" довольно увесистые уровни получаются, особенно связанные с поверхностью. Было бы не лишним там порталов натыкать.

Попробовал конвертировать порталы, проверял на уровне X-16, никаких изменений в производительности не заметил, во всяком случае в лучшую сторону. Звук не работает как и ожидалось из за того что не полностью пишется файл level.portals. Однако сами порталы вроде работают - если удалить/испортить файл level.portals то вместо порталов будут дырки, если включить статистику то там меняется норме сектора при переходе из одной комнаты в другую.

Кому интересно можете сами затестить (если запустится конечно tongue.gif)
Уровень с порталами - https://drive.google.com/file/d/1E23lXFIl4Q...iew?usp=sharing
Уровень без порталов - https://drive.google.com/file/d/1TeWbfj_Gxi...iew?usp=sharing
Конвертер который умеет переносить порталы - https://drive.google.com/file/d/1H9RljfXPq2...iew?usp=sharing
TheStalkerNest
Цитата(Modera @ 29.10.2021, 17:44) *
Цитата(JackieR @ 26.09.2021, 15:47) *
Обратил тут внимание на файлики в папках с оригинальными уровнями - "level.portals". Смею предположить что это что-то связанное с порталами и секторами, штука для отрисовки только видимой игроком геометрии. Никто не пробовал разобрать эти файлы?
У нас в "Наследии" довольно увесистые уровни получаются, особенно связанные с поверхностью. Было бы не лишним там порталов натыкать.

Попробовал конвертировать порталы, проверял на уровне X-16, никаких изменений в производительности не заметил, во всяком случае в лучшую сторону. Звук не работает как и ожидалось из за того что не полностью пишется файл level.portals. Однако сами порталы вроде работают - если удалить/испортить файл level.portals то вместо порталов будут дырки, если включить статистику то там меняется норме сектора при переходе из одной комнаты в другую.

Кому интересно можете сами затестить (если запустится конечно tongue.gif)
Уровень с порталами - https://drive.google.com/file/d/1E23lXFIl4Q...iew?usp=sharing
Уровень без порталов - https://drive.google.com/file/d/1TeWbfj_Gxi...iew?usp=sharing
Конвертер который умеет переносить порталы - https://drive.google.com/file/d/1H9RljfXPq2...iew?usp=sharing


Не работает как на стим версии, так и на версии без dlc. Попробую перепаковать.
Modera
TheStalkerNest, scripts.bin не подходит скорее всего, на пиратке 2010 года без патчей у меня запускается.
TheStalkerNest
Цитата(Modera @ 29.10.2021, 18:35) *
TheStalkerNest, scripts.bin не подходит скорее всего, на пиратке 2010 года без патчей у меня запускается.


Странно. У меня пиратка без dlc, с точно таким-же exe'шником, как у тебя.
Modera
TheStalkerNest, да, тогда странно что не запускается.
TheStalkerNest
Цитата(Modera @ 29.10.2021, 19:06) *
TheStalkerNest, да, тогда странно что не запускается.


Скинь пожалуйста код правки, я в стимовский scripts.bin вставлю.
Modera
TheStalkerNest, там ничё не правилось, только 000.bin скопирован как 111.bin
TheStalkerNest
Цитата(Modera @ 29.10.2021, 19:29) *
TheStalkerNest, там ничё не правилось, только 000.bin скопирован как 111.bin


Всё-равно не работает, с скопированным 000.bin и правленным названием уровня, внутри него.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.