《千年神州》大型武侠游戏 千年公益服 手游电脑三端互通

 找回密码
 立即注册
查看: 778|回复: 0

千年 *.map文件格式说明

[复制链接]

139

主题

149

帖子

886

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
886
发表于 2021-3-28 03:28:05 | 显示全部楼层 |阅读模式
*.map 文件是记载地图信息的文件。

   
地表层是由地块组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。

   
2层地表就复杂一点,它是物件层的补偿层。物件是指树木、花草、房屋等东西的统称。为什么说第 2层是物件层的补偿层那,因为图象显示要有前后关系,近处的覆盖远处的东西,但长在地上的花,无论离的多么近都会被覆盖,所以给加在了地表 2层。下面开始说一个实际的文件start.map,用 UE打开它后会看到 16进制数据,右面对应是asc 码,前 7个字节的 16进制数据是:“41 545A 4D 41 50 32”,看右侧对应的 asc码是 “ATZMAP2”,这个是地图格式标识,是说明文件格式的。之后 9个字节为空,我们跳过,不用理会。之后的 4个字节是 “28 00 00 00”,这个宽度是组成大地图的小正方形的宽度,为什么这么说呢?看下面的图你就会明白了,比如是一个 9 * 9 的大地图,是这样记录在 .map文件中的:1 1 1 22 2 3 3 31 1 1 2 2 2 3 3 31 1 1 2 2 2 3 3 34 4 4 5 5 5 6 6 64 4 4 5 5 5 6 6 644 4 5 5 5 6 6 6前面我们所说的组成大地图的小正方形的宽度(兰色那个矩阵),在这里就是 3。我们再继续看 map文件,接下来的 8个字节是:“ C8 00 00 00 C8 00 00 00”,前 4个字节是这个地图的宽度,后 4个字节是这个地图的高度 。下面是正式开始的地图数据了,这里有一点要注意的,我们前面提到了组成大地图的小正方形,他们在map 文件中被记录的时候,每个这个正方形的数据前面都会空出 20个字节,在读文件的时候跳过即可。地块数据由 12个字节的数据来表示,比如:“13 00 03 12 01 07 86 00 03 03 00 01”这个地块。13 00 地表一层的序号

03      
在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
07      
在地表二层 12 01 这个大序列下的子序列编号
86      
物件层的大序列
00      
物件层的大序列下物件的子序列编号
03 03 00  
目前不详
01      
行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。

//************************************************************
//
加载地图基本数据函数;
//************************************************************

//************************************************************
//
加载地图基本数据函数;
//************************************************************

int Cmap:oaddata(char *filnam)
{
        int Temdata;

        if(filnam == "") return 0;

        fp_map = fopen(filnam,"rb");

        if(fp_map == NULL)       return 0;

        fseek ( fp_map, 16, SEEK_SET);
        fread ( &ShortWidth, 4, 1, fp_map);
        fread ( &Width, 4, 1, fp_map);
        fread ( &Height, 4, 1, fp_map);

        int TW = Width / ShortWidth;
        int TH = Height / ShortWidth;

        for (int j = 0 ; j < Width ; j++)
        {
                _DELETE_ARRAY(Cell);
                _DELETE_ARRAY(Role);
        }

        Cell = new stCell*[Width];
        Role = new stRole*[Height];
        for (j = 0 ; j < Width ; j++)
        {
            Cell[j] = new stCell[Height];
                Role[j] = newstRole[Height];        
        }        

        fseek ( fp_map, 28, SEEK_SET);

        for (int y1 = 0; y1 < TH ; y1++)
        {
                for (int x1 = 0; x1< TW ; x1++)
                {
                       fseek ( fp_map, 20, SEEK_CUR);
                       for (int y2 = 0; y2 < ShortWidth ; y2++)
                       {
                               for (int x2 = 0; x2 < ShortWidth ; x2++)
                               {
                                       fread (&Temdata , 2, 1, fp_map);
                                      Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;

                                       fread (&Temdata , 1, 1, fp_map);
                                      Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;

                                       fread (&Temdata , 2, 1, fp_map);
                                      Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;

                                       fread (&Temdata , 1, 1, fp_map);
                                      Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
                                       // 6
个字节

                                       fread (&Temdata , 1, 1, fp_map);
                                      Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
                                       
                                       fread (&Temdata , 1, 1, fp_map);
                                      Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;

                                       //fseek (fp_map,3,SEEK_CUR);
                                       fread (&Temdata , 1, 1, fp_map);
                                      Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
                                       
                                       fread (&Temdata , 2, 1, fp_map);
                                      Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;

                                       // 1
个字节
                                       fread (&Temdata , 1, 1, fp_map);
                                      Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
                                       //if (ftell(fp_map)> FilZize) return 0;
                               }
                       }
                }
        }

        fclose(fp_map);


        return 1;
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|千年神州

GMT+8, 2022-10-3 16:13 , Processed in 0.065637 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表