游客您好
  • 点击联系客服

    在线时间: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 文件是记载地图信息的文件。
: k6 `. p  Z9 @5 H# Q9 Y

; n% @' s; C+ J" F- F$ r8 o5 m) j
    地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
0 S3 P( o( l. u% `% |4 ]
9 r7 ]9 v: [. D& d8 P2 G* s6 n* `9 d
    第 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 H# C) k4 R0 S" A

% B7 a  E' S1 Y, w& S& v( i( M2 Q4 A  Z
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
' |3 s9 X8 f' ?8 e0 \: z+ u
07      在地表二层 12 01 这个大序列下的子序列编号
. F  x/ |  [7 y: {: g3 T2 n
86      物件层的大序列
* ]9 M5 Q. Q/ ~) `& v
00      物件层的大序列下物件的子序列编号$ O2 b7 Q4 T  V7 O/ D
03 03 00  目前不详0 S7 d  g3 z0 F# g4 M) i2 R
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。5 s0 u6 H; Q) x

/ V2 A# b% X6 y5 A3 t
//************************************************************2 z6 z; g# a3 r1 C( C, L9 d
// 加载地图基本数据函数;
1 ?9 V' q' G0 u
//************************************************************$ ~8 I' n, u  Z/ F1 @
1 B/ f' ]0 `+ j2 A
//************************************************************- R% l& k+ q$ T
// 加载地图基本数据函数;
$ T; X( R- P0 E$ O8 \
//************************************************************0 r6 r( o' _1 Y$ s# d* l5 U! h
; s- a! C9 H3 c3 m" C
int Cmap:oaddata(char *filnam)6 a; V0 [% p0 J% o4 I' a7 p7 K
{6 d. a, T8 R0 S8 ^+ I3 F  x  r6 f
        int Temdata;
9 a9 v/ a  j* v
3 r- W; _. j9 B& O1 O0 ~2 A
        if(filnam == "") return 0;% D' b9 W0 [& h) n+ H. J

  {# j8 d" D# Z' k( k
        fp_map = fopen(filnam,"rb");
1 P8 S/ c& {4 C5 y$ W( E
6 a7 j; Y2 q6 L7 g
        if(fp_map == NULL)        return 0;/ N3 T" l( B% Y- E' `& A, ?
5 W# T* {4 ?' W7 F8 I
        fseek ( fp_map, 16, SEEK_SET);* Q0 U% A- z# n' n, h- s
        fread ( &ShortWidth, 4, 1, fp_map);0 c. f% ~8 C2 V8 I* A% u: w
        fread ( &Width, 4, 1, fp_map);5 a1 _3 ~5 u, \/ w8 t
        fread ( &Height, 4, 1, fp_map);
4 ]6 G! v" X& s0 q% z1 s
+ K) z- o& M, e
        int TW = Width / ShortWidth;0 u+ T( L' @8 X6 r
        int TH = Height / ShortWidth;; ]4 I; R! W' n5 m7 c
- U. n4 M! |. O; F% J! d) d
        for (int j = 0 ; j < Width ; j++)
4 x2 F0 v  F& P  t$ u4 U7 k
        {& Y& T; D9 V# e' f& c" o
                _DELETE_ARRAY(Cell);
: d" F! R! Z( B. `" e" ^
                _DELETE_ARRAY(Role);
7 q: D+ ?, C$ N# A
        }% ?$ s( ^) \+ }" }  W1 ^3 [
) F4 X" M& x7 _  O! ~: G
        Cell = new stCell*[Width];
; Y/ @% `+ W; W# X1 a% Y1 o0 l% l6 P
        Role = new stRole*[Height];
/ X6 v+ @. v' a+ ~
        for (j = 0 ; j < Width ; j++)
% g4 {8 t( a4 U0 X) w' \
        {1 N) C9 s: R. O5 d1 Q: C
            Cell[j] = new stCell[Height];
) z: l# \) p" m( n- y9 Z
                Role[j] = new stRole[Height];        " w, {. D8 y1 ~  g0 I
        }        
5 f2 k  j1 t. A' X, ?- s% A- c9 I

+ Z) e6 b1 h$ j+ ]7 x
        fseek ( fp_map, 28, SEEK_SET);
, n% i7 i! r# h& W! B/ V+ \

3 j7 N! r8 n+ T+ u! I6 D  s
        for (int y1 = 0; y1 < TH ; y1++)
) g  i. u7 c! q! @  t8 L
        {9 L3 ^: m+ }, L0 U
                for (int x1 = 0; x1 < TW ; x1++)
' R6 w. S/ |' ]; Q8 p# B' O
                {3 K/ t" H, t7 K/ R1 a7 _: {; d/ A4 @
                        fseek ( fp_map, 20, SEEK_CUR);
0 R9 w! |$ D0 P! K+ t: P
                        for (int y2 = 0; y2 < ShortWidth ; y2++): F8 E4 m* w8 _6 y5 ~' m# z/ U
                        {% s/ j' R! R- O+ G
                                for (int x2 = 0; x2 < ShortWidth ; x2++)
: F) P5 @+ ]1 B9 p; k% v& I
                                {
2 u2 E  h: b0 Y3 @4 k  C
                                        fread ( &Temdata , 2, 1, fp_map);
) n% t! z2 \" ~/ g
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;/ g' R5 L/ i9 r" q

4 J; a! q( r; b4 R# I& Y& _- v$ a
                                        fread ( &Temdata , 1, 1, fp_map);$ t* n7 Y" Q; _0 O
                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
+ p8 _3 C, N. A* L
9 F! {- v+ p" L) G* h( v8 m3 ~* s
                                        fread ( &Temdata , 2, 1, fp_map);2 j7 \- `  Q5 V) M0 v
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;2 ?( W9 K. H- x+ q5 ?* v
+ E9 n2 Z& }/ }, |8 f  ]
                                        fread ( &Temdata , 1, 1, fp_map);
