Akai Ito

I notice that there are circulating patches out there from 2016. That version has a crash. The latest version is here:

https://drive.google.com/file/d/1w2VogDkPoUQAiETGFeIR9t1TXEiEBU6v/view?usp=sharing

PS2 Yuri Visual Novel


<0018> This time, just as I had a moment ago, Tsudzura-chan's body springs stiffly upright.
<0020> O-o-o-onee-san!? Why are you t-touching my tail!?
<0021> You know, I was just thinking it looked so fluffy, and might feel nice.

Full Website Patch!
You will need an original Akai Ito disc or ISO image.
Get the
Base patch
Get the
Most recent script update

Zohar’s site has 19068 of 21674 lines (88%) translated!!
Lines : 21674

Untranslated : 2606

Progress: 19068/21674 (87.98%)

Sakuya Route: 495 lines received

Progress: 19563/21674 (90.26%)

Mojibake count

R:\jp_script\decompiled\data>\ScriptStats.exe GET

Name: 20256

Title: 11681

Choice: 1514

Text: 566870

Total: 600321

Without Sakuya:

Name: 17301

Title: 9905

Choice: 1323

Text: 494567

Total: 523096

Difference: 77225

Feedback / questions?
IRC: #akaiito at Rizon

Credits

Translation: Zohar

http://art-tech.arts.ufl.edu/~kmcgo/Akaiito/storyfiles/

Hacking: Shizuka, Nanashi3

https://github.com/mchubby/akaiito_tools - for CEL and FONT formats.

Looking for: Editors, Translators

Progress

10 February 2017: Links removed. We are talking to localization companies!
27 January 2017: I’ve received Zohar’s translation of the Sakuya route.
20 January 2017: WELP, Trump’s inaugurated. Fix some Tsuzura route bugs.
15 January 2017: Fix crash in Left Side branch. Oops. Also various fixes to ending list.

Releases

28 Jan 2011: Yumei Route Patch
29 Feb 2016: Left Side
Base Patch (alpha test)
6 Mar 2016: Right Side Common Route (alpha test)
13 Mar 2016:
Full website patch. All existing scripts in game; need translators now!
14 Mar 2016: Full Website Beta Patch. Base Patch.
16 Mar 2016: Font modified.
Please suggest monospaced fonts to replace the Akai Ito built in one (which is pretty bad imo)
gsdx_20160316205325.png

Most recent release:

[1] Base Patch (includes modified BGM, opening/demo movies, and script)
--

[2] Full Website Patch (font, script fix)
--

Old saves will not work between versions (especially after double text boxes were implemented).

Status

Hacking is to a point where I'd be confident in writing a full patch with the current tools.

I’m in contact with the translator!! Exciting yurilicious things can happen now!!

Hacking

Hacking progress:

Component

Status

Image Format

The .CEL format was broken by "Nik" for Aoishiro. The tools for this format work for 24-bit images, and are broken for palettized 8-bit.

Script

Script Assembler/Disassembler Tool: "script.exe"

Format mostly understood. Decompiler and compiler written. Variable support is rudimentary

Dictionary, Savefile Name data files

Decompilers: "dict.exe" "title.exe"

Compiler: "compiler_bin.exe"

Formats fully reversed.

Flowchart data file

Flowchart String Codec: "AFCB.exe"

Strings extractable + insertable

PC Engine

The Galstars Akaiito Engine works, but you can make it crash if you mess with the flowchart. Flowchart crash FIXED

However, it is rather buggy; when it starts up, it is mostly reliable but will sometimes crash. However, it often decides not to start up at all, and doesn't work on my dev machine. I intend to fix the Galstars engine, but it's not a focus.

2016: Looks like quite a bit of progress on the PC version side? idk...

Aoishiro Engine

I've tried without success, even though I've actually adapted the script formats to work. I've confirmed that the engines have game-specific information in them, so adapting the Aoishiro engine to work with Akaiito will be very difficult.

