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. fuwen.skill = fuwen.skillTemp
  911. fuwen.skillTemp = nil
  912. local skillLockList = fuwen.skillLockList
  913. if skillLockList and next(skillLockList) then
  914. -- local posList = {}
  915. -- for _,skillPos in pairs(skillLockList) do
  916. -- posList[skillPos] = 1
  917. -- end
  918. skillLockList = {}
  919. for skillPos, skillId in ipairs(fuwen.skill) do
  920. -- if posList[skillPos] then
  921. skillLockList[skillId] = skillPos
  922. -- end
  923. end
  924. fuwen.skillLockList = skillLockList
  925. end
  926. else
  927. --Log.write(Log.LOGID_DEBUG, human.db._id, human.db.account, human.db.name, human.db.lv, fuwen.id,"refreshsave skillTemp is empty")
  928. Log.write(Log.LOGID_DEBUG, human.db._id, human.db.newUniqueTag, human.db.name, human.db.lv, fuwen.id,"refreshsave skillTemp is empty")
  929. end
  930. end
  931. Broadcast.sendErr(human,Lang.FUWEN_SAVE_SUCCESS)
  932. if fuwenIndex == -1 then
  933. ObjHuman.doCalcHero(human,heroIndex)
  934. HeroLogic.sendHeroBagDynamic(human, heroID, heroIndex)
  935. HeroEquip.query(human, heroID, heroIndex)
  936. else
  937. sendFuwenItemChange(human, fuwenIndex, fuwen, FuwenDefine.FUWEN_BAG_OP_ADD)
  938. end
  939. fuwenRefreshQuery(human,fuwenID,fuwenIndex,pos,heroID,heroIndex)
  940. end
  941. -- 符文兑换查询
  942. function fuwenExchangeQuery(human)
  943. local msgRet = Msg.gc.GC_FUWEN_EXCHANGE_QUERY
  944. local gridTemp = FuwenGrid.create(FuwenDefine.FUWEN_EXCHANGE_ID)
  945. Grid.makeItem(msgRet.fuwen, gridTemp.id, 1, nil, gridTemp, 1)
  946. Msg.send(msgRet,human.fd)
  947. end
  948. -- 符文格子解锁
  949. function fuwenGridUnlock(human,heroID,heroIndex,pos)
  950. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  951. if heroGrid == nil then
  952. return
  953. end
  954. if heroGrid.fuwen ~= nil and heroGrid.fuwen[pos] ~= nil then
  955. return
  956. end
  957. if pos == 1 then
  958. if heroGrid.lv < 100 then
  959. else
  960. heroGrid.fuwen = heroGrid.fuwen or {}
  961. heroGrid.fuwen[1] = {}
  962. end
  963. elseif pos == 2 then
  964. if heroGrid.star < 7 then
  965. else
  966. heroGrid.fuwen = heroGrid.fuwen or {}
  967. heroGrid.fuwen[2] = {}
  968. end
  969. end
  970. end
  971. function wrapFuwenAttrNet(net,fuwenConf)
  972. local len = 0
  973. for _,attr in ipairs(fuwenConf.absAttrPool) do
  974. len = len + 1
  975. net.base_attrs[len].key = attr[1]
  976. net.base_attrs[len].value = attr[2]
  977. end
  978. net.base_attrs[0] = len
  979. local len2 = 0
  980. for _, attr in ipairs(fuwenConf.percentAttrPool) do
  981. len2 = len2 + 1
  982. net.percent_attrs[len2].key = attr[1]
  983. net.percent_attrs[len2].value = attr[2]
  984. end
  985. net.percent_attrs[0] = len2
  986. end
  987. -- 符文属性查询
  988. function CG_FUWEN_ATTR_QUERY(human,fuwenID)
  989. if fuwenID == nil then
  990. return Broadcast.sendErr(human,Lang.FUWEN_ITEMID_ERR)
  991. end
  992. local fuwenConfig = FuwenExcel.fuwen[fuwenID]
  993. if fuwenConfig == nil then
  994. return
  995. end
  996. local msgRet = Msg.gc.GC_FUWEN_ATTR_QUERY
  997. wrapFuwenAttrNet(msgRet,fuwenConfig)
  998. Msg.send(msgRet,human.fd)
  999. end
  1000. -- 符文精炼预览
  1001. function fuwenRefinePreview(human)
  1002. local fuwenGrid = {}
  1003. fuwenGrid = FuwenGrid.create(FuwenDefine.FUWEN_REFINE_ID)
  1004. local msgRet = Msg.gc.GC_FUWEN_REFINE_PREVIEW_QUERY
  1005. Grid.makeItem(msgRet.fuwen, fuwenGrid.id, 1, nil, fuwenGrid, 1)
  1006. Msg.send(msgRet,human.fd)
  1007. end
  1008. -- 符文精炼查询
  1009. function fuwenRefineQuery(human,fuwenID,fuwenIndex,pos,heroID,heroIndex)
  1010. local fuwen = nil
  1011. if fuwenIndex == -1 then
  1012. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  1013. if heroGrid == nil then
  1014. return Broadcast.sendErr(human,Lang.FUWEN_HERO_GRID_ERR)
  1015. end
  1016. if heroGrid.fuwen == nil or heroGrid.fuwen[pos] == nil then
  1017. return Broadcast.sendErr(human,Lang.FUWEN_PUTOFF_ERR)
  1018. end
  1019. fuwen = heroGrid.fuwen[pos]
  1020. else
  1021. fuwen = human.db.fuwenBag[fuwenIndex]
  1022. end
  1023. if fuwen == nil or fuwen.id == nil then
  1024. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_FILL_ERR) -- 材料不存在
  1025. end
  1026. if fuwen.id ~= fuwenID then
  1027. return Broadcast.sendErr(human,Lang.FUWEN_ID_ERR)
  1028. end
  1029. if FuwenExcel.fuwen[fuwen.id].refine ~= 1 then
  1030. return
  1031. end
  1032. local jinglianExcel = FuwenExcel.jinglian
  1033. local refine = fuwen.refine or 0
  1034. local refineExcel = jinglianExcel[refine + 1]
  1035. -- 构造预览符文
  1036. local previewFuwen = Util.copyTable(fuwen)
  1037. previewFuwen.refine = refine + 1
  1038. if refine == 0 then
  1039. -- 第1次精炼
  1040. local newValue = previewFuwen.attr[1][2] * 2
  1041. previewFuwen.attr[1][2] = newValue
  1042. elseif refine == 1 then
  1043. -- 第2次精炼
  1044. local fuwenConfig = FuwenExcel.fuwen[fuwen.id]
  1045. cnt = #fuwenConfig.percentAttrPool
  1046. if cnt > 0 then
  1047. local randIndex = math.random(1, cnt)
  1048. local attrKey = fuwenConfig.percentAttrPool[randIndex][1]
  1049. local attrVal = fuwenConfig.percentAttrPool[randIndex][2]
  1050. previewFuwen.attr[3] = {attrKey, attrVal}
  1051. end
  1052. elseif refine == 2 then
  1053. -- 第3次精炼
  1054. local skillConfig = FuwenExcel.skill
  1055. local skillLen = #previewFuwen.skill
  1056. for i = 1,skillLen do
  1057. local skillID = previewFuwen.skill[i]
  1058. local skillLv = skillConfig[skillID].lv
  1059. if skillLv < 3 then
  1060. skillID = skillID + 1000
  1061. end
  1062. previewFuwen.skill[i] = skillID
  1063. end
  1064. previewFuwen.id = fuwen.id + 1
  1065. end
  1066. -- 发数据
  1067. local msgRet = Msg.gc.GC_FUWEN_REFINE_QUERY
  1068. Grid.makeItem(msgRet.fuwen,previewFuwen.id, 1, nil,previewFuwen, 1)
  1069. local expendLen = #refineExcel.expend
  1070. for i = 1,expendLen do
  1071. Grid.makeItem(msgRet.expend[i],refineExcel.expend[i][1],refineExcel.expend[i][2])
  1072. end
  1073. msgRet.expend[0] = expendLen
  1074. local jinglianLen = #jinglianExcel
  1075. for i = 1,jinglianLen do
  1076. msgRet.refineDesc[i].desc = jinglianExcel[i].desc
  1077. end
  1078. msgRet.refineDesc[0] = jinglianLen
  1079. Msg.send(msgRet,human.fd)
  1080. end
  1081. -- 符文精炼
  1082. function fuwenRefineDo(human,fuwenID,fuwenIndex,pos,heroID,heroIndex)
  1083. local fuwen = nil
  1084. if fuwenIndex == -1 then
  1085. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  1086. if heroGrid == nil then
  1087. return Broadcast.sendErr(human,Lang.FUWEN_HERO_GRID_ERR)
  1088. end
  1089. if heroGrid.fuwen == nil or heroGrid.fuwen[pos] == nil then
  1090. return Broadcast.sendErr(human,Lang.FUWEN_PUTOFF_ERR)
  1091. end
  1092. fuwen = heroGrid.fuwen[pos]
  1093. else
  1094. fuwen = human.db.fuwenBag[fuwenIndex]
  1095. end
  1096. if fuwen == nil or fuwen.id == nil then
  1097. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_FILL_ERR) -- 材料不存在
  1098. end
  1099. if fuwen.id ~= fuwenID then
  1100. return Broadcast.sendErr(human,Lang.FUWEN_ID_ERR)
  1101. end
  1102. if FuwenExcel.fuwen[fuwen.id].refine ~= 1 then
  1103. return
  1104. end
  1105. local newRefine = fuwen.refine or 0
  1106. newRefine = newRefine + 1
  1107. local jinglianExcel = FuwenExcel.jinglian
  1108. local refineExcel = jinglianExcel[newRefine]
  1109. local expendLen = #refineExcel.expend
  1110. for i = 1,expendLen do
  1111. local v = refineExcel.expend[i]
  1112. local haveCnt = BagLogic.getItemCnt(human,v[1])
  1113. if haveCnt < v[2] then
  1114. return Broadcast.sendErr(human,Lang.FUWEN_REFRESH_FILL_ERR) -- 材料不够
  1115. end
  1116. end
  1117. --删除材料
  1118. for i = 1,expendLen do
  1119. local v = refineExcel.expend[i]
  1120. BagLogic.delItem(human, v[1], v[2], "fuwen_refine")
  1121. end
  1122. if newRefine == 1 then
  1123. -- 第1次精炼
  1124. fuwen.refine = newRefine
  1125. local newValue = fuwen.attr[1][2] * 2
  1126. fuwen.attr[1][2] = newValue
  1127. elseif newRefine == 2 then
  1128. -- 第2次精炼
  1129. fuwen.refine = newRefine
  1130. local fuwenConfig = FuwenExcel.fuwen[fuwen.id]
  1131. cnt = #fuwenConfig.percentAttrPool
  1132. if cnt > 0 then
  1133. local randIndex = math.random(1, cnt)
  1134. local attrKey = fuwenConfig.percentAttrPool[randIndex][1]
  1135. local attrVal = fuwenConfig.percentAttrPool[randIndex][2]
  1136. fuwen.attr[3] = {attrKey, attrVal}
  1137. end
  1138. elseif newRefine == 3 then
  1139. -- 第3次精炼
  1140. fuwen.refine = newRefine
  1141. local skillConfig = FuwenExcel.skill
  1142. local skillLen = #fuwen.skill
  1143. for i = 1,skillLen do
  1144. local skillID = fuwen.skill[i]
  1145. local skillLv = skillConfig[skillID].lv
  1146. if skillLv < 4 then
  1147. skillID = skillID + 1000
  1148. end
  1149. fuwen.skill[i] = skillID
  1150. end
  1151. fuwen.id = fuwen.id + 1
  1152. fuwen.refine = 0
  1153. -- 变成神话特殊判断
  1154. local tConfig = FuwenExcel.fuwen[fuwen.id]
  1155. if tConfig and tConfig.order == 6 then
  1156. TriggerLogic.PublishEvent(TriggerDefine.FUWEN_GETQUALITY, human.db._id, tConfig.order, 1)
  1157. end
  1158. else
  1159. return
  1160. end
  1161. if fuwenIndex == -1 then
  1162. ObjHuman.doCalcHero(human,heroIndex)
  1163. HeroLogic.sendHeroBagDynamic(human, heroID, heroIndex)
  1164. HeroEquip.query(human, heroID, heroIndex)
  1165. else
  1166. sendFuwenItemChange(human, fuwenIndex, fuwen, FuwenDefine.FUWEN_BAG_OP_ADD)
  1167. end
  1168. local msgRet = Msg.gc.GC_FUWEN_REFINE_DO
  1169. Grid.makeItem(msgRet.fuwen,fuwen.id, 1,nil, fuwen, 1)
  1170. Msg.send(msgRet,human.fd)
  1171. end
  1172. -- 是否有符文红点
  1173. function isFuwenDot(human, heroGrid)
  1174. if not heroGrid then return end
  1175. local heroConfig = HeroExcel[heroGrid.id]
  1176. if not heroConfig then return end
  1177. if human.db.lv < 9 then
  1178. return false
  1179. end
  1180. local haveFuwen = nil
  1181. local emptyCnt = FuwenGrid.getEmptyCnt(human)
  1182. if emptyCnt < FuwenDefine.FUWEN_BAG_MAX_CNT then
  1183. haveFuwen = true
  1184. end
  1185. for pos = 1, 2 do
  1186. local fuwenGrid = heroGrid.fuwen and heroGrid.fuwen[pos]
  1187. if fuwenGrid ~= nil and fuwenGrid.id == nil and haveFuwen then
  1188. return true
  1189. end
  1190. end
  1191. end
  1192. -- 是否有装备红点
  1193. function isFuwenDotByPos(human, heroGrid, pos)
  1194. if not heroGrid then return end
  1195. local heroConfig = HeroExcel[heroGrid.id]
  1196. if not heroConfig then return end
  1197. local haveFuwen = nil
  1198. local emptyCnt = FuwenGrid.getEmptyCnt(human)
  1199. if emptyCnt < FuwenDefine.FUWEN_BAG_MAX_CNT then
  1200. haveFuwen = true
  1201. end
  1202. local fuwenGrid = heroGrid.fuwen and heroGrid.fuwen[pos]
  1203. if fuwenGrid ~= nil and fuwenGrid.id == nil and haveFuwen then
  1204. return true
  1205. end
  1206. end
  1207. function sendFuwenGetWay(human)
  1208. local msgRet = Msg.gc.GC_FUWEN_GET_WAY_QUERY
  1209. local fuwenGrid = FuwenGrid.create(80001)
  1210. local hechengConfig = FuwenExcel.hechengRule[80001]
  1211. Grid.makeItem(msgRet.newFuwen, 80001, 1, nil, fuwenGrid, 1)
  1212. msgRet.desc1 = hechengConfig.desc1
  1213. msgRet.desc2 = hechengConfig.desc2
  1214. Msg.send(msgRet,human.fd)
  1215. end
  1216. function fuwenHechengOneClickDo(human, tFuwenIndex)
  1217. -- 没买卡
  1218. if 0 == Abs365CardLogic.IsBuyCard(human) then
  1219. return
  1220. end
  1221. -- 等级不够
  1222. if human.db.lv < 30 then
  1223. return
  1224. end
  1225. local nAllLen = tFuwenIndex[0]
  1226. if nAllLen < 2 or nAllLen % 5 ~= 0 then
  1227. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_CNR_ERR)
  1228. end
  1229. local tFuWenList, tCheckIndex = {}, {}
  1230. local tFuWenGroup, nCheckFuWenID = {}, nil
  1231. local nLen, nAllUseJinBi = 0, 0
  1232. -- 检查一下是否有重复
  1233. for i = 1, nAllLen, 1 do
  1234. nLen = nLen + 1
  1235. local nIndex = tFuwenIndex[i]
  1236. if tCheckIndex[nIndex] then
  1237. print("[fuwenHechengOneClickDo] 存在重复的 nIndex = "..nIndex)
  1238. return
  1239. end
  1240. -- 背包中没有该符文
  1241. if human.db.fuwenBag[nIndex] == nil then
  1242. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_FILL_ERR)
  1243. end
  1244. -- 校验材料是否相同
  1245. local fuwenGrid = human.db.fuwenBag[nIndex]
  1246. if nCheckFuWenID == nil then
  1247. nCheckFuWenID = fuwenGrid.id
  1248. else
  1249. if nCheckFuWenID ~= fuwenGrid.id then
  1250. return Broadcast.sendErr(human,Lang.FUWEN_ID_ERR)
  1251. end
  1252. end
  1253. tCheckIndex[nIndex] = true
  1254. table.insert(tFuWenGroup, nIndex)
  1255. if nLen == 5 then
  1256. -- 一组完成,检查一下对应的配置
  1257. local tHeChengConfig = FuwenExcel.hechengRule[nCheckFuWenID]
  1258. if not tHeChengConfig then
  1259. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_CONFIG_ERR)
  1260. end
  1261. -- 校验是否达到合成限制等级
  1262. if tHeChengConfig.limit > human.db.lv then
  1263. return Broadcast.sendErr(human,Util.format(Lang.ROLE_LV_TOO_LOW, tHeChengConfig.limit))
  1264. end
  1265. nAllUseJinBi = nAllUseJinBi + tHeChengConfig.hechengCost[nLen - 1]
  1266. table.insert(tFuWenList, tFuWenGroup)
  1267. nLen = 0
  1268. tFuWenGroup = {}
  1269. nCheckFuWenID = nil
  1270. print("[fuwenHechengOneClickDo] 插入数据一次")
  1271. end
  1272. end
  1273. if human.db.jinbi < nAllUseJinBi then
  1274. return Broadcast.sendErr(human,Lang.COMMON_NO_JINBI)
  1275. end
  1276. ObjHuman.updateJinbi(human, -nAllUseJinBi, "fuwen_hecheng")
  1277. table.print_lua_table(tFuWenList)
  1278. print("[fuwenHechengOneClickDo] 打印符文数据完成")
  1279. -- 开始进行合成操作
  1280. --local fenjieList, nAllSmeltVal, nAllfenjieJinghua_cnt = {}, 0, 0
  1281. local tMsgData = Msg.gc.GC_FUWEN_HECHENG_ONECLICK
  1282. tMsgData.tSuccess[0] = 0
  1283. for i, v in ipairs(tFuWenList) do
  1284. local nIndex, nIndexLen = v[1], #v
  1285. local fuwenGrid = human.db.fuwenBag[nIndex]
  1286. local nFuWenID = fuwenGrid.id
  1287. local hechengConfig = FuwenExcel.hechengRule[nFuWenID]
  1288. if hechengConfig then
  1289. local nNewFuWenID = hechengConfig.newFuwenID
  1290. local rate = hechengConfig.hechengRate[nIndexLen - 1]
  1291. local randomNum = math.random(1,100)
  1292. for j = 1,nIndexLen do
  1293. local index = v[j]
  1294. del(human, index, "fuwen_hecheng")
  1295. end
  1296. tMsgData.tSuccess[0] = tMsgData.tSuccess[0] + 1
  1297. local msgRet = tMsgData.tSuccess[tMsgData.tSuccess[0]]
  1298. local newFuwenGrid = FuwenGrid.create(nNewFuWenID)
  1299. local newIndex = addByGrid(human, newFuwenGrid, "fuwen_hecheng")
  1300. Grid.makeItem(msgRet, newFuwenGrid.id, 1, nil, newFuwenGrid, newIndex,0)
  1301. local tConfig = FuwenExcel.fuwen[nNewFuWenID]
  1302. if tConfig then
  1303. TriggerLogic.PublishEvent(TriggerDefine.FUWEN_GETQUALITY, human.db._id, tConfig.order, 1)
  1304. end
  1305. end
  1306. end
  1307. print("[fuwenHechengOneClickDo] 发送数据的长度为 "..tMsgData.tSuccess[0])
  1308. Msg.send(tMsgData, human.fd)
  1309. print("[fuwenHechengOneClickDo]发送符文数据结束")
  1310. -- 符文合成回调
  1311. ChengjiuLogic.onCallback(human,ChengjiuDefine.CJ_TASK_TYPE_22, #tFuWenList)
  1312. HeroGrowUp.onCallback(human, HeroGrowUp.TASKTYPE8, #tFuWenList)
  1313. YunYingLogic.onCallBack(human, "onFuwenHecheng", #tFuWenList)
  1314. TriggerLogic.PublishEvent(TriggerDefine.FUWEN_HECHENG, human.db._id, #tFuWenList)
  1315. end