强化流程
这一页拆解 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 命令重新设定星级,这会触发完整的属性重写。