| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- -- 异界寻宝
- local Msg = require("core.Msg")
- local Lang = require("common.Lang")
- local Grid = require("bag.Grid")
- local BagLogic = require("bag.BagLogic")
- local Broadcast = require("broadcast.Broadcast")
- local AnotherWorldBattleConfig = require("excel.anotherWorldBattle")
- local TREASURELOG = "anotherWorldBattleTreasure"
- local ITEMID_2_TIP = {
- [185] = Lang.AB_MIYAO_NOT_ENOUG
- }
- local showItemTArr = { {1044, 10}, {1045,1}, {1046,1}, {1047,1}, {1048,1} }
- local function initData(human)
- human.db.anotherWordTreasureTimes = 0
- end
- local function getData(human)
- if not human.db.anotherWordTreasureTimes then
- initData(human)
- end
- return human.db.anotherWordTreasureTimes
- end
- local function updateData(human, lotteryTimes)
- human.db.anotherWordTreasureTimes = (human.db.anotherWordTreasureTimes or 0) + lotteryTimes
- end
- -- 根据当前寻宝次数计算出寻宝等级
- local function getTreasureLv(human)
- local lotteryTimes = getData(human)
- local treasureLv = 0
- if not lotteryTimes or lotteryTimes <= 0 then
- return treasureLv
- end
- for _, treasureCfg in pairs(AnotherWorldBattleConfig.treasureLv) do
- if lotteryTimes >= treasureCfg.condLotteryNum and treasureCfg.treasureLv > treasureLv then
- treasureLv = treasureCfg.treasureLv
- end
- end
- return treasureLv
- end
- -- 获取当前寻宝等级的展示道具
- -- local function getShowItemByLv(targetTreasureLv)
- -- local tb = {}
- -- for _, treasureCfg in pairs(AnotherWorldBattleConfig.treasureAwardPool) do
- -- if targetTreasureLv == treasureCfg.treasureLv and treasureCfg.isShow == 1 then
- -- tb[#tb+1] = treasureCfg.item
- -- end
- -- end
- -- return tb
- -- end
- -- 填充协议结构
- local function populateMsg(net, itemArr)
- net[0] = 0
- for i, itemInfo in ipairs(itemArr) do
- net[0] = i
- Grid.makeItem(net[i], itemInfo[1], itemInfo[2])
- end
- end
- -- 填充协议结构2
- local function populateMsg2(net, weightArr, isMaxLv)
- local len = 0
- if isMaxLv == 1 then
- for _, weightTb in ipairs(weightArr) do
- for i=1, 2 do
- len = len + 1
- net[len] = weightTb[2]
- end
- end
- else
- for _, weightTb in ipairs(weightArr) do
- for _, weight in ipairs(weightTb) do
- len = len + 1
- net[len] = weight
- end
- end
- end
- net[0] = len
- end
- -- 生成当前等级的抽奖数据
- local function genLotteryData(targetTreasureLv)
- local totalWeight = 0
- local itemPool = {}
- for _, treasureCfg in pairs(AnotherWorldBattleConfig.treasureAwardPool) do
- if targetTreasureLv == treasureCfg.treasureLv and treasureCfg.weight > 0 then
- totalWeight = totalWeight + treasureCfg.weight
- itemPool[#itemPool+1] = { treasureCfg.weight, treasureCfg.item[1], treasureCfg.item[2] }
- end
- end
- return totalWeight, itemPool
- end
- -- 查询
- function AB_Treasure_Query(human)
- local nowLv = getTreasureLv(human)
- local msgRet = Msg.gc.GC_AB_TREASURE_QUERY
- msgRet.treasureLv = nowLv
- msgRet.lotteryTimes = getData(human)
- msgRet.nextLvCondTimes = 0
- local maxLv = #AnotherWorldBattleConfig.treasureLv
- local nextLv = nowLv + 1
- if nextLv >= maxLv then
- nextLv = maxLv
- end
- msgRet.isMaxLv = nowLv == maxLv and 1 or 0
- local nextLvCfg = AnotherWorldBattleConfig.treasureLv[nextLv]
- msgRet.nextLvCondTimes = nextLvCfg.condLotteryNum
- local awardPoolMsg = msgRet.awardPool
- -- local showItemArr = getShowItemByLv(nowLv)
- awardPoolMsg[0] = #showItemTArr
- for i, itemInfo in ipairs(showItemTArr) do
- Grid.makeItem(awardPoolMsg[i], itemInfo[1], itemInfo[2])
- end
- local costCfg = AnotherWorldBattleConfig.var[1]
- Grid.makeItem(msgRet.lottery1Cost, costCfg.lottery1Cost[1][1], costCfg.lottery1Cost[1][2])
- Grid.makeItem(msgRet.lottery10Cost, costCfg.lottery10Cost[1][1], costCfg.lottery10Cost[1][2])
- populateMsg(msgRet.lottery2Cost, costCfg.lottery2Cost)
- populateMsg(msgRet.lottery20Cost, costCfg.lottery20Cost)
- populateMsg2(msgRet.nextLvProArr, nextLvCfg.probabilityArr, msgRet.isMaxLv)
- Msg.send(msgRet, human.fd)
- end
- -- 抽奖
- function AB_Treasure_Lottery(human, lotteryNum)
- local costItem
- local costCfg = AnotherWorldBattleConfig.var[1]
- if lotteryNum == 1 then
- costItem = costCfg.lottery1Cost
- elseif lotteryNum == 2 then
- costItem = costCfg.lottery2Cost
- elseif lotteryNum == 10 then
- costItem = costCfg.lottery10Cost
- elseif lotteryNum == 20 then
- costItem = costCfg.lottery20Cost
- end
- if not costItem then
- return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
- end
- -- 道具判断
- for _, itemTb in ipairs(costItem) do
- local itemId = itemTb[1]
- local itemNum = itemTb[2]
- if BagLogic.getItemCnt(human, itemId) < itemNum then
- local tips = ITEMID_2_TIP[itemId] or Lang.COMMON_NO_ZUANSHI
- return Broadcast.sendErr(human, tips)
- end
- BagLogic.delItem(human, itemId, itemNum, TREASURELOG)
- end
- -- 开始抽奖
- local weight = 0
- local itemArr = {}
- local nowLv = getTreasureLv(human)
- local totalWeight, itemPool = genLotteryData(nowLv)
- for i=1, lotteryNum do
- weight = 0
- local randWeight = math.random(0, totalWeight)
- for _, v in ipairs(itemPool) do
- weight = weight + v[1]
- if randWeight <= weight then
- itemArr[#itemArr+1] = {v[2], v[3]}
- break
- end
- end
- end
- -- 更新抽奖次数
- updateData(human, lotteryNum)
- -- 发抽奖所得奖励
- BagLogic.addItemList(human, itemArr, TREASURELOG)
- -- 推送最新数据到客户端
- local newLv = getTreasureLv(human)
- if newLv == nowLv then
- local msgRet = Msg.gc.GC_AB_TREASURE_LOTTERY
- msgRet.lotteryTimes = getData(human)
- return Msg.send(msgRet, human.fd)
- end
- AB_Treasure_Query(human)
- end
|