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 | 498 | return true |
499 | 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 | 530 | function _M.startBonusBattleRpc(agent, data) |
502 | 531 | local role = agent.role |
503 | 532 | local msg = MsgPack.unpack(data) |
... | ... | @@ -516,9 +545,6 @@ function _M.startBonusBattleRpc(agent, data) |
516 | 545 | if not bonusData then return 3 end |
517 | 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 | 548 | local bonusC = role.dailyData:getProperty("bonusC") |
523 | 549 | bonusC[bonusData.type] = bonusC[bonusData.type] or {c = 0, b = 0} |
524 | 550 | |
... | ... | @@ -529,15 +555,23 @@ function _M.startBonusBattleRpc(agent, data) |
529 | 555 | if open and actData then |
530 | 556 | coef = tonumber(actData.condition2) |
531 | 557 | end |
532 | - | |
533 | 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 | 575 | return true |
542 | 576 | end |
543 | 577 | |
... | ... | @@ -548,14 +582,7 @@ function _M.endBonusBattleRpc(agent, data) |
548 | 582 | local key = msg.key |
549 | 583 | local starNum = msg.starNum |
550 | 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 | 587 | if role.__bonusBattleCache.id ~= id or role.__bonusBattleCache.key ~= key then |
561 | 588 | SendPacket(actionCodes.Hang_endBonusBattleRpc, MsgPack.pack({errorCode = 1})) |
... | ... | @@ -564,24 +591,78 @@ function _M.endBonusBattleRpc(agent, data) |
564 | 591 | local bonusData = csvdb["bonus_battleCsv"][id] |
565 | 592 | |
566 | 593 | local reward, change |
594 | + | |
595 | + local bonusStar = role:getProperty("bonusStar") | |
596 | + local curStar = 0 | |
567 | 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 | 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 | 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 | 666 | end |
586 | 667 | |
587 | 668 | role:checkBattle("bonus", { | ... | ... |
src/models/Role.lua
... | ... | @@ -114,6 +114,8 @@ Role.schema = { |
114 | 114 | teamIndex = {"table", {}}, -- 各个系统使用的编队索引 type->index 见TeamSystemType |
115 | 115 | advTeams = {"table", {}}, -- 拾荒自选编队 |
116 | 116 | |
117 | + bonusStar = {"table", {}}, -- 奖励关卡 通关星星 {[id] = 1} 三个二进制位 表示三个星 从低到高 (1 << 0) (1 << 1) (1 << 2) 满星 (1 << 3) - 1 | |
118 | + | |
117 | 119 | --引导相关 |
118 | 120 | newerGuide = {"string","1=1"}, -- 新手引导 master=slave |
119 | 121 | funcGuide = {"string",""}, -- 功能引导 0=0跳过次数(999永久跳过) 1=1功能1触发情况 |
... | ... | @@ -360,6 +362,8 @@ function Role:data() |
360 | 362 | hangTeams = self:getProperty("hangTeams"), |
361 | 363 | teamIndex = self:getProperty("teamIndex"), |
362 | 364 | advTeams = self:getProperty("advTeams"), |
365 | + | |
366 | + bonusStar = self:getProperty("bonusStar"), | |
363 | 367 | |
364 | 368 | newerGuide = self:getProperty("newerGuide"), |
365 | 369 | funcGuide = self:getProperty("funcGuide"), | ... | ... |