Commit 3c0ea5fb7070be0765111105354d334ffb613176

Authored by zhouhaihai
1 parent f871be67

抽英雄

src/GlobalVar.lua
... ... @@ -134,6 +134,9 @@ TimeReset = {
134 134 DailyBattle2 = 14, -- 特殊-每日副本(贴纸)
135 135 DailyBattle1 = 15, -- 特殊-每日副本(装备)
136 136 DailyBattle3 = 16, -- 特殊-每日副本(时钟箱)
  137 + DrawType1 = 17, -- 变异 抽卡加成
  138 + DrawType2 = 18, -- 通常 抽卡加成
  139 + DrawType3 = 19, -- 魔法 抽卡加成
137 140 }
138 141  
139 142 GuideStep = {
... ...
src/actions/HeroAction.lua
... ... @@ -233,7 +233,7 @@ function _M.commentHeroRpc(agent, data)
233 233 result.status = 1
234 234 else
235 235 local commentKey = getCommentKey(heroType)
236   - local SERV = string.format(".chatd%d", math.random(1, 5))
  236 + local SERV = string.format(".chated%d", math.random(1, 5))
237 237 local legal, mod = skynet.call(SERV, "lua", "check", content)
238 238 if not legal then
239 239 content = mod or ""
... ... @@ -668,208 +668,258 @@ function _M.getResetRewardRpc(agent, data)
668 668 end
669 669  
670 670  
671   -local function randomDrawCondition(pool, condition)
672   - local value = {}
673   - for idx, field in ipairs(condition) do
674   - local lpool = {}
675   - local curIdx = 1
676   - while pool[field .. "_" .. curIdx] do
677   - table.insert(lpool, {pool[field .. "_" .. curIdx]})
678   - curIdx = curIdx + 1
679   - end
680   - if next(lpool) then
681   - value[idx] = math.randWeight(lpool, 1)
682   - end
683   - end
684   - return value
685   -end
686   -
687   -
688   -local function fillDrawPool(curPool, resultPool, isNeedFunc)
689   - for itemId, oneData in pairs(csvdb["build_poolCsv"]) do
690   - if oneData["pool_" .. curPool] and oneData["pool_" .. curPool] ~= "" then
691   - local itemData = csvdb["itemCsv"][itemId]
692   - if itemData and isNeedFunc(itemData) then
693   - for _, one in ipairs(oneData["pool_" .. curPool]:toTableArray(true)) do
694   - table.insert(resultPool, {itemId, one[1], one[2]}) -- itemId, count, 概率
695   - end
696   - end
697   - end
698   - end
699   -end
700 671  
701 672 function _M.drawHeroRpc(agent, data)
702 673 local role = agent.role
703 674 local msg = MsgPack.unpack(data)
704 675  
705 676 if not role:isFuncUnlock(FuncUnlock.GetHero) then return end
706   - local pool = msg.pool -- 1 2 3
  677 + local btype = msg.pool -- 1 2 3 4
707 678 local drawType = msg.type -- 1 单抽 2 十连
708 679  
709   - local buildTypeData = csvdb["build_typeCsv"][pool]
  680 + local buildTypeData = csvdb["build_typeCsv"][btype]
710 681 if not buildTypeData then return 1 end
711 682  
712   - local costs = {{"draw_card", "draw_coin"}, {"draw10_card", "draw10_coin"}} -- 抽取消耗
713 683 local drawCount = {1, 10} -- 抽取次数
  684 + if not drawCount[drawType] then return 2 end
714 685  
715   - local costT = costs[drawType]
716   - if not costT then return 2 end
717   - local cost = buildTypeData[costT[1]]:toNumMap()
718   - if not role:checkItemEnough(cost) then
719   - cost = buildTypeData[costT[2]]:toNumMap()
720   - if not role:checkItemEnough(cost) then
721   - return 3
  686 + local newerDraw
  687 + if btype == 4 then
  688 + newerDraw = role:getProperty("newerDraw")
  689 + if math.illegalNum(globalCsv.draw_newer[2] - (newerDraw[1] or 0), drawCount[drawType], globalCsv.draw_newer[2]) then return 11 end
  690 + end
  691 +
  692 + local cost = {}
  693 + local lastCount = drawCount[drawType]
  694 + for _, costType in ipairs({"draw_card", "draw_coin"}) do
  695 + if buildTypeData[costType] ~= "" then
  696 + local curCost = buildTypeData[costType]:toArray(true, "=")
  697 + local hadCount = role:getItemCount(curCost[1])
  698 + local curCount = math.floor(hadCount / curCost[2])
  699 + if curCount >= lastCount then
  700 + cost[curCost[1]] = curCost[2] * lastCount
  701 + lastCount = 0
  702 + break
  703 + elseif curCount > 0 then
  704 + cost[curCost[1]] = curCost[2] * curCount
  705 + lastCount = lastCount - curCount
  706 + end
722 707 end
723 708 end
  709 + if lastCount > 0 then -- 钱不够
  710 + return 3
  711 + end
724 712  
725   - -- 开始抽
726   - local rateTypes = {"unitRate", "fragmentRate", "itemRate"}
  713 + -- pool 固定的
  714 + local poolEnum = {
  715 + [1] = {
  716 + [1] = 1,
  717 + [2] = 2,
  718 + [3] = 3,
  719 + },
  720 + [2] = 10,
  721 + [3] = 11,
  722 + [4] = 12,
  723 + }
727 724  
728   - local typePool = {}
729   - for _, rateType in ipairs(rateTypes) do
730   - table.insert(typePool, {buildTypeData[rateType]})
  725 + -- 抽取的池子
  726 + local pool = poolEnum[btype]
  727 + if btype == 1 then
  728 + -- 超级卡池子 每周轮换 有活动覆盖之
  729 + --TODO 活动判断
  730 + if false then
  731 + else
  732 + for idx, poolId in pairs(pool) do
  733 + if role:isTimeResetOpen(TimeReset["DrawType" .. idx]) then
  734 + pool = poolId
  735 + break
  736 + end
  737 + end
  738 + if type(pool) ~= "number" then
  739 + pool = -1
  740 + end
  741 + end
731 742 end
  743 + local unitPool = csvdb["build_unitCsv"][pool]
  744 + if not unitPool then return 4 end
732 745  
  746 + -- 开始抽
733 747 local resultPool = {}
  748 + local function fillDrawPool(fixRare, fixCamp, ssrUp)
  749 + local condition = {"rare", "camp"}
  750 + local values = {fixRare, fixCamp}
  751 +
  752 + for idx, field in ipairs(condition) do
  753 + if not values[idx] then
  754 + local lpool = {}
  755 + local curIdx = 1
  756 + while unitPool[field .. "_" .. curIdx] do
  757 + lpool[curIdx] = {unitPool[field .. "_" .. curIdx]}
  758 + curIdx = curIdx + 1
  759 + end
734 760  
735   - local fillPoolFunc = {
736   - unitRate = function(fixRare, fixCamp, fixJob)
737   - local condition = {"rare", "camp", "job"}
738   - local values = randomDrawCondition(csvdb["build_unitCsv"][pool], condition)
739   - values[1] = fixRare or values[1]
740   - values[2] = fixCamp or values[2]
741   - values[3] = fixJob or values[3]
742   - fillDrawPool(pool, resultPool, function(itemData)
743   - if itemData.type ~= ItemType.Hero then return end
744   - local heroData = csvdb["unitCsv"][itemData.id - ItemStartId.Hero]
745   - if not heroData then return end
746   - for idx, field in ipairs(condition) do
747   - if heroData[field] ~= values[idx] then return end
  761 + -- 稀有度 ssr up
  762 + if field == "rare" then
  763 + local all = 0
  764 + for _, weight in pairs(lpool) do
  765 + all = all + weight[1]
  766 + end
  767 +
  768 + lpool[4][1] = lpool[4][1] + (ssrUp or 0) * all
748 769 end
749   - return true
750   - end)
751   - end,
752   - fragmentRate = function(fixRare, fixCamp, fixJob)
753   - local condition = {"rare", "camp", "job"}
754   - local values = randomDrawCondition(csvdb["build_fragmentCsv"][pool], condition)
755   - values[1] = fixRare or values[1]
756   - values[2] = fixCamp or values[2]
757   - values[3] = fixJob or values[3]
758   - fillDrawPool(pool, resultPool, function(itemData)
759   - if itemData.type ~= ItemType.HeroFragment then return end
760   - local heroData = csvdb["unitCsv"][itemData.id]
761   - if not heroData then return end
762   - for idx, field in ipairs(condition) do
763   - if heroData[field] ~= values[idx] then return end
  770 +
  771 + if next(lpool) then
  772 + values[idx] = math.randWeight(lpool, 1)
764 773 end
765   - return true
766   - end)
767   - end,
768   - itemRate = function()
769   - fillDrawPool(pool, resultPool, function(itemData)
770   - if itemData.type == ItemType.HeroFragment or itemData.type == ItemType.Hero then return end
771   - return true
772   - end)
773   - end,
774   - }
  774 + end
  775 + end
775 776  
776   - role:costItems(cost, {log = {desc = "drawHero", short1 = pool}})
777   - local floorHeroCount = role:getProperty("floorHero")[pool] or 0
  777 + for itemId, oneData in pairs(csvdb["build_poolCsv"]) do
  778 + if oneData["pool_" .. pool] and oneData["pool_" .. pool] ~= "" then
  779 + local itemData = csvdb["itemCsv"][itemId]
  780 + while itemData do
  781 + if itemData.type ~= ItemType.Hero then break end
  782 + local heroData = csvdb["unitCsv"][itemData.id - ItemStartId.Hero]
  783 + if not heroData then break end
  784 + local ok = true
  785 + for idx, field in ipairs(condition) do
  786 + if heroData[field] ~= values[idx] then ok = false break end
  787 + end
  788 + if not ok then break end
  789 + resultPool[itemId] = {oneData["pool_" .. pool]} -- itemId, count, 概率
  790 + break
  791 + end
  792 + end
  793 + end
  794 + end
  795 +
  796 + role:costItems(cost, {log = {desc = "drawHero", short1 = btype, int1 = pool}})
  797 +
  798 + local draw_floor_back_counts = globalCsv.draw_floor_back_counts[btype]
  799 + local draw_ssr_up_count_rate = globalCsv.draw_ssr_up_count_rate[btype]
  800 + local floorHeroCount = role:getProperty("floorHero")[btype] or 0
  801 + local ssrUpCount = role:getProperty("ssrUp")[btype] or 0
  802 +
  803 + local newerDrawCount, newerHadSSR
  804 + if btype == 4 then
  805 + newerDrawCount = newerDraw[1] or 0
  806 + newerHadSSR = newerDraw[2] or 0
  807 + end
778 808  
779 809 local ssrCount = 0
780 810 local reward = {}
781 811 for i = 1, drawCount[drawType] do
782 812 floorHeroCount = floorHeroCount + 1
  813 + if btype == 4 then
  814 + newerDrawCount = newerDrawCount + 1
  815 + end
783 816  
784 817 resultPool = {}
785   - local isFloorBack = globalCsv.draw_floor_back_counts[pool] and floorHeroCount >= globalCsv.draw_floor_back_counts[pool]
786   - while not next(resultPool) do
787   - local rateType
  818 + local isFloorBack = draw_floor_back_counts and floorHeroCount >= draw_floor_back_counts
  819 + local isNewerSSR = btype == 4 and (newerHadSSR == 0 and newerDrawCount >= globalCsv.draw_newer[1]) or false
788 820  
789   - if isFloorBack then
790   - rateType = 1 --保底英雄
791   - else
792   - rateType = math.randWeight(typePool, 1)
793   - end
794   - if not fillPoolFunc[rateTypes[rateType]] then return 4 end
795   - if isFloorBack then
796   - fillPoolFunc[rateTypes[rateType]](3) -- 保底 sr 【郑斌】明确
  821 + local ssrUp = 0
  822 + if draw_ssr_up_count_rate then
  823 + ssrUp = math.floor(ssrUpCount / draw_ssr_up_count_rate[1]) * draw_ssr_up_count_rate[2] / 100
  824 + end
  825 + while not next(resultPool) do
  826 + if isNewerSSR then
  827 + fillDrawPool(4) -- 新手保底的 ssr
  828 + elseif isFloorBack then
  829 + fillDrawPool(3) -- 保底 sr 【郑斌】明确
797 830 else
798   - fillPoolFunc[rateTypes[rateType]]()
  831 + fillDrawPool(nil, nil, ssrUp)
799 832 end
800 833 end
801 834  
802   - local idx = math.randWeight(resultPool, 3)
803   - local temp = resultPool[idx]
804   - local itemData = csvdb["itemCsv"][temp[1]]
  835 + local itemId = math.randWeight(resultPool, 1)
  836 + local itemData = csvdb["itemCsv"][itemId]
805 837  
806   - if itemData.type == ItemType.Hero then
807   - if itemData.quality == 4 then
808   - ssrCount = ssrCount + 1
809   - elseif itemData.quality == 3 then
810   - floorHeroCount = 0
  838 + if itemData.quality == 4 then
  839 + ssrCount = ssrCount + 1
  840 + ssrUpCount = 0
  841 +
  842 + if btype == 4 then
  843 + newerHadSSR = newerHadSSR + 1
811 844 end
  845 + elseif itemData.quality == 3 then
  846 + floorHeroCount = 0
  847 + ssrUpCount = ssrUpCount + 1
  848 + else
  849 + ssrUpCount = ssrUpCount + 1
812 850 end
813 851  
814   - if itemData.type == ItemType.Hero and role:isHaveHero(itemData.id - ItemStartId.Hero) then
  852 + if role:isHaveHero(itemData.id - ItemStartId.Hero) then
815 853 local fragId = itemData.id - ItemStartId.Hero
816 854 local heroData = csvdb["unitCsv"][fragId]
817   - local count = globalCsv.draw_unit_tofragment[heroData.rare] * temp[2]
818   - role:award({[fragId] = count}, {log = {desc = "drawHero", short1 = pool}})
819   - table.insert(reward, {id = fragId, count = count, from = temp[1], fcount = temp[2]})
  855 + local count = globalCsv.draw_unit_tofragment[heroData.rare]
  856 + role:award({[fragId] = count}, {log = {desc = "drawHero", short1 = btype, int1 = pool}})
  857 + table.insert(reward, {id = fragId, count = count, from = itemId, fcount = 1})
820 858 else
821   - role:award({[temp[1]] = temp[2]}, {log = {desc = "drawHero", short1 = pool}})
822   - table.insert(reward, {id = temp[1], count = temp[2]})
  859 + role:award({[itemId] = 1}, {log = {desc = "drawHero", short1 = btype, int1 = pool}})
  860 + table.insert(reward, {id = itemId, count = 1})
823 861 end
824 862 end
825 863  
826   - if globalCsv.draw_floor_back_counts[pool] then
  864 + if draw_floor_back_counts then
827 865 local floorHero = role:getProperty("floorHero")
828 866 floorHero[pool] = floorHeroCount
829   - role:updateProperty({field = "floorHero", value = floorHero})
  867 + role:setProperty("floorHero", floorHero)
  868 + end
  869 +
  870 + if draw_ssr_up_count_rate then
  871 + local ssrUp = role:getProperty("ssrUp")
  872 + ssrUp[pool] = ssrUpCount
  873 + role:setProperty("ssrUp", ssrUp)
830 874 end
831 875  
832   - if pool == 1 then
833   - local repayHero = role:getProperty("repayHero")
834   - repayHero = math.min(globalCsv.draw_super_repay_count, repayHero + drawCount[drawType])
835   - role:updateProperty({field = "repayHero", value = repayHero})
  876 + if btype == 4 then
  877 + newerDraw[1] = newerDrawCount
  878 + newerDraw[2] = newerHadSSR
  879 + role:updateProperty({field = "newerDraw", value = newerDraw})
836 880 end
837 881  
  882 + -- if pool == 1 then
  883 + -- local repayHero = role:getProperty("repayHero")
  884 + -- repayHero = math.min(globalCsv.draw_super_repay_count, repayHero + drawCount[drawType])
  885 + -- role:updateProperty({field = "repayHero", value = repayHero})
  886 + -- end
  887 +
838 888 role:checkTaskEnter("DrawHero", {pool = pool, count = drawCount[drawType]})
839 889 if ssrCount > 0 then
840 890 role:checkTaskEnter("DrawSSR", {count = ssrCount})
841 891 end
842   - role:log("hero_action", {desc = "drawHero", short1 = pool, int1 = drawCount[drawType]})
  892 + role:log("hero_action", {desc = "drawHero", short1 = btype, int1 = drawCount[drawType], int2 = pool})
843 893 SendPacket(actionCodes.Hero_drawHeroRpc, MsgPack.pack({reward = reward})) -- 这个 reward 是数组
844 894 return true
845 895 end
846 896  
847   -function _M.repayHeroRpc(agent, data)
848   - local role = agent.role
849   -
850   - local repayHero = role:getProperty("repayHero")
851   - if repayHero < globalCsv.draw_super_repay_count then
852   - return
853   - end
  897 +-- function _M.repayHeroRpc(agent, data)
  898 +-- local role = agent.role
854 899  
855   - role:updateProperty({field = "repayHero", value = 0})
856   - local id = math.randWeight(csvdb["build_giftCsv"], "pool_1")
  900 +-- local repayHero = role:getProperty("repayHero")
  901 +-- if repayHero < globalCsv.draw_super_repay_count then
  902 +-- return
  903 +-- end
857 904  
858   - local reward = {}
859   - local itemData = csvdb["itemCsv"][id]
860   - if itemData.type == ItemType.Hero and role:isHaveHero(itemData.id - ItemStartId.Hero) then
861   - local fragId = itemData.id - ItemStartId.Hero
862   - local heroData = csvdb["unitCsv"][fragId]
863   - local count = globalCsv.draw_unit_tofragment[heroData.rare]
864   - role:award({[fragId] = count}, {log = {desc = "heroRepay"}})
865   - reward = {id = fragId, count = count, from = id, fcount = 1}
866   - else
867   - role:award({[id] = 1}, {log = {desc = "heroRepay"}})
868   - reward = {id = id, count = 1}
869   - end
870   - role:log("hero_action", {desc = "heroRepay"})
871   - SendPacket(actionCodes.Hero_repayHeroRpc, MsgPack.pack({reward = reward}))
872   - return true
873   -end
  905 +-- role:updateProperty({field = "repayHero", value = 0})
  906 +-- local id = math.randWeight(csvdb["build_giftCsv"], "pool_1")
  907 +
  908 +-- local reward = {}
  909 +-- local itemData = csvdb["itemCsv"][id]
  910 +-- if itemData.type == ItemType.Hero and role:isHaveHero(itemData.id - ItemStartId.Hero) then
  911 +-- local fragId = itemData.id - ItemStartId.Hero
  912 +-- local heroData = csvdb["unitCsv"][fragId]
  913 +-- local count = globalCsv.draw_unit_tofragment[heroData.rare]
  914 +-- role:award({[fragId] = count}, {log = {desc = "heroRepay"}})
  915 +-- reward = {id = fragId, count = count, from = id, fcount = 1}
  916 +-- else
  917 +-- role:award({[id] = 1}, {log = {desc = "heroRepay"}})
  918 +-- reward = {id = id, count = 1}
  919 +-- end
  920 +-- role:log("hero_action", {desc = "heroRepay"})
  921 +-- SendPacket(actionCodes.Hero_repayHeroRpc, MsgPack.pack({reward = reward}))
  922 +-- return true
  923 +-- end
874 924  
875 925 return _M
876 926 \ No newline at end of file
... ...
src/agent.lua
... ... @@ -325,6 +325,15 @@ skynet.start(function()
325 325 end
326 326 end)
327 327  
  328 + skynet.info_func(function()
  329 + local info = {}
  330 + info.ip = agentInfo.ip
  331 + if agentInfo.role then
  332 + info.roldId = agentInfo.role:getProperty("id")
  333 + end
  334 + return info
  335 + end)
  336 +
328 337 redisd = skynet.localname(".redis")
329 338 if tonumber(skynet.getenv "logd") == 1 then
330 339 logd = skynet.localname(".log")
... ...
src/models/Role.lua
... ... @@ -144,8 +144,10 @@ Role.schema = {
144 144  
145 145 emailSync = {"number", 0}, -- 已经同步到的邮件Id
146 146  
147   - repayHero = {"number", 0}, -- 超级招募 回馈
  147 + -- repayHero = {"number", 0}, -- 超级招募 回馈
148 148 floorHero = {"table", {}}, -- 招募保底 -- {[poolId] = count}
  149 + ssrUp = {"table", {}}, -- ssr up -- {[poolId] = count}
  150 + newerDraw = {"table", {}}, -- 新手池子 {N, 1} 抽了多少次, 是否出了ssr
149 151 }
150 152  
151 153  
... ... @@ -349,8 +351,8 @@ function Role:data()
349 351 dinerS = self:getProperty("dinerS"),
350 352  
351 353 rmbC = self:getProperty("rmbC"),
352   - repayHero = self:getProperty("repayHero"),
353   - floorHero = self:getProperty("floorHero"),
  354 + -- repayHero = self:getProperty("repayHero"),
  355 + newerDraw = self:getProperty("newerDraw"),
354 356 }
355 357 end
356 358  
... ...
src/models/RolePlugin.lua
... ... @@ -401,10 +401,18 @@ function RolePlugin.bind(Role)
401 401  
402 402 redisproxy:sadd(string.format(R_HEROS, roleId), heroId)
403 403  
  404 + local wakeL = 1
  405 + if unitData.rare == 3 then
  406 + wakeL = 2
  407 + elseif unitData.rare == 4 then
  408 + wakeL = 3
  409 + end
  410 +
404 411 local heroInfo = {
405 412 key = string.format(R_HERO, roleId, heroId),
406 413 id = heroId,
407 414 type= heroType,
  415 + wakeL = wakeL,
408 416 }
409 417  
410 418 local newHero = require("models.Hero").new(heroInfo)
... ...
src/services/watchdog.lua
... ... @@ -51,7 +51,7 @@ local use_logd = tonumber(skynet.getenv &quot;logd&quot;)
51 51 -- @desc: agent状态定时检测
52 52 function check_agent_status()
53 53 pcall(agent_ctrl.check_agent_status, agent_ctrl)
54   - skynet.timeout(1, check_agent_status)
  54 + skynet.timeout(100, check_agent_status)
55 55 end
56 56  
57 57 -- 创建world以及union channel 用于广播
... ...