Skip to content

强化流程

这一页拆解 EmakiStrengthen 的完整强化流程:从打开界面到强化完成,中间经历了哪些步骤,成功率怎么算,失败了会怎样,数据存在哪里,以及物品刷新是怎么工作的。

完整强化流程

1. 打开 GUI
   └── 玩家执行 /estrengthen open 或通过其他方式打开强化界面

2. 放入装备
   └── 把装备放进 target_item 槽位(槽位 13)

3. 配方解析
   ├── StrengthenRecipeResolver 遍历所有已加载配方
   ├── 按 match 规则逐一匹配(source_types → source_ids → source_patterns → slot_groups → lore_contains → stats_any)
   ├── 匹配成功 → 加载对应配方,显示当前星级和下一阶段信息
   └── 无匹配 → 提示装备不可强化

4. 放入材料
   └── 把材料放进 material_input 槽位(槽位 19/20/29/30)

5. 材料计划解析
   ├── MaterialPlanResolver 读取当前星级阶段的 materials 需求
   ├── 逐一检查材料槽位中的物品是否匹配
   ├── 匹配成功 → 标记材料为可消耗,更新预览
   └── 匹配失败 → 提示缺少材料

6. 预览计算
   ├── 计算强化后的属性变化
   ├── 计算成功率(含锻印加成)
   ├── 计算经济费用
   └── 在 preview_display 槽位(槽位 15)显示预览

7. 确认强化
   └── 玩家点击 confirm 按钮(槽位 40)

8. 执行强化尝试
   ├── ChanceCalculator 计算最终成功率
   ├── 随机判定成功/失败
   ├── 成功 → 进入成功流程
   └── 失败 → 进入失败流程

9. 成功流程
   ├── 提升星级
   ├── StrengthenSnapshotBuilder 重建强化层
   ├── 写入新的 stats 和 attributes
   ├── 更新 structured_presentation
   ├── 执行 success_actions
   └── 重置锻印等级为 0

10. 失败流程
    ├── 检查是否有保护道具
    ├── 有保护 → 消耗保护道具,不降星
    ├── 无保护 → 根据配置降星或产生裂痕(crack)
    ├── 锻印等级 +1(不超过 max_temper)
    └── 执行 failure_actions

11. PDC 写入
    ├── StrengthenPdcAttributeWriter 更新 PDC 数据
    ├── 写入当前星级、锻印等级、裂痕等级等
    └── 更新审计数据

12. 经济扣费
    └── StrengthenEconomyService 按 cost_formula 扣除费用

13. 消耗材料
    └── 从材料槽位中扣除对应数量的材料

14. 广播
    ├── 星级 ≥ local_stars → 局部广播(半径内玩家可见)
    └── 星级 ≥ global_stars → 全局广播(全服可见)

注意步骤 12 和 13 的顺序:先扣钱再扣材料。不管成功还是失败,材料和费用都会被消耗。

ChanceCalculator 成功率计算

基础公式

最终成功率 = min(base_rate + temper_bonus, success_chance_cap)
变量说明从哪来
base_rate基础成功率配方的 success_rates,没配就用全局 config.yml
temper_bonus锻印加成当前锻印等级 × temper_chance_bonus_per_level
success_chance_cap成功率上限配方的 limits.success_chance_cap

计算示例

假设:

  • 目标星级 7 的基础成功率 = 40%
  • 当前锻印等级 = 5
  • 每级锻印加成 = 1.5%
  • 成功率上限 = 95%
temper_bonus = 5 × 1.5 = 7.5%
最终成功率 = min(40 + 7.5, 95) = 47.5%

也就是说,这个玩家之前失败了 5 次积累了 5 级锻印,让成功率从 40% 提升到了 47.5%。

锻印(Temper)机制

锻印是一种失败补偿机制,核心思路是"越失败越容易成功":

  • 每次强化失败,锻印等级 +1(不超过 max_temper
  • 每级锻印加 temper_chance_bonus_per_level 的成功率
  • 强化成功后,锻印等级归零
  • 锻印等级存在装备的 PDC 数据里,跟着装备走

这样设计是为了避免玩家连续失败太多次后彻底放弃。锻印积累到一定程度,成功率会明显提升,给玩家一个"再试一次"的动力。

失败处理

有保护道具

强化失败

检测到保护道具

消耗保护道具

星级不变,不产生裂痕

锻印等级 +1

执行 failure_actions

保护道具的价值在于:虽然这次失败了,但至少不会降星。而且锻印还是会 +1,所以下次成功率更高。

无保护道具

强化失败

无保护道具

根据配置执行惩罚:
    ├── 降星(星级 -1,最低降至 0)
    └── 产生裂痕(crack_level +1)

锻印等级 +1

执行 failure_actions

裂痕(crack)是装备的一种损伤状态,可能影响装备的属性或外观展示。管理员可以用 /estrengthen clearcrack 命令清除裂痕,也可以设计游戏内的修复机制。

数据存储

强化数据通过 PDC(PersistentDataContainer)存储在装备物品上。这意味着数据跟着物品走,不依赖外部数据库。详细的数据结构和读取方式参见 API 与集成 页面。

StrengthenRefreshService

和 EmakiForge 的物品刷新服务类似,StrengthenRefreshService 解决的是"配方改了之后,已强化装备的展示怎么跟着更新"的问题。

触发时机

  • 玩家打开背包时
  • 玩家手持物品切换时
  • 管理员执行 /estrengthen refresh 命令时
  • 配方资源重载后

刷新流程

检测物品是否包含 strengthen layer 数据

读取物品 PDC 中的 strengthen audit map

获取 recipe_id,查找对应配方
    ├── 配方不存在 → 跳过(可能是配方被删了)
    └── 配方存在 ↓
用当前配方定义计算新签名

和物品上存储的 materials_signature 比较
    ├── 签名一致 → 不需要刷新
    └── 签名不一致 → 执行刷新

    根据 current_star 获取对应星级阶段的 structured_presentation

    通过 AssemblyService 重建物品展示

    更新 materials_signature

提示

刷新服务只更新展示层(名称、Lore),不会改变已经写入的属性数值。如果你需要重置属性,用 /estrengthen setstar 命令重新设定星级,这会触发完整的属性重写。

Released under the GPL-3.0 License