三千论坛

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

作者: 快要发癫啦    时间: 2023-2-8 10:41
标题: 千年 *.map文件格式说明
*.map 文件是记载地图信息的文件。
! R6 L3 h' \' k" z0 p
2 b' Z  ^& |! ?8 b( a
    地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。- A, I+ ^7 X" w- d, [
  h& r4 F1 Q8 H1 {0 a2 Y- 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 地表一层的序号
+ S2 Y# }2 e5 s- j1 C7 E

3 p/ G% ]+ z6 p) _1 M) R) ]
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号+ g1 W( d+ G1 F# A$ J; K) Z5 ?
07      在地表二层 12 01 这个大序列下的子序列编号4 p  [5 `. ^# U4 @8 w
86      物件层的大序列8 I( g" J3 o1 u3 Y  r
00      物件层的大序列下物件的子序列编号
: l. P1 Z  V9 J, _8 S: q
03 03 00  目前不详
% x3 G. O. h. |) p# E
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
& [8 X# p  ]* o; \9 E) D
2 D' Z+ \( R) U1 y* ~
//************************************************************! |! Y9 _3 U2 J. ~
// 加载地图基本数据函数;* J0 h$ Y( [" P  ^% v
//************************************************************; p7 r+ c5 a8 O8 d- s
3 j$ X9 c, }+ N9 ?4 M) O( J0 ?5 @5 o
//************************************************************* b0 U7 j8 E$ r' y3 k
// 加载地图基本数据函数;; G) x; ~3 y' ?% j6 I
//************************************************************
( A) M- _9 s! `8 E5 c) G  `
, m0 V; [9 o9 a5 V- I
int Cmap:oaddata(char *filnam)
! ^; F- l: C+ r. k4 j: O  @% g
{
8 }3 ^4 A* J( W; L
        int Temdata;
9 {' H! B/ r& o4 S6 Y. K9 N1 O

* o: h" {& {) _$ n6 D! \: {
        if(filnam == "") return 0;# u# E4 \* n/ ~

! H# f- J# [4 G# `7 g: w8 D* k
        fp_map = fopen(filnam,"rb");8 y% f% y0 g3 m4 \3 Z% B
# s3 b0 d: c6 B/ s. Q& }
        if(fp_map == NULL)        return 0;: Y' w, W/ ~- }4 s2 {9 s1 l7 V
8 r4 Y$ c3 N6 Y# A
        fseek ( fp_map, 16, SEEK_SET);2 h  u% O) }, C+ U  n, U
        fread ( &ShortWidth, 4, 1, fp_map);
