游客您好
  • 点击联系客服

    在线时间: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 文件是记载地图信息的文件。% ]+ l# L" i6 I0 v3 n% x
$ R. I" K# M9 f% Q0 @
    地表层是由“地块”组成的,地表层共有 2层,一层是实际的地表层,这层里面是草地、沙漠、土地等组成地表的基本结构。
; e! `* T! z. E

% F7 c7 Q% r& q& @5 f) c
    第 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 地表一层的序号
: N$ \0 Q6 U- o2 @
9 I0 k6 @! b5 G
03      在地表一层 13 00 这个大序列下的子序列编号12 01 地表二层的序号
% A  I" {7 T) N# C" }; R
07      在地表二层 12 01 这个大序列下的子序列编号
) [9 c, J/ ^$ ^/ c7 `' z
86      物件层的大序列
2 ^9 k. ~; U! V1 b5 r9 U& D
00      物件层的大序列下物件的子序列编号
4 w7 Z5 Y& C& f8 O
03 03 00  目前不详& ~' `) O& \& f
01      行止标识服务器端用的 smp文件就是用客户端的 map文件生成的,不同的是,服务器端只保留了地块数据中最后一个字节的数据,就是行止数据,其他的都去掉了,因为服务器端不用显示图象文件。好了,最后我给出读取map文件的函数,这个函数就是我们在演示程序使用的读取地图数据信息的函数。
2 J: T- S* U  ^6 p
( l$ [7 L* k5 h
//************************************************************
) ]9 U3 l# q  K$ d- h
// 加载地图基本数据函数;( K: d& G1 |/ P: b* P
//************************************************************$ n0 \. o: I" T5 A+ ]5 Z, F( h  w

& K) |# F6 r2 I6 ~% _, h  Y; ~! P
//************************************************************/ H5 O* `7 [) I+ N; k
// 加载地图基本数据函数;8 R5 b2 b* C' B. m
//************************************************************
* v  l4 l8 k2 ~& `& Q7 M

8 f! C% ]6 a! f& f# F
int Cmap:oaddata(char *filnam)5 X* A% D7 G4 @4 t. _
{
5 G2 V% k. l! i0 L: P! Z5 x
        int Temdata;$ E. _+ @3 ~: X9 h

2 D) Z4 R. w: V" k
        if(filnam == "") return 0;
  F0 R+ E/ Q9 g  o, X
; ^0 K2 }, S* `2 q% L
        fp_map = fopen(filnam,"rb");
' g, T3 M( E, \. |& G. w

( j( c7 \1 r& F6 r5 A/ y( L* @
        if(fp_map == NULL)        return 0;2 I( x: k8 B) T

  s8 @, n4 u7 U4 W  }1 a) |
        fseek ( fp_map, 16, SEEK_SET);
: K: r. Z5 y, ^, Q& j
        fread ( &ShortWidth, 4, 1, fp_map);6 y# T7 p1 _1 P- G/ C1 E  B! u* g
        fread ( &Width, 4, 1, fp_map);; A" Y2 f" z+ K" Z& ^, \
        fread ( &Height, 4, 1, fp_map);
. k. d0 n% |: K0 _
: M: n% ?# v, |) e& m4 |
        int TW = Width / ShortWidth;
  A, j9 ^8 P! S7 ]0 P' c5 d
        int TH = Height / ShortWidth;
: c9 \, t4 a" l/ l. a1 `

' {! I3 N* k0 _$ u$ K' z0 F1 j
        for (int j = 0 ; j < Width ; j++)6 o6 \, y1 N! z7 y$ P' U* l. L6 L, F
        {
& j, r; |3 G( g9 D0 e1 k! I
                _DELETE_ARRAY(Cell);
7 A+ Y8 B, v/ q" C) j% s% Q- M6 H1 E: R3 E
                _DELETE_ARRAY(Role);  m/ y% j$ n9 P0 O
        }
1 y; F4 A( v2 w# k

3 }* x% k, x* p- c
        Cell = new stCell*[Width];
4 X) |: |1 O! K  f
        Role = new stRole*[Height];
* Y% \2 m; t1 J
        for (j = 0 ; j < Width ; j++)
1 q- ~& \7 s7 z9 g: V+ P2 I9 D
        {
0 {+ a: Y: f' R9 y7 D
            Cell[j] = new stCell[Height];
! k- |' e: a; o) `8 R4 s" B. p
                Role[j] = new stRole[Height];        
: C. h  w; r! C4 u
        }        0 k; g2 Q+ \/ _) S- E3 _. J
! F1 b0 P" x! }, n% u/ A  C; t; d( F7 D. c
        fseek ( fp_map, 28, SEEK_SET);' g( o, k4 z/ N# \7 @, M% O$ l
