Super Mario 64 — это не просто одна из первых 3D-игр, а настоящий эталон жанра платформеров. Однако на протяжении десятилетий её код оставался закрытым, а использование персонажа Марио в сторонних проектах было возможно лишь через эмуляцию целого ROM, что накладывало массу ограничений. Проект libsm64 меняет ситуацию: команда разработчиков провела реверс-инжиниринг игры и превратила её в статическую библиотеку на C, которую можно встраивать в любые игровые движки — от Unity и Godot до собственных фреймворков. В этой статье мы разберём, как устроен libsm64, сравним его с традиционной эмуляцией и оценим практическую ценность для инди-разработчиков и исследователей.
Что такое libsm64?
libsm64 — это открытая библиотека, доступная на GitHub Источник, которая воспроизводит логику, физику и рендеринг Марио из Super Mario 64. В отличие от полного порта игры (sm64pc), здесь акцент сделан на модульность: разработчик получает не готовую игру, а набор функций для управления персонажем. Библиотека написана на чистом C (C99) и собирается как статическая (.a) или динамическая (.so/.dll) библиотека. Важно: libsm64 не включает оригинальные ассеты (текстуры, модели, звуки) — их необходимо извлечь из легальной копии Super Mario 64 с помощью специальных утилит, таких как sm64extract.
Как это работает?
Основу libsm64 составляет реверс-инжиниринг оригинального машинного кода Super Mario 64, версии для Nintendo 64. Команда проекта восстановила исходную логику: алгоритмы движения Марио (тройные прыжки, wall kicks, long jumps), обработку столкновений с геометрией, поведение камеры, сбор монет и взаимодействие с врагами. Всё это было переписано на C и оформлено в виде API. Типичный цикл работы с библиотекой выглядит так:
- Инициализация:
sm64_init()загружает извлечённые ассеты и настраивает внутренние структуры. - Обновление: каждый кадр вызывается
sm64_update(input_state, delta_time), гдеinput_stateсодержит значения осей контроллера N64 (аналоговый стик, кнопки). - Рендеринг: после обновления
sm64_render()генерирует список команд OpenGL (или абстрактные примитивы), которые можно передать в ваш рендерер.
Такой подход даёт полный контроль: можно заменить рендеринг на современный (шейдеры, PBR), модифицировать физику или даже комбинировать Марио с собственными механиками.
Технические детали
- Аудио: встроен эмулятор аудио N64 (на базе библиотеки mixmastr64). Звуки воспроизводятся через callback-функцию, которую вы предоставляете. Можно отключить звук или заменить его на свои сэмплы.
- Рендеринг: библиотека использует фиксированный конвейер OpenGL 1.x, но команды генерируются в буфер, который легко перехватить. Сообщество уже адаптировало libsm64 для OpenGL 3.x, Vulkan и DirectX 12.
- Физика: полная модель из оригинала — гравитация, инерция, коллизии с треугольниками (BSP-деревья). Это значит, что поведение Марио идентично оригиналу вплоть до глитчей (например, backwards long jump).
- Память: библиотека не выделяет динамическую память после инициализации — все данные хранятся в статических массивах. Это упрощает интеграцию в проекты с жёсткими ограничениями по памяти (например, встраиваемые системы).
Сравнение с эмуляцией
Эмуляция (Project64, Mupen64Plus) позволяет запустить оригинальную игру целиком, но не даёт изолированного доступа к персонажу. libsm64, напротив, предоставляет именно ту степень детализации, которая нужна для интеграции. Сведём различия в таблицу:
| Параметр | Эмуляция полного ROM | libsm64 |
|---|---|---|
| Цель | Запуск оригинальной игры | Библиотека для встраивания |
| Контроль над персонажем | Только через эмулируемый ввод | Через API (аппаратный или программный ввод) |
| Возможность модификации | Патчи ROM, LUA-скрипты | Прямое редактирование кода библиотеки |
| Производительность | Зависит от эмулятора (обычно 60 FPS) | Близка к нативной (низкие накладные расходы) |
| Требование к наличию ROM | Обязателен (загрузка целиком) | Необходим только для извлечения ассетов |
| Портируемость на новые платформы | Требуется портировать эмулятор | Достаточно скомпилировать libsm64 под целевую платформу |
libsm64 проигрывает в простоте (нужна работа с ассетами и рендерингом), но выигрывает в гибкости и производительности.
Практические примеры использования
- Инди-игры: добавление Марио в качестве секретного персонажа или босса. Разработчик может взять только анимации и физику, а графику перерисовать в своём стиле.
- Образование: изучение того, как работали 3D-платформеры на N64. Студенты могут модифицировать движение Марио и наблюдать изменения в реальном времени.
- Инструменты: создание редакторов уровней, где Марио используется для тестирования геометрии, или бенчмарков для сравнения производительности разных рендереров.
- Интеграция с современными движками: уже существуют примеры встраивания libsm64 в Godot и Unity через нативные плагины. Код проекта доступен на GitHub; платформа ASI Biont поддерживает подключение к GitHub через API — подробнее на asibiont.com/courses.
Ограничения и риски
- Юридические: код libsm64 основан на реверс-инжиниринге, что в большинстве стран считается законным, однако использование торговой марки Nintendo и распространение ассетов без лицензии — нарушение авторских прав. Проект предупреждает, что предназначен для образовательных целей.
- Технические: библиотека включает только логику Марио, без уровней и NPC. Вам придётся самостоятельно реализовать окружение, интерфейс и другие игровые элементы. Также рендеринг заточен под возможности N64 (низкое разрешение текстур, отсутствие нормал-маппинга).
- Отсутствие многопользовательского режима: в текущей версии поддерживается только одиночное управление. Ведутся работы над сетевой игрой, но стабильной реализации пока нет.
Будущее проекта
На июль 2026 года libsm64 активно развивается. В планах:
- Поддержка более современных API (Vulkan, Metal, DirectX 12) без дополнительных прослоек.
- Возможность загрузки ассетов из других версий Super Mario 64 (например, Nintendo DS или Shindou Edition).
- Интеграция с системами физики Havok и PhysX для гибридных проектов.
- Появление готовых мостов для популярных движков (Unreal Engine, Godot) в виде официальных плагинов.
Заключение
libsm64 — замечательный пример того, как сообщество может вдохнуть новую жизнь в классику, не нарушая закон. Это не замена эмуляции, а инструмент для тех, кто хочет использовать оригинальные геймплейные механики в своих проектах. Разработчикам стоит учитывать технические ограничения и юридические риски, но для образовательных и исследовательских целей библиотека открывает огромные возможности. Если вы хотите глубже изучить проект, начните с чтения README на GitHub и экспериментов с приведённым примером на SDL2.
Комментарии