Files
90CNServer/pvf/docs/independent-drop-editor.md
T
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

3.4 KiB
Raw Blame History

独立掉落编辑器

入口:工具 → 独立掉落;也可打开 etc/independent_drop.etc 切换 GUI。 外部共享列表位于 etc/independentdrop/,同样支持 GUI。

支持按来源、物品名称或 ID 搜索,按掉落模式过滤;编辑、复制、删除、新增记录, 转换直接物品/内嵌列表/外部列表三种模式;对筛选结果批量设置概率、数量和等级。 内嵌列表支持物品选择、增删、ID 与权重编辑;保留重复项、零权重及顺序。 外部列表通过 etc/independentdrop.lst 解析,可更换引用或打开共享文件编辑。 副本平衡参数按原字段顺序编辑。未知物品不阻止加载。

修改先进入当前文件草稿,保存独立掉落后进入工作区,再通过保存 PVF 写入归档。 文件 GUI 与文本编辑器共用草稿、撤销及保存流程,归档切换或文本改变后旧表单自动失效。 共享列表修改影响所有引用它的记录。

格式与变体研究

参考上游 pvfUtility 独立掉落模型, 依据实际数据结构重新实现 Go 投影与 Vue GUI,不引入 WPF、商业组件或上游二进制。

17 项主体依次为:来源类型、来源 ID、物品 ID、五档概率、五档数量、最低等级、 最高等级、职业、掉落模式。常规模式的概率分母为 1000000,每档独立计算。 界面保留原始难度顺序,不把不同客户端的第五档强行解释为同一难度名称。 0 为直接物品,1 为内嵌 [list] ID/权重对,2 为 [list] 中的外部列表 ID。 上游采用三种模式;模式 2 由合成样例验证,当前真实样例没有使用该模式。

本地 testdata 验证结果:

变体 主体记录数 模式 差异
TW 3898 0、1 132 个外部列表;6 个副本平衡参数
90CN(两份样例) 2173 0、1 外部列表索引为空
90US 2178 0、1 外部列表索引为空
100CN 2000 0、1、5 模式 5 与 replace list 条件段
110US 1834 0、1、5 模式 5 与 replace list 条件段
115US 1806 0、1、5 模式 5 与 replace list 条件段
60ACT(A1/A4/A5/A12 样例) — — 未包含该文件,入口明确提示不支持

模式 5 的概率含义尚未确认:展示原始值,禁止 GUI 修改概率、列表、模式及结构性增删, 允许已确认的来源、数量、等级等主体字段编辑。附属条件及其他未知 section 原样保留。 批量修改概率若包含扩展模式会明确拒绝,应先过滤为常规模式。 不对其他变体套用 TW 的整个文件序列化;字段编辑仅替换精确 UTF-16 源码范围。 已观察到的 [replace list]/[dungeon condition] 不会在保存时丢失。

验证

go test ./...
cd frontend && npm test && npm run build

真实样例回归(源文件只读;保存至测试临时目录,测试结束自动清理):

PVF_TESTFILE=/path/to/Script.pvf PVF_DROP_SAVE_ROUNDTRIP=1 \
  go test ./services -run '^TestIndependentDropReal$' -v

该测试读取 GUI 文档、验证所有注册的外部列表,修改单个概率字段后比较整个脚本 二进制 payload,要求除该整数之外所有 token 逐字节不变;可选保存重开再次比对。 60ACT 缺少配置时跳过,不能把跳过视为已支持独立掉落。