游客您好
  • 点击联系客服

    在线时间: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$ u* t) p: P' f
5 h* H* X! v* A0 H) v5 b/ L
    地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
, C9 U! D; Y% X/ u  p: |7 i* j& B' N
& H: a7 X0 Y4 H' U" T/ n% C, O
    第 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 地表一层的序号
- `' G8 G/ A1 z, ~2 O
/ c+ g4 `1 ~& E$ f$ h9 l3 \
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
8 Y5 N& _4 o* u) M
07      在地表二层 12 01 这个大序列下的子序列编号
1 t  b& z* ~6 D9 _  Z! }
86      物件层的大序列) Y6 j$ u1 R+ _4 M6 F5 Q1 Z' u  P
00      物件层的大序列下物件的子序列编号
& `; [' v. l& m; U: A8 {- x( o
03 03 00  目前不详) P9 ?: k; i' g* R; x
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
( ^" V3 j: F, J% E

' G7 `6 z5 O  ], ^. K0 F4 H
//************************************************************! N- I- ?/ ?7 h3 h6 P6 J6 O
// 加载地图基本数据函数;
% M; c, H! G2 B9 g! H4 [
//************************************************************3 f2 _/ d" v2 ~, e3 @/ ~* T

. c  u4 w. t' j) ]
//************************************************************* _# U! N5 D* c0 E' Q
// 加载地图基本数据函数;9 u) D6 W5 |3 a9 @; Z5 u
//************************************************************
' @7 L* k! M2 t0 C: ?+ q, S

! u5 x, M# p1 o; n: D& u
int Cmap:oaddata(char *filnam)8 h0 j* o( \1 ~" Y( h5 v
{
- ]- k) I8 F% E# `
        int Temdata;
+ R' |( i5 l/ b3 d3 \
! J  ^0 ?; J# s4 g9 z
        if(filnam == "") return 0;7 f+ w6 m: |) A0 Z9 I1 U0 b& a/ a3 b
$ u! y. y3 y9 N) R2 e- y1 f5 |7 `% q& H
        fp_map = fopen(filnam,"rb");
/ b5 o* n  f; o! M- J+ h# ?
5 a# t1 j: t5 ]( N% k
        if(fp_map == NULL)        return 0;) J8 w/ u4 G$ F

, i$ g3 N+ s! M' i* [! z$ e
        fseek ( fp_map, 16, SEEK_SET);
! r# t7 f5 ~( v
        fread ( &ShortWidth, 4, 1, fp_map);4 l1 l# `" U& a. d% U/ ?$ ~5 t" m
        fread ( &Width, 4, 1, fp_map);  V) H8 [: {6 a# I: c
        fread ( &Height, 4, 1, fp_map);+ G2 J/ _* U! q! w2 B
. R2 V- T" |/ t9 W
        int TW = Width / ShortWidth;
' E6 T" D. q* n& C
        int TH = Height / ShortWidth;$ N+ f2 D8 J) h* n

5 _, |  b- r& a; F4 A. o5 Q* K
        for (int j = 0 ; j < Width ; j++)- K4 {1 T9 ?& P" B/ F  C
        {+ {& R* Q' H2 h6 ]5 A& k4 J
                _DELETE_ARRAY(Cell);
8 H" s" D4 S/ M. ]( E( Q
                _DELETE_ARRAY(Role);; L1 \: B: ?3 y7 a' m5 u. T
        }6 j- B9 C# a! K$ X. `7 F
8 k2 ^& H) V! y# s, X9 z, j2 |
        Cell = new stCell*[Width];8 V" H, F1 f$ n3 j" n" s. J
        Role = new stRole*[Height];
8 `, q8 U' ^( H% `+ M: Z. w4 u- j
        for (j = 0 ; j < Width ; j++), g/ }; i0 h5 ]0 B
        {
# {: t- j6 ^$ K$ x2 z  ?1 P
            Cell[j] = new stCell[Height];
" O  m, B! l8 {! F8 v7 D
                Role[j] = new stRole[Height];        
; E8 D) b9 K  z+ h$ P9 o
        }          E$ i0 @* j5 H5 V- y' L

