*.map
文件是记载地图信息的文件。2 e. X) z8 X, a5 M. J4 c% [
* I+ U; ^ D6 A
地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。 D# J# @! j: x
$ b& t9 A9 {5 G% f5 Q6 ?7 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 地表一层的序号
0 y$ h4 m% |3 C- U4 Y* P' y3 q. O' H+ N. o
03
在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
6 x' b" s+ g9 s% R) @9 u07
在地表二层 12 01 这个大序列下的子序列编号
9 _% {1 l: ^' F( L3 P6 L- L3 m' J86
物件层的大序列
8 x% F; i# B& _& t00
物件层的大序列下物件的子序列编号
/ a) w& h) B# t0 e$ T/ s* s03 03 00
目前不详6 `. K3 e1 P: |3 p
01
行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。, W9 I' I6 v, _9 p' A5 l$ D
% C0 W8 k4 u! t1 }7 I
//************************************************************
+ O1 f# i2 `, }, ?4 w//
加载地图基本数据函数;, U1 L$ P; u9 m3 [
//************************************************************
4 x. R; Z6 |# a' K! F: ^1 E) f$ L- C8 e6 r6 z0 S7 |' O
//************************************************************
4 P) z; Y2 f+ k' |4 j5 @! H//
加载地图基本数据函数;
' ^" z5 d) P; n! f8 s//************************************************************
5 U( {8 ?- C) a* \8 b; V+ s
3 c8 p! |6 P, U& ?4 z' E, M0 Mint Cmap:

oaddata(char *filnam)
* @, V2 T3 |: v) ?: _4 F- @! E% X
{
1 g6 H* c% p) m0 f) Y$ O int Temdata;
5 n0 U. u! J% [" s" T4 [; t) G) i
" E9 K" h' _/ P/ ^$ q6 D
if(filnam == "") return 0;
% j; _1 m0 g! @) b1 m% r* P& m% F# x
$ u0 R# t$ q& o, v3 W
fp_map = fopen(filnam,"rb");
. d: [- P z# r i# b0 w
' }$ ~& O# h# R7 X* z" p% e9 b3 g if(fp_map == NULL) return 0;
5 m- e5 K9 V7 U$ f" v+ s+ a0 a5 {
fseek ( fp_map, 16, SEEK_SET);
; J, a' K3 F: E3 R1 y* ^5 \; w
fread ( &ShortWidth, 4, 1, fp_map);
( {. q) x- \3 v4 \8 B h
fread ( &Width, 4, 1, fp_map);
' V- E, h" ^. N6 r# y" D) h fread ( &Height, 4, 1, fp_map);
% {$ ?1 Q8 {$ H) C& ^; t: {3 ]1 Y3 @
1 M) |+ @ [5 ]5 p5 O1 Z6 `$ Q
int TW = Width / ShortWidth;
/ L6 V* M4 x. y) j- G int TH = Height / ShortWidth;
. n4 ^$ G: g8 t+ m7 g1 h
# p) S0 W) e: z, M5 U( L1 C' p
for (int j = 0 ; j < Width ; j++)
) j5 K0 n( |& n$ v7 o8 H
{
! o0 J P% t( [' f3 Q$ J0 g; {
_DELETE_ARRAY(Cell);
4 K5 i- Q. Z8 L7 [0 r _DELETE_ARRAY(Role);
2 _+ O; c# |5 l4 e- u }
B/ s0 ?2 U, v, J: Y+ h4 h
) q9 C$ G+ \% Q
Cell = new stCell*[Width];
# @* ~% q4 \$ u+ j0 Y* ^ Role = new stRole*[Height];
5 j% P! k, Y( I6 @
for (j = 0 ; j < Width ; j++)
, g# K' t' E. c' I! V# K {
" O3 c3 y$ [8 v/ f
Cell[j] = new stCell[Height];
) e+ L. W1 Z# C% R7 [+ N9 C% H
Role[j] = new stRole[Height];
' O9 w7 m+ z3 i/ Z
}
! ? F h, h$ X8 G9 ^
# k6 d6 g$ O/ ?4 r/ | fseek ( fp_map, 28, SEEK_SET);
8 o0 Z ~) N$ ^( A c/ M/ u
. W- b8 w% d9 ^+ A* A6 n! m for (int y1 = 0; y1 < TH ; y1++)
+ v/ Y y3 I- y( q {
2 ?+ C! |- S4 F& L for (int x1 = 0; x1 < TW ; x1++)
5 m' f' V1 y6 n, H {
9 I$ Q+ p, m' Q) n8 ]9 y8 U
fseek ( fp_map, 20, SEEK_CUR);
7 b; G8 [" D$ B* M4 J for (int y2 = 0; y2 < ShortWidth ; y2++)
2 t U) E* s0 t8 A1 {! g$ y
{
7 g8 ~5 o7 {: R for (int x2 = 0; x2 < ShortWidth ; x2++)
. V- M6 I6 @' l! }. Y {
# U! c+ f1 B4 T% k1 U% h" V' D$ V
fread ( &Temdata , 2, 1, fp_map);
9 r) v2 [, W5 u* Z
Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
2 |1 @, P# C/ X7 V6 ]8 n) i- e
& \9 Z7 D2 R) @
fread ( &Temdata , 1, 1, fp_map);
6 W B% R1 o5 X4 D2 V- y, p
Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
7 _' K: B; w- d: O$ R
3 I7 T; v& _2 g' e fread ( &Temdata , 2, 1, fp_map);
0 f) n4 w5 n7 g. m Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
3 g' k/ k4 |; v2 o! l
. R3 Q% _7 l& H1 q$ F
fread ( &Temdata , 1, 1, fp_map);
/ @ j n5 q% b$ w H) ? Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
i1 T& u0 {! F$ m* Q // 6
个字节
; P5 Q& X: ?( j: _0 |! e" v u4 [9 w
0 k+ k- c2 Q# e( e( k% M) [ fread ( &Temdata , 1, 1, fp_map);
4 ^* s+ w2 _# b9 {5 T$ J `) w Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
( k |3 Q5 w/ }' r9 v" l
. h% a+ v( Q6 Z9 p0 L
fread ( &Temdata , 1, 1, fp_map);
- g$ m& [1 k% U4 T5 B Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
9 a( L3 @* }( m7 x8 w7 e. ^; Q$ e' g1 h1 R9 O6 p4 V
//fseek ( fp_map,3,SEEK_CUR);
/ K- h3 W7 m' n+ P* Q fread ( &Temdata , 1, 1, fp_map);
$ j- n5 N1 m: I; d% K$ q& f9 ]
Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
& s" @: S w8 ?$ ^( R' ], X
7 R7 t# U% J$ B, V B2 z fread ( &Temdata , 2, 1, fp_map);
% |9 M/ \! k) b) }+ ^* e- J
Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
5 G) j/ O. @ d/ w- {- g7 z3 f) N0 r* z3 ^3 P8 Y( q+ W
// 1
个字节
. t$ v: L4 w* \9 d. V1 K) F fread ( &Temdata , 1, 1, fp_map);
7 H+ j: Y) \6 h# n1 v4 e$ { Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
+ D. W2 b8 E0 N5 n. |7 h; b
//if (ftell(fp_map) > FilZize) return 0;
: F1 M. S; U6 U' W1 u* I }
! Y, E) ~% B7 H* g! Y
}
4 G' z9 d$ i3 p4 C% K$ B; @ }
- ?8 U4 u( N2 O4 W* v: E) ~
}
9 g+ u* W( [8 g$ R8 q5 B. C: {+ r
: @) H+ L. |" n; q- o7 R fclose(fp_map);
4 O5 m1 _$ U+ v% J: N+ c3 h
; h" V2 W: U2 f8 [3 H
) V' p. K: f$ X8 [' Y3 T5 X return 1;
, W4 ], j; `) ^4 w0 Y( p, p}