关于rUGP破解现状的备忘

在rUGP这个坑里折腾了一个多月,收获实在是不大。到现在为止,仍然只是解决了两种主要格式的CG/背景图片的提取。而且找代码/模仿/猜测的搞法也快到头了,想取得更多进展必须上OllyDbg或者IDA pro了。这就要从长计议了。目前的打算就是把已经知道的事情记下来,然后给现有的成果做个界面release一个,然后不理程序了回去翻文本。rUGP的破解十来年都没人深入搞(从君望算起的话),一来说明难度大,二来不会有人急着等成果。虽然有些虎头蛇尾,也没有办法。在此写一下这段时间了解到的关于rUGP的破解的事情,作为备忘。

一、 那些变成传说的

在google上搜索过各种中文/日文/英文的关键词后,找到的与rUGP破解有关的最早的信息似乎和age社自己做的一个叫riorha2.rpo的插件有关。这个东西是用来访问一些rio文件中的资源的,现在还在age官网上挂着供下载。因为用了mpeg的库,被GPL协议搞了(我不清楚细节),age公开了riorha2的源代码。我没有尝试插件本身的效果,只是看了下代码,看上去涉及了音频和视频对象。按常理说这东西应该是个不错的突破口。然而,至今没有见过提取rio文件中音频或视频的任何工具,关于它的寥寥的讨论也仅限于“这东西应该有帮助”。

然后的一个被不少地方提及的、传说中的工具,叫RioDecode。之所以说“传说中”,是因为所有提及它的地方都指向同一个、现在已经不存在的页面。我现在还不知道去哪儿能弄到这东西。因此,RioDecode是谁做的,什么样的,能做什么,就不得而知了。

二、 hikobae的成果

再之后,就是2003年的rio2png和2006年的alterdec了。这两个东西都是hikobae做的。猜测hikobae是日本人,因为他的个人页面是纯日文,他混日文论坛,而且没有见过他发表英文的东西。这两个工具都公布了源码,这也是我找到的仅有的源码。应该说,我做的所有事情,都起源自这两套代码。非常感谢hikobae辛勤的劳动和无私的奉献。根据简短的blog,他应该是用softice跟踪了游戏程序。而他得到的,是数十个资源类型的初步或深入解析,和100多K写得非常紧凑(或许过分紧凑了)的代码。这个工作量粗估可能要几百甚至上千小时。

rio2png是一个用来解Muv-Luv 18X版中CG/背景图的工具。研究后发现,其实只解了Rip008类型图片的一部分,虽说数量上确实是绝大多数了。一种更老的图片类型(还没确认到名称)和r6Ti类型没有涉及;Rip008类型也有一部分在程序中绕过了没有处理,从代码上看应该是没解决这部分的解码。在rio2png的基础上,结合后来的alterdec的代码,我猜出了Rip008类型绕过的那部分的解码方式。其实底层操作hikobae都找出来了,就是怎么根据flag组合起来没有给出。

alterdec是一个伟大的工具。它可以解压Muv-Luv Alternative 18X版中的CG/背景/文本。在我看来,它有两个巨大的贡献:一是从非常复杂的脚本对象中提取出了文本;二是解析出了rUGP中对象的树状结构。rUGP的脚本相当复杂,除文本外有三百余种对象(VmGenericMsg中的message各不相同需要区别对待)。这些对象以二进制的形式直接存在脚本里,长度和内容有关,而且没有存所占字节数也没有分隔字节。这就意味着即使不想要它们的内容只想跳过,也必须分别采取正确的方式。hikobae就给出了这三百种对象的跳过方式。另一方面,树状结构的解析让我们得以窥见rio的全貌,给出了可靠遍历和辨认所有资源的手段。后来的WESTSIDE社的工具,也明显是采取了遍历树的方式。证据就是用它们打开ML 18X版的rio文件会报relicUnitedGameProject错误:这个类是根节点,而这种树状结构是从MLA 18X版才开始起用的,更早的作品以及后来的君望LE都没有这个根节点。

alterdec很强大,但是还有问题。一个结构性的问题是,如果rio中出现新的对象类型,旧的程序解析树状结构就可能出错。只要采用树状遍历,就没法避免。结果就是只能做专门针对某一个游戏的解压工具,面对其他作品的rio文件,“有可能成功运行”,也有可能crash。事实上,无论alterdec还是后来WESTSIDE社的工具,都是如此。从这个意义上,rio2png的识别特征码的方式,虽然不够系统,效率也受限,却有可能用来做出通用的提取工具,因为主要的对象类型的格式变化不太频繁。

