忙里偷闲打两部galgame

回国以来忙了好久,基本顾不上打galgame。上个月开始才挤出些零碎时间。这时就发现了N+社作品的好处:短。当初打村正,就觉得“怎么这就完了”;打鬼哭街,只觉如疾风骤雨;这俩月间打了phantom和尘骸魔京,依然觉得“好短”。这年头,没功夫去开类似CLANNAD、muvluv三部曲这样的大长篇,二三十小时的紧凑作品正合适。虽然感觉绵密有余,宏大不足,但是太宏大的东西实在也太杀时间。

Phantom的话,早年看了动画,游戏又很老没语音,本来没打算打的。实际打了,倒还挺满意,可谓不负盛名。剧本紧凑,变化丰富,音乐合拍,重制版的画工也不错(好歹比baldrforce强吧……)。回过头来看动画版,感觉动画就是剔除了不宜放送的黑暗要素后,把悲剧要素最大化的结果。动画部分洗白了Claudia,但是最后给玲二补了一枪实在是太毒了……顺便一提就是,打完phantom后认得几把枪了……老虚这个枪控,连进Ein线TE都跟游戏中途选枪有关……

尘骸魔京的话,虽然名字早听过,却一直不清楚内容。这次轮到它是因为打完phantom意犹未尽,手上的N+社存货又只剩它了。总体比较满意。男主那毫无感性的性格很有看头,几位实力CV的演出也给力。伊藤静的Ignis仍然是迷人大姐姐,而田口宏子的狼人仍然缺根筋。有趣的是,种种迹象显示尘骸魔京并不完整:鱼人女王和牧本同学看上去就是策划阶段有线路后来被拿掉了,妹妹大约原本也是有线的;另一方面,大量设定未展开,线索未收束,比如关于男主没有心的解释,ストラス的巨人的解释,等等。不过即使如此,发布的这三条线仍然是不错的。

PS:最后吐槽一下土著いとうかなこ唱的尘骸魔京OP。一听就是汉语的吐字方式,但是听了n遍我也只听出那句“敞开胸怀”,其他一句也听不懂……看了歌词就更疑惑了,这么文艺的文面加上这么奇葩的发音,N+这歌你打算让谁听懂啊……

关于rUGP的一点总结

age社扬名立万已经十几年,其引擎的破解却进展有限,以至于还没有过汉化。据我所知,已有的技术工作主要包括以下这些:1)Susie上有一个插件可以提取MuvLuv(2003)之前的age作品的部分图片;2)Kgne论坛的RIODecode解决了君望DVD版(2004)的文本提取;3)hikobae的rio2png可以在若干游戏中提取主要的CG/背景图片;4)hikobae的alterdec较完整地解析了MLA 18X版的资源文件,可以提取MLA的CG/背景/文本资源;5)WESTSIDE社(在alterdec基础上)的几个专用工具,可以很全面地提取ML正传及其fandisk等的CG/背景/立绘资源;6)Amaterasu Translations的Nagato,用插件以内存注入的方式实现了ML以及MLA的英化;7)yusjoel(在alterdec基础上)制作了MLA的汉化工具,初步解决了MLA的汉化技术问题。8)最近听说,有人运用钩子工具AralTrans,已经开始Altered Fable的英化。

此外还有一些有关联的工作,比如AGTH/ITH等文本钩子对rUGP的支持。它们提供文本的运行时抓取,也为已知的几个英化项目提供了技术基础。还需要提一下的是,著名的破解者痴汉公贼提取了使用rUGP的Summer Days的文本资源。但是,Summer Days并没有采用age社的数据打包方式(所以才搞得那么大吧…),其资源提取实质上与age社作品没多少关系。

成果少,功能少,不通用。这就是age社引擎破解的状况。我所做的,是整合功能,实现通用性,并在此基础上挑战未解决的问题。

我做的第一件事,是实现比较通用和全面的资源提取。在RioX最近的版本中,实现了已知age作品CG/背景/立绘提取,以及君望(2001)以来的文本提取(更早的文本其实是明文)。与过去工具的比较如下:

tools

