PRD-041 藏宝图寻宝
文档编号:PRD-041
版本:v1.0
状态:已通过
适用端:服务端 / 客户端
脚本挂载:lua/activity/treasure.lua
1. 背景与目标
藏宝图提供探索与随机奖励。地图点、事件、奖励池适合用 Lua 编排,可快速扩展节日藏宝、限时寻宝。
目标
- 藏宝图分普通/高级/传说,挖宝点随机。
- 挖宝触发随机事件:奖励、怪物、陷阱、传送。
- 支持组队共享、每日次数、活动期限。
2. 核心规则
- 玩家使用藏宝图后获得 1 个挖宝坐标,显示在地图/罗盘。
- 到达坐标 3 格内使用铲子,读条 2 秒。
- 普通图奖励材料/金币,高级图有概率出装备,传说图必出稀有。
- 20% 概率触发事件:守卫怪、陷阱、直接奖励、传送到隐藏点。
- 每日最多挖 10 次,组队成员在 10 格内可共享奖励。
- 藏宝图有 7 天有效期,过期作废。
3. 服务端设计
3.1 Lua 脚本设计
-- lua/activity/treasure.lua
Treasure = {
daily_limit = 10,
dig_range = 3,
events = {
{ type="reward", weight=50 },
{ type="monster", weight=25 },
{ type="trap", weight=15 },
{ type="portal", weight=10 },
},
}
function OnUseMap(ctx, role, map_item)
local spot = ctx:PickSpot(map_item.level, ctx:GetMapId(role))
ctx:SetRoleVar(role, "treasure_spot", spot)
ctx:SetRoleVar(role, "treasure_map", map_item.id)
ctx:Send(role, "SC_TreasureSpot", spot)
end
function OnDig(ctx, role)
local spot = ctx:GetRoleVar(role, "treasure_spot")
if not ctx:InRange(role, spot, Treasure.dig_range) then
return ctx:Fail(role, "不在挖宝点附近")
end
if ctx:GetDailyCount(role, "treasure") >= Treasure.daily_limit then
return ctx:Fail(role, "今日挖宝次数已用完")
end
ctx:ConsumeItem(role, ctx:GetRoleVar(role, "treasure_map"), 1)
local event = ctx:PickWeighted(Treasure.events)
ctx:TriggerTreasureEvent(role, spot, event.type)
ctx:AddDailyCount(role, "treasure", 1)
end
- 坐标由服务端随机,客户端只显示。
- 挖宝距离、地图、道具、次数全部服务端校验。
- 事件由脚本分发,奖励/怪物/陷阱接口由 C++ 导出。
- 组队共享通过
ctx:GetNearbyParty计算,不信任客户端。
3.2 协议
| 方向 | 协议 | 说明 |
|---|---|---|
| C→S | CS_TreasureUse | 使用藏宝图 |
| C→S | CS_TreasureDig | 挖宝 |
| S→C | SC_TreasureSpot | 坐标/罗盘 |
| S→C | SC_TreasureEvent | 事件结果 |
| S→C | SC_TreasureResult | 奖励/失败 |
3.3 事件类型
| 事件 | 处理 |
|---|---|
| 直接奖励 | 发放奖励池 |
| 守卫怪 | 生成 1–3 只守卫,击杀后给奖励 |
| 陷阱 | 扣血/减速/传送回城 |
| 传送门 | 传送到隐藏宝藏点,额外奖励 |
4. 客户端设计
- 藏宝图使用后显示罗盘/地图标记、距离。
- 到达后铲子按钮高亮,读条与挖掘动画。
- 事件表现:宝箱、怪物、陷阱、传送门。
- 奖励展示与组队共享提示。
- 藏宝图有效期、每日次数。
5. 配置与 Lua 接口
| 配置 | 说明 |
|---|---|
level | 图等级 |
spot_pool | 坐标池 |
reward_group | 奖励池 |
event_weight | 事件权重 |
daily_limit | 每日次数 |
expire_days | 有效期 |
Lua 接口:PickSpot、InRange、ConsumeItem、PickWeighted、TriggerTreasureEvent、GetNearbyParty。
6. 边界与异常
| 场景 | 处理 |
|---|---|
| 坐标不可达 | 重新随机/邮件补图 |
| 挖宝中移动 | 打断,不扣次数 |
| 组队共享 | 10 格内成员,超出不共享 |
| 地图关闭/活动结束 | 图作废,邮件补偿 |
| 重复挖宝 | 幂等,坐标失效 |
| 脚本异常 | 返还藏宝图,记录日志 |
7. 验收标准
- 使用图/坐标/挖宝/事件/奖励全流程正确。
- 距离、地图、次数、有效期校验完整。
- 组队共享范围与奖励正确。
- 坐标不可达/重复挖宝有兜底。
- 节日藏宝可通过脚本扩展。