Grid.lua 16 KB

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