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

Перенос старой игры с помощью ИИ: пять ступеней проверки
Самая сильная часть проекта появилась до современного порта. Агент заставил исходники снова собираться через 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 формат клетки уровня раскрылся через две разные процедуры: одна читала младшие биты как номер изображения, другая старшие как физическое свойство. Модель смогла связать их и восстановить назначение данных. Но когда размер спрайт-листа допускал две правдоподобные трактовки, потребовался вопрос автору. Это правильная граница: неоднозначность нужно поднимать, а не маскировать уверенным ответом.
Эту схему можно перенести на обычный сайт или приложение. Старый API заменяет ассемблер, база данных играет роль бинарного формата, а пользовательский путь становится игровым сценарием. Сначала зафиксируйте контракт, затем автоматизируйте повтор, и только потом меняйте реализацию. Если хотите потренироваться на понятном стеке, начните с курса Lua. О том, как устроен игровой цикл, читайте в разборе Update и FPS, а границы помощи модели сопоставьте со статьёй об AI-агентах в разработке.
Показателен контраст с прежним ручным портом: версия для iPhone выросла примерно до 34 000 строк C++. Этот опыт дал автору эталон поведения, но не избавил новый перенос от проверки каждого слоя. ИИ ускоряет чтение и перенос, а стоимость доверия смещает из набора кода в подготовку эталонов, команд и сравнений. Поэтому прогресс проекта стоит считать не только по числу созданных файлов, но и по качеству контрольного контура.
Самопроверка
Что доказывает byte diff?
Он доказывает совпадение сравниваемых байтов при заданной сборке. Он не доказывает удобство управления или отсутствие ошибок в другом сценарии.
Зачем нужны headless-команды для игры?
Они создают одинаковое начальное состояние и последовательность действий, чтобы сравнение не зависело от точности ручного ввода.
Когда агент должен задать вопрос?
Когда несколько трактовок одинаково согласуются с кодом и данными, а выбор меняет поведение или продуктовый смысл.
Мини-практика на 30 минут
Возьмите один старый мини-проект и сохраните эталонный результат: JSON, изображение, лог или контрольную сумму. Добавьте одну команду для воспроизводимого запуска, измените реализацию и сравните результат автоматически. Затем проверьте руками то свойство, которое не попало в метрику. Так вы получите маленький, но честный цикл переноса вместо большого обещания «переписать всё с AI».
Факты проверены 8 сентября 2026 года по разбору автора Babylonian Twins и публичному обсуждению Hacker News.