跳到主要内容

PRD-046 赛马竞速

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

1. 背景与目标​

赛马提供轻竞技与外观展示。赛道、检查点、加速道具、排名结算适合用 Lua 编排,可扩展节日赛道。

目标

  • 每日固定场次,玩家骑乘统一赛马参赛。
  • 赛道检查点、加速带、障碍、随机事件由脚本配置。
  • 按到达顺序发奖,支持观战与回放。

2. 核心规则​

  • 每日 3 场,每场最多 20 人,报名费金币/道具。
  • 赛马属性统一,只受赛道道具与技能影响。
  • 赛道设 5 个检查点,必须按顺序通过。
  • 加速带 +30% 速度 3 秒,障碍减速 50% 2 秒。
  • 第一名到达后 60 秒结束,未完成按检查点进度排名。
  • 禁止使用传送/坐骑技能/攻击道具。

3. 服务端设计​

3.1 Lua 脚本设计​

-- lua/activity/horse_race.lua
Race = {
checkpoints = { {x=100,y=100}, {x=200,y=120}, {x=300,y=200} },
boost_zones = { {x=150,y=110,r=5,rate=1.3,time=3} },
obstacle_zones = { {x=250,y=160,r=4,rate=0.5,time=2} },
}

function OnRaceStart(ctx)
for _, role in ipairs(ctx:GetRacers()) do
ctx:TeleportToStart(role)
ctx:SetRoleVar(role, "checkpoint", 0)
ctx:SetRoleVar(role, "race_state", "running")
end
ctx:StartTimer("race_tick", 1, OnRaceTick)
end

function OnCheckpoint(ctx, role, index)
local current = ctx:GetRoleVar(role, "checkpoint")
if index ~= current + 1 then return ctx:Fail(role, "检查点顺序错误") end
ctx:SetRoleVar(role, "checkpoint", index)
if index == #Race.checkpoints then
ctx:FinishRace(role)
end
end

function OnRaceTick(ctx)
for _, role in ipairs(ctx:GetRacers()) do
ctx:ApplyZoneEffects(role, Race.boost_zones, Race.obstacle_zones)
end
end
  • 检查点、加速/障碍区域由 C++ 触发器检测,脚本判定顺序与效果。
  • 赛马速度、状态由服务端计算,客户端只表现。
  • 排名按完成时间/检查点进度,服务端记录。

3.2 协议​

方向协议说明
C→SCS_RaceEnter报名
S→CSC_RaceState倒计时/检查点/排名
S→CSC_RaceCheckpoint通过检查点
S→CSC_RaceResult排名/奖励

3.3 防作弊​

  • 禁止传送/加速外挂,速度异常记录并取消成绩。
  • 检查点必须按顺序,跳点无效。
  • 赛道内禁止 PK/交易/邮件。

4. 客户端设计​

  • 报名面板:场次、人数、奖励、赛道预览。
  • 比赛 HUD:检查点进度、排名、速度、加速/减速提示。
  • 赛道指引箭头、加速带/障碍高亮。
  • 观战模式:跟随第一名/自由视角。
  • 结算:排名、用时、奖励。

5. 配置与 Lua 接口​

配置说明
checkpoints检查点
boost_zones加速区
obstacle_zones障碍区
max_racers人数
reward_group排名奖励

Lua 接口:GetRacers、TeleportToStart、ApplyZoneEffects、FinishRace、GetRank、GrantReward。

6. 边界与异常​

场景处理
比赛中掉线保留 30 秒,超时按当前进度排名
检查点漏过必须返回补过
所有人未完成按进度排名
服务器重启本场取消,退还报名费
脚本异常结束比赛,按当前排名发奖

7. 验收标准​

  • 报名/倒计时/检查点/加速/障碍/排名正确。
  • 统一属性、禁用道具、防作弊生效。
  • 掉线/重启/异常有处理。
  • 客户端排名与服务端一致。
  • 节日赛道可通过脚本扩展。