三千论坛

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

作者: 快要发癫啦    时间: 2023-2-8 10:41
标题: 千年 *.map文件格式说明
*.map 文件是记载地图信息的文件。! O" u$ m1 @# U; z
+ K2 {" d& c4 r( l7 t0 ?4 d& _
    地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。6 a' T6 w) A" S. U

. L" M0 k# o; v* J% Z
    第 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 地表一层的序号
  u" I/ D2 O4 y1 G
% q4 m( i7 \2 R4 o) X& C
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号% B' w8 D+ r5 k1 ~+ C: \  B
07      在地表二层 12 01 这个大序列下的子序列编号
5 Q. ]3 |# ~1 g$ Z
86      物件层的大序列
* d& t. Z' p' x5 ?. k
00      物件层的大序列下物件的子序列编号. u% ~, @' r& k
03 03 00  目前不详% X/ l: X. |: ]) W6 E: S
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。% [: i' n' u$ j7 K4 @' ^
' \- n. @3 k, ?% W& O& B: E  U
//************************************************************
1 u- O3 W6 m5 O: q, }6 p# J
// 加载地图基本数据函数;
* P- C" n) f0 l2 h
//************************************************************% B& O7 W' N1 s* \$ ^

- m) o, R) P5 c: v+ ^# d+ \" U, O
//************************************************************; W  U! G- O3 n& Y2 F
// 加载地图基本数据函数;
( M0 F( E5 d/ w9 b7 H
//************************************************************+ d7 d! K2 x/ y+ @7 H' h

5 L! m! H  T+ l- w- r
int Cmap:oaddata(char *filnam)
; R: S5 T2 p* s  C! G& X) D4 G
{
$ W% g5 c% }; X# T
        int Temdata;) [  p' J2 N# I  f
; x7 o3 a3 p7 _
        if(filnam == "") return 0;) m* q6 L% C) M9 D

% D; @4 A% X4 @
        fp_map = fopen(filnam,"rb");
. V5 F) L2 `0 T/ l4 x

2 N/ I, G% N3 c* g& Z
        if(fp_map == NULL)        return 0;
; J0 B( A) R% f& y
* u  l8 F3 {( H. [
        fseek ( fp_map, 16, SEEK_SET);: ^8 }7 |7 _0 n$ d1 s0 D7 x$ ^
        fread ( &ShortWidth, 4, 1, fp_map);
% d2 z! K" z2 U% G
        fread ( &Width, 4, 1, fp_map);
- A7 S3 [2 o4 g* S; k: L
        fread ( &Height, 4, 1, fp_map);
; x( D9 u0 N7 Y

8 u; ]; B! ~+ t( f3 x5 y
        int TW = Width / ShortWidth;7 x  A/ I. H, Z
        int TH = Height / ShortWidth;
% I% |' I, s# N- B5 F" p

7 v* _* u9 K1 r% K+ r8 D
        for (int j = 0 ; j < Width ; j++)
/ K7 V. }! _. z/ }* p8 z' a
        {
2 `4 H; W* E1 |5 d
                _DELETE_ARRAY(Cell);- f5 J- L( L3 F. N; k0 a5 Q
                _DELETE_ARRAY(Role);* s' ^  ~' @* h: p3 ]8 t' v4 |9 l/ C  y
        }
! U9 H& ]7 ]% q1 w
' R  A0 v) a+ P- h5 j1 j
        Cell = new stCell*[Width];
) E% u1 S$ t3 e3 ?
        Role = new stRole*[Height];
/ |5 m7 O, f' f" j5 d' M# j+ n
        for (j = 0 ; j < Width ; j++)
* s, F" w7 J, y- b4 [% Y
        {
& z' L. N) J5 y! N1 f* ^9 S  z, m5 s
            Cell[j] = new stCell[Height];
, t; C) T& d+ Y; ^% x8 B- j
                Role[j] = new stRole[Height];        ! Y8 i) O# x# |* Z
        }        
  ?) `0 U* S* O5 @; F

- r7 |+ O* T: _7 @; S
        fseek ( fp_map, 28, SEEK_SET);
+ f- |* j/ F0 f. q7 e
% j- U, {) n' _' z
        for (int y1 = 0; y1 < TH ; y1++)
. A; P0 g8 j5 H7 z7 s
        {
  z/ t, a5 @7 ^# S; g
                for (int x1 = 0; x1 < TW ; x1++)! _$ i' W/ C2 J0 E! M" {1 ]
                {
2 N# a# J+ k$ R- M- u4 n; o
                        fseek ( fp_map, 20, SEEK_CUR);
0 V* {3 y5 j% f* v- F2 y8 K2 F
                        for (int y2 = 0; y2 < ShortWidth ; y2++)( s8 T6 I, V: V/ b' }* c2 U% W
                        {9 b6 y; [4 L9 P. v- W
                                for (int x2 = 0; x2 < ShortWidth ; x2++)
8 w6 p2 @4 B7 U" e
                                {
+ R7 H$ b8 }* F' ~+ a, l/ Z
                                        fread ( &Temdata , 2, 1, fp_map);
4 @( E9 ?; W0 t& a9 r: T
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
  w, B1 b& `# X4 R% w

9 \! U/ d0 O8 m2 y. z& \/ e! p/ c
                                        fread ( &Temdata , 1, 1, fp_map);
/ o# E$ W: o2 N6 C8 ]+ ~
                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;" [) `" {8 O* F" M: L, U0 U  f
( F! v/ ~( h& T0 T% |0 f+ u
                                        fread ( &Temdata , 2, 1, fp_map);
, a$ T% x2 {% ?4 D
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;' S( B$ e, [( f/ ^# M$ h* G

& u4 Y6 n- u5 ^
                                        fread ( &Temdata , 1, 1, fp_map);% r4 |& q0 u& a# Z2 ^$ W
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;* s" P8 t& s( T7 L( M
                                        // 6个字节# p. {0 O; ]/ o% W* E  R

, }! B& |# W8 M( H
                                        fread ( &Temdata , 1, 1, fp_map);
# q; k% ^% A% N. k/ i
                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;3 p! P, Y7 k5 ]# G, o" x
                                       
9 J6 G! D: x; O* k  M
                                        fread ( &Temdata , 1, 1, fp_map);- Z) O/ \- k& K. y/ \
                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
* M( u- N/ ?9 ?+ B- o0 ]
; _* ]7 k4 {1 M4 h4 |# G0 Z& A' m
                                        //fseek ( fp_map,3,SEEK_CUR);+ }; @3 r" k* J# D8 V. X9 [
                                        fread ( &Temdata , 1, 1, fp_map);
1 k! f3 J  v. {" z/ Q
                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;! S) L; ?- g1 j2 d& ], ?
                                       
5 h% C: j& q( U. g+ [
                                        fread ( &Temdata , 2, 1, fp_map);4 J* h0 T! B+ g5 D) t
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
7 g  }7 m9 ]4 F
* x& E' U* y2 n" }1 _
                                        // 1个字节
2 Z/ m% i2 b7 D
                                        fread ( &Temdata , 1, 1, fp_map);
/ q8 X, L/ I4 L' ]
                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;. j. x- K$ P" Y
                                        //if (ftell(fp_map) > FilZize) return 0;
3 L8 c* I! f' _+ E
                                }0 a, w: W. j$ y9 r9 u. d
                        }& s  h5 J: x% ?* E) d
                }
9 ]- T3 y, L) b3 i7 E
        }$ c. j8 S/ o, `; o, T3 m* |* h

. I0 M9 b( ~$ {) L5 O
        fclose(fp_map);9 c5 O3 H6 f' O1 i( {

# L& b+ d2 w* Z* O

3 L' x+ y+ n) D* O
        return 1;% @/ a  e1 z% a# o) l$ y  b
}
9 f8 e  `, c; J. S





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