$ O0 E+ B& h6 t# T& E+ Y( a. l
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;; o* P- l. j( ^7 ?8 V( P- X9 h* G
                                        // 6个字节7 x/ W+ ?( B  R
2 M! {6 E+ j# r2 o0 L5 {7 w
                                        fread ( &Temdata , 1, 1, fp_map);
3 u5 I* U! A1 H- c
                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;# _7 }! h, n% L8 o  c
                                       
- t2 e' U( [3 F1 H5 u% z
                                        fread ( &Temdata , 1, 1, fp_map);  |' _# ?( R( a" K0 L  _6 v0 W3 S
                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;% z( ?0 y- L# n4 x( l
! h, h1 }% I' [) p0 Q
                                        //fseek ( fp_map,3,SEEK_CUR);
  n# w, c8 r- Z$ R  v
                                        fread ( &Temdata , 1, 1, fp_map);
0 y& ]% {8 X3 ^1 x
                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;  J9 i0 J4 f* x
                                        ; g: P( `3 o& _4 J
                                        fread ( &Temdata , 2, 1, fp_map);
9 [" t7 }8 r9 E
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;5 u1 _% C$ f- |* D
- {2 Q4 Y3 P1 s3 s7 t
                                        // 1个字节+ l; n# q" M: L; T
                                        fread ( &Temdata , 1, 1, fp_map);
: E+ C/ `, D; n' k3 q1 j
                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
/ I+ v. f  T3 b7 @' W, l1 w% M
                                        //if (ftell(fp_map) > FilZize) return 0;
# A4 r2 Y% l* D4 m6 h* N
                                }: i( C% N" |8 G7 V* H7 C) W* I3 h
                        }
  A: s2 v% r7 V' ?- l  j. S
                }# o8 u9 E* o3 T% ]! W
        }
2 K/ R; m# D0 `* Q! j: e
  [0 Y2 H7 n( q+ W. C
        fclose(fp_map);9 a5 u  O  F' L

% Q- [! X' p& R. q

6 {: \/ E6 A( U8 c# h2 k! b* {1 K
        return 1;
- q( W) \& ?% [% s1 r# r. [
}
+ ^0 Q% e; r" Y" @9 U' J% z
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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