EVA2、汉化与我


结缘

2023年的时候,看完了EVA的TV,久久不能释怀,就是在同时期,看到了B站UP主Langley_D的EVA2解说视频,感到很治愈,旋即想找来玩。

看到有PS2和PSP双版本,且PSP版内容更多,不禁想购入一台PSP。

说起PSP,想起来十余年前,在高铁上看到前座的小朋友捧着PSP玩。当时是什么游戏不太记得了,只记得在猛推摇杆。另外就是还有零星的按PSP上方LR按键玩Loco Roco的印象。

在查询PSP相关资料的时候,发现PSP有自己的SDK,可以用来写自己的游戏。不知为何开发嵌入式设备的游戏这个概念忽然很吸引我。

曾几何时,为了跨平台,所有的游戏和应用都变成一个样子。以往的游戏会利用硬件的特性进行开发,像是多点触控出现以后涌现出“切水果”“切绳子”之类的游戏;PSP的时代为了它的摇杆和LR按键,也是研发了众多游戏。我很喜欢应用针对一个稳定不变外形的硬件进行开发。

可能是对触控和鼠标的厌倦,使我对摇杆产生痴迷,这种痴迷不知为何又转移到了对PSP的喜好上。

上面是说了对PSP的缘份,第一是儿时的记忆,第二是EVA2游戏的吸引,第三是对这台设备的偏好。

EVA2游戏

喜欢游戏,自然会去找汉化。汉化找不到,就会找讨论。

事实上并非一无所获,对于这款游戏的讨论很早就存在了。 游戏是在2006年发售的,恰好在新剧场版推出之前,现在我能找到的最早的讨论集中在2010年前后。总之是新剧场版公映之后了。

在百度贴吧“eva吧”上还能够有一些讨论,包括早期的传奇人物OriginalX等对这款游戏作了介绍。到后来就出现了一些文本和攻略的翻译。

至于汉化,幸运的在网络上找到了英语本地化的仓库。后来经过研究,发现它们做的成果真不少,而且绝大部分的逆向都已经完成。当然当时面对一堆杂乱的代码也没什么头绪就是了。

关于这款游戏的历史,也有一些趣事。

2004年PS2版本发布,庵野秀明亲自操刀。这是他在游戏发布会上的照片。还有芝村裕吏在场,后者贡献了游戏中一个“关卡”的名称。

Image

2003年10月30日,EVA2(PS2)完成纪念发布会

汉化

汉化,说的好听,其实就是逆向工程。逆向工程首要的就是要对处理器的指令集有了解,或者说就是看得懂汇编。现今的x86-64架构,或称amd64架构,大家都很熟悉了,指令集什么的也有了解。PSP的处理器是MIPS架构的,鉴于MIPS已经倒闭,许多人也只在书本上听说过它。尽管索尼有多台设备使用的是MIPS处理器。

MIPS指令集属于RISC指令集,具有一些通用的特点,比如说指令定长、在寄存器里保存返回地址(x86-64一般是直接使用栈上的返回地址)、先执行下一条后跳转(一些针对流水线的优化)啦等等。

PSP使用的MIPS3000是32位的,意味着虚拟地址空间就4GB,当然了,相对于它16MB/32MB的内存来讲是绰绰有余。

用于逆向二进制文件的工具很多,有大名鼎鼎的IDA,也有新晋的GhidraPSPDEV社区都提供了相当多的支持。

说到PSPDEV社区,国际上对于PSP的热情相当高,使我常常感到PSP并不是一个已经死去的平台。围绕着它的工具链年年在更新,在最新的平台上开发并没有什么割裂感。可能国内对于PSV更加热衷一些,或许因为它使用的是ARM处理器。

也是坚实的社区基础让我坚定了继续探索PSP开发的信念,毕竟如果连环境都搭不起来,谈什么开发。

学习

前面提到PSP仍有很多新应用,但是对于汉化的场景,可供参考的资料也并没有那么多。有时候为了实现一两点功能,需要深入大量没有注释的源码。幸而还有ChatGPT的辅助。虽然当时的LLM并没有现在这么强大,但在提供宏观理解和给予我信念方面还是起到了相当大的作用。

当时研究了几个今年的汉化项目,从中汲取灵感。又经过大量尝试。PPSSPP提供断点调试功能,给了我很大帮助。但是当模拟器可以运行而实机不行时,又经过了大量的比对和查询,通过观察现有可以运行的插件和自己的插件的差异,逐渐找到问题所在。

值得提到的是我在贴吧得到的帮助。当时我在寻找让PSP加载外部字体而不是默认字体的方法时在贴吧求助。发现一个存在多年的解决方案,这个方案通过把自己伪装成字体加载PRX,充当原始字体加载PRX的桥梁,在自己内部对函数调用的参数进行修改,十分巧妙。这个方法同时涉及PRX库导入导出的一系列知识,在我成功逆向出这个PRX的源码后,对于PSP 的 PRX Module 加载有了比较透彻的理解。这个理解也建立在 2007 年 Arissian 一篇文章《PSP Modules, Exports, Imports and Patches》之上,幸而上面提到很多的工具至今仍然是PSP开发工具链的一部分,内容还没有太过时。

项目

EVA Geeks在某年开启了一个英文本地化的项目,项目在GitHub上开源,当即Fork下来,围绕解析的代码搭建起外围的业务逻辑,包括读写数据库和命令行接口等等。

