HeroExclusiveWeapon.lua 11 KB

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