游客您好
  • 点击联系客服

    在线时间: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 文件是记载地图信息的文件。
7 t% f& @  J8 S+ M- Q
& Y5 Q) t0 j# @1 R; C
    地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。; V0 O" @2 a6 F+ S& x, O+ _9 c

& j% \& M/ i* w+ B' r
    第 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 地表一层的序号
9 ^, J$ R) G0 f/ o2 {3 O
4 S; n* @$ ^5 J2 J% N$ r
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号' E7 `; u# a" L! z- u5 H
07      在地表二层 12 01 这个大序列下的子序列编号* {$ i! P& V" j7 f
86      物件层的大序列
. @( a3 z% p! J- ?$ B6 a0 s6 T
00      物件层的大序列下物件的子序列编号
, `! Z$ Z" Q+ \
03 03 00  目前不详
1 J+ Z( \1 n4 ^5 g5 k8 [
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。2 b$ z. W, P% H1 j# }3 }
$ _& M6 K# D& ^7 W% C5 E
//************************************************************' V/ ?6 q0 B" Y0 v  e
// 加载地图基本数据函数;; p. z  |- z1 Q+ l! K
//************************************************************# K3 W6 p; u* |. _" r2 _

: x* ?: n% W. P( P1 X. I
//************************************************************
5 \" b0 n$ c8 e( \5 x. E, u
// 加载地图基本数据函数;8 t% B. G/ X6 P+ b, J& Q
//************************************************************, w( A  D! P* x2 S' T. L

' [7 u. u/ i- q' M6 M$ k+ Q
int Cmap:oaddata(char *filnam)( i$ N/ m" z8 j: W: D# M
{0 G/ i) C: _1 n
        int Temdata;3 u! n3 _. E  x: K# z# U
4 f( m' l, r3 \* p. ^* V
        if(filnam == "") return 0;
# g& C9 `/ y' z9 E6 }, o$ [
. i  p6 H0 Q8 \7 W( g; R& O* B
        fp_map = fopen(filnam,"rb");
2 l  A/ q* V* Y$ C4 E+ D
1 A4 l/ [( ?+ n& R
        if(fp_map == NULL)        return 0;
3 n+ s) S3 b( u( c; Z
$ g& u5 q7 C' P/ U3 R7 D
        fseek ( fp_map, 16, SEEK_SET);
: |3 ]: K+ ]7 d5 w5 o4 x2 n( Q: f4 h
        fread ( &ShortWidth, 4, 1, fp_map);7 Z+ W/ J+ F% ~# |' ?+ `2 Z" D$ @5 c
        fread ( &Width, 4, 1, fp_map);2 J3 q/ u; Z4 s; S" ]. W
        fread ( &Height, 4, 1, fp_map);8 J, f0 ?- {' \' ]) j6 \1 \

+ ]1 q1 k5 h! K. |
        int TW = Width / ShortWidth;
/ Z3 @6 }3 g( p) y/ h, |
        int TH = Height / ShortWidth;3 x# P  J) r( p8 U
4 i7 b( A8 K/ T5 ~
        for (int j = 0 ; j < Width ; j++)0 P$ l9 N. u- I  A7 X8 a
        {
& Q+ Z; O: i$ z9 _
                _DELETE_ARRAY(Cell);
$ ?% T! a1 c& x+ }- x
                _DELETE_ARRAY(Role);9 H8 E$ J, z: K3 T- ~3 ]
        }- j/ @+ W# L8 B' j

& b' [- _" e5 T! c1 ?+ V
        Cell = new stCell*[Width];/ F3 K  N; T; D: }* p3 u: v
        Role = new stRole*[Height];8 A. \" i( ^# y5 X7 k
        for (j = 0 ; j < Width ; j++)
' ^$ w% j( |6 |5 K# N
        {
; y* P5 x/ F: y
            Cell[j] = new stCell[Height];
4 P& p$ u( _! r' v
                Role[j] = new stRole[Height];        
  I$ O$ Q( f4 u* o! \4 x' [
        }        . g8 F: ^- C: g2 L- E0 _; w  G
: q1 g  h! J7 D( w& b
        fseek ( fp_map, 28, SEEK_SET);  c# l1 C( W9 M: W5 r5 |

- ~) _! t3 ^8 \* X) n
        for (int y1 = 0; y1 < TH ; y1++)
' i3 ~' B0 {: y" q: A, \
        {
/ M- c: i2 w$ f( b% h
                for (int x1 = 0; x1 < TW ; x1++)
" w0 h! h/ z% d  I- M
                {8 V. B& y2 ^+ `  H3 B& }
                        fseek ( fp_map, 20, SEEK_CUR);8 _) `6 V9 X4 x, G, m7 P( [9 h( T
                        for (int y2 = 0; y2 < ShortWidth ; y2++)
: A0 W5 R) @- m
                        {  g! g5 ^# u: d$ m
                                for (int x2 = 0; x2 < ShortWidth ; x2++)4 n" A  b$ ^& r7 e, ^  L
                                {5 w( k2 P* _; N6 R% d" p& {
                                        fread ( &Temdata , 2, 1, fp_map);
% Z. G0 s) l1 C8 c" e# _+ i
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
- |/ G1 L. Q* M4 o  ]
( K* `; ?1 J& g- }/ H1 ~5 h
                                        fread ( &Temdata , 1, 1, fp_map);% ?1 V2 S  C" a2 B/ t& l, m5 c7 O
                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;6 j, P# }4 Z* H, J
3 w  x4 O6 H% N; l4 e. D
                                        fread ( &Temdata , 2, 1, fp_map);
# `4 k- r3 T3 S) C4 |. T
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
! z( U# M0 x/ ~5 g6 N) x
) \6 e7 f# k( r, l2 @
                                        fread ( &Temdata , 1, 1, fp_map);5 c" ^  ?) b  ?+ o" A
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
. L; N. q8 k, l9 M$ u; ]
                                        // 6个字节- W+ P, A6 u- P1 M3 I
; A) l# g7 V8 n( U$ \
                                        fread ( &Temdata , 1, 1, fp_map);, j% V1 n8 t( X
                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;1 ]! {; m8 D3 e
                                        * S7 K% B# @  [7 ^, ~
                                        fread ( &Temdata , 1, 1, fp_map);
/ R9 Y+ E% z4 [! t# c4 ?3 h- }, L
                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;1 G7 B( H4 V. p& d* \

& [$ v: s8 T1 L
                                        //fseek ( fp_map,3,SEEK_CUR);, V7 v" C7 i& k8 `# \* G
                                        fread ( &Temdata , 1, 1, fp_map);
" ~1 t1 M" k/ z9 q, N
                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;. I! f$ l( Q4 n* n% _, n4 u2 a" r$ @
                                        * p5 B4 G0 i& G+ _+ L$ {$ E8 f4 E3 \
                                        fread ( &Temdata , 2, 1, fp_map);
8 [/ x. `4 y8 `8 G& x% D$ m, H5 S5 o
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
5 S$ Q% F2 T' Q/ e8 z+ G
4 R( K2 _4 }/ U: e# c3 n# b; x
                                        // 1个字节0 n0 ~3 Y9 O7 ^, j% `" r$ S
                                        fread ( &Temdata , 1, 1, fp_map);3 s" Y- [2 {) h  n3 E
                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;+ u; q  q  a) I1 \9 m; K
                                        //if (ftell(fp_map) > FilZize) return 0;
; |7 T% e3 d2 b7 e! i' p
                                }2 T% N; r! Y) _  ~! T8 y- e' }! N
                        }
( D/ k. Y7 }0 W  h; _' A2 w
                }
# e3 S& b2 d+ g
        }
% ?; t* t+ |# B

' r' K; L; z5 x. G) a. ?
        fclose(fp_map);6 o' |; b0 V0 T. Z0 k
, U# K" t: p" h8 Z4 v. Y
+ ^& W; K5 y$ z  f
        return 1;" ^3 L# k) b" }/ [5 k! k/ Z4 F
}

7 A3 }/ u  m1 m, n) r8 Z' C8 d
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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