第二件事,就是制作翻译工具用于MLA以外作品的汉化。在新设计的Rsa脚本解析算法支持下,一般性的脚本解析取得了进展,一般性的文本替换也得以实现。君望LE就是这样开了工,伟大的布道距离实现又近了一步。不过,围绕字体、编码、引擎的检查,还有很多细节有待解决,需要更多的努力。

在这将近一年里,总算是对rUGP的破解,进而对age作品的布道做出了贡献。得到过几位日本网友的感谢,也得到过几位中国网友的批评。希望今后还能有新的进展;不过更希望有谁替我搞定程序,我就可以去搞翻译校对了。MLA这多年的坑不必说,君望LE现在第一章也在缓慢前进。技术没解决时卡技术,技术解决了就卡翻译。把自己的主张喊得响亮的人什么时候都不缺,真到干活的时候人手永远不够。否则君望的汉化也不会一晾十年了……

2012:转型

2012年,我从学生变成码农,从东京回到北京。2012年,我爬出英杰传的坑,跳进age作品汉化的坑。2012年,个人感情方面也有发展。这一年的生活,繁忙而崭新。

从年初的预备审查开始,我就一直被笼罩在“是否能毕业”的疑云下。一路忐忑到九月初,毕业这个事才得到了明确的肯定,总算有惊无险升级到Ph.D.。毕业的事拖到这么晚,就职和回国的事就变得非常仓促了。找工作时其实就投了三家,G社、M社和S社。G社电面我一次后两周把我拒了;S社收到我邮件后一个月把我拒了。M社开始没反应,后来到八月份了忽然联系我,了解情况后就让我直接飞北京面试。面了整一天跟我说准备要我,然后九月份签了offer,十月中就开始上班了。回到国内,各种不适应,从自然环境到社会环境以及工作环境。虽然总体上还过得去,遇到各种不爽的事情也很多次抓狂地后悔选择回国。无论如何,先在M社、在北京蹲着好了……

娱乐方面,下半年因为各种忙,几乎没顾上打galgame。上半年还能维持每月一部,八月份到现在却只打了某盾的一条线。看起来今后也不乐观。另外就是彻底离开了英杰传,跳进了汉化的坑。先是加入MLA那个多年死坑,挣扎了几下后转为独立做rUGP程序方面的工作,夏天战了几集Total Eclipse的新番,秋天则和KFC开了君望LE的坑。这一年的成果是重大的。面对多年来让程序们望而却步的rUGP,我取得了一个比较通用的基本解决方案。仍需改进的地方有很多,但是我至少可以说,age社的各部作品都可以着手准备汉化了。

享受了几年的单身时光,在这一年里也开始摇摇欲坠。三月份开始和某同学交往,到七月份分开。虽然短暂,虽然彼此都忙相处的少,虽然我自身很多地方做得不到位,对我来说,总归是有益的经历。人只有站在那个位置上,才能取得相应的视野。这次我感受最深的,就是在我的过去中,我大约不只做过受害者,也曾经做过很多次加害者而不自知。这是遗憾,也是成长的必然。我能做的,只有更认真地面对现在和将来。我希望能在新的一年里,能走出坚实的一步。

既然已经被绑在命运的轮子上跳舞,就只能舞得更快,舞得更好。纷至沓来的新的生活,我必须去适应;尚未实现的心中愿望,我也要去实现。在2012年,我抓紧生活;在新的一年,我希望能继续如此。

君望LE的文本替换问题

最近找时间摆弄了一下yusjoel做的MLA翻译程序,试图找到些启发。结果有些失望,因为MLA的工具实际上用的是一种我曾经试图用在君望LE中,却造成了游戏错误的方法。在那之后我不得不改成了一种比较麻烦的方式,以绕过君望LE的检查。

MLA和君望LE的脚本中都生成了一些对象的标记,标记的值都和对象中的文本长度有关。一项基本的检查是标记的值是否和当前对象的文本长度相符。翻译时改动了文本长度,就要相应改动标记。麻烦其实在这之后。MLA似乎不检查别的了(当然跳转的标记之类还是要检查的),而君望LE至少多三项检查。

