*.map
文件是记载地图信息的文件。. n4 v' `- K$ k) t: l' u
, a1 k7 I, c! l 地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
4 P) u4 c% J0 o! X7 F- ~* E, S0 }: E% B# Q. V. S5 ^5 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 地表一层的序号
; h% y1 s ~. [. u3 q0 N9 h, T( M/ K( r2 H# K3 ]
03
在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号4 O; y" M6 q. r7 y
07
在地表二层 12 01 这个大序列下的子序列编号
( d/ ~- }6 E& l- B$ n; J86
物件层的大序列
/ ]' k$ D) k! u. F7 T$ H00
物件层的大序列下物件的子序列编号' {, N( z7 \ P7 t+ f) l: X7 l, Z6 p
03 03 00
目前不详
8 O7 @6 g; M( I3 J: Q7 Y01
行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
7 V& z w0 a- t0 u# i! Q9 B0 K+ U c" {
//************************************************************
0 C9 g& I. |2 n8 H9 Q9 }
//
加载地图基本数据函数;
: y/ n# n: C' W# i& @6 ]( Z( V//************************************************************
+ y( `2 U( E2 y9 `
( K6 e2 S- C" o) D$ \6 d+ c6 H" n//************************************************************
( z2 Q N5 H. T3 ^4 O+ k: @//
加载地图基本数据函数;+ ^6 [) U3 F$ R9 I
//************************************************************
( {8 L9 j0 B; k. M9 {$ s& `
$ J9 q6 K: I9 p: Y) a
int Cmap:

oaddata(char *filnam)
) q, y; s+ m0 x. K) R2 ], @3 Z
{
# h5 P- c {, b4 F( k7 K) x int Temdata;
1 l& y4 A8 E% Y# d' s& M
" `* s9 Q( ]/ B* G0 _, t if(filnam == "") return 0;
% C) E# p3 x) J: ?4 \+ k$ s
& ?* V+ } S: C# e" N5 o
fp_map = fopen(filnam,"rb");
/ V3 V' z% J6 N! l8 x3 H% K7 p3 h# ]
& G6 Q% J" W. Z5 t5 H if(fp_map == NULL) return 0;
% i; a3 |1 e* U% B# Z M
1 @& W- y' M. R( r
fseek ( fp_map, 16, SEEK_SET);
# A( f! _9 K; t6 `) @7 e4 j: I
fread ( &ShortWidth, 4, 1, fp_map);
; c' Q2 z8 E D fread ( &Width, 4, 1, fp_map);
n$ J- h- P+ j) a! ~ fread ( &Height, 4, 1, fp_map);
6 Y' y( v$ v, A
% w* f2 n" n9 \/ p; Z
int TW = Width / ShortWidth;
+ P# i/ k, n. E1 h# N int TH = Height / ShortWidth;
2 W7 ^8 y, X( Q V8 I
% e8 Y# b0 K/ Q1 _7 z for (int j = 0 ; j < Width ; j++)
: q4 g$ e8 Z0 }7 d3 c {
# Z- F {* O' ]9 w
_DELETE_ARRAY(Cell);
' g0 f% H5 Y- z; _ _DELETE_ARRAY(Role);
4 p. { {4 q) T. l4 G }
v& M% h& x6 y8 t& q8 C9 h' }5 ~
" R1 A4 W7 @7 x8 i1 @ Cell = new stCell*[Width];
, d- E. @2 |. q* Z" A5 R. B) d: a Role = new stRole*[Height];
' ?' r: U5 u0 [3 A9 h
for (j = 0 ; j < Width ; j++)
7 Q/ g }4 {' W4 @+ a
{
4 D5 g. Z9 Q' T7 d W2 Z
Cell[j] = new stCell[Height];
: d) D/ J) K1 a2 v W' ] Role[j] = new stRole[Height];
" u/ X$ L; B1 X2 p2 g
}
: N, k% H) P# v; }! }5 g
! r( k( U1 {$ Y fseek ( fp_map, 28, SEEK_SET);
/ ^; ], J1 [& z1 h8 F8 \1 z
& [0 C4 P4 ~* A8 x4 G7 | for (int y1 = 0; y1 < TH ; y1++)
4 S7 w) e) w( T# Q- @) g; H {
! n Y$ }9 g9 s$ e
for (int x1 = 0; x1 < TW ; x1++)
* T' g# P) A4 I: p1 m+ O( Z
{
# F3 k8 k/ C+ s( p
fseek ( fp_map, 20, SEEK_CUR);
: f6 q# `9 A+ b1 E ]- w9 a$ H7 ?6 L for (int y2 = 0; y2 < ShortWidth ; y2++)
' {; j* x% z" F {
; E4 r" S/ w! V" h8 p for (int x2 = 0; x2 < ShortWidth ; x2++)
$ l, P: W3 G! ?+ d9 a; X2 s/ `' Y1 L
{
: T" h3 y) _' K( T
fread ( &Temdata , 2, 1, fp_map);
$ R/ M' k/ a2 w
Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
& u, Q0 _6 U% e% B" d
- j5 r) Y& C+ {$ O5 B& L9 J& g fread ( &Temdata , 1, 1, fp_map);
. T' L) S; n7 B z# e Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
! |- d' U6 v7 z( x7 }+ g) W
) ^7 M# Q) k& h
fread ( &Temdata , 2, 1, fp_map);
9 G* h+ T% l F7 @, m2 Y Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
# f, v! n; i6 B: k
" H! o7 N+ t) P* U& c- o M fread ( &Temdata , 1, 1, fp_map);
* b% ~% H- i1 y
Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
( ^8 n5 L E+ j
// 6
个字节" N( j; w( g+ `3 S/ j$ A) L1 ]
4 ` B# P" d3 ]$ e7 G
fread ( &Temdata , 1, 1, fp_map);
. E7 M. {# {7 f: W! \* c0 e, T1 C6 [1 X
Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
- w" o: w3 Y8 u
: c2 [8 o9 C4 ?$ Q; @, t fread ( &Temdata , 1, 1, fp_map);
" z' a4 ~. |( y# k: r5 O Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
; `6 i$ z( t u& @& F0 R
: K4 T" J$ p/ t9 [
//fseek ( fp_map,3,SEEK_CUR);
+ q8 N7 V% \# S$ ] C9 o fread ( &Temdata , 1, 1, fp_map);
5 i/ K8 Q4 s- ~# B; w Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
# u% w) u. F: y' J T& M, h; L% A
6 C V& I `& w fread ( &Temdata , 2, 1, fp_map);
7 K4 g1 i7 Y2 m2 S1 v
Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
i3 a* [6 |! w! n4 X' J8 S# s' U5 C% d' k( e# `
// 1
个字节
! t3 \" x# c* ^1 E R fread ( &Temdata , 1, 1, fp_map);
e" A3 U) c; O7 J Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
7 E/ ?2 K2 H3 A! V/ M& c2 g //if (ftell(fp_map) > FilZize) return 0;
+ [7 m5 R8 h' v$ d3 ?
}
/ [$ }" G: T. f; h! R2 v
}
- u2 B5 ]* n) L! I9 V4 [0 R, r }
4 i' s) c+ C. a/ w, V7 V7 Q4 m }
5 H5 a' B" H* d! ~1 {/ M7 [
5 z1 {1 O; d7 E* V, K, K! X fclose(fp_map);
8 V! y' l- K3 \) L1 X) b: e8 @; L5 m& Y. j5 h1 A6 q
- n* m$ |" M; m8 s( u2 Z return 1;
) _0 c& P) I! w* P, |; F6 v}