HeroExclusiveWeapon.lua 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401
  1. --超武之专属武器
  2. local Msg = require("core.Msg")
  3. local Grid = require("bag.Grid")
  4. local BagLogic = require("bag.BagLogic")
  5. local HeroLogic = require("hero.HeroLogic")
  6. local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
  7. local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
  8. local Lang = require("common.Lang")
  9. local Broadcast = require("broadcast.Broadcast")
  10. local RoleAttr = require("role.RoleAttr")
  11. local RoleDefine = require("role.RoleDefine")
  12. local ObjHuman = require("core.ObjHuman")
  13. local Config = require("excel.weapon").weapon
  14. local HeroExcel = require("excel.hero").hero
  15. local GiftLogic
  16. local COND_STAR = 12 -- 获得超武需要的星级
  17. local STAGELV = 20 -- 每20级获得一个特殊效果
  18. local LOGTAG = "HeroExclusiveWeapon" --日志标识
  19. local SSRGRADE = 4 -- SSR英雄的grade值
  20. --获取英雄的专属武器配置
  21. local function getHeroWeaponCfg(heroID)
  22. for _, cfg in pairs(Config) do
  23. if cfg.heroId == heroID then
  24. return cfg
  25. end
  26. end
  27. end
  28. --获得消耗列表
  29. local function getItemList(costItemList, nextWeaponLv)
  30. local itemList = {}
  31. local itemId, itemCnt = 0,0
  32. for i=1, #costItemList, 3 do
  33. local lv = costItemList[i]
  34. if nextWeaponLv < lv then
  35. break
  36. end
  37. itemId = costItemList[i+1]
  38. if type(costItemList[i+2]) == "table" then
  39. itemCnt = costItemList[i+2][1] * nextWeaponLv + costItemList[i+2][2]
  40. else
  41. itemCnt = costItemList[i+2]
  42. end
  43. itemList[itemId] = itemCnt
  44. end
  45. return itemList
  46. end
  47. --计算一个英雄当前专属武器等级消耗的道具
  48. function CalcLevelCostItem(human, heroID, heroIndex)
  49. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  50. if heroGrid.star < COND_STAR then
  51. return
  52. end
  53. if not heroGrid.weaponLv or heroGrid.weaponLv <= 0 then
  54. return
  55. end
  56. local heroCfg = HeroExcel[heroGrid.id]
  57. if heroCfg.grade < SSRGRADE then
  58. return
  59. end
  60. local cfg = getHeroWeaponCfg(heroID)
  61. if not cfg then
  62. return
  63. end
  64. local itemList = {}
  65. local costItemList = cfg.costItemList
  66. for i=1, heroGrid.weaponLv do
  67. local costTb = getItemList(costItemList, i)
  68. for itemId, itemCnt in pairs(costTb) do
  69. itemList[itemId] = itemList[itemId] or 0
  70. itemList[itemId] = itemList[itemId] + itemCnt
  71. end
  72. end
  73. return itemList
  74. end
  75. --设置某个英雄的专属武器等级
  76. function SetHeroWeaponLv(human, heroID, heroIndex, lv)
  77. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  78. if heroGrid.star < COND_STAR then
  79. return
  80. end
  81. local heroCfg = HeroExcel[heroGrid.id]
  82. if heroCfg.grade < SSRGRADE then
  83. return
  84. end
  85. local cfg = getHeroWeaponCfg(heroID)
  86. if not cfg then
  87. return
  88. end
  89. heroGrid.weaponLv = lv
  90. --更新数据
  91. Query(human, heroID, heroIndex)
  92. end
  93. --专属武器加成
  94. function doCalcHero(heroGrid, addAttrs)
  95. if not heroGrid or not heroGrid.weaponLv then
  96. return
  97. end
  98. local cfg = getHeroWeaponCfg(heroGrid.id)
  99. if not cfg then
  100. return
  101. end
  102. local nowWeaponLv = heroGrid.weaponLv
  103. for _, v in ipairs(cfg.normalAttrs) do
  104. RoleAttr.updateValue(v[1], v[2] * nowWeaponLv, addAttrs)
  105. end
  106. end
  107. --获取专属武器对英雄技能提供额外效果的 技能ID/buff ID
  108. function GetweaponEffectIdList(heroGrid)
  109. if not heroGrid or not heroGrid.weaponLv then
  110. return
  111. end
  112. local cfg = getHeroWeaponCfg(heroGrid.id)
  113. if not cfg then
  114. return
  115. end
  116. local stage = math.floor(heroGrid.weaponLv / STAGELV)
  117. if stage < 1 then
  118. return
  119. end
  120. local ids = {}
  121. local effectCfg = cfg.stage2effect
  122. for k, tabl in ipairs(effectCfg) do
  123. if stage < k then
  124. break
  125. end
  126. for _,v in ipairs(tabl) do
  127. ids[v[1]] = v[2]
  128. end
  129. end
  130. return ids
  131. end
  132. --红点判断
  133. function isWeaponDot(human, heroGrid)
  134. if heroGrid.star < COND_STAR then
  135. return false
  136. end
  137. local heroCfg = HeroExcel[heroGrid.id]
  138. if heroCfg.grade < SSRGRADE then
  139. return false
  140. end
  141. local cfg = getHeroWeaponCfg(heroGrid.id)
  142. if not cfg then
  143. return false
  144. end
  145. local nowWeaponLv = heroGrid.weaponLv or 0
  146. if nowWeaponLv >= cfg.maxLevel then
  147. return false
  148. end
  149. local itemList = getItemList(cfg.costItemList, nowWeaponLv+1)
  150. for itemId, itemCnt in pairs(itemList) do
  151. if BagLogic.getItemCnt(human, itemId) < itemCnt then
  152. return false
  153. end
  154. end
  155. return true
  156. end
  157. --查询
  158. function Query(human, heroID, heroIndex)
  159. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  160. if not heroGrid then
  161. return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  162. end
  163. if heroGrid.star < COND_STAR then
  164. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  165. end
  166. local heroCfg = HeroExcel[heroGrid.id]
  167. if heroCfg.grade < SSRGRADE then
  168. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  169. end
  170. local cfg = getHeroWeaponCfg(heroID)
  171. -- if not cfg then
  172. -- return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  173. -- end
  174. local msgRet = Msg.gc.GC_HERO_EXCLUSIVE_WEAPON_QUERY
  175. msgRet.name = ""
  176. msgRet.level = 0
  177. msgRet.icon = 0
  178. msgRet.costInfo[0] =0
  179. msgRet.normalAttrs[0] = 0
  180. msgRet.specEffect[0] = 0
  181. if cfg then
  182. local nowWeaponLv = heroGrid.weaponLv or 0
  183. local nextWeaponLv = nowWeaponLv + 1
  184. msgRet.name = cfg.name
  185. msgRet.level = nowWeaponLv
  186. msgRet.icon = cfg.iconId
  187. local costInfo = msgRet.costInfo
  188. costInfo[0] = 0
  189. if nowWeaponLv < cfg.maxLevel then
  190. local len= 0
  191. local costItemList = cfg.costItemList
  192. local itemList = getItemList(costItemList, nextWeaponLv)
  193. for itemId, itemCnt in pairs(itemList) do
  194. len = len + 1
  195. Grid.makeItem(costInfo[len], itemId, itemCnt)
  196. end
  197. costInfo[0] = len
  198. end
  199. --普通属性加成
  200. local normalAttrs = msgRet.normalAttrs
  201. local normalAttrsCfg = cfg.normalAttrs
  202. normalAttrs[0] = #normalAttrsCfg
  203. for k, v in ipairs(normalAttrsCfg) do
  204. normalAttrs[k] = {}
  205. normalAttrs[k].key = v[1] or 0
  206. normalAttrs[k].value = v[2] * nowWeaponLv
  207. end
  208. --特殊效果
  209. local stage = math.floor(nowWeaponLv / STAGELV)
  210. local specEffect = msgRet.specEffect
  211. specEffect[0] = #cfg.effectDesc
  212. for k, desc in ipairs(cfg.effectDesc) do
  213. specEffect[k].desc = desc
  214. specEffect[k].isActivate = 0
  215. if stage >= k then
  216. specEffect[k].isActivate = 1
  217. end
  218. end
  219. end
  220. Msg.send(msgRet, human.fd)
  221. end
  222. --升级
  223. function UpgradeWeapon(human, heroID, heroIndex)
  224. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  225. if not heroGrid then
  226. return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  227. end
  228. if heroGrid.star < COND_STAR then
  229. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  230. end
  231. local heroCfg = HeroExcel[heroGrid.id]
  232. if heroCfg.grade < SSRGRADE then
  233. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  234. end
  235. local cfg = getHeroWeaponCfg(heroID)
  236. if not cfg then
  237. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  238. end
  239. local nowWeaponLv = heroGrid.weaponLv or 0
  240. if nowWeaponLv >= cfg.maxLevel then
  241. return Broadcast.sendErr(human, Lang.BINGSHU_LEVELUP_ERR_FULL)
  242. end
  243. local nextWeaponLv = nowWeaponLv + 1
  244. local costItemList = cfg.costItemList
  245. local itemList = getItemList(costItemList, nextWeaponLv)
  246. for itemId, itemCnt in pairs(itemList) do
  247. if BagLogic.getItemCnt(human, itemId) < itemCnt then
  248. return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
  249. end
  250. end
  251. --扣除道具
  252. for itemId, itemCnt in pairs(itemList) do
  253. BagLogic.delItem(human, itemId, itemCnt, LOGTAG)
  254. end
  255. --更新等级
  256. heroGrid.weaponLv = nextWeaponLv
  257. --下发数据
  258. Query(human, heroID, heroIndex)
  259. --重算战力和红点
  260. RoleAttr.cleanHeroAttrCache(human)
  261. RoleAttr.doCalc(human)
  262. HeroLogic.sendHeroBagDynamic(human, heroID, heroIndex)
  263. ObjHuman.sendAttr(human, RoleDefine.ZHANDOULI)
  264. HeroLogic.refreshDot(human, heroGrid.uuid)
  265. -- 弹窗礼包
  266. GiftLogic = GiftLogic or require("topup.GiftLogic")
  267. GiftLogic.trigger(human, GiftLogic.GIFT_HEROWEAPON_UPGRADE_STAR, {currentVal = nextWeaponLv}, GiftLogic.GIFT_SEC_TYPE1)
  268. end
  269. --GM, 设置所有id为heroID英雄的专属武器等级
  270. function GmSetHeroWeaponLv(human, heroID, lv)
  271. local heroCfg = HeroExcel[heroID]
  272. if not heroCfg then
  273. return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  274. end
  275. if heroCfg.grade < SSRGRADE then
  276. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  277. end
  278. local heroNum = human.db.heroBag[0]
  279. for i=1, heroNum do
  280. local heroGrid = human.db.heroBag[i]
  281. if not heroGrid then
  282. break
  283. end
  284. if heroGrid.id == heroID and heroGrid.star >= COND_STAR then
  285. heroGrid.weaponLv = lv
  286. end
  287. end
  288. end
  289. --专属武器图鉴查询
  290. function BookQuery(human, heroID)
  291. local cfg = getHeroWeaponCfg(heroID)
  292. -- if not cfg then
  293. -- return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  294. -- end
  295. local msgRet = Msg.gc.GC_HERO_EXCLUSIVE_WEAPON_BOOK_QUERY
  296. msgRet.name = ""
  297. msgRet.icon = 0
  298. msgRet.normalAttrs[0] = 0
  299. msgRet.specEffect[0] = 0
  300. if cfg then
  301. msgRet.name = cfg.name
  302. msgRet.icon = cfg.iconId
  303. --普通属性加成
  304. local normalAttrs = msgRet.normalAttrs
  305. local normalAttrsCfg = cfg.normalAttrs
  306. normalAttrs[0] = #normalAttrsCfg
  307. for k, v in ipairs(normalAttrsCfg) do
  308. normalAttrs[k] = {}
  309. normalAttrs[k].key = v[1] or 0
  310. normalAttrs[k].value = v[2] * cfg.maxLevel
  311. end
  312. --特殊效果
  313. local specEffect = msgRet.specEffect
  314. specEffect[0] = #cfg.effectDesc
  315. for k, desc in ipairs(cfg.effectDesc) do
  316. specEffect[k].desc = desc
  317. specEffect[k].isActivate = 0
  318. end
  319. end
  320. Msg.send(msgRet, human.fd)
  321. end