首先,每个脚本对象的标记,修改后都不能比原始值大,否则游戏载入脚本时告知你说数据是旧格式,程序中止。这意味着什么呢?就是说翻译后的第一句话长度不能超过原来的第一句话,前两句话的长度和不能超过原来的前两句话长度和,等等。这是一个很别扭的限制,不过一般翻译中可以满足,可以忍。

满足了第一条还没完,脚本最后的标记必须和原来的一致,否则程序停止响应。就是说,如果翻译后因为每句长度变化导致算出来的最后标记比原来小(大的话第一项检查就挂了),游戏走到当前脚本最后一句话之后就挂了。

然后还有第三项检查:如果脚本数据长度和原始的不符,载入脚本时就会报错中止!这就是为什么上一条我不说“翻译后每条都比原来短”,而说“翻译后因为每句长度变化导致算出来的最后标记比原来小”。每句都缩短的话一开始就会早早被这项检查拦住了。我尝试过修改加密数据长度记录,也尝试过在脚本尾加入无用数据补长度,可惜都不行。

经由文件差分确认,yusjoel的工具在打包文本时确实只修改了rio文件中的脚本数据内容。这样一来应该可以推论,在MLA 18X到君望LE的几年里,age在rUGP加入了更多的数据验证功能。MLA那种简单的替换方式已经不可行。要打包君望LE,或者找出引擎中数据验证的代码改掉;或者只能按我8月做的方式,弄一个功能可用形式较丑的方案。在短暂的业余时间里,我也再向前者努把力吧。

PS:之前有位朋友留下“先全部都搞清楚”的评论。这件事很困难。到目前为止除了hikobae大体解明了MLA 18X,Westside社在其基础上对MuvLuv正传四个游戏做了扩展之外,还没听说谁去把哪个游戏解析清楚了。我也试过一点,但是很快放弃了。如果对比过age社不同游戏,就会发现引擎在不断更新,修改旧的做法,加入新的特性,而很多更新都会要求新的解析工作。我没有时间去磨每一个游戏,但是我要解决尽可能多的age作品的汉化问题。我无力去“全部搞清楚”,也没有必要。

PS2:之前那位朋友批评指出MLA也检查文本长度。确实我当时搞错了。MLA也检查,只是比君望LE检查的少几项。

关于君いたFR的CG提取

两次在澄空被人问到,说RioX提取君いたFR缺CG。在澄空答复的同时,在此也贴一下。

首先感谢樱舞罹提供了游戏截图进行说明,让我终于明白发生了什么。

从结论来讲,并不是那部分CG没有提取出来,而是提取出的形式不同。君いたFR中有一些CG是拿多张差分图拼起来的,并没有存为完整的图。于是,提取出来的是这些组成部分的差分,而不是CG本身。

并且,这些差分图的存储格式和立绘完全一致,而和一般CG/背景不同。所以,用RioX提取时,需要选择”Character Sprite”,而不是”CG/Background”,才会提取出这些差分。关于存储格式和内容类型的不完全对应,我在RioX的说明文件中也提到过。

举个例子,比如君いたFR的CG第一页第一行第四格,如图。它没有出现在RioX提取的”CG/Background”里。但是,是以下八张差分拼成的,可以在提取”Character Sprite”时得到。我们看到的CG并不实际存在于rio文件中,实际存储的就是这八张差分。

很可惜,目前还没有办法自动查找合适的差分还原成完整CG。还只能去立绘/差分里人工找,然后人工处理。随着age把CG、立绘拆得越来越散(Chronicles 02里的《憧憬》也是个典型的例子),提取出来的东西距离我们想要的东西也越来越有距离了。

顺便提一下,如果解图出错,是不会错成黑图的。由于rio文件的存储格式,如果解图出错,十次有八次会造成程序死掉。剩下的两次则会生成白噪声一样的图像,看上去就像电视没信号时的”雪花”。

临江仙·离别

离景恰如初见貌
稠云覆尽青空
鸦声荷影乐堂钟
三秋疑刹那
草木尚葱茏

羁旅孤身贪自在
浮生最是匆匆
收拾任性扮鹄鸿
闲情虽不舍
立命赖亲躬

备忘:君望LE汉化——待解决的问题

