活动脚本里到处是 giveitem 加物品名加数量的三行套话,改一个奖励要改五处。柯里化把奖励描述成参数预设:先定物品与数量生成发放函数,活动逻辑里只管调用,奖励包可以命名、组合、整体替换,发放逻辑零散度归零。预设式写法还有一个隐性收益:奖励清单在注册表里一目了然,对账时不用再翻业务代码。
grant 收物品与数量返回闭包,闭包留待 actor 到位后执行;多个预设组成奖励包,整包发放一次循环完成。
local function grant(item, cnt)
if cnt <= 0 then cnt = 1 end
return function(actor)
giveitem(actor, item, cnt)
sendmsg(actor, 0, "获得 " .. item .. " x" .. cnt)
end
end
local GIFT_ANNIV = { grant("金币礼券", 20000), grant("强化石", 2) }
local function grantAll(actor, pack)
for _, fn in ipairs(pack) do
fn(actor)
end
end
奖励包按名字注册进总表,业务侧凭名字发放,未知名拒绝执行;改奖励只改注册表,业务代码不再动。
local PACKS = {
anniversary = { grant("金币礼券", 20000), grant("祝福油", 1) },
comeback = { grant("金币礼券", 10000), grant("金创药", 5) },
}
function grantPack(actor, name)
local pack = PACKS[name]
if pack == nil then
sendmsg(actor, 0, "没有这个奖励包:" .. name)
return
end
grantAll(actor, pack)
end
每个奖励包抽样执行,物品与数量逐项与注册表核对;未知名、零数量两个边界拒绝验证;同一包发放一万次核对无状态残留。奖励包支持嵌套引用另一个包的名字,展开层数限一层,防止递归打包。注册表纳入配置评审,新增奖励包需要运营与数值双签。监控各奖励包的发放次数与物品消耗,包内单项消耗与库存对不上即是配置漂移。
闭包捕获的 upvalue 是共享的,有人把可变计数表捕获进发放函数想顺带统计,并发发放时统计错乱,统计职责移出闭包单独封装。grant 的参数顺序早期是数量在前,调整成物品在前时漏改了两处调用,物品发成了数量份,参数顺序固定后写进函数注释首行。奖励包组合超过十项时单次发放耗时肉眼可见,包规模封顶十项,超出的拆成多包。金币礼券与金币这种名字相近的物品在注册表里打错过包,发放流水按物品 ID 而不是名字复核。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 占领沙巴克的收益只有税收一条,城主玩起来没有治理感。城主印玺给占领行会三枚政策印玺:传送令开城内免费传送…
实战应用:用在哪里 酒馆缺一个轻量小游戏留住等朋友的玩家。斗兽棋搬进比奇酒馆:七乘九棋盘八种棋子,鼠象互克、狮虎跳河,每日挑…
实战应用:用在哪里 四服合一时排行榜串了档:137 个跨服同名玩家在榜单上互相覆盖,89 条榜单数据张冠李戴,榜三的裁决之杖…
实战应用:用在哪里 打祖玛教主时目标信息一屏全塞,打小怪时框里空得只剩名字。目标框按目标类型分两档密度:普通目标只展示名字加…
实战应用:用在哪里 榜单只显示名字和数值,玩家想知道榜一大哥的装备评分就得私聊问。排行榜详情页补上这层:点榜单条目上行排名号…
实战应用:用在哪里 读写分离上线后,玩家刚领完奖励刷新面板却查不到,主库写入还没同步到从库,延迟高峰有两秒。应对方案分两层:…