跳到主要内容

PRD-038 烹饪与制药

文档编号:PRD-038
版本:v1.0
状态:已通过
适用端:服务端 / 客户端
脚本挂载:lua/life/craft.lua

1. 背景与目标​

烹饪/制药消耗采集材料,产出恢复、增益与战斗道具。配方、成功率、品质适合用 Lua 配置,便于活动期快速加配方。

目标

  • 配方由生活技能等级解锁,支持普通/熟练/大师品质。
  • 制作有成功率、暴击产出、失败返还部分材料。
  • 产物可交易/绑定按配方配置。

2. 核心规则​

  • 玩家 15 级以上,生活技能达到配方要求。
  • 制作消耗材料 + 体力 + 金币,读条 3 秒。
  • 成功率 = 基础 + 技能等级加成 + 工具加成,上限 95%。
  • 成功产出 1–3 个产物,10% 概率暴击额外 1 个。
  • 失败返还 30% 材料(可配置),消耗体力。
  • 产物分普通/优质/完美,品质影响效果强度。

3. 服务端设计​

3.1 Lua 脚本设计​

-- lua/life/craft.lua
Craft = {
recipes = {
[8001] = {
skill = "cook", level = 3,
materials = { {id=5011,count=2}, {id=5012,count=1} },
output = 6001, success = 0.75,
quality = { normal=0.7, fine=0.25, perfect=0.05 },
},
},
}

function OnCraft(ctx, role, recipe_id, count)
local r = Craft.recipes[recipe_id]
if not r then return ctx:Fail(role, "配方不存在") end
if ctx:GetLifeLevel(role, r.skill) < r.level then
return ctx:Fail(role, "生活技能不足")
end
if not ctx:ConsumeMaterials(role, r.materials, count) then
return ctx:Fail(role, "材料不足")
end
local qty = 0
for i=1,count do
if ctx:Random() <= r.success then qty = qty + ctx:RandomInt(1,3) end
end
if qty == 0 then ctx:RefundMaterials(role, r.materials, 0.3) end
ctx:GrantCrafted(role, r.output, qty, ctx:PickQuality(r.quality))
end
  • 材料扣除/返还在同一事务,脚本不直接操作背包。
  • 品质随机由脚本调用 PickQuality,服务端记录。
  • 新配方只加 Lua 配置,不改协议。

3.2 协议​

方向协议说明
C→SCS_CraftStart制作
C→SCS_CraftCancel取消
S→CSC_CraftProgress读条
S→CSC_CraftResult产物/品质/失败

3.3 配方与解锁​

  • 配方来源:生活技能升级、NPC 购买、活动掉落。
  • 解锁状态持久化,脚本只校验。
  • 配方可设置每日制作次数。

4. 客户端设计​

  • 配方列表:分类、等级、材料、成功率、产物预览。
  • 制作数量选择、材料不足高亮、一键购买缺失材料。
  • 读条与成功/失败动画,品质颜色区分。
  • 产物对比:恢复量/增益效果/持续时间。
  • 配方解锁提示与来源。

5. 配置与 Lua 接口​

配置说明
recipe_id配方
skill / level生活技能要求
materials材料列表
output产物与数量
success基础成功率
quality品质权重

Lua 接口:GetLifeLevel、ConsumeMaterials、RefundMaterials、Random、PickQuality、GrantCrafted。

6. 边界与异常​

场景处理
材料不足拒绝,不扣任何材料
背包满产物转邮件
读条中移动打断,返还材料(可配置)
重复制作请求幂等/加锁
配方被删除登录清理,提示
脚本异常回滚材料,记录日志

7. 验收标准​

  • 配方解锁/制作/成功/失败/品质/暴击正确。
  • 材料扣除与返还事务一致。
  • 新配方可通过 Lua 热更加入。
  • 背包满/断线/重复请求不丢材料。
  • 客户端产物与品质显示正确。