游客您好
  • 点击联系客服

    在线时间: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 文件是记载地图信息的文件。: ^& x* B( i$ ]) a; b3 a' o5 r

/ Y6 S2 E  H8 o# Z0 _& F2 H
    地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
* k2 `) O. U* `8 H4 C9 ^
3 O% g2 @! S, K
    第 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 地表一层的序号0 t$ u' h, \- `( b' @

6 E: c5 Y/ l7 c# X- T) c2 l
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
2 w4 S5 D  Q9 L) S
07      在地表二层 12 01 这个大序列下的子序列编号* ^% C  ?" p. @/ X8 o
86      物件层的大序列
: D* Q  W2 Q9 d, K  o- D
00      物件层的大序列下物件的子序列编号
' m- g( q3 [, }/ x& b0 m! m  ~
03 03 00  目前不详# S; u# l5 X0 z# \% A" q" g
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。. O8 A- U3 ?3 d; n* R2 K* @, h

- N) x3 b3 E; ^( `7 n4 B# P' M
//************************************************************
  [' P4 F! E! K  R! }
// 加载地图基本数据函数;! ?5 V+ b4 W, G% U6 x7 ^
//************************************************************0 j$ }) |1 R- A3 ?7 Y' N+ I" U
) G1 K4 U  V: q* N
//************************************************************- n' @% f2 I. k3 B* n
// 加载地图基本数据函数;
3 M0 C9 X9 i6 C
//************************************************************
8 s' h) `3 g  C% H: k

4 I, D& K, h- \+ a% }
int Cmap:oaddata(char *filnam)7 V- p# _2 h( c
{, G* e3 n8 A. u5 j) H/ l+ ?- }- F
        int Temdata;2 a) c# o4 h4 E2 U
5 f0 c! G$ L0 G/ S
        if(filnam == "") return 0;# V' R% P2 P2 F  [/ v; s
, _" O# X$ w4 S" u' f) s
        fp_map = fopen(filnam,"rb");
+ R2 b5 w& G1 K4 n
% r5 F& a: v/ g+ P0 v
        if(fp_map == NULL)        return 0;
9 m& W3 {6 T! r! a% z" ^  u; R
* ?0 w& Z+ Z$ Q) g
        fseek ( fp_map, 16, SEEK_SET);
- [! h5 b. S( [1 A- P
        fread ( &ShortWidth, 4, 1, fp_map);9 ]0 _  g& c# q$ ^' t& I5 u$ A; \
        fread ( &Width, 4, 1, fp_map);" s  U. ~/ g/ [
        fread ( &Height, 4, 1, fp_map);
3 w: o2 |/ N' S/ c6 F

4 O  Z9 s; q3 Z# b% Q, b6 \
        int TW = Width / ShortWidth;7 {" J8 T  i0 f9 q3 u+ c
        int TH = Height / ShortWidth;; k1 ?8 u& N$ {/ Y7 A) e: l* u# @

9 Y3 g& Z% x# G6 Q# D! v. I) L
        for (int j = 0 ; j < Width ; j++)3 I! p; w9 Z$ ]9 B
        {0 h3 i& @0 F7 b3 _) P9 n
                _DELETE_ARRAY(Cell);, ~, \8 b! P8 O' c. W+ x9 A. O4 f
                _DELETE_ARRAY(Role);$ q+ b) L% W# ~3 D2 w- T
        }1 o  l6 F$ F6 A/ t$ C
8 B9 G# L; R) a% n7 s7 {. J
        Cell = new stCell*[Width];
