*.map
文件是记载地图信息的文件。
8 K s+ x/ y+ t
( ?" Q. H" c- {# S) a 地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
) t5 K9 k% ~! K* f/ K* d9 I
, l2 d# I) Q! L( v1 c" Y5 X8 D8 C( J 第 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 地表一层的序号
. @% k/ _8 z: z) M8 ?+ V; B D& _& b8 |: b, d
03
在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号2 d+ o% e) e: G# e
07
在地表二层 12 01 这个大序列下的子序列编号& c ?; i0 d# H5 e6 c
86
物件层的大序列
' _" ~, N9 S9 _) d9 p2 n, h. K" c; @) E00
物件层的大序列下物件的子序列编号( v! E2 U' p1 L' ~: l2 A+ G6 L/ ?
03 03 00
目前不详$ ?$ e, _, Z8 h' ?) Z
01
行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
, t1 v- J; h e
; ^* C" `. l' U" G7 a" ~//************************************************************
" `* ]3 W2 j" |
//
加载地图基本数据函数;
; Q% Q/ D3 q V& B$ Q//************************************************************
3 d6 Z+ |4 O" E" B, I' \7 t, f" H' P: H4 K" o, J) p
//************************************************************
5 p5 k6 ]( Y8 J; C9 W# ]" V
//
加载地图基本数据函数;
: Z% t f' F# h% H//************************************************************
' g6 l/ K+ t @9 H0 H7 w! H4 f# o8 H, y
int Cmap:

oaddata(char *filnam)
' b% K$ ^( s2 C5 H1 O
{
, s2 [- h9 C; B" d- M: H
int Temdata;
: D h- A8 ^+ I( g& @
5 K( T; B4 j1 C" O" M; s if(filnam == "") return 0;
. e, M$ D3 c U4 N; @6 w) |0 b
3 x) @& S b! l' h0 ~: r fp_map = fopen(filnam,"rb");
( D' L3 u0 Y5 F8 |
" M. H+ W. g. t1 ~& A if(fp_map == NULL) return 0;
+ `; A% p% {8 j0 U+ f$ I; ~: n p6 a, T( i8 ~; I
fseek ( fp_map, 16, SEEK_SET);
! q9 f* y0 o- l0 q fread ( &ShortWidth, 4, 1, fp_map);
, R: r- L1 l7 o; a+ d fread ( &Width, 4, 1, fp_map);
/ {( T3 z4 x# z: U% @# | fread ( &Height, 4, 1, fp_map);
9 C' T7 G! ~0 b
0 p Q) n! ~+ y' G int TW = Width / ShortWidth;
4 n ^$ F# g- P1 s; r
int TH = Height / ShortWidth;
2 T" `/ V( d- A$ G; ~8 ^+ Q
% H7 S& ?$ I6 m- K( Z for (int j = 0 ; j < Width ; j++)
1 g/ R: o3 p, i% j& [/ @ {
7 y6 l' E, ^3 l3 q7 D
_DELETE_ARRAY(Cell);
/ L0 Y7 a) N1 A; z8 ?) D ` _DELETE_ARRAY(Role);
; @# c7 A/ M+ O& ?, l8 s" ]
}
* I A( @; q2 Z* B
8 X* z1 U( |/ F$ t/ Z Cell = new stCell*[Width];
& y5 [( t7 I* J3 M" S$ } Role = new stRole*[Height];
- f- H2 f. a2 s/ ^9 D( ~
for (j = 0 ; j < Width ; j++)
# ^4 b. R* \5 |. H6 l
{
7 q% j% O7 d6 i
Cell[j] = new stCell[Height];
* Z. l- Q# x; Y. G4 p# l( K5 { Role[j] = new stRole[Height];
$ m) A9 Y. ?; z o' A' t% | }
, J7 y9 {0 {. V( n$ s
( W# r9 M7 O' |, l- N5 l* t fseek ( fp_map, 28, SEEK_SET);
1 [9 L" R0 j- L, |& X, I
; I0 _( b3 h! u0 d; P* q, O9 E5 P/ D3 y for (int y1 = 0; y1 < TH ; y1++)
: w, M7 F2 q: A/ L; P5 I) Z {
% r" \1 Q$ i5 H# i( O* T for (int x1 = 0; x1 < TW ; x1++)
" @! U( A! i. _7 A" L x7 t( j, E {
5 r% N( d- p G! {
fseek ( fp_map, 20, SEEK_CUR);
+ P4 ~) a+ R, F8 ~/ N+ V for (int y2 = 0; y2 < ShortWidth ; y2++)
$ H5 K8 s) `1 Y {
: |* x& i- L6 J) a; ~
for (int x2 = 0; x2 < ShortWidth ; x2++)
, g1 P1 W& A- C# U: v {
/ {) F; [, c3 Y0 @+ C: N/ y m fread ( &Temdata , 2, 1, fp_map);
7 V0 Y" a k" L& y% O Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
. c7 B/ X' h9 Y9 L' ~# @
" E$ d9 E6 M7 j0 v& ? fread ( &Temdata , 1, 1, fp_map);
5 c8 k" z" u% y$ M Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
" I( W4 z6 }& ]2 G8 F4 M- r
' B! ^8 ?3 t0 X7 Z/ o) W
fread ( &Temdata , 2, 1, fp_map);
) X, B" A$ `, w" B Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
: R+ H$ q: c3 n5 d6 j
& {* D0 P v4 a* [1 ~
fread ( &Temdata , 1, 1, fp_map);
, P" L/ g6 e0 M9 m
Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
: w5 E1 L7 V% l2 V# A+ N
// 6
个字节, f: c& J/ M" w4 Z7 ~: r
5 x4 T, D, z. A" z
fread ( &Temdata , 1, 1, fp_map);
) J- e9 b0 f+ a9 j$ }
Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
' M4 b& p" y6 H
$ F% N' I4 }5 J8 q2 e
fread ( &Temdata , 1, 1, fp_map);
+ ]0 a$ N) c. \5 B2 g0 Y) j; e
Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
3 y3 g. u- U5 ^0 W: i7 d
5 e: ~+ n( S+ X4 ` //fseek ( fp_map,3,SEEK_CUR);
5 r; P$ ]: X7 P7 W; C, `* }- H! {' I
fread ( &Temdata , 1, 1, fp_map);
7 G/ z9 g6 J! i% K$ b/ Y; r1 Y' \ Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
0 A& M x& j+ v3 l/ ?4 n, {, z0 e, ~ ( Y. A. s f- p v
fread ( &Temdata , 2, 1, fp_map);
, j, _% ~7 Y. ]6 O3 \3 s- T$ D
Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
8 S m9 K+ \9 q2 P g( |! D7 v Y' W1 z+ i, e0 E
// 1
个字节
9 D! _: a7 C$ T2 l! r1 b fread ( &Temdata , 1, 1, fp_map);
. C& ~/ t; y* A Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
5 p; Q, v/ o" u6 S/ V
//if (ftell(fp_map) > FilZize) return 0;
$ U5 b, `; |7 l, A }
3 s- D# M) Y( v$ r9 N% S3 f }
- D4 c7 h; j) q; g" u B
}
5 r6 F: T. F r1 [" I. l. x7 ] }
' G8 a9 D" B6 `
+ Y! k3 a* A" |: ? [ fclose(fp_map);
" L, E6 S7 D5 {$ b: ^& E3 D0 ^
4 j- r. `( d4 N8 }+ O$ i- c( q3 g! G1 l
return 1;
: k/ h. ]- v. t d* u0 U3 d0 j
}