那天晚上,我躺在床上刷着群里的消息,看到有人在抱怨《编年史NTR》的安卓版一直没有靠谱的汉化。PC版早有了,但谁没事抱着电脑玩这种游戏?当时我就寻思,这事儿既然有人想干,没人带头,那我就自己搞一次试试看。我这个人就是这样,看到一个挑战,心里那股劲儿就上来了。
扒皮:找出APK里的秘密
是找素材。我到处挖,总算搞到了一个日版原装的APK文件。文件不大,但里面的东西藏得挺深。我抓起我的反编译工具,直接对着APK就干。把包体一拆开,果然,它用的是那个常见的游戏引擎,这就省去了不少从头摸索的时间。
- 第一步,是得砸壳。很多日厂为了防止被轻易破解,都会把资源层加密。我摸索着找到了对应的解密脚本,跑了一遍,把主要的资源文件都给拖了出来。
- 第二步,就是翻箱倒柜,找文本文件。这个引擎很鸡贼,脚本文件不是明文的,全给打包压缩加密了。我当时真是头疼,耗了整整一个下午,才勉强定位到它用来储存对话脚本的那个文件集。文件名都是乱七八糟的数字和字母,根本看不出规律。
我通过比对资源文件的大小和修改时间,锁定了一个最大的文件。用十六进制编辑器一打开,里面果然是压缩后的文本数据。下一步就是解压和解密。我对着引擎的特征码折腾了半夜,才找到一个能用的开源工具,成功把这些脚本给还原成了可读的格式。看到里面的日文文本像瀑布一样流出来时,我知道,最难的一步已经过去了。
核心改造:塞入中文
接下来就是替换环节。我从网上扒拉了一份据说很完整的PC版汉化文本。理论上,只要把这些文本按照顺序塞回安卓的脚本文件里,再重新打包,就大功告成了。结果?哪有那么简单!
第一次尝试,我直接把文本替换进去,然后重新打包签名。装上手机一跑,游戏直接闪退,连启动画面都没过去。我骂了一句,知道是编码的问题。这游戏引擎对字符集的限制非常严格,宽字节的中文它根本不认,直接报错。
我只好回头去研究它原始脚本的格式。我发现它对每一行文本的长度和字符编码都有严格的校验。我必须得把中文转成它能接受的UTF-8无BOM格式,同时还得保证翻译后的文本长度不能超过原日文文本太长,不然画面显示会溢出。很多对话框根本没有动态调整高度的功能,中文一长,直接就把字截断了。
这是一个体力活。我用了一个笨办法,写了个脚本,专门用来批量处理文本。这个脚本干了两件事:一是强制把所有文本统一编码;二是检测超过预设长度的句子,并添加特殊的换行符标记,方便我之后手动去修改那些超长的翻译。这个脚本写得我差点吐血,调试了通宵。
还有一个大问题:字库。原版日文APK里只有日文字符集,没有中文字符。就算文本换进去了,显示出来也是一堆方块。我找了一个简洁的宋体字库文件,然后研究了引擎的资源加载机制,把这个字库文件塞进了APK的资源目录,并且修改了配置文件,让游戏启动时优先加载这个中文字库。
胜利:可以躺着玩了
第二天早上,顶着黑眼圈,我把处理好的文本文件塞了回去。这回我特别小心地核对了所有的资源路径,又重新编译了一遍APK,并且用我自己的证书进行了签名。打包完,文件大小比原来大了一点点,主要是因为我塞进去了一个完整的中文宋体字库。
我忐忑不安地在我的旧手机上安装了这个最终的汉化包。启动——没闪退!对话出现——完美的中文!我滑动着屏幕,看着那些熟悉的剧情,心里那叫一个舒坦。虽然中间有几个地方因为字数限制,翻译显得有点硬,但整体流畅度是够的,完美解决了躺床上玩的需求。
这玩意儿前后折腾了我三天。我赶紧把我的这个实践记录和最终的成果包传到了群里,大家反应特别热烈。有人问我怎么做的,我说:“就是硬啃,没有什么捷径,多试几次工具,找到那个最关键的加密点,然后莽过去。”
这种自己动手丰衣足食的感觉,比单纯地玩游戏本身要爽多了。这波实践记录分享给大家,希望对那些想自己折腾点小东西的朋友有点帮助。