前言
欢迎 ⭐️star 我使用 Java 开发的开源项目 npk-api,提供对《地下城与勇士》(DNF、DFO)游戏资源 NPK 文件基础操作能力。
分析 NPK 数据结构
魔数
通常用于判断文件类型,占用 16 字节。在 NPK 文件中,固定值:NeoplePack_Bill\0
(最后一字节是 0x00)。
IMG 数量
占用 4 字节,用于描述 NPK 文件承载了多少数量的 IMG 文件。
IMG 索引表
每个 IMG 文件索引占用 264 字节,包括 4 字节地址偏移、4 字节数据长度和 256 字节加密后的 IMG 文件名。
IMG 文件名加解密
加密是将原 IMG 文件名转换为 256 字节 ASCII 码,不足位用 0 补齐,再与下面的字符串按位异或运算。
1 | puchikon@neople dungeon and fighterDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNF\0 |
解密反之。
校验码
占用 32 字节。首先将 魔数、IMG 数量 和 IMG 索引表占用的字节数除以 17 向下取整,再乘以 17 计为 limit。对 NPK 文件从 0 至 limit 取字节数组,进行 SHA256 加密,生成的字符串即校验码。
当一个 NPK 文件的校验位不匹配时,DNF 游戏将视其为一个无效的 NPK 文件,从而不会读取该 NPK 文件内的资源。
IMG 数据
每个 IMG 文件占用字节是不确定的,通过读取对应的 IMG 索引表来确定每一个 IMG 文件的起始位置和长度,从而读取整个 IMG 文件。
分析 IMG 数据结构
在漫长的 DNF 开发过程中,出现了若干版本的 IMG 数据结构,本文主要讲解最为常用的 V2 版本。
IMG V2
魔数
占用 16 字节。在 IMG 文件中,固定值:Neople Img File\0
(最后一字节是 0x00)。
索引表长度
占用 4 字节,索引表所占空间。
保留
占用 4 字节,无意义,全 0。
版本号
占用 4 字节,表示 IMG 文件版本,IMGV2 文件结构中的版本号为 2。
索引数量
占用 4 字节,索引表当中包含索引项数量。
索引表
图片型索引项(占用 36 字节)
颜色系统:
0x10(ARGB8888)
、0x0F(ARGB4444)
和0x0E(ARGB1555)
;压缩状态:
0x05(图像数据未压缩)
和0x06(图像数据经ZLIB压缩)
;压缩和解压缩使用 ZLIB。
图像宽、图像高、图像长度、X 座标、Y 座标、帧域宽和帧域高,图片基本属性不再赘述。
指向型索引项
- 类型:固定值:
0x11
; - 指向帧号:IMG 文件内图像按索引表顺序存放的一个有序序号,第一帧是 0 号。
- 类型:固定值:
数据
首尾相接的图像数据块构成,大部分图像数据由 ZLIB 进行压缩,因此经常以 0x78 0x9C
数据开头。