Skip to content

分支树系统

强化分支树用嵌套结构描述装备在不同星级段可以走的强化路线,让同一件装备按路线获得不同的属性、技能和展示。

概念

  • 分支节点:分支树中的一个节点,包含自己的星级阶段定义。
  • 分叉点:节点的 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_idstring节点所在的 key(根节点为 root分支标识符。
display_namestring分支显示名。
fork_after_starinteger-1在此星级完成后进入子分支。-1 表示不再分叉。
starsmap此分支内的星级阶段定义,格式与线性配方的 stars 完全相同。
childrenmap子分支节点,key 为子分支 ID。

节点的 starschildren 同时为空时,该节点会被忽略。

分支对装备的影响

装备的属性、技能和展示按分支路径累计:从根节点沿已选路径向下,收集路径上所有节点中不超过当前星级的星级阶段,再累加它们的效果。

具体影响:

  • 变量累计:路径上各星级 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 与后续功能扩展。