三千论坛

标题: 千年 *.map文件格式说明 [打印本页]

作者: 快要发癫啦    时间: 2023-2-8 10:41
标题: 千年 *.map文件格式说明
*.map 文件是记载地图信息的文件。' ~2 f# k' ?0 P% ^+ w. x

5 \) F0 o6 e- }: p; G8 O
    地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
2 }; B$ I$ \! J# ?& N, {8 X
* F/ e# b) H2 M& 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 地表一层的序号3 T: G% [; _" z" [4 [/ z, u4 m
: m2 q" O$ `( F' J% H3 n  e
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
, i4 L) D4 F; _4 y- x
07      在地表二层 12 01 这个大序列下的子序列编号+ B9 Q. L4 a7 G+ a
86      物件层的大序列- u! r8 Q; {' R+ |, J
00      物件层的大序列下物件的子序列编号
+ ?% N: {) L+ B4 G. F- `6 Z
03 03 00  目前不详& r2 ~, V' h8 X
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。! L, I& `% U5 O* C; k/ D

+ ]3 y# a5 \6 w6 o
//************************************************************) F4 W$ X& m( }2 E2 L- b
// 加载地图基本数据函数;7 v8 `, r6 q+ m
//************************************************************
1 d( f& q1 j$ G9 \! }
5 m1 U, ^7 L1 T- K5 w
//************************************************************
& q: y/ g: C2 \
// 加载地图基本数据函数;
" _6 E! K' W5 a4 f
//************************************************************+ h+ y) P9 f# n9 W& \5 h/ b
, E5 B8 f- i/ t
int Cmap:oaddata(char *filnam)/ A( |! o8 y* E
{
$ [* I" \- o/ j4 ]' u
        int Temdata;0 G2 y8 c4 `& `& [, h/ ]6 A9 L1 |
" s/ j" X, k# ]8 \4 P
        if(filnam == "") return 0;
9 T* O6 {7 w+ @; J* C0 u! j9 ]

+ Y) `3 C" m1 u- ^
        fp_map = fopen(filnam,"rb");1 B# `# G- ~1 ]$ \6 ^

9 I% o( P/ j+ I- |
        if(fp_map == NULL)        return 0;
" I/ r, P9 Z3 G7 N2 Y

$ O" A7 b* _- ~- b
        fseek ( fp_map, 16, SEEK_SET);
# i% {& H# e9 M% f1 H
        fread ( &ShortWidth, 4, 1, fp_map);
* H& H8 E' C$ L0 C( a
        fread ( &Width, 4, 1, fp_map);
4 i) L+ t) w: Z0 Y( R
        fread ( &Height, 4, 1, fp_map);3 E- ~# s; Q( _
$ ~4 s' A: c. j( O* v
        int TW = Width / ShortWidth;
) |, `+ k4 f% T2 X' f
        int TH = Height / ShortWidth;" f1 Z/ B0 h- U6 R& I- D8 B3 u
- }0 b$ `6 L# @0 R! W* N
        for (int j = 0 ; j < Width ; j++)! S' q) ~% n4 j% @# e+ m* g
        {* q1 H) ~2 D$ ~( q, |& J
                _DELETE_ARRAY(Cell);
- X% W. w' v  m# r' W
                _DELETE_ARRAY(Role);
( d5 e) i* k3 s: I+ k% |0 P: F
        }
5 h8 y0 Z- _* |* ]$ T: j

( K2 G# q6 V/ I5 s) ]1 C8 {% D
        Cell = new stCell*[Width];
  q+ v% c% t& k$ a9 y
        Role = new stRole*[Height];
; a5 K- l$ a8 K- K
        for (j = 0 ; j < Width ; j++)
$ D! y* P1 {! F
        {& Y4 k  `2 O9 a
            Cell[j] = new stCell[Height];
7 @. z1 U  n6 {, X7 v: }
                Role[j] = new stRole[Height];        
) Q3 G* E$ F: _3 ]
        }        ( e; Q) |. C0 q" R0 u

: M* g* u4 e$ w6 T# }0 U
        fseek ( fp_map, 28, SEEK_SET);- j+ q# J3 e% G# `" G3 H; m

7 {2 i" _' F- W8 `* m
        for (int y1 = 0; y1 < TH ; y1++): G3 x0 j0 `" x% S
        {* p3 C" G9 w; [) P1 A
                for (int x1 = 0; x1 < TW ; x1++)
1 E) D. N4 e! [: A$ H
                {
* K* c& s7 c- q% c5 U% ~
                        fseek ( fp_map, 20, SEEK_CUR);- p5 }( [) i( f
                        for (int y2 = 0; y2 < ShortWidth ; y2++)- m0 k$ E( u1 P
                        {
8 D: E4 O- o% \/ ]1 s
                                for (int x2 = 0; x2 < ShortWidth ; x2++)
/ u) v% k/ q# a. p( [& W* W! ]
                                {- \9 y+ O& k, u5 {
                                        fread ( &Temdata , 2, 1, fp_map);
- R/ Y9 f; {% }
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
$ U9 L# _1 O  p, i, d
( T5 a" w: Z3 ~: C
                                        fread ( &Temdata , 1, 1, fp_map);
& W+ c2 H5 f; j  p1 J. y
                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;2 D* F$ x) y, p6 T
, k. [2 Y7 u2 ^  Y* Y! B
                                        fread ( &Temdata , 2, 1, fp_map);" Q4 p  m& f: C7 I7 i1 i; b0 ]
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
' _" y- R. w9 K
4 z3 W9 {  q0 `; ]/ M- {- u% U9 K
                                        fread ( &Temdata , 1, 1, fp_map);
; q/ m/ R$ b& H8 Z" v
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;/ x# |; G6 L" r' Q# y
                                        // 6个字节
( Q- z( h% n& f8 O- k

4 e) B. U$ m0 e( C6 k- _
                                        fread ( &Temdata , 1, 1, fp_map);3 z- C" i: S( P. L/ `* L' j
                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
: D+ R- a* H' a; ]" ^1 s
                                       
0 y0 ?* Y4 \3 b/ J: T; n
                                        fread ( &Temdata , 1, 1, fp_map);
( B9 q$ y8 v( N/ `' [
                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
6 p. E* `8 R6 Y) y3 Y6 w2 H4 e
8 y0 s5 K7 A' Z) ^
                                        //fseek ( fp_map,3,SEEK_CUR);" R3 m8 d( s! C0 `' S+ F/ n
                                        fread ( &Temdata , 1, 1, fp_map);
- R  u5 A; y# z8 O
                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
- F/ J8 }' [5 {% n. a+ e# ~5 B
                                        & p- q$ c9 j# e( r
                                        fread ( &Temdata , 2, 1, fp_map);1 t* m& j* ?# ~. L) N! v, j
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
! U9 V6 k" Y; y# I/ P. S2 j: H9 z

! z1 |0 \1 ?3 H2 ]/ k" v9 p" f
                                        // 1个字节
$ w6 j  t& E2 ]9 n, w1 j! V
                                        fread ( &Temdata , 1, 1, fp_map);
7 d9 x( w$ T* B" S0 }6 C
                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;% m/ @; b8 Q9 k; l3 E  O" d
                                        //if (ftell(fp_map) > FilZize) return 0;
0 X$ {" g9 K$ d% |5 J) |& h. l9 d
                                }
3 M( ]: s5 i& \0 W0 R9 g
                        }
4 t; x' H$ Q! t0 k+ O1 Q4 ~
                }2 u+ `: y; s- K- A  H6 x9 x
        }0 L5 c4 L! q1 @: _

, q2 S) ~. Y; L4 f6 E
        fclose(fp_map);
3 C: F% }5 k% _! t
+ `2 i4 r; x6 J( Q* c0 @7 C

# M5 \- N' n* E$ j' j9 O( N
        return 1;1 @* D8 A  R& @& G
}

+ h+ J5 j  O& m




欢迎光临 三千论坛 (http://3000y.com.cn/) Powered by Discuz! X3.4