游客您好
  • 点击联系客服

    在线时间: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) x5 U, y% s1 R1 e2 u3 X

' v/ f; m/ W4 A' Y  K
    地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
6 \  ~7 B& s4 ?- W. {
7 @5 B0 X2 \3 L$ t- E$ D, ]+ m) h
    第 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 地表一层的序号1 D# ?& w5 M+ r4 W' \7 n
4 s4 B. S# |* S4 B
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
& f0 m- T$ \/ M
07      在地表二层 12 01 这个大序列下的子序列编号
. _' ?/ I# Y: d# q' h+ b
86      物件层的大序列- q+ I7 N% N  K8 F
00      物件层的大序列下物件的子序列编号3 H6 _6 p* `1 ?( `* V+ n
03 03 00  目前不详. B1 Q2 y- J/ z) |
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
9 G9 f$ t' W* ^. [1 M

, j9 U- L. @; G5 m6 W
//************************************************************0 v  P% B1 c2 U! ^% o
// 加载地图基本数据函数;
9 q* Z+ F. b0 L" J6 v
//************************************************************
# I: F; m4 }/ {% T
# f0 b! g1 G) W. B& S; P
//************************************************************1 ^0 T# k! f4 ~* k
// 加载地图基本数据函数;
% {4 g4 Y  I& X- j$ _
//************************************************************1 M- {- f1 J/ j

; [3 U" q8 _  t) o$ ?. N3 m
int Cmap:oaddata(char *filnam)
5 Y- C& w6 {$ M" _5 O
{
; M% K; L5 f4 b* @+ f
        int Temdata;
1 [  O% y- M; h, A! X

/ M, i- Z3 H5 ?9 U+ Y! V8 Q0 D
        if(filnam == "") return 0;2 V8 H$ u0 ]4 S" {* ~. e9 |! {2 m
+ j- D, T; O% K3 r
        fp_map = fopen(filnam,"rb");
$ Q+ }9 g4 B, V; W. y; j

# c; Q; c  x: ~8 K* Q" U0 B
        if(fp_map == NULL)        return 0;
' Q* Y* o  T# _' T) q2 ?: k1 M+ ?  Q$ a8 G

" S& C, j( ]. u
        fseek ( fp_map, 16, SEEK_SET);" l3 H$ f) ~* D& @# q
        fread ( &ShortWidth, 4, 1, fp_map);
+ E6 Z5 u; M$ L* e& _
        fread ( &Width, 4, 1, fp_map);
* R' @5 w# r7 q8 s
        fread ( &Height, 4, 1, fp_map);
) y. c% L) s  {7 `

" u6 Z8 E. w% |! ^2 Y: H1 b6 G
        int TW = Width / ShortWidth;
. D+ L1 l: S+ j2 K! l8 u! |; |
        int TH = Height / ShortWidth;+ F$ T9 W& I, \5 p, ~
: Z# q. P' |! n8 b
        for (int j = 0 ; j < Width ; j++)( k5 N8 A$ v3 o2 x* D
        {% O: N5 l" r& d4 V" Z; _; v
                _DELETE_ARRAY(Cell);- n0 [$ D; ^. S8 A6 n# o+ V
                _DELETE_ARRAY(Role);
4 [9 L! P, u/ n
        }0 z9 k# \' n/ A6 }1 r5 S

& G! }4 A5 s# v4 W: s5 a
        Cell = new stCell*[Width];
) e  q8 i2 }3 I4 H( S
        Role = new stRole*[Height];9 l$ p: ]! p( X- ^3 |: r
        for (j = 0 ; j < Width ; j++); d; t- R) K9 g9 j( e8 V4 P
        {! ?0 q3 c5 g! L9 V0 D6 T) o
            Cell[j] = new stCell[Height];
7 R2 E+ Z" `) }( Z( k( H
                Role[j] = new stRole[Height];        
2 Y: J" {- }, Y! C  L" I* H
        }        
1 F' A" J5 e; K. s
$ N( P) m% E! [  ]" u  e6 A' W4 p1 Q- k
        fseek ( fp_map, 28, SEEK_SET);
8 K, m0 z# ?% N4 r# ^' E

4 Z9 O: x' t3 H' o# K
        for (int y1 = 0; y1 < TH ; y1++)
" ~# P' u- M' ?) H. k4 L
        {
. ^2 R0 M! Z! E/ e% L# B7 I6 n% g
                for (int x1 = 0; x1 < TW ; x1++)
- S( _& S  J* R8 x; X2 A3 f
                {
2 U  ^% C) j' [1 |
                        fseek ( fp_map, 20, SEEK_CUR);0 l) J! }7 P0 b) `+ D, |& k
                        for (int y2 = 0; y2 < ShortWidth ; y2++)
2 g, w% S7 |" U+ ~, T0 _
                        {+ h4 N+ Q1 q, J* A9 o5 Q0 Y) F
                                for (int x2 = 0; x2 < ShortWidth ; x2++)) j' R. ?2 w& V5 ^( f( r, P6 f
                                {
8 }' F' t' \1 ^- a2 `4 G" C
                                        fread ( &Temdata , 2, 1, fp_map);
  O- R* ^' G' M* i% J$ a2 |
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
+ v: ]/ k) s/ o+ d+ _6 |2 t
8 Y- Y+ R1 p* ]( u5 o
                                        fread ( &Temdata , 1, 1, fp_map);, O4 E+ k" K5 }) c8 i0 z
                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;% {% C0 k- X/ i
, v  |- i; y. `+ Z8 D
                                        fread ( &Temdata , 2, 1, fp_map);; `! L$ W2 t" v  s, y
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;1 w! c8 C9 Z0 }, a' f
, E( _2 y) N$ s' y) t
                                        fread ( &Temdata , 1, 1, fp_map);
5 L# P6 i2 ^5 W8 f9 G# X; b2 T; [- @9 X
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
3 K/ W8 _/ Z5 a$ J5 N: ]
                                        // 6个字节
