跳到主要内容

PRD-045 怪物攻城

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

1. 背景与目标​

怪物攻城是全服协作防守玩法。波次、怪物、BOSS、城门血量、奖励适合用 Lua 编排,可快速调整难度。

目标

  • 每日固定时段,怪物分波次进攻主城。
  • 玩家协作守住城门/大将军,失败则主城进入短暂失守状态。
  • 按伤害/治疗/击杀贡献发放奖励。

2. 核心规则​

  • 每日 20:00 开启,共 10 波,每波间隔 3 分钟。
  • 怪物从地图边缘 4 个入口进攻城门,城门血量全服共享。
  • 第 5/10 波刷精英/BOSS,击杀获得全服增益。
  • 城门被摧毁则怪物进入内城攻击大将军,大将军死亡则防守失败。
  • 贡献 = 伤害 + 治疗 + 击杀,按档位发奖。
  • 活动结束/失败后 5 分钟重置城门。

3. 服务端设计​

3.1 Lua 脚本设计​

-- lua/activity/monster_siege.lua
Siege = {
waves = 10,
wave_interval = 180,
gates = { {id=1,x=100,y=200}, {id=2,x=300,y=200} },
wave_monsters = { {id=9101,count=20}, {id=9102,count=10} },
}

function OnSiegeStart(ctx)
ctx:ResetGates()
ctx:SetWave(1)
ctx:StartTimer("next_wave", 5, OnWave)
ctx:Broadcast("world", "怪物攻城开始")
end

function OnWave(ctx)
local wave = ctx:GetWave()
if wave > Siege.waves then return OnSiegeEnd(ctx, true) end
for _, gate in ipairs(Siege.gates) do
ctx:SpawnWave(gate, Siege.wave_monsters, wave)
end
ctx:SetTimer("next_wave", Siege.wave_interval, OnWave)
end

function OnGateDestroyed(ctx, gate)
ctx:Broadcast("world", "城门失守,怪物进入内城")
ctx:SpawnInnerWave()
end
  • 波次、怪物、城门由脚本配置,C++ 负责刷怪与移动。
  • 城门/大将军血量由场景服维护,脚本监听摧毁事件。
  • 贡献统计使用 ctx:AddContribution,结束时统一结算。

3.2 协议​

方向协议说明
S→CSC_SiegeState波次/城门/大将军血量
S→CSC_SiegeWave新波次/入口
S→CSC_SiegeResult成功/失败/贡献奖励
C→SCS_SiegeEnter进入防守

3.3 失败与重置​

  • 大将军死亡立即失败,停止刷怪。
  • 失败后主城 NPC 暂时消失/涨价(可配置)。
  • 5 分钟后重置城门与大将军,清理残留怪物。

4. 客户端设计​

  • 活动 HUD:波次、倒计时、城门/大将军血量。
  • 地图入口标记、怪物进攻方向箭头。
  • 贡献榜与个人贡献。
  • 失败/胜利结算、全服公告。
  • 主城失守状态提示。

5. 配置与 Lua 接口​

配置说明
waves波次
wave_interval间隔
wave_monsters每波怪物
gate_hp / general_hp血量
contribution_reward贡献奖励

Lua 接口:ResetGates、SpawnWave、SpawnInnerWave、SetWave、AddContribution、Broadcast。

6. 边界与异常​

场景处理
服务器重启活动取消,按贡献补发参与奖
城门同时被摧毁串行处理,只触发一次
玩家卡怪怪物自动寻路/传送
活动时间重叠跳过当日或延后
脚本异常停止刷怪,按当前贡献结算

7. 验收标准​

  • 波次/刷怪/城门/大将军/失败/重置正确。
  • 贡献统计与奖励发放正确。
  • 大量怪物同屏性能可控。
  • 重启/异常有补偿。
  • 脚本可调整波次与难度。