FAQ

I’m trying to complete <character’s> route but keep dying. Why?

Akai Ito has a really annoying “seals” system that prevents you from playing routes out of order. More confusingly, some “seals” (notified upon completing a route) require “unlock conditions” that do not tell you you’ve passed through them. See the unlock section for more details.

How do I patch the game?

When this is finished, you would insert your disc into your computer, run the program, and the program will patch your disc, copying it to your hard drive. You would then burn the file to another DVD and play it on your modded PS2.

Wait, how do I run the game?

This is a PS2 game, and the release will be such that, given a modded PS2, you should be able to burn a copy of it and play it on the PS2. You can also get by with PCSX2, and you need something like a 2.0GHz Core 2 Duo (or equivalent) + DX9 Graphics Card, or a 2.0GHz Ivy Bridge i3 + software graphics rendering, to emulate the game without slowdown.

How about PC?

Our Communist Comrades at Galstars have modified the Akaiito PC Trial version to support the full game, but it does lose some functionality because the trial version doesn't support everything the PS2 engine does. I've patched a few bugs, but I still haven't caught all of them. I've actually tried converting the Akaiito scripts to Aoishiro's format, but now know it's not easily possible as there is game-specific data in the engine itself.
I also tried getting the Chinese patch’s PC engine to work, but it didn’t want to work on my system...

Plans

Phase 1: Converting the existing translation into game script

A. Downloading - completed.

B. Editing/Converting - converting the website's format to line up with the game scripts. This requires line by line checking, and implies an editing pass as well, as it would be wasteful not to do so. Also, the game engine doesn't support lines over 3x45 chars long, so sentence splitting is also required, and while this could be done automatically, it is better done by a human. Translation notes will go into the dictionary, the format of which has been reversed.

Phase 2: Finishing translation

A. Translating - translating the missing scripts from the game. This is the Sakuya route and any scripts the existing translation missed.

B. Image editing - Exactly as it says.

Phase 3: Fansubbing

It is really simple to get movies into Akai Ito.

Software (for movies) or DirectX 11 rendering is highly recommended on PCSX2.

A. OP movie [1] (translated, need TLC).

B. Demo movie [2] (translated, need TLC).

C. Ending movies (not done)

Progress

1 December 2010: OP and DM videos subtitled.

2-7 December 2010: Figuring out the script format.

8-9 December 2010: Format understood well enough to decompile. Decompiler is written.

13 December 2010: This page created.

19-20 December 2010: Compiler is written. Results are bit-exact.

2016: Finish what I started.

28 Feb 2016: Uzuki route synchronized.

28 Feb 2016: Compile: 26 translation too-long errors.

29 Feb 2016: Left Side alpha test patch uploaded

Trivial:

  1. Add dialog at beginning of scenario to unlock routes.
  2. Make a list of special characters in source SJIS and annotations in HTML (Lint)
  1. SJIS: Mark all special words (see below)
  2. HTML: Mark all italics, bolds, links, UTF-8isms
  3. Both: Mark all non-ASCII characters used or preserved
  4. Correctly translate ケイ as KEI (not Kei). Really annoying.
  5. Replace multiple periods with a maximum of three. (Lint)
    Currently all [2,8] length ones are replaced with SJIS …, and [9,+inf) ones are replaced with 9-length ASCII .’s.
    Replace multiple dashes with a maximum of two (ie. SJIS em-dash)
    Special cases necessary for full-textbox dashes.
  1. Common Text has 448 unique entries for titles and names spanning 11440 uses.
    http://www.mediafire.com/download/22lbtk6il2o4ol8/Script_Dict.txt
    There are         207 unique titles, 91 unique names, and 152 unique choices.
    Translated:         173 unique titles, 84 unique names, 114 unique choices
    Left:                34 unique titled, 7 unique names, 38 unique choices
  1. Replace all common #name fields
    Implemented in compiler.
  2. Dump titles from HTML, and replace:
  1. Flowchart titles
  2. Save titles
  3. Ingame Backlog Titles
  1. #choice fields
  1. Verify the translations of the choices for sure, can’t get these wrong.
    I forgot to do this when building the choice database. Oops.

