朋友给我发来一个游戏汉化包。
「帮我看看,这游戏好像有点问题。」
我当时还挺自信。
不就是个游戏吗?能有什么大问题?
直到我看见汉化包附带的说明书。
上面郑重其事地写着:
第一次玩,请先启动原版游戏,选完一张卡牌,再退出游戏。之后才能正常使用汉化版。
如果不这样做,游戏就会出现一个奇怪的问题:
无论你怎么打,牌组里永远只有三张拳头。
我盯着这段话看了半天。
「等会儿。」
「我下载汉化版,是因为我看不懂原版。」
「你现在告诉我,要想玩汉化版,得先玩原版?」
朋友:「对啊。」
我:「那我还汉化个什么劲?」
朋友:「所以才让你修啊。」
……好有道理,竟然无法反驳。
事情就这样开始了。
#一、三张拳头闯天下
先介绍一下这个游戏。
它叫《Dead End City》,是一款有卡牌战斗元素的游戏。
简单来说,你可以把它想象成一场考试。
游戏会给你一副牌,每张牌代表一种本领。有的可以攻击,有的可以防御,有的能帮你做些特殊的事情。
你需要根据情况选择合适的牌,才能赢得战斗。
正常情况下,新玩家开始游戏时,应该拥有十张牌。
虽然不一定张张厉害,但至少能打出一些花样。
可朋友手里的汉化版不一样。
进入战斗后,游戏只给了三张牌。
拳头。
拳头。
还是拳头。
没有防御,没有特殊技能,也没有其他选择。
这感觉就像参加一场允许带各种文具的考试。
别人带了铅笔、橡皮、尺子、圆规。
你打开文具盒。
里面躺着三块橡皮。
而且还不能换。
更离谱的是,游戏开始前明明让玩家从三张稀有卡牌里选一张。
你认认真真挑好了。
进入战斗。
没了。
你选的卡牌仿佛从来没有存在过。
「这游戏是不是故意整人?」
朋友问。
「应该不是。」
我想了想。
「但它确实整到你了。」
#二、我首先怀疑汉化组干了坏事
游戏有原版,也有别人制作的汉化版。
原版能正常运行,汉化版却不行。
按照一般人的直觉,问题自然出在汉化过程中。
这就像一本原本好好的小说,经过翻译后,突然少了几个角色。
你肯定会怀疑翻译时漏掉了什么。于是我决定调查。
不过,在调查之前,得先弄明白一个问题:
汉化到底改了什么?
很多人以为,汉化游戏就是把日文或者英文替换成中文。
实际上,游戏里的文字并不总是单纯给人看的。
有些文字是展示给玩家的。
比如:
「开始游戏」
「退出游戏」
「获得一张卡牌」
这些当然可以翻译。
但还有一些文字,是游戏内部用来辨认东西的。
比如某张卡牌叫什么、某个物品叫什么。
这些名字看起来也是文字,却可能承担着另一项工作:
充当身份证。
举个例子。
假设学校里有个学生,名字叫张三。
班主任手里有一张名单:
张三、李四、王五。
每天上课,老师按照名单点名。
现在有位热心同学,觉得「张三」这个名字不够好听,于是把张三的胸牌改成了「闪电侠」。
可班主任手里的名单没改。
第二天点名:
「张三!」
没人答应。
老师又喊:
「张三!」
还是没人答应。最后,老师在考勤表上写下:
张三,缺席。
而张三本人正坐在教室里,胸前挂着闪闪发光的「闪电侠」。
人没有消失,只是名字对不上了。
游戏里也可能发生同样的事情。
当然,这时候的我还不知道,自己已经非常接近答案了。
我只是隐约觉得:
汉化可能不小心改掉了什么不该改的东西。
#三、我查了半天,什么都没查出来
接下来,我开始比较原版和汉化版。
我原本以为,汉化组可能改动了大量游戏内容。
结果一查,发现游戏主要的程序文件居然完全一样。
这意味着什么?
可以把游戏想象成一家餐厅。
程序负责告诉厨师怎么做菜。
游戏资料负责提供菜谱、菜单和食材信息。
现在两家餐厅的厨师工作流程完全一样,只有菜单和资料不同。
那么问题很可能不在厨师,而在菜单。
调查范围一下缩小了。
我顿时来了精神。
既然如此,那就看看汉化组到底改了什么!
我检查了游戏里的文字。
检查了卡牌资料。
检查了各种可能被改坏的名称。
还检查了汉化过程有没有弄乱文件之间的对应关系。
查了很久。结果呢?
没发现明显问题。
卡牌还在。
数值没坏。
资料也没有莫名其妙地丢失。
那些看起来最可疑的地方,竟然一个比一个正常。
我开始怀疑人生。
朋友:「怎么样了?」
我:「目前可以确定,游戏确实有问题。」
朋友:「这个我知道。」
我:「而且问题很隐蔽。」
朋友:「所以呢?」
我:「所以还在查。」
朋友:「……」
气氛十分祥和。
更尴尬的是,我中途还犯了一个统计错误。
游戏里的资料分散放在不同文件中,而不同文件恰好可能使用相同的编号。
我却把编号相同的资料当成同一个东西。
结果统计出来的数量莫名其妙少了一大截。
我对着这个错误数字研究了半天,还认真分析为什么会少。后来才发现:
不是游戏把东西弄丢了。
是我数错了。
这就像两个班里都有一位学号为 01 的学生。
你统计全校人数时,却认为他们是同一个人。
最后发现学校凭空少了几十个学生。
你还怀疑学校发生了什么神秘事件。
其实只是自己的统计方法出了问题。
我自己坑了自己一次游戏资料分散在不同文件里,不同文件却可能用同一个编号。我把编号相同的资料当成同一个东西,统计出来的数量就莫名其妙少了一大截,还对着这个错数字认真分析了半天。
发现它纯属运气。看起来合理的错误结论,比找不到答案危险。
朋友听完我的解释,大概很难对我的调查能力产生更多信心。
但至少,我排除了一种可能。
游戏资料并没有像我最初怀疑的那样,被汉化组大规模破坏。
那么,问题究竟在哪儿?
两个版本的安装文件,逐个体积对照
| 文件 | 汉化版 | 原版 |
|---|---|---|
GameAssembly.dll |
32,678,912 | 同 |
UnityPlayer.dll |
29,952,536 | 同 |
baselib.dll |
418,840 | 同 |
boot.config |
180 | 同 |
data.unity3d |
258,513,497 | 257,817,456 |
global-metadata.dat |
7,264,092 | 5,470,096 |
#四、朋友一句话,把我拉回现实
我研究了很久游戏文件。
各种资料看了不少。
各种猜测也提了不少。
可有件最简单的事情,我居然一直没有认真做。
亲自把两个版本从头玩一遍。
这听起来很荒唐。
修游戏 bug 的人,居然没有先好好玩游戏。
但这种事情并不少见。
因为当你觉得自己已经掌握了某种高级调查方法,就很容易忘记最简单的办法。
就像家里的灯不亮。
你已经开始研究电路图了。结果旁边的人问:
「你检查开关了吗?」
……
于是我终于决定,先别研究那些复杂文件了。
直接做实验。
第一轮,原版游戏。
删除旧存档,让游戏从头开始。
进入游戏。
选择卡牌。
开始战斗。
一切正常。
总共十张牌。
第二轮,汉化版。
同样删除旧存档。
同样从头开始。
同样选择卡牌。
进入战斗。
三张拳头。
只有三张拳头。
连刚才选的稀有卡牌都没了。
这下事情终于清楚了。
问题不是游戏运行一段时间后突然坏掉。
也不是某张卡牌偶尔无法使用。
而是:
汉化版第一次创建玩家牌组时,就已经出错了。
这个发现非常重要。
因为它让调查从「整个游戏哪里坏了」,缩小成了「游戏第一次发牌时发生了什么」。
就像调查一家快递公司为什么丢件。
你原本怀疑运输途中出了问题。后来发现:
包裹根本没有成功出库。
调查方向立刻就变了。
#五、真相:翻译把游戏的身份证改了
有了这个线索,我重新检查游戏最开始应该发给玩家的卡牌。
这一次,终于发现了问题。
原版游戏里,有几张卡牌使用日文名称。
其中三张叫:
「リロード」
「手癖」
「隠れる」
汉化组把它们翻译成了中文。
分别是:
「重新加载」
「顺手牵羊」
「隐藏」
看到这里,你可能会问:
「这不是翻译得挺正常的吗?」
没错。
问题恰恰在于,翻译本身没有明显错误。
错的是翻译了不该翻译的地方。
原来,这几个日文名称不仅是给玩家看的文字。
它们还是游戏内部寻找卡牌时使用的名字。
还记得前面张三和闪电侠的故事吗?
这里发生了几乎一模一样的事情。
游戏的卡牌资料库里,仍然登记着:
「リロード」
但负责给玩家创建初始牌组的那部分内容,已经被汉化成:
「重新加载」
于是游戏开始找卡牌。
「请给我一张『重新加载』。」
资料库翻了翻。
「没有。」
「那『顺手牵羊』呢?」
「也没有。」
「『隐藏』总该有吧?」
「还是没有。」
游戏懵了。
明明卡牌资料都在,却怎么也找不到。
因为在电脑看来:
「リロード」和「重新加载」不是同一个名字。
就像张三和闪电侠。
人类知道它们可以指同一个人。
但电脑不会自动猜测。
电脑只会按照事先规定好的名字去寻找。名字不一致,就可能找不到。
这就是程序里很常见的一类 bug。
我们把它叫作「查找失败」。
听起来很专业,其实一点也不神秘。
就像你拿着一张写着「三年二班」的纸条去找教室。
结果学校把教室门牌改成了「初三(2)班」,却忘了更新指路牌。
教室明明还在那里。
但如果你只会按照原来的名字找,就可能一直找不到。
游戏也是一样。
更有趣的是,这个游戏还有一套应急方案。
当正常牌组没能创建成功时,它会退回到一个简单的备用状态。
也就是那三张拳头。
所以,游戏并不是故意只给玩家三张拳头。
而是:
它想给你正常的牌,却找不到其中几张,于是只能拿出备用的三张拳头。
至于为什么汉化组没发现?
我猜,很可能是翻译工具把这些名字当成了普通文字。
毕竟,同样是几个日文字符,光看字面,谁知道它们到底是展示给玩家看的,还是游戏内部使用的?
翻译工具不一定知道。
翻译人员也不一定知道。
于是,一个看起来再正常不过的翻译操作,就悄悄埋下了 bug。
| 字面量 | 对应卡牌 | 汉化版 |
|---|---|---|
Attack |
攻撃 | 未改 |
Defense |
防御 | 未改 |
リロード |
リロード | 改成「重新加载」 |
手癖 |
手癖 | 改成「顺手牵羊」 |
隠れる |
隠れる | 改成「隐藏」 |
#六、说明书竟然从一开始就是对的
这时候,我突然想起了最初那份说明书。
它要求玩家:
先启动原版。
创建角色。
选一张卡牌。
再退出,启动汉化版。
我最开始还觉得这要求非常离谱。
现在却发现,它居然很有道理。
因为游戏第一次运行时,需要给玩家创建一份存档。
存档里会记录玩家拥有的卡牌等信息。
原版游戏认识那些日文名称,所以能够正常创建牌组,并把结果保存下来。
之后再启动汉化版,游戏就可以直接读取已经创建好的牌组。
不需要重新按照那些出错的名字寻找卡牌。所以就能正常玩了。
这就像学校有一份学生名单。
汉化版负责登记新生时,总是认错名字。
但如果先让原版把学生全部登记好,汉化版只负责查看现成名单,就不会触发同样的问题。
说明书提供的办法确实有效。
只是它没有真正修好问题。
它只是让玩家绕开了出错的环节。
想到这里,我心情有点复杂。
原来那份被我嫌弃的说明书,从一开始就在认真告诉我问题发生在哪里。
只是我没听进去。
朋友:「所以说明书没骗人?」
我:「没骗人。」
朋友:「那你之前说它在甩锅?」
我:「……」
朋友:「?」
我:「科学研究允许修正观点。」
#七、修好这个 bug,居然只需要改三个名字
找到原因后,修复就简单多了。
既然游戏内部寻找卡牌时,必须使用原来的日文名称。
那就把那三个被误译的内部名称改回去。
注意,这里不是把整个游戏重新变成日文。
玩家看到的中文仍然保留。
我们只需要让游戏内部使用正确的名字。
这就像学校允许张三继续使用「闪电侠」这个昵称。
但班主任点名时,名单里仍然保留「张三」。
这样既不影响同学们叫他闪电侠,也不会让老师找不到人。
我把那三个内部名称恢复后,重新启动游戏。
这一次,没有先运行原版。
也没有提前准备存档。
直接打开汉化版。
开始新游戏。
选择卡牌。
进入战斗。然后——
成功了!
十张牌。
正常的攻击牌、防御牌、特殊牌,全都回来了。
刚刚选择的稀有卡牌也好好地待在牌组里。
界面依然是中文。
游戏终于不再逼玩家用三张拳头闯天下。
最让人哭笑不得的是:
折腾了这么久,最后真正修复的地方,只有三个名字。
制作补丁时,实际新增的文字数据只有 27 个字节。
什么概念?
大致相当于一小句话所占的存储空间。
一个游戏里有成千上万条文字和大量资源。
我们查了那么久。
最后却只需要纠正这么一点点内容。
就像你花了一整天检查学校的广播系统。最后发现广播没坏。
只是播音员把三个学生的名字念错了。
#八、我以为修完了,结果又闹了个笑话
故事到这里,本来应该结束了。
可我偏偏又发现了一个「问题」。
原版游戏运行后,某次检查中出现了两个配置文件。
而修复后的汉化版,没有看到它们。
我立刻警觉起来。
「等等,这里可能还有问题!」
于是我把这个发现写进了报告。
意思大概是:
虽然牌组已经修好了,但汉化版可能还存在其他异常。
朋友看完,表示还得继续确认。
这次我学乖了。
不再只凭印象比较。
而是让原版和汉化版从完全相同的起点出发。
两边都清空存档。
两边都进入游戏。
两边都选卡。
两边都进入战斗。最后正常退出。
然后再检查产生了哪些文件。结果发现:
两个版本的表现完全一样。
都只生成了同一种存档文件。
我之前怀疑缺失的那两个配置文件,根本不是这个游戏正常游玩时必须生成的东西。
甚至朋友电脑上,在我开始调查之前留下的存档目录,也没有那两个文件。所以这次不是汉化版有问题。
是我有问题。
我把两次不同条件下看到的现象,误当成了游戏本身的差异。
这就像你发现:
星期一,小明带了雨伞。
星期二,小红没带雨伞。于是你郑重宣布:
「小红的书包缺少雨伞功能。」
却完全忘了检查星期二有没有下雨。
朋友:「所以又没问题?」
我:「没问题。」
朋友:「那你之前写的报告?」
我:「需要修改。」
朋友:「……」
我:「你看,这说明我们的调查非常严谨。」
朋友:「你先把报告改了。」
好吧。
#九、为什么三个字就能让整个游戏出问题?
这件事最有趣的地方,其实不是修复有多困难。
而是:
为什么只是翻译了几个名字,就能造成这么严重的后果?
因为我们平时看到的软件,表面上是一整个东西。
但在内部,它其实由许多互相配合的小部分组成。
有的负责显示画面。
有的负责保存进度。
有的负责管理卡牌。
有的负责判断玩家下一步能做什么。
它们需要通过事先约定好的方式互相交流。
其中一种最简单的方式,就是使用名字。
比如:
「我要找编号为 A 的卡牌。」
「我要读取名为 B 的存档。」
「我要显示名称为 C 的图片。」
只要大家都遵守同一套约定,就能正常工作。
但如果有人单方面修改了约定,问题就来了。
负责寻找卡牌的部分说:
「我要『重新加载』。」
负责保存卡牌资料的部分说:
「我这里没有这个名字,只有『リロード』。」
于是双方都没有坏。
卡牌也没有消失。
但它们就是无法合作。
这也是为什么有些 bug 特别难找。
出问题的地方,不一定是坏掉的地方。
玩家看到的是卡牌消失。
你去检查卡牌资料,发现它们完好无损。
玩家看到的是牌组只有三张拳头。
你去检查战斗系统,发现它也正常运行。
真正的问题,藏在两个部分互相交流的地方。
就像两个人约好在「人民广场」见面。
一个人去了城市东边的人民广场。
另一个人去了城市西边的人民广场。
两个人都准时到了。
都没有走错自己理解的地点。
但就是见不到面。
问题不在于谁不会走路。
而在于他们没有确认「人民广场」究竟指哪一个地方。
软件里的 bug,有时候就是这么产生的。
#十、最后,我们究竟修好了什么?
最后,我把修复内容整理成了一个补丁包。
除了修正那三个名字,还处理了汉化整合包里缺少游戏启动文件的问题。
为了避免补丁本身又制造新麻烦,我还给它加了几道保险。
比如:
修改前先检查游戏文件是不是对应的版本。
修改前自动备份。
如果已经修复过,就不重复修改。最后再从头测试一次。
确认新玩家可以直接启动汉化版,正常创建牌组。
补丁包在这里,需要的自取:DeadEndCity_fix.zip(2.4 MB)。用法、参数和已知限制都写在包内的 README.md 里。
| 项目 | 值 |
|---|---|
| zip 校验和 | ad9ee7c4f87d9302ad2283be51a90bf50cf236cc2dca4c6121c1ebb5906fa315 |
| 包内校验 | SHA256SUMS.txt,覆盖打补丁脚本、元数据、exe 与说明文档 |
至此,朋友最初提出的问题终于解决了。
现在回想起来,整件事情相当滑稽。
朋友只是想玩一个汉化游戏。结果发现游戏只给三张拳头。
我接手调查,先怀疑汉化包乱改游戏。
查了半天,没找到问题。
中途还数错了一次资料。
后来终于发现,是三个卡牌名称被翻译了。
修完之后,我又误以为游戏少了配置文件。
最后还得重新做实验,证明自己刚才的怀疑是错的。
折腾一大圈。
真正需要修改的内容却少得可怜。
但我觉得,这次经历至少说明了三件事。
第一,bug 不一定来自复杂的错误。
有时候,一个名字不一致,就足以让整个功能失效。
第二,看到问题的地方,不一定就是问题发生的地方。
卡牌消失,不代表卡牌文件坏了。
也可能只是游戏找不到它们。
第三,调查问题时,不能因为自己的猜测听起来很合理,就把它当成事实。
尤其是我这种查着查着就容易开始脑补的人。
有时候,认真做一次简单的对照实验,比研究半天复杂资料更有用。
至于朋友……
他终于可以正常玩游戏了。
而我也终于不用再面对那三张拳头。
不过,这件事给我留下了一个奇怪的印象。
以前看到游戏汉化,我总觉得翻译就是让玩家看懂文字。
现在才知道:
有些文字是写给玩家看的。
有些文字却是写给电脑看的。
翻译前者,是在帮助玩家。
翻译后者,却可能让电脑连自己的东西都认不出来。
所以,下次如果你发现某个汉化游戏突然变得奇奇怪怪……
先别急着怀疑游戏设计师。
也别急着怀疑电脑。
说不定只是有位热心的翻译,把游戏里的「张三」改成了「闪电侠」。
而游戏找了半天张三。最后只好递给你三张拳头。
评论