alterdec的另一个问题是图片格式的解析不够给力。程序只处理了r6Ti类型和Rip类型(似乎是单色mask),Bg2d类型的解析还有错。rio2png里做过的Rip008都没写进去,似乎也是因为前面提到那个解压的问题没解决。我所做的就是把两处的r6Ti和Rip008的解码整合在一起,补足了未解决部分,并修正了Bg2d类型的错误。目前手头有的rio文件中的r6Ti和Rip008类型的图都可以正确解压了。只是在此过程中又发现了一种不知道名称的图片类型,现在还没头绪。好在它只在部分作品中出现了个别几张,在MLA和MLAC中根本没出现,就先不管了。

三、 WESTSIDE社的工具

WESTSIDE社是一个提供各种游戏小工具软件的公司,产品要收钱的(不到1k日元一个)。其中做过四个跟rio文件有关的,分别对应ML全年龄版、MLA全年龄版、ML Supplement和ML Altered Fable,都是提取图片的。界面用MFC写的,而解压采取了alterdec的树遍历方式。这几个工具的亮点在于,可以解出很多类型的图,除了r6Ti和Rip008,能解那种未知CG/背景类型,能解立绘和表情差分,甚至还有ico等零碎东西。可惜人家是收钱的不公开代码,目前还不知道具体怎么做的,

四、 Nagato’s plugin

2011年出现了一个伟大的东西:Amaterasu Translations发布了MLA的英化补丁。在该组织的论坛(英文)上,可以下载到ML和MLA的英化补丁,而且似乎没有大的bug。补丁只有几十M,还有卸载功能,做得非常干净。实际运行发现替换了文本和部分图片,效果很好。从论坛的讨论中看,这个东西是Nagato做的,原理是写了一个mlhookv2.rpo插件(本质上是dll)去hook游戏运行时内存,每当把文本填入文本框时,替换要填入的字符串,不涉及内部资源格式的解析。

这是一个很好的思路,似乎也是近年来汉化中越来越多见的一个思路。替换资源文件涉及资源的编码、资源文件结构的修改、双语版本共存等问题。kirikiri这样的开源引擎倒无所谓,rUGP这样的引擎就是要人命的。而用hook不需要改变原资源文件,运行时替换即可。虽然还是拿不到立绘图,至少可以做汉化版了。只要不是跑起来很卡,就没啥问题。Amaterasu Translations没有放出代码,似乎关系到和age社交涉英文版授权的事;Nagato似乎已经宣布退休,我前些时在Amaterasu站短他也没理我。不过开源的ITH似乎解决了rUGP的文本hook,真要做的话应该还是能做的吧。

五、 yusjoel的工具

我目前跟着澄空age版的人搞ML系列汉化相关的事,而在这里找到的一个东西,就是yusjoel做的文本替换工具。这终于是一个同胞做的东西了。他做的事情是,首先是把rio文件中的文本提取出来,加偏移标记,并转换成GB2312(为啥是这个倒霉的内码呢…)。然后就是把翻译好的文本压回rio文件简单替换原来的脚本。还修改了rUGP若干配置文件,让游戏能够显示GB2312码。

简单替换的话,中文文本长于日文文本就是致命的。还好替换单位是数百上千行,而日语是一种很啰嗦的语言,实际中大约没问题吧。不过还有另一个问题就是文本颜色:原来是可以区分设置不同人物文本颜色的,替换后全白色了。似乎是跟JIS字体有关。其实我个人还是倾向于hook的方式,当然,问题是要有掌握相应技术的人来花功夫做这个事情。

结语

从年初以来,牺牲了做研究写paper的时间,一直在搞rUGP。对我这个还没入破解的门的人来说,果然还是够难的。复现和整合rio2png+alterdec的图片部分就花了三周。不过也挺有趣的,学了一些没用过的C++特性,学了一些没用过的工具,体验了一下解包。后面再深入些也不错,不过现在还是回来忙正事吧,再不找工作我就真成无业游民了。这篇东西把重要的事情做个备忘。

White Album 2(其二)

以下这段写一下IC,不免要剧泄了,还打算自己打WA2的同学请直接跳过。此文作为一个かずさ党的个人意见,难免偏颇,却也无意去避免。实在是代入感太强烈,会把自己的一些感情带进来。事实上当时手不释卷地打下去,也是想看看作者认为这些人如何才能达成happy end,看看对自己的现实有什么启发。

先从男主的北原春希说起。此人的性格大致可以用两个词概括:“责任感强”和“多管闲事”。他善于分析问题,时时刻刻努力不懈,大事小事都全力以赴,并且做到圆满。不仅自己的事情,别人的事情他也总是主动揽过来做。另一面,他喜欢说教,直白地批驳身边人的错处,从措辞偏差到做事不得法还有不努力的生活态度。用剧中飯塚武也的话说:“对刚接触他的人来说,他就是个灾难;但是和他相处久了,就会渐渐依赖他。”

这初看是一个顽固但可靠的好人形象。但是,这个性格有致命的缺陷,也正是这样的缺陷把三个人的关系一步一步推向深渊。春希缺少的,是天然的自信,是那种毫无理由就相信自我正当性的思维方式。所以他必须无休止地努力,完成一项又一项任务,积累实绩来消除自己的不安。生活就是制定目标-实现目标-指定新目标的无限循环。这还不够,在严于律己的基础上,他说教身边的人,以扩大自我的正确性。春希这个人的充实感和正当性,通过日常强迫性的行动才得以确立。幸运的是,依靠坚韧的意志和积累的实力,他攻无不克。但是,缺乏失败的经验让他无法正确界定自己的能力范围。如果他一如既往的全力以赴换来了不愿意看到的结果,多年的精神支柱可能会一夜崩溃。

很多人不需要这样极端的自我证明,但是有的人需要。因为他们沉溺于思考,因为他们是孤独的。我为何存在,我如何行动,一个人的生存方式必须要基于某些明确的或模糊的信念。然而这世间从来没有什么“自明”的“公理”。一块基石下面,总有块埋藏更深的基石。追究越多,越发现找不到落脚之地,反过来就越渴求现实层面的支持。而当这一切得不到身边的人的理解,取得心灵上的满足就更加困难。

然后是小木曽雪菜。表面是容貌端丽的校园偶像,背后则是生活感强烈的普通女孩。雪菜在大众面前的以高龄之花的大小姐形象示人;然而出身平凡的家庭,身边环绕着普通的家人,为了买衣服还要去打工挣钱。这个属性颇有戏剧性,但不罕见。还有一点随着剧情推进逐渐展现的,是她的顽固。她固执于“三个人在一起”,固执于“春希没有错”。老实说这部分我不懂,不懂她为什么有这样的执念。是因为她已经把自身的信念基础移置到了春希身上吗?因为“和自己在一起的春希”变成了她的尺度?既然不懂,也就没法多评论什么了。

第三个,冬馬かずさ,孤僻的天才。天才本质上是孤独的,正是他们异于常人的自我和才能使之得以成为天才。かずさ的沟通能力的缺乏则让她的孤僻展现为一种非常极端的形式。她无视教师和同学,迟到翘课,将第二音乐室私物化并长期盘踞。虽身在人海,实与世隔绝。这一切没有被追究都是因为母亲曜子作为音乐大家的名气和对学校的赞助。かずさ与这唯一的亲人也在冷战,因为多年来曜子抛下她独赴欧洲。

かずさ的孤僻并不是她主动选择乐意接受的结果, 而是她交流能力的匮乏造成的。她希望有朋友,希望被关心。但是她不知道如何表现自己,不知道如何接触他人,没有采取过主动的行动。以母亲的离去为开端,她对被动的接触也开始持拒绝的态度。周围的人向她搭话被拒绝,渐渐地就没人理她了。于是她不被理解,进而被议论和被疏远,退出音乐科来到陌生的班级后更加边缘化。她只是存在在那儿,不和任何人发生联系。这种自我孤立,或许也有恃才傲物的成分,但更多的只是习惯性逃避带来的恶性循环。

唯一一个不在乎白眼经常找かずさ搭话的,是春希。班长工作或者好管闲事,只是表面的借口。春希被かずさ吸引了。而接近自闭的目标,只能靠固执的骚扰。春希的耐心换来了水面下坚实的进步:かずさ开始偷偷注意春希,并不表露身份地以琴声应和春希的吉他。然而,かずさ还不知道,关注这个敲打自己外壳的人会产生多强的依赖,外壳真正被打破时又会产生多大的反动。另一面,春希没有意识到自己已经倾心于かずさ多深,也没有觉察かずさ已经对自己产生了兴趣。两个人都被对方吸引,都在掩饰自己,都看不清对方的态度。如果任由这青涩的感情慢慢发酵,也许二人会平淡地走到一起,也许会不了了之——如果没有发生IC这些故事的话。

IC的开始,是三人偶然的共演。春希的吉他,かずさ的钢琴,雪菜的歌声。美好的巧合成了三人共有的重要财富,而春希复活轻音乐部演出的努力把三人牵到了一起。雪菜因为春希看破自己平凡的一面,产生了微妙的感情;かずさ则因为竞争对手的出现和紧逼,心态迅速变化,也加入战团。从一开始,雪菜和かずさ二人分别与春希间的恋爱感情,就是三人关系的基础。当然,他们之间还有更多的东西,随着时间的流逝还卷入了亲情友情事业等等。但是,无论“三个人在一起”的愿望,还是雪菜和かずさ的友情,或是春希的责任感和负罪感,都起源于这场恋爱争夺,无法反过来颠覆这一基本构图。

扯远一点,雪菜和かずさ的关系,不同于速瀬水月和涼宮遥的关系。速瀬水月和涼宮遥多年的友情,使得鳴海孝之成为三角关系中有时会无力的一角;雪菜和かずさ的竞争,则使春希时刻处于矛盾的轴心。后来也正是因为能改变三人命运(?)的自己掉了链子,春希才那样痛不欲生。

这时的雪菜和かずさ,已经明确地意识到了彼此的竞争关系,春希却仍然懵懵懂懂。他满脑子都是如何准备学园祭演出,逃避着逐渐成型和深化的三角关系。全心全意地投入到一件事中去,对这件事来说大概是好的,对这个人来说却未必。注目于一件东西,就意味着把视线从其它东西上移走,从结果上说可能就是逃避了某些必须去面对的东西。这种逃避,可能真的是无心之失,也可能只是自己内心深处不愿意去理解和接受相应的困境。春希没有意识到身边的恋爱感情已经发芽,也没有去想自己对二人的感情及其取舍。他只是留恋于二人相处的温情的快乐的日子,并幼稚地想把这种不稳定的状态转化为永久的。正是他这种暧昧的态度,让三人越走越近,问题不断深化,心结越来越难解开。

在三人的共同努力下,演出大获成功。到这个时候,没有意识到三角关系严重程度的,或许只剩下当事人了。瀬能只是看了三人的演出就判断出了他们之间的关系。就在演出结束后,把三人维系在一起的共同目标刚刚消失,事态就有了急剧的发展。かずさ趁春希睡着时的偷吻刺激了雪菜,并引发了后者的告白,于是当天晚上春希和雪菜就确立了交往的关系。

三角关系关系就像一个双稳态的gene regulatory network,当动态倒向其中一个恋爱关系的时候,另一个可能的恋爱关系就被抑制,并在正反馈作用下迅速收敛。没有稳定的中间路线。春希和雪菜还试图恢复“三个人”的形式,却无法扭转“两个和一个”的现实。かずさ重新开始自我孤立,并选择了远赴欧洲与母亲一起生活。

更糟糕的是,春希开始了解到かずさ对他的关注,这又进一步唤起了他对かずさ的眷恋:毕竟在之前更长的时间里,他一直注视着かずさ。或许是因为寻找中间路线产生的反动,春希在最糟糕的时候做出了最糟糕的选择。在雪菜生日的情人节(生在这一天真倒霉,就一情绪放大器啊),春希和即将离去的かずさ结合了。かずさ远遁,春希则因为强烈的负罪感无法再面对雪菜。三个人的关系彻底崩坏。

如果说かずさ在整个过程的表现是对春希强烈的依赖,春希就是无所适从的暴走。就好像一个没有做异常处理的函数,当输入超出了正常的范围,函数的行为就成了不可预知的。恋爱对此时的春希来说就是这样的异常。他试图把局面引向他所希望的状态,却不知他的愿望原本就是不切实际的。他动员了全身的经验和能力,却没有意识到自己的蓄积无法处理这个异质的新的课题。在关键时刻最糟的选择,造成了背叛,带来了伤害,给自己套上了沉重的枷锁。

无论说背叛还是说伤害,会受伤的只有不具备相应觉悟的人。这三人正是如此,此时怀着纯粹的思虑全身心投入,展现和达成自我,而没有大人的那份谨慎保守。这种状态是耀眼的,是危险的,也是从不成熟走向成熟需要经历的。从这个意义上讲,虽然看起来可以有不同的选项,但是在这个年龄这个状态的纯粹的他们,只会选择这条路。虽然这条路遍布荆棘,虽然这条路不通向任何一个人的愿望,他们却看不到,也无法拒绝,这条由他们的“自我”选定的道路。

IC通篇没有选项,展现的就是这样一个充满了悔恨,却暗含着必然的故事。到かずさ的离去,故事戛然而止。然而,这无法成为真正的结束。只有三个人回到一起重新面对重新清算,把破壁残垣清理干净,这一页才能真正揭过去。这就是后面的篇章里要讲的事情了。

IC的布局谋篇和文笔运用,堪称galgame界的教科书,有震撼人心的力量。人物的性格和心理发展得到了自然和深入的展示。剧情紧凑,高潮迭起。只能想出这些粗鄙的言辞来评论,实在是对不起原作了。不考虑CC,IC单独也是一部超一流的作品。