*.map
文件是记载地图信息的文件。
- V$ E3 I6 A' b+ G9 l) X$ h5 \7 V* n8 G+ r" J% P/ n
地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。; R# B- p: B p2 ~6 W
. u: F9 p7 W. k5 K& | 第 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 地表一层的序号
: U; H4 G L1 ]9 s5 B5 K7 N/ y) q+ `2 @( r: w3 f
03
在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
0 n; h& n8 ^8 V* o07
在地表二层 12 01 这个大序列下的子序列编号) S: t1 R# T1 |+ P `# `5 G/ J
86
物件层的大序列
- E3 T. _2 U" w5 ~3 D9 G8 q00
物件层的大序列下物件的子序列编号8 @5 L8 t; V, ]' c) M
03 03 00
目前不详$ f% g! N; @2 T; s- J
01
行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
" N! Q2 [" W# Z9 B# a# \* A% e( o! r ?8 n: ?5 h
//************************************************************
k0 l9 D" _0 ]0 F/ l$ q9 O
//
加载地图基本数据函数;( B( L& f* z$ T$ c: w
//************************************************************
4 E8 ~! K) |4 k, ?
8 Y# P( q B' e& E8 |6 o
//************************************************************
; N7 X- h: J) z9 X5 `+ x//
加载地图基本数据函数;8 W$ T) n9 }5 Z# n# o- X8 U/ Q
//************************************************************
% W0 w1 {4 _1 R4 w/ z% B
. m3 o7 f4 _" D& [6 X6 ~( b! n+ M& eint Cmap:

oaddata(char *filnam)
0 h" w& Z- Q6 J0 J{
7 j- L. c# A* c/ i. D! W, a1 P) A
int Temdata;
+ k- n8 r# Z! B* u
! [. M# v$ T6 |0 W8 Z; Y3 j if(filnam == "") return 0;
4 z0 j2 m0 K0 @; N' {# I; `7 }, v/ |: q- k/ v( v
fp_map = fopen(filnam,"rb");
' B# h4 L+ i: R, m0 N' s' |& c% {, f3 j; H6 z& P
if(fp_map == NULL) return 0;
7 O( Y" z4 p9 f2 E* d" F# I
# n X' w1 S5 X
fseek ( fp_map, 16, SEEK_SET);
6 P2 w6 y$ ]6 V! D6 Q+ p
fread ( &ShortWidth, 4, 1, fp_map);
, o" X6 n: o B
fread ( &Width, 4, 1, fp_map);
5 b$ r9 q% F' U& i% c% P5 R
fread ( &Height, 4, 1, fp_map);
$ [. Q7 m- f& B/ @0 j
. U6 z6 P* z. s( A* y! a/ A. i! Y int TW = Width / ShortWidth;
0 h4 I. @: T) I3 ^" } int TH = Height / ShortWidth;
' t3 h) _4 w+ @1 U& _
' [& U+ J) } u6 p ? for (int j = 0 ; j < Width ; j++)
( {6 ]7 r# \5 K2 I& h& a M8 u {
- v' |* q0 v1 K* `, i; L _DELETE_ARRAY(Cell);
6 l6 ^, C/ S+ k+ N/ X
_DELETE_ARRAY(Role);
6 F( ~0 J2 I7 i$ _ }
1 B( I* N) P q, V: I" P/ u8 M3 L1 Z3 e6 B
Cell = new stCell*[Width];
0 k/ X* j G# }1 Z6 q
Role = new stRole*[Height];
$ M0 c$ M# l |# l `
for (j = 0 ; j < Width ; j++)
7 ]. C( Y0 H! l" z5 c" z* a( B
{
6 Y! w% t2 v, _6 _$ L/ `5 d Cell[j] = new stCell[Height];
0 o6 g8 l- F# c+ x6 U Role[j] = new stRole[Height];
: h6 [& e: z, s- {( O' X
}
9 ^, f% J& s; e5 O5 a0 n7 p! _2 b
. B h6 _! E! H- x( B3 f' I5 P fseek ( fp_map, 28, SEEK_SET);
* s1 {6 o% |2 d# N
6 E' ?$ s: ~+ E0 e' W. i v
for (int y1 = 0; y1 < TH ; y1++)
; p7 b3 J* ~ ~" Z" b c: l% \
{
+ z4 v. I7 d V for (int x1 = 0; x1 < TW ; x1++)
: C! U$ L8 E. E' ]9 ^# b/ y# c {
& W: }# i, D( O3 p$ ~- g2 ~
fseek ( fp_map, 20, SEEK_CUR);
5 C+ q. c( C- L2 [; }$ f' ~ for (int y2 = 0; y2 < ShortWidth ; y2++)
% E! S% Z/ S- z- r, `4 h9 I4 n( r- p {
" n6 e4 G4 a: ~' [ for (int x2 = 0; x2 < ShortWidth ; x2++)
( b) g$ ?; h+ ^. q7 m' {- k
{
: O/ f- \, D( u fread ( &Temdata , 2, 1, fp_map);
; {2 H2 |: N5 ~# C9 j Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
6 C9 z S/ b( F; E9 {9 Q1 l7 n$ k
: Q" I' @8 U( |% A6 K
fread ( &Temdata , 1, 1, fp_map);
8 _+ R" T T/ Z4 I! L3 J, Y Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
. N7 P" _) `% z7 H' u3 C" l* F, V8 e. F1 O
fread ( &Temdata , 2, 1, fp_map);
" f/ v. y( L' `" C: b% g
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
# b% t" L4 t1 o0 j1 S& `* ^3 O' ] Q# a* L/ N( \$ p
fread ( &Temdata , 1, 1, fp_map);
2 U' ]& D$ X: I" c: N7 V8 | Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
7 p$ e" z/ C$ d( v
// 6
个字节
3 B. m0 l9 \" K3 @% ^+ Q+ @9 x/ t# z/ ~% H8 Z
fread ( &Temdata , 1, 1, fp_map);
- D" L( Z, r8 F! t Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
5 K+ ?% g$ U" r
( A) \; n7 J4 w/ J3 x z fread ( &Temdata , 1, 1, fp_map);
# E1 _9 p' {4 e1 I$ Z. [ Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
; [& g' g2 K: {) R: G
V; Y) D; |- \9 R2 S% @ //fseek ( fp_map,3,SEEK_CUR);
! `5 b; l* B9 f7 Q0 s9 _& d0 d fread ( &Temdata , 1, 1, fp_map);
3 u; H# p* d) G9 o& S* G
Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
0 v; C9 t& @- U5 L
9 i* x! ]1 F" b6 ?" t# v2 b
fread ( &Temdata , 2, 1, fp_map);
( ?1 g7 X, p- t0 Q Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
7 F H* g6 z* C( [
/ \1 C ^2 W: m# x1 X0 t
// 1
个字节* K: z" u- t7 S/ G/ Z/ ^' o
fread ( &Temdata , 1, 1, fp_map);
; `3 D! w2 I. d8 j- x Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
& `1 V, S3 A/ j) g
//if (ftell(fp_map) > FilZize) return 0;
: H3 {' B4 E- h" x+ @ }
7 D# V" n8 k# K/ {% O
}
9 e x4 M, G( w+ a- { }
. C$ q4 T, D/ }4 z& N* }2 V0 B
}
$ M4 N8 O" T* r* i
+ ?* w* N7 `0 H# s" ?4 g* c fclose(fp_map);
" K- n: _; @; d9 Z1 E; Q# ?2 l# |6 s6 m# A# J" u, ~
?9 y- [( M- J
return 1;
: t. [' W( N7 h/ |4 K4 W8 b" O
}