+ `* z9 X9 {& e* s2 D

' G; m# y/ t* ]
                                        fread ( &Temdata , 1, 1, fp_map);- x0 D7 K4 T: z. g9 g5 Z
                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;1 n/ i# d* g& A/ E: @$ D4 O* A
                                        - l% r# Y5 |7 C8 o( ^# ~8 P; Y% Q
                                        fread ( &Temdata , 1, 1, fp_map);# a$ L% u  B/ k. V. _) Y3 g1 x
                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;* r/ |! d, b5 s% i3 v+ m8 \

8 [( S. y, B3 ]* X6 z
                                        //fseek ( fp_map,3,SEEK_CUR);
  c; U+ o; W; H$ }
                                        fread ( &Temdata , 1, 1, fp_map);
% w* v" @5 ]" Q7 `
                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;
0 N2 F4 R: B8 k; ^  ?  w
                                       
& [! q$ a3 y) H+ [0 A9 O
                                        fread ( &Temdata , 2, 1, fp_map);
: V& k2 p- ^3 Z, b
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
0 ?# t1 G, c* c$ m: V
# t2 R8 r$ h6 `: ^" A) G8 z9 R
                                        // 1个字节
, k' a* |6 F7 a, c. X+ ?& Z$ l
                                        fread ( &Temdata , 1, 1, fp_map);
) I+ \6 K8 Z* K! o6 s; Y/ ]  A% b
                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;
9 K. I4 D8 ^# v# R
                                        //if (ftell(fp_map) > FilZize) return 0;
  v# T0 D1 @7 t, `
                                }
$ ?% A# t+ v: a9 J
                        }
8 C0 L* A6 ^, ^+ k! ~, X2 Z* M+ Y
                }
8 ]- W/ ?0 t& O0 |5 m: J6 ?3 _
        }
8 f* ^# ^; m! A* K5 U9 O& G9 w

8 C# U9 Z/ u, Q9 S: ^2 G
        fclose(fp_map);
: a; a" b% n$ H3 V' ?( z

3 X+ ?6 }( Q6 H5 X' r

! R; \& {. r5 Y5 @( e
        return 1;
* G3 Q$ K5 x$ q) ~  w4 W! F
}
0 g) O) g" _- S3 {; O
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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