HeroArtifacts.lua 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305
  1. -- 英雄神威灵装系统
  2. --db
  3. --[=[
  4. heroGrid.artifacts = {
  5. isActive = nil, -- 是否激活,激活后为true
  6. level = 0, -- 当前等级
  7. star = 0, -- 当前星级
  8. effectArr = { --特效
  9. {idx = 1, isLock = 0, lv = 0}
  10. },
  11. effectArrTemp = { --新洗练出且未替换的特效
  12. {idx = 1, lv = 0}
  13. },
  14. beSkillArr = { --被动技能
  15. {idx = 1, isLock = 0}
  16. },
  17. beSkillArrTemp = { --新洗练出且未替换的被动技能
  18. {idx = 1}
  19. },
  20. }
  21. ]=]--
  22. local Msg = require("core.Msg")
  23. local BagLogic = require("bag.BagLogic")
  24. local HeroLogic = require("hero.HeroLogic")
  25. local ObjHuman = require("core.ObjHuman")
  26. local Grid = require("bag.Grid")
  27. local RoleAttr = require("role.RoleAttr")
  28. local RoleDefine = require("role.RoleDefine")
  29. local HeroArtifactsConfig = require("excel.heroArtifacts")
  30. local Util = require("common.Util")
  31. local Lang = require("common.Lang")
  32. local Broadcast = require("broadcast.Broadcast")
  33. local TalismanLogic = require("talisman.TalismanLogic")
  34. local GiftLogic
  35. local LOGTAG = "Artifacts" --日志标识
  36. -- 获取来自秘宝的属性倍数加成
  37. local function getAttrMulFromTalisman(human)
  38. local attrMul = TalismanLogic.getTalismanAdd(human, TalismanLogic.OTHER_EFFECT_TBL.HeroArtifacts_LvAttr_Mul)
  39. attrMul = attrMul / 100
  40. return attrMul
  41. end
  42. local function initArtifactsData(heroGrid)
  43. heroGrid.artifacts = {
  44. level = 0,
  45. star = 0
  46. }
  47. end
  48. local function getArtifactsData(heroGrid)
  49. return heroGrid.artifacts
  50. end
  51. local function updateArtifactsState(heroGrid, state)
  52. local artifactsData = getArtifactsData(heroGrid)
  53. if not artifactsData then
  54. initArtifactsData(heroGrid)
  55. artifactsData = getArtifactsData(heroGrid)
  56. end
  57. artifactsData.isActive = state
  58. end
  59. local function upGradeArtifactsLv(heroGrid, addVal)
  60. local artifactsData = getArtifactsData(heroGrid)
  61. if not artifactsData then
  62. initArtifactsData(heroGrid)
  63. artifactsData = getArtifactsData(heroGrid)
  64. end
  65. artifactsData.level = artifactsData.level + addVal
  66. end
  67. local function upGradeArtifactsStar(heroGrid, addVal)
  68. local artifactsData = getArtifactsData(heroGrid)
  69. if not artifactsData then
  70. initArtifactsData(heroGrid)
  71. artifactsData = getArtifactsData(heroGrid)
  72. end
  73. artifactsData.star = artifactsData.star + addVal
  74. end
  75. local function resetArtifactsData(heroGrid)
  76. local artifactsData = getArtifactsData(heroGrid)
  77. artifactsData.level = 0
  78. artifactsData.star = 0
  79. artifactsData.isActive = nil
  80. artifactsData.effectArr = nil
  81. artifactsData.effectArrTemp = nil
  82. artifactsData.beSkillArr = nil
  83. artifactsData.beSkillArrTemp = nil
  84. end
  85. -- 是否开启
  86. local function isOpen(heroGrid)
  87. local varCfg = HeroArtifactsConfig.Var[1]
  88. if heroGrid.star < varCfg.openStarCond then
  89. return false
  90. end
  91. return true
  92. end
  93. -- 是否激活
  94. local function isActivate(heroGrid)
  95. local artifactsData = getArtifactsData(heroGrid)
  96. return artifactsData and artifactsData.isActive
  97. end
  98. -- 计算当前等级/星级的属性总加成
  99. local function calcAttrs(conf, currentStage)
  100. local attrList = {}
  101. for i=1, currentStage do
  102. local t = conf[i]
  103. local attrArr = t and t.attrArr
  104. for _, attrInfo in ipairs(attrArr or {}) do
  105. local attrId, attrVal = attrInfo[1],attrInfo[2]
  106. attrList[attrId] = (attrList[attrId] or 0) + attrVal
  107. end
  108. end
  109. return attrList
  110. end
  111. -- 获取神威灵装激活消耗
  112. local function getActivateCost()
  113. local varCfg = HeroArtifactsConfig.Var[1]
  114. local activateCostTb = varCfg.activateCost
  115. return activateCostTb[1][1],activateCostTb[1][2]
  116. end
  117. -- 获取等级/星级下一阶段的消耗
  118. local function getNextStageCost(currentStage, tp, isMax)
  119. local varCfg = HeroArtifactsConfig.Var[1]
  120. local itemId = varCfg.upGradeLvCostId
  121. local itemCnt = 0
  122. local upGradeCfg = HeroArtifactsConfig.UpGradeLv
  123. if tp == 2 then
  124. itemId = varCfg.upGradeStarCostId
  125. upGradeCfg = HeroArtifactsConfig.UpGradeStar
  126. end
  127. if not isMax then
  128. local nextStageCfg = upGradeCfg[currentStage+1]
  129. itemCnt = nextStageCfg.costCnt
  130. end
  131. return itemId, itemCnt
  132. end
  133. -- 获取升到当前等级/星级的总消耗
  134. local function getTaotalStageCost(currentStage, tp)
  135. local varCfg = HeroArtifactsConfig.Var[1]
  136. local itemId = varCfg.upGradeLvCostId
  137. local itemCnt = 0
  138. local upGradeCfg = HeroArtifactsConfig.UpGradeLv
  139. if tp == 2 then
  140. itemId = varCfg.upGradeStarCostId
  141. upGradeCfg = HeroArtifactsConfig.UpGradeStar
  142. end
  143. for i=1, currentStage do
  144. local stageCfg = upGradeCfg[i]
  145. itemCnt = itemCnt + stageCfg.costCnt
  146. end
  147. return itemId, itemCnt
  148. end
  149. -- 填充激活灵装协议结构数据
  150. local function populateActivateCostMsg(net)
  151. -- local varCfg = HeroArtifactsConfig.Var[1]
  152. -- local activateCostTb = varCfg.activateCost
  153. -- net[0] = #activateCostTb
  154. -- for k,v in ipairs(activateCostTb) do
  155. -- Grid.makeItem(net[k], v[1], v[2])
  156. -- end
  157. local itemId, itemCnt = getActivateCost()
  158. Grid.makeItem(net, itemId, itemCnt)
  159. end
  160. -- 填充灵装当前等级/星级总加成属性协议结构数据
  161. local function populateTotalAttrMsg(human, net, n, tp)
  162. local t
  163. local attrMul = 1
  164. if tp == 1 then
  165. t = HeroArtifactsConfig.UpGradeLv
  166. attrMul = getAttrMulFromTalisman(human)
  167. attrMul = 1 + attrMul
  168. else
  169. t = HeroArtifactsConfig.UpGradeStar
  170. end
  171. local stage = n
  172. if n <= 0 then
  173. stage = 1
  174. end
  175. local attrList = calcAttrs(t, stage)
  176. net[0] = 0
  177. local len = 0
  178. for attrId, attrVal in pairs(attrList) do
  179. len = len + 1
  180. net[0] = len
  181. net[len].key = attrId
  182. net[len].value = (n <= 0 and 0 or attrVal) * attrMul
  183. end
  184. end
  185. -- 填充灵装下一等级/星级加成属性协议结构数据
  186. local function populateNextAttrMsg(human, net, n, tp, isMax)
  187. local t
  188. local attrMul = 1
  189. if tp == 1 then
  190. t = HeroArtifactsConfig.UpGradeLv
  191. attrMul = getAttrMulFromTalisman(human)
  192. attrMul = 1 + attrMul
  193. else
  194. t = HeroArtifactsConfig.UpGradeStar
  195. end
  196. net[0] = 0
  197. local cfg = t[n]
  198. local attrArrCfg = cfg and cfg.attrArr
  199. for k,v in ipairs(attrArrCfg or {}) do
  200. net[0] = k
  201. net[k].key = v[1]
  202. net[k].value = (isMax and 0 or v[2]) * attrMul
  203. end
  204. end
  205. -- 判断属性是否是绝对值属性
  206. local function isAbsAttr(attrId)
  207. return RoleDefine.isAbsAttr(attrId)
  208. end
  209. -- 填充灵装特效协议结构数据
  210. local function populateEffectMsg(net, arr)
  211. for k, v in ipairs(arr) do
  212. net[0] = k
  213. local cfg = HeroArtifactsConfig.EffectList[v.idx]
  214. net[k].idx = v.idx
  215. net[k].name = cfg.name
  216. net[k].desc = cfg.desc
  217. net[k].isLock = v.isLock or 0
  218. net[k].isActivate = 1
  219. net[k].activateStarCond = 1
  220. net[k].level = v.lv
  221. local attrVal = cfg.effectAttrValArr[v.lv] or 0
  222. if not isAbsAttr(cfg.effectAttrId) then
  223. attrVal = attrVal / 100
  224. end
  225. net[k].desc = Util.format(cfg.desc, attrVal)
  226. end
  227. end
  228. -- 填充灵装被动技能协议结构数据
  229. local function populateBeSkillMsg(net, arr)
  230. local varCfg = HeroArtifactsConfig.Var[1]
  231. for i, activateBeSkillStar in ipairs(varCfg.activateBeSkillStarList) do
  232. net[0] = i
  233. net[i].idx = i
  234. net[i].name = ""
  235. net[i].desc = ""
  236. net[i].isLock = 0
  237. net[i].isActivate = 0
  238. net[i].activateStarCond = activateBeSkillStar
  239. net[i].level = 0
  240. if arr and arr[i] then
  241. local beSkillData = arr[i]
  242. local cfg = HeroArtifactsConfig.BeSkillList[beSkillData.idx]
  243. net[i].idx = beSkillData.idx
  244. net[i].name = cfg.name
  245. net[i].desc = cfg.desc
  246. net[i].isLock = beSkillData.isLock or 0
  247. net[i].isActivate = 1
  248. end
  249. end
  250. end
  251. -- 计算特效/被动技能的锁定数量
  252. local function calcLockNum(arr)
  253. local lockNum = 0
  254. for _, v in ipairs(arr or {}) do
  255. if v.isLock and v.isLock == 1 then
  256. lockNum = lockNum + 1
  257. end
  258. end
  259. return lockNum
  260. end
  261. -- 计算特效/被动技能洗练需要消耗的道具
  262. local function calcRefineCost(data, costIdArr, costNumArr)
  263. if not costIdArr or not costNumArr then
  264. return
  265. end
  266. if #costIdArr ~= #costNumArr then
  267. return
  268. end
  269. local lockNum = calcLockNum(data)
  270. lockNum = lockNum + 1
  271. local itemList = {}
  272. for i=1, #costIdArr do
  273. local itemId = costIdArr[i]
  274. local itemCntArr = costNumArr[i]
  275. local itemCnt = itemCntArr and itemCntArr[lockNum]
  276. if not itemId or not itemCnt then
  277. return
  278. end
  279. itemList[itemId] = (itemList[itemId] or 0) + itemCnt
  280. end
  281. return itemList
  282. end
  283. -- 生成要排除的特效/被动技能列表
  284. local function genExcludeList(arr)
  285. if not arr then
  286. return
  287. end
  288. local excludeList = {}
  289. for _, v in ipairs(arr) do
  290. excludeList[v.idx] = true
  291. end
  292. return excludeList
  293. end
  294. -- 随机一个特效/被动技能
  295. local function randEffect(conf, excludeList)
  296. local totalWeight = 0
  297. local arr = {}
  298. for k,v in ipairs(conf) do
  299. if not excludeList or not excludeList[k] then
  300. totalWeight = totalWeight + v.weight
  301. arr[#arr+1] = {weight = v.weight, idx = k}
  302. end
  303. end
  304. local weight = 0
  305. local randVal = math.random(1, totalWeight)
  306. for _, v in ipairs(arr) do
  307. weight = weight + v.weight
  308. if randVal <= weight then
  309. return v.idx
  310. end
  311. end
  312. end
  313. -- 随机一个特效的等级
  314. local function randEffectLv()
  315. local totalWeight = 0
  316. for k,v in ipairs(HeroArtifactsConfig.EffectLvProb) do
  317. totalWeight = totalWeight + v.weight
  318. end
  319. local weight = 0
  320. local randVal = math.random(1, totalWeight)
  321. for _, v in ipairs(HeroArtifactsConfig.EffectLvProb) do
  322. weight = weight + v.weight
  323. if randVal <= weight then
  324. return v.level
  325. end
  326. end
  327. end
  328. -- 更新战力
  329. local function updatePower(human)
  330. RoleAttr.cleanHeroAttrCache(human)
  331. ObjHuman.doCalc(human)
  332. ObjHuman.sendAttr(human, RoleDefine.ZHANDOULI)
  333. end
  334. -- 更新英雄属性
  335. local function updateHeroAttr(human, heroID, heroIndex)
  336. HeroLogic.sendHeroBagDynamic(human, heroID, heroIndex)
  337. end
  338. -- 刷新红点
  339. local function updateRedDot(human, heroGrid)
  340. HeroLogic.refreshDot(human, heroGrid.uuid)
  341. end
  342. -- 刷新战力, 红点, 英雄属性
  343. local function updatePowerAndRedDot(human, heroGrid, heroID, heroIndex)
  344. -- 更新战力
  345. updatePower(human)
  346. -- 刷新红点
  347. updateRedDot(human, heroGrid)
  348. -- 刷新英雄属性
  349. updateHeroAttr(human, heroID, heroIndex)
  350. end
  351. -- 能否升级
  352. local function isCanUpGradeLv(human, heroGrid)
  353. local artifactsData = getArtifactsData(heroGrid)
  354. local currentLevel = artifactsData and artifactsData.level or 0
  355. local maxLevel = HeroArtifactsConfig.UpGradeLv[#HeroArtifactsConfig.UpGradeLv].level
  356. if currentLevel < maxLevel then
  357. local itemId, itemCnt = getNextStageCost(currentLevel, 1)
  358. if BagLogic.getItemCnt(human, itemId) >= itemCnt then
  359. return true
  360. end
  361. end
  362. return false
  363. end
  364. -- 能否升星
  365. local function isCanUpGradeStar(human, heroGrid)
  366. local artifactsData = getArtifactsData(heroGrid)
  367. local currentStar = artifactsData and artifactsData.star or 0
  368. local maxStar = HeroArtifactsConfig.UpGradeStar[#HeroArtifactsConfig.UpGradeStar].star
  369. if currentStar < maxStar then
  370. local itemId, itemCnt = getNextStageCost(currentStar, 2)
  371. if BagLogic.getItemCnt(human, itemId) >= itemCnt then
  372. return true
  373. end
  374. end
  375. return false
  376. end
  377. -- 获取神威灵装的被动技能
  378. function GetArtifactsBeSkillList(heroGrid)
  379. if not heroGrid or not heroGrid.artifacts then
  380. return
  381. end
  382. local beSkillArr = heroGrid.artifacts.beSkillArr
  383. if not beSkillArr then
  384. return
  385. end
  386. local skillArr
  387. for _, skillInfo in ipairs(beSkillArr) do
  388. local cfgIdx = skillInfo.idx
  389. local skillCfg = HeroArtifactsConfig.BeSkillList[cfgIdx]
  390. if skillCfg and skillCfg.skillType == 2 then
  391. skillArr = skillArr or {}
  392. skillArr[#skillArr+1] = skillCfg.skillId
  393. end
  394. end
  395. return skillArr
  396. end
  397. -- 获取神威灵装对符文/战意的属性加成列表
  398. function GetFuwenStrengthenAttrList(heroGrid)
  399. if not heroGrid or not heroGrid.artifacts then
  400. return
  401. end
  402. local beSkillArr = heroGrid.artifacts.beSkillArr
  403. if not beSkillArr then
  404. return
  405. end
  406. local skillId_2_Attr = nil
  407. for _, skillInfo in ipairs(beSkillArr) do
  408. local skillCfg = HeroArtifactsConfig.BeSkillList[skillInfo.idx]
  409. if skillCfg and skillCfg.skillType == 1 and next(skillCfg.attr) then
  410. local attrArr = {}
  411. for i, attrInfo in ipairs(skillCfg.attr) do
  412. attrArr[i] = {attrInfo[1], attrInfo[2]}
  413. end
  414. skillId_2_Attr = skillId_2_Attr or {}
  415. for _, fuwenSkillId in ipairs(skillCfg.fuwenSkillIdArr) do
  416. skillId_2_Attr[fuwenSkillId] = attrArr
  417. end
  418. end
  419. end
  420. return skillId_2_Attr
  421. end
  422. -- 获取神威灵装对符文/战意的强化技能列表
  423. function GetFuwenStrengthenSkillList(heroGrid)
  424. if not heroGrid or not heroGrid.artifacts then
  425. return
  426. end
  427. local beSkillArr = heroGrid.artifacts.beSkillArr
  428. if not beSkillArr then
  429. return
  430. end
  431. local skillId_2_strengthenSkillId = nil
  432. for _, skillInfo in ipairs(beSkillArr) do
  433. local skillCfg = HeroArtifactsConfig.BeSkillList[skillInfo.idx]
  434. if skillCfg and skillCfg.skillType == 1 and next(skillCfg.strengthenSkillIdArr) then
  435. skillId_2_strengthenSkillId = skillId_2_strengthenSkillId or {}
  436. for i, fuwenSkillId in ipairs(skillCfg.fuwenSkillIdArr) do
  437. skillId_2_strengthenSkillId[fuwenSkillId] = skillCfg.strengthenSkillIdArr[i]
  438. end
  439. end
  440. end
  441. return skillId_2_strengthenSkillId
  442. end
  443. -- 神威灵装加成
  444. function doCalcHero(human, heroGrid, addAttrs)
  445. if not heroGrid or not heroGrid.artifacts then
  446. return
  447. end
  448. local artifactsData = heroGrid.artifacts
  449. if artifactsData.level > 0 then
  450. local attrMul = getAttrMulFromTalisman(human)
  451. attrMul = 1 + attrMul
  452. local attrList = calcAttrs(HeroArtifactsConfig.UpGradeLv, artifactsData.level)
  453. for attrId, attrVal in pairs(attrList) do
  454. RoleAttr.updateValue(attrId, attrVal * attrMul, addAttrs)
  455. end
  456. end
  457. if artifactsData.star > 0 then
  458. local attrList = calcAttrs(HeroArtifactsConfig.UpGradeStar, artifactsData.star)
  459. for attrId, attrVal in pairs(attrList) do
  460. RoleAttr.updateValue(attrId, attrVal, addAttrs)
  461. end
  462. end
  463. -- 特效
  464. if artifactsData.effectArr then
  465. for _, effectInfo in ipairs(artifactsData.effectArr) do
  466. local effectCfg = HeroArtifactsConfig.EffectList[effectInfo.idx]
  467. if effectCfg then
  468. local effectLv = effectInfo.lv
  469. local attrId = effectCfg.effectAttrId
  470. local attrVal = effectCfg.effectAttrValArr[effectLv] or 0
  471. RoleAttr.updateValue(attrId, attrVal, addAttrs)
  472. end
  473. end
  474. end
  475. end
  476. -- 红点判断
  477. function isArtifactsDot(human, heroGrid)
  478. if not isOpen(heroGrid) then
  479. return false
  480. end
  481. if not isActivate(heroGrid) then
  482. local varCfg = HeroArtifactsConfig.Var[1]
  483. local activateCostTb = varCfg.activateCost
  484. local itemId, itemCnt = activateCostTb[1][1], activateCostTb[1][2]
  485. if BagLogic.getItemCnt(human, itemId) >= itemCnt then
  486. return true
  487. end
  488. return false
  489. end
  490. if isCanUpGradeLv(human, heroGrid) then
  491. return true
  492. end
  493. if isCanUpGradeStar(human, heroGrid) then
  494. return true
  495. end
  496. return false
  497. end
  498. -- 返还材料计算
  499. function CalcReturnItem(human, heroGrid)
  500. if not isOpen(heroGrid) then
  501. return
  502. end
  503. if not isActivate(heroGrid) then
  504. return
  505. end
  506. local artifactsData = getArtifactsData(heroGrid)
  507. local itemList = {}
  508. local itemId, itemCnt = getActivateCost()
  509. itemList[itemId] = (itemList[itemId] or 0) + itemCnt
  510. if artifactsData and artifactsData.level > 0 then
  511. itemId, itemCnt = getTaotalStageCost(artifactsData.level, 1)
  512. itemList[itemId] = (itemList[itemId] or 0) + itemCnt
  513. end
  514. if artifactsData and artifactsData.star > 0 then
  515. itemId, itemCnt = getTaotalStageCost(artifactsData.star, 2)
  516. itemList[itemId] = (itemList[itemId] or 0) + itemCnt
  517. end
  518. return itemList
  519. end
  520. -- 重置神威灵装数据
  521. function ResetArtifactsData(human, heroGrid)
  522. if not isOpen(heroGrid) then
  523. return
  524. end
  525. if not isActivate(heroGrid) then
  526. return
  527. end
  528. resetArtifactsData(heroGrid)
  529. end
  530. -- 神威灵装基础信息查询
  531. function HeroArtifacts_Base_Query(human, heroID, heroIndex)
  532. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  533. if not heroGrid then
  534. return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
  535. end
  536. if not isOpen(heroGrid) then
  537. return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
  538. end
  539. local artifactsData = getArtifactsData(heroGrid)
  540. local currentLevel = artifactsData and artifactsData.level or 0
  541. local currentStar = artifactsData and artifactsData.star or 0
  542. local msgRet = Msg.gc.GC_HEROARTIFACTS_BASE_QUERY
  543. msgRet.artifactsLv = currentLevel
  544. msgRet.artifactsStar = currentStar
  545. msgRet.nowLevelAttrs[0] = 0
  546. msgRet.nowStarAttrs[0] = 0
  547. msgRet.effectArr[0] = 0
  548. msgRet.beSkillArr[0] = 0
  549. msgRet.isActivate = 0
  550. msgRet.redDotArr[0] = 2
  551. msgRet.redDotArr[1] = 0
  552. msgRet.redDotArr[2] = 0
  553. populateActivateCostMsg(msgRet.ActivateCost)
  554. populateTotalAttrMsg(human, msgRet.nowLevelAttrs, currentLevel, 1)
  555. populateTotalAttrMsg(human, msgRet.nowStarAttrs, currentStar, 2)
  556. if artifactsData and artifactsData.effectArr then
  557. populateEffectMsg(msgRet.effectArr, artifactsData.effectArr)
  558. end
  559. populateBeSkillMsg(msgRet.beSkillArr, artifactsData and artifactsData.beSkillArr)
  560. if isActivate(heroGrid) then
  561. msgRet.isActivate = 1
  562. if isCanUpGradeLv(human, heroGrid) then
  563. msgRet.redDotArr[1] = 1
  564. end
  565. if isCanUpGradeStar(human, heroGrid) then
  566. msgRet.redDotArr[2] = 1
  567. end
  568. end
  569. Msg.send(msgRet, human.fd)
  570. end
  571. -- 激活神威灵装
  572. function HeroArtifacts_Activate(human, heroID, heroIndex)
  573. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  574. if not heroGrid then
  575. return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
  576. end
  577. if not isOpen(heroGrid) then
  578. return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
  579. end
  580. if isActivate(heroGrid) then
  581. return Broadcast.sendErr(human, Lang.BINGSHU_LEARN_ERR_HAD)
  582. end
  583. local itemId, itemCnt = getActivateCost()
  584. if BagLogic.getItemCnt(human, itemId) < itemCnt then
  585. return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
  586. end
  587. BagLogic.delItem(human, itemId, itemCnt, LOGTAG)
  588. updateArtifactsState(heroGrid, true)
  589. HeroArtifacts_Base_Query(human, heroID, heroIndex)
  590. updateHeroAttr(human, heroID, heroIndex)
  591. -- 弹窗礼包
  592. GiftLogic = GiftLogic or require("topup.GiftLogic")
  593. GiftLogic.trigger(human, GiftLogic.GIFT_ARTIFACTS_OPEN, {currentVal = 0}, GiftLogic.GIFT_SEC_TYPE3)
  594. end
  595. -- 神威灵装升级信息查询
  596. function HeroArtifacts_Lv_Query(human, heroID, heroIndex)
  597. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  598. if not heroGrid then
  599. return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
  600. end
  601. if not isOpen(heroGrid) then
  602. return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
  603. end
  604. if not isActivate(heroGrid) then
  605. return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
  606. end
  607. local artifactsData = getArtifactsData(heroGrid)
  608. local UpGradeLvCfg = HeroArtifactsConfig.UpGradeLv
  609. local currentLevel = artifactsData and artifactsData.level or 0
  610. local maxLevel = UpGradeLvCfg[#UpGradeLvCfg].level
  611. local isMax = currentLevel >= maxLevel
  612. local nextLevel = isMax and maxLevel or currentLevel + 1
  613. local msgRet = Msg.gc.GC_HEROARTIFACTS_LV_QUERY
  614. msgRet.artifactsLv = currentLevel
  615. msgRet.artifactsLvMax = maxLevel
  616. populateTotalAttrMsg(human, msgRet.nowLevelAttrs, currentLevel, 1)
  617. populateNextAttrMsg(human, msgRet.nextLevelAttrs, nextLevel, 1, isMax)
  618. local itemId, itemCnt = getNextStageCost(currentLevel, 1, isMax)
  619. Grid.makeItem(msgRet.cost, itemId, itemCnt)
  620. Msg.send(msgRet, human.fd)
  621. end
  622. -- 神威灵装升级
  623. function HeroArtifacts_UpGrade_Level(human, heroID, heroIndex)
  624. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  625. if not heroGrid then
  626. return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
  627. end
  628. if not isOpen(heroGrid) then
  629. return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
  630. end
  631. if not isActivate(heroGrid) then
  632. return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
  633. end
  634. local artifactsData = getArtifactsData(heroGrid)
  635. local currentLevel = artifactsData and artifactsData.level or 0
  636. local UpGradeLvCfg = HeroArtifactsConfig.UpGradeLv
  637. local maxLevel = UpGradeLvCfg[#UpGradeLvCfg].level
  638. if currentLevel >= maxLevel then
  639. return Broadcast.sendErr(human, Lang.HERO_AF_LV_MAX)
  640. end
  641. local itemId, itemCnt = getNextStageCost(currentLevel, 1)
  642. if BagLogic.getItemCnt(human, itemId) < itemCnt then
  643. return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
  644. end
  645. BagLogic.delItem(human, itemId, itemCnt, LOGTAG)
  646. upGradeArtifactsLv(heroGrid, 1)
  647. HeroArtifacts_Lv_Query(human, heroID, heroIndex)
  648. updatePowerAndRedDot(human, heroGrid, heroID, heroIndex)
  649. HeroArtifacts_Base_Query(human, heroID, heroIndex)
  650. end
  651. -- 神威灵装升星信息查询
  652. function HeroArtifacts_Star_Query(human, heroID, heroIndex)
  653. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  654. if not heroGrid then
  655. return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
  656. end
  657. if not isOpen(heroGrid) then
  658. return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
  659. end
  660. if not isActivate(heroGrid) then
  661. return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
  662. end
  663. local artifactsData = getArtifactsData(heroGrid)
  664. local upGradeStarCfg = HeroArtifactsConfig.UpGradeStar
  665. local currentStar = artifactsData and artifactsData.star or 0
  666. local maxStar = upGradeStarCfg[#upGradeStarCfg].star
  667. local isMax = currentStar >= maxStar
  668. local nextStar = isMax and maxStar or currentStar + 1
  669. local msgRet = Msg.gc.GC_HEROARTIFACTS_STAR_QUERY
  670. msgRet.artifactsStar = currentStar
  671. msgRet.artifactsStarMax = maxStar
  672. populateTotalAttrMsg(human, msgRet.nowStarAttrs, currentStar, 2)
  673. populateNextAttrMsg(human, msgRet.nextStarAttrs, nextStar, 2, isMax)
  674. local itemId, itemCnt = getNextStageCost(currentStar, 2, isMax)
  675. Grid.makeItem(msgRet.cost, itemId, itemCnt)
  676. msgRet.effectArr[0] = 0
  677. if artifactsData and artifactsData.effectArr then
  678. populateEffectMsg(msgRet.effectArr, artifactsData.effectArr)
  679. end
  680. populateBeSkillMsg(msgRet.beSkillArr, artifactsData and artifactsData.beSkillArr)
  681. Msg.send(msgRet, human.fd)
  682. end
  683. -- 神威灵装升星
  684. function HeroArtifacts_UpGrade_Star(human, heroID, heroIndex)
  685. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  686. if not heroGrid then
  687. return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
  688. end
  689. if not isOpen(heroGrid) then
  690. return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
  691. end
  692. if not isActivate(heroGrid) then
  693. return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
  694. end
  695. local artifactsData = getArtifactsData(heroGrid)
  696. local currentStar = artifactsData and artifactsData.star or 0
  697. local upGradeStarCfg = HeroArtifactsConfig.UpGradeStar
  698. local maxStar = upGradeStarCfg[#upGradeStarCfg].star
  699. if currentStar >= maxStar then
  700. return Broadcast.sendErr(human, Lang.HERO_AF_LV_STAR)
  701. end
  702. local itemId, itemCnt = getNextStageCost(currentStar, 2)
  703. if BagLogic.getItemCnt(human, itemId) < itemCnt then
  704. return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
  705. end
  706. BagLogic.delItem(human, itemId, itemCnt, LOGTAG)
  707. -- 更新英雄星级
  708. upGradeArtifactsStar(heroGrid, 1)
  709. local nextStar = currentStar + 1
  710. local varCfg = HeroArtifactsConfig.Var[1]
  711. -- 激活新的特效
  712. if table.find(varCfg.activateEffectStarList, nextStar) then
  713. local excludeList = nil
  714. if artifactsData.effectArr then
  715. excludeList = genExcludeList(artifactsData.effectArr)
  716. end
  717. local effectIdx = randEffect(HeroArtifactsConfig.EffectList, excludeList)
  718. if not effectIdx then
  719. return Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
  720. end
  721. local effectLv = randEffectLv()
  722. if not effectLv then
  723. return Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
  724. end
  725. artifactsData.effectArr = artifactsData.effectArr or {}
  726. table.insert(artifactsData.effectArr, {idx = effectIdx, lv = effectLv})
  727. -- 处理新获得特效后,可能导致洗练界面两边数量不一致的情况
  728. if artifactsData.effectArrTemp then
  729. table.insert(artifactsData.effectArrTemp, {idx = effectIdx, lv = effectLv})
  730. end
  731. end
  732. -- 激活新的被动技能
  733. if table.find(varCfg.activateBeSkillStarList, nextStar) then
  734. local excludeList = nil
  735. if artifactsData.beSkillArr then
  736. excludeList = genExcludeList(artifactsData.beSkillArr)
  737. end
  738. local beSkillIdx = randEffect(HeroArtifactsConfig.BeSkillList, excludeList)
  739. if not beSkillIdx then
  740. return Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
  741. end
  742. artifactsData.beSkillArr = artifactsData.beSkillArr or {}
  743. table.insert(artifactsData.beSkillArr, {idx = beSkillIdx} )
  744. -- 处理新获得被动技能后,可能导致洗练界面两边数量不一致的情况
  745. if artifactsData.beSkillArrTemp then
  746. table.insert(artifactsData.beSkillArrTemp, {idx = beSkillIdx} )
  747. end
  748. end
  749. HeroArtifacts_Star_Query(human, heroID, heroIndex)
  750. updatePowerAndRedDot(human, heroGrid, heroID, heroIndex)
  751. HeroArtifacts_Base_Query(human, heroID, heroIndex)
  752. -- 弹窗礼包
  753. GiftLogic = GiftLogic or require("topup.GiftLogic")
  754. GiftLogic.trigger(human, GiftLogic.GIFT_ARTIFACTS_UPGRADE_STAR, {currentVal = nextStar}, GiftLogic.GIFT_SEC_TYPE3)
  755. end
  756. -- 神威灵装特效洗练信息查询
  757. function HeroArtifacts_EffectRefine_Query(human, heroID, heroIndex)
  758. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  759. if not heroGrid then
  760. return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
  761. end
  762. if not isOpen(heroGrid) then
  763. return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
  764. end
  765. if not isActivate(heroGrid) then
  766. return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
  767. end
  768. local artifactsData = getArtifactsData(heroGrid)
  769. local msgRet = Msg.gc.GC_HEROARTIFACTS_EFFECT_REFINE_QUERY
  770. msgRet.effectArr[0] = 0
  771. msgRet.effectArrTemp[0] = 0
  772. if artifactsData and artifactsData.effectArr then
  773. populateEffectMsg(msgRet.effectArr, artifactsData.effectArr)
  774. end
  775. if artifactsData and artifactsData.effectArrTemp then
  776. populateEffectMsg(msgRet.effectArrTemp, artifactsData.effectArrTemp)
  777. end
  778. msgRet.cost[0] = 0
  779. local varCfg = HeroArtifactsConfig.Var[1]
  780. local itemList = calcRefineCost(artifactsData and artifactsData.effectArr, varCfg.lockEffectCostIdList, varCfg.lockEffectCostNumList)
  781. if not itemList then
  782. return Broadcast.sendErr(human, Lang.DATA_ERR)
  783. end
  784. local len = 0
  785. for itemId, itemCnt in pairs(itemList) do
  786. len = len + 1
  787. msgRet.cost[0] = len
  788. Grid.makeItem(msgRet.cost[len], itemId, itemCnt)
  789. end
  790. Msg.send(msgRet, human.fd)
  791. end
  792. -- 锁定/解锁神威灵装特效
  793. function HeroArtifacts_Effect_Lock(human, heroID, heroIndex, effectIdxArr)
  794. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  795. if not heroGrid then
  796. return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
  797. end
  798. if not isOpen(heroGrid) then
  799. return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
  800. end
  801. if not isActivate(heroGrid) then
  802. return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
  803. end
  804. local artifactsData = getArtifactsData(heroGrid)
  805. if not artifactsData or not artifactsData.effectArr then
  806. return Broadcast.sendErr(human, Lang.HERO_AF_NO_EFFECT)
  807. end
  808. if artifactsData.effectArrTemp then
  809. return Broadcast.sendErr(human, Lang.HERO_AF_NEED_HANDLE_REFINE)
  810. end
  811. if effectIdxArr[0] >= #artifactsData.effectArr then
  812. return Broadcast.sendErr(human, Lang.HERO_AF_CANNOT_LOCK)
  813. end
  814. local lockIdxArr = {}
  815. for i=1,effectIdxArr[0] do
  816. lockIdxArr[i] = effectIdxArr[i]
  817. end
  818. for _, v in ipairs(artifactsData.effectArr) do
  819. if table.find(lockIdxArr, v.idx) then
  820. v.isLock = 1
  821. else
  822. v.isLock = 0
  823. end
  824. end
  825. HeroArtifacts_EffectRefine_Query(human, heroID, heroIndex)
  826. end
  827. -- 洗练神威灵装特效
  828. function HeroArtifacts_EffectRefine_Do(human, heroID, heroIndex)
  829. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  830. if not heroGrid then
  831. return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
  832. end
  833. if not isOpen(heroGrid) then
  834. return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
  835. end
  836. if not isActivate(heroGrid) then
  837. return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
  838. end
  839. local artifactsData = getArtifactsData(heroGrid)
  840. if not artifactsData or not artifactsData.effectArr then
  841. return Broadcast.sendErr(human, Lang.HERO_AF_NO_EFFECT)
  842. end
  843. local varCfg = HeroArtifactsConfig.Var[1]
  844. local itemList = calcRefineCost(artifactsData.effectArr, varCfg.lockEffectCostIdList, varCfg.lockEffectCostNumList)
  845. if not itemList then
  846. return Broadcast.sendErr(human, Lang.DATA_ERR)
  847. end
  848. for itemId, itemCnt in pairs(itemList) do
  849. if BagLogic.getItemCnt(human, itemId) < itemCnt then
  850. return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
  851. end
  852. end
  853. for itemId, itemCnt in pairs(itemList) do
  854. BagLogic.delItem(human, itemId, itemCnt, LOGTAG)
  855. end
  856. artifactsData.effectArrTemp = Util.copyTable(artifactsData.effectArr)
  857. for _, effctInfo in ipairs(artifactsData.effectArrTemp) do
  858. if not effctInfo.isLock or effctInfo.isLock == 0 then
  859. local excludeList = genExcludeList(artifactsData.effectArrTemp)
  860. local effectIdx = randEffect(HeroArtifactsConfig.EffectList, excludeList)
  861. effctInfo.idx = effectIdx
  862. local effectLv = randEffectLv()
  863. effctInfo.lv = effectLv
  864. end
  865. end
  866. HeroArtifacts_EffectRefine_Query(human, heroID, heroIndex)
  867. end
  868. -- 处理洗练出的神威灵装特效
  869. -- opType: 0-放弃,1-替换
  870. function HeroArtifacts_EffectRefine_Handle(human, heroID, heroIndex, opType)
  871. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  872. if not heroGrid then
  873. return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
  874. end
  875. if not isOpen(heroGrid) then
  876. return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
  877. end
  878. if not isActivate(heroGrid) then
  879. return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
  880. end
  881. if opType ~= 0 and opType ~= 1 then
  882. return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  883. end
  884. local artifactsData = getArtifactsData(heroGrid)
  885. if not artifactsData or not artifactsData.effectArrTemp then
  886. return Broadcast.sendErr(human, Lang.HERO_AF_NO_REFINE_EFFECT)
  887. end
  888. if opType == 1 then
  889. for i, v in ipairs(artifactsData.effectArrTemp) do
  890. artifactsData.effectArr[i].idx = v.idx
  891. artifactsData.effectArr[i].lv = v.lv
  892. end
  893. end
  894. artifactsData.effectArrTemp = nil
  895. HeroArtifacts_EffectRefine_Query(human, heroID, heroIndex)
  896. updatePower(human)
  897. updateHeroAttr(human, heroID, heroIndex)
  898. end
  899. -- 神威灵装被动技能洗练信息查询
  900. function HeroArtifacts_BeSkillRefine_Query(human, heroID, heroIndex)
  901. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  902. if not heroGrid then
  903. return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
  904. end
  905. if not isOpen(heroGrid) then
  906. return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
  907. end
  908. if not isActivate(heroGrid) then
  909. return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
  910. end
  911. local artifactsData = getArtifactsData(heroGrid)
  912. local msgRet = Msg.gc.GC_HEROARTIFACTS_BESKILL_REFINE_QUERY
  913. msgRet.beSkillArr[0] = 0
  914. msgRet.beSkillArrTemp[0] = 0
  915. if artifactsData and artifactsData.beSkillArr then
  916. populateBeSkillMsg(msgRet.beSkillArr, artifactsData.beSkillArr)
  917. end
  918. if artifactsData and artifactsData.beSkillArrTemp then
  919. populateBeSkillMsg(msgRet.beSkillArrTemp, artifactsData.beSkillArrTemp)
  920. end
  921. msgRet.cost[0] = 0
  922. local varCfg = HeroArtifactsConfig.Var[1]
  923. local itemList = calcRefineCost(artifactsData and artifactsData.beSkillArr, varCfg.lockBeSkillCostIdList, varCfg.lockBeSkillCostNumList)
  924. if not itemList then
  925. return Broadcast.sendErr(human, Lang.DATA_ERR)
  926. end
  927. local len = 0
  928. for itemId, itemCnt in pairs(itemList) do
  929. len = len + 1
  930. msgRet.cost[0] = len
  931. Grid.makeItem(msgRet.cost[len], itemId, itemCnt)
  932. end
  933. Msg.send(msgRet, human.fd)
  934. end
  935. -- 锁定/解锁神威灵装被动技能
  936. function HeroArtifacts_BeSkill_Lock(human, heroID, heroIndex, beSkillIdxArr)
  937. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  938. if not heroGrid then
  939. return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
  940. end
  941. if not isOpen(heroGrid) then
  942. return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
  943. end
  944. if not isActivate(heroGrid) then
  945. return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
  946. end
  947. local artifactsData = getArtifactsData(heroGrid)
  948. if not artifactsData or not artifactsData.beSkillArr then
  949. return Broadcast.sendErr(human, Lang.HERO_AF_NO_BESKILL)
  950. end
  951. if artifactsData.beSkillArrTemp then
  952. return Broadcast.sendErr(human, Lang.HERO_AF_NEED_HANDLE_REFINE)
  953. end
  954. if beSkillIdxArr[0] >= #artifactsData.beSkillArr then
  955. return Broadcast.sendErr(human, Lang.HERO_AF_CANNOT_LOCK)
  956. end
  957. local lockIdxArr = {}
  958. for i=1,beSkillIdxArr[0] do
  959. lockIdxArr[i] = beSkillIdxArr[i]
  960. end
  961. for _, v in ipairs(artifactsData.beSkillArr) do
  962. if table.find(lockIdxArr, v.idx) then
  963. v.isLock = 1
  964. else
  965. v.isLock = 0
  966. end
  967. end
  968. HeroArtifacts_BeSkillRefine_Query(human, heroID, heroIndex)
  969. end
  970. -- 洗练神威灵装被动技能
  971. function HeroArtifacts_BeSkillRefine_Do(human, heroID, heroIndex)
  972. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  973. if not heroGrid then
  974. return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
  975. end
  976. if not isOpen(heroGrid) then
  977. return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
  978. end
  979. if not isActivate(heroGrid) then
  980. return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
  981. end
  982. local artifactsData = getArtifactsData(heroGrid)
  983. if not artifactsData or not artifactsData.beSkillArr then
  984. return Broadcast.sendErr(human, Lang.HERO_AF_NO_BESKILL)
  985. end
  986. local varCfg = HeroArtifactsConfig.Var[1]
  987. local itemList = calcRefineCost(artifactsData.beSkillArr, varCfg.lockBeSkillCostIdList, varCfg.lockBeSkillCostNumList)
  988. if not itemList then
  989. return Broadcast.sendErr(human, Lang.DATA_ERR)
  990. end
  991. for itemId, itemCnt in pairs(itemList) do
  992. if BagLogic.getItemCnt(human, itemId) < itemCnt then
  993. return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
  994. end
  995. end
  996. for itemId, itemCnt in pairs(itemList) do
  997. BagLogic.delItem(human, itemId, itemCnt, LOGTAG)
  998. end
  999. artifactsData.beSkillArrTemp = Util.copyTable(artifactsData.beSkillArr)
  1000. for _, beSkillInfo in ipairs(artifactsData.beSkillArrTemp) do
  1001. if not beSkillInfo.isLock or beSkillInfo.isLock == 0 then
  1002. local excludeList = genExcludeList(artifactsData.beSkillArrTemp)
  1003. local beSkillIdx = randEffect(HeroArtifactsConfig.BeSkillList, excludeList)
  1004. beSkillInfo.idx = beSkillIdx
  1005. end
  1006. end
  1007. HeroArtifacts_BeSkillRefine_Query(human, heroID, heroIndex)
  1008. end
  1009. -- 处理洗练出的神威灵装被动技能
  1010. -- opType: 0-放弃,1-替换
  1011. function HeroArtifacts_BeSkillRefine_Handle(human, heroID, heroIndex, opType)
  1012. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  1013. if not heroGrid then
  1014. return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
  1015. end
  1016. if not isOpen(heroGrid) then
  1017. return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
  1018. end
  1019. if not isActivate(heroGrid) then
  1020. return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
  1021. end
  1022. if opType ~= 0 and opType ~= 1 then
  1023. return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  1024. end
  1025. local artifactsData = getArtifactsData(heroGrid)
  1026. if not artifactsData or not artifactsData.beSkillArrTemp then
  1027. return Broadcast.sendErr(human, Lang.HERO_AF_NO_REFINE_BESKILL)
  1028. end
  1029. if opType == 1 then
  1030. for i, v in ipairs(artifactsData.beSkillArrTemp) do
  1031. artifactsData.beSkillArr[i].idx = v.idx
  1032. end
  1033. end
  1034. artifactsData.beSkillArrTemp = nil
  1035. HeroArtifacts_BeSkillRefine_Query(human, heroID, heroIndex)
  1036. updatePower(human)
  1037. updateHeroAttr(human, heroID, heroIndex)
  1038. end