FuwenLogic.lua 52 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589
  1. local Msg = require("core.Msg")
  2. local Grid = require("bag.Grid")
  3. local FuwenDefine = require("fuwen.FuwenDefine")
  4. local FuwenGrid = require("fuwen.FuwenGrid")
  5. local HeroLogic = require("hero.HeroLogic")
  6. local FuwenExcel = require("excel.fuwen")
  7. local ItemDefine = require("bag.ItemDefine")
  8. local BagLogic = require("bag.BagLogic")
  9. local ObjHuman = require("core.ObjHuman")
  10. local RoleAttr = require("role.RoleAttr")
  11. local Util = require("common.Util")
  12. local LogDefine = require("common.LogDefine")
  13. local Log = require("common.Log")
  14. local Broadcast = require("broadcast.Broadcast")
  15. local Lang = require("common.Lang")
  16. local HeroEquip = require("hero.HeroEquip")
  17. local HeroExcel = require("excel.hero").hero
  18. local RoleDBLogic = require("role.RoleDBLogic")
  19. local BingshuLogic = require("fuwen.BingshuLogic")
  20. local LiLianLogic = require("dailyTask.LiLianLogic")
  21. local ChengjiuLogic = require("chengjiu.ChengjiuLogic")
  22. local ChengjiuDefine = require("chengjiu.ChengjiuDefine")
  23. local MailManager = require("mail.MailManager")
  24. local MailExcel = require("excel.mail")
  25. local HeroGrowUp = require("absAct.HeroGrowUp")
  26. local YunYingLogic = require("yunying.YunYingLogic")
  27. local TriggerDefine = require("trigger.TriggerDefine")
  28. local TriggerLogic = require("trigger.TriggerLogic")
  29. local Abs365CardLogic = require("absAct.Abs365CardLogic")
  30. local HeroArtifacts = require("hero.HeroArtifacts")
  31. -- 符文锁定属性,技能后的刷新时额外消耗的道具Id
  32. local LOCK_COST_ITEN_ID = 136
  33. -- 支持锁定属性,技能的符文的最低品质
  34. local LOCK_FUWEN_COLOR_BASE = 5
  35. -- 符文属性 + 技能的最大锁定数量
  36. local LOCK_FUWEN_MAX_NUM = 4
  37. -- 计算符文属性, 技能锁定后消耗的道具数量
  38. local function calcLockCost(fuwenGrid)
  39. local num = 0
  40. -- 属性
  41. for _, attrInfo in pairs(fuwenGrid.attr or {}) do
  42. if attrInfo[3] and attrInfo[3] == 1 then
  43. num = num + 2
  44. end
  45. end
  46. -- 技能
  47. local skillLockList = fuwenGrid.skillLockList
  48. if skillLockList then
  49. for _, _ in pairs(skillLockList) do
  50. num = num + 6
  51. end
  52. end
  53. return num
  54. end
  55. -- 获取符文的锁定信息
  56. local function getFuwenLockInfo(fuwenGrid)
  57. local lockNum = 0
  58. -- local attrLockPosTb, skillLockPosTb = {}, {}
  59. for pos, attrInfo in pairs(fuwenGrid.attr) do
  60. if attrInfo[3] and attrInfo[3] == 1 then
  61. lockNum = lockNum + 1
  62. -- attrLockPosTb[pos] = 1
  63. end
  64. end
  65. for skillId, pos in pairs(fuwenGrid.skillLockList or {}) do
  66. lockNum = lockNum + 1
  67. -- skillLockPosTb[pos] = skillId
  68. end
  69. -- return lockNum, attrLockPosTb, skillLockPosTb
  70. return lockNum
  71. end
  72. --发送所有符文列表 onLogin
  73. function sendFuwenRefineList(human)
  74. local msgRet = Msg.gc.GC_FUWEN_ALL_LIST
  75. -- 发送 背包符文列表
  76. local fuwenMsgCnt = 0
  77. msgRet.isEnd = 0
  78. for index,fuwenGrid in pairs(human.db.fuwenBag) do
  79. if fuwenGrid and FuwenExcel.fuwen[fuwenGrid.id].refine == 1 then
  80. fuwenMsgCnt = fuwenMsgCnt + 1
  81. Grid.makeItem(msgRet.list[fuwenMsgCnt].fuwen, fuwenGrid.id, 1, nil, fuwenGrid, index,Grid.getOpflagAtBag(fuwenGrid.id))
  82. msgRet.list[fuwenMsgCnt].pos = 0
  83. msgRet.list[fuwenMsgCnt].heroID = 0
  84. msgRet.list[fuwenMsgCnt].heroIndex = 0
  85. -- 分包发送
  86. if fuwenMsgCnt >= FuwenDefine.PAGE_LIST_COUNT then
  87. msgRet.list[0] = fuwenMsgCnt
  88. fuwenMsgCnt = 0
  89. Msg.send(msgRet, human.fd)
  90. end
  91. end
  92. end
  93. -- 英雄符文列表
  94. for index,heroGrid in pairs(human.db.heroBag) do
  95. if index ~= 0 and heroGrid.fuwen then
  96. for j = 1,2 do
  97. if heroGrid.fuwen[j]
  98. and heroGrid.fuwen[j].id
  99. and FuwenExcel.fuwen[heroGrid.fuwen[j].id].refine == 1 then
  100. local fuwenGrid = heroGrid.fuwen[j]
  101. fuwenMsgCnt = fuwenMsgCnt + 1
  102. Grid.makeItem(msgRet.list[fuwenMsgCnt].fuwen, fuwenGrid.id, 1, nil, fuwenGrid, index,Grid.getOpflagAtBag(fuwenGrid.id))
  103. msgRet.list[fuwenMsgCnt].pos = j
  104. msgRet.list[fuwenMsgCnt].heroID = heroGrid.id
  105. msgRet.list[fuwenMsgCnt].heroIndex = index
  106. -- 分包发送
  107. if fuwenMsgCnt >= FuwenDefine.PAGE_LIST_COUNT then
  108. msgRet.list[0] = fuwenMsgCnt
  109. fuwenMsgCnt = 0
  110. Msg.send(msgRet, human.fd)
  111. end
  112. end
  113. end
  114. end
  115. end
  116. msgRet.list[0] = fuwenMsgCnt
  117. msgRet.isEnd = 1
  118. Msg.send(msgRet, human.fd)
  119. end
  120. -- 发送符文背包列表
  121. function sendFuwenBagList(human)
  122. local msgRet = Msg.gc.GC_FUWEN_BAG_LIST
  123. local fuwenMsgCnt = 0
  124. for index,fuwenGrid in pairs(human.db.fuwenBag) do
  125. if fuwenGrid then
  126. fuwenMsgCnt = fuwenMsgCnt + 1
  127. Grid.makeItem(msgRet.list[fuwenMsgCnt], fuwenGrid.id, 1, nil, fuwenGrid, index, Grid.getOpflagAtBag(fuwenGrid.id))
  128. if fuwenMsgCnt >= FuwenDefine.PAGE_LIST_COUNT then
  129. msgRet.list[0] = fuwenMsgCnt
  130. fuwenMsgCnt = 0
  131. Msg.send(msgRet, human.fd)
  132. end
  133. end
  134. end
  135. if fuwenMsgCnt > 0 then
  136. msgRet.list[0] = fuwenMsgCnt
  137. Msg.send(msgRet, human.fd)
  138. end
  139. end
  140. -- 发送符文改变
  141. function sendFuwenItemChange(human, bagIndex, fuwenGrid, op)
  142. local msgRet = Msg.gc.GC_FUWEN_BAG_CHANGE
  143. if op == FuwenDefine.FUWEN_BAG_OP_ADD or op == FuwenDefine.FUWEN_BAG_OP_CHANGE then
  144. msgRet.itemID = fuwenGrid.id
  145. msgRet.itemIndex = bagIndex
  146. Grid.makeItem(msgRet.itemData[1], fuwenGrid.id, 1, nil, fuwenGrid, bagIndex, Grid.getOpflagAtBag(fuwenGrid.id))
  147. msgRet.itemData[0] = 1
  148. elseif op == FuwenDefine.FUWEN_BAG_OP_DEL then
  149. msgRet.itemID = 0
  150. msgRet.itemIndex = bagIndex
  151. msgRet.itemData[0] = 0
  152. else
  153. assert(nil)
  154. end
  155. Msg.send(msgRet, human.fd)
  156. end
  157. -- 添加新符文
  158. function add(human, itemID, itemCnt, logType)
  159. local index = nil
  160. if itemID == nil then
  161. return Broadcast.sendErr(human,Lang.FUWEN_ITEMID_ERR)
  162. end
  163. if itemCnt < 1 then
  164. return Broadcast.sendErr(human,Lang.FUWEN_ITEM_CNT_ERR)
  165. end
  166. for i = 1, itemCnt do
  167. local gridTemp = FuwenGrid.create(itemID)
  168. index = FuwenGrid.getEmptyIndex(human)
  169. if index ~= nil then
  170. human.db.fuwenBag[index] = gridTemp
  171. sendFuwenItemChange(human, index, gridTemp, FuwenDefine.FUWEN_BAG_OP_ADD)
  172. --Log.write(Log.LOGID_OSS_FUWEN, human.db._id, human.db.account, human.db.name, human.db.lv, LogDefine.DEFINE[logType] + LogDefine.TYPE["fuwen"] , itemID, 1)
  173. Log.write(Log.LOGID_OSS_FUWEN, human.db._id, human.db.newUniqueTag, human.db.name, human.db.lv, LogDefine.DEFINE[logType] + LogDefine.TYPE["fuwen"] , itemID, 1)
  174. else
  175. -- 没有空格子了
  176. break
  177. end
  178. LiLianLogic.onCallback(human,LiLianLogic.LILIAN_OUTID28,itemCnt,itemID)
  179. end
  180. return index
  181. end
  182. -- 通过gird添加符文
  183. function addByGrid(human, fuwenGrid, logType)
  184. if fuwenGrid == nil or fuwenGrid.id == nil then
  185. return Broadcast.sendErr(human,Lang.FUWEN_GRID_ERR)
  186. end
  187. local index = FuwenGrid.getEmptyIndex(human)
  188. if not index then
  189. local items = {}
  190. items[1] = { fuwenGrid.id, fuwenGrid }
  191. local title = MailExcel.mail[1000].title
  192. local content = MailExcel.mail[1000].content
  193. local senderName = MailExcel.mail[1000].senderName
  194. MailManager.add(MailManager.SYSTEM, human.db._id, title, content, items, senderName)
  195. return
  196. end
  197. human.db.fuwenBag[index] = fuwenGrid
  198. sendFuwenItemChange(human, index, fuwenGrid, FuwenDefine.FUWEN_BAG_OP_ADD)
  199. --Log.write(Log.LOGID_OSS_FUWEN, human.db._id, human.db.account, human.db.name, human.db.lv, LogDefine.DEFINE[logType] + LogDefine.TYPE["fuwen"] , fuwenGrid.id, 1)
  200. Log.write(Log.LOGID_OSS_FUWEN, human.db._id, human.db.newUniqueTag, human.db.name, human.db.lv, LogDefine.DEFINE[logType] + LogDefine.TYPE["fuwen"] , fuwenGrid.id, 1)
  201. return index
  202. end
  203. -- 从背包删除符文
  204. function del(human, index, logType)
  205. local fuwenGrid = human.db.fuwenBag[index]
  206. if fuwenGrid == nil then
  207. return Broadcast.sendErr(human,Lang.FUWEN_GRID_ERR)
  208. end
  209. human.db.fuwenBag[index] = nil
  210. --Log.write(Log.LOGID_OSS_FUWEN, human.db._id, human.db.account, human.db.name, human.db.lv, LogDefine.DEFINE[logType] + LogDefine.TYPE["fuwen"] , fuwenGrid.id, -1)
  211. Log.write(Log.LOGID_OSS_FUWEN, human.db._id, human.db.newUniqueTag, human.db.name, human.db.lv, LogDefine.DEFINE[logType] + LogDefine.TYPE["fuwen"] , fuwenGrid.id, -1)
  212. sendFuwenItemChange(human, index, nil, FuwenDefine.FUWEN_BAG_OP_DEL)
  213. end
  214. -- 获取符文背包数据
  215. function getFuwenBagData(human)
  216. return human.db.fuwenBag
  217. end
  218. -- 获取符文背包指定格子
  219. function getFuwenGrid(human, index)
  220. local fuwenBag = human.db.fuwenBag
  221. if not fuwenBag then
  222. return
  223. end
  224. return fuwenBag[index]
  225. end
  226. -- 获取符文背包中指定符文数量
  227. function getFuwenCntById(human, fuwenId)
  228. local cnt = 0
  229. for _, fuwenGrid in pairs(human.db.fuwenBag or {}) do
  230. if fuwenGrid and fuwenGrid.id == fuwenId then
  231. cnt = cnt + 1
  232. end
  233. end
  234. return cnt
  235. end
  236. -- 按符文ID删除指定数量符文
  237. function delFuwenById(human, fuwenId, cnt, logType)
  238. local indexList = {}
  239. for index, fuwenGrid in pairs(human.db.fuwenBag or {}) do
  240. if fuwenGrid and fuwenGrid.id == fuwenId then
  241. indexList[#indexList + 1] = index
  242. if #indexList >= cnt then
  243. break
  244. end
  245. end
  246. end
  247. for _, index in ipairs(indexList) do
  248. del(human, index, logType)
  249. end
  250. end
  251. -- 穿上符文
  252. function putOn(human, heroID, heroIndex, fuwenIndex,pos,noCalc)
  253. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  254. if heroGrid == nil then
  255. return Broadcast.sendErr(human,Lang.FUWEN_HERO_GRID_ERR)
  256. end
  257. local fuwenGrid = human.db.fuwenBag[fuwenIndex]
  258. if fuwenGrid == nil then
  259. return
  260. end
  261. if heroGrid.fuwen == nil or heroGrid.fuwen[pos] == nil then
  262. return
  263. else
  264. if heroGrid.fuwen[pos].id == nil then
  265. -- 新穿装备
  266. del(human, fuwenIndex, "fuwen_puton")
  267. heroGrid.fuwen = heroGrid.fuwen or {}
  268. heroGrid.fuwen[pos] = fuwenGrid
  269. else
  270. -- 替换装备
  271. local oldFuwenGrid = heroGrid.fuwen[pos]
  272. del(human, fuwenIndex, "fuwen_puton")
  273. addByGrid(human, oldFuwenGrid, "fuwen_putoff")
  274. heroGrid.fuwen[pos] = fuwenGrid
  275. end
  276. end
  277. if noCalc ~= true then
  278. -- 计算属性 todo
  279. ObjHuman.doCalcHero(human,heroIndex)
  280. HeroLogic.sendHeroBagDynamic(human, heroID, heroIndex)
  281. HeroEquip.query(human, heroID, heroIndex)
  282. end
  283. -- 通知客户端
  284. local msgRet = Msg.gc.GC_FUWEN_PUTON
  285. msgRet.heroID = heroID
  286. msgRet.heroIndex = heroIndex
  287. msgRet.pos = pos
  288. Grid.makeItem(msgRet.fuwen, fuwenGrid.id, 1, nil, fuwenGrid, -1, Grid.getOpflagAtBag(fuwenGrid.id))
  289. Msg.send(msgRet, human.fd)
  290. end
  291. -- 脱下符文
  292. function putOff(human, heroID, heroIndex, pos, noCalc, noSend)
  293. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  294. if heroGrid == nil then
  295. return
  296. end
  297. if heroGrid.fuwen == nil or heroGrid.fuwen[pos] == nil or heroGrid.fuwen[pos].id == nil then
  298. return
  299. end
  300. if not FuwenGrid.checkEmptyCnt(human, 1) then
  301. return
  302. end
  303. local oldFuwenGrid = heroGrid.fuwen[pos]
  304. heroGrid.fuwen[pos] = {}
  305. addByGrid(human, oldFuwenGrid, "fuwen_putoff")
  306. if noCalc ~= true then
  307. -- 计算属性
  308. ObjHuman.doCalcHero(human,heroIndex)
  309. HeroLogic.sendHeroBagDynamic(human, heroID, heroIndex)
  310. HeroEquip.query(human, heroID, heroIndex)
  311. end
  312. if not noSend then
  313. -- 通知客户端
  314. local msgRet = Msg.gc.GC_FUWEN_PUTOFF
  315. msgRet.heroID = heroID
  316. msgRet.heroIndex = heroIndex
  317. msgRet.pos = pos
  318. Msg.send(msgRet, human.fd)
  319. end
  320. end
  321. function putOffQuick(human, heroID, heroIndex, noSys)
  322. putOff(human, heroID, heroIndex, 1, true)
  323. putOff(human, heroID, heroIndex, 2, true)
  324. if not noSys then
  325. ObjHuman.doCalcHero(human,heroIndex)
  326. HeroLogic.sendHeroBagDynamic(human, heroID, heroIndex)
  327. HeroEquip.query(human, heroID, heroIndex)
  328. end
  329. end
  330. -- 符文合成查询
  331. local cacheFuwenGrid = {}
  332. function fuwenHechengQuery(human,fuwenID,fuwenCnt)
  333. local hechengConfig = FuwenExcel.hechengRule[fuwenID]
  334. if hechengConfig == nil then
  335. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_CONFIG_ERR)
  336. end
  337. local fuwenConfig = FuwenExcel.fuwen[fuwenID]
  338. if fuwenConfig == nil then
  339. return
  340. end
  341. local sub = fuwenCnt - 1
  342. local costJinbi = hechengConfig.hechengCost[sub]
  343. local succRate = hechengConfig.hechengRate[sub]
  344. local newFuwenID = hechengConfig.newFuwenID
  345. local failSmeltVal = hechengConfig.failRonglian
  346. local msgRet = Msg.gc.GC_FUWEN_HECHENG_QUERY
  347. msgRet.costJinbi = costJinbi
  348. msgRet.successRate = succRate
  349. if fuwenCnt < 2 then
  350. msgRet.costJinbi = 0
  351. msgRet.successRate = 0
  352. end
  353. if cacheFuwenGrid[newFuwenID] == nil then
  354. cacheFuwenGrid[newFuwenID] = FuwenGrid.create(newFuwenID)
  355. end
  356. local fuwenGrid = cacheFuwenGrid[newFuwenID]
  357. Grid.makeItem(msgRet.newFuwen, newFuwenID, 1, nil, fuwenGrid, 1)
  358. msgRet.smeltVal = failSmeltVal
  359. msgRet.accountSmeltVal = human.db.smeltVal or 0
  360. msgRet.desc1 = hechengConfig.desc1
  361. msgRet.desc2 = hechengConfig.desc2
  362. local newFuwenConfig = FuwenExcel.fuwen[newFuwenID]
  363. wrapFuwenAttrNet(msgRet,newFuwenConfig)
  364. Msg.send(msgRet,human.fd)
  365. end
  366. -- 合成符文
  367. function fuwenHechengDo(human,fuwenIndexList)
  368. if human.db.lv < 30 then
  369. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_LIMIT)
  370. end
  371. -- 校验材料个数
  372. local cnt = fuwenIndexList[0]
  373. if cnt < 2 then
  374. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_CNR_ERR)
  375. end
  376. local newFuwenID = nil
  377. local oldFuwenID = nil
  378. local config = FuwenExcel.hechengRule
  379. local indexTable = {}
  380. for i = 1,cnt do
  381. -- 防止添加同一个符文
  382. local index = fuwenIndexList[i]
  383. if indexTable[index] then
  384. return
  385. end
  386. -- 背包中没有该符文
  387. if human.db.fuwenBag[index] == nil then
  388. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_FILL_ERR)
  389. end
  390. -- 校验材料是否相同
  391. local fuwenGrid = human.db.fuwenBag[index]
  392. if oldFuwenID == nil then
  393. oldFuwenID = fuwenGrid.id
  394. else
  395. if oldFuwenID ~= fuwenGrid.id then
  396. return Broadcast.sendErr(human,Lang.FUWEN_ID_ERR)
  397. end
  398. end
  399. indexTable[index] = true
  400. end
  401. -- 校验是否有合成配置
  402. local hechengConfig = FuwenExcel.hechengRule[oldFuwenID]
  403. if hechengConfig == nil then
  404. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_CONFIG_ERR)
  405. end
  406. -- 校验是否达到合成限制等级
  407. if hechengConfig.limit > human.db.lv then
  408. return Broadcast.sendErr(human,Util.format(Lang.ROLE_LV_TOO_LOW, hechengConfig.limit))
  409. end
  410. -- 校验金币数量够不够
  411. local costJinbi = hechengConfig.hechengCost[cnt - 1]
  412. if human.db.jinbi < costJinbi then
  413. return Broadcast.sendErr(human,Lang.COMMON_NO_JINBI)
  414. end
  415. newFuwenID = hechengConfig.newFuwenID
  416. local rate = hechengConfig.hechengRate[cnt - 1]
  417. ObjHuman.updateJinbi(human, -costJinbi, "fuwen_hecheng")
  418. local randomNum = math.random(1,100)
  419. local newFuwenGrid = nil
  420. local fenjieList = {}
  421. if randomNum <= rate then
  422. -- 合成成功
  423. for i = 1,cnt do
  424. local index = fuwenIndexList[i]
  425. del(human, index, "fuwen_hecheng")
  426. end
  427. local msgRet = Msg.gc.GC_FUWEN_HECHENG_SUCCESS
  428. newFuwenGrid = FuwenGrid.create(newFuwenID)
  429. local newIndex = addByGrid(human, newFuwenGrid, "fuwen_hecheng")
  430. Grid.makeItem(msgRet.fuwen, newFuwenGrid.id, 1, nil, newFuwenGrid, newIndex,0)
  431. Msg.send(msgRet,human.fd)
  432. local tConfig = FuwenExcel.fuwen[newFuwenID]
  433. if tConfig then
  434. TriggerLogic.PublishEvent(TriggerDefine.FUWEN_GETQUALITY, human.db._id, tConfig.order, 1)
  435. end
  436. else
  437. -- 合成失败
  438. for i = 1,cnt do
  439. local index = fuwenIndexList[i]
  440. local fenjieConfig = FuwenExcel.fuwen[oldFuwenID]
  441. del(human, index, "fuwen_fenjie")
  442. local jhCnt = math.floor(fenjieConfig.fenjieJinghua/2)
  443. fenjieList[ItemDefine.ITEM_FUWEN_JINGHUA] = fenjieList[ItemDefine.ITEM_FUWEN_JINGHUA] or 0
  444. fenjieList[ItemDefine.ITEM_FUWEN_JINGHUA] = fenjieList[ItemDefine.ITEM_FUWEN_JINGHUA] + jhCnt
  445. end
  446. BagLogic.addItemList(human, fenjieList, "fuwen_fenjie")
  447. local baseCnt = hechengConfig.failRonglian
  448. local failRonglian_cnt = baseCnt + math.floor((cnt-2) * baseCnt/2)
  449. human.db.smeltVal = human.db.smeltVal or 0
  450. human.db.smeltVal = human.db.smeltVal + failRonglian_cnt
  451. local fenjieConfig = FuwenExcel.fuwen[oldFuwenID]
  452. local fenjieJinghua_cnt = math.floor(fenjieConfig.fenjieJinghua/2) * cnt
  453. local msgRet = Msg.gc.GC_FUWEN_HECHENG_FAIL
  454. msgRet.smeltVal = hechengConfig.failRonglian
  455. msgRet.accountSmeltVal = human.db.smeltVal
  456. Grid.makeItem(msgRet.fuwenJinghua, ItemDefine.ITEM_FUWEN_JINGHUA, fenjieJinghua_cnt)
  457. Msg.send(msgRet,human.fd)
  458. end
  459. -- 符文合成回调
  460. ChengjiuLogic.onCallback(human,ChengjiuDefine.CJ_TASK_TYPE_22,1)
  461. HeroGrowUp.onCallback(human, HeroGrowUp.TASKTYPE8, 1)
  462. YunYingLogic.onCallBack(human, "onFuwenHecheng",1)
  463. TriggerLogic.PublishEvent(TriggerDefine.FUWEN_HECHENG, human.db._id, 1)
  464. end
  465. -- 分解符文
  466. function fuwenFenjieDo(human,fuwenID,fuwenIndex,fenjieType)
  467. -- 校验符文是否可分解
  468. local fenjieConfig = FuwenExcel.fuwen[fuwenID]
  469. if fenjieConfig == nil then
  470. return Broadcast.sendErr(human,Lang.FUWEN_FENJIE_CONFIG_ERR)
  471. end
  472. -- 符文为空
  473. local fuwenGrid = human.db.fuwenBag[fuwenIndex]
  474. if fuwenGrid == nil then
  475. return Broadcast.sendErr(human,Lang.FUWEN_GRID_ERR)
  476. end
  477. -- 符文对不上
  478. if fuwenGrid.id ~= fuwenID then
  479. return Broadcast.sendErr(human,Lang.FUWEN_ID_ERR)
  480. end
  481. del(human, fuwenIndex, "fuwen_fenjie")
  482. local fenjieList = {}
  483. if fenjieType == nil then
  484. local msgRet = Msg.gc.GC_FUWEN_FENJIE
  485. Msg.send(msgRet,human.fd)
  486. fenjieList[ItemDefine.ITEM_FUWEN_JINGHUA] = fenjieConfig.fenjieJinghua
  487. else
  488. local cnt = math.floor(fenjieConfig.fenjieJinghua/2)
  489. fenjieList[ItemDefine.ITEM_FUWEN_JINGHUA] = cnt
  490. end
  491. BagLogic.addItemList(human, fenjieList, "fuwen_fenjie")
  492. end
  493. -- 符文兑换
  494. function fuwenExhcange(human)
  495. if human.db.smeltVal == nil or human.db.smeltVal < FuwenDefine.FUWEN_EXCHANGE_CNT then
  496. return Broadcast.sendErr(human,Lang.FUWEN_EXCHANGE_ERR) -- 熔炼值不够
  497. end
  498. human.db.smeltVal = human.db.smeltVal - FuwenDefine.FUWEN_EXCHANGE_CNT
  499. local index = add(human, FuwenDefine.FUWEN_EXCHANGE_ID, 1, "fuwen_exchange")
  500. local fuwenGrid = human.db.fuwenBag[index]
  501. local msgRet = Msg.gc.GC_FUWEN_EXCHANGE
  502. if fuwenGrid ~= nil then
  503. Grid.makeItem(msgRet.fuwen, fuwenGrid.id, 1, nil, fuwenGrid, 1)
  504. Msg.send(msgRet,human.fd)
  505. local nFuWenID = fuwenGrid.id
  506. local tConfig = FuwenExcel.fuwen[nFuWenID]
  507. if tConfig then
  508. TriggerLogic.PublishEvent(TriggerDefine.FUWEN_GETQUALITY, human.db._id, tConfig.order, 1)
  509. end
  510. end
  511. fuwenSmeltValQuery(human)
  512. end
  513. -- 符文刷新查询
  514. function fuwenRefreshQuery(human,fuwenID,fuwenIndex,pos,heroID,heroIndex)
  515. local fuwen = nil
  516. if fuwenIndex == -1 then
  517. -- 英雄身上符文
  518. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  519. if heroGrid == nil then
  520. return Broadcast.sendErr(human,Lang.FUWEN_HERO_GRID_ERR)
  521. end
  522. if heroGrid.fuwen == nil or heroGrid.fuwen[pos] == nil then
  523. return Broadcast.sendErr(human,Lang.FUWEN_PUTOFF_ERR)
  524. end
  525. fuwen = heroGrid.fuwen[pos]
  526. else
  527. fuwen = human.db.fuwenBag[fuwenIndex]
  528. end
  529. if fuwen == nil or fuwen.id == nil then
  530. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_FILL_ERR) -- 材料不存在
  531. end
  532. if fuwen.id ~= fuwenID then
  533. return Broadcast.sendErr(human,Lang.FUWEN_ID_ERR)
  534. end
  535. local refreshConfig = FuwenExcel.fuwen[fuwenID]
  536. if refreshConfig == nil then
  537. return Broadcast.sendErr(human,Lang.FUWEN_REFRESH_CONFIG_ERR) -- 没有相关id分解配置
  538. end
  539. if human.db.fuwenRefreshCnt == nil then
  540. human.db.fuwenRefreshCnt = {}
  541. human.db.fuwenRefreshCnt.sh = 0
  542. human.db.fuwenRefreshCnt.cs = 0
  543. end
  544. local msgRet = Msg.gc.GC_FUWEN_REFRESH_QUERY
  545. -- 异常处理
  546. local skillArray = fuwen.skill
  547. if skillArray then
  548. local skillNum = #skillArray
  549. local fuwenConfig = FuwenExcel.fuwen[fuwen.id]
  550. local skillMaxNum = FuwenGrid.getFuwenSkillMaxCnt(fuwenConfig)
  551. if skillNum > skillMaxNum then
  552. local skillTb = {}
  553. for _, skillId in ipairs(skillArray) do
  554. table.insert(skillTb, skillId)
  555. end
  556. table.sort(skillTb, function (a, b)
  557. return a > b
  558. end)
  559. fuwen.skill = {}
  560. for i=1, skillMaxNum do
  561. fuwen.skill[1] = skillTb[i]
  562. end
  563. skillArray = fuwen.skill
  564. end
  565. local skillLockList = fuwen.skillLockList
  566. if skillLockList and next(skillLockList) then
  567. for skillId, skillPos in pairs(skillLockList) do
  568. if not table.find(skillArray, skillId) then
  569. skillLockList[skillId] = nil
  570. local reallySkillId = skillArray[skillPos]
  571. skillLockList[reallySkillId] = skillPos
  572. end
  573. end
  574. end
  575. end
  576. -- 本体符文
  577. Grid.makeItemFuwen(msgRet.fuwen,fuwen.id,FuwenExcel.fuwen[fuwen.id],fuwen,fuwenIndex)
  578. -- 临时符文
  579. Grid.makeItemFuwen(msgRet.fuwenTemp,fuwen.id,FuwenExcel.fuwen[fuwen.id],fuwen,fuwenIndex)
  580. if fuwen.attrTemp == nil then
  581. fuwen.attrTemp = {}
  582. end
  583. -- 临时属性备份
  584. local attrLen = #fuwen.attrTemp
  585. for zz = 1,attrLen do
  586. -- msgRet.fuwenTemp.attrs[zz].key = fuwen.attrTemp[zz][1]
  587. -- msgRet.fuwenTemp.attrs[zz].value = fuwen.attrTemp[zz][2]
  588. msgRet.fuwenTemp.attrs[zz].attrArray.key = fuwen.attrTemp[zz][1]
  589. msgRet.fuwenTemp.attrs[zz].attrArray.value = fuwen.attrTemp[zz][2]
  590. msgRet.fuwenTemp.attrs[zz].isLock = fuwen.attrTemp[zz][3] or 0
  591. end
  592. msgRet.fuwenTemp.attrs[0] = attrLen
  593. -- 临时技能备份
  594. if fuwen.skillTemp == nil then
  595. msgRet.fuwenTemp.skills[0] = 0
  596. else
  597. local skillLen = #fuwen.skillTemp
  598. for zz = 1,skillLen do
  599. Grid.makeFuwenSkill(msgRet.fuwenTemp.skills[zz], fuwen.skillTemp[zz], fuwen.skillLockList)
  600. end
  601. msgRet.fuwenTemp.skills[0] = skillLen
  602. end
  603. if attrLen == 0 and fuwen.skillTemp == nil then
  604. msgRet.fuwenTemp.id = 0
  605. else
  606. msgRet.fuwenTemp.id = fuwen.id
  607. end
  608. local lenth = #refreshConfig.expend
  609. for i = 1,lenth do
  610. Grid.makeItem(msgRet.expend[i],refreshConfig.expend[i][1],refreshConfig.expend[i][2])
  611. end
  612. msgRet.expend[0] = lenth
  613. -- 锁定属性,技能的额外消耗
  614. local itemCnt = calcLockCost(fuwen)
  615. if itemCnt > 0 then
  616. lenth = lenth + 1
  617. msgRet.expend[0] = lenth
  618. Grid.makeItem(msgRet.expend[lenth], LOCK_COST_ITEN_ID, itemCnt)
  619. end
  620. msgRet.refreshCnt = 0
  621. if refreshConfig.rare == ItemDefine.ITEM_RARE_COLOR_5 then
  622. msgRet.refreshCnt = human.db.fuwenRefreshCnt.sh
  623. elseif refreshConfig.rare == ItemDefine.ITEM_RARE_COLOR_6 then
  624. msgRet.refreshCnt = human.db.fuwenRefreshCnt.cs
  625. end
  626. msgRet.needCnt = refreshConfig.luckRefresh or 0
  627. Msg.send(msgRet,human.fd)
  628. end
  629. -- 符文刷新
  630. function fuwenRefreshDo(human,fuwenID,fuwenIndex,heroID,heroIndex,pos)
  631. local refreshConfig = FuwenExcel.fuwen[fuwenID]
  632. if refreshConfig == nil then
  633. return Broadcast.sendErr(human,Lang.FUWEN_REFRESH_CONFIG_ERR) -- 传入参数非法
  634. end
  635. local fuwenGrid = nil
  636. if fuwenIndex == -1 then -- 刷英雄身上的
  637. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  638. if heroGrid == nil then
  639. return Broadcast.sendErr(human,Lang.FUWEN_HERO_GRID_ERR) -- 传入的英雄数据非法
  640. end
  641. if pos == nil then
  642. return Broadcast.sendErr(human,Lang.FUWEN_PUTOFF_ERR) -- 传入的参数非法
  643. end
  644. if heroGrid.fuwen == nil or heroGrid.fuwen[pos] == nil or heroGrid.fuwen[pos].id == nil then
  645. return Broadcast.sendErr(human,Lang.FUWEN_PUTOFF_ERR) -- 传入的参数非法
  646. end
  647. fuwenGrid = heroGrid.fuwen[pos]
  648. else -- 刷背包里的
  649. if human.db.fuwenBag == nil or human.db.fuwenBag[fuwenIndex] == nil then
  650. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_FILL_ERR) -- 材料不存在
  651. end
  652. fuwenGrid = human.db.fuwenBag[fuwenIndex]
  653. end
  654. if fuwenGrid == nil or fuwenGrid.id == nil then
  655. return
  656. end
  657. if fuwenGrid.id ~= nil and fuwenGrid.id ~= fuwenID then
  658. return Broadcast.sendErr(human,Lang.FUWEN_ID_ERR)
  659. end
  660. -- 幸运重铸判定
  661. local luckRefresh = 0
  662. local refreshCnt = 0
  663. human.db.fuwenRefreshCnt.cs = human.db.fuwenRefreshCnt.cs or 0
  664. human.db.fuwenRefreshCnt.sh = human.db.fuwenRefreshCnt.sh or 0
  665. if refreshConfig.rare == ItemDefine.ITEM_RARE_COLOR_5 then
  666. refreshCnt = human.db.fuwenRefreshCnt.sh or 0
  667. elseif refreshConfig.rare == ItemDefine.ITEM_RARE_COLOR_6 then
  668. refreshCnt = human.db.fuwenRefreshCnt.cs or 0
  669. end
  670. if refreshConfig.luckRefresh ~= nil and refreshConfig.luckRefresh ~= 0 and refreshCnt >= refreshConfig.luckRefresh then
  671. luckRefresh = 1
  672. end
  673. local jinghuaCnt = BagLogic.getItemCnt(human, ItemDefine.ITEM_FUWEN_JINGHUA)
  674. if human.db.jinbi < refreshConfig.expend[1][2] or jinghuaCnt < refreshConfig.expend[2][2] then
  675. return Broadcast.sendErr(human,Lang.FUWEN_REFRESH_FILL_ERR) -- 材料不够
  676. end
  677. local itemCnt = calcLockCost(fuwenGrid)
  678. if itemCnt > 0 then
  679. if BagLogic.getItemCnt(human, LOCK_COST_ITEN_ID) < itemCnt then
  680. return Broadcast.sendErr(human,Lang.FUWEN_REFRESH_FILL_ERR)
  681. end
  682. end
  683. if refreshConfig.rare == ItemDefine.ITEM_RARE_COLOR_5 then
  684. human.db.fuwenRefreshCnt.sh = human.db.fuwenRefreshCnt.sh + 1
  685. elseif refreshConfig.rare == ItemDefine.ITEM_RARE_COLOR_6 then
  686. human.db.fuwenRefreshCnt.cs = human.db.fuwenRefreshCnt.cs + 1
  687. end
  688. if human.db.fuwenRefreshCnt.cs > 15 then
  689. human.db.fuwenRefreshCnt.cs = 0
  690. end
  691. if human.db.fuwenRefreshCnt.sh > 25 then
  692. human.db.fuwenRefreshCnt.sh = 0
  693. end
  694. -- 扣消耗
  695. local fuwenGridTemp = Util.copyTable(fuwenGrid)
  696. ObjHuman.updateJinbi(human, -refreshConfig.expend[1][2], "fuwen_refresh")
  697. BagLogic.delItem(human, ItemDefine.ITEM_FUWEN_JINGHUA, refreshConfig.expend[2][2], "fuwen_refresh")
  698. if itemCnt > 0 then
  699. BagLogic.delItem(human, LOCK_COST_ITEN_ID, itemCnt, "fuwen_refresh")
  700. end
  701. Util.printTable(fuwenGridTemp.attr)
  702. -- 改属性
  703. FuwenGrid.genFuwenAttr(fuwenGridTemp,luckRefresh)
  704. fuwenGrid.attrTemp = fuwenGridTemp.attr or {}
  705. fuwenGrid.skillTemp = fuwenGridTemp.skill
  706. local msgRet = Msg.gc.GC_FUWEN_REFRESH_DO
  707. Grid.makeItem(msgRet.fuwen, fuwenGridTemp.id, 1, nil, fuwenGridTemp, fuwenIndex)
  708. Msg.send(msgRet,human.fd)
  709. fuwenRefreshQuery(human,fuwenID,fuwenIndex,pos,heroID,heroIndex)
  710. YunYingLogic.onCallBack(human, "onFuwenChongZhu",1)
  711. TriggerLogic.PublishEvent(TriggerDefine.FUWEN_RESET, human.db._id, 1)
  712. end
  713. -- 锁定/解锁符文的属性,技能
  714. function ResetLock(human, fuwenID,fuwenIndex,heroID,heroIndex,pos, opTarget, opIdx, opType)
  715. local refreshConfig = FuwenExcel.fuwen[fuwenID]
  716. if refreshConfig == nil then
  717. return Broadcast.sendErr(human,Lang.FUWEN_GRID_ERR) -- 传入参数非法
  718. end
  719. if refreshConfig.order < LOCK_FUWEN_COLOR_BASE then
  720. return Broadcast.sendErr(human,Lang.FUWEN_COLOR_ERR)
  721. end
  722. local fuwenGrid = nil
  723. if fuwenIndex == -1 then -- 刷英雄身上的
  724. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  725. if heroGrid == nil then
  726. return Broadcast.sendErr(human,Lang.FUWEN_HERO_GRID_ERR) -- 传入的英雄数据非法
  727. end
  728. if pos == nil then
  729. return Broadcast.sendErr(human,Lang.FUWEN_PUTOFF_ERR) -- 传入的参数非法
  730. end
  731. if heroGrid.fuwen == nil or heroGrid.fuwen[pos] == nil or heroGrid.fuwen[pos].id == nil then
  732. return Broadcast.sendErr(human,Lang.FUWEN_PUTOFF_ERR) -- 传入的参数非法
  733. end
  734. fuwenGrid = heroGrid.fuwen[pos]
  735. else -- 刷背包里的
  736. if human.db.fuwenBag == nil or human.db.fuwenBag[fuwenIndex] == nil then
  737. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_FILL_ERR) -- 材料不存在
  738. end
  739. fuwenGrid = human.db.fuwenBag[fuwenIndex]
  740. end
  741. if fuwenGrid == nil or fuwenGrid.id == nil then
  742. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_FILL_ERR)
  743. end
  744. if fuwenGrid.id ~= nil and fuwenGrid.id ~= fuwenID then
  745. return Broadcast.sendErr(human,Lang.FUWEN_ID_ERR)
  746. end
  747. if opType ~= 1 and opType ~= 0 then
  748. return Broadcast.sendErr(human,Lang.COMMON_ARGUMENT_ERROR)
  749. end
  750. -- 锁定数量判断
  751. if opType == 1 then
  752. local lockNum = getFuwenLockInfo(fuwenGrid)
  753. if lockNum >= LOCK_FUWEN_MAX_NUM then
  754. return Broadcast.sendErr(human,Lang.FUWEN_LOCK_MAX_ERR)
  755. end
  756. end
  757. -- 对属性进行锁定/解锁
  758. if opTarget == 1 then
  759. if not fuwenGrid.attr[opIdx] then
  760. return Broadcast.sendErr(human,Lang.FUWEN_ATTR_POS_ERR)
  761. end
  762. fuwenGrid.attr[opIdx][3] = opType
  763. elseif opTarget == 2 then -- 对技能进行锁定/解锁
  764. if not fuwenGrid.skill or not fuwenGrid.skill[opIdx] then
  765. return Broadcast.sendErr(human,Lang.FUWEN_SKILL_POS_ERR)
  766. end
  767. local skillId = fuwenGrid.skill[opIdx]
  768. fuwenGrid.skillLockList = fuwenGrid.skillLockList or {}
  769. if opType == 1 then
  770. fuwenGrid.skillLockList[skillId] = opIdx
  771. end
  772. if opType == 0 then
  773. fuwenGrid.skillLockList[skillId] = nil
  774. end
  775. else
  776. return Broadcast.sendErr(human,Lang.COMMON_ARGUMENT_ERROR)
  777. end
  778. fuwenRefreshQuery(human,fuwenID,fuwenIndex,pos,heroID,heroIndex)
  779. end
  780. local function cmpSkill(a, b)
  781. if a.sortID ~= b.sortID then
  782. return a.sortID < b.sortID
  783. end
  784. return a.skillID < b.skillID
  785. end
  786. local SORT_SKILL_LIST = nil
  787. function getSortSkillList()
  788. if not SORT_SKILL_LIST then
  789. SORT_SKILL_LIST = {}
  790. for skillID, config in pairs(FuwenExcel.skill) do
  791. config.skillID = skillID
  792. SORT_SKILL_LIST[#SORT_SKILL_LIST + 1] = config
  793. end
  794. if #SORT_SKILL_LIST > 1 then
  795. table.sort(SORT_SKILL_LIST, cmpSkill)
  796. end
  797. end
  798. return SORT_SKILL_LIST
  799. end
  800. -- 技能查询
  801. function fuwenRareSkillQuery(human, lv)
  802. local configs = getSortSkillList()
  803. local msgRet = Msg.gc.GC_FUWEN_RARE_SKILL_QUERY
  804. msgRet.type = lv
  805. local cnt = 0
  806. for _, config in ipairs(configs) do
  807. if config.lv == lv then
  808. cnt = cnt + 1
  809. Grid.makeFuwenSkill(msgRet.skillInfo[cnt], config.skillID)
  810. end
  811. end
  812. if cnt > 0 then
  813. msgRet.skillInfo[0] = cnt
  814. Msg.send(msgRet, human.fd)
  815. end
  816. end
  817. -- 计算属性
  818. local tbSkillGroupID = {}
  819. function doCalcHero(obj,attrs)
  820. Util.initTable(tbSkillGroupID)
  821. if obj.fuwen then
  822. for i = 1, 2 do
  823. local fuwenGrid = obj.fuwen[i]
  824. if fuwenGrid and fuwenGrid.id ~= nil then
  825. for k, v in ipairs(fuwenGrid.attr) do
  826. RoleAttr.updateValue(v[1], v[2], attrs)
  827. end
  828. local skillLen = fuwenGrid.skill and #fuwenGrid.skill or 0
  829. for j = 1, skillLen do
  830. local skillID = fuwenGrid.skill[j]
  831. local skillConfig = FuwenExcel.skill[skillID]
  832. local groupID = skillConfig.groupID
  833. if (tbSkillGroupID[groupID] or 0) < skillID then
  834. tbSkillGroupID[groupID] = skillID
  835. end
  836. end
  837. end
  838. end
  839. end
  840. -- 兵书技能
  841. if obj.bingshu then
  842. for i = 1, BingshuLogic.BINGSHU_MAXCNT do
  843. local bingshuGrid = obj.bingshu[i]
  844. if bingshuGrid then
  845. local skillID = bingshuGrid.skillID
  846. local skillConfig = FuwenExcel.skill[skillID]
  847. local groupID = skillConfig.groupID
  848. if (tbSkillGroupID[groupID] or 0) < skillID then
  849. tbSkillGroupID[groupID] = skillID
  850. end
  851. end
  852. end
  853. end
  854. local skillId_2_Attr
  855. if next(tbSkillGroupID) then
  856. skillId_2_Attr = HeroArtifacts.GetFuwenStrengthenAttrList(obj)
  857. end
  858. -- 符文技能效果这里 如果有多个同类型的技能 效果不叠加 只取最高等级的那个技能的效果
  859. for groupID, skillIDTemp in pairs(tbSkillGroupID) do
  860. local skillConfig = FuwenExcel.skill[skillIDTemp]
  861. local cnt = #skillConfig.attrs
  862. if cnt > 0 then
  863. for k, v in ipairs(skillConfig.attrs) do
  864. RoleAttr.updateValue(v[1], v[2], attrs)
  865. end
  866. end
  867. if skillId_2_Attr and skillId_2_Attr[skillConfig.fuwenBeSkill] then
  868. for _, v in ipairs(skillId_2_Attr[skillConfig.fuwenBeSkill]) do
  869. RoleAttr.updateValue(v[1], v[2], attrs)
  870. end
  871. end
  872. end
  873. end
  874. -- 熔炼值查询
  875. function fuwenSmeltValQuery(human)
  876. local msgRet = Msg.gc.GC_FUWEN_SMELT_VAL_QUERY
  877. msgRet.accountSmeltVal = human.db.smeltVal or 0
  878. Msg.send(msgRet,human.fd)
  879. end
  880. -- 符文刷新保存
  881. function fuwenRefreshSave(human,fuwenID,fuwenIndex,pos,heroID,heroIndex)
  882. local fuwen = nil
  883. if fuwenIndex == -1 then
  884. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  885. if heroGrid == nil then
  886. return Broadcast.sendErr(human,Lang.FUWEN_HERO_GRID_ERR)
  887. end
  888. if heroGrid.fuwen == nil or heroGrid.fuwen[pos] == nil then
  889. return Broadcast.sendErr(human,Lang.FUWEN_PUTOFF_ERR)
  890. end
  891. fuwen = heroGrid.fuwen[pos]
  892. else
  893. fuwen = human.db.fuwenBag[fuwenIndex]
  894. end
  895. if fuwen == nil or fuwen.id == nil then
  896. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_FILL_ERR)
  897. end
  898. if fuwen.id ~= fuwenID then
  899. return Broadcast.sendErr(human,Lang.FUWEN_ID_ERR)
  900. end
  901. if fuwen.attrTemp ~= nil or fuwen.skillTemp ~= nil then
  902. if fuwen.attrTemp and next(fuwen.attrTemp) then
  903. fuwen.attr = fuwen.attrTemp
  904. fuwen.attrTemp = {}
  905. else
  906. --Log.write(Log.LOGID_DEBUG, human.db._id, human.db.account, human.db.name, human.db.lv, fuwen.id,"refreshsave attrTemp is empty")
  907. Log.write(Log.LOGID_DEBUG, human.db._id, human.db.newUniqueTag, human.db.name, human.db.lv, fuwen.id,"refreshsave attrTemp is empty")
  908. end
  909. if fuwen.skillTemp and next(fuwen.skillTemp) then
  910. local oldSkillLockList = fuwen.skillLockList
  911. fuwen.skill = fuwen.skillTemp
  912. fuwen.skillTemp = nil
  913. -- 按 skillId 保留原锁定状态,并更新为新技能列表中的位置(兼容线上已有 skillLockList)
  914. if oldSkillLockList and next(oldSkillLockList) then
  915. local newSkillLockList = {}
  916. for skillPos, skillId in ipairs(fuwen.skill) do
  917. if oldSkillLockList[skillId] then
  918. newSkillLockList[skillId] = skillPos
  919. end
  920. end
  921. if next(newSkillLockList) then
  922. fuwen.skillLockList = newSkillLockList
  923. else
  924. fuwen.skillLockList = nil
  925. end
  926. end
  927. else
  928. --Log.write(Log.LOGID_DEBUG, human.db._id, human.db.account, human.db.name, human.db.lv, fuwen.id,"refreshsave skillTemp is empty")
  929. Log.write(Log.LOGID_DEBUG, human.db._id, human.db.newUniqueTag, human.db.name, human.db.lv, fuwen.id,"refreshsave skillTemp is empty")
  930. end
  931. end
  932. Broadcast.sendErr(human,Lang.FUWEN_SAVE_SUCCESS)
  933. if fuwenIndex == -1 then
  934. ObjHuman.doCalcHero(human,heroIndex)
  935. HeroLogic.sendHeroBagDynamic(human, heroID, heroIndex)
  936. HeroEquip.query(human, heroID, heroIndex)
  937. else
  938. sendFuwenItemChange(human, fuwenIndex, fuwen, FuwenDefine.FUWEN_BAG_OP_ADD)
  939. end
  940. fuwenRefreshQuery(human,fuwenID,fuwenIndex,pos,heroID,heroIndex)
  941. end
  942. -- 符文兑换查询
  943. function fuwenExchangeQuery(human)
  944. local msgRet = Msg.gc.GC_FUWEN_EXCHANGE_QUERY
  945. local gridTemp = FuwenGrid.create(FuwenDefine.FUWEN_EXCHANGE_ID)
  946. Grid.makeItem(msgRet.fuwen, gridTemp.id, 1, nil, gridTemp, 1)
  947. Msg.send(msgRet,human.fd)
  948. end
  949. -- 符文格子解锁
  950. function fuwenGridUnlock(human,heroID,heroIndex,pos)
  951. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  952. if heroGrid == nil then
  953. return
  954. end
  955. if heroGrid.fuwen ~= nil and heroGrid.fuwen[pos] ~= nil then
  956. return
  957. end
  958. if pos == 1 then
  959. if heroGrid.lv < 100 then
  960. else
  961. heroGrid.fuwen = heroGrid.fuwen or {}
  962. heroGrid.fuwen[1] = {}
  963. end
  964. elseif pos == 2 then
  965. if heroGrid.star < 7 then
  966. else
  967. heroGrid.fuwen = heroGrid.fuwen or {}
  968. heroGrid.fuwen[2] = {}
  969. end
  970. end
  971. end
  972. function wrapFuwenAttrNet(net,fuwenConf)
  973. local len = 0
  974. for _,attr in ipairs(fuwenConf.absAttrPool) do
  975. len = len + 1
  976. net.base_attrs[len].key = attr[1]
  977. net.base_attrs[len].value = attr[2]
  978. end
  979. net.base_attrs[0] = len
  980. local len2 = 0
  981. for _, attr in ipairs(fuwenConf.percentAttrPool) do
  982. len2 = len2 + 1
  983. net.percent_attrs[len2].key = attr[1]
  984. net.percent_attrs[len2].value = attr[2]
  985. end
  986. net.percent_attrs[0] = len2
  987. end
  988. -- 符文属性查询
  989. function CG_FUWEN_ATTR_QUERY(human,fuwenID)
  990. if fuwenID == nil then
  991. return Broadcast.sendErr(human,Lang.FUWEN_ITEMID_ERR)
  992. end
  993. local fuwenConfig = FuwenExcel.fuwen[fuwenID]
  994. if fuwenConfig == nil then
  995. return
  996. end
  997. local msgRet = Msg.gc.GC_FUWEN_ATTR_QUERY
  998. wrapFuwenAttrNet(msgRet,fuwenConfig)
  999. Msg.send(msgRet,human.fd)
  1000. end
  1001. -- 符文精炼预览
  1002. function fuwenRefinePreview(human)
  1003. local fuwenGrid = {}
  1004. fuwenGrid = FuwenGrid.create(FuwenDefine.FUWEN_REFINE_ID)
  1005. local msgRet = Msg.gc.GC_FUWEN_REFINE_PREVIEW_QUERY
  1006. Grid.makeItem(msgRet.fuwen, fuwenGrid.id, 1, nil, fuwenGrid, 1)
  1007. Msg.send(msgRet,human.fd)
  1008. end
  1009. -- 符文精炼查询
  1010. function fuwenRefineQuery(human,fuwenID,fuwenIndex,pos,heroID,heroIndex)
  1011. local fuwen = nil
  1012. if fuwenIndex == -1 then
  1013. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  1014. if heroGrid == nil then
  1015. return Broadcast.sendErr(human,Lang.FUWEN_HERO_GRID_ERR)
  1016. end
  1017. if heroGrid.fuwen == nil or heroGrid.fuwen[pos] == nil then
  1018. return Broadcast.sendErr(human,Lang.FUWEN_PUTOFF_ERR)
  1019. end
  1020. fuwen = heroGrid.fuwen[pos]
  1021. else
  1022. fuwen = human.db.fuwenBag[fuwenIndex]
  1023. end
  1024. if fuwen == nil or fuwen.id == nil then
  1025. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_FILL_ERR) -- 材料不存在
  1026. end
  1027. if fuwen.id ~= fuwenID then
  1028. return Broadcast.sendErr(human,Lang.FUWEN_ID_ERR)
  1029. end
  1030. if FuwenExcel.fuwen[fuwen.id].refine ~= 1 then
  1031. return
  1032. end
  1033. local jinglianExcel = FuwenExcel.jinglian
  1034. local refine = fuwen.refine or 0
  1035. local refineExcel = jinglianExcel[refine + 1]
  1036. -- 构造预览符文
  1037. local previewFuwen = Util.copyTable(fuwen)
  1038. previewFuwen.refine = refine + 1
  1039. if refine == 0 then
  1040. -- 第1次精炼
  1041. local newValue = previewFuwen.attr[1][2] * 2
  1042. previewFuwen.attr[1][2] = newValue
  1043. elseif refine == 1 then
  1044. -- 第2次精炼
  1045. local fuwenConfig = FuwenExcel.fuwen[fuwen.id]
  1046. cnt = #fuwenConfig.percentAttrPool
  1047. if cnt > 0 then
  1048. local randIndex = math.random(1, cnt)
  1049. local attrKey = fuwenConfig.percentAttrPool[randIndex][1]
  1050. local attrVal = fuwenConfig.percentAttrPool[randIndex][2]
  1051. previewFuwen.attr[3] = {attrKey, attrVal}
  1052. end
  1053. elseif refine == 2 then
  1054. -- 第3次精炼
  1055. local skillConfig = FuwenExcel.skill
  1056. local skillLen = #previewFuwen.skill
  1057. for i = 1,skillLen do
  1058. local skillID = previewFuwen.skill[i]
  1059. local skillLv = skillConfig[skillID].lv
  1060. if skillLv < 3 then
  1061. skillID = skillID + 1000
  1062. end
  1063. previewFuwen.skill[i] = skillID
  1064. end
  1065. previewFuwen.id = fuwen.id + 1
  1066. end
  1067. -- 发数据
  1068. local msgRet = Msg.gc.GC_FUWEN_REFINE_QUERY
  1069. Grid.makeItem(msgRet.fuwen,previewFuwen.id, 1, nil,previewFuwen, 1)
  1070. local expendLen = #refineExcel.expend
  1071. for i = 1,expendLen do
  1072. Grid.makeItem(msgRet.expend[i],refineExcel.expend[i][1],refineExcel.expend[i][2])
  1073. end
  1074. msgRet.expend[0] = expendLen
  1075. local jinglianLen = #jinglianExcel
  1076. for i = 1,jinglianLen do
  1077. msgRet.refineDesc[i].desc = jinglianExcel[i].desc
  1078. end
  1079. msgRet.refineDesc[0] = jinglianLen
  1080. Msg.send(msgRet,human.fd)
  1081. end
  1082. -- 符文精炼
  1083. function fuwenRefineDo(human,fuwenID,fuwenIndex,pos,heroID,heroIndex)
  1084. local fuwen = nil
  1085. if fuwenIndex == -1 then
  1086. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  1087. if heroGrid == nil then
  1088. return Broadcast.sendErr(human,Lang.FUWEN_HERO_GRID_ERR)
  1089. end
  1090. if heroGrid.fuwen == nil or heroGrid.fuwen[pos] == nil then
  1091. return Broadcast.sendErr(human,Lang.FUWEN_PUTOFF_ERR)
  1092. end
  1093. fuwen = heroGrid.fuwen[pos]
  1094. else
  1095. fuwen = human.db.fuwenBag[fuwenIndex]
  1096. end
  1097. if fuwen == nil or fuwen.id == nil then
  1098. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_FILL_ERR) -- 材料不存在
  1099. end
  1100. if fuwen.id ~= fuwenID then
  1101. return Broadcast.sendErr(human,Lang.FUWEN_ID_ERR)
  1102. end
  1103. if FuwenExcel.fuwen[fuwen.id].refine ~= 1 then
  1104. return
  1105. end
  1106. local newRefine = fuwen.refine or 0
  1107. newRefine = newRefine + 1
  1108. local jinglianExcel = FuwenExcel.jinglian
  1109. local refineExcel = jinglianExcel[newRefine]
  1110. local expendLen = #refineExcel.expend
  1111. for i = 1,expendLen do
  1112. local v = refineExcel.expend[i]
  1113. local haveCnt = BagLogic.getItemCnt(human,v[1])
  1114. if haveCnt < v[2] then
  1115. return Broadcast.sendErr(human,Lang.FUWEN_REFRESH_FILL_ERR) -- 材料不够
  1116. end
  1117. end
  1118. --删除材料
  1119. for i = 1,expendLen do
  1120. local v = refineExcel.expend[i]
  1121. BagLogic.delItem(human, v[1], v[2], "fuwen_refine")
  1122. end
  1123. if newRefine == 1 then
  1124. -- 第1次精炼
  1125. fuwen.refine = newRefine
  1126. local newValue = fuwen.attr[1][2] * 2
  1127. fuwen.attr[1][2] = newValue
  1128. elseif newRefine == 2 then
  1129. -- 第2次精炼
  1130. fuwen.refine = newRefine
  1131. local fuwenConfig = FuwenExcel.fuwen[fuwen.id]
  1132. cnt = #fuwenConfig.percentAttrPool
  1133. if cnt > 0 then
  1134. local randIndex = math.random(1, cnt)
  1135. local attrKey = fuwenConfig.percentAttrPool[randIndex][1]
  1136. local attrVal = fuwenConfig.percentAttrPool[randIndex][2]
  1137. fuwen.attr[3] = {attrKey, attrVal}
  1138. end
  1139. elseif newRefine == 3 then
  1140. -- 第3次精炼
  1141. fuwen.refine = newRefine
  1142. local skillConfig = FuwenExcel.skill
  1143. local skillLen = #fuwen.skill
  1144. for i = 1,skillLen do
  1145. local skillID = fuwen.skill[i]
  1146. local skillLv = skillConfig[skillID].lv
  1147. if skillLv < 4 then
  1148. skillID = skillID + 1000
  1149. end
  1150. fuwen.skill[i] = skillID
  1151. end
  1152. fuwen.id = fuwen.id + 1
  1153. fuwen.refine = 0
  1154. -- 变成神话特殊判断
  1155. local tConfig = FuwenExcel.fuwen[fuwen.id]
  1156. if tConfig and tConfig.order == 6 then
  1157. TriggerLogic.PublishEvent(TriggerDefine.FUWEN_GETQUALITY, human.db._id, tConfig.order, 1)
  1158. end
  1159. else
  1160. return
  1161. end
  1162. if fuwenIndex == -1 then
  1163. ObjHuman.doCalcHero(human,heroIndex)
  1164. HeroLogic.sendHeroBagDynamic(human, heroID, heroIndex)
  1165. HeroEquip.query(human, heroID, heroIndex)
  1166. else
  1167. sendFuwenItemChange(human, fuwenIndex, fuwen, FuwenDefine.FUWEN_BAG_OP_ADD)
  1168. end
  1169. local msgRet = Msg.gc.GC_FUWEN_REFINE_DO
  1170. Grid.makeItem(msgRet.fuwen,fuwen.id, 1,nil, fuwen, 1)
  1171. Msg.send(msgRet,human.fd)
  1172. end
  1173. -- 是否有符文红点
  1174. function isFuwenDot(human, heroGrid)
  1175. if not heroGrid then return end
  1176. local heroConfig = HeroExcel[heroGrid.id]
  1177. if not heroConfig then return end
  1178. if human.db.lv < 9 then
  1179. return false
  1180. end
  1181. local haveFuwen = nil
  1182. local emptyCnt = FuwenGrid.getEmptyCnt(human)
  1183. if emptyCnt < FuwenDefine.FUWEN_BAG_MAX_CNT then
  1184. haveFuwen = true
  1185. end
  1186. for pos = 1, 2 do
  1187. local fuwenGrid = heroGrid.fuwen and heroGrid.fuwen[pos]
  1188. if fuwenGrid ~= nil and fuwenGrid.id == nil and haveFuwen then
  1189. return true
  1190. end
  1191. end
  1192. end
  1193. -- 是否有装备红点
  1194. function isFuwenDotByPos(human, heroGrid, pos)
  1195. if not heroGrid then return end
  1196. local heroConfig = HeroExcel[heroGrid.id]
  1197. if not heroConfig then return end
  1198. local haveFuwen = nil
  1199. local emptyCnt = FuwenGrid.getEmptyCnt(human)
  1200. if emptyCnt < FuwenDefine.FUWEN_BAG_MAX_CNT then
  1201. haveFuwen = true
  1202. end
  1203. local fuwenGrid = heroGrid.fuwen and heroGrid.fuwen[pos]
  1204. if fuwenGrid ~= nil and fuwenGrid.id == nil and haveFuwen then
  1205. return true
  1206. end
  1207. end
  1208. function sendFuwenGetWay(human)
  1209. local msgRet = Msg.gc.GC_FUWEN_GET_WAY_QUERY
  1210. local fuwenGrid = FuwenGrid.create(80001)
  1211. local hechengConfig = FuwenExcel.hechengRule[80001]
  1212. Grid.makeItem(msgRet.newFuwen, 80001, 1, nil, fuwenGrid, 1)
  1213. msgRet.desc1 = hechengConfig.desc1
  1214. msgRet.desc2 = hechengConfig.desc2
  1215. Msg.send(msgRet,human.fd)
  1216. end
  1217. function fuwenHechengOneClickDo(human, tFuwenIndex)
  1218. -- 没买卡
  1219. if 0 == Abs365CardLogic.IsBuyCard(human) then
  1220. return
  1221. end
  1222. -- 等级不够
  1223. if human.db.lv < 30 then
  1224. return
  1225. end
  1226. local nAllLen = tFuwenIndex[0]
  1227. if nAllLen < 2 or nAllLen % 5 ~= 0 then
  1228. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_CNR_ERR)
  1229. end
  1230. local tFuWenList, tCheckIndex = {}, {}
  1231. local tFuWenGroup, nCheckFuWenID = {}, nil
  1232. local nLen, nAllUseJinBi = 0, 0
  1233. -- 检查一下是否有重复
  1234. for i = 1, nAllLen, 1 do
  1235. nLen = nLen + 1
  1236. local nIndex = tFuwenIndex[i]
  1237. if tCheckIndex[nIndex] then
  1238. print("[fuwenHechengOneClickDo] 存在重复的 nIndex = "..nIndex)
  1239. return
  1240. end
  1241. -- 背包中没有该符文
  1242. if human.db.fuwenBag[nIndex] == nil then
  1243. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_FILL_ERR)
  1244. end
  1245. -- 校验材料是否相同
  1246. local fuwenGrid = human.db.fuwenBag[nIndex]
  1247. if nCheckFuWenID == nil then
  1248. nCheckFuWenID = fuwenGrid.id
  1249. else
  1250. if nCheckFuWenID ~= fuwenGrid.id then
  1251. return Broadcast.sendErr(human,Lang.FUWEN_ID_ERR)
  1252. end
  1253. end
  1254. tCheckIndex[nIndex] = true
  1255. table.insert(tFuWenGroup, nIndex)
  1256. if nLen == 5 then
  1257. -- 一组完成,检查一下对应的配置
  1258. local tHeChengConfig = FuwenExcel.hechengRule[nCheckFuWenID]
  1259. if not tHeChengConfig then
  1260. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_CONFIG_ERR)
  1261. end
  1262. -- 校验是否达到合成限制等级
  1263. if tHeChengConfig.limit > human.db.lv then
  1264. return Broadcast.sendErr(human,Util.format(Lang.ROLE_LV_TOO_LOW, tHeChengConfig.limit))
  1265. end
  1266. nAllUseJinBi = nAllUseJinBi + tHeChengConfig.hechengCost[nLen - 1]
  1267. table.insert(tFuWenList, tFuWenGroup)
  1268. nLen = 0
  1269. tFuWenGroup = {}
  1270. nCheckFuWenID = nil
  1271. print("[fuwenHechengOneClickDo] 插入数据一次")
  1272. end
  1273. end
  1274. if human.db.jinbi < nAllUseJinBi then
  1275. return Broadcast.sendErr(human,Lang.COMMON_NO_JINBI)
  1276. end
  1277. ObjHuman.updateJinbi(human, -nAllUseJinBi, "fuwen_hecheng")
  1278. table.print_lua_table(tFuWenList)
  1279. print("[fuwenHechengOneClickDo] 打印符文数据完成")
  1280. -- 开始进行合成操作
  1281. --local fenjieList, nAllSmeltVal, nAllfenjieJinghua_cnt = {}, 0, 0
  1282. local tMsgData = Msg.gc.GC_FUWEN_HECHENG_ONECLICK
  1283. tMsgData.tSuccess[0] = 0
  1284. for i, v in ipairs(tFuWenList) do
  1285. local nIndex, nIndexLen = v[1], #v
  1286. local fuwenGrid = human.db.fuwenBag[nIndex]
  1287. local nFuWenID = fuwenGrid.id
  1288. local hechengConfig = FuwenExcel.hechengRule[nFuWenID]
  1289. if hechengConfig then
  1290. local nNewFuWenID = hechengConfig.newFuwenID
  1291. local rate = hechengConfig.hechengRate[nIndexLen - 1]
  1292. local randomNum = math.random(1,100)
  1293. for j = 1,nIndexLen do
  1294. local index = v[j]
  1295. del(human, index, "fuwen_hecheng")
  1296. end
  1297. tMsgData.tSuccess[0] = tMsgData.tSuccess[0] + 1
  1298. local msgRet = tMsgData.tSuccess[tMsgData.tSuccess[0]]
  1299. local newFuwenGrid = FuwenGrid.create(nNewFuWenID)
  1300. local newIndex = addByGrid(human, newFuwenGrid, "fuwen_hecheng")
  1301. Grid.makeItem(msgRet, newFuwenGrid.id, 1, nil, newFuwenGrid, newIndex,0)
  1302. local tConfig = FuwenExcel.fuwen[nNewFuWenID]
  1303. if tConfig then
  1304. TriggerLogic.PublishEvent(TriggerDefine.FUWEN_GETQUALITY, human.db._id, tConfig.order, 1)
  1305. end
  1306. end
  1307. end
  1308. print("[fuwenHechengOneClickDo] 发送数据的长度为 "..tMsgData.tSuccess[0])
  1309. Msg.send(tMsgData, human.fd)
  1310. print("[fuwenHechengOneClickDo]发送符文数据结束")
  1311. -- 符文合成回调
  1312. ChengjiuLogic.onCallback(human,ChengjiuDefine.CJ_TASK_TYPE_22, #tFuWenList)
  1313. HeroGrowUp.onCallback(human, HeroGrowUp.TASKTYPE8, #tFuWenList)
  1314. YunYingLogic.onCallBack(human, "onFuwenHecheng", #tFuWenList)
  1315. TriggerLogic.PublishEvent(TriggerDefine.FUWEN_HECHENG, human.db._id, #tFuWenList)
  1316. end