| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633 |
- -- 星曜之门-星耀之力
- local ObjHuman = require("core.ObjHuman")
- local Util = require("common.Util")
- local Msg = require("core.Msg")
- local Broadcast = require("broadcast.Broadcast")
- local Lang = require("common.Lang")
- local BagLogic = require("bag.BagLogic")
- local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
- local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
- local XingYaoMenExcel = require("excel.xingYaoMen")
- local HeroGrid = require("hero.HeroGrid")
- local Grid = require("bag.Grid")
- local RoleAttr = require("role.RoleAttr")
- local ItemDefine = require("bag.ItemDefine")
- local HeroExcel = require("excel.hero")
- -- human.db.XingYaoPower[camp] = {
- -- lv, --等级
- -- lvAttrs, --进度增加的属性,升级清除 lvAttrs[key] = value
- -- exp, --经验
- -- qualityID --品阶id对应配置表
- -- }
- -- human.db.XingYaoPower.resetCnt --重置次数
- function updateDaily(human)
- if not human.db.XingYaoPower then return end
- human.db.XingYaoPower.resetCnt = nil
- end
- local function getPowerData(human,camp)
- if not human.db.XingYaoPower then return end
- return human.db.XingYaoPower[camp]
- end
- function GC_XINGYAOMEN_POWER_REDS(human,camp)
- local msgRet = Msg.gc.GC_XINGYAOMEN_POWER_REDS
- local lvRed = lvRed(human,camp)
- local qualityRed = qualityRed(human,camp)
- msgRet.camp = camp
- msgRet.lvRed = lvRed and 1 or 0
- msgRet.qualityRed = qualityRed and 1 or 0
- --Msg.trace(msgRet)
- Msg.send(msgRet,human.fd)
- end
- local function makeXyPowerLvNet(human,net,camp)
- net.camp = camp
- local db = getPowerData(human,camp)
- net.lv = db and db.lv or 0
- end
- function CG_XINGYAOMEN_POWER_QUERY(human)
- if not RoleSystemLogic.isOpen(human, RoleSystemDefine.ROLE_SYS_ID_10042,true) then
- return
- end
- local defineCnf = XingYaoMenExcel.powerDefine[1]
- local msgRet = Msg.gc.GC_XINGYAOMEN_POWER_QUERY
- msgRet.lvs[0] = #defineCnf.camps
- for i=1,#defineCnf.camps do
- local camp = defineCnf.camps[i]
- makeXyPowerLvNet(human,msgRet.lvs[i],camp)
- end
- msgRet.reds[0] = #defineCnf.camps
- for camp=1,#defineCnf.camps do
- msgRet.reds[camp] = 0
- if lvRed(human,camp) or qualityRed(human,camp) then
- msgRet.reds[camp] = 1
- end
- end
- --Msg.trace(msgRet)
- Msg.send(msgRet,human.fd)
- RoleSystemLogic.sendSystemReds(human, RoleSystemDefine.ROLE_SYS_ID_404)
- end
- local function checkCamp(camp)
- local defineCnf = XingYaoMenExcel.powerDefine[1]
- for i=1,#defineCnf.camps do
- if camp == defineCnf.camps[i] then
- return true
- end
- end
- end
- local function makeLvAttrs(human,net,camp)
- local db = getPowerData(human,camp)
- local nowLV = db and db.lv or 0
- net.attrs[0] = 0
- local conf = XingYaoMenExcel.powerLv[nowLV]
- local attrs = nil
- if conf then
- for i=1,#conf.attrs do
- local key = conf.attrs[i][1]
- local value = conf.attrs[i][2]
- attrs = attrs or {}
- attrs[key] = (attrs[key] or 0) + value
- end
- end
- if db and db.lvAttrs then
- for key,value in pairs(db.lvAttrs) do
- attrs = attrs or {}
- attrs[key] = (attrs[key] or 0) + value
- end
- end
- if attrs then
- for key,value in pairs(attrs) do
- net.attrs[0] = net.attrs[0] + 1
- local index = net.attrs[0]
- net.attrs[index].key = key
- net.attrs[index].value = value
- end
- end
- local defConf = XingYaoMenExcel.powerDefine[1]
- net.attrsShow[0] = #defConf.powerLvAttrs
- for i=1,#defConf.powerLvAttrs do
- net.attrsShow[i].key = defConf.powerLvAttrs[i]
- net.attrsShow[i].value = 0
- end
- end
- local function makeQualityAttrs(human,net,camp)
- local db = getPowerData(human,camp)
- local qualityID = db and db.qualityID or 0
- net.attrs[0] = 0
- local attrs = {}
- if qualityID > 0 then
- for i=1,qualityID do
- local conf = XingYaoMenExcel.powerQuality[i]
- if conf then
- for j=1,#conf.attrs do
- local key = conf.attrs[j][1]
- local value = conf.attrs[j][2]
- attrs[key] = (attrs[key] or 0) + value
- end
- end
- end
- end
- for key,value in pairs(attrs) do
- net.attrs[0] = net.attrs[0] + 1
- local index = net.attrs[0]
- net.attrs[index].key = key
- net.attrs[index].value = value
- end
- local defConf = XingYaoMenExcel.powerDefine[1]
- net.attrsShow[0] = #defConf.powerQualitAttrs
- for i=1,#defConf.powerQualitAttrs do
- net.attrsShow[i].key = defConf.powerQualitAttrs[i]
- net.attrsShow[i].value = 0
- end
- end
- function CG_XINGYAOMEN_POWERLV_QUERY(human,camp)
- if not RoleSystemLogic.isOpen(human, RoleSystemDefine.ROLE_SYS_ID_10042,true) then
- return
- end
- if not checkCamp(camp) then return end
- local msgRet = Msg.gc.GC_XINGYAOMEN_POWERLV_QUERY
- makeXyPowerLvNet(human,msgRet.lv,camp)
-
- local db = getPowerData(human,camp)
- local nowExp = db and db.exp or 0
- local nowLV = db and db.lv or 0
- local conf = XingYaoMenExcel.powerLv
- local nextLV = math.min(nowLV + 1,#conf)
- local nextConf = conf[nextLV]
- msgRet.nowExp = nowExp
- msgRet.needExp = nextConf.needExp
-
- makeLvAttrs(human,msgRet.lvAttrs,camp)
- makeQualityAttrs(human,msgRet.qualityAttrs,camp)
-
- msgRet.upCost[0] = 0
- msgRet.nextAttrs[0] = 0
- if nowLV < #conf then
- msgRet.upCost[0] = 2
- local campsLVupItem = XingYaoMenExcel.powerDefine[1].campsLVupItem[camp]
- Grid.makeItem(msgRet.upCost[1],campsLVupItem,nextConf.upCost)
- Grid.makeItem(msgRet.upCost[2],ItemDefine.ITEM_JINBI_ID,nextConf.upCostJinBi)
- local attrsAdd = nextConf.attrsAdd
- for _,attr in pairs(attrsAdd) do
- msgRet.nextAttrs[0] = msgRet.nextAttrs[0] + 1
- local index = msgRet.nextAttrs[0]
- msgRet.nextAttrs[index].key = attr[1]
- msgRet.nextAttrs[index].value = attr[2]
- end
- end
- --Msg.trace(msgRet)
- Msg.send(msgRet,human.fd)
- GC_XINGYAOMEN_POWER_REDS(human,camp)
- end
- function CG_XINGYAOMEN_POWERLV_UP(human,camp)
- if not RoleSystemLogic.isOpen(human, RoleSystemDefine.ROLE_SYS_ID_10042,true) then
- return
- end
- if not checkCamp(camp) then return end
- local db = getPowerData(human,camp)
- local nowLV = db and db.lv or 0
- local conf = XingYaoMenExcel.powerLv
- if nowLV >= #conf then return end
- local defConf = XingYaoMenExcel.powerDefine[1]
- local campsLVupItem = defConf.campsLVupItem[camp]
- local nextConf = conf[nowLV+1]
- local upCost = nextConf.upCost
- if not BagLogic.checkItemCnt(human, campsLVupItem, upCost) then return end
- if not BagLogic.checkItemCnt(human, ItemDefine.ITEM_JINBI_ID, nextConf.upCostJinBi) then return end
- BagLogic.delItem(human, campsLVupItem, upCost, "xingyao_power")
- BagLogic.delItem(human, ItemDefine.ITEM_JINBI_ID, nextConf.upCostJinBi, "xingyao_power")
- local powerLvUpExp = defConf.powerLvUpExp
- human.db.XingYaoPower = human.db.XingYaoPower or {}
- human.db.XingYaoPower[camp] = human.db.XingYaoPower[camp] or {}
- human.db.XingYaoPower[camp].exp = (human.db.XingYaoPower[camp].exp or 0) + powerLvUpExp
- if human.db.XingYaoPower[camp].exp >= nextConf.needExp then
- human.db.XingYaoPower[camp].lv = nowLV + 1
- human.db.XingYaoPower[camp].lvAttrs = nil
- human.db.XingYaoPower[camp].exp = 0
- else
- local attrsAdd = nextConf.attrsAdd
- for _,attr in pairs(attrsAdd) do
- human.db.XingYaoPower[camp].lvAttrs = human.db.XingYaoPower[camp].lvAttrs or {}
- human.db.XingYaoPower[camp].lvAttrs[attr[1]] = (human.db.XingYaoPower[camp].lvAttrs[attr[1]] or 0) + attr[2]
- end
- end
- ObjHuman.doCalcHeros(human)
- CG_XINGYAOMEN_POWERLV_QUERY(human,camp)
- GC_XINGYAOMEN_POWER_REDS(human,camp)
- RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_404)
- RoleSystemLogic.sendSystemReds(human, RoleSystemDefine.ROLE_SYS_ID_10042)
- end
- function getQualityMax(human,camp)
- local db = getPowerData(human,camp)
- local nowLV = db and db.lv or 0
- local conf = XingYaoMenExcel.powerLv
- if not conf[nowLV] then return 0,0 end
- local qualityMax = conf[nowLV].qualityMax
- local qualityMaxID = 0
- for qualityID,data in ipairs(XingYaoMenExcel.powerQuality) do
- if data.quality == qualityMax then
- qualityMaxID = qualityID
- end
- end
-
- return qualityMax + 1,qualityMaxID + 1
- end
- local function getQualityCanUp(human,camp)
- local db = getPowerData(human,camp)
- local qualityID = db and db.qualityID or 0
- local conf = XingYaoMenExcel.powerLv
- local qualityConf = XingYaoMenExcel.powerQuality
- local quality = qualityConf[qualityID] and qualityConf[qualityID].quality or 0
- local star = qualityConf[qualityID] and qualityConf[qualityID].star or 0
- if star == 0 then
- quality = quality - 1
- end
- for lv,data in ipairs(conf) do
- if quality < data.qualityMax then
- return lv
- end
- end
- return 0
- end
- function CG_XINGYAOMEN_POWERQUALITY_QUERY(human,camp)
- if not RoleSystemLogic.isOpen(human, RoleSystemDefine.ROLE_SYS_ID_10042,true) then
- return
- end
- if not checkCamp(camp) then return end
- local msgRet = Msg.gc.GC_XINGYAOMEN_POWERQUALITY_QUERY
- makeXyPowerLvNet(human,msgRet.lv,camp)
- makeLvAttrs(human,msgRet.lvAttrs,camp)
- makeQualityAttrs(human,msgRet.qualityAttrs,camp)
- local db = getPowerData(human,camp)
- local qualityID = db and db.qualityID or 0
- local conf = XingYaoMenExcel.powerQuality
- local quality = 0
- local star = 0
- if conf[qualityID] then
- quality,star = conf[qualityID].quality,conf[qualityID].star
- end
- msgRet.lvCanUp = 0
- msgRet.upCost[0] = 0
- msgRet.nextAttrs[0] = 0
- local qualityMax,qualityMaxID = getQualityMax(human,camp)
- if qualityID >= qualityMaxID then
- msgRet.lvCanUp = getQualityCanUp(human,camp)
- end
-
- msgRet.quality = quality
- msgRet.star = star
-
- if conf[qualityID+1] and qualityID < qualityMaxID then
- local upCost = conf[qualityID+1].upCost
- msgRet.upCost[0] = #upCost
- for i=1,#upCost do
- Grid.makeItem(msgRet.upCost[i],upCost[i][1],upCost[i][2])
- end
- local attrs = conf[qualityID+1].attrs
- msgRet.nextAttrs[0] = #attrs
- for i=1,#attrs do
- msgRet.nextAttrs[i].key = attrs[i][1]
- msgRet.nextAttrs[i].value = attrs[i][2]
- end
- end
- --Msg.trace(msgRet)
- Msg.send(msgRet,human.fd)
- end
- function CG_XINGYAOMEN_POWERQUALITY_UP(human,camp)
- if not RoleSystemLogic.isOpen(human, RoleSystemDefine.ROLE_SYS_ID_10042,true) then
- return
- end
- if not checkCamp(camp) then return end
- local db = getPowerData(human,camp)
- local qualityID = db and db.qualityID or 0
- local qualityMax,qualityMaxID = getQualityMax(human,camp)
- local conf = XingYaoMenExcel.powerQuality
- local quality = conf[qualityID] and conf[qualityID].quality or 0
- if qualityID >= #conf or qualityID >= qualityMaxID then return end
- local upCost = conf[qualityID+1].upCost
- for _,item in pairs(upCost) do
- if not BagLogic.checkItemCnt(human, item[1], item[2]) then return end
- end
- for _,item in pairs(upCost) do
- BagLogic.delItem(human, item[1], item[2], "xingyao_power")
- end
- human.db.XingYaoPower = human.db.XingYaoPower or {}
- human.db.XingYaoPower[camp] = human.db.XingYaoPower[camp] or {}
- human.db.XingYaoPower[camp].qualityID = qualityID + 1
- ObjHuman.doCalcHeros(human)
- CG_XINGYAOMEN_POWERQUALITY_QUERY(human,camp)
- GC_XINGYAOMEN_POWER_REDS(human,camp)
- RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_404)
- RoleSystemLogic.sendSystemReds(human, RoleSystemDefine.ROLE_SYS_ID_10042)
- end
- local function getQualityBack(human,camp)
- local db = getPowerData(human,camp)
- local qualityID = db and db.qualityID or 0
- local conf = XingYaoMenExcel.powerQuality
- local backItem = nil
- if qualityID > 0 then
- backItem = {}
- for i=1,qualityID do
- local upCost = conf[i].upCost
- for j=1,#upCost do
- backItem[upCost[j][1]] = (backItem[upCost[j][1]] or 0) + upCost[j][2]
- end
- end
- end
- return backItem
- end
- function CG_XINGYAOMEN_POWERQUALITY_RESET(human,camp)
- if not RoleSystemLogic.isOpen(human, RoleSystemDefine.ROLE_SYS_ID_10042,true) then
- return
- end
- ObjHuman.updateDaily(human)
- local defineCnf = XingYaoMenExcel.powerDefine[1]
- local msgRet = Msg.gc.GC_XINGYAOMEN_POWERQUALITY_RESET
- msgRet.resetMax = defineCnf.resetCnt
- local resetCnt = human.db.XingYaoPower and human.db.XingYaoPower.resetCnt or 0
- msgRet.resetLeft = defineCnf.resetCnt - resetCnt
- Grid.makeItem(msgRet.resetCost,defineCnf.resetCost[1],defineCnf.resetCost[2])
- local backItem = getQualityBack(human,camp)
- msgRet.backItem[0] = 0
- if backItem then
- for itemID,itemCnt in pairs(backItem) do
- msgRet.backItem[0] = msgRet.backItem[0] + 1
- local index = msgRet.backItem[0]
- Grid.makeItem(msgRet.backItem[index],itemID,itemCnt)
- end
- end
- --Msg.trace(msgRet)
- Msg.send(msgRet,human.fd)
- end
- function CG_XINGYAOMEN_POWERQUALITY_RESET_DO(human,camp)
- if not RoleSystemLogic.isOpen(human, RoleSystemDefine.ROLE_SYS_ID_10042,true) then
- return
- end
- if not checkCamp(camp) then return end
- ObjHuman.updateDaily(human)
- local defineCnf = XingYaoMenExcel.powerDefine[1]
- if not BagLogic.checkItemCnt(human,defineCnf.resetCost[1],defineCnf.resetCost[2]) then return end
- BagLogic.delItem(human,defineCnf.resetCost[1],defineCnf.resetCost[2],"xingyao_power")
- local resetCnt = human.db.XingYaoPower and human.db.XingYaoPower.resetCnt or 0
- local resetLeft = defineCnf.resetCnt - resetCnt
- if resetLeft <= 0 then
- return Broadcast.sendErr(human,Lang.XINGYAOMEN_RESETCNT_ERR)
- end
- local db = getPowerData(human,camp)
- local qualityID = db and db.qualityID or 0
- if qualityID == 0 then
- return Broadcast.sendErr(human,Lang.XINGYAOMEN_RESET_ERR)
- end
- local backItem = getQualityBack(human,camp)
- if not backItem then return end
- for itemID,itemCnt in pairs(backItem) do
- BagLogic.addItem(human,itemID,itemCnt,"xingyao_power")
- end
- human.db.XingYaoPower = human.db.XingYaoPower or {}
- human.db.XingYaoPower.resetCnt = resetCnt + 1
- human.db.XingYaoPower[camp].qualityID = nil
- ObjHuman.doCalcHeros(human)
- CG_XINGYAOMEN_POWERQUALITY_RESET(human,camp)
- CG_XINGYAOMEN_POWERQUALITY_QUERY(human,camp)
- GC_XINGYAOMEN_POWER_REDS(human,camp)
- RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_404)
- RoleSystemLogic.sendSystemReds(human, RoleSystemDefine.ROLE_SYS_ID_10042)
- end
- function CG_XINGYAOMEN_POWERQUALITY_ATTRS(human,camp)
- if not RoleSystemLogic.isOpen(human, RoleSystemDefine.ROLE_SYS_ID_10042,true) then
- return
- end
- if not checkCamp(camp) then return end
- local msgRet = Msg.gc.GC_XINGYAOMEN_POWERQUALITY_ATTRS
- msgRet.camp = camp
- local defConf = XingYaoMenExcel.powerDefine[1]
- msgRet.attrsShow[0] = #defConf.powerQualitAttrs
- for i=1,#defConf.powerQualitAttrs do
- msgRet.attrsShow[i].key = defConf.powerQualitAttrs[i]
- msgRet.attrsShow[i].value = 0
- end
- msgRet.showList[0] = 0
- local list = {}
- for key,data in ipairs(XingYaoMenExcel.powerQuality) do
- local quality = data.quality
- if data.star ~= 0 then
- quality = quality + 1
- end
- list[quality] = list[quality] or {}
- for _,attr in pairs(data.attrs) do
- local key = attr[1]
- local value = attr[2]
- list[quality] = list[quality] or {}
- list[quality][key] = (list[quality][key] or 0) + value
- end
- end
- for i=1,#list do
- local allAttrs = {}
- msgRet.showList[0] = msgRet.showList[0] + 1
- local index = msgRet.showList[0]
- msgRet.showList[index].quality = i
- msgRet.showList[index].attrs[0] = 0
- for j=1,#list do
- if j <= i then
- for key,value in pairs(list[j]) do
- allAttrs[key] = (allAttrs[key] or 0) + value
- end
- end
- end
- for key,value in pairs(allAttrs) do
- msgRet.showList[index].attrs[0] = msgRet.showList[index].attrs[0] + 1
- local attrIndex = msgRet.showList[index].attrs[0]
- msgRet.showList[index].attrs[attrIndex].key = key
- msgRet.showList[index].attrs[attrIndex].value = value
- end
- end
- --Msg.trace(msgRet)
- Msg.send(msgRet,human.fd)
- end
- function lvRed(human,camp)
- local db = getPowerData(human,camp)
- local nowLV = db and db.lv or 0
- local conf = XingYaoMenExcel.powerLv
- if nowLV >= #conf then return end
- local nextConf = conf[nowLV+1]
- local upCost = nextConf.upCost
- local campsLVupItem = XingYaoMenExcel.powerDefine[1].campsLVupItem[camp]
- local now = BagLogic.getItemCnt(human,campsLVupItem)
- if upCost > now then return end
- if human.db.jinbi < nextConf.upCostJinBi then return end
- return true
- end
- function qualityRed(human,camp)
- local db = getPowerData(human,camp)
- local qualityID = db and db.qualityID or 0
- local qualityMax,qualityMaxID = getQualityMax(human,camp)
- local conf = XingYaoMenExcel.powerQuality
- local quality = conf[qualityID] and conf[qualityID].quality or 0
- if qualityID >= #conf or qualityID >= qualityMaxID then return end
- local upCost = conf[qualityID+1].upCost
- for _,item in pairs(upCost) do
- local now = BagLogic.getItemCnt(human,item[1])
- if item[2] > now then return end
- end
- return true
- end
- function isDot(human)
- local defineCnf = XingYaoMenExcel.powerDefine[1]
- for camp=1,#defineCnf.camps do
- local lvRed = lvRed(human,camp)
- if lvRed then return true end
- local qualityRed = qualityRed(human,camp)
- if qualityRed then return true end
- end
- end
- function doCalcHero(human,heroGrid,attrs)
- if not human then return end
-
- local cf = HeroExcel.hero[heroGrid.id]
- local camp = cf.camp
- if not checkCamp(camp) then return end
- local db = getPowerData(human,camp)
- if not db then return end
- local defineCnf = XingYaoMenExcel.powerDefine[1]
- local attrsList = {}
- local nowLV = db and db.lv or 0
- local powerConf = XingYaoMenExcel.powerLv[nowLV]
- if powerConf then
- for i=1,#powerConf.attrs do
- local key = powerConf.attrs[i][1]
- local value = powerConf.attrs[i][2]
- attrsList[key] = (attrsList[key] or 0) + value
- end
- end
- if db and db.lvAttrs then
- for key,value in pairs(db.lvAttrs) do
- attrsList[key] = (attrsList[key] or 0) + value
- end
- end
- local qualityID = db and db.qualityID or 0
- if qualityID > 0 then
- for i=1,qualityID do
- local qualityConf = XingYaoMenExcel.powerQuality[i]
- if qualityConf then
- for j=1,#qualityConf.attrs do
- local key = qualityConf.attrs[j][1]
- local value = qualityConf.attrs[j][2]
- attrsList[key] = (attrsList[key] or 0) + value
- end
- end
- end
- end
- for key,value in pairs(attrsList) do
- RoleAttr.updateValue(key,value,attrs)
- end
- end
|