跳到主要内容

PRD-071 生存竞技

文档编号:PRD-071
版本:v1.0
状态:已通过
适用端:服务端 / 客户端
脚本挂载:lua/arena/survival.lua

1. 背景与目标​

生存竞技提供大规模淘汰与随机性。缩圈、物资、复活、排名适合用 Lua 编排,可作为赛季主打玩法。

目标

  • 30 人单人/10 队三人匹配,最后存活者获胜。
  • 缩圈、空投、随机物资、淘汰排名。
  • 赛季积分与观战。

2. 核心规则​

2.1 流程​

匹配 → 跳伞/出生 → 搜刮 → 缩圈 → 淘汰 → 最终决战 → 结算
  • 战场 15 分钟,分 5 个缩圈阶段,圈外持续掉血。
  • 物资随机刷新:装备、药剂、技能卷轴、陷阱。
  • 每淘汰 1 人获得积分,最终排名按存活顺序。

2.2 缩圈​

  • 每阶段圈半径缩小 35%,伤害递增。
  • 缩圈前 30 秒地图预警,圈外玩家显示方向指引。
  • 最终圈极小,强制接战。

2.3 淘汰与复活​

  • 单人模式死亡即淘汰;组队模式可被队友复活 1 次。
  • 淘汰者进入观战,不可交流战术信息(可配置)。
  • 最终前 3 名有额外积分。

3. 服务端设计​

3.1 Lua 脚本设计​

-- lua/arena/survival.lua
Survival = {
players = 30,
team_size = 1,
phases = 5,
shrink_rate = 0.35,
zone_damage = { 100, 200, 400, 800, 1600 },
}

function OnMatchStart(ctx)
ctx:TeleportAllToSpawn()
ctx:SetPhase(1)
ctx:StartTimer("shrink", 60, OnShrink)
end

function OnShrink(ctx)
local phase = ctx:GetPhase()
if phase > Survival.phases then return ctx:EndMatch() end
ctx:ShrinkZone(Survival.shrink_rate)
ctx:SetZoneDamage(Survival.zone_damage[phase])
ctx:SetPhase(phase + 1)
ctx:SetTimer("shrink", 60, OnShrink)
end

function OnPlayerDeath(ctx, role, killer)
ctx:Eliminate(role, killer)
ctx:AddScore(killer, 10)
end
  • 缩圈/物资/淘汰由脚本驱动,C++ 提供场景/伤害。
  • 淘汰顺序、积分、排名持久化。
  • 断线保留 60 秒,超时淘汰。

3.2 协议​

方向协议说明
C→SCS_SurvivalQueue匹配
S→CSC_SurvivalState圈/人数/阶段
S→CSC_SurvivalKill淘汰公告
S→CSC_SurvivalResult排名/积分

3.3 反作弊​

  • 物资/位置/伤害服务端权威。
  • 禁止组队外挂/透视,异常视野请求记录。
  • 观战延迟 30 秒,防止报点。
  • 恶意组队(多人默契)触发风控。

4. 客户端设计​

  • 匹配大厅:模式、人数、地图、赛季积分。
  • 战场 HUD:存活人数、圈倒计时、安全区方向。
  • 地图/小地图:圈、空投、队友。
  • 淘汰公告、观战切换。
  • 结算:排名、淘汰数、积分、奖励。

5. 配置与 Lua 接口​

配置说明
players人数
phases缩圈阶段
shrink_rate缩圈比例
zone_damage圈外伤害
loot_table物资表

Lua 接口:ShrinkZone、SetZoneDamage、Eliminate、AddScore、TeleportAllToSpawn、EndMatch。

6. 边界与异常​

场景处理
匹配人数不足补机器人/取消
玩家掉线保留 60 秒,超时淘汰
圈内无人进入最终决战/按排名结算
服务器重启本场取消,积分补偿
脚本异常结束本场,按当前排名发奖

7. 验收标准​

  • 匹配/缩圈/物资/淘汰/排名/结算正确。
  • 圈伤害/预警/最终圈正确。
  • 掉线/观战/防作弊生效。
  • 客户端圈/人数显示一致。
  • 脚本可调整缩圈/物资/积分。