三千论坛

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

作者: 快要发癫啦    时间: 2023-2-8 10:41
标题: 千年 *.map文件格式说明
*.map 文件是记载地图信息的文件。
9 F3 A- |. t- ?  d

% c/ t; U5 p% |) E! w3 C) V
    地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。; {5 m8 D/ f1 g! w
2 @& l/ p1 X6 f% [' z( p
    第 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 地表一层的序号
5 p( _9 }: p  U! F/ W* u. i& n
8 J8 r' t6 C- X7 k8 m  h% e
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号5 D+ e7 P/ R- y, P% i+ ?
07      在地表二层 12 01 这个大序列下的子序列编号, d! I2 n1 c2 V2 v" I
86      物件层的大序列% I4 V, M4 S' N5 A( f. k1 t, i* ]
00      物件层的大序列下物件的子序列编号5 Q$ L* A- N3 Q
03 03 00  目前不详/ N1 X- l  a4 Y
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
* l( R' N5 l8 a, u* t

$ Q. F5 V8 q8 A9 a
//************************************************************% Y* q  v/ H: ]3 J
// 加载地图基本数据函数;' B; W' L$ Z8 [! M
//************************************************************
1 l! i4 R8 j9 h2 I
/ l6 e* K. [, m9 _
//************************************************************
; B8 A  O$ _; B
// 加载地图基本数据函数;: C  O$ g# Y8 P, y/ B) H( {
//************************************************************" J8 {, G9 ~4 m" F8 h% ]. z# c

' m: r$ f; U) j* B# X
int Cmap:oaddata(char *filnam)
, x. ^% V" p' J4 d3 F* x
{
! @9 W! I! N. G9 ]
        int Temdata;
! N; c1 ]4 V/ U1 M) X& o! a
$ U4 A( Q* H' a2 r% F" c. ~/ t3 D
        if(filnam == "") return 0;/ Q2 @+ i, u! |, j5 q+ G

; Y$ x+ Q) J/ B; U. X  o  b0 L; e
        fp_map = fopen(filnam,"rb");$ q2 A: t- a! D6 f

  j+ e! p0 v: p1 Y
        if(fp_map == NULL)        return 0;4 Z9 Q( k+ z( t. J$ d4 M
- u6 V' k7 ^9 ]& ^6 I
        fseek ( fp_map, 16, SEEK_SET);
% v0 T( H# A( F8 ^$ R/ e
        fread ( &ShortWidth, 4, 1, fp_map);
, `# F* [$ i0 p# T" i: }
        fread ( &Width, 4, 1, fp_map);
, {+ O4 f) Q0 j! ~$ R4 b/ I
        fread ( &Height, 4, 1, fp_map);- q) a* Y- x: Q

9 K/ P6 s3 h# l7 j) o) |4 i
        int TW = Width / ShortWidth;: B; G. O4 {  C1 Z0 {; G9 |. w
        int TH = Height / ShortWidth;# e( o+ G/ S  \7 m0 Y: @. O
4 |; C$ X( S8 @5 ~& S# m
        for (int j = 0 ; j < Width ; j++)
. c+ ]' ?2 g' I; ]6 B
        {
1 b$ ]) Y3 w, Q
                _DELETE_ARRAY(Cell);+ ^% D, E! R3 L# t' b
                _DELETE_ARRAY(Role);
9 ~/ Y- |2 [: ?3 g7 E) p
        }
, T1 F6 i* l/ H4 A0 I" s% {# v

9 P9 |0 K& o( i9 P* [" [
        Cell = new stCell*[Width];
, f9 Q, R6 F  T- a; F1 y2 V" \
        Role = new stRole*[Height];( \% g. L$ }8 A0 E5 {
        for (j = 0 ; j < Width ; j++)
. x  @$ y; r4 C: E+ c  a
        {
& E3 g9 a) ]3 `0 b4 b
            Cell[j] = new stCell[Height];
, R9 K5 S; a7 T
                Role[j] = new stRole[Height];        # M- b: b" V& L. A" ?
        }        : M# P8 h. ]% k

/ W0 x0 J# p- h  N) `9 S5 Y
        fseek ( fp_map, 28, SEEK_SET);
5 A% L% C* G9 B6 Q

' U1 J8 u5 Z; G) P( t
        for (int y1 = 0; y1 < TH ; y1++)3 B- W/ |, M/ {0 _) `, c/ ?
        {
- b  B5 C( v6 d& z, r- ]
                for (int x1 = 0; x1 < TW ; x1++): K1 P  }* \4 I  i+ i
                {
- u0 y  j. l) `/ _
                        fseek ( fp_map, 20, SEEK_CUR);
4 W* O" v9 J* i" w8 X+ Y
                        for (int y2 = 0; y2 < ShortWidth ; y2++)
( n: I/ O% m- h% g7 W2 ~! J- K
                        {
2 `+ n  B. b& `7 [
                                for (int x2 = 0; x2 < ShortWidth ; x2++)2 b0 Y& y. ^0 t: @
                                {
% G/ `% C1 Q4 d& G
                                        fread ( &Temdata , 2, 1, fp_map);
+ g  v4 R- _, A8 z
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
- w+ Q. _5 \6 L7 ~( ~4 g- f% m
6 j& G# c$ d+ S+ U; C
                                        fread ( &Temdata , 1, 1, fp_map);
3 [: l3 U. w$ m0 {
                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
" f4 p" R# M6 B$ d6 I+ p
0 ~* [+ }0 |$ t$ w# v* C6 p
                                        fread ( &Temdata , 2, 1, fp_map);
0 u7 C" D: D' Y  M9 \9 ^
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;% ^. }8 R- T( e6 V# e9 ]0 q; O0 }5 S
+ H9 ^7 M# T+ T5 @$ ~/ P. y! y/ _
                                        fread ( &Temdata , 1, 1, fp_map);  |: _! Y5 w2 r9 J+ a: z9 Q
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
9 V& ]( C6 \/ L4 s1 c
                                        // 6个字节
- @" c+ W* F, z. U* ~6 x0 f

' ^& y- g' n  W/ S4 L$ t) v2 n
                                        fread ( &Temdata , 1, 1, fp_map);
! [5 P% O, Y7 p- @$ n
                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;( ]7 ^7 M0 c  h% Y8 m8 i, ~
                                       
% i$ l' P" l+ W8 B8 ^& T% B
                                        fread ( &Temdata , 1, 1, fp_map);
: X$ r8 J# l: j8 y. v3 t/ N, c& \" X
                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
# E1 K0 w& b/ i) U% t8 I

1 C1 \* X; d# a2 ]
                                        //fseek ( fp_map,3,SEEK_CUR);. i3 _( I" J0 w/ \! O5 {
                                        fread ( &Temdata , 1, 1, fp_map);, u+ O  z: ^) i4 W$ W3 M7 N
                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;! ~; V: f- {$ \+ s% M$ o
                                       
8 B4 z$ l, q' ~
                                        fread ( &Temdata , 2, 1, fp_map);
. W/ j- J% H6 V
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
' ^! w$ z  d+ ?. J% R

+ v+ m# \, e5 P
                                        // 1个字节
/ S) R3 V8 }: P+ g0 M- n* B9 v$ ]/ ~" W
                                        fread ( &Temdata , 1, 1, fp_map);1 w/ k& \  R6 B3 j2 i& m! S
                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;$ d' O8 s+ i, a7 B( t7 r
                                        //if (ftell(fp_map) > FilZize) return 0;7 g2 Q* x% ]/ w1 S( \
                                }
5 j0 \0 H" Q1 g7 \5 n% h
                        }
3 O" d4 d3 U  G3 h. Z, U7 m9 V4 V* P
                }
2 X+ g& n' X; X: r& e
        }
* e; k! k; [1 x9 y6 s! X8 ^
7 n$ i8 E/ ~% ]+ A4 ^
        fclose(fp_map);
1 n0 T7 W5 R* p4 z) q

- s: c6 i/ v; r9 a4 \% m( e

) {& I9 Y! b, _5 t8 B0 o5 u
        return 1;
- h& v  W  N# F
}
$ ^% ^- T" A, ~  z" a' E





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