|
|
@@ -0,0 +1,1246 @@
|
|
|
+-- 英雄神威灵装系统
|
|
|
+
|
|
|
+--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
|