*.map
文件是记载地图信息的文件。
/ q! p- A7 S2 G; v9 I7 _' B) D6 a9 I/ C8 O3 A6 t2 O. J0 o
地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
% x: L. U8 W/ `3 F* A$ c9 W9 }
第 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 地表一层的序号6 L' [; ^& E* i( E3 ^
3 `: L4 z# a6 S
03
在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
2 n, _, B9 |( }+ `: \. M07
在地表二层 12 01 这个大序列下的子序列编号
: H J/ n' ~; A$ T& J( F86
物件层的大序列
* I: z; {# d w/ f/ a5 r00
物件层的大序列下物件的子序列编号
9 N3 X, v8 y# j& N6 ?03 03 00
目前不详6 {$ {; Q x* i1 W- o) V( T! Y
01
行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。, I3 C1 K* \1 C! r }
) T0 {# ~2 k4 ^; U8 @4 G//************************************************************
+ M% V2 v8 e8 w( T//
加载地图基本数据函数;
- [* H+ Q3 e4 B. M; z1 Z//************************************************************
4 \, {. h* y; c$ ^4 y9 h( w4 f& i5 U$ Z
//************************************************************
7 `, |# }. }1 r) X9 Y
//
加载地图基本数据函数;) v" t7 {8 ~( N0 h# v/ E
//************************************************************
! c& t6 V6 r) a. ~$ U( z
' Z8 N/ \1 u- \1 T' V' f0 a
int Cmap:

oaddata(char *filnam)
8 z6 A/ y: k8 _$ F/ W% |% b
{
' H9 J9 \$ f8 g/ R2 n' A int Temdata;
4 L$ e+ z, z8 B7 t$ V1 ~
8 O; R1 D( I0 b% v
if(filnam == "") return 0;
( }1 g5 r5 u! N$ ?
' U7 o' u8 \! }/ l F/ @" Z fp_map = fopen(filnam,"rb");
; M# N7 H3 B0 j, c! ]% T2 Q. A3 Z8 B) F) {: r9 s; \: z' F
if(fp_map == NULL) return 0;
* T+ y- S: W6 ~1 _2 E5 _' X
# K0 ` I) Y! k9 Q* k) _3 }( f
fseek ( fp_map, 16, SEEK_SET);
& Z9 Z) {2 y: b7 c' `( D6 o5 i; n
fread ( &ShortWidth, 4, 1, fp_map);
! k8 h: A* M1 o0 E- F
fread ( &Width, 4, 1, fp_map);
3 X7 o6 F+ ?$ \8 M
fread ( &Height, 4, 1, fp_map);
# s7 o6 a! l0 p; v
* e/ F$ o: L2 m0 h$ m int TW = Width / ShortWidth;
/ j8 N9 U) Q3 ` r! S4 q1 i. n int TH = Height / ShortWidth;
G; u" R: r% J" ?
: P0 y2 m b8 ]; e7 f( W
for (int j = 0 ; j < Width ; j++)
$ j) ~, u0 e( Y {
; v0 {" H" W" t# ~- a/ p
_DELETE_ARRAY(Cell);
; \- L$ b8 d3 B5 j. v
_DELETE_ARRAY(Role);
% a( c0 Z# f& d; U& p t6 d
}
* _1 q: m! t0 Z: c, \, G
0 v+ p8 v0 S7 R Cell = new stCell*[Width];
1 X& `6 C2 B4 k; ]. x Role = new stRole*[Height];
+ J1 y* M1 g/ e4 M4 M* V% U for (j = 0 ; j < Width ; j++)
/ ~8 N- {/ ~- k {
! B" G2 k' f% s! K Cell[j] = new stCell[Height];
1 Q, x2 [2 E' a& ?0 h4 x Role[j] = new stRole[Height];
$ {& S- f* w, `- Y! t }
. t9 V# `. Q, @& f, I) ^ W
7 t6 N- w) E0 H* L3 Y( S fseek ( fp_map, 28, SEEK_SET);
; E/ V9 h/ ~' X( B) F2 @: ^: b6 E8 ~# M
for (int y1 = 0; y1 < TH ; y1++)
) G7 [& I7 x4 [6 M
{
, Y. x( E6 r8 N
for (int x1 = 0; x1 < TW ; x1++)
$ b x" w* ~* o; ]) }% g {
, k# r1 _, a5 d7 V# a/ p fseek ( fp_map, 20, SEEK_CUR);
9 }- D1 S% D" ~! G& v. y8 x3 L
for (int y2 = 0; y2 < ShortWidth ; y2++)
) W: M# ?7 q% [
{
% P9 G4 E8 s' N) F# O
for (int x2 = 0; x2 < ShortWidth ; x2++)
5 S: h* C$ S3 G/ R {
4 A: @' U- k8 r4 S3 f# x
fread ( &Temdata , 2, 1, fp_map);
' r; b. y" R& I; R! p Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
- F, B ~' u7 s3 r" K6 o3 m0 B! c$ l+ }
fread ( &Temdata , 1, 1, fp_map);
* Q, \# R$ e) l& `/ |; ^& c! B# b5 d7 x! @ Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
! }$ S9 F* F7 L) H" B* b# i
. a& R* f- }& O/ C
fread ( &Temdata , 2, 1, fp_map);
" Q- ~6 I, p3 q6 w1 |- I) ]
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
/ \7 k0 }6 o! Q3 I& o; r8 L `
0 R( u- ?1 O( g3 N1 C7 m fread ( &Temdata , 1, 1, fp_map);
3 E7 }; {+ {0 h/ M2 M
Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
6 d- x! S, P; n/ f% R2 ^! a: m
// 6
个字节
+ H1 t0 J5 M- `" B+ q9 a5 }1 C" S1 A% j7 S. @- p1 D- [% i1 u( W
fread ( &Temdata , 1, 1, fp_map);
$ v9 A# s& B# S- k9 ? Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
: F( ^9 R0 M7 g$ i! q2 j g
3 J6 b+ r2 k& d5 R% k fread ( &Temdata , 1, 1, fp_map);
; Y/ t/ U* e/ C4 R0 K Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
- l$ A5 W# H' x/ h9 Y- O% p6 o5 ^6 `- b4 F
//fseek ( fp_map,3,SEEK_CUR);
" j P2 W1 N+ c3 z& Y+ b, | fread ( &Temdata , 1, 1, fp_map);
^! I* v2 L* W- d) c, ~ Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
' o3 X$ F" b1 l. Z4 n0 m6 ]
) C. C& a& o p+ i/ X8 U fread ( &Temdata , 2, 1, fp_map);
: \: J# q4 P7 \7 } Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
; {) ?/ |; R% U" T2 m: X' g0 }
: d8 A/ @1 \9 j8 B K // 1
个字节' _/ x5 Z/ C i+ G2 G
fread ( &Temdata , 1, 1, fp_map);
% h. C. ]/ a, w Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
$ a& V& T5 \! s5 x //if (ftell(fp_map) > FilZize) return 0;
?/ ~+ E! l, y! O& c) E
}
2 S3 }' X. p& N) {1 N5 D+ ?& } }
a0 ?4 _' d. v+ `
}
! D" l: w* ^' s5 h8 [ }
( }, j3 ]) f7 T6 W
9 N; E5 Y. j7 |" D1 @5 L8 J fclose(fp_map);
- D, _) N( v$ ~2 T7 l) e/ e' K7 x/ H& a
% }9 c5 Y3 Z/ q' O" F0 Q" Q/ z
return 1;
8 j& T2 @0 ~; X) t k5 c
}