三千论坛

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

作者: 快要发癫啦    时间: 2023-2-8 10:41
标题: 千年 *.map文件格式说明
*.map 文件是记载地图信息的文件。
0 }, q& A' S# X0 y. {6 B7 |  e

$ `" |) u9 s# D' R, m1 n4 c5 d6 b
    地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。! D, B1 \7 l6 E% K

( ]. Z6 z. x9 V; \" R* 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 地表一层的序号
, e  }3 S9 h1 ~1 X3 n  h1 d
' P, g/ y3 \+ @  e, q
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
8 e1 {% l; V( Y
07      在地表二层 12 01 这个大序列下的子序列编号# m2 v  x( G3 x7 n
86      物件层的大序列7 H: ]: N9 u1 o' q; s
00      物件层的大序列下物件的子序列编号' v! `0 k: Y$ f7 w, G+ K
03 03 00  目前不详
' E) Q/ q, }' `3 v! F: V- K
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
( I' k3 S  p! z% [8 ^& |  F
. D  U1 A& I+ d8 O, z$ l
//************************************************************
  s8 Y( ]. N# u7 n& B& }- R
// 加载地图基本数据函数;% `" u( R3 L! \$ S9 b0 A( h
//************************************************************- ?; `! C& W' |& ]/ |9 y- Q: {

" W& K3 g4 b! `) ~, k* L" ~* W- D
//************************************************************! a% \- x# D6 D# v
// 加载地图基本数据函数;
7 L+ Q  m- n% l
//************************************************************
6 |: V  y! e3 [9 Z) n
, m' i) u8 _9 T  v, i2 s
int Cmap:oaddata(char *filnam)" S' w, K% M4 l+ F, d1 \, v
{
9 c8 h# \+ w4 Z# B0 A7 N: p: ]
        int Temdata;
5 k/ B6 ^0 J5 q, E- A0 e

3 l1 r: e' m5 G8 L: l7 L/ ~- g6 x
        if(filnam == "") return 0;
: ?% k" {" j1 u* i8 _% x: h
+ N  R2 G4 h' B" l! P9 W- N
        fp_map = fopen(filnam,"rb");
, k9 }" x! D- P& p# n3 i3 n
  M8 r0 I4 l% x# \/ i) E
        if(fp_map == NULL)        return 0;
8 {' n3 Q) p6 Z/ Q  v5 K; ]) ^+ H

# y3 x8 Z5 f& v) \2 p
        fseek ( fp_map, 16, SEEK_SET);
' T( t8 d, C+ P( t* t7 J
        fread ( &ShortWidth, 4, 1, fp_map);+ s( z- R( U6 G7 O. u
        fread ( &Width, 4, 1, fp_map);
4 t, \$ M) e3 e4 E: E9 L$ X
        fread ( &Height, 4, 1, fp_map);
7 z- s0 k- z" X7 N* g# r# I7 H
/ z( b% J' \4 z1 n
        int TW = Width / ShortWidth;
4 k1 t  p& Y2 t+ [" J( R8 U; {! n
        int TH = Height / ShortWidth;! i, Y8 t+ u2 [4 Z+ Y# Z  \5 |
) }, A0 c) c7 r
        for (int j = 0 ; j < Width ; j++), \- T0 }. O2 h' \5 W
        {
/ i1 g1 e7 b& g% \8 i7 k1 M) N/ f
                _DELETE_ARRAY(Cell);9 Q8 c, t! p6 q/ q
                _DELETE_ARRAY(Role);
6 Z' d" |# F5 Z: K5 F
        }
+ Q% L+ x2 y# P: O: Z- s* a

