Skip to content
flwmxd edited this page Jan 6, 2017 · 1 revision

0.前言:

游戏资源打包几乎是一个网络游戏客户端必备的功能。页游和微端根据实际需求可能不打包资源或者使用小包。
资源打包有这么几个好处:
1、加快客户端安装时间。拷贝3000个1mb文件所消耗的时间要远大于拷贝一个3g的文件所消耗的时间
2、客户端更加整洁,也可以“稍微”避免游戏资源被他人使用。
3、ios和android上面可以避免文件名大小写不一致造成的文件读取失败。或者说包内可以做到全平台大小写无关
4、压缩资源,如果是大量png等图片资源可能还体现不出来,但是如果有大量文本和未压缩模型资源,那么打包可以有效减小客户端。

1.MapleStory资源介绍

MapleStory资源文件全部都已wz为后缀,Wz文件是Maplestory的基础文件,使用wizet公司为扩展名来加密、加压游戏资源,以减少游戏资源所占用的空间以及防止有人对wz文件作非法的修改,简单的说MapleStory这款游戏所有的图片、音乐、脚本等资源都包含在Wz文件中。

1.1 Wz文件

一个常规的MapleStory客户端内包括以下几个wz文件:

wz文件名 内容介绍
Base.wz wz文件全体列表,不包括任何资源文件
Character.wz 游戏角色形象资源,包括人物发型、衣服、鞋子、武器等,另外坐骑、称号都在该文件内
Effect.wz 一些游戏效果,例如一些职业的剧情大图、人物身边的某些特效图
Etc.wz 这里包含的资源较少,列表数据较多
Item.wz 各种物品图标资源、椅子资源等
List.wz 暂不明用处的列表wz,后期已被删除
Map.wz 游戏地图资源,包括背景、前景、路面、摆设物、世界地图等
Mob.wz 怪物资源图
Morph.wz 角色变身形象资源图
Npc.wz NPC的资源图
Quest.wz 游戏任务相关文字内容
Reactor.wz 敲击物(反应器)的资源图,例如一些需要普通攻击敲打的木箱等
Skill.wz 包含各职业技能图、怪物技能图等
Sound.wz 声音资源,包含各个地图的背景音乐、技能音效、界面音效等
String.wz 包含一些物品、地图、怪物、NPC名称等文字资源
TamingMob.wz 原用于归类坐骑图片资源,后来的坐骑图片资源都归类至Character.wz文件了
UI.wz 界面相关资源,包括游戏界面、职业创建界面、名片对话框、商城界面、鼠标指针等

2.Wz资源格式

2.1 Wz文件

Wz文件可以称为MapleStory游戏的文件系统。包含了目录和对象实体,在对象实体下面又包含了多个属性。

2.2 加密

整个资源文件对于其字符串进行了加密(不属于本节讨论的范畴)

2.3 文件格式

  • 2.3.1 文件头
50 4B 47 31 - "PKG1", 文件头/标识/签名(0x31474b50)4bytes
UINT64 - 文件大小 
INT32 - 头部大小
'\O' 结尾的字符串(C字符串 44 bytes) - 文件描述 'Package file v1.0 Copyright 2002 Wizet, ZMS'
  • 2.3.2 Contents (内容)

头部数据之后紧接着为wz文件的主体内容

UINT16 - 加密的客户端版本号
Directory - 根目录
  • 2.3.3 Directory (目录)

每一个目录下面包含了多个子目录和对象。

Read WZ-INT - size 对象数量
for i = 0; i <size ; i++ {
  UINT8 - 类型 1 为目录 否则为对象
  SERIALIZED-STRING- 名字
  WZ-INT - 大小
  WZ-INT - 校验和
  WZ-OFFSET - 文件中实际位置的偏移量
}
  • 2.3.4 Object (对象)

一个对象用一个字符串描述了当前的对象类型 MapleStory中支持以下的对象类型:

  • Property
  • Canvas
  • Shape2D#Convex2D
  • Shape2D#Vector2D
  • UOL
  • Sound_DX8
Read SERIALIZED-STRING - 类型名称
  • Property (属性) 包含了若干个键值对,Key 为 string,Value为一个variant
UINT8 - Unknown
UINT8 - Unknown
WZ-INT - variant数量(size)
for (i = 0; i < size i++) {
  SERIALIZED-STRING - 节点名称
  Variant - 值
}

Variant(变体类型)  
Ms中支持多种Variants

UINT8 - Type
if Type == 0 {
   Nothing
} else if Type == 2 || Type == 11 {
  INT16 - Value
} else if Type == 3 || Type == 19 {
  WZ-INT - Value
} else if Type == 20 {
  WZ-LONG - Value
} else if Type == 4 {
  UINT8 - Flag for set float
  if Flag for set float == 0x80 {
    FLOAT32 - Value
  } else {
    // Default value is FLOAT32(0.0)
  }
} else if Type == 5 {
  FLOAT64 - Value
} else if Type == 8 {
  SERIALIZED-STRING - Value
} else if Type == 9 {
  // An Object
  INT32 - Size
  Object - The serialized object (= Value) (可以继续展开)
}
  • Canvas(图片资源)
UINT8 - Unknown
UINT8 - Type 1为Property 则继续展开 否则为Canvas
WZInt - width
WZInt - height
WzInt - format1 指定纹理渲染方式
WzInt - format2
Int32 - unknown 
Int32 - Size
byte * data = read(Size);二进制数据
  • Shape2D#Convex2D()
WzInt - count 子节点个数
for i = 0;i<count;i++
{
    expandNode(currentOffset);
}
  • Shape2D#Vector2D(向量)
WzInt - x
WzInt - y
  • UOL (资源重定向)
UINT8 - unknown 
SERIALIZED-STRING - 重定向地址

  • Sound_DX8(声音)
UINT8 - unknown
WzInt - size
WzInt - unknown 
51 Bytes - 表述当前音频的信息

以上为MS资源的解析

扫码关注: