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→S | CS_CraftStart | 制作 |
| C→S | CS_CraftCancel | 取消 |
| S→C | SC_CraftProgress | 读条 |
| S→C | SC_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 热更加入。
- 背包满/断线/重复请求不丢材料。
- 客户端产物与品质显示正确。