Mario Worker关卡文件结构
本文介绍Mario Worker的关卡文件(即.mfl文件和.mfs文件的结构)
原文载自百度永远的玛丽吧的帖子《哈哈,终于知道用MW生成的mfl文件和mfs文件的结构了,发帖庆祝!》,原作者为@_AgOH 。在转载的过程中编者对原文进行了重新排版与整理。
习惯上大家认为MW的关卡文件结构由_AgOH发现,但是根据已有资料,这项研究成果可能是由_AgOH和lyh在那段时间分别独立发现的。
压缩方式
MFL文件和MFS文件均使用Gzip格式压缩,可以轻松地使用 WinRAR或 7-Zip 打开,打开后里面是一个纯文本文件。运行时产生的.mfsx文件即为.mfs文件解压缩后产生的文件。我们暂时把解压缩后的MFL文件称为MFLX文件
MFLX文件的结构
头部(Header):
我们把BlocksDataStart之前的数据称为MFLX文件的头部,这一部分储存着关卡的基本信息,一共10行,大多可以在PREF'S部分设置。
行 | 含义 | 举例 | 举例释义 |
---|---|---|---|
1 | (关卡长度*32)+10 | 6410 | 关卡长度=(6410-10)/32=200 |
2 | (关卡高度*32)+10 | 650 | 关卡高度=(650-10)/32=20 |
3 | 关卡名称 | 1-1 | 关卡名为1-1 |
4 | 关卡作者 | _AgOH | 关卡作者为_AgOH |
5 | 关卡时间 | 400 | 关卡时间为400s |
6 | 重力(1-5) | 4 | 重力为4 |
7 | 库巴能量 | 10 | 库巴一共10格能量 |
8 | 水的深度信息 | 1900 | 这个数据的计算方法较为复杂,目前尚在研究当中,数值越大,水就越浅 |
9 | 关卡背景 | 3 | 第3个背景(GRASSLANDS) |
10 | 背景音乐 | 7 | 音乐7(Map2) |
方格数据(BlocksData)
下面我们就要进入mflx的核心了,这一部分存储的是Blocks的信息,其内容介于BlocksDataStart与BlocksEnd之间。
咋一眼看去,哇,都是0101,看不懂?其实,不要担心,这不是2进制数据,更不是乱码,而是每一个方格的Block信息!
其实Softendo在这一点上的处理相当弱智------他居然使用遍历的方法,每一个方格的信息都写入,即使这是个空的方格!
BlocksData一共分为n行,每一行对应关卡的一行,例如关卡的高度为50,那么一共就50行。
每一个方格占用2个字节储存信息,例如关卡长度为300,那么每一行就有600个字节。
储存每个方格Block信息的是利用对应Block的ID,如水管管体左部为17,右部为18,而如果什么都没有就用00来存储(具体每个Block的ID是什么就不说了,相信大家也不太需要这些数据)。
了解了这个规则,再看一看文件,不可思议的事情发生了:由1~9这9个数字居然组成了这个地图!多么完美的地形!!!
其它数据(Other Data)
上面说得这么多,您可能要说了:关卡的内容不仅仅是Blocks啊,还有风景(Scenery)、敌人(Enemies)等,呵呵,不要着急,BlocksEnd下面还有东西呢!
BlocksEnd下的数据分为若干行,每一行有11个字节,不过这些数据就更难解读了,先来说说基本格式吧:
21800640480
218:物品ID
0064:物品X坐标(是乘上32之后的结果)
0480物品Y坐标(是乘上32后的结果)
这里坐标的计算原则与我们平时不相同,
左上角为(0,0)往右X坐标增加,往下Y坐标增加
因此,上面的数据被解析为:在坐标(2,15)下放一个实心块(实心块的ID为218)
又如:
00132640448
含义为:在坐标(102(=3264/32),14(=448/32))下放一个Gommba(ID=001)
具体的物品与其ID的关系,有兴趣的朋友们可以去研究研究~
OK,貌似这个文件都分析完了?不对,后面怎么还有三个小黑块??呵呵,其实这个并不是什么神秘的东西,它只是标记这个文件的结束罢了~呵呵~
OK,mfl分析完了,下面该分析MFS了。。。
MFSX文件的结构
其实mfsx文件就是几个mflx的简单拼接,并未经过任何特殊处理,因此要反编译这些文件是相当简单的!!当然mw为了识别每一个关卡,还是要加一些分界线的,好了,现在什么都不说了,立刻开始吧!!
头部(Header)
除了mfl文件之外,mfs文件还要储存一些特殊信息,但是这样的信息只有1项:Mario的生命数,所以MFS文件的头部也只有1行!这一行就是Mario 的生命数,如15。 下面就是mfsx文件的主体了。
关卡分界线(New Level)
在mfs里,New Level字符的出现,将意味着一个mfl文件的结束(关卡1除外),以及另外一个mfl的开始。所以,New Level就是关卡的分界线啦~
小关卡主体(MFL Body)
在两个New Level之间的数据是这个关卡的主体,将它提取出来就是mflx文件啦!其实这就是反编译的原理,后面我会详细介绍~
结束标志(The End)
与mflx相同,mfsx同样使用一个小黑块作为文件结束标志。
如何把mfs文件反编译为mfl文件
其实可能部分朋友看到这里已经学会反编译的方法,不过为了方便新手们学习,这里还是在唠叨几句k~
所需工具:支持GZip解压缩的工具(如WinRAR、7-Zip、GZip等)、支持GZip压缩的工具(如7-Zip、GZip等)、一个mfs地图文件。
OK,操作开始----
- 使用GZip解压工具打开MFS文件,提取出里面的MFSX文件。
- 仿照2.3的方法,从里面提取出mflx文件。
- 使用GZip解压工具将mflx文件压缩,然后扩展名改为mfl。
OK,现在------大功告成!用MW打开反编译后的MFL文件,看看我们是不是成功了!