*.map
文件是记载地图信息的文件。
7 V2 v9 {9 g7 P" H
/ j6 _( y" \; a$ `5 j4 H3 \: m 地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
) X9 ]% P0 ], L/ ~0 g0 i# G
3 K) j! I' g; c& ?8 ]1 Z6 g 第 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 地表一层的序号
) K+ }% L7 R: T# i! }" ] Y5 A- x8 M
03
在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
& w9 x% b8 K6 A: r+ O1 s* h) i07
在地表二层 12 01 这个大序列下的子序列编号" F* t( J J. B/ h5 H. t1 x9 j3 R3 i
86
物件层的大序列
6 i6 K* z# l0 o" E$ O2 d00
物件层的大序列下物件的子序列编号
- I5 u( Z+ p& Z% g) y03 03 00
目前不详; S) n h6 @1 k& l
01
行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
! o7 w6 v, }+ t) j4 c) f7 ?( G7 i8 w( S# J/ l6 h
//************************************************************
% a2 s: W: `+ F7 b* X1 r7 E//
加载地图基本数据函数;
9 Q+ w* R/ v$ R* Q* @6 U//************************************************************
9 r |" u* I' T( T% M
; _7 N& K6 H' z; ?8 b//************************************************************
, w2 M9 ?& o) w# ]
//
加载地图基本数据函数;! I( ~( l- E6 V4 A5 ]$ L" _
//************************************************************
: L1 w3 M2 g/ @
8 R2 F2 n, u' |( |1 L3 T" a. g1 M, aint Cmap:

oaddata(char *filnam)
X" q `7 M" D( u
{
( z$ E* X G) A0 y$ h3 ~ u) p% V int Temdata;
! w* X1 a: L. y5 F+ g# g2 s
/ H- b0 r+ R0 F/ V, n if(filnam == "") return 0;
8 q h( c f" t0 X# a4 d
+ V% |' ^% M$ N* w o9 {6 a
fp_map = fopen(filnam,"rb");
* }* |: l/ }: F; C
( X; c2 G0 L6 e2 |4 e* J if(fp_map == NULL) return 0;
3 M6 H1 ] X9 v A( s
1 `9 P7 B0 ~! q9 E fseek ( fp_map, 16, SEEK_SET);
" u6 D& n& J3 y+ @* |4 E fread ( &ShortWidth, 4, 1, fp_map);
# ?2 s2 T8 L" _
fread ( &Width, 4, 1, fp_map);
, M5 B4 O) { j+ z: G6 F: u7 l
fread ( &Height, 4, 1, fp_map);
' y$ F$ z Q) V( r1 e+ k
2 t3 O/ w. ^. p3 O8 y int TW = Width / ShortWidth;
7 E! S* t( t# X1 q6 I2 v
int TH = Height / ShortWidth;
; _" e# y0 i8 A/ {1 w, B
) p, U2 P% g9 R8 @0 N( u for (int j = 0 ; j < Width ; j++)
. M3 f* A) o# F& S0 M2 C {
' F( x- p$ O" Y; L
_DELETE_ARRAY(Cell);
4 \ z% o0 j G" I3 x8 B
_DELETE_ARRAY(Role);
6 k, }% L, f8 L9 `$ c, `7 T* i }
) d, N# @" ?# M0 |( B
+ M( }, x7 H. p9 _
Cell = new stCell*[Width];
* [4 K" m- w' i. \/ i6 ]( t
Role = new stRole*[Height];
7 [4 p4 u6 j5 c. b+ R for (j = 0 ; j < Width ; j++)
- V. t) t4 O/ _1 q {
& D: i1 j/ d8 e7 p; Y4 U Cell[j] = new stCell[Height];
0 c! m8 n9 Y! r m; _
Role[j] = new stRole[Height];
4 T. F9 I, |2 M }
! w0 w7 U3 i' T- v" G' O
6 r5 Q' ~" W& x- E fseek ( fp_map, 28, SEEK_SET);
. R/ Y7 H! X7 n, U( q
9 ]' Q( e9 w; V- l, j3 T5 z
for (int y1 = 0; y1 < TH ; y1++)
4 \% R( s' d3 I. i
{
1 O4 a7 _% c$ |2 ` for (int x1 = 0; x1 < TW ; x1++)
- U5 K$ t' T. A' R) D
{
7 b* P" Y/ D+ Z/ i$ M
fseek ( fp_map, 20, SEEK_CUR);
$ O. o. i7 k: C7 V
for (int y2 = 0; y2 < ShortWidth ; y2++)
( e7 B% I7 v: _% l' I
{
+ M, ^+ `1 c9 l6 Q1 k
for (int x2 = 0; x2 < ShortWidth ; x2++)
" _7 p, v( h; ?% j) O# S, {
{
1 z) ^! v$ u7 z e6 s7 w fread ( &Temdata , 2, 1, fp_map);
2 ~# m" ~+ @; g4 s9 Z
Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
a, T8 n. y' x
# C6 H9 F9 y* D, L( u
fread ( &Temdata , 1, 1, fp_map);
9 J# E, x3 B6 D4 ]8 r Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
9 O) k8 P3 b) m: _$ e
! R( t/ D% N1 x R% \
fread ( &Temdata , 2, 1, fp_map);
% I) c% @, h, L+ R. R- r Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
" h( {: Q- W' k8 S; f4 J9 S, D
D2 l7 x& a& H! G fread ( &Temdata , 1, 1, fp_map);
! e) i/ D. \/ ~$ |4 S, T: u
Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
2 t7 Z6 G, j; x! z) M // 6
个字节
' i9 z3 W5 b" y2 f9 {1 ]" Z/ W! a1 S2 o
fread ( &Temdata , 1, 1, fp_map);
8 @6 @! e; c# ~ Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
+ g6 z" \2 h) [) @& K7 ?& p, H
" M% n* }' U0 @' A fread ( &Temdata , 1, 1, fp_map);
7 }- g, i( x7 e Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
# |3 a- z* v; C8 I7 ^& u1 { _
/ e$ f: r# |! E //fseek ( fp_map,3,SEEK_CUR);
! R4 m* l# W5 x* l) p/ ` fread ( &Temdata , 1, 1, fp_map);
9 R* | @$ e- z4 A
Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
$ O" c7 m$ A4 u& w
4 c. `2 ?; i( n* _9 I fread ( &Temdata , 2, 1, fp_map);
6 J! o: J' f' R
Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
/ `9 v# U9 { l. W
$ X0 K7 a, o+ ?
// 1
个字节
5 q# F" @% I- K( A9 x fread ( &Temdata , 1, 1, fp_map);
1 ]/ s7 w b" t2 W* W- s
Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
* c J. ]9 `& b/ M/ e; Z5 F9 O6 Q //if (ftell(fp_map) > FilZize) return 0;
) ]: m$ h+ [: k9 z8 p
}
1 V: I0 u1 t- E$ h/ |7 b0 R }
2 N6 M& g# \! X+ c }
1 H0 ?3 Z) O3 I: v; Y- R }
: s% m8 P# x; d
4 t* ^ H! e9 n6 E- s s+ { fclose(fp_map);
, ?. E5 D; j- i( ^: ~% H% ]" f- z: w- a% @
$ E+ \ c5 v* g3 q- P. M9 u0 i+ s return 1;
' T3 z1 i' l0 \}