游客您好
  • 点击联系客服

    在线时间:8:30-18:00

    客服微信

    Wkr-3000y-kf

    电子邮件

    3000y@wenkeruan.com
  • 手机版

    随时掌握游戏动态

  • 扫一扫二维码

    添加微信客服

Lv.5 解脱境
277号会员,0活跃值,2022.10.27 加入
  • 207发帖
  • 173主题
  • 0关注
  • 0粉丝
这个人很懒,什么也没有留下。
独家推荐 更多>

[安全工具] 千年 *.map文件格式说明

[复制链接]
快要发癫啦 发表于 2023-2-8 10:41:09 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
*.map 文件是记载地图信息的文件。
2 T' M& F- k, o) O, Y/ P  C
- C* A1 u  l* D
    地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
# ^( @9 N3 A: ]; o! L; ~4 `! I

! W) @& d+ V/ Z5 b# \9 O, H
    第 2层地表就复杂一点,它是“物件”层的补偿层。“物件”是指树木、花草、房屋等东西的统称。为什么说第 2层是“物件”层的补偿层那,因为图象显示要有前后关系,近处的覆盖远处的东西,但长在地上的花,无论离的多么近都会被覆盖,所以给加在了地表 2层。下面开始说一个实际的文件start.map,用 UE打开它后会看到 16进制数据,右面对应是asc 码,前 7个字节的 16进制数据是:“41 54 5A 4D 41 50 32”,看右侧对应的 asc码是 “ATZMAP2”,这个是地图格式标识,是说明文件格式的。之后 9个字节为空,我们跳过,不用理会。之后的 4个字节是 :“28 00 00 00”,这个宽度是组成大地图的小正方形的宽度,为什么这么说呢?看下面的图你就会明白了,比如是一个 9 * 9 的大地图,是这样记录在 .map文件中的:1 1 1 2 2 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 64 4 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 地表一层的序号2 B7 g7 _( R$ M) x, v1 F
