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→S | CS_SurvivalQueue | 匹配 |
| S→C | SC_SurvivalState | 圈/人数/阶段 |
| S→C | SC_SurvivalKill | 淘汰公告 |
| S→C | SC_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. 验收标准
- 匹配/缩圈/物资/淘汰/排名/结算正确。
- 圈伤害/预警/最终圈正确。
- 掉线/观战/防作弊生效。
- 客户端圈/人数显示一致。
- 脚本可调整缩圈/物资/积分。