卷 · bei.pm
此页面所描述的文件格式基于对Dynamix, Inc.和Sierra Entertainment知识产权的技术分析。
该知识产权现属于Activision Publishing, Inc. / Activision Blizzard, Inc.,目前由Microsoft Corp.持有。
这些信息是通过逆向工程和数据分析收集的,目的是为了档案保存和与历史数据的互操作性。
没有使用任何专有或机密的规格。
该游戏目前可以在gog.com上以下载形式购买。
卷是游戏的数据容器,类似于档案格式,如 Tarball。 至少在 Outpost 2 中,该格式仅包含文件——没有文件夹。 不过,这些可能可以通过相应的文件名来模拟。
一个卷由卷头和多个卷块组成,这些卷块对应具体的文件。
“卷”是游戏目录中以 'vol'
结尾的文件。
地址 | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | 字符 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 56 | 4f | 4c | 20 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | V | O | L | . | . | . | . | . | . | . | . | . | . | . | . |
偏移量 | 数据类型 | 名称 | 解释 |
---|---|---|---|
0x0000 | uint(32) | 魔法字节 | |
0x0004 | uint(24) | 区块长度 | |
0x0007 | uint(8) | 旗帜 |
音量标题
地址 | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | 字符 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 68 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | h | . | . | . | . | . | . | . | . | . | . | . | . |
偏移量 | 数据类型 | 名称 | 解释 |
---|---|---|---|
0x0000 | uint(32) | 魔法字节 | |
0x0004 | uint(24) | 区块长度 | |
0x0007 | uint(8) | 旗帜 |
卷头本身不包含任何有效数据。
它仅仅作为一个容器。
卷头中的第一个数据应该是卷字符串;接下来是卷信息。
音量字符串
地址 | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | 字符 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 69 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | i | . | . | . | . | . | . | . | . | . | . | . | . |
偏移量 | 数据类型 | 名称 | 解释 |
---|---|---|---|
0x0000 | uint(32) | 魔法字节 | |
0x0004 | uint(24) | 区块长度 | |
0x0007 | uint(8) | 旗帜 |
地址 | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | 字符 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 73 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | s | . | . | . | . | . | . | . | . | . | . | . | . |
偏移量 | 数据类型 | 名称 | 解释 |
---|---|---|---|
0x0000 | uint(32) | 魔法字节 | |
0x0004 | uint(24) | 区块长度 | |
0x0007 | uint(8) | 旗帜 | |
0x0008 | uint(32) | 有效负载长度 | 指明以下数据中实际的有效字节数。 剩余的卷字符串列表数据显然被视为垃圾。 在较晚日期的文件中,这些“剩余数据”为0x00,这可能表明在游戏开发过程中工具链存在不足,也就是说,可能是某位开发者在非常晚的时候才处理了缓冲区的正确初始化,因为数据是否初始化对游戏没有影响。 |
0x000c | uint(8)[] | 文件名列表 | 这是一份以0字节终止的文件名列表,至少在当前的数据成分中,仅期望包含ASCII字符。 在解析数据时,无需对该数据块进行更详细的评估,因为在卷信息中已经直接引用了文件名的偏移量。 |
卷字符串是一个包含在卷内的文件名列表。
音量信息
地址 | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | 字符 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 69 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | i | . | . | . | . | . | . | . | . | . | . | . | . |
偏移量 | 数据类型 | 名称 | 解释 |
---|---|---|---|
0x0000 | uint(32) | 魔法字节 | |
0x0004 | uint(24) | 区块长度 | |
0x0007 | uint(8) | 旗帜 |
卷信息包含了更详细的文件信息。在某种程度上,这是一种FAT目录项(FAT = 文件分配表)。
文件的数量是通过将块大小除以目录项的长度(14字节)得出的。
每个目录项的结构如下:
地址 | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | 字符 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
偏移量 | 数据类型 | 名称 | 解释 |
---|---|---|---|
0x0000 | uint(32) | 文件名偏移 | 指明文件名在文件名列表(卷字符串)中的偏移量 (!) 位置。 这与有效载荷块的开始有关。 |
0x0004 | uint(32) | 文件偏移量 | 指示文件在整个卷文件中的偏移位置。 |
0x0008 | uint(32) | 文件大小 | 指示文件的大小,单位为字节。 |
0x000c | uint(16) | 旗帜? | 显然提供了关于文件编码的额外信息。
|
音量块
地址 | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | 字符 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 56 | 42 | 4c | 48 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | V | B | L | H | . | . | . | . | . | . | . | . | . | . | . | . |
偏移量 | 数据类型 | 名称 | 解释 |
---|---|---|---|
0x0000 | uint(32) | 魔法字节 | |
0x0004 | uint(24) | 区块长度 | |
0x0007 | uint(8) | 旗帜 |
卷块是一个容器,能够容纳文件。它仅仅是由于块格式而冗余地包含了文件大小,随后紧接着是实际数据。