*.map
文件是记载地图信息的文件。
d7 A3 W- a. C, k. S) f# c6 e; S7 K
地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。) M- U3 _* n5 e" z1 s" E2 s
- N" R. [" b$ S/ 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 地表一层的序号
2 M+ |/ A* q' m2 N8 M3 w" }& L" z7 g6 I9 z5 N
03
在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
) t1 J4 S" k* W* M) ]07
在地表二层 12 01 这个大序列下的子序列编号3 S1 @, Z: A' T# x
86
物件层的大序列
/ M. M+ P: p$ S* [( Q00
物件层的大序列下物件的子序列编号( ]% L1 K1 G' }3 R3 U' I3 d
03 03 00
目前不详
! G; p& @* ]1 S8 I* V01
行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。) i4 R* |) B l. i- a4 x8 C, B
' m' ]$ |7 M' g" B; B3 P
//************************************************************
6 j) Y' l- o9 W+ W: \
//
加载地图基本数据函数;
+ L, R& z o0 F+ C1 @//************************************************************
- h2 N8 t$ R: w# W4 _1 Z
9 s D" V6 l- p4 M1 g* ?//************************************************************
; j4 S" @/ K# a& R7 }//
加载地图基本数据函数;6 i" u2 S% Q( T4 Q5 e9 p
//************************************************************
* t9 Z0 u: `6 K2 k- N3 S
4 {: ^! ?9 a# E* G1 i# ~" ~4 y
int Cmap:

oaddata(char *filnam)
1 Y: @) Z. |* F9 B9 J. ]{
4 A+ |+ Z v: X% N: w int Temdata;
; X2 `9 M) \5 E$ v( ~3 M8 n' b. G7 F0 I9 [5 I
if(filnam == "") return 0;
/ O1 h+ @ L# i- A% D" P- p8 R8 n$ c7 S. j2 f2 E5 N
fp_map = fopen(filnam,"rb");
( f$ t9 }% _' T6 ]$ g
3 e! c8 u! O: ]" f$ D+ K# Z3 K if(fp_map == NULL) return 0;
8 n- _- l7 H+ k, d% s
+ _. M- n5 W: c; u- j, ]% c fseek ( fp_map, 16, SEEK_SET);
" J. F T! W8 }. i fread ( &ShortWidth, 4, 1, fp_map);
) H; A. h* s9 `
fread ( &Width, 4, 1, fp_map);
4 @6 @5 l/ A& `. `+ I
fread ( &Height, 4, 1, fp_map);
+ R/ }$ G. B) y) p4 E4 I+ r
: Z1 H Q; R0 ~
int TW = Width / ShortWidth;
2 a$ v5 g" D; }$ e }, W* C int TH = Height / ShortWidth;
; E7 G4 L; W/ H0 G" u9 M7 w5 s$ [: u, N) h9 u, x; l( h
for (int j = 0 ; j < Width ; j++)
+ A# E5 [9 ?/ o, `
{
" h2 ]" W' G" B: Y
_DELETE_ARRAY(Cell);
4 i; ] S8 G* a, S, u p
_DELETE_ARRAY(Role);
' r7 a) T! ^! c1 o
}
( \* ?$ z' V8 l, ]: p5 R
2 c! f+ Z" a- P$ g6 V3 | Cell = new stCell*[Width];
! Q5 o3 ^* g) p8 ~
Role = new stRole*[Height];
0 A! I- W2 T/ S* e
for (j = 0 ; j < Width ; j++)
6 M) U5 v2 n3 s) `0 g {
& L: p6 l8 ?0 }$ Z) Q8 {7 u: M) ^
Cell[j] = new stCell[Height];
6 }$ Z7 o, b l
Role[j] = new stRole[Height];
) o. ~! Z5 P Q7 m8 @ }
3 M% v/ s: E9 u8 C/ h4 R' H$ a9 d* u6 ^9 ^- l
fseek ( fp_map, 28, SEEK_SET);
0 h8 G- ^' ^/ z
3 G- S' m+ j# F+ D' y for (int y1 = 0; y1 < TH ; y1++)
/ b# w& Z* f( Z( }7 U' U
{
+ s$ y# r' K0 c$ i
for (int x1 = 0; x1 < TW ; x1++)
4 d' h \( F4 O" F {
$ X2 x$ z: `& s/ ? fseek ( fp_map, 20, SEEK_CUR);
9 W! H7 O' @3 W4 g/ u0 R' c
for (int y2 = 0; y2 < ShortWidth ; y2++)
! }; W4 s. Q! y' T& W
{
. b2 z- W7 a8 t5 P/ F+ h2 D for (int x2 = 0; x2 < ShortWidth ; x2++)
' s" w4 b! g0 k# D( ]' {
{
6 E6 E5 O+ i8 r, O8 o$ G
fread ( &Temdata , 2, 1, fp_map);
6 N" s5 F. N* v: c) `
Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
$ J( o9 |$ ] H5 ^
# g/ a1 `! Z. x; @) \9 A( m
fread ( &Temdata , 1, 1, fp_map);
0 w* a4 o" E$ i ?3 X" u$ N. l3 E Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
* y X: R2 {: e0 S
9 I/ U4 X$ w/ n$ |) d fread ( &Temdata , 2, 1, fp_map);
+ r) @% s) {1 I# y- k Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
3 f0 Q7 E2 Y- |' }, O
% z; n" ~! K: o6 M; t, j$ Z! m
fread ( &Temdata , 1, 1, fp_map);
/ r( P. D1 J! Y9 E Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
) b7 q; a6 g. _
// 6
个字节
; f5 X8 g: _# |* Z3 I
( U+ V, J B# M2 | fread ( &Temdata , 1, 1, fp_map);
) z$ [' U! u4 W9 g/ D9 F ?" M; U
Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
0 b$ l) ~" i% d
' e$ r" r0 A1 }; D" s4 h6 _; e
fread ( &Temdata , 1, 1, fp_map);
+ X# j+ O9 u% t k# S Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
! t, B n! K/ `8 }
( X9 @7 h% K$ J0 O2 y4 b9 Q //fseek ( fp_map,3,SEEK_CUR);
0 m( |, @% {6 z K& s3 u1 a7 u
fread ( &Temdata , 1, 1, fp_map);
0 P9 D, |$ K2 E/ W5 @* O \
Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
! c, v6 {5 V, ~! d- m
; J; {+ g0 Z: z fread ( &Temdata , 2, 1, fp_map);
* G8 B) s4 S9 Z# c/ i3 U4 J% Z5 G
Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
; e7 F8 p9 ?, n. N( u& t/ z
/ K, e% o( p: q8 a" p) x! W2 `9 r // 1
个字节$ B4 C# N$ w, @
fread ( &Temdata , 1, 1, fp_map);
. o" S2 S/ D, Z* w/ T% y( C
Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
2 o L# M+ C8 e9 h P8 K. l5 h
//if (ftell(fp_map) > FilZize) return 0;
; J' t1 p, Q$ H6 z
}
" e+ E6 D( G1 ? v" Z }
- }) Z W$ C5 c }
" V4 ~7 w$ D$ X
}
; C# _, ~, ?. E J$ S5 w( b
T% D2 q0 g& e1 \6 p% g: ~
fclose(fp_map);
7 k! Z0 v# O$ h0 Y \# c
5 b0 u9 n9 d- B; L7 O! \; n6 ?9 _5 T5 J% Y
return 1;
/ p3 g5 ~; O& `1 t: F" l9 R+ e
}