*.map
文件是记载地图信息的文件。" U8 \2 X. {: b9 D; t
$ o# ?. s1 h# {* g$ n; j
地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。2 A& p( I, L$ a: t1 A! ~2 h
! U$ X/ j* V( C; {2 ~/ z, S
第 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 地表一层的序号
! X4 M: O4 _% v; w2 \8 @! w
/ f5 M0 R$ w9 e0 ?& b; i6 v* x$ \03
在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
% E' j7 y! q h- b; h! A( R07
在地表二层 12 01 这个大序列下的子序列编号
# U5 w. x" f# B/ v" Q6 K# d86
物件层的大序列
7 {/ e* a% ~- R+ R% |/ E& F% J. K00
物件层的大序列下物件的子序列编号, ^8 W1 x: H4 K' d) L h8 o
03 03 00
目前不详* Y/ [% W& f9 S9 b1 _$ z! B( p: q
01
行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。5 j% E- r& v+ ?* y: K) r5 q
* j0 @0 \, P8 M# ^$ p//************************************************************
/ @# c, f+ H4 ^% g9 ~
//
加载地图基本数据函数;
6 T* s$ E) |& o6 A' x//************************************************************
# {2 n5 v7 ~! A0 H$ e
9 t" Y! _9 V" q5 S& ~//************************************************************
, ] R2 U; q4 g& L
//
加载地图基本数据函数;1 m. L# ^6 C* O+ q: g
//************************************************************
8 Q0 w+ p7 g# f! b' _5 ^9 u: X
6 s, ^) ^% I$ J t. b- Q, }3 B
int Cmap:

oaddata(char *filnam)
! s1 L0 }! V1 j- h1 U |{
# k8 r0 n) q% }! U' c6 A+ B; X
int Temdata;
' ` z1 S: g# I$ o; R4 _; n1 `, A: e- ^0 e
if(filnam == "") return 0;
; @" F- J! s! D9 n& t
" D" T+ O# J& q. @
fp_map = fopen(filnam,"rb");
3 M4 [8 Y" b- Z, N
3 Z9 e$ w' k l
if(fp_map == NULL) return 0;
2 Q2 K$ ]3 e) ?) X0 p7 y9 u, g v% O+ S! }
fseek ( fp_map, 16, SEEK_SET);
" c: [+ ]& O8 n- Z
fread ( &ShortWidth, 4, 1, fp_map);
* L2 l0 O" l# P
fread ( &Width, 4, 1, fp_map);
) Y1 B' x+ t- @0 b" F0 C2 z fread ( &Height, 4, 1, fp_map);
0 @$ L+ o5 l- n) M* u! q; Q. _& K2 |& `+ ]9 y
int TW = Width / ShortWidth;
7 G* [) b* ]0 B) }) Y& F
int TH = Height / ShortWidth;
' W r: g+ N$ @4 M
0 n. Z$ C# o* O! c$ f0 h7 {) j
for (int j = 0 ; j < Width ; j++)
, r* |/ y( |8 n; m' g* p0 I) I
{
- b+ }# i) ?) w! F8 s
_DELETE_ARRAY(Cell);
6 ~' G( A- L C9 a! O _DELETE_ARRAY(Role);
4 |) _6 l2 ?- {
}
7 T- i) C& ] C! J
* k0 G9 E; N& h+ e* v
Cell = new stCell*[Width];
( h7 }1 O; j Z" R4 e
Role = new stRole*[Height];
5 j8 ^/ q% Q2 @1 l0 `: `
for (j = 0 ; j < Width ; j++)
9 \# A+ N5 |7 l
{
$ I3 F9 U) b' w( M Cell[j] = new stCell[Height];
" [* M2 e- f; H& Q5 @/ Z
Role[j] = new stRole[Height];
4 }: x4 O+ b0 u% k q3 m( L
}
Z& {5 c: f+ }$ r9 i0 f+ P" H4 Q
6 L+ K2 m0 g: p& Y o
fseek ( fp_map, 28, SEEK_SET);
! { x* y! o! w0 d, R& B
& g9 ^6 B; Z n: k for (int y1 = 0; y1 < TH ; y1++)
4 E( U1 _& F5 j) w$ _
{
6 T& ^" t r$ l" \0 } for (int x1 = 0; x1 < TW ; x1++)
1 t2 \# |3 u+ D# }3 }! B
{
: q( |* G' n2 R/ J% D2 H. T
fseek ( fp_map, 20, SEEK_CUR);
! W& [8 A3 x9 D6 h" Q: F* K6 t for (int y2 = 0; y2 < ShortWidth ; y2++)
8 m; ]: X) o( p
{
4 K8 r4 S6 _) } z
for (int x2 = 0; x2 < ShortWidth ; x2++)
6 ?1 W4 V; t& F% S# |' v; W/ ?
{
; l8 Q8 J2 |) I0 }. i3 D fread ( &Temdata , 2, 1, fp_map);
: v" m! p j/ g2 F. H- W2 M% u
Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
+ d* d9 H& p3 D
- h& T r q. f+ [. U fread ( &Temdata , 1, 1, fp_map);
# W$ A0 N5 u7 j
Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
: ~& n( q& z7 I u. Z
& a Z, u" ~. s
fread ( &Temdata , 2, 1, fp_map);
, C. ^. c k: `- f0 x- x( q0 D Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
# |) H4 g+ |1 Y
% a4 D3 X' W( F! _, R8 }3 N. a
fread ( &Temdata , 1, 1, fp_map);
6 L9 ^5 v& p$ [7 A+ N b6 l
Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
: R. j) r# h) s) r* ?/ p5 P // 6
个字节! z2 f" C+ h4 e4 b
3 x$ m! P; S- {7 G' y/ D6 v% O fread ( &Temdata , 1, 1, fp_map);
/ X$ I; u1 v H" u# u* R$ T
Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
) d7 q+ ]) S5 z+ P# g2 c. J+ E
; g0 v5 W" a" f fread ( &Temdata , 1, 1, fp_map);
! z9 v2 k0 j! C1 g+ ~; F5 q6 \ Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
0 W1 I9 \ h- Q
+ n7 S. P, i7 {+ {# p" f3 `' R //fseek ( fp_map,3,SEEK_CUR);
* H) g' \* f1 S, h1 D
fread ( &Temdata , 1, 1, fp_map);
8 `2 }% l6 N; }6 n. m1 ]+ ]3 ]& f- [
Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
. ?- N, n2 ^. ^2 Q# Z 6 W! G) y: {+ ?4 [0 E: k
fread ( &Temdata , 2, 1, fp_map);
% l( e/ N" D8 b$ X' b
Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
Q0 M+ j l7 B8 R* }. L7 N) [6 c
; @9 ?1 Z e& n
// 1
个字节 Q2 H( S! Q, \) c$ {0 f1 r3 p
fread ( &Temdata , 1, 1, fp_map);
- ?5 u4 @: P) O6 O: f9 h
Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
0 O! N* b# w$ O) v P/ I0 C
//if (ftell(fp_map) > FilZize) return 0;
' o+ T& |; s1 l Z7 K
}
3 i6 L: `- e8 ^( U. l4 F }
: ^% s$ D2 f4 J _8 t
}
' K; e- M( I5 F4 A1 i1 E }
9 r: t. K4 B" X/ p) L
2 A" q: G7 C1 f/ a" t; W) Z8 ` fclose(fp_map);
/ N, b* D! t5 v' t6 H3 v+ ]
! o& U2 @7 i, ]+ F
4 F2 S1 s! Z2 G5 m0 a% _2 b return 1;
1 ?0 ?. l# c* {7 i0 P7 ^7 E}