Commit 058a0cbbe407333a382d8607303db2ca6b236b8d

Authored by zhouhaihai
1 parent ea357636

抽卡

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()