3 N$ y# q. h! z7 I) v% h
        for (int y1 = 0; y1 < TH ; y1++)
/ _, d7 c5 B, g" h. J5 S1 K0 z# ]
        {, A% O( `% I0 a. I" J# v
                for (int x1 = 0; x1 < TW ; x1++)6 Y& y3 u" \5 F$ o1 A6 n9 r
                {
6 B4 C3 m! K1 x
                        fseek ( fp_map, 20, SEEK_CUR);, S: x0 V0 q/ u8 m
                        for (int y2 = 0; y2 < ShortWidth ; y2++)
6 b  x. v+ |6 s/ O% y
                        {
8 M5 n: M/ t. H/ v- D# `
                                for (int x2 = 0; x2 < ShortWidth ; x2++)
' [$ c- l" Q( s
                                {
+ ]$ J: p* s1 R8 Y! E1 {/ a
                                        fread ( &Temdata , 2, 1, fp_map);7 B3 d* H4 k; H" E3 c  p# V
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID1 = Temdata;
# y3 o, Q" e# g+ o! K

& T. T9 A/ i4 w3 r
                                        fread ( &Temdata , 1, 1, fp_map);
- z' a8 w: a7 \! b( f# H! {5 G8 ^
                                        Cell[x2+x1*40][y2+y1*40].Cell_list1 = Temdata;9 e; W$ n$ s& S5 P2 }9 [
6 ?) }9 p# c: W+ D5 [, W
                                        fread ( &Temdata , 2, 1, fp_map);, W7 }; q/ v! ~: E
                                        Cell[x2+x1*40][y2+y1*40].Cell_ID2 = Temdata;$ y& X* \. Z7 N8 ]4 [) y! s. t

! d; l; w, G4 N1 x" Q
                                        fread ( &Temdata , 1, 1, fp_map);
/ S: h$ o& V/ |1 V
                                        Cell[x2+x1*40][y2+y1*40].Cell_list2 = Temdata;
  e/ N6 m7 b+ I& D+ P; ~) `5 m( h
                                        // 6个字节
$ i/ g9 s1 l9 {" q6 `( T

  E3 T  m3 T7 B+ _1 `2 y
                                        fread ( &Temdata , 1, 1, fp_map);! P" ~" {; Z8 Y) O
                                        Cell[x2+x1*40][y2+y1*40].Obj_list = Temdata;1 b& l* C$ g- X4 u; z' O# [
                                       
! N; s( C* ?, V4 O: o# z" v
                                        fread ( &Temdata , 1, 1, fp_map);
! V# u; x; q3 {5 [/ [
                                        Cell[x2+x1*40][y2+y1*40].Obj_ID = Temdata;2 m) }9 z1 K& M* a6 e! O+ p
/ r" a! e5 ^, X: E+ t6 O
                                        //fseek ( fp_map,3,SEEK_CUR);
6 B4 x" n6 W# _2 W% ?& g9 B" A
                                        fread ( &Temdata , 1, 1, fp_map);! R* V; o3 M# }0 k. h3 l. Q
                                        Cell[x2+x1*40][y2+y1*40].ani_list = Temdata;. e5 E  ~7 J1 u; u
                                       
4 F5 u' w, @0 k' A: f2 o- a
                                        fread ( &Temdata , 2, 1, fp_map);2 m! `$ r9 K$ ~5 s+ x' k
                                        Cell[x2+x1*40][y2+y1*40].ani_ID = Temdata;
+ V$ k; R/ x* [* U+ M

$ e& P$ f$ A* H
                                        // 1个字节0 e1 I- ?: t0 O, q$ Y
                                        fread ( &Temdata , 1, 1, fp_map);
7 J# }: b/ \  ~3 Y3 M% `
                                        Cell[x2+x1*40][y2+y1*40].CpType = Temdata;% A  K0 B5 J, M/ \% \
                                        //if (ftell(fp_map) > FilZize) return 0;
: x* D/ M7 d: T/ }8 m
                                }- H: J  v* a4 {$ d
                        }
& H- n* r! {* d( g
                }+ @; o, y9 D* b2 g/ |
        }# I+ f6 ]0 m# a7 O) h) f
/ |0 s% c* y) s) r3 t- ^- ]& c9 p
        fclose(fp_map);
0 z* i6 c/ D1 o$ N% `0 N% x/ b

1 X. R, C' y& k  x" n7 U
  n7 C7 C5 L. M8 U
        return 1;
7 d# C" T4 Q. o  Z
}
5 h* f8 z3 M; F9 L+ q% o
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

三千游戏官方客服

扫一扫二维码

添加qq客服

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