Почему Luanti, а не Unreal Engine 5: на чём построен движок MineAge 2

TL;DR

FractureFront — собственный движок на базе открытого C++ движка Luanti 5.16.1: изменяемый мир, сервер как арбитр, ресурсы Ertheia компилируются в версии мира. Babylon.js — только диагностический вьюер. Цена — сглаживать воксельное наследие и обходиться без редактора уровней.

Поправка: в первой версии этой статьи говорилось, что FractureFront построен на Babylon.js. Это было ошибкой. Ниже — как устроен движок на самом деле.

Lineage 2 работала на Unreal Engine 2. Проекты вокруг L2 обычно остаются на клиенте UE2 или его форке. Мы пошли другим путём, но и Unreal Engine 5 брать не стали: FractureFront — собственный движок на базе Luanti 5.16.1, открытого C++ движка (раньше он назывался Minetest). Его исходный код входит в наш репозиторий как обычное дерево исходников, и мы дописываем его под масштаб и ресурсы Lineage 2.

Почему Luanti

  • Изменяемый мир в основе. Мир Luanti состоит из нод, и сервер сохраняет каждое изменение: копание, строительство, разрушение. Для территориальной войны, где дороги, стены и укрепления должны переживать обновления мира, это фундамент, а не надстройка. В UE5 такой мир пришлось бы строить с нуля.
  • Сервер — единственный арбитр. Клиент-серверная архитектура уже есть: клиент предсказывает и красиво показывает, но исход движения, боя и изменения мира решает сервер.
  • Открытый код целиком. Мы можем менять рендер, сеть и загрузку мира, а не ждать чужой дорожной карты. Изменённый движок сохраняет условия LGPL, без отчислений и закрытых частей.
  • Lua для игровой логики. Серверные правила пишутся на Lua и меняются без пересборки C++.

Как в движок попадает Lineage 2

Наши парсеры формата Unreal Engine 2 читают ресурсы клиента Ertheia как связный корпус: карты .unr, рельеф G16 TerrainMap, статические меши, текстуры, анимации. Ресурсы открываются только на чтение. Компилятор превращает их в версионированные артефакты мира, рендера и коллизий, и каждый артефакт адресуется по содержимому. Поэтому любую сборку мира можно повторить и проверить, а несовместимые данные отклоняются, а не подменяются правдоподобными заглушками.

Поверх Luanti мы дописали то, чего в нём нет: гладкий рельеф вместо ступенек, статику L2 в исходной форме вместо кубиков, свет фонарей, тени солнца, блум и тонмаппинг, ветер в листве, бегущую воду.

Где тогда Babylon.js

Babylon.js у нас — локальный диагностический вьюер исходных данных: быстро посмотреть, как прочитался меш или регион. Игрок его не видит, и проверкой он не считается: результат принимается только в собранном клиенте движка.

Производительность

Нижняя планка — 60 кадров/с на полных настройках в 1920×1080, с тенями, сглаживанием, блумом и листвой. Каждая правка рендера проходит замер до и после, а найденная просадка исправляется сразу. Это требование к себе, а не обещание итоговой цифры в массовых боях: запас под осады ещё предстоит доказать.

Цена выбора

  • Наследие воксельного движка. Luanti вырос из кубических миров, а L2 — нет. Террасы рельефа приходится сглаживать, а архитектуру L2 — показывать в исходной форме, не ломая её под сетку.
  • Нет редактора уровня Unreal Editor. Мир собирает компилятор из исходных ресурсов, а не художник в редакторе.
  • Свет и материалы L2 адаптируем сами. Мы не копируем рендер Unreal попиксельно и не исполняем его шейдеры как есть.

Проект на ранней инженерной стадии и пока не является готовой игрой. Каждый шаг описан в дневнике разработки.

LuantiFractureFrontдвижоктехнологииLineage 2
Обсудить в Telegram Все статьи →

Читайте также