上回说到我们把start.lzs解压,本回继续。
start.lzs解压后也是一个打包文件,游戏启动时要用的基本文件都在这里面,其文件头结构异常简单,如下:
start.bin:
offset | size | meaning |
0x00 | dword | 该打包文件内包含的子文件数量 |
0x04 | dword | 子文件的偏移地址 |
0x08 | 28byte | 子文件名 |
上面从0x04开始是子文件索引信息,其余各子文件依次类推。
从子文件索引信息里我们可以看到font.fnt和font.txp这两个文件,通过文件名可以猜到这就是字库文件了。
为什么会有两个呢?后面经过分析可以知道font.fnt是用来存放字库中每个字模的索引表,而font.txp就是字库的主体文件了。
再经过分析可以知道font.txp其实就是一张txp格式的图片,txp格式是该游戏中的一种静态图片格式,用于存放简单的图片,下面给出其文件头的具体格式:
txp:
offset | size | meaning |
0x00 | 2byte | 图片长 |
0x02 | 2byte | 图片高 |
0x04 | dword | 颜色数:0x10--16色,0x100--256色 |
0x08 | 2byte | 同上 |
0x0a | 2byte | 调色板数量 |
0x0c | 2byte | Tile结构标志:0--无Tile结构,1--有Tile结构 |
0x0e | 2byte | 未知数据,可能是用来表示包含的子图像数量 |
以上就是txp格式的文件头解释。
这里要特别说明一下:
1、该游戏里用到的所有图片格式都是多调色板结构,即一个图像文件中可能有不止一个调色板。
2、该游戏里用到的所有图片格式中的调色板结构都是一样的,是32bit的RGBA格式,即RR GG BB AA,没一个颜色分量用2byte来表示包括Alpha值。
3、该游戏里用到的所有图片格式中的Tile结构也是一样的,若是16色图片的话Tile结构为32x8,而如果是256色的话就是16x8。即一个Tile所占的字节数始终为0x80。
font.txp是一个无Tile结构的图片,每个字模大小为20x14。有了这些信息就可以写程序吧字库导出了,稍后我同样会放出相关工具及源码。
start.bin中处在中间几个位置的*.dat文件就是游戏的主文本文件了,其实也可以按照上面的分析思路吧文本文件的结构搞清楚然后写专用程序导出文本,但是这好像没有多大必要,用现成的文本导入导出工具一样可以处理,所以我就没有再深入研究这些*.dat文件了。
我稍微看了一下文本,好像是S-JIS编码的,另外在boot.bin里也有一些菜单文本。文本的处理都交给清文了,我不是最清楚。听他说还有少量文本是UTF-8的。
这里还有一个问题就是如果你把字库导出了之后,可以看到其字库并不是完整的S-JIS字库,中间有缺字少字。那么文本是S-JIS而字库不是标准的S-JIS,他们之间的对应关系是怎么样的呢?这就要用到前面说的font.fnt文件了。
font.fnt文件存放的是font.txp里字模的索引信息,该文件结构很简单开头2byte是一共的字数(包括单字节英文、标点,双字节英文、标点,日文假名、标点,以及日文汉字),其后每2byte存放该字模在font.txp里的索引号。下面我给出具体的S-JIS与相对应索引的换算关系:
fnt换算关系:
S-JIS | 换算关系 | offset(i) | 特殊起始值 |
2000~7E00 | i/2+001F(高低位反) | 0x00 | * |
8140~81FC | i/2+80E0 | 0xC0 | * |
8240~82FC | i/2+8120 | 0x240 | |
... | |||
8740~879C | i/2+8260 | 0x9C0 | * |
889F~88FC | i/2+82A0 | 0xBFE | * |
8940~89FC | i/2+82E0 | 0xCC0 | * |
8A40~8AFC | i/2+8320 | 0xEFE | |
... | |||
E040~E0FC | i/2+C8A0 | 0x2F40 | * |
E140~... | i/2+C8E0 | ... | |
... |
简单点说就是:S-JIS每增加0x100,换算关系里的增量就加0x40,i增加0x180。特殊起始值为上面列出来的那些。
以此为依据就可以推出该游戏所用到的S-JIS码表了。相关工具及源码稍候放上。
ok,至此关于文本破解方面就都在这里了,后面就是用上面推出的码表来导出文本交给翻译去翻了。
但是这仅仅是文本而已,该游戏还有大量文字信息是以图片方式存放的,下次我就介绍一下图片破解。