【游戏】
一、业务场景
凌晨一条投诉:玩家通关副本后点了第 2 张翻牌,奖励没到账,牌面倒是全翻开了。排查发现翻牌逻辑在点击瞬间才随机三份奖励,两次快速点击时第一发还没写入、第二发已把数据覆盖,奖励凭空消失。
二、实现方案
翻牌奖励在通关瞬间一次性生成并写入玩家变量,点击只做领取,不再随机。错误写法:
local function takeCardBad(actor, idx)
local id = 1500 + math.random(1, 3) -- 点击时才随机
giveitem(actor, id, 1) -- 连点两次发两份不同物
end
正确写法:
local function onBossDown(actor)
setplayvar(actor, "card1", 1501)
setplayvar(actor, "card2", 1502)
setplayvar(actor, "card3", 1503)
setplayvar(actor, "cardTake", 0)
sendmsg(actor, 1, "翻牌开启,三选一,30 秒内有效")
end
local function takeCard(actor, idx)
if getplayvar(actor, "cardTake") == 1 then
sendmsg(actor, 1, "已翻过,不能再翻")
return
end
giveitem(actor, getplayvar(actor, "card" .. idx), 1)
setplayvar(actor, "cardTake", 1)
end
三、边界处理
超时未翻的牌在下次通关时重置;重复点击被 cardTake 拦下;牌号读不到时按未生成处理,直接补发通关保底 1 件。
四、引擎验证
实测两次连点第 2 张,只到账 1 件 1502;通关后不点,30 秒日志出现过期重置记录,下次通关牌面重新生成。
五、FAQ
问:三张牌能出重复物品吗?
答:生成时从池子按序取,同批内不重复。
问:组队副本算谁的牌?
答:每名队员各自生成一组,队伍里 5 人就有 5 组牌面。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏】 一、规则机制 隐蔽的坑:折叠列表收起分组时只把子项 setVisible(false),占位还留在原地,列表下半截…
【语法】 一、机制原理 一行代码拆解:a, b = b, a % b。最大公约数的辗转相除法:两数相除取余数,余数再与除数继…
【游戏】 一、规则机制 线上事故:聊天里 @ 了某人,消息混在普通流水里,对方根本没注意,集合迟到的锅全甩给没提醒。点名提醒…
【游戏】 一、规则机制 一行定骨架:text = LANG[cur][key] or LANG.zh[key]。多语言文案的…
【语法】 一、机制原理 抛个坑:模板"$(name),您的$(item)已到账"这种带命名槽位的文案怎么填值?string.…
【游戏】 一、规则机制 抛个坑:横屏竖屏一切界面,控件坐标全按竖屏摆,一旋转错位满屏——适配该怎么做?两条策略配合:界面元素…