游客您好
  • 点击联系客服

    在线时间: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 文件是记载地图信息的文件。, `" m8 h6 G" |8 O

- ?  g* n' e: Q3 g( _
    地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。) i  J  w2 q( L5 N2 R3 G
, F$ l; V4 |4 m
    第 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 地表一层的序号; \2 u" C$ F; r* h
, a% j2 n# J, u0 N( e/ q; [0 K$ z
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
  M+ g; c8 Z7 v4 l' R  v
07      在地表二层 12 01 这个大序列下的子序列编号& @5 O8 }* n! w" f8 W3 B
86      物件层的大序列' {/ |  m- A4 T# ^
00      物件层的大序列下物件的子序列编号4 _+ S  y# d1 ~' P, m: h) x
03 03 00  目前不详
( V% O: _7 o7 E+ C/ A: b. k
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。/ ~$ p% p+ Y" }' Z' d2 ~4 o
9 q% N6 M* p, Q! a* @+ ^5 [0 k
//************************************************************
5 p$ [) h5 s, Y. T9 N1 r. B
// 加载地图基本数据函数;% x/ L* z8 G8 L' y6 J
//************************************************************
) \# Y/ j" z8 `1 Y
: Q" F+ R; n0 g
//************************************************************8 U8 G# _% v6 b! G" C
// 加载地图基本数据函数;( l0 {: g+ g* H' o( I
//************************************************************
8 |" U2 ~1 L7 s$ X
! X  g) L) |! y8 `
int Cmap:oaddata(char *filnam)
# w, ?- J+ l( {9 D5 [
{
: F% t$ {( ?: s% N  l% h: }4 \
        int Temdata;9 Y) G$ s) l" F

( O% ~6 n( ~6 N' f
        if(filnam == "") return 0;9 n" G/ i7 d. n- y6 s  o1 \) B

2 R8 n1 r9 J5 |" O  d5 k! Z5 O
        fp_map = fopen(filnam,"rb");4 D1 ]1 {7 Q! G/ c8 g

* u7 A) _9 _* t- x$ \
        if(fp_map == NULL)        return 0;1 j8 T6 l7 [$ q, t0 ~. x

$ f* K2 {# W7 C& w
        fseek ( fp_map, 16, SEEK_SET);2 J' C- ]6 |2 q; {2 `/ h6 J. e# d
        fread ( &ShortWidth, 4, 1, fp_map);
  g/ s8 i: x  T7 Q/ G* f/ M7 d) |
        fread ( &Width, 4, 1, fp_map);- \2 }" \9 ^$ i* t
        fread ( &Height, 4, 1, fp_map);1 X" T2 o5 A1 ~2 k" k0 T4 a

* k# h/ [/ N' @& _: U. y" n
        int TW = Width / ShortWidth;
% T# \5 v3 ?  s; H+ q2 t
        int TH = Height / ShortWidth;
7 a( ^% F) f4 R
4 b. d6 |/ G. W+ w& Q4 R
        for (int j = 0 ; j < Width ; j++)
) Z) d3 _  N/ |0 W0 _' C1 ]
        {4 L3 ]" W3 O6 ^9 [; w# u: i
                _DELETE_ARRAY(Cell);
