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

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

Статистика:

  • 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 L155 | Смехуечки L1070 | Единый реестр L624 | Стопицот
1 L1069 | Абаснуй L903 | Герцог мира L908 | Советские мемы
2 L205 | Лошадь L145 | Принять ислам L285 | Пчёлы против мёда
3 L903 | Герцог мира L850 | Вувузелы L1046 | Пирдуха
4 L950 | Этого нет на дваче L331 | Вомгла L82 | Робоцып
5 L959 | Воткаят L119 | Annoying Orange L949 | YOBA
6 L960 | Maddyson L907 | Энциклонг L118 | С особым цинизмом
7 L32 | ОЯШ L1048 | Арбуэ L904 | Розовая кофточка
8 L814 | What would X do? L201 | Лунный свет L513 | Весёлые картинки
9 L982 | Ня, смерть! L153 | Сибирь — не Россия L246 | Что-то плохое
10 L147 | Зоя L588 | Winged Doom L179 | Гнездо параноика
11 L981 | Да, смерть! L510 | Я бы тебя трахнул L558 | Поросёнок Пётр
12 L1076 | Бамплимит L980 | Стыд L472 | Такие дела
13 L1066 | Козлище L960 | Maddyson L441 | Взлетит?
14 L835 | И немедленно выпил L147 | Зоя L190 | Кровавая гэбня
15 L621 | Матан L902 | В рот мне ноги L1068 | Конина блядская
16 L834 | Скотобаза L545 | Did he drop loot? L203 | ОВОЩИ
17 L843 | Шепилов L854 | Автострадный танк L83 | X? In my Y?
18 L118 | С особым цинизмом L1055 | Вин L855 | Гет
19 L766 | Не верю! L874 | Политрук L453 | Педобир
20 L1034 | ам L946 | Bleach L180 | Мыши плакали
21 L624 | Стопицот L94 | Katawa Shoujo L745 | Флюродрос
22 L935 | Сперва добейся L1074 | Poker face L224 | Цугундер
23 L1080 | Кузькина мать L181 | Закручивать гайки L706 | Коробочка фотонов
24 L1044 | Ибо нехуй L958 | Бессмысленный L807 | Как бы говорит нам
25 L113 | Былинно L168 | Смехуечки L137 | Чувство
26 L160 | Нофапафон L157 | И немедленно выпил L160 | Бесконечное лето
27 L98 | Другой глобус L260 | Skyrim L157 | И немедленно выпил
28 L907 | Энциклонг L143 | Полимеры L908 | Советские мемы
29 L476 | Leeroy Jenkins L371 | Ведро компрессии L77 | Медный таз
30 L873 | Bleach L852 | Битардск L947 | Обработать
31 L509 | Электричкинг L175 | До чего довёл L903 | Герцог мира
32 L850 | Вувузелы L142 | Нанотехнологии L129 | Паук
33 L46 | Мимими L854 | Автострадный танк L129 | Паук
34 L1070 | Единый реестр L884 | Ебал её рука L163 | Владимир Агапов
35 L107 | ОБС L859 | Аниме — говно L119 | Annoying Orange
36 L116 | Хакеры, крекеры L296 | Градус неадеквата L121 | Первый отряд
37 L114 | Деанон L107 | ОБС L122 | Ваш пост огорчает
38 L731 | Вуглускр L872 | Внезапно L725 | В рот мне ноги
39 L851 | Boxxy L352 | Стало веселее L951 | Аверченко
40 L471 | Неймфаг L95 | Cool story bro L615 | Потом допилю
41 L141 | Бичпакет L209 | Только расстрелы L612 | Мирный трактор
42 L98 | Другой глобус L1052 | Колдунство L113 | Былинно
43 L903 | Герцог мира L242 | Мне насрать L956 | Десу
44 L481 | Уже не тот L1070 | Единый реестр L858 | Кто выше
45 L1076 | Бамплимит L66 | Россия, потеряли L1070 | Единый реестр
46 L730 | Первый нах L107 | ОБС L465 | Breakout
47 L179 | Гнездо параноика L251 | Жывотнайе L1070 | Единый реестр
48 L903 | Герцог мира L378 | Арбуэ L37 | Короткоствол
49 L854 | Автострадный танк L468 | Червие L114 | Деанон
50 L153 | Сибирь — не Россия L885 | Аверченко L179 | Гнездо параноика
51 L98 | Другой глобус L855 | Гет L464 | Breakout
52 L236 | Ни в коем случае L689 | Вау-импульс L876 | Нет пути
53 L183 | Никита Литвинков L281 | Пихота L471 | Неймфаг
54 L190 | Кровавая гэбня L448 | Maddyson L929 | Умерьте пыл
55 L174 | Лёгкий голод L90 | Язык падонков L89 | Маленькая война
56 L454 | Yaranaika L1047 | Попкорн L539 | Помолясь
57 L855 | Гет L903 | Герцог мира L183 | Никита Литвинков
58 L849 | Maddyson L1076 | Бамплимит L7 | Неведомая Хуйня
59 L949 | YOBA L612 | Мирный трактор L587 | Анонимус
60 L657 | Фрязино L851 | Boxxy L107 | ОБС
61 L558 | Поросёнок Пётр L191 | Интересная личность L141 | Бичпакет
62 L808 | Хтоничненько L744 | Справедливость L126 | Национальная идея
63 L145 | Принять ислам L945 | Настоящий индеец L974 | Аффтар
64 L1070 | Единый реестр L121 | Первый отряд L294 | Сварщик
65 L854 | Автострадный танк L1053 | Фарцовка L898 | Флешмоб
66 L689 | Вау-импульс L689 | Immolate Improved! L192 | Духовность
67 L624 | Стопицот L221 | Где лулзы L495 | Make me unsee it
68 L954 | Выжечь огнем L953 | Робоцып L119 | Annoying Orange
69 L1005 | Make me unsee it L1074 | Poker face L855 | Гет
70 L141 | Бичпакет L287 | Сотни нефти L813 | И животноводство!
71 L689 | Вау-импульс L826 | Лец ми спик L874 | Политрук
72 L1075 | Дохлые герои L616 | Семецкий L184 | Бесконечное лето
73 L893 | Луч любви L1074 | Poker face L500 | Срывать Покровы
74 L481 | Уже не тот L1049 | Набег L673 | ИБД
75 L99 | Гражданская война L934 | Жадные дети L1001 | OH SHI--
76 L106 | Y helo thar L613 | Я кончил и закурил L121 | Первый отряд
77 L296 | Градус неадеквата L1064 | Интересная личность L1080 | Кузькина мать
78 L904 | Розовая кофточка L640 | ТруЪ L346 | Ня
79 L7 | Неведомая Хуйня L1049 | Набег L1079 | Создатель
80 L251 | Жывотнайе L94 | Katawa Shoujo L470 | Эта Страна
81 L1074 | Poker face L166 | Обустроить Россию L849 | Maddyson
82 L568 | Убью родных L631 | Апстена L88 | Пейрат
83 L94 | Katawa Shoujo L40 | Символизирует L1047 | Попкорн
84 L947 | Обработать L139 | Фатальный недостаток L854 | Автострадный танк
85 L91 | Я нихуя не понял L143 | Полимеры L326 | Ru football
86 L178 | На мороз L116 | Хакеры, крекеры L98 | Другой глобус
87 L609 | Советские мемы L847 | Умерьте пыл L121 | Первый отряд
88 L789 | Родина слонов L830 | Скотина Ненужная L77 | Медный таз
89 L90 | Язык падонков L107 | ОБС L1032 | Унылое говно
90 L949 | YOBA L874 | Политрук L477 | Ложь
91 L942 | Бесконечное лето L217 | Деление на ноль L951 | Аверченко

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

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

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

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

На главную