游客您好
  • 点击联系客服

    在线时间: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 文件是记载地图信息的文件。0 k. w& K0 [, h7 a- `, H

# h* P! e; Q8 l+ K# O
    地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
7 I* J2 I5 X. g- W( a
. F8 F8 {( M" U7 f3 ]5 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 地表一层的序号
6 h) ~4 k: r8 c- A; H- C
- }8 B: ~$ n* D
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号% t  ?  C9 V' m9 ?$ _
07      在地表二层 12 01 这个大序列下的子序列编号; h6 F# Y7 K+ c/ O6 _# y' i7 G
86      物件层的大序列8 y. j, C" S6 b, g  ~+ F: s% O2 W, m
00      物件层的大序列下物件的子序列编号" y# i9 T4 l0 C7 K
03 03 00  目前不详2 x6 {: B9 i! ?$ D' a+ n
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
% x# R( w. @5 L. d9 L5 I; o! g- a

2 h6 K; [' L6 o2 Y  K' A6 `& O9 B7 r
//************************************************************& b8 d5 V$ Z0 }
// 加载地图基本数据函数;5 G# {+ g2 q" S+ }8 c* j
//************************************************************; N& ^9 c; w' Z3 q, B

# H( c/ U$ V" C- c5 g
//************************************************************
* @- J1 Q8 W% J7 R
// 加载地图基本数据函数;; Z5 |; `; H/ L( G4 O
//************************************************************
. A& l3 d* |5 M
! p2 {3 n) ]3 s2 {7 x( V0 W
int Cmap:oaddata(char *filnam)/ P, ]) D: [* P
{
2 {. \: c) J) T  _( X4 ]
        int Temdata;% E" y' Q% l0 q$ N

% V$ p" N: J& {& ~' B; W1 a% b
        if(filnam == "") return 0;3 ^7 ]) F* r" v; {- u# F% Q% C
5 Y9 J8 W! c) Y. z* |5 W) @+ o4 p
        fp_map = fopen(filnam,"rb");
$ ]9 n! U& C+ u( b# i0 M$ Q) J9 x

! v0 z+ y: F, F. |3 p6 B
        if(fp_map == NULL)        return 0;( i% v7 @+ W. Z$ l6 y7 u
; S. Y- y7 g, G9 H! `( {
        fseek ( fp_map, 16, SEEK_SET);6 s' d# P0 N8 W; p
        fread ( &ShortWidth, 4, 1, fp_map);1 ?8 @- o' I% l# n1 p% _
        fread ( &Width, 4, 1, fp_map);) ]1 e( W  f/ o' `
        fread ( &Height, 4, 1, fp_map);- I# Y. r3 }0 Z$ n* _
3 n* }7 j# f. C, M! T) ^
        int TW = Width / ShortWidth;
4 I- d( O3 w1 s* X
        int TH = Height / ShortWidth;# H% h0 n; k& ^( c- a6 V: o
* Z! p# U8 F5 Q& j* ~2 [
        for (int j = 0 ; j < Width ; j++)) N, ]' z* x, d8 z7 |1 W  `7 {
        {0 q7 x2 {" _+ c5 y* {! m8 e
                _DELETE_ARRAY(Cell);
& r4 Z5 U7 f/ n5 A* I, j2 b- A
                _DELETE_ARRAY(Role);* ~3 J/ ?" J+ E- u% k) t8 b4 q1 m
        }
: I3 r5 k' R7 t) U" q# P0 T
3 v3 _. \* d; m5 m! Q
        Cell = new stCell*[Width];
0 q. i/ v6 H0 t$ o0 M! z$ Y4 E" B3 F
        Role = new stRole*[Height];: J7 \: h- q# v( t$ f
        for (j = 0 ; j < Width ; j++)7 l% i2 ^2 q/ I' a4 L- ~
        {
1 Q4 B* f0 Z9 k% F: g8 w/ T
            Cell[j] = new stCell[Height];
% i: h4 E/ k. [  g# D2 e
                Role[j] = new stRole[Height];        
8 _: i7 j5 z% y5 C) v" M3 W
        }        / |) p# f3 G6 [9 Q0 r3 P7 W) ~7 l

