За долгие годы написания статей про игры я рассказал о многих удивительных глитчах, неизвестных с давних пор кодах, трюках с выполнением произвольного кода и поисках глубоко сокрытого контента внутри классических игр и оборудования. Но ничто не смогло подготовить меня к этому видео с Twitch, в котором флот летающих Arwing из Star Fox 64 вторгаются в мир Ocarina of Time, чтобы напасть на Линка.
Подобную сцену ожидаешь увидеть только в созданном фанатом мультфильме или ROM-хаке, которые Nintendo так любит изымать из Интернета. Но самое удивительное в этом клипе то, что он демонстрирует немодифицированную версию оригинального японского ROM Ocarina of Time с использованием стандартной консоли и контроллеров N64.
Целое утро я разбирался с тем, как такое вообще возможно. Чтобы объяснить это, придётся совершить глубокое погружение в суть инструкций машинного языка Nintendo 64, управления памятью Ocarina of Time и самого процесса разработки игр середины 90-х. Если вам так же любопытно, как и мне, присоединяйтесь.
Устаревшие ссылки и свежий код
Начало этому удивительному прохождению было положено обнаружением в октябре прошлого года важного глитча: игрок Glitches0and0stuff при помощи эмуляторов и внимательного изучения областей памяти Nintendo 64 обнаружил способ манипуляций устаревшими ссылками в Ocarina of Time.
По сути, глитч заключается в том, что игрок подбирает предмет, а затем хитростью заставляет игру выгрузить его прямо из рук Линка, когда тот пересекает порог нового места загрузки (допустим, следующей комнаты). На этом этапе игра освобождает область памяти, занятую этим предметом, чтобы её можно было использовать для других внутриигровых объектов в процессе их загрузки. Но в то же время игра думает, что Линк держит в руках что-то, поэтому продолжает обновлять указатель на «устаревшую ссылку» в освобождённой памяти, записывая данные, представляющие позицию и угол несуществующего объекта. При аккуратных манипуляциях этот указатель можно затем использовать для «порчи» данных нового загруженного объекта произвольными значениями.
Космические истребители не сравнятся с Линком.
Arwing-и из Star Fox 64 могут получать урон и стрелять в Линка, потому что они всегда находятся в игре.
Прицеливание с помощью кнопки Z позволяет с лёгкостью нацелиться бумерангом в нижнюю часть Arwing-а.
Линк держит «пустой» объект — выполняется подготовка к глитчу с выполнением произвольного кода.
Важнейшей частью методики является заморозка камеры в позиции глитча.
Приспособление для удерживания нужных кнопок/позиций аналогового джойстика контроллера 3, чтобы перейти напрямую к титрам.
Спустя десять минут ввода имени файла код Arwing готов к загрузке
Изначально этот трюк использовался для простой «порчи» игры, например, для загрузки новых предметов в сундуки с сокровищами или изменения позиций других предметов внутри комнаты (как подробно объяснено здесь). Однако через какое-то время игроки выяснили, что тот же способ можно применить для модификации отдельных ассемблерных кодов «jump», сообщающих игре, где ей нужно искать следующую инструкцию при выполнении определённых игровых событий.
Вставив таким образом нужный код, можно заставить игру перейти в область памяти, содержащую последние известные значения поворота по X и Y рогатки. Если эти значения задать точно, то они будут интерпретированы как ещё один код jump, выполняющий переход в область памяти, где хранится имя текущего файла. Затем это имя файла будет интерпретировано как обычный машинный код N64, благодаря чему игрок может быстро перебраться в любое нужное ему место игры (разумеется, если он правильно преобразует двоичные символы имени файла в соответствующие опкоды).
Объяснение глитча с устаревшей ссылкой, который изначально использовался для замены предметов в сундуках.
Первым серьёзным примером использования этой манипуляции с кодами перехода стала загрузка катсцены игры с титрами. Таким образом игрок установил новый мировой рекорд по спидрану игры в категории «Any%». Чтобы сделать это быстро в начальной области игры, необходимо воспользоваться другими глитчами, в том числе глитчем камеры «ходьба во время разговора», позволяющим загружать и выгружать камни в идеально подходящее время и локациях. Также для этого нужно удерживать определённые кнопки и позиции аналогового джойстика контроллеров, подключенных к первому и третьему портам Nintendo 64, чтобы их сигналы интерпретировались как код локации катсцены с титрами.
Разблокируем Arwing
Описанный выше способ вполне хорош, если вы хотите просто перейти к катсцене. Но у него еть серьёзное ограничение: файловая система Ocarina of Time ограничена восемью символами, то есть имя файла можно преобразовать только в пару инструкций машинного кода. К счастью, эти два слота инструкций также можно использовать для практического устранения ограничения на количество символов.
Делается это чрезвычайно запутанным способом, подробно описанным в этом Pastebin и этом видео. Достаточно будет сказать, что в нём трижды применяется описанный выше способ, что позволяет устранить важные проверки указателя позиции имени файла, а затем установить этот указатель на отрицательное значение позиции.
Подробное объяснение выполнения произвольного кода в Ocarina of Time
В результате игроки получают возможность ввести код длиной в сотни символов, что позволяет им предварительно загружать гораздо более сложные последовательности машинных инструкций для реализации описанного выше способа перехода по коду. Но этого всё равно недостаточно для кодирования графики, анимаций и геймплейной логики, требующихся для атаки Arwing-ов. К счастью, Nintendo сильно помогла нам, удобно спрятав весь этот код Arwing-ов глубоко внутри всех картриджей Ocarina of Time.
Зачем? Дизайнер персонажей и графики Сатору Такидзава рассказал в интервью Iwata Asks 2011 года, что это просто был способ повторного использования кода для движения одного из врагов в Zelda:
Volvagia — это дракон, поэтому он извивается и движется волнами. Я просто передал программисту боссов Казуаки Морита части модели дракона, и он сразу же привёл в его в движение. Для меня оставалось загадкой, как ему это удалось… поэтому я не смог удержаться, чтобы не спросить его. Он ответил, что это то же самое, что и программирование для Star Fox 64. В этой игре есть сцена, в которой другой истребитель висит на хвосте Arwing-а, и движения истребителя в полёте точно такие же, как движения Volvagia. Я был поражён, это стало для меня настоящим чудом.
Видео 2007 года, показывающее, как Arwing летает над Kokiri Forest (использованы коды GameShark и эмулятор).
Скопировав необходимые для Volvagia анимации, Морита, похоже, оставил весь блок кода Arwing-а в мусорных данных игры. Много лет назад об этом узнали исследователи данных. И уже больше десятилетия игроки знали, как получить доступ к этим сокрытым частям кода при помощи чит-устройств наподобие GameShark, изменяющих значения в памяти для замены врагов на Arwing-и.
Но благодаря описанным в статье трюкам с манипуляциями памятью внешнее чит-устройство больше не нужно. 23 января игрок ZFG1 доказал это раз и навсегда, загрузив Arwing-и при помощи немодифицированного ROM Zelda и стандартной консоли Nintendo 64 в стриме на Twitch. В результате получилась игра, в которой все двери заменены на Arwing-и, летающими вокруг Линга, атакующими его наносящими урон выстрелами из бластеров и даже падающими на землю при сбивании.
Подготовка к записи этого клипа заняла больше часа, в течение которых были созданы три цикла выполнения произвольного кода и в течение 10 минут кропотливо вводилось имя файла для загрузки Arwing-ов. Но в то же самое время этот клип стал кульминацией месяцев и лет работы сообщества, одержимого стремлением полностью понять и освоить классическую игру и её глитчи.
Кроме развлекательной ценности клип «Arwings in Zelda» стал доказательством того, что сообщество, группа специалистов по компьютерам, при наличии достаточного времени и усилий способна сделать потрясающие вещи с классическим игровым оборудованием и ПО.