服务端(Go): - GM 塞背包/带属性装备发放:在线角色推送 op14 增量物品行,背包实时刷新,无需回角色选择界面 - GM 改金币/改等级:去掉在线拒绝,落库后推送 op14 钱包/op37 等级状态,在线实时刷新 - 等级端点统一切换到新版 GMSetCharacterLevel(自带在线刷新) - 无限/锁死疲劳模式 + 燃烧疲劳:每房间消耗 2 点、打怪与通关经验双倍 - 燃烧疲劳开关时给所有在线角色推送系统提示(op12 mode 0) - 深渊史诗掉率:GM 全局倍率 + 城镇增益药剂窗口倍率,真实接入掉落结算 启动器(Python/JS): - 标题栏自绘、窗口 1204x717、禁止拖拽改大小、仅最小化/关闭 - GM 工具:疲劳与燃烧、深渊史诗掉率、拍卖行上架(单一定价对齐) - 拍卖行上架前端对齐服务端单一价格语义,修复 400 报错
100 lines
5.6 KiB
Markdown
100 lines
5.6 KiB
Markdown
# 115CN 兼容性检查
|
||
|
||
检查日期:2026-10-31。样本位于本地 `testdata/115CN`,共 6,251,369 个文件。
|
||
本报告验证内核、GUI 数据读取和源码编辑逻辑,不代表已逐项完成桌面窗口交互验收。
|
||
|
||
## 容器
|
||
|
||
- 独立识别为 `paged115cn` / `115CN`,不冒用 `115US` 身份。
|
||
- 配套客户端参数和 `sk.dat` 封装在 `internal/pvf/assets/clients/115cn.bin`。
|
||
日常打开无需同目录的 exe 或 `sk.dat`,也无需执行客户端程序。
|
||
- 字符串池为 UTF-16,保留分页容器、字符串引用和 indexhash 约定。
|
||
- 无配套文件、错误外部 `sk.dat`、内存解析均已验证;未修改保存通过 SHA-256 一致性验证。
|
||
- 客户端参数不输出到日志,不在源码中展开;真实归档、exe 和原始配套文件不提交。
|
||
|
||
## GUI 结果
|
||
|
||
| 工具 | 样本数量 | 结果和限制 |
|
||
| --- | ---: | --- |
|
||
| 商店 | 1,491 | 已适配嵌套商品记录、直接商品列表和根级分页。读取无错误,剩余 16 个没有可展示的分页;529 个文件存在结构、缺失引用或成本提示,不等于全部可编辑。 |
|
||
| 基础掉率 | 4 | 均为 9 列分组;已放开前后端入口。修改后的四份 payload 可重新解码,额外阈值保持不变。 |
|
||
| 全局掉落 | 1 | 数据读取通过。 |
|
||
| 强化/增幅 | 2 | 普通表和安全表读取通过,无格式提示。 |
|
||
| 锻造 | 1 | 已适配每级 6 列,成功率/材料倍率映射至正确源位置;两项附加系数只读。4/6 列无法唯一识别时拒绝 GUI 编辑。 |
|
||
| 技能 | 4,981 | 合并远端根级参数适配后读取无错误;36 个带有重复段、异常等级宽度或额外描述绑定等保护提示。1,004 个没有可展示的根级或 dungeon/pvp 参数模式。 |
|
||
| 任务 | 14,128 | 14,108 个通过前端解析;14,107 个验证了整数编辑只改目标 token。20 个闭合结构无法安全识别,保留 DSL 编辑。 |
|
||
|
||
任务嵌套区块整体只读,子字段不会覆盖顶层名称、条件或奖励;正常顶层字段仍可编辑。
|
||
2,668 个可解析任务带有嵌套、重复或特殊类型字段提示,不意味着整份任务都可由表单覆盖。
|
||
没有强行接受那 20 个结构不明的任务,也没有清理或重写原始样本。
|
||
|
||
## 商店结构
|
||
|
||
旧结构在 `[item list]` 内直接列出物品 ID。115CN 改为:
|
||
|
||
```text
|
||
[sell item list]
|
||
[item]
|
||
0
|
||
[index]
|
||
12345
|
||
[/item]
|
||
[/sell item list]
|
||
```
|
||
|
||
`[item]` 的直接整数是记录键,`[index]` 才是物品 ID;示例 ID 仅用于说明。
|
||
正常样本有五种布局:`sell info/tab` 下直接或按分类存放列表、
|
||
`sell info` 下直接或按分类存放列表,以及根级 `tab`。
|
||
|
||
- 正常闭合结构共解析 27,977 条非空商品记录,全部核对了预览 ID 与二进制编辑定位;
|
||
`[index] -1` 作为空位保留,不展示成商品。
|
||
- 支持新增、替换、删除商品;替换只修改 `index`,删除移除整条 `item`,
|
||
不合并重复物品,不丢弃同记录的限购、购买数量、退款等字段。
|
||
新增记录使用高于当前文件已有键的记录键,不复制其他商品的局部配置。
|
||
- 显式分页支持增删改;无分页布局只投影成一个 GUI 页,不擅自重组原文件,
|
||
其分页管理仍需文本模式。
|
||
- 记录内的 `price`、`need material` 按对应成本类型覆盖物品文件中的共享成本。
|
||
局部成本目前只读,带局部成本的记录可替换物品或删除;
|
||
单条成本修改及包含这些记录的批量成本修改会被拒绝,避免误改共享物品。
|
||
- 46 个文件带有结构提示,包含缺少分类 ID、未声明分类类型或不可识别的嵌套列表等;
|
||
声明分类但直接列出商品的记录可以通过“未分类”入口查看,仍保留保护提示。
|
||
另有缺失物品/材料引用的提示,合计 529 个商店带提示。
|
||
6 个文件有二进制区块闭合警告,拒绝 GUI 编辑。
|
||
- 五种真实布局均通过新增、另存临时 PVF、重开及删除新增记录验证;
|
||
删除后对应商店 payload 与原始内容逐字节一致。未覆盖原始样本。
|
||
|
||
## 排版与标注
|
||
|
||
- `section.basis of rarity dicision` 及其 `.hell` 规则为 115CN 每组显示 9 项。
|
||
- `etc.forge.table` 为 115CN 每行显示 6 项,其他版本保留原行宽。
|
||
- `etc.forge.115cn.table.0` 至 `.5` 独立标注六个字段;旧四列标注不应用于 115CN。
|
||
- 规则版本校验、编辑入口和归档版本标签均增加 115CN。
|
||
- 已运行的应用需要重新构建并打开;仅修改仓库 JSON 不会保证旧进程自动加载新配置。
|
||
|
||
## 复现
|
||
|
||
在仓库根目录使用 PowerShell 7:
|
||
|
||
```powershell
|
||
$env:PVF_TESTFILE = (Resolve-Path testdata/115CN/Script.pvf).Path
|
||
$env:PVF_TEST_CLIENT_VERSION = '115CN'
|
||
go test ./internal/pvf -run '^TestReal(BundledPagedClient|PagedClientCompatibility|PagedClientEditRoundTrip)$' -count=1 -v -timeout 20m
|
||
|
||
$env:PVF_GUI_TESTFILE = $env:PVF_TESTFILE
|
||
$env:PVF_GUI_QUEST_CORPUS = Join-Path ([IO.Path]::GetTempPath()) 'pvfine-115cn-quest-corpus.json'
|
||
go test ./services -run '^TestGUIRealArchiveCompatibility$' -count=1 -v -timeout 20m
|
||
|
||
$env:PVF_SHOP_TESTFILE = $env:PVF_TESTFILE
|
||
go test ./services -run '^TestShopReal115CN' -count=1 -v -timeout 20m
|
||
|
||
$env:PVF_GUI_QUEST_EXPECTED_REJECTIONS = '20'
|
||
Push-Location frontend
|
||
npm test
|
||
npm run build
|
||
Pop-Location
|
||
```
|
||
|
||
任务语料仅写入指定的本地临时文件,不加入仓库。`PVF_GUI_QUEST_EXPECTED_REJECTIONS`
|
||
只记录这份样本的预期拒绝数,不会放宽应用解析或编辑限制。
|
||
运行普通 `go test ./...` 前应清除这些真实样本环境变量,避免触发其他版本专用测试。
|