PRD-066 伤害挑战与木桩测试
文档编号:PRD-066
版本:v1.0
状态:已通过
适用端:服务端 / 客户端
脚本挂载:lua/arena/dps_challenge.lua
1. 背景与目标
伤害挑战用于数值验证、职业平衡与玩家炫技。战斗时长、木桩属性、统计口径、排行榜适合用 Lua 编排。
目标
- 提供 30/60/120 秒木桩挑战,统计 DPS/总伤害/技能占比。
- 按职业/等级段排名,赛季发奖。
- 统一 Buff/药剂规则,保证可比性。
2. 核心规则
2.1 挑战规则
- 玩家进入独立场景,木桩无限血量、不还手。
- 可选 30/60/120 秒,开始后倒计时,结束结算。
- 允许使用自身技能/药剂,禁止外部 Buff、组队、宠物(可配置)。
- 每人每日 5 次,取最高成绩。
2.2 统计口径
- DPS = 总有效伤害 / 实际战斗时长。
- 有效伤害排除溢出、免疫、护盾吸收。
- 记录技能伤害占比、暴击率、命中率。
- 异常伤害(超过理论上限)标记无效。
2.3 排名
- 按职业 + 等级段分组,避免跨职业比较。
- 赛季 30 天,结束时发奖。
- 前 100 名展示伤害构成,供平衡参考。
3. 服务端设计
3.1 Lua 脚本设计
-- lua/arena/dps_challenge.lua
DPS = {
durations = { 30, 60, 120 },
daily_limit = 5,
dummy_id = 99001,
allow_pet = false,
}
function OnChallengeStart(ctx, role, duration)
if ctx:GetDailyCount(role, "dps") >= DPS.daily_limit then
return ctx:Fail(role, "今日次数已用完")
end
local dummy = ctx:SpawnDummy(DPS.dummy_id)
ctx:SetRoleVar(role, "dps_start", ctx:Now())
ctx:SetRoleVar(role, "dps_damage", 0)
ctx:SetTimer("dps_end", duration, function() OnChallengeEnd(ctx, role, duration) end)
end
function OnDamage(ctx, role, damage, skill_id)
ctx:AddRoleVar(role, "dps_damage", damage)
ctx:RecordSkillDamage(role, skill_id, damage)
end
function OnChallengeEnd(ctx, role, duration)
local total = ctx:GetRoleVar(role, "dps_damage")
local score = total / duration
ctx:SubmitDpsScore(role, duration, score, ctx:GetSkillBreakdown(role))
ctx:AddDailyCount(role, "dps", 1)
end
- 木桩/场景由 C++ 创建,伤害事件转发脚本统计。
- 统计只认服务端结算后的有效伤害。
- 异常伤害/速度/技能 CD 触发校验,成绩作废。
3.2 协议
| 方向 | 协议 | 说明 |
|---|---|---|
| C→S | CS_DpsStart | 开始挑战 |
| S→C | SC_DpsState | 倒计时/实时 DPS |
| S→C | SC_DpsResult | 总伤害/DPS/占比 |
| S→C | SC_DpsRank | 职业榜 |
3.3 平衡与反作弊
- 统一禁用外部 Buff/队友/宠物(可配置)。
- 校验技能 CD、攻速、伤害上限。
- 同一角色成绩异常波动记录日志。
- 赛季奖励按职业分组,避免强势职业垄断。
4. 客户端设计
- 挑战面板:时长选择、规则说明、木桩预览。
- 战斗 HUD:倒计时、实时 DPS、总伤害。
- 结算:DPS、技能占比饼图、暴击/命中率。
- 职业榜/好友榜/自己的排名。
- 一键对比同职业前 10 配装(可选)。
5. 配置与 Lua 接口
| 配置 | 说明 |
|---|---|
durations | 时长 |
dummy_id | 木桩 |
daily_limit | 每日次数 |
allow_pet | 是否允许宠物 |
season_days | 赛季 |
Lua 接口:SpawnDummy、RecordSkillDamage、SubmitDpsScore、GetSkillBreakdown、GetDpsRank。
6. 边界与异常
| 场景 | 处理 |
|---|---|
| 挑战中掉线 | 成绩按已造成伤害结算/作废(配置) |
| 木桩被击杀 | 立即重置满血 |
| 使用外部 Buff | 成绩无效 |
| 重复提交 | 幂等 |
| 脚本异常 | 结束挑战,不记录成绩 |
7. 验收标准
- 30/60/120 秒挑战、统计、结算正确。
- 有效伤害/DPS/占比/暴击率正确。
- 职业分组排名与赛季奖励正确。
- 反作弊校验生效。
- 客户端实时数据与服务端一致。