TrueWorld~真実のセカイ~ (Shinjitsu no Sekai)

Download the patch:

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

TL/QC: 99%. To be released on 1 May 2020

Statistics:

  • 43 399 symbols, 1 148 lines
  • 11 218 kanji (different: 1 316)
  • 28 263 kana (hiragana: 25 814, katakana: 2 449)

Other stuff:

  • Game information (VNDB)
  • Sources (translation hook's code, original  & translated texts, etc.)
  • Alternative translation by a Japanese native
  • Side-by-side translation for (for QC)

License for everything: public domain (CC0).

About The Game

True World is a short humorous Visual Novel worth 1-2 hours of read. Conceptually it's an omake to NHK ni Youkoso! – that purported game that Sato and Yamazaki have been working on throughout the series.

As unassuming as it looks on the first glance, this is easily the best short NVL I have ever played (can't call it ADV with just 1 choice) – IMO the authors overdid what a simple omake strictly required. CG, BGM, scenario are all top notch©. Even mini-comics and the song for the credits roll are memorable and make a great conclusion.

You can grab the soundtrack from here or use GARbro to extract it yourself. It's amazingly athmospheric – I spent hundreds of hours on this localization while listening to it and it never palled on me.

The stories are also fitting. When I finished the first route I thought, “Well, it's not bad, it's even cute for such a small game”. Next one was a bit more “realistic” (if I can say so), still obviously grotesque but with a nice twist in the end. I pondered: “Not bad too but it worked twice now – can they possibly offer something new in the third route?” Despite the boring start, eventually it became clear that yes, they can, and that “nice twists” are the signature of this game. Else, how could a route have more than one ending while offering no choices to the player?

I will leave the answer to you. Just one advice: if you care, first go right (the BSR route), then left (the ERS route) – although it won't be the end of the world if you do the opposite (the world will end with NIE).

One of the ending illustrations
Ironically, the only heroine of the game they show in the anime actually does not appear in this game. But you know what? A cat is just as good!

About This Localization

I leeched this game from some goodness forsaken Japanese file sharing network back in 2010 and reversed it along with dozens of others per my hacking frenzy of that time. Then work and other stuff came in and the thing ended up collecting dust for around 10 years until I suddenly remembered about unfinished business™ and… here you have it.

First vs. replay art

The original game lets you replay it in “draft mode” with sketches instead of art and minor typos in the text. In my opinion, it doesn't add much value so I changed replay texts to be the raw (unchecked) translation. They are very close to the original and may give an interested reader insights into the plot as the authors intended it to be – however, long texts overflow and you are better off reading them on this HTML page instead.

I fanatically tried to convey all the meanings (obvious, hidden and cross-referenced) and even tasked a Japanese native with a parallel translation so I can cross-check it with mine. However, such accuracy was not always possible and to make up for that I am publishing all source files, including original Japanese texts, my translated texts after the first pass (no QC), the native's translation and my final texts.

Engine limitations. The game is using a fixed-width font and many hardcoded values such as the limit on how much text may appear before a pause (around 500 symbols). I patched some of them but not others because they're spread all over the code. Japanese packs more meaning per character than non-hieroglyphic languages and an equivalent translation would require proportionally more symbols – yet there are scenes where the entire screen is filled with text before a pause occurs leaving very little extra room for the translation. And occasionally I'd like to add in-text TL notes which can take 1-2 more lines on their own…

So, I did my best and even took liberty to "adapt" certain passages to make them more engaging. The result (non-replay texts) might deviate from the original – but hopefully for the best!

“Uncle Anon” Edition & The Blockchain-Based Lootbox

Bashyar in the heat

At some point during the translation, I realized that this game is just asking to be exploited. I mean, it's already a pun and what can be more fun than going deeper with the pun?

Therefore I went ahead and in addition to the “normal” translation created a “4chan version”, a.k.a. “Uncle Anon” Edition. I mixed references to several hundreds of Internet memes into the texts (not necessary exact) and made it so that whoever first determines a triplet of memes wins a pinch of bitcoins (at least 0.001 BTC).

Without further ado, the formal rules (these are for nerds, read on for simple ones):

  1. There are 0 memes used within the texts of all 3 routes.
  2. All used memes are listed on KnowYourMeme.com.
  3. Each meme is identified by two numbers: its KnowYourMeme ID (search for article class='entry' id='entry_2083' in the page's source code) and a line in this game's script (from this page).
    » For example: Zerg Rush ID is 927, Doge ID is 13564, Trollface ID is 91.
  4. Memes are grouped into random triplets. Each triplet consists of 3 memes taken from any part of the game (possibly even from different routes). A meme+line pair can be used only in 1 triplet (but some memes may be used more than once in the game, on different lines).
    » For example, assume line 452 hints at Zerg Rush, line 754 at Doge, line 351 at Trollface.
  5. A SHA-512 digest (raw) is calculated for each triplet, over this ASCII string: KEY1,KEY2,KEY3,
    M@RbLeC@KeG@Me
    where KEYn is L I where L is the meme's line number and I is its KnowYourMeme ID.
    » For example, echo -n 452 927,754 13564,351 91,M@RbLeC@KeG@Me | sha512sum = 02fee8ef…
  6. I have uploaded an archive with 0 files (“lootboxes”) – one file for each triplet. Each file has a (different) bitcoin private key encrypted with AES-256-CBC using key = first 32 bytes of the digest and IV = the following 16 bytes.
    » For example, echo 04e2acb7… | xxd -r -p | openssl aes-256-cbc -d -K 02fee8… -iv 37bb92…
  7. You know you have decrypted a file correctly if it starts with ASCII ZomG U WiN! plus space.
  8. You win a lootbox once you withdraw the entire amount from its bitcoin address.

The above rules are there so that I cannot be accused of cheating ;) A more convenient way to participate is:

  1. You play through the game and/or read through its script at this page.
  2. You input suspect memes (as KnowYourMeme URLs) into fields next to each line on that page.
  3. To check your results you download the “answer sheet” and feed it to this small program.
  4. If you guessed any loot, the program will display the private keys.
  5. You import them to Electrum (warning: as p2pkh keys) and send the coins to your own address.

However, bitcoins are just a pretext. Above all, I wish you have some fun with my localization!

Well then… Shall we do it?

YTMND

Leaderboard

Below is a table of all triplets and current status of their keys. Once a win is recorded on the blockchain, memes constituting the corresponding triplet are unveiled.

Oh, and some memes are harder to infer because they are rare and/or their references are obscure… and so their output of bitcoins is higher… which is just awesome :^)

Triplet # Meme 1 Meme 2 Meme 3
TBA

Technical Notes

Finally, a brief overview of the game engine and localization machinery. For details, refer to the archive.

The engine itself is fairly minimalistic and yet it's unclear if it was written specifically for this game or not – the game is not using all of its features (like voice support or game saves) but hardcoded values suggest the engine was at least adapted for it. There are no distinctive strings identifying the engine. It's also very old (the README too claims support for WIn98) and, erm, aggressively non-Unicode.

Like most engines of that time (ahem, ahem… RealLive), this one is using custom formats for basically everything: graphics are CRX files (CRXG magic, ZLib-compressed data), audio is PCM (XPCM magic, uncompressed PCM data with custom headers), scripts are MES (no magic).

Script files' format is straightforward (it's not some ISM SCRIPT of Sisters with dozens of fields in the header, 4 tables and a whole stack-based interpreter with 122 opcodes). A file starts with a single jump table followed by the bytecode stream. Each opcode is 1 byte long and there are 89 opcodes overall. Some strings (in particular the ones that the player sees – opcodes 4D, 4E, 4F) are obfuscated by subtracting 32 from the ordinal value of the character.

