*.map
文件是记载地图信息的文件。% ?, B- Q3 T) L7 R* n/ _+ K) W+ n' C
) i( X5 {+ c1 p( ^6 q 地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。0 n B) t5 H4 A0 z/ R: t
1 o* a: b% @& Y& N 第 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 地表一层的序号
+ K7 v( g" ]' k% m- e- @# p a. E Y! z `
03
在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号8 [4 e8 L- x' w) g8 q
07
在地表二层 12 01 这个大序列下的子序列编号
G1 Q8 j2 r. U, k# a86
物件层的大序列
! M5 F9 ~& K! H5 ~00
物件层的大序列下物件的子序列编号
6 i! F# v% j0 n( ^03 03 00
目前不详
: g7 n5 ~4 |# @9 O01
行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
; q* N0 W) }* E# J! N7 x
7 k7 `4 \. g6 w$ d2 d# ^! Y$ `//************************************************************
1 M( l0 ]. d! ?# F% i) P4 g
//
加载地图基本数据函数;
5 ]9 G& @& ^' O//************************************************************
) S3 k9 G) q; a
5 P; @' [* J U/ ^+ ^; Y. t//************************************************************
! O6 @7 f9 {2 N9 _& P//
加载地图基本数据函数;
+ x1 @: O7 \+ l3 T) \//************************************************************
9 l3 D( m6 [ y6 k& s2 e" u
+ O* d# W/ a3 O4 _3 ], N3 S5 ?int Cmap:

oaddata(char *filnam)
! }* \+ d S5 J( C& }$ N! U9 t$ p
{
w, Q3 B' ~& _4 \ int Temdata;
/ z/ T+ u' N* h$ N# U: { {
4 j* X2 [& B8 u$ o
if(filnam == "") return 0;
; v! Q- a; {1 ]( q: t" z* ~ P' x y# `7 L0 Q0 ]2 A1 B
fp_map = fopen(filnam,"rb");
* U! _/ s& ^, B, c! R5 j
( X n0 [" k J! Y; G if(fp_map == NULL) return 0;
& k* ]. n, W: G( j# Y* r
" F+ N, r0 o: @3 D fseek ( fp_map, 16, SEEK_SET);
8 {. ?/ x" p9 b( v0 T
fread ( &ShortWidth, 4, 1, fp_map);
y! f% @0 b! c. B
fread ( &Width, 4, 1, fp_map);
M: a, w. T% T* U F( W fread ( &Height, 4, 1, fp_map);
2 \/ o# x# N) l1 l
. k# P1 K# M3 {5 c3 f ]" P# D
int TW = Width / ShortWidth;
/ L! C# ~! C: E& e; t
int TH = Height / ShortWidth;
- Q9 J- W7 f! e! h
+ P$ \; P6 c: `! N$ \ for (int j = 0 ; j < Width ; j++)
) t, d' ]4 M6 t1 v+ ^ {
! _6 x' _, L* l( Y1 k2 z: I# S _DELETE_ARRAY(Cell);
; L/ o3 O' r" I/ U C1 P
_DELETE_ARRAY(Role);
k( C! I, R$ A& S$ ` }
" n8 U7 w* t" n2 C ~' L7 s0 B
$ l) l/ ^9 M9 Z! Q% [6 Z Cell = new stCell*[Width];
0 e" T8 Y" } ] b3 ^ D* ~
Role = new stRole*[Height];
2 H; A/ e4 t" m5 Y for (j = 0 ; j < Width ; j++)
+ K7 w' U4 K! g0 { {
4 K, s% F' f" a Cell[j] = new stCell[Height];
# N" d2 c( B4 J( j
Role[j] = new stRole[Height];
6 j" d# W3 h f) ?; L5 K }
$ W* r8 S. X Y% J
% Y# Q1 n) ]4 d; n% B% u: ]4 i fseek ( fp_map, 28, SEEK_SET);
3 D# E5 |# a) D3 k6 f. f& |, |- y& c
for (int y1 = 0; y1 < TH ; y1++)
; q9 J' \0 [9 `- d/ E6 R1 t
{
) l: t9 y+ J" O
for (int x1 = 0; x1 < TW ; x1++)
" t7 `9 Z, B* W) t {
! Q5 ~8 E5 W" V4 j( B A# v2 w$ W
fseek ( fp_map, 20, SEEK_CUR);
+ {. k$ [) g6 p) F4 x O
for (int y2 = 0; y2 < ShortWidth ; y2++)
0 R: Q4 f0 \& h, t! r! Q
{
, a( _% }2 S6 X
for (int x2 = 0; x2 < ShortWidth ; x2++)
K3 n; f2 E' A) p
{
' H# D m, n& T fread ( &Temdata , 2, 1, fp_map);
4 P! \. N4 N8 }# j/ o6 Z" _ Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
# R; s7 T, T" o% u, t0 h6 a; K
7 x/ n4 l1 ?; P4 v% W" T fread ( &Temdata , 1, 1, fp_map);
% n9 W9 H( F$ t' E1 [' y Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
. ^" V% P* @; T4 q4 l( n% d
: Y/ G9 R0 |* x3 ~! H! V* u1 s/ U fread ( &Temdata , 2, 1, fp_map);
& n# Q J0 Q8 d. t5 P! M- h; @% {
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
, c; I* u) {: k: c, L; P" r
, _* s7 W4 t$ \" V7 q
fread ( &Temdata , 1, 1, fp_map);
- c: a! w8 @3 K/ ?% d2 Q
Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
9 ^! b' i+ j" `) s6 s4 m5 k // 6
个字节
' M" H' [7 r3 o- e" R, z- n4 @( F
2 x) t/ c% I y fread ( &Temdata , 1, 1, fp_map);
1 w. g& ~) V$ x
Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
7 O7 e( _+ c, T 8 H/ m; t+ Q% Y. w; Y* Z
fread ( &Temdata , 1, 1, fp_map);
! d1 T' s2 @! v# s$ y9 ^ @6 y( n Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
9 @* z; o6 ^8 y5 ^- q, m# I
0 v+ b; m3 v9 S9 R4 N& @) B- o$ z //fseek ( fp_map,3,SEEK_CUR);
2 T& u E( k$ p& e5 M fread ( &Temdata , 1, 1, fp_map);
" R: |" l% N Q( C0 V
Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
7 C; l* R2 V/ O9 K( j4 }8 }( c
* z- g! {5 n S' l' Y
fread ( &Temdata , 2, 1, fp_map);
. |) z) X0 t1 T& D8 W
Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
. ^& q: G- k1 r4 X- s3 L
; u P5 `! P5 S1 [1 j( m/ d# ]* K // 1
个字节& Y5 q6 F& ]2 y
fread ( &Temdata , 1, 1, fp_map);
4 E, X* G% M8 a3 N* [0 o) i3 q
Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
/ C% V0 N0 n! f' H# J# Y/ e1 g% u //if (ftell(fp_map) > FilZize) return 0;
" l' c# b+ O& ~+ N4 S
}
; ^+ Y2 B! Z3 U! P' _* p
}
' d; W4 l6 r% G! f2 x! P }
. w. r" [) N* G6 m }
9 A9 y1 ~" @0 `1 D+ t/ h @
- D8 x' K' D' F" p9 U fclose(fp_map);
2 x! a4 v" ?( N3 n' A! k
- X* f' h2 u' q9 D* Y7 x8 t- j
) D. I: l7 g0 C1 s7 v3 p. o1 r return 1;
! \2 }# W) s1 }4 ^, F; c
}