游客您好
  • 点击联系客服

    在线时间: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 文件是记载地图信息的文件。
3 W2 N  H* J5 W3 j, z- S# `
  e; L. i' j6 V0 e* a
    地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。, s! ?5 I- B9 C4 G/ s$ K$ L- O
  ^/ X7 }+ n( D: d
    第 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 地表一层的序号
( }4 L; _4 Y; t* I* m  o

4 ]( X6 K9 H- ]* a8 B: f* h+ C
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号, B5 ], u0 y; J2 z% [
07      在地表二层 12 01 这个大序列下的子序列编号
. w( j3 l7 l2 h3 s5 z
86      物件层的大序列4 ~6 B8 {" G5 g! I6 w; s6 \
00      物件层的大序列下物件的子序列编号" t; ^% `5 D. N1 z* ]; c
03 03 00  目前不详6 e' A) j- w' b* i
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
; M* `4 ~/ Q- y0 S& R2 T2 |- d

1 J- a: r9 j4 S/ I, e# f* C- Z- N
//************************************************************
: M( s- [# G* @3 v: z
// 加载地图基本数据函数;
7 R4 |( G2 K9 a+ A5 k  A- ^/ P0 |
//************************************************************5 c/ [" p5 W5 G. O( ?8 k& _- Q

$ r8 z6 U- h; ~- u
//************************************************************) M6 g. Z5 q0 ?
// 加载地图基本数据函数;6 E. C* m! ?! i, O9 @
//************************************************************
2 X7 D2 R: M4 \# b" L  [% X( W0 e; M
* x9 d9 `4 B' j/ ~1 J1 u4 {% @$ X
int Cmap:oaddata(char *filnam)# D* q, a$ V+ [4 l0 R  A* [' o- \
{% H% B  w: o4 t9 O& m( q0 E
        int Temdata;" K/ v/ V- y( ]2 _
- Y' X: i2 r7 {. }/ L
        if(filnam == "") return 0;
' ^' G, i* p3 }: A0 u
5 x8 _) z$ c% e# A" {& s  E( B7 l7 q
        fp_map = fopen(filnam,"rb");, ~( C: s) X% z6 W7 E) q6 p$ i
- P1 }; T5 U  T* M6 l' W% Y+ L
        if(fp_map == NULL)        return 0;
0 B7 ~* H0 ?# b7 j! w, h& T

6 c8 E; }6 p- k$ P! R2 Y: u
        fseek ( fp_map, 16, SEEK_SET);
( \: f4 I& D- ^0 _3 o' s, s$ w% w
        fread ( &ShortWidth, 4, 1, fp_map);2 B( z; o  V) E, u3 K
        fread ( &Width, 4, 1, fp_map);
! S0 e9 S" s! k# {7 K' A) G
        fread ( &Height, 4, 1, fp_map);. y0 b6 J- j$ V2 l( J
+ R( S+ [" Y, B' |
        int TW = Width / ShortWidth;, i6 D  ?) J9 Q& S( }
        int TH = Height / ShortWidth;
& F5 z$ y  K+ ]4 r% E. }( J
# a% W8 Y$ f* `
        for (int j = 0 ; j < Width ; j++)
- T  J( y3 J2 _
        {
2 i, ]/ g( u3 z# c' r  Q2 O
                _DELETE_ARRAY(Cell);
1 {% h3 Q) G2 n/ \2 S
                _DELETE_ARRAY(Role);
9 ?- N% i* m9 [8 a* k* k
        }
& Q3 J% z4 p8 O0 @

7 E8 X- i( I( p8 E
        Cell = new stCell*[Width];
5 m$ d. t+ `. }9 b0 k% P9 q
        Role = new stRole*[Height];) x) j) k  N$ o1 A5 p7 d7 J6 O/ x
        for (j = 0 ; j < Width ; j++)7 J0 Z$ H# P4 n2 f) T# P7 |* e
        {+ v7 m- x# z4 |" D8 D; K$ U1 J
            Cell[j] = new stCell[Height];0 Y; B$ ~0 ~- b, @6 k1 A3 @' I$ w" x
                Role[j] = new stRole[Height];        $ b3 I( h' F" l( Y+ u4 \4 B. [
        }        
3 B% b" h  S1 n
2 T- P  p) _" G/ b, D
        fseek ( fp_map, 28, SEEK_SET);1 w# K+ O1 m% n5 M& A* Q( ^
# p' p" N* W' _4 u* [1 e
        for (int y1 = 0; y1 < TH ; y1++)9 x. T7 k3 Z% g  x# _: s9 W
        {
$ u+ g( K( Q% ~0 D0 H- e: B" u! V/ l
                for (int x1 = 0; x1 < TW ; x1++)
6 m5 s8 Z6 Z% W5 f* ]: L5 d6 k
                {
. h: i0 H$ k  l; v4 n8 P
                        fseek ( fp_map, 20, SEEK_CUR);
  ~, ?1 @* L/ i8 X0 D
                        for (int y2 = 0; y2 < ShortWidth ; y2++)
+ T! X2 H8 K% z6 Z( s; K
                        {
9 ~$ P" ^9 n% F- l
                                for (int x2 = 0; x2 < ShortWidth ; x2++)- S& c8 t" P% r- B
                                {$ z/ ?, d( J/ D
                                        fread ( &Temdata , 2, 1, fp_map);: p+ e8 r$ Q1 V5 z3 C9 R$ A
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;) o. j& V* @, Y1 ^* k

  B$ G# {/ u" T+ `
                                        fread ( &Temdata , 1, 1, fp_map);
, I6 M$ r9 H( a( N5 {6 T* V
                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;* v9 x2 \" [" U7 |" j3 K
2 h+ ^' N$ \* w$ f: c# m9 ^
                                        fread ( &Temdata , 2, 1, fp_map);9 ^( E& q3 B6 k& _5 V: g/ s
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;; u% t. A5 x& p, a$ R0 u
4 I, A  F; |9 o2 q& M* J
                                        fread ( &Temdata , 1, 1, fp_map);
: [; l, l" R" o* U7 x+ D2 e
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
, F8 O8 x" F% U, r6 Y$ c/ K3 T$ J
                                        // 6个字节
6 Y1 j+ I4 z8 ]2 X  X0 p- \2 ^7 C/ Z

& ?) q/ ^8 N- N
                                        fread ( &Temdata , 1, 1, fp_map);  o9 H$ ^& Z# o6 C* f) M. E
                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;9 I1 s, y  l& J3 v9 d, `
                                       
% J" g) Z1 O+ G  m; x: ]
                                        fread ( &Temdata , 1, 1, fp_map);4 [3 X: i) {3 [9 g' s1 R7 ?
                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
' F5 O8 b3 s; Y! D9 W8 r9 g. h

4 d1 F* k1 x" g- u+ ]* p
                                        //fseek ( fp_map,3,SEEK_CUR);
8 y# G: c% A5 Z8 [! W, W3 z, ]
                                        fread ( &Temdata , 1, 1, fp_map);
9 r, _% w: L/ g' ?/ b# b6 K( }2 J
                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
5 B" n( X' q; {# t$ M7 h- G/ n" M
                                        , _% S+ {" A: }. G0 h/ u  X; O& s
                                        fread ( &Temdata , 2, 1, fp_map);
) x, f2 M1 K: h( e8 w4 b
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
1 B: x5 z/ [# H- ~: {, W

$ W+ R, w8 o0 C* S9 F+ l% g. M
                                        // 1个字节
4 H: P/ R- I" N4 F% V, |  h# |
                                        fread ( &Temdata , 1, 1, fp_map);
% A  H& H2 k! o' a
                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
' ^% O" [& A% k* _5 R
                                        //if (ftell(fp_map) > FilZize) return 0;
7 V$ D6 ^1 ~; M4 \) h  ^
                                }9 B8 K& x! I  R" k$ d
                        }' R5 p# f! ]* U1 n% R. m7 @  c
                }
1 c  N2 Y! o% ?7 o2 L! h
        }
2 V; P6 z! q! e$ k3 z% y
, F& {2 @5 A% B  k. C
        fclose(fp_map);
' T. {  y1 n* E, M* ?

- G& W4 f6 ]5 ?, n1 R

! g/ o- K& e/ l4 @) V+ B* p
        return 1;. K& m7 j- ?) Q: V( f; _
}
, x% @$ @  F  V# q9 m4 |
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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