三千论坛
标题:
千年 *.map文件格式说明
[打印本页]
作者:
快要发癫啦
时间:
2023-2-8 10:41
标题:
千年 *.map文件格式说明
*.map 文件是记载地图信息的文件。
$ m5 h6 r' B. ]/ a
* Z+ t) o* g+ z( F
地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
7 F3 n# d& ?& V! l6 K7 ^, \
* X" H8 h( t! t+ [ L9 g
第 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 地表一层的序号
3 V8 V# y8 Q8 w. W4 h& o2 U/ I
& |, s7 _; w% U% q/ t# f' Q# v8 p' C- r
03 在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
U; s. ?/ ?& Q( k' r `1 ? |
07 在地表二层 12 01 这个大序列下的子序列编号
0 s8 w6 `+ U. _4 i: g
86 物件层的大序列
r1 S7 Q% Z: {% t% W2 c
00 物件层的大序列下物件的子序列编号
2 q; p/ Q. Q" j. m( }1 I; ^
03 03 00 目前不详
" U# ]2 x, {4 u, e! J
01 行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
* X- F+ U8 f( y' s. F& T" W
9 j0 o3 w. u$ ]) _4 p8 J
//************************************************************
/ K" v8 w5 j$ k" W
// 加载地图基本数据函数;
: Q; A- [% C0 `- v' j5 H; G
//************************************************************
) l3 K5 R/ a6 \3 f9 [! X
9 r+ g9 _9 j Q% T* {
//************************************************************
" q' ~: f9 Z0 F0 |$ s2 H
// 加载地图基本数据函数;
4 {! l* B3 a6 v) y: B y8 A. \& M1 F
//************************************************************
( w& o0 C9 t- c$ a3 m% Y
: w9 a z7 j& y4 N! m a2 J0 m
int Cmap:
oaddata(char *filnam)
9 i. J8 y. C$ j+ h& a6 v
{
# O3 w5 x X4 }/ k
int Temdata;
4 P8 O: C; d H: E& p5 N1 t
# g9 G f! o8 o/ Y% S
if(filnam == "") return 0;
) W; A, y* u3 t& K% I7 f' W4 g. u
7 C6 \ i) N: U8 s; ~
fp_map = fopen(filnam,"rb");
3 B8 t% k! C8 @4 W
: v3 r; j" X* L* [8 E
if(fp_map == NULL) return 0;
+ x0 s+ ]7 l& c/ W! u
$ p5 }$ |* c2 N! o( Y7 a: x3 s `
fseek ( fp_map, 16, SEEK_SET);
" l0 b5 ~4 H2 i; _* q7 r7 y
fread ( &ShortWidth, 4, 1, fp_map);
6 x+ U" p/ |3 `; g2 W. S
fread ( &Width, 4, 1, fp_map);
" z! _1 I% ~$ U# I4 N- U K8 I
fread ( &Height, 4, 1, fp_map);
) H* L- v1 s: B& S* r
/ ]+ V N: i8 H- P" t
int TW = Width / ShortWidth;
+ i9 O* z0 _- r6 x7 d3 J
int TH = Height / ShortWidth;
( M3 z* T8 h% S6 H0 G) x: K' p
' Y/ I5 R$ [" u' l) @
for (int j = 0 ; j < Width ; j++)
" {, b% l6 C5 V" P2 Z
{
; W+ F6 O0 Z5 U$ T5 c
_DELETE_ARRAY(Cell);
]+ U4 c2 j2 r; p
_DELETE_ARRAY(Role);
7 \# T% C( O, v: t* k
}
) ~: q" e% @8 I5 m, _- s! H5 j* c5 k. X
: ]6 p) M# l7 j
Cell = new stCell*[Width];
_! t% f& f5 \! |, i
Role = new stRole*[Height];
1 V0 o0 F2 x5 Z% A
for (j = 0 ; j < Width ; j++)
) _7 o' T3 S; ^! J
{
' d1 [7 f# G* P' P3 O
Cell[j] = new stCell[Height];
4 v$ e2 x' K* s$ v/ d- v# d
Role[j] = new stRole[Height];
2 ]: f, [' e& M9 M* ^' s
}
9 }7 H' v* N1 X' B" p5 M. V
$ ?6 k- f1 z7 k8 c
fseek ( fp_map, 28, SEEK_SET);
) |" s: A z% g
" G5 _; `9 M5 a. S- o' M
for (int y1 = 0; y1 < TH ; y1++)
' D" ?, s& p+ p7 ]( {( F& [
{
& C8 I# Z" L8 Y( R. Q1 k% N& I5 W
for (int x1 = 0; x1 < TW ; x1++)
9 w- j y: f( B7 `
{
1 |3 w+ K; ~3 [3 Y6 \* K0 Z
fseek ( fp_map, 20, SEEK_CUR);
! m w h- |2 S3 n
for (int y2 = 0; y2 < ShortWidth ; y2++)
. h8 b0 ^7 u6 Z, W- z2 i* Y" I
{
. c+ U- p7 Q) I7 v4 }
for (int x2 = 0; x2 < ShortWidth ; x2++)
, D( k$ B0 s% f
{
! u( | O, u, d+ q; d1 P! q
fread ( &Temdata , 2, 1, fp_map);
% a2 K0 `9 z1 J0 S7 y, u( U
Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
) b7 }5 |! s C( ~$ u" f \+ L
; d& s+ ?( M' S
fread ( &Temdata , 1, 1, fp_map);
% L0 o" M/ @: S- i' Q. K+ Z* c
Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
3 R# `. }2 a* n9 c1 S& X, N, _
# S! }8 [$ r' ?9 Z0 _' u
fread ( &Temdata , 2, 1, fp_map);
- r6 r3 |. J1 x9 o3 i m* f
Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
: x* u. O* W6 d3 m
# g$ B D) L1 ^$ C3 k
fread ( &Temdata , 1, 1, fp_map);
1 ]1 E' J7 p2 A2 @2 F. E
Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
2 e7 D7 m9 P8 M
// 6个字节
' G! d2 {* }6 F' y8 V
3 m" D# A' _' f
fread ( &Temdata , 1, 1, fp_map);
4 X- }! K3 E2 h" q3 A U3 [2 [
Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
2 A# T% d Y, k7 j, w& }6 \& z0 _
" b f& { r" r# B- c! W- D5 z6 ?
fread ( &Temdata , 1, 1, fp_map);
$ `% X3 _: @3 j+ c
Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
# l* J0 A7 T" }" y6 D4 H! r
! k7 V' m2 p, Q8 v5 m
//fseek ( fp_map,3,SEEK_CUR);
/ @5 }1 z# B/ G/ ~4 \; z
fread ( &Temdata , 1, 1, fp_map);
! J* @ J( a0 f$ |! z; T* S
Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
6 ^3 X: O* c) J: W
5 U- \1 r# ~ k0 W+ \- D j
fread ( &Temdata , 2, 1, fp_map);
+ k6 V3 V& m6 F
Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
5 N. H3 u ~/ O
+ Q q$ [( T0 O! r# Q
// 1个字节
: k& [5 C% P' H( h5 G, n
fread ( &Temdata , 1, 1, fp_map);
8 ~# p$ }" u# [
Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
2 P9 a( ^' `9 L/ j) y3 G7 C5 |
//if (ftell(fp_map) > FilZize) return 0;
( h% t& v) ]$ b; k! Q0 n7 h0 Y" l) Q% B
}
1 a$ }! H' h4 p: p6 Q4 ?, x1 @
}
4 k3 A7 u' e$ N
}
- \* h, H+ O( m0 n8 b
}
% [% M M) t& Z4 |& @, a
( y7 M$ [: b' b% X1 V0 H
fclose(fp_map);
8 G1 q- O- H; g7 i
^4 t M- z: r
5 r U8 B; |: }7 @
return 1;
8 K8 Z: B2 L$ g& s9 ~1 T' h
}
' L7 Y7 ?1 F" u# h
欢迎光临 三千论坛 (http://www.3000y.vip/)
Powered by Discuz! X3.4