| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305 |
- -- 英雄神威灵装系统
- --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 TalismanLogic = require("talisman.TalismanLogic")
- local GiftLogic
- local LOGTAG = "Artifacts" --日志标识
- -- 获取来自秘宝的属性倍数加成
- local function getAttrMulFromTalisman(human)
- local attrMul = TalismanLogic.getTalismanAdd(human, TalismanLogic.OTHER_EFFECT_TBL.HeroArtifacts_LvAttr_Mul)
- attrMul = attrMul / 100
- return attrMul
- end
- 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(human, net, n, tp)
- local t
- local attrMul = 1
- if tp == 1 then
- t = HeroArtifactsConfig.UpGradeLv
- attrMul = getAttrMulFromTalisman(human)
- attrMul = 1 + attrMul
- 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) * attrMul
- end
- end
- -- 填充灵装下一等级/星级加成属性协议结构数据
- local function populateNextAttrMsg(human, net, n, tp, isMax)
- local t
- local attrMul = 1
- if tp == 1 then
- t = HeroArtifactsConfig.UpGradeLv
- attrMul = getAttrMulFromTalisman(human)
- attrMul = 1 + attrMul
- 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]) * attrMul
- 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
- -- 能否升级
- local function isCanUpGradeLv(human, heroGrid)
- 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
- return false
- end
- -- 能否升星
- local function isCanUpGradeStar(human, heroGrid)
- local artifactsData = getArtifactsData(heroGrid)
- 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 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 attrMul = getAttrMulFromTalisman(human)
- attrMul = 1 + attrMul
- local attrList = calcAttrs(HeroArtifactsConfig.UpGradeLv, artifactsData.level)
- for attrId, attrVal in pairs(attrList) do
- RoleAttr.updateValue(attrId, attrVal * attrMul, 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
- if isCanUpGradeLv(human, heroGrid) then
- return true
- end
- if isCanUpGradeStar(human, heroGrid) then
- return true
- 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 = 0
- msgRet.redDotArr[0] = 2
- msgRet.redDotArr[1] = 0
- msgRet.redDotArr[2] = 0
- populateActivateCostMsg(msgRet.ActivateCost)
- populateTotalAttrMsg(human, msgRet.nowLevelAttrs, currentLevel, 1)
- populateTotalAttrMsg(human, msgRet.nowStarAttrs, currentStar, 2)
- if artifactsData and artifactsData.effectArr then
- populateEffectMsg(msgRet.effectArr, artifactsData.effectArr)
- end
- populateBeSkillMsg(msgRet.beSkillArr, artifactsData and artifactsData.beSkillArr)
- if isActivate(heroGrid) then
- msgRet.isActivate = 1
- if isCanUpGradeLv(human, heroGrid) then
- msgRet.redDotArr[1] = 1
- end
- if isCanUpGradeStar(human, heroGrid) then
- msgRet.redDotArr[2] = 1
- end
- end
- 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)
- updateHeroAttr(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(human, msgRet.nowLevelAttrs, currentLevel, 1)
- populateNextAttrMsg(human, 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)
- HeroArtifacts_Base_Query(human, 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(human, msgRet.nowStarAttrs, currentStar, 2)
- populateNextAttrMsg(human, 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)
- HeroArtifacts_Base_Query(human, 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
|