*.map
文件是记载地图信息的文件。! m: Q2 ~( V/ x" Z3 \/ }
& Q _, w G3 U' t2 o 地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
* y9 V: s, K( z9 Q1 D; F
& S# }0 _# m( `& d4 M% C 第 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 地表一层的序号
6 t$ W! @3 J; V# A. j, F4 _
2 |" r3 A6 U( W& p+ k03
在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号/ V; ]) x. z5 d! O$ F, }7 u& q6 \
07
在地表二层 12 01 这个大序列下的子序列编号7 m. q; R* s7 j# p
86
物件层的大序列
% T, A4 L( r& `$ b00
物件层的大序列下物件的子序列编号; c) f* ^6 b* m4 c9 e# G
03 03 00
目前不详3 x- [# b3 h/ B: y" O4 W
01
行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
Q d8 p" [4 t4 K# T
4 Q! a4 Q/ j6 [' }! u9 i& V! c//************************************************************
& \, K) H* K3 [$ Z) [
//
加载地图基本数据函数;( Q8 M B5 n: W& I
//************************************************************
: U2 H$ R h: O
* _+ `$ t: T; }
//************************************************************
8 O' ?. {; i8 H' g5 z8 s1 m
//
加载地图基本数据函数;& M+ h8 R, B, C, | B" \. [# u
//************************************************************
* p% x( `# g8 c ~
+ `) r. g; A" a6 Q3 M8 U$ Rint Cmap:

oaddata(char *filnam)
7 J) p7 R* S2 P{
% r; Q% l4 i5 J! v
int Temdata;
6 ^7 q. G' w( A8 m
/ D+ @8 S, R4 E% f3 _$ t$ s if(filnam == "") return 0;
5 O8 ^! `: D- S3 ?9 X
/ _$ K" L5 j4 X! N fp_map = fopen(filnam,"rb");
, q2 W. I+ U8 p D) Z( I
, q# f- U" Y4 W5 W2 I- x if(fp_map == NULL) return 0;
( c" C4 i8 v3 O" |! h6 ~, O) m& o! U1 T8 t) Y
fseek ( fp_map, 16, SEEK_SET);
$ ? z! F1 m4 w2 T% Z
fread ( &ShortWidth, 4, 1, fp_map);
9 q, y4 u% y& i
fread ( &Width, 4, 1, fp_map);
1 J! s) \, y( w* H1 A9 T
fread ( &Height, 4, 1, fp_map);
- {! J- ~, c4 D' u+ b# T/ Z
% \' Q+ M8 a/ g9 J8 J1 S7 Q; T1 u3 r
int TW = Width / ShortWidth;
7 A7 r' P$ x* r) a/ q# Q
int TH = Height / ShortWidth;
) T- t8 I0 U; \7 h2 n3 A8 ~5 m
/ e3 ] G- D' u$ R4 p8 C% K
for (int j = 0 ; j < Width ; j++)
# T0 f8 T6 N5 T3 V {
; ?) b) k- [2 n8 U+ J& \9 W
_DELETE_ARRAY(Cell);
+ A. L- j/ b C9 s# J* o
_DELETE_ARRAY(Role);
7 Y6 H7 F- |# B) S* E7 ?, b }
/ }' G" C( A9 _% Z% j
, b9 K3 e& ~' T6 D. ^ Cell = new stCell*[Width];
# C+ q3 ^" V5 U3 J. s* t' `
Role = new stRole*[Height];
& B7 {7 C' S. U9 _6 ?2 C; K# M
for (j = 0 ; j < Width ; j++)
2 G1 R" i7 f& G$ t; r7 X3 n* k {
1 W7 z9 S5 h& ] Cell[j] = new stCell[Height];
. y! @' B8 ~8 O Role[j] = new stRole[Height];
1 a8 _9 }* Z0 K% d! K: o% w' O1 r }
* X0 _+ x/ D5 {2 }0 v' i
3 I* R2 E- ^4 W/ H# n fseek ( fp_map, 28, SEEK_SET);
' {1 R' t! d4 w8 x) i
/ B) \# y" c, z5 `* F/ u" A for (int y1 = 0; y1 < TH ; y1++)
8 H$ I6 {( a/ O! |+ ^
{
. P$ u, i2 s) e3 o' B$ B+ L: ~: i! f
for (int x1 = 0; x1 < TW ; x1++)
[/ g: z: T8 v5 {0 g {
/ G. @* V8 l# C, d# q
fseek ( fp_map, 20, SEEK_CUR);
3 w6 r! n# O s0 O- X
for (int y2 = 0; y2 < ShortWidth ; y2++)
; ~$ g$ n$ F: w. z {
4 \0 t$ @% T F for (int x2 = 0; x2 < ShortWidth ; x2++)
9 I- B) L6 h' ~# i/ O {
& t; W2 m1 U) `8 k
fread ( &Temdata , 2, 1, fp_map);
) q, y, F- D: t7 j5 T/ T( w" N Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
3 Y( b( S: |: d" O2 k# h- {5 \+ s0 T
fread ( &Temdata , 1, 1, fp_map);
' _+ U9 u/ R2 D& Q7 E0 ?/ p; d& m) R Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
( v5 m5 Q/ w8 V* t. _
( q2 y+ ?# V9 u3 L fread ( &Temdata , 2, 1, fp_map);
8 R. E% P% [2 s6 Z4 F9 B7 F Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
8 U0 B) X% |( a- f" j+ W9 U9 T" }
0 u2 M, P6 M8 c' T
fread ( &Temdata , 1, 1, fp_map);
! }! ?# D: w0 ~& b0 m$ W5 p0 j4 ~+ i
Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
0 g+ V# a0 Z' k7 t) a" D
// 6
个字节
# ]8 n# a, k3 [+ E% U
0 D1 j. q& h: x S- o1 m8 ] fread ( &Temdata , 1, 1, fp_map);
- A# p5 D3 W1 Q; e3 k$ I' }# k Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
5 d4 B% A) i5 H
& q7 |* k& s; R& `# ~" ]3 P6 ^ fread ( &Temdata , 1, 1, fp_map);
9 l8 y+ o8 Y$ g
Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
+ g* |; o: j q; E9 b
( E( R5 ? f- I/ C* N7 y5 C
//fseek ( fp_map,3,SEEK_CUR);
- k+ B0 ?0 U$ S- T& B4 }- T" R fread ( &Temdata , 1, 1, fp_map);
$ \( v. x, R( } Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
" B- \5 D1 q% ]1 Q
' o1 A8 K; c1 d* U
fread ( &Temdata , 2, 1, fp_map);
5 R" k/ B# b! n
Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
0 O! _2 [! ^$ \: r9 l
, R; O$ \8 ~* {+ k // 1
个字节! G8 G/ Y) h4 ^. l5 U& r* d
fread ( &Temdata , 1, 1, fp_map);
# N: ]9 J9 @5 b- x
Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
& [0 t% |. Q: d$ {8 q/ k
//if (ftell(fp_map) > FilZize) return 0;
% k9 m7 M! y3 ]) n. V- n" \
}
2 o) N1 ~% D6 H( P( F. w }
, n) F3 z& p$ V# n) {
}
- a4 g# N* Q) N& n/ S }
% U2 P6 W$ V0 g, R
8 g' b( c; V4 i! i fclose(fp_map);
5 t: R% h7 F7 A, R% }
5 @9 v/ ]8 n, N3 `' P9 ^# W
0 R6 V8 ], R+ a1 A1 J6 X) d! L2 n
return 1;
# P" V1 f5 \; T Y3 F- `
}