三千论坛

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

作者: 快要发癫啦    时间: 2023-2-8 10:41
标题: 千年 *.map文件格式说明
*.map 文件是记载地图信息的文件。$ m5 h6 r' B. ]/ a

* Z+ t) o* g+ z( F
    地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
7 F3 n# d& ?& V! l6 K7 ^, \
* X" H8 h( t! t+ [  L9 g
    第 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 V8 V# y8 Q8 w. W4 h& o2 U/ I

& |, s7 _; w% U% q/ t# f' Q# v8 p' C- r
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
  U; s. ?/ ?& Q( k' r  `1 ?  |
07      在地表二层 12 01 这个大序列下的子序列编号
0 s8 w6 `+ U. _4 i: g
86      物件层的大序列  r1 S7 Q% Z: {% t% W2 c
00      物件层的大序列下物件的子序列编号2 q; p/ Q. Q" j. m( }1 I; ^
03 03 00  目前不详" U# ]2 x, {4 u, e! J
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
* X- F+ U8 f( y' s. F& T" W

9 j0 o3 w. u$ ]) _4 p8 J
//************************************************************
/ K" v8 w5 j$ k" W
// 加载地图基本数据函数;: Q; A- [% C0 `- v' j5 H; G
//************************************************************
) l3 K5 R/ a6 \3 f9 [! X

9 r+ g9 _9 j  Q% T* {
//************************************************************
" q' ~: f9 Z0 F0 |$ s2 H
// 加载地图基本数据函数;
4 {! l* B3 a6 v) y: B  y8 A. \& M1 F
//************************************************************( w& o0 C9 t- c$ a3 m% Y

: w9 a  z7 j& y4 N! m  a2 J0 m
int Cmap:oaddata(char *filnam)
9 i. J8 y. C$ j+ h& a6 v
{# O3 w5 x  X4 }/ k
        int Temdata;
4 P8 O: C; d  H: E& p5 N1 t

# g9 G  f! o8 o/ Y% S
        if(filnam == "") return 0;
) W; A, y* u3 t& K% I7 f' W4 g. u

7 C6 \  i) N: U8 s; ~
        fp_map = fopen(filnam,"rb");
3 B8 t% k! C8 @4 W
: v3 r; j" X* L* [8 E
        if(fp_map == NULL)        return 0;
+ x0 s+ ]7 l& c/ W! u
$ p5 }$ |* c2 N! o( Y7 a: x3 s  `
        fseek ( fp_map, 16, SEEK_SET);
" l0 b5 ~4 H2 i; _* q7 r7 y
        fread ( &ShortWidth, 4, 1, fp_map);6 x+ U" p/ |3 `; g2 W. S
        fread ( &Width, 4, 1, fp_map);
" z! _1 I% ~$ U# I4 N- U  K8 I
        fread ( &Height, 4, 1, fp_map);
) H* L- v1 s: B& S* r
/ ]+ V  N: i8 H- P" t
        int TW = Width / ShortWidth;+ i9 O* z0 _- r6 x7 d3 J
        int TH = Height / ShortWidth;( M3 z* T8 h% S6 H0 G) x: K' p

' Y/ I5 R$ [" u' l) @
        for (int j = 0 ; j < Width ; j++)" {, b% l6 C5 V" P2 Z
        {
; W+ F6 O0 Z5 U$ T5 c
                _DELETE_ARRAY(Cell);  ]+ U4 c2 j2 r; p
                _DELETE_ARRAY(Role);
7 \# T% C( O, v: t* k
        }
) ~: q" e% @8 I5 m, _- s! H5 j* c5 k. X
: ]6 p) M# l7 j
        Cell = new stCell*[Width];  _! t% f& f5 \! |, i
        Role = new stRole*[Height];1 V0 o0 F2 x5 Z% A
        for (j = 0 ; j < Width ; j++)
) _7 o' T3 S; ^! J
        {
' d1 [7 f# G* P' P3 O
            Cell[j] = new stCell[Height];
4 v$ e2 x' K* s$ v/ d- v# d
                Role[j] = new stRole[Height];        
2 ]: f, [' e& M9 M* ^' s
        }        
9 }7 H' v* N1 X' B" p5 M. V
$ ?6 k- f1 z7 k8 c
        fseek ( fp_map, 28, SEEK_SET);) |" s: A  z% g
" G5 _; `9 M5 a. S- o' M
        for (int y1 = 0; y1 < TH ; y1++)
' D" ?, s& p+ p7 ]( {( F& [
        {
& C8 I# Z" L8 Y( R. Q1 k% N& I5 W
                for (int x1 = 0; x1 < TW ; x1++)9 w- j  y: f( B7 `
                {
1 |3 w+ K; ~3 [3 Y6 \* K0 Z
                        fseek ( fp_map, 20, SEEK_CUR);
! m  w  h- |2 S3 n
                        for (int y2 = 0; y2 < ShortWidth ; y2++)
. h8 b0 ^7 u6 Z, W- z2 i* Y" I
                        {. c+ U- p7 Q) I7 v4 }
                                for (int x2 = 0; x2 < ShortWidth ; x2++), D( k$ B0 s% f
                                {! u( |  O, u, d+ q; d1 P! q
                                        fread ( &Temdata , 2, 1, fp_map);
% a2 K0 `9 z1 J0 S7 y, u( U
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;) b7 }5 |! s  C( ~$ u" f  \+ L

; d& s+ ?( M' S
                                        fread ( &Temdata , 1, 1, fp_map);% L0 o" M/ @: S- i' Q. K+ Z* c
                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;3 R# `. }2 a* n9 c1 S& X, N, _

# S! }8 [$ r' ?9 Z0 _' u
                                        fread ( &Temdata , 2, 1, fp_map);- r6 r3 |. J1 x9 o3 i  m* f
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;: x* u. O* W6 d3 m

# g$ B  D) L1 ^$ C3 k
                                        fread ( &Temdata , 1, 1, fp_map);
1 ]1 E' J7 p2 A2 @2 F. E
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;2 e7 D7 m9 P8 M
                                        // 6个字节' G! d2 {* }6 F' y8 V

3 m" D# A' _' f
                                        fread ( &Temdata , 1, 1, fp_map);4 X- }! K3 E2 h" q3 A  U3 [2 [
                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
2 A# T% d  Y, k7 j, w& }6 \& z0 _
                                       
" b  f& {  r" r# B- c! W- D5 z6 ?
                                        fread ( &Temdata , 1, 1, fp_map);
$ `% X3 _: @3 j+ c
                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
# l* J0 A7 T" }" y6 D4 H! r
! k7 V' m2 p, Q8 v5 m
                                        //fseek ( fp_map,3,SEEK_CUR);
/ @5 }1 z# B/ G/ ~4 \; z
                                        fread ( &Temdata , 1, 1, fp_map);! J* @  J( a0 f$ |! z; T* S
                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;6 ^3 X: O* c) J: W
                                        5 U- \1 r# ~  k0 W+ \- D  j
                                        fread ( &Temdata , 2, 1, fp_map);+ k6 V3 V& m6 F
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;5 N. H3 u  ~/ O

+ Q  q$ [( T0 O! r# Q
                                        // 1个字节: k& [5 C% P' H( h5 G, n
                                        fread ( &Temdata , 1, 1, fp_map);
8 ~# p$ }" u# [
                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
2 P9 a( ^' `9 L/ j) y3 G7 C5 |
                                        //if (ftell(fp_map) > FilZize) return 0;( h% t& v) ]$ b; k! Q0 n7 h0 Y" l) Q% B
                                }
1 a$ }! H' h4 p: p6 Q4 ?, x1 @
                        }4 k3 A7 u' e$ N
                }- \* h, H+ O( m0 n8 b
        }
% [% M  M) t& Z4 |& @, a

( y7 M$ [: b' b% X1 V0 H
        fclose(fp_map);8 G1 q- O- H; g7 i
  ^4 t  M- z: r
5 r  U8 B; |: }7 @
        return 1;8 K8 Z: B2 L$ g& s9 ~1 T' h
}

' L7 Y7 ?1 F" u# h




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