如何本地化nds游戏
简介:讲述游戏ROM如何本地化,并以实例带领读者破解一个Rom,最终实现部分文字对话的本地化。这篇文章是写给初学者的。你只需要提前了解16的知识就可以阅读这篇文章。
1.本地化Rom的步骤
A.在游戏Rom中找到码表(角色对照表);
B.根据代码表导出Rom中的文本并保存为文件;
C.这些文本的翻译;
D.在Rom中找到字体,换成中文字体;
e、重新创建中文字体码表;
f .根据新的码表将译文写回Rom,并更新相应的指针表;
G.测试
下面我以龙珠RPG(SF8047)为例来说说具体操作。
1.1开始工作前
在开始之前,你应该先找到你想要本地化的游戏的ROM。注意,不能随便从哪里掉一个!你得找到完美的rom,这样才能保证你一半的工作不会因为Rom的问题而浪费掉。具体来说,就是找到已经被GoodSnes和Romcenter检查过的Rom。
另外需要注意的是,要随时做好备份!当然要备份日文原版rom我每天对修改后的rom做一次备份。这件事怎么强调都不为过!
另外需要提醒的是,有些游戏同时有日文rom和英文rom。很多人认为用英文版的rom进行本地化会更容易。这是大错特错!无论何时,记得使用日版rom进行本地化。这有几个原因:
1.英文版字体小,只有52个字母加一些标点符号;但翻译成中文一般需要1500-2000个汉字,字库需要大幅扩充。日版的rom一般会带一些汉字,小心点就能用。
2.英文版字体小,一个字母是8x12,而汉字一般是12x12到16x16。为了显示汉字,你需要asm黑客。
3.英语的对话比日语的对话长得多。为了节省空间,一般都是压缩的,大大增加了解码的难度。
2.字体和代码表
嗯,任何中文游戏的第一步都是找码表。什么是秒表?请往下看。
2.0示例
打开windows记事本,在上面写下“你好,ABCDE”,然后保存为abc.txt
现在的问题是,这个文本文件记录了什么信息?这些单词是屏幕上的图形吗?
现在,用UltraEdit(或者其他你喜欢的16 base编辑器)打开abc.txt,点击“CTRL-H”,切换到16 base显示。您应该看到以下内容:
0000000000h:41 42 43 44 45 C4 E3巴C3;ABCDE,你好
左边的000000000h是地址,右边的“你好ABCDE”是这个文件在屏幕上的样子;立正!中间41 42 43 44 45 C4 E3巴C3,这是档案中记载的真实信息!
你可能已经看到了,这绝不是屏幕上显示这些文字的图形。即使41-45是ABCDE的图;“你好”这个字的笔画那么多,用C4 E3巴C3的这几个字节是绝对不可能完整记录下来的。你是对的。这个档案只记录了字母(和汉字)的编码,没有“这些字怎么画”的信息。那么“画字”的信息存在于哪里呢?打开你的C:\Windows\fonts目录看一下。有没有看到“宋体”“楷体”之类的字体?就是这个!
这是什么意思?说明PC存储了如何用windows字体显示字符的具体信息;我们平时写的文件(不管你存成Word文件还是txt文件)只包含单词的代码。
2.1电脑如何显示文字?
或者只是abc.txt .当你打开这个文件时,写字板程序首先取出第一个字节41,然后查找一个对照表,看起来是这样的:
......
41 - A
42 - B
43摄氏度
44维
45东
......
从表格中找出与41相对应的字母A。现在计算机知道在屏幕上显示“A”了,它会从某个字体(比如宋体)中寻找字母A的字体(通俗点说就是怎么画一个宋体A),并在屏幕上显示该字体。然后,取abc.txt的下一个字节42,以此类推。
那么,这个对照表就很重要了。是ASCII码表!所有电脑的通用标准。所以你在自己机器上写的文件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的码表都不一样!标准的重要性就体现在这里。如果有一个统一的标准,我们就不用费心去找码表了,这也是微软一直试图让自己的产品成为标准的原因。
所以Rom黑客的首要工作就是找到码表。只有完成这一步,才能按照图,顺利导出对话脚本、菜单、物品名称等等。
寻找密码手表
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石13苏14 se 15 so
16 た ta 17 ち池18 つ tsu 19 て te 20 と至
21 な那22 に倪23 ぬ怒24 ね东北25 の否
26哈27海28富29何30何
31马32米33穆34梅35莫44瓦45奥
ん街46号
现在虽然不知道他们的编码,但是知道“A”和“B”的编码差是1,“D”和“H”。
的编码差是4。如果有单词mana,那么字母之间的区别一定是
男男女
\ / \ / \/
11 -12 12
如果有一个工具来搜索差异,我们可以在Rom中找到文本。这种搜索称为“相对搜索”。我推荐的工具叫Relativeful search,可以从狼族网站下载。它可以输入英文搜索和数字搜索,也允许跳过几个字节。
好了,进入游戏,找一段文字,比如左上图,抄下第一句话,按上表标注数字:
と つ ぜ ん ゃ っ て き た
20 18 ?46 36 ?19 7
现在打开相对搜索:按“打开文件”选择Rom,在“数值”后填入20。因为是小数,所以是“小数”。按“添加值”,20会出现在左下方的“值”列表中。照常输入18。我们不知道下一个值“ぜ".没关系。单击“跳过值”跳过它。继续输入46和36。五个就够了。现在按下“相对搜索”按钮,等一下,找到的结果会显示在右下方的“结果”中。
好吧!我找到了一个。现在用UltraEdit(或者您最喜欢的十六进制)编辑器打开DBZrpg.smc。找到$03C6EC,如图。这是正确的地址吗?我们随意改几个值,进入游戏。
看看有没有变化。将前四个字节“17 15 A8 31”改为17,保存后进入游戏。看上图,怎么样!前四个字都是“と".说明我们找到了这句话的恰当位置!
现在我们知道17对应的是“と”(注意这里是十六进制,十进制是23)。可以推断ぁ是04。好了,我们可以做已知的部分码表了。打开记事本,这样写:
04=あ
05=い
06=う
07=え
.......
写起来麻烦吗?这里推荐狼组hdw1978写的表匠。如图,选择“ぁ”和04,点击“生成对照表”立即制作!方便吗?注意它有个小bug:笔名“を”不见了,需要手动添加到代码表中。这个工具是最简单的,在狼族网站上还有其他更好的代码观看工具,你可以自己试试。
如果你很细心的话,你也应该看到FF是一个换行符,FF FF是一个段落的结尾。向代码表中添加项目:
FF=
其他日本人呢?太简单了。你只需要在$03C6EC上潦草地写一些数字,然后进入游戏,看看它显示的是什么。我将把工作留给你。狼组有完整的龙珠RPG码表可以下载。看看是不是和你做的一样。
对于有大量汉字的rom来说,一个一个试太麻烦了。一般来说码表的顺序和字体的顺序是一样的,所以如果能找到游戏的字体,可以直接按顺序复制码表。
新手可能还有一个问题:输入法里找不到那些日文字符。如何输入它们?最简单的方法就是使用invivo附带的输入法。可以快速找到想要丢失的日文字符。
3.2其他Rom和双字节代码表
其实任何Rom都是这样:只要它的文本没有被压缩,就可以从假名中找到码表。对于压缩的
Rom,如果它允许你输入主角的名字,你可以用名字保存然后去搜索保存文件!你也可以用它来输入。
界面不断改变首字母,不按OK,配合FPE进行低级搜索,找到缓冲区的确切地址。
对于有汉字的Rom,会比较复杂。用一个字节编码肯定不够。一些rom使用双字节编码。
其他的使用可变长度编码。先说火之盾:以Laakia 776为例:(主要注意它的格式)
我发现第一章开头两个人的对话,在$0AA493。格式如下:
00AA493h: 06 00 3A 78 00 07 00 3A 5B 00
- - - -
第一个人1头像,第二个人头像。
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
- - - - - - - - -
つ か っ た お ?第二个人在断行结束时说
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很常见。
总之你要开动脑筋,不要拘泥于我写的这些情况,多种方式去尝试,成功黑掉码表的乐趣和成就感足以补偿你所花费的时间!
4.关于Rom的一些知识
在开始讲下一步之前,我们先了解一下ROM的结构,这有助于我们理解下面的内容。
一个ROM分为两部分:头和体。头是一个200字节的区域。在ROM的开头,记录了一些关于ROM的信息。有些光盘甚至没有标题。对于本地化,我们可以完全忽略header。至于主体部分,那是我们的重点。可惜不能细分。这里的内容存储完全由游戏的开发者决定,所以一个rom也是一样的。
ROM的存储格式有很多,比如SMC,FIG,078。可能你拿到的rom是几个文件,所以你一定要用snestool合并成一个文件,最好是SMC格式的。
rom的映射格式分为两种:低位rom和高位ROM。不用担心具体的区别,你只需要知道如何确定一个rom是哪种格式就可以了。我们用一个叫ucon的小程序来帮忙,也可以用来转换rom格式。在DOS命令行下执行
Ucon dbzrpg.smc,得到以下结果:
如图,在HiRom游戏中,写的是物品号,所以这是Low Rom。至于有没有头,可以算一下:比如龙珠是8M rom,大小应该是1024× 1048576(注意是8M位,相当于1M字节),但是查文件属性,大小是1049088。这512字节就是头,十六进制正好是$200。
所以,我们知道龙珠RPG有一个头和一个低rom格式。
5.指针表和文本块
砰,砰,砰,砰,砰,砰,砰,砰,砰,砰,砰!不要说我像唐僧,但是你一定要认真看!
如果我想开发一个游戏,必须有很多对话。如何存储这些对话文本?一种方法是在使用对话的地方写一个句子,在对话之间插入很多控制符号甚至程序。这是“浮动”文本。但是,这很麻烦。如果后面要修改对话脚本,句子变长了,会影响后面的程序。这样的rom,比如火焰纹章系列,浪漫沙迦系列,翻译成中文很麻烦。
更好的方法是把所有对话(文本)放在一起,用特定的终止符隔开。然后,做一个表格,表格里的每一项都指向一个段落的第一个单词。这个表叫做指针表,那堆文本叫做文本块。示例如下:指针表:
00 60
60年
1D 60
2F 60
3A 60
文本块:
地址文本
6000-600F:这是一只狗。|T
那是一支钢笔。|做
6020-602F:你玩游戏?|C
6030-603F:当然!|什么
说明:我先解释一下,在汇编和16系统中,对于两个字节以上的东西,第一个字节叫高位,最后一个字节叫低位。比如$34AB,34高,AB低。在Rom中是这样存储的:先低位再高位。所以$34AB在Rom中存储为“AB 34”。
一个文本块的地址是十六进制的16,从6000-600F到* *,有16个字节,也就是一行有16个字符。“|”是终止符,标记一个句子的结束。指针表中的每个条目由两个字节组成。我们来看第一项,00 60,它实际上指向6000美元的地址,这是句子“这是一只狗”的开头。下一项0F 60指向地址$600F,这是“那是一支笔”的开头。。
这样保存最大的好处就是对话文字的长度可以随时更改!只要你把指针表中对应的指针指向更改后的正确位置,根本不需要更改程序!这样的rom汉化也方便我们,因为可以写程序自动导入导出对话脚本。
6.指针表、文本块、字体和码表的协作关系。
先仔细看看这张图,能看懂吗?这是如何显示一个单词的完整流程。
如图,假设程序中显示一个句子,是一个文本块中的第一个句子。程序会调用display子程序来显示这句话。开始跑。首先,它检查传递给它的参数“1”,这意味着显示文本块中的第一句话。查指针表,第一项指向$6000,ok,从$6000的地址中取出$54的一个字节,查码表,得知$54代表字母T,然后从字体中找到字母T的字体并显示出来。
然后,从$6001中取出第二个字节$68,重复上述操作。一直到$600E,取出的值是$FF,是终止符标记,表示子程序返回结束。此时,屏幕上已经显示出第一句话:“这是一只狗。”
明白了吗?当程序中要显示文本时,只需调用显示子程序,告诉它要显示哪一句话,显示文字程序就会显示相应的文字。
7.找到指针表
现在我们要找一个指针。还是用龙珠Rom,记住这个Rom是有文件头的,是Low-rom。上次我们发现第一句的起始地址是$03C6EC,减去文件头$200后就是$ 03c4cec。去掉高阶03并交换后,我们得到Rom中的存储格式是EC C4。这是寻找指针表时的计算方法。
在UltraEdit中打开rom,搜索该值,立即找到地址$0394A2。(这里有问题可以参考我翻译的《汉化进阶》一文)
观察这个地址附近的值,发现是有规律的,每两个字节都指向Cxxx附近。一定是这里。放置ECC4
把第二句的地址改成03C5(指向$03C703),进入游戏看看(如图),哈哈!拉蒂兹只说了最后两句。
这是指针表。是啊!通过指针表,你可以很容易地找到每段文字的开头。指针表很有用;如果能写一个程序,可以大大方便导出和导入的过程。在将来插入所有中文文本之后,指针表应该被更新以再次指向每个中文文本的第一个地址。
导出脚本对话(转储脚本)
现在,您需要做的就是导出文本并将其交给翻译。你兴奋吗?让我们看看如何导出脚本。
DOS下最常用的工具之一就是Thingy。早期的英语,很多外国人专门用,所以它支持的码表格式就成了标准。当然现在很多工具已经超越了,但还是要提一下。
执行Thingy的时候会问你Rom名称和码表名称。支持同时使用两个码表,第二个是可选的。进入Thingy后,随便翻一页,你发现右边已经显示日语了!将光标停在文本块的开头,按D,回车;把页面翻到文本块的末尾,然后按d,Thingy会提示你给导出的文件起个名字。写完名字后,这段文字就导出了。
其实有人专门编了工具来导入导出。Script-extractor和Script-inserter都不错,用起来比Thingy方便多了。导出的文本如下所示:
「それとも じっくりと あそんで
ころそうか?へへ……いくぜ!」
「おとうさん!ピッコロさんが…
ピッコロさん しんじゃった-!」
「すまん…… おそかったか…!
ゆるさんぞ!オメエら - !!」
じめんから カイブツが?
「なうだ!!きさまら こいつらと
1ぴきずつ たたかってみんか!!」
「まさか こんなクズなもに……
こうなったら カカロットの
ガキをみちづれに してやるぜ!!」
稍微处理一下就好了。以下是翻译工作。
狼族汉化区有很多可以导入导出的工具,你可以选择自己最方便的使用。
对于有编程能力的rom黑客来说,最好自己写程序导出。我的习惯是导出整个rom,然后手动整理垃圾。下面是我用来导出776对话的VB源程序的核心部分。其实很简单,可以参考一下。完整的程序在这个区域。
简单解释:MB(a,b)数组包含当前所有的码表,count是计数器,地址每三句显示一次。从rom中一次取一个字节放在D中,然后根据码表翻译成字。Hz代表码表的哪一段。当Hz = 0时,是假名和字母(即09xx)。
For i =开始到结束
获取2号身份证
如果d = 0,则
i = i + 1
获取2号身份证
如果d = & ampH11然后
hz = 0
ElseIf d = & ampH12然后
hz = 1
ElseIf d = & ampH13然后
赫兹= 2
ElseIf d = & ampH14然后
赫兹= 3
其他
打印编号1,字符串
计数=计数+ 1
如果计数= 3,则
计数=
0 str = " & lt$ " & amp十六进制(i + 1)" >
打印#1," "
打印编号1,字符串
Bar1。值= CInt((i - start) / 1000)
如果…就会结束
hz = 0
str = " "
如果…就会结束
其他
str = str & amp兆字节(赫兹,分贝)
如果…就会结束
然后
好了,今天的课就到这里。学完这一课,大家应该能导出对话文本,开始找翻译了吧!顺便澄清一个误区:本地化不需要懂日语,因为我们要有分工。看到有些朋友在论坛上说“我先把日语学好”其实是没有必要的,好像我根本不懂日语一样。
8.1搜索字体
好了,我们现在要做的是最有趣的部分!
先说一个名词解释:TILE——指8x8的一小块。SFC里所有的图形都是8x8的小块,有点像马赛克。这种8×8的瓷砖叫瓷砖。它是最小的图形单元,不能再细分。对话汉字也是用瓷砖拼的。一般游戏中使用的角色从12x12到16x16,由四个瓦片组成。
我怎样才能看到瓷砖?我们用一个叫精灵编辑器的工具(精灵指的是用磁贴拼出来的角色或者头像)。最好的是瓷砖层专业(TLP),可以从网站上下载。用TLP打开了罗腾飞的龙珠,显示如下:
选择查看" "格式,然后选择Gameboy模式。像这样:
为什么选择GB模式?SFC游戏,字体一般为2bpp格式(1bpp和2bpp的含义,有兴趣可以看网站其他文章)。GB模式恰好以2bpp格式显示磁贴。
好了,现在把眼睛睁大,按“下一页”来翻页,仔细看有没有像文字一样的东西!如果找到了,就是字体。
但是...好像找不到了!对,龙珠RPG的字体是压缩的!
(杀了他,你竟敢欺骗读者!.....sunkar被读者攻击,HP降低30分)
啊...不好意思,我事先没仔细看就选了这个rom,字体是压缩的。这也告诉我们,本地化的第一步不是找码表,而是看能不能找到字体,然后再找码表。除非你懂asm hack,否则遇到压缩字体最好换rom。从现在开始,我以776为例来说明字体替换和中文对话。请回忆一下第一课提到的776代码表。
9.Laakia 776的字体。
776码表站上有下载,可以下载参考。我再简单解释一下:
776采用双字节编码,比如0A20=上帝。在这种编码中,第一个字节0A称为段号,第二个字节20是该字的实际号。776***有六个段:09xx,0XX,0Bxx,0CXX,0DXX,0EXX。
在rom中,系统会尽量节省空间。对于每个字,如果它的段号与前一个字相同,可以省略段号,只使用一个字节。
如:09a 023 e 10b 45219610A8B。
在上面的对话中,粗体字代表段号,后面是1字节的编码。例如,前四个字节实际上代表三个字符:09A0 0923 09E1。后跟0B 45 21,系统将其解释为两个字符0B 45和0B21,以此类推。
好了,现在用TLP打开776的日文rom,切换到GB模式,关小!很快就能看到大量的汉字,这就是字体!(左下方)
现在我们把字体里的“太子”二字改成“谣言”看看:
改变文字需要TLP的编辑功能。首先单击要更改的磁贴,可以在中间的编辑框中进行编辑。下面是调色板。776使用了四种颜色:蓝、绿、白、黑。其中蓝色是重要的,绿色和白色是阴影。用鼠标慢慢“画”出单词。我相信你很快就会掌握它。右上方的图是修改后的样子。(绘图字体可以参考该领域的其他文章。)
修改后保存,然后我们进入游戏看看有什么变化:
左图为原创,右图为改图。看:“王子”变成了“谣言”。
这是修改字体!今后,我们将把所有的日文字符和假名都改为中文字体。
10.制作中文对照表
太简单了。先打开一个空文件,从日语代码表中复制单词“Prince”的代码:
0A5E=王
0A5F=子级
然后把“太子”二字改为“谣言”:
0A5E=外部
0A5F=通过
好了,现在保存这个文件,命名为776c.tbl这是我们的中文对照表!将来,在制作汉字字体时,您可以随时添加新的代码。
11.写中文翻译回Rom。
假设你已经完成了所有的字体。
我们以776第一章第一句话为例:(如果你的ROM有头,地址是00AA69E)。
00aa 49e:09 4C 12 48 BB 0F 10 0A 5E 5F 09 29 0A D4 09 21 15 5C 1F 15 BE
どぅだ,はつかったぉ王子?瓦斯曼,你找到王子了吗?
根据我们的中文代码表,找出每个单词的代码,然后根据776的特点,省略相同的段落号。结果应该是这样的:
00aa 49e:0B A6 0A 69 0B 85 09 BB 0B 43 44 0A 83 63 47 0B 45 09 BE
用你喜欢的16基础编辑器写入rom,保存,然后进入游戏看看,怎么样!这句话已经汉化了!
但是本地化后比日文少了两个字节。我该怎么办?没关系。下一句是中文的时候,就跟着这句。如果中文的字节数比日文多,不用怕,按顺序翻译成中文就行了,只要最后一句到原来日文编码位置就行了。
776不需要考虑指针表的问题;但是有些游戏需要指针表。那么汉化之后也要把指针表对应的指针改成中文对话的起始位置。
12.加速中国化的进程
如果你理解了眼前的一切,你其实已经学会了本地化所需要的技能。恭喜你,找到一个游戏rom从业者!
但是,如果你真的按照我之前说的做,你会精疲力尽的。工作量真的太大了。怎样才能加速汉化的进程?当然要用各种工具!
A.首先,画字体很烦。我们完全可以用工具来做!爱迪生的CharEdit可以选择任意字体大小,写在rom里,非常方便。但是,它只能写2bpp格式的字体。甚至字体绘制也可以加速,狼组Dark01首创的结合Photoshop的字体绘制方法非常实用。如果你懂一点编程,建议你研究一下字体的存储格式,比如1bpp,2bpp,然后看看“任意字体的字体生成器”这个程序。然后你可以自己写一个程序,把所有字体一次性写入rom!狼组现在基本不用打字员了,因为我们都是用程序写标准大小的字体。
B.推荐狼组的“汉化辅助工具”,这是一个自动将中文/日文翻译成代码的工具,还可以查看哪些汉字没有打出来。第一次用的时候要建立一个中日对照表。
好了,Rom hacker的课程到此结束。希望你也能翻译成自己喜欢的游戏!记住:中国游戏最需要的不是技术,而是耐心和坚持。祝你成功!
36丫37于38哟
39らra 40りri 41るru 42れre 43ろro