Найти тему

OpenBarnyard: начата работа над загрузчиком модов и SDK

Со времён прошлого поста о реверсе прошло уже немало времени, а, значит, пришло время поделиться тем прогрессом, который был достигнут за это время в рамках разбора уже Barnyard'a. Так с чем же мы имеем дело? К более углублённым техническим деталям я перейду ближе к концу, а сейчас просто расскажу, что же представляет из себя OpenBarnyard на данный момент.

OpenBarnyard — это проект по воссозданию исходного кода игры с нуля. На данный момент наша собственная версия игры уже может: воспроизводить стартовые заставки, в том числе видео, загружать и обрабатывать различные игровые ресурсы (локализация, текстуры, ассет паки и др.), отрисовывать оригинальный экран загрузки, различные текстовые и не только UI элементы, а также подгружать в память игровую карту и манипулировать её состоянием (подгружать необходимые её куски и текстуры в зависимости от местонахождения игрока).

Также была начата работа над загрузчиком модов и SDK, которое сможет помочь в создании модификаций. Первой, тестовой модификацией с использованием этой связки станет небольшая модификация, нацеленная на упрощение жизни спидранерам, в которой будет представлен внутриигровой таймер, автоматическое переключение сплитов в LiveSplit, различные мелкие, но удобные функции для автоматизирования и т.д.

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

Самым значимым изменением является перенос графической части движка с DirectX 11 на DirectX 8.1, ведь именно этот API используется оригинальной игрой. Вследствие такого изменения пришлось обновить многие части движка, в том числе отрисовку интерфейса и т.д.

Система стриминга местностей ATerrain (именно она отвечает за постепенную загрузку уровней) реализована практически полностью, но здесь есть свой ньюанс: загрузка необходимых файлов моделей действительно происходит, но на данный момент движок неспособен как-либо работать с ними, ведь ни один из шейдеров ещё не реализован.

Все объекты в игре делятся на следующие типы:
- ASysMesh (используется в исключительных случаях)
- ASkinMesh (используется для анимированных моделей)
- AWorldMesh (используется картой игры)
- AGrassMesh (используется слоями травы)
- AStaticInstanceMesh (заборы, деревья и т.д.)
- AFXMesh (различные спец. эффекты)
- AFOBMesh (листва деревев, кусты)
- ALineMesh (отрисовка линий, не используется)

Каждый тип моделей также подразумевает наличие собственного шейдера и материала с подобными названиями (ASysShader, ASysMaterial и т.д.). Увы, реализовать лишь только их будет недостаточно, ведь у движка и даже самой игры есть множество слоёв абстракций, которые соединяют всё это воедино. Именно их реализация сейчас и стоит на первом месте в важности.

Один из таких слоёв на уровне движка является T2ModelInstance. И уже здесь, наверное, стоит разъяснить то, по какому принципу классам движка и игры давались те или иные названия. Классы, начинающиеся с буквы T, относятся к Toshi 1.0, а если после буквы T идёт цифра 2, то класс относится к системе Toshi 2.0. В случае с классами игры всё проще — буква A означает Application (приложение).

Во время разработки Barnyard разработчики обдумывали создание движка Toshi 2.0, который (спойлер) так и не был завершён, ведь вместо него было принято решение начать разработку игрового движка Prime, на котором, в последствии, вышла всего одна игра, а затем студия была закрыта из-за банкротства THQ. Уже во время разработки рогов и копыт велась работа над Toshi 2.0, некоторые элементы которого игра использует. Именно это и привело к созданию множества уровней абстракций, ведь неготовые системы Toshi 2.0 ссылались на функционал первой версии, из-за чего в движке существует как TModelInstance, так и T2ModelInstance.

Сама игра же управляет моделями на абсолютно ином уровне: существует репозиторий всех моделей (AModelRepos), который хранит модели (AModel) и их экземпляры (AModelInstance). Чаще всего модели являются анимированными, а, значит, являются экземплярами AAnimatableObject, управление которыми осуществляется специальным классом-менеджером подобных объектов. Именно разбор всей этой системы и находится на данный момент в приоритете, но, вероятно, всё это займёт немало времени.