大富翁 3 游戏文件分析(三)

今天我们来分析一下早期大宇游戏中常用的打包方式,MKF

目录

本系列已完结,以下为整理目录方便查阅

1 打算写的内容

2 MKF 文件分析

2.1 简介

mkf 文件似乎是那个时代大宇公司内的常用文件类型,很多大宇的游戏中都能看到它的身影, 它是一种文件打包的机制,可以把一组「小文件」封装成一个文件,有时候, 这些「小文件」又是一组「小小文件」的集合,所以 mkf 文件也可能是三层结构, 也就是说一个 mkf 文件可以分解为若干小文件,而这些小文件又可以分解为若干更小单位的游戏资源文件。

2.2 理由

为什么大宇要这么做,我认为有两个原因。

2.2.1 节约磁盘空间

我们知道微软之前的磁盘分区方式为 FAT ,这种格式下的磁盘,文件存放的最小单位是簇, 一个簇的大小视磁盘大小不等,通常是几 k 到几十 k ,所以如果有很多小文件存在的话, 积少成多也会浪费大量的磁盘空间,所以如果能合并到一个文件中去,可以更好地控制游戏的磁盘占用空间。

2.2.2 增加分析资源的难度

如果把每种游戏资源都按类型起个名字保存成文件、分门别类放好,那么无疑会方便我们推断游戏资源的用途, 打包在一起就比较难办了,没有名字,没有分类,如果不熟悉这种结构,很可能会摸不到头脑。

2.3 外层结构

我们随便挑一个 mkf 文件,比如 ppcc.mkf 来看一下:

mkf 文件的头部保存了一个索引列表,这个索引列表使用四字节的整数记录了每一个小文件的起始位置, 从上图我们可以看出,第一个文件的起始位置是 0x34,从这里我们可以推出一个细节, 那就是索引列表的长度也是 0x34,因为既然 0x34 是第一个文件的开始, 那么 0x00 到 0x33 这部分的文件内容必然属于索引列表。

知道了索引列表的长度,0x34 换算成十进制是 52, 所以我们可以推断这个 mkf 档包含了 52 / 4 也就是 13 个小文件。这个结论基本正确, 但是依然需要修正,因为 ppcc.mkf 文件的大小是 457864,也就是0x6FC88, 与我们看到索引列表 0x30 到 0x33 所代表的最后一个数字相同,所以其实是没有第十三个文件的, 不过我们也可以理解为第十三个文件的大小为空。所以 ppcc.mkf 包含了十二个文件。

上面提到「文件大小为空」的说法,是有原因的,因为确实存在这种现象,比如 newsvoc.mkf 这个文件:

这个索引列表头部赫然写了三个相同的数字,列表中间也有连续的相同数字, 如果我们没有分析其他的 mkf 文件直接上手分析这个,很可能会被误导, 不过根据上面的分析,我们显然可以得出前两个索引所代表的文件是空, 当然,我们也可以认为,前三个文件索引复用了相同的文件。 为什么会有这种虽然符合 mkf 文件打包规则但是却非常极端的例子,我觉得可能有以下几个原因:

  1. 混淆视听,增加分析难度:虽然可能性不大,但是不失为一种可能
  2. 原有资源已不再使用,但为了维持后续资源序号不变,设置为空文件
  3. 不同游戏场景使用了相同的游戏资源,故指向相同的索引,避免资源的重复

2.4 内层结构

mkf 中分解出的文件有些还具有第二层的结构,套路相同,但是细节处理有变化, 我们以 ppcc.mkf 解出的第一个文件为例,方便起见我们姑且称这个文件为 ppcc_1.smkf

smkf 文件的第一个数字 0x11 表示了索引的个数,即包含了 17 个索引, 所以连同长度标志,索引列表的总长度为 18 个 4 字节整数, 因此,第一个文件的内容可能是从 0x48 开始的, 而 smkf 文件的第二个数字 0x13 恰好就是十进制 18, 似乎也可以印证文件内容是从 0x48 开始,那我们先检查一下 0x48 的文件内容吧。

0x48 保存了一个数字 0x2692,这个数字乍一看没有什么特别, 但是由于根据上面的经验 smkf 是完全按照四字节划分的, 0x2692 * 4 的结果是 39496,这个数字是 ppcc_1.smkf 文件的长度, 这一点说明文件内容并不是从 0x48 开始的,因为「小小文件」没必要保存「小文件」的长度, 那么上面的分析就不正确了,没关系,我们记下 0x4c 的字节序列 12 00 57 00 , 继续看下一个索引能不能给我们一点其他线索。

下一个索引 0x255 * 4 = 0x954,这个位置保存的字节序列也是 12 00 57 00

下一个索引 0x493 * 4 = 0x124c,这个位置保存的字节序列也是 12 00 57 00

下一个索引 0x6d6 * 4 = 0x1b58,这个位置保存的字节序列也是 12 00 57 00

这样看来,规律就出来了,除了第一个索引有四字节的偏差,其他索引均指向了相同数据, 所以我们在拆分文件时需要对第一个索引进行特殊处理。

2.5 实例

mkv 的结构就是这样,接下来我们就可以自己动手拆解文件了, 不过读懂 mkf 虽然让我们又前进了一步,但是其实我们其实只是把资源拆开, 接下来才是解析游戏资源,不过这一步还是非常有意义的, 因为游戏的音频文件我们都可以无损得到了! 大富翁 3 的音频文件都只经过一层封装,根据格式可以分为两种:

  1. RIX 文件:这是一种大宇 dos 时期常用的音乐文件,类似于 midi,

不过 rix 和 midi 孰优孰劣是有一定的争议的,这里就不做讨论啦, 这些 rix 文件被打包为了 music.mkf, 另外需要注意的一点是 rix 文件作为一种冷门的文件资源,需要寻找专门的播放器播放

  1. VOC 文件:这是标准的创新公司(Creative)的音频文件,

标准到每一个文件开头都被写入了「Creative Voice File」, 现在的播放器很多也可以打开,这种文件主要是用来保存特效音和语音, eventvoc.mkf、voc.mkf、newsvoc.mkf 保存的就是这些内容

2.6 小结

写到这里,信息量还是有一些的,写着写着,觉得接下来可以把分析出的音频文件总结成一个列表, 留给「后人」查阅,而且篇幅也已经不短了。有兴趣的读者可能会问似乎没有拿一个「小小文件」作为实例, 实不相瞒,我对这些拆解后的游戏资源还是一头雾水, 先把已经分析出的东西记录下来,等到有些思路了,再跟大家分享吧。