三千论坛
标题:
千年 *.map文件格式说明
[打印本页]
作者:
快要发癫啦
时间:
2023-2-8 10:41
标题:
千年 *.map文件格式说明
*.map 文件是记载地图信息的文件。
0 }, q& A' S# X0 y. {6 B7 | e
$ `" |) u9 s# D' R, m1 n4 c5 d6 b
地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
! D, B1 \7 l6 E% K
( ]. Z6 z. x9 V; \" R* H" ~
第 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 地表一层的序号
, e }3 S9 h1 ~1 X3 n h1 d
' P, g/ y3 \+ @ e, q
03 在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
8 e1 {% l; V( Y
07 在地表二层 12 01 这个大序列下的子序列编号
# m2 v x( G3 x7 n
86 物件层的大序列
7 H: ]: N9 u1 o' q; s
00 物件层的大序列下物件的子序列编号
' v! `0 k: Y$ f7 w, G+ K
03 03 00 目前不详
' E) Q/ q, }' `3 v! F: V- K
01 行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
( I' k3 S p! z% [8 ^& | F
. D U1 A& I+ d8 O, z$ l
//************************************************************
s8 Y( ]. N# u7 n& B& }- R
// 加载地图基本数据函数;
% `" u( R3 L! \$ S9 b0 A( h
//************************************************************
- ?; `! C& W' |& ]/ |9 y- Q: {
" W& K3 g4 b! `) ~, k* L" ~* W- D
//************************************************************
! a% \- x# D6 D# v
// 加载地图基本数据函数;
7 L+ Q m- n% l
//************************************************************
6 |: V y! e3 [9 Z) n
, m' i) u8 _9 T v, i2 s
int Cmap:
oaddata(char *filnam)
" S' w, K% M4 l+ F, d1 \, v
{
9 c8 h# \+ w4 Z# B0 A7 N: p: ]
int Temdata;
5 k/ B6 ^0 J5 q, E- A0 e
3 l1 r: e' m5 G8 L: l7 L/ ~- g6 x
if(filnam == "") return 0;
: ?% k" {" j1 u* i8 _% x: h
+ N R2 G4 h' B" l! P9 W- N
fp_map = fopen(filnam,"rb");
, k9 }" x! D- P& p# n3 i3 n
M8 r0 I4 l% x# \/ i) E
if(fp_map == NULL) return 0;
8 {' n3 Q) p6 Z/ Q v5 K; ]) ^+ H
# y3 x8 Z5 f& v) \2 p
fseek ( fp_map, 16, SEEK_SET);
' T( t8 d, C+ P( t* t7 J
fread ( &ShortWidth, 4, 1, fp_map);
+ s( z- R( U6 G7 O. u
fread ( &Width, 4, 1, fp_map);
4 t, \$ M) e3 e4 E: E9 L$ X
fread ( &Height, 4, 1, fp_map);
7 z- s0 k- z" X7 N* g# r# I7 H
/ z( b% J' \4 z1 n
int TW = Width / ShortWidth;
4 k1 t p& Y2 t+ [" J( R8 U; {! n
int TH = Height / ShortWidth;
! i, Y8 t+ u2 [4 Z+ Y# Z \5 |
) }, A0 c) c7 r
for (int j = 0 ; j < Width ; j++)
, \- T0 }. O2 h' \5 W
{
/ i1 g1 e7 b& g% \8 i7 k1 M) N/ f
_DELETE_ARRAY(Cell);
9 Q8 c, t! p6 q/ q
_DELETE_ARRAY(Role);
6 Z' d" |# F5 Z: K5 F
}
+ Q% L+ x2 y# P: O: Z- s* a
/ @: i; g. I/ _6 R0 k7 D
Cell = new stCell*[Width];
2 P6 H) S6 \" h% ^; Z9 h
Role = new stRole*[Height];
1 D7 X/ @* s( u. O" X( f0 y5 l Y
for (j = 0 ; j < Width ; j++)
% y, F! Q" h q, c/ G/ n
{
$ o1 C6 p4 o1 Q7 E
Cell[j] = new stCell[Height];
" j3 H: a1 F; p: |
Role[j] = new stRole[Height];
# b7 K- h, a- f3 i! [# B
}
( X! ^; I+ o, s$ Q- W0 V
8 z' h. K9 V' y3 U
fseek ( fp_map, 28, SEEK_SET);
' U4 R+ @& s' {, I+ b5 e
& t9 B! U, U7 L; r( W7 R
for (int y1 = 0; y1 < TH ; y1++)
% b7 N; v/ W0 u6 K4 S
{
# h2 u# H9 r: P- ^& H, V7 A# d
for (int x1 = 0; x1 < TW ; x1++)
) P" c5 o# C" V
{
. o |3 f! ]2 S- F; e9 r
fseek ( fp_map, 20, SEEK_CUR);
4 ]- q8 \: o/ N
for (int y2 = 0; y2 < ShortWidth ; y2++)
; L9 k9 z1 p" U' j4 S: M0 n
{
s+ Y5 b$ X) B( Y' k. \ T- A
for (int x2 = 0; x2 < ShortWidth ; x2++)
# d( M( v4 @ V% f9 l* j& Z
{
9 L n) |. i; C9 q) J/ W
fread ( &Temdata , 2, 1, fp_map);
3 i% `; d1 ?- T; ?2 ~+ l$ R
Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
" r, S g; A9 G' y7 E# T) q; Z
' y3 v. @" g6 d% g4 K
fread ( &Temdata , 1, 1, fp_map);
5 j" d( _: e0 b: q5 U Z& b- B& b- {
Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
( t4 C! K! i1 a6 Y- }# [9 v4 l
# Y! H. w% Y$ ]% ^7 |) _
fread ( &Temdata , 2, 1, fp_map);
' u b! h1 G' z% q: l
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
+ c1 v; r/ I) e, z
s# i k; \/ H$ K
fread ( &Temdata , 1, 1, fp_map);
* |, O9 M# L5 j( [
Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
: c7 ^+ d: O' J8 t
// 6个字节
7 `; N: W6 t4 B5 U, i7 ^0 \
s( B1 {7 C% I4 Z; f+ b
fread ( &Temdata , 1, 1, fp_map);
/ y+ q6 W3 Q! B9 x. F
Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
- g/ K& J9 v& r8 P3 V4 R* I* {
* v- P, s2 n0 y, m/ P- L
fread ( &Temdata , 1, 1, fp_map);
9 @$ g5 k% C* ]: ?! ~
Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
+ V9 d; B6 p4 n r
4 q7 N ~/ L5 r5 e, A+ E2 `
//fseek ( fp_map,3,SEEK_CUR);
2 j6 ], S) [# h3 {
fread ( &Temdata , 1, 1, fp_map);
4 \" O* K- k! {' e
Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
1 x- \* c# L2 R! k$ c
! l/ Y2 \0 }9 \2 n7 I* [; M
fread ( &Temdata , 2, 1, fp_map);
; ~/ V; O+ I! P. s1 ^
Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
) j. o# ^' P+ _* M1 v7 R( X
j) K& w% ^, g8 h. p
// 1个字节
1 ? J% F6 b. `4 L& l! m
fread ( &Temdata , 1, 1, fp_map);
) K4 m3 v7 ?5 T7 Q' g7 H, V9 h
Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
3 g X3 Z) Q( V4 T7 \+ ^
//if (ftell(fp_map) > FilZize) return 0;
) {* Y: w; J M: ?/ w
}
0 C; `- r5 ~) D# L( U
}
+ i' S1 u" h0 ?$ [+ Q! ~% z
}
b/ {2 s3 M L- C. P
}
8 \* {5 X" Y. h, K& C
0 H3 d& v1 x, x, }, d+ A: u1 i
fclose(fp_map);
# n1 m; p! a+ R( F! l0 t
7 w' A3 v# ?" T* I9 S
( z x, ]/ g' L) |
return 1;
, |+ A8 Q' {4 x, {/ }" a( E
}
3 a; F1 z9 S7 v% U+ s
欢迎光临 三千论坛 (http://www.3000y.com.cn/)
Powered by Discuz! X3.4