1 }  p- v9 X7 o' y4 ^' m/ s
        fread ( &Width, 4, 1, fp_map);  J/ r' L5 O3 {' c( m! N6 o
        fread ( &Height, 4, 1, fp_map);
2 R) y0 T6 u& `- g( ?$ f

9 W5 b  |* U3 s, z" S
        int TW = Width / ShortWidth;9 h1 s5 Z0 s$ K- }4 l/ Y) }2 L
        int TH = Height / ShortWidth;4 O' S4 t$ l9 v, R2 d# ?% U3 l

9 e# T( u% A2 g
        for (int j = 0 ; j < Width ; j++)$ ^2 d& z) ~. C5 V* W+ b7 n
        {
2 p9 C' I! _" o2 ?. A) _3 H$ v
                _DELETE_ARRAY(Cell);
7 B# b+ o7 S; }4 |8 e2 z
                _DELETE_ARRAY(Role);
% {1 {0 D' l# N
        }
: I4 K+ H: b2 @7 F) r! X
/ Q' f; `- B7 z% x5 e! Y# s
        Cell = new stCell*[Width];2 i* I* v: {% \+ v
        Role = new stRole*[Height];
; e) O/ `. U9 v# W* o3 z
        for (j = 0 ; j < Width ; j++)8 l) Y2 j  Z6 S( b( n& \
        {  `  ?+ I2 L! `
            Cell[j] = new stCell[Height];
9 [0 g4 W8 q4 ^: O
                Role[j] = new stRole[Height];        4 F( u' s' b, a# V" m- U  T8 X7 j
        }        * Q' H6 F! Q3 h- c$ H- a$ A" j! S

( e0 B1 ~# X+ U" w7 p
        fseek ( fp_map, 28, SEEK_SET);
/ H  g9 G" L4 w% a/ _4 R+ k& p
: K  L8 o5 |9 i5 X8 O( x
        for (int y1 = 0; y1 < TH ; y1++)
' T/ a, T. P9 r: z( P
        {9 L" s& E2 O* h" N) a
                for (int x1 = 0; x1 < TW ; x1++), Z$ u7 x+ t6 [# P; Q
                {* M1 J% j  [/ G& M5 N2 f/ T, G
                        fseek ( fp_map, 20, SEEK_CUR);
9 V+ z- U. p/ Q. J$ N7 I+ k
                        for (int y2 = 0; y2 < ShortWidth ; y2++)
& Z3 G$ s; q1 r, G, Q6 m2 V
                        {
8 V" w( E. N5 @) r+ z1 l( x6 U
                                for (int x2 = 0; x2 < ShortWidth ; x2++)2 z/ X9 g, t9 W8 |  c
                                {
; V6 a7 T, j$ p) B  O4 n% Y
                                        fread ( &Temdata , 2, 1, fp_map);
" |: n6 O) R4 ~6 [
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
3 `8 n. J3 g+ s; n) [& ^( X/ @9 b- [
# U# l- d; `- G! S# L. E6 \
                                        fread ( &Temdata , 1, 1, fp_map);
% j* u6 e! N9 w
                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
$ L8 @' d4 x5 b6 [5 |( \

4 R# Z% b8 ~% o5 f4 M5 |
                                        fread ( &Temdata , 2, 1, fp_map);* k1 W7 z& C' J6 Y) r! L
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;4 R/ N  V: I* a
* d" |- u7 c+ f
                                        fread ( &Temdata , 1, 1, fp_map);
# q" }, J, c- N$ H: O, B
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;- t. v' O5 z4 x4 B+ `- Y( g' r
                                        // 6个字节
8 ]' ?, D  X/ s* i3 @( J5 h6 l
  J! w5 o: G) B
                                        fread ( &Temdata , 1, 1, fp_map);
) u) U2 L$ s. z# [% d( Q$ l1 p& m
                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
3 T% U4 l' ~2 K* S4 v/ y! j
                                        ) k8 Z6 W$ i7 [" T! N  U" ?
                                        fread ( &Temdata , 1, 1, fp_map);
& u2 }$ _% R4 u/ D
                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
! ?' t0 Z- g. m

4 t0 u+ i# y5 Y2 U$ t& m
                                        //fseek ( fp_map,3,SEEK_CUR);
7 m  F% S$ e, I# D9 ~
                                        fread ( &Temdata , 1, 1, fp_map);; S% u0 v# i4 y* J+ G4 F
                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;( W) k  F# {, ]" G# J( D, \; C
                                        . N' W; s2 N  X( J4 @/ B6 t  T
                                        fread ( &Temdata , 2, 1, fp_map);
5 b+ S) u& R! C+ w, ], M
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
  z: C; R1 @* Y' K$ `# Z- }
: i1 a& F* {/ g4 h) [; r1 P; ?
                                        // 1个字节
9 R, C* R! u: Z7 t
                                        fread ( &Temdata , 1, 1, fp_map);
9 k$ }9 V5 O9 T$ |% t9 A' ]
                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
/ x* z5 K4 F# d9 a* |3 @
                                        //if (ftell(fp_map) > FilZize) return 0;
5 {3 s$ D' u- G: y: z5 }& e/ f+ ]. D
                                }8 k8 T6 p" {' i
                        }
( y9 e# |! C+ }; J+ K( ?* j: \. {
                }6 ^+ ~8 I  g. {$ l6 A
        }# _, A4 F& f+ P( t! l6 ^3 k( g
# N1 H* a# a4 Z: a& s
        fclose(fp_map);
& h' {# h9 U% ~% E$ l# U

# k  G' @  R/ ~0 ^1 L3 G

; o- S- V/ j, w- _, v) |
        return 1;
2 l0 g6 P3 `( r( {0 ~
}
4 k( Q6 J% E0 J5 e





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