Easy:

  1. Auto-split lines. Implemented in compiler.
    PLEASE NOTE that if the compiler shows that there has been a wrap overflow,
    an entire new text line has been added to the translation, so you can no longer load old saves in the same script without crashing (and you can no longer reference Japanese and English scripts to each other). Decompiling the file will show new lines.
  2. There’s a limit of two text boxes per line of text in the game because I’m lazy, and because there are certain things that get really nasty (see: character-spoken lines) in the backlog if multiple text boxes are used for the same line.
  3. Change from direct file editing to file transforms. This makes it easier to apply translation changes.

Annoying things to do:

  1. Make a list of questionable lines in translation HTML
  1. Lines with translation notes are questionable because they are awkward!
    An easy solution is to put all translation notes in a text file with the patch.
  2. Lines that aren’t translated are at least easy to identify
  3. Lines that are mistranslated are difficult to identify
  1. Change romanization.
    Dzu -> zu (done).

Difficult things to do:

  1. Find a translator to do the Sakuya route and missing lines.
  2. Put all translation notes in the dictionary! (we’re going to wipe out the existing dictionary)
  3. (?) Actually localize instead of translate.

Outdated:

Table of progress: bold is "complete"

Route

Rename/Sync

Edit/Fix

Translated

Notes

Day 1

1890/1910

1890/1910

0/20

s1a05_02 missing. 1890/1910 lines inserted.

Day 2 A

3584/3587

0/3587

1/3

Yumei/Uzuki/???

Day 2 B

2419/2423

0/2423

0/4

Tsuzura/Sakuya

Day 2

6006/6010

0/6010

0/4

s2b01_0a, s2b01_08 missing. 3585/6010 lines inserted.

Day 3 A

1493/1493

0/1493

n/a

Yumei

Day 3 B

available

Uzuki

Day 3 C

yes: s3c00-s3c11

avail: s3c12-s3c15
no: s3c16-s3c19

0/748

Sakuya

Day 3 D

available

Tsuzura

Day 3 E

available

???

Day 3

1493/7484

0/7484

0/748

1493/7484 lines inserted.

Day 4 A

1202/1202

0/1202

n/a

Yumei

Day 4 B

available

Uzuki

Day 4 C

no

0/790

Sakuya

Day 4 D

available

Tsuzura

Day 4

1202/3638

0/3638

0/790

1202/3638 lines inserted

Day 5 A

630/630

0/630

n/a

Yumei

Day 5 B

available

Uzuki

Day 5 C

no

0/635

Sakuya

Day 5 D

no

0/426

Sakuya

Day 5

630/2464

0/2464

0/1061

630/2464 lines inserted

Misc

0/170

0/170

Total

11222/21674 (51.8%)

8800/21674 (40.6%)

1/26+0/2599

8800/21674 lines inserted

Yumei

Uzuki

???

Sakuya

Tsuzura

S1

S2A

S2B

S3A

S3B

S3E

S3C

S3D

S4A

S4B

S4C

S4D

S5A

S5B

S5D

S5C

Missing 5 lines

Flowchart title

28: shorten

Save title

29: truncate

Backlog title

Not limited

Choices

44: shorten

Names

n/a

User interface

n/a

Regular title
44: word wrap

Missing:

#text 2556

#choice 28 (13)

#title 36

Total 2620

Yellow Highlight: not released yet.

Green Highlight: released (light green: released in 2011)

RED: translation doesn’t exist
YELLOW: translation partially exists
GREEN: translation exists on website
PURPLE: downloaded and renamed to game scripts
MAGENTA: game scripts adjusted to match script lines
BLUE: game scripts patched into data files
BLACK: edited scripts

