1. 开始

不好意思,以前没写过这种文章,所以可能出现诸如意思表达不清,句子不通顺的地方,请见谅。

先简单自我介绍一下,本人是一个老galgame玩家,但是几乎不玩生肉,用的网站最多的就是忧郁的弟弟。开始接触生肉游戏的契机是在一个本子网站上看到一款游戏的CG开始的,时间不并不是很远,大概就是25年4月或者5月?这款游戏的名字叫《ボクのヒミツたいけん》,我被其中某个场景深深吸引了(我就不剧透了,如果很感兴趣的话可以自己玩一下),所以开始做自己从来没有做过的事。

首先找这款游戏的过程就是一波三折,正如前面所述,因为我以前几乎没有玩过生肉游戏,没有寻找渠道,也不知道该做些什么。当时是怎么玩的呢?我记得我起初是一边截图一边翻译这样来玩的,后面觉得太麻烦了,所以上网搜了一下,发现了Luna Translator这个软件,非常感谢作者,因为当时免费API老是会提示频率过快,自己还开了一个有道账号来玩。但是依然感觉麻烦不方便,然后发现Luna Translator有一个本地大模型的接口,就是Sakura模型,一点一点摸索,终于能好好玩这款游戏,突然发现2dfan原来已经有大佬上传补丁了(当时已经用有道翻译玩了不少内容了)。

这个经历让我对翻译作品产生了兴趣,当时搜到了GalTrans的GITHUB项目页面,但还不知道这个项目具体是干嘛的,但是上面的信息十分有用,告诉了我应该怎么翻译一个游戏的大概流程。我搜索了《ボクのヒミツたいけん》的制作组的其他游戏,果不其然,大部分都很对我胃口,所以我挑选了其中一个来尝试翻译,《ママクラブ四 ~正しい性教育を教えよう~》,我在2DFAN上传的第一个翻译补丁。

我借鉴了制作《ボクのヒミツたいけん》的西瓜大佬的补丁,依葫芦画瓢,首先收集工具,非常感谢GALTRANS提供的工具指引(虽然我把GALTRANS本身忘记了),用工具解包,之后将所有脚本文件都转成utf16,然后让AI写提取/替换的PYTHON脚本,最后让AI写了一个翻译脚本,这个脚本参考了llama的网页API以及Sakura模型使用的提示词(当时我已经彻底忘记了GALTRANS,完全闭门造车了)。之后就是在自家电脑上运行Sakura模型来进行翻译,最终补丁有不少小问题(比如选项没翻译,字体粗细不一等等),但是确实是我的一大步。

这个过程,让我开了不少眼界,同时也彻底开辟了一条玩生肉游戏的路。回顾过来,AI对我的帮助至关重要,就算10年前的我和现在的我一样大,也不可能走到这一步,就算有行动力肯定也会在中途放弃掉。尤其是AI生成代码这块,我翻译的99%代码都是直接由AI生成。我只需要将要做的事整理一下然后发给AI,然后进行调整。

2. 第一棒

这个过程中,我注册了2DFAN账号,所以偶尔会搜到其他的游戏,在翻译了几个C社游戏之后开始沾沾自喜,然后《Imitation Lover》这款游戏给我了当头一棒。

这个时候,我已经翻译了不少游戏了

- 《ママクラブ四 ~正しい性教育を教えよう~ 》

- 《おとうとしぼり》

- 《The・ガッツ!-マキシマム・マタニティ!》

- 《Let’s裸GO! ぼくラの自由研究》

这些游戏无一例外要么支持unicode,要么就是支持gbk,可以正常显示中文字符

但是这个《Imitation Lover》,它必须转区运行,这个时候我就真的不知道怎么办了,它没办法显示shift-jis不兼容的汉字,我应该怎么办呢?我翻出了我当时问AI的Prmopt

我现在正在翻译一个日语游戏,目前已经得到的成果和情报有
1. 能够提取游戏脚本文本以及替换文本为译文(gbk),并且成功在游戏上测试没有崩溃,只是显示乱码(因为是gbk)
2. 游戏渲染文字使用的是`TextOutA`
3. 游戏必须转日区才能允许,否则会崩溃
现在我离成功汉化只差一步之遥,就是让游戏能够正确显示gbk文本

要求,不准hook,我们通过打补丁来实现这一点

当时想的办法是通过打补丁,让游戏支持GBK,比如修改`CreateFontIndirectA`,使用`TextoutW`之类的,当时对这部分知识实在是太欠缺了,只能听AI瞎说。

最终讨论的矛头指向了GBK本身,游戏就是不支持GBK,为什么要强行用这个呢?当时已经半放弃状态了,所以有了下面的想法,当时只是随便想想:

我已经放弃了,我决定这样,我还是写一个dll,然后使用软件将导出的函数导入游戏程序中,然后修改游戏二进制代码,让它跳到我的DLL导出的函数上。
游戏文本不再用gbk保存,而是用shift-jis保存,如果是不支持的汉字,那么做一个映射,
就是用一个日语字符来充当这个中文汉字的替身,然后我的DLL接收到了进行映射,然后输出给textoutW。你觉得技术上可行不?有没有问题

然后AI给了我这样的答复

您的方案完全可行,而且是一个很聪明的折中方案!这种"替身字符映射"的方法在游戏汉化中很常见,
技术上非常可靠。让我为您详细分析这个方案的实现细节和注意事项:

让我一下子看到了希望,但是心里依然没底,因为这只是我随便想出来的,当时心里想的是,如果做不出来就算了,屈服吧,放弃吧,没关系的。

我已经忘记当时看到中文文本正确出现在游戏里是什么心情了,但绝对超级超级超级高兴!翻译这个游戏之后,我掌握了一定程度的逆向知识,并写了一系列相关的工具和DLL(实际上是AI写的)。

接触到VNTOOL也是后来的事情了,这个作者用了更聪明的方法,用未使用的shift-jis码点来充当替身字符进行映射

3. 第二棒

然后我就起飞了,“貌似汉化所有游戏都不是问题?”,我当时有了这样的想法,然后第二棒来了~~

《スノー・ラディッシュ・バケーション!!》

这款游戏只是顺带着翻译的,我的原定计划是只翻译《サマー・ラディッシュ・バケーション1.1》,因为我超喜欢踊子小姐,并且正好在GITHUB上找到了解封包的工具,只需要按照流程走就行了。不过作为一个系列,只翻译这一部实在是很难受(强迫症)。

但是呢,这个《スノー・ラディッシュ・バケーション!!》,Garbo可以解包脚本文件,但是并没有现成的封包工具,这意味着我要第一次自己写封包代码(实际是AI写)

当时我让三个AI来写这个封包代码,DeepSeek,ChatGpt,Gemini.2.5.pro,封包代码是根据GARBO的C#解包代码来写的,

当然最终是gemini-2.5-pro走的最远,但是所有AI生成的封包代码都有问题,问题在哪呢?首先我们是根据解包来写封包的,也就是说只要说只要解包能够正确读入正确的脚本就算成功。但是我们将封包后的文件再次解包,发现会有几个字节不一样,真的只有几个字节,但是这几个字节的变动会导致游戏在随机地方闪退。当时是真的很想哭,因为已经非常努力去做了,尝试过很多很多次(由于自己能力有限,所以基本上就是让AI不断查找问题然后修正错误)。这种想放弃的念头又一次产生了,放弃吧,放弃也是可以的......但是如果放弃的话,有点对不起自己,一次又一次看神乐被人渣止玩弄,开头那几个场景,已经看过无数次了,真的就要这样放弃了吗?

当时真的只是突然才产生的念头(不知道为什么每次都是快放弃的时候才会出现这种念头),

“我可不可以不封包,在游戏解包的那一瞬间直接将脚本替换上去不就好了吗?”

我纠结了大半天的封包问题,最后被我这种思路给绕过去了。虽然不是很完美,但是也让我对游戏汉化有了新的认识,其实不需要管怎么样做到,但是只要能够汉化,让它把中文显示在游戏里面就行了,这个思想对我后面的翻译补丁的制作影响深远。

4. 第三棒

汉化《スノー・ラディッシュ・バケーション!!》的经历让我对封包有了一些恐惧,所以基本上如果没有现成的封包工具,那么我就直接跳过封包。直到现在也是这样的观念。

贯彻着这样的理念,我又翻译了不少作品,还有一些因为2DFAN已经有翻译补丁了所以没有上传。

给了我第三棒的是这个游戏《Angel Type》

这是我第一次翻译minori社的游戏,这个游戏的恐怖的加密(什么什么几十个表之类的)别说是封包了,甚至让我没办法解包拿到游戏文本,garbo也没有这款游戏的密钥。

由于之前已经经历过了两棒,所以第三棒的时候,心里其实是比较冷静的。一般来说,我们不一定能写出封包代码,但是我们是一定可以写出解包代码的,因为游戏汇编有现成的解包代码可供参考。按照这个思路,我首先找到游戏解包的位置,然后将其汇编都发给AI,然后让他写出对应的PYTHON代码。

这个流程对于简单加密和简单解包是非常有效的,AI很快就会生成正确的PYTHON的解包代码。

但是这个游戏实在是非常的恐怖,我不是很懂加密,十几个表是AI分析之后告诉我的,在反复的沟通之后,发现写出正确的解包代码实在是过于困难。这下好了,封包可以绕,解包实在绕不了呀,我怎么都必须拿到游戏文本才行啊,不可能去游戏一句一句复制下来吧?欸,复制下来,我突然就想到一个办法,虽然可能很笨。

之前我说过游戏是一定会有解包代码的,那么为什么不能直接让游戏当我的解包工具呢?

我已经找到了解包的位置了,所以可以直接拿到解包后的文件,但是解包出来的是哪一段游戏脚本无法控制,所以我首先在DLL里写了验证每个脚本文件的HASH值,当脚本HASH与目前已经输出的脚本不一样的时候再进行输出。最后需要做的事就很简单了,我只需要将游戏整个流程CTRL一遍,自然就获取了游戏解包出来的所有脚本了。

5. 总结

写到后面好像有点偏题了,不过这三棒的确教会了我不少东西,让自己学会向现实(自己的技术力不足导致的)低头。

当然了,虽然文章基本上都在写问题如何出现,以及自己如何去绕过这些问题,但是我觉得最重要的是自己在做补丁的过程中也获得了各种各样的情绪,不仅是快乐,还有伤心和失望。以及最激励我继续翻译的,伙伴们的感谢。

同时也希望这个文章对其他做补丁的伙伴们有一些帮助,谢谢阅读这么长一篇文章。