*.map
文件是记载地图信息的文件。7 P! m1 }- _6 C4 r
- h. i, q9 \2 _7 E) p. W 地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。2 [- N: J3 u' P* ~9 ?# r
1 L' }6 q+ f* F0 s7 v
第 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 地表一层的序号: y4 ~& ?: E: Q4 p7 c5 N
8 D3 _5 ~' c7 M03
在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
- O8 ~ H! ~! g% b3 a9 @8 S, r4 m7 W07
在地表二层 12 01 这个大序列下的子序列编号
6 a4 T3 w. G! e& B& X ?6 ]1 ?" U86
物件层的大序列
2 T( V4 U) G& U( ~5 p2 P6 B4 m00
物件层的大序列下物件的子序列编号8 ?" h) x. G. ~0 w
03 03 00
目前不详! f3 V+ Q6 \0 I3 p% x6 }6 s% }
01
行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
d% n) f- s# i6 T+ ~/ H. d
2 h* V; }: G) b8 K//************************************************************
) N, e; I: J% @2 r2 K# d. f' x//
加载地图基本数据函数;: m) c- s0 C, e
//************************************************************
, O% @* u _/ R- L, _( [2 g: e# k
) ]0 `5 ]% D. F8 d2 _
//************************************************************
* E2 n7 I4 ], `. h: r//
加载地图基本数据函数;" L8 }- s: S, @; `; D, ~
//************************************************************
6 w5 p* m7 ~" B( z
" s6 b0 u* s0 W8 J4 E* O1 ^) @( f
int Cmap:
oaddata(char *filnam)
8 l% H4 u' e5 o+ [. @1 X. K
{
4 x5 N" T6 c$ u+ p* o
int Temdata;
+ N% C9 O4 W+ r
( u, j+ L7 e- U: t+ F0 S3 C if(filnam == "") return 0;
% M3 U0 |, |0 f
6 x: A7 ?# C, _! H# E- t1 U# d fp_map = fopen(filnam,"rb");
i6 K7 x i5 S
- J+ n' n4 j* q/ s
if(fp_map == NULL) return 0;
! g9 U* j, h: R; t% R% i8 C# b9 A; k
fseek ( fp_map, 16, SEEK_SET);
% \7 ]9 A9 I* ]3 i3 O( A fread ( &ShortWidth, 4, 1, fp_map);
" ?( [3 k/ V9 H0 W5 X2 F$ d
fread ( &Width, 4, 1, fp_map);
7 q+ Y8 Q1 a/ x% e5 n
fread ( &Height, 4, 1, fp_map);
) ^3 ~& d+ r' V5 V4 N* f
7 p4 F& p3 s1 _ int TW = Width / ShortWidth;
% G8 q9 k: }2 u" k' {& S
int TH = Height / ShortWidth;
' e# }8 T9 P- Z$ F1 c; a
" }0 R' W2 m; ]! g' R' ^* r6 s2 N for (int j = 0 ; j < Width ; j++)
% g* N1 `' E+ [5 [/ `
{
9 x" t2 E- e$ W7 V l1 h6 w" j h
_DELETE_ARRAY(Cell);
0 u8 K$ `5 |: a+ @' }& ?" Z
_DELETE_ARRAY(Role);
: M; c# X& [6 }( `( |3 x' m) z }
0 K/ I! @7 |; g8 F0 y* |
# ]2 @* p9 T6 ?2 H5 N6 w Cell = new stCell*[Width];
6 W% ?+ U$ q. ]2 D/ n
Role = new stRole*[Height];
9 |! D! p- ?) k$ [* c% [
for (j = 0 ; j < Width ; j++)
) | @' H# ~% ]. W4 @0 M( k {
0 T. _4 @* T) x Cell[j] = new stCell[Height];
/ u4 H3 x& y9 ? S+ F
Role[j] = new stRole[Height];
: o& {% @. O: J }
5 K8 T, v3 S3 Q2 G8 m, I, u9 }3 l
8 J. _" l3 ]& _8 ^% h! m- \9 M
fseek ( fp_map, 28, SEEK_SET);
7 K7 r& \( [; F+ c2 {6 [, V, t7 _# n9 }7 E: X; C! J# z
for (int y1 = 0; y1 < TH ; y1++)
) Y9 T" y. \9 ~" A' a- s: h
{
5 `0 ]6 P, u* n& i
for (int x1 = 0; x1 < TW ; x1++)
+ L- O- r6 T1 B {
$ {* e2 j7 J: h fseek ( fp_map, 20, SEEK_CUR);
n' z. K! o# ~' i. k% }
for (int y2 = 0; y2 < ShortWidth ; y2++)
: E: p: `& h# g {
0 d. Q1 v! g+ t! J
for (int x2 = 0; x2 < ShortWidth ; x2++)
" |6 T6 y# A0 `9 E {
0 t( \$ l2 u2 H4 y+ G5 M+ `* J
fread ( &Temdata , 2, 1, fp_map);
( t) Z4 k% f9 T9 I. O3 E& v Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
% E2 L% |+ R$ s9 s
1 w2 _, l' i+ m fread ( &Temdata , 1, 1, fp_map);
% ^7 p) o: h+ s, `# w. C) k; |$ j+ s Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
; I( `% i( s- t
' X% s- X" j+ `% E+ S; D fread ( &Temdata , 2, 1, fp_map);
% D% a/ j5 q7 O& R7 w; h) }# w6 p. @
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
0 e2 T; D9 V1 B, X
$ g; j2 p% w, J$ c fread ( &Temdata , 1, 1, fp_map);
* c8 |4 l Z9 O8 l9 }
Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
. e+ o5 T; N" i" ?1 f
// 6
个字节6 g* n t# E3 ]
, X. Z4 b% N4 w4 ~ fread ( &Temdata , 1, 1, fp_map);
3 y8 g; L* c7 o5 n Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
' o, j' F( k& a0 T
9 u: A8 g- [" I- `: }
fread ( &Temdata , 1, 1, fp_map);
! D" c+ B2 B( W+ P- w
Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
& D, N2 R; _1 J- W/ t
$ C8 r( }$ s( q //fseek ( fp_map,3,SEEK_CUR);
6 v7 A, r5 K/ k8 H) ?- Q0 ? fread ( &Temdata , 1, 1, fp_map);
" M. C8 P- Q+ }$ f- f' ^ Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
: X4 M @; C. p * I; z( i' W8 G) w8 y3 Z. Z9 _
fread ( &Temdata , 2, 1, fp_map);
( s1 a1 Q% a5 c
Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
' U8 @ Y/ G# C8 T* K! z! H. b0 _+ E! _1 D3 r
// 1
个字节: J& v$ v j1 M$ T6 C, I1 E% ~5 C
fread ( &Temdata , 1, 1, fp_map);
* ~# V6 D7 |0 Y: M Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
$ ~2 X9 W) n" x; q b //if (ftell(fp_map) > FilZize) return 0;
0 @7 C2 y$ T4 b0 l# W" f# a }
0 {1 d9 m8 H* E. [ }
) y1 x; r# V) x' S
}
: |& V" n4 n6 g8 \ Q }
$ Q( `# u. n% r0 e: l: R/ h' w$ l5 Q. l6 t. p
fclose(fp_map);
( w0 u0 k9 K/ J! y3 l
# }/ S X; N: A, b: x
5 y- y; y. c( d9 }1 `; z return 1;
5 }' Y7 z1 k7 k b+ B* ^$ ` x
}