* q6 S- d/ J) B+ o
                _DELETE_ARRAY(Role);& g0 S5 I8 J5 e; h# }7 ]. U
        }
) _/ T/ p4 H$ Y8 \; U" [6 ]
- @4 ~4 Y# X7 c( T" K
        Cell = new stCell*[Width];9 ^  T. K3 {+ E5 I# g( @
        Role = new stRole*[Height];; O4 i: O9 E' \9 P; F7 }
        for (j = 0 ; j < Width ; j++)$ O, x; @. v; u1 F; {; G# N0 f* [
        {
2 f! d/ s* t6 K; `, p4 y0 J: \
            Cell[j] = new stCell[Height];6 ~6 D+ [1 P5 Q: ^9 f
                Role[j] = new stRole[Height];        
8 U4 D- K  r/ W6 ^. @
        }        
) k" f- s- _# ~% ^

. e: X' M1 Y# U* V+ U
        fseek ( fp_map, 28, SEEK_SET);1 [  F: y# c" _6 Q. w3 o

7 K4 t) j5 ?. O2 m' R
        for (int y1 = 0; y1 < TH ; y1++)
  |( B  W. B' m: D2 [( ?
        {
, ]$ b# D" @6 S: W$ P1 K, p- c
                for (int x1 = 0; x1 < TW ; x1++)
0 L: ]/ S- h1 R( _: d8 r
                {- `( D# t. F$ I( B" w. a9 _% d
                        fseek ( fp_map, 20, SEEK_CUR);% B# U0 f- e' b3 K/ |- h
                        for (int y2 = 0; y2 < ShortWidth ; y2++)7 E0 f9 R1 y) N7 }2 R; R* v4 p5 X
                        {
& K0 B) s7 ]: t& X% M5 z
                                for (int x2 = 0; x2 < ShortWidth ; x2++); W. T6 F6 |4 G: A
                                {
: z) D0 s3 b% o6 l
                                        fread ( &Temdata , 2, 1, fp_map);  @- A$ |* @( h5 |
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
, \. c2 j- Q7 d) h* c
' P+ h9 i  U! ?' D9 F
                                        fread ( &Temdata , 1, 1, fp_map);
: U, W( L, `  D
                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
- z4 h4 W; k" v1 ?; p3 b

8 j8 h& V( o( k! v% E! _+ q% U* }
                                        fread ( &Temdata , 2, 1, fp_map);8 ?, I; W7 b1 O4 j) m
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;- r2 A8 n1 l8 m9 Z5 {5 P
$ ~. w, I3 ]  Y! p, z
                                        fread ( &Temdata , 1, 1, fp_map);
- `( u3 ^. C  C% B) L) T
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;, a: q# s- q' Y
                                        // 6个字节
" v( r) o# h0 t! h0 G8 C8 O

' a6 X9 T+ o1 _4 M: v$ c
                                        fread ( &Temdata , 1, 1, fp_map);$ x/ q( b! Z& R1 k% u, p7 x4 f) v2 q
                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
, K( d5 E' Y# X& _' x. F
                                        9 z% H+ R  Y: y( c" V2 A3 S
                                        fread ( &Temdata , 1, 1, fp_map);
# _) V7 B+ e9 D. p/ ^+ I
                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
* Y# r$ J4 s6 z5 ?. p
; O2 T7 w8 P; \& }0 b! n
                                        //fseek ( fp_map,3,SEEK_CUR);
6 @  R5 y3 x6 S: ~4 \* v! r; ~
                                        fread ( &Temdata , 1, 1, fp_map);: b; y0 d5 x* G
                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
" O' I* z2 S" R0 n/ @
                                        & b# v- c5 e1 h9 g
                                        fread ( &Temdata , 2, 1, fp_map);
4 C) U2 X5 r5 S6 R4 W* K
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;% @! ^8 D/ J3 b" I% \' [4 _

; B  G& ^5 r; R9 A
                                        // 1个字节' J: _9 X) V2 s9 w6 ~8 K
                                        fread ( &Temdata , 1, 1, fp_map);
  t' V8 {1 f$ Z' j- n6 y  E
                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;5 B: g( Z4 k+ Q) k( C# j
                                        //if (ftell(fp_map) > FilZize) return 0;
( |) X% i7 p. t, ^6 i0 o
                                }$ |' {  N) E# K0 c4 N* i* I, ^( E" Y
                        }
5 f2 R! r8 I- V: Z7 `# U8 z
                }
( `/ d6 P- l4 T6 ~' ~4 O, C. j* t
        }
/ ]3 m$ Q: N5 O. G
; R9 }% @0 N  ]% Q1 f! z5 v
        fclose(fp_map);
- F2 \5 Y5 {3 Y8 o- J2 ?6 R: {, P
" v/ C, d5 s& c% H
4 j3 o, H7 i' y! D$ q# P$ d8 t: I
        return 1;& W8 N) d* k+ n3 g5 i7 A7 _
}
+ O4 v% b; |9 _' r
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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