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否空—分支显示名 (用于 GUI 中的选择界面)
fork_after_starinteger否-1-1 或正整数在此星级完成后进入子分支. -1 表示不再分叉; 有 children 时 -1 无法分叉
starsmap否空键为目标星级正整数此分支内的星级阶段定义, 格式与线性配方的 stars 完全相同
childrenmap否空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 与后续功能扩展