游客您好
  • 点击联系客服

    在线时间:8:30-18:00

    客服微信

    Wkr-3000y-kf

    电子邮件

    3000y@wenkeruan.com
  • 手机版

    随时掌握游戏动态

  • 扫一扫二维码

    添加微信客服

Lv.5 解脱境
277号会员,0活跃值,2022.10.27 加入
  • 207发帖
  • 173主题
  • 0关注
  • 0粉丝
这个人很懒,什么也没有留下。
独家推荐 更多>

[安全工具] 千年 *.map文件格式说明

[复制链接]
快要发癫啦 发表于 2023-2-8 10:41:09 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
*.map 文件是记载地图信息的文件。
% ^& I; J* \: f* O" N+ B
; L  ]* v2 \# w! {7 z3 c
    地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
! D( C) {3 E* w1 L6 j

7 w/ q- Z) V3 @& j
    第 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 地表一层的序号
' X$ s3 q2 d, h
5 N; W/ W; n+ |. K
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号2 F( }7 J8 y- H7 P' K$ E
07      在地表二层 12 01 这个大序列下的子序列编号' R' a& `) F/ Q+ y
86      物件层的大序列
! b" e2 m9 t1 a6 M$ C% I4 N; Z: Z
00      物件层的大序列下物件的子序列编号
" w  e/ e  |) R  t3 h; s1 W
03 03 00  目前不详" f& K: c: r: J
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
' g+ g0 Q3 ~1 x, F) @

% l+ }1 S; p1 L( ?, }
//************************************************************7 D4 C3 Q. n1 H* n
// 加载地图基本数据函数;
& Z" Z! ^! U" Q: c* }; _
//************************************************************
3 D( @6 n! z* R* b7 K* [. O6 [1 I

8 O8 d  x7 \5 P9 Z
//************************************************************
3 }: _# i: O; U) R2 c& m2 c4 _
// 加载地图基本数据函数;
3 k/ X9 m5 {  g& Y
//************************************************************8 f7 c& n3 ?5 [

6 l7 t4 M$ Q! q3 A. r
int Cmap:oaddata(char *filnam)+ r9 N6 n7 ]$ \) d8 P' h8 A. J3 h% Z
{' L4 a* Y; X- v- k
        int Temdata;
9 o0 x  N2 F5 Z; B1 @. W

' X+ I7 q  h, c$ i
        if(filnam == "") return 0;/ `! V& R. W$ O; p3 N7 R8 Y

  J& R9 [4 v& T' P, q$ z
        fp_map = fopen(filnam,"rb");
, v$ M. z- {, L

: Y1 o( ?) g2 x9 d8 O" n* ~; y
        if(fp_map == NULL)        return 0;$ z1 e  @2 ?. V6 Z7 }( M
. d* F. `9 s+ U: L6 w
        fseek ( fp_map, 16, SEEK_SET);
+ L' P" G3 R+ p# L0 D$ j
        fread ( &ShortWidth, 4, 1, fp_map);
& r; I' i- }; W* |
        fread ( &Width, 4, 1, fp_map);
! X  c, a$ s& n! i! X+ E9 n
        fread ( &Height, 4, 1, fp_map);' _" M7 H3 G" q( T6 C
& d) P$ l( y$ E+ o  Y" L. c4 }
        int TW = Width / ShortWidth;8 @5 J+ M( Y) v1 {: S
        int TH = Height / ShortWidth;
' l) e" Z$ w5 [& n$ E

: D8 x; W* A% x' J4 ?# q, T
        for (int j = 0 ; j < Width ; j++)
" s$ d( p3 Z* V: f/ f0 g# i
        {
" y1 K* I. |. _; h* M9 M
                _DELETE_ARRAY(Cell);
% r5 N( w" h6 D6 |/ n( x1 `( y
                _DELETE_ARRAY(Role);
/ @+ w1 m0 J. A4 R$ b6 d
        }, N) p" d) E' \  D+ n

8 c; o8 ?3 ^2 `6 e0 |
        Cell = new stCell*[Width];
. C' a( U( U( a- b
        Role = new stRole*[Height];
7 y# y4 n8 B) n# \. y& ~, r
        for (j = 0 ; j < Width ; j++)
, o: @6 M- N- {' l
        {# z' ^# l% V" Z
            Cell[j] = new stCell[Height];$ t! [4 g0 i9 ]1 x. @
                Role[j] = new stRole[Height];        # N8 I, X+ p4 Y$ q; f3 d  u
        }        
: Q+ F! x8 b0 {: l! u: Y6 E

# @, k* q0 A- y6 [
        fseek ( fp_map, 28, SEEK_SET);
+ q3 y. ^" b+ A# V/ d7 y6 Y% j% o
7 C# N( z+ ^, F8 p% p
        for (int y1 = 0; y1 < TH ; y1++)
! d- G4 c* Z6 F9 @% v8 J6 d1 O' X
        {
5 E. V, T+ t% Q2 d  g, I! O
                for (int x1 = 0; x1 < TW ; x1++)
. ^, j  d1 f% W, [- S! |' ]
                {
5 s$ s' R! T5 Q  C" b8 d, T4 o
                        fseek ( fp_map, 20, SEEK_CUR);+ e/ x3 G, o* C3 C7 w
                        for (int y2 = 0; y2 < ShortWidth ; y2++); j  z, S  ]) [, @
                        {
4 _% g9 c' r' q2 X5 ?
                                for (int x2 = 0; x2 < ShortWidth ; x2++)4 ~) Z. f( Z( M% w0 q6 T
                                {3 A8 a$ S+ Q' \5 ]! o
                                        fread ( &Temdata , 2, 1, fp_map);9 @* q; E4 J+ }5 u& w4 s
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
; ^5 p7 L# `. l4 N! N
. m& m& C4 C/ ?% \
                                        fread ( &Temdata , 1, 1, fp_map);9 ~5 F) i6 p. }+ O5 B6 q
                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;. V+ C/ {( M! o# X8 \+ g6 b" L
1 N( W* O" q! \: C
                                        fread ( &Temdata , 2, 1, fp_map);' ]; V1 ?' a- ^( f
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
3 V' I0 x6 U  t- Q# o
( G3 x/ r6 v$ K+ p+ H
                                        fread ( &Temdata , 1, 1, fp_map);  l3 j; \. E  z" o5 Q
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
! @5 u6 @6 q+ g+ p# Y/ I# ]
                                        // 6个字节
" R" X7 U8 W: A6 N! N* y4 e! w

8 t8 Z# [6 a, M  n; z
                                        fread ( &Temdata , 1, 1, fp_map);
) D- I# W7 }) c0 ~; O9 I2 o7 s. J
                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
/ k, I) C) J+ T+ p' W* M3 _) T
                                       
8 j2 P$ P: ?/ f; w4 W  ]$ l
                                        fread ( &Temdata , 1, 1, fp_map);
% F8 u. W7 I  b; G' ~
                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
. e' L% e; Y: |8 n- ?. }

* E# E5 w2 f0 |. S2 U
                                        //fseek ( fp_map,3,SEEK_CUR);
$ }* E7 f" f6 t
                                        fread ( &Temdata , 1, 1, fp_map);
