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"), |