模拟城市中文网

 找回密码
 入住
搜索
查看: 2722|回复: 5

DBPF文件格式研究

[复制链接]
发表于 2010-4-15 13:27 | 显示全部楼层 |阅读模式
看到Reader那么多Bug,我忍不住自己想造一个自己的(项目名:Gordius)。自己造工具当然要了解DBPF的原理啦。于是就有这个研究啦

(镰刀划过的痕迹)
————————————————————————————————————————————————————————————————


先解释什么是DBPF。DBPF是EA的三大模拟游戏的数据格式。其特征是DBPF,因此我就这样叫了。

随便挑几个DBPF文件,发现一大串内容都在第97个字节处开始。我想这肯定是文件头
  1. 44 42 50 46 01 00 00 00 00 00 00 00 00 00 00 00
  2. 00 00 00 00 00 00 00 00 BB 0F C0 4B EF 13 C0 4B
  3. 07 00 00 00 01 00 00 00 6C 00 00 00 14 00 00 00
  4. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  5. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  6. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
复制代码
文件头以“DBPF”放在开头作为标识,然后的那些是什么呢?先别管这些,看数据部分

我新建一个LText文件,TGI为:2026960B|0A554AE0|E29AA48F
内容是:
  1. 04 00 00 10 54 00 65 00 73 00 74 00
复制代码
然后新建两个DBPF文件,一个有压缩,一个没压缩
没压缩的内容为(省略文件头和文件尾)
  1. 04 00 00 10 54 00 65 00 73 00 74 00 0B 96 26 20
  2. E0 4A 55 0A 8F A4 9A
复制代码
有压缩的
  1. 1B 00 00 00 10 FB 00 00 0C E2 04 00 00 10 54 00
  2. 65 00 73 00 74 00 FC 0B 96 26 20 E0 4A 55 0A 8F
  3. A4 9A E2 0C 00 00 00 0B 96 26 20 E0 4A 55 0A 8F
  4. A4 9A E2 60 00 00 00 17 00 00 00 EF 1E 6B E8 EF
  5. 1E 6B E8 03 1F 6B 28
复制代码
从此看出没有一个被压缩文件的DBPF文件内容都是:未压缩内容+TGI信息
综合起来,没有一个被压缩文件的DBPF文件内容格式为:

而有一个被压缩文件的DBPF文件,在最后还多出了一个Dir文件(通过Reader可以看出)。并且被压缩文件前面还加上了头部信息
把文件头按00分成三部分,并且把16进制数转换后和对比可以得出:
前四个字节——文件的大小
中间两个字节——被压缩文件的标识符
后三个字节——原文件的大小(四个字节不是更好吗?并且压缩后的大小一般小于原大小呀!)
头部信息后就是被压缩文件的内容(这个case没有能被压缩的内容,所以这和原来的一样)。紧接着是一个0xFC的字节,估计这是文件的最后一个字节的标识符。然后才是TGI信息
然后再接上一个Dir文件,内容是被压缩的文件的TGI信息和一个暂时不清楚的数值(通过Reader看出此文件没有被压缩,由此可以得出Dir文件是不能被压缩的)。最后就是文件尾
综合上述内容得出有被压缩文件的DBPF文件内容格式为:


(再砍)
————————————————————————————————————————————————————————————————


在研究的过程中,新建了四个DBPF文件——带一个未压缩的文件的、带一个被压缩的文件的、带一个未压缩的和一个被压缩的文件的,带两个未压缩的和一个被压缩的文件的
  1. 44 42 50 46 01 00 00 00 00 00 00 00 00 00 00 00
  2. 00 00 00 00 00 00 00 00 BB 0F C0 4B EF 13 C0 4B
  3. 07 00 00 00 01 00 00 00 6C 00 00 00 14 00 00 00
  4. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  5. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  6. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  7. 04 00 00 10 54 00 65 00 73 00 74 00 0B 96 26 20
  8. E0 4A 55 0A 8F A4 9A E2 60 00 00 00 0C 00 00 00
复制代码
  1. 44 42 50 46 01 00 00 00 00 00 00 00 00 00 00 00
  2. 00 00 00 00 00 00 00 00 5F 14 C0 4B 69 14 C0 4B
  3. 07 00 00 00 02 00 00 00 87 00 00 00 28 00 00 00
  4. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  5. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  6. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  7. 1B 00 00 00 10 FB 00 00 0C E2 04 00 00 10 54 00
  8. 65 00 73 00 74 00 FC 0B 96 26 20 E0 4A 55 0A 8F
  9. A4 9A E2 0C 00 00 00 0B 96 26 20 E0 4A 55 0A 8F
  10. A4 9A E2 60 00 00 00 17 00 00 00 EF 1E 6B E8 EF
  11. 1E 6B E8 03 1F 6B 28 77 00 00 00 10 00 00 00