7 ^8 N( f+ R7 [2 q. Y
                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
% k  a' Q9 l$ F, D, L% [- }' ~) ]) K
                                       
* H, a% P" j8 o$ u& w
                                        fread ( &Temdata , 2, 1, fp_map);
8 g# J- @; ~! P: x8 y4 O# \$ S- f
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;3 O0 q0 O8 D% U
/ F3 i# O9 m1 S: Q
                                        // 1个字节
) w# z/ s7 q' X) O; I4 r
                                        fread ( &Temdata , 1, 1, fp_map);& S) w8 k; R2 Y- Q
                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;) R3 _: d% }- H- Z5 \5 M
                                        //if (ftell(fp_map) > FilZize) return 0;
0 Y! l, K4 l! w7 f
                                }2 `8 D9 _( r9 @0 E9 |
                        }: r* u) o2 _- E
                }
" K% l) u* a9 y; a  m$ L4 h: T
        }
7 n& K! _& H% x5 o" P1 F" J+ \
3 D% Q. f, A$ i$ V3 P; Q5 i6 y- }+ r
        fclose(fp_map);9 r9 |; C2 d  n2 h  E6 ], D# J

6 b$ \, Z' W# r1 O& [. O* q

; A) T: e( m, Z# x" s" v
        return 1;
9 f0 |& e' c. t) F
}
8 X% K* z! R+ ~9 x! F5 N& u9 f# {2 y2 i  C
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

Powered by Discuz!X3.4 ©2001-2013 Comsenz Inc.闽公网安备 35099902000100号增值电信业务经营许可证 闽B2-20220593 闽ICP备2023014375号