TrueWorld~真実のセカイ~ (Истинный мир)

Скачать патч:

  • English – or “Uncle Anonedition
  • Russian (русский) — или «Двач»-мод

Перевод готов на 99% и будет доступен 1 мая

Статистика:

  • 43 399 знаков, 1 148 строчек
  • 11 218 кандзи (разных: 1 316)
  • 28 263 каны (хирагана: 25 814, катакана: 2 449)

Еще полезности:

Лицензия: общественное достояние (CC0)

Об игре

True World (англ. «истинный мир») — короткая юмористическая визуальная новелла на 1-2 часа чтения. Концептуально это омаке к «NHK ni Youkoso!» — та самая игра, которую Сато и Ямазаки пытались сделать на протяжении всего аниме.

На первый взгляд игра не представляет ничего особенного, но для меня она оказалась лучшей короткой NVL, в которую я играл до сих пор (ее сложно назвать ADV с одним-единственным выбором). На мой взгляд, авторы перестарались и сделали больше, чем того требовалось от простого омаке — отличный арт, шикарная музыка, оригинальный сценарий — всё по высшему разряду©, и в завершение — запоминающиеся мини-комиксы и эндинг в титрах в духе «Автобуса 410».

Собственно, OST вы можете скачать отсюда, или вытащите его сами с помощью GARbro. Фоновая музыка очень атмосферна; я слушал ее в течении сотен часов, пока занимался переводом, и она мне так и не приелась.

Истории (их три) тоже недурны. Когда я закончил первую, я подумал: «Ну, она весьма ничего, для такой-то мелкой игры». Следующая была чуть более серьезна, с гротеском и неожиданным поворотом в конце. «Тоже неплохо, но это повторилось уже дважды — могут ли они предложить что-то новое в третий раз?». Несмотря на затяжное начало, в итоге оказалось что да, они определенно могут, и что «неожиданные повороты» это визитная карточка этой игры — а иначе как арка может иметь несколько концовок при полном отсутствии свободы выбора у игрока?

Ответ на этот вопрос я предоставлю искать вам… Дам только один совет: вначале — направо (арка BSR), потом — налево (ERS). Хотя, конечно, это не будет концом света, если вы сделаете наоборот (конец света будет в NIE).

Одна из заключительных иллюстраций
Забавно, что в этой игре на самом деле нет той единственной героини, которую показывают в аниме. Но знаете что? Кошка — тоже ничего!

Об этой локализации

Я стянул эту игру с какого-то б-гом забытого японского пиринга еще в 2010 году и распотрошил примерно тогда же вместе с десятком других новелл. Но потом навалилась работа и прочее и прочее, и она коптилась на моем диске еще десять лет, пока я внезапно про нее не вспомнил.

Графика при повторном прохождении

Оригинальная версия позволяет пройти себя повторно в «черновом режиме», где вместо нормальных артов — наброски, а в текстах незначительные опечатки. Это не очень интересно, так что в моем патче второе прохождение сделано на основе «непричесанного» перевода: он более точен относительно оригинала, поэтому поклонники игры увидят ее ближе к авторской версии (правда, длинные тексты выходит за границы экрана и их лучше читать здесь).

Я фанатично пытался передать все подтексты исходника (очевидные, скрытые, перекрестные) и даже снарядил расового японца на его перевод, чтобы я мог перепроверить мой собственный. Тем не менее, точная передача была не всегда возможна и потому я выкладываю все исходные файлы, включая оригинальные тексты на японском, мой перевод после первого этапа (до редактуры), перевод носителя и мою окончательную версию.

Ограничения движка. Игра использует моноширный шрифт и содержит множество жестко прописанных параметров, как то ограничение на длину выводимого текста до паузы (около 500 знаков). Я изменил некоторые, но далеко не все, так как они раскиданы по всему коду игры. Японский язык, очевидно, занимает меньше места, чем языки без иероглифов, поэтому эквивалентный перевод требует пропорционально большего числа символов — но в игре не редки экраны, полностью заполненные текстом без пауз, что оставляет мало пространства для маневров. А кое-где я добавляю примечания переводчика, на которые нужно еще 1-2 строки…

