十三、《圣剑传说》的码表制作
有了大概的思路就要看能不能实现,我们先看看游戏的文本情况。
关于码表的制作我们之前已经讲过了,这里也可以采用类似的方法。简单描述如下,在CT2中找到日文字库,在00022700这里。

给字符按顺序编号,因为字库的字符数量明显少于256,所以应该是单字节编码,从-00-FF。结合游戏的第一句话,使用相对搜索,找出第一句文本在000346F1,确定字符的正确编码,完成码表的制作。
这里再介绍另外一种确定字符编码的方式,利用前面第十节提到的观察点追踪功能。这种方法可以找出原始字库被压缩了的游戏的码表,并且可以让我们先熟悉一下游戏中文本输出的流程,方便后面的修改。
我们在第一个对话框出现之前保存一个即时存档,方便后面快捷地调用。我们看到显示“「”,是要在MAP地址9841,写Tile编号68

把它添加到watchpoints中,重新加载即时存档

游戏停在0:1D72这里

这一步程序是
ld (hl),b
把b中的68写到hl对应的9841这个地址上
我们往回追踪,看这个68是怎么来的,这里就不赘述了,自己慢慢看吧,顺便也熟悉一下这些程序。我就挑关键的来说

到这里,a中的值本来是E8,经过一步
xor a,80
变成了68,xor是异或指令,在这里相当于做了一步减法
E8-80=68
不理解也没关系,后面我们就是要追踪E8是怎么来的

继续往回追踪,到这里我们第一次看到E8出现,对应的程序是
ldi a,(hl)
这句命令表示,从hl对应的地址上读出值放到a,同时给hl这个地址增加1(注意ld和ldi的区别)。记下这句命令的位置0:378A,这个是用来读取文本的程序,后面应该还会用得到。
所以E8是从46F1这个地址读出来的(当前hl地址是46F2,因为是加了1之后的,所以E8对应的地址是46F1)。按我们第十一节提到的,地址46F1要看具体的Bank,此时寄存器右下角rom=D,所以是从Bank D的46F1这个地址读出的E8。地址D:46F1对应的确实是我们用相对搜索找到的地址000346F1。这种方法找出来的地址和编码都是确定的,不像相对搜索,会有多个结果,而且还要重新去对应编码。
所以“「”对应的代码就是E8,这样我们也一样可以确定码表中各个字符的编码,从H对应的70到最后空白对应的FF。
那么70之前呢?因为这个表里还没有浊音对应的编码。我们再看刚才的第一句文本中,字符“ど”对应的编码应该是4E,所以这些浊音的编码应该是在70之前。这样我们可以试出从40的“が”到6F的“ポ”。
那么40之前呢?通过尝试可以发现从20到3F的编码中,每一个编码不是对应1个字符,而是连续好几个字符,代表了一些人名或者常用的词组,比如下一句的23就对应“シャドウナイト”。
20之前的是一些控制符,具体功能要和文本一起分析。
我们在CT2中启用码表大概看一下文本的情况。游戏的文本主要集中在00034000-0003BFFF这一部分,也就是Bank D和E,应该对应的是游戏中的对话。另外在Bank 1中有20到3F对应的短语,Bank 2中有一些和菜单、道具、装备相关的文本。
我们先来看看Bank D和E中对话的文本有什么特点。这些文本不是连续的,每两段文本之间还有很多代码。,结合游戏内的文本以及简单的尝试,我们可以比较容易得找出一些控制码。
12是等待输入指令
13是选择是否
14是男主角名字
15是女主角名字
1A是换行
1B是清空对话框
同时我们还看到,在文本的开头基本都会有一个04,然后有时候会再接10。文本的结尾一般会是12这个按键确认的指令,然后会有11,00这些控制符。对于这几个控制符,简单的修改好像看不出他们到底有什么功能。我们可以在程序读取到这几个字节时设置断点,看看会发生什么。

读取到04看不出什么变化,但读取到10时,程序会连续读8次,并且每读一次会在屏幕上显示出对话框的一部分,所以10对应的就是开启并绘制对话框,相应的11是关闭和清除对话框。04和00虽然看不出什么变化,但根据它们与文本的位置关系判断,应该分别是文本开始和结束的标记。
这样我们就基本上把和文本相关的控制符也搞清楚了,就可以尝试把04和00之间的文本导出来去进行翻译工作了。