Commit 3c51e6d4a0938e606d030fe0c0716f8afedb5839

Authored by zhouhaihai
1 parent 42dcb7da

奖励副本 完成

Showing 2 changed files with 116 additions and 31 deletions   Show diff stats
src/actions/HangAction.lua
@@ -498,6 +498,35 @@ function _M.buyBonusCountRpc(agent, data) @@ -498,6 +498,35 @@ function _M.buyBonusCountRpc(agent, data)
498 return true 498 return true
499 end 499 end
500 500
  501 +local function bonusWinReward(role, bonusData)
  502 + local open, actId = role.activity:isOpen("BonusDouble")
  503 + local actData = csvdb["activity_ctrlCsv"][actId]
  504 + local extraCnt = role.storeData:getBonusExtraFightCount()
  505 +
  506 + local coef = 1
  507 + if open and actData then
  508 + coef = tonumber(actData.condition2)
  509 + end
  510 + local bonusC = role.dailyData:getProperty("bonusC")
  511 + bonusC[bonusData.type] = bonusC[bonusData.type] or {c = 0, b = 0}
  512 + if globalCsv.bonus_daily_count * coef + extraCnt - bonusC[bonusData.type]["c"] <= 0 then return false, 1 end
  513 + bonusC[bonusData.type]["c"] = bonusC[bonusData.type]["c"] + 1
  514 + role.dailyData:updateProperty({field = "bonusC", value = bonusC})
  515 +
  516 + local reward, change
  517 + reward = bonusData.reward:toNumMap()
  518 + local chance = bonusData.chance:randWeight(true)
  519 + if chance[1] ~= 0 then
  520 + reward[chance[1]] = (reward[chance[1]] or 0) + chance[2]
  521 + end
  522 + for k, v in pairs(reward) do
  523 + reward[k] = v * (coef > 1 and actData.condition or 1)
  524 + end
  525 + reward, change = role:award(reward, {log = {desc = "bonusBattle", int1 = id}})
  526 + role:checkTaskEnter("BonusPass", {id = id})
  527 + return true, reward, change
  528 +end
  529 +
