Files
90CNServer/pvf/docs/商城GUI.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

54 lines
4.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 商城 GUI
工具栏“工具 → 商城编辑器”优先打开当前归档的 `etc/cerashop.etc`,仅当该文件不存在时回退到 `etc/(r)cerashop.etc`,并切换 GUI 模式;两者都不存在时提示错误。也可手动打开商城文件后切换 GUI 模式。
## 浏览与编辑
- 一级页签遵循 `[shop button list and sequence]` 的顺序,“退出”作为关闭按钮;遗漏的非空商品类型补在后面,保证商品可以访问。
- 二级分类对应商品区段。卡片展示物品图标、名称、商品编号、物品编号、点券/金币价格、购买数量和非空日期参数。
- 工具栏“商品名/物品名”切换作用于所有商城页签,并在本次应用会话中保持。未配置商品名的时装优先回退到物品名,找不到名称时显示编号。
- 按住 Cmd/Ctrl 点击卡片上的物品编号,可在当前窗格打开对应的物品文件。
- 搜索匹配商品名、物品名和两种编号。物品名称分批加载;图标只查询当前页,卡片每页 60 件。
- 热卖与新品按 `[hotnew sell ipg]` 聚合;积分页按 `[specific product mileage]` 聚合,并非新增一种积分购买规则。商品售价和原有积分参数分开处理。
- 新增、编辑、删除在弹窗中进行。新增默认取现有商品最大编号加一,跳过已知历史引用占用的编号;可手动指定唯一的正整数编号。
- 普通道具提供数量、名称、金币、点券和日期参数;时装和礼包分别使用独立布局。其他参数保持原值,可展开编辑。
- 修改先进入编辑器草稿。“保存商城”写入工作区;保存 PVF 才会写入归档文件。
## 格式与保护
当前 110US 样本中普通道具、不可交易时装均为 14 字段,礼包为 13 字段。另通过同归档 `(f)cerashop.etc` 核对了可交易时装的 13 字段布局;不将其当作普通道具的数量和名称布局。
90CN 普通版 `etc/cerashop.etc` 按内容识别为旧版布局:时装 6 字段、道具 9 字段、礼包 11 字段、名称装饰 8 字段,角色服务礼包等采用独立字段映射。复活币、材料、恢复道具、魔王之契约、社区等分类一并展示,新增/编辑使用当前文件实际布局;旧版限购和按钮控制中的商品引用按原位置同步。
周边商品是外部链接记录,按只读卡片展示原始名称和价格参数,不套用点券单位。6 字段时装表尚未确认价格列,显示“未配置价格”,其类型及期限参数保留在其他参数中。`-1` 占位编号不作为重复商品编号,也不会在删除占位记录时移除其他引用。
TW 商城按内容识别为独立布局:道具 10 字段、礼包 10 字段,可交易/不可交易时装分别为 7/8 字段。保留配置中的独立“宠物”页签。`etc/cerashop.etc` 的真实样本有 133 件商品,`etc/cerashop_first.etc` 有 54,476 条记录;两个文件都可通过文件 GUI 打开,工具栏仍按普通版优先的既定规则选择文件。尚未确认的时装价格参数不作为售价展示。
首次打开优先选择配置顺序中有商品的页签,避免 TW 默认进入没有推荐配置的空“热卖与新品”页;手动选择的页签仍保留。
90CN 样本中商城导航的结束标签实际写作 `[/shop button and sequence]`,解析时将其匹配到 `[shop button list and sequence]`;编辑不会重写这一历史拼写。其他不匹配的标签仍会报错。
商品改号/删除同步以下已知商品编号引用:限购、购物车限制、赠送限制、仅赠送、不可叠加购买、立即生效商品、热卖、新品、默认推广页、指定商品积分、已购限购隐藏列表,以及 `storage`/`visible storage` 的仓库映射。不会改写物品编号或任意未知区段。
仅替换变化的 token,保留未知参数、未改动的区段、字符串类型标记及原始换行。重复编号、残缺记录、重复商品区段或类型不匹配均提示错误。无法识别的分类锁定编辑;存在未识别商品时,禁止新增、改号及删除,防止遗漏编号冲突或引用。
日期参数尚未确认代表过期时间,因此界面不将它标为“过期”或自动下架。价格列按此次样本分析映射,未确认的其他字段不赋予业务含义。
## 验证
```sh
cd frontend
npm test -- --run tests/cera-shop.test.ts tests/gui-launcher.test.ts
npm run build
```
真实样本回归通过 `PVF_CERA_TEXT` 指向从归档只读提取的目标脚本文本,避免将个人数据放进测试夹具:
```sh
PVF_CERA_TEXT=/path/to/cerashop.txt npm test -- --run tests/cera-shop.test.ts
```
普通版真实样本回归使用 `PVF_CERA90_LEGACY_TEXT`;90CN `(r)` 版使用 `PVF_CERA90_TEXT`,均指向只读导出的脚本文本。
TW 普通版和 first 版真实样本回归分别使用 `PVF_CERA_TW_TEXT`、`PVF_CERA_TW_FIRST_TEXT`,指向从归档只读导出的脚本文本。