Character Limits:

Choices: 44 (45 will cause slight overflow)

Save titles: 29. 27 + … (SJIS 0x8163)

Flowchart titles: 28 (29 with slight overflow)

Misc notes

Common Route

Missing Scripts:

s1a05_02<**all** 0000-0019> (20 lines)

Missing Lines:

s2b01_0a<0000>  えーと、お塩は舐めさせられたけど、それ自体すでに化かされたようなものだし。

s2b01_08<0000>  …………

s2b01_08<0001>  でも、塩を舐めさせられて水を飲んだだけだし、あのぐらいはご馳走になった内には入らないし。

s2b01_08<0002>  よし、なかったことに。

s2a02_00<0005> 地面は舗装されていない田舎道。ぬかるんだら歩くのも大変そうで、この暑さを差し引いても、今日は晴れて良かった。

s2a22_0a<0046> まぶたの向こうで、月光がはじけた。

s2a22_1h<0024> 聞こえているのかいないのか――

Sakuya route

s3c01_00<0059> 「そして今のあんたには、頼れるお供の孫悟空はいない」

s3c11_01<0035>  そして彼女は数歩分の距離を置いたところで歩みを止め、わたしを一瞥した後に、サクヤさんへと視線を据えた。

s3d09_00<0033>  そして彼女は数歩分の距離を置いたところで歩みを止め、わたしを一瞥した後に、サクヤさんへと視線を据えた。

s3d09_00<0033> And with several steps yet between us, she stills her feet, and after a single glance my way, fixes a stare on Sakuya-san.

Tsuzura route:

s3d16_00<0037>  葛ちゃんが警戒心あらわに身構える。

s3d16_00<0079> 「贄の血……」

Uzuki route (some of these are trivially translatable)

s3b11_00<0020>  受け身もとれずに背中をぶつけて、息が詰まっ*Nて苦しさに喘いだ。

s4b03_05<0006> 烏の濡れ羽色の御髪は、白衣とのコントラストでますます黒々と輝いている。

s4b03_06<0027>「それは、その……」

s4b06_02<0129>「どちらにせよ《器》――依代を持たない霊体は、己という形を保てずに虚空へと還っていく」

s4b07_00<0014> どうしよう。

s4b09_00<0016> 「重大な裏切り行為だとわかっていたはずなのに、鬼切りの技をお前に授けた?」

s5b02_00<0019> その音は、呼び鈴代わりだったのかもしれない。

s5b05_01<0011> ぐっと押し込まれた刃はとうとう心臓に達し、弾力に富んだその器官さえも切り裂いた。

Sakuya Route Missing:

s3c12-s3c19

s4c*

s5c*

s5d*

Choices don’t necessarily line up - need to note where the HTML gets them wrong.

Possible script paths

Yumei:

1 2A 3A 4A 5A

Uzuki:

1 2A 3B 4B 5B

???:

1 2A 3B 3E

Sakuya:

1 2B 3C 4C 5D 5C

1 2B 3C 4C 5C

Tsuzura:

1 2B 3C 3D 4D

1 2B 3D 4D

