diff --git a/src/ProtocolCode.lua b/src/ProtocolCode.lua index b8a4871..a037048 100644 --- a/src/ProtocolCode.lua +++ b/src/ProtocolCode.lua @@ -221,6 +221,8 @@ actionCodes = { Activity_actCalendaTaskRpc = 655, Activity_actPaySignRpc = 656, Activity_exchangeRpc = 657, + Activity_gachakonRpc = 658, + Activity_hangDropRpc = 659, Radio_startQuestRpc = 700, Radio_finishQuestRpc = 701, diff --git a/src/actions/ActivityAction.lua b/src/actions/ActivityAction.lua index 2cbbf78..b5f96ba 100644 --- a/src/actions/ActivityAction.lua +++ b/src/actions/ActivityAction.lua @@ -277,7 +277,8 @@ function _M.exchangeRpc(agent, data) local exchangeData = curData[actid] or {} local curCount = exchangeData[id] or 0 local actCfg = exchangeCfg[id] - if curCount >= actCfg then return 4 end + local limitArr = actCfg.limit:toArray(true, "=") + if curCount >= limitArr[2] then return 4 end local costs = actCfg.goods:toNumMap() if not role:checkItemEnough(costs) then return 5 end @@ -299,32 +300,120 @@ function _M.gachakonRpc(agent, data) local role = agent.role local msg = MsgPack.unpack(data) local actid = msg.actid + local count = msg.count + + if count > 10 then return end + if not role.activity:isOpenById(actid) then return 1 end + local actCtrlData = csvdb["activity_ctrlCsv"][actid] + if not actCtrlData then return 2 end + local cost = actCtrlData.condition2:toNumMap() + local actCfg = csvdb["activity_capsuleToysCsv"][actid] - if not actCfg then return 2 end + if not actCfg then return 3 end + + for k, v in pairs(cost) do + cost[k] = v * count + end + + if not role:checkItemEnough(cost) then return 4 end local gachakonInfo = role.activity:getActData("Gachakon") or {} local tmpCfg = clone(actCfg) - local flag = 0 - for id, cfg in pairs(tmpCfg) do - local num = gachakonInfo[id] or 0 - cfg.amount = cfg.amount >= num and cfg.amount - num or 0 - cfg.weight = cfg.weight * cfg.amount - if cfg.weight > 0 then - flag = 1 + local award = {} + local remain = 0 + local reset = false + for i = 1, count do + local flag = 0 + for id, cfg in pairs(tmpCfg) do + local num = gachakonInfo[id] or 0 + cfg.amount = cfg.amount >= num and cfg.amount - num or 0 + cfg.weight = cfg.weight * cfg.amount + if cfg.weight > 0 then + flag = 1 + end + end + if flag == 0 then + reset = true + break + end + local id = math.randWeight(tmpCfg, "weight") + gachakonInfo[id] = (gachakonInfo[id] or 0) + 1 + local curAward = tmpCfg[id].award:toNumMap() + for k, v in pairs(curAward) do + award[k] = (award[k] or 0) + v end + remain = remain + 1 end - if flag == 0 then return 3 end - local id = math.randWeight(tmpCfg, "weight") - local reward, change = role:award(tmpCfg[id].award, {log = {desc = "actGachakon", int1 = actid, int2 = id}}) + if count > remain then return 5 end + + role:costItems(cost, {log = {desc = "actGachakon", int1 = actid, int2 = count}}) - gachakonInfo[id] = (gachakonInfo[id] or 0) + 1 + local reward, change = role:award(award, {log = {desc = "actGachakon", int1 = actid, int2 = count}}) + if reset then + gachakonInfo = {} + end role.activity:updateActData("Gachakon", gachakonInfo) SendPacket(actionCodes.Activity_gachakonRpc, MsgPack.pack(role:packReward(reward, change))) return true end +function _M.hangDropRpc(agent, data) + local role = agent.role + local msg = MsgPack.unpack(data) + local actid = msg.actid + if not role.activity:isOpenById(actid) then return 1 end + + local actCfg = csvdb["activity_putCsv"][actid] + if not actCfg then return 2 end + + local award, period = "", 0 + for i = 1, #actCfg do + local cfg = actCfg[i] + if not cfg then + break + end + if cfg.condition ~= "" then + local arr = cfg.condition:toArray(true, "=") + local type = arr[1] + if type == 1 then + local actId = arr[2] + local carbonId = arr[3] + if not role.activity:isOpenById(actid) then return 3 end + local clInfo = role.activity:getActData("ChallengeLevel") or {} + if not clInfo[carbonId] then + break + end + end + end + award = cfg.reward + period = cfg.period * 60 + end + local actData = role.activity:getActData("HangDrop") or 0 + local timeNow = skynet.timex() + if period == 0 or award == "" then + return 4 + end + local num = math.floor((timeNow - actData)/ period) + num = num > 8 and 8 or num + if num == 0 then + return 5 + end + local reward, change = {}, nil + for id, value in pairs(award:toNumMap()) do + reward[id] = value * num + end + + reward, change = role:award(reward, {log = {desc = "actHangDrop", int1 = actid, int2 = num}}) + + role.activity:updateActData("HangDrop", timeNow) + + SendPacket(actionCodes.Activity_hangDropRpc, MsgPack.pack(role:packReward(reward, change))) + + return true +end + return _M \ No newline at end of file diff --git a/src/actions/StoreAction.lua b/src/actions/StoreAction.lua index 7a3824d..fea5a20 100644 --- a/src/actions/StoreAction.lua +++ b/src/actions/StoreAction.lua @@ -405,15 +405,20 @@ function _M.getTotalRechargeAwardRpc(agent, data) local totalRechargeRecord = role.storeData:getProperty("totalRR") local flag = string.char(string.getbit(totalRechargeRecord, index)) if flag == "1" then return 1 end - local cfg = csvdb["Csv"][index] + local cfg = csvdb["activity_payRebateCsv"][index] if not cfg then return 2 end - if cfg.condition > totalTwd then return 3 end + if cfg.twd > totalTwd then return 3 end totalRechargeRecord = string.setbit(totalRechargeRecord, index) role.storeData:updateProperty({field = "totalRR", value = totalRechargeRecord}) + local main = cfg.main_reward:toNumMap() + local sub = cfg.sub_reward:toNumMap() + for k, v in pairs(sub) do + main[k] = (main[k] or 0) + v + end - local reward, _ = role:award(cfg.reward, {log = {desc = "totalRecharge", int1 = index}}) - SendPacket(actionCodes.Store_getTotalRechargeAwardRpc, MsgPack.pack({reward = reward})) + local reward, change = role:award(main, {log = {desc = "totalRecharge", int1 = index}}) + SendPacket(actionCodes.Store_getTotalRechargeAwardRpc, MsgPack.pack(role:packReward(reward, change))) return true end diff --git a/src/csvdata b/src/csvdata index e3723ff..295fead 160000 --- a/src/csvdata +++ b/src/csvdata @@ -1 +1 @@ -Subproject commit e3723ff3514f68c633926970e695d1c9ecea1cd4 +Subproject commit 295feade86593a4793972e2cd2d83135d8aee247 diff --git a/src/models/Activity.lua b/src/models/Activity.lua index 29b838a..fbfb1c9 100644 --- a/src/models/Activity.lua +++ b/src/models/Activity.lua @@ -56,7 +56,7 @@ Activity.schema = { act17 = {"table", {}}, -- {id=关卡星数, totalDmg=Boss总伤害} act18 = {"table", {}, true}, -- {id=兑换数量} - act19 = {"table", {}}, -- {挂机信息} + act19 = {"number", 0}, -- {挂机信息} act20 = {"table", {}}, -- {id=扭蛋抽出数量} } @@ -148,7 +148,7 @@ function Activity:isOpen(activityType) return false end -function Activity:isOpneById(id) +function Activity:isOpenById(id) return self._isOpen[id] end @@ -426,13 +426,34 @@ activityFunc[Activity.ActivityType.CalendaTask] = { -- 兑换 activityFunc[Activity.ActivityType.Exchange] = { ["init"] = function(self, actType, isCrossDay, notify, actId) - local role = self.owner local actData = self:getActData(actType) or {} actData[actId] = {} self:updateActData(actType, actData, not notify) end, - --["close"] = function(self, actType, notify, actId) - --end, + ["crossDay"] = function(self, actType, notify, actId) + local actData = self:getActData(actType) or {} + local lastTs = actData["ts"] or 0 + local timeNow = skynet.timex() + local cfg = csvdb["activity_ctrlCsv"][actId] + if not cfg then return end + local refreshTimes = cfg.condition2:toArray(false, "=") + for i = 1, #refreshTimes do + local rt = toUnixtime(refreshTimes[1]..string_format("%02x", RESET_TIME)) + if timeNow >= rt and rt > lastTs then + lastTs = rt + actData = {} + end + end + if next(actData) then + actData["ts"] = lastTs + self:updateActData(actType, actData, not notify) + end + end, + ["close"] = function(self, actType, notify, actId) + local actData = self:getActData(actType) or {} + actData[actId] = nil + self:updateActData(actType, actData, not notify) + end, } -- 扭蛋机 @@ -445,6 +466,19 @@ activityFunc[Activity.ActivityType.Gachakon] = { end, } +-- 挂机掉落 +activityFunc[Activity.ActivityType.HangDrop] = { + ["init"] = function(self, actType, isCrossDay, notify, actId) + local actime = self:getProperty("actime") + local startTime = actime[actId] + local actData = self:getActData(actType) or 0 + local cfg = csvdb["activity_putCsv"][actId] + if not cfg then return end + actData = startTime + self:updateActData(actType, actData, not notify) + end +} + function Activity:initActivity(actId, isCrossDay, notify) local actData = csvdb["activity_ctrlCsv"][actId] if not actData then return end @@ -473,7 +507,7 @@ function Activity:refreshDailyData(notify) if status and actData then local actType = actData.showType if activityFunc[actType] and activityFunc[actType]['crossDay'] then - activityFunc[actType]["crossDay"](self, actType, notify) + activityFunc[actType]["crossDay"](self, actType, notify, actId) end end end @@ -490,8 +524,8 @@ end -- 获取此次挂机掉落翻倍时长 function Activity:getActHangDoubleTime(lastTs, nowTs) local type = "DoubleDrop" - local actId = checkActivityType(type) - local isOpen = self:isOpen(type) + --local actId = checkActivityType(type) + local isOpen, actId = self:isOpen(type) local openTs = self:getProperty("actime")[actId] or 0 local timeNow = skynet.timex() lastTs = math.max(lastTs, openTs) diff --git a/src/models/RoleLog.lua b/src/models/RoleLog.lua index bbf7bc8..9320b40 100644 --- a/src/models/RoleLog.lua +++ b/src/models/RoleLog.lua @@ -46,6 +46,7 @@ local ItemReason = { actExchange = 131, -- 兑换活动 actGachakon = 132, -- 扭蛋活动 totalRecharge = 133, -- 累计充值奖励 + actHangDrop = 134, -- 掉落活动奖励 advHang = 301, -- 拾荒挂机 -- libgit2 0.21.2