FuwenLogic.lua 51 KB

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