Создаём пиратский перевод Silent Hill своими руками
И выясняем, почему существующие так плохи
Речь в тексте пойдёт про игру с первой PlayStation, так что начать его, я считаю, нужно с легендарной заставки.
Полтора года назад мы с Иваном Лоевым раскопали пару десятков пиратских версий GTA: San Andreas и выяснили, что «потраченный перевод» из мемов на самом деле амальгама из двух пираток, покрытая сверху слоем фольклора. Уже тогда напрашивалась идея разобрать таким же образом первую часть Silent Hill, которая тоже до сих пор живёт в народной памяти: одна только нарезка стрима её «худшего перевода» набрала почти полмиллиона просмотров, а игровые медиа, публикуя подборки «Смотрите, какую дичь творили пираты в стародавние времена», неизменно вставляют туда картинки вроде таких:
Омерзительная восьмёрка
К моему немалому удивлению, оказалось, что история пираток конкретно Silent Hill хорошо сохранилась: сайт RGDB (он специализируется на консольных играх, так что в случае с San Andreas пользы от него было, увы, не так много) каталогизировал с десяток различных версий, ссылками на скачивание которых до сих пор делятся на форуме PSX Planet. Ссылки эти, правда, уже начинают гнить (что в принципе серьёзная проблема, которую никто толком не знает как решать), а сам форум выглядит чудовищно… олдскульно, но умирать вроде бы не собирается: на входе вас встречает радостное объявление о том, что сообществу коллективными усилиями удалось собрать 21 тысячу рублей на оплату сервера.
Для этого текста я в итоге добыл и сравнил восемь пиратских локализаций: Original (да, какие-то светлоголовые переводчики назвали свою контору «оригинал» — надеюсь, вы не запутаетесь), Golden Leon, Kudos, Playbox, Fire Cross, Paradox, «Русские версии» и RGR Studio. Их могло существовать и больше — с пиратами никогда нельзя быть ни в чём уверенным, — но восьми штук, думаю, вполне достаточно, чтобы составить общее впечатление. Сегодня они представляют в основном исторический интерес: Silent Hill никогда с 1999-го не переиздавалась и до сих пор остаётся заложницей своей платформы, но уже в 2008-м у неё появился (и потом ещё три года патчился) хороший фанатский перевод от consolgames, а позже — и русская озвучка от Team Raccoon. Именно к ним я и рекомендую обращаться: старые пиратки сегодня имеет смысл запускать лишь из ностальгических соображений или чтобы посмеяться над ошибками, которых там предостаточно. Вот, например, Kudos из вышеупомянутого видео Велинда:
Подобную коллекцию перлов можно собрать почти из каждой пиратки: лучшие из них сегодня просто посредственны, а худшие настолько плохи, что уморительны. Но вместо того, чтобы смеяться над убогими, я решил исследовать проблему глубже: почему всё так плохо? Понятно, что качество этих локализаций никого не заботило, и делали их в сверхкороткие сроки, чтобы поскорее выбросить новинку на прилавки, но только ли поэтому пистолет у Kudos называется «ПУГАЧЬ», а низкий уровень сложности — «ЛЕГК»? Я попросил помощи у Dangaard и HoRRoR, создателей версии от consolgames, расковырял содержимое дисков и погрузился в увлекательный мир ромхакинга.
Короткая (честно) лекция по информатике
Должен оговориться: мы не знаем наверняка, как работали пираты. Это не та деятельность, которой гордятся, — оттого, помимо игр, у нас практически не осталось о ней источников, а те, что остались, вроде этого интервью, большого доверия не вызывают. Поэтому задачу я поставил перед собой так: разобраться, как создать перевод самым топорным способом из возможных, обойтись необходимым минимумом. Кроме того, в статье я старался использовать как можно меньше технических терминов. HoRRoR уже рассказывал, как взламывал Metroid Prime 3, но этот его текст написан для программистов, и перевести его на язык гуманитариев — сложная и объёмная задача. В случае с Silent Hill же я обходился самыми примитивными средствами — орудиями каменного века, образно говоря. Выглядело это вот так:
Сейчас я объясню, что тут происходит и что это за груда цифр. Каждый файл на вашем компьютере — это последовательность битов, каждый из которых имеет одно из двух значений: 1 или 0. Биты объединяются в байты, и программа на скриншоте, так называемый hex-редактор, позволяет редактировать файлы побайтово. У каждого байта 256 (2 в 8-й степени) возможных значений (от 0 до 255), и записывают эти числа обычно в шестнадцатеричной системе счисления: так удобнее, потому что на каждый байт в таком случае требуется ровно по два символа. 00 — это 0, FF — это 255; если вы знаете, как кодируются цвета, то с этим принципом вы уже знакомы. Значения каждого байта и занимают львиную долю места на изображении выше; слева от них — адреса (т. е. порядковые номера) этих байтов, а справа — текстовая интерпретация этих данных по так называемой ASCII-таблице.
Всё, с теорией покончено. Сейчас я на отвлечённом примере покажу, как работать с hex-редактором. Для начала открою Google-документ, напечатаю туда что-нибудь и сохраню результат как .txt-файл:
Если открыть этот файл в hex-редакторе, то увидим мы вот что:
Кириллице, как видите, немного не поздоровилось: всё потому, что Google-документы кодируют каждый символ нашей азбуки двумя байтами, а не одним, как латиницу и знаки препинания. Если открыть в hex-редакторе картинку или песню, то в столбце «декодированный текст» мы точно так же увидим чепуху, но если наш файл содержит английские слова, то этот столбец становится удивительно полезным. А ещё там работает поиск: стоит ввести туда любую строку, скажем game, — и программа подсветит вхождения.
Теперь давайте сохраним этот же Google-документ в формате .docx, откроем его в hex-редакторе и попробуем найти game там. Ничего не найдётся. Да и столбец с текстом будет выглядеть как-то странно:
Всё потому, что .docx-файл — это организованный и запакованный особым образом .zip-архив. Чтобы увидеть данные в исходном виде, его нужно разархивировать — тогда в файле document.xml внутри папки Word найдётся уже знакомая нам последовательность байтов:
Папку, когда-то бывшую .docx-файлом, можно превратить обратно в .zip-архив, и если попросить архиватор не сжимать содержимое, то он, условно говоря, просто запишет файлы в память друг за другом, и строку stopgame.ru всё ещё можно будет найти.
При чём тут вообще видеоигры? Дело в том, что образ PS1-диска — например, в формате .bin — представляет собой именно такой «архив без сжатия» со всем содержимым игры: текстурами, музыкой, программным кодом и так далее. Для нас, конечно, важнее всего текст. Запустим оригинальную Silent Hill и посмотрим первую кат-сцену:
Запомним, что говорит Гарри, откроем образ игры в hex-редакторе и воспользуемся поиском:
Бинго. Надеюсь, лекция по информатике оправдала себя!
Магистры блокнота, чемпионы Paint
У нас в руках мощнейший инструмент: с его помощью можно сменить любую строку в игре на любую другую, и эмулятор это проглотит. Единственное условие: новая строка должна совпадать по длине со старой — на практике это означает «быть такой же длины или короче», потому что «лишние» символы всегда можно заменить пробелами. Развлекаемся:
Запускаем игру:
Использовать hex-редактор, в принципе, необязательно: всё это можно сделать хоть в «Блокноте», но тогда самому придётся следить за тем, чтобы не добавить и не удалить случайно байт-другой. Точно так же, как фразу про коляску, я переделал интро в начале статьи: Licensed by Sony Computer Entertainment America — это такой же текст, как и остальные. Пираты совершенно не стеснялись его менять:
Так, мы научились менять латинские буквы на латинские. Неплохо, но наша цель — добавить в игру русский язык, а с этим всё не так просто. Как справлялись создатели пираток? Давайте откроем одну такую, найдём строку про коляску (к счастью, мы даже знаем её адрес, так что поиск будет недолгим) и посмотрим:
CTAP0E_KPECL0? ~N
4T0_TYT_JP0NCX0DNT? ~E
Текст в таком виде даже можно читать — пираты каким-то образом заставили игру превращать латиницу в файлах на диске в кириллицу на экране. Как именно? Если вы смотрели наше видео про San Andreas, то уже знаете ответ — принцип очень похож. Все «шрифты» в игре — это длинные и узкие текстуры размером 1024 × 16 пикселей, где все символы, каждый размером 12 × 16, стоят в ряд друг за другом. Таким образом, команда «Отобрази букву X» на языке игры означает «Открой ту картинку с буквами, отступи от начала на столько-то пикселей, выдели прямоугольник 12 × 16 и нарисуй его на экране».
Задача пиратов, соответственно, делилась на следующие шаги:
- Распотрошить содержимое диска. Сомневаюсь, что софт они для этого писали сами: подобных утилит сегодня существует множество, и в 90-х тоже наверняка было немало. Лично я пользовался jPSXdec. Как такие программы работают — отдельный рассказ, для которого сейчас нет места, но пиратам это знать было, в сущности, и необязательно.
- Найти среди текстур ту самую картинку со всеми символами. Silent Hill использует для своих текстур стандартный для PlayStation формат .tim (хотя никто не запрещал разработчикам при желании создавать собственные): вот здесь, например, можно почитать, как он устроен, но сейчас нам важно знать о нём только то, что его можно конвертировать в привычные форматы вроде .bmp и обратно (для этого тоже есть софт).
- Открыть получившийся .bmp в любом редакторе — хоть в Paint! — и аккуратно перерисовать латинские буквы на кириллические. Изменённая картинка конвертировалась обратно в .tim. К счастью, этот формат устроен так, что после изменения отдельных пикселей размер файла остаётся прежним, так что старое изображение можно заменить новым, не сместив ничего в процессе.
По этой картинке можно даже составить что-то вроде рейтинга пиратской лени. Меньше всего парились в Original и Kudos (это две разные версии, но они друг на друга очень похожи — надо полагать, что-либо одна из них подворовывала у другой, либо их делали одни и те же люди): символы вроде А, В, С и Т, присутствующие в обеих азбуках, оставили как было; вместо З и О писали 3 и 0; 4 и 6 подрисовали, чтобы заменить ими Ч и Б; буквы Й, Ъ, Щ и Ё выкинули вообще и отдали их роли соответственно И, Ь, Ш и Е; а строчные даже не трогали — использовались только заглавные. В Golden Leon нарисовали Й и Ъ, в Paradox — даже Щ (но не Ъ), а RGR Studio заморочилась со строчными буквами. Ё не уважил никто.
После того как в игре появилась кириллица, оставалось только написать простейший скрипт, который превратил бы «Что тут происходит?» переводчика в «4T0_TYT_JP0NCX0DNT?», которое «поймёт» машина — всего лишь нужно заменить одни символы другими. Дальнейший путь прямолинеен: открываем файлы на диске по очереди (некоторые из них, правда, могут быть зашифрованы — в таком случае поди ещё догадайся, что перед вами то, что игра должна интерпретировать как слова), ищем в них всё, что выглядит как внутриигровой текст, переводим, заменяем, радуемся.
Остаются лишь две проблемы. Первая, как я уже упомянул, — длина строк: русские слова в среднем длиннее английских, и пиратам приходилось идти на любые жертвы и упрощения, чтобы ни в коем случае не выйти за установленные игровым кодом пределы. Это ограничение, как рассказал HoRRoR, можно обойти. Если сильно упростить, то в коде игры команды, что отвечают за вывод реплик на экран, выглядят как «Покажи ту строку, что лежит в памяти по такому-то адресу (скажем, 0543C549)». Этот код можно модифицировать, организовав тексту «переезд»: сменить 0543C549 на какое-нибудь другое число и поместить переведённую строку уже по новому адресу. Но на новом месте какие-то данные уже лежат и где-то используются, так что, решив одну проблему, запросто можно наплодить кучу новых. Работать с адресами сложно — гораздо проще принимать ограничения на количество символов как данность, особенно если качество результата вас заботит мало.
Вторая проблема — контекст. В файлах игры все строки, как видно выше, лежат скопом — когда и при каких обстоятельствах игра будет выводить их на экран, неизвестно. Для переводчика это катастрофа: скажем, реплики из одного диалога могут отстоять в файлах сколь угодно далеко друг от друга, и переводить каждую из них придётся вслепую. Как сохранять смысл происходящего, когда не знаешь даже, в чём это происходящее заключается? Каждый, кто имел несчастье играть в переводы от пиратов, в курсе, как они обычно решали эту задачу: никак.
Удачи тебе пройти
«Ага! — возможно, скажете вы теперь. — То есть те скриншоты, что ты показывал в начале: боярышник, тёща, всё вот решать — это ошибки, вызванные недостатком контекста?»
Нет. Здесь всё несколько сложнее. Во-первых, присмотритесь к форме букв, особенно У и Ь: все эти картинки явно сделаны в одной и той же версии игры, однако таких начертаний я не встретил ни в одной из восьми пираток, которые рассмотрел. Во-вторых, по содержанию кажется, будто у переводчика, напротив, было даже слишком много контекста.
Шутка тут в том, что понять по содержанию написанного, в каком порядке нажимать какие клавиши на пианино, было непросто даже в оригинале. A Raven flies in, Flying higher than the Dove, Just to show he can — это, прямо скажем, не самая прямолинейная инструкция, а пираты, которые не знали даже, зачем в игре эти предложения нужны, ещё и опускали в переводе важнейшую для прохождения информацию, из-за чего решать пазл приходилось перебором. В тексте «Сказания о безголосых птицах» нигде не указано, что это загадка, и в hex-редакторе текст выглядит так же, как и любой другой:
О мемах из Интернета, конечно, сложно говорить что-то наверняка, но те, кто называют эту картинку «пиратским переводом», кажется, слишком мало знают о том, как были устроены настоящие пиратские переводы. Сильно сомневаюсь, что эту версию когда-либо продавали за деньги: её, судя по всему, некие анонимы сделали постфактум чтобы поржать. Дело закрыто. Я теперь тоже так умею: смотрите, как я превратил локализацию Original в кроссовер с Resident Evil.
Меня словно грузовик переехал
С текстом разобрались. Остаётся последний вопрос — русская озвучка.
Честно говоря, её наличие меня до сих пор озадачивает. Оно противоречит самой пиратской философии — гнать продукт как можно быстрее и дешевле, без оглядки на качество. Что происходит с игрой как с произведением, если сменить в ней оригинальную актёрскую игру на непонятных любителей, монотонно зачитывающих в дешёвые микрофоны плохо переведённые тексты, — вопрос риторический, но озвучка — это трата денег и времени! Так ли она нужна?
Кто-то действительно отвечал отрицательно: например, FireCross и RGR Studio оставили в своих версиях оригинальное аудио. А те, кто решился на замену, в итоге провалили сведение: у Kudos и Paradox то внезапно пропадает звук, то между одних реплик звучат обрывки других. Что это? Особенности кода игры, из-за которых с аудио стало труднее работать? Непохоже: соответствующие файлы в этих пиратках располагаются на тех же секторах диска, что и в оригинале, и уже там звучат с косяками — кажется, кое-кто просто облажался с нарезкой, забыл о временных ограничениях. Golden Leon к тому же вставила русскую озвучку хорошо, сохранив даже баги оригинала: например, звук открывающейся калитки, звучащий между двумя репликами Гарри и Сибил.
Разбираясь с техническими деталями пиратских версий, я даже понял, почему субтитры в кат-сценах там так часто не соответствуют звуку: те, кто переводят субтитры, в этот момент не знают, что переводят субтитры, да и качеством, учитывая ограничения на размеры строк, они в любом случае похвастать не смогут. Вместо того чтобы ждать, когда тексты будут готовы, можно сразу отдать «актёрам» найденные на диске аудиофайлы (обратите внимание, как у «Гарри» от Paradox скачет отыгрыш от реплики к реплике: ему, похоже, не дали ни на игру посмотреть, ни оригиналы послушать) и заменить их по готовности — звук на диске всё равно лежит отдельно от текста. Эффективность!
Но опять же, зачем игре в принципе переозвучка? Кого ею пытались впечатлить — неужто покупателей? Или, может быть, конкурентов? Не знаю.
Взломать Silent Hill пиратам удалось относительно просто, но с другими проектами им везло меньше: разные разработчики писали код и располагали на дисках файлы по-разному, и далеко не все их подходы кустарям-локализаторам покорялись. Попадалась ли вам русская версия, скажем, Valkyrie Profile — культовой JRPG, изданной Enix в 1999-м? Мне тоже нет, потому что ни одной такой не существует. Недавно взявшиеся за перевод на русский ромхакеры из Temple of Tales объясняют почему:
Поиски программиста для работы над первой частью игры продолжались с 2017 года. Те, кто пробовали разбираться в ресурсах игр от разработчиков tri-Ace, знают, что там чёрт ногу сломит. Наверное, именно поэтому за все эти два с лишним десятка лет так никто и не сдвинулся с мёртвой точки. <…> Наше почтение Riku_KH3, трудящемуся над этой игрой! Нам повезло, что спустя столько лет именно Рику согласился помочь — и не только с разбором самой игры, но и с написанием автоматического выравнивания рамок под переведённый текст. С этим тоже были определённые сложности, так как в игре на каждое окно диалогов прописаны данные: координаты, ширина и высота рамки. Править всё это вручную было бы нереально.
Технических трудностей, препятствующих появлению хорошего перевода, полно. Прибавьте к ним отношение пиратов к делу, и становится понятно, почему их локализации получались такими неказистыми — хотя в 90-е, отдав за них деньги, вы наверняка использовали бы другое прилагательное, покрепче. С годами, впрочем, народная память превратила баги в фичи, а ошибки — в мемы, так что если сегодня вам, как мне, придёт в голову навязчивая идея взломать игру для PS1 и организовать собственную студию Kudos, то, надеюсь, эта статья успешно объяснила вам, с чего начать. Бог вам судья.
Лучшие комментарии
Трудности перевода выходят на новый уровень.
Опять СГ сломали, Акулеша, да что ж такое то...
Спасибо за труд, очень интересная статья.
Стивен Хокинг в предисловии «Краткой истории времени» приводил цитату своего редактора: «Каждая формула в книге уменьшает количество читателей вдвое». Никому не интересно читать про хэш-функции, как бы ты это ни объяснил!
Неплохо! Я в детстве умел только через Artmoney Томми Версетти 999999999 долларов на счёт накидывать...
Спасибо за статью с разбором внутряка.
В свое время дико радовали перлы пиратов на играх с первой соньки. До сих пор помню описание на обложке двухдискового издания (если это можно так назвать) Metal Gear Solid, где злоключения Снейка описывались фразой «Баба Яга в тылу врага!»
P.S. а Гарри точно был рядом с собачьей будкой?
Я сталкивался. В версиях kudos и original, которые я исследовал, кучи предметов действительно не видно. Квестовые вроде бы все на месте, но аптечки и чекпоинты невидимы. Не знаю, что к этому привело.
У меня с пираткой СХ1 был какой-то совсем уникальный случай, упомнинаия подобного в сети вообще не видел. Хотя с юношества сидел на форуме сх.ру. ХЗ, может быть плохо искал.
Был диск-трёхигровка от Кудос. Другими двумя играми на диске были 2 части Deception. Уж не помню насколько херовый в игре был перевод (благо проходил по солюшену, и с СХПА в кармане), но что точно помню — расходники (патроны/хелсдринки/аптечки) не отображались на локациях в игре. Вообще. То есть, на локации они были — к примеру, если подойти к скамейке за кафе на старте игры, и нажать Х, то подбирались пачки патронов. Но в целом на локации эти модельки были невидимыми. Слава богу, этот баг не касался квестовых предметов, насколько я помню.
Вот так и проходил, хоть и с прохождением под рукой, но для поиска снаряжения вслепую ощупывал каждую комнату. Никто с таким не сталкивался?
Интересная статья, было фаново читать как программисту «а как пояснить некоторые базовые вещи по простому». Правда остался вопрос — а где таки произошел затык с пояснением защиты от пиратства (если не секрет)?
2. Ассимитричное шифрование — без подробностей, просто концепцию на уровне «есть два ключа, один шифрует, другой дешифрует».
3. ЭЦП — «как сложить первое и второе» и зачем.
А вот момент уже совсем конкретной защиты опустил бы, поскольку там скорее не знания «как писать код» нужны, а хорошие познания линейной алгебры.
У моего друга была на русском сайлет хилл перывая, так же на первую соньку. Но перевод, точно нормальным был) По крайней мере в сравнении с показанным тут. Где откапали?) Мы дальше пианино не прошли. Потом через какое то время в игротеке видел (английская версия) пацана с листочком бумаги, там и была написана по видимому комбинация. Помню как он решил головоломку по бумажке, а эту бумажку ему кто то дал. Вот было время без интернета)))))
Это версия от Sacson studio. У меня до сих пор рабочий диск такой есть в коллекции.
Тьху, я думал про Ascension. Хоть там и не язык высокого уровня сложности, но всё-таки.
Эх, знал бы о ностальгии, точно диски бы не понапродал с первой Сонькой по дешёвке, что бы меньше денег отдать за вторую соньку. Таким же макаром и третья сонька купилась. В итоге нет ни того, не сего. Лишь несколько дисков на первую и вторую соньку. И то от второй сони диск не рабочий от резидента.
Играл в несколько версий SH в своё время. Был и средней паршивости, был и тот самый перевод от Кудос (от фраз типа «я взял ТОП.» орал по полдня). А как-то раз я самолично записал образ игры с наилучшим переводом от фанатов, уже когда научился этим премудростям. Весело было раньше, короче))
Спасибо за интересную статью.