8月21日,君望LE汉化正式开坑。到目前为止,文本/选项可以替换和显示,条件跳转也运行正常。虽然细节尚不完美,做出一个能玩的汉化版还是没问题的。再把系统菜单汉化掉,发布测试版应该是够了吧。

这个9月或许会成为我住在日本的最后一个月。手头已经积攒了各种事一大堆,所以决定再一次暂停rUGP方面的事情,等生活稳定下来再说。同时,君望那难度颇高的220万字翻下来可不是个小工程,有点时间我也给翻译/校对出把力吧。既然为了还愿开了这坑,还是尽可能坚持到底避免夭折。

最近对有些相关问题有些头绪了,只是没时间精力做。在此记录一下,免得过俩月忘了。

1. 修图
图片提取已经写了,压回去的算法自然可以写出来,虽然有些麻烦。但是,考虑到rio文件的图片压缩方式,无法准确地预测和调整压缩数据的大小,这条路走不走得通还不一定。等有空了可以尝试下。感觉上不乐观。

2. 内嵌字体
之前发现选项卡固定用MS P-Gothic日文字体,现在已经有如何改掉它的思路。类似的处理预计也可以适用于注音等处。这一项比较有希望也比较有必要,有空了试一下。

3. 人物别文本颜色
每个人的台词颜色不同且可以自行设定,是rUGP的一个feature。 目前汉化后全部变成白色,其实是编码改变造成名字匹配失败的结果。应该可以解决,不过涉及到选项卡里的文本设定,最好先搞定字体问题。

4. 文本长度
由于君望LE对脚本整体长度的校验, 现在需要在每句句末加入控制符充长度,会造成额外的延时。虽说汉化后本来就无法文字语音同步,有的时候延时明显总还是不太舒服。争取修改程序,避免读入结束符后的内容。不过这件事优先级不高了。

这些都是后面有空时要做的内容。在那之前还需要做另外一两件事情。一是系统菜单的汉化;二是补丁程序。近期做一下好了。

关于君望LE汉化问题的初步进展

做rUGP相关的工作最初是为了MLA。不过,如果能为君望汉化出一份力,我自然是在所不辞的,怎么说也是对我影响深刻的几部文艺作品之一。之前做了文本提取,反过来替换rio文件中的文本就是水到渠成。然后模仿yusjoel的做法,修改dll中的IsDBCS、CharSet和特殊字符处理,把SJIS用的函数换成GB的。到现在为止,已经可以把君望LE中的日文替换成自定义的GB码中文,并正常显示。第一张显示中文的图如下:

不管怎么说,现在算是迈出了第一步。界面汉化等问题先不提,文本本身还有个致命的问题:无法修改字符串长度。君望LE会检查字符串长度(也可能是对象长度?),不符合就报错退出。MLA就不检查!结果就是,虽然可以用结束符等效地缩短字符串,却无法增长。而缩短其实也不意味着后面剩的部分自动消失:剩余部分会以下一句的形式出现。后面还是得研究一下这个长度怎么校验的,才能得到一个能用的方案吧。

PS:才发现词背错了…平仄都没对上……

PS2:又经过一天的奋斗,搞定了改动单句长度的问题。从实验结果做出的猜测果然是正确的。现在单句的改动已经不受长度限制,只是脚本整体仍然要保持长度不变。这样一来至少可以用补空格的方式解决了。整体的校验看起来是在脚本外部,下一步就是争取找到跳过去。

备忘:rUGP相关进展,关于资源替换和脚本解析

六月底歇工以来,零零碎碎有一些进展。最近改论文改得不爽,也写了点代码换换心情。主要做了两件事,一是资源替换,二是脚本解析。

资源替换方面,主要是尝试了一下用插件方式动态替换几个dll中的字符串资源。这也是Nagato的补丁做的两件事之一——另一件事是钩住函数替换文本/图片资源。现在我的做法是:先用Passolo翻译,然后用一个bat根据修改后的dll生成所需C++代码,最后编译出插件,动态替换内存中加载的dll。实验的结果,替换本身是成功的,但是显示有问题。推断是字体问题:SJIS字符集里没有简体中文。将系统默认字体改为中文字体,主窗口的菜单就正常了。但是选项页和S/L界面仍然无法显示部分汉字。从种种迹象看,这部分界面使用的字体应该就是嵌在rio文件内的那两个MS P Gothic字体,一下子还真无从下手了。这就是汉化比英化麻烦的地方啊…只要不是内嵌自定制字体,哪儿会没有英文字形嘛……作为后续,字体的替换是一个问题,当然钩子是另一个问题…现在对OD仍然生疏,两者都不容易吧。

