*.map
文件是记载地图信息的文件。
6 f7 P5 A& a1 J, [; b+ \; g. F7 @
- ^! ^6 H- h3 \" R 地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。" E+ h. Q9 R- F7 z; A$ L
2 n- @7 O k$ e) z
第 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 地表一层的序号
- M3 F+ d- ]( H2 }' ?% W+ e/ m1 j# A/ [
03
在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号0 R- U" _& s/ {3 \& O" O& w
07
在地表二层 12 01 这个大序列下的子序列编号
6 n: H& q2 g" ?; f3 Z7 ~3 j, H86
物件层的大序列
, V/ j3 M8 r1 s' ?' K9 h00
物件层的大序列下物件的子序列编号
d2 I9 S/ j, _) J# E O( }5 f! x( J03 03 00
目前不详" \: b8 q+ N6 L" v' Y
01
行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。6 T, s2 ]5 A7 O o4 S; b4 F$ T
# l; {, z8 n' k( V D7 u% }//************************************************************
* k9 D& K, m. Q1 w- `
//
加载地图基本数据函数;
; j! y5 X) L5 @& E- X) ]//************************************************************
# M4 ~# Y7 K% }
9 `1 E, s- X. [6 p2 a//************************************************************
1 \% e: Q# M& _: N. {0 V//
加载地图基本数据函数;
1 X9 H+ {# Z# l ~: b K: i//************************************************************
; b- n( y, b9 @
?5 k* Z |7 y0 J$ ?4 q5 j: ]int Cmap:

oaddata(char *filnam)
/ A+ w" ^: L- P- S* x
{
# ~4 v y% J r6 L int Temdata;
8 J" u7 `+ A K: S! X! H9 ~% K6 c1 A! ?- R, ]1 p/ F; I6 G' o
if(filnam == "") return 0;
2 _ z& A2 w/ f
& c T9 R3 Z1 g8 j% m
fp_map = fopen(filnam,"rb");
& G6 t4 w. E- H0 L. F! o# ]- B$ b3 f* r- F& O2 a9 A" q
if(fp_map == NULL) return 0;
$ ^" q/ n8 D7 {2 Y$ w2 R' [; S2 F" m
/ t; _ Q4 V8 E fseek ( fp_map, 16, SEEK_SET);
! v2 g' O1 d( {/ p8 X# {- ?
fread ( &ShortWidth, 4, 1, fp_map);
6 `/ Q- p; E( L. ~
fread ( &Width, 4, 1, fp_map);
& V- V5 e/ b1 W7 o+ K fread ( &Height, 4, 1, fp_map);
[, ~2 c+ v' @% K7 b. z
$ v" Q$ e5 [" N/ y+ J0 u int TW = Width / ShortWidth;
, R0 X( L; C3 M int TH = Height / ShortWidth;
: _, G' M# { r4 ?# ~+ G% z8 n9 _9 P; X: K/ _
for (int j = 0 ; j < Width ; j++)
& d' A9 s- R' L* P$ @! n: G {
' @& Q& k3 L7 s! {' E
_DELETE_ARRAY(Cell);
5 j2 d3 {8 Q& \6 a
_DELETE_ARRAY(Role);
y- L1 a- ?3 \, X7 O }
# A9 k9 h: c; q1 h% v1 A3 K
2 T' ~4 [; h% I Cell = new stCell*[Width];
( S- n8 y3 b3 {* B
Role = new stRole*[Height];
' ^( k. V; W# Q, C, u# u
for (j = 0 ; j < Width ; j++)
& g, W( C) T* Q- d; L# o/ W {
: t5 a, k, {6 f
Cell[j] = new stCell[Height];
- Z. }% l( X7 M& t' O, u$ D Role[j] = new stRole[Height];
6 d8 H- w8 y8 m- y4 N1 B& G
}
+ l1 t+ r, G$ C( r, ~4 L8 z A5 E5 ~. k8 \7 r
fseek ( fp_map, 28, SEEK_SET);
! N% D1 U% T+ p N, r$ Q
7 N7 m+ J: J. }+ x9 [" i% p3 ~5 @% H
for (int y1 = 0; y1 < TH ; y1++)
% b. \) U/ A0 ?1 k
{
. N# @! a4 d5 |* l T5 @ for (int x1 = 0; x1 < TW ; x1++)
- o. x! B2 [0 G6 Y. i( a1 e" d6 M
{
* H! F/ G- z" ? G2 t) W, c, H( P5 K
fseek ( fp_map, 20, SEEK_CUR);
3 T9 r5 x0 E6 I" G for (int y2 = 0; y2 < ShortWidth ; y2++)
$ _& o0 B9 ^4 u
{
1 u/ ?% P$ h) L0 d# R4 c+ s5 C
for (int x2 = 0; x2 < ShortWidth ; x2++)
% {+ m4 F5 ?+ w: l: i1 D {
0 X9 y! S. \$ f fread ( &Temdata , 2, 1, fp_map);
8 _$ h8 ~+ l5 `! H0 | Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
+ P. v [3 b0 U5 O8 N0 n
+ U3 |+ |) [- h' b3 V fread ( &Temdata , 1, 1, fp_map);
7 c8 W' |2 O3 P
Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
* F; ^5 z, R2 X' s5 K
: T$ I" P- N+ }5 ~ fread ( &Temdata , 2, 1, fp_map);
" ?, ~& n9 Y/ e" T0 n/ g Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
' h' w3 t; `) U) |, n( c2 c$ E: X' \# ]' ^2 q V
fread ( &Temdata , 1, 1, fp_map);
7 I0 D( y6 @4 l/ z& f( F Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
. f' ? f& Z7 J0 k( T+ s/ _ // 6
个字节7 w! q( U$ e0 J0 g# p
* a3 }! s8 h+ {8 K% s
fread ( &Temdata , 1, 1, fp_map);
5 e' Y- g8 Z$ } N9 u z
Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
# i+ o, y' F# U
0 o2 I3 k. c- L& T- `; x7 Z fread ( &Temdata , 1, 1, fp_map);
! ^5 @& M8 m, f Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
$ u/ M# {6 e! ?
. t$ k6 I; n2 w. H% A //fseek ( fp_map,3,SEEK_CUR);
9 p8 F1 @4 e, B fread ( &Temdata , 1, 1, fp_map);
7 }* y9 L: X7 T; V$ T" u4 _ q Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
" v5 v1 E* [- K2 L6 A L
( {! m& C, @1 `0 m2 ~% | fread ( &Temdata , 2, 1, fp_map);
% P: W {. ^" @7 b8 `
Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
3 E0 f, Z0 E5 C% |- G' S0 {
v: A# [% r" w5 }0 i2 Q // 1
个字节! ^& V, I1 n' w# t
fread ( &Temdata , 1, 1, fp_map);
8 r+ V) Q$ n" a5 |, [4 X7 [ Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
. N! g. S6 g7 h. |
//if (ftell(fp_map) > FilZize) return 0;
5 ~9 O V- i6 B& c" F8 c }
) k6 c! l8 W2 Q* U) x6 ~2 ] [
}
2 Z# q V6 Z$ H
}
( I4 ^/ q* V7 C$ l
}
# O, Z8 U, a3 e
7 y4 X% y4 `4 ]0 `$ w" Z
fclose(fp_map);
( i& g/ }: Z- P/ R) m5 P4 ^6 P# e4 m" k, n7 D( _
& ]9 u9 |9 \2 n- @
return 1;
/ p* {! u2 B& v/ V1 u. u/ X}