PRD-026 副本系统
文档编号:PRD-026
版本:v1.0
状态:已通过
适用端:服务端 / 客户端
关联模块:ScenesServer、MiniServer、tbl/Dungeon.xml、lua/fuben/
1. 背景与目标
副本承载剧情推进、装备产出与日常玩法。当前副本存在次数扣减时机不一致、掉线后进度丢失、结算重复发奖等问题。本 PRD 统一下副本的创建、进度、失败、结算与次数管理。
目标
- 单人/组队/团队副本共用一套生命周期。
- 次数、进度、奖励结算具备幂等与回档能力。
- 支持普通、精英、挑战、限时四种难度。
2. 核心规则
2.1 副本类型
| 类型 | 人数 | 次数 | 复活限制 | 典型产出 |
|---|---|---|---|---|
| 剧情 | 1 | 一次性 | 无限 | 经验、主线道具 |
| 日常 | 1–5 | 每日 1–3 次 | 3 次 | 材料、金币 |
| 精英 | 1–5 | 每日 1 次 | 2 次 | 装备、图纸 |
| 团队 | 10–20 | 每周 1 次 | 1 次 | 套装、稀有材料 |
| 挑战 | 1–5 | 每周 | 0 | 排名、称号 |
2.2 生命周期
创建房间 → 准备/倒计时 → 进入副本 → 战斗推进 → BOSS 击杀
→ 结算(成功/失败/超时)→ 发放奖励 → 解散/传送出本
2.3 次数与消耗
- 次数在 进入副本时 扣减,失败/退出不返还(可配置)。
- 门票在创建房间时扣除,创建失败原路退回。
- 每日 0 点重置,周常周一 0 点重置。
- 协助他人不消耗次数,但无奖励(可配置侠义值)。
2.4 进度与失败
- 副本进度按击杀的 BOSS/关卡记录,掉线重连可回到当前进度。
- 全员死亡/超时/离开副本地图视为失败。
- 失败后保留已击杀 BOSS 的进度,允许重新进入继续(按配置)。
- 副本内禁止使用回城/传送类道具(可配置白名单)。
3. 服务端设计
3.1 模块职责
| 模块 | 职责 |
|---|---|
DungeonManager | 创建、进入、进度、结算、销毁 |
ScenesServer | 副本场景实例与怪物管理 |
MiniServer | 跨地图/跨服副本调度(团队本) |
RecordServer | 次数、进度、通关记录 |
3.2 数据结构
struct DungeonInstance {
uint64_t instance_id;
uint32_t dungeon_id;
uint32_t leader_id;
std::vector<uint64_t> members;
uint8_t state; // WAITING/FIGHTING/SETTLING/CLOSED
uint32_t enter_time;
uint32_t deadline_ms;
std::vector<uint32_t> cleared_stages;
};
struct DungeonCd {
uint32_t dungeon_id;
uint32_t used_today;
uint32_t used_week;
uint32_t last_reset_day;
};
3.3 协议
| 方向 | 协议 | 说明 |
|---|---|---|
| C→S | CS_DungeonCreate | 创建房间 |
| C→S | CS_DungeonEnter | 进入副本 |
| C→S | CS_DungeonLeave | 主动离开 |
| C→S | CS_DungeonRevive | 副本内复活 |
| S→C | SC_DungeonInfo | 副本信息、进度、倒计时 |
| S→C | SC_DungeonStage | 关卡/ BOSS 进度 |
| S→C | SC_DungeonResult | 结算结果与奖励 |
| S→C | SC_DungeonCd | 次数同步 |
3.4 结算流程
BOSS 死亡/最后关卡完成
→ 锁定副本状态为 SETTLING
→ 校验所有成员是否在副本内
→ 计算奖励(基础 + 贡献 + 首通 + 队长)
→ 写奖励日志 + 发邮件/直接入包
→ 广播 SC_DungeonResult
→ 传送出本 → 销毁实例
3.5 幂等与回档
- 每个副本实例只允许结算一次,
instance_id作为幂等键。 - 奖励发放失败进入补偿队列,邮件补发。
- 服务器重启后,未结算实例标记为异常,按进度补发基础奖励。
- 次数扣减与创建房间在同一事务,避免只扣不进。
4. 客户端设计
- 副本大厅:按类型/等级/难度筛选,显示次数、推荐战力、奖励预览。
- 创建房间:选择难度、人数、是否公开,显示门票消耗。
- 副本内 HUD:倒计时、关卡进度、复活次数、队伍成员状态。
- 结算面板:通关/失败、用时、伤害占比、奖励列表、再次挑战。
- 掉线重连:重新进入副本当前进度,不重复播放结算。
5. 配置与数值
tbl/Dungeon.xml 字段:
| 字段 | 说明 |
|---|---|
id | 副本 ID |
type | 剧情/日常/精英/团队/挑战 |
map_id | 副本地图 |
min_level / max_level | 等级限制 |
player_min / player_max | 人数限制 |
daily_limit / weekly_limit | 次数限制 |
time_limit | 时限(秒) |
revive_limit | 复活次数 |
stages | 关卡与 BOSS 列表 |
rewards | 基础/首通/队长奖励 |
ticket_item | 门票道具 |
6. 边界与异常
| 场景 | 处理 |
|---|---|
| 队员未全部进入 | 倒计时结束未进入者视为放弃,不扣其次数 |
| 队长解散 | 副本内成员收到通知,10 秒后传出 |
| 结算时掉线 | 奖励通过邮件补发 |
| 重复结算请求 | 按 instance_id 幂等,返回首次结果 |
| 副本内使用回城 | 拒绝并提示 |
| 服务器重启 | 未完成实例标记异常,按进度补偿 |
| 次数跨天 | 以进入时间所在自然日计算 |
7. 埋点与运营
- 副本创建/进入/通关/失败率、平均用时、复活次数。
- 各 BOSS 通关率与灭团点。
- 奖励产出与市场流通量监控。
- 后台可调整次数、掉落、难度系数、补偿邮件。
8. 验收标准
- 五类副本均可创建、进入、推进、结算、退出。
- 次数只在进入时扣减,失败/退出按配置处理。
- 掉线重连回到当前进度,不重复发奖。
- 结算奖励与日志一致,邮件补发可追踪。
- 团队副本 20 人同时进入无卡顿/掉线。
- 服务器重启后副本状态可恢复或安全关闭。