三千论坛

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

作者: 快要发癫啦    时间: 2023-2-8 10:41
标题: 千年 *.map文件格式说明
*.map 文件是记载地图信息的文件。1 ~7 f/ z( R" r1 H: n2 l0 E% A0 F

6 F4 B( L  M( p
    地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。9 n9 P* f) o8 N* U- ?4 T( c, q! b
4 F3 @7 t, L. i# p: S
    第 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 地表一层的序号
, L  L0 s* {6 i! j# o; b" e, d' Z
8 f: G/ |2 {1 Z6 s3 U/ m
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
6 Z9 D# k- M  [9 S  e
07      在地表二层 12 01 这个大序列下的子序列编号
4 F! n) M6 r: ?/ w# W* F9 V
86      物件层的大序列
5 F1 X% F+ Y- _3 }2 t: \- T, z( s) d) ^% v
00      物件层的大序列下物件的子序列编号
% }9 b# H9 K! x. V
03 03 00  目前不详
" X4 q/ ~8 v7 d0 t! _
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
' B' u, |, t" d! |! S
, \( R- t# b) x0 q
//************************************************************3 k+ |2 {3 M- U" V8 F
// 加载地图基本数据函数;
. C, g# d* F: g
//************************************************************
( @# L3 J# n1 m

. R: {6 h" M! A
//************************************************************  V( j( T. d- a+ @. s4 D. a: F
// 加载地图基本数据函数;6 U3 {& F/ ?; ?+ v0 V% t4 g
//************************************************************
9 E5 R. }& f! f2 V  m' T
0 T6 A' t& U' |) \: [
int Cmap:oaddata(char *filnam)
0 j! q. z: g0 e) I6 i8 I6 n! k* C
{
' N/ m* M* I/ X3 C1 f- O, O
        int Temdata;7 x% A/ u- g& Q1 C6 K

4 R6 ]8 g9 E3 d5 E/ f, Q
        if(filnam == "") return 0;+ g: R3 v8 f$ \  a5 c, }5 s8 J8 O
' g9 Q) }' c! e) H
        fp_map = fopen(filnam,"rb");, Z' t4 G+ b8 w
