游客您好
  • 点击联系客服

    在线时间: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 文件是记载地图信息的文件。
5 c( b3 V$ M4 H: w; ^$ N
/ z& J3 [: X% i' D, v
    地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。( f/ h" u1 F9 e" C/ W% m& S
3 Q' p. {6 a% I
    第 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 地表一层的序号
) u$ O) m& q5 E

0 h% e3 M' v6 n! ?5 z$ }
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
) Z- A% V/ l+ ~$ K3 W$ j
07      在地表二层 12 01 这个大序列下的子序列编号$ U, O" X& E0 p5 F6 ?
86      物件层的大序列
$ B7 O( E( @: K7 H% n
00      物件层的大序列下物件的子序列编号  q; A1 ]0 @& O1 N8 t( \
03 03 00  目前不详- h1 B. Q4 G9 L( B+ X/ Q( J
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
# A/ f1 \$ x) i* u

/ A7 Y- B. Z# h. s# x" L
//************************************************************. L/ R& M2 Y& x( h3 U7 `  O! [; ?
// 加载地图基本数据函数;. e/ ~* d! V( Y" I
//************************************************************8 r% K9 Q! Z7 s1 K& h7 m, \

7 h( m( X2 B' l
//************************************************************3 F; S& R) @. \3 N9 X
// 加载地图基本数据函数;) l. L8 R" {5 ~" v3 L& S) k
//************************************************************
. R9 B. }9 U, p6 |

7 B  @, V# M0 Q5 R" t% D
int Cmap:oaddata(char *filnam)
" F0 n+ i- C% k5 @
{
. d; \) y' l3 z
        int Temdata;7 k8 H: a* q4 {/ C8 D$ K# g, H
, \3 a9 Z$ m* h
        if(filnam == "") return 0;
/ J( u" |7 Q3 N* E
/ x! T& f! F( a3 ]
        fp_map = fopen(filnam,"rb");, N! z$ E9 L% {+ V- T" Q. D# u

9 S5 D# P  D$ E& C5 H
        if(fp_map == NULL)        return 0;  ?. Y' R! w: k+ Z
/ A& f6 ?3 u; r2 W4 F
        fseek ( fp_map, 16, SEEK_SET);
& X8 Y, |6 u! e& v, t& v" G1 E
        fread ( &ShortWidth, 4, 1, fp_map);
' y5 O4 l8 f) R4 ^: ]% O* N
        fread ( &Width, 4, 1, fp_map);. o4 F) Y  C2 n% e9 d& z' Q/ u
        fread ( &Height, 4, 1, fp_map);
" Q4 A7 a! q2 Q& \* ~( n9 N, }

4 U+ j. T) p% ]7 S- L
        int TW = Width / ShortWidth;7 O: S6 Z7 t/ h- K5 X! J
        int TH = Height / ShortWidth;' q, o; z, I2 ^

8 [# w* f! P! z! t, w* v1 W
        for (int j = 0 ; j < Width ; j++)
  ^# y) p1 K  v. S( c
        {
# T! Y. |  h. U7 ]
                _DELETE_ARRAY(Cell);0 m! k% I5 i2 i( _  B; O$ ]0 ]
                _DELETE_ARRAY(Role);
* r/ b; A% V+ D5 ~) b+ X
        }
' Y: D$ l. |$ ~) z# Q" U- a
# r& N4 D- Q9 N7 _
        Cell = new stCell*[Width];
/ o  ^1 T- h$ K6 `
        Role = new stRole*[Height];+ g: {6 O( D8 H8 c1 L! b6 \' n' n! `
        for (j = 0 ; j < Width ; j++)2 B& ]* U' d+ Y1 Y* F$ g6 `
        {
: \" D! }; r0 H$ x
            Cell[j] = new stCell[Height];
  r: w: w& n$ g; w
                Role[j] = new stRole[Height];        2 o1 P; K( j: M0 n& J! U! M1 R3 X
        }        
2 S- N. \1 c& L5 Q& }

* h$ W; j, i, g8 |7 o" m* H' S
        fseek ( fp_map, 28, SEEK_SET);
. _7 F) a8 ~& f: h* e* v: a0 F

& \1 L5 @  c' ?$ c3 }7 D0 e
        for (int y1 = 0; y1 < TH ; y1++)
! Z+ c) p% Q, b( s. Q. y) ^. ?
        {$ q* g7 n  ~9 S1 H7 }4 [
                for (int x1 = 0; x1 < TW ; x1++)
, Q+ r& ~/ b5 Q
                {
% }0 z5 ?5 @9 Q/ q
                        fseek ( fp_map, 20, SEEK_CUR);
/ w4 C/ J/ u9 Z( K, U# P
                        for (int y2 = 0; y2 < ShortWidth ; y2++)
3 s+ I9 ~1 @8 _4 {# z, c
                        {$ ^8 ~9 m+ {) U
                                for (int x2 = 0; x2 < ShortWidth ; x2++)1 `. {9 Q( v+ E
                                {
/ ?  N; p5 ~& h6 ?+ d6 x
                                        fread ( &Temdata , 2, 1, fp_map);
& d& v' X0 R% B, i
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
7 Z, L: A) a# `9 D! V0 S. g+ W( n

6 P6 D! @' S! J$ e
                                        fread ( &Temdata , 1, 1, fp_map);8 A4 D+ x; @( z. L9 L7 ^" g* V
                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;6 D/ t8 F4 q5 O% c# d8 {: [: j) Z

- c$ }7 Q( R8 K# A( }, l& F
                                        fread ( &Temdata , 2, 1, fp_map);; d5 I3 N, F1 M) g4 C- _
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
" J( A0 B: T' b; x

! x  P; j- r. i3 J5 }% S
                                        fread ( &Temdata , 1, 1, fp_map);
1 |4 e6 F" B3 Z' s4 p
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
, w7 v/ M/ D& s- O
                                        // 6个字节; P4 X& C, R7 g% w; h5 t
/ z1 c" g/ i# m2 F
                                        fread ( &Temdata , 1, 1, fp_map);
4 s3 e7 M) ~' B1 b# X& p
                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;* P* k( u& V' @5 J7 W. e
                                        - L- `4 N, Y+ C& c1 S4 O
                                        fread ( &Temdata , 1, 1, fp_map);
9 X+ w, \4 w- f$ q, V
                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;' c) i. v/ r( u" N

; ^2 _$ k4 b' p) O- F
                                        //fseek ( fp_map,3,SEEK_CUR);& f" u1 m) B" O1 f* N$ \: H) _- M
                                        fread ( &Temdata , 1, 1, fp_map);
$ J. l' z# o$ [/ ^; C
                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;9 l2 z' @2 Z2 B% a0 B
                                        ) R, M) f4 \2 _; V
                                        fread ( &Temdata , 2, 1, fp_map);' @# d8 E$ x- }+ {* L
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
4 m/ I# m$ b, S: o9 B3 X8 A

7 H0 b/ u2 T8 h+ Z. `( m' ^. c. n
                                        // 1个字节
2 w2 R  R8 i: S8 `! S
                                        fread ( &Temdata , 1, 1, fp_map);4 D7 j. s; l) J2 }- D" L1 D
                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;0 ?, h( W0 ~( B
                                        //if (ftell(fp_map) > FilZize) return 0;
. B( E" |) t( ~- @6 A4 d2 K( V/ N
                                }8 u5 q3 n! O( C. T& K( `: ^. y5 \
                        }
  d  ?' }1 r+ Y
                }: X  ?9 D5 ?7 _+ E8 k: w. G5 T
        }( g6 {* V* {$ ^: t
6 H5 C- |4 e& |7 z) z
        fclose(fp_map);1 X2 o: ~- P0 M' J
2 w( D5 Q8 `( g5 P2 V8 P1 S
' |0 U7 H% b+ |1 z! Z
        return 1;
1 |# o8 w4 `. Z) \0 R" _
}
- ~" j1 o6 G( e7 q( V- d
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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