# 独立掉落编辑器 入口:工具 → 独立掉落;也可打开 `etc/independent_drop.etc` 切换 GUI。 外部共享列表位于 `etc/independentdrop/`,同样支持 GUI。 支持按来源、物品名称或 ID 搜索,按掉落模式过滤;编辑、复制、删除、新增记录, 转换直接物品/内嵌列表/外部列表三种模式;对筛选结果批量设置概率、数量和等级。 内嵌列表支持物品选择、增删、ID 与权重编辑;保留重复项、零权重及顺序。 外部列表通过 `etc/independentdrop.lst` 解析,可更换引用或打开共享文件编辑。 副本平衡参数按原字段顺序编辑。未知物品不阻止加载。 修改先进入当前文件草稿,保存独立掉落后进入工作区,再通过保存 PVF 写入归档。 文件 GUI 与文本编辑器共用草稿、撤销及保存流程,归档切换或文本改变后旧表单自动失效。 共享列表修改影响所有引用它的记录。 ## 格式与变体研究 参考上游 [pvfUtility 独立掉落模型](https://github.com/Lancarus/pvfUtility/tree/master/PvfCode/ViewModels/independent_drop), 依据实际数据结构重新实现 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]` 不会在保存时丢失。 ## 验证 ```sh go test ./... cd frontend && npm test && npm run build ``` 真实样例回归(源文件只读;保存至测试临时目录,测试结束自动清理): ```sh PVF_TESTFILE=/path/to/Script.pvf PVF_DROP_SAVE_ROUNDTRIP=1 \ go test ./services -run '^TestIndependentDropReal$' -v ``` 该测试读取 GUI 文档、验证所有注册的外部列表,修改单个概率字段后比较整个脚本 二进制 payload,要求除该整数之外所有 token 逐字节不变;可选保存重开再次比对。 60ACT 缺少配置时跳过,不能把跳过视为已支持独立掉落。