/ @: i; g. I/ _6 R0 k7 D
        Cell = new stCell*[Width];2 P6 H) S6 \" h% ^; Z9 h
        Role = new stRole*[Height];1 D7 X/ @* s( u. O" X( f0 y5 l  Y
        for (j = 0 ; j < Width ; j++)
% y, F! Q" h  q, c/ G/ n
        {$ o1 C6 p4 o1 Q7 E
            Cell[j] = new stCell[Height];
" j3 H: a1 F; p: |
                Role[j] = new stRole[Height];        # b7 K- h, a- f3 i! [# B
        }        ( X! ^; I+ o, s$ Q- W0 V
8 z' h. K9 V' y3 U
        fseek ( fp_map, 28, SEEK_SET);
' U4 R+ @& s' {, I+ b5 e
& t9 B! U, U7 L; r( W7 R
        for (int y1 = 0; y1 < TH ; y1++)
% b7 N; v/ W0 u6 K4 S
        {# h2 u# H9 r: P- ^& H, V7 A# d
                for (int x1 = 0; x1 < TW ; x1++)
) P" c5 o# C" V
                {
. o  |3 f! ]2 S- F; e9 r
                        fseek ( fp_map, 20, SEEK_CUR);4 ]- q8 \: o/ N
                        for (int y2 = 0; y2 < ShortWidth ; y2++)
; L9 k9 z1 p" U' j4 S: M0 n
                        {  s+ Y5 b$ X) B( Y' k. \  T- A
                                for (int x2 = 0; x2 < ShortWidth ; x2++)# d( M( v4 @  V% f9 l* j& Z
                                {9 L  n) |. i; C9 q) J/ W
                                        fread ( &Temdata , 2, 1, fp_map);3 i% `; d1 ?- T; ?2 ~+ l$ R
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;" r, S  g; A9 G' y7 E# T) q; Z
' y3 v. @" g6 d% g4 K
                                        fread ( &Temdata , 1, 1, fp_map);
5 j" d( _: e0 b: q5 U  Z& b- B& b- {
                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
( t4 C! K! i1 a6 Y- }# [9 v4 l

# Y! H. w% Y$ ]% ^7 |) _
                                        fread ( &Temdata , 2, 1, fp_map);' u  b! h1 G' z% q: l
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;+ c1 v; r/ I) e, z
  s# i  k; \/ H$ K
                                        fread ( &Temdata , 1, 1, fp_map);
* |, O9 M# L5 j( [
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
: c7 ^+ d: O' J8 t
                                        // 6个字节
7 `; N: W6 t4 B5 U, i7 ^0 \

  s( B1 {7 C% I4 Z; f+ b
                                        fread ( &Temdata , 1, 1, fp_map);
/ y+ q6 W3 Q! B9 x. F
                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
- g/ K& J9 v& r8 P3 V4 R* I* {
                                       
* v- P, s2 n0 y, m/ P- L
                                        fread ( &Temdata , 1, 1, fp_map);
9 @$ g5 k% C* ]: ?! ~
                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
+ V9 d; B6 p4 n  r

4 q7 N  ~/ L5 r5 e, A+ E2 `
                                        //fseek ( fp_map,3,SEEK_CUR);
2 j6 ], S) [# h3 {
                                        fread ( &Temdata , 1, 1, fp_map);4 \" O* K- k! {' e
                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
1 x- \* c# L2 R! k$ c
                                       
! l/ Y2 \0 }9 \2 n7 I* [; M
                                        fread ( &Temdata , 2, 1, fp_map);
; ~/ V; O+ I! P. s1 ^
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
) j. o# ^' P+ _* M1 v7 R( X

  j) K& w% ^, g8 h. p
                                        // 1个字节
1 ?  J% F6 b. `4 L& l! m
                                        fread ( &Temdata , 1, 1, fp_map);) K4 m3 v7 ?5 T7 Q' g7 H, V9 h
                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
3 g  X3 Z) Q( V4 T7 \+ ^
                                        //if (ftell(fp_map) > FilZize) return 0;) {* Y: w; J  M: ?/ w
                                }
0 C; `- r5 ~) D# L( U
                        }
+ i' S1 u" h0 ?$ [+ Q! ~% z
                }  b/ {2 s3 M  L- C. P
        }
8 \* {5 X" Y. h, K& C

0 H3 d& v1 x, x, }, d+ A: u1 i
        fclose(fp_map);# n1 m; p! a+ R( F! l0 t

7 w' A3 v# ?" T* I9 S
( z  x, ]/ g' L) |
        return 1;, |+ A8 Q' {4 x, {/ }" a( E
}
3 a; F1 z9 S7 v% U+ s





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