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

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

План: 1 декабря (Двач-мод), 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 (и игру) вы можете скачать отсюда (magnet), или вытащите его сами с помощью GARbro. Фоновая музыка очень атмосферна; я слушал её в течение сотен часов, пока занимался переводом, и она мне так и не приелась.

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

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

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

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

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

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

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

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

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

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

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

Бащяр в огне

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

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

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

  1. В тексте всех трёх арок есть отсылки на N мемов, где N = 276.
  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 = число «лутбоксов» (92), по файлу на каждую тройку мемов. В каждом файле — свой закрытый 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 и переводите монеты на свой адрес.

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

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

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

Доска почёта

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

№ тройки Мем №1 Мем №2 Мем №3
0 ??? ??? ???
1 ??? ??? ???
2 ??? ??? ???
3 ??? ??? ???
4 ??? ??? ???
5 ??? ??? ???
6 ??? ??? ???
7 ??? ??? ???
8 ??? ??? ???
9 ??? ??? ???
10 ??? ??? ???
11 ??? ??? ???
12 ??? ??? ???
13 ??? ??? ???
14 ??? ??? ???
15 ??? ??? ???
16 ??? ??? ???
17 ??? ??? ???
18 ??? ??? ???
19 ??? ??? ???
20 ??? ??? ???
21 ??? ??? ???
22 ??? ??? ???
23 ??? ??? ???
24 ??? ??? ???
25 ??? ??? ???
26 ??? ??? ???
27 ??? ??? ???
28 ??? ??? ???
29 ??? ??? ???
30 ??? ??? ???
31 ??? ??? ???
32 ??? ??? ???
33 ??? ??? ???
34 ??? ??? ???
35 ??? ??? ???
36 ??? ??? ???
37 ??? ??? ???
38 ??? ??? ???
39 ??? ??? ???
40 ??? ??? ???
41 ??? ??? ???
42 ??? ??? ???
43 ??? ??? ???
44 ??? ??? ???
45 ??? ??? ???
46 ??? ??? ???
47 ??? ??? ???
48 ??? ??? ???
49 ??? ??? ???
50 ??? ??? ???
51 ??? ??? ???
52 ??? ??? ???
53 ??? ??? ???
54 ??? ??? ???
55 ??? ??? ???
56 ??? ??? ???
57 ??? ??? ???
58 ??? ??? ???
59 ??? ??? ???
60 ??? ??? ???
61 ??? ??? ???
62 ??? ??? ???
63 ??? ??? ???
64 ??? ??? ???
65 ??? ??? ???
66 ??? ??? ???
67 ??? ??? ???
68 ??? ??? ???
69 ??? ??? ???
70 ??? ??? ???
71 ??? ??? ???
72 ??? ??? ???
73 ??? ??? ???
74 ??? ??? ???
75 ??? ??? ???
76 ??? ??? ???
77 ??? ??? ???
78 ??? ??? ???
79 ??? ??? ???
80 ??? ??? ???
81 ??? ??? ???
82 ??? ??? ???
83 ??? ??? ???
84 ??? ??? ???
85 ??? ??? ???
86 ??? ??? ???
87 ??? ??? ???
88 ??? ??? ???
89 ??? ??? ???
90 ??? ??? ???
91 ??? ??? ???

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

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

Движок радует своей минималистичностью, но не ясно, писался ли он для этой игры или все-таки нет — игра использует далеко не все его возможности (например, нет голосов и сохранений), но много жёстко прописанных значений как бы говорят нам, что, по крайней мере, его адаптировали. В коде нет строк, однозначно идентифицирующих движок. Ещё он весьма старый (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. Он также переносит текст по словам (разбивает на строки) — в идеале это должно происходить в движке перед печатью на экран в соответствии с размерами окна и характеристиками шрифта, но мой загрузчик уже и так был лапшевидным, время поджимало, но, главное, я все равно отказался от пропорциональных шрифтов, так что это форматирование можно было проделать заранее.

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

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

Аватар

Пост об этом переводе был опубликован в https://vk.com/fromnhkwithlove с ссылкой на данную страницу.

Огромный респект тебе, Прогер, за проделанную работу!

Аватар

Перевод не-"Двач" версии будет немного позже, в течение января.

На главную