PRD-030 技能系统
文档编号:PRD-030
版本:v1.0
状态:已通过
适用端:服务端 / 客户端
关联模块:SkillBase.xml、SkillStatusManager、ScenesServer/Skill.cpp
1. 背景与目标
技能是战斗的核心输入,当前存在技能学习条件不统一、冷却与公共 CD 计算分散、客户端可绕过前置释放等问题。本 PRD 统一技能从学习、装配、释放到中断的完整链路。
目标
- 技能学习、升级、遗忘有明确前置与消耗。
- 服务端统一校验冷却、距离、目标、消耗、状态。
- 客户端技能栏、CD、施法条与服务端状态一致。
不做
- 不重做技能特效资源。
- 不新增技能类型(本期只整合现有主动/被动/光环)。
2. 核心规则
2.1 技能分类
| 类型 | 说明 | 是否占技能栏 |
|---|---|---|
| 主动技能 | 需玩家点击释放 | 是 |
| 被动技能 | 学习后永久生效 | 否 |
| 光环技能 | 对范围内友方持续生效 | 否 |
| 生活技能 | 采集/制造,非战斗 | 否 |
2.2 学习与升级
- 学习需要:等级、前置技能、技能书/技能点、职业限制。
- 技能等级上限受角色等级和技能品阶限制。
- 升级消耗技能点/金币,允许重置(返还比例可配置)。
- 遗忘技能:非战斗状态、消耗道具、清除该技能 Buff。
2.3 释放规则
- 角色存活、未处于眩晕/沉默/缴械等禁止状态。
- 技能已学习且等级足够。
- 公共 CD 与技能 CD 均已结束。
- 消耗(MP/怒气/道具)足够。
- 目标合法:敌对/友方/自身/地面,距离与视野符合。
- 施法时间:瞬发立即结算;读条技能在结束时再次校验目标与距离。
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→S | CS_SkillLearn | 学习技能 |
| C→S | CS_SkillUpgrade | 升级技能 |
| C→S | CS_SkillForget | 遗忘技能 |
| C→S | CS_SkillCast | 释放技能(技能 ID、目标 ID/坐标) |
| C→S | CS_SkillCancel | 取消读条/引导 |
| S→C | SC_SkillList | 全量技能列表 |
| S→C | SC_SkillCastStart | 开始施法,含读条时长 |
| S→C | SC_SkillCastResult | 成功/失败/打断及原因 |
| S→C | SC_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 交互流程
- 打开技能面板,查看已学/可学技能。
- 拖拽技能到快捷栏,保存装配。
- 点击快捷栏或按快捷键释放。
- 客户端播放起手动作、施法条;收到结果后播放命中/失败表现。
- 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 状态正确恢复。