相信你提出这个问题是以为魔兽的录像文件是份视频,所以才提出了"为什么它只有几百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!

java解析魔兽争霸3录像_《魔兽争霸》的录像,为什么长达半小时的录像大小只有几百 KB?...相关推荐

  1. 敲代码时如何快速移动光标_数控加工中心编程入门知识,半小时快速入门!

    数控加工中心编程入门知识汇总,教你半小时快速入门!不管做哪一行,想要成为个中高手,必然要经得住时间的历练,自身要不断提高工作能力,要想成为一个数控高手,从大学毕业进工厂起,最起码需要6年以上的时间.既 ...

  2. 敲代码时如何快速移动光标_数控加工中心编程入门知识,半小时快速入门!超简洁明了!...

    数控加工中心编程入门知识汇总,教你半小时快速入门!不管做哪一行,想要成为个中高手,必然要经得住时间的历练,自身要不断提高工作能力,要想成为一个数控高手,从大学毕业进工厂起,最起码需要6年以上的时间.既 ...

  3. java解析xml工具类_通过dom4j解析XML字符串XMLDocUtil工具类转换为XML文档及获取指定根节点及指定节点路径内容代码示例...

    一.前言 通过dom4j解析XML文档的XMLDocUtil工具类,进行解析xml字符串为Document文档对象.获取根节点元素路径内容getRootElement.获取唯一路径节点的值getSin ...

  4. java 解析 json 索引对象_怎么获取json对象的属性和值

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript(Standard ECMA-262 ...

  5. java 解析m3u8的实例_使用java线程池批量下载m3u8。合并mp4.

    使用java线程池批量下载m3u8合并mp4. 看了线程池的demo,然后就想下载文件试试. 代码未必规范,多多建议. 大家可以自行修改,满足自己的需求. 还需要深入学习一下线程池. 给俺个星星⭐,可 ...

  6. java 解析滑动验证码图片_滑动图片验证码demo

    [实例简介] 极验验证更改后的版本,该demo导入eclipse直接可用,带有详细使用说明文档,验证通过发送短信 [实例截图] [核心代码] 极验验证使用说明 └── 极验验证使用说明 ├── gt- ...

  7. java包名命名规则_告别编码5分钟,命名2小时!史上最全的Java命名规范参考!

    简洁清爽的代码风格应该是大多数工程师所期待的.在工作中笔者常常因为起名字而纠结,命名已经成为我工作中的拦路虎,夸张点可以说是编程5分钟,命名两小时! 每个公司都有不同的标准,目的是为了保持统一,减少沟 ...

  8. java返回字符串浏览器换行_解决浏览器显示页面长字符串换行问题总结

    问题产生 在web页面HTML中,容器(div,table等)中如果放入过长的字符串(英文.数字和部分标点符号组成,无空格),将会撑大容器,破坏页面外观. 出现这种情况基本有两个可能: 1. 人为的恶 ...

  9. delete 字符数组 []_前端基础扫盲系列 长达8000字的数组总结

    本文 GitHub github.com/ponkans/F2E 已收录,有一线大厂前端面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习.文末有福利~~ 前言 数组是 ...

  10. 易语言数组转文本_前端基础扫盲系列 长达8000字的数组总结

    本文 GitHub github.com/ponkans/F2E 已收录,有一线大厂前端面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习.文末有福利~~ 前言 数组是 ...

最新文章

  1. 文件句柄和文件描述符的区别和理解指针
  2. 2.1 . df 命令和du命令
  3. [jobdu]调整数组顺序使奇数位于偶数前面
  4. 微信支付(JSAPI) - chooseWXPay fail 问题解决
  5. UA MATH566 统计理论2 C-R不等式简介
  6. 6月2日,网易云信SDK全面支持IPv6
  7. nginx php怎么配置伪静态,nginx rewrite 伪静态配置参数和使用例子
  8. gdb 查看是否 栈溢出_ASLR、DEP与栈保护(HFUT-ZRB#x27;s Task)
  9. Java中的Object类的toString()方法,equals()方法
  10. Magisk使用及模块分享
  11. 一图看清美国最具前景的50家人工智能公司
  12. QTableWidget背景色交替
  13. 【笔记】路由器:动态路由配置、交换机:vlan配置 网络层次结构:OSI7层模型 、TCP/IP模型(4层模型)、DNS解析过程
  14. android 触摸事件流程。
  15. 【零基础教学】Unet局域网联机的实现——最基础的Unity联网实现方式(2)
  16. 音符起始点检测(音频节奏检测)(5)
  17. MacM1 AndroidStudio 自带模拟器安装不上apk
  18. 由114.114.114.114和8.8.8.8学习DNS
  19. [绍棠_Swift] SwiftyJSON的使用详解(附样例,用于JSON数据处理)
  20. HTML特殊转义字符 Javascript转义字符

热门文章

  1. oracle11g rman实例,oracle11g rman备份与恢复详细实例
  2. 杨辉三角python小代码
  3. Live2d vue 插件 将live2d引入vue工程 在网页上添加live2d模型
  4. VSCode解决中文乱码问题
  5. librtmp读包阻塞问题修复
  6. 【2022年战略管理公开课计划】向华为学习 业务领先的战略规划SP(BLM)和战略解码BP(BEM)
  7. otsu阈值分割算法原理_局部阈值分割算法总结
  8. c语言源程序的基础单位,c源程序的基本单位是什么
  9. 基于51单片机的电子秤设计
  10. java 旅游网站项目实现_基于jsp的旅游网站a-JavaEE实现旅游网站a - java项目源码