*.map
文件是记载地图信息的文件。+ `" J" e* b8 d+ S; S% z
; q; ?) T B$ ]$ a
地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。/ x9 o. ~- O3 M' @1 |& c! z0 R3 u! I
3 `! v- O4 V6 a+ M
第 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 地表一层的序号+ x$ B a. W# r# p& e$ y" ]+ [+ m
3 S5 _5 N' Q7 J! P7 ]% L
03
在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号. n% L# \, t2 h0 ], u9 f8 ?, q; \
07
在地表二层 12 01 这个大序列下的子序列编号
2 N# h- R8 q& y( B f' N' B86
物件层的大序列) ]. T. l( F+ S5 q9 q4 g. n, Y
00
物件层的大序列下物件的子序列编号
0 }* z0 [6 R4 s+ X* ]/ Q5 L03 03 00
目前不详
8 I9 g/ z, B8 h& ]) w( L# }01
行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
' F0 |4 G3 ^5 a' Z( _' r, E) U7 Z/ Q, ?" _3 Z" P
//************************************************************
/ A, a% k- \% h5 ]; j7 u
//
加载地图基本数据函数;# q2 b" s; [5 @; W
//************************************************************
L4 @0 t0 E" m# i" k! P
& [ o% q, X5 R7 `+ i4 V
//************************************************************
, ]5 S7 h" L! ^+ ?
//
加载地图基本数据函数;
; g& W. Y: }5 x$ R5 ^* j: O//************************************************************
$ N5 `) f7 b. ~1 n
4 w3 g5 t: Y6 c& x6 y6 _( I
int Cmap:

oaddata(char *filnam)
6 W3 K1 L, s7 I
{
1 B6 F1 e0 ~8 {5 T8 M3 Q0 ^6 P, N) a int Temdata;
, m, g" t$ m: e
; ?, p& u* g+ s, \! Y1 j if(filnam == "") return 0;
- v I) Z- z( v/ R7 @1 d$ F
+ R4 e- }; Y2 t; R" S" |+ x" D# n fp_map = fopen(filnam,"rb");
% S Q7 H' V$ M
. f: i5 x, t- s/ k) D9 r if(fp_map == NULL) return 0;
7 S) G% E) `: Q& g2 @+ b( F( _5 t' m, i" I8 b( g# {, f) r
fseek ( fp_map, 16, SEEK_SET);
) K/ s! ~: C0 D9 f4 e0 U fread ( &ShortWidth, 4, 1, fp_map);
# x" ~1 ^9 Z5 s) E
fread ( &Width, 4, 1, fp_map);
- B% w$ u! \5 e8 k- [; u fread ( &Height, 4, 1, fp_map);
) ], C4 w+ P% [6 S: {! A. [9 d
. h) H, s/ q0 ~, V, g7 g+ c int TW = Width / ShortWidth;
3 o: \4 C+ J F }( ] int TH = Height / ShortWidth;
' x- m, N' g/ \- v* K! T& J9 H
/ J6 Y2 m# A! p. A for (int j = 0 ; j < Width ; j++)
. i8 {: F' x7 D9 h9 b {
6 K6 b" N4 a% N/ n0 r& r8 ^: a
_DELETE_ARRAY(Cell);
0 s* e$ g$ z( t+ I+ d) a. U" u _DELETE_ARRAY(Role);
6 r% c' }1 R* _- X$ Z }
$ ~+ u+ _# }) G
& C. `+ C' V- [0 E Cell = new stCell*[Width];
6 E, ]) i6 h& Y
Role = new stRole*[Height];
- p! m* k/ [. G7 K0 q, V& t: x6 @ for (j = 0 ; j < Width ; j++)
( j5 x) D/ c+ W+ P5 q& u; }
{
0 b+ \; p, I) N" y4 ? Cell[j] = new stCell[Height];
9 ^7 _) m& s, J) D Role[j] = new stRole[Height];
# H7 I. C! Y, t2 Q3 v3 u }
% L0 K3 k6 C! g" q6 T1 u9 i. ?9 w
) |" p" ^ q0 ]2 ]/ I5 l
fseek ( fp_map, 28, SEEK_SET);
! D3 T- {" O7 h. A" P2 s6 K3 ~- t8 {( M- R
for (int y1 = 0; y1 < TH ; y1++)
y3 h+ B1 t& ?* _! B/ V* `5 A3 N
{
# f& b7 C; ?: F$ ] for (int x1 = 0; x1 < TW ; x1++)
4 P! [: K6 z# }7 f0 O {
" ^$ ]- l- j5 y# L4 U5 |/ p fseek ( fp_map, 20, SEEK_CUR);
1 X! O( y" d8 b3 U4 @9 @
for (int y2 = 0; y2 < ShortWidth ; y2++)
- ], @4 M" r& R# m h6 v: | W( z
{
4 y; C8 g( H5 L/ @0 ? for (int x2 = 0; x2 < ShortWidth ; x2++)
$ f- C& q8 {& p6 `0 `# o) `+ F
{
8 h6 _9 I( S9 q- Z4 S
fread ( &Temdata , 2, 1, fp_map);
( X# B: J, f- ~* q Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
& x: Z% c; H5 o7 F8 X5 w2 y6 q2 I
6 b4 \: R5 _0 D fread ( &Temdata , 1, 1, fp_map);
* B$ _! d4 n& R5 V0 u, s& d1 L Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
& O/ ~) k1 b4 }! c
5 N8 {7 s1 X+ W+ ?2 w, ` fread ( &Temdata , 2, 1, fp_map);
$ f* `8 n2 o/ U+ Q. \9 J" b. j
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
$ R. `5 Z% \) ]" [) h# g
! F$ t9 e$ W# t# U& I; y/ p fread ( &Temdata , 1, 1, fp_map);
1 O- \* _( F: k' v4 x
Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
" w8 ?# K' T1 V. ~2 I k
// 6
个字节
# d6 T- Q& W1 }% ]# M& h4 K" h) p2 ~* A0 p& u! T
fread ( &Temdata , 1, 1, fp_map);
/ u* x0 \" ?, Z! Q Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
# A: T1 A. o& J- B6 z9 i
2 H5 E8 t, Q3 q fread ( &Temdata , 1, 1, fp_map);
$ l7 H3 R5 @6 n# ]0 ^4 q! ^0 ?
Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
/ L, ?' T: v. S) k% m/ i2 |; g' w& U; {& \* b1 p3 N
//fseek ( fp_map,3,SEEK_CUR);
, O _% J, k) u9 x/ V0 x4 _# q
fread ( &Temdata , 1, 1, fp_map);
8 d h e# A& w. K8 X1 r [3 ~) V Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
5 n, r4 n4 `- y: ]+ H U
- |1 m V9 }" V( U0 q* C) J. d fread ( &Temdata , 2, 1, fp_map);
9 w. _& p7 q: I5 M4 g# H" C Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
' ]% V/ R. p% B9 P* W
- [" A3 R/ B7 j2 `! u$ S
// 1
个字节
7 k6 t! W+ k( D$ n7 H X8 X fread ( &Temdata , 1, 1, fp_map);
# n: y5 u! w: R Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
. O1 Y0 h! T! G! s# Q( p' n //if (ftell(fp_map) > FilZize) return 0;
% p; ~9 N1 G8 K6 Q, j2 a- }
}
" l" G0 G1 S$ i+ @: G0 ~8 S
}
$ T6 a( s# m% T" l; X' E5 R }
, e8 `5 q: }. n* b3 P u8 t }
- u& f' a2 v& S; E* V5 I, M9 i
, E5 X: f8 |9 U, i4 t( [ fclose(fp_map);
( t! p5 S: p% a: V* B
' d8 W0 M4 q2 J: ~) r
0 N/ b6 d2 C6 i+ z* ?! o2 H return 1;
6 i. \, [: z! d8 N
}