上一篇博文中,通过对压缩数据块的解压缩以及合并,得到了解压缩的字节数组。从现在开始,就要处理这个数据。
这个部分的数据主要包括两大类信息:一类是游戏开始前的信息,例如游戏地图,游戏玩家,队伍、种族情况,高级选项等等,这些信息都是在进入游戏之前已经确定的东西;另一类是游戏进行时的信息,这块包括玩家游戏过程中的操作、游戏中的聊天等。其中,游戏开始前的信息占解压缩后的数据的前一小部分,紧接着后面的一大部分保存着游戏进行时的信息。
本文介绍如何解析游戏开始前的信息。
游戏开始前的信息的结构:
注:在下面各部分结构解释中,灰色字体标注的信息不对其进行解析,就不再详细介绍,要想了解可以参考w3g_format.txt文档。
一、总体结构
1、4 字节:未知。
2、variable字节:主机玩家记录(详细查看【二、玩家记录】)。
3、variable字节:游戏名称,字符串,以0x00结束。
4、1字节:空字节,0x00。
5、variable字节:特殊编码的数据(包括游戏设置、地图、创建者),以0x00结束(详细查看【三、特殊编码的数据】)。
6、4字节:玩家数量。
7、4字节:游戏类型。
8、4字节:未知。
9、variable字节:加入游戏的玩家列表(详细查看:【四、加入游戏的玩家列表】以及【二、玩家记录】)。
10、variable字节:Slot列表(详细查看:【五、Slot列表】)。
二、玩家记录
1、1字节:玩家类型,0x00主机,0x16加入游戏的玩家(【四、加入游戏的玩家列表】)。
2、1字节:玩家ID。
3、variable字节:玩家名称,以0x00结束。
4、1字节:附加数据大小,0x01或0x08。
5、1或8字节:附加数据。
三、特殊编码的数据
这是一段特殊编码的数据,该部分需要解码后才能继续解析,解码的方式直接看下面的代码,这里不再介绍。
解码后:
1、4字节:游戏设置,这部分包含一些高级选项,如下图,不过这部分很少有人去改变,所以这里不再去解析了。
2、5字节:未知。
3、4字节:地图校验。
4、variable字节:地图路径,字符串,以0x00结束。
5、variable字节:创建者,字符串,以0x00结束。
四、加入游戏的玩家列表
如果有多个玩家加入游戏,每个玩家对应一个下面的结构。由于是加入游戏的玩家,所以每个玩家对应的数据都是0x16开头。当遍历到第一个字节不是0x16时玩家列表就结束了。注意,加入游戏的玩家列表中不包含电脑玩家,电脑玩家在【五、Slot列表】中。
1、variable字节:玩家记录(详细查看【二、玩家记录】)。
2、4字节:0x00000000。
五、Slot列表
一个Slot是指游戏开始前的界面的一个玩家位置。如下图,即是4个Slot。
1、1字节:固定0x19。
2、2字节:下面的数据的字节数。
3、1字节:Slot数量。
4、variable字节:Slot记录的列表,其中包含多个Slot记录,数量即上面一个字节的值(详细查看【六、Slot记录】)。
5、4字节:随机种子。
6、1字节:队伍、种族是否可选择。
7、1字节:地图中的位置数量。
六、Slot记录
每个Slot占9个字节:
1、1字节:对应的玩家ID,电脑玩家是0x00。
2、1字节:地图下载百分比(一般都是100)。
3、1字节:Slot状态,0x00空的,0x01关闭着的,0x02使用中的。
4、1字节:是否是电脑玩家,0x00非电脑玩家,0x01电脑玩家。
5、1字节:队伍,0~11分别表示队伍1到队伍12,12表示裁判或观看者。
6、1字节:颜色,0红1蓝2青3紫4黄5橘黄6绿7粉8灰9浅蓝10深绿11棕12裁判或观看者
7、1字节:种族,0x01/0x41人族,0x02/0x42兽族,0x04/0x44暗夜精灵,0x08/0x48不死族,0x20/0x60随机。
8、1字节:电脑难度,0x00简单的,0x01中等难度的,0x02令人发狂的。
9、1字节:障碍(也就是血量百分比),0x32,0x3C,0x46,0x50,0x5A,0x64之一&#x