As for the limitations which I mentioned above, the engine has almost everything hardcoded – font names, font sizes, window dimensions, display line length, line height, bytecode length, etc. etc. Most troublesome is the fact that a string meant for output must not be longer than 0x400 bytes and due to the way the engine and my localization hook work every symbol is encoded as 2 bytes (even for pure English texts) so the real limit is around 500 characters, and then you also have to pre-wrap it… If I were to do this again, I would focus on porting the game to another engine rather than trying to localize this one.

Anyway, to work around most annoying problems I made a localization hook which is patching the engine's code on runtime by injecting a DLL into the main process. The DLL:

  • Modifies the import table to intercept calls to CreateFont for substituting hardcoded font parameters with ones that look better for Western languages.
  • Intercepts CreateFile to slip in the translated scripts (which are stored within the resource section of the DLL and extracted to %TEMP% when needed).
  • Breaks into the engine's character sizing algorithm to make it respect proportional fonts… at least this was the plan. It worked but I had to revert to using a monospaced font (Lucida Console) because it looked horrible due to some rendering glitches.
  • Allows the game to run in any locale – some minor texts (like window title) may be junk in non-English (non-Russian, etc.) locale but the main novel's text always looks properly (GetGlyphOutlineA is rerouted to GetGlyphOutlineW).

Lastly, MES.rb (a Ruby script) extracts and replaces texts within MES files. It also takes care of wrapping the lines before insertion – ideally this should be done by the engine on runtime according to screen width and font properties but the hook was already too much a contraption, I was short on free time and besides, I had to forego the idea of using a proportional font anyway.

Visitors' Comments

Your avatar Note: comments are premoderated

Home page