活动期间获取积分翻倍,是拉活跃的常用手段,但翻倍的实现经常出问题:翻倍叠加、翻倍范围失控、翻倍后回溯。积分翻倍卡接口把翻倍逻辑收口:一张翻倍卡激活后一小时内的积分获取翻倍,多张不可叠加只能顺延,翻倍范围只限活动积分不含货币。
翻倍卡激活记录激活时间与到期时间(一小时);同类型卡激活时若有剩余时长则顺延累加,激活上限三张,防止囤卡无限翻倍。示例代码如下:
-- 积分翻倍卡:激活与顺延
local player = class(actor)
local BOOST_SEC = 3600
local function activateBoost(player)
local cnt = tonumber(getplayvar(player, "HUMAN", "BoostCards") or 0)
if cnt <= 0 then
sendmsg(player, 1, 0, "没有可用的积分翻倍卡。")
return
end
local expire = tonumber(getplayvar(player, "HUMAN", "BoostExpire") or 0)
local base = expire > os.time() and expire or os.time()
setplayvar(player, "HUMAN", "BoostExpire", base + BOOST_SEC, true)
setplayvar(player, "HUMAN", "BoostCards", cnt - 1, true)
sendmsg(player, 1, 0, "积分翻倍已激活,持续至 " ..
os.date("%H:%M", base + BOOST_SEC) .. "。")
end
所有活动积分的入账统一走翻倍结算入口:活跃期内积分按两倍入账,翻倍范围排除金币与元宝等货币类奖励;结算入口统一后,翻倍范围与倍率一处管理。示例代码如下:
-- 积分翻倍:统一结算
local player = class(actor)
local function addScoreWithBoost(player, basePts, isCurrency)
local boost = tonumber(getplayvar(player, "HUMAN", "BoostExpire") or 0) > os.time()
local final = basePts
if boost and not isCurrency then
final = basePts * 2
end
setplayvar(player, "HUMAN", "ActScore",
tonumber(getplayvar(player, "HUMAN", "ActScore") or 0) + final, true)
sendmsg(player, 1, 0, "积分 +" .. final .. (boost and "(翻倍)" or ""))
end
验证四条路径:激活后积分双倍入账、过期后恢复单倍、多张顺延累加时长、货币类奖励不被翻倍;翻倍与活动本身的倍率叠加场景单独测试,叠加倍率上限受总闸约束。线上监控翻倍卡的激活峰值与积分产出曲线,翻倍时段积分产出是否为平日两倍即可验证实现;激活峰值集中在发放瞬间则改成分时发放。
翻倍曾直接修改积分倍率全局变量,活动结束忘改回,玩家积分以双倍跑了一整周,翻倍收口到入账接口。顺延曾按激活时间叠加,剩余时长被覆盖只剩收尾一小时的时长,顺延从当前到期时间累加。翻倍范围曾包含元宝,充值货币被翻倍直接造成资损,货币类入账白名单隔离,翻倍只作用于活动积分。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
学员常见误区 Lua函数可返回多个值,学员用固定变量数接收时如果变量少于返回值,多余返回值被静默丢弃;如果变量多于返回值,多…
设计初衷 行会建筑的死穴是一次全解锁:会员没有逐步建设的过程感。梯度设计让每栋建筑都有前置条件和资源门槛。 数值模型 建筑分…
设计初衷 婚姻系统的属性加成是社交玩法的经济锚点:加成太弱没人结婚,太强则"为了属性被迫结婚"扭曲了社交本质。婚姻边界的设计…
设计初衷 宝箱类玩法的信任危机都源于同一句话:"概率是不是骗人的。"期望公示把概率从事后争议变成事前契约:奖池概率表全量公示…
设计初衷 流拍物(拍卖未成交的退回物品)堆积在卖家背包里成为死资产:低价值物流拍后无人问津,高价值物流拍后卖家不愿降价重拍。…
业务场景 沙巴克战功榜每周结算,玩家提交战功前不知道"再打多少能进前 10、前 10 的奖励是什么"。名次预览:输入自己的战…