翻译的文本起初储存在Crowdin上,但是鉴于Crowdin对免费项目有字数限制,经过多方查询,发现近期不少项目都是在国内的Paratranz进行汉化文本的储存和维护。Paratranz免费且不对项目字数作限制,还提供了便于使用的API,不得不在此对这一本地化平台的维护者表示由衷的敬意。

在项目的早期,吸纳了好几位有识之士,作为翻译和校对的志愿者进行了大量的工作。可惜由于早期项目工作流的破碎和代码的不可靠,没能很好的组织起来,导致现在和这几位朋友也失去了联系。在此表达由衷的感谢,希望能再次联系到我们,在项目的贡献榜上一定会镌刻你们的名字。他们是:Liana384, mel

后续随着对于项目需求的熟悉,代码不断重构,目前开发环境已容器化,导入导出也有了比较完善的命令行接口。

AI

这几年是LLM爆发的年代,不同厂家轮番刷榜,给日文翻译也带来了新的变革。 在前期由于各个厂商API调用的服务都存在供应不足,主要是用一些现存占用不大的模型在本地进行翻译。这其中包括Qwen的一些模型,还有微调后的SakuraLLM

在编码的过程中,随着Cursor的流行和后续GitHub Copilot的发力,Vibe Coding 越来越变得常用。但这主要是2025年的事情了,前期的模型对于需求的理解很有限,最多是提供一些建议和简单逻辑的编写。

尽管如此,AI 在本项目中仍发挥了关键作用。以其中一个案例为例:资源文件中的文本采用 SHIFT_JIS 编码,而 PSP 的字体库要求输入 UTF-16,因此游戏的二进制文件中实现了一套编码转换函数。

将这段函数的汇编代码提交给 DeepSeek R1 后,它敏锐地识别出其中包含一段二分查找逻辑。正是这一段用于偏移量映射表的二分查找,决定了某个字符相对于第二张表表头的偏移量;而第二张表中存放的正是所有 SHIFT-JIS 字符对应的 UTF-16 编码。

在理解这一机制之后,修改字符解码流程就变得更加直接,也更容易构建整体的编码转换思路。

创新

感觉就做了一点微小的贡献。

既然本项目集成自英文本地化项目,有必要简述一下对于原语言为日文的游戏,中文本地化和英文本地化的难点所在。

对于英文本地化,不存在字符上的问题,几乎所有编码都会覆盖英文26个字母。以SHIFT_JIS为例,完全兼容ASCII码。唯一的问题在于内存。日文一个字符占2字节(UTF16/SHIFT-JIS),英文一个字符占1字节,但是一个10个字的日语句子翻译成英文往往远远超过20个英文字母,也就是说,翻译后的文本所占空间将远大于原文。这对于在内存中往往紧密排列的字符串来说是致命的,因为一旦字符串过长,很可能覆盖到后续的文本甚至于代码。

在EVA2的英文本地化项目中,原作者通过劫持strcpy等函数通过查表对日文字符串进行替换,翻译好的英文文本放进了一段没有被使用的高位内存,这也使得这个补丁无法在真实的机器上运行。

而对于同样通常占用2个字节的中文,日文翻译为中文长度往往还要减少,因此不存在空间上的问题,直接提前使用'\0'截断即可。

真正的问题主要涉及两个层面:字库编码
首先,程序必须能够显示正确的中文字形;其次,需要以合适的编码方式来表示中文,并确保程序能够正确解析这些编码。

一种最原始的做法,是直接把日文字形替换成中文,然后仍然在原本的日文编码范围内,用修改后的映射来存储汉字。这样的好处是简单粗暴,但缺点同样明显:原有的日文文本在加载新字形后会变成乱码

在本项目中,我们对 SHIFT-JIS 转换至 UTF-16 的流程进行了定制化修改。由于 SHIFT-JIS 属于变长编码,它会根据首字节来判断当前字符占用 1 字节还是 2 字节。我们通过调整解析逻辑,让原本按单字节处理的部分也能支持解析“双字节字符”,从而“借用”这些原本未被使用的双字节编码来存放汉字。

这样做的结果是:

  • 日文区原本的双字节编码保持不变;
  • 只有部分半角片假名区域被重新利用,而该区域在游戏中恰好未被使用。

最终效果是:未翻译的日文文本依旧能正常显示,同时翻译后的中文也不会受到影响,两者可以无冲突共存。

这些实现细节可在项目代码仓库中进一步查阅。

进展

今年7月份左右的时候内部讨论了一个会议召集了一些小伙伴分配了一些任务。按照设想,先完成剧情1的翻译然后放出预览,之后在慢慢完善。大家的热情都很高涨,群里一直在针对各种术语进行讨论,我对EVA的各种翻译版本和使用的典故也有了全新的理解。在日本的小伙伴还购买了相关的攻略。

他们是:hanDragon20, Belfraw, Tianying-exe, Asuka, yokuse, Laolv000, カロモリモキナエ

由于一些缘故,整个秋天比较繁忙,无心顾及汉化事项。但是小伙伴们还是坚持在翻译。特别是Belfraw老师,在本文撰写时还在继续提交翻译。

之前断断续续地对项目中的图片用PS修改了一部分,但是配套的代码一致没有写,如今在AI的帮助下相关的业务逻辑已经很快实现。

去年这个时候,我对自己的目标是争取在2026年,也就是这款游戏发售20年之际完成汉化,希望这个目标能够实现。

今年(2025年)是EVA开播30周年,在年末撰写这篇文章。