Grid.lua 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510
  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 then
  249. return
  250. end
  251. net.suipian[0] = 1
  252. net.suipian[1] = net.suipian[1] or {}
  253. net.suipian[1].fullcnt = itemConfig.fullCnt
  254. net.suipian[1].camp = itemConfig.cond[1] or 0
  255. net.suipian[1].star = itemConfig.cond[2] or 0
  256. net.suipian[1].get = itemConfig.get[1] or 0
  257. local heroID = itemConfig.get[3]
  258. local heroConfig = HeroExcel.hero[heroID]
  259. net.suipian[1].grade = heroConfig and heroConfig.grade or 0
  260. if itemConfig.get[1] == SuipianLogic.SUMMON_TYPE_TARGET then
  261. local dropType = itemConfig.get[2]
  262. if dropType == SuipianLogic.SUMMON_SUBTYPE_HERO then
  263. local heroID = itemConfig.get[3]
  264. local heroConfig = HeroExcel.hero[heroID]
  265. if heroConfig then
  266. net.suipian[1].camp = heroConfig.camp
  267. net.suipian[1].star = heroConfig.star
  268. net.icon = heroConfig.head
  269. end
  270. end
  271. end
  272. end
  273. --------------------------------------------- 可操作 -------------------------------------------------------
  274. -- 可操作行为
  275. function getOpflagAtBag(id)
  276. local itemConfig = ItemDefine.getConfig(id)
  277. if not itemConfig then return flag end
  278. if itemConfig then
  279. itemConfig.id = id
  280. end
  281. local flag = 0
  282. -- 使用道具
  283. if canUse(itemConfig) then
  284. flag = Util.setBit(flag, ItemDefine.ITEM_OP_USE)
  285. end
  286. -- 使用箱子
  287. if canUseBox(itemConfig) then
  288. flag = Util.setBit(flag, ItemDefine.ITEM_OP_USE_BOX)
  289. end
  290. -- 批量使用
  291. if canUseBatch(itemConfig) then
  292. flag = Util.setBit(flag, ItemDefine.ITEM_OP_USE_BATCH)
  293. end
  294. -- 详情
  295. if canDetail(itemConfig) then
  296. flag = Util.setBit(flag, ItemDefine.ITEM_OP_DETAIL)
  297. end
  298. -- 是否可出售
  299. if canSell(itemConfig) then
  300. flag = Util.setBit(flag, ItemDefine.ITEM_OP_SELL)
  301. end
  302. -- 是否用来源
  303. if canSource(itemConfig) then
  304. flag = Util.setBit(flag, ItemDefine.ITEM_OP_SOURCE)
  305. end
  306. -- 是否可以合成
  307. if canHeCheng(itemConfig) then
  308. flag = Util.setBit(flag, ItemDefine.ITEM_OP_HECHENG)
  309. end
  310. -- 能否穿戴
  311. if canEquip(itemConfig) then
  312. flag = Util.setBit(flag, ItemDefine.ITEM_OP_EQUIP)
  313. end
  314. -- 能否重铸
  315. if canCZhu(itemConfig) then
  316. flag = Util.setBit(flag, ItemDefine.ITEM_OP_CZHU)
  317. end
  318. -- 能否分解
  319. if canFJie(itemConfig) then
  320. flag = Util.setBit(flag, ItemDefine.ITEM_OP_FJIE)
  321. end
  322. return flag
  323. end
  324. function getOpflag(itemConfig)
  325. local flag = 0
  326. if not itemConfig then return flag end
  327. -- 预览
  328. if canYulan(itemConfig) then
  329. flag = Util.setBit(flag, ItemDefine.ITEM_OP_YULAN)
  330. end
  331. -- 是否用来源
  332. if canSource(itemConfig) then
  333. flag = Util.setBit(flag, ItemDefine.ITEM_OP_SOURCE)
  334. end
  335. return flag
  336. end
  337. -- 可否使用
  338. function canUse(itemConfig)
  339. if not itemConfig then return end
  340. if not itemConfig.panelID then return end
  341. return itemConfig.panelID > 0
  342. end
  343. -- 可否使用
  344. function canUseBox(itemConfig)
  345. if not itemConfig then return end
  346. if not itemConfig.cmd then return end
  347. local cmdstr = itemConfig.cmd[1]
  348. if not cmdstr then return end
  349. if cmdstr == "box" then
  350. return true
  351. end
  352. end
  353. -- 是否可出售
  354. function canSell(itemConfig)
  355. if not itemConfig then return end
  356. if not itemConfig.price then return end
  357. return #itemConfig.price > 0
  358. end
  359. -- 是否可出售
  360. function canSource(itemConfig)
  361. if not itemConfig then return end
  362. if not itemConfig.getway then return end
  363. return #itemConfig.getway > 0
  364. end
  365. -- 可否批量使用
  366. function canUseBatch(itemConfig)
  367. if not itemConfig then return end
  368. if not itemConfig.cmd then return end
  369. local cmdstr = itemConfig.cmd[1]
  370. if not cmdstr then return end
  371. if cmdstr == "box" then
  372. return
  373. end
  374. return true
  375. end
  376. -- 可否预览
  377. function canYulan(itemConfig)
  378. if not itemConfig then return end
  379. local cmdStr = itemConfig.cmd and itemConfig.cmd[1]
  380. if cmdStr and cmdStr == "box" then
  381. return true
  382. end
  383. --[[local getWay = itemConfig.get and itemConfig.get[1]
  384. if getWay == SuipianLogic.SUMMON_TYPE_DROP or
  385. getWay == SuipianLogic.SUMMON_TYPE_HERO_SP or
  386. getWay == SuipianLogic.SUMMON_TYPE_SHENQI_SP then
  387. local suipianType = itemConfig.get[2]
  388. if suipianType == SuipianLogic.SUMMON_SUBTYPE_HERO or
  389. suipianType == SuipianLogic.SUMMON_SUBTYPE_EQUIP then
  390. return true
  391. end
  392. end]]
  393. end
  394. -- 可否查看英雄详情
  395. function canDetail(itemConfig)
  396. local getWay = itemConfig.get and itemConfig.get[1]
  397. if getWay == SuipianLogic.SUMMON_TYPE_TARGET then
  398. local suipianType = itemConfig.get[2]
  399. if suipianType == SuipianLogic.SUMMON_SUBTYPE_HERO then
  400. local heroID = itemConfig.get[3]
  401. if HeroExcel.hero[heroID] then
  402. return true
  403. end
  404. end
  405. if suipianType == SuipianLogic.SUMMON_SUBTYPE_SKIN then
  406. local skinID = itemConfig.get[3]
  407. if SkinExcel.skin[skinID] then
  408. return true
  409. end
  410. end
  411. end
  412. end
  413. -- 可否合成
  414. function canHeCheng(itemConfig)
  415. local getWay = itemConfig.get and itemConfig.get[1]
  416. if getWay == SuipianLogic.SUMMON_TYPE_TARGET or getWay == SuipianLogic.SUMMON_TYPE_DROP then
  417. local suipianType = itemConfig.get[2]
  418. if suipianType == SuipianLogic.SUMMON_SUBTYPE_HERO then
  419. return true
  420. end
  421. if suipianType == SuipianLogic.SUMMON_SUBTYPE_SKIN then
  422. return true
  423. end
  424. end
  425. if ItemDefine.isFuwen(itemConfig.id) then
  426. return true
  427. end
  428. end
  429. -- 可否穿戴
  430. function canEquip(itemConfig)
  431. if ItemDefine.isEquip(itemConfig.id) then
  432. return true
  433. end
  434. if ItemDefine.isFuwen(itemConfig.id) then
  435. return true
  436. end
  437. end
  438. -- 可否重铸
  439. function canCZhu(itemConfig)
  440. if ItemDefine.isFuwen(itemConfig.id) then
  441. return true
  442. end
  443. end
  444. -- 可否重铸
  445. function canFJie(itemConfig)
  446. if ItemDefine.isFuwen(itemConfig.id) then
  447. return true
  448. end
  449. end