游客您好
  • 点击联系客服

    在线时间: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 文件是记载地图信息的文件。  m' ?6 N0 {' q& n
1 |: F8 E1 K7 q* f, K$ @
    地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。5 X  [8 l2 J) H8 c

8 i1 z9 z5 g$ d. g5 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 地表一层的序号. Z0 }" r, _1 p, Y
( p( B# W" Q4 b
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号6 Y6 F. J; w5 x
07      在地表二层 12 01 这个大序列下的子序列编号" H! S4 f, L* g' }% A2 }
86      物件层的大序列
+ T( w. a( H; \$ T' _! ?6 D
00      物件层的大序列下物件的子序列编号
5 e$ E2 L/ T7 W+ Q+ p  [; e
03 03 00  目前不详
; `* d; q/ z' S! a
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。, ^. l* ~3 s" W1 j+ R# ~
) W4 C+ d" v2 Q6 q$ p- F1 o
//************************************************************2 S3 i0 L" y  ]+ k6 b9 K; q
// 加载地图基本数据函数;
  h' O: V1 `! [, x& a
//************************************************************  @' `, t& Z: w9 V
/ n' a+ ?/ X5 ~$ h" B- N
//************************************************************( {/ s8 s  m" I
// 加载地图基本数据函数;
3 @' L% t8 h- y- S. P1 y/ _: g
//************************************************************7 v1 U' ~# P# b9 M

) ?2 f: U. y+ U* H
int Cmap:oaddata(char *filnam)% h( U0 X8 F4 a2 B. {
{2 W" t) I* P+ }! n% K' I
        int Temdata;
, C& N0 w7 k, Q! O

: ~/ c3 W# F; ^. ]  E
        if(filnam == "") return 0;+ ]# e6 H) v9 r; o2 ?

2 Y# g. S- T% m* P0 H0 \
        fp_map = fopen(filnam,"rb");
' X% Q% O% g! g  z2 ], G8 W

4 D/ R( f- P7 {8 y/ h
        if(fp_map == NULL)        return 0;
- {& E; P( V4 Y" m
5 A% B: `& |8 u3 p
        fseek ( fp_map, 16, SEEK_SET);4 a7 E6 w2 p# F: Y$ W8 \
        fread ( &ShortWidth, 4, 1, fp_map);3 d% D# H/ s& s3 o
        fread ( &Width, 4, 1, fp_map);
; S8 y; {' {( F# P( K
        fread ( &Height, 4, 1, fp_map);
2 z) S0 K/ c" |, F% w

+ O) x5 V7 K' V( T3 a/ o: c  o  V! {
        int TW = Width / ShortWidth;
7 R: F7 \/ N0 A( [( T
        int TH = Height / ShortWidth;
: f$ Y$ m% q" x1 F( O+ E  w

+ @  v3 t7 B2 C8 O1 `6 O; Q; }. N0 r. {- w
        for (int j = 0 ; j < Width ; j++)& \$ F- o5 X! F/ Q+ H  b% |8 ?4 m
        {
) O9 Z! ^8 O" v2 Y
                _DELETE_ARRAY(Cell);
! l# \6 V& S2 i2 g
                _DELETE_ARRAY(Role);
! a/ W0 P  B4 s; t: }
        }; P6 I; G( c& Y0 C

. ~* [  r& o$ O2 T. ]$ v* F
        Cell = new stCell*[Width];8 |) ?+ r+ p. a' K5 f& z
        Role = new stRole*[Height];% b6 C* M, M. R7 ]
        for (j = 0 ; j < Width ; j++)7 [/ `1 G' W4 k( U$ ^
        {8 V' V' a- c8 p6 g5 z1 B
            Cell[j] = new stCell[Height];4 x- y. j- G+ r4 g+ Q7 ]) l1 C
                Role[j] = new stRole[Height];        % S  J; }7 q% o, D' C5 z+ f
        }        * y' t; z9 [; M1 g3 y! P  h0 G: m

( W  k3 ~0 Q: v. n
        fseek ( fp_map, 28, SEEK_SET);
7 }2 @$ C$ t" d) n+ t. n

4 ]9 V+ a# ?5 `
        for (int y1 = 0; y1 < TH ; y1++)
- P2 Q7 ^& Y0 i# a
        {
, Z) Y# b% ]9 ^3 F
                for (int x1 = 0; x1 < TW ; x1++)% c/ @* w- }# A8 B$ k  `" _
                {9 T. O/ ~# Z  E  I1 h9 h8 g. u
                        fseek ( fp_map, 20, SEEK_CUR);
) _5 U$ U( y: Y* ?- |
                        for (int y2 = 0; y2 < ShortWidth ; y2++)
. W8 x* T. P* Y: \4 C" r& E
                        {
7 h0 O# x9 }9 H/ L: V* ]2 f$ U# L/ E
                                for (int x2 = 0; x2 < ShortWidth ; x2++)
5 E. I# n/ H) X% c: ~7 b
                                {1 o' h: _2 K$ E3 n2 j8 J
                                        fread ( &Temdata , 2, 1, fp_map);
& X% d: W8 l* Y* h6 d
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;2 I; r" l+ ~7 E$ I5 i  ?) P' G

8 E1 t4 G8 z# o. W
                                        fread ( &Temdata , 1, 1, fp_map);
" D3 B- k4 w7 W* d( u
                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;8 \; K* x& v; D  U+ ~
4 P8 M( ]  s; {& P
                                        fread ( &Temdata , 2, 1, fp_map);0 B* N. C4 F  g' @% s
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;5 D: Y" P  B( B
: E7 W  W+ j1 K$ ]$ l8 ]
                                        fread ( &Temdata , 1, 1, fp_map);7 |! ]+ N/ q7 t0 ^; a
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
7 Q* v/ O" ]& Q9 a4 n& M3 B
                                        // 6个字节+ Q6 ^2 X8 I3 s3 q& c$ H" E6 s
' v; L+ S$ Q" @
                                        fread ( &Temdata , 1, 1, fp_map);
0 z' B+ x7 O' Y4 N! A% V
                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
5 f) `. G7 u7 c4 [/ K
                                       
9 |5 B+ R- A+ p! M9 V
                                        fread ( &Temdata , 1, 1, fp_map);* J* K$ P9 r' {) u1 c. Q
                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
/ a+ T0 g$ F: l" D" E0 x0 E0 u4 {
. N/ [, I3 U6 `8 y
                                        //fseek ( fp_map,3,SEEK_CUR);
2 x/ U% s' d: d' k/ D
                                        fread ( &Temdata , 1, 1, fp_map);" c& [9 z" {' ~
                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
; A# E- y5 n" w$ w
                                        # u) |4 x) d; P/ j, w
                                        fread ( &Temdata , 2, 1, fp_map);" [" Q. A7 X7 X7 {4 X) j( H
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
; g# L3 X3 X4 d7 j: l& E
' ~6 x  X* V3 q) w
                                        // 1个字节: P" Q2 q& d( G, V7 ?6 z- t$ ]+ X9 s
                                        fread ( &Temdata , 1, 1, fp_map);
: Z% {; D1 q* c3 g2 E/ b
                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
2 J* L- M. r) N% J
                                        //if (ftell(fp_map) > FilZize) return 0;
2 I& ?- g( G0 {6 L6 j7 ]: [  `+ r; A
                                }$ w2 B: Q  O4 D
                        }
! x" M; F: S( e5 z  ^2 G/ ], b7 H
                }
' O4 ~5 ~- `* q% L
        }( R. d$ Y0 T' p% o; e

" c, s! b2 s. p  O1 s. h
        fclose(fp_map);
$ P: c1 c6 k  o! W% S  t
- F! G* T# s/ J2 e1 a
% b* f2 C5 Y* X* P) W" n
        return 1;
% b6 O7 {% h2 r/ M
}

: F: n% n  X" S: I7 [( K4 Q" A2 ^
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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