无论avf还是rmv,扫雷录像的文件格式在技术上逐渐定型,Arbiter、Viennasweeper等专业复刻版本可以轻松地记录并播放它们自己产生的录像。但这种“软件中心”的模式是封闭的,这些格式的文件只能自产自销,新的软件永远不能产生这些格式的文件。按照
thefinerminer的说法,这些复刻版本都是突然出现然后消失的。目前,由于开发人员退圈,对这些文件的解析均依赖逆向,开发人员无法安全、自由地在各种格式之间转换。为了克服这个问题,一方面,freesweeper首次实现了在一款软件上播放多种格式,本文将这种特性称为“跨格式”。另一方面,freesweeper也能将其他格式的录像文件转换成rawvf格式。同时具备这两种特性无疑是未来发展的方向。然而,rawvf格式是已占用磁盘空间为代价换取人类易读的,不符合工程实践的一般原则。
不仅如此,现有的文件格式还有以下缺点。(1)精度不够。随着硬件的发展,计时精度已经能达到毫秒级。(2)不支持utf-8等支持全球各种语言的编码。(3)不能记录游戏开始前的画面,例如,游戏开始前的标雷过程。(4)只有用户标识没有专用的比赛标识,导致解析困难。(5)只有用户标识没有唯一性标识,一旦同名就无法区分。(6)没有是否扫完的标志,必须解析完全局才能知道是否扫完。(7)局面中格子的尺寸是固定的16像素。
因此不能照搬照用,提出evf格式。
特点:
对于计算机,编码、解码方便。不同于RAWVF格式,开发人员否认计算机易读和人类易读可以兼顾。
遵循柯克霍夫原则,格式不设计混淆,而是使用校验码。
相比目前最流行的avf格式,evf是高精度的。精度最高可保留至毫秒。
字符串提倡采用utf-8编码,可以编码任何语言、文字、符号。
方格尺寸可调,为屏幕显示的真实尺寸。
最早从游戏开始前、影响游戏的左键或右键按下开始记录录像。
具有可读、无歧义的白皮书(文档),具有多个重磅项目的支撑。没有不为人知的细节、没有后门。
后缀:evf(eee555's minesweeper video format)
v0.2
格式说明:
定长1字节:版本号,本白皮书所述版本为'\2'。
定长1字节:在高信任的场景下,降低解析的复杂度。
定长1比特:是否扫完,1表示扫完。软件证明这局是完成的,即没有踩雷、时间等所有数值没有溢出。其余条件一概不保证。
定长1比特:是否正式,1表示正式。软件证明这局是正式的,一定扫完,包括没有用软件筛选3BV、没有使用辅助功能、是标准模式、时间等所有数值没有溢出。不一定包括是否满足排名网站对于3BV的额外限制。(这个标志方便哪些支持多种模式的扫雷排名网站)
定长1比特:是否公平完成,1表示公平完成。软件证明这局是公平完成的,一定扫完,比如没有用软件筛选3BV、没有使用辅助功能、时间等所有数值没有溢出。公平完成和正式的区别是,只有标准游戏模式可以是正式的,而upk、无猜等模式不正式,但可以是公平完成的。如果是正式的,则一定是公平完成的。(这个标志方便哪些仅支持标准模式的扫雷排名网站)
定长1比特:1是NF,等价于right == 0;0为其他。
剩余保留,且均为0;根据排名网站、成绩统计应用开发者的要求添加。
定长1字节:行数
定长1字节:列数
定长2字节:雷数,大端法。
定长1字节:方格尺寸
定长2字节:游戏模式(符号及含义:0->标准、1->upk;2->cheat;3->Density(来自Viennasweeper软件)、4->win7、5->竞速无猜、6->强无猜、7->弱无猜、8->准无猜、9->强可猜、10->弱可猜,剩余保留,根据新复刻版本开发者的要求添加),大端法。
定长2字节:3BV数值,大端法。
定长3字节:用时,单位毫秒,大端法。
以'\0'结尾字符串:录像的来源。如来自元扫雷3.1,则为"元3.1"。排名网站需要检查录像的来源。
以'\0'结尾字符串:用户标识(用户希望排名网站/软件在最显眼的位置展示出该标识)
以'\0'结尾字符串:比赛标识(用户希望使用该录像参与某比赛的凭证,但不希望排名网站/软件展示该标识)
以'\0'结尾字符串:唯一性标识(用户希望区别于其他同名用户,例如昵称、雷网id、省份、邮箱、网名、座右铭,但不希望排名网站/软件展示该标识)
以'\0'结尾字符串:开始时间戳,推荐采用格林威治时间自1970年1月1日至当前时间的总微秒数。第一次在没有标雷的位置左键弹起的时间。
以'\0'结尾字符串:结束时间戳,推荐采用格林威治时间自1970年1月1日至当前时间的总微秒数。
以'\0'结尾字符串:国家名称或代码。推荐采用ISO 3166-1:2020标准国家代码的二位字母编码(大写)。
以'\0'结尾字符串:设备信息相关的uuid,建议32位。请注意,开发人员需要保护用户的隐私。
变长⌈行数×列数/8⌉字节:1代表是雷,0代表不是雷。第i × 列数 + j个比特,代表局面第i(从0开始)行、j(从0开始)列是否为雷。例如:下述3行、4列的局面(用*代表雷):
[[1, 3, *, *],
[3, *, *, *],
[*, *, *, *]]就记录为00110111 11110000。
鼠标事件格式(循环结构):
定长1字节:操作类型。1:"mv";2:"lc";3:"lr";4:"rc";5:"rr";6:"mc";7:"mr",8: "pf",9: "cc"剩余保留(除'\0'、'\255')。
定长3字节:时间戳,单位毫秒。从第一次对局面有影响的左键或右键按下开始记录为0,此后递增。也就是说,第一次在没有标雷的位置左键弹起的时间戳不一定为0,且最后一个操作的时间戳大于等于实际用时。大端法。
定长2字节:与左边线的距离,单位为像素。局面外的操作的坐标均记录为(行数×方格尺寸, 列数×方格尺寸)。大端法。
定长2字节:与上边线的距离,单位为像素。局面外的操作的坐标均记录为(行数×方格尺寸, 列数×方格尺寸)。大端法。
定长1字节:'\0'表示有校验码(软件直接生成的录像);'\255'表示无校验码(例如是从avf等录像转译过来的)。
定长32字节:效验码,可有可无。