| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246 |
- -- 英雄神威灵装系统
- --db
- --[=[
- heroGrid.artifacts = {
- isActive = nil, -- 是否激活,激活后为true
- level = 0, -- 当前等级
- star = 0, -- 当前星级
- effectArr = { --特效
- {idx = 1, isLock = 0, lv = 0}
- },
- effectArrTemp = { --新洗练出且未替换的特效
- {idx = 1, lv = 0}
- },
- beSkillArr = { --被动技能
- {idx = 1, isLock = 0}
- },
- beSkillArrTemp = { --新洗练出且未替换的被动技能
- {idx = 1}
- },
- }
- ]=]--
- local Msg = require("core.Msg")
- local BagLogic = require("bag.BagLogic")
- local HeroLogic = require("hero.HeroLogic")
- local ObjHuman = require("core.ObjHuman")
- local Grid = require("bag.Grid")
- local RoleAttr = require("role.RoleAttr")
- local RoleDefine = require("role.RoleDefine")
- local HeroArtifactsConfig = require("excel.heroArtifacts")
- local Util = require("common.Util")
- local Lang = require("common.Lang")
- local Broadcast = require("broadcast.Broadcast")
- local GiftLogic
- local LOGTAG = "Artifacts" --日志标识
- local function initArtifactsData(heroGrid)
- heroGrid.artifacts = {
- level = 0,
- star = 0
- }
- end
- local function getArtifactsData(heroGrid)
- return heroGrid.artifacts
- end
- local function updateArtifactsState(heroGrid, state)
- local artifactsData = getArtifactsData(heroGrid)
- if not artifactsData then
- initArtifactsData(heroGrid)
- artifactsData = getArtifactsData(heroGrid)
- end
- artifactsData.isActive = state
- end
- local function upGradeArtifactsLv(heroGrid, addVal)
- local artifactsData = getArtifactsData(heroGrid)
- if not artifactsData then
- initArtifactsData(heroGrid)
- artifactsData = getArtifactsData(heroGrid)
- end
- artifactsData.level = artifactsData.level + addVal
- end
- local function upGradeArtifactsStar(heroGrid, addVal)
- local artifactsData = getArtifactsData(heroGrid)
- if not artifactsData then
- initArtifactsData(heroGrid)
- artifactsData = getArtifactsData(heroGrid)
- end
- artifactsData.star = artifactsData.star + addVal
- end
- local function resetArtifactsData(heroGrid)
- local artifactsData = getArtifactsData(heroGrid)
- artifactsData.level = 0
- artifactsData.star = 0
- artifactsData.isActive = nil
- artifactsData.effectArr = nil
- artifactsData.effectArrTemp = nil
- artifactsData.beSkillArr = nil
- artifactsData.beSkillArrTemp = nil
- end
- -- 是否开启
- local function isOpen(heroGrid)
- local varCfg = HeroArtifactsConfig.Var[1]
- if heroGrid.star < varCfg.openStarCond then
- return false
- end
- return true
- end
- -- 是否激活
- local function isActivate(heroGrid)
- local artifactsData = getArtifactsData(heroGrid)
- return artifactsData and artifactsData.isActive
- end
- -- 计算当前等级/星级的属性总加成
- local function calcAttrs(conf, currentStage)
- local attrList = {}
- for i=1, currentStage do
- local t = conf[i]
- local attrArr = t and t.attrArr
- for _, attrInfo in ipairs(attrArr or {}) do
- local attrId, attrVal = attrInfo[1],attrInfo[2]
- attrList[attrId] = (attrList[attrId] or 0) + attrVal
- end
- end
- return attrList
- end
- -- 获取神威灵装激活消耗
- local function getActivateCost()
- local varCfg = HeroArtifactsConfig.Var[1]
- local activateCostTb = varCfg.activateCost
- return activateCostTb[1][1],activateCostTb[1][2]
- end
- -- 获取等级/星级下一阶段的消耗
- local function getNextStageCost(currentStage, tp, isMax)
- local varCfg = HeroArtifactsConfig.Var[1]
- local itemId = varCfg.upGradeLvCostId
- local itemCnt = 0
- local upGradeCfg = HeroArtifactsConfig.UpGradeLv
- if tp == 2 then
- itemId = varCfg.upGradeStarCostId
- upGradeCfg = HeroArtifactsConfig.UpGradeStar
- end
- if not isMax then
- local nextStageCfg = upGradeCfg[currentStage+1]
- itemCnt = nextStageCfg.costCnt
- end
- return itemId, itemCnt
- end
- -- 获取升到当前等级/星级的总消耗
- local function getTaotalStageCost(currentStage, tp)
- local varCfg = HeroArtifactsConfig.Var[1]
- local itemId = varCfg.upGradeLvCostId
- local itemCnt = 0
- local upGradeCfg = HeroArtifactsConfig.UpGradeLv
- if tp == 2 then
- itemId = varCfg.upGradeStarCostId
- upGradeCfg = HeroArtifactsConfig.UpGradeStar
- end
- for i=1, currentStage do
- local stageCfg = upGradeCfg[i]
- itemCnt = itemCnt + stageCfg.costCnt
- end
- return itemId, itemCnt
- end
- -- 填充激活灵装协议结构数据
- local function populateActivateCostMsg(net)
- -- local varCfg = HeroArtifactsConfig.Var[1]
- -- local activateCostTb = varCfg.activateCost
- -- net[0] = #activateCostTb
- -- for k,v in ipairs(activateCostTb) do
- -- Grid.makeItem(net[k], v[1], v[2])
- -- end
- local itemId, itemCnt = getActivateCost()
- Grid.makeItem(net, itemId, itemCnt)
- end
- -- 填充灵装当前等级/星级总加成属性协议结构数据
- local function populateTotalAttrMsg(net, n, tp)
- local t
- if tp == 1 then
- t = HeroArtifactsConfig.UpGradeLv
- else
- t = HeroArtifactsConfig.UpGradeStar
- end
- local stage = n
- if n <= 0 then
- stage = 1
- end
- local attrList = calcAttrs(t, stage)
- net[0] = 0
- local len = 0
- for attrId, attrVal in pairs(attrList) do
- len = len + 1
- net[0] = len
- net[len].key = attrId
- net[len].value = n <= 0 and 0 or attrVal
- end
- end
- -- 填充灵装下一等级/星级加成属性协议结构数据
- local function populateNextAttrMsg(net, n, tp, isMax)
- local t
- if tp == 1 then
- t = HeroArtifactsConfig.UpGradeLv
- else
- t = HeroArtifactsConfig.UpGradeStar
- end
- net[0] = 0
- local cfg = t[n]
- local attrArrCfg = cfg and cfg.attrArr
- for k,v in ipairs(attrArrCfg or {}) do
- net[0] = k
- net[k].key = v[1]
- net[k].value = isMax and 0 or v[2]
- end
- end
- -- 判断属性是否是绝对值属性
- local function isAbsAttr(attrId)
- return RoleDefine.isAbsAttr(attrId)
- end
- -- 填充灵装特效协议结构数据
- local function populateEffectMsg(net, arr)
- for k, v in ipairs(arr) do
- net[0] = k
- local cfg = HeroArtifactsConfig.EffectList[v.idx]
- net[k].idx = v.idx
- net[k].name = cfg.name
- net[k].desc = cfg.desc
- net[k].isLock = v.isLock or 0
- net[k].isActivate = 1
- net[k].activateStarCond = 1
- net[k].level = v.lv
- local attrVal = cfg.effectAttrValArr[v.lv] or 0
- if not isAbsAttr(cfg.effectAttrId) then
- attrVal = attrVal / 100
- end
- net[k].desc = Util.format(cfg.desc, attrVal)
- end
- end
- -- 填充灵装被动技能协议结构数据
- local function populateBeSkillMsg(net, arr)
- local varCfg = HeroArtifactsConfig.Var[1]
- for i, activateBeSkillStar in ipairs(varCfg.activateBeSkillStarList) do
- net[0] = i
- net[i].idx = i
- net[i].name = ""
- net[i].desc = ""
- net[i].isLock = 0
- net[i].isActivate = 0
- net[i].activateStarCond = activateBeSkillStar
- net[i].level = 0
- if arr and arr[i] then
- local beSkillData = arr[i]
- local cfg = HeroArtifactsConfig.BeSkillList[beSkillData.idx]
- net[i].idx = beSkillData.idx
- net[i].name = cfg.name
- net[i].desc = cfg.desc
- net[i].isLock = beSkillData.isLock or 0
- net[i].isActivate = 1
- end
- end
- end
- -- 计算特效/被动技能的锁定数量
- local function calcLockNum(arr)
- local lockNum = 0
- for _, v in ipairs(arr or {}) do
- if v.isLock and v.isLock == 1 then
- lockNum = lockNum + 1
- end
- end
- return lockNum
- end
- -- 计算特效/被动技能洗练需要消耗的道具
- local function calcRefineCost(data, costIdArr, costNumArr)
- if not costIdArr or not costNumArr then
- return
- end
- if #costIdArr ~= #costNumArr then
- return
- end
- local lockNum = calcLockNum(data)
- lockNum = lockNum + 1
- local itemList = {}
- for i=1, #costIdArr do
- local itemId = costIdArr[i]
- local itemCntArr = costNumArr[i]
- local itemCnt = itemCntArr and itemCntArr[lockNum]
- if not itemId or not itemCnt then
- return
- end
- itemList[itemId] = (itemList[itemId] or 0) + itemCnt
- end
- return itemList
- end
- -- 生成要排除的特效/被动技能列表
- local function genExcludeList(arr)
- if not arr then
- return
- end
- local excludeList = {}
- for _, v in ipairs(arr) do
- excludeList[v.idx] = true
- end
- return excludeList
- end
- -- 随机一个特效/被动技能
- local function randEffect(conf, excludeList)
- local totalWeight = 0
- local arr = {}
- for k,v in ipairs(conf) do
- if not excludeList or not excludeList[k] then
- totalWeight = totalWeight + v.weight
- arr[#arr+1] = {weight = v.weight, idx = k}
- end
- end
- local weight = 0
- local randVal = math.random(1, totalWeight)
- for _, v in ipairs(arr) do
- weight = weight + v.weight
- if randVal <= weight then
- return v.idx
- end
- end
- end
- -- 随机一个特效的等级
- local function randEffectLv()
- local totalWeight = 0
- for k,v in ipairs(HeroArtifactsConfig.EffectLvProb) do
- totalWeight = totalWeight + v.weight
- end
- local weight = 0
- local randVal = math.random(1, totalWeight)
- for _, v in ipairs(HeroArtifactsConfig.EffectLvProb) do
- weight = weight + v.weight
- if randVal <= weight then
- return v.level
- end
- end
- end
- -- 更新战力
- local function updatePower(human)
- RoleAttr.cleanHeroAttrCache(human)
- ObjHuman.doCalc(human)
- ObjHuman.sendAttr(human, RoleDefine.ZHANDOULI)
- end
- -- 更新英雄属性
- local function updateHeroAttr(human, heroID, heroIndex)
- HeroLogic.sendHeroBagDynamic(human, heroID, heroIndex)
- end
- -- 刷新红点
- local function updateRedDot(human, heroGrid)
- HeroLogic.refreshDot(human, heroGrid.uuid)
- end
- -- 刷新战力, 红点, 英雄属性
- local function updatePowerAndRedDot(human, heroGrid, heroID, heroIndex)
- -- 更新战力
- updatePower(human)
- -- 刷新红点
- updateRedDot(human, heroGrid)
- -- 刷新英雄属性
- updateHeroAttr(human, heroID, heroIndex)
- end
- -- 获取神威灵装的被动技能
- function GetArtifactsBeSkillList(heroGrid)
- if not heroGrid or not heroGrid.artifacts then
- return
- end
- local beSkillArr = heroGrid.artifacts.beSkillArr
- if not beSkillArr then
- return
- end
- local skillArr
- for _, skillInfo in ipairs(beSkillArr) do
- local cfgIdx = skillInfo.idx
- local skillCfg = HeroArtifactsConfig.BeSkillList[cfgIdx]
- if skillCfg and skillCfg.skillType == 2 then
- skillArr = skillArr or {}
- skillArr[#skillArr+1] = skillCfg.skillId
- end
- end
- return skillArr
- end
- -- 获取神威灵装对符文/战意的属性加成列表
- function GetFuwenStrengthenAttrList(heroGrid)
- if not heroGrid or not heroGrid.artifacts then
- return
- end
- local beSkillArr = heroGrid.artifacts.beSkillArr
- if not beSkillArr then
- return
- end
- local skillId_2_Attr = nil
- for _, skillInfo in ipairs(beSkillArr) do
- local skillCfg = HeroArtifactsConfig.BeSkillList[skillInfo.idx]
- if skillCfg and skillCfg.skillType == 1 and next(skillCfg.attr) then
- local attrArr = {}
- for i, attrInfo in ipairs(skillCfg.attr) do
- attrArr[i] = {attrInfo[1], attrInfo[2]}
- end
- skillId_2_Attr = skillId_2_Attr or {}
- for _, fuwenSkillId in ipairs(skillCfg.fuwenSkillIdArr) do
- skillId_2_Attr[fuwenSkillId] = attrArr
- end
- end
- end
- return skillId_2_Attr
- end
- -- 获取神威灵装对符文/战意的强化技能列表
- function GetFuwenStrengthenSkillList(heroGrid)
- if not heroGrid or not heroGrid.artifacts then
- return
- end
- local beSkillArr = heroGrid.artifacts.beSkillArr
- if not beSkillArr then
- return
- end
- local skillId_2_strengthenSkillId = nil
- for _, skillInfo in ipairs(beSkillArr) do
- local skillCfg = HeroArtifactsConfig.BeSkillList[skillInfo.idx]
- if skillCfg and skillCfg.skillType == 1 and next(skillCfg.strengthenSkillIdArr) then
- skillId_2_strengthenSkillId = skillId_2_strengthenSkillId or {}
- for i, fuwenSkillId in ipairs(skillCfg.fuwenSkillIdArr) do
- skillId_2_strengthenSkillId[fuwenSkillId] = skillCfg.strengthenSkillIdArr[i]
- end
- end
- end
- return skillId_2_strengthenSkillId
- end
- -- 神威灵装加成
- function doCalcHero(human, heroGrid, addAttrs)
- if not heroGrid or not heroGrid.artifacts then
- return
- end
- local artifactsData = heroGrid.artifacts
- if artifactsData.level > 0 then
- local attrList = calcAttrs(HeroArtifactsConfig.UpGradeLv, artifactsData.level)
- for attrId, attrVal in pairs(attrList) do
- RoleAttr.updateValue(attrId, attrVal, addAttrs)
- end
- end
- if artifactsData.star > 0 then
- local attrList = calcAttrs(HeroArtifactsConfig.UpGradeStar, artifactsData.star)
- for attrId, attrVal in pairs(attrList) do
- RoleAttr.updateValue(attrId, attrVal, addAttrs)
- end
- end
- -- 特效
- if artifactsData.effectArr then
- for _, effectInfo in ipairs(artifactsData.effectArr) do
- local effectCfg = HeroArtifactsConfig.EffectList[effectInfo.idx]
- if effectCfg then
- local effectLv = effectInfo.lv
- local attrId = effectCfg.effectAttrId
- local attrVal = effectCfg.effectAttrValArr[effectLv] or 0
- RoleAttr.updateValue(attrId, attrVal, addAttrs)
- end
- end
- end
- end
- -- 红点判断
- function isArtifactsDot(human, heroGrid)
- if not isOpen(heroGrid) then
- return false
- end
- if not isActivate(heroGrid) then
- local varCfg = HeroArtifactsConfig.Var[1]
- local activateCostTb = varCfg.activateCost
- local itemId, itemCnt = activateCostTb[1][1], activateCostTb[1][2]
- if BagLogic.getItemCnt(human, itemId) >= itemCnt then
- return true
- end
- return false
- end
- local artifactsData = getArtifactsData(heroGrid)
- local currentLevel = artifactsData and artifactsData.level or 0
- local maxLevel = HeroArtifactsConfig.UpGradeLv[#HeroArtifactsConfig.UpGradeLv].level
- if currentLevel < maxLevel then
- local itemId, itemCnt = getNextStageCost(currentLevel, 1)
- if BagLogic.getItemCnt(human, itemId) >= itemCnt then
- return true
- end
- end
- local currentStar = artifactsData and artifactsData.star or 0
- local maxStar = HeroArtifactsConfig.UpGradeStar[#HeroArtifactsConfig.UpGradeStar].star
- if currentStar < maxStar then
- local itemId, itemCnt = getNextStageCost(currentStar, 2)
- if BagLogic.getItemCnt(human, itemId) >= itemCnt then
- return true
- end
- end
- return false
- end
- -- 返还材料计算
- function CalcReturnItem(human, heroGrid)
- if not isOpen(heroGrid) then
- return
- end
- if not isActivate(heroGrid) then
- return
- end
- local artifactsData = getArtifactsData(heroGrid)
- local itemList = {}
- local itemId, itemCnt = getActivateCost()
- itemList[itemId] = (itemList[itemId] or 0) + itemCnt
- if artifactsData and artifactsData.level > 0 then
- itemId, itemCnt = getTaotalStageCost(artifactsData.level, 1)
- itemList[itemId] = (itemList[itemId] or 0) + itemCnt
- end
- if artifactsData and artifactsData.star > 0 then
- itemId, itemCnt = getTaotalStageCost(artifactsData.star, 2)
- itemList[itemId] = (itemList[itemId] or 0) + itemCnt
- end
- return itemList
- end
- -- 重置神威灵装数据
- function ResetArtifactsData(human, heroGrid)
- if not isOpen(heroGrid) then
- return
- end
- if not isActivate(heroGrid) then
- return
- end
- resetArtifactsData(heroGrid)
- end
- -- 神威灵装基础信息查询
- function HeroArtifacts_Base_Query(human, heroID, heroIndex)
- local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
- if not heroGrid then
- return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
- end
- if not isOpen(heroGrid) then
- return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
- end
- local artifactsData = getArtifactsData(heroGrid)
- local currentLevel = artifactsData and artifactsData.level or 0
- local currentStar = artifactsData and artifactsData.star or 0
- local msgRet = Msg.gc.GC_HEROARTIFACTS_BASE_QUERY
- msgRet.artifactsLv = currentLevel
- msgRet.artifactsStar = currentStar
- msgRet.nowLevelAttrs[0] = 0
- msgRet.nowStarAttrs[0] = 0
- msgRet.effectArr[0] = 0
- msgRet.beSkillArr[0] = 0
- msgRet.isActivate = isActivate(heroGrid) and 1 or 0
- populateActivateCostMsg(msgRet.ActivateCost)
- populateTotalAttrMsg(msgRet.nowLevelAttrs, currentLevel, 1)
- populateTotalAttrMsg(msgRet.nowStarAttrs, currentStar, 2)
- if artifactsData and artifactsData.effectArr then
- populateEffectMsg(msgRet.effectArr, artifactsData.effectArr)
- end
- populateBeSkillMsg(msgRet.beSkillArr, artifactsData and artifactsData.beSkillArr)
- Msg.send(msgRet, human.fd)
- end
- -- 激活神威灵装
- function HeroArtifacts_Activate(human, heroID, heroIndex)
- local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
- if not heroGrid then
- return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
- end
- if not isOpen(heroGrid) then
- return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
- end
- if isActivate(heroGrid) then
- return Broadcast.sendErr(human, Lang.BINGSHU_LEARN_ERR_HAD)
- end
- local itemId, itemCnt = getActivateCost()
- if BagLogic.getItemCnt(human, itemId) < itemCnt then
- return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
- end
- BagLogic.delItem(human, itemId, itemCnt, LOGTAG)
- updateArtifactsState(heroGrid, true)
- HeroArtifacts_Base_Query(human, heroID, heroIndex)
- -- 弹窗礼包
- GiftLogic = GiftLogic or require("topup.GiftLogic")
- GiftLogic.trigger(human, GiftLogic.GIFT_ARTIFACTS_OPEN, {currentVal = 0}, GiftLogic.GIFT_SEC_TYPE3)
- end
- -- 神威灵装升级信息查询
- function HeroArtifacts_Lv_Query(human, heroID, heroIndex)
- local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
- if not heroGrid then
- return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
- end
- if not isOpen(heroGrid) then
- return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
- end
- if not isActivate(heroGrid) then
- return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
- end
- local artifactsData = getArtifactsData(heroGrid)
- local UpGradeLvCfg = HeroArtifactsConfig.UpGradeLv
- local currentLevel = artifactsData and artifactsData.level or 0
- local maxLevel = UpGradeLvCfg[#UpGradeLvCfg].level
- local isMax = currentLevel >= maxLevel
- local nextLevel = isMax and maxLevel or currentLevel + 1
- local msgRet = Msg.gc.GC_HEROARTIFACTS_LV_QUERY
- msgRet.artifactsLv = currentLevel
- msgRet.artifactsLvMax = maxLevel
- populateTotalAttrMsg(msgRet.nowLevelAttrs, currentLevel, 1)
- populateNextAttrMsg(msgRet.nextLevelAttrs, nextLevel, 1, isMax)
- local itemId, itemCnt = getNextStageCost(currentLevel, 1, isMax)
- Grid.makeItem(msgRet.cost, itemId, itemCnt)
- Msg.send(msgRet, human.fd)
- end
- -- 神威灵装升级
- function HeroArtifacts_UpGrade_Level(human, heroID, heroIndex)
- local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
- if not heroGrid then
- return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
- end
- if not isOpen(heroGrid) then
- return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
- end
- if not isActivate(heroGrid) then
- return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
- end
- local artifactsData = getArtifactsData(heroGrid)
- local currentLevel = artifactsData and artifactsData.level or 0
- local UpGradeLvCfg = HeroArtifactsConfig.UpGradeLv
- local maxLevel = UpGradeLvCfg[#UpGradeLvCfg].level
- if currentLevel >= maxLevel then
- return Broadcast.sendErr(human, Lang.HERO_AF_LV_MAX)
- end
- local itemId, itemCnt = getNextStageCost(currentLevel, 1)
- if BagLogic.getItemCnt(human, itemId) < itemCnt then
- return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
- end
- BagLogic.delItem(human, itemId, itemCnt, LOGTAG)
- upGradeArtifactsLv(heroGrid, 1)
- HeroArtifacts_Lv_Query(human, heroID, heroIndex)
- updatePowerAndRedDot(human, heroGrid, heroID, heroIndex)
- end
- -- 神威灵装升星信息查询
- function HeroArtifacts_Star_Query(human, heroID, heroIndex)
- local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
- if not heroGrid then
- return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
- end
- if not isOpen(heroGrid) then
- return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
- end
- if not isActivate(heroGrid) then
- return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
- end
- local artifactsData = getArtifactsData(heroGrid)
- local upGradeStarCfg = HeroArtifactsConfig.UpGradeStar
- local currentStar = artifactsData and artifactsData.star or 0
- local maxStar = upGradeStarCfg[#upGradeStarCfg].star
- local isMax = currentStar >= maxStar
- local nextStar = isMax and maxStar or currentStar + 1
- local msgRet = Msg.gc.GC_HEROARTIFACTS_STAR_QUERY
- msgRet.artifactsStar = currentStar
- msgRet.artifactsStarMax = maxStar
- populateTotalAttrMsg(msgRet.nowStarAttrs, currentStar, 2)
- populateNextAttrMsg(msgRet.nextStarAttrs, nextStar, 2, isMax)
- local itemId, itemCnt = getNextStageCost(currentStar, 2, isMax)
- Grid.makeItem(msgRet.cost, itemId, itemCnt)
- msgRet.effectArr[0] = 0
- if artifactsData and artifactsData.effectArr then
- populateEffectMsg(msgRet.effectArr, artifactsData.effectArr)
- end
- populateBeSkillMsg(msgRet.beSkillArr, artifactsData and artifactsData.beSkillArr)
- Msg.send(msgRet, human.fd)
- end
- -- 神威灵装升星
- function HeroArtifacts_UpGrade_Star(human, heroID, heroIndex)
- local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
- if not heroGrid then
- return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
- end
- if not isOpen(heroGrid) then
- return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
- end
- if not isActivate(heroGrid) then
- return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
- end
- local artifactsData = getArtifactsData(heroGrid)
- local currentStar = artifactsData and artifactsData.star or 0
- local upGradeStarCfg = HeroArtifactsConfig.UpGradeStar
- local maxStar = upGradeStarCfg[#upGradeStarCfg].star
- if currentStar >= maxStar then
- return Broadcast.sendErr(human, Lang.HERO_AF_LV_STAR)
- end
- local itemId, itemCnt = getNextStageCost(currentStar, 2)
- if BagLogic.getItemCnt(human, itemId) < itemCnt then
- return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
- end
- BagLogic.delItem(human, itemId, itemCnt, LOGTAG)
- -- 更新英雄星级
- upGradeArtifactsStar(heroGrid, 1)
- local nextStar = currentStar + 1
- local varCfg = HeroArtifactsConfig.Var[1]
- -- 激活新的特效
- if table.find(varCfg.activateEffectStarList, nextStar) then
- local excludeList = nil
- if artifactsData.effectArr then
- excludeList = genExcludeList(artifactsData.effectArr)
- end
- local effectIdx = randEffect(HeroArtifactsConfig.EffectList, excludeList)
- if not effectIdx then
- return Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
- end
- local effectLv = randEffectLv()
- if not effectLv then
- return Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
- end
- artifactsData.effectArr = artifactsData.effectArr or {}
- table.insert(artifactsData.effectArr, {idx = effectIdx, lv = effectLv})
- -- 处理新获得特效后,可能导致洗练界面两边数量不一致的情况
- if artifactsData.effectArrTemp then
- table.insert(artifactsData.effectArrTemp, {idx = effectIdx, lv = effectLv})
- end
- end
- -- 激活新的被动技能
- if table.find(varCfg.activateBeSkillStarList, nextStar) then
- local excludeList = nil
- if artifactsData.beSkillArr then
- excludeList = genExcludeList(artifactsData.beSkillArr)
- end
- local beSkillIdx = randEffect(HeroArtifactsConfig.BeSkillList, excludeList)
- if not beSkillIdx then
- return Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
- end
- artifactsData.beSkillArr = artifactsData.beSkillArr or {}
- table.insert(artifactsData.beSkillArr, {idx = beSkillIdx} )
- -- 处理新获得被动技能后,可能导致洗练界面两边数量不一致的情况
- if artifactsData.beSkillArrTemp then
- table.insert(artifactsData.beSkillArrTemp, {idx = beSkillIdx} )
- end
- end
- HeroArtifacts_Star_Query(human, heroID, heroIndex)
- updatePowerAndRedDot(human, heroGrid, heroID, heroIndex)
- -- 弹窗礼包
- GiftLogic = GiftLogic or require("topup.GiftLogic")
- GiftLogic.trigger(human, GiftLogic.GIFT_ARTIFACTS_UPGRADE_STAR, {currentVal = nextStar}, GiftLogic.GIFT_SEC_TYPE3)
- end
- -- 神威灵装特效洗练信息查询
- function HeroArtifacts_EffectRefine_Query(human, heroID, heroIndex)
- local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
- if not heroGrid then
- return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
- end
- if not isOpen(heroGrid) then
- return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
- end
- if not isActivate(heroGrid) then
- return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
- end
- local artifactsData = getArtifactsData(heroGrid)
- local msgRet = Msg.gc.GC_HEROARTIFACTS_EFFECT_REFINE_QUERY
- msgRet.effectArr[0] = 0
- msgRet.effectArrTemp[0] = 0
- if artifactsData and artifactsData.effectArr then
- populateEffectMsg(msgRet.effectArr, artifactsData.effectArr)
- end
- if artifactsData and artifactsData.effectArrTemp then
- populateEffectMsg(msgRet.effectArrTemp, artifactsData.effectArrTemp)
- end
- msgRet.cost[0] = 0
- local varCfg = HeroArtifactsConfig.Var[1]
- local itemList = calcRefineCost(artifactsData and artifactsData.effectArr, varCfg.lockEffectCostIdList, varCfg.lockEffectCostNumList)
- if not itemList then
- return Broadcast.sendErr(human, Lang.DATA_ERR)
- end
- local len = 0
- for itemId, itemCnt in pairs(itemList) do
- len = len + 1
- msgRet.cost[0] = len
- Grid.makeItem(msgRet.cost[len], itemId, itemCnt)
- end
- Msg.send(msgRet, human.fd)
- end
- -- 锁定/解锁神威灵装特效
- function HeroArtifacts_Effect_Lock(human, heroID, heroIndex, effectIdxArr)
- local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
- if not heroGrid then
- return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
- end
- if not isOpen(heroGrid) then
- return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
- end
- if not isActivate(heroGrid) then
- return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
- end
- local artifactsData = getArtifactsData(heroGrid)
- if not artifactsData or not artifactsData.effectArr then
- return Broadcast.sendErr(human, Lang.HERO_AF_NO_EFFECT)
- end
- if artifactsData.effectArrTemp then
- return Broadcast.sendErr(human, Lang.HERO_AF_NEED_HANDLE_REFINE)
- end
- if effectIdxArr[0] >= #artifactsData.effectArr then
- return Broadcast.sendErr(human, Lang.HERO_AF_CANNOT_LOCK)
- end
- local lockIdxArr = {}
- for i=1,effectIdxArr[0] do
- lockIdxArr[i] = effectIdxArr[i]
- end
- for _, v in ipairs(artifactsData.effectArr) do
- if table.find(lockIdxArr, v.idx) then
- v.isLock = 1
- else
- v.isLock = 0
- end
- end
- HeroArtifacts_EffectRefine_Query(human, heroID, heroIndex)
- end
- -- 洗练神威灵装特效
- function HeroArtifacts_EffectRefine_Do(human, heroID, heroIndex)
- local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
- if not heroGrid then
- return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
- end
- if not isOpen(heroGrid) then
- return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
- end
- if not isActivate(heroGrid) then
- return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
- end
- local artifactsData = getArtifactsData(heroGrid)
- if not artifactsData or not artifactsData.effectArr then
- return Broadcast.sendErr(human, Lang.HERO_AF_NO_EFFECT)
- end
- local varCfg = HeroArtifactsConfig.Var[1]
- local itemList = calcRefineCost(artifactsData.effectArr, varCfg.lockEffectCostIdList, varCfg.lockEffectCostNumList)
- if not itemList then
- return Broadcast.sendErr(human, Lang.DATA_ERR)
- end
- for itemId, itemCnt in pairs(itemList) do
- if BagLogic.getItemCnt(human, itemId) < itemCnt then
- return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
- end
- end
- for itemId, itemCnt in pairs(itemList) do
- BagLogic.delItem(human, itemId, itemCnt, LOGTAG)
- end
- artifactsData.effectArrTemp = Util.copyTable(artifactsData.effectArr)
- for _, effctInfo in ipairs(artifactsData.effectArrTemp) do
- if not effctInfo.isLock or effctInfo.isLock == 0 then
- local excludeList = genExcludeList(artifactsData.effectArrTemp)
- local effectIdx = randEffect(HeroArtifactsConfig.EffectList, excludeList)
- effctInfo.idx = effectIdx
- local effectLv = randEffectLv()
- effctInfo.lv = effectLv
- end
- end
- HeroArtifacts_EffectRefine_Query(human, heroID, heroIndex)
- end
- -- 处理洗练出的神威灵装特效
- -- opType: 0-放弃,1-替换
- function HeroArtifacts_EffectRefine_Handle(human, heroID, heroIndex, opType)
- local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
- if not heroGrid then
- return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
- end
- if not isOpen(heroGrid) then
- return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
- end
- if not isActivate(heroGrid) then
- return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
- end
- if opType ~= 0 and opType ~= 1 then
- return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
- end
- local artifactsData = getArtifactsData(heroGrid)
- if not artifactsData or not artifactsData.effectArrTemp then
- return Broadcast.sendErr(human, Lang.HERO_AF_NO_REFINE_EFFECT)
- end
- if opType == 1 then
- for i, v in ipairs(artifactsData.effectArrTemp) do
- artifactsData.effectArr[i].idx = v.idx
- artifactsData.effectArr[i].lv = v.lv
- end
- end
- artifactsData.effectArrTemp = nil
- HeroArtifacts_EffectRefine_Query(human, heroID, heroIndex)
- updatePower(human)
- updateHeroAttr(human, heroID, heroIndex)
- end
- -- 神威灵装被动技能洗练信息查询
- function HeroArtifacts_BeSkillRefine_Query(human, heroID, heroIndex)
- local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
- if not heroGrid then
- return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
- end
- if not isOpen(heroGrid) then
- return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
- end
- if not isActivate(heroGrid) then
- return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
- end
- local artifactsData = getArtifactsData(heroGrid)
- local msgRet = Msg.gc.GC_HEROARTIFACTS_BESKILL_REFINE_QUERY
- msgRet.beSkillArr[0] = 0
- msgRet.beSkillArrTemp[0] = 0
- if artifactsData and artifactsData.beSkillArr then
- populateBeSkillMsg(msgRet.beSkillArr, artifactsData.beSkillArr)
- end
- if artifactsData and artifactsData.beSkillArrTemp then
- populateBeSkillMsg(msgRet.beSkillArrTemp, artifactsData.beSkillArrTemp)
- end
- msgRet.cost[0] = 0
- local varCfg = HeroArtifactsConfig.Var[1]
- local itemList = calcRefineCost(artifactsData and artifactsData.beSkillArr, varCfg.lockBeSkillCostIdList, varCfg.lockBeSkillCostNumList)
- if not itemList then
- return Broadcast.sendErr(human, Lang.DATA_ERR)
- end
- local len = 0
- for itemId, itemCnt in pairs(itemList) do
- len = len + 1
- msgRet.cost[0] = len
- Grid.makeItem(msgRet.cost[len], itemId, itemCnt)
- end
- Msg.send(msgRet, human.fd)
- end
- -- 锁定/解锁神威灵装被动技能
- function HeroArtifacts_BeSkill_Lock(human, heroID, heroIndex, beSkillIdxArr)
- local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
- if not heroGrid then
- return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
- end
- if not isOpen(heroGrid) then
- return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
- end
- if not isActivate(heroGrid) then
- return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
- end
- local artifactsData = getArtifactsData(heroGrid)
- if not artifactsData or not artifactsData.beSkillArr then
- return Broadcast.sendErr(human, Lang.HERO_AF_NO_BESKILL)
- end
- if artifactsData.beSkillArrTemp then
- return Broadcast.sendErr(human, Lang.HERO_AF_NEED_HANDLE_REFINE)
- end
- if beSkillIdxArr[0] >= #artifactsData.beSkillArr then
- return Broadcast.sendErr(human, Lang.HERO_AF_CANNOT_LOCK)
- end
- local lockIdxArr = {}
- for i=1,beSkillIdxArr[0] do
- lockIdxArr[i] = beSkillIdxArr[i]
- end
- for _, v in ipairs(artifactsData.beSkillArr) do
- if table.find(lockIdxArr, v.idx) then
- v.isLock = 1
- else
- v.isLock = 0
- end
- end
- HeroArtifacts_BeSkillRefine_Query(human, heroID, heroIndex)
- end
- -- 洗练神威灵装被动技能
- function HeroArtifacts_BeSkillRefine_Do(human, heroID, heroIndex)
- local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
- if not heroGrid then
- return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
- end
- if not isOpen(heroGrid) then
- return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
- end
- if not isActivate(heroGrid) then
- return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
- end
- local artifactsData = getArtifactsData(heroGrid)
- if not artifactsData or not artifactsData.beSkillArr then
- return Broadcast.sendErr(human, Lang.HERO_AF_NO_BESKILL)
- end
- local varCfg = HeroArtifactsConfig.Var[1]
- local itemList = calcRefineCost(artifactsData.beSkillArr, varCfg.lockBeSkillCostIdList, varCfg.lockBeSkillCostNumList)
- if not itemList then
- return Broadcast.sendErr(human, Lang.DATA_ERR)
- end
- for itemId, itemCnt in pairs(itemList) do
- if BagLogic.getItemCnt(human, itemId) < itemCnt then
- return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
- end
- end
- for itemId, itemCnt in pairs(itemList) do
- BagLogic.delItem(human, itemId, itemCnt, LOGTAG)
- end
- artifactsData.beSkillArrTemp = Util.copyTable(artifactsData.beSkillArr)
- for _, beSkillInfo in ipairs(artifactsData.beSkillArrTemp) do
- if not beSkillInfo.isLock or beSkillInfo.isLock == 0 then
- local excludeList = genExcludeList(artifactsData.beSkillArrTemp)
- local beSkillIdx = randEffect(HeroArtifactsConfig.BeSkillList, excludeList)
- beSkillInfo.idx = beSkillIdx
- end
- end
- HeroArtifacts_BeSkillRefine_Query(human, heroID, heroIndex)
- end
- -- 处理洗练出的神威灵装被动技能
- -- opType: 0-放弃,1-替换
- function HeroArtifacts_BeSkillRefine_Handle(human, heroID, heroIndex, opType)
- local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
- if not heroGrid then
- return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
- end
- if not isOpen(heroGrid) then
- return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
- end
- if not isActivate(heroGrid) then
- return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
- end
- if opType ~= 0 and opType ~= 1 then
- return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
- end
- local artifactsData = getArtifactsData(heroGrid)
- if not artifactsData or not artifactsData.beSkillArrTemp then
- return Broadcast.sendErr(human, Lang.HERO_AF_NO_REFINE_BESKILL)
- end
- if opType == 1 then
- for i, v in ipairs(artifactsData.beSkillArrTemp) do
- artifactsData.beSkillArr[i].idx = v.idx
- end
- end
- artifactsData.beSkillArrTemp = nil
- HeroArtifacts_BeSkillRefine_Query(human, heroID, heroIndex)
- updatePower(human)
- updateHeroAttr(human, heroID, heroIndex)
- end
|