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→C | SC_SiegeState | 波次/城门/大将军血量 |
| S→C | SC_SiegeWave | 新波次/入口 |
| S→C | SC_SiegeResult | 成功/失败/贡献奖励 |
| C→S | CS_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. 验收标准
- 波次/刷怪/城门/大将军/失败/重置正确。
- 贡献统计与奖励发放正确。
- 大量怪物同屏性能可控。
- 重启/异常有补偿。
- 脚本可调整波次与难度。