*.map
文件是记载地图信息的文件。
* {1 A' w j3 l- E1 [
* U" O. Q" f; V/ M9 v% w+ B7 U 地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。, Q) M: p& ^! A: @$ N
& T+ G- F& A& r# B+ [0 \- K$ k
第 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 地表一层的序号0 H" j/ N* v7 L
, Z: X- J$ a2 M. l" K
03
在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号( ]( V1 W0 W9 G7 Q6 B
07
在地表二层 12 01 这个大序列下的子序列编号
4 z% ~7 ^1 L, L" J) S% }86
物件层的大序列
/ @. c* f! Q* Z- S00
物件层的大序列下物件的子序列编号% P& {& C2 k( @0 T
03 03 00
目前不详
2 B. A' @1 V- f4 r01
行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。' c( ?7 {) Y) }( |; ^. Y; V
0 L- i$ k N \4 K
//************************************************************
s7 {3 l( D8 p8 z//
加载地图基本数据函数;: @4 V/ p( e: ^/ c. ?6 z
//************************************************************
' I& L0 i' Y* H4 D
/ G4 x6 b% C' \
//************************************************************
- Q! i: i' m$ D5 J
//
加载地图基本数据函数;6 m) x" X6 u$ z9 v G) V
//************************************************************
) c/ ?6 F2 ]* s- R8 U5 D! q
% X3 M* c* `6 ^! m5 z0 M) h5 c. Z! o
int Cmap:

oaddata(char *filnam)
( M- Q. ?! l# Q4 A' w3 S{
8 Q$ G8 V1 b7 ~ int Temdata;
5 R) W5 m$ x; c2 W! ^
- \8 e& }: |9 i5 Q if(filnam == "") return 0;
, v k6 C% ~7 }$ }
; U$ G0 z9 U4 E# O4 G( |4 a
fp_map = fopen(filnam,"rb");
7 S- ~0 d4 L, R' S5 M: `
3 T8 t) r7 R: ?. J6 C) N, `% X if(fp_map == NULL) return 0;
6 u \8 X) [3 P/ r. d" B0 x* g
9 w4 p# f3 V( v9 c fseek ( fp_map, 16, SEEK_SET);
; H1 `" ^! `9 f3 e4 f8 w: R fread ( &ShortWidth, 4, 1, fp_map);
, a. t1 \& @: s. p5 ?: u
fread ( &Width, 4, 1, fp_map);
G8 z: i2 Q" B2 B. P( V6 k
fread ( &Height, 4, 1, fp_map);
" X' X" w9 h* T6 n( W) Q- w
$ R8 U- ^- Q0 S ] int TW = Width / ShortWidth;
' m& m2 S' c$ n) A4 ? int TH = Height / ShortWidth;
2 M! r* h7 g# P9 ~7 V! R W6 F
for (int j = 0 ; j < Width ; j++)
) s h( V8 x6 r. j* `
{
" F, p, |! b; D: { _DELETE_ARRAY(Cell);
: f* U- }/ Z" S
_DELETE_ARRAY(Role);
5 A% Z0 H# n+ |3 W4 c; t
}
2 Q+ \7 | k1 j2 ^( A6 g+ }& M% r+ }
7 Y, R0 P% A" v7 i1 F Cell = new stCell*[Width];
9 J0 a2 _* U, y, s* @ Role = new stRole*[Height];
' Z7 Z1 ]' G5 D+ ^ for (j = 0 ; j < Width ; j++)
0 E0 e. B- P$ T( ?" K, e( P {
2 g. \, h4 h. m4 i4 G! B
Cell[j] = new stCell[Height];
- W: F$ y; N: S$ k% E8 x/ i! q7 U Role[j] = new stRole[Height];
, \4 r. d7 l1 i% H6 P2 L }
# P! I# w5 e$ u1 q# ?2 `# J
- P+ j5 {2 E% C/ B8 k O fseek ( fp_map, 28, SEEK_SET);
0 R. A! f. j$ G
% e6 M' @, o% S1 f( S/ H
for (int y1 = 0; y1 < TH ; y1++)
! Y6 r, i7 Q3 a/ W; K, c
{
. w1 S4 H4 o& q* p2 [
for (int x1 = 0; x1 < TW ; x1++)
+ L0 ?! @5 Z( | G5 o; U: B/ v. D {
5 ^9 { r k* ]7 E# M) O" u fseek ( fp_map, 20, SEEK_CUR);
$ _; @" Z$ C7 ^* r for (int y2 = 0; y2 < ShortWidth ; y2++)
+ P. c; t. G! K( f" T
{
( y/ E! d2 l# f for (int x2 = 0; x2 < ShortWidth ; x2++)
J* A4 ?! O6 s
{
" C l$ k2 P" f) F
fread ( &Temdata , 2, 1, fp_map);
9 B: q( B: I* Y U2 R+ _- U% h- W
Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
$ a, j' l, w( y2 Q+ M- \; h# j k5 E
9 d% r6 ]" j/ A fread ( &Temdata , 1, 1, fp_map);
9 M* n" S o+ m
Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
; X: ~) \. ^, o: ?* z1 ?* F1 B
, R/ K' n8 B M+ u# T O& B" k fread ( &Temdata , 2, 1, fp_map);
' N: x; x$ E/ e0 K: E
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
" t0 E7 {! v9 P
8 l& i+ t; c3 q# [ fread ( &Temdata , 1, 1, fp_map);
0 N/ g* d, J4 \
Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
& A- ^! [3 _6 S! f+ `
// 6
个字节
8 a/ ? w9 ]# v* M/ n7 a" S$ Y& y% }. m4 }2 S5 k
fread ( &Temdata , 1, 1, fp_map);
0 }0 y# Z8 l9 f( {9 q
Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
8 x g. P7 l) A$ }% U8 G, X ) `8 h' p% ~" [, x- p' g
fread ( &Temdata , 1, 1, fp_map);
6 L) z( F2 |' V! ?! f Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
0 C) X) T' r1 P' R5 Q
0 F0 T' G3 t0 B5 \3 `* L ?: R //fseek ( fp_map,3,SEEK_CUR);
, f3 V0 @0 p, W: \& w8 W) D
fread ( &Temdata , 1, 1, fp_map);
) X1 q) @+ }7 G+ d6 p Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
2 {8 ^- t5 i2 U
+ L- a2 ~7 @# g
fread ( &Temdata , 2, 1, fp_map);
# m7 w3 p! G& T
Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
6 Z; N# L1 z9 ?: t6 j6 b
# ]5 D% e$ @$ L' Z1 f9 w // 1
个字节/ D4 [1 v1 D% o3 f8 c
fread ( &Temdata , 1, 1, fp_map);
# c3 T6 k3 D J# D Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
" s, j3 ?+ U$ P n: i# s5 g% K
//if (ftell(fp_map) > FilZize) return 0;
& A2 u, e0 R% P7 J/ M }
/ H6 W( u7 e: t/ P9 Q
}
) C, O( }1 b$ _4 u1 m
}
. m( {; O! _( Z7 }6 n. ^8 g3 U
}
' d5 `8 n/ r) P
" R; _& R; ^9 ^; Z2 E: e+ B8 ? fclose(fp_map);
* x. K! c7 |! T, I# W: G
+ X# C; p3 m+ _; O5 Z+ ?) w7 T
+ h. R0 k' O$ B. V( C1 h+ B
return 1;
w6 | M4 M% A8 H6 o& C$ m% t
}