This means that 3C is partially translated (Tsuzura's portion is fully translated).

4C, 5D (Tsuzura's path does *not* continue here), and 5C are certainly not.

Substitutions:

dzu -> zu, for one. Other unpreferred romanizations will be eliminated.

《力》

<i>power</i>:《power》

《視》

<i>see</i>:《see》

<i>saw</i>:《saw》

<i>sight</i>:《sight》

<i>showed</i>:《showed》

<i>show</i>:《show》

《器》

<i>vessel</i>:《vessel》

《聴》

<i>listen</i>:《listen》

Unlocking Routes

Recommended Playing Order

  1. Uzuki (yuri: 4)
  2. Tsuzura (yuri: 2 - you pedo)
  3. Yumei (yuri: 5)
  4. Sakuya (yuri: 3)
  5. Nozomi (yuri: 4)

No other-route seals:

Uzuki: no special requirements. True end unlocks Yumei and Sakuya.

Tsuzura: Save at A Dream Bleached Away (Tsuzura route); need to see “The Near and Distant Shores” ending.

Routes with seals:

Yumei: Need to get unlock from Tsuzura/Sakuya common route “My Scars”. Need to see Uzuki route “The Oni and the Oni Slayer” scene, near Uzuki route true ending.

Sakuya: Need to see Uzuki true ending.

Nozomi: You must pick the appropriate choices expressing empathy towards Nozomi during the Yumei route “A Multitude of Fireflies” and Tsuzura route “Aggressive Tactics”. These are choices very close to the end of each respective route. Please note that choosing to “search for the mirror” during Tsuzura’s route will lock you into Tsuzura’s normal ending.

Without Sakuya, you can still reach the true ending of all other characters.

Unlock codes:

The command variable_op<0A> [24771900000000000n000000] is enough to unlock these.

Unlock 1: You must see the Common route “My Scars” scene.

s1day_a :: s1a19_00

Unlock 2: You must go to the Regional History Museum in the Tsuzura route.

s3day_d :: s3d03_05

Unlock 3: You must choose “But, I can't help but feel sorry for them” during the Yumei route’s “That which is Left Unfinished” scene.

s4day_a :: s4a11_02

Unlock 4: You must not break the mirror. (choose “Search for the Mirror” to get this choice.)

note: choice japanese is swapped on the website.

s4day_d :: s4d02_03

Unlock 5: You must view Tsuzura’s normal ending “The Near and Distant Shores”

s4day_d :: s4d08_02

Unlock 6: You must see the Uzuki route “The Oni and the Oni Slayer” scene.

s4day_b :: s4b09_00

Unlock 7: You must view Uzuki’s true ending “A Refreshing Breeze”

s5day_b :: s5b07_00

Unlock 8: Common Route left side “Path of Illusion” scene seen.

s2day_a :: s2a05_01

Seal requirements: (Seals are achieved after finishing the game via some kind of ending. If you use the “return to the title menu” option, I believe the seal unlocking script does not run.)

Seal 0: Unlock 1, Unlock 8 “Path of Illusion”

This makes it impossible to skip “The Hashira and Kei”. ← Annoying. You have to play through the “My Scars” scene and get to an ending, plus play through the “Path of Illusion” scene and get to an ending.

Seal 1: Unlock 2 “Joker”

This might unlock the Sakuya route?

Seal 4: Unlock 5 “A Dream Bleached Away”

This unlocks Tsuzura’s true ending.

Seal 5: Unlock 6 “Jouhari Mirror F”

This unlocks Yumei’s true ending.

Seal 6: Unlock 7 “Red Guidance”

This gives you an additional choice during Sakuya’s “Red Guidance” chapter. I think it’s needed to get Sakuya’s true end? This section of the game is not translated yet.

Seal 7: Unlock 3, Unlock 4 “Crimson Admonition”

This unlocks the Nozomi route!

Seal 8: All other seals unlocked

Seal 2B: All true endings seen

akaiito_guidebook-050.jpg

PC port details and notes:

I’m not sure I’m allowed to use the Akai Ito trail engine. It can certainly do the trick, but what about legal issues? Also I’d like to remove the dictionary feature and replace it with in-game hyperlinks. No need to break gameplay for translation/mythology notes.

Ren’py 6.99.12

Script format changes needed:

voice() - dereference name.

_unk<0C05> - AFS pointer. Derefence. Is this a voice line with lip sync?

Working:

#text

#name+#text

#title

#voice (no filenumber dereference) - all voices have a lipsync file.

_unk<1A03> masks the lipsync file though

#cg (background layer)

se

sprite

fade_cg

Not working:

A lot of _unk opcodes. Some of the transitions are basically simple ATL transforms though, very easy once I understand what it is, or I can just visually estimate the effect.

Lip sync: this is just going to be painful, even off screen characters have lip sync. Guess: they used a kana-to-lipsync converter.

Format is uint8[8] dummy, uint32 length, uint16[length, image in speech sequence of .cel - sort of. Something is off.]

Blinking eyes - simple

This is a transition.

0x0B00: cg (BG_BLACK.cel 1) [000000000000010031000000]

0x0B10: _unk<0C04> [000000000000000005000000]

0x0B20: _unk<0804> [00000000000000000000000000003C0000000000] <- 60fps =  1s delay

0x0B38: _unk<0003> [000001000000000000000000]

0x0B48: _unk<2103> [0000010000000000] <--execute transition?

0x0280: _unk<0B03> [00000000000000000000000000000A0000000000]

0x0298: _unk<0B03> [00000100000000000000000000000A0000000000]

0x02D4: sprite (C05A4L2.cel) [00000o000000040031303837] - red is layer.

0x02E4: _unk<0402> [0000000000000000 4001 00000000 E001 00000000] position.

0x02FC: _unk<0102> [00000000000000000A000000]

0x030C: _unk<0A02> [0000010000000000000000000000280000000000] //fadeout delay

0x0324: _unk<0902> [0000000000000000000000000000280000000000] //fadein delay

0x033C: _unk<0B02> [0000000000000000]

0x0348: _unk<2103> [0000000000000000]

0x0354: _unk<0003> [000000000000000001000000]

Here’s a sprite transition.

0x0660: _unk<0B03> [00000000000000000000000000000A0000000000]

0x0678: _unk<0B03> [00000100000000000000000000000A0000000000]

0x0690: _unk<0C03> [0000000000000000]

0x069C: _unk<2103> [0000000000000000]

0x06A8: _unk<2103> [0000010000000000]

0x06B4: sprite (C05C6L2.cel) [000001000000040031313638]

0x06C4: _unk<0402> [0000010000000000400100000000E00100000000] position(320,480). Anchor at bottom center.

0x06DC: _unk<0102> [00000100000000000A000000] img_cmd(show_with_delay (0xA0))

0x06EC: _unk<0A02> [0000000000000000000000000000280000000000] Hide, delay ⅔ s

0x0704: _unk<0902> [0000010000000000000000000000280000000000] Show, delay ⅔ s (40f)

0x071C: _unk<0B02> [0000010000000000]

0x0728: _unk<2103> [0000000000000000] (execute.)

Without clearing the screen.

0x0A08: _unk<0102> [000001000000000009000000] ← different image operation

0x0A18: _unk<0402> [0000000000000000400100000000E00100000000]

0x0A30: _unk<0102> [00000000000000000A000000]

0x0A40: sprite (C05C1L2.cel) [000000000000040031313431] //layer 1 over layer 0.

0x0A50: _unk<0002> [000000000000000001000000] // show instantly?

0x0A60: _unk<0A02> [0000010000000000000000000000140000000000] ⅓ s - hide this layer.

0x0A78: _unk<0B02> [0000010000000000]

0x0A84: _unk<0003> [000001000000000000000000]

0x0A94: _unk<2103> [0000010000000000]

0x0AA0: #text(0014)

Might be best to heuristically determine complex image transforms and do those manually actually.

Easy stuff we need to automatically translate to renpy.

Progress:

Simple:

Text.

CG display

Sprite display (including blinking eyes)

Layering

Sound and BGM

Playing movies.

Intermediate:

Transitions and ATL transforms.

Flow chart.

Save page

Variables - save data - title, what time it is in the game (day 1/2/3/phase of the moon), blood amount

Variables - progression data.

Complicated:

Lip sync. Format is not reversed and doesn’t make sense (ie. it’s contradictory). Timing does not seem to match frame timings, which is used everywhere else in the game.