三千论坛
标题:
千年 *.map文件格式说明
[打印本页]
作者:
快要发癫啦
时间:
2023-2-8 10:41
标题:
千年 *.map文件格式说明
*.map 文件是记载地图信息的文件。
! N$ x& H% I' M
" s/ `# C: ?/ r2 ~3 |
地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
6 V8 I2 Z& A$ ^: B0 A4 x: @
; E& X8 \" T! A5 J. z D/ A
第 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 地表一层的序号
0 l4 ^. P* |; o# Y* E. o
: M9 E7 w' \5 o' S( }) L; B
03 在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
( G. P. X# f! J! h% v5 F* u
07 在地表二层 12 01 这个大序列下的子序列编号
# t. C! p8 H, @5 o! i
86 物件层的大序列
, ?2 `* k- I/ }6 [' P: S F
00 物件层的大序列下物件的子序列编号
6 ]5 Z$ W/ z* U- w" n8 r. L& |5 b
03 03 00 目前不详
! v' K6 X1 A, m$ `0 c6 x
01 行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
" S- e$ R! C4 w) o; o0 r
# J# y5 o* w% a- L
//************************************************************
, [; y$ ~ I- |7 v6 F' F
// 加载地图基本数据函数;
% G1 }6 J, H5 e- A4 w7 R c9 j
//************************************************************
/ y4 S3 n: i# V) d/ }: c
9 `# H% w$ x0 h( H5 Y9 Y6 a, ?
//************************************************************
9 J& d2 |" ?- _' ~0 z$ }
// 加载地图基本数据函数;
& o+ w( x0 q( g' m3 S* ]9 R
//************************************************************
! n3 j3 j& g7 e+ C( Q
, N$ z9 g" ]/ p+ h" w2 }( d
int Cmap:
oaddata(char *filnam)
. _3 `6 S; V( G. z" Z- \
{
4 R) N+ F' i! [8 R0 b2 V* k
int Temdata;
3 E* ` j% x, O; m
6 x1 e8 Z# W+ e( B, g
if(filnam == "") return 0;
7 P: r% {, A2 |! e
, F$ J7 T* i! P% o
fp_map = fopen(filnam,"rb");
! T, q/ |' t) ]5 H
! I. P( h+ n4 p' L
if(fp_map == NULL) return 0;
, t3 v5 Q4 x: A9 E1 a
# {2 X3 w# y" \! u5 t
fseek ( fp_map, 16, SEEK_SET);
( x+ e; ^! n7 \3 l0 x
fread ( &ShortWidth, 4, 1, fp_map);
/ C5 Y4 D3 u; {
fread ( &Width, 4, 1, fp_map);
" l8 T( `" l. M+ J
fread ( &Height, 4, 1, fp_map);
+ u. m4 b7 O2 M" q
3 H( \) m- r" g
int TW = Width / ShortWidth;
: {/ N8 P( p- M. @
int TH = Height / ShortWidth;
. I6 \ Z* ~4 @' ]5 q
! f: q( c$ N/ z, s5 N
for (int j = 0 ; j < Width ; j++)
- B7 R5 a; w _% G6 j6 f! B8 A
{
9 t3 }* j* _+ w3 R: K7 m; ~3 l( t' J
_DELETE_ARRAY(Cell);
5 y2 R: [0 x. N& A2 p$ S
_DELETE_ARRAY(Role);
! r9 }( Z0 p S& l/ l
}
# ~" R+ G w. D2 e, ?
2 p% l+ c5 R6 v8 z4 e7 |! D' [5 j
Cell = new stCell*[Width];
( X' O+ }; e( Z8 ~3 f8 U
Role = new stRole*[Height];
4 Y% \5 y4 c+ |- _7 H! h
for (j = 0 ; j < Width ; j++)
' F8 q/ P+ ~/ @
{
" P3 q6 c' B* Z7 y) Q: F# S+ {( H
Cell[j] = new stCell[Height];
( \9 u" w) _( Z7 w* ]3 J( }
Role[j] = new stRole[Height];
, h5 ]* L8 _6 N5 ~% L
}
$ V3 h8 V l! T$ t
' P& Z2 K# j, {% V1 v+ N
fseek ( fp_map, 28, SEEK_SET);
% s7 B7 T9 X, k5 ?) I/ U. v
3 I. b6 V# S- u1 q X) _
for (int y1 = 0; y1 < TH ; y1++)
% A3 @* Q# Q% W' Q
{
0 F* ~: d7 K2 l, C# O2 [
for (int x1 = 0; x1 < TW ; x1++)
* M/ O R! Z# X: |" k
{
: L ~- V6 ~" Z& ]# K0 [
fseek ( fp_map, 20, SEEK_CUR);
$ |! U7 }! ]% X4 A
for (int y2 = 0; y2 < ShortWidth ; y2++)
: M0 v; Y- `$ I; [1 Y6 S3 U$ p
{
) M6 H4 z( W( R$ l
for (int x2 = 0; x2 < ShortWidth ; x2++)
. l+ m0 I" r& m' H. J) k
{
9 g. G; ~# ]: [
fread ( &Temdata , 2, 1, fp_map);
5 }) v3 V& ?; F: t: b9 ?6 J
Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
' H2 g6 e8 J7 H Z+ T. R
8 v. m' U' g ~9 D- s5 X
fread ( &Temdata , 1, 1, fp_map);
* ^% i1 t G3 i4 c
Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
# I$ l/ M! S( [* e, q6 }
* Q7 Z" x6 A! e |3 f- ~5 F/ J
fread ( &Temdata , 2, 1, fp_map);
) l6 v! \# f" I" U( }; W
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
L- D4 A( A7 J M j
- I) M% B' s' y, |+ B
fread ( &Temdata , 1, 1, fp_map);
j$ g+ w, K) N' ?1 a4 U
Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
' h7 a+ ?! O v5 W1 ~/ x
// 6个字节
0 \0 N# p) d0 b" _
+ o7 i+ \) {- X- n
fread ( &Temdata , 1, 1, fp_map);
0 X# s2 D& B% x. R0 k# ]/ j8 P6 |
Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
; s l& M. t; V' y h
$ }) x1 B1 u# k \0 x t
fread ( &Temdata , 1, 1, fp_map);
# |/ [, D) {! E# L5 @' ?
Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
5 b& q; i; O" Y: A& |- i
; R6 ~/ y2 l2 Q) t
//fseek ( fp_map,3,SEEK_CUR);
0 e3 Y& T9 Q- ] e( f9 i0 z$ J$ ?/ t
fread ( &Temdata , 1, 1, fp_map);
5 r. L- C' f& q
Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
" X! Z8 M1 o9 g( i( O& T
. w) h, s/ r$ `9 H- l* _
fread ( &Temdata , 2, 1, fp_map);
6 u8 r5 Q, O# w) B2 U' Z4 O) `2 M
Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
" Q/ {# D7 I( X" s/ h- \6 Q
3 t: d* h3 @ S) x) T; _( P
// 1个字节
6 L/ H6 X9 O# B' P. S' {( I
fread ( &Temdata , 1, 1, fp_map);
- v- K1 a* R3 B
Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
' v. E* b9 \& l
//if (ftell(fp_map) > FilZize) return 0;
3 T9 o/ L# m" Q! F a% G
}
8 l6 _, X- Y& ?# w/ Y) T& ~
}
. V& X" R4 H) z
}
# U% {9 n" p0 P. }
}
4 r' w6 I7 O/ U# \ T
0 z3 A8 t8 b( S; d
fclose(fp_map);
) D3 L$ l5 @ q: G+ g
' K# W1 N. ^! W
8 F( a5 X4 `4 o- m( K6 J
return 1;
1 B/ V Q: N4 O" O
}
8 T* J# |1 R( b4 t5 h. H6 W
欢迎光临 三千论坛 (http://bbs.3000y.com.cn/)
Powered by Discuz! X3.4