Commit 2bc706ab9583b23ebb8a352766dd7147f293d981

Authored by liuzujun
1 parent b8b1c164

兑换活动重置,累充功能

src/ProtocolCode.lua
@@ -221,6 +221,8 @@ actionCodes = { @@ -221,6 +221,8 @@ actionCodes = {
221 Activity_actCalendaTaskRpc = 655, 221 Activity_actCalendaTaskRpc = 655,
222 Activity_actPaySignRpc = 656, 222 Activity_actPaySignRpc = 656,
223 Activity_exchangeRpc = 657, 223 Activity_exchangeRpc = 657,
  224 + Activity_gachakonRpc = 658,
  225 + Activity_hangDropRpc = 659,
224 226
225 Radio_startQuestRpc = 700, 227 Radio_startQuestRpc = 700,
226 Radio_finishQuestRpc = 701, 228 Radio_finishQuestRpc = 701,
src/actions/ActivityAction.lua
@@ -277,7 +277,8 @@ function _M.exchangeRpc(agent, data) @@ -277,7 +277,8 @@ function _M.exchangeRpc(agent, data)
277 local exchangeData = curData[actid] or {} 277 local exchangeData = curData[actid] or {}
278 local curCount = exchangeData[id] or 0 278 local curCount = exchangeData[id] or 0
279 local actCfg = exchangeCfg[id] 279 local actCfg = exchangeCfg[id]
280 - if curCount >= actCfg then return 4 end 280 + local limitArr = actCfg.limit:toArray(true, "=")
  281 + if curCount >= limitArr[2] then return 4 end
281 282
282 local costs = actCfg.goods:toNumMap() 283 local costs = actCfg.goods:toNumMap()
283 if not role:checkItemEnough(costs) then return 5 end 284 if not role:checkItemEnough(costs) then return 5 end
@@ -299,32 +300,120 @@ function _M.gachakonRpc(agent, data) @@ -299,32 +300,120 @@ function _M.gachakonRpc(agent, data)
299 local role = agent.role 300 local role = agent.role
300 local msg = MsgPack.unpack(data) 301 local msg = MsgPack.unpack(data)
301 local actid = msg.actid 302 local actid = msg.actid
  303 + local count = msg.count
  304 +
  305 + if count > 10 then return end
  306 +
302 if not role.activity:isOpenById(actid) then return 1 end 307 if not role.activity:isOpenById(actid) then return 1 end
303 308
  309 + local actCtrlData = csvdb["activity_ctrlCsv"][actid]
  310 + if not actCtrlData then return 2 end
  311 + local cost = actCtrlData.condition2:toNumMap()
  312 +
304 local actCfg = csvdb["activity_capsuleToysCsv"][actid] 313 local actCfg = csvdb["activity_capsuleToysCsv"][actid]
305 - if not actCfg then return 2 end 314 + if not actCfg then return 3 end
  315 +
  316 + for k, v in pairs(cost) do
  317 + cost[k] = v * count
  318 + end
  319 +
  320 + if not role:checkItemEnough(cost) then return 4 end
306 321
307 local gachakonInfo = role.activity:getActData("Gachakon") or {} 322 local gachakonInfo = role.activity:getActData("Gachakon") or {}
308 local tmpCfg = clone(actCfg) 323 local tmpCfg = clone(actCfg)
309 - local flag = 0  
310 - for id, cfg in pairs(tmpCfg) do  
311 - local num = gachakonInfo[id] or 0  
312 - cfg.amount = cfg.amount >= num and cfg.amount - num or 0  
313 - cfg.weight = cfg.weight * cfg.amount  
314 - if cfg.weight > 0 then  
315 - flag = 1 324 + local award = {}
  325 + local remain = 0
  326 + local reset = false
  327 + for i = 1, count do
  328 + local flag = 0
  329 + for id, cfg in pairs(tmpCfg) do
  330 + local num = gachakonInfo[id] or 0
  331 + cfg.amount = cfg.amount >= num and cfg.amount - num or 0
  332 + cfg.weight = cfg.weight * cfg.amount
  333 + if cfg.weight > 0 then
  334 + flag = 1
  335 + end
  336 + end
  337 + if flag == 0 then
  338 + reset = true
  339 + break
  340 + end
  341 + local id = math.randWeight(tmpCfg, "weight")
  342 + gachakonInfo[id] = (gachakonInfo[id] or 0) + 1
  343 + local curAward = tmpCfg[id].award:toNumMap()
  344 + for k, v in pairs(curAward) do
  345 + award[k] = (award[k] or 0) + v
316 end 346 end
  347 + remain = remain + 1
317 end 348 end
318 - if flag == 0 then return 3 end  
319 349
320 - local id = math.randWeight(tmpCfg, "weight")  
321 - local reward, change = role:award(tmpCfg[id].award, {log = {desc = "actGachakon", int1 = actid, int2 = id}}) 350 + if count > remain then return 5 end
  351 +
  352 + role:costItems(cost, {log = {desc = "actGachakon", int1 = actid, int2 = count}})
322 353
323 - gachakonInfo[id] = (gachakonInfo[id] or 0) + 1 354 + local reward, change = role:award(award, {log = {desc = "actGachakon", int1 = actid, int2 = count}})
  355 + if reset then
  356 + gachakonInfo = {}
  357 + end
324 role.activity:updateActData("Gachakon", gachakonInfo) 358 role.activity:updateActData("Gachakon", gachakonInfo)
325 359
326 SendPacket(actionCodes.Activity_gachakonRpc, MsgPack.pack(role:packReward(reward, change))) 360 SendPacket(actionCodes.Activity_gachakonRpc, MsgPack.pack(role:packReward(reward, change)))
327 return true 361 return true
328 end 362 end
329 363
  364 +function _M.hangDropRpc(agent, data)
  365 + local role = agent.role
  366 + local msg = MsgPack.unpack(data)
  367 + local actid = msg.actid
  368 + if not role.activity:isOpenById(actid) then return 1 end
  369 +
  370 + local actCfg = csvdb["activity_putCsv"][actid]
  371 + if not actCfg then return 2 end
  372 +
  373 + local award, period = "", 0
  374 + for i = 1, #actCfg do
  375 + local cfg = actCfg[i]
  376 + if not cfg then
  377 + break
  378 + end
  379 + if cfg.condition ~= "" then
  380 + local arr = cfg.condition:toArray(true, "=")
  381 + local type = arr[1]
  382 + if type == 1 then
  383 + local actId = arr[2]
  384 + local carbonId = arr[3]
  385 + if not role.activity:isOpenById(actid) then return 3 end
  386 + local clInfo = role.activity:getActData("ChallengeLevel") or {}
  387 + if not clInfo[carbonId] then
  388 + break
  389 + end
  390 + end
  391 + end
  392 + award = cfg.reward
  393 + period = cfg.period * 60
  394 + end
  395 + local actData = role.activity:getActData("HangDrop") or 0
  396 + local timeNow = skynet.timex()
  397 + if period == 0 or award == "" then
  398 + return 4
  399 + end
  400 + local num = math.floor((timeNow - actData)/ period)
  401 + num = num > 8 and 8 or num
  402 + if num == 0 then
  403 + return 5
  404 + end
  405 + local reward, change = {}, nil
  406 + for id, value in pairs(award:toNumMap()) do
  407 + reward[id] = value * num
  408 + end
  409 +
  410 + reward, change = role:award(reward, {log = {desc = "actHangDrop", int1 = actid, int2 = num}})
  411 +
  412 + role.activity:updateActData("HangDrop", timeNow)
  413 +
  414 + SendPacket(actionCodes.Activity_hangDropRpc, MsgPack.pack(role:packReward(reward, change)))
  415 +
  416 + return true
  417 +end
  418 +
330 return _M 419 return _M
331 \ No newline at end of file 420 \ No newline at end of file
src/actions/StoreAction.lua
@@ -405,15 +405,20 @@ function _M.getTotalRechargeAwardRpc(agent, data) @@ -405,15 +405,20 @@ function _M.getTotalRechargeAwardRpc(agent, data)
405 local totalRechargeRecord = role.storeData:getProperty("totalRR") 405 local totalRechargeRecord = role.storeData:getProperty("totalRR")
406 local flag = string.char(string.getbit(totalRechargeRecord, index)) 406 local flag = string.char(string.getbit(totalRechargeRecord, index))
407 if flag == "1" then return 1 end 407 if flag == "1" then return 1 end
408 - local cfg = csvdb["Csv"][index] 408 + local cfg = csvdb["activity_payRebateCsv"][index]
409 if not cfg then return 2 end 409 if not cfg then return 2 end
410 - if cfg.condition > totalTwd then return 3 end 410 + if cfg.twd > totalTwd then return 3 end
411 411
412 totalRechargeRecord = string.setbit(totalRechargeRecord, index) 412 totalRechargeRecord = string.setbit(totalRechargeRecord, index)
413 role.storeData:updateProperty({field = "totalRR", value = totalRechargeRecord}) 413 role.storeData:updateProperty({field = "totalRR", value = totalRechargeRecord})
  414 + local main = cfg.main_reward:toNumMap()
  415 + local sub = cfg.sub_reward:toNumMap()
  416 + for k, v in pairs(sub) do
  417 + main[k] = (main[k] or 0) + v
  418 + end
414 419
415 - local reward, _ = role:award(cfg.reward, {log = {desc = "totalRecharge", int1 = index}})  
416 - SendPacket(actionCodes.Store_getTotalRechargeAwardRpc, MsgPack.pack({reward = reward})) 420 + local reward, change = role:award(main, {log = {desc = "totalRecharge", int1 = index}})
  421 + SendPacket(actionCodes.Store_getTotalRechargeAwardRpc, MsgPack.pack(role:packReward(reward, change)))
417 return true 422 return true
418 end 423 end
419 424
1 -Subproject commit e3723ff3514f68c633926970e695d1c9ecea1cd4 1 +Subproject commit 295feade86593a4793972e2cd2d83135d8aee247
src/models/Activity.lua
@@ -56,7 +56,7 @@ Activity.schema = { @@ -56,7 +56,7 @@ Activity.schema = {
56 56
57 act17 = {"table", {}}, -- {id=关卡星数, totalDmg=Boss总伤害} 57 act17 = {"table", {}}, -- {id=关卡星数, totalDmg=Boss总伤害}
58 act18 = {"table", {}, true}, -- {id=兑换数量} 58 act18 = {"table", {}, true}, -- {id=兑换数量}
59 - act19 = {"table", {}}, -- {挂机信息} 59 + act19 = {"number", 0}, -- {挂机信息}
60 act20 = {"table", {}}, -- {id=扭蛋抽出数量} 60 act20 = {"table", {}}, -- {id=扭蛋抽出数量}
61 } 61 }
62 62
@@ -148,7 +148,7 @@ function Activity:isOpen(activityType) @@ -148,7 +148,7 @@ function Activity:isOpen(activityType)
148 return false 148 return false
149 end 149 end
150 150
151 -function Activity:isOpneById(id) 151 +function Activity:isOpenById(id)
152 return self._isOpen[id] 152 return self._isOpen[id]
153 end 153 end
154 154
@@ -426,13 +426,34 @@ activityFunc[Activity.ActivityType.CalendaTask] = { @@ -426,13 +426,34 @@ activityFunc[Activity.ActivityType.CalendaTask] = {
426 -- 兑换 426 -- 兑换
427 activityFunc[Activity.ActivityType.Exchange] = { 427 activityFunc[Activity.ActivityType.Exchange] = {
428 ["init"] = function(self, actType, isCrossDay, notify, actId) 428 ["init"] = function(self, actType, isCrossDay, notify, actId)
429 - local role = self.owner  
430 local actData = self:getActData(actType) or {} 429 local actData = self:getActData(actType) or {}
431 actData[actId] = {} 430 actData[actId] = {}
432 self:updateActData(actType, actData, not notify) 431 self:updateActData(actType, actData, not notify)
433 end, 432 end,
434 - --["close"] = function(self, actType, notify, actId)  
435 - --end, 433 + ["crossDay"] = function(self, actType, notify, actId)
  434 + local actData = self:getActData(actType) or {}
  435 + local lastTs = actData["ts"] or 0
  436 + local timeNow = skynet.timex()
  437 + local cfg = csvdb["activity_ctrlCsv"][actId]
  438 + if not cfg then return end
  439 + local refreshTimes = cfg.condition2:toArray(false, "=")
  440 + for i = 1, #refreshTimes do
  441 + local rt = toUnixtime(refreshTimes[1]..string_format("%02x", RESET_TIME))
  442 + if timeNow >= rt and rt > lastTs then
  443 + lastTs = rt
  444 + actData = {}
  445 + end
  446 + end
  447 + if next(actData) then
  448 + actData["ts"] = lastTs
  449 + self:updateActData(actType, actData, not notify)
  450 + end
  451 + end,
  452 + ["close"] = function(self, actType, notify, actId)
  453 + local actData = self:getActData(actType) or {}
  454 + actData[actId] = nil
  455 + self:updateActData(actType, actData, not notify)
  456 + end,
436 } 457 }
437 458
438 -- 扭蛋机 459 -- 扭蛋机
@@ -445,6 +466,19 @@ activityFunc[Activity.ActivityType.Gachakon] = { @@ -445,6 +466,19 @@ activityFunc[Activity.ActivityType.Gachakon] = {
445 end, 466 end,
446 } 467 }
447 468
  469 +-- 挂机掉落
  470 +activityFunc[Activity.ActivityType.HangDrop] = {
  471 + ["init"] = function(self, actType, isCrossDay, notify, actId)
  472 + local actime = self:getProperty("actime")
  473 + local startTime = actime[actId]
  474 + local actData = self:getActData(actType) or 0
  475 + local cfg = csvdb["activity_putCsv"][actId]
  476 + if not cfg then return end
  477 + actData = startTime
  478 + self:updateActData(actType, actData, not notify)
  479 + end
  480 +}
  481 +
448 function Activity:initActivity(actId, isCrossDay, notify) 482 function Activity:initActivity(actId, isCrossDay, notify)
449 local actData = csvdb["activity_ctrlCsv"][actId] 483 local actData = csvdb["activity_ctrlCsv"][actId]
450 if not actData then return end 484 if not actData then return end
@@ -473,7 +507,7 @@ function Activity:refreshDailyData(notify) @@ -473,7 +507,7 @@ function Activity:refreshDailyData(notify)
473 if status and actData then 507 if status and actData then
474 local actType = actData.showType 508 local actType = actData.showType
475 if activityFunc[actType] and activityFunc[actType]['crossDay'] then 509 if activityFunc[actType] and activityFunc[actType]['crossDay'] then
476 - activityFunc[actType]["crossDay"](self, actType, notify) 510 + activityFunc[actType]["crossDay"](self, actType, notify, actId)
477 end 511 end
478 end 512 end
479 end 513 end
@@ -490,8 +524,8 @@ end @@ -490,8 +524,8 @@ end
490 -- 获取此次挂机掉落翻倍时长 524 -- 获取此次挂机掉落翻倍时长
491 function Activity:getActHangDoubleTime(lastTs, nowTs) 525 function Activity:getActHangDoubleTime(lastTs, nowTs)
492 local type = "DoubleDrop" 526 local type = "DoubleDrop"
493 - local actId = checkActivityType(type)  
494 - local isOpen = self:isOpen(type) 527 + --local actId = checkActivityType(type)
  528 + local isOpen, actId = self:isOpen(type)
495 local openTs = self:getProperty("actime")[actId] or 0 529 local openTs = self:getProperty("actime")[actId] or 0
496 local timeNow = skynet.timex() 530 local timeNow = skynet.timex()
497 lastTs = math.max(lastTs, openTs) 531 lastTs = math.max(lastTs, openTs)
src/models/RoleLog.lua
@@ -46,6 +46,7 @@ local ItemReason = { @@ -46,6 +46,7 @@ local ItemReason = {
46 actExchange = 131, -- 兑换活动 46 actExchange = 131, -- 兑换活动
47 actGachakon = 132, -- 扭蛋活动 47 actGachakon = 132, -- 扭蛋活动
48 totalRecharge = 133, -- 累计充值奖励 48 totalRecharge = 133, -- 累计充值奖励
  49 + actHangDrop = 134, -- 掉落活动奖励
49 50
50 51
51 advHang = 301, -- 拾荒挂机 52 advHang = 301, -- 拾荒挂机