8 [9 ?6 J1 Y% n+ F7 [- b
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
) s" w8 [' h, o, ^) K
07      在地表二层 12 01 这个大序列下的子序列编号
/ \7 m+ ^$ j- S6 u( U$ b2 ]
86      物件层的大序列* {% @4 i- X4 _, C: j- v& m
00      物件层的大序列下物件的子序列编号
' B4 m! J6 k% n( x
03 03 00  目前不详
7 Y# P9 j% \8 M) |* p
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。, \# _2 U& r/ Y$ A+ x
- b+ o- p& B( y1 P* s4 G( E
//************************************************************, B2 L4 g' [- Y7 c
// 加载地图基本数据函数;
; h/ U5 H6 V# K4 Q& c) N
//************************************************************
0 m6 w6 b' e! z+ h2 _) e/ W" f

( `5 @9 `3 H9 b" u' @) _
//************************************************************# `" ?/ y6 U* B9 K3 Z+ x& P" V
// 加载地图基本数据函数;
. B4 o1 ?+ s  A$ Y& H4 L1 W
//************************************************************( `1 c1 ]6 {0 b% R

0 r, a' _+ V' [; g3 `( f
int Cmap:oaddata(char *filnam)6 e, S5 S4 {% b* Z& u
{
4 R# p" i1 z5 D7 o
        int Temdata;8 ?4 y& v9 c7 {7 N0 y9 K$ u3 A8 K( j

/ h9 {7 |9 N% ?' K! M/ r) N
        if(filnam == "") return 0;1 S: q6 a# h, W7 i  p4 C! Y
9 _% X: O1 R; ?& P& }5 r8 ^
        fp_map = fopen(filnam,"rb");7 |# w, V0 S, E" a

" f6 t5 ?! g1 `
        if(fp_map == NULL)        return 0;
% J- W9 |- _, s/ U3 S  J) q
- P- q8 N1 l9 y3 d, b0 v
        fseek ( fp_map, 16, SEEK_SET);
) o; O( ^' W( f: J: Y( Z9 o& a; w
        fread ( &ShortWidth, 4, 1, fp_map);% ^" H" _/ Z0 p& h. g- F
        fread ( &Width, 4, 1, fp_map);/ _; v% t+ c/ `2 V
        fread ( &Height, 4, 1, fp_map);
7 ~7 l2 e+ G* k. |
% o! v; F6 N2 B
        int TW = Width / ShortWidth;
. A( Q5 g) N, x7 F" A8 F: V
        int TH = Height / ShortWidth;( ~( H7 s  v- [

: C5 K% p* m! n% ?8 t1 H0 k
        for (int j = 0 ; j < Width ; j++)
4 f1 b. _, ?9 w0 b; C
        {
1 ^6 t3 k1 a7 V: W
                _DELETE_ARRAY(Cell);+ ?$ M( D  I; `: g. u
                _DELETE_ARRAY(Role);  K3 Y" T- a5 O5 v
        }
3 w) `$ G: g' U2 Q; V9 Y% [
* j0 S" |% k( N
        Cell = new stCell*[Width];; j! x! a$ r* j6 n  z! B
        Role = new stRole*[Height];
8 C' e/ @' c: ~
        for (j = 0 ; j < Width ; j++)
  W& p0 z/ _  s& J7 |! v. K
        {4 R1 A  P1 ^( b1 a! M2 f
            Cell[j] = new stCell[Height];
. f' z% I. q: \) \" O' S3 _1 S
                Role[j] = new stRole[Height];        % Z8 V2 `" e  Z& O  l
        }        
$ U% ^/ M8 n/ v

$ r+ N' g+ j7 q1 U
        fseek ( fp_map, 28, SEEK_SET);
% S$ [( G/ P  Y  k2 `* X/ o+ K
7 u* ], t! w1 k# m9 f
        for (int y1 = 0; y1 < TH ; y1++)9 e/ n8 F& d) `
        {
( O2 M6 l% {9 k" z9 ]6 ]
                for (int x1 = 0; x1 < TW ; x1++)/ t6 X  w0 m/ m! `
                {- U' b3 `7 z2 h- h9 V* g
                        fseek ( fp_map, 20, SEEK_CUR);
6 G0 t" m, I2 _0 L3 m
                        for (int y2 = 0; y2 < ShortWidth ; y2++)
; I- q* a! M: m" A+ Y; z- S9 f
                        {% g3 S' s9 F/ i+ b  ?5 u
                                for (int x2 = 0; x2 < ShortWidth ; x2++)
- `/ g" o: `' {6 H- i; a9 m
                                {
2 k8 b. y7 l# z7 P0 {
                                        fread ( &Temdata , 2, 1, fp_map);" t$ u1 ?2 Y" Q) ~
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;8 w, _* s# l3 I
% }$ P" u0 S. X( H# {) M2 a% t
                                        fread ( &Temdata , 1, 1, fp_map);% q( i: n' o" [1 t3 W8 U# T
                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
$ B2 u+ f% C$ Z7 Z) n  m
# y! m3 ?  c7 p+ H& z1 Y7 k
                                        fread ( &Temdata , 2, 1, fp_map);
5 A# K: {5 r+ r/ Y7 n
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;8 R  [5 b/ J5 j! b
# p) d4 B6 z; @8 b
                                        fread ( &Temdata , 1, 1, fp_map);. [3 c6 i3 C# C( E
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
. O! I& F! M* H9 n% E) T! B
                                        // 6个字节% \  _' t% q: f9 R
& s7 y& t, ~4 C5 g8 u& M/ b+ E: m
                                        fread ( &Temdata , 1, 1, fp_map);0 ?8 h& e8 ~# R/ e& y
                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
& \! k" U8 X0 f, G6 N- p& y3 `1 \
                                        % R5 M8 x* ^$ V5 P6 T$ z
                                        fread ( &Temdata , 1, 1, fp_map);
6 ^* V' y$ N; O* \9 G! p5 R4 L
                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;7 L# O  K8 U1 z0 z% i6 l! b

  f! e2 ^6 _$ ^
                                        //fseek ( fp_map,3,SEEK_CUR);
( P* d- p# x- b) h( t. v) `3 O
                                        fread ( &Temdata , 1, 1, fp_map);# l; X( v, v1 V8 S* B9 [- q
                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
  T  F9 A8 f  y; ~
                                        " w# N9 C5 K: n2 s: M0 @
                                        fread ( &Temdata , 2, 1, fp_map);
; [3 i6 Z) A0 Q/ P7 a4 g3 H3 {
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;6 r+ g: d( e! \& q4 l" F
% b& i  \2 R( c0 w3 A/ T
                                        // 1个字节( h5 M+ T2 t" Z4 [. d4 d
                                        fread ( &Temdata , 1, 1, fp_map);
0 I" A' N! M7 V9 n; R# g# q
                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;0 P% m2 ]; f% q4 r2 l9 E9 N' T, a
                                        //if (ftell(fp_map) > FilZize) return 0;& ?: U, K8 X% F) \6 m" y
                                }, ?- Q5 Q1 e( t9 p$ }& O, ?
                        }" z$ e; C' i* |/ Z7 A
                }8 ^6 E* G/ t# i; _
        }9 w9 L$ w. @9 e% [7 G
! `+ Y7 ~' a0 \& C
        fclose(fp_map);! B, \; P5 [8 b1 m! ^5 L0 \

% y2 I9 d+ T8 N) j  k. R% q8 k5 w

* s' K  t3 h5 n
        return 1;
$ O$ c8 `: q3 `8 ~- e1 u
}
- a; P) p6 k) V
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

Powered by Discuz!X3.4 ©2001-2013 Comsenz Inc.闽公网安备 35099902000100号增值电信业务经营许可证 闽B2-20220593 闽ICP备2023014375号