В общем, я постарался все уместить и даже позволил себе «адаптировать» некоторые части, сделав их более захватывающими. В результате тексты первого прохождения могут отличаться от оригинала, но, надеюсь, исключительно в лучшую сторону!

Редакция «Двача» и «Лутбокс в блокчейне»

Бащяр в огне

Как-то в процессе локализации мне пришла мысль, что эта игра суть ходячий «эксплоит», почти пригодный к употреблению. Нужно только немного доработать напильником…

Так и появилась «Двач»-версия, или «Перевод Гоблина» (когда еще Гоблин был «труЪ»). Я добавил в тексты несколько сотен общеизвестных Интернет-мемов (не обязательно в чистом виде) и сделал так, что первый угадавший конкретную тройку мемов получает кусочек биткоина (не меньше 0.001 BTC).

Формальные правила игры (эти для нердов, дальше будут попроще):

  1. В тексте всех трех арок есть отсылки на N мемов, где N = 0.
  2. Все используемые мемы имеют статью на Луркоморье. Внимание: из РФ сайт не открывается благодаря РКН, но вы знаете, что делать.
  3. Каждый мем идентифицируется двумя числами: его ID на Lurkmore (ищите wgArticleId в коде страницы) и номером строки в игровом сценарии (с этой страницы).
    » Например: Абанамат ID = 8057, Мякотка ID = 3479, Трифорс ID = 74991.
  4. Мемы сгруппированы в случайные тройки. Каждая тройка содержит 3 мема (из одной арки или из разных). Пара мем+строка может состоять только в одной тройке, но один и тот же мем может использоваться в игре многократно (на разных строках).
    » Например: представим, что строка 452 намекает на Абанамат, 754 на Мякотку, а 351 на Трифорс.
  5. Для каждой тройки считается хэш-сумма по алгоритму SHA-512, для строки вида: KEY1,KEY2,
    KEY3,M@RbLeC@KeG@Me
    — где KEYn равен L I — где L это номер строки мема в игре, а I — его ID на Рулкоморье.
    » Например: echo -n 452 8057,754 3479,351 74991,M@RbLeC@KeG@Me | sha512sum = fb3acbdd…
  6. Я загрузил архив с M файлами, где M = число «лутбоксов» (0), по файлу на каждую тройку мемов. В каждом файле — свой закрытый bitcoin-ключ, зашифрованный по алгоритму AES-256-CBC с использованием ключа = первых 32 байтов хэш-суммы и IV = последующих 16 байт.
    » Например: echo 709e7c8a… | xxd -r -p | openssl aes-256-cbc -d -K fb3acb… -iv c49973…
  7. Если файл расшифровался и результат начинается со строки ZomG U WiN! плюс пробел (ASCII) — поздравляю, вы угадали.
  8. Выигрыш засчитывается после вывода всей суммы с зашифрованного адреса.

…Это были правила для гиков, чтобы меня не обвиняли в нечестности. Теперь для простых фагов:

  1. Проходите игру и/или читаете ее сценарий на этой странице
  2. Вбиваете возможные мемы (в виде URL'ов на Луркоморье) в текстовые поля рядом с их строками.
  3. Проверяете результаты, скачивая «лист ответов» с той же страницы и скармливая его этой программке.
  4. За засчитанный слив каждую угаданную тройку на экран выводится закрытый ключ.
  5. Импортируете эти ключи в Electrum (внимание: p2pkh) и переводите монеты на ваш адрес.

Но вообще, «битки» — лишь предлог. Мне просто хочется, чтобы вы получили жгучее удовольствие от моей локализации!

Ну, и, в общем, это… яранай-ка, ага?

ПеКа следит за тобой

Доска почета

Ниже — таблица с угаданными на сей момент тройками. Как только на блокчейне фиксируется вин, соответствующая строка раскрывает использованные мемы.

Некоторые мемы сложнее найти, ибо они памятны лишь олдфагам и/или их использование искажено — такие тройки содержат чутка побольше биткоинов… что есть восхитительно :^)

