游客您好
  • 点击联系客服

    在线时间: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 文件是记载地图信息的文件。, |! Y# z- s! F: f& B# H' i

" K+ c' H% Y$ x9 ~5 P/ J
    地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。" d7 p4 \: u8 \- R8 U; z
: J0 E. ^! w/ W: S! M% 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 地表一层的序号
, O' [1 f' V- C

/ h/ H! t1 H, y
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号" Y0 w0 B2 U" D0 @4 n
07      在地表二层 12 01 这个大序列下的子序列编号+ M6 x; B- N- m+ j7 j# ?
86      物件层的大序列# _3 l- C4 d6 X8 \
00      物件层的大序列下物件的子序列编号
! ]4 D% F& L) E  ?' G2 S
03 03 00  目前不详
+ D$ v; K  D! @: ~" ]
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
* e# N6 |8 D* e! T8 p& u: n3 S

& g- Q" q8 \4 n9 f
//************************************************************7 U  k/ ?* z( G* V
// 加载地图基本数据函数;
2 U& S! i" H! v8 M6 q. c
//************************************************************& ^  ^+ N3 l7 [( e' b

9 J( x2 Q/ w% P9 R' Z
//************************************************************  |" B2 F) L/ X1 q. q. S9 [
// 加载地图基本数据函数;
' {' d' f0 I4 [( e
//************************************************************
# {1 e- M  t- F5 N8 N6 J
- M5 K, K5 F% D1 ?
int Cmap:oaddata(char *filnam)
  Y/ |1 x. d4 m4 H$ J0 Y
{4 ?0 Y( O1 V5 O( G% C% ~7 y
        int Temdata;5 e. O3 i* g, s+ Y: J0 G% L' b( z
' p. p9 n4 \$ Y% P3 h
        if(filnam == "") return 0;
7 e# d4 I, J5 e" ^6 l# M; D
2 z- i& Y( w  ^* ^& S1 n& c+ E0 ^
        fp_map = fopen(filnam,"rb");
; Y5 a* J, A" H0 N' r: `

0 H/ k  ?1 ^6 L; a" e
        if(fp_map == NULL)        return 0;" M3 m5 ^6 M4 {* q2 F; d4 D

& G1 q& M8 @3 y. @# q# N
        fseek ( fp_map, 16, SEEK_SET);, E* k5 @/ h- _' ]" R
        fread ( &ShortWidth, 4, 1, fp_map);; N, F) ^. }% u
        fread ( &Width, 4, 1, fp_map);
8 ^, Z3 B0 `7 g5 ?0 q
        fread ( &Height, 4, 1, fp_map);
+ E0 Y& z/ |! i3 O' n
( N! u: |" D! T2 u
        int TW = Width / ShortWidth;
( w+ S8 f2 C3 P2 f7 D4 @; a" e
        int TH = Height / ShortWidth;
' O. G" x+ r- s) c3 c: \% g  C- b3 b
5 y" U! n6 M1 t2 g9 S
        for (int j = 0 ; j < Width ; j++)
! E# m% s9 _' ?) G" ^/ N1 R" U
        {% Z! k" Q4 f# Y' F+ n
                _DELETE_ARRAY(Cell);
+ u  A/ G& D% F) ^3 M
                _DELETE_ARRAY(Role);- g0 l# f, q: s" W0 c" |$ P
        }2 u6 a" _. f" Q% H+ V
- M5 f' r* F8 k1 I
        Cell = new stCell*[Width];
) I7 g9 Y' \1 E7 i7 y
        Role = new stRole*[Height];
5 i" R2 ^& p5 f2 X" Q: a
        for (j = 0 ; j < Width ; j++)
6 b7 H5 o% c7 |3 S7 a6 P5 `* Z# Z
        {3 q% M* N: o  E" L% K
            Cell[j] = new stCell[Height];* T' N( n& \: R1 j% Z
                Role[j] = new stRole[Height];        
& x" `7 l% x* Y5 P& ]; g4 A
        }        
* m8 H! ^, n- [$ R% e9 L  ^2 {
7 a1 G) A" H3 a
        fseek ( fp_map, 28, SEEK_SET);
) ~  o# H8 f9 C+ |6 H5 w

$ M% n! x8 Z8 h& V- O
        for (int y1 = 0; y1 < TH ; y1++)
0 X) N6 R7 N4 {8 a; S
        {# a0 d' L$ o+ O" h+ E% s+ }
                for (int x1 = 0; x1 < TW ; x1++)$ h. R% x- ~3 }/ [
                {
) ~* V$ ]7 X3 r, K
                        fseek ( fp_map, 20, SEEK_CUR);! L+ f& o. G3 T5 ?3 \1 D* [+ r
                        for (int y2 = 0; y2 < ShortWidth ; y2++)8 v% q7 }/ p5 O  P* ^! G
                        {3 {' S5 Z# M9 v/ c7 N5 W
                                for (int x2 = 0; x2 < ShortWidth ; x2++)  U; B  P# d- ^; c, f
                                {
. |, Z: o' c. t/ c
                                        fread ( &Temdata , 2, 1, fp_map);' i) ]5 U' q/ t
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;2 G/ e) Y3 F8 F  ~

4 v1 k5 [( E( T4 }. h2 i( r, k
                                        fread ( &Temdata , 1, 1, fp_map);
; x- M3 s9 X( V9 p! W
                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
, P2 L7 _6 g9 M" P

/ `! S% \# u1 t5 W" j
                                        fread ( &Temdata , 2, 1, fp_map);* o) A) I+ J& W8 `* O
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;7 P# M0 v# M2 o( e+ c7 V

* @/ a0 I" F3 G
                                        fread ( &Temdata , 1, 1, fp_map);6 h+ j! z; D1 {" X/ e
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
5 M* ]3 ~! x1 t: ^3 n& M4 w
                                        // 6个字节
+ m7 D/ D+ a+ S# |
. U' c0 E4 t4 d
                                        fread ( &Temdata , 1, 1, fp_map);" B! o, {% a3 K# v9 z
                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
: n8 B0 ]& x( @; \+ w
                                        & _: E2 X' c9 A. a" p
                                        fread ( &Temdata , 1, 1, fp_map);
0 k" I2 `# ~  S& k* a
                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;
5 u* a& v6 L% Z/ ?9 E  p: r
( ~- Z! R0 e8 D3 Q( T: L! [
                                        //fseek ( fp_map,3,SEEK_CUR);6 Y0 @1 m7 {! W5 H' Y9 o1 j
                                        fread ( &Temdata , 1, 1, fp_map);+ P/ q% j* ?6 q5 ?& L4 G7 J
                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
8 z, }5 Q- X2 G- L/ E4 h
                                       
, O! i) n, J: I" s: x% Q
                                        fread ( &Temdata , 2, 1, fp_map);
3 `+ `4 D5 Q" N8 L
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;" V8 O! @' |7 c& Q& W
1 F. h7 X  \9 H. a: o
                                        // 1个字节6 G( y! z+ V( T4 W' s
                                        fread ( &Temdata , 1, 1, fp_map);- C0 ~, n" [) O) C9 N' z
                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;" v7 C1 m. N. k8 T- x7 q, Y1 U
                                        //if (ftell(fp_map) > FilZize) return 0;
2 a- w% v" |7 V) }1 o
                                }
  b$ {5 Y% ?/ d* S2 n
                        }
8 M  B& L8 f) N3 t
                }
  z3 p7 K9 k( C$ V: e) Z
        }1 {% v8 f4 K* K. }$ o
/ H) L1 C2 A. V/ h! \. k
        fclose(fp_map);
2 q- G" c% i! B9 b( r

+ U( \) B- ~- W8 i
9 ]3 a! f" |+ A1 o
        return 1;
- i% l0 F) l8 l
}
) r, E! j5 m' o/ M; F3 T
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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