相信你提出这个问题是以为魔兽的录像文件是份视频,所以才提出了"为什么它只有几百KB"这样的问题,事实上这份文件不是一份视频文件,它实际上是一份自定义格式的文件具体格式和内容可以参考下面的内容。
我在GitHub找到的一份非官方发布魔兽3录像格式的文件描述,作者通过逆向工程和自己游戏的经验得出,里面非常详尽地描述了一个录像文件的格式和内容包括哪些东西,帮助你了解;
录像原理简而言之:魔兽客户端就是一个播放器,录像就是输入内容,播放器根据输入播放输出,其中的格式就是自己根据需求定义。
1.文件格式目录:
文件的目录大致包含以下内容,首先录像文件头包含了版本信息。虽然看到了这个版本的定义,但是对录像文件的数据没有做版本控制,这也是为什么播放录像的时候,如果客户端版本不对,就无法播放的问题。扩展一下,其实这个问题可以在定制录像文件的时候,针对不同部分的数据做特别的版本控制,以此达到兼容的问题,至少可以做到向下兼容。
===============================================================================
Table of Content 录像文件描述文件目录摘录
===============================================================================
1.0 Introduction
2.0 [Header]
2.1 [SubHeader] for header version 0
2.2 [SubHeader] for header version 1
2.3 Version information
2.4 WarCraft III The Frozen Throne beta replay information
3.0 [Data block header]
4.0 [Decompressed data]
4.1 [PlayerRecord] 玩家记录
4.2 [GameName] 游戏名称
4.3 [EncodedString] 加密字符串
4.4 [GameSettings] 游戏设置
4.5 [Map&CreatorName] 地图角色
4.6 [PlayerCount] 玩家数量
4.7 [GameType] 游戏类型
4.8 [LanguageID] 语言ID
4.9 [PlayerList] 玩家列表
4.10 [GameStartRecord]
4.11 [SlotRecord] 得分记录
4.12 [RandomSeed] 随机种子
5.0 [ReplayData]
6.0 General notes
6.1 Notes on official Blizzard Replays
7.0 Credits
8.0 Document revision history
===============================================================================5.0 [ReplayData]
===============================================================================
在上面的ReplayData中,包含了录像所有的时间片数据,被细分为多个区块Block,每个块的数据或固定大小,或不固定,数据的都是以一个字节代表blockID,用以标识要跳过某些固定的内容,以实现录像跳过等功能。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
0x1F - TimeSlot block 时间片数据 [ n+3 byte ]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1 word - n = number of bytes that follow 记录时间片数据长度
1 word - time increment (milliseconds) 时间增长量(ms)
about 250 ms in http://battle.net 战网250毫秒
about 100 ms in LAN and single player局域网100毫秒
n-2 byte - CommandData block(s) (not present if n=2) 输入命令数据块
For every player which has executed an action during this time slot there is
at least one 'Command data block'.
CommandData block:
1 byte - PlayerID
1 word - Action block length
n byte - Action block(s) (see file 'w3g_actions.txt' for details)
这里有两个重要的概念
1.TimeSlot Block"时间片数据块",魔兽客户端播放录像就是严格按照时间片进行解析播放,时间片数据中主要记录了数据长度和该时间片内游戏中所有对象发生的动作序列,可以参考下面的动作描述文件内容。
2.CommandData Block,“命令数据块”包括玩家的ID, 对应的动作序列长度和动作数据。
例如:
DD 00 0D 00 - use ability: cripple (UD Necromancer) [12-44-ID-ClickX/Y-TargetID]
这条记录就描述了此刻时间片内发生的事件,亡灵的巫师使用了残废,点击坐标(X,Y),对象的ID是谁谁谁酱紫,然后魔兽客户端内部定义一套播放的接口,根据输入的数据进行播放就能完成播放了。
ReplayData中主要数据是一下内容:===============================================================================
WarCraft III Replay action format description content 动作描述文件目录摘录
===============================================================================
1.0 Introduction
1.1 Standardized APMs
2.0 Action ID's
3.0 AbilityFlags
4.0 ItemID's
4.1 Stringencoded ItemID's
4.2 Numeric ItemID's
5.0 ObjectID's
6.0 Click Coordinates
7.0 General notes
8.0 Notes on older Patches
9.0 Credits
10.0 Document revision history
里面就记录一些描述游戏世界中对象的动作数据:
eg:
Following is a list of alphanumeric ID's found so far:
03 00 0D 00 - rightclick
04 00 0D 00 - stop
08 00 0D 00 - cancel (train, research)
0C 00 0D 00 - set rally point
0F 00 0D 00 - attack
10 00 0D 00 - attack ground (e.g. Orc Catapult)
12 00 0D 00 - move unit
16 00 0D 00 - patrol
19 00 0D 00 - hold position
- - - - - -
21 00 0D 00 - give away item (from inventory to unit or ground)
- - - - - -
22 00 0D 00 - swap item place 7 (slot of item to swap with!)
23 00 0D 00 - swap item place 8
24 00 0D 00 - swap item place 4
25 00 0D 00 - swap item place 5
2.格式读取说明
这里以PlayerRecord说明一下里面的具体录像格式,按照二进制的方式读取的
其中offest代表流的偏移,size/type代表读取的数据大小,这样就能精准的定位到具体的数据了。
4.1 [PlayerRecord]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
offset | size/type | Description
-------+-----------+-----------------------------------------------------------
0x0000 | 1 byte | RecordID:
| | 0x00 for game host
| | 0x16 for additional players (see 4.9)
0x0001 | 1 byte | PlayerID
0x0002 | n bytes | PlayerName (null terminated string)
n+2 | 1 byte | size of additional data:
| | 0x01 = custom
| | 0x08 = ladder
BTW:
回答一下,顶楼的问题:
“掉落表怎么做,实际掉落生成方式怎么设计”
其实掉落就是实现一个权重概率的问题,游戏设计策划人员会配置一个掉落库,包括掉落的物品ID,掉落权重,然后在怪物配置里面去绑定掉落的信息,魔兽里面的怪物都是一个野怪会掉落不同的物品,这是一对多的关系,然后实现权重就可以了,权重也是伪随机,就是说如果记录下了随机种子,那随机结果就是唯一且确定的,所以录像中一定会保留所有产生的随机种子,这样所有游戏随机的结果也就被记录下来了。
赶脚剑圣录像中的台词是不是都是都一样呢?For the burning Blade!