简介: 本文讲述如何对游戏ROM进行汉化,并以实例带领读者破解一个Rom,最终实现部分文本对话的汉化。本文面向初学者,阅读本文仅需要预先了解16进制知识。
1. 汉化一个Rom的步骤
a. 找到游戏Rom中的码表(字符对照表);
b. 按照码表将Rom中的文本导出来, 存成一个文件;
c. 翻译这些文本;
d. 找到Rom中的字库, 并用中文字体替换;
e. 为中文字体再重新做一个码表;
f. 按照新码表将译文写回Rom中, 并更新相应的指针表;
g. 测试.
下面我以七龙珠RPG(SF8047)为例, 讲一下具体操作。
1.1 动手之前
在开始动手之前,你要先找到想汉化的游戏的ROM。注意,可不是随便从哪里down一个就行的!你要找到最完美的rom,这样才能保证不会因为Rom有问题,导致你的做了一半的工作白白浪费。具体说,就是要找经过GoodSnes和Romcenter校验过的Rom。
另外需要注意的是,要随时做好备份!原始的日文rom当然要做备份;对修改过的rom,我是每天作一次备份的。备份这个事,强调再多也不为过!
还有一个需要提醒的事,就是有些游戏同时有日文版rom和英文版rom。很多人以为用英文版的rom做汉化会简单一些。这是大错特错的!无论何时,记得一定要用日文版rom做汉化。这样做有以下几个原因:
1. 英文版的字库小,只有52个字母加一些标点;而要汉化一般需要1500-2000汉字,需要对字库做大幅扩容。日文版的rom一般都会带一些汉字,精打细算的话可能够用。
2. 英文版的字模小,一个字母也就8x12,而汉字一般是12x12到16x16大小,为了显示汉字,你又要asm hacking。
3. 英文版的对话远比日文长,为节省空间,一般做了压缩,这大大增加了破解难度。
2. 字库与码表
好,汉化任何游戏的第一步,都是要找到码表。什么是码表?请往下看。
2.0 一个例子
打开你的windows记事本, 往里面写入 "ABCDE你好", 然后保存为abc.txt。
现在的问题是,在这个文本文件里,记录了什么信息?是这几个字在屏幕上的图形吗?
现在,用UltraEdit(或其它你爱用的16进制编辑器)打开abc.txt, 按一下"Ctrl-H",切换到16进制显示,你看到的应该是下面这样子:
0000000000h: 41 42 43 44 45 C4 E3 BA C3 ; ABCDE你好
左边的000000000h是地址,右边的"ABCDE你好"就是这个文件显示在屏幕上的样子;注意!中间的 41 42 43 44 45 C4 E3 BA C3, 这才是真正记录在文件中的信息!
你可能看出来了,这绝不是这些字显示在屏幕上的图形。就算41-45是ABCDE的图形;“你好”两个字这么多笔划,也绝不可能用C4 E3 BA C3这几个字节就能完全记录下来。你是对的,这个文件里记录的只是字母(和汉字)的代码,并没有任何“怎么画这些字”的信息。那么“画字”的信息存在哪呢?打开你的C:\Windows\fonts目录看看,看见“宋体”、“楷体”等字体了吗?就是这里啊!
这说明了什么?说明PC机把如何显示文字的具体信息存在windows字库里;而我们平常写的文件(不管你是存成Word文件还是txt文件),里面只包含字的编码。
2.1 计算机是如何显示文字的
还是说刚才的abc.txt。你打开这个文件时,写字板程序先取出第一个字节41,然后,它去查一张对照表,这张表是这个样子的:
......
41 - A
42 - B
43 - C
44 - D
45 - E
......
从表中找到41对应字母A。现在计算机知道要在屏幕上显示"A"了,它就会从某个字库中(比如说宋体)去找字母A的字模(通俗的说就是如何画出宋体的A),并把字模显示在屏幕上。然后,取abc.txt的下一个字节42,以此类推。
那么,这张对照表就很重要了。它就是ASCII码表!所有PC上的公共标准。所以,你在自己机器上写的文件abc.txt,不会在朋友机器上显示成“KGTYU”,因为你们都用相同的ASCII码表!
2.2 SFC是怎样显示文字的
原理上基本和计算机一样。假设要显示的文本是"04 78 9A",码表是
......
04=孙
78=悟
9A=空
......
SFC先取出第一个字节04,查码表,是“孙”,再从字库里找到“孙”字的字模,显示在屏幕上;下一步取出78,查表是“悟”,显示字库里的相应字模,下一步...(算了,没稿费,不多写了,否则我打算写50个“下一步” :))
最后,“孙悟空”三个字就显示在屏幕上了。
2.3 SFC的码表
很遗憾,并不是所有的机器都使用ASCII码表,Machintosh就不用。而大多数游戏机,包括SFC,也都不用ASCII。不仅如此,各游戏开发小组根据自己的喜好和方便,随意安排每个字的编码,造成的结果就是:每一个Rom的码表都不相同!(标准的重要性在这里体现出来,要是有个统一标准,我们就不用费劲去找码表了,这也是为什么Microsoft总是力图让自己的产品成为标准)。
所以,Rom hacker的首要工作,就是找出码表。只有完成这步工作,才能按图索骥,顺利导出对话脚本、菜单、物品名等。
3. 寻找码表
3.1 最简单的情况-单字节码表
尽管每个SNES游戏用的码表都不一样,我们还是有规律可循的。对于英文字母,大家总是习惯按照字母表ABCDEFG....XYZ来排列顺序,SFC程序员也一样,所以假如"A" 的编码是1,那么"B"就是2,"C"就是3,以此类推。
同样,日文假名也是按固定顺序排列的(五十音图),如下图。
1 あ a 2 い i 3 う u 4 え e 5 お o
6 か ka 7 き ki 8 く ku 9 け ke 10 こ ko
11 さ sa 12 し shi 13 す su 14 せ se 15 そ so
16 た ta 17 ち chi 18 つ tsu 19 て te 20 と to
21 な na 22 に ni 23 ぬ nu 24 ね ne 25 の no
26 は ha 27 ひ hi 28 ふ fu 29 へ he 30 ほ ho
31 ま ma 32 み mi 33 む mu 34 め me 35 も mo
36 や ya 37 ゆ yu 38 よ yo
39 ら ra 40 り ri 41 る ru 42 れ re 43 ろ ro
44 わ wa 45 を o
46 ん n
现在虽然我们不知道他们的编码,我们却知道,"A"和"B"的编码差1,"D"和"H"
的编码差4。如果有个单词mana, 那么字母与字母之间的差值肯定是
m a n a
\ / \ / \/
11 -12 12
如果有工具能搜索差值,我们就能找到Rom中的文本。这种搜索叫“相对搜索”,(relative search)。我推荐的工具就叫Relativeful search,在狼组网站上可以下载。它既能输入英文搜索, 又能输入数字搜索,还允许跳过几个字节输入。
好,进入游戏,找一段文本,如左上图,抄下第一句话,根据上面的表格标上数字:
と つ ぜ ん ゃ っ て き た
20 18 ? 46 36 ? 19 7
现在打开Relative search: 按"Open File"选择Rom,在"Values"后面填20,因为是十进制所以"Decimal",按"Add Value",20会出现在左下的"Values"列表里。如法炮制输入18,下一个值“ぜ”我们不知道,没关系,按一下"Skip value"跳过它。继续输入46和36。有五个就足够了。现在按下"Relativeful Search"按钮,等一下,右下的"Result"中会显示查到的结果。
OK! 找到一个。现在用UltraEdit(或你爱用的十六进制)编辑器,打开DBZrpg.smc。 找到$03C6EC处,如图。这里是不是正确的地址呢?我们随便改几个值,再进游戏看看。
看有没有变化就知道了。把头四个字节"17 15 A8 31"全改成17,存盘,进入游戏。看看最上面的图,怎么样!头四个字全是“と”。说明我们找对了这句话的位置了!
现在我们知道17对应“と”(注意这里是十六进制,换成十进制是23)。由此可以推算出あ是04。好,可以把已知的部分码表做出来了。打开记事本,照这样写:
04=あ
05=い
06=う
07=え
.......
是否写起来很麻烦?这里推荐狼组hdw1978写的Table Maker,如图,选好“あ”和04,一按“生成对照表”马上就成了!是不是很方便。注意它有个小bug:假名"を"被遗漏了,你需要手动把它加入码表。这个工具最简单,狼组网站上还有其他更好的码表工具,大家可以自己试用。
你要是细心的话,应该还能看出,FF就是换行,FF FF是一段话结束。在码表中加一项:
FF=
其他的日文怎么办?太简单了,你只要在$03C6EC处随便乱写些数,再进游戏看看显示是什么不就成了?这些工作就留给你去做了。狼组有完整的龙珠RPG码表下载。看看跟你做的是不是一样?
对于含有大量汉字的rom来说,如果都一个个去试太麻烦了。一般来说,码表的顺序与字库的排列顺序是一致的,所以,如果你能找到游戏的字库,就可以直接把码表按顺序抄下来。
新手可能还有个问题:那些日文汉字都是输入法里找不到的,要怎样输入啊?最简单的就是用南极星里附带的输入法了。可以很快就找到你要输的日文汉字。如图:
3.2 其它Rom及双字节码表
实际上任何Rom都是如此:只要它的文本没有被压缩,从假名入手都能找出码表。对于压缩的
Rom,如果它允许你输入主角姓名,你可以起个名字存盘,再去Search存盘文件!你也可以用在输入
界面不断地变换第一个字母,不要按确认,并配合FPE等进行低级搜索,找到缓冲区的确切地址。
对于有汉字的Rom,会更复杂一些。用一个字节来编码肯定不够,有些Rom就用到了双字节编码,
还有的用到可变长编码。下面说一下火焰之纹章:多拉基亚776的例子:(主要注意它的格式)
我找到第一章一开始两个人的对话,在$0AA493处, 格式如下:
00AA493h: 06 00 3A 78 00 07 00 3A 5B 00
---------- ------ -------- ------
第一个人 第1人头像 第二个人 第2人头像
06 09 4C 12 48 BB 0F 10 0A 5E 5F 09 29 0A D4
------ ----- -- -- -- ------ ---------- ----- -----
第1人说 ど ぅ だ 、 等待几秒 王 子 は 见
09 21 15 5C 1F 15 BE 02 08 07
----- -- -- -- -- -- -- ---- ------
つ か っ た お ? 换行 结束符 第2人说
776的文本很讨厌!不仅有正常的文字编码,还包含大量的控制符(例如切换说话的人物、头像)。
现在说码表,776码表是两个字节表示一个汉字或假名。日文平假名、片假名对应09 xx,汉字对应两个字节,从0A 10到0E 5F共1040个汉字。
双字节的表示方法:连续多个字都以09打头的话可以只写第一个09,省略后面字的09。其他段也一样。
例:
0A10=我
0A12=真
0A6E=棒
那么“我真棒”三个字的编码是:0A 10 12 6E
你可以试试改控制符,改变$0AA49D处的06 为07,进入游戏,如何,原本该第一人说的话,现在由第二人说了吧!这里有两个人,编号06、07。头像也可以改。这种文本中夹杂控制符的rom是很常见的。
总之,要开动你的脑筋,不要拘泥于我写的这几种情况,用各种办法尝试,成功hack出码表的乐趣和成就感足以抵偿你花的时间!
有问题请到论坛提出。 |