Commit 3c51e6d4a0938e606d030fe0c0716f8afedb5839
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"), |