跳到主要内容

PS1 游戏汉化教程

01

该文档原本为exe的电子书,这里经过人工抄录转换

作者:施柯昱

电子书制作:梁文豪

原前言:

本教程是应《模拟地带》杂志(现已改名为《模拟与游戏》)的邀请而撰写的,已经连载完毕。由于是初次编写教程,难免会有疏漏和不足的地方,如果大家有任何的意见建议欢迎与我联系,我会及时进行补充和修正的。本教程未经作者本人同意不得在任何媒体上转载。

本站版本未经授权,仅作为存档防止丢失。

📄️第三讲 脚本的查找

为了便于理解后面的内容,我先要简单讲解一下游戏中文本显示的过程。当程序被指定来显示某段文本时,程序会根据内部的规则对该段数据逐个进行判断,如果是控制符号如“另起一行”、“等待按键”等会交由相应的程序处理,如果是文本数据则交给字符显示模块来处理。在字符显示模块中,程序会根据字符的内码通过内置的规则来计算出在该字符的点阵数据在字库中的位置,然后到该位置来读取数据,转换后将其显示到屏幕上。下面我以标准中文字库HZK16的显示为例说明一下游戏程序是如何实现从字符内码到字符点阵数据地址的转换的。HZK16字库是一个16\16的点阵字库,对应的字符编码是标准的汉字GB码,它是一个双字节的编码方式。在字库中第一个字为全角的空格,对应的内码是A1H A1H,最后一个字符是“齄”,对应的内码是F7H FEH,一共有8178个字符。我们通常将两个字节中后面的一个字节称为“低位”,它是按照字符在字库中的顺序递增的,而将前面的一个字节称为“高位”,它是在低位到达最大值(在GB码中是FEH)时才递增的,此时低位会回到最小值(在GB码中是A1H)。如果我们将字库中的第一个字符作为零号字符,我们就可以通过下面的公式来得到任意一个字符在字库中的位置 (高位-高位最小值)×(底位最大值-低位最小值+1)+低位-底位最小值。如我们已知中“汉”字的内码是BAH BAH,我们可以知道它是字库中第 (BAH-A1H)\(FEH-A1H+1)+BAH-A1H=947个字符,我们知道在HZK16中每个字符的点阵数据的长度是16\16/8=32字节的,所以“汉”字的点阵数据在HZK16中的位置是947\32=7660H。字符显示程序只要将此位置的32个字节读入,就可以显示出“汉”这个字了,具体的演示程序按此处下载。

📄️第四讲 脚本的提取

在前面的一讲里我介绍了fft中文本的编码规则的研究,有了之前的研究成果,我们就可以开始着手编写脚本的提取工具了。首先我们必须先确定一下我们要提取的文本在光盘上的哪个文件里,确定的方法非常简单,在前一讲中我提到的那句对话的内码是“D1 54 D5 6D D1 51 F8 D1 18 52 D1 19 D1 B1 D3 6D 41 5C 54 7B 56 85 D1 19”,现在我们只要在光盘的文件中搜索该代码就可以找到游戏对话数据所在的文件了,虽然光盘上的文件比较得多但如果去除str结尾的动画文件和sound目录中的声音文件的话还是很容易在Event目录中的Test.evt找到对话的数据的。

📄️第五讲 脚本的写入和字库的生成

在整个的游戏汉化过程中,脚本的写入和字库的生成是相当关键的部分,它直接关系到汉化后游戏的稳定性和显示效果。不过相对于字库查找和脚本查找的多样性和复杂性,这一部分的工作要相对固定得多。脚本的写入是脚本提取的一个逆过程,其中主要须完成三方面的工作,首先是对译文进行必要的检测,翻译的过程中难免会有些因疏忽导致的错误和未考虑到的部分(譬如控制符是否正确,译文是否超出限定的长度等等),如果将这些错误带入到rom中,很容易导致rom的损坏,而通过手工的方法校对又相当费时费力,因此应该尽量选择使用程序校对的方法,其次是通过之前获得的内码与字库位置的转换公式来进行逆转换,将译文转换为游戏内码写入到游戏rom中,最后是要在进行内码转换的同时同步的建立新的字库,我在以前的教程中提到过字符的内码和字符在字库中的位置是相关联的,因此在前面转换游戏内码的同时事实上也就确定了新字库中字符的排列顺序,在脚本写入程序的最后我们需要把这种次序保存下来,以备之后的字库生成程序来调用。具体的程序请对点击这里下载,这是一个FFT的集成汉化工具,我在其中有详细的注释。下面我说说脚本写入中要注意的几个细节问题。

📄️第六讲 PS图片和光盘的修改

大家好,PS汉化教程又和大家见面了,在前面的几讲中我讲解了游戏脚本汉化的主要步骤,其实要完美的汉化一个游戏,除了文字方面的汉化外,游戏中的图片、动画和声音的汉化也是非常必要的,不过由于动画和声音的汉化需要涉及到复杂的视频和音频编码解码技术,在没有找到合适的软件工具前我一直没有涉及,因此我下面着重讲解一下PS图片汉化的一些方法。