Разработка игрData и ИИC / C++Другой язык

Перенос старой игры с помощью ИИ: как проверить порт и сохранить ощущение игры

Разбираем перенос Babylonian Twins с Amiga на Godot: как агент восстановил форматы и сборку, чем помог byte diff и почему управление всё равно проверял человек.

Кодик

Автор

6 мин чтения

Перенос старой игры с помощью ИИ работает лучше всего не как команда «перепиши всё», а как цепочка проверяемых преобразований. Сначала нужно восстановить исходную сборку, затем доказать совпадение данных, вынести управление в воспроизводимые сценарии и только после этого оценивать то, что автоматический тест не чувствует: темп, инерцию и характер игры.

Почему тема появилась сейчас. Разбор автора Babylonian Twins от 1 сентября 2026 года собрал 377 баллов и 133 комментария на Hacker News к утру 8 сентября. Это история реального порта, а не демонстрация на специально подготовленном проекте.

В 1993 году Rabah Shihab написал Babylonian Twins для Amiga 500 с 512 КБ памяти. Игра работала на Motorola 68000, управляла графикой почти напрямую и состояла из 72 758 строк ассемблера в 26 файлах. Документации почти не было, имена файлов повредились при переносе, а один источник уровня оказался оборван. Спустя десятилетия автор дал эти материалы AI-агенту и попросил восстановить игру в Godot.

МАШИНАСравнивает байты

Сборка либо совпадает с исходным бинарником, либо нет. Здесь можно получить строгий ответ.

СЦЕНАРИЙИзмеряет поведение

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

ЧЕЛОВЕКОценивает ощущение

Удобство прыжка и честность попадания не сводятся к одному универсальному числу.

AI-агент исследует код игры для Amiga и переносит его в современный движок
Legacy-код похож на раскопки: значение дают не отдельные строки, а связи между сборкой, данными и поведением игры.

Перенос старой игры с помощью ИИ: пять ступеней проверки

Самая сильная часть проекта появилась до современного порта. Агент заставил исходники снова собираться через vasm на Apple Silicon и добился бинарного совпадения с файлами, которые распространялись в 1993 году. Это важная контрольная точка: если новая сборка уже отличается от известного оригинала, перенос начнётся с подвижного основания.

Интерактивная карта проверки

Нажимайте этапы по порядку. Каждый отвечает на свой вопрос и не заменяет следующий.

Зафиксируйте эталон.

Сохраните исходные диски, бинарники, скриншоты, частоту обновления и контрольные суммы. Копия эталона должна быть неизменяемой.

Верните воспроизводимость.

Запишите версию ассемблера, параметры оптимизации и карту повреждённых имён. Успешный запуск ещё не доказывает совпадение.

Сравните результат побайтно.

Diff нашёл различия, которые не мешали игре загрузиться, но сдвигали данные. Такой тест ловит тихую подмену смысла.

Сделайте игру наблюдаемой.

Команды загрузки уровня, точной позиции, нажатий по кадрам и вывода состояния превращают ручной эпизод в повторяемый сценарий.

Оставьте человеку решение о качестве.

Сравните задержку, дугу прыжка, ритм и читаемость. Если метрика не описывает ощущение, не притворяйтесь, что тест его доказал.

Почему «игра запускается» недостаточно

В исходном проекте частота была частью физики. Версия для Amiga работала при 50 Гц, а более поздний движок для iPhone при 60 Гц. Коэффициент сопротивления применялся каждый кадр, поэтому одинаковое число при другой частоте меняло разгон и торможение. Код не падал, персонаж просто ощущался иначе. Это типичная legacy-ошибка: новый проект проходит smoke-тест, но нарушает скрытый контракт.

--level=<name>
--pose=<x,y>
--drive=<action:seconds>
--probe
--screenshot=<file.png>

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

Цикл проверки переноса игры от исходников до ручного теста управления
Сильная проверка соединяет точный машинный сигнал и оценку игрока, а не выбирает что-то одно.

Что поручать агенту, а что держать под контролем

Агент хорошо ищет закономерности в нескольких источниках. В Babylonian Twins формат клетки уровня раскрылся через две разные процедуры: одна читала младшие биты как номер изображения, другая старшие как физическое свойство. Модель смогла связать их и восстановить назначение данных. Но когда размер спрайт-листа допускал две правдоподобные трактовки, потребовался вопрос автору. Это правильная граница: неоднозначность нужно поднимать, а не маскировать уверенным ответом.

Поручите AI поиск связей. Пусть он сопоставит загрузчики, таблицы, рендер и коллизии, а к каждому выводу приложит путь к коду и способ проверки.
Требуйте наблюдаемый результат. Контрольная сумма, diff, снимок кадра и лог состояния полезнее фразы «порт готов».
Остановитесь на неоднозначности. Если две версии объясняют данные одинаково хорошо, нужен дополнительный эталон или решение владельца продукта.
Не улучшайте случайно. Странная константа может быть частью ощущения. Сначала воспроизведите поведение, потом рефакторьте отдельным изменением.

Эту схему можно перенести на обычный сайт или приложение. Старый API заменяет ассемблер, база данных играет роль бинарного формата, а пользовательский путь становится игровым сценарием. Сначала зафиксируйте контракт, затем автоматизируйте повтор, и только потом меняйте реализацию. Если хотите потренироваться на понятном стеке, начните с курса Lua. О том, как устроен игровой цикл, читайте в разборе Update и FPS, а границы помощи модели сопоставьте со статьёй об AI-агентах в разработке.

Показателен контраст с прежним ручным портом: версия для iPhone выросла примерно до 34 000 строк C++. Этот опыт дал автору эталон поведения, но не избавил новый перенос от проверки каждого слоя. ИИ ускоряет чтение и перенос, а стоимость доверия смещает из набора кода в подготовку эталонов, команд и сравнений. Поэтому прогресс проекта стоит считать не только по числу созданных файлов, но и по качеству контрольного контура.

Самопроверка

Что доказывает byte diff?

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

Зачем нужны headless-команды для игры?

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

Когда агент должен задать вопрос?

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

Мини-практика на 30 минут

Возьмите один старый мини-проект и сохраните эталонный результат: JSON, изображение, лог или контрольную сумму. Добавьте одну команду для воспроизводимого запуска, измените реализацию и сравните результат автоматически. Затем проверьте руками то свойство, которое не попало в метрику. Так вы получите маленький, но честный цикл переноса вместо большого обещания «переписать всё с AI».

Факты проверены 8 сентября 2026 года по разбору автора Babylonian Twins и публичному обсуждению Hacker News.