/ L6 `+ c- b+ Y
        fseek ( fp_map, 28, SEEK_SET);
: E  _1 Y% ]$ @$ _) b

+ m: Y# O4 p3 T# T4 Z1 F
        for (int y1 = 0; y1 < TH ; y1++)
$ y: G) ?" I3 U' j1 [
        {0 h; ?0 \1 B$ n9 R+ C  `' D3 ?0 ~  c
                for (int x1 = 0; x1 < TW ; x1++)4 @% {1 a0 C# A% {7 ^; V
                {
. y7 o0 k1 k6 N
                        fseek ( fp_map, 20, SEEK_CUR);% r  ~5 B. ]  e  X% A" U
                        for (int y2 = 0; y2 < ShortWidth ; y2++)
) `9 [, i+ j" w8 K" N& b
                        {
; e0 ?: ~2 H- F
                                for (int x2 = 0; x2 < ShortWidth ; x2++)
% _9 I; S# h0 z: {8 c1 \
                                {
* g* ~7 B$ i- A# q2 Z9 z% C" i
                                        fread ( &Temdata , 2, 1, fp_map);( B! Z7 L! a& [  R- J, f+ C
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
4 d$ j$ e6 W. c  d1 ?

" t' ?" `/ [' R; @# N
                                        fread ( &Temdata , 1, 1, fp_map);& ]" _% ]* k0 M5 ~
                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;4 c# \- Y- _7 e- U* V4 _
0 L9 P( |& P& d- ]
                                        fread ( &Temdata , 2, 1, fp_map);9 Q' S; q5 j, S# ^1 Z9 I* m
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;3 A  V' |+ g) a( w

% \- |' ?; o% d: ~+ |; k* S
                                        fread ( &Temdata , 1, 1, fp_map);
) k/ u, O+ e$ h% z% P. m
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;7 a2 _$ M/ s8 k1 O: w0 i* Z- O
                                        // 6个字节! H+ R) f3 v- x3 a
; Z3 Z6 M& p3 X  `- o5 r% {$ \1 I
                                        fread ( &Temdata , 1, 1, fp_map);
# K0 V/ E6 X7 ^; z
                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;( Y1 Z& j* S1 R" C5 d5 ]- o
                                       
1 D% I& H, x5 ~! c' v0 `7 Q( N
                                        fread ( &Temdata , 1, 1, fp_map);# k* F/ o. }/ r/ O
                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
, O4 i0 J4 B6 B4 ]

! |. H8 w: D* L5 b( Y
                                        //fseek ( fp_map,3,SEEK_CUR);
$ V. O% I8 @1 w0 h2 t5 x
                                        fread ( &Temdata , 1, 1, fp_map);
+ U6 c, l& Y8 E4 B8 R+ U
                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;3 u9 `/ a. B& ~0 n* I" s' y
                                       
) V( V; b) U9 M% ^& l" m3 z7 a
                                        fread ( &Temdata , 2, 1, fp_map);3 M; L3 o# E# y1 y1 M' e
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
6 B7 b* T/ N2 e( H2 y

7 ~/ J$ Y* c" p0 G
                                        // 1个字节
6 l7 D* z2 Y+ A1 W: X
                                        fread ( &Temdata , 1, 1, fp_map);  z4 I$ N2 _: A7 u+ _& A3 j
                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
% p& ?! B. C3 b) _; z6 ]6 {
                                        //if (ftell(fp_map) > FilZize) return 0;( L# _1 ]$ ?1 P) I
                                }9 B+ P4 b2 H3 w5 Q& t& ]3 s
                        }/ T3 \1 u' t! _7 R* Q- |( F. U
                }3 w" ]+ Q7 [+ Z
        }" I9 {3 C) }" t! e1 O& v$ u" e
  r5 G: i3 S# {) j4 m) U+ i. P
        fclose(fp_map);# F* X2 [6 Q2 d& p! H3 y0 k2 q
7 O& R& _- C# p2 D5 \* ]) R

: O+ i7 U2 H! t
        return 1;
9 I: `6 r- c: X2 V
}

7 \5 Q, n6 A; T3 i6 ?; }0 |, o
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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