Fate/stay night:Clean .KS files

From Baka-Tsuki
Revision as of 20:05, 18 March 2009 by Const2k (talk | contribs) (added other variants from Russian branch of F/SN)
Jump to navigation Jump to search

Introduction

Decrypted *.ks-files contain not just decrypted text, but various service info as well (word wrapping tags, for example) that hinders translation process. To remove this service info and get text-only file, one can use:

  • MS Word 2003 macro (to edit one given script file within Word). Requires MS Word 2003 or above.
  • Python script (for batch processing of all *.ks-files in a given directory). Requires Python 2.x and (sometimes) MS Applocale.
  • MS .NET Framework 3.5 utility. Requires MS.NET Framework 3.5 or higher.


MS Word 2003 Macro

Requires MS Word 2003 or newer.
To use the following macro, you have to insert it into your Word document, save changes and run it. It will remove most frequent tags from your script (you can tell by looking). Press Alt+F11 to insert a macro in your document, copy and paste the following code (Ctrl+C, Ctrl+V) and save changes (Ctrl+S). Then run a macro via menu, usually Service - Macro.

Sub FSN_CleanUp()
'
' macro for MS Word 2003
' created at 11.05.2008 by DMC
'
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "\*page0*texton"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchFuzzy = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    With Selection.Find
        .Text = "\[wrap text=*\]"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchFuzzy = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    With Selection.Find
        .Text = "\[line*\]"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchFuzzy = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "[l][r]"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = False
        .MatchFuzzy = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "\*page*|"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchFuzzy = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "@pgnl"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = False
        .MatchFuzzy = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "\@textoff*texton^13"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchFuzzy = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "@pg"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = False
        .MatchFuzzy = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "\@textoff*return^13"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchFuzzy = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "\@*^13"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchFuzzy = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = """"""
        .Replacement.Text = """..."""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = False
        .MatchFuzzy = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    
End Sub

Original version is here (Russian).

Python Batch Script

Requires Python 2.x (download). MS Applocale (download, DDL or Google) is required only if your .ks-files have Japanese characters in filenames.
The following script exports only text from all .ks-files in the directory it's run from. Text is saved in .txt-files that are created the same directory, one .txt per each .ks-file. Save the following code as text (*.txt) file, rename it into Python script (*.py) file and copy/move script file to a directory you have extracted .ks-files in. If you have Python installed, *.py-files can be run as other programs (e.g. by single or double-click).