501 function _M.startBonusBattleRpc(agent, data) 530 function _M.startBonusBattleRpc(agent, data)
502 local role = agent.role 531 local role = agent.role
503 local msg = MsgPack.unpack(data) 532 local msg = MsgPack.unpack(data)
@@ -516,9 +545,6 @@ function _M.startBonusBattleRpc(agent, data) @@ -516,9 +545,6 @@ function _M.startBonusBattleRpc(agent, data)
516 if not bonusData then return 3 end 545 if not bonusData then return 3 end
517 if not role:checkHangPass(bonusData.unlock) then return 4 end 546 if not role:checkHangPass(bonusData.unlock) then return 4 end
518 547
519 - local bTeam = role:getTeamFormatByType(TeamSystemType.BonusBattle)  
520 - if not next(bTeam) then return 5 end  
521 -  
522 local bonusC = role.dailyData:getProperty("bonusC") 548 local bonusC = role.dailyData:getProperty("bonusC")
523 bonusC[bonusData.type] = bonusC[bonusData.type] or {c = 0, b = 0} 549 bonusC[bonusData.type] = bonusC[bonusData.type] or {c = 0, b = 0}
524 550
@@ -529,15 +555,23 @@ function _M.startBonusBattleRpc(agent, data) @@ -529,15 +555,23 @@ function _M.startBonusBattleRpc(agent, data)
529 if open and actData then 555 if open and actData then
530 coef = tonumber(actData.condition2) 556 coef = tonumber(actData.condition2)
531 end 557 end
532 -  
533 if globalCsv.bonus_daily_count * coef + extraCnt - bonusC[bonusData.type]["c"] <= 0 then return 7 end 558 if globalCsv.bonus_daily_count * coef + extraCnt - bonusC[bonusData.type]["c"] <= 0 then return 7 end
534 559
  560 + local bonusStar = role:getProperty("bonusStar")
  561 + if bonusStar[id] and bonusStar[id] >= (1 << #bonusData.sweep_condition:toTableArray(true)) - 1 then
  562 + local status, reward, change = bonusWinReward(role, bonusData)
  563 + if not status then return 10 * (reward or 0) end
  564 + SendPacket(actionCodes.Hang_startBonusBattleRpc, MsgPack.pack({reward = reward, change = change}))
  565 + else
  566 + local bTeam = role:getTeamFormatByType(TeamSystemType.BonusBattle)
  567 + if not next(bTeam) then return 5 end
  568 + role.__bonusBattleCache = {
  569 + key = tostring(math.random()),
  570 + id = id,
  571 + }
  572 + SendPacket(actionCodes.Hang_startBonusBattleRpc, MsgPack.pack({key = role.__bonusBattleCache.key}))
  573 + end
535 574
536 - role.__bonusBattleCache = {  
537 - key = tostring(math.random()),  
538 - id = id,  
539 - }  
540 - SendPacket(actionCodes.Hang_startBonusBattleRpc, MsgPack.pack({key = role.__bonusBattleCache.key}))  
541 return true 575 return true
542 end 576 end
543 577
@@ -548,14 +582,7 @@ function _M.endBonusBattleRpc(agent, data) @@ -548,14 +582,7 @@ function _M.endBonusBattleRpc(agent, data)
548 local key = msg.key 582 local key = msg.key
549 local starNum = msg.starNum 583 local starNum = msg.starNum
550 if not role.__bonusBattleCache then return 1 end 584 if not role.__bonusBattleCache then return 1 end
551 - local open, actId = role.activity:isOpen("BonusDouble")  
552 - local actData = csvdb["activity_ctrlCsv"][actId]  
553 - local extraCnt = role.storeData:getBonusExtraFightCount()  
554 -  
555 - local coef = 1  
556 - if open and actData then  
557 - coef = tonumber(actData.condition2)  
558 - end 585 +
559 586
560 if role.__bonusBattleCache.id ~= id or role.__bonusBattleCache.key ~= key then 587 if role.__bonusBattleCache.id ~= id or role.__bonusBattleCache.key ~= key then
561 SendPacket(actionCodes.Hang_endBonusBattleRpc, MsgPack.pack({errorCode = 1})) 588 SendPacket(actionCodes.Hang_endBonusBattleRpc, MsgPack.pack({errorCode = 1}))
@@ -564,24 +591,78 @@ function _M.endBonusBattleRpc(agent, data) @@ -564,24 +591,78 @@ function _M.endBonusBattleRpc(agent, data)
564 local bonusData = csvdb["bonus_battleCsv"][id] 591 local bonusData = csvdb["bonus_battleCsv"][id]
565 592
566 local reward, change 593 local reward, change
  594 +
  595 + local bonusStar = role:getProperty("bonusStar")
  596 + local curStar = 0
567 if starNum and starNum > 0 then 597 if starNum and starNum > 0 then
568 -- 胜利扣除次数 598 -- 胜利扣除次数
569 - local bonusC = role.dailyData:getProperty("bonusC")  
570 - bonusC[bonusData.type] = bonusC[bonusData.type] or {c = 0, b = 0}  
571 - if globalCsv.bonus_daily_count * coef + extraCnt - bonusC[bonusData.type]["c"] <= 0 then return 3 end  
572 - bonusC[bonusData.type]["c"] = bonusC[bonusData.type]["c"] + 1  
573 - role.dailyData:updateProperty({field = "bonusC", value = bonusC})  
574 -  
575 - reward = bonusData.reward:toNumMap()  
576 - local chance = bonusData.chance:randWeight(true)  
577 - if chance[1] ~= 0 then  
578 - reward[chance[1]] = (reward[chance[1]] or 0) + chance[2] 599 +
  600 + local status, reward, change = bonusWinReward(role, bonusData)
  601 + if not status then return 10 + (reward or 0) end
  602 +
  603 + local bTeam = self:getTeamFormatByType(TeamSystemType.BonusBattle)
  604 + local herosInfo = self:getTeamHerosInfo(bTeam.heros)
  605 +
  606 + local check = {}
  607 + -- 1 通关
  608 + check[1] = function(_)
  609 + return true
  610 + end
  611 + -- 2 阵亡人数 <= N
  612 + check[2] = function(_, cond)
  613 + return msg.info.dead and msg.info.dead <= cond
579 end 614 end
580 - for k, v in pairs(reward) do  
581 - reward[k] = v * (coef > 1 and actData.condition or 1) 615 + -- 3 全员存活
  616 + check[3] = function(_)
  617 + return msg.info.dead and msg.info.dead == 0
582 end 618 end
583 - reward, change = role:award(reward, {log = {desc = "bonusBattle", int1 = id}})  
584 - role:checkTaskEnter("BonusPass", {id = id}) 619 + -- 4 指定种族 >= N
  620 + check[4] = function(_, cond)
  621 + local count = 0
  622 + for _, one in pairs(herosInfo) do
  623 + local heroData = csv["unitCsv"][one.type]
  624 + if heroData.camp == cond then
  625 + count = count + 1
  626 + end
  627 + end
  628 + return count >= cond
  629 + end
  630 + -- 5 指定职业 >= N
  631 + check[5] = function(_, cond)
  632 + local count = 0
  633 + for _, one in pairs(herosInfo) do
  634 + local heroData = csv["unitCsv"][one.type]
  635 + if heroData.job == cond then
  636 + count = count + 1
  637 + end
  638 + end
  639 + return count >= cond
  640 + end
  641 + -- 6 含有指定角色
  642 + check[6] = function(_, cond)
  643 + for _, one in pairs(herosInfo) do
  644 + if one.type == cond then
  645 + return true
  646 + end
  647 + end
  648 + return false
  649 + end
  650 + -- 7 通关耗时 <= X 秒 msg.info.atime
  651 + check[7] = function(_, cond)
  652 + return msg.info.atime and msg.info.atime <= cond
  653 + end
  654 + curStar = 0
  655 + for i, cond in ipairs(bonusData.sweep_condition:toTableArray(true)) do
  656 + if check[cond[1]] and check[cond[1]](table.unpack(cond)) then
  657 + curStar = curStar + (1 << (i - 1))
  658 + end
  659 + end
  660 + else
  661 + curStar = 0
  662 + end
  663 + if curStar ~= bonusStar[id] then
  664 + bonusStar[id] = curStar
  665 + role:updateProperty({field = "bonusStar", value = bonusStar})
585 end 666 end
586 667
587 role:checkBattle("bonus", { 668 role:checkBattle("bonus", {
src/models/Role.lua
@@ -114,6 +114,8 @@ Role.schema = { @@ -114,6 +114,8 @@ Role.schema = {
114 teamIndex = {"table", {}}, -- 各个系统使用的编队索引 type->index 见TeamSystemType 114 teamIndex = {"table", {}}, -- 各个系统使用的编队索引 type->index 见TeamSystemType
115 advTeams = {"table", {}}, -- 拾荒自选编队 115 advTeams = {"table", {}}, -- 拾荒自选编队
116 116
  117 + bonusStar = {"table", {}}, -- 奖励关卡 通关星星 {[id] = 1} 三个二进制位 表示三个星 从低到高 (1 << 0) (1 << 1) (1 << 2) 满星 (1 << 3) - 1
  118 +
117 --引导相关 119 --引导相关
118 newerGuide = {"string","1=1"}, -- 新手引导 master=slave 120 newerGuide = {"string","1=1"}, -- 新手引导 master=slave
119 funcGuide = {"string",""}, -- 功能引导 0=0跳过次数(999永久跳过) 1=1功能1触发情况 121 funcGuide = {"string",""}, -- 功能引导 0=0跳过次数(999永久跳过) 1=1功能1触发情况
@@ -360,6 +362,8 @@ function Role:data() @@ -360,6 +362,8 @@ function Role:data()
360 hangTeams = self:getProperty("hangTeams"), 362 hangTeams = self:getProperty("hangTeams"),
361 teamIndex = self:getProperty("teamIndex"), 363 teamIndex = self:getProperty("teamIndex"),
362 advTeams = self:getProperty("advTeams"), 364 advTeams = self:getProperty("advTeams"),
  365 +
  366 + bonusStar = self:getProperty("bonusStar"),
363 367
364 newerGuide = self:getProperty("newerGuide"), 368 newerGuide = self:getProperty("newerGuide"),
365 funcGuide = self:getProperty("funcGuide"), 369 funcGuide = self:getProperty("funcGuide"),