下文分析了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 |
假设读入的3X3地图数据顺序为123456789,对应的地图显示:
3 | ||||
2 | 6 | |||
1 | 5 | 9 | ||
4 | 8 | |||
7 |
假设纵坐标偏移量为y,图片高度h,要画的坐标为y0,那么实际的坐标y1就是
y1=y0+h-47+y
47是一个单位地面的高度(所以地面不必这样处理,因为h-47=0),这样做可以基本对齐,希望有朋友提供更标准的方法。另外,关于缩略图,就是将每个单位(占地面积1X1)缩成如下的四个点:
□
□□□
如果一个物件面积为2X1,那么就是
□
□□□□
□□□
缩略图中每个图片都只用一种颜色表示,而这个颜色好像也是游戏自动生成的,所以要做缩略图的话,自己要制作一份颜色表。