*.map
文件是记载地图信息的文件。
$ P' G: k, ]8 E8 @- ^- g( N& Z/ }3 D% L2 e
地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。( |- r+ a! T8 g2 a. R# @* s
( _- T* I7 ~0 q. ` 第 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 地表一层的序号
, X2 ]3 h" r4 M1 E P' S: a% p
4 e/ Y+ w2 B- {2 x. F/ @03
在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
: }" `( P% B( q U07
在地表二层 12 01 这个大序列下的子序列编号( l y- u$ C2 f+ ] d! \: F4 a+ R
86
物件层的大序列
! P3 W& N. z3 p00
物件层的大序列下物件的子序列编号6 q# n" u% ^, v6 x" i
03 03 00
目前不详
. D' M! E6 P+ G0 N# K0 |3 w7 |+ G01
行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
& g* ^- }* M/ z
( x( }( K. D' `# g, V3 P//************************************************************
1 N0 R/ A- c+ [2 }
//
加载地图基本数据函数;
: M: [) \& k b+ z5 |# y; ~//************************************************************
$ |! O. }7 e, ? C$ S3 Q+ _$ v
7 g7 u, }- N; I//************************************************************
* R8 @9 J2 ]6 {5 ^+ G# _//
加载地图基本数据函数;
, V/ u2 q/ W) i% r* d//************************************************************
0 ]* W& v u3 f+ `
# i8 G$ Q L1 g; Gint Cmap:

oaddata(char *filnam)
$ I# o0 O; f: [$ \
{
/ D6 G/ Q! z! H
int Temdata;
' R" F$ A/ z* s& j2 G( B
! ]! e9 e5 @& \* \* \1 [+ N
if(filnam == "") return 0;
* e' E5 l. ?+ `
+ }2 R1 E* R8 v; K. Q fp_map = fopen(filnam,"rb");
$ c/ S# s2 o5 d; i* I
6 X* l3 T4 y4 x0 J/ p/ y( R
if(fp_map == NULL) return 0;
: y3 K/ S7 k8 ]" r( c+ k' l$ T: t- X) g8 }: J6 d1 ]
fseek ( fp_map, 16, SEEK_SET);
, Z* B: H, T$ k" G1 G: `; q* H; W/ Q
fread ( &ShortWidth, 4, 1, fp_map);
; M3 E; m2 s: j8 I( G1 @
fread ( &Width, 4, 1, fp_map);
& c- W1 n$ |2 ^# [
fread ( &Height, 4, 1, fp_map);
$ D7 }3 `6 I- ~6 F+ r M p( ~0 w7 F! @: B* n; B! q4 ?
int TW = Width / ShortWidth;
9 ~- t! ?- u5 m( R( S7 ^8 D. k
int TH = Height / ShortWidth;
& [, d+ }/ V% d" a9 l/ Q7 {" v0 q! c5 C7 A: b e; w) g P7 A' R
for (int j = 0 ; j < Width ; j++)
% s6 `8 q5 o; i8 ]! v3 t
{
) [& X1 |9 b+ w4 H, ~7 V9 B _DELETE_ARRAY(Cell);
+ j) z3 y. l$ l* H# t
_DELETE_ARRAY(Role);
( t- {$ T+ g% L* I1 B4 R }
- }" r8 g2 A3 q& ]" ?, Q9 d5 }$ ]3 t8 I
Cell = new stCell*[Width];
! p- t6 }7 M# @+ e% c0 x
Role = new stRole*[Height];
4 C2 V3 O/ o, P4 e' h for (j = 0 ; j < Width ; j++)
- G+ Q/ D( N: C4 f
{
: p( u+ @& b4 ]8 r/ J Cell[j] = new stCell[Height];
5 W( @+ x6 V4 C9 h& U Role[j] = new stRole[Height];
, W y' A& f# n! r: P e! C
}
; h0 O( B6 f- M- ^6 I- m' S
0 N1 {2 G5 @) f5 Y+ y! P2 R fseek ( fp_map, 28, SEEK_SET);
3 ^% O1 d) W% |% ~/ j# S$ b
+ U/ z& r' ^* I- z, R9 i for (int y1 = 0; y1 < TH ; y1++)
- z/ B7 |# K6 g8 b3 [, h+ ~1 g0 X
{
- s" J! U0 v3 O1 D for (int x1 = 0; x1 < TW ; x1++)
4 s. t" h x2 y$ y {
! K9 k: C" h; L7 |5 Z fseek ( fp_map, 20, SEEK_CUR);
% T' m/ m& [ U
for (int y2 = 0; y2 < ShortWidth ; y2++)
9 M# N( I( l/ Z- f
{
}: l7 x, s- C. ?. h for (int x2 = 0; x2 < ShortWidth ; x2++)
3 j m$ D3 z- t8 A+ B% `; \ {
' |1 a5 i( N0 N$ w. H
fread ( &Temdata , 2, 1, fp_map);
- I8 x$ n8 i( E. b- F# B* S2 F
Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
1 x! K1 f: B! U* E$ e
Y) O( Z$ F2 f' k4 j: t4 B; V fread ( &Temdata , 1, 1, fp_map);
) ]0 G2 F& V7 `# O3 p2 S& Y Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
" m- J) c3 _1 {
' e/ A" C1 Q g, H4 o: k/ i fread ( &Temdata , 2, 1, fp_map);
9 R7 g8 x& ~: E9 L
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
. t' Q) ^6 \4 k& A
/ @8 k5 O I5 R9 E* S5 X1 x fread ( &Temdata , 1, 1, fp_map);
2 H( p5 O$ u/ v; ]2 m
Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
5 \0 k$ e( f9 z+ \ // 6
个字节
- ]- E* W; p3 U1 k" f# m
6 f2 Q1 z4 d' _3 K; _( e fread ( &Temdata , 1, 1, fp_map);
) D/ @$ c% T6 ^, k% A! ]8 M
Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
( w# |$ ~% ^9 u( V ! j' a% w0 g2 O s3 f5 y/ b2 L! i
fread ( &Temdata , 1, 1, fp_map);
$ K. f; R4 p* k, w: G4 K* ~' U1 d L
Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
- f+ i( _6 a" v* l( V, {* i' `) ~' J6 ?* Y$ q# ?+ T
//fseek ( fp_map,3,SEEK_CUR);
, _: T3 d9 n. j- K" O9 z fread ( &Temdata , 1, 1, fp_map);
9 R* z6 n+ I1 `( C2 d Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
7 Q4 G$ I& N7 O
4 O" q, {# N8 N: ?5 @ fread ( &Temdata , 2, 1, fp_map);
8 [) w5 c- Q9 ?9 v2 |' p$ P Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
$ p6 P; |: Q5 l( F, W
$ U# K! x% ^0 d" Z- q# j // 1
个字节
# B" m- ]; i( G1 U% W0 S4 B' m fread ( &Temdata , 1, 1, fp_map);
( s& r% y( t, ? P1 ^- m L$ l' z
Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
; R( W. x% W. _( Q //if (ftell(fp_map) > FilZize) return 0;
1 Q8 w# o$ Q* q1 U, s% @
}
0 i! b& i$ Q4 d# s }
% i% \* V* h, R( f
}
3 X0 S" b1 x; L) k p }
/ L( c/ O4 J" S& ]2 h/ `- m7 c' ~
% f, L0 z+ y7 i/ G( s" ~2 P4 J, F2 ?- T+ m fclose(fp_map);
4 Q9 ^( k/ t# n; M+ z. r: i7 o- n
# h8 Z/ a% R' h2 r( M2 H; X2 D: P# Z& S% Q
return 1;
# i$ C8 \- w% U. ?3 g( z8 D! u}