九月星空

已埋半截……

『整理』魔力宝贝Bin文件格式:图像压缩格式(上)

杂烩 0 评

下文分析了CrossGate(魔力宝贝)的文件格式,因为StoneAge(石器时代)和它差不多(最初均为同一小组作品),所以一并介绍。
原文作者为梦见草,由野风信子整理和完善。

 

一.图片数据
图片地址文件
CrossGate GraphicInfo*_*.bin
StoneAge Adrn_*.bin

这个文件存放了图片的地址索引,由若干个大小一样的块组成,每个块长度为40字节(StoneAge为80字节),格式如下:

字段类型 内容 说明 字节
LONG 序号; 图片的编号
4
DWORD 地址; 指明图片在数据文件中的起始位置
4
DWORD 块长度; 图片数据块的大小
4
LONG 偏移量X; 显示图片时,横坐标偏移X
4
LONG 偏移量Y; 显示图片时,纵坐标偏移Y
4
LONG 图片宽度; ...
4
LONG 图片高度; ...
4
BYTE 占地面积-东; 占地面积是物件所占的大小,1就表示占1格
1
BYTE 占地面积-南; 同上
1
BYTE 标志; 用于地图,0表示障碍物,1表示可以走上去
1
BYTE[5] 未知; 在StoneAge中本字段长度为45字节
5
LONG 地图编号; 低16位表示在地图文件里的编号,高16位可能表示版本,非地图单位的此项均为0
4


其中偏移量XY是用于图片定位的,比如X=-18,Y=-19,如果将图片显示在(100,100),那么实际位置应该是(82,81),这样才可以和其它图片协调,在做人物动作gif的时候必须用这个参数来调整每一帧的位置,否则动作是抖动的,做地图也需要,否则会错位。

 

图片数据文件
CrossGate Graphic*_*.bin
StoneAge Real_*.bin


这个文件包含了所有图片的原始数据,每个数据块由数据头+数据组成,每个数据头长度16字节,格式为:

字段类型 内容 说明
字节
BYTE[2] 魔数; 固定为'RD'
2
BYTE 版本; 偶数表示未压缩,按位图存放;奇数则表示压缩过
1
BYTE 未知; ...
1
LONG 宽度; ...
4
LONG 高度; ...
4
LONG 块长度; 数据块的长度,包括数据头本身的长度(16BYTE)
4


后三项和地址文件中的一样,图像数据紧跟在数据头后面。
例如,要解开第100个图片,首先在GraphicInfo_*.bin里定位到第100条记录,即偏移(40*100)字节的位置,根据读出的地址在Graphic_*.bin中找到对应的数据块,就可以读出图片数据了。
绝大部分图片数据都是压缩过的.

二.动画信息

动画地址文件
CrossGate AnimeInfo*_*.bin
StoneAge Spradrn_*.bin

存放每个动画在动画序列文件中的地址索引,每个数据块大小12字节
字段类型 内容 说明
字节
DWORD 序号; 动画序号
4
DWORD 地址; 指明在动画信息文件中的地址
4
WORD 动作数目; 表示该角色有多少个完整的动作(包括各个方向)
2
WORD 未知;  
2

动画信息文件
CrossGate Anime*_*.bin
StoneAge Spr_*.bin

该文件存放了全部动作的图片序列,每个动作由数据头+若干序列号组成,数据头长度12字节
字段类型 内容 说明
字节
WORD 方向号; 0-7分别表示8个方向
2
WORD 动作号; 表示该动作的含义,比如坐下或者走路
2
DWORD 时间; 该动作完成一遍所需时间,单位为毫秒
4
DWORD 帧数; 该动画有多少帧,决定后面数据的大小
4

某些动作号不是所有角色都有,比如跑步前的准备动作。

有多少帧,后面就跟有多少个序列号,每个序列号长10字节
字段类型 内容 说明
字节
DWORD 图片号; 该帧所使用的图片
4
CHAR[6] 未知; ...
6

图片号就是该帧所用的图片序号,用图片数据里说的方法就可解出每一帧的图片数据。。

例如要解出340号角色的1方向的第5个动作,先在AnimeInfo_*.bin中定位到第340号数据块,即偏移(12*340)字节的位置,读出地址和动作数,然后根据地址在Anime_*.bin中定位到对应的位置,然后从该位置开始查找方向1动作5的序列,根据帧数读出每一帧的图片号,通过图片号解出对应的图片就行了。

其中未知的字段表示我还不知道用处的。

注意:CrossGate的动画序列地址文件AnimeInfo_*.bin,可能由于开发时的某些原因,造成存放了3遍序列,并且按前两遍解出的动画是错误的,要以第3遍为准,第2375号角色才是第0号,其他的版本没有这问题。

三.地图格式

地图文件就是map目录下的那些,CrossGate的地图档在最前面有12个字节的文件头,内容为"MAP"(后9字节为0),StoneAge则没有文件头,其它完全一样。

地图档格式
字段类型 说明
字节
DWORD 地图长度-东(W)
4
DWORD 地图长度-南(H)
4
BYTE[W*H*2] 地面的数据,每一个单位2字节,为0表示无地面
N
BYTE[W*H*2] 地上的物件等,每一个物体2字节,为0表示该处无物件
N
BYTE[W*H*2] 地图标志,每一个单位2字节,具体不清楚,只知道对会引起地图切换的地方有标识
N

地图是45度视角的四边形,数据的存放顺序是从东到西,由南至北,起点为左边角(东0,南0)。
假设读入的3X3地图数据顺序为123456789,对应的地图显示:

    3
  2   6
1   5   9
  4   8
    7


 

这样读出来的数据是地图编号,在图片数据中说过,图片地址文件的每一条记录的最后一个字段就是地图编号,现在就是根据这个编号反查出对应的图片序号,将它显示出来,由于游戏本身没有地图索引文件(那是在运行游戏的时候生成的),所以要自制一份方便查找,这里要注意的是地图编号并不是连贯的,比如StoneAge最大的编号为41000,实际上用到的只有1万多点,中间有很多编号是未使用的。 

前面说过,每个图片都有偏移量用于对齐,画地图的时候也需要的,不过这里有点问题,若只是将偏移量加上坐标,地面没有问题,而建筑物纵坐标则会错位,我并不知道正确的做法,我是这样处理的:
假设纵坐标偏移量为y,图片高度h,要画的坐标为y0,那么实际的坐标y1就是
y1=y0+h-47+y
47是一个单位地面的高度(所以地面不必这样处理,因为h-47=0),这样做可以基本对齐,希望有朋友提供更标准的方法。


另外,关于缩略图,就是将每个单位(占地面积1X1)缩成如下的四个点:
 □
□□□
如果一个物件面积为2X1,那么就是
   □
 □□□□
□□□
缩略图中每个图片都只用一种颜色表示,而这个颜色好像也是游戏自动生成的,所以要做缩略图的话,自己要制作一份颜色表。

『整理』魔力宝贝Bin文件格式:图像压缩格式(下)
发表评论
撰写评论