Python is bundled with many operating systems (Mac OS X, *nix and *BSD), but not with OS from Microsoft. To be able to use Python in Windows, you have to download and install Python 2.x (script isn't tested with Python 3.0 and above).

If your Windows OS doesn't use Japanese local settings for programs that don't support Unicode, script won't work on .ks-files with Japanese characters in filenames. Hence you either should rename your *.ks-files in order for them to have only ASCII symbols in filenames (latin alphabet and/or digits) or run script under Microsoft Applocale. In latter case open command line console via Applocale (start Applocale and set it to run %windir%\system32\cmd.exe under Windows XP or 2003), change directory to the location of your *.ks-files and *.py-file (e.g. cd "C:\FSN Files\Scripts"), and run Python script (e.g by entering gettext.py in command line). Script file must contain the following (make sure you have indentation intact, Python is strict about this!):

import os

def debrack(line):
 linemark = line.find('[line')
 if linemark+1:
  line = line[:linemark]+'-----'+line[linemark+7:]
 start = line.find('[')
 end = line.find(']')
 if start == -1: return line
 if start < end: return line[:start]+line[end+1:]
 return ''

files = []
for file in os.listdir(os.getcwd()):
 if file.endswith('.ks'): files.append(file)
if len(files) == 0:
 print 'No *.ks file(-s) to decode in current directory!'
 exit()
for file in files:
 print file,
 raw = open(file, 'rb')
 res = open(file.replace('.ks', '.txt'), 'wb')
 for line in raw:
  if line.find('\x00[\x00w\x00r\x00a\x00p\x00 \x00t\x00e\x00x\x00t\x00=\x00"\x00"\x00]') >= 0:
   line = line.replace('\x00', '')
   line = line.replace('[l]', '\r\n')
   templine = debrack(line)
   for i in range (1,100):
    newline = debrack(templine)
    if newline[2:4] == '""': break
    if newline == templine:
     res.write(newline[2:])
     break
    else:
     templine = newline
  if line.find('*page')+1: res.write('\r\n')
 raw.close()
 res.close()
 print '-> '+file.replace('.ks', '.txt')

Original version is here (Russian). Use discussion page for comments or PM Const2k on B-T forum.

MS .NET Framework 3.5 Utility

Requires MS .NET Framework 3.5 (download).
This program allows you to clean a .ks file from kirikiri script (@...) and word wrapping tags ([wrap text="..."]).
I only left the [lineX] balise, because it make complain the editors if they find unfinished sentences, even if it's normal. ^^
Old versions can be found in History of this page.

How to use

I wrote this program with .Net 3.5 so you need the .Net framework up-to-date on your PC.
If you want, you can access to the source code with a simple .Net decompiler, I don't have protected this program.


You don't need to install this program, it is just a small executable, so just execute it!
It will try to create/add-in a .config file (where ? In your User's AppData directory... I think :p) to save your settings (last directory used...) but it's not a critical file.


For clean a .ks file, open it (with "File->Open", or just drag&drop your file on the white zone from the windows explorer) then go in "Edit->Clean a file".
Then go save your file (File->Save) where you want, or just copy the text (you can select all text with Ctrl+A), on a web page for example.
For clean an other file, close your file ("File->Close"), and open an other!


If you have any question, request or bug, please PM me on the Baka-Tsuki forum.
--Bejarid 15:58, 6 March 2009 (UTC)

Changelog

Well, clean files one by one isn't quick so, with the version 1.1, you can clean all .ks files of a folder by one click!
Just click on "Edit->Clean a directory" select your directory and make sure you have a copy of this directory because that will replace files, not make new!
Then click on OK and wait few seconds... That's done.


With the version 1.2 you can clean just what you want!
With "Edit->Clean a file->Clean from Word-Wrap" you can unworp-wrap your .ks file to make an occidental .ks file look like original japanese .ks file (more readable outside of the game).
With "Edit->Clean a file-> Clean from Voice" you can unvoice your .ks file to make an unvoiced version.


With version 1.3, you can make a translated file with script from a cleaned translated file and an english scripted file!
Go in "Remake Script->Add Word-Wrap and Script to a cleaned file" and load the cleaned file, then the original file. Then go in "File->Save" to make a save of the new scripted and translated file.


Version 1.4 is for some bug fix ( "[lineX] balise" in ReWord-Wrap function and other minor bugs).


With version 1.5, you can add word-wrap to a KS file, without use "Remake Script" menu, all is in "File" menu.
So now you can open an english KS file, undo word-wrap, translate the text, and redo word-wrap without modificate the script part of the file. It's not real friendly-translator but you can, if you don't want to undo all script and redo it with "Remake Script". This version also resolve some bugs in openning file and redo word-wrap, and upgrade performance.


Version 1.6 if for fix few bugs (but really important), so now you can unwrod-wrap, and reword-wrap any KS file (with script or without)
But, be sur that you fix the original script, because if you compare japanese and english version, you will see some really strange things in mirror-moon's version. Just erase them (like ";//splitted" : what is that?!).

Download

Direct Download with SkyDrive : CleanerFSN v1.6 | English KS files for example

Tips

In end of line, the [l] mark is to make a pause (until player presses a button to have the next line) and the [r] mark is to make a new line.

This two is use together the most of time, but you can use only one of them, for example the [r] mark is useful to make a better presentation for a quotation.