-- 碎片逻辑 local ItemExcel = require("excel.item") local DropExcel = require("excel.drop") local HeroExcel = require("excel.hero") local Lang = require("common.Lang") local Msg = require("core.Msg") local HeroGrid = require("hero.HeroGrid") local HeroDefine = require("hero.HeroDefine") local HeroLogic = require("hero.HeroLogic") local BagLogic = require("bag.BagLogic") local ItemDefine = require("bag.ItemDefine") local DropSpecial = require("bag.DropSpecial") local Grid = require("bag.Grid") local Broadcast = require("broadcast.Broadcast") local Util = require("common.Util") SUMMON_TYPE_TARGET = 1 -- 指定目标兑换 SUMMON_TYPE_DROP = 2 -- 随机掉落表兑换 SUMMON_TYPE_HERO_SP = 3 -- 英雄条件兑换 SUMMON_TYPE_SHENQI_SP = 4 -- 神器条件兑换 SUMMON_SUBTYPE_HERO = 1 -- 英雄 SUMMON_SUBTYPE_EQUIP = 2 -- 装备 SUMMON_SUBTYPE_SKIN = 3 -- 皮肤 -- 查询 function query(human, itemID) local itemConfig = ItemExcel.item[itemID] if itemConfig == nil then return end if itemConfig.get[1] ~= SUMMON_TYPE_TARGET then return end if itemConfig.get[2] ~= SUMMON_SUBTYPE_HERO then return end local heroID = itemConfig.get[3] local heroGrid = HeroGrid.getCacheHeroGridTujian(heroID) if not heroGrid then return end local msgRet = Msg.gc.GC_SUIPIAN_HERO_QUERY msgRet.id = itemID HeroGrid.makeHeroSimple(msgRet.heroSimple, heroGrid, nil, human, nil, true) --Msg.trace(msgRet) Msg.send(msgRet, human.fd) end -- 召唤 function summon(human, itemID, itemUseCnt) if human.db.bag[itemID] == nil or human.db.bag[itemID] < itemUseCnt then return end local itemConfig = ItemExcel.item[itemID] if itemConfig == nil then return end if itemConfig.get[1] ~= SUMMON_TYPE_TARGET and itemConfig.get[1] ~= SUMMON_TYPE_DROP and itemConfig.get[1] ~= SUMMON_TYPE_HERO_SP and itemConfig.get[1] ~= SUMMON_TYPE_SHENQI_SP then return end if itemConfig.get[2] ~= SUMMON_SUBTYPE_HERO and itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then return end local leftHeroBox = HeroLogic.getEmptyCnt(human) if itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then if leftHeroBox <= 0 then return Broadcast.sendErr(human, Lang.HERO_BAG_FULL) end end local realItemCnt = math.floor(itemUseCnt/itemConfig.fullCnt) if realItemCnt < 1 then return end if realItemCnt * itemConfig.fullCnt ~= itemUseCnt then return end local isHero = 0 local outItemIDList = nil local targetID = nil if itemConfig.get[1] == SUMMON_TYPE_TARGET then -- 召唤数量大于剩余格子数,将真实召唤数量换成剩余格子数 local leftHeroBox = HeroLogic.getEmptyCnt(human) if realItemCnt > leftHeroBox then realItemCnt = leftHeroBox end -- 指定目标 targetID = itemConfig.get[3] elseif itemConfig.get[1] == SUMMON_TYPE_DROP then -- 召唤数量大于剩余格子数,将真实召唤数量换成剩余格子数 if itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then local leftHeroBox = HeroLogic.getEmptyCnt(human) if realItemCnt > leftHeroBox then realItemCnt = leftHeroBox end end -- 掉落表随机掉落 for i = 1, realItemCnt do local dropID = itemConfig.get[3] targetID = getDropTargetID(dropID) outItemIDList = outItemIDList or {} outItemIDList[targetID] = outItemIDList[targetID] or 0 outItemIDList[targetID] = outItemIDList[targetID] + 1 end elseif itemConfig.get[1] == SUMMON_TYPE_HERO_SP then -- 召唤数量大于剩余格子数,将真实召唤数量换成剩余格子数 local leftHeroBox = HeroLogic.getEmptyCnt(human) if realItemCnt > leftHeroBox then realItemCnt = leftHeroBox end -- 英雄条件兑换 local dropTable = DropSpecial.getDropHeroTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3]) for i = 1, realItemCnt do local randTemp = math.random(1, #dropTable) targetID = dropTable[randTemp] outItemIDList = outItemIDList or {} outItemIDList[targetID] = outItemIDList[targetID] or 0 outItemIDList[targetID] = outItemIDList[targetID] + 1 end elseif itemConfig.get[1] == SUMMON_TYPE_SHENQI_SP then -- 神器条件兑换 local dropTable = DropSpecial.getDropEquipTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3], itemConfig.get[3][4]) for i = 1, realItemCnt do local randTemp = math.random(1, #dropTable) targetID = dropTable[randTemp] outItemIDList = outItemIDList or {} outItemIDList[targetID] = outItemIDList[targetID] or 0 outItemIDList[targetID] = outItemIDList[targetID] + 1 end end if targetID == nil and outItemIDList == nil then assert(nil) end local realSuiPianCnt = realItemCnt * itemConfig.fullCnt BagLogic.delItem(human, itemID, realSuiPianCnt, "item_summon") local fenJieList = nil local itemList = {} if itemConfig.get[2] == SUMMON_SUBTYPE_HERO then isHero = 1 if outItemIDList then -- 多个id for k, v in pairs(outItemIDList) do local _, fjlist = HeroLogic.addHero(human, k,nil, v, "item_summon") local heroID = k local hero = HeroExcel.hero[heroID] if fjlist and type(fjlist) == "table" then for fjItemID, fjItemCnt in pairs(fjlist) do fenJieList = fenJieList or {} fenJieList[fjItemID] = (fenJieList[fjItemID] or 0) + fjItemCnt end end end else -- 单个id local _, fjlist = HeroLogic.addHero(human, targetID,nil, realItemCnt, "item_summon") local heroID = targetID local hero = HeroExcel.hero[heroID] if fjlist and type(fjlist) == "table" then for fjItemID, fjItemCnt in pairs(fjlist) do fenJieList = fenJieList or {} fenJieList[fjItemID] = (fenJieList[fjItemID] or 0) + fjItemCnt end end end else if outItemIDList then -- 多个id for k, v in pairs(outItemIDList) do BagLogic.addItem(human, k, v, "item_summon") itemList[k] = itemList[k] or 0 itemList[k] = itemList[k] + v end else -- 单个id BagLogic.addItem(human, targetID, realItemCnt, "item_summon") itemList[targetID] = itemList[targetID] or 0 itemList[targetID] = itemList[targetID] + realItemCnt end end BagLogic.sendItemGetList(human, itemList, "item_summon") local msgRet = Msg.gc.GC_SUIPIAN_SUMMON msgRet.isHero = isHero msgRet.list[0] = 0 msgRet.heroList[0] = 0 msgRet.fenJieList[0] = 0 local netList = (isHero == 1) and msgRet.heroList or msgRet.list if outItemIDList then -- 多个id for k, v in pairs(outItemIDList) do netList[0] = netList[0] + 1 makeResultItemData(netList[netList[0]], k, v, isHero) end else netList[0] = netList[0] + 1 makeResultItemData(netList[netList[0]], targetID, realItemCnt, isHero) end if fenJieList then for fjItemID, fjItemCnt in pairs(fenJieList) do msgRet.fenJieList[0] = msgRet.fenJieList[0] + 1 Grid.makeItem(msgRet.fenJieList[msgRet.fenJieList[0]], fjItemID, fjItemCnt) end end --Msg.trace(msgRet) Msg.send(msgRet, human.fd) end function makeResultItemData(net, id, cnt, isHero) if isHero == 1 then HeroGrid.makeHeroSimpleByID(net, id) net.cnt = cnt else Grid.makeItem(net, id, cnt) end end -- 根据掉落id 获取id function getDropTargetID(dropID) local dropConfig = DropExcel.dropSuipian[dropID] if dropConfig == nil then return end -- 计算总权重 local totalWeight = 0 for k, v in ipairs(dropConfig.dropRule) do local weight = v[2] totalWeight = totalWeight + weight end local heroWeight = nil local r = math.random(1, totalWeight) for k, v in ipairs(dropConfig.dropRule) do local weight = v[2] if r <= weight then heroWeight = v[1] break else r = r - weight end end if heroWeight == nil then assert() end local len = #dropConfig.camp local index = math.random(1, len) local heroID = HeroDefine.getRandHeroByWeightLvAndCamp(heroWeight, dropConfig.camp[index]) return heroID end local function queryBoxList(human, itemConfig) local itemList = itemConfig.cmd[2] if not itemList then return end local msgRet = Msg.gc.GC_SUIPIAN_ITEM_SUMMON_QUERY msgRet.items[0] = #itemList for i = 1, msgRet.items[0] do local itemID = itemList[i][1] local itemCnt = itemList[i][2] local quality = itemList[i][3] Grid.makeItem(msgRet.items[i], itemID, itemCnt, nil, nil, nil, nil, quality) end Msg.send(msgRet, human.fd) end --碎片英雄召唤预览 function CG_SUIPIAN_HERO_SUMMON_QUERY(human, itemID) local itemConfig = ItemExcel.item[itemID] if not itemConfig then return end local cmdStr = itemConfig.cmd[1] if cmdStr == "box" or cmdStr == "boxAll" then return queryBoxList(human, itemConfig) end if itemConfig.get[1] ~= SUMMON_TYPE_TARGET and itemConfig.get[1] ~= SUMMON_TYPE_DROP and itemConfig.get[1] ~= SUMMON_TYPE_HERO_SP and itemConfig.get[1] ~= SUMMON_TYPE_SHENQI_SP then return end if itemConfig.get[2] ~= SUMMON_SUBTYPE_HERO and itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then return end local realItemCnt = 1 if human.db.bag[itemID] ~= nil then realItemCnt = math.floor(human.db.bag[itemID]) end if realItemCnt < 1 then return end local outItemIDList = nil local targetID = nil if itemConfig.get[1] == SUMMON_TYPE_TARGET then -- 指定目标 targetID = itemConfig.get[3] elseif itemConfig.get[1] == SUMMON_TYPE_DROP then local dropID = itemConfig.get[3] local dropConfig = DropExcel.dropSuipian[dropID] if dropConfig == nil then return end local totalCnt = #dropConfig.dropRule local heroWeight local weightLvAndCampHeros = nil for i=1,totalCnt do targetID = dropConfig.dropRule[i] heroWeight = targetID[1] for _, camp in ipairs(dropConfig.camp) do weightLvAndCampHeros = HeroDefine.getHeroByWeightLvAndCamp(heroWeight, camp) for k, v in pairs(weightLvAndCampHeros) do outItemIDList = outItemIDList or {} outItemIDList[v] = outItemIDList[v] or 0 outItemIDList[v] = outItemIDList[v] + 1 end end end elseif itemConfig.get[1] == SUMMON_TYPE_HERO_SP then -- 英雄条件兑换 local dropTable = DropSpecial.getDropHeroTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3]) for i = 1, realItemCnt do local randTemp = math.random(1, #dropTable) targetID = dropTable[randTemp] outItemIDList = outItemIDList or {} outItemIDList[targetID] = outItemIDList[targetID] or 0 outItemIDList[targetID] = outItemIDList[targetID] + 1 end elseif itemConfig.get[1] == SUMMON_TYPE_SHENQI_SP then -- 神器条件兑换 local dropTable = DropSpecial.getDropEquipTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3], itemConfig.get[3][4]) for i = 1, realItemCnt do local randTemp = math.random(1, #dropTable) targetID = dropTable[randTemp] outItemIDList = outItemIDList or {} outItemIDList[targetID] = outItemIDList[targetID] or 0 outItemIDList[targetID] = outItemIDList[targetID] + 1 end end if targetID == nil and outItemIDList == nil then assert(nil) end if itemConfig.get[2] == SUMMON_SUBTYPE_HERO then local msgRet = Msg.gc.GC_SUIPIAN_HERO_SUMMON_QUERY if outItemIDList then local len = 0 for heroID, _ in pairs(outItemIDList) do if heroID and HeroExcel.hero[heroID] == nil then assert(nil, "why heroID no config " .. heroID .. " " .. itemID) end if len >= 50 then break end len = len + 1 HeroGrid.makeHeroSimpleByID(msgRet.heroSimple[len], heroID) end msgRet.heroSimple[0] = len else local heroID = targetID msgRet.heroSimple[0] = 1 HeroGrid.makeHeroSimpleByID(msgRet.heroSimple[1], heroID) end Msg.send(msgRet, human.fd) else local msgRet = Msg.gc.GC_SUIPIAN_ITEM_SUMMON_QUERY local cnt = 0 if outItemIDList then for k, v in pairs(outItemIDList) do cnt = cnt + 1 Grid.makeItem(msgRet.items[cnt], k, v) end if cnt > 0 then msgRet.items[0] = cnt Msg.send(msgRet, human.fd) end else msgRet.items[0] = 1 Grid.makeItem(msgRet.items[1], targetID, 1) Msg.send(msgRet, human.fd) end end end local HEROID_2_SUIPIANID = nil function getSuipianIDbyHeroID(heroID) if not HEROID_2_SUIPIANID then HEROID_2_SUIPIANID = {} for itemID, itemConfig in pairs(ItemExcel.item) do if itemConfig.get[1] == SUMMON_TYPE_TARGET and itemConfig.get[2] == SUMMON_SUBTYPE_HERO then local targetID = itemConfig.get[3] HEROID_2_SUIPIANID[targetID] = itemID end end end return HEROID_2_SUIPIANID[heroID] end -- 碎片合成 function SUIPIAN_SYNTHESIS(human, itemID, itemUseCnt,heros) if human.db.bag[itemID] == nil or human.db.bag[itemID] < itemUseCnt then BagLogic.sendBagList(human) return 0,0 end local itemConfig = ItemExcel.item[itemID] if itemConfig == nil then return 0,0 end local leftHeroBox = HeroLogic.getEmptyCnt(human) if itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then if leftHeroBox <= 0 then BagLogic.sendBagList(human) Broadcast.sendErr(human, Lang.HERO_BAG_FULL) return 1,0 end end local realItemCnt = math.floor(itemUseCnt/itemConfig.fullCnt) if realItemCnt < 1 then return 0,0 end local isHero = 0 local outItemIDList = nil local targetID = nil if itemConfig.get[1] == SUMMON_TYPE_TARGET then local leftHeroBox = HeroLogic.getEmptyCnt(human) if realItemCnt > leftHeroBox then realItemCnt = leftHeroBox end -- 指定目标 targetID = itemConfig.get[3] elseif itemConfig.get[1] == SUMMON_TYPE_DROP then if itemConfig.get[2] ~= SUMMON_SUBTYPE_EQUIP then local leftHeroBox = HeroLogic.getEmptyCnt(human) if realItemCnt > leftHeroBox then realItemCnt = leftHeroBox end end -- 掉落表随机掉落 for i = 1, realItemCnt do local dropID = itemConfig.get[3] targetID = getDropTargetID(dropID) outItemIDList = outItemIDList or {} outItemIDList[targetID] = outItemIDList[targetID] or 0 outItemIDList[targetID] = outItemIDList[targetID] + 1 end elseif itemConfig.get[1] == SUMMON_TYPE_HERO_SP then local leftHeroBox = HeroLogic.getEmptyCnt(human) if realItemCnt > leftHeroBox then realItemCnt = leftHeroBox end local dropTable = DropSpecial.getDropHeroTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3]) for i = 1, realItemCnt do local randTemp = math.random(1, #dropTable) targetID = dropTable[randTemp] outItemIDList = outItemIDList or {} outItemIDList[targetID] = outItemIDList[targetID] or 0 outItemIDList[targetID] = outItemIDList[targetID] + 1 end elseif itemConfig.get[1] == SUMMON_TYPE_SHENQI_SP then local dropTable = DropSpecial.getDropEquipTable(itemConfig.get[3][1], itemConfig.get[3][2], itemConfig.get[3][3], itemConfig.get[3][4]) for i = 1, realItemCnt do local randTemp = math.random(1, #dropTable) targetID = dropTable[randTemp] outItemIDList = outItemIDList or {} outItemIDList[targetID] = outItemIDList[targetID] or 0 outItemIDList[targetID] = outItemIDList[targetID] + 1 end end if targetID == nil and outItemIDList == nil then assert(nil) end local realSuiPianCnt = realItemCnt * itemConfig.fullCnt BagLogic.delItem(human, itemID, realSuiPianCnt, "item_summon") local fenJieList = nil local itemList = {} if itemConfig.get[2] == SUMMON_SUBTYPE_HERO then isHero = 1 if outItemIDList then -- 多个id for k, v in pairs(outItemIDList) do local _, fjlist = HeroLogic.addHero(human, k,nil, v, "item_summon") local heroID = k local hero = HeroExcel.hero[heroID] if fjlist and type(fjlist) == "table" then for fjItemID, fjItemCnt in pairs(fjlist) do fenJieList = fenJieList or {} fenJieList[fjItemID] = (fenJieList[fjItemID] or 0) + fjItemCnt end end end else -- 单个id local _, fjlist = HeroLogic.addHero(human, targetID,nil, realItemCnt, "item_summon") local heroID = targetID local hero = HeroExcel.hero[heroID] if fjlist and type(fjlist) == "table" then for fjItemID, fjItemCnt in pairs(fjlist) do fenJieList = fenJieList or {} fenJieList[fjItemID] = (fenJieList[fjItemID] or 0) + fjItemCnt end end end else if outItemIDList then -- 多个id for k, v in pairs(outItemIDList) do BagLogic.addItem(human, k, v, "item_summon") itemList[k] = itemList[k] or 0 itemList[k] = itemList[k] + v end else -- 单个id BagLogic.addItem(human, targetID, realItemCnt, "item_summon") itemList[targetID] = itemList[targetID] or 0 itemList[targetID] = itemList[targetID] + realItemCnt end end BagLogic.sendItemGetList(human, itemList, "item_summon") local msgRet = Msg.gc.GC_SUIPIAN_SUMMON msgRet.isHero = isHero msgRet.list[0] = 0 msgRet.heroList[0] = 0 msgRet.fenJieList[0] = 0 local cnnt = 0 if outItemIDList then -- 多个id for k, v in pairs(outItemIDList) do heros[0] = heros[0] + 1 makeResultItemData(heros[heros[0]], k, v, isHero) cnnt = cnnt + 1 end else heros[0] = heros[0] + 1 makeResultItemData(heros[heros[0]], targetID, realItemCnt, isHero) cnnt = cnnt + 1 end if fenJieList then for fjItemID, fjItemCnt in pairs(fenJieList) do msgRet.fenJieList[0] = msgRet.fenJieList[0] + 1 Grid.makeItem(msgRet.fenJieList[msgRet.fenJieList[0]], fjItemID, fjItemCnt) end end return 2,cnnt end function CHECK_SYNTHESIS(human) local items = {} local count = 0 for itemID,itemCnt in pairs(human.db.bag) do local itemConfig = ItemExcel.item[itemID] if itemConfig ~= nil and itemConfig.mainType == ItemDefine.MAINTYPE_ITEM and itemConfig.subType == ItemDefine.ITEM_SUBTYPE_SUIPIAN then if itemCnt >= itemConfig.fullCnt then table.insert(items,itemID) count = count + 1 end end end return count,items end function CG_SUIPIAN_SYNTHESIS(human) local msgRet = Msg.gc.GC_SUIPIAN_SYNTHESIS local status = 1 local count,items = CHECK_SYNTHESIS(human) local curIndex = 0 local heros = {} local retNotify = Msg.gc.GC_SUIPIAN_SUMMON retNotify.isHero = 1 retNotify.list[0] = 0 retNotify.heroList[0] = 0 retNotify.fenJieList[0] = 0 for i=1,100 do heros[i]={ id=nil, index=nil, uuid=nil, icon=nil, lv=nil, camp=nil, job=nil, zhandouli=nil, star=nil, quality=nil, isget=nil, isLock=nil, hp=nil, hpMax=nil, up=nil, gl=nil, body=nil, cnt=nil, weightLv=nil, name=nil, grade=nil, jobDesc=nil, label=nil, order=nil, isGongMing=nil, general={ [1]={ cm=nil, age=nil, character=nil, kg=nil, cup=nil, interest=nil, desc=nil, }, [2]={ cm=nil, age=nil, character=nil, kg=nil, cup=nil, interest=nil, desc=nil, }, }, xLv=nil, } end heros[0] = 0 local cnt = 0 local bBagFull = false for itemID,itemCnt in pairs(human.db.bag) do local itemConfig = ItemExcel.item[itemID] if itemConfig ~= nil and itemConfig.mainType == ItemDefine.MAINTYPE_ITEM and itemConfig.subType == ItemDefine.ITEM_SUBTYPE_SUIPIAN then if itemCnt >= itemConfig.fullCnt then curIndex = curIndex + 1 local ret,r = SUIPIAN_SYNTHESIS(human,itemID,itemCnt,heros) cnt = cnt + r status = 0 if ret == 1 then bBagFull = true HeroLogic.sendHeroBagList(human) break end end end end retNotify.heroList[0] = heros[0] for i = 1,heros[0] do retNotify.heroList[i]=heros[i] end if (curIndex == count) or (bBagFull and status == 0 and cnt >= 1) then Msg.send(retNotify, human.fd) end if bBagFull and cnt == 0 then status = 1 end msgRet.status = status Msg.send(msgRet, human.fd) BagLogic.sendBagList(human) end