PRD-042 节日活动框架
文档编号:PRD-042
版本:v1.0
状态:已通过
适用端:服务端 / 客户端
脚本挂载:lua/activity/festival.lua
1. 背景与目标
节日活动需要快速上线、复用流程、活动间互不干扰。本 PRD 定义通用活动框架,具体玩法由 Lua 子脚本实现,C++ 只提供活动生命周期与通用接口。
目标
- 一个框架承载春节、中秋、周年庆等活动。
- 活动分预热/正式/结束三个阶段,支持签到、任务、兑换、Boss。
- 脚本可插拔,活动结束自动清理。
2. 核心规则
- 活动配置包含开始/结束时间、阶段、子玩法列表。
- 预热期开放预告/预约,正式期开放玩法,结束后只保留兑换。
- 每个子玩法有独立脚本与开关,可单独热更。
- 活动货币独立,活动结束按比例回收/兑换。
- 同一时间最多 3 个活动,避免入口过载。
3. 服务端设计
3.1 Lua 脚本设计
-- lua/activity/festival.lua
Festival = {
id = 4201,
phases = { warmup = 3, formal = 14, closing = 3 },
modules = { "signin", "quest", "exchange", "boss" },
}
function OnFestivalStart(ctx)
ctx:LoadModules(Festival.modules)
ctx:Broadcast("world", "节日活动开启")
end
function OnPhaseChange(ctx, phase)
for _, name in ipairs(Festival.modules) do
ctx:CallModule(name, "OnPhase", phase)
end
end
function OnFestivalEnd(ctx)
ctx:SettleExchange()
ctx:CleanupModules()
ctx:Broadcast("world", "节日活动结束")
end
ctx:LoadModules加载子脚本,失败则跳过并告警,不影响其他模块。- 每个模块实现
OnPhase/OnPlayerEvent/OnEnd约定接口。 - 活动状态写
ctx.state,重启后按阶段恢复。 - 活动货币、兑换比例由配置驱动,脚本不硬编码。
3.2 协议
| 方向 | 协议 | 说明 |
|---|---|---|
| S→C | SC_FestivalInfo | 活动阶段/入口/倒计时 |
| S→C | SC_FestivalModule | 子玩法状态 |
| C→S | CS_FestivalEnter | 进入子玩法 |
3.3 生命周期
配置加载 → 预热 → 正式 → 结束 → 兑换期 → 清理
- 阶段切换由定时器驱动,服务端时间。
- 活动结束停止产出,只保留兑换。
- 清理时删除临时 NPC/怪物/地图实例。
4. 客户端设计
- 活动主面板:阶段、倒计时、子玩法入口、红点。
- 子玩法独立面板,由服务端下发配置。
- 活动货币/兑换商店。
- 结束时提示未兑换货币与截止时间。
5. 配置与 Lua 接口
| 配置 | 说明 |
|---|---|
festival_id | 活动 ID |
start_time / end_time | 周期 |
phases | 阶段天数 |
modules | 子玩法列表 |
currency | 活动货币 |
exchange | 兑换表 |
Lua 接口:LoadModules、CallModule、SetPhase、Broadcast、SettleExchange、CleanupModules。
6. 边界与异常
| 场景 | 处理 |
|---|---|
| 子脚本加载失败 | 跳过该模块,其他正常 |
| 活动时间重叠 | 按优先级/配置限制 |
| 服务器重启 | 按当前阶段恢复 |
| 活动结束仍在场景 | 传送回主城 |
| 货币未兑换 | 邮件提醒/按比例回收 |
| 脚本异常 | 停用模块,不影响框架 |
7. 验收标准
- 活动创建/阶段切换/结束/清理正确。
- 子玩法可插拔、可独立热更。
- 活动货币/兑换/回收正确。
- 多活动并行不冲突。
- 重启/异常有兜底。