三千论坛

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

作者: 快要发癫啦    时间: 2023-2-8 10:41
标题: 千年 *.map文件格式说明
*.map 文件是记载地图信息的文件。8 F3 C2 h& @3 p' \  O$ v
5 x1 B* N8 z3 _3 L' Q
    地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。, Y8 f+ K; F+ B5 m1 _

6 w, C: h' @: d% E2 y
    第 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 地表一层的序号) h" ^: F4 Y* q1 n/ H- N/ [2 W
& Z. V2 Q* F/ }# @5 [8 _
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号, O( d$ i& S3 g
07      在地表二层 12 01 这个大序列下的子序列编号9 t, ~7 X- [% \9 _3 b2 u
86      物件层的大序列
3 T$ e# ]2 y- B6 g1 u
00      物件层的大序列下物件的子序列编号( B, n/ p2 s/ ~1 k. Q7 B( L
03 03 00  目前不详
! {4 q6 H# q: G7 g% b1 o
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
. T& {+ o& `! w
4 U' ?7 b& K+ {; c$ @  i% ]
//************************************************************# M1 n$ J7 U7 I
// 加载地图基本数据函数;" T* A& _9 _# q
//************************************************************/ ]9 i" m' I& @- J5 n. W

, G, V5 b4 S+ n' Y- R# e
//************************************************************
+ @$ C/ F$ t5 C& m! R7 M
// 加载地图基本数据函数;. N* ^0 a1 @, w; M
//************************************************************
( t4 [' `/ j1 {- J: M

& _, j& I0 J" e
int Cmap:oaddata(char *filnam)
# I0 {! u0 X$ G7 o  _! \" n5 V. K$ M
{
5 x0 X( I0 v0 d8 J3 _) B
        int Temdata;7 [5 V8 H; j, U( M" k8 C3 U
: u. P5 f. O( f8 q
        if(filnam == "") return 0;3 \1 {1 {+ B7 b  y: d9 z
6 p# |3 `1 _7 x1 r: o% y0 }
        fp_map = fopen(filnam,"rb");
' x6 c/ R  i8 n& r

7 i7 l% T9 Q# N' n% k- n: ?; ^; ?
        if(fp_map == NULL)        return 0;' ]' c- D( p/ Y+ s1 v

+ N3 K% p$ S$ X- O0 F, K
        fseek ( fp_map, 16, SEEK_SET);
$ q2 l1 e! k* A* u
        fread ( &ShortWidth, 4, 1, fp_map);4 t4 I" {6 M8 J0 j2 b
        fread ( &Width, 4, 1, fp_map);
5 x- \. }) k: k
        fread ( &Height, 4, 1, fp_map);
4 B. c4 B( S  F* b* K9 q5 V* A
! N5 e- N6 S) P: {' u2 B3 C
        int TW = Width / ShortWidth;" t/ e8 S  G, T
        int TH = Height / ShortWidth;! ~2 X3 N6 ~7 F. I& n% r4 p
+ l# G8 q0 j! |% R6 d* h9 z
        for (int j = 0 ; j < Width ; j++)- n8 R! u9 G1 `  n% W) d& O% u' k: c
        {
# Q+ q' W/ a" x+ }
                _DELETE_ARRAY(Cell);4 m8 o6 c' Z8 ~' W# ]
                _DELETE_ARRAY(Role);/ Z: f2 z, F$ @8 S( H
        }/ I8 |6 u# V" ?: @  w' [! s. ^
, m. n) Z  d2 }$ V
        Cell = new stCell*[Width];, }# [6 g% v' I, R! {
        Role = new stRole*[Height];
' J$ q; [% a. g1 \* b/ ^' f* I3 ]# D+ a
        for (j = 0 ; j < Width ; j++)0 s) m# I3 _/ |2 }% }
        {. w* Y- V+ p" A, o
            Cell[j] = new stCell[Height];+ x; N1 P  D  f! P! A. d. a
                Role[j] = new stRole[Height];        
- A0 v4 E# e& O4 g8 [! z
        }        
5 M( z9 p5 F9 W4 @
  Q8 j5 E9 p6 h  x* Z
        fseek ( fp_map, 28, SEEK_SET);; L9 n' ]( l* ^

* D& Q2 [6 Y6 K  d- s) c
        for (int y1 = 0; y1 < TH ; y1++)
1 D* x  o$ L' W0 D& A
        {! s+ i+ E9 U7 j  Z, Z
                for (int x1 = 0; x1 < TW ; x1++). s& ?$ o) r9 ], X2 Q# w; W, [
                {0 X. j' F& T# B! w4 t* {2 L/ p$ @
                        fseek ( fp_map, 20, SEEK_CUR);6 |9 l0 D7 N; j* u8 `: h" K* ?- [
                        for (int y2 = 0; y2 < ShortWidth ; y2++)
! l, P: J( \  v! L$ K: I
                        {
; D/ c% e& ~- O9 `/ z5 a
                                for (int x2 = 0; x2 < ShortWidth ; x2++)5 J, l7 B' ?/ K" i7 K! C
                                {
, A2 K9 m. f; ~; |; y- j
                                        fread ( &Temdata , 2, 1, fp_map);* w( \8 `) z( W; T7 k! n( k
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;9 v! n' x- s7 |* A
$ U& l9 F& t5 [: H
                                        fread ( &Temdata , 1, 1, fp_map);
: y+ d; M/ ~$ {2 h
                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
' Q4 \* V- F3 E8 c9 x
- B$ |6 A* P! ?
                                        fread ( &Temdata , 2, 1, fp_map);
8 g  b; V3 ^: _& c& x. T9 Z& S
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;7 F8 _0 ~# J9 I% |+ M

% a, P; O4 N; p' a% {7 [
                                        fread ( &Temdata , 1, 1, fp_map);
: p( `" U5 M$ S- b
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
8 _: M' ~, d" G' ?6 f" b
                                        // 6个字节$ M/ [. X  _1 N' W, J; Y& B' P
4 e% }- l- v( T
                                        fread ( &Temdata , 1, 1, fp_map);
% |2 }" k8 {$ d  D" F
                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
+ [% Y7 `3 w5 B3 g9 T# d& t
                                        , U, c! j/ u3 S, p% C8 H( U0 m
                                        fread ( &Temdata , 1, 1, fp_map);& O2 L$ P8 U( t, |/ K: q
                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
) F  z4 U5 a# S3 ?0 h8 e( X
2 _" W/ M; v5 A& Q1 g' V
                                        //fseek ( fp_map,3,SEEK_CUR);( K# K3 i6 T7 l" d) ]7 \
                                        fread ( &Temdata , 1, 1, fp_map);! r8 G- ^6 j, \& ~5 `8 C4 T! g
                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
* F; P5 Y( v1 O: }9 A
                                        * }$ {9 A' ]6 K2 @$ `
                                        fread ( &Temdata , 2, 1, fp_map);
; G% q6 R# a& c( J. Q
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
1 {8 K! |0 u2 y% t

2 x* F5 Y% f. k7 k0 k% Z; z* b
                                        // 1个字节$ W3 E# Z( {% H4 \3 z" h
                                        fread ( &Temdata , 1, 1, fp_map);" r2 u$ W1 @7 X$ }5 Y3 q* u- v) t
                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
4 p7 `+ p7 ?8 ^4 \, }' R% A
                                        //if (ftell(fp_map) > FilZize) return 0;; H+ K2 U2 \/ [; c- q6 k. ]
                                }& u) G* h+ ?; f7 p' \# V$ |
                        }. P% K. z. m* k# y0 D4 s2 X
                }
6 l* B  |; z* V$ n3 P: b+ n
        }
4 o, m9 r' k8 y1 m/ u1 C. {

) T  [% I& E+ w
        fclose(fp_map);, q" a! D) `/ ~% U$ t4 L

& J- _& a$ U# V8 p3 l
$ h( Q: U+ Y. w
        return 1;) v8 {3 ^' f. w6 P
}
; N5 B& y, J7 H2 z$ _- \





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