Files
90CNServer/pvf/docs/60ACT格式分析.md
hanfuit 645b64fe21 DNF90 服务端与启动器完整源码(含 GM 工具功能增强)
服务端(Go):
- GM 塞背包/带属性装备发放:在线角色推送 op14 增量物品行,背包实时刷新,无需回角色选择界面
- GM 改金币/改等级:去掉在线拒绝,落库后推送 op14 钱包/op37 等级状态,在线实时刷新
- 等级端点统一切换到新版 GMSetCharacterLevel(自带在线刷新)
- 无限/锁死疲劳模式 + 燃烧疲劳:每房间消耗 2 点、打怪与通关经验双倍
- 燃烧疲劳开关时给所有在线角色推送系统提示(op12 mode 0)
- 深渊史诗掉率:GM 全局倍率 + 城镇增益药剂窗口倍率,真实接入掉落结算

启动器(Python/JS):
- 标题栏自绘、窗口 1204x717、禁止拖拽改大小、仅最小化/关闭
- GM 工具:疲劳与燃烧、深渊史诗掉率、拍卖行上架(单一定价对齐)
- 拍卖行上架前端对齐服务端单一价格语义,修复 400 报错
2026-11-04 14:31:55 +08:00

4.4 KiB
Raw Permalink Blame History

60ACT 归档读写

本地 A1、A4、A5、A12 样本均已通过目录与全部文件 CRC 校验。它们不使用分页保护,不需要客户端 EXE 或 sk.dat。

变体 文件数 文件头 目录项顺序 文件 CRC 初始值
A1 48,326 DNF_SCRIPT_PACK(15 字节) 编号、偏移、长度、CRC、路径长度、路径 文件偏移
A4 71,019 UUID 长度、UUID、版本 编号、路径长度、路径、长度、CRC、偏移 文件编号
A5 126,696 同 A4 同 A4 文件编号
A12 145,184 同 A4 同 A4 文件编号

A1 的签名之后,或其余版本的版本号之后,均为三个小端 uint32:目录密文长度、目录 CRC、文件数。目录后紧接文件数据区,目录中的文件偏移相对于此数据区。

目录和文件均按四字节对齐。逐 uint32 解密为 ROR32(cipher XOR CRC, 6)。目录 CRC 为 crc32.Update(文件数, IEEE, 对齐后的目录明文);文件 CRC 使用上表初始值,对齐后的文件明文参与计算,读取时再截断到声明长度。现有 TW 容器的额外异或常量 0x81A79011 不适用于这四个样本。

文本以国服 GBK 解码,保留注释和排版;有 UTF-8 BOM 时按 UTF-8 读取。语言后缀不用于推断编码。路径按既有 CP949 路径约定读取。带 NUL 的原生资源保留为二进制,不尝试解释成五字节脚本令牌。A5/A12 大多数 ANI 为二进制,可通过通用 ANI 模块解码为只读文本并预览,原始载荷保持不变。

支持读取、搜索文本、修改、增删文件及保存。磁盘格式没有字符串池或 stringtable.bin;打开时为文本脚本建立编辑器内部的令牌视图和字符串池,统一作为 TypeScript 使用,兼容名称、稀有度、图标、列表编号、标注、GUI 和批量脚本解析。.str、.txt、.nut 等普通文本仍为 TypeUnicode;含 NUL 的二进制资源保持原样。源码支持正负号数字、嵌套 Section、反引号字符串、////* */ 注释和 <table::key> 本地化引用,兼容 ACT60 根目录的 string.lst 字符串表映射。未修改的归档逐字节原样导出;修改后重建目录与文件数据区,保留原始签名、UUID、版本和已有文件编号。未修改文件不经过字符解码再编码,保持原始载荷和对齐字节。A1 文件移动时以新偏移重新计算 CRC 并加密,其他版本沿用未修改文件的原始密文。

文本修改按原编码保存(默认 GBK,原有 UTF-8 BOM 文件继续使用 UTF-8 BOM),不能用 GBK 表示的字符会报错并保留待保存修改。新增文件路径按 CP949 编码。导入的令牌脚本在保存时转为文本源码,重新打开后继续提供 TypeScript 语义视图。直接文本编辑保留原始排版与注释,仅修改注释或空白也会被记录;GUI/令牌编辑按脚本渲染规则输出源码,内部块字符串标记不会写入原生 ACT60 文本。二进制 ANI 可原样保留或替换原始载荷,支持只读文本解码与预览,尚不支持文本重编译。保存前重新解析并校验所有文件,写入失败时不清除内存修改。

实现位于 internal/pvf/act60.go 和 internal/pvf/act60_save.go,合成回归覆盖两种目录布局、GBK 文本、二进制、空文件、克隆、比较、原样导出、编辑、增删、连续保存、UTF-8 BOM 保留、编码/写入失败重试与损坏/截断数据。真实样本验证使用:

PVF_TESTFILE=/path/to/Script.pvf go test ./internal/pvf -run '^TestRealACT60(Parse|EditRoundTrip)$' -v -count=1

pvfUtility 对照

核对版本 53dc8e48bba0f7871ca96bcf10bfe6d2028d0582:其容器读取固定使用 TW 异或常量,没有上述 ACT60 容器分支,因此无法直接打开这些样本。但其 BinaryAniCompiler 支持二进制 ANI,后续可参考其格式分析: