*.map
文件是记载地图信息的文件。
* M R1 E1 r% g1 H$ u) ]# ~
- I& k1 ~$ m" m' Q 地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。. O$ S) }$ ~& O# _4 @% ?. a$ Y
$ g" u Q* C8 t
第 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 地表一层的序号
/ o3 C. Y7 F3 V5 f1 M& U: o' \* v/ r& o3 S4 s1 ?0 C5 S
03
在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号/ h; @2 e8 Y0 s: \4 H5 i6 R# U
07
在地表二层 12 01 这个大序列下的子序列编号& f0 \& ]1 C% A% g7 F# ?
86
物件层的大序列% b' K! {" q7 z
00
物件层的大序列下物件的子序列编号
- _' X F- {$ x( Y03 03 00
目前不详
( ^- }/ u8 |2 I; J0 X01
行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
L( t$ X8 t/ O4 R% b( r
7 d4 D/ T ^. v//************************************************************
# q: |) g: G. R9 W$ J//
加载地图基本数据函数;
6 E1 v( b4 q/ c) m }//************************************************************
' u3 j! i3 e, _. \ f& G
- F ], o& {8 r//************************************************************
6 F' B' e, q! y8 [# O4 \$ t//
加载地图基本数据函数;0 n/ [2 l B+ g2 h: d+ Z- G# r
//************************************************************
. k2 T a6 q9 O6 S6 L3 v1 g% `
+ y5 N0 v4 m7 H( y
int Cmap:

oaddata(char *filnam)
; X) K' A5 v/ F! x8 }$ ]
{
! K( I* Q g( y0 @( @' ?$ i8 y
int Temdata;
, s9 ^! E/ t3 {- `/ f( P D* G; b5 W# o, i2 [
if(filnam == "") return 0;
. z. L0 T# `' U+ @4 L$ r
4 t# l, }, |2 \0 z7 P [
fp_map = fopen(filnam,"rb");
6 s5 p9 `9 a, \6 w( ?% k2 [- R; E) B Z! j7 m8 w
if(fp_map == NULL) return 0;
( \1 ?/ D7 m% N2 Y/ y% O0 I" v5 a5 `+ s: v* I8 N- F
fseek ( fp_map, 16, SEEK_SET);
. m, Y! q, Y4 k) m* s
fread ( &ShortWidth, 4, 1, fp_map);
- y! G7 V3 Y, M3 u
fread ( &Width, 4, 1, fp_map);
i1 ^* f7 _5 B/ \ fread ( &Height, 4, 1, fp_map);
% C# x; \1 d$ n* w" e& K' Q$ j% m0 \- W9 z) v' Z" q" f
int TW = Width / ShortWidth;
' X2 l, d4 C; D$ V
int TH = Height / ShortWidth;
C8 n& O/ s; W# ]/ S% B' K2 k! `2 D
9 a4 H5 i. \+ O6 u, d$ D for (int j = 0 ; j < Width ; j++)
7 a* g0 V) `# ?: E$ }6 L {
4 }/ x1 t* P$ p+ d
_DELETE_ARRAY(Cell);
" t! K/ y# p- e0 }* p+ W% g
_DELETE_ARRAY(Role);
. t4 J+ H8 I' ^! N4 O0 N4 }, v7 G
}
$ a. e f1 X8 b! a
9 C+ o/ D2 m% K+ g7 j! M. z Cell = new stCell*[Width];
z. ]+ L* {4 a
Role = new stRole*[Height];
: V+ | m+ ?7 o& B5 X8 c3 { H! K
for (j = 0 ; j < Width ; j++)
8 E6 D# r: X2 H. h0 n3 K% }2 J {
4 O$ H0 |0 z/ k& M+ m8 W3 R' D) h) ~
Cell[j] = new stCell[Height];
* D& {8 [: F4 @2 h: C, W' _' J6 t Role[j] = new stRole[Height];
1 y. {$ N, V7 b% [ }
% H" O; m- X j$ K' s h1 S& H4 T7 s* q* z! C
fseek ( fp_map, 28, SEEK_SET);
9 e% @. R# B) C% D
' Y. B% C! H$ N( p# v& d for (int y1 = 0; y1 < TH ; y1++)
, ^! Z5 t7 F! a. w$ V {
8 ?% v: t" n* t1 S% ~4 B- z2 \
for (int x1 = 0; x1 < TW ; x1++)
5 Y' B" ^" }5 t/ k {
7 m1 C2 T! {- l+ ` fseek ( fp_map, 20, SEEK_CUR);
- K+ v6 ? s/ d1 \2 y for (int y2 = 0; y2 < ShortWidth ; y2++)
N$ v/ O9 V- v( D* D } A& l7 V {
% `/ C' P: J0 X7 z B3 B8 f for (int x2 = 0; x2 < ShortWidth ; x2++)
3 i! ]- S4 m) v/ p: k p
{
; V" Z8 y& g9 F: g/ X1 s2 t) H. u
fread ( &Temdata , 2, 1, fp_map);
0 f# X( V' B3 Y& W/ Q Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
# i7 H z# g4 \9 \* a2 \
, q! D& x: w" c+ O, f fread ( &Temdata , 1, 1, fp_map);
4 _' H- K; v p7 s: d1 E, K' c
Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
/ m! z/ x# s) W
# t. D) }4 @. G$ @. g! e
fread ( &Temdata , 2, 1, fp_map);
: {- Y& F. c! k" X. n8 H1 f5 F9 a+ g: S Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
' M1 }$ q" t( G
: T( J5 k0 L. ~6 R+ V( N. I+ P fread ( &Temdata , 1, 1, fp_map);
& O9 \6 D: B0 m' }4 A
Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
3 t! ]# z7 [9 M2 i2 F // 6
个字节) ] P9 s& Z: H* p- Q2 S) x+ ~8 p+ K
' X; ^1 d+ ~) z1 n( B! b- j# H$ Z
fread ( &Temdata , 1, 1, fp_map);
. x4 A, J# N- R Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
9 z. I5 }1 R- d. U
9 K9 Y9 O9 A: @) _4 x0 \ ~6 Q5 N fread ( &Temdata , 1, 1, fp_map);
' S9 R! |. t3 F+ ]- t+ k1 C Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
5 |( R3 t' A+ a2 Z) a2 |' X0 h3 L7 f1 \' w
//fseek ( fp_map,3,SEEK_CUR);
' G' l* Z; O3 C3 U fread ( &Temdata , 1, 1, fp_map);
( R# w# ]( D" M, ~ Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
2 p, E( W& e. [- N7 J' `8 l
3 G# s6 T& D' Z8 ^+ U- w7 ?5 {
fread ( &Temdata , 2, 1, fp_map);
* j' E0 E4 o0 \! S5 W" M
Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
3 A9 S6 m8 q) q' D- J6 ~' o1 |. C4 n1 d- }' \
// 1
个字节4 ^. ]7 u$ [) C# O. W. v
fread ( &Temdata , 1, 1, fp_map);
4 o0 J1 ^1 W* q v4 I# d Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
$ {7 I$ g# Z* y8 G2 \ //if (ftell(fp_map) > FilZize) return 0;
7 w# i9 t) H3 q; _- l1 z3 B }
- M- V1 J, K* f: T
}
3 G3 a8 L; h" T" k3 P! c8 ~6 Y! _0 o2 Z
}
. z& \5 k3 _- ]& ] Y
}
: e; K/ p: @) B1 P, y/ H ^) D$ o) s) ?! H3 C# F6 G b
fclose(fp_map);
I' b" { y1 X7 P4 O
1 n. L5 K' r! r+ M6 l6 P
- y" ?9 f1 }; v- ]. L return 1;
* f" D% n+ j8 D# O" R% h! O( f}