*.map
文件是记载地图信息的文件。8 n/ v! Y+ A' b9 e* @% q; w* v
+ I. E2 D1 e! o; W- a$ S+ I
地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
6 n6 E: u! Z; ^; j
9 O/ R8 _) [5 Y+ U; E 第 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 地表一层的序号' f5 a% T% D% n. `
9 ]" e7 R p( t. E5 c4 d' |% U. ?9 i' k* ]
03
在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号3 g6 f) X5 \- b) E
07
在地表二层 12 01 这个大序列下的子序列编号1 y" `4 x0 e! X$ T5 t. |5 K" E
86
物件层的大序列( `- G8 T: s8 J; o/ z
00
物件层的大序列下物件的子序列编号. C# M* Z4 B, z/ l: G1 s# Q
03 03 00
目前不详, p& c" C, n: \4 f) _ E7 W: E( ?
01
行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
+ ^6 q3 Y; M+ q/ W. c+ P
1 t$ B. a" l& t6 l, c//************************************************************
5 Q- |( u9 q* t+ E/ G4 b4 X: g
//
加载地图基本数据函数;! Y- @# K( `% @1 Z C. C% \
//************************************************************
|1 l5 Q" M- L# K Q' N
2 K/ O0 i+ G. e5 n' \( D//************************************************************
3 j2 }( ~+ J# I4 k8 U//
加载地图基本数据函数;' v2 \0 l' G& d7 T4 N4 ^8 a
//************************************************************
& [0 Q7 L6 _0 s& }$ A6 M6 H
' p. L9 f" E: Z) }" D0 [4 f1 C& x& [
int Cmap:

oaddata(char *filnam)
. E+ n* \9 e7 A& E$ o{
) P0 |- A- L/ X, z# v
int Temdata;
$ }( J* a1 ~ n! E
1 ]# ^- J2 E- S7 S7 K5 z if(filnam == "") return 0;
$ |( x* l3 l; U, M! A
+ r! Q1 H. c( |: f9 S- x fp_map = fopen(filnam,"rb");
) u+ |& C+ B# [$ O- I ]
# N/ G' n) H/ l% s. B/ k if(fp_map == NULL) return 0;
8 N9 J3 F7 k* y4 C _4 v+ s% ]9 |; d4 [! Y8 X/ @
fseek ( fp_map, 16, SEEK_SET);
! e' r, J& ^6 y
fread ( &ShortWidth, 4, 1, fp_map);
8 Z# v/ L5 p' E& R/ @( d fread ( &Width, 4, 1, fp_map);
2 Z- Q# |9 m( l; W) B2 c
fread ( &Height, 4, 1, fp_map);
! p' o# ]9 p4 \1 k3 w
8 e V: c& U5 }" I% i# i* X int TW = Width / ShortWidth;
) }# R9 ^! \8 t. t) i
int TH = Height / ShortWidth;
% Q4 Z: O, e# q. q- A
1 ?0 y, _8 S9 S1 e% g0 X$ ? for (int j = 0 ; j < Width ; j++)
& O1 L9 R& `* P2 H& P {
" p. ^( r' U0 j/ G: r& t, s _DELETE_ARRAY(Cell);
" @1 D( f2 f6 o
_DELETE_ARRAY(Role);
3 s* Q9 V! B4 |9 U+ O }
! `& j3 w9 P7 J/ {. b
8 ^' ^4 b+ ~" q1 `. j0 T% f, b7 U
Cell = new stCell*[Width];
, e1 l' K& @9 u
Role = new stRole*[Height];
4 y4 n1 M" v, c. z% G* C for (j = 0 ; j < Width ; j++)
4 ?8 }) f% Q" F {
5 q+ e; Q p: O* k) @9 {! X
Cell[j] = new stCell[Height];
7 X( C. n+ z6 {5 ~- o. J$ X Role[j] = new stRole[Height];
1 a1 L) i4 h9 f+ Q B
}
6 ~7 G+ N# i u+ F* e: M: I, `) T% x2 N: }( {$ j
fseek ( fp_map, 28, SEEK_SET);
" U/ |! F- j) @5 M6 Y
6 h. v2 D/ ^/ Q9 o
for (int y1 = 0; y1 < TH ; y1++)
( ]! f n0 B; p: ^( T5 {2 K
{
( z4 L- s, L% Z- B- c' q; L for (int x1 = 0; x1 < TW ; x1++)
( |; p3 T% B& N' o" k {
6 m. h: Q7 [3 ~0 F6 ~ fseek ( fp_map, 20, SEEK_CUR);
* h+ i9 J9 U# q( B* n/ N# O
for (int y2 = 0; y2 < ShortWidth ; y2++)
0 ~6 }& A4 ^+ x8 K! `: T; e {
3 D, O* c+ v4 v6 ^7 g% x
for (int x2 = 0; x2 < ShortWidth ; x2++)
5 f" u4 M* O3 C% ^! r
{
$ y/ N0 S8 E2 k! P" B k( s3 G
fread ( &Temdata , 2, 1, fp_map);
7 f8 `$ g$ p" b) _# E0 n
Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
' g9 M6 G) m0 K, Y8 R4 a R2 M+ r+ ~" t
. d) x: W/ Y+ \3 G4 @1 ?5 }7 E& [ fread ( &Temdata , 1, 1, fp_map);
) C5 y: R9 M4 ^6 F n/ [ Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
* K: m% ]! m% k* M8 D
7 e! X8 r& A1 d$ A, J8 H& | fread ( &Temdata , 2, 1, fp_map);
% X5 |& k: O1 c: u& y: }4 w% s. ] Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
* M+ a+ p* Y/ F+ X0 Z
8 B4 K- c. W3 N' ?; f! X( z9 b fread ( &Temdata , 1, 1, fp_map);
7 G1 i. N' L6 r! o- k, }
Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
8 r# U: M+ K( w: g& y // 6
个字节
! I+ l( ~( |) f3 P. y
' P4 ~$ j1 U. ]1 h. u6 s fread ( &Temdata , 1, 1, fp_map);
0 U/ F1 V: H0 F
Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
# T6 t! U5 f6 A5 O5 t
x9 F( a: O, _5 Y fread ( &Temdata , 1, 1, fp_map);
; G+ _7 I+ h7 g, h& s0 y; \ Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
. L1 D9 }7 a4 M* Q' y
. v C1 M1 U' o6 X, h# s: E( M: E# ^ //fseek ( fp_map,3,SEEK_CUR);
, L: A. E) _3 K0 g) g fread ( &Temdata , 1, 1, fp_map);
/ e d; r' z& o8 |& F" n Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
+ h; [4 ?: G' |2 W% i
# Y' ?) v/ `4 G
fread ( &Temdata , 2, 1, fp_map);
. M3 _$ d! W! d7 |/ {$ b7 H! J Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
# j1 _ C8 i* Y& E" M' l
. ~8 i8 R( Y H L" M // 1
个字节1 d A3 o- w& `0 Q; S
fread ( &Temdata , 1, 1, fp_map);
1 E. U( [) H D) J. Q5 v: p Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
7 x8 ^1 K) m% K* l% c4 E //if (ftell(fp_map) > FilZize) return 0;
7 t( ~' Q2 Z6 N }
! ~, f) H# C" k% g* v! P }
& T$ Q# {9 @% l& v
}
: K, f8 d3 S9 }2 V1 h
}
9 M1 n2 r/ o/ [9 `9 Z: I/ m0 J( J' Y, \" g' ?4 k F& F
fclose(fp_map);
v5 y5 V5 ^! @" e$ f
$ B4 u. Z: U8 O- _- G
% ^$ x& {( z6 N2 f* @' e6 X# j return 1;
0 z1 P1 t& i" b5 `
}