Commit 058a0cbbe407333a382d8607303db2ca6b236b8d
1 parent
ea357636
抽卡
Showing
3 changed files
with
133 additions
and
5 deletions
Show diff stats
src/ProtocolCode.lua
| @@ -57,6 +57,7 @@ actionCodes = { | @@ -57,6 +57,7 @@ actionCodes = { | ||
| 57 | Hero_referRunesRpc = 217, | 57 | Hero_referRunesRpc = 217, |
| 58 | Hero_createHeroRandomRpc = 218, | 58 | Hero_createHeroRandomRpc = 218, |
| 59 | Hero_getResetRewardRpc = 219, | 59 | Hero_getResetRewardRpc = 219, |
| 60 | + Hero_drawHeroRpc = 220, | ||
| 60 | 61 | ||
| 61 | Hang_startRpc = 251, | 62 | Hang_startRpc = 251, |
| 62 | Hang_checkRpc = 252, | 63 | Hang_checkRpc = 252, |
src/actions/HeroAction.lua
| @@ -15,6 +15,7 @@ local tconcat = table.concat | @@ -15,6 +15,7 @@ local tconcat = table.concat | ||
| 15 | local table_unpack = table.unpack | 15 | local table_unpack = table.unpack |
| 16 | 16 | ||
| 17 | local _M = {} | 17 | local _M = {} |
| 18 | + | ||
| 18 | function _M.levelUpRpc( agent, data ) | 19 | function _M.levelUpRpc( agent, data ) |
| 19 | local role = agent.role | 20 | local role = agent.role |
| 20 | local msg = MsgPack.unpack(data) | 21 | local msg = MsgPack.unpack(data) |
| @@ -610,8 +611,6 @@ end | @@ -610,8 +611,6 @@ end | ||
| 610 | function _M.getResetRewardRpc(agent, data) | 611 | function _M.getResetRewardRpc(agent, data) |
| 611 | local role = agent.role | 612 | local role = agent.role |
| 612 | local msg = MsgPack.unpack(data) | 613 | local msg = MsgPack.unpack(data) |
| 613 | - | ||
| 614 | - local msg = MsgPack.unpack(data) | ||
| 615 | 614 | ||
| 616 | local hero = role.heros[msg.id] | 615 | local hero = role.heros[msg.id] |
| 617 | if not hero then return end | 616 | if not hero then return end |
| @@ -679,4 +678,130 @@ function _M.getResetRewardRpc(agent, data) | @@ -679,4 +678,130 @@ function _M.getResetRewardRpc(agent, data) | ||
| 679 | return true | 678 | return true |
| 680 | end | 679 | end |
| 681 | 680 | ||
| 681 | + | ||
| 682 | +local function randomDrawCondition(pool, condition) | ||
| 683 | + local value = {} | ||
| 684 | + for idx, field in ipairs(condition) do | ||
| 685 | + local lpool = {} | ||
| 686 | + local curIdx = 1 | ||
| 687 | + while pool[field .. "_" .. curIdx] do | ||
| 688 | + table.insert(lpool, {pool[field .. "_" .. curIdx]}) | ||
| 689 | + curIdx = curIdx + 1 | ||
| 690 | + end | ||
| 691 | + if next(lpool) then | ||
| 692 | + value[idx] = math.randWeight(lpool, 1) | ||
| 693 | + end | ||
| 694 | + end | ||
| 695 | + return value | ||
| 696 | +end | ||
| 697 | + | ||
| 698 | + | ||
| 699 | +local function fillDrawPool(curPool, resultPool, isNeedFunc) | ||
| 700 | + for itemId, oneData in pairs(csvdb["build_poolCsv"]) do | ||
| 701 | + if oneData["pool_" .. curPool] and oneData["pool_" .. curPool] ~= "" then | ||
| 702 | + local itemData = csvdb["itemCsv"][itemId] | ||
| 703 | + if itemData and isNeedFunc(itemData) then | ||
| 704 | + for _, one in ipairs(oneData["pool_" .. pool]:toTableArray(true)) do | ||
| 705 | + table.insert(resultPool, {itemId, one[1], one[2]}) -- itemId, count, 概率 | ||
| 706 | + end | ||
| 707 | + end | ||
| 708 | + end | ||
| 709 | + end | ||
| 710 | +end | ||
| 711 | + | ||
| 712 | +function _M.drawHeroRpc(agent, data) | ||
| 713 | + local role = agent.role | ||
| 714 | + local msg = MsgPack.unpack(data) | ||
| 715 | + | ||
| 716 | + local pool = msg.pool -- 1 2 3 | ||
| 717 | + local drawType = msg.type -- 1 单抽 2 十连 | ||
| 718 | + | ||
| 719 | + local buildTypeData = csvdb["build_typeCsv"][pool] | ||
| 720 | + if not buildTypeData then return end | ||
| 721 | + | ||
| 722 | + local costs = {{"draw_card", "draw_coin"}, {"draw10_card", "draw10_coin"}} -- 抽取消耗 | ||
| 723 | + local drawCount = {1, 10} -- 抽取次数 | ||
| 724 | + | ||
| 725 | + local costT = costs[drawType] | ||
| 726 | + if not costT then return end | ||
| 727 | + local cost = buildTypeData[costT[1]]:toNumMap() | ||
| 728 | + if not role:checkItemEnough(cost) then | ||
| 729 | + cost = buildTypeData[costT[2]]:toNumMap() | ||
| 730 | + if not role:checkItemEnough(cost) then | ||
| 731 | + return | ||
| 732 | + end | ||
| 733 | + end | ||
| 734 | + | ||
| 735 | + -- 开始抽 | ||
| 736 | + local rateTypes = {"unitRate", "fragmentRate", "itemRate"} | ||
| 737 | + | ||
| 738 | + local typePool = {} | ||
| 739 | + for _, rateType in ipairs(rateTypes) do | ||
| 740 | + table.insert(typePool, {buildTypeData[rateType]}) | ||
| 741 | + end | ||
| 742 | + local rateType = math.randWeight(typePool, 1) | ||
| 743 | + | ||
| 744 | + local resultPool = {} | ||
| 745 | + | ||
| 746 | + local fillPoolFunc = { | ||
| 747 | + unitRate = function() | ||
| 748 | + local condition = {"rare", "camp", "job"} | ||
| 749 | + local values = randomDrawCondition(csvdb["build_unitCsv"][pool], condition) | ||
| 750 | + fillDrawPool(pool, resultPool, function(itemData) | ||
| 751 | + if itemData.type ~= ItemType.Hero then return end | ||
| 752 | + local heroData = csvdb["unitCsv"][itemData.id - ItemStartId.Hero] | ||
| 753 | + if not heroData then return end | ||
| 754 | + for idx, field in ipairs(condition) do | ||
| 755 | + if heroData[field] ~= values[idx] then return end | ||
| 756 | + end | ||
| 757 | + return true | ||
| 758 | + end) | ||
| 759 | + end, | ||
| 760 | + fragmentRate = function() | ||
| 761 | + local condition = {"rare", "camp", "job"} | ||
| 762 | + local values = randomDrawCondition(csvdb["build_fragmentCsv"][pool], condition) | ||
| 763 | + fillDrawPool(pool, resultPool, function(itemData) | ||
| 764 | + if itemData.type ~= ItemType.HeroFragment then return end | ||
| 765 | + local heroData = csvdb["unitCsv"][itemData.id] | ||
| 766 | + if not heroData then return end | ||
| 767 | + for idx, field in ipairs(condition) do | ||
| 768 | + if heroData[field] ~= values[idx] then return end | ||
| 769 | + end | ||
| 770 | + return true | ||
| 771 | + end) | ||
| 772 | + end, | ||
| 773 | + itemRate = function() | ||
| 774 | + fillDrawPool(pool, resultPool, function(itemData) | ||
| 775 | + if itemData.type == ItemType.HeroFragment or itemData.type == ItemType.Hero then return end | ||
| 776 | + return true | ||
| 777 | + end) | ||
| 778 | + end, | ||
| 779 | + } | ||
| 780 | + | ||
| 781 | + if not fillPoolFunc[rateTypes[rateType]] then return end | ||
| 782 | + fillPoolFunc[rateTypes[rateType]]() | ||
| 783 | + if not next(resultPool) then return end | ||
| 784 | + role:costItems(cost) | ||
| 785 | + | ||
| 786 | + local reward = {} | ||
| 787 | + for i = 1, drawCount[drawType] do | ||
| 788 | + local idx = math.randWeight(resultPool, 3) | ||
| 789 | + local temp = resultPool[idx] | ||
| 790 | + local itemData = csvdb["itemCsv"][temp[1]] | ||
| 791 | + if itemData.type == ItemType.Hero and role:isHaveHero(itemData.id - ItemStartId.Hero) then | ||
| 792 | + local fragId = itemData.id - ItemStartId.Hero | ||
| 793 | + local heroData = csvdb["unitCsv"][fragId] | ||
| 794 | + local count = globalCsv.draw_unit_tofragment[heroData.rare] * temp[2] | ||
| 795 | + role:award({[fragId] = count}) | ||
| 796 | + table.insert(reward, {id = fragId, count = count, from = temp[1], fcount = temp[2]}) | ||
| 797 | + else | ||
| 798 | + role:award({[temp[1]] = temp[2]}) | ||
| 799 | + table.insert(reward, {id = temp[1], count = temp[2]}) | ||
| 800 | + end | ||
| 801 | + end | ||
| 802 | + | ||
| 803 | + SendPacket(actionCodes.Hero_drawHeroRpc, MsgPack.pack({reward = reward})) -- 这个 reward 是数组 | ||
| 804 | + return true | ||
| 805 | +end | ||
| 806 | + | ||
| 682 | return _M | 807 | return _M |
| 683 | \ No newline at end of file | 808 | \ No newline at end of file |
src/adv/AdvPassive.lua
| @@ -246,13 +246,15 @@ function Passive:effect(trigger) | @@ -246,13 +246,15 @@ function Passive:effect(trigger) | ||
| 246 | self["effect" .. effType](self, effValue, trigger) | 246 | self["effect" .. effType](self, effValue, trigger) |
| 247 | end | 247 | end |
| 248 | end | 248 | end |
| 249 | - if self.count <= 0 and self.passiveData.refresh == 1 then -- 次数 <= 0 并且一次冒险内不刷新,被动可以直接移除 | ||
| 250 | - self.isDel = true | ||
| 251 | - end | 249 | + |
| 252 | if self.count > 0 then | 250 | if self.count > 0 then |
| 253 | self.count = self.count < 999 and self.count - 1 or self.count | 251 | self.count = self.count < 999 and self.count - 1 or self.count |
| 254 | self.round = self.passiveData.round | 252 | self.round = self.passiveData.round |
| 255 | end | 253 | end |
| 254 | + | ||
| 255 | + if self.count <= 0 and self.passiveData.refresh == 1 then -- 次数 <= 0 并且一次冒险内不刷新,被动可以直接移除 | ||
| 256 | + self.isDel = true | ||
| 257 | + end | ||
| 256 | end | 258 | end |
| 257 | 259 | ||
| 258 | function Passive:afterRound() | 260 | function Passive:afterRound() |