简体中文
分支树系统
装备到达某些星级后会分岔走上不同的强化路线, 每条路线给出各自的属性, 技能和展示
强化分支树用嵌套结构描述装备在不同星级段可以走的强化路线, 让同一件装备按路线获得不同的属性, 技能和展示
概念
- 分支节点: 分支树中的一个节点, 包含自己的星级阶段定义
- 分叉点: 节点的
fork_after_star, 表示在该星级完成后进入子分支 - 分支路径: 装备已选择的路线, 以
/分隔的分支 ID 序列, 保存在强化层的branch_path中
text
root (★1-4) → fork_after_star: 4
├── sharp (锋锐路线 ★5-7) → fork_after_star: 7
│ ├── lethal (致命路线 ★8-10)
│ └── swift (迅捷路线 ★8-10)
└── heavy (重击路线 ★5-10)配置结构
分支写在强化配方的 branch_tree 里, branch_tree 本身就是根节点:
yaml
id: "weapon_refine_branch"
branch_tree:
branch_id: "root"
display_name: "<white>基础精炼</white>"
fork_after_star: 4
stars:
1:
effects:
- type: "variables"
variables:
physical_attack: 5
materials:
- item_sources:
- "minecraft-copper_ingot"
amount: 2
children:
sharp:
branch_id: "sharp"
display_name: "<red>锋锐路线</red>"
fork_after_star: 7
stars:
5:
effects:
- type: "variables"
variables:
physical_crit_rate: 3
materials:
- item_sources:
- "minecraft-copper_ingot"
amount: 3
children:
lethal:
branch_id: "lethal"
display_name: "<dark_red>致命路线</dark_red>"
fork_after_star: -1
stars:
8:
effects:
- type: "variables"
variables:
physical_crit_damage: 10
heavy:
branch_id: "heavy"
display_name: "<gold>重击路线</gold>"
fork_after_star: -1
stars:
5:
effects:
- type: "variables"
variables:
physical_attack: 9字段说明
一个分支节点可以写这些字段:
| 字段 | 类型 | 必填 | 默认值 | 取值范围 | 说明 |
|---|---|---|---|---|---|
branch_id | string | 否 | 节点所在的 key (根节点为 root) | — | 分支标识符 |
display_name | string | 否 | 空 | — | 分支显示名 (用于 GUI 中的选择界面) |
fork_after_star | integer | 否 | -1 | -1 或正整数 | 在此星级完成后进入子分支. -1 表示不再分叉; 有 children 时 -1 无法分叉 |
stars | map | 否 | 空 | 键为目标星级正整数 | 此分支内的星级阶段定义, 格式与线性配方的 stars 完全相同 |
children | map | 否 | 空 | key 为子分支 ID | 子分支节点 |
NOTE
节点的 stars 和 children 同时为空时, 该节点会被忽略
分支对装备的影响
装备的属性, 技能和展示按分支路径累计: 从根节点沿着已选的路径往下走, 把路径上所有节点中不超过当前星级的星级阶段收集起来, 效果逐项累加
具体影响:
- 变量累计: 路径上各星级
variables效果的累计值 - 属性累计: 路径上各星级
ea_attribute效果的累计值, 写入 PDC 属性层 - 技能绑定: 路径上各星级
es_skill效果收集到的技能 ID 集合 - 名称与 Lore: 路径上各星级
name_action/lore_action的累计动作链
分支路径和星级, 锻印一起存在强化层审计数据的 branch_path 字段里
分支配方文件
默认资源里带了 recipes/example_branch_recipe.yml, 可以当分支强化配方的参考. 分支配方适合这些设计:
- 武器在中高星后选择输出路线, 例如攻速, 暴击, 穿透
- 防具在特定星级选择防御, 生命, 韧性或抗性路线
- 饰品根据职业定位选择资源, 技能或功能属性
建议把普通线性强化和分支强化拆成不同配方, 避免一个文件同时承担过多规则. 分支节点越多, 玩家理解成本越高; 分叉 1~2 次会更好维护
当前实现范围
分支树的数据模型, 路径解析, 阶段收集与持久化都已经实现. 你用命令 /estrengthen branch [id] 设置分支路径: 不带 id 列出当前可选的分支 ID, 带 id 就把选择写进装备的 branch_path. 目前 GUI 里还没有选分支的图形入口, 也没有对应的 CoreLib 动作段. 所以:
- 没执行
branch命令选分支时, 装备的branch_path为空, 等价于只沿根节点路线成长 - 如果
fork_after_star指定的星级之后, 后续星级只定义在children中, 你就必须先执行branch命令选分支, 否则这件装备无法继续强化 (预览会返回strengthen.branch.selection_required) - 设计一条能线性走通的分支配方时, 要确保根节点的
stars覆盖到希望玩家能达到的星级
里程碑标记
装备状态记下了历史上首次达到的星级集合, 用处有两个:
- 防止重复触发广播, 详见广播系统
- 记录装备成长历程
管理员用 /estrengthen inspect 查看主手装备的星级, 锻印, 配方和首次达到标记
强化转移
运行时带一个强化转移服务, 用来把一件装备的星级迁移到另一件装备. 现行规则:
- 源装备必须已强化, 目标装备必须可强化且能解析出配方
- 转移星数 =
floor(源装备星级 × 衰减率), 衰减率取值范围0~1 - 转移星数会截断到目标配方的
limits.max_star - 转移会触发
StrengthenTransferEvent, 你可以在监听器里取消或改写转移星数, 改写后仍会重新截断 - 转移星数 ≤ 0 时中止转移
- 目标配方有分支树且在该星级需要选分支时, 转移会被拒绝
- 转移后目标装备的锻印归零
NOTE
当前版本没有提供触发转移的内置命令或 GUI 入口, 这个服务面向 API 与后续功能扩展