此系列文章分为3篇:理论篇,实战篇,转换篇。献给愿意花时间,动脑子去做服的GM。
此系列文章讨论的地图范围仅限于热血传奇(以下简称传奇2)的地图,本人能力有限,其他传奇的新格式不在讨论范围内。在观看本文之前,需要理解16进制的计算,以及明白数据存放是高位在后,低位在前的原理。
—————————————-分割线——————————————
传奇2的地图文件是一个索引文件,并不包含有图像信息。登录器通过这个map文件,找到指向的wil文件中的图像,并在屏幕中显示出来。
这些map文件的格式大体上有两种:12字节地图和14字节地图。
怎么区分呢?一个简单但不绝对准确的区分方法,用乐都地图编辑器打开后不报错的是12字节地图,要报错的是14字节地图。待会再讨论正确的方法。
下载一个绿色版UltraEdit工具,以下简称UE。
用UE打开一张地图,以比奇省0.map为例子:
我用蓝底选中的52个字节部分,习惯上称为“文件头”,包含了地图大小及地图描述,后面的是数据,传奇2的地图数据记录的是每个坐标点的具体信息。文件头开头的4个字节:BC 02 BC 02,这是地图的大小,第一组BC 02是横向大小,第二组是纵向大小。
怎么计算呢?前面我说过,数据存储是按照高位在后,低位在前,所以第一组应该是02BC,用Windows自带的计算器,可以算出16进制的2BC=10进制的700,所以比奇省地图就是一张700*700的地图,拥有49000个坐标点。在UE的右下角可以看到这张地图大小为5880052字节,那么(5880052-52)÷490000=12,所以0.map是12字节地图。
至于文件头的后面48个字节嘛,是一些描述性信息,没什么用,我们直接无视了。
和地图相关的素材,相信大家都有所了解,这里还是提一下:
Tiles 大地砖,最底层
SmTiles 小地砖,中间层
Objects 地面物体,表层
Map文件里面其实就是对上面的文件的索引,从里面得到地图的图像数据。12字节地图占了所有地图的90%以上,那么它的每个字节有什么作用呢?网上查得资料:
第1字节:Tiles里图片的序号,Tiles里第一张图序号是0,那么代码为0+1=1。低位代码。
第2字节:Tiles里图片的序号,Tiles里第一张图序号是5,那么代码为5+1=1。高位代码。最高位+8表示为不可移动的标记。
第3字节:smTiles里图片的序号,smTiles里第一张图序号是0,那么代码为0+1=1。低位代码。
第4字节:smTiles里图片的序号,smTiles里第一张图序号是5,那么代码为5+1=1。高位代码。最高位+8表示为不可移动的标记。
第5字节:obj里图片的序号,obj里第一张图序号是0,那么代码为0+1=1。低位代码。
第6字节:obj里图片的序号,obj里第一张图序号是5,那么代码为5+1=1。高位代码。最高位+8表示为不可移动的标记。
第7字节:门动画
第8字节:门开关标识
第9字节:动画效果
第10字节:动画速度
第11字节:obj的序号,实际计算是,比如obj11,那么代码就为11-1=10
第12字节:常亮点光源亮度值
对于14字节地图,只是在12字节地图的基础上添加了对tiles,smtiles的编号:
第13字节:tiles的序号,实际计算是,比如tiles5,那么代码就为5-1=4
第14字节:smtiles的序号,实际计算是,比如smtiles5,那么代码就为5-1=4
对于以上说明现在不需要去深究,知道个大概即可,如果有误的话,实战篇会更正并对其他字节作用做详细说明。
可以看出,tiles和smtiles含有移动标记,那么高位最多为8F,所以最多支持,“(8FFF)16=(36863)10”张图片,即Tiles.wil和smTiles.wil,Objects.wil里最多存放36863张有效图片。
注意:
1. 新版WZL客户端所用的地图和老版WIL客户端是一致的,无任何区别。
2. map文件的存储方式是按列存储的。
看到这有没有学会地图的计算呢?那么我出个题,一张500*500的14字节地图共有多少字节呢,文件头开始4位应该怎么写?