复制代码
  1. 44 42 50 46 01 00 00 00 00 00 00 00 00 00 00 00
  2. 00 00 00 00 00 00 00 00 5F 14 C0 4B 07 1A C0 4B
  3. 07 00 00 00 03 00 00 00 93 00 00 00 3C 00 00 00
  4. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  5. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  6. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  7. 1B 00 00 00 10 FB 00 00 0C E2 04 00 00 10 54 00
  8. 65 00 73 00 74 00 FC 0B 96 26 20 E0 4A 55 0A 8F
  9. A4 9A E2 0C 00 00 00 04 00 00 10 54 00 65 00 73
  10. 00 74 00 0B 96 26 20 E0 4A 55 0A 8F A4 9A E2 60
  11. 00 00 00 17 00 00 00 EF 1E 6B E8 EF 1E 6B E8 03
  12. 1F 6B 28 77 00 00 00 10 00 00 00 0B 96 26 20 E0
  13. 4A 55 0A 8F A4 9A E2 87 00 00 00 0C 00 00 00
复制代码
  1. 44 42 50 46 01 00 00 00 00 00 00 00 00 00 00 00
  2. 00 00 00 00 00 00 00 00 5F 14 C0 4B D0 1A C0 4B
  3. 07 00 00 00 04 00 00 00 A1 00 00 00 50 00 00 00
  4. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  5. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  6. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  7. 1B 00 00 00 10 FB 00 00 0C E2 04 00 00 10 54 00
  8. 65 00 73 00 74 00 FC 0B 96 26 20 E0 4A 55 0A 8F
  9. A4 9A E2 0C 00 00 00 04 00 00 10 54 00 65 00 73
  10. 00 74 00 05 00 00 10 54 00 65 00 73 00 74 00 32
  11. 00 0B 96 26 20 E0 4A 55 0A 8F A4 9A E2 60 00 00
  12. 00 17 00 00 00 EF 1E 6B E8 EF 1E 6B E8 03 1F 6B
  13. 28 77 00 00 00 10 00 00 00 0B 96 26 20 E0 4A 55
  14. 0A 8F A4 9A E2 87 00 00 00 0C 00 00 00 0B 96 26
  15. 20 E0 4A 55 0A 8F A4 9A E2 93 00 00 00 0E 00 00
  16. 00
复制代码
对比他们的头信息的差别,发现0x00000020行的特点——第36个字节是说明此DBPF文件中的文件数(超过256个的,占用第37个字节)
第44个字节的值与第44个字节的值成正比关系,关系为 y = 0x14 * x(x和y是指哪个不用说吧)
而第40个字节的值为最后一个文件的最后一个字节所在的位置与96的差

文件尾的内容暂时不清楚,但我想这和主要内容没有关联

[ 本帖最后由 Bobbi 于 2010-4-15 13:33 编辑 ]
发表于 2010-4-15 14:00 | 显示全部楼层
读懂可以用于debug
无bug用于实务,还得加油啊……
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2010-4-15 16:03 | 显示全部楼层
希望LZ能做出更好的工具
虽然Reader已经够我用了,很多功能还没有使用过
回复 支持 反对

使用道具 举报

发表于 2010-4-21 20:40 | 显示全部楼层
送给LZ




[ 本帖最后由 lrdcq 于 2010-4-21 20:49 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?入住

x

评分

参与人数 1威望 +1 收起 理由
rszxh + 1 热心助人

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2010-4-25 03:23 | 显示全部楼层
楼主,有现成的。

http://sourceforge.net/projects/ ... or_dat.zip/download

这个是ilve reader的OR_DAT.DLL的C++代码
回复 支持 反对

使用道具 举报

发表于 2010-4-25 11:18 | 显示全部楼层
楼主有空的话研究一下这个吧(BATool的CPBuildingMill.ms里面的)

local saved = SaveS3DToDAT nodesToExport (modelName.ModelGUID())

函数saves3dtodat的作用大致是将需要输出的nodes组输出为dat里面的s3d模型文件和fsh贴图文件
前一个参数是nodes组,后一个参数是模型的base tgi值

研究清楚的话(render无所谓,主要是输出s3d,这里联系到s3d文件的格式以及添加进dat时需要联系dat的格式)
可能可以让他们用max做模型的彻底抛弃gmax了……
加分肯定是大大的……



[ 本帖最后由 rszxh 于 2010-4-25 11:21 编辑 ]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 入住

本版积分规则

小黑屋|手机版|模拟城市中文网

GMT+8, 2024-11-18 18:32 , Processed in 0.024299 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表