脚本解析方面,设计了新的文本识别算法,相对RioX-1.1.89.524发布的那一版,错误率有显著的降低。之前的算法是在解码的二进制脚本中搜索具有SJIS编码特征的部分。算法对脚本结构信息用得很少,而字符串特征偏弱(比如有时选项字符串可能只有4字节,如“違う”),错误会多一些,粗估在千分之几。这次借鉴了RIODecode的思路和alterdec提供的结构知识,采用假设—判定/归谬的思路(跟我当年那个地图匹配算法主要思想一致……),设计了脚本内对象识别分割的算法,把脚本的构成对象分离开并确认类型,然后分别对CVmGenericMsg和CVmMsg类对象进行解析识别文本。这样一来用到了较多的结构信息,错误率粗估在万分之五左右,可能更低。

错误率到这个数量级的话,大约相当于游戏中读一个小时的文本中有一条解错,对人工修正来说负担比较轻了。我想这一版的文本提取结果可以拿来给汉化组的初翻用了。为了适应可能的汉化任务,也做了进一步修正的接口——读入错误记录的偏移列表,就可以在解析时修正错误。提取仍不完美是个遗憾,不过或许没有办法,毕竟找不到足够强的特征。RIODecode在很多脚本上单独设置了参数才完成解析;alterdec的思路要扩展到其他游戏,则需要对该游戏做大量的针对性解析工作。作为一个age社作品通用文本提取方案来说,我想,对rio文件中脚本的一般性解析可以告一段落了,文本提取也基本算实用化了。

下一步要做的,就是测试封包,尝试替换原始脚本,看看好不好使。这正是yusjoel那套工具的功能。我这里不同的是,不再是基于alterdec的MLA专用工具,也可以用于age社其他作品。如果测试顺利,或许,君望汉化的长久怨念就只剩下翻译的工作了。虽然现在还无法修图换图,虽然现在的补丁方式还不够漂亮,但是,这些没有那么重要。我当年也有过等汉化望眼欲穿的经历,最重要的还是文本翻译。

まずは落ち着くことだ

精神が不安定になるのはよくあるが、これほどのはちょっと珍しい。それに加えて、悠長にかまえる場合じゃない:博士論文の修正は今週中、例のジャーナル論文の修正はあと三週間。昔は自分一人で引きこもって、自己暗示のトランキライザーを打つことが多かったが、今回ばっかりは無理のようだな。

こんな時ばっかりは、人肌の温もりが恋しいなあ…なんじゃって。

でも無理だな、おれという人間には。人間関係もロクに築いていないのに。最低限の交友関係しかもっていないし、数少ない友人たちも別におれの保護者じゃないし。正直、いまさら、誰かを捕まえて、くだらない愚痴を聞かせる欲望は…冒頭もないな。

他の人に聞かせることは、自分を納得させる儀式でしかないぐらいは、もう知ってしまったから。

それでも、自分が自分を説得できないことも時々あるから、何とかならないと。愚痴を無差別に会う人にぶつかる時もあり、何かの遊びに没頭することで誤魔化す時もあった。しかし、どのみち、答え・慰めを期せずに。

その中一番のは、やはり自分相手に文章を書くこと。

それで人に迷惑掛からないし、自分の考えもまとめられる。文章の内容と流れを考えたら、気づかないうちに落ち着いてくる、いまのように。まあ、これでいい。さき焦っていて、自殺なんかも考えそうのあの調子では、どうせなにもできないだろう。

まあ、最後に自分を励ましてみるか。

九月の卒業はまだ絶望じゃない。博論の修正も、雑誌論文の修正も、まだやりようがある。今後の三週間は厳しいだろうが、おれならできる。決意をもて。手を動け。今まで戦ってきたこのおれは、強いんだ。