6 q3 K! u4 i1 d! A6 Z
        fseek ( fp_map, 28, SEEK_SET);
7 v0 R6 ~) D  y& a

: ?; z; ~7 [3 |- M. Y: q8 u
        for (int y1 = 0; y1 < TH ; y1++)
! C$ ?5 ~9 N' f' W: n
        {. I( `% m: D! s  {
                for (int x1 = 0; x1 < TW ; x1++)
/ A5 h" m- D& m( f
                {
# R- p/ l* ]1 d
                        fseek ( fp_map, 20, SEEK_CUR);$ [# m' h! s* c3 x& F( J& a7 d
                        for (int y2 = 0; y2 < ShortWidth ; y2++)
  F7 ]5 ~8 ^6 t, N  U
                        {; Y$ `, L2 ]5 \& C
                                for (int x2 = 0; x2 < ShortWidth ; x2++). {2 ^2 h) Z2 q, a& x$ j
                                {
9 y6 \" F1 R/ z$ I
                                        fread ( &Temdata , 2, 1, fp_map);
/ x2 Y& f; N3 z% L8 H. M
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;3 p" b, a# ~% G, W0 B( w5 q
* q5 |+ I1 h. X) q0 K9 }* i. t
                                        fread ( &Temdata , 1, 1, fp_map);
0 G! M3 J2 _/ m2 l) G
                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;
6 a7 R' R& Z+ ~4 u/ A; K! [+ p
) P: t) q) b( Q: p5 f8 e5 Z
                                        fread ( &Temdata , 2, 1, fp_map);+ o+ w+ t; M* \# n- e/ O; T
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;7 o+ H4 h+ ~1 c! o5 ^2 U" x

5 I. K; F! o, M9 a( U7 l
                                        fread ( &Temdata , 1, 1, fp_map);
2 D+ D1 h1 }& P# z# G' V
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;3 B( q1 z0 g" P. z& I
                                        // 6个字节+ O5 }+ x: }9 B4 [2 l

# f' c2 E. D' z* D
                                        fread ( &Temdata , 1, 1, fp_map);
/ N$ W/ v' G1 i0 t) J
                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;
1 r9 Y# f8 F( f2 ~9 Q& x6 Z
                                        ) Z& u7 |/ o- Y) l: ]
                                        fread ( &Temdata , 1, 1, fp_map);
0 {, [7 f, R* Z5 ^
                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;* ?4 J3 N6 Z$ c

, q; Y- U5 R4 g/ E- i
                                        //fseek ( fp_map,3,SEEK_CUR);
) h0 D+ e+ A9 N6 a
                                        fread ( &Temdata , 1, 1, fp_map);! ?+ g0 Z, ^) p1 ^& z; I7 V
                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;/ l) o! ^. e1 p6 ?+ Y
                                        3 R. L; q% d1 k& F1 D0 W% u
                                        fread ( &Temdata , 2, 1, fp_map);% ~( ?, s* L  E$ m
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
. K5 d6 ~) P" b. j$ j
! U; E2 i9 |* o, A9 P
                                        // 1个字节! Q3 n+ \& k1 ?8 f
                                        fread ( &Temdata , 1, 1, fp_map);$ k2 _' ^9 V, U" L
                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;; Z+ @' u% U# Y% v- F, l
                                        //if (ftell(fp_map) > FilZize) return 0;
* c7 a; `1 l8 ^. q8 ?- r: B! i
                                }
5 I+ k6 D9 v8 e3 d" S6 o/ v
                        }  f  F3 O; H$ z2 T+ B
                }$ ^/ R# ?0 v. h/ T; g8 g
        }
. z7 V, G9 w: M9 M
4 k$ V4 A  r: w+ I
        fclose(fp_map);6 \; b6 w" n9 [: e

. s! q: {$ B% s2 ^6 Q; ]( G
5 N7 A2 ]3 A( i+ e4 M5 R
        return 1;( c( x7 z! a; v9 U0 O! |
}

" ]9 ?) `$ l6 P/ z* X
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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