# l; {+ T( }! _6 T5 @
        Role = new stRole*[Height];! x/ K5 e* f" W7 [& m& T
        for (j = 0 ; j < Width ; j++): f1 a; z- ~/ n" F& Z8 L6 n: S
        {
5 J. o( ^5 R- b5 j) H
            Cell[j] = new stCell[Height];
2 J/ s3 ^* Q1 @/ `5 A' }  ]
                Role[j] = new stRole[Height];        
' ^9 ?& a1 G: [# o
        }        
, R8 _9 ]8 n3 n8 L2 M! D) _
: Z) M: ~! ^- N' J* A
        fseek ( fp_map, 28, SEEK_SET);5 x1 o5 A% v; k% f; k5 d. Z  w5 r

3 M) n8 `- K9 E( U
        for (int y1 = 0; y1 < TH ; y1++)
; Z; ~& @: B0 _9 B8 h6 N% W
        {( ?  y6 [* M$ J3 r- p
                for (int x1 = 0; x1 < TW ; x1++)5 }0 W1 g0 T( s) R0 ^2 b+ |
                {
$ s4 c# B; |' A- G) a1 F& l
                        fseek ( fp_map, 20, SEEK_CUR);
1 r: \* c6 \: s1 Y' E) {) q3 |
                        for (int y2 = 0; y2 < ShortWidth ; y2++)
5 I4 }6 {$ Z) d* l2 [
                        {
3 t* U3 |/ ~. P& f$ i% ]' t' H
                                for (int x2 = 0; x2 < ShortWidth ; x2++)
: ]9 @* I5 A) r0 y9 I3 y. r
                                {3 f3 o3 b* M" q2 I
                                        fread ( &Temdata , 2, 1, fp_map);
2 Q# B; t" |( F6 G7 j. o* |# @
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;, e" y- P0 p3 a' b% r
: z" ^1 |) ~" O9 w1 B1 I
                                        fread ( &Temdata , 1, 1, fp_map);
5 n3 \8 z  i% G3 q$ l! j2 H) t
                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
. N  z* h1 Y: ?& ~* b  [3 A

2 ~% l( z- `2 S) z; F' G
                                        fread ( &Temdata , 2, 1, fp_map);2 o) t4 ?% M$ ~  r/ C3 g
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;
; l3 b7 z* D0 D) l0 s
8 E5 y2 B* d6 n+ o' q- C( B
                                        fread ( &Temdata , 1, 1, fp_map);7 E2 ?! S, @/ k1 |
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;2 @6 {) K  [. [  L" F3 L5 \) i; W
                                        // 6个字节! `* E* o9 I+ t3 w) i# O2 n* j; R
0 h- h. q$ {2 J; ?0 p4 c9 Q1 l' J
                                        fread ( &Temdata , 1, 1, fp_map);; C0 z8 f% m$ Q, X
                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;6 j' L6 v  }$ b4 t
                                        8 Z; B: n, Q/ B4 E
                                        fread ( &Temdata , 1, 1, fp_map);
" H% ^5 M* Q0 X1 q- ^
                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
& f2 t3 T0 y9 j1 t# V# B" {
" v" d  `: z' z; _3 T4 B
                                        //fseek ( fp_map,3,SEEK_CUR);
: e$ Q; `: ?# @- b. R$ {
                                        fread ( &Temdata , 1, 1, fp_map);
5 E: W% S, _% g
                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;8 {1 ?* [4 F: m6 |: d7 U
                                       
; U$ P0 M" o; X; P
                                        fread ( &Temdata , 2, 1, fp_map);
8 ~3 S2 o0 r6 S% ]! d
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;4 h8 r- C% h. e, H6 D' }
# t- h5 S/ a8 u  F
                                        // 1个字节
% ?3 l: D& t+ X9 G5 B. k5 r
                                        fread ( &Temdata , 1, 1, fp_map);
% z2 E2 d7 F* V7 S
                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;/ M  n* e4 k7 K0 u6 J9 {9 W
                                        //if (ftell(fp_map) > FilZize) return 0;9 v! g9 ^7 P) ^5 N& X; M5 y' u
                                }
6 Z! q' M/ x. J. `8 P
                        }
# Q  E% R) O# R( G  C* }
                }
& O( R: \; b! |) R* P/ n; Y. \
        }
* ?" b, p$ O( H; W+ u8 p0 Z6 H7 ?

1 y3 Q5 @: C' v# l4 y# f* E+ z# B
        fclose(fp_map);: X. [8 }$ s# f1 I2 X% g$ |3 o
0 l2 i6 ?5 U: u0 r

7 t5 S: r) Q* j
        return 1;. H$ G1 }8 r' w  g
}
% b$ f5 Y' k* S* r: [' ]  F6 [3 n- U
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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