PRD-006 称号与成就
文档编号:PRD-006
版本:v1.0
状态:已通过
适用端:服务端 / 客户端
关联模块:SessionServer/Achievement.cpp、tbl/Title.xml、tbl/Achievement.xml
1. 背景与目标
称号与成就承载目标感与展示需求。当前存在称号属性可叠加、成就进度重复统计、限时称号过期不消失等问题。本 PRD 统一称号获取、佩戴、属性与成就进度。
2. 核心规则
2.1 称号
- 来源:等级、任务、成就、活动、排行榜、GM。
- 同时只能佩戴 1 个称号,提供属性与头顶显示。
- 称号分永久/限时,限时到期自动卸下。
- 称号属性只取当前佩戴,不叠加。
2.2 成就
- 成就分章节,完成条件获得成就点与奖励。
- 成就点用于解锁成就等级与阶段奖励。
- 进度由 EventBus 统一驱动,避免重复统计。
- 隐藏成就完成后才显示。
2.3 展示
- 头顶称号、聊天前缀、排行榜展示。
- 可设置隐藏称号外观(属性仍生效)。
- 称号图鉴展示来源与获取时间。
3. 服务端设计
3.1 数据结构
struct TitleData {
uint32_t title_id;
uint64_t expire_ms; // 0 表示永久
bool unlocked;
};
struct AchievementData {
uint32_t achievement_id;
uint32_t progress;
uint32_t target;
bool completed;
bool claimed;
};
3.2 协议
| 方向 | 协议 | 说明 |
|---|---|---|
| C→S | CS_TitleEquip | 佩戴/卸下 |
| C→S | CS_TitleList | 称号列表 |
| C→S | CS_AchievementClaim | 领取成就奖励 |
| S→C | SC_TitleList | 称号/当前佩戴 |
| S→C | SC_AchievementList | 成就进度 |
| S→C | SC_TitleChange | 广播头顶称号 |
3.3 进度与事务
- 成就进度由事件累加,上限为目标值。
- 完成时只标记一次,重复事件不重复发奖。
- 称号到期定时任务清除佩戴并重算属性。
- 领取奖励与标记已领取在同一事务。
4. 客户端设计
- 称号面板:已解锁/未解锁、来源、属性、佩戴/卸下。
- 头顶称号实时刷新,聊天前缀同步。
- 成就章节:进度条、完成状态、领取按钮、成就点。
- 隐藏成就显示“???”直到完成。
- 称号到期倒计时与提示。
5. 配置
Title.xml:title_id、name、attr、expire_type、source、display_priority。
Achievement.xml:achievement_id、chapter、condition、target、points、reward。
6. 边界与异常
| 场景 | 处理 |
|---|---|
| 称号重复获得 | 延长时限/转换为代币 |
| 佩戴已过期称号 | 拒绝,自动卸下 |
| 成就进度回退 | 只增不减 |
| 重复领取 | 幂等 |
| 称号属性与装备冲突 | 按加法汇总,不覆盖 |
| 断线 | 佩戴状态持久化,登录恢复 |
7. 验收标准
- 称号获取/佩戴/卸下/过期正确。
- 称号属性只生效一个,不叠加。
- 成就进度、完成、领取、成就点正确。
- 头顶/聊天/排行榜展示同步。
- 重复事件/领取不刷奖励。