№ тройки Мем №1 Мем №2 Мем №3
Ждать осталось недолго…

Технические заметки

Напоследок, немного про игровой движок и механизм локализации. За подробностями обращайтесь к архиву с исходниками.

Движок радует своей минималистичностью, но не ясно, писался ли он для этой игры или все-таки нет — игра использует далеко не все его возможности (например, нет голосов и сохранений), но много жестко прописанных значений намекают на то, что, по крайней мере, его адаптировали. В коде нет строк, однозначно идентифицирующих движок. Еще он весьма старый (README сообщает о поддержке Win98) и, как следствие, «агрессивно-японский».

Как и большинство движков того времени (я говорю о тебе, RealLive), этот имеет собственный формат для всего, что можно: графика в CRX-файлах (начинаются с символов CRXG, содержат поток, сжатый ZLib), аудио — в PCM (начинаются с XPCM, несжатый PCM-поток со своими заголовками), скрипты — в MES (отличительных признаков нет).

Скрипты имеют незамысловатый формат (это не какой-то там ISM SCRIPT из Sisters с десятком полей в заголовке, 4 таблицами смещений и полноценной стековой машиной с 122 опкодами). Файл начинается с единственной таблицы для прыжков, после которой идет поток опкодов с параметрами. Каждый опкод — 1 байт, а всего опкодов — 89. Некоторые строки (в частности, те, которые видны игроку — опкоды 4D, 4E, 4F) обфуцированы путем вычитания 32 из числового значения символа.

Что до технических ограничений, которые я упоминал выше, то главная проблема — в зашитых в коде параметрах. Это касается почти всего: имени шрифта, его размера, размеров окна, длины выводимой строки текста, ее высоты, максимального размера скрипта и т. д. и т. п. Самая большая загвоздка — в ограничении на выводимую строку: она не должна использовать больше 0x400 байт, а из-за принципа кодирования каждый символ занимает 2 байта. В итоге имеем лимит около 500 знаков, и это до предварительной разбивки текста на отдельные строки… Если бы я ломал эту игру сейчас, то вместо замены текстов я бы сфокусировался на портировании ее на другой, более дружелюбный движок.

Как бы то ни было, для обхода самых вопиющих проблем я написал локализационный загрузчик (localization hook), который патчит код игры на лету после внедрения своей DLL в ее процесс. Эта DLL:

  • Модифицирует таблицу импорта и перехватывает вызовы к CreateFont для подмены параметров шрифта на те, которые выглядят приятнее для европейского глаза.
  • Перехватывает CreateFile для подмены файлов скриптов (которые хранятся в ресурсах локализационной DLL и извлекаются в %TEMP% по мере надобности).
  • Внедряется в функцию расчета размеров символа в игровом движке, дабы заставить ее работать с пропорциональными шрифтами… во всяком случае таков был первоначальный план. Это сработало, но мне пришлось вернуться к моноширному шрифту (а именно, к Lucida Console), ибо пропорциональные странно искажались при отрисовке.
  • Позволяет игре работать из-под любой системной локали. Некоторые маловажные тексты выводятся по-прежнему крякозябрами в не-русской локали, но на основной текст новеллы это не влияет (для этого GetGlyphOutlineA перенаправляется на GetGlyphOutlineW)

Наконец, MES.rb (скрипт на Ruby) производит, собственно, извлечение и замену текстов из/в файлах MES. Он также переносит текст по словам (разбивает на строки) — в идеале это должно происходить в движке перед печатью на экран в соответствии с размерами окна и характеристиками шрифта, но мой загрузчик уже и так был лапшевидным, время поджимало, но, главное, я все равно отказался от пропорциональных шрифтов, так что это форматирование можно было проделать заранее.

Комментарии посетителей

Ваш аватар Премодерация

На главную