
需要python3环境。我编写和用到的所有脚本:https://wwava.lanzoub.com/iszSp3ee9ymh
在安卓系统中,百闻牌的文件主要位于Android/data/com.netease.yysbwp下。其中资源文件主要位于files/netease/g97文件夹下。该目录下主要关注 res 与 documents 两个文件夹。
在res文件夹内,video文件夹包含了游戏CG(MP4格式)以及赛季卡更新和开包动画(usm格式);wwise文件夹包含了游戏相关的音效语音(wem格式和bnk)。
在documents文件夹内,video文件夹包含了异画入场动画和桌布预览视频(usm格式);wise文件夹包含了游戏相关的音效语音。
usm格式并不能直接播放,需要进行格式的转换。我使用的是ffmpeg。ffmepg相关的安装教程网上有很多教程,此处不赘述。百闻牌的usm文件未加密,直接复制流即可,命令为ffmpeg -i [需要转换的文件名].usm -c copy [输出文件名].mp4。请将[]内的内容及[]本身替换。
音频文件似乎有加密,未成功提取。
在 documents 文件夹下可以看到大量 .npk 文件,这是游戏打包后的资源容器,需要进一步解包。
不同的 npk 文件对应不同类型的资源:
bigtexture:卡面资源
fx_*:特效贴图资源
gui:UI 界面效果资源
gui2:登录界面资源
loading:过场加载图
sceneobject:桌布、商店街建筑、家具、主场景模型
scenerio:动态绘卷与剧情人物动画
spine:秘闻之间场景、式神录、头像框、头像等动画
spine_hero123:式神形态及异画动画
sticker:表情包
texture:称号、式神小图、卡背等资源
百闻牌基于网易自研的 NEXO 引擎,因此可以使用 NEXO 解包工具,例如:
https://github.com/MarcosVLl2/NeoXtractor
使用该工具打开npk文件后,可以看到许多dat文件。

把dat文件都解压(Extract All)到文件夹内,.dat 文件采用 zlib 方式压缩,需要先进行解压。可以使用decode.py进行解压,解压之后是dec格式。
解压后会发现原始文件名和扩展名(即文件类型)丢失,后续的大部分步骤都是为了恢复原始文件名和扩展名,如果有方法可以在npk解包这步保留原始文件名和扩展名,欢迎分享~
为了恢复扩展名,我使用了TrID(地址:https://www.mark0.net/soft-trid-e.html)来进行恢复。完成还原后,可以看到一部分文件被识别为 .ktx,属于 GPU 纹理格式,无法直接查看。可通过PVRTexTool工具(链接:https://developer.imaginationtech.com/solutions/pvrtextool/)将其转换为常规的 .png 图片,方便查看和二次处理。
以上从zlib解压到ktx转换png的步骤,可以直接通过运行run.bat完成。注意,TrID和PVRTexTool需要添加到系统目录,run.bat、colletc.bat、decode.py、ktx2png.bat与dat文件需要位于同一目录下。


bigtexture、gui2、loading、sticker、texture这些npk文件中通过以上步骤可以直接拿到可直接查看的png图片。
fx_*、gui、sceneobject这些npk文件中拿到的png图片,多为贴图资源,例如

由于百闻牌的特效和桌布基于nexo引擎实现,尚无法复原。
spine、spine_hero123、scenerio 这些npk文件中拿到的png图片,也多为贴图资源,例如

但由于百闻牌的形态与场景大多采用spine实现,所以可以复原。
在进行 spine、spine_hero123、scenerio 这些npk解包时,还会遇到一部分TrID 无法识别的文件,这些文件实际上是 Spine 动画资源。
一个完整的 Spine 动画通常包含:
*.skel:骨骼数据文件
*.atlas:贴图映射文件
*.png:实际贴图资源
这三个文件通常具有相同的文件名。
使用记事本打开这些无法识别的.dec文件,可以发现有两类文件:

atlas 文件:
第一行为空
第二行通常为 *.png 文件名(这个就是这一组spine动画的原文件名)

skel 文件:内容通常含大量乱码
skel 与 atlas 文件中包含子图名称,可以利用这一点进行配对。
例如荒·星辰之境异画 的 Atlas 文件中包含子图名 diqiuyi:
对应的 skel 文件中也包含该字符串
同时,只有荒的异画动画中包含“地球仪”元素


因此,可以通过该子图名反向定位并确认完整的 Spine 文件组。
使用merge.py可以自动组合具有相同子图名的atlas文件和skel文件。(原理是先识别atlas文件,然后遍历atlas文件中的每一个子图名,寻找当前文件夹下是否只有两个文件具有该子图名,所以对于一些没有独特子图名的atlas文件和skel文件,是无法自动匹配的。如果你有更好的匹配方法,欢迎分享~)
在获得完整的spine文件组后,可以使用spineviewer(链接:https://github.com/ww-rm/SpineViewer)进行动画的查看。最好下载SelfContained版本。
如果只需要无需交互的动态壁纸,可以参照spineviewer的壁纸设置教程。