| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600 |
- -- 碎片逻辑
- 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")
- 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)
- 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
- 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
- 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 CG_SUIPIAN_SYNTHESIS(human)
- local msgRet = Msg.gc.GC_SUIPIAN_SYNTHESIS
- local status = 1
- 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
- SUIPIAN_SYNTHESIS(human,itemID,itemCnt)
- status = 0
- end
- end
- end
- msgRet.status = status
- Msg.send(msgRet, human.fd)
- end
|