*.map
文件是记载地图信息的文件。
# p2 f w& a& e
, ?1 b8 @/ I% p! Z* p 地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
% I, K/ V4 k1 [2 B9 o3 {1 r
. B4 f" j& \: F" M2 B: Y# R: 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 地表一层的序号" s! E' q. _$ b
" d. h2 B( _: n
03
在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
0 P' g* P8 i: K# y: U, w! Q07
在地表二层 12 01 这个大序列下的子序列编号
8 Q4 _! I2 m1 @86
物件层的大序列
& Z- y/ M: m% T: `. H/ {00
物件层的大序列下物件的子序列编号% K5 Q5 a4 }8 O
03 03 00
目前不详
* d2 q- v; R" X01
行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。2 s# O/ t4 S; T" u a/ o- V, K9 _
$ |8 k2 A, M9 y1 F1 J$ k$ j//************************************************************
' [. C/ G) M, [& u
//
加载地图基本数据函数;7 o4 ?) ^* ]8 o" i; w
//************************************************************
' X/ G9 I, ^& S$ g, {4 z' {5 e6 ]
$ D! j' f9 r2 o8 Q: H* k, b//************************************************************
8 t% D' v7 ~: K3 L4 y
//
加载地图基本数据函数;
' W8 Z8 i7 q) q5 h. ~) n0 B//************************************************************
' a5 Q- [* o9 `) S/ k+ ?; k
: c n5 Q7 y- a# xint Cmap:

oaddata(char *filnam)
" U8 c6 d- I/ X; N. T7 f
{
( w4 y, t) ]! k- j, P6 Q# U& J int Temdata;
7 o5 m- o4 j% g% X6 r' ^4 R
2 `0 q: N) @/ Q5 i2 [6 z1 r( o if(filnam == "") return 0;
6 d H+ y- h* r7 M8 I4 x! j4 e2 g( L, j. r1 d, ^- y
fp_map = fopen(filnam,"rb");
8 `2 C, c. G+ y, E
" Y* l7 Q: F" Z R3 ?+ P
if(fp_map == NULL) return 0;
& o- U( L, {; D: L3 {
5 v+ v- L9 w; _) W- K8 w fseek ( fp_map, 16, SEEK_SET);
7 _1 e, ^ l: h6 H3 _5 e5 Y fread ( &ShortWidth, 4, 1, fp_map);
- h/ j4 @: s5 Z fread ( &Width, 4, 1, fp_map);
' x! `, w6 a; F# R3 K fread ( &Height, 4, 1, fp_map);
( |; @6 n- r) w+ _* ^
$ F d1 P- J! | int TW = Width / ShortWidth;
/ D1 p5 H5 @2 ?# }
int TH = Height / ShortWidth;
( C, l( c) o& b% }8 z* b& l
7 A, Z# _- V) X
for (int j = 0 ; j < Width ; j++)
/ R$ P- h5 t; X2 o0 u {
8 I9 |( }; B* M2 S
_DELETE_ARRAY(Cell);
0 i0 E/ A9 a7 Y
_DELETE_ARRAY(Role);
. ^+ C3 q$ v# I. H+ Y4 ^& E+ m }
6 e6 W+ ^$ |* }; M& q" F# [* A3 m
7 [2 w2 g" V' m$ e# L Cell = new stCell*[Width];
5 X3 h) p! z4 ~7 D6 e' ]8 ? Role = new stRole*[Height];
6 G8 f* u3 D4 s) @8 ]# w for (j = 0 ; j < Width ; j++)
, O7 j* \7 ]( e( E& u& T
{
% _, J/ a( D1 d* ?: k- d+ A Cell[j] = new stCell[Height];
6 y1 ?$ x* K6 @8 W0 E( c b Role[j] = new stRole[Height];
# D* }- [0 B; S }
_) @, O! d4 O3 n ? K6 T# i
) |# t. q9 A% @) D' A/ R) o" u3 T
fseek ( fp_map, 28, SEEK_SET);
( r6 T F$ t2 h) A8 T# ^( y8 i/ \+ T( q9 x4 B+ f8 r
for (int y1 = 0; y1 < TH ; y1++)
/ o% |. \; [$ p$ C, M' w {
( O& U) T9 `8 P$ S$ @; _$ _
for (int x1 = 0; x1 < TW ; x1++)
2 T, [1 O2 E/ z5 z+ c8 @! |7 G
{
3 I. M. K5 L6 G1 t; P9 v
fseek ( fp_map, 20, SEEK_CUR);
. E/ A6 N% [0 e- v4 h( w% y9 ?& o for (int y2 = 0; y2 < ShortWidth ; y2++)
# N7 a1 u# f2 x- N' Z) z' x {
1 U/ i1 w& q# t for (int x2 = 0; x2 < ShortWidth ; x2++)
7 G w7 J$ M! ?3 m, v$ g$ U- x9 m; Y {
4 z3 p4 r# S w5 |# S# O: ]% V
fread ( &Temdata , 2, 1, fp_map);
1 n, a3 Z: X0 v3 p9 r; ^
Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
; f* x2 {; a& B2 M6 G! Y6 L. n$ b# Y+ g$ C# t+ C' A: r' w+ }* [$ I
fread ( &Temdata , 1, 1, fp_map);
" b0 E! Z& F8 g, Q. Z3 I. U
Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
: I. T4 Q( y8 ]$ _3 X1 }
: Y+ y8 {, ^! z4 p$ }1 K
fread ( &Temdata , 2, 1, fp_map);
' {1 M% t+ |9 k( U3 F8 o Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
# D5 g7 O% B, H0 M* Z
7 F# n5 Q7 x. I: y$ g fread ( &Temdata , 1, 1, fp_map);
% {1 q. T1 i9 b" m
Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
) l& ]7 s1 ^! n8 u$ ^, a
// 6
个字节, I7 V C+ \8 ]8 \0 J! _
, J1 ?, E" @! c, `' @+ n( W fread ( &Temdata , 1, 1, fp_map);
+ F" U3 o$ N0 P" s ^; W
Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
# r6 Y2 U5 k5 J# ?: q2 e
4 e. ~- t, Q5 E6 K" \ fread ( &Temdata , 1, 1, fp_map);
7 t: F! a5 Q# ?8 v: U Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
& r r6 ]1 H& N L; z- c% T/ i
$ ^, w' w4 v3 k5 \& R* a //fseek ( fp_map,3,SEEK_CUR);
5 b7 n9 H; X1 O; O fread ( &Temdata , 1, 1, fp_map);
" e J& R2 H% @4 V$ p r! R l( I Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
: x6 C9 J* @6 H) U0 B" L
9 u# {/ H$ ^8 {, K0 z, B
fread ( &Temdata , 2, 1, fp_map);
! z8 F5 c. t9 K/ I: [/ m
Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
. c; e) t9 G, C; |( z: `" B" w. Y
* f3 B2 A! G; T D
// 1
个字节
0 W! R2 |4 l* Q fread ( &Temdata , 1, 1, fp_map);
- @2 Z! Y9 Z( g, [" U; L Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
$ D: i) G6 g: `4 t
//if (ftell(fp_map) > FilZize) return 0;
e) f b5 o r: y }
& f4 e4 Y) v; }( K% E( @& q
}
! p5 N9 G2 J1 [8 ~8 k }
' h% W; q3 _ }6 e* C2 c( C$ L }
' V" Q+ ^" d% _: r- m, U3 Y B; k- v
/ Z- o5 f! b/ U5 d2 G: |3 m$ | fclose(fp_map);
8 ^1 K$ j) M& C: A; M3 W! B+ W: m. a
8 O1 a! r$ K8 ]3 t+ s# `% l
* z4 b: Q u5 F$ o return 1;
) q/ M7 D+ H- [7 i" T% z. ?, `/ t5 g}