*.map
文件是记载地图信息的文件。& A, {+ R3 T# p2 s( W
) l: Q8 Q3 W. }. u" i! G
地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
) W, p) |0 R& [- U8 `% j8 g9 T( S0 U# _) x" G5 H
第 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 地表一层的序号
" L( _$ B$ `# C
. N' [' r- `# n" i& D03
在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号) o, Q- `+ k) E8 A( V" h3 O
07
在地表二层 12 01 这个大序列下的子序列编号) v3 j' U# e. Q4 v) _
86
物件层的大序列8 v/ I* F) m6 B3 ]8 M' s
00
物件层的大序列下物件的子序列编号
: _# `" D$ S* p+ k& F03 03 00
目前不详
3 _; I! |( E: \" ] ?% f) K, o& y01
行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。2 h8 D3 q. @8 y
0 d, b% w' |. m5 n
//************************************************************
7 R; P: H5 c* e, G9 \; W4 [
//
加载地图基本数据函数;
: r Y1 e6 i/ M6 p//************************************************************
& \; d2 U0 N2 h2 t( q; t! K% A T S" f! c3 `5 }1 C" m
//************************************************************
3 q3 h( G4 S5 s8 q- n9 N$ K& h8 p
//
加载地图基本数据函数;2 Q% f }. k8 x; P" e9 ?
//************************************************************
7 S$ q* r! T% W4 x- a2 E: c1 N
; u5 U0 G! O4 r! a1 W& sint Cmap:

oaddata(char *filnam)
4 ?# y! J: r7 A0 L! W
{
! g. `4 [ f% O' Y/ T8 L$ J; P
int Temdata;
7 q: B4 ~ m2 @* w; p
& J* w: |8 y4 R+ J- K1 G if(filnam == "") return 0;
; y4 Y' R/ u, D$ P; l/ V: X7 S, a* C- q* B
fp_map = fopen(filnam,"rb");
' l$ ~" s& N% P' i5 X& f/ ?+ R r# q/ r# n' _+ H
if(fp_map == NULL) return 0;
' N2 B n. I, @' @% R( L6 m! z% `/ _8 V3 J7 } K {
fseek ( fp_map, 16, SEEK_SET);
5 U) Y: Q/ `( e( C- ~2 O) A+ Z
fread ( &ShortWidth, 4, 1, fp_map);
7 i& }/ W9 U/ v
fread ( &Width, 4, 1, fp_map);
: k- j$ Y, ^- c* n+ j
fread ( &Height, 4, 1, fp_map);
# _5 { d: G' l' u7 S
. d4 _7 Y* d) }/ A# A: n+ \
int TW = Width / ShortWidth;
h) F% B9 w/ R0 N+ x1 _
int TH = Height / ShortWidth;
( _# x$ u; t- H# y+ j5 [' U- o" L4 N0 Y0 h c& R) `, b
for (int j = 0 ; j < Width ; j++)
, Y5 \8 L$ R( w2 r) D- r {
, E1 v7 m. w( J: \ S2 _ _DELETE_ARRAY(Cell);
/ p% Y/ [+ O% X/ w- ^( x* P% H
_DELETE_ARRAY(Role);
- m3 V W5 I6 O }
; u% {5 L, k9 Q% ^6 A
" j h- F& e/ L, C. }, m Cell = new stCell*[Width];
. A- P/ [8 N( W* u Role = new stRole*[Height];
+ T$ ?8 ?3 Y4 k4 _1 ?
for (j = 0 ; j < Width ; j++)
! ]% _7 k8 N- h: u' n' A
{
( u& r, F' K" g3 t" Y' i3 k! t Cell[j] = new stCell[Height];
- \; r' P' u }* p Role[j] = new stRole[Height];
* L. s1 c$ a6 c+ m ~: @ }
4 e! o, m9 R- g* J$ N% a1 O' N
1 d5 u3 Q0 ?0 B y) u fseek ( fp_map, 28, SEEK_SET);
5 M2 i5 S1 C o7 ]/ _! s
/ U$ o* G6 ]4 P# i0 |" m for (int y1 = 0; y1 < TH ; y1++)
/ s) r! t; I# g& A/ w$ D$ b {
1 {; R6 v# }6 j4 X9 c for (int x1 = 0; x1 < TW ; x1++)
: ]1 Z. L. j$ B4 x
{
- [" i+ R7 i4 m1 a0 S
fseek ( fp_map, 20, SEEK_CUR);
1 R) w9 D! q" J& f& w4 A( A
for (int y2 = 0; y2 < ShortWidth ; y2++)
# b3 _# s" l; g. q' F {
, j- N2 K1 ], A6 |' { for (int x2 = 0; x2 < ShortWidth ; x2++)
, R, b% ]; R) S5 G U# j7 k* @ {
$ _6 h+ p. n4 j w1 I& S: m fread ( &Temdata , 2, 1, fp_map);
" @- s- ]* h3 O# s) w8 j& g Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
7 i0 O- P' m" e. |7 S
5 O; ~' W5 [3 h3 _. x- f fread ( &Temdata , 1, 1, fp_map);
, u+ T6 b4 c8 d8 a7 H Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
7 Z8 Y( T. T$ x% U; w9 u; j# ^! C0 }( b5 \9 v& t
fread ( &Temdata , 2, 1, fp_map);
x) [4 x" \" o) a- e0 u; }% d
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
]+ e, }0 v/ n3 o# t7 \' W8 g# n( g
+ A x) g9 n4 s fread ( &Temdata , 1, 1, fp_map);
: M1 {, T; J9 c3 ~9 R Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
) [. }4 a9 O; O: `& r% @ // 6
个字节
7 Q) k* J2 Q8 L9 O+ H/ h( l3 _. r; k u: D, R7 ~6 `7 i
fread ( &Temdata , 1, 1, fp_map);
4 w) N0 w% \: y' Z% d% R Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
O: q( c; U \ D# y6 B. r( s
: @8 L" v* j( c* e
fread ( &Temdata , 1, 1, fp_map);
7 M0 F- {! a. m1 n% a& x+ i- v& x$ j2 w k Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
" b* u( n9 i# I, E5 [0 W2 z) B v5 f
//fseek ( fp_map,3,SEEK_CUR);
6 m8 s! }' t% A$ j6 W
fread ( &Temdata , 1, 1, fp_map);
$ H3 q' r( {1 }7 l Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
; o4 X* w8 X3 g" @7 F
3 @3 h5 S) h& d: O/ z& N fread ( &Temdata , 2, 1, fp_map);
; Z$ B5 y, \- k) T8 `
Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
# O/ r' F$ q/ x* i6 ~
F8 ]( T7 C# h& z9 u, M9 Z
// 1
个字节4 J7 Y3 M# M: D1 `! U
fread ( &Temdata , 1, 1, fp_map);
# }- ? F! y; l& j4 m Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
8 m3 d# T1 F2 T. }/ y0 a" G //if (ftell(fp_map) > FilZize) return 0;
3 S1 k4 I: ?7 K" A' M
}
/ P* o; Q/ t) r( [; |" k
}
. f+ f5 ~+ [' Q
}
: q. C0 u9 u2 v% B7 { }
, E. P E, O- v5 @6 ^
; q4 L& Z) x9 }7 n8 r- n% x fclose(fp_map);
4 w% G5 Y% w4 x/ w3 m+ i, e
2 t. {- |' f. F$ t3 E2 \% v8 D7 k2 s+ J
/ b4 X6 r: U: \9 x; c* ~
return 1;
) x8 ]% [( t; @& g. U1 O2 @* h$ H* c}