2021.10.14

尝试从游戏中提取文本

以Nintendo Switch游戏为例。

我在GitHub上有一个项目,专门用于记录任天堂官方中文化游戏的文本。这个项目对于喜欢确认译名的人来说应该比较有帮助,如果帮到了您,您可以选择给它一个Star。

这篇笔记主要就是来讲一讲这个项目里面的文本是怎么来的。注意:本文不涉及盗版游戏的获取方式。

文本在游戏中的存储

在提取文本之前,首先要定位文本的位置;而要定位文本的位置,首先得获得游戏文件。很尴尬的一件事就是:对于主机游戏来说,由于主机的封闭性,一般只有破解过的主机才能够提取游戏ROM。如果没有破解的主机,那么就只能够通过盗版网站获取ROM了。由于这并不是本文的重点,我不打算深入讨论这个问题,但是有一件很讽刺的事就是,由于“偷跑”的存在以及互联网的传播,盗版游戏反而容易比正版游戏提前获得。而对于电脑游戏、手机游戏来说,游戏文件的获取一般比较简单。

在获取游戏文件后,有时还需对文件进行“拆包”。这里的拆包大多是因为游戏厂商出于压缩容量、减少小文件数量等考量而将多个文件打包成一个,为了获取其中的单独文件而需要进行的步骤。对于主机游戏来说,游戏文件一般被称作ROM,其中包含了可执行文件(exefs)、数据文件(romfs)等多种文件,而游戏文本一般存储于数据文件中。对于常见的打包格式来说,由于对其感兴趣的人较多,因此可以使用的工具也比较多。例如,对于Nintendo Switch游戏的ROM文件,可以使用Ryujinx提取其中的romfs;对于任天堂自家的常用打包格式,可以使用Switch-Toolbox进行拆包;而对于跨平台的游戏引擎Unity,则有专门的工具AssetStudio用于分析数据文件。

接下来需要定位文本的位置并提取文本。一般来说,包含文本的文件多以“Message”“Text”“Localization”等词语命名,或者按语言代码“ja”“en”等词语分类。其保存路径因游戏而异,有时也需要一些突如其来的想法才能找到文本。如果没找到的话,可能是拆包不彻底,也可能是厂商用了特殊的命名方式(比如使用了母语+缩写)。虽然也可能是保存在了可执行文件中,但这样一般不方便维护,而且不利于本地化翻译,对于国际厂商来说一般不会这么做。

从文件中提取文本

定位了文本所在的文件之后,剩下的就是将文本提取出来了。如果厂商使用的是常见格式(如.txt.csv.xml.json)等,则可以直接使用文本编辑器打开,或是自己编写简单的脚本批量读取、转换。但是,基于存储大小、读取速度、定位方式等多种因素考虑,游戏中的文本一般不会保存为常见的格式,而是保存为厂商特有的二进制文件。例如,近年来任天堂自家的游戏多以.msbt格式存储文本,对于这一格式的研究也已经比较深入,除了前文的Switch-Toolbox之外,还有一个在Nintendo 3DS时代常用的工具Kuriimu也能读取.msbt格式的文件。此外,这两个工具也能读取一些其他的常用文本文件格式,可以参考两者的GitHub项目主页查看。如果这两个软件都无法打开文本文件,还可以尝试Google一下文件格式 + Extract或类似字样,有时可以找到前人已经写过的工具。

当然,并不是所有的文件格式都有前人分析。对于搜索无果的情况,可以尝试先用十六进制编辑器打开(如HxD),然后读取疑似的字节串,查看其UTF-16或UTF-8解码的结果。对于国际厂商来说,文本编码多为这两种编码,但也有例外,如厂商可能使用Shift-JIS编码日语,或GB18030编码简体中文;如果是这种情况的话,可能真的需要一些灵感了。如果字节串可以读出有效信息,表明文本文件应该是没有加密的,可以编写脚本读取。

在提取出文本之后,有时还要处理文本中存在的控制符。如果控制符本身就是可见字符(如使用了类似HTML标记的<>),一般无需处理;而对于控制符本身是不可见字符的情况,就会变得有些复杂。.msbt格式的控制符就是属于后一种情况,但Kuriimu等工具对于控制符的处理效果不佳,建议自行分析控制符的使用方式。

笔记:一些不常见的文本文件格式

.wmbt文件:.msbt文件的后继者?

在《分享同乐!瓦力欧制造》(发售日:2021-09-10)中,文本文件使用了.wmbt的格式。这种格式的结构与.msbt几乎相同,仅仅是部分字节有了变化。原有的工具无法直接使用,但经过简单修改后仍可提取文本。

参考代码:GitHub Gist

BTXT文件:不一样的.txt文件

在《密特罗德 生存恐惧》(发售日:2021-10-08)中,文本文件使用了.txt格式,但这些文件无法用文本编辑器直接打开。用HxD查看之后发现Magic Header是BTXT42 54 58 54),文字也基本可读,就是简单的ID + 字符串格式。

参考代码:GitHub Gist