java解析魔兽争霸3录像_Java解析魔兽争霸3录像W3G文件(三):解析游戏开始前的信息...

上一篇博文中,通过对压缩数据块的解压缩以及合并,得到了解压缩的字节数组。从现在开始,就要处理这个数据。

这个部分的数据主要包括两大类信息:一类是游戏开始前的信息,例如游戏地图,游戏玩家,队伍、种族情况,高级选项等等,这些信息都是在进入游戏之前已经确定的东西;另一类是游戏进行时的信息,这块包括玩家游戏过程中的操作、游戏中的聊天等。其中,游戏开始前的信息占解压缩后的数据的前一小部分,紧接着后面的一大部分保存着游戏进行时的信息。

本文介绍如何解析游戏开始前的信息。

游戏开始前的信息的结构:

注:在下面各部分结构解释中,灰色字体标注的信息不对其进行解析,就不再详细介绍,要想了解可以参考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字节:游戏设置,这部分包含一些高级选项,如下图,不过这部分很少有人去改变,所以这里不再去解析了。

0818b9ca8b590ca3270a3433284dd417.png

2、5字节:未知。

3、4字节:地图校验。

4、variable字节:地图路径,字符串,以0x00结束。

5、variable字节:创建者,字符串,以0x00结束。

四、加入游戏的玩家列表

如果有多个玩家加入游戏,每个玩家对应一个下面的结构。由于是加入游戏的玩家,所以每个玩家对应的数据都是0x16开头。当遍历到第一个字节不是0x16时玩家列表就结束了。注意,加入游戏的玩家列表中不包含电脑玩家,电脑玩家在【五、Slot列表】中。

1、variable字节:玩家记录(详细查看【二、玩家记录】)。

2、4字节:0x00000000。

五、Slot列表

一个Slot是指游戏开始前的界面的一个玩家位置。如下图,即是4个Slot。

0818b9ca8b590ca3270a3433284dd417.png

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之一,分别表示50%到100%。

Java解析:

创建一个UncompressedData类,用于处理解压缩后的数据。

UncompressedData.java

package com.xxg.w3gparser;

import java.io.UnsupportedEncodingException;

import java.util.ArrayList;

import java.util.List;

public class UncompressedData {

/**

* 解压缩的字节数组

*/

private byte[] uncompressedDataBytes;

/**

* 解析的字节位置

*/

private int offset;

/**

* 玩家列表

*/

private List playerList = new ArrayList();

/**

* 游戏名称

*/

private String gameName;

/**

* 地图路径

*/

private String map;

/**

* 游戏创建者名称

*/

private String createrName;

public UncompressedData(byte[] uncompressedDataBytes) throws UnsupportedEncodingException, W3GException {

this.uncompressedDataBytes = uncompressedDataBytes;

// 跳过前4个未知字节

offset += 4;

// 解析第一个玩家

analysisPlayerRecode();

// 游戏名称(UTF-8编码)

int begin = offset;

while(uncompressedDataBytes[offset] !

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值