开工破解rUGP

去年下决心从英杰传那个坑里爬了出来,今年就一头扎进了Muv-Luv Alternative汉化这个深坑。实在是读的时候被震撼了,觉得这样的神作在天朝默默无闻太可惜了,于是决心为布道出一份力。age社不乏名作:君が望む永遠扬名立万,Muv-Luv系列作为招牌产品创造了业界的高峰,化石の歌和君がいた季節也非泛泛之作。然而这个在日本颇有人气的galgame大社,在天朝却不算出名。一方面是因为动画化太少,至今只有君望的一部TV和两部OVA;另一方面是因为age社的rUGP引擎以难以破解著称,一直未有人汉化原作游戏。结果就是,对不会日语的天朝人民来说,至多是看看君望那缩水的动画版,其他只能望而却步了。

去年年底开始在网上搜索,希望找到MLA汉化的组织。看到澄空有相关讨论,于是前去投奔报名日翻。开始在版面发帖,一直无人回应。上个月忙完预备审查干脆站短骚扰,总算找到了负责人。敢情汉化一直在坑,近两年其实没人在干。也罢,这也无妨,本来我就想着即使我一个人也要干的(虽然工作量尤其日翻的工作量实在无法承受)。于是拿了部分文本正式加入。

然而终究还是对程序方面放不下心。据说目前有一个前人做的程序可以把汉化后的文本封回去,然而字体颜色还有问题。另外可能的话有些图片希望替换,目前尚未实现。从近处说,不了解自己手头的工具我还是放不下心;从远处说,如果搞明白了rUGP引擎,或许有可能进一步解决君望等作的汉化问题。所以,最近半个多月,一直在解析age社的资源文件.rio的格式。

万幸的是,总算找到了一部分前人的工作成果。有个ID为hikobae/hiko_bae的日本人,早在06年就写了一个MLA的CG、背景和文本的解压程序,并且公布了代码。再翻翻看,发现他之前还写过一个解压Muv-Luv的CG和背景的程序。能用的,自然要尽量拿来用。

下载了代码就发现坑确实很深。hikobae公布的这两组代码,除去功能重合的部分,代码文本有100KB,而且是几乎没注释的100KB。这些代码还只解决了一小部分资源提取问题,包括提取主要的CG、背景的格式,以及提取执行脚本中的文本。立绘和差分没有提取,音频没有提取,甚至CG和背景的也有一部分没有提取。仔细看了代码之后更觉得坑深。一部分对象是用一bit一bit的变态方式编码的(不是逐byte而是逐bit);一部分对象的编码用了看不出特定理由的异或和四则运算的变换;总共近百种对象只有二十来种给出了解压算法。

路要一步一步走,总之先从模仿开始。开始先把基本操作的代码改写了一遍。算法保持不变,优化了代码,改进了接口,并且把杂糅的代码风格统一为我习惯的C++风格。然后开始搞图片。毕竟这个东西不那么琐碎,也有相对成熟的算法了,相对搞执行脚本要容易。经过数日的奋战,总算是有所进展。在hikobae的工作的基础上,简化了Cr6Ti类型的数据解析函数,扩展了CRip008类型的可读取对象种类,纠正了CBg2d类型中的错误操作,并初步修正了CG、背景对象的特征辨认。目前做了一个在.rio文件中自动辨识CG、背景对象并解压的程序。目前的情况是,解压MLA、MLA全年龄、MLAC01、MLAC02、君がいた季節FR均已成功,但是解ML Altered Fable失败,还需要进一步调试。看起来很有希望做一个age系列通用的CG、背景的提取器——这个东西似乎还没人做出来过。

必须说hikobae的代码给了我很大帮助。一方面我不需要hook程序去抓底层解密/解压算法了;另一方面hikobae对对象结构的解析尤其指出树状结构和给出ReadClassList函数,让我得以更好地把握全局。实际做做程序发现还挺有趣的,反向解析和做研究很像,很需要想象力,大胆假设小心求证。同时,换位想想.rio数据打包的设计思路,对我这个技术弱人来说也挺长见识的。

现在还只是开始,复现和修正hikobae的全部发现还需要很多时间和精力(人家前后也搞了三年的)。此外,寻找立绘和差分类型并进行解压也是一个任务,毕竟也有人做到过。更进一步地,音频等data的提取,可能必须要用OllyDbg重新解析程序了。有些让我吃惊的是即使hikobae的成果也没有被充分继承,这五年间居然只有一个hook内存英化文本的补丁出来。看来着手于此的人确实太少吧。我反正也不急,就慢慢解析慢慢玩吧。

3 thoughts on “开工破解rUGP

  1. 期待几年后君望的汉化,muvluv已经不奢望了。君望的怨念从06年一直到现在

    • 04年的时候我也曾因为君望没有汉化颇怨念了一段日子
      技术比我牛的人多了去了,却没人花力气搞rUGP,sigh……
      现在干脆自己动手造福后人

Comments are closed.