<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.0.3" -->
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>sekai.insani.org</title>
	<link>http://sekai.insani.org</link>
	<description>insani's production journal</description>
	<pubDate>Mon, 21 Aug 2006 13:38:30 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.0.3</generator>
	<language>en</language>
			<item>
		<title>Visions from the Other Side: Mentor&#8217;s Debriefing</title>
		<link>http://sekai.insani.org/archives/26</link>
		<comments>http://sekai.insani.org/archives/26#comments</comments>
		<pubDate>Mon, 21 Aug 2006 05:09:30 +0000</pubDate>
		<dc:creator>Seung Park</dc:creator>
		
	<category>Production Process</category>
	<category>Project Debriefs</category>
		<guid isPermaLink="false">http://sekai.insani.org/archives/26</guid>
		<description><![CDATA[During al&#124;together 2006, I had the honor of serving   in a mentorship role to five different translators, all of whom are affiliated in one way or another   to my amateur visual novel localization circle, insani.  Each   translator came to me from a different walk of life &#8212; there [...]]]></description>
			<content:encoded><![CDATA[<p>During <a href="http://altogether.insani.org/2006">al|together 2006</a>, I had the honor of serving   in a mentorship role to five different translators, all of whom are affiliated in one way or another   to my amateur visual novel localization circle, <a href="http://www.insani.org/">insani</a>.  Each   translator came to me from a different walk of life &#8212; there was not a single common factor to be   found among any of them save for the fact that they were attempting, in one way or another, to translate   a piece to be presented at festival&#8217;s end.</p>
<p>In the next few days, some of them may be presenting their debriefings for their individual projects   on our development journal; indeed, Edward has started us off strong with his very insightful analysis   of what happened over the course of his project.  I will be attempting to do something very similar   in this five-part series of Mentor&#8217;s Debriefings, but with a somewhat different focus.  As Edward has   led us off quite well, I have chosen to start with his project first.<a id="more-26"></a></p>
<h3>Theory and Praxis</h3>
<p>The target piece that we chose for Edward was 向日の夢, a short visual novel that was released in   2002 by <a href="http://n-rail.hp.infoseek.co.jp/">Treasures</a>.  At first it seemed like a good fit,   as it met the following criteria:</p>
<ul>
<li><strong>Engine Familiarity:</strong> this piece was based on NScripter, which is a visual novel scripting     engine that is intimately familiar to us.  All the tools we required to effectively localize this game were     already available to us &#8212; indeed, we were the ones who had <em>created</em> some of said tools in the past.     This made this piece an immediately-attractive target.  It should come as no surprise that this was one of     the two criteria that I did not end up gravely misjudging.</li>
<li><strong>Length:</strong> this piece&#8217;s script weighed in at 15KB, about a fourth of which consisted of scripting     commands.  In my perspective, this is a very short script &#8212; it is one that, at average speed, I could have     translated and translated well in no more than an hour.  Fortunately, it is true that in the grand scheme of things,     a 15KB script is on the rather small side of things.  Unfortunately, it turned out that my usage of my own     translation speed and accuracy as a metric for those I was a fundamentally bad idea, and that depending on     how those 15KB were written, a translator might have a very hard time indeed with them.</li>
<li><strong>Written Complexity:</strong> length aside, during my preapproval read of this script, I found that it     had a relatively simple narrative voices that switched off at the beginning of every new chapter of the story.     Furthermore, I found that while there was a moderate level of slang and street language in the piece, there was     enough context established in the various narrative flows that a beginning translator might have some difficulties,     but he should in the end be able to grasp at where, so to speak, the narrator is going.  Therefore I initially chose     to take a more hands-off approach, to see what he would come up with on his own.  <strong>This ended up being a     complete miscalculation on my part</strong> &#8212; not only did Edward struggle with many of the words that I had written off as     simple, he also ended up having a very difficult time establishing what, exactly, the narrative flows were doing     at any given time.  As a result, and because I initially refused to intervene deeply, he found himself reading a story     that was qualitatively very different from the one that was actually being told.</li>
<li><strong>Production Value:</strong> this visual novel boasts particularly high production value in graphical content,     especially for a free amateur visual novel built in 2002.  I distinctly recall that this particular criterion drew     a lot of attention during the preliminary phases of <a href="http://altogether.insani.org/2006">al|together 2006</a> &#8212;     at one point, no fewer than three translators including Edward himself wanted to do this piece.  It will probably come     as no surprise that this was the other of the two criteria that I did not end up gravely misjudging.</li>
<li><strong>Lines of Communication:</strong> while not a facet of the piece itself, this is still an important criterion     to bring up.  Edward and I have worked together for two years now, executing project after project successfully.  Our     lines of communication are strong and open at any time, and of all people he would not feel embarrassed to come to me     for help if need be.  This gave me confidence that he would ask a lot of questions, and that he would listen intently     to what I had to say.  And while he did ask a lot of questions &#8212; and I gave a lot of answers &#8212; there arose some     misunderstandings in our discourse that would come back to haunt us in the final days of this project.</li>
</ul>
<h3>What Went Right</h3>
<ul>
<li>The preproduction phase went very smoothly.  Edward did jump right into the script, and asked questions at what I felt     were a pretty good clip.  The questions he asked were mainly of a technical nature &#8212; how does this phrase work, what is     this word, what is this extra sound doing here.</li>
<li>The release engineering phase was both fast and efficient, a product of our long association with each other.</li>
<li>The final product was well-done, and both the accuracy and the artistry of the translation meet our internal standards.</li>
</ul>
<h3>What Went Wrong</h3>
<ul>
<li>I severely misjudged Edward&#8217;s abilities as a translator, and thus I left him to figure things out when I probably should     have not.  As a result, there grew to be many inaccuracies in his initial translation that I probably could have helped     avoid by checking up on him more regularly.</li>
<li>This piece was actually a lot more technically difficult than I had thought.  It has no less than four different narrators,    all of whom use the first-person voice &#8212; this in and of itself gives ample reason for a novice translator to become easily    confused.  Furthermore, while the language used does tend toward the simple, this simplicity is deceptive &#8212; there are many    subtle contextual clues that, if missed out, could have &#8212; and did &#8212; lead to disastrously incorrect readings of sentences,    paragraphs, and even entire chapters of the work.</li>
<li>I waited until Edward had a completely translated script before I began looking through it.  This resulted in a wastage of     about four days that I could have spent looking through and commenting on his translation &#8212; and this possibly could have     helped us nip many of the above problems in the bud.</li>
</ul>
<h3>Object Lessons</h3>
<ul>
<li>The mentor needs to take a <strong>far more active role</strong> in the translator&#8217;s work.</li>
<li>In conjunction with the above, the translator must confer with the mentor <strong>far more often</strong> than he wishes     to.  Do not take our silence as approval!  It is best to nip problems in the bud before they grow into a script that needs     to be entirely retranslated by the mentor two days before the final deadline.</li>
<li>If you have a mentor, <strong>ask questions about <em>everything</em></strong>.  This means submitting <em>every single      line you translate</em> if that is necessary.</li>
<li><strong>Err on the side of absolute caution</strong>.  Submit even lines that you think you have absolutely nailed down for approval.</li>
<li><strong>The only thing worse than a translator who asks for only a little help is a translator who asks for no help at all</strong>.</li>
<li><strong>Treat the piece as a unified whole, not as individual paragraphs and sentences</strong>.  Each word <em>only makes sense</em> within     its parent sentence.  Each sentence <em>only makes sense</em> within its parent paragraph.  Each paragraph <em>only makes sense</em>     within its parent chapter.  Each chapter <em>only makes sense</em> within its parent work.  If you, as a translator, ignore     this at any point in time, you have already failed.</li>
<li>If you do not understand the comment blocks the original author has written, <strong>translate them first</strong>, before anything     else.  This will give you much-needed insight as to what the author was thinking, and how the author chose to organize his or     her script.</li>
<li>As a translator, it is not your duty to write the piece that you think the author should have written.  <strong>It is your duty to translate     the piece that the author actually wrote</strong>.  This means making sure that you have as close a bond &#8212; direct or indirect &#8212;     to the author as you can.  Read the original words.  Contact the original author if you can.  Try as best you can to understand not     only what the author <em>did</em> write, but the way that the author <em>would</em> write if he were a native speaker of English.</li>
</ul>
<h3>Conclusion</h3>
<p>Was this project worth it?  From my perspective, it most definitely was.  Both Edward and I learned a lot, I think, about both the nature of translation and the nature of mentorship.  And while it was not always a pleasant experience, it was interesting work, and our final localization stands on its own merits.  Should Edward attempt another localization in the future, I would be honored to serve as his mentor again, and we will most certainly remember the insights and the hard lessons we have been taught by this project.
</p>
]]></content:encoded>
			<wfw:commentRSS>http://sekai.insani.org/archives/26/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>Visions from the Other Side: Debriefing</title>
		<link>http://sekai.insani.org/archives/25</link>
		<comments>http://sekai.insani.org/archives/25#comments</comments>
		<pubDate>Sat, 19 Aug 2006 05:55:16 +0000</pubDate>
		<dc:creator>Edward Keyes</dc:creator>
		
	<category>Production Process</category>
	<category>Project Debriefs</category>
		<guid isPermaLink="false">http://sekai.insani.org/archives/25</guid>
		<description><![CDATA[During the al&#124;together 2006 game translation festival, I tackled the short visual novel &#8220;Mukou no Yume&#8221;, retitled &#8220;Visions from the Other Side&#8221;.  This was my second excursion as a game translator, after last year&#8217;s &#8220;The Poor Little Bird&#8221;, and I wouldn&#8217;t have dreamed of attempting it without having gp32 around to sanity-check my work.
During [...]]]></description>
			<content:encoded><![CDATA[<p>During the <a href="http://at2006.haeleth.net">al|together 2006</a> game translation festival, I tackled the short visual novel &#8220;Mukou no Yume&#8221;, retitled &#8220;Visions from the Other Side&#8221;.  This was my second excursion as a game translator, after last year&#8217;s &#8220;The Poor Little Bird&#8221;, and I wouldn&#8217;t have dreamed of attempting it without having gp32 around to sanity-check my work.</p>
<p>During the month of the festival, I kept a brief log of my progress, so I thought this might be interesting to post, to show what goes on behind the scenes of the game translation process.  As well, it&#8217;s worth discussing some of the lessons learned from all this.<a id="more-25"></a></p>
<h3>Mukou no Yume schedule</h3>
<p><strong>7/18</strong>: Preflight check.  Got Mukou running happily in ONScripter via redirecting filenames to data/ with a search-and-replace and pulling out the cursor0.bmp.  Identified graphics needing translation and set them aside.</p>
<p><strong>7/19</strong>: Day 1 of read-through.  Hit line 43/276 of actual Japanese lines. Imported com01-07 to Photoshop for later (dead simple) editing.</p>
<p><strong>7/20</strong>: Day 2 of read-through.  Hit line 74/276 (+31 for the day). Also worked on <em>[insani project]</em> today, so not a full day of translation.</p>
<p><strong>7/21</strong>: Day 3 of read-through.  Hit line 112/276 (+38 for the day). Some <em>[insani project]</em> as well.  Seem to be averaging about one gp32 question per 20 lines or so.</p>
<p><strong>7/22</strong>: Day 4 of read-through.  Hit line 155/276 (+43 for the day). Fewer questions today and a decent pace, with a couple of good working periods through the day.  Past the halfway point.</p>
<p><strong>7/23</strong>: Day 5 of read-through.  Hit line 186/276 (+31 for the day), and fiddled with the title graphic a bit.  Also worked on True Tears some but generally wasn&#8217;t too into translation.</p>
<p><strong>7/24</strong>: Took a break from Mukou.  Worked on True Tears a bit, but the day was mostly a waste.</p>
<p><strong>7/25</strong>: Mukou break continues, with some more serious True Tears effort.</p>
<p><strong>7/26</strong>: Mukou break continues, but finished True Tears graphics and went to QC release on it.</p>
<p><strong>7/27</strong>: Day 6 of read-through.  Hit line 209/276 (+23 for the day). Main effort for the day was a sekai entry, though.</p>
<p><strong>7/28</strong>: Day 7 of read-through.  Hit line 276/276 (+67 for the day), finishing the initial pass after being trapped on campus by storms until late.  Script up from 19K original to 68K including romaji and annotations.</p>
<p><strong>7/29</strong>: Took a break from Mukou to QC True Tears.</p>
<p><strong>7/30</strong>: Mukou break continues, but finished up True Tears QC and graphic revisions, and pushed out the release.</p>
<p><strong>7/31</strong>: Took a break from everything, feeling wiped from staying up to 4:00am to finish True Tears.</p>
<p><strong>8/1</strong>: Break from everything continues, with a full day at SIGGRAPH.</p>
<p><strong>8/2</strong>: Day 1 of translation.  Did a half-hearted attempt at 20 lines or so, but couldn&#8217;t get a good sense of tone or level of literalness versus colloquialness required, so work mostly redone the next day.</p>
<p><strong>8/3</strong>: Day 2 of translation.  Real translation pass begins, actually inserting English into playable script.  Up to line 26/276.</p>
<p><strong>8/4</strong>: Day 3 of translation.  Up to line 52/276 (+26 for the day). Pace is a bit slower than I&#8217;d like, mainly due to lack of huge working periods.  T minus 2 weeks.</p>
<p><strong>8/5</strong>: Took a break from Mukou, although I did glance at the next section a bit.  Main task for the day was <em>[non-insani project]</em>.</p>
<p><strong>8/6</strong>: Break continues.  Main task of the day was moving preparations.</p>
<p><strong>8/7</strong>: Break continues.  More moving stuff.</p>
<p><strong>8/8</strong>: Break continues.  Moving stuff, car repair, <em>[non-insani project]</em>.</p>
<p><strong>8/9</strong>: Day 4 of translation.  Up to line 64/276 (+12 for the day).</p>
<p><strong>8/10</strong>: Day 5 of translation.  Up to line 75/276 (+11 for the day). My translation pace is really starting to suck.</p>
<p><strong>8/11</strong>: Nada, back to moving preparations and phone tag.  Gotta get a ton done this weekend when I know nobody will be calling me.  T minus 1 week.</p>
<p><strong>8/12</strong>: Day 6 of translation.  Up to line 118/276 (+43 for the day). Good pace, and got through some tricky passages.</p>
<p><strong>8/13</strong>: Day 7 of translation.  Up to line 136/276 (+18 for the day). Spent a lot of time in moving crap.  Lack of progress is getting critical. Also did QC for At Summer&#8217;s End.</p>
<p><strong>8/14</strong>: Day 8 of translation.  Up to line 178/276 (+42 for the day). Two decent working periods, plus a full round of moving chores: busy day.</p>
<p><strong>8/15</strong>: Day 9 of translation.  Up to line 216/276 (+38 for the day). Got an early start and did 25 lines before lunch, but did moving junk in the afternoon, and the evening was killed with <em>[non-insani project]</em>, as well as QC on OMGWTFOTL and Adagio.  Really busy day.</p>
<p><strong>8/16</strong>: Day 10 of translation.  Finished translation pass at line 276/276 (+60 for the day).  Script up to 90K from 19K original.  Did some minor wording cleanups and then handed off to gp32 for critique.  Edited the ending credit graphics, and the title graphic too.  Attempted to email RAIL for official permission, but both his known addresses bounced, so giving up on that.  T minus 2 days, and probably in good shape.</p>
<p><strong>8/17</strong>: Day 1 of post-production.  Did OS X custom icons.  Corrected some pagination and script problems, as well as tweaks to ending credits. gp32 begins editing and retranslates a significant fraction of the text due to some large contextual blunders on my part.  Translated the Readme file and handed it off to gp32 for editing.</p>
<p><strong>8/18</strong>: Day 2 of post-production.  Final editing pass of gp32&#8217;s new script, mainly fixing punctuation style and pagination/centering issues. QC build of full OS X installer.  Readme revised by gp32.  Some minor tweaks, then tri-platform builds.  QC of Panda Samurai.  RELEASE!</p>
<h3>Analysis</h3>
<p>I estimate that I spent somewhere around 80 hours on this game throughout the month of the festival &mdash; though only 20 working days &mdash; averaging about 5-10 lines/hour for each of two translation passes, plus time spent in miscellaneous graphics work, editing, and release engineering.  This is the rate of someone who has awful Japanese skills, by the way.  Note that gp32 essentially redid the same amount of work in one evening during his translation review.</p>
<p><strong>Lesson one</strong>: a good translator is not just 25% faster, or has 15% fewer errors than a poor translator.  A good translator is <strong>orders of magnitude</strong> faster and produces <strong>qualitatively</strong> better work.</p>
<p>My translation of the game was riddled with small errors, of course.  What I didn&#8217;t expect, however, was the gaping contextual holes&#8230; I had misread entire passages as referring to different characters completely, got confused on who said what line, and messed up the passage of time <strong>horribly</strong>.  It is not an exaggeration to say that the translation I initially produced is a qualitatively different game than the one which was originally written and eventually released.</p>
<p><strong>Lesson two</strong>: if you have the opportunity, get a better translator to give you a quick synopsis of the game before you start work.  A bad hypothesis about, say, who the narrator actually is during a given passage will warp your interpretation down to the grammatical level and produce a lot of confusion.  Note that Japanese depends a lot on comparatively subtle contextual clues to make up for the lack of explicit pronouns, and a novice translator may not pick up on them properly.</p>
<p>However, visual novels have some extra elements that can help a lot, specifically the audiovisual information in the game.  Is the script ambiguous about whether a character is male or female?  Look at their picture!  Are you unclear whether a scene change has taken place or not?  Listen to the background music!</p>
<p><strong>Lesson three</strong>: don&#8217;t just work from the script, treat the entire game as a whole as your translation source.  I, unfortunately, failed to do this in a number of cases&#8230; I played the game initially, then almost ignored it again until I was ready to test my translated script.  Bad idea.  The first playthough showed me a number of &#8220;Oh of <em>course</em>&#8221; revelations, and there were more to pick up on if I&#8217;d been attentive enough.</p>
<p>Was all of this worthwhile?  I&#8217;m not sure&#8230; the resulting release certainly is, and I hope people will enjoy playing it.  But I don&#8217;t think I learned as much as I thought I would about translation: the number of errors was just too great for me to be able to discuss, correct, and learn from each one.  In that sense I bit off more than I could actually chew for al|together this year, I think.
</p>
]]></content:encoded>
			<wfw:commentRSS>http://sekai.insani.org/archives/25/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>So You Want To Be a Hacker? Part IV: Compression Formats</title>
		<link>http://sekai.insani.org/archives/24</link>
		<comments>http://sekai.insani.org/archives/24#comments</comments>
		<pubDate>Fri, 28 Jul 2006 00:42:59 +0000</pubDate>
		<dc:creator>Edward Keyes</dc:creator>
		
	<category>Production Process</category>
	<category>So You Want To Be a Hacker?</category>
		<guid isPermaLink="false">http://sekai.insani.org/archives/24</guid>
		<description><![CDATA[Game data archives almost always employ some type of compression for their contents, and sometimes will even mix and match different algorithms for different types of files.  Understanding the typical compression formats is therefore crucial to the success of a game hacker.
Moreover, you need to be able to recognize the common algorithms just from [...]]]></description>
			<content:encoded><![CDATA[<p>Game data archives almost always employ some type of compression for their contents, and sometimes will even mix and match different algorithms for different types of files.  Understanding the typical compression formats is therefore crucial to the success of a game hacker.</p>
<p>Moreover, you need to be able to <em>recognize</em> the common algorithms just from their compressed data alone, so when you&#8217;re staring at hex dumps, you will know how to proceed.  In today&#8217;s installment, we&#8217;ll go through some of the most popular formats, how they work, and how you can recognize them &#8220;in the wild&#8221;.  <a id="more-24"></a></p>
<p>First of all, note that this task is in theory quite hard.  The ideal compression algorithm produces data that is essentially indistinguishable from random noise (which counterintuitively contains the highest density of information).  Fortunately, games have two additional requirements: to be able to access data quickly, and to be programmed by normal coders as opposed to Ph.D. computer scientists.</p>
<p>Both of these requirements means games typically use either industry-standard formats or relatively simple, quick algorithms that anyone can code from a book.  The former often include extra identifying information we can spot, and the latter compress data poorly enough that it looks like &#8220;compressed data&#8221; instead of looking like random noise.</p>
<h3>zlib</h3>
<p>Let&#8217;s start with the industry standard, <a href="http://www.zlib.net">zlib</a>.  This is an open-source compression library which implements the classic &#8216;deflate&#8217; algorithm used in .zip and .gz files.  It&#8217;s pretty fast and pretty decent, and since it&#8217;s already written and completely free, it gets used all over the place, including in game archives.</p>
<p>How can you recognize it?  <strong>0&#215;78 0&#215;9C</strong>.  The first two bytes of a standard zlib-compressed chunk of data will be those two bytes, which specify the default settings of the algorithm (&#8217;deflate&#8217; with 32KB buffer, default compression level).  Alternately, you will often see <strong>0&#215;78 0xDA</strong>, which is the same except using the maximum compression level.  If you see those two bytes at the start of where you expect a file to be, rejoice, since you&#8217;ve just solved a big mystery with next to zero effort.</p>
<p>Decoding this format is also pretty easy, since virtually every modern language will have a zlib library for it.  In C, you want to just link against <strong>libz</strong> and call:</p>
<pre>
#include &lt;zlib.h&gt;
uncompress(new_buffer, &#038;new_size, comp_buffer, comp_size);
</pre>
<p>Be sure to allocate enough memory for your expanded data: hopefully the archive index will have already provided you with the original file size.  The function will return a status code and additionally update <samp>new_size</samp> with the amount of data that was uncompressed.</p>
<p>In Python, dealing with zlib is just embarrassingly easy:</p>
<pre>
new_data = comp_data.decode('zlib')
</pre>
<p>One of the built-in string-encoding methods (like ASCII, UTF8, Shift-JIS, etc.) is just zlib encoding, so if you have your data as a string you can just expand it like that.  Alternately you can <samp>import zlib</samp> and use more direct function calls for extra control.</p>
<p>Compressing data is just as easy, with the <samp>compress()</samp> function in C &mdash; or <samp>compress2()</samp> if you want to specify the compression level &mdash; and the <samp>encode(&#8217;zlib&#8217;)</samp> string method in Python (or zlib library calls).</p>
<p>I don&#8217;t want to say much about the inner workings of the deflate algorithm, since that really doesn&#8217;t come up very often: you can safely treat it like a black box.  However, there is one extra facet I&#8217;ve run across: the Adler32 checksum.  This is a very simple 32-bit checksum algorithm (like CRC32) which is included in the zlib library, and therefore gets also used by games a bit.  Additionally, the zlib format specifies that an Adler checksum is appended to the end of a compressed file for error-checking purposes.</p>
<p>However, some games twist their zlib implementation slightly by either leaving off the checksum (in favor of using their own elsewhere in the archive) or moving it into the archive index instead.  This will cause the zlib uncompress call to return an error, <em>even though it actually uncompressed the data successfully</em>.</p>
<p>So, a word to the wise: if you&#8217;re sure that the game is using zlib but you keep getting errors when you try to expand the data, look for this case.  You may have to do a little twiddling of the compressed data to add the expected checksum at the end, or just ignore the zlib error codes and continue as normal.</p>
<h3>Run-length compression</h3>
<p>This is the simplest kind of home-grown compression you&#8217;re likely to run across.  It shows up in image compression a lot, sometimes as part of a larger sequence of processing.  Basically the idea is to start with a sequence of bytes and chunk them up whenever you run across a repeated value:</p>
<pre>
  31 92 24 24 24 24 24 C5 00 00
= 31 92 5*24 C5 2*00
</pre>
<p>Exactly how you represent the chunked-up data varies a bit from algorithm to algorithm, depending on what you expect the sequences to look like.</p>
<p><strong>Escape byte.</strong>  You might designate a byte, say <strong>0xFF</strong> as a flag for designating a run of repeated bytes, and follow it by a count and a value.  So the above data would be:</p>
<pre>
  31 92 FF 05 24 C5 FF 02 00
= 31 92 5*24 C5 2*00
</pre>
<p>If the flag byte actually appears in your data, you have to unescape it by, say, having a length of 0 in the next byte.</p>
<p><strong>Repeated bytes.</strong>  Here you just start running through your data normally, and whenever you have two bytes in a row that are the same, you replace all the rest of them (the third and thereafter) with a count byte:</p>
<pre>
  31 92 24 24 03 C5 00 00 00
= 31 92 24 24 3*24 C5 00 00 0*00
</pre>
<p>If you don&#8217;t have a third repeated value, you&#8217;ll need to waste a byte to give a count of 0.</p>
<p><strong>Alternating types.</strong>  Here you assume that your data alternates between runs of raw values and runs of repeated bytes, and prepend length counts to each type:</p>
<pre>
  02 31 92 05 24 01 C5 02 00
= 2 (31 92), 5*24, 1 (C5), 2*00
</pre>
<p>Naturally, if you have two repeated runs in a row, you&#8217;ll have to waste a byte to insert a 0-length raw sequence between them.  A special case of this I&#8217;ve run across is when you expect to have long runs of zero in particular instead of any random byte, so you just alternate between runs of zeroes (with just a bare count value) and runs of raw data.</p>
<p>Note, of course, that there is some subtlety which can be involved depending on the variant you run across.  For instance, it&#8217;s often the case that pairs of bytes aren&#8217;t efficient to encode, so they&#8217;re just treated as raw data.  Also, rather than giving lengths themselves, sometimes you encode, say, length-3, if length values of 0, 1, and 2 aren&#8217;t ever needed.  In some cases you might also run across multi-byte length values (controlled, say, by the high bit in the first length byte).</p>
<p>For images, you may have <em>pixels</em> instead of bytes which are the fundamental unit of repetition.  In that case, even two RGB pixels in a row which are the same can be successfully compressed.</p>
<p>In any event, how do you recognize this format?  The general principle is that all of these variations have to fall back on including raw bytes in the file a lot, so you want to try to look for those identifiable sequences (RGB triplets in image formats are good to key off of) interspersed with control codes.  It&#8217;s often helpful to have an uncompressed version of an image to compare against, which you can recover from a screenshot or from snooping the game&#8217;s memory in a debugger (a topic for later articles).</p>
<h3>LZSS</h3>
<p>One step up from run-length encoding is to be able to do something useful with whole sequences of data that are repeated instead of single bytes.  Here, the algorithm keeps track of the data it&#8217;s already seen, and if some chunk is repeated, it just encodes a back-reference to that section of the file instead:</p>
<pre>
  I love compression.  This is compressed!
= I love compression.  This [is ][compress]ed!
= I love compression.  This [3,-3][8,-22]ed!
</pre>
<p>The bracketed sections indicate runs of characters that have been seen before, so you just give a length and a backwards offset for where to copy them from.  A lot of compression algorithms, zlib included, are based on this general principle, but one version that seems to crop up a lot is LZSS.</p>
<p>The special feature of this format is how it controls switching between raw bytes and back-references.  It uses one bit in a control byte to determine this, often a 1 for a raw byte and a 0 for a back-reference sequence.  So one control byte will determine the interpretation of the next 8 pieces:</p>
<pre>
  I love compression.  This [3,-3][8,-22]ed!
= FF "I love c" FF "ompressi" FF "on.  Thi" 73 "s " 03 03 08 16 "ed!"
</pre>
<p>The <strong>0xFF</strong> control bytes just say &#8220;8 raw bytes follow&#8221;, and the <strong>0&#215;73</strong> byte is binary <strong>01110011</strong>: reading from least-significant bit, that&#8217;s 2 raw bytes, 2 back-references, and then 3 raw bytes.</p>
<p>Recognizing this format in the wild rests on the control bytes, and you can spot it most easily in script files.  If you see text which looks li<strong>FF</strong>ke this,<strong>FF</strong> with re<strong>FF</strong>adable t<strong>FF</strong>ext plus some junk characters in every 9th byte, you&#8217;re dealing with LZSS.  You can also spot this in image formats, since the natural rhythm of RGB triplets will get interrupted by the control bytes.</p>
<p>Note that the farther in the file you go, the harder this gets to recognize, since the proportion of back-references tends to climb once the algorithm has a larger dictionary of previously-seen data to draw upon.</p>
<p>The major hassle with this format is the nature of the back-references.  There are a <em>lot</em> of subtle variants of this.  One of the most popular ones uses a 4096-byte sliding window, and encodes back-references as a 12-bit offset in the window and a 4-bit length.  However, is the length the real length or length-3?  Is the offset relative to the current position, or is it an array offset in a separate 4096-byte ring buffer?  Is the control byte read most- or least-significant bit first?  I&#8217;ve even run across an example where there were several different back-reference formats: a 1-byte one for short runs in a small window, a 2-byte one for medium-length runs in a decent window, and a 3-byte one for large runs over a huge window.  You will just need to experiment a little bit to see exactly what the particular game is doing, unfortunately.</p>
<p>One subtle point is that you may be allowed to specify a back-reference which overlaps with data you haven&#8217;t seen yet.  By that I mean a length larger than the negative offset involved:</p>
<pre>
  This is freeeeeeeaky!
= This [is ]fre[eeeeee]aky!
= This [3,-3]fre[6,-1]aky!
</pre>
<p>The [6,-1] back-reference works because you are copying the bytes one at a time: first you copy the second &#8216;e&#8217; from the first, and now you can copy the third &#8216;e&#8217; from the second, etc.  Be aware of this subtlety when you implement your own algorithms, since (a) this can preclude you from doing certain types of memory copying or string slicing, (b) not all games will be able to understand this type of reference, so don&#8217;t encode that way unless you know yours can.</p>
<h3>Huffman encoding</h3>
<p>From one point of view, this is easier than other algorithms since it only works on single bytes (or symbols, in general) at a time, but it&#8217;s also more tricky since the compressed data is a bitstream rather than being easy-to-digest bytes and control codes.</p>
<p>It works by figuring out the frequencies of all the bytes in a file, and encoding the more common ones with fewer than 8 bits, and the less common ones with more than 8, so you end up with a smaller file on average.  This is very closely related to concepts of entropy, since each symbol generally gets encoded with a number of bits equal to its own entropy (as determined by its frequency).</p>
<p>Let&#8217;s be specific.  Consider the string &#8220;abracadabra&#8221;.  The letter breakdown is:</p>
<pre>
a : 5/11  ~ 1.14 bits
b : 2/11  ~ 2.46 bits
c : 1/11  ~ 3.46 bits
d : 1/11  ~ 3.46 bits
r : 2/11  ~ 2.46 bits
</pre>
<p>Where I&#8217;ve given the number of bits of entropy each frequency corresponds to (i.e. if you have a 25% chance of having a certain letter, it has a 2-bit entropy since you need to give one of 4 values, say <strong>00</strong>, to specify it out of the other 75% of possibilities: <strong>01</strong>, <strong>10</strong>, <strong>11</strong>).  Unfortunately we can&#8217;t use fractional bits, so we may have to round up or down from these theoretical values.</p>
<p>How do we choose the right codes?  Well, the best way is to build up a tree, starting from the least-likely values.  That is, we treat, say, &#8220;c or d&#8221; as a single symbol with a frequency of 2/11, and say that if we get that far we know we can just spend one extra bit to figure out whether we mean c or d:</p>
<pre>
a : 5
0=c + 1=d : 2
b : 2
r : 2
</pre>
<p>Then we continue doing the same thing.  At each step we combine the two least-weight items together, adding one bit to the front of their codes as we go.  In the case of ties, we pick the ones with shorter already-assigned codes, or alphabetically first values:</p>
<pre>
a : 5
0=b + 1=r : 4
0=c + 1=d : 2

00=b + 01=r + 10=c + 11=d : 6
a : 5

000=b + 001=r + 010=c + 011=d + 1=a : 11
</pre>
<p>So the codes we end up with are:</p>
<pre>
a : 1
b : 000
c : 010
d : 011
r : 001
</pre>
<p>You will notice an excellent property of these codes: they are not ambiguous.  That is, you don&#8217;t have <strong>1</strong> for &#8216;a&#8217; and <strong>100</strong> for &#8216;b&#8217;&#8230; as soon as you hit that first <strong>1</strong>, you know you can stop and go on to the next symbol without needing to read any more.  Therefore, &#8220;abracadabra&#8221; just gets encoded as:</p>
<pre>
a  b   r  a  c  a  d  a  b   r  a
1 000 001 1 010 1 011 1 000 001 1
= 10000011 01010111 00000110
=    83       57       06
</pre>
<p>We&#8217;ve compressed 88 bits (11 bytes) down to 23 bits (just under 3 bytes).  Almost always the bits are packed most- to least-significant in a byte.</p>
<p>One subtlety is the exact method of tree creation, which assigns the codes.  The method described above is &#8220;canonical&#8221;, but sometimes games will use their own idiosynchratic methods which you will have to match exactly to avoid getting garbage.</p>
<p>How do you recognize this in a data file?  Well, the decompressor needs to know the codes, and the easiest way to specify this is to give it the frequencies (or more easily, the bit weights) of the values so it can construct its own tree.</p>
<p>Therefore, the compressed data will usually start with, say, a 256-element table of bit weights.  So if you see 256 bytes of <strong>05 06 08 07 0C 0B 06</strong> &mdash; values that are around 8 plus or minus a few &mdash; followed by horrendous random junk, you&#8217;re probably looking at Huffman encoding.</p>
<p>Sometimes instead of bit weights you&#8217;ll have the actual frequency counts instead, which might need to have a multi-byte encoding scheme if they&#8217;re above 256.  In that case, you&#8217;re mainly looking for a few hundred bytes of &#8220;stuff&#8221; followed by a sharp transition to much more random data.</p>
<h3>Other algorithms</h3>
<p>Needless to say, the algorithms covered here are not the full range of compression formats out there.  I&#8217;ll just briefly mention some others in case you run across them, though I haven&#8217;t really seen them in the wild.</p>
<p><strong>Arithmetic encoding.</strong>  This is vaguely related to Huffman encoding, in that you are working strictly with single bytes (or symbols) and trying to stuff the most frequent ones into fewer bits.  However, instead of being restricted to an integral number of bits for each one, here you are allowed to be fractional on average.</p>
<p>This works by breaking up the numerical interval [0,1) into subranges corresponding to each symbol: the more common symbols correspond to larger ranges, in proportion to their frequency.  You start with [0,1), and the first byte resticts you to the subrange for that symbol.  Then the second byte restricts you to a sub-subrange, the third byte a sub-sub-range, etc.  Your final encoded data is any single numerical value inside the tiny range you end up in: just pick the number in that range you can represent in the least number of bits as a binary fractional value.</p>
<p>Needless to say there are some good tricks for implementing this without using ludicrously-high-precision math, but I won&#8217;t go into that.</p>
<p><strong>LZ77 (Lempel-Ziv ’77)</strong></p>
<p>This is the core of the zlib deflate algorithm, but you&#8217;ll sometimes see variants outside of that standard, so it&#8217;s useful to know a little about.  It&#8217;s basically a combination of standard back-references as in LZSS, plus Huffman encoding.  You just treat the back-reference command &#8220;copy 8 bytes&#8221; as a special symbol, like a byte value of 256+8=264.</p>
<p>Then, with this mix of raw data bytes and back-reference symbols, you run it through a Huffman encoding to get the final compressed output.  Typically you will do something different with the back-reference offsets: either leave them as raw data, or encode them in their own separate Huffman table.</p>
<p><strong>LZW (Lempel-Ziv-Welch)</strong></p>
<p>When taught correctly, this is an algorithm with a mind-blowing twist at the end.  As it runs through the file, it builds up an incremental dictionary of previously-seen strings and outputs codes corresponding to the dictionary entries.  And then, at the end, when you start to wonder how to encode this big dictionary so the decompressor can use it to make sense of the codes, you just throw the dictionary away.  Cute.</p>
<p>Of course it turns out that things are cleverly designed so that the decompressor can build up an identical dictionary as it goes along, so there&#8217;s no problem.  This algorithm was patent-encumbered for a while, so it didn&#8217;t get as widely adopted as it might otherwise have been, but you might start seeing more of it these days.</p>
<h3>Conclusion</h3>
<p>I&#8217;ve focused here on lossless general-purpose compression: the sorts of things that are done to data at the archive level.  There is also a stage below this, where data can be compressed before even being put into the archive: making raw images into JPEGs, PNGs, or other compressed image formats, and converting sounds to MP3s, OGGs, and so forth.  In many cases those compression steps are just a lossy approximation to the original data, which is okay for graphics and sounds but bad for other files.</p>
<p>In a later installment, I&#8217;ll be tackling image formats in particular in more detail, since you will tend to run across custom ones a lot, some of which include image-specific processing steps (like, say, subtracting pixels from their neighbors) which wouldn&#8217;t make a lot of sense in a more general-purpose compression algorithm.  Encryption is another later topic, since sometimes that will keep you from being able to recognize compressed data for what it is.</p>
<p>And naturally, if you&#8217;ve run across other general compression algorithms used in games you&#8217;ve looked at, please mention them in the comments, since I don&#8217;t pretend to have investigated all the games out there&#8230; I&#8217;m still being surprised all the time.</p>
]]></content:encoded>
			<wfw:commentRSS>http://sekai.insani.org/archives/24/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>So You Want To Be a Hacker? Part III: Code Prototyping</title>
		<link>http://sekai.insani.org/archives/18</link>
		<comments>http://sekai.insani.org/archives/18#comments</comments>
		<pubDate>Tue, 13 Jun 2006 03:40:38 +0000</pubDate>
		<dc:creator>Edward Keyes</dc:creator>
		
	<category>Production Process</category>
	<category>So You Want To Be a Hacker?</category>
		<guid isPermaLink="false">http://sekai.insani.org/archives/18</guid>
		<description><![CDATA[In the last installment, we analyzed the Cross+Channel archive format with our trusty hex editor, and after a proof-of-concept manual image extraction, we believe we know what&#8217;s going on in that file.  But of course there&#8217;s only one way to be sure: build some tools, and try to modify the game!
So today we&#8217;re going [...]]]></description>
			<content:encoded><![CDATA[<p>In the last installment, we analyzed the Cross+Channel archive format with our trusty hex editor, and after a proof-of-concept manual image extraction, we believe we know what&#8217;s going on in that file.  But of course there&#8217;s only one way to be sure: build some tools, and try to modify the game!</p>
<p>So today we&#8217;re going to run through some quick code prototyping to create some suitable tools for dealing with the archives.  My intention is to make this as simple and straightforward as possible, so if you come out of this installment saying, &#8220;You mean <em>that&#8217;s</em> all I have to write to hack a game?!&#8221; then&#8230; mission accomplished.<a id="more-18"></a></p>
<p>What language should we use?  Ordinarily I work in C, but I want to get something out of this series too, so instead we&#8217;re going to use <a href="http://www.python.org">Python</a>, which is a bit of a learning experience for me as well.  The main advantages of this are:</p>
<ul>
<li>Cross-platform.  It&#8217;s available for Windows, Linux, and Mac OS, and it unifies some inherent differences like directory-path separators.</li>
<li>Good mix of levels.  There are flexible high-level data structures, like hash-table dictionaries and function continuations, as well as decent low-level bit manipulations.</li>
<li>Intuitive syntax.  Python is almost like executable pseudocode, so if you know virtually any other language, you should be able to read it without trouble.
</li>
<li>Interactive mode.  If you want to, you can just type in commands one by one and have them execute immediately.  This is great for avoiding a slow edit-recompile-test step during prototyping.
</li>
</ul>
<p>The main disadvantage, unfortunately, is speed.  Python just can&#8217;t compare to C or other to-the-metal compiled languages for serious bit-crunching.  For our purposes this isn&#8217;t very important yet, and when it becomes an issue there&#8217;s actually some pretty good Python/C interface features available for us to mix and match code when we need to.</p>
<p>So, if you&#8217;re on Mac OS X, you probably have Python already.  If you&#8217;re on Linux, you either have it or can grab a package for your distribution without much trouble.  If you&#8217;re on Windows, there&#8217;s an <a href="http://www.python.org/download/">installer</a> for you too.  Grab a copy and follow along!</p>
<p>What sorts of routines will we need to get started?  Well, let&#8217;s review the archive format we determined last time:</p>
<ol>
<li>Signature string <samp>PackOnly</samp></li>
<li>56 bytes of zeroes</li>
<li>8-byte little-endian file count</li>
<li>144-byte file entry records consisting of:
<ol>
<li>128-byte filename, zero-terminated</li>
<li>8-byte little-endian file offset (from beginning of archive)</li>
<li>8-byte little-endian file size</li>
</ol>
</li>
<li>The files, uncompressed and unencrypted, at their offsets.</li>
</ol>
<p>So it looks like we&#8217;ll need routines to:</p>
<ul>
<li>Read/write integers of specific lengths and endianness</li>
<li>Read/write zero-terminated strings</li>
<li>Check signatures and known runs of zeroes</li>
</ul>
<p>No sweat!  These sorts of utility routines will come in handy from here on out, so once we write them we can use them for subsequent games as well.  Let&#8217;s attack the integers for example:</p>
<pre>
def read_unsigned(infile, size = 4, endian = LITTLE_ENDIAN) :
   result = long(0)
   for i in xrange(size) :
      temp = long(ord(infile.read(1)))
      if endian == LITTLE_ENDIAN :
         result |= (temp &lt;&lt; (8*i))
      elif endian == BIG_ENDIAN :
         result = (result &lt;&lt; 8) | temp
   return result
</pre>
<p>Depending on your background, this code snippet is either completely trivial or completely confusing.  Basically, it&#8217;s just reading one byte at a time from a file, and shifting those bits to the proper numerical value to build up a multi-byte number, depending on whether the bytes are ordered least-significant-digit-first (little endian), or most-significant-digit-first (big endian).</p>
<p>The rest of the stuff we&#8217;ll need is similar, and honestly not really worth discussing in detail.  I&#8217;ve helpfully put together a quick package of utility routines which you can download as <a href="http://www.insani.org/tools/insani.py">insani.py</a> and use if you like.</p>
<p>Now we get on to the meat of the problem, reading and writing the archive!</p>
<p>We can basically just run through our archive specification above and turn it into code.  First the signature and header:</p>
<pre>
from insani import *
arcfile = open('cg.pd','rb')
assert_string(arcfile,'PackOnly',ERROR_ABORT)
assert_zeroes(arcfile,56,ERROR_WARNING)
numfiles = read_unsigned(arcfile,LONG_LENGTH)
print 'Extracting %d files...' % numfiles
</pre>
<p>Here I&#8217;m using the <samp>assert_string()</samp> and <samp>assert_zeroes()</samp> utility routines from <strong>insani.py</strong> to check for the file signature and the zeroes we expect.  The <samp>LONG_LENGTH</samp> constant is just 8, the length of our integer, and little-endianness is implied as the default value.</p>
<p>The major thing to make note of here is error-checking.  I don&#8217;t mean &#8220;normal&#8221; error-checking like making sure the file opened properly or that you have enough memory to read an 8-byte integer, etc.  That&#8217;s kind of silly for a prototype tool: we don&#8217;t care a whole lot if it crashes when the file can&#8217;t be read, as that&#8217;s sort of the behavior we want.</p>
<p>No, I mean, error-checking our assumptions about the archive.  You see, we <em>could</em> have just skipped the first 64 bytes of the file entirely and jumped right to that <samp>numfiles</samp> read statement.  That&#8217;s the only information we actually need, right?  Why are we bothering to check the signature, or check those zeroes?</p>
<p>We&#8217;re doing that because we&#8217;re still testing our understanding of the file&#8230; we&#8217;ve only really looked at a small percentage of one archive file from one game.  Are those 56 zeroes <em>really</em> useless?  <em>Always?</em>  We&#8217;re just not sure.  So if the tool runs across something that it doesn&#8217;t expect &mdash; i.e. that <em>we</em> don&#8217;t expect &mdash; then we want to know about it, and either abort for &#8220;now I&#8217;m totally confused&#8221; cases or at least print a warning for less critical discrepancies so we can inspect the situation more carefully and revise the tool.</p>
<p>Okay, enough about that.  Just trust me: build in the extra logic to check your assumptions rather than always jumping to the known-important info.  Now on to reading the index:</p>
<pre>
print 'Reading archive index...'
entries = []
for i in xrange(numfiles) :
   filename = read_string(arcfile)
   assert_zeroes(arcfile,128-len(filename)-1)
   position = read_unsigned(arcfile,LONG_LENGTH)
   size = read_unsigned(arcfile,LONG_LENGTH)
   entries.append( (filename, position, size) )
assert_zeroes(arcfile,144*(16384-numfiles),ERROR_WARNING)
</pre>
<p>Here we&#8217;re using some Python magic to make our lives easier.  After reading the filename, position, and size, we just collect the three variables together into a &#8220;tuple&#8221; denoted by the extra parentheses, and push that onto the end of our <samp>entries</samp> linked list.  Doing the same thing in C would be a bit more complicated, but here it&#8217;s almost pseudocode.  Again, notice the assertion statements: every single byte of this file is getting examined, and either its data is being used or its status as uninteresting is being checked.</p>
<p>Now, we complete the process, and actually write out the files, and do a little clean-up:</p>
<pre>
for (filename, position, size) in entries :
   print 'Extracting %s (%d bytes) from offset 0x%X' % \
    (filename, size, position)
   outfile=open(filename,'wb')
   assert (arcfile.tell() == position)
   outfile.write( arcfile.read(size) )
   outfile.close()
assert (arcfile.read(1) == '')
arcfile.close()
</pre>
<p>The loop structure is another nice bit of Python: we can just iterate through our <samp>entries</samp> list trivially, pulling off a whole tuple at a time and using those variables again.  Instead of the <samp>assert</samp> statement, we could have just done a <samp>arcfile.seek(position)</samp> command to jump to the offset we know we want, but here we&#8217;re still testing our knowledge of the archive format: are the files stored in order, with no gaps between them like we think?  And after all the files, are we really at the end of the archive, or is there more data we&#8217;ve neglected?</p>
<p>If we&#8217;ve done everything correctly, there shouldn&#8217;t be any surprises.  So let&#8217;s try it.  You can download <a href="http://www.insani.org/tools/crosschannel-extract1.py">crosschannel-extract1.py</a> if you like, but I&#8217;d recommend you implement your own, or at least type it in to get a feel for the language:</p>
<pre>
% python crosschannel-extract1.py
Extracting 545 files...
Reading archive index...
Extracting bgcc0000e.png (8370 bytes) from offset 0x240048
Extracting bgcc0023.png (538382 bytes) from offset 0x2420FA
...
Extracting TCYM0005c.png (156881 bytes) from offset 0x566E1B4
</pre>
<p>Seems to have worked, and all of the PNG files are viewable in your favorite image editor.  Ummm, although a few of them are NSFW, by the way.  ^^;</p>
<p>The proof-of-concept extraction works.  Now we can improve things just a little bit, since that hard-coded archive filename certainly sucks.  The revised version is <a href="http://www.insani.org/tools/crosschannel-extract2.py">crosschannel-extract2.py</a>, which adds some routines from the Python operating-system interface libraries to read parameters from the command line and allow us to extract files to a new subdirectory, etc.  I&#8217;ve also tweaked the error-checking a little bit, to allow for out-of-order files if we ever run across them, as well as aborting early if we find a position or file size that is &#8220;obviously&#8221; wrong.  Have a look if you like, though it&#8217;s not really vital to the thrust of this article.</p>
<p>What we really should be doing is rebuilding the archive now!  No sweat.  We can just take our code, and adapt it pretty easily to the opposite case.  First we need to collect info about the files we want to repack, from a subdirectory name passed on the command line:</p>
<pre>
import sys, os
from insani import *

dirname = sys.argv[1]
rawnames = os.listdir(dirname)

numfiles = 0
position = 144*16384+72
entries = []
for filename in rawnames :
   fullpath = os.path.join(dirname,filename)
   if os.path.isfile(fullpath) :  # Skip any subdirectories
      numfiles += 1
      size = os.stat(fullpath).st_size
      entries.append( (filename, fullpath, position, size) )
      position += size;
</pre>
<p>While we do this we can compute the ultimate position of each file based on the file sizes and the known sizes of the header and the index.  Next we can write those out:</p>
<pre>
print 'Packing %d files...' % numfiles
arcfile = open(sys.argv[2],'wb')
arcfile.write('PackOnly')
write_zeroes(arcfile,56)
write_unsigned(arcfile,numfiles,LONG_LENGTH)

print 'Writing archive index...'
for (filename, fullpath, position, size) in entries :
   write_string(arcfile,filename)
   write_zeroes(arcfile,128-len(filename)-1)
   write_unsigned(arcfile,position,LONG_LENGTH)
   write_unsigned(arcfile,size,LONG_LENGTH)
write_zeroes(arcfile,144*(16384-numfiles))
</pre>
<p>This is actually kind of easier, since we don&#8217;t need to check anything: we are just writing exactly what we know&#8230; no uncertainty.  You&#8217;ll also notice how closely the structure maps to our initial archive description: it&#8217;s good to have utility routines so that you can take care of each item in your spec with just a line or two of code.  And now we write the files themselves:</p>
<pre>
for (filename, fullpath, position, size) in entries :
   print 'Packing %s (%d bytes) at offset 0x%X' % \
    (filename, size, position)
   assert (arcfile.tell() == position)
   infile = open(fullpath,'rb')
   arcfile.write(infile.read(size))
   infile.close()
arcfile.close()
</pre>
<p>Here we&#8217;re doing a little bit of sanity-checking with the <samp>assert</samp> statement, but really that&#8217;s just a &#8220;stupid programmer&#8221; check rather than anything else: if we&#8217;ve written everything correctly, that assertion will always be true, regardless of the archive format details.  That&#8217;s one of the classic uses of an abort-if-false <samp>assert</samp> statement: to quickly check something which cannot possibly be wrong when the program is operating correctly.</p>
<p>You can grab <a href="http://www.insani.org/tools/crosschannel-repack1.py">crosschannel-repack1.py</a> if you like, but again I&#8217;d encourage you to write your own.  Let&#8217;s test:</p>
<pre>
% python crosschannel-repack1.py temp temp.pd
Packing 545 files...
Writing archive index...
Packing bgcc0000a.png (408458 bytes) at offset 0x240048
Packing bgcc0000b.png (436171 bytes) at offset 0x2A3BD2
...
Packing xiconp.png (2399 bytes) at offset 0x5693D26
</pre>
<p>The gold standard of a successful tool is to be able to extract and repack an archive to a bit-perfect replica of the original.  Have we succeeded?</p>
<pre>
% diff cg.pd temp.pd
Binary files cg.pd and temp.pd differ
</pre>
<p>Urgh, no.  Well, it&#8217;s kind of to be expected&#8230; the files aren&#8217;t getting packed in the same order, since our repackaged archive gets its directory list in alphabetical order, whereas the original archive is more random.  Does that matter?  We&#8217;re not sure.</p>
<p>The <em>silver</em> standard of a successful tool is to be able to extract its own archives successfully.  So we extract, repack, and then extract again and make sure the first extraction is identical to the second.</p>
<pre>
% python crosschannel-extract2.py temp.pd temp2
Extracting 545 files...
...
% diff -r temp temp2
</pre>
<p>And that works.  Okay, so our extraction and repacking tools are internally compatible.  Are they compatible with the <em>game</em>, though?</p>
<p>Here is one helpful trick of the trade.  The first time you test a rebuilt archive, <em>change nothing</em>.  Just extract the game&#8217;s own archive, repack it, and see if the game still runs.  This way you can see whether, for instance, the game has an MD5 checksum for the archive stored in the executable, or whether you&#8217;re missing something about the archive format.  Once you pass this hurdle, <em>then</em> you can start changing files and inserting English and so forth.</p>
<p>To make a long story short, that works.  There thankfully doesn&#8217;t seem to be any checksum weirdness going on, or features of the archive we haven&#8217;t fully reproduced (the file ordering <em>could</em> have mattered, after all).</p>
<p>The next step is to try altering something.  How about the main title screen graphic?  That happens to be <strong>x0000.png</strong>, so we can just drop in our own 640&#215;480 PNG file, rebuild the archive, and see what happens&#8230;</p>
<p><img id="image19" src="http://sekai.insani.org/wp-content/uploads/2006/06/crosschannel_nns.png" alt="Cross+Channel NNS screenshot" /></p>
<p>The extra colored rectangle is part of the main menu highlighting system.  Looks like we&#8217;re doing pretty well&#8230; most of the UI resources are just stored as PNGs, so our translator and graphic editor ought to be able to make over this game&#8217;s interface with these tools, no problem.</p>
<p>But wait&#8230; what about the game script!</p>
<pre>
% python crosschannel_extract2.py script.pd script
Expected "PackOnly" at position 0x0 but saw "PackPlus".
Aborting!
Traceback (most recent call last):
...
</pre>
<p>Pack<em>Plus</em>?!  Uh-oh.  But now the wisdom of our error-checking is somewhat revealed&#8230; we know immediately that something weird is going on in the script archive, rather than extracting garbage and trying to make sense of it at some later step.  Let&#8217;s fall back on our hex editor and take a look.</p>
<p><img id="image20" src="http://sekai.insani.org/wp-content/uploads/2006/06/crosschannel_hex_04.png" alt="Cross Channel hex 04" /></p>
<p>Well, it looks pretty normal, actually.  All the zeroes are still there; there&#8217;s what looks like a file-count, and filenames, positions, and sizes.  If you scroll down you&#8217;ll see nothing but zeroes out to offset 0&#215;240048, just like before.  So the entire header and index is the same, apart from the file signature itself.  Is this a complete no-op?</p>
<p>Ah, but look at the files themselves:</p>
<p><img id="image21" src="http://sekai.insani.org/wp-content/uploads/2006/06/crosschannel_hex_05.png" alt="Cross Channel hex 05" /></p>
<p>This is kind of weird.  The bytes aren&#8217;t random-looking &mdash; there are long strings of constant values &mdash; so it&#8217;s probably not really compressed or encrypted.  There&#8217;s also a high proportion of large values, above 0&#215;80, which is unusual.</p>
<p>So we&#8217;re probably looking at some sort of basic &#8220;encryption&#8221; here, the ever-popular XOR/add-with-a-constant-byte algorithm, suitable for protecting your files from your six-year-old sister&#8230; assuming she doesn&#8217;t code, anyway.</p>
<p>We could just guess the answer&#8230; and in fact if you guess you&#8217;ll get it right.  But you know what, I&#8217;m lazy, so I&#8217;m just going to brute-force this with some quick code.</p>
<pre>
arcfile=open('script.pd','rb')
arcfile.seek(0x240076)
data=arcfile.read(16)
outfile=open('bruteforce.dat','wb')
for i in xrange(256) :
   for temp in data :
      outfile.write(chr(ord(temp) ^ i))
   for temp in data :
      outfile.write(chr((ord(temp) + i) &#038; 0x00FF))
outfile.close()
arcfile.close()
</pre>
<p>I&#8217;m just reading in 16 bytes of data (chosen to match my hex-editor width) at an interesting-looking offset, XORing and adding all possible byte values to that string, and writing it out to a file to examine.  Scanning through this 8KB file by eye takes like 10 seconds, and we find:</p>
<p><img id="image22" src="http://sekai.insani.org/wp-content/uploads/2006/06/crosschannel_hex_06.png" alt="Cross Channel hex 06" /></p>
<p>Wow, recognizable text, at the very end of the file&#8230; always in the last place you look.  So this corresponds to an XOR by 0xFF, or just flipping all the bits in the file, which is precisely what you might have guessed anyway.  My point here is really that when you&#8217;re not sure, don&#8217;t be afraid to do a little experimentation&#8230; writing the above code snippet and scanning through some possibilities is the work of 5 minutes, tops, whereas you can easily bang your head against some unknown simple encryption for hours or days if you&#8217;re not feeling sufficiently clever sometimes.</p>
<p>Now we can update our extraction tool to account for this.  It&#8217;s a pretty easy modification to the header code:</p>
<pre>
signature = arcfile.read(8)
if signature == 'PackOnly' :
   xorbyte = 0
elif signature == 'PackPlus' :
   xorbyte = 0x00FF
else :
   print 'Unknown file signature %s, aborting.' % \
    escape_string(signature)
   sys.exit(0)
</pre>
<p>and to the file-reading code:</p>
<pre>
   data = array('B',arcfile.read(size))
   if xorbyte != 0 :
      for i in xrange(len(data)) :
         data[i] ^= xorbyte
   outfile.write(data.tostring())
</pre>
<p>This part is slightly confusing if you&#8217;re not familiar with Python.  The standard Python string is an immutable data type, so you can&#8217;t just XOR all the bytes without making a zillion new copies of the string.  Instead we read it into a mutable unsigned-byte array.  You&#8217;ll need to add a <samp>from array import array</samp> line at the top of your file to allow this too, since the array module isn&#8217;t part of the core language.  The new version is <a href="http://www.insani.org/tools/crosschannel-extract3.py">crosschannel-extract3.py</a>.</p>
<pre>
% python crosschannel-extract3.py script.pd script
Extracting 54 files...
Reading archive index...
Extracting adstart.dsf (236 bytes) from offset 0x240048
Extracting cca0001.dsf (934 bytes) from offset 0x240134
...
Extracting cca0011c.dsf (6674 bytes) from offset 0x297376
</pre>
<p>Looks like we&#8217;re in business.  The extracted scripts open normally in a text editor, using Shift-JIS character encoding.  With a little snooping around, we can see that the file <strong>cca0001.dsf</strong> is the start of the main game script.  A little editing, a quick repack (we don&#8217;t even need to bother with PackPlus when we make our own archive), and presto!</p>
<p><img id="image23" src="http://sekai.insani.org/wp-content/uploads/2006/06/crosschannel_script_01.png" alt="Cross Channel script screenshot 01" /></p>
<p>Note that I have skipped over some complexity in that last step, doing things like word-wrapping the line manually and making sure that the game engine gets CR-LF line breaks as opposed to just LF.  There&#8217;s more weirdness lurking there too&#8230; I don&#8217;t mean to imply that the script format is trivial, merely that it&#8217;s now open to further experimentation beyond the scope of this article.</p>
<p>Where to go from here?  As a homework assignment, you should try experimenting with this code, or even better writing your own in your language of choice.  And how about those 2.3MB of zeroes in the archive format&#8230; will the engine object if you take that out and start file storage right after the index to save space?  Can you write a routine which will word-wrap the script automatically when packing it into an archive?  How about the kanji in the window title bar?  What other problems will you run across in trying to do a full translation of this title?</p>
<p>But for now, this is all that I plan to use Cross+Channel for&#8230; we&#8217;ve cracked it wide open, and there&#8217;s not a huge amount more to learn here.  This is a legitimate accomplishment, because this is a real game that&#8217;s on the market and that people would like to translate.  However, it&#8217;s also a very simple example.  The archive had no compression and minimal encryption; the graphics files were a standard format; the script files are plaintext; and there was no integrity checking in the game or need to touch the executable at all.</p>
<p>Any or all of these characteristics could have meant a lot of work for us if they went the other way.  So, in the next few installments, I&#8217;ll be picking other games to give good examples of more complicated situations, focusing on one of these areas at a time.  Feel free to suggest games that you would like to see covered, though there&#8217;s no guarantee I&#8217;ll know anything about them, of course.  Heh.</p>
]]></content:encoded>
			<wfw:commentRSS>http://sekai.insani.org/archives/18/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>Letters to a Young Translator, Part III: 翻訳者に大切な事</title>
		<link>http://sekai.insani.org/archives/17</link>
		<comments>http://sekai.insani.org/archives/17#comments</comments>
		<pubDate>Sun, 04 Jun 2006 18:27:39 +0000</pubDate>
		<dc:creator>Seung Park</dc:creator>
		
	<category>Production Process</category>
	<category>Letters to a Young Translator</category>
		<guid isPermaLink="false">http://sekai.insani.org/archives/17</guid>
		<description><![CDATA[Dear X,
Greetings in haste.  I was surprised to see how quickly you responded to my last letter, and I was gratified to see that you were putting many, many thoughts on paper.  This is wonderful &#8212; you are beginning to develop, no doubt, a sense of your place as a translator, and by [...]]]></description>
			<content:encoded><![CDATA[<p>Dear X,</p>
<p>Greetings in haste.  I was surprised to see how quickly you responded to my last letter, and I was gratified to see that you were putting many, many thoughts on paper.  This is wonderful &#8212; you are beginning to develop, no doubt, a sense of your place as a translator, and by some of the often-pointed questions you ask I see that you are beginning to come to your own conclusions about the validity of what you are doing and saying &#8212; and also what I am doing and saying.   Since you have asked these questions of me, though, let us spend some time talking about the issues they raise.<a id="more-17"></a></p>
<p>You did not like the implication of my go analogy, did you?  I am not surprised.  Why shouldn&#8217;t, after all, a translation strive to be better than the piece it is translating?  Why should the translation team not strive to &#8220;win&#8221; every single time, with every single opportunity it gets?  These are worthy questions, and it is clear to me that your motivation in asking these questions is because you want your translations to be well-regarded by your audience.  That is by no means an ignoble goal &#8212; after all, as you yourself state many times over, it seems strange to create a translation that nobody else reads.</p>
<p>Perhaps, then, we should first talk about what &#8220;winning&#8221; and &#8220;losing&#8221; mean.  We both accept, I am hoping, that at some point there exists no concrete way to measure a translation against the original work.  Certainly, one could create some kind of weighting system based on, say, the number of typographical errors present in each work, or along similar lines.  But at the core, these systems &#8212; while they certainly help, often greatly, in your task of making sure that your translation has as few egregious errors as possible &#8212; they do not help us at all in our task of gauging whether a translation lives up to the standards &#8212; high or low as they might be &#8212; that the original work sets.  But we may as well start there, as the case of spelling and typographical errors is a simple one; it does not offer up the significantly thornier issues that we begin to encounter when we speak of &#8220;entirely rewriting&#8221; a translation, reordering segments and chapters (which some professional translators are known to do &#8212; Jay Rubin&#8217;s excellent translation of <em>The Wind-Up Bird Chronicle</em> by Haruki Murakami does just that, for instance), or even cutting out segments that existed in the original altogether.</p>
<p>So, is it necessary to try to duplicate misspellings and typographical errors?  Here, our duty is clear: if those misspellings were intentional, by all means yes.  But if not, then you should consider the following before proceeding:</p>
<ul>
<li><strong>Is the misspelling even a misspelling?</strong>  I have often seen translators who claim that words were misspelled, or kanji were mistyped, when the reality of the situation was quite different.  You must avoid this at all costs; therefore, if you find what seems to you to be a misspelling or a typographical error as you are translating, then unless you are 100% sure that it is a misspelling or typographical error that you have found, then it would behoove you to seek counsel from other, preferably more experienced, translators.</li>
<li><strong>If the word is misspelled, then why?</strong>  Again, ask yourself if there is any possible way this misspelling could have been intentional.  Was the author trying to make some kind of pun?  Was he attempting to emphasize a certain character&#8217;s level of learning (or lack thereof)?  Is there any dialect or regional aphorism that the author was utilizing here?  Finally, is your knowledge base sturdy enough that you can definitively answer all of these questions?</li>
<li><strong>Is this a known misspelling?</strong>  This question is probably unanswerable in most cases, unless the piece you are translating is sufficiently well-known (unlikely) or unless you have direct access to the original writers (even more unlikely).  If one of the above conditions is met, though, your job becomes much easier.  There is a line in the doujin visual novel <em>月姫</em> that has a very famous typographical error that turns a は into a を; thus rendering a line that should have gone something to the point of &#8220;you are the murderer&#8221; into something to the point of &#8220;you going the murderer&#8221; (omission of &#8216;to be&#8217; intentional) when translated literally.  This line, in fact, has even been parodied in an episode of the anime <em>ぱにぽにだっしゅ！</em> to, no-doubt, hilarious effect.  In any case, this would be a case in which our role is clear-cut: don&#8217;t try to model that misspelling in translation.  It would be fair, and even fun, to provide a translator&#8217;s note about that line, explaining that there was such a misspellling in the original.  On the other hand, even a casual player of <em>Final Fantasy IV</em> is probably quite aware that the line &#8220;you spoony bard&#8221; does not appear in any way, shape, or form in the original Japanese.  The phrase was, at the time, a product of Nintendo censorship and Ted Wollesley&#8217;s own quirks.  However, it has since then taken a life of its own, and has found its way into every authorized translation of the work into English since.  And can you blame it?</li>
<li><strong>What exactly is being translated, anyway?</strong>  As we both well know, most people will write IM&#8217;s differently than they would write formal letters.  It also goes without saying that a minor typographical error that would be acceptable in an introductory-level college composition course would be entirely unacceptable in a UN resolution or an opinion by the Supreme Court.  <em>In other words, there are some situations in which it is most honest to model the misspellings you find, and others in which it is entirely unacceptable</em>.  If you ever find yourself in the rather-unenviable position of having to translate a ream of internet forum posts, you may well decide to model every misspelling you find &#8212; and I would applaud you for it.  But clearly, in most formal or production writing &#8212; and visual novel scripts are certainly productions, if not necessarily formal &#8212; unintentional misspellings should not be modeled at all.</li>
</ul>
<p>Is it &#8220;winning&#8221; against the original to correct a misspelling, though?  I would argue that it is most definitely not.  It is most certainly a tangible improvement in production value when you correct an unintentional misspelling &#8212; but at the same time, you have made no significant change in the various meanings that the original piece conveys.  For that matter, should your correction of a misspelling cause a significant change as above, you should be on your guard, and be doubly careful that you did not miss something that the author did deliberately.  In all cases of formal writing, going from &#8220;teh&#8221; to &#8220;the&#8221; will not make any change in the original meaning of a sentence.  However, it is possible &#8212; if vanishingly &#8212; that going from &#8220;an&#8221; to &#8220;and&#8221; might cause some significant change in a sentence, depending on how said sentence is structured.  This is when you should be worried; this is when you should double- and triple-check your accuracy.</p>
<p>How about たん, ちゃん, さん, 様, 先生, and all those other honorifics that we have  come to know and love?  What do we do about those, and how &#8212; if at all &#8212; do we localize these?  This one is an ambiguous issue, as there are indeed official localizations of pieces that include every single honorific intact (many localized manga on the bookshelves of your local bookstore do this), and there are likewise official localizations of pieces that strip every single honorific out (all known localizations of Haruki Murakami&#8217;s work do this).  I have certainly done translations that fall on both ends of the spectrum &#8212; and below I present a rough algorithm (if it can even be called that) that I use when deciding what to do with these fascinating articles of Japanese grammar and culture:</p>
<ul>
<li><strong>Start out by assuming that you will strip all the honorifics out.</strong>  I am well aware that, in the end, you might go the opposite way &#8212; but by doing things this way, by assuming that you are going to be taking the harder of the two paths, you force yourself to think longer and harder about each decision you are making.  Additionally, it strikes me that it is impossible for a translator to see what a piece would have read like without honorifics if he has not actually attempted to translate the piece without them.  So try it!  Try your hardest to model the implicated relationships that the honorifics function to indicate.  And if you find yourself in an untenable situation, then you&#8217;ve just proven to yourself that either (a) you do not have the skill to translate the target piece properly without honorifics, or (b) the honorifics carry some meaning to them that cannot be modeled accurately, and absolutely cannot be done without.  You may at this point wish to seek consensus.</li>
<li><strong>For pieces that utilize high school as their primary setting, there is precedent.</strong>  Indeed, most pieces of this kind &#8212; from <em>To Heart</em> to <em>天使のいなに１２月</em> to <em>True Tears</em> to <em>Kanon</em> to &#8230; you get the point &#8212; heavily feature the use of honorifics to model changing relationships between individuals.  For instance, when a girl stops referring to the protagonist as くん and starts referring to him by さん or even without honorific at all, <em>that crystallizes the relationship between the two characters as that of lovers</em>.  It is relatively difficult to capture this transition in English, as in Western culture we all generally refer to each other by first name, even when we might not know each other that well.  Jay Rubin, in his translation of Haruki Murakami&#8217;s <em>Norwegian Wood</em>, makes a valiant attempt to model this without using honorifics by having Midori, a girl that the protagonist meets in college, refer to him by his last name alone at first (where the original had a くん at the end).  This does not strike me as the best choice in the world, as in Western culture we usually refer to people we dislike solely by last name.  Additionally, it seems even more distant for Midori to call the protagonist &#8220;Mr. Watanabe&#8221;, although the くん at the end can cary that meaning.  I honestly do not know what the best solution would have been in this case, as I have immense respect for Mr. Rubin&#8217;s work, and I do not think he would have made this decision without due reason.  But my gut tells me that I would probably have used honorifics throughout the piece if I were the one translating it.</li>
<li><strong>What is the focus of the piece?</strong>  There are many storylines in which the developing relationships between the characters may be secondary to the rest of the plot.  In the case of the doujin visual novels <em>Narcissu</em> and <em>常世の星空</em>, the characters are indeed strong and interesting, but the focuses are arguably elsewhere &#8212; in <em>Narcissu</em> there is the overhanging pall of terminal illness, and in <em>常世の星空</em> the relationship between Kouya and Mikoto &#8212; while very interesting &#8212; has less to do with the way the piece reads than the internal thought processes and ethical frameworks of Kouya himself.  This was why, for me, the decision to not use honorifics in these two pieces was an easy one.  On the other hand, in the case of the doujin visual novel <em>夏の日のレザナンス</em> or the commercial ADV <em>月は東に日は西に 〜Operation Sanctuary〜</em> the relationships between character <em>are</em> the main &#8212; and sole, as some people might put it &#8212; points of the pieces.  It also helps that both visual novels utilize school as their primary (in the case of <em>はにはに</em>, only) setting.  This is why it became relatively easy for me to decide to use honorifics when translating those two pieces.</li>
<li><strong>End by asking whether the audience will accept the use of honorifics.</strong>  In the  case of manga, where the target audience is very well-defined, the answer is more than likely yes.  In the case of more &#8220;serious&#8221; literature, as in the case of Kenzaburo Oe or Haruki Murakami, the answer will more than likely be no.  As a budding translator of visual novels, you are more than likely quite aware of the fact that our target audience &#8212; for better or for worse &#8212; seems to overlap more with the demographic that corresponds to manga readers than the demographic that corresponds to readers of &#8220;serious&#8221; literature.  However, you are not allowed to use this as a crutch!  The answer to the question I posed &#8212; will the target audience accept the use of honorifics &#8212; is only useful to you if the answer is &#8220;no&#8221;, in which case your decision and your conscience are both largely clear.  If the answer is &#8220;yes&#8221;, that does not give you a free hand to use all the honorifics you want, whenever you want.  On the contrary, I ask you to show all possible moderation in this case &#8212; to assume, as I indicated in the first bullet of my algorithm, that the answer is &#8220;no&#8221; to begin with and to work from there.  That way, if you decide at the end of the day that you <em>must</em> use honorifics &#8212; and there are so many valid reasons to do so! &#8212; then you have a very good reason that you can, if necessary, publicly disclaim.</li>
</ul>
<p>So are we &#8220;winning&#8221; or &#8220;losing&#8221; by choosing to keep or leave out honorifics?  While we are certainly on somewhat more dangerous grounds than we were with the case of misspellings, I still maintain that no, this is still more of a sideways move if a move at all.  To begin with, the English language has no honorific system in the sense that the Japanese language does, just as the Japanese language has none of the  complicated temporal relationship tenses that the English language has.  In a vacuum, it makes little sense to simply take cultural and grammatical constructs that do not apply across languages and stick them into one&#8217;s translation, hoping that the audience will &#8220;get it&#8221;.  However, I am well aware that we are not in a vacuum, and that sometimes it is inevitable that we will need to resort to the use of honorifics.  Just make sure that you have a <em>very</em> good reason &#8212; articulated and written out &#8212; if and when you make that decision.  <em>It strikes me that with honorifics, it is possible to &#8220;lose&#8221; if one is not careful, but not to &#8220;win&#8221;</em>.  The best you can possibly hope for is some kind of tie, and even that is not certain.  So tread carefully, and let us leave it at that.</p>
<p>Now let us turn our attention to aphorisms and set phrases.  We are beginning now to tread into the realm of alterations where the potential exists to significantly alter the intended meaning of sentences being translated if the translator is not careful, and where concrete rules become scarce as the daylight star on a heavily-overcast day.  Not to say that the sun does not exist on such days &#8212; certainly, it exists, and we do not freeze to death thanks to its warmth &#8212; but we cannot see it with our own two eyes.  Guiding principles at this level quickly become much like that &#8212; they must be felt rather than seen or strictly documented.  Therefore, let us go through a series of examples, and perhaps they will help you in coming to your own conclusions about what you should do.</p>
<ul>
<li><strong>一石二鳥</strong>: This is the simplest case, where the aphorism in question is directly translatable &#8212; this is, after all, &#8220;one stone two birds&#8221;, and in direct translation &#8220;to kill two birds with one stone&#8221;.  This is almost invariably the only correct translation for this phrase, as it not only depicts the &#8220;literal&#8221; truth of the words, it also translates the meaning behind the words quite well.  You would be blessed if all your translations went this way.  However, note also that there are aphorisms like 一挙両全 (&#8217;one means two ends&#8217;) and 一挙両得 (&#8217;one means two profits&#8217;) that essentially mean the same as &#8220;to kill two birds with one stone&#8221; &#8212; but depending on context, it may or may not be appropriate to translate these phrases as such.  We will get to some cases where it is not appropriate in a later bullet point.</li>
<li><strong>J&#8217;ai bien d&#8217;autres chats à fouetter</strong>: Here we have a French aphorism that, literally translated, means &#8220;I have so many other cats to whip&#8221;.  The first thing you might think is <em>wait, to <strong>whip</strong>?!</em> followed by <em>oh, this probably means something along the lines of &#8220;I&#8217;ve got other things to do&#8221;</em>.  And you&#8217;d be correct on both counts &#8212; this phrase indeed means &#8220;I&#8217;ve got other things to do&#8221; or &#8220;There are other things on my mind&#8221;, and I&#8217;m not quite sure why anyone would whip a poor cat to begin with.  We do have a set phrase in English that means something a lot like it: &#8220;I&#8217;ve got other fish to fry&#8221;.  But is it appropriate to use that phrase?  Yes, and no, and depending on the piece, mainly yes or mainly no.  When used in isolation by a character, without any other reference to cats or whips or the Marquis de Sade, then in all likelihood, yes, you could get away with using &#8220;I&#8217;ve got other fish to fry&#8221;.  But in the case of a piece like <em>L&#8217;Œuvre du Sixième Jour</em> by Marie Noël (which I have translated into English <a href="http://sekai.insani.org/archives/15">here</a>), the phrase pops up in the middle of a canine account of the Creation.  Suddenly, the reasoning behind the use of &#8220;cat&#8221; becomes obvious, and even laugh-out-loud funny, and just as suddenly you have become charged with finding some alternative phrasing that keeps the word &#8220;cat&#8221; in there somehow.  Your options here are (a) to translate the phrase &#8220;literally&#8221;, and include a long translator&#8217;s note about it, (b) to find or create some analogous phrase that uses cats, and leaves it at that, or (c) to find and create some analogous phrase that uses cats, and include a long translator&#8217;s note about it.  All three of the above are equally valid options, but I would encourage you to try (b) or (c) before having to resort to (a).  What should draw your attention is that there is no (d) simply use the phrase &#8220;I&#8217;ve got other fish to fry&#8221;.  That is because that option, in a sea of equally valid options, is probably the least  valid for the reasons outlined above.  I must hasten to admit that I originally ended up with the unwieldy &#8220;I have other cats to chase&#8221; &#8212; which I realize was not necessarily the best possible choice.  But it was a good choice, and I had (and still have!) a clear justification for it, even after I&#8217;d come up with a localization that I like a lot better.</li>
<li><strong>虫の息, 虫の声</strong>: In a certain visual novel, there comes a point where the protagonist asks his childhood friend how she made out on the national board exams &#8212; and she replies that her national rank was the year in which the 大化の改新 (the Taika Reformation) occurred, multiplied by 10.  Our intrepid hero immediately recites the mnemonic 虫の息 (<strong>む</strong><strong>し</strong>の<strong>い</strong>き, or 641), which happens to be completely wrong; the correct schoolyard mnemonic for the Taika Reformation is 虫の声 (<strong>む</strong><strong>し</strong>の<strong>こ</strong>え, or 645).  In other words, she wasn&#8217;t 6410th place, but 6450th.  Ba-dum-bum, thank you, thank you, I&#8217;ll be here all night.  Laughing (or wincing) aside, this provides an interesting challenge for the translator &#8212; how best to localize this?  Obviously, one cannot just leave these mnemonics as-is &#8212; for the audience, they have no context at all, and one can hardly expect that most of your readers will be so well-versed in Japanese history.  It is equally dissatisfying to simply leave a long translator&#8217;s note and walk away &#8212; for then we have destroyed the (bad) humor that is integral to the scene.  So, then, what to do?  The way I originally translated this was (brace yourself) by using l33tspeak.  Yes, you heard me right.  6rass 4nt 1nhales and 6rass 4nt 5peaks, to be exact.  Along with, of course, a translator&#8217;s note explaining what this nonsense was all about.  If I had to do it again, though, I am not sure that I would have gone with that route; instead, I think I might have found a mnemonic that resonates more with the target audience, and done number manipulations to match.  One might, for instance, take the rhyme &#8220;In 1492, Columbus sailed the ocean blue&#8221;, having the protagonist misquote it as &#8220;In 1419, Columbus sailed the ocean green&#8221;.  Then, by having the girl say that it was the year that Columbus went on his voyage, plus 5000, we have essentially duplicated the bad joke for anyone who was educated in the public school system of the United States of America.  It is not an exact duplication by any means, and there are some senses in which our original translation is &#8220;better&#8221; &#8212; after all, it does match up more closely to the original Japanese, and it doesn&#8217;t make all the sense in the world that Japanese schoolchildren would learn about dates important to the history of the United States of America.  But the original translation is already &#8220;losing&#8221;, so to speak, and my feeling is that this kind of localization would improve its position somewhat.  And of course, the addition of a translator&#8217;s note remains a fine idea.</li>
<li><strong>直死の魔眼</strong>: This is a term made famous by TYPE-MOON&#8217;s seminal visual novel, <em>月姫</em>.  It is also one of many neologisms that Nasu Kinoko employs in his writing, for the supposed purpose of extensive immersion in the world inside Nasu Kinoko&#8217;s head.  It is not up to me to say whether or not he succeeds &#8212; obviously, to many people, he does &#8212; but I will point this term out because it is typical of the kind of writing that this writer employs.  Literally, this is something like &#8220;direct death magical eyeball&#8221; &#8212; and this is why there are some who translate it as &#8220;Mystic Eyes of Death Perception&#8221;.  However, there also exists a pun in that first compound &#8212; 直死 is read as ちょくし, which also happens to be the reading for the words 勅使, 勅旨, and 直視.  The first two both mean something along the lines of &#8220;imperial messenger, imperial order, imperial will&#8221;.  It is possible that there is something of that meaning in the phrase, as the power of 直死の魔眼 is indeed incredibly commanding.  But on a more basic level, the pun with 直視 &#8212; which means &#8220;to look at something directly, to look something straight in the eye&#8221; &#8212; is obvious, and that should definitely be modeled.  To be fair, a phrase like &#8220;Mystic Eyes of Death Perception&#8221; does that, in a way &#8212; there is a pun with &#8220;Depth Perception&#8221; there.  But this is tenuous, and we have taken a short, 5-character phrase and turned it into a 22-character one.  While the number of syllables in each &#8212; 6 as opposed to 8 &#8212; does not differ much, in written and spoken terms &#8220;Mystic Eyes of Death Perception&#8221; seems to me to be somewhat unwieldy.  I must stress that I still find this a good, serviceable translation &#8212; it is just not the one that I would choose.  Rather, taking all of the above into account, I would go with a phrase like, perhaps, &#8220;Dead Center Sight&#8221; &#8212; which certainly models the 直死/直視 pun better than &#8220;death perception/depth perception&#8221; does.  I freely admit that this translation has problems of its own, but my conscience is also clear when I say that I find this to ring more true to me than any other translation of this phrase that I&#8217;ve seen.</li>
</ul>
<p>Do we even have to ask the &#8220;are we winning or losing&#8221; question anymore?  I should hope not.  I hope that it is becoming apparent to you that there is no way that a translator &#8212; no matter how gifted &#8212; can &#8220;win&#8221; against the original meanings and subtleties of any piece in its original language.  We can most certainly &#8220;lose&#8221; &#8212; the cases and examples I have presented to you thus far are only the tip of the iceberg of dangers, and for that matter all it takes is a strictly &#8220;literal&#8221; translation to ensure that you have lost before you have even begun.  And I promise that we will continue to talk about some of the more (and less) common pitfalls on other days.  But for now, I can stand by this: that I struggle with the realization that there is no such thing as a perfect translation every day &#8212; and that I find a certain kind of joy in the knowledge that what I seek is so far beyond my grasp.  This discipline is only worth it for the journey, for the things that you learn about the spaces between words and the spaces within your own heart as you travel along.  While for each production process there will be a definite beginning and a definite end, for you the path flows on forever, and it should have no ending.  Not while there is still the will to translate within you.</p>
<p>We should at this point make one thing clear &#8212; when I speak of &#8220;winning&#8221; and &#8220;losing&#8221;, I am not speaking of production value at all.  While it is unlikely that a translation that has low production value will strive to be true to the original at all times, it is indeed possible.  While it is unlikely that a translation that has high production value will deviate from the original in significant ways, it is indeed possible (see Working Designs).  No, what I am concerned about is the <em>integrity</em> of the translation, and through it the integrity of the translator &#8212; not the coordinator, not the editors, not the QC staff, not the release engineers &#8212; the translator.  I am interested in you and you alone, as you struggle with the bridge between two languages, and not in anyone else on your team.  They are your concern, and they are not mine.</p>
<p>What do I mean by this?  Simply that it takes a certain kind of hubris to state that you can make the original piece better, that you can &#8220;win&#8221; against it.  I do not doubt that there are bad writers in Japanese &#8212; indeed, there will be unaccomplished writers no matter what language it is that you choose to translate.  If you were the assigned editor for one of these writers, if you had full sanction to correct their errors, if it was your job to suggest improvements that the writers could follow up on, then by all means it would be your place to try to better the writers&#8217; pieces &#8212; in close cooperation with the writers themselves, of course.  <em>But we occupy a different place</em>.  Like it or not, a single cease-and-desist letter can take away all the fruits of our labors on a project.  We occupy a gray zone of both legality and ethical authority, in this respect; while we can debate on the ethical validity of international copyright law as it stands, there exists no doubt that currently, according to international copyright law, what we do is illegal.  Likewise, while it is entirely possible that the translator who is working on a piece might be a much better writer than the original author, there is little to no ethical justification to give the translator a free hand in reshaping the piece as he wishes &#8212; unless the original author agrees.  This is why I maintain that there is no &#8220;winning&#8221; to talk about here; for most part, we will not have such significant contact with the original creators such that they can know of and approve of (or shoot down) our changes.</p>
<p>This, of course, raises another argument: if what we are doing is illegal anyway, then why not go all out?  Why not adapt things as we see fit, the (admittedly-unknown) wishes of the original creators be damned?  My response to this is that it seems to me that this attitude is one that has lost a great deal of <em>integrity</em>, legal status aside.  It is entirely possible to have a translation that has a great deal of integrity that is also completely illegal; William Tyndale&#8217;s unsanctioned English translation of the Holy Bible is thought to be one such case.  True, he burned at the stake for it in 1535.  But it does not change the fact that the Tyndale Bible is to this day thought to be a very solid translation of those scriptures.  And it does not change the fact that in 1539, there arose an authorized English translation of the Bible that was largely based on Tyndale&#8217;s work and that was distributed to every parish in the land.  Indeed, that version of the bible we call the <em>King James Version</em> is largely based off Tyndale&#8217;s work.</p>
<p>But William Tyndale never tried to &#8220;improve&#8221; the Bible.  He knew that it was not his place.  He had integrity on his side, even though all the forces of legality were arrayed against him.</p>
<p>While the things we translate do not claim to be &#8220;true&#8221; or &#8220;holy&#8221;, I implore you to take heed of this warning: it is not our place to make &#8220;improvements&#8221; based on our understanding of the original language (or lack thereof) and to declare that we&#8217;ve &#8220;won&#8221;.  When we do that, or when we complain that the original author obviously did not care about his work, or when we point at misspellings that are not misspellings as evidence that the piece we are translating was an unloved stepchild of a distracted mind, then we have lost all integrity as translators.</p>
<p>And when we have lost that, we have lost everything.  What discerning mind, then, could read our works and not doubt the sincerity of our efforts?  How could we defend the changes we have made in our translations if we are simultaneously denigrating the original work?  How are we any better than the much-reviled Carl Macek, who once took three different anime series, amalgamated them into one, and called the badly-dubbed result <em>Robotech</em>?</p>
<p>And this is what I mean when I say we have no right to &#8220;win&#8221; or &#8220;lose&#8221;.  We tread a dangerous path, and tipping too much in any one direction &#8212; be it toward attempting to duplicate every single Japanese grammatical structure there is in English and filling your resultant translation with translator&#8217;s notes for every single word on the page, or be it toward writing your own script based loosely on the concepts found in the original and calling it a faithful translation of the original &#8212; has all the potential of leading us into disaster.  This is not to say that we are not allowed to radically alter a piece &#8212; just that grounds for doing so are much rarer than you might think, and that you should have a very exact justification for why you are doing what you are doing when you do it.  Let the original writing be your guide.  Most of all, listen &#8212; listen closely, more closely than anyone before has listened &#8212; to the voices of the piece.  Spend time with the piece, nurture it, take it with you to work or play, keep it in your head, let it sing, and listen, and listen, and listen.  This again leads me to point out how intimately you must know the original language for such a condition to be true &#8212; for even the best translators will be forced to leave something inimitable to the piece out as they translate.  For the time that you have it, the piece your translating is your charge; it deserves your love and your advocacy.  If you do not speak up for the piece, <em>then no one can</em>.  And if you cannot find it in you to defend the piece with all your heart, even given its flaws, then I implore you to find that love <em>within you</em>, to nurture it, and to give it voice.</p>
<p>That&#8217;s right.  When you translate, you should translate for <em>yourself</em>, for the <em>sake of the piece</em>, and for no other person.  The more internal your reasons are, the better; ignore the target audience, ignore the naysayers, ignore those who would &#8220;support&#8221; you, and most of all ignore the little voice in the  back of your head that whispers &#8220;I can do better&#8221; to you.  You do not know that.  None of us do.  Only translate, for your own reasons, and when those reasons are no longer valid, then declare your work done and walk away &#8212; release or no release.  Did I not say it before?  No one can help you.  Unless you can ask yourself, in the still of night, when all seems lost, whether you <em>must</em> translate and reply with a clear &#8220;I must&#8221; that finds its source in no other place than your own heart, then it is much better that you do other things that interest you more.  This hobby will only drain you of all the energy you have otherwise.  And I have no problem conceding the fact that there are far more interesting hobbies out there, should one be inclined to do them.</p>
<p>With that, I must leave you for now.  I have a large project that will come due in the following two weeks, and I must dedicate my energies to that.  But know that I have all the love and respect in the world for you as you labor in the darkness, alongside me, toward a prize that cannot ever be attained by any mortal mind, and that I look forward to conversing with you in the future.  Until then, I remain</p>
<p>Faithfully yours,</p>
<p>Seung Park<br />
Lead Translator<br />
insani.org
</p>
]]></content:encoded>
			<wfw:commentRSS>http://sekai.insani.org/archives/17/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>Letters to a Young Translator, Part II: Tacticians and Strategists</title>
		<link>http://sekai.insani.org/archives/16</link>
		<comments>http://sekai.insani.org/archives/16#comments</comments>
		<pubDate>Tue, 30 May 2006 05:19:04 +0000</pubDate>
		<dc:creator>Seung Park</dc:creator>
		
	<category>Production Process</category>
	<category>Letters to a Young Translator</category>
		<guid isPermaLink="false">http://sekai.insani.org/archives/16</guid>
		<description><![CDATA[Dear X,
It has been some time since our last correspondence, and I hope this letter finds you well.  You say that you have spent a good deal of time reading through the piece that you hope to translate, and for this I applaud you.  All the time you spend in this lonely task, [...]]]></description>
			<content:encoded><![CDATA[<p>Dear X,</p>
<p>It has been some time since our last correspondence, and I hope this letter finds you well.  You say that you have spent a good deal of time reading through the piece that you hope to translate, and for this I applaud you.  All the time you spend in this lonely task, straining to see and hear all that which is most unseeable and unhearable about a piece, will prove its own reward.  For there is no art save that which is found in solitude, no goodness in translation save that which you find in yourself.  I know you will smile at this, and say to yourself, knowingly, condescendingly, that there is a target audience, and that translations are made for the purpose of being read.</p>
<p>In a sense, you are right.<a id="more-16"></a></p>
<p>I trust that it is in this sense that you have sent me some of your preliminary translations.  I thank you for this faith &#8212; I enjoyed reading them over, and indeed the words of explanation you sent highlight very well for me some of the inadequacies in your current translation style.  I cannot give you specific criticism, not at this time, but if you want my opinion, if you were not speaking in jest when you asked me to be as harsh as I could, I can tell you this: at the moment, you have no style and no form.  You argue stubbornly, to the death, that &#8220;this is what the author wrote&#8221; without knowing, <em>really knowing</em>, whether that is a true statement or not.  You speak to others about being &#8220;literal&#8221; as opposed to being &#8220;loose&#8221;, when you have not the wisdom or the right to offer up such criticisms.  And I beg of you, for your own good and for the good of everyone else, to stop.  You cannot help anyone.  And likewise, no one can help you.  No one.  For in this art, we are all equally wrong &#8212; and we are <em>none of us</em> right.  Not the bountiful polyglot, not the astute English major, not the silver-tongued native speaker of Japanese, not the illustrious professor of linguistics, not me, and certainly not you.  All we have are our words, and when we use those words to vivisect the works of other people instead of to strengthen them, we do them &#8212; and more importantly, ourselves &#8212; a grave disservice.</p>
<p>Then why should you listen to me?  Why, indeed, do you write me letters, and why do you say you await a reply?  At the simplest level, you come to me seeking my advice &#8212; and that is something I am willing to give you, in abundance.  Am I right?  Am I wrong?  I do not know.  All I know is that these are the lessons I have learned, and this is the way my translation circle works.  Perhaps, when you have successfully released as many translations as we have, you might have a significantly different opinion of what it is to be a translator.  I do not doubt that.  And I do not seek to question the validity of the conclusions that your future self will no doubt come to about the nature of these production processes, about the nature of translation, and even about what happens to both you and the piece you are translating as you translate.  All of us change; all of us have footfalls that whisper on the concrete bones of the cities to which we are given only to forget that we might ever have existed at all.  But here and now, I am me and you are you &#8212; and so I beseech you to listen.</p>
<p>So you have completed your initial read, and you are getting down to the often-unpleasant business of assigning your team members their tasks.  This, then, is as good a time as any to talk about the makeup of your team.  As I wrote before, insani is in essence a two-man team: one translator and one hacker.  Edward is, in fact, writing an excellent series of articles about the mechanics of eroge hacking that your programming staff may wish to read at some point.  However, the roles we play are diverse, and I will list them here (other than the programming role &#8212; I shall leave Edward to cover that) in somewhat greater detail than I did the last time around:</p>
<ul>
<li><strong>The Coordinator</strong>: On many translation teams I have seen, this person is not a translator at all; in fact, in the romhacking circles, this person is almost invariably a hacker.  In the anime fansub circles, this person might not actually do anything at all.  Regardless, there is one property &#8212; and only one property &#8212; that a good coordinator must have.  That is: he must understand the role of every single person on the team, including himself.  And in order to be truly respected, he must be willing to lead from the front, charging into the fray before everyone else, blazing a path for others to follow.  That is why, in the amateur visual novel localization community, the coordinator should usually be the lead translator.  The coordinator has the final say on all team decisions, makes the timetables for milestones and releases, works intensively with all members of the team in order to ensure that they are making their deadlines.  Furthermore, it falls to him to arbitrate and resolve team disputes, and to make sure that troublesome members of the team are either dealt with or shown the door if necessary.  Should anything in the production process or the final release go wrong, it ultimately falls on him to shoulder the blame.  Should anything in the production process or the final release go <em>right</em>, he cannot take any of the praise at all.  This is a serious job, it may not be taken lightly, and the ideal coordinator must out of all members of the team know the most about the nature of both translation and the production process.  Which means that: if you have no knowledge of Japanese other than what you &#8220;learned&#8221; from anime, if you have no knowledge of translation other than your derision at the much-maligned introduction to <em>Zero Wing</em>, if you have no ability other than that of an &#8220;editor&#8221; (read: a glorified cheerleader), then you have no business in this position.</li>
<li><strong>The Translator(s)</strong>: It goes without saying that any translation project that exists should have at least one translator.  However, if there is more than one, then there are additional issues of differing skill levels and translation consistency to deal with.  Fortunately or unfortunately, just as in any other field, it is very difficult to put a number or a logical measure to the &#8220;skill&#8221; of any given translator.  I have worked with translators, for instance, who might be brilliant when they are made to translate legal contracts from one language to another, but fail miserably when asked to translate literature.  I know of others who can translate medical documents well enough even given the fact that they have no M.D. at the end of their names, and I know of M.D.&#8217;s who might know more than one language, and yet who make miserable translators altogether.  But ideally, in your team your translators will be of fairly clear-cut skill levels.  In this case, the translator of the greatest skill and experience should become the lead, and on his shoulders should rest the final creative control over the resultant translation.  Practice the art and craft of pair translation &#8212; when there is one proficient translator and one who is still in the stages of learning, every single line translated should become a teaching point.  And practice the art and craft of working under strict deadlines as set by the coordinator &#8212; for this, too, is an integral part of any production process.</li>
<li><strong>The Graphics Staff</strong>: These people are recruited to do what is essentially grunt work, and they most likely know this.  If they do not, your coordinator needs to disabuse these people of their illusions.  Graphics editing is hard, monotonous work, and it is most often a thankless job.  The volume and difficulty of graphics to edit will vary per project, but in some projects we&#8217;ve tackled (see <em>Majipuri</em>) the configuration menus alone were enough to give our graphics editor (see Edward Keyes) grand mal tonic-clonic seizures.  People who make good web graphics, by the way, do not always make good graphics editors for our purposes; ideally, you want someone who can make every single deadline you throw at him, someone who can faithfully duplicate sometimes-garish visual effects that appear in the original Japanese game &#8212; not someone who can build a pretty webpage.</li>
<li><strong>The Editors</strong>: These people are among the most unimportant components of a translation team. If they are among the most important, or if they play a major role in how your final translation reads, then your translators are at best clueless, and at worst dangerously flawed.  The problem I have seen is this: most &#8220;editors&#8221; are drawn from English majors, self-described masters of English, creative writers who have only ever &#8220;published&#8221; in obscure blogs, and the list just goes on.  Their one defining characteristic is that they do not understand Japanese very well (if you are lucky, not at all &#8212; then they cannot argue with you) and they understand English only slightly better.  If that is the case, it becomes very difficult for an editor to truly &#8220;edit&#8221; a translation without introducing at best blatant &#8212; for in that case it can be easily fixed &#8212; or at worst insidious &#8212; for in that case it may hide undetected even by the time of release &#8212; amounts of meaning skew.  No, a truly good editor must be <em>at least as</em> or even <em>more skilled</em> at Japanese than the original translators in order to be any good &#8212; and if that is the case, then that editor should probably have been translating the piece from the very beginning.  I am aware that there are some people who advocate the practice of a translator and an editor working in close cooperation with each other &#8212; while this is well and good in theory, in practice I have not seen it working so well.  If the translator has a hard time expressing the concepts and the wordings of the original work into English, then adding an editor into the mix &#8212; even one who goes over <em>every single line</em> with this translator &#8212; will not help you one bit.  I only list this category of team members because most translation teams seem to have editors; insani does not work with any.</li>
<li><strong>The Quality Control Team</strong>: These hardy souls are as important as editors are unimportant.  Prospective Quality Control staff should have the willingness to play a piece over and over and over, and should have an obsession over documentation, a keen eye for grammar and for that mysterious quality that we call &#8220;rightness&#8221;, and a willingness to write up their findings early and often.  They will no doubt dislike the piece by the time release time comes around &#8212; if they do not, they are probably not doing their jobs, or they are far more tolerant of tedium than I am.  Something perhaps unique to our circle is the fact that most of our quality control staff are well-qualified translators themselves &#8212; and so we sometimes term our QC period a &#8220;peer review&#8221; period as well.  Truly, we seek the judgment of those we consider our peers &#8212; and there are not many of those we are willing to accord this title in this community.  The reason is simple: your Quality Control staff are the last people to lay eyes on your translation before it hits the general public.  Make sure that they are people you respect.  Make them count.</li>
<li><strong>The Release Engineers</strong>: These people are responsible for packaging the finalized translations into installer builds for each of the operating systems you are planning on supporting, and have final say over the final deadline for release.  The release engineer may call a complete halt to the release process if he believes that there are sufficient flaws in the process, or he may choose to delay release for a set period of time.  For this reason, your release engineers above all must have a high degree of professionalism and integrity, and must be willing to face down the rest of the team if that is what is required for a good release.  This is why, most often, the coordinator has a high amount of contact with &#8212; or even <em>is</em> &#8212; the release engineering team.</li>
<li><strong>The Fans</strong>: Do not forget these people.  They constitute the silent member of your team, whether you like it or not.</li>
</ul>
<p>In any team, you will find &#8220;tacticians&#8221;, and you will find &#8220;strategists&#8221;.  While this is a gross overgeneralization, in brief, &#8220;tacticians&#8221; are adept in the achievement of self-contained, goal-driven objectives, and &#8220;strategists&#8221; are those who see the big picture, and assign these objectives to the tacticians under their command.  Having one without the other is potentially fatal &#8212; a pure tactician is akin to a one-centimeter-squared 1200dpi display, and a pure strategist is akin to a 30-inch LCD that has a display resolution of 320&#215;240.  You must have both &#8212; and as the leader of your translation group, you must <em>be</em> both.</p>
<p>I leave you with this: in the game of go, it is generally not possible for there to be a tie game.  However, in some cases &#8212; usually, ones where black is given a handicap to start &#8212; there is no komi that makes a tie game impossible.  This has to do with the fact that usually, black (which is the first to move) is given a 4.5 stone penalty in order to theoretically make up for the advantage it has by going first; if black is weaker, and has to be given a handicap, then it makes no sense then to have a komi against it.  In any case, let us imagine the case where players of equivalent skill are playing, have agreed to no handicap, and have also agreed to no komi (that is to say, black is at an effective 4.5 stone advantage).  Certainly, in this case, if white should win, then white is probably the better player.  If white should win all the time, then white is more than likely the better player.</p>
<p>But if white should force a tie all the time, then white is beyond the shadow of a doubt the better player.</p>
<p>The original author is playing black.</p>
<p>You are playing white.</p>
<p>You have no right to win or lose.</p>
<p>That leaves you with one choice.</p>
<p>Until next time, I remain</p>
<p>Yours,</p>
<p>Seung Park<br />
Lead Translator<br />
insani.org
</p>
]]></content:encoded>
			<wfw:commentRSS>http://sekai.insani.org/archives/16/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>The Work of the Sixth Day</title>
		<link>http://sekai.insani.org/archives/15</link>
		<comments>http://sekai.insani.org/archives/15#comments</comments>
		<pubDate>Tue, 30 May 2006 02:33:30 +0000</pubDate>
		<dc:creator>Seung Park</dc:creator>
		
	<category>Translation</category>
	<category>French</category>
		<guid isPermaLink="false">http://sekai.insani.org/archives/15</guid>
		<description><![CDATA[A short parable (?) by Marie Noël
Translated from the French by Seung Park


[ As told by Stop-Dog to his little brothers ]
As soon as the Dog was created, he licked the hand of God and God patted him on the head.
&#8220;What do you desire, Dog?&#8221;
&#8220;Oh, Good Lord, I want to live with You, in Heaven, [...]]]></description>
			<content:encoded><![CDATA[<p align="center">A short parable (?) by Marie Noël<br />
Translated from the French by Seung Park<br />
<a id="more-15"></a>
</p>
<p align="center"><em>[ As told by Stop-Dog to his little brothers ]</em></p>
<p>As soon as the Dog was created, he licked the hand of God and God patted him on the head.</p>
<p>&#8220;What do you desire, Dog?&#8221;</p>
<p>&#8220;Oh, Good Lord, I want to live with You, in Heaven, on the doormat maybe.&#8221;</p>
<p>&#8220;Oh, heavens, no!&#8221; God exclaimed. &#8220;I have no need of a dog, as I have not yet created thieves.&#8221;</p>
<p>&#8220;When will You create them, Lord?&#8221;</p>
<p>&#8220;Never.  I am tired.  It has been five days that I have worked, and it is time for me to rest.  You are done, Dog, you, my best creation, my masterpiece.  I had better stop now.  It is not good when an artist presumes to try to go beyond his inspiration.  If I continue to create, I am very capable of failing in my efforts.  Go, Dog!  Go quickly and find your place on the Earth.  Go and be happy.&#8221;</p>
<p>The Dog let out a profound sigh.</p>
<p>&#8220;What should I do on the Earth, Lord?&#8221;</p>
<p>&#8220;Eat, drink, increase and multiply.&#8221;</p>
<p>The Dog sighed again, in utter desolation.</p>
<p>&#8220;What more do you need?&#8221;</p>
<p>&#8220;You, Lord, my Master!  Will You not come to live on the Earth as well?&#8221;</p>
<p>&#8220;No!&#8221; said God, &#8220;No, Dog!  I assure you.  I cannot at all come to live on Earth just to keep you company.  I have too many other cats that need skinning.  The heavens, the angels, the stars &#8230; I assure you, they&#8217;re quite the bother.&#8221;</p>
<p>Then the Dog lowered his head and began to leave.</p>
<p>But he came back:</p>
<p>&#8220;Oh!  Perhaps, Good Lord, just perhaps, there might be a kind of master of your type?&#8221;</p>
<p>&#8220;No,&#8221; replied the Good Lord, &#8220;there is none.&#8221;</p>
<p>The Dog made himself very small, very low, and then begged with all his heart:</p>
<p>&#8220;If you wished to, Good Lord God &#8230; you could make it possible &#8230;&#8221;</p>
<p>&#8220;No, it is impossible,&#8221; the Good Lord answered, &#8220;I have done what I have done.  My work is complete.  I will never create a being better than you.  If I try to create another one today, I swear on my mighty right hand that it will end up a failure.&#8221;</p>
<p>&#8220;O Good Lord God,&#8221; the Dog cried out, &#8220;it does not matter how much a failure he is if I can follow him wherever he goes and lie next to him when he goes to sleep.&#8221;</p>
<p>Then the Good Lord was astonished at having created a creature so good, and then he said to the Dog:</p>
<p>&#8220;Go, may it be done according to your heart.&#8221;</p>
<p>And, returning to his workshop, he created Man.</p>
<p align="center">&#8211;</p>
<p><em>P.S. &#8212; Man, naturally, was a failure.  The Good Lord had said so.  But the Dog is very content!</em></p>
<p align="center"><em>FIN</em></p>
]]></content:encoded>
			<wfw:commentRSS>http://sekai.insani.org/archives/15/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>An Old Oil Lamp, Part II</title>
		<link>http://sekai.insani.org/archives/14</link>
		<comments>http://sekai.insani.org/archives/14#comments</comments>
		<pubDate>Mon, 29 May 2006 22:02:33 +0000</pubDate>
		<dc:creator>Seung Park</dc:creator>
		
	<category>Translation</category>
	<category>French</category>
		<guid isPermaLink="false">http://sekai.insani.org/archives/14</guid>
		<description><![CDATA[A short story by Hugo de Haan
Translated from the French by Seung Park
Part II of II

The young man sat almost in spite of himself.  He was so little used to talking about what he loved that soon enough, a veritable deluge of words flooded from his mouth, as if some dike in his soul [...]]]></description>
			<content:encoded><![CDATA[<p align="center">A short story by Hugo de Haan<br />
Translated from the French by Seung Park<br />
Part II of II<br />
<a id="more-14"></a></p>
<p>The young man sat almost in spite of himself.  He was so little used to talking about what he loved that soon enough, a veritable deluge of words flooded from his mouth, as if some dike in his soul had broken at last.</p>
<p>He recounted everything: the addresses, the candle, the melodic phrases, the harsh light &#8230; and the other listened to him without saying a single word.</p>
<p>&#8211;And that is why I wanted to buy that lamp, he concluded.  But my means are so far from the price that you are asking &#8230;</p>
<p>&#8211;Which instrument do you play?  the old man wanted to know.</p>
<p>&#8211;None.  But I hear them all in my head.</p>
<p>&#8211;And what do you compose?</p>
<p>&#8211;Oh &#8230; a few things here and there &#8230; some sonatas &#8230; and perhaps &#8230; someday &#8230; a symphony.</p>
<p>&#8211;I like music very much, the old man said.  Whistle for me something from one of your sonatas, from the one that you like the most.</p>
<p>The young man began whistling, just as asked.  It was a curious spectacle indeed: for he arose from his seat and began wandering through the shop crowded with antiques, whistling all the while.  and as for the old man, he remained comfortably installed in a wing chair, his eyes closed all the while.</p>
<p>&#8211;That isn&#8217;t bad at all, he said when the young man was finished.</p>
<p>&#8211;Oh &#8230; well, maybe, the young man replied.</p>
<p>&#8211;Have you no confidence in yourself?</p>
<p>&#8211;Sometimes &#8230; and not very much.</p>
<p>&#8211;And have you gone to see a publisher?</p>
<p>&#8211;Oh, no!  I couldn&#8217;t dare!  The stuff I write isn&#8217;t really in style, and I will get laughed at!</p>
<p>The old man took up the lamp and stroked it in an almost loving fashion.</p>
<p>&#8211;It is true that the brass is a bit tarnished, he murmured, as if he were talking to himself.  It could use some polishing &#8230;</p>
<p>He quickly raised his head and looked the young man straight in the eye.</p>
<p>&#8211;Have you ever heard a story regarding a lamp, and what happened when that lamp was polished? he asked tartly.</p>
<p>&#8211;Um, no, sir.</p>
<p>&#8211;You mean to tell me that you have never heard the story of Aladdin and his magic lamp?</p>
<p>&#8211;No, really, I never have.</p>
<p>The old man went to a shelf, plucked a book from it without effort, and then turned without any difficulty at all to the page that he was looking for.</p>
<p>&#8211;The <em>Tales of the Arabian Nights</em>, he said.  Within them, we find the story of Aladdin and his magic lamp.  I will not tell you the entire story from beginning to end, as if I did that we would be here all night.  Aladdin&#8217;s father was a tailor by the name of Mustafa &#8230;</p>
<p>&#8211;My father was not a tailor, the young man said with a pout.</p>
<p>&#8211;This Aladdin had been behaving so badly by the time he was only fifteen, the old man continued with some severity, that he caused no end of hardship to his father.  It is even said that his father&#8217;s eternal embarrassment at his never being able to turn his son to gainful work caused him a sickness so obstinate that he died from it after the course of several months.</p>
<p>&#8211;I assure you that I am not like that, interrupted the young man.  See &#8230; I &#8230; I never knew my parents &#8230;</p>
<p>&#8211;Good &#8230; good &#8230; let us get back to our story of the lamp, then &#8230; ah, here we are &#8230; &#8220;there was once a magic lamp that was so powerful that even tyrants and emperors in their far-off thrones trembled and desired its power.&#8221;</p>
<p>&#8211;The young man wondered to himself what in the world this old man was getting at; he was of a mind to take to his heels and bolt from this shop that was resembling more and more, by the second, the inner sanctum of a magus.</p>
<p>But a curious kind of authority, emanating from that old man, kept him from doing so.</p>
<p>&#8211;In short, the old man continued, the lamp found its way into Aladdin&#8217;s hands, who was completely ignorant of its awesome powers.  Aladdin&#8217;s mother took that lamp, and looked at it carefully.  &#8220;It is quite dirty,&#8221; she said to her son, &#8220;and if we clean it a bit, it will have a bit more value to us, no doubt.&#8221;  She took some water and some fine sand, but barely had she begun to clean the lamp that an awe-inspiring djinni of gigantic height appeared before her.  Then it thundered: &#8220;What is your command?  I &#8212; I and all the other slaves of the lamp &#8212; am here to obey, your slave, the slave of all who possess the lamp.&#8221;</p>
<p>The old man stopped here, closed the book, and placed it before himself.</p>
<p>&#8211;And it was all true, what the genie said, he concluded.  In the end, the lamp gave everything to Aladdin: happiness, riches, love &#8230;</p>
<p>The twilight had begun entering into the room, and the old man lit the oil lamp.  It was a beautiful, firm flame that allowed room for the friendly and favorable shadows that now danced about the walls.</p>
<p>&#8211;Fine, the young man finally said, but that lamp isn&#8217;t Aladdin&#8217;s lamp &#8230;</p>
<p>&#8211;What do you know, the old man countered.  It is only faith that saves &#8230; take the lamp, take it with you &#8230;</p>
<p>&#8211;But I do not have &#8230;</p>
<p>&#8211;Polish it gently every time you wish to create something great, something of beauty &#8230; you will succeed &#8230; you will make money &#8230; and you will come back to me to pay me for the lamp.</p>
<p>The young man could scarce believe his ears.  Nevertheless, he stood, took up the lamp, and held it in his arms &#8230;</p>
<p>&#8211;I do not know how to thank you.</p>
<p>&#8211;It is nothing.  But make sure you take good care of that lamp &#8230;</p>
<p>The young man cradled the lamp under his coat, protecting it as if it were his very own child.</p>
<p>He did not know how best to say goodbye to the old man, but the old man seemed to have quite forgotten that he had ever been there.  He had closed his eyes and seemed to all the world to be deep in sleep.</p>
<p>The young man exited the shop with all the haste and delicacy of a thief and went back home as fast as his feet could take him.</p>
<p>But in the end, the lamp sat at his table, he lit it, and his apartment was bathed in a gentle light.</p>
<p>He took a rag and gently polished the tarnished brass.  No genie &#8212; not good, not evil &#8212; came from the lamp.  If anything, the lamp just seemed happy to have been cleaner than it had been in some time.</p>
<p>The young man finally threw himself into writing his grand symphony, grasping at the phrases that often crossed his mind like flashes of lightning, but that he had never been able to capture in flight.</p>
<p>And now, here they were, taking form, as his symphony!</p>
<p>He polished the lamp now, the ironic smile of that first day gone, because he knew well that the lamp had aided him just as the other lamp had aided the Aladdin of old &#8230;</p>
<p>One day, he took his finished symphony to a well-known publisher.</p>
<p>&#8211;Come back here in three days, the editor told him.  At 5:00PM &#8230;</p>
<p>&#8211;I work until six, sir &#8230;</p>
<p>&#8211;Then come here at six-thirty &#8230;</p>
<p>Those were the longest three days in his life.  He did not write anything, not one more note, and he would gaze at the lamp for hours at a time, struck with the thought that the yellow flame carried madness and madness alone in its wake.</p>
<p>The final day, he went to that antiques store, and saw the old man reading as he sat comfortably on a period armchair.  He had all the air of a magus who was consulting his grimoires, and the young man did not have the courage to face him.</p>
<p>The great day finally arrived, and precisely at 6:30PM, the editor received him with cordiality and respect.</p>
<p>&#8211;That which you have created is excellent, young man &#8230;</p>
<p>