跳到主要内容

PRD-001 国战与攻城战

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

1. 背景与目标​

国战/攻城战是服务器级的大规模 PvP 玩法,承载阵营荣誉与资源分配。当前存在报名人数超限、城门耐久不同步、大将军死亡后结算重复等问题。本 PRD 统一报名、战场、城门/将军、积分、结算与补偿。

2. 核心规则​

2.1 报名与分组​

  • 以帮会为单位报名,帮主/副帮主发起,成员确认。
  • 单场最多 200 人(按服务器承载配置),分攻/守两方。
  • 报名截止前可取消,开战后不可退出。
  • 匹配按帮会战力/上周战绩分组,避免一边倒。

2.2 战场目标​

目标说明积分
城门攻方摧毁城门进入内城500
守护塔攻方摧毁 2 座塔每座 200
大将军击杀守方大将军1000
坚守守方守住大将军至结束1500
  • 攻方需依次摧毁城门 → 守护塔 → 大将军。
  • 守方可修复城门/塔,消耗战场资源。
  • 战场时间 60 分钟,提前达成目标结束。

2.3 积分与胜负​

  • 击杀玩家 +5,助攻 +2,摧毁建筑按上表。
  • 时间结束未击杀大将军,守方胜。
  • 积分相同按大将军剩余血量/城门剩余耐久判定。

2.4 奖励​

  • 胜方:国家声望、帮会资金、限定称号、拍卖分红。
  • 负方:参与奖、少量声望。
  • MVP 按击杀/治疗/建筑伤害评选,额外奖励。
  • 奖励邮件发放,赛季结束统一结算排名奖励。

3. 服务端设计​

3.1 数据结构​

struct WarMatch {
uint64_t war_id;
uint32_t country_a, country_b;
std::vector<uint64_t> attackers, defenders;
uint32_t gate_hp, gate_max;
uint32_t tower_hp[2];
uint64_t general_id;
uint32_t start_time, end_time;
uint8_t state;
};

struct WarScore {
uint64_t guild_id;
uint32_t kill_score;
uint32_t building_score;
uint32_t total;
};

3.2 协议​

方向协议说明
C→SCS_WarRegister报名
C→SCS_WarEnter进入战场
C→SCS_WarRepair修复城门/塔
S→CSC_WarState比分/城门/塔/倒计时
S→CSC_WarScore帮会/个人积分
S→CSC_WarResult胜负/奖励

3.3 战场同步​

  • 战场由 MiniServer 创建独立场景,跨服帮会通过映射进入。
  • 城门/塔血量以服务端为准,客户端只做表现。
  • 建筑伤害按技能/普攻统一结算,禁止客户端上报伤害。
  • 每 5 秒广播一次战场状态,关键事件立即广播。

3.4 结算与补偿​

  • 结算幂等键 war_id,只发一次奖励。
  • 掉线玩家保留积分,奖励邮件补发。
  • 服务器崩溃按战场快照恢复或判定守方胜,补偿参与奖。
  • 战场内禁止交易/邮件附件/商店购买。

4. 客户端设计​

  • 国战面板:报名、阵营、战场时间、奖励预览。
  • 战场地图:城门/塔/大将军位置、血量、归属。
  • 比分板:双方积分、帮会排名、个人贡献。
  • 建筑目标血条、摧毁/修复提示。
  • 结算:胜负、MVP、奖励、战场回顾。

5. 配置​

CountryWar.xml:max_players、war_duration、gate_hp、tower_hp、general_hp、repair_cost、score_rules、reward_group。

6. 边界与异常​

场景处理
报名人数超限按帮会战力/报名顺序截断
开战后退出禁止,掉线保留积分
城门/塔被同时攻击服务端串行扣耐久
大将军被击杀瞬间结算锁定战场状态,只结算一次
跨服帮会MiniServer 映射,失败提示
服务器崩溃快照恢复/守方胜 + 补偿

7. 验收标准​

  • 报名/分组/进入/战场目标/结算全流程正确。
  • 城门/塔/大将军耐久与伤害服务端权威。
  • 200 人同场同步流畅,关键事件不丢失。
  • 结算奖励幂等,掉线可补发。
  • 跨服帮会进入与积分统计正确。