Grid.lua 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521
  1. ------------------------------------------------
  2. -- 道具格子
  3. ------------------------------------------------
  4. local HeroExcel = require("excel.hero")
  5. local EquipExcel = require("excel.equip")
  6. local FuwenExcel = require("excel.fuwen")
  7. local SkinExcel = require("excel.skin")
  8. local Util = require("common.Util")
  9. local ItemDefine = require("bag.ItemDefine")
  10. local SuipianLogic = require("bag.SuipianLogic")
  11. local RoleAttr = require("role.RoleAttr")
  12. local EquipLogic = require("equip.EquipLogic")
  13. -- 填充装备,道具信息
  14. function makeItem(net, itemID, itemCnt, shuijingAttrID, itemGrid, itemIndex, opFlag, equipQuality, gemBonus)
  15. local itemConfig = ItemDefine.getConfig(itemID)
  16. net.id = itemConfig and itemID or 0
  17. net.cnt = itemConfig and itemCnt or 0
  18. net.name = itemConfig and itemConfig.name or ""
  19. net.mainType = itemConfig and itemConfig.mainType or 0
  20. net.subType = itemConfig and itemConfig.subType or 0
  21. net.order = itemConfig and itemConfig.order or 0
  22. net.icon = itemConfig and itemConfig.icon or 0
  23. net.desc1 = itemConfig and itemConfig.desc1 or ""
  24. net.desc2 = itemConfig and itemConfig.desc2 or ""
  25. local priceId = itemConfig and itemConfig.price and itemConfig.price[1] or 0
  26. local priceConfig = ItemDefine.getConfig(priceId)
  27. net.priceIcon = priceConfig and priceConfig.icon or 0
  28. net.price = itemConfig and itemConfig.price and itemConfig.price[2] or 0
  29. net.rare = itemConfig and itemConfig.rare or 0
  30. net.score = itemConfig and itemConfig.score or 0
  31. net.getway[0] = (itemConfig and itemConfig.getway) and #itemConfig.getway or 0
  32. for i=1, net.getway[0] do
  33. net.getway[i] = itemConfig.getway[i]
  34. end
  35. net.panelID = itemConfig and itemConfig.panelID or 0
  36. net.isShow = itemConfig and itemConfig.isShow or 0
  37. net.effects = itemConfig and itemConfig.effects or 0
  38. net.opflag = opFlag or getOpflag(itemConfig) or 0
  39. net.suipian = net.suipian or {}
  40. net.equip = net.equip or {}
  41. net.fuwen= net.fuwen or {}
  42. net.suipian[0] = 0
  43. net.equip[0] = 0
  44. net.fuwen[0] = 0
  45. if not itemConfig then return end
  46. makeItemSuipian(net, itemConfig)
  47. makeItemFuwen(net, itemID, itemConfig, itemGrid, itemIndex)
  48. makeItemEquip(net, itemConfig, itemGrid, itemIndex, shuijingAttrID, equipQuality, gemBonus)
  49. end
  50. function makeFuwenSkill(net, skillID)
  51. local skillConfig = FuwenExcel.skill[skillID]
  52. net.skillID = skillID
  53. net.skillIcon = skillConfig.icon
  54. net.skillName = skillConfig.name
  55. net.skillDesc = skillConfig.desc
  56. net.lv = skillConfig.lv
  57. net.isRare = skillConfig.rare or 0
  58. net.isOnlyBinshu = 0
  59. if skillConfig.isBingshuSkill == 1 and skillConfig.isFuwenSkill == 0 then
  60. net.isOnlyBinshu = 1
  61. end
  62. end
  63. function makeItemFuwen(net, itemID, itemConfig, fuwenGrid, fuwenIndex)
  64. if itemConfig.mainType ~= ItemDefine.MAINTYPE_FUWEN then
  65. return
  66. end
  67. local netTemp = nil
  68. if net.fuwen then
  69. net.fuwen[0] = 1
  70. net.fuwen[1] = net.fuwen[1] or {}
  71. netTemp = net.fuwen[1]
  72. else
  73. netTemp = net
  74. end
  75. netTemp.id = itemID
  76. netTemp.index = fuwenIndex or 0
  77. netTemp.fenjieGet = itemConfig.fenjieJinghua
  78. netTemp.refine = 0
  79. netTemp.attrs = netTemp.attrs or {}
  80. netTemp.attrs[0] = 0
  81. netTemp.skills = netTemp.skills or {}
  82. netTemp.skills[0] = 0
  83. netTemp.zhandouli = 0
  84. if fuwenGrid ~= nil then
  85. netTemp.refine = fuwenGrid.refine or 0
  86. local zhandouli = 0
  87. for zz = 1, #fuwenGrid.attr do
  88. local key = fuwenGrid.attr[zz][1]
  89. local value = fuwenGrid.attr[zz][2]
  90. netTemp.attrs[zz] = netTemp.attrs[zz] or {}
  91. netTemp.attrs[zz].key = key
  92. netTemp.attrs[zz].value = value
  93. zhandouli = zhandouli + RoleAttr.getPointByKey(key) * value
  94. end
  95. netTemp.attrs[0] = #fuwenGrid.attr
  96. if fuwenGrid.skill == nil then
  97. netTemp.skills[0] = 0
  98. else
  99. for zz = 1,#fuwenGrid.skill do
  100. local skillID = fuwenGrid.skill[zz]
  101. netTemp.skills[zz] = netTemp.skills[zz] or {}
  102. makeFuwenSkill(netTemp.skills[zz], skillID)
  103. end
  104. netTemp.skills[0] = #fuwenGrid.skill
  105. end
  106. netTemp.zhandouli = math.floor(zhandouli)
  107. end
  108. end
  109. function makeItemEquip(net, itemConfig, equipGrid, equipIndex, shuijingAttrID, equipQuality, gemBonus)
  110. if itemConfig.mainType ~= ItemDefine.MAINTYPE_EQUIP then
  111. return
  112. end
  113. net.equip[0] = 1
  114. net.equip[1] = net.equip[1] or {}
  115. net.equip[1].index = equipIndex or 0
  116. net.equip[1].level = itemConfig.level
  117. net.equip[1].exp = itemConfig.shenqiExp or 0
  118. net.equip[1].star = itemConfig.star or 0
  119. net.equip[1].uuid = equipGrid and equipGrid.uuid or ""
  120. net.equip[1].putUuid = equipGrid and equipGrid.putUuid or ""
  121. net.equip[1].args = net.equip[1].args or {}
  122. net.equip[1].args[0] = 0
  123. local maxQuality = EquipLogic.getEquipMaxQuality(itemConfig)
  124. net.rare = equipGrid and equipGrid.quality or equipQuality or maxQuality
  125. -- 装备基础属性
  126. if itemConfig.subType == ItemDefine.EQUIP_SUBTYPE_SHUIJIN then
  127. -- 水晶属性
  128. net.equip[1].attr = net.equip[1].attr or {}
  129. net.equip[1].attr[0] = 0
  130. net.equip[1].args[0] = 1
  131. local upcf = EquipExcel.shuijingUpNeed[net.id]
  132. net.equip[1].args[1] = (not upcf or upcf.nextID < 1) and 1 or 0 -- 是否满级
  133. if shuijingAttrID then
  134. local shuijingConfig = EquipExcel.shuijingAttr[shuijingAttrID]
  135. local shuijingAttrTB = shuijingConfig.attr
  136. net.equip[1].attr[0] = #shuijingAttrTB
  137. for i=1, net.equip[1].attr[0] do
  138. net.equip[1].attr[i] = net.equip[1].attr[i] or {}
  139. net.equip[1].attr[i].key = shuijingAttrTB[i][1]
  140. net.equip[1].attr[i].value = shuijingAttrTB[i][2]
  141. end
  142. end
  143. else
  144. local baseRate = EquipLogic.getEquipBaseRate(net.rare)
  145. net.score = math.floor(net.score * baseRate)
  146. -- 基础属性
  147. net.equip[1].baseAttr = {}
  148. net.equip[1].baseAttr[0] = #itemConfig.base
  149. --宝石
  150. net.equip[1].gemBaseAttr[0] = 0
  151. if gemBonus then
  152. net.equip[1].gemBaseAttr[0] = #itemConfig.base
  153. end
  154. for i=1, net.equip[1].baseAttr[0] do
  155. net.equip[1].baseAttr[i] = net.equip[1].baseAttr[i] or {}
  156. net.equip[1].baseAttr[i].key = itemConfig.base[i][1]
  157. net.equip[1].baseAttr[i].value = math.floor(itemConfig.base[i][2] * baseRate)
  158. if gemBonus then
  159. net.equip[1].gemBaseAttr[i].key = itemConfig.base[i][1]
  160. net.equip[1].gemBaseAttr[i].value = math.floor(itemConfig.base[i][2] * baseRate * gemBonus.base)
  161. end
  162. end
  163. -- 随机属性
  164. local attrLen = 0
  165. net.equip[1].tzAttr = net.equip[1].tzAttr or {}
  166. if equipGrid then
  167. EquipLogic.checkAttr(equipGrid)
  168. for key, value in pairs(equipGrid.attr) do
  169. attrLen = attrLen + 1
  170. net.equip[1].tzAttr[attrLen] = net.equip[1].tzAttr[attrLen] or {}
  171. net.equip[1].tzAttr[attrLen].key = key
  172. net.equip[1].tzAttr[attrLen].value = math.floor(value * baseRate)
  173. end
  174. else
  175. local randomAttr = EquipLogic.getEquipTzAttr(itemConfig)
  176. if randomAttr then
  177. for _, attr in pairs(randomAttr) do
  178. attrLen = attrLen + 1
  179. net.equip[1].tzAttr[attrLen] = net.equip[1].tzAttr[attrLen] or {}
  180. net.equip[1].tzAttr[attrLen].key = attr[1]
  181. net.equip[1].tzAttr[attrLen].value = attr[2]
  182. end
  183. end
  184. end
  185. net.equip[1].tzAttr[0] = attrLen
  186. end
  187. if itemConfig.subType == ItemDefine.EQUIP_SUBTYPE_SHENQI then
  188. local shenqiUpNeedConfig = EquipExcel.shenqiUpNeed[net.id]
  189. local nextID = shenqiUpNeedConfig and shenqiUpNeedConfig.nextID
  190. net.equip[1].args = net.equip[1].args or {}
  191. net.equip[1].args[0] = 1
  192. net.equip[1].args[1] = (not nextID or nextID < 1) and 1 or 0
  193. end
  194. -- 装备套装属性
  195. net.equip[1].suit = net.equip[1].suit or {}
  196. net.equip[1].suit[0] = 0
  197. if itemConfig.suitIm then
  198. net.equip[1].suit = net.equip[1].suit or {}
  199. net.equip[1].suit[0] = 1
  200. net.equip[1].suit[1] = net.equip[1].suit[1] or {}
  201. net.equip[1].suit[1].attr = net.equip[1].suit[1].attr or {}
  202. net.equip[1].suit[1].attr[0] = #itemConfig.suitIm
  203. net.equip[1].suit[1].gemAttr[0] = 0
  204. if gemBonus then
  205. net.equip[1].suit[1].gemAttr[0] = #itemConfig.suitIm
  206. end
  207. for i=1,net.equip[1].suit[1].attr[0] do
  208. net.equip[1].suit[1].attr[i] = net.equip[1].suit[1].attr[i] or {}
  209. net.equip[1].suit[1].attr[i].key = itemConfig.suitIm[i][1]
  210. net.equip[1].suit[1].attr[i].value = itemConfig.suitIm[i][2]
  211. --宝石
  212. if gemBonus and gemBonus[i+1] then
  213. net.equip[1].suit[1].gemAttr[i] = net.equip[1].suit[1].gemAttr[i] or {}
  214. net.equip[1].suit[1].gemAttr[i].key = itemConfig.suitIm[i][1]
  215. --这里i+1的原因是,装备套装属性配置suitIm中, idx为1的value是2件套加成, idx为2的是3件套加成,以此类推
  216. net.equip[1].suit[1].gemAttr[i].value = gemBonus[i+1] * 100 --转成百分比发给客户端
  217. end
  218. end
  219. net.equip[1].suit[1].id = itemConfig.suit
  220. net.equip[1].suit[1].name = itemConfig.suitName
  221. net.equip[1].suit[1].num = itemConfig.suitNum
  222. end
  223. -- 装备职业专属属性
  224. net.equip[1].job = itemConfig.job
  225. net.equip[1].jobAttr = net.equip[1].jobAttr or {}
  226. net.equip[1].jobAttr[0] = #itemConfig.jobAttr
  227. for i = 1, net.equip[1].jobAttr[0] do
  228. net.equip[1].jobAttr[i] = net.equip[1].jobAttr[i] or {}
  229. net.equip[1].jobAttr[i].key = itemConfig.jobAttr[i][1]
  230. net.equip[1].jobAttr[i].value = itemConfig.jobAttr[i][2]
  231. end
  232. -- 装备阵营专属属性
  233. net.equip[1].camp = itemConfig.camp
  234. net.equip[1].campAttr = net.equip[1].campAttr or {}
  235. net.equip[1].campAttr[0] = #itemConfig.campAttr
  236. for i = 1, net.equip[1].campAttr[0] do
  237. net.equip[1].campAttr[i] = net.equip[1].campAttr[i] or {}
  238. net.equip[1].campAttr[i].key = itemConfig.campAttr[i][1]
  239. net.equip[1].campAttr[i].value = itemConfig.campAttr[i][2]
  240. end
  241. end
  242. -- 封装碎片信息 Suipian
  243. function makeItemSuipian(net, itemConfig)
  244. if itemConfig.mainType ~= ItemDefine.MAINTYPE_ITEM then
  245. return
  246. end
  247. if itemConfig.subType ~= ItemDefine.ITEM_SUBTYPE_SUIPIAN and
  248. itemConfig.subType ~= ItemDefine.ITEM_SUBTYPE_SUIPIAN_SKIN and
  249. itemConfig.subType ~= ItemDefine.ITEM_SUBTYPE_SUIPIAN_TALISMAM then
  250. return
  251. end
  252. net.suipian[0] = 1
  253. net.suipian[1] = net.suipian[1] or {}
  254. net.suipian[1].fullcnt = itemConfig.fullCnt
  255. net.suipian[1].get = itemConfig.get[1] or 0
  256. if itemConfig.subType == ItemDefine.ITEM_SUBTYPE_SUIPIAN or itemConfig.subType == ItemDefine.ITEM_SUBTYPE_SUIPIAN_SKIN then
  257. net.suipian[1].camp = itemConfig.cond[1] or 0
  258. net.suipian[1].star = itemConfig.cond[2] or 0
  259. local heroID = itemConfig.get[3]
  260. local heroConfig = HeroExcel.hero[heroID]
  261. net.suipian[1].grade = heroConfig and heroConfig.grade or 0
  262. if itemConfig.get[1] == SuipianLogic.SUMMON_TYPE_TARGET then
  263. local dropType = itemConfig.get[2]
  264. if dropType == SuipianLogic.SUMMON_SUBTYPE_HERO then
  265. local heroID = itemConfig.get[3]
  266. local heroConfig = HeroExcel.hero[heroID]
  267. if heroConfig then
  268. net.suipian[1].camp = heroConfig.camp
  269. net.suipian[1].star = heroConfig.star
  270. net.icon = heroConfig.head
  271. end
  272. end
  273. end
  274. elseif itemConfig.subType == ItemDefine.ITEM_SUBTYPE_SUIPIAN_TALISMAM then
  275. net.suipian[1].camp = 0
  276. net.suipian[1].star = 0
  277. net.suipian[1].grade = itemConfig.rare or 0
  278. end
  279. end
  280. --------------------------------------------- 可操作 -------------------------------------------------------
  281. -- 可操作行为
  282. function getOpflagAtBag(id)
  283. local itemConfig = ItemDefine.getConfig(id)
  284. if not itemConfig then return flag end
  285. if itemConfig then
  286. itemConfig.id = id
  287. end
  288. local flag = 0
  289. -- 使用道具
  290. if canUse(itemConfig) then
  291. flag = Util.setBit(flag, ItemDefine.ITEM_OP_USE)
  292. end
  293. -- 使用箱子
  294. if canUseBox(itemConfig) then
  295. flag = Util.setBit(flag, ItemDefine.ITEM_OP_USE_BOX)
  296. end
  297. -- 批量使用
  298. if canUseBatch(itemConfig) then
  299. flag = Util.setBit(flag, ItemDefine.ITEM_OP_USE_BATCH)
  300. end
  301. -- 详情
  302. if canDetail(itemConfig) then
  303. flag = Util.setBit(flag, ItemDefine.ITEM_OP_DETAIL)
  304. end
  305. -- 是否可出售
  306. if canSell(itemConfig) then
  307. flag = Util.setBit(flag, ItemDefine.ITEM_OP_SELL)
  308. end
  309. -- 是否用来源
  310. if canSource(itemConfig) then
  311. flag = Util.setBit(flag, ItemDefine.ITEM_OP_SOURCE)
  312. end
  313. -- 是否可以合成
  314. if canHeCheng(itemConfig) then
  315. flag = Util.setBit(flag, ItemDefine.ITEM_OP_HECHENG)
  316. end
  317. -- 能否穿戴
  318. if canEquip(itemConfig) then
  319. flag = Util.setBit(flag, ItemDefine.ITEM_OP_EQUIP)
  320. end
  321. -- 能否重铸
  322. if canCZhu(itemConfig) then
  323. flag = Util.setBit(flag, ItemDefine.ITEM_OP_CZHU)
  324. end
  325. -- 能否分解
  326. if canFJie(itemConfig) then
  327. flag = Util.setBit(flag, ItemDefine.ITEM_OP_FJIE)
  328. end
  329. return flag
  330. end
  331. function getOpflag(itemConfig)
  332. local flag = 0
  333. if not itemConfig then return flag end
  334. -- 预览
  335. if canYulan(itemConfig) then
  336. flag = Util.setBit(flag, ItemDefine.ITEM_OP_YULAN)
  337. end
  338. -- 是否用来源
  339. if canSource(itemConfig) then
  340. flag = Util.setBit(flag, ItemDefine.ITEM_OP_SOURCE)
  341. end
  342. return flag
  343. end
  344. -- 可否使用
  345. function canUse(itemConfig)
  346. if not itemConfig then return end
  347. if not itemConfig.panelID then return end
  348. return itemConfig.panelID > 0
  349. end
  350. -- 可否使用
  351. function canUseBox(itemConfig)
  352. if not itemConfig then return end
  353. if not itemConfig.cmd then return end
  354. local cmdstr = itemConfig.cmd[1]
  355. if not cmdstr then return end
  356. if cmdstr == "box" then
  357. return true
  358. end
  359. end
  360. -- 是否可出售
  361. function canSell(itemConfig)
  362. if not itemConfig then return end
  363. if not itemConfig.price then return end
  364. return #itemConfig.price > 0
  365. end
  366. -- 是否可出售
  367. function canSource(itemConfig)
  368. if not itemConfig then return end
  369. if not itemConfig.getway then return end
  370. return #itemConfig.getway > 0
  371. end
  372. -- 可否批量使用
  373. function canUseBatch(itemConfig)
  374. if not itemConfig then return end
  375. if not itemConfig.cmd then return end
  376. local cmdstr = itemConfig.cmd[1]
  377. if not cmdstr then return end
  378. if cmdstr == "box" then
  379. return
  380. end
  381. return true
  382. end
  383. -- 可否预览
  384. function canYulan(itemConfig)
  385. if not itemConfig then return end
  386. local cmdStr = itemConfig.cmd and itemConfig.cmd[1]
  387. if cmdStr and cmdStr == "box" then
  388. return true
  389. end
  390. --[[local getWay = itemConfig.get and itemConfig.get[1]
  391. if getWay == SuipianLogic.SUMMON_TYPE_DROP or
  392. getWay == SuipianLogic.SUMMON_TYPE_HERO_SP or
  393. getWay == SuipianLogic.SUMMON_TYPE_SHENQI_SP then
  394. local suipianType = itemConfig.get[2]
  395. if suipianType == SuipianLogic.SUMMON_SUBTYPE_HERO or
  396. suipianType == SuipianLogic.SUMMON_SUBTYPE_EQUIP then
  397. return true
  398. end
  399. end]]
  400. end
  401. -- 可否查看英雄详情
  402. function canDetail(itemConfig)
  403. local getWay = itemConfig.get and itemConfig.get[1]
  404. if getWay == SuipianLogic.SUMMON_TYPE_TARGET then
  405. local suipianType = itemConfig.get[2]
  406. if suipianType == SuipianLogic.SUMMON_SUBTYPE_HERO then
  407. local heroID = itemConfig.get[3]
  408. if HeroExcel.hero[heroID] then
  409. return true
  410. end
  411. end
  412. if suipianType == SuipianLogic.SUMMON_SUBTYPE_SKIN then
  413. local skinID = itemConfig.get[3]
  414. if SkinExcel.skin[skinID] then
  415. return true
  416. end
  417. end
  418. end
  419. end
  420. -- 可否合成
  421. function canHeCheng(itemConfig)
  422. local getWay = itemConfig.get and itemConfig.get[1]
  423. if getWay == SuipianLogic.SUMMON_TYPE_TARGET or getWay == SuipianLogic.SUMMON_TYPE_DROP then
  424. local suipianType = itemConfig.get[2]
  425. if suipianType == SuipianLogic.SUMMON_SUBTYPE_HERO then
  426. return true
  427. end
  428. if suipianType == SuipianLogic.SUMMON_SUBTYPE_SKIN then
  429. return true
  430. end
  431. if suipianType == SuipianLogic.SUMMON_SUBTYPE_TALISAM then
  432. return true
  433. end
  434. end
  435. if ItemDefine.isFuwen(itemConfig.id) then
  436. return true
  437. end
  438. end
  439. -- 可否穿戴
  440. function canEquip(itemConfig)
  441. if ItemDefine.isEquip(itemConfig.id) then
  442. return true
  443. end
  444. if ItemDefine.isFuwen(itemConfig.id) then
  445. return true
  446. end
  447. end
  448. -- 可否重铸
  449. function canCZhu(itemConfig)
  450. if ItemDefine.isFuwen(itemConfig.id) then
  451. return true
  452. end
  453. end
  454. -- 可否重铸
  455. function canFJie(itemConfig)
  456. if ItemDefine.isFuwen(itemConfig.id) then
  457. return true
  458. end
  459. end