分支树系统
强化分支树用嵌套结构描述装备在不同星级段可以走的强化路线,让同一件装备按路线获得不同的属性、技能和展示。
概念
- 分支节点:分支树中的一个节点,包含自己的星级阶段定义。
- 分叉点:节点的
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 | 空 | 分支显示名。 |
fork_after_star | integer | -1 | 在此星级完成后进入子分支。-1 表示不再分叉。 |
stars | map | 空 | 此分支内的星级阶段定义,格式与线性配方的 stars 完全相同。 |
children | map | 空 | 子分支节点,key 为子分支 ID。 |
节点的
stars和children同时为空时,该节点会被忽略。
分支对装备的影响
装备的属性、技能和展示按分支路径累计:从根节点沿已选路径向下,收集路径上所有节点中不超过当前星级的星级阶段,再累加它们的效果。
具体影响:
- 变量累计:路径上各星级
variables效果的累计值。 - 属性累计:路径上各星级
ea_attribute效果的累计值,写入 PDC 属性层。 - 技能绑定:路径上各星级
es_skill效果收集到的技能 ID 集合。 - 名称与 Lore:路径上各星级
name_action/lore_action的累计动作链。
分支路径与星级、锻印一起保存在强化层审计数据的 branch_path 字段中。
分支配方文件
默认资源中包含 recipes/example_branch_recipe.yml,可作为分支强化配方的参考。分支配方适合用于以下设计:
- 武器在中高星后选择输出路线,例如攻速、暴击、穿透。
- 防具在特定星级选择防御、生命、韧性或抗性路线。
- 饰品根据职业定位选择资源、技能或功能属性。
建议把普通线性强化和分支强化拆成不同配方,避免一个文件同时承担过多规则。分支节点越多,玩家理解成本越高,通常 1~2 次分叉更容易维护。
当前实现范围
分支树的数据模型、路径解析、阶段收集与持久化均已实现,但当前版本没有提供玩家在 GUI 中选择分支的入口,也没有设置分支路径的命令或动作。因此:
- 装备的
branch_path在正常强化流程中始终为空,等价于只沿根节点路线成长。 - 根节点
fork_after_star指定的星级之后,如果后续星级只定义在children中,装备将无法继续强化。 - 设计线性可用的分支配方时,应确保根节点的
stars覆盖到希望玩家能达到的星级。
里程碑标记
装备状态中记录历史上首次达到的星级集合,用于:
- 防止重复触发广播,详见广播系统。
- 记录装备成长历程。
管理员可用 /estrengthen inspect 查看主手装备的星级、锻印、配方和首次达到标记。
强化转移
运行时包含强化转移服务,用于把一件装备的星级迁移到另一件装备。当前实现的规则:
- 源装备必须已强化,目标装备必须可强化且能解析出配方。
- 转移星数 =
floor(源装备星级 × 衰减率),衰减率取值范围0~1。 - 转移星数会被截断到目标配方的
limits.max_star。 - 触发
StrengthenTransferEvent,允许外部取消或改写转移星数,改写后仍会重新截断。 - 转移星数 ≤ 0 时中止转移。
- 目标配方存在分支树且在该星级需要分支选择时,转移会被拒绝。
- 转移会把目标装备的锻印重置为 0。
当前版本没有提供触发转移的内置命令或 GUI 入口,该服务面向 API 与后续功能扩展。