*.map
文件是记载地图信息的文件。
# O: i, ]% \! U8 a( s# _
: |9 i# {& C& S+ |8 p 地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。# X; h# k% ]" f9 H
: d. f8 U/ M+ U% p
第 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 地表一层的序号& H* w7 U1 R6 U Y( E6 @4 I
. f' e. x8 ^: r7 k9 U/ Z5 D
03
在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号7 P, ~+ M5 y; c: _: ?4 |
07
在地表二层 12 01 这个大序列下的子序列编号# G: w5 ?9 X$ k
86
物件层的大序列
; d( o! R, n9 f00
物件层的大序列下物件的子序列编号
( g( y4 V+ p( x4 V9 z" _5 S2 J; y03 03 00
目前不详
. U1 l: O7 j0 }% E$ n01
行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。* Z c' L( y0 i. n
! X# Y+ a( h; Z5 K" O//************************************************************
5 I% U6 n9 d5 [, k+ @; O1 N- K
//
加载地图基本数据函数;' }( Z. q) O5 B. k, x3 E2 n
//************************************************************
: e" Y; u$ M1 P2 y) I, [- M, M. U& ^! v) U" T8 U2 E3 Y
//************************************************************
q$ j" |4 D Z2 r/ b. |8 q. _//
加载地图基本数据函数;- u, h# a/ a, f6 J6 ]" H
//************************************************************
4 g) q% m( \+ q6 O# l e% G
4 y" l) V" y3 o# ?% F* } Yint Cmap:

oaddata(char *filnam)
6 \/ r/ \6 V* L6 M
{
- j# R. u* w8 `$ v
int Temdata;
* c/ X8 \9 t5 H+ E! \6 G5 E
) ] V ~( G3 ^ g+ t if(filnam == "") return 0;
7 _8 Z6 N4 G& _3 \* E j3 C0 Z- j
! h) `: L& j. a/ f fp_map = fopen(filnam,"rb");
5 z" V! \ U' Y4 G
" f" g7 f" b# ^1 A1 }$ A if(fp_map == NULL) return 0;
9 F7 b, j: A# `/ X# i, L) M
x8 C- G: K# I6 m# W fseek ( fp_map, 16, SEEK_SET);
% M* E+ K* B1 P( i9 Z5 J2 Y+ A
fread ( &ShortWidth, 4, 1, fp_map);
. F4 S$ J1 _3 @ fread ( &Width, 4, 1, fp_map);
7 T8 V$ f! I2 V
fread ( &Height, 4, 1, fp_map);
; C) i; d9 C8 v! O0 X" A
% j: |" H% t' j9 \/ p# y2 V9 J int TW = Width / ShortWidth;
0 {, I; o7 ` Z
int TH = Height / ShortWidth;
+ }% c2 r8 u' n
$ @2 }1 k) {/ k" g. | for (int j = 0 ; j < Width ; j++)
! `9 O1 i' J/ K- h+ J/ _ {
9 N' m/ j3 Z& v! P
_DELETE_ARRAY(Cell);
: s! |" l8 @ q _DELETE_ARRAY(Role);
; K3 d0 H! x& {( X% s% f! S
}
8 f; J: B; [/ ]4 M9 y
# [) @4 F: E- H* u$ F Cell = new stCell*[Width];
, i7 p4 Q3 H+ l+ m- {' w Role = new stRole*[Height];
" D t: D. k2 P5 e- O: C8 d7 D' t% o
for (j = 0 ; j < Width ; j++)
7 r* i. Y! i' x) e2 U {
! O. }' p( V- R# S2 p: p
Cell[j] = new stCell[Height];
$ k$ w |+ E- ~' O" E; n Role[j] = new stRole[Height];
9 H$ m. t) i$ U) L
}
. S$ s% o1 S' e; g9 v+ R" `0 H, l' ^' S0 F: v1 u; X3 y
fseek ( fp_map, 28, SEEK_SET);
4 o4 o9 i6 j3 Z1 x+ V& m, b! j i
9 {! M: D, ?/ Y8 t6 z O for (int y1 = 0; y1 < TH ; y1++)
. w: z4 Q5 I) R N$ Y/ t" d. D& r" S7 M
{
; g( P8 o% y4 o; M
for (int x1 = 0; x1 < TW ; x1++)
1 j: t# v1 y4 c8 w. r* }( k1 m
{
, {' u2 t' u0 o$ F8 d fseek ( fp_map, 20, SEEK_CUR);
3 r% n* d0 ?1 {+ z& @
for (int y2 = 0; y2 < ShortWidth ; y2++)
) d; @# w& f) N a) o {
7 K+ Y* L( S& g for (int x2 = 0; x2 < ShortWidth ; x2++)
. Y8 O+ x2 \" U- N+ X
{
6 H& r5 o; k* Q, ?' N( S" [! d' G: n
fread ( &Temdata , 2, 1, fp_map);
. ?( h1 w- U: I& Y" V2 w% Q3 N Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
" f5 D0 \' l" c* f' K* a1 a
. b1 q: K# [" Q Z8 x6 I fread ( &Temdata , 1, 1, fp_map);
! \( k- _& h7 B2 q& T Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
: d# }: z2 ]+ e; X9 r+ E$ j7 Y, ]% h% N6 }6 _; ~/ Z" H
fread ( &Temdata , 2, 1, fp_map);
; c7 [% X) }: }& [. D
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
+ F& @) ^. ^/ Z; l- j- h- p' X- D% O, L, K+ P$ |
fread ( &Temdata , 1, 1, fp_map);
3 a6 n! o0 A. L2 ] Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
$ \# J8 d ^. E // 6
个字节
: M& T5 k% s, [9 [ f( J. p3 ] L0 ^7 c! J3 x- t# L( _: B
fread ( &Temdata , 1, 1, fp_map);
. i2 [. B% p/ }8 T, m, J
Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
1 L1 T0 R7 B7 j
, K& y( I! v7 l1 `& V8 V5 d fread ( &Temdata , 1, 1, fp_map);
: c$ G( R1 n+ ?0 w p
Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
% G" n7 K& f+ x7 B0 Q" |
, Y3 O! g X( N) D
//fseek ( fp_map,3,SEEK_CUR);
/ u9 u" w" t. s; a- ?
fread ( &Temdata , 1, 1, fp_map);
/ w& V$ D) U, a8 Q Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
7 T5 U; ]2 v: S( \. x2 l8 ^( s
+ @; W0 p6 a* l: u+ g% y fread ( &Temdata , 2, 1, fp_map);
4 K* b2 P7 k6 f$ [- H- v
Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
$ H1 U) N; Z- O9 k7 {
3 n& u% }: ?% F/ T1 \$ c' k // 1
个字节1 s' e+ O- q" `# o4 _7 |$ [ b
fread ( &Temdata , 1, 1, fp_map);
+ q2 F9 `, r+ ]; Y' O' M6 u7 ? Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
1 n& X5 E6 ]( i8 v4 ` //if (ftell(fp_map) > FilZize) return 0;
1 d! Q9 U: A1 [3 V8 T
}
$ c8 b/ k: G& Z0 M
}
: B' \: A; ? o0 j# w+ P/ |/ H }
5 R2 ]- W' L* b, n( [# a* e3 W; Y1 H }
" G2 [; B9 S, u+ S/ U
- @" A; K/ L7 b1 m+ n fclose(fp_map);
2 z4 X3 ~3 G- E# ?* ~2 Y( B2 o' B3 ?6 H! O' `5 [0 f. h
8 }$ K; Y7 G7 l: X) ~ return 1;
; |( P! r6 C4 j3 t6 S
}