跳到主要内容

PRD-002 竞技场与天梯

文档编号:PRD-002
版本:v1.0
状态:已通过
适用端:服务端 / 客户端
关联模块:MiniServer、ScenesServer/Arena.cpp、RecordServer

1. 背景与目标​

竞技场提供 1v1/3v3 公平对抗与赛季追求。当前存在匹配战力差过大、掉线判负不给补偿、赛季积分重置错误等问题。本 PRD 统一匹配、战斗、积分、赛季与结算。

2. 核心规则​

2.1 模式​

模式人数开放时间积分
1v12全天有
3v36每日 12:00–24:00有
练习赛2/6全天无
  • 公平模式:统一等级/属性模板,只保留职业与技能差异。
  • 装备模式:使用真实属性,按战力分段匹配。

2.2 匹配​

  • 按积分/战力分段,等待超过 30 秒逐级放宽。
  • 同队/同帮会优先不匹配。
  • 连续匹配失败可加入机器人(按配置)。
  • 匹配成功后 15 秒内确认,超时判负/禁赛 5 分钟。

2.3 积分与赛季​

  • 胜 +2030,负 -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→SCS_ArenaQueue报名匹配
C→SCS_ArenaCancel取消匹配
C→SCS_ArenaReady确认进入
S→CSC_ArenaMatch匹配成功
S→CSC_ArenaState比分/倒计时
S→CSC_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 匹配、确认、战斗、结算正确。
  • 积分增减、软重置、赛季奖励正确。
  • 掉线/超时/平局处理一致。
  • 公平模式属性模板生效。
  • 恶意送分可被识别与处罚。