跳到主要内容

PRD-023 宝石镶嵌与合成

文档编号:PRD-023
版本:v1.0
状态:已通过
适用端:服务端 / 客户端
关联模块:ScenesServer/Item.cpp、tbl/Gem.xml、RecordServer

1. 背景与目标​

宝石是装备的二级养成线,当前存在孔位数据未持久化、拆卸后宝石消失、合成成功率可被客户端伪造等问题。本 PRD 统一宝石的孔位、镶嵌、拆卸、合成与属性计算。

目标

  • 每件装备最多 4 个孔位,孔位类型与装备品质相关。
  • 宝石可镶嵌、拆卸、合成,操作可逆且有成本。
  • 属性实时汇总,客户端展示与计算一致。

2. 核心规则​

2.1 孔位​

装备品质孔位数孔位类型
精良2攻击/防御
史诗3攻击/防御/生命
传说4攻击/防御/生命/特殊
  • 孔位在装备生成时随机/固定,可使用打孔器新增(最多 4)。
  • 孔位有类型限制,宝石类型必须匹配。
  • 孔位数据绑定 item_uid,不可转移到其他装备。

2.2 宝石等级​

  • 宝石 1–10 级,属性随等级指数增长。
  • 3 颗同级宝石合成 1 颗高一级宝石,成功率 100%(或按配置)。
  • 合成绑定:绑定宝石合成后仍绑定。

2.3 镶嵌与拆卸​

  • 镶嵌:装备已穿戴/在背包、孔位为空、宝石类型匹配。
  • 拆卸:消耗拆卸符,宝石回到背包;背包满则拒绝。
  • 拆卸不损失宝石,但绑定宝石拆卸后仍绑定。
  • 装备强化/升星不影响孔位与宝石。

3. 服务端设计​

3.1 模块职责​

模块职责
GemManager镶嵌、拆卸、合成、孔位管理
AttributeManager宝石属性汇总
ItemManager宝石/拆卸符扣除与返还
RecordServer孔位、宝石、绑定持久化

3.2 数据结构​

struct GemSlot {
uint8_t socket_index;
uint8_t socket_type;
uint32_t gem_item_id; // 0 表示空
uint32_t gem_level;
};

struct EquipGemData {
uint64_t item_uid;
GemSlot sockets[4];
};

3.3 协议​

方向协议说明
C→SCS_GemInlay镶嵌
C→SCS_GemRemove拆卸
C→SCS_GemCombine合成
C→SCS_GemOpenSocket打孔
S→CSC_GemUpdate孔位/宝石变化
S→CSC_GemCombineResult合成结果

3.4 镶嵌流程​

CS_GemInlay(item_uid, socket_index, gem_uid)
→ 校验装备归属、孔位存在且为空
→ 校验宝石类型匹配、宝石存在
→ 扣除宝石、写入孔位
→ 重算属性
→ 广播 SC_GemUpdate + SC_AttributeUpdate
→ 异步持久化

3.5 合成与日志​

  • 合成必须一次消耗 3 颗同级同类宝石,返回 1 颗高一级。
  • 使用事务:扣 3 颗、加 1 颗、写日志同时成功。
  • 合成日志记录宝石 ID/等级/数量/结果,便于回档。
  • 失败配置(如有)需记录随机种子。

4. 客户端设计​

  • 装备详情显示 4 个孔位,空孔位显示类型图标。
  • 点击孔位弹出可镶嵌宝石列表,按类型过滤。
  • 宝石对比:显示替换后属性变化。
  • 拆卸二次确认,提示消耗与背包空间。
  • 合成界面:选择 3 颗同级宝石,预览结果与成功率。
  • 属性面板实时刷新宝石加成。

5. 配置与数值​

tbl/Gem.xml 字段:

字段说明
id宝石 ID
type攻击/防御/生命/特殊
level等级
attr属性类型与数值
next_id合成后的宝石 ID
combine_count合成所需数量
bind_type绑定规则

6. 边界与异常​

场景处理
孔位已满拒绝镶嵌
宝石类型不匹配拒绝并提示
背包满时拆卸拒绝,宝石保留在孔位
装备被分解/出售先卸下宝石或禁止操作
合成时材料不足拒绝,不扣任何宝石
重复镶嵌请求幂等,按孔位当前状态返回
断线已扣宝石的镶嵌结果保留,重连同步

7. 埋点与运营​

  • 宝石等级分布、合成成功率、拆卸频率。
  • 各类型宝石产出/消耗与市场价格。
  • 后台可调整合成数量、属性、打孔成功率。

8. 验收标准​

  • 4 个孔位的镶嵌/拆卸/打孔正确,属性实时更新。
  • 宝石类型、等级、绑定规则校验完整。
  • 合成扣 3 返 1,事务一致,无复制。
  • 背包满/装备变化/断线时不丢宝石。
  • 客户端孔位与属性与服务端一致。