PRD-061 等级封印与世界等级
文档编号:PRD-061
版本:v1.0
状态:已通过
适用端:服务端 / 客户端
脚本挂载:lua/numeric/world_level.lua
1. 背景与目标
等级封印用于控制服务器成长节奏、保护新手与延长版本生命周期。封印等级、解锁条件、追赶加成适合用 Lua 编排。
目标
- 服务器有世界等级与角色等级上限,按开服天数/进度解锁。
- 达到封印等级后经验转为封印经验,解锁后返还。
- 低等级玩家获得追赶加成,缩小差距。
2. 核心规则
2.1 世界等级
- 开服第 1 天上限 40,之后按配置逐日/逐周提升。
- 世界等级由运营配置 + 全服进度共同决定(可配置权重)。
- 达到上限后角色经验不再提升等级,转为封印经验池。
- 封印经验池上限 = 当前等级升级经验 × 3。
2.2 解锁
- 时间解锁:到达配置日期自动解锁。
- 进度解锁:全服达到指定人数/击杀世界 BOSS 后解锁。
- 解锁全服公告,封印经验按 100% 返还(可配置)。
2.3 追赶
- 低于世界等级 10 级的角色获得经验 +50%、掉落 +20%。
- 低于 20 级获得 +100% 经验,并解锁新手保护。
- 追赶加成不影响副本/竞技奖励上限。
3. 服务端设计
3.1 Lua 脚本设计
-- lua/numeric/world_level.lua
WorldLevel = {
start_day = 1,
schedule = { [1]=40, [3]=45, [7]=50, [14]=55, [30]=60 },
seal_exp_cap_rate = 3.0,
catchup = { [10]={exp=0.5, drop=0.2}, [20]={exp=1.0, drop=0.0} },
}
function OnExpGain(ctx, role, exp)
local cap = ctx:GetWorldLevel()
if ctx:GetLevel(role) >= cap then
ctx:AddSealExp(role, exp, ctx:GetLevelExp(role) * WorldLevel.seal_exp_cap_rate)
return 0
end
local bonus = ctx:GetCatchupRate(role, WorldLevel.catchup)
return ctx:ApplyExp(role, exp * (1 + bonus.exp))
end
function OnWorldLevelUp(ctx, new_level)
for _, role in ipairs(ctx:GetSealedRoles()) do
ctx:ReleaseSealExp(role)
end
ctx:Broadcast("world", "世界等级提升至 " .. new_level)
end
- 世界等级由脚本按开服天数计算,运营可手动覆盖。
- 封印经验独立存储,解锁时批量返还。
- 追赶加成在经验/掉落结算时读取。
3.2 协议
| 方向 | 协议 | 说明 |
|---|---|---|
| S→C | SC_WorldLevel | 世界等级/封印/倒计时 |
| S→C | SC_SealExp | 封印经验池 |
| S→C | SC_WorldLevelUp | 解锁公告 |
3.3 竞技与榜单
- 等级榜按真实等级,不按封印经验。
- 竞技场分级按世界等级分段。
- 世界等级提升后,低等级保护延迟 24 小时生效。
4. 客户端设计
- 主界面显示世界等级、封印进度、解锁倒计时。
- 经验条满时显示“封印中”,封印经验池。
- 追赶加成图标与说明。
- 世界等级提升全屏公告。
- 等级榜/匹配分段说明。
5. 配置与 Lua 接口
| 配置 | 说明 |
|---|---|
schedule | 开服天数→上限 |
seal_exp_cap | 封印经验上限 |
catchup | 追赶档位 |
unlock_condition | 时间/进度 |
Lua 接口:GetWorldLevel、GetLevelExp、AddSealExp、ReleaseSealExp、GetCatchupRate、ApplyExp。
6. 边界与异常
| 场景 | 处理 |
|---|---|
| 封印经验溢出 | 按上限截断,提示 |
| 手动调整世界等级 | 记录操作人/原因 |
| 解锁时角色离线 | 登录返还 |
| 世界等级回退 | 禁止,需走运营流程 |
| 脚本异常 | 保持当前等级,记录日志 |
7. 验收标准
- 世界等级按计划提升,封印/返还正确。
- 追赶加成按等级差生效。
- 榜单/竞技分段正确。
- 手动调整/离线/异常有兜底。
- 客户端封印状态与服务端一致。