Claude Fable 5 для локализации игры на PS1 за один день
Результаты тестов самой свежей и дорогой нейросетки на примере Alundra 2
Дарова, я всем сердцем обожаю видеоигру Алундра 2, несмотря на то, что она местами кривоватенькая, у неё есть свой шарм.
Официально ее, конечно же, у нас не издавали. Пиратская локализация довольно слабенькая, да еще и с критичным багом, из-за которого невозможно получить некоторые эндгейм предметы. Хотя сюжетно игра в целом проходима.
Когда я открыл для себя Claude Code, который позволяет творить безумные вещи для человека, который не знаком с программированием, я сразу же побежал тестить как она справится с тем, чтобы взять скомпилированный ISO-диск, растеребанить его на файлы, вытащить тексты, перевести их и засунуть обратно.
Это было в прошлом году на Opus 4.5 и тогда нейросетка справилась средне. Она смогла достать файлы, найти тексты и перевести их, но не смогла засунуть всё это обратно так, чтобы в игре всё работало как надо. В итоге я идею забросил.
Вчера, когда поступили новости о том, что новая модель Fable 5 в разы лучше справляется с сложными задачами, я решил, что пришло время реванша. И модель почти справилась!
С первого прохода, за 2 сессии, за 5 часов непрерывной работы она смогла корректно перевести диалоги и всплывающие. Но пока что не осилила интерфейс. Это в процессе.
С чего мы начали
Вводные очень простые - американский ISO образ и максимально нубский промпт: «В этой папке находится английская версия игры для PS1 - Alundra 2. Твоя задача: написать и подготовить инструменты, которые будут работать с текстом внутри игры, чтобы потом локализовать ее на русский язык.»
Через несколько часов упорной работы получаю отчет, что базовые штуки сделаны.
Вместо одного ISO-шника получил вот такой вот зоопарк файлов и скриптов. Особенно греет душу файлы, последний раз редактировались каким-то японским работягой еще в канун конца 20 века, кек.
Касаемо скриптов, одна из штук, которую бот написал: удобный веб-интерфейс для того, чтобы смотреть, как диалоги будут смотреться в контексте. Приятно. Но по итогу, кстати, вообще не пригодилось)
Что вообще делалось: слово боту
Тут я просто дам слово Клоду, он поделится разными техническими штуками, которые кому-то наверняка будут интересны!
Вскрытие диска
Собрали из исходников mkpsxiso, распаковали образ и первым делом убедились, что умеем собирать его обратно байт-в-байт (MD5 совпал). Дальше реверс форматов: главный архив GRP.GP (207 МБ, 512 записей-"комнат" со своими таблицами ресурсов), четыре PAK-архива, оверлеи движка. Параллельные агенты разобрали каждый формат до байта.
Ключевая ловушка: записанные смещения сдвинуты на +4 от реальных данных, а размер текстового блока считается без 0x104-байтного заголовка сцены - без этого знания любая пересборка ломает архив.
Текст
Весь текст игры - 16-битные токены: XX FF - ASCII-символ, XX 00 - управляющий код (перенос, смена страницы, имя игрока, цветовое выделение). Четыре кода съедают следующий токен как параметр - наивный парсер режет сообщения посередине. Написали кодек, разметку для переводчиков ({PAGE}, {NAME}, {04:0001}...{04:0007}) и доказали главное: полный цикл "распарсил -> пересобрал" даёт байт-идентичный архив, а вставка строки другой длины корректно пересчитывает все указатели.
Тексты нашлись в трёх местах: диалоги в GRP.GP, системные банки (предметы, меню, карта памяти) в PACK0.PAK и реплики катсцен внутри контейнеров PAKVCAST.PAK со своим вложенным форматом. Для всего этого: дамп в JSON, веб-редактор с живой валидацией и предпросмотром диалоговых окон, вставка обратно, сборка образа.
Видео
Единственный FMV (вступительная "книжка") декодировали через jpsxdec в mp4 и построили обратный конвейер: видео с хардсабами -> покадровая замена MDEC-кадров внутри оригинальной секторной сетки STR - звук и тайминги стриминга не трогаются вообще.
Шрифт
Дизассемблировали экзешник и нашли атлас шрифта: RLE-сжатая текстура с двумя ASCII-шрифтами, индексация "код - 0x20". Игровой RLE-кодек переписали на Python.
Поворот сюжета
Когда дошли до катсцен, выяснилось: на диске есть 69 текстовых банков субтитров... на японском. Фанатская вики подтвердила догадку: субтитры катсцен есть только в японской версии - из международных их вырезали. Причём сравнение образов показало: вырезали не данные (они идентичны!), а ~190 инструкций кода отрисовки из плеера катсцен. Вместе с двумя из четырёх шрифтов. Вердикт: достроить американку - недели реверса, а в японке всё работает из коробки. Перешли на японскую базу: наши инструменты подошли к ней без единой правки.
Японский текст
Токены оказались не Shift-JIS, а индексами ячеек шрифта (~1000 глифов). Повезло красиво: в экзешнике нашлась родная таблица соответствия SJIS<->глиф - карту расшифровки построили программно, со 100% покрытием. Весь японский текст игры стал читаемым, а американский скрипт привязали к японским репликам как источник перевода (совпало 84% структуры).
Перевод
Два прохода машинного перевода роем агентов: 66 батчей с английского + 27 с японского (то, чего в US-версии никогда не было: субтитры всех озвученных катсцен и вырезанный контент). У каждого агента жёсткий валидатор: строка <= 34 видимых символа, страницы и теги - ровно как в оригинале, и агент обязан гонять свой батч до "чисто".
Потом проход унификации имён - и тут открытие: "японские" персонажи имеют официальные американские имена (テッツォ = Zeppo = Зеппо), канон взят из US-локализации, заодно исправлены 27 субтитров, где пирата перепутали с главным героем. Итог: 4282 переведённые реплики из 4282 переводимых (остальные 351 запись - пустышки).
Кириллица
Финальный трюк: пересчитав все токены игры, доказали, что латиница в японском тексте не используется (3 токена на всю игру). Значит, 66 русских букв можно нарисовать прямо в ячейках латиницы существующих шрифтов - ноль патчей кода, переменная ширина глифов сохраняется. Буквы собрали из родных глифов игры (А=A, Н=H, Р=P...), остальные дорисовали в том же стиле, в двух размерах (диалоги 12x16 и субтитры 12x24), во всех четырёх стилевых вариантах шрифта.
Результат
Собранный русский образ японской версии: переведены диалоги, предметы, меню, системные сообщения и - впервые для этой игры за пределами Японии - субтитры всех катсцен. Каждый этап конвейера проверен обратной распаковкой: русский текст читается из готового образа байт-в-байт.
Известные хвосты: стартовое меню и часть инвентаря - пререндеренные текстуры с японским текстом (не строки), "NOW LOADING" - тоже картинка в атласе; их предстоит перерисовать. Плюс UI-строки оверлеев японской версии ещё не каталогизированы.
Планы на будущее
Ну, как минимум перевести до конца весь интерфейс, поиграть в игру, протестить, что нету каких-то багов, по типу того, который есть в русской локализации. Выложить образ на рутрекер, чтобы все смогли поиграть.
Следующее: куда я хочу попробовать как-то навайбкодить более глобальные модификации, чтобы бот вытащил текстуры и модели.
Я знаю, что есть Final Fantasy 7, в которой обновляли модели, засовывая более детализированные. Что-то такое тут же хочется попробовать провернуть. То есть технически это возможно.
Ну, или как минимум прогнать текстуры через нейронку и сделать их HD версию для эмулятора.
Отдельно хочется попробовать предложить нейронке сделать обратный реверс инжиниринг, вытащить код и пересобрать на каком-то современном движке. Я полный нуб в разработке. Не знаю, насколько это вообще реально. Можете в комментариях отписать, если у вас есть соответствующие знания.
Но есть же всякие там порты Зельды той же самой на какие-то более современные движки? Если там это возможно, наверное, и здесь тоже.
Улучшенное интро
Интересным моментом оказалось то, что в японской оригинальной версии совершенно другое вступление: это музыкальный клип, а не рассказ про положение политических сил в игре.
Поэтому я решил, что его как минимум нужно локализовать. Параллельно еще пришла в голову идея подтянуть разрешение. Результат меня очень порадовал, вот можете оценить!
И небольшое сравнение с оригиналом