; j! m. G! U. c
        if(fp_map == NULL)        return 0;* T+ Z+ F: f8 {- K. K4 h
7 W$ p  w( u  n  f6 {0 {4 Q- }
        fseek ( fp_map, 16, SEEK_SET);9 O5 F' ^# s$ }
        fread ( &ShortWidth, 4, 1, fp_map);
, P5 u% K- x. Q1 N8 f8 x
        fread ( &Width, 4, 1, fp_map);6 s9 p3 c/ j3 H# G* [0 N
        fread ( &Height, 4, 1, fp_map);: Y1 y1 U9 ?8 i: C, X) v6 {
3 f1 ^! c" H+ N; o( ]
        int TW = Width / ShortWidth;4 E- L& ?! v' R+ S# i2 Y3 N* I
        int TH = Height / ShortWidth;
* {. w& G' Z/ N; b! m- H

4 u( }! m+ c' |6 D0 y/ E2 I
        for (int j = 0 ; j < Width ; j++)7 o  g( o$ T7 @% ?3 ?
        {, D$ Y; {3 U6 N# l- Z% d
                _DELETE_ARRAY(Cell);! g; _7 L! {( l' u$ }
                _DELETE_ARRAY(Role);
0 g' s8 I( X( O2 o; t4 c+ Z
        }7 H& E2 R" `# ^7 U4 B& Y

: t. _% w) a, x/ Y8 T
        Cell = new stCell*[Width];
1 S4 H. C1 R* V( ?. ?: l5 {( }6 Q
        Role = new stRole*[Height];8 l" M' I( w" m4 y" @  F7 f
        for (j = 0 ; j < Width ; j++), c4 M% I' V' M
        {" T3 {/ w% l7 J# e. S" p5 K
            Cell[j] = new stCell[Height];
' `( Y4 m3 T' b  t5 I) i
                Role[j] = new stRole[Height];        5 m' E6 O1 W& C! y7 E
        }        - |' ^, _( k8 o

9 `) _; i1 v4 o( c
        fseek ( fp_map, 28, SEEK_SET);" w' R# O6 u2 g$ F# I% P
) _3 v5 Y4 r, o1 v: N( y3 F8 K
        for (int y1 = 0; y1 < TH ; y1++)
4 U# i% |+ }0 }" i8 W+ Q! z# X
        {
4 o; V" @5 P* m( d" j7 P- e; R/ K
                for (int x1 = 0; x1 < TW ; x1++)
# M; V3 l" ?+ ?; u4 E$ `
                {
" t0 M; g" `" z$ I& s: N( n3 z
                        fseek ( fp_map, 20, SEEK_CUR);
- W' x! h) @% N& E
                        for (int y2 = 0; y2 < ShortWidth ; y2++)4 P& ^! F0 x, L+ e3 Z# U
                        {
% ^7 @3 b& ^( ~
                                for (int x2 = 0; x2 < ShortWidth ; x2++)% X% T9 e& C+ b- S1 L$ F5 o
                                {0 c; u$ H2 p( S0 f1 S) e# r' |9 e
                                        fread ( &Temdata , 2, 1, fp_map);
: _) P' W7 T% _
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;: Q  a4 r1 v( P# w& B. J$ B
/ t; w2 n! E9 n! F- V; _* o
                                        fread ( &Temdata , 1, 1, fp_map);
' p: p7 M% I+ ^. {8 \
                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;* A6 N/ }& x; W& g' m9 P1 Z

" [' f0 `& L& ]' @
                                        fread ( &Temdata , 2, 1, fp_map);
% z2 C6 S' ^8 }/ O) l
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
& x8 }, @8 {) b7 P" X
' [' M8 x" T, m
                                        fread ( &Temdata , 1, 1, fp_map);
; T; c/ U8 y; @
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;1 q/ t! Y# t$ j1 f4 Q6 G
                                        // 6个字节  ?" e2 F& T7 B6 ]* g, |* _, v
% g( F4 T2 M5 l% n
                                        fread ( &Temdata , 1, 1, fp_map);/ Z9 c1 z% z8 m; `, h" T
                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;4 m9 e" R! V9 [+ i& S( A
                                        - D. o6 M- X* Q, T, e. y
                                        fread ( &Temdata , 1, 1, fp_map);
: L: N# l8 R0 R5 ?! e" W
                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;$ S; `6 `; F! k* M
# e( I, I& T  E1 R# e0 r
                                        //fseek ( fp_map,3,SEEK_CUR);. a- L6 W* D+ D
                                        fread ( &Temdata , 1, 1, fp_map);" s5 n) H& i5 Z6 Q
                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
& V0 d3 z) B/ K" W( Z( u5 K' K4 C
                                       
- t4 c8 U; t. c9 v. _6 J
                                        fread ( &Temdata , 2, 1, fp_map);4 L' D$ Z; c- p
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
2 r( I: x& s  Q1 {' A
0 c6 }9 |# D" E! i+ V3 Y: \. k
                                        // 1个字节
$ U3 D8 W, j, a+ S
                                        fread ( &Temdata , 1, 1, fp_map);2 j9 j! q' y  p  c7 E
                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;: f0 |9 Y$ `/ J- e( ?" d" x
                                        //if (ftell(fp_map) > FilZize) return 0;
( ]  i% l+ a! s8 Q0 y8 u8 L9 U
                                }7 L8 l" j% Z" G7 {6 Z: U
                        }0 Z. @' Y! o+ J* q# b; R3 ]. c  t
                }& v! z9 a7 j" V9 V1 e& j+ }, V
        }
5 m6 f# C8 `" z/ K1 J$ a% t

! u2 i, _3 L! B8 P+ ^
        fclose(fp_map);
5 W! B  q5 v6 @$ n* j# n
+ I( J7 I: t$ L: ?/ o

# O3 T: ?2 t3 p: k. D
        return 1;
  Y3 V" u# F: I, Y( i
}
$ A+ k) l1 [, H+ C





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