PRD-002 竞技场与天梯
文档编号:PRD-002
版本:v1.0
状态:已通过
适用端:服务端 / 客户端
关联模块:MiniServer、ScenesServer/Arena.cpp、RecordServer
1. 背景与目标
竞技场提供 1v1/3v3 公平对抗与赛季追求。当前存在匹配战力差过大、掉线判负不给补偿、赛季积分重置错误等问题。本 PRD 统一匹配、战斗、积分、赛季与结算。
2. 核心规则
2.1 模式
| 模式 | 人数 | 开放时间 | 积分 |
|---|---|---|---|
| 1v1 | 2 | 全天 | 有 |
| 3v3 | 6 | 每日 12:00–24:00 | 有 |
| 练习赛 | 2/6 | 全天 | 无 |
- 公平模式:统一等级/属性模板,只保留职业与技能差异。
- 装备模式:使用真实属性,按战力分段匹配。
2.2 匹配
- 按积分/战力分段,等待超过 30 秒逐级放宽。
- 同队/同帮会优先不匹配。
- 连续匹配失败可加入机器人(按配置)。
- 匹配成功后 15 秒内确认,超时判负/禁赛 5 分钟。
2.3 积分与赛季
- 胜 +20
30,负 -10-20,按对手积分差修正。 - 积分低于 1000 时失败不扣分。
- 赛季 90 天,结束时按排名发奖。
- 新赛季积分软重置:
new = 1000 + (old - 1000) × 0.3。
3. 服务端设计
3.1 数据结构
struct ArenaPlayer {
uint64_t role_id;
uint32_t rating;
uint32_t wins, losses;
uint32_t season_id;
uint32_t ban_until;
};
struct ArenaMatch {
uint64_t match_id;
std::vector<uint64_t> team_a, team_b;
uint8_t state;
uint32_t start_time;
};
3.2 协议
| 方向 | 协议 | 说明 |
|---|---|---|
| C→S | CS_ArenaQueue | 报名匹配 |
| C→S | CS_ArenaCancel | 取消匹配 |
| C→S | CS_ArenaReady | 确认进入 |
| S→C | SC_ArenaMatch | 匹配成功 |
| S→C | SC_ArenaState | 比分/倒计时 |
| S→C | SC_ArenaResult | 胜负/积分变化 |
3.3 战斗与结算
- 匹配成功创建独立场景实例,双方传送到对应出生点。
- 倒计时 3 秒开始,击杀全部敌人/时间结束按剩余人数判定。
- 掉线 60 秒判负,队友可继续 3v3。
- 结算幂等:
match_id + role_id,重复请求返回首次结果。
3.4 防作弊
- 公平模式使用服务端模板属性,不读客户端装备。
- 校验技能 CD、移动速度、位置,异常记录。
- 同一队伍恶意送分触发风控,扣分/禁赛。
4. 客户端设计
- 竞技场大厅:模式、积分、排名、赛季时间、奖励预览。
- 匹配中显示等待时间、预计分段、取消按钮。
- 确认弹窗 15 秒倒计时。
- 战斗 HUD:双方头像、血量、击杀数、倒计时。
- 结算:胜负、积分变化、连胜、奖励。
5. 配置
Arena.xml:mode、rating_range、max_wait、win_score、lose_score、season_days、reset_factor、bot_after。
6. 边界与异常
| 场景 | 处理 |
|---|---|
| 匹配中下线 | 取消匹配 |
| 确认超时 | 判负/短暂禁赛 |
| 战斗掉线 | 60 秒判负,队友继续 |
| 平局 | 按剩余血量/伤害判定 |
| 赛季结算时在线 | 邮件发奖 |
| 重复结算 | 幂等 |
7. 验收标准
- 1v1/3v3 匹配、确认、战斗、结算正确。
- 积分增减、软重置、赛季奖励正确。
- 掉线/超时/平局处理一致。
- 公平模式属性模板生效。
- 恶意送分可被识别与处罚。