跳到主要内容

PRD-030 技能系统

文档编号:PRD-030
版本:v1.0
状态:已通过
适用端:服务端 / 客户端
关联模块:SkillBase.xml、SkillStatusManager、ScenesServer/Skill.cpp

1. 背景与目标​

技能是战斗的核心输入,当前存在技能学习条件不统一、冷却与公共 CD 计算分散、客户端可绕过前置释放等问题。本 PRD 统一技能从学习、装配、释放到中断的完整链路。

目标

  • 技能学习、升级、遗忘有明确前置与消耗。
  • 服务端统一校验冷却、距离、目标、消耗、状态。
  • 客户端技能栏、CD、施法条与服务端状态一致。

不做

  • 不重做技能特效资源。
  • 不新增技能类型(本期只整合现有主动/被动/光环)。

2. 核心规则​

2.1 技能分类​

类型说明是否占技能栏
主动技能需玩家点击释放是
被动技能学习后永久生效否
光环技能对范围内友方持续生效否
生活技能采集/制造,非战斗否

2.2 学习与升级​

  • 学习需要:等级、前置技能、技能书/技能点、职业限制。
  • 技能等级上限受角色等级和技能品阶限制。
  • 升级消耗技能点/金币,允许重置(返还比例可配置)。
  • 遗忘技能:非战斗状态、消耗道具、清除该技能 Buff。

2.3 释放规则​

  1. 角色存活、未处于眩晕/沉默/缴械等禁止状态。
  2. 技能已学习且等级足够。
  3. 公共 CD 与技能 CD 均已结束。
  4. 消耗(MP/怒气/道具)足够。
  5. 目标合法:敌对/友方/自身/地面,距离与视野符合。
  6. 施法时间:瞬发立即结算;读条技能在结束时再次校验目标与距离。

2.4 打断与移动​

  • 读条技能受到伤害不打断,受到控制/死亡/主动移动打断。
  • 打断返还消耗比例可配置(默认返还 50% MP)。
  • 引导技能每跳结算,引导者移动/死亡/被控则终止。

3. 服务端设计​

3.1 模块职责​

模块职责
SkillManager技能学习、升级、装配、CD 管理
ScenesServer释放校验、目标选择、伤害/效果触发
SkillStatusManager技能产生的 Buff/Debuff
RecordServer技能栏、技能等级、重置记录持久化

3.2 数据结构​

struct SkillEntry {
uint32_t skill_id;
uint8_t level;
uint32_t next_ready_ms; // 技能冷却结束时间
};

struct SkillRuntime {
std::vector<SkillEntry> skills;
uint32_t global_ready_ms;
uint32_t casting_skill_id;
uint64_t cast_target_id;
uint32_t cast_end_ms;
};

3.3 协议​

方向协议说明
C→SCS_SkillLearn学习技能
C→SCS_SkillUpgrade升级技能
C→SCS_SkillForget遗忘技能
C→SCS_SkillCast释放技能(技能 ID、目标 ID/坐标)
C→SCS_SkillCancel取消读条/引导
S→CSC_SkillList全量技能列表
S→CSC_SkillCastStart开始施法,含读条时长
S→CSC_SkillCastResult成功/失败/打断及原因
S→CSC_SkillCD技能 CD 同步

3.4 释放流程​

CS_SkillCast
→ 校验存活/控制状态/技能等级/目标类型
→ 校验公共 CD + 技能 CD + 消耗
→ 瞬发:立即执行效果
→ 读条:记录 casting 状态,广播 SC_SkillCastStart
→ 读条结束:再次校验目标距离/存活/控制
→ 执行 SkillStatus 效果 → 扣消耗 → 进入 CD
→ 广播 SC_SkillCastResult / SC_SkillCD

3.5 冷却与持久化​

  • 冷却只存在内存,掉线重连按剩余时间恢复;下线超过 30 分钟直接清空。
  • 技能等级、装配栏、重置次数写 RecordServer。
  • 学习/升级使用事务:扣技能点与加技能等级必须同时成功。
  • 技能配置热更通过 //loadtbl,热更后重新计算已学技能的下一等级数据。

4. 客户端设计​

4.1 交互流程​

  1. 打开技能面板,查看已学/可学技能。
  2. 拖拽技能到快捷栏,保存装配。
  3. 点击快捷栏或按快捷键释放。
  4. 客户端播放起手动作、施法条;收到结果后播放命中/失败表现。
  5. CD 以服务端 SC_SkillCD 为准,本地只做平滑倒计时。

4.2 UI 结构​

  • 技能面板:树状分类(职业/通用/生活)、技能详情、学习/升级按钮。
  • 快捷栏:4 组 × 8 格,支持拖拽、清空、锁定。
  • 施法条:显示技能名、剩余时间、可打断标识。
  • 目标指示:地面技能显示范围圈,方向技能显示箭头。
  • 错误提示:MP 不足、距离过远、目标不合法、冷却中、被沉默。

4.3 协议处理​

  • SC_SkillList 全量覆盖本地技能数据,避免增删不同步。
  • SC_SkillCD 携带服务端剩余毫秒,客户端按本地时钟递减,重连后重新校准。
  • SC_SkillCastResult 失败时清除施法条,不进入 CD(除非服务端明确返回已扣)。
  • 读条中断时立即隐藏施法条并播放打断提示。

5. 配置与数值​

tbl/SkillBase.xml 关键字段:

字段说明
id技能 ID
name名称
job职业限制
level_limit学习等级
pre_skill前置技能与等级
max_level等级上限
cast_time读条时间(ms)
cooldown技能 CD(ms)
global_cd公共 CD(ms)
cost_type / cost_value消耗类型与数值
target_type自身/友方/敌方/地面
range施法距离
effect效果文本(见 SkillBase 文档)

6. 边界与异常​

场景处理
连续点击同一技能服务端按 request_id 幂等,只执行一次
读条中目标死亡读条结束校验失败,返回 ERR_TARGET_DEAD,不扣消耗
读条中施法者被控立即打断,按配置返还消耗
技能热更后等级超上限保留等级但属性按新上限截断,邮件通知
技能栏引用了已删除技能登录时清理并补发提示
跨地图释放先中断施法,再执行传送

7. 埋点与运营​

  • skill_cast:技能 ID、等级、目标类型、成功/失败原因、地图。
  • skill_damage:技能 ID、总伤害、命中次数、暴击次数。
  • skill_learn:学习/升级/遗忘、消耗、角色等级。
  • 后台可按职业查看技能使用率与失败率。

8. 验收标准​

  • 未学习、等级不足、前置不满足时无法释放。
  • 公共 CD 与技能 CD 独立计算,不会互相卡死。
  • 读条技能在移动、被控、死亡时正确打断。
  • 客户端 CD 与服务端剩余时间误差小于 200ms。
  • 技能升级扣点与等级变更在同一事务内。
  • 重连后技能栏、等级、CD 状态正确恢复。