HeroSeed.lua 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. -- 种子系统
  2. local Lang = require("common.Lang")
  3. local Msg = require("core.Msg")
  4. local BagLogic = require("bag.BagLogic")
  5. local HeroLogic = require("hero.HeroLogic")
  6. local ObjHuman = require("core.ObjHuman")
  7. local Grid = require("bag.Grid")
  8. local RoleAttr = require("role.RoleAttr")
  9. local HeroSeedCfg = require("excel.heroSeed")
  10. local Broadcast = require("broadcast.Broadcast")
  11. local RoleDefine = require("role.RoleDefine")
  12. local TalismanLogic = require("talisman.TalismanLogic")
  13. local GiftLogic
  14. local LOGTAG = "HeroSeed" --日志标识
  15. local HAVE_SEED_HERO_MIN_STAR = 9 --英雄获得种子的最低星级要求
  16. -- 获取来自秘宝的属性倍数加成
  17. local function getAttrMulFromTalisman(human)
  18. local attrMul = TalismanLogic.getTalismanAdd(human, TalismanLogic.OTHER_EFFECT_TBL.HeroSeed_Attr_Mul)
  19. attrMul = attrMul / 100
  20. return attrMul
  21. end
  22. -- 获取下一级消耗的道具数量
  23. local function getUpGradeCostCnt(nextLv)
  24. local upGradeCfg = HeroSeedCfg.upGrade
  25. -- local maxLvCfg = upGradeCfg[#upGradeCfg]
  26. -- if nextLv >= maxLvCfg.levelArea[2] then
  27. -- return 0
  28. -- end
  29. for _, v in ipairs(upGradeCfg) do
  30. if nextLv >= v.levelArea[1] and nextLv <= v.levelArea[2] then
  31. return v.itemCnt
  32. end
  33. end
  34. end
  35. -- 计算一共可以升多少级, 消耗多少道具
  36. local function calcUpGrade(nowLv, itemAllCnt)
  37. local addLv, oldItemAllCnt, itemCostCnt = 0, itemAllCnt, 0
  38. while true do
  39. nowLv = nowLv + 1
  40. itemCostCnt = getUpGradeCostCnt(nowLv)
  41. if not itemCostCnt then
  42. break
  43. end
  44. if itemAllCnt < itemCostCnt then
  45. break
  46. end
  47. addLv = addLv + 1
  48. itemAllCnt = itemAllCnt - itemCostCnt
  49. end
  50. local useItemCnt = oldItemAllCnt - itemAllCnt
  51. return addLv, useItemCnt
  52. end
  53. -- 计算种子重置等级后返还的材料
  54. local function calcReturnItem(seeIdx, seedLv)
  55. if not seeIdx or not seedLv or seedLv <= 0 then
  56. return
  57. end
  58. local targetSeedCfg = HeroSeedCfg.base[seeIdx]
  59. if not targetSeedCfg then
  60. return
  61. end
  62. local itemCnt = 0
  63. for i=seedLv, 0, -1 do
  64. for _, v in ipairs(HeroSeedCfg.upGrade) do
  65. if i >= v.levelArea[1] and i <= v.levelArea[2] then
  66. itemCnt = itemCnt + v.itemCnt
  67. break
  68. end
  69. end
  70. end
  71. if itemCnt <= 0 then
  72. return
  73. end
  74. local itemTb = { targetSeedCfg.itemId, itemCnt }
  75. return itemTb
  76. end
  77. -- 获取英雄种子的红点标识数组
  78. -- local function getHeroSeedRedDotArr(human, heroGrid)
  79. -- local bl = false
  80. -- local redDotArr = {0, 0, 0, 0, 0, 0, 0, 0}
  81. -- local seedData = heroGrid.seedData or {}
  82. -- for idx, v in ipairs(HeroSeedCfg.base) do
  83. -- local seedNowLv = seedData[idx] or 0
  84. -- if seedNowLv < v.maxLv then
  85. -- local itemCnt = getUpGradeCostCnt(seedNowLv+1)
  86. -- if itemCnt and BagLogic.getItemCnt(human, v.itemId) >= itemCnt then
  87. -- bl = true
  88. -- redDotArr[idx] = 1
  89. -- end
  90. -- end
  91. -- end
  92. -- return redDotArr, bl
  93. -- end
  94. -- 计算重置种子等级后返还的材料
  95. function CalcReturnItem(human, heroGrid)
  96. if heroGrid.star < HAVE_SEED_HERO_MIN_STAR then
  97. return
  98. end
  99. local seedData = heroGrid.seedData
  100. if not seedData then
  101. return
  102. end
  103. local itemArr = {}
  104. for seeIdx, seedLv in pairs(seedData) do
  105. local itemTb = calcReturnItem(seeIdx, seedLv)
  106. if itemTb then
  107. itemArr[#itemArr+1] = itemTb
  108. end
  109. end
  110. if #itemArr == 0 then
  111. return
  112. end
  113. return itemArr
  114. end
  115. -- 重置英雄所有种子等级
  116. function ResetSeedLv(human, heroGrid)
  117. if not heroGrid or not heroGrid.seedData then
  118. return
  119. end
  120. heroGrid.seedData = nil
  121. end
  122. -- 英雄种子红点检测
  123. function isSeedDot(human, heroGrid)
  124. if heroGrid.star < HAVE_SEED_HERO_MIN_STAR then
  125. return false
  126. end
  127. local seedData = heroGrid.seedData or {}
  128. for idx, v in ipairs(HeroSeedCfg.base) do
  129. local seedNowLv = seedData[idx] or 0
  130. if seedNowLv < v.maxLv then
  131. local itemCnt = getUpGradeCostCnt(seedNowLv+1)
  132. if itemCnt and BagLogic.getItemCnt(human, v.itemId) >= itemCnt then
  133. return true
  134. end
  135. end
  136. end
  137. return false
  138. end
  139. -- 种子加成
  140. function doCalcHero(human, heroGrid, addAttrs)
  141. if not heroGrid or not heroGrid.seedData then
  142. return
  143. end
  144. local attrMul = getAttrMulFromTalisman(human)
  145. attrMul = 1 + attrMul
  146. local seedBaseCfg = HeroSeedCfg.base
  147. for seedIdx, seedLv in pairs(heroGrid.seedData) do
  148. if seedLv > 0 then
  149. if seedBaseCfg[seedIdx] then
  150. for _, attrTb in ipairs(seedBaseCfg[seedIdx].attr) do
  151. local attrId, attrVal = attrTb[1], attrTb[2]
  152. RoleAttr.updateValue(attrId, attrVal * seedLv * attrMul, addAttrs)
  153. end
  154. end
  155. end
  156. end
  157. end
  158. --查询所有种子的简略信息
  159. function HeroSeed_Query_All(human, heroID, heroIndex)
  160. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  161. if not heroGrid then
  162. return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
  163. end
  164. if heroGrid.star < HAVE_SEED_HERO_MIN_STAR then
  165. return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
  166. end
  167. local seedData = heroGrid.seedData
  168. local seedBaseCfg = HeroSeedCfg.base
  169. local msgRet = Msg.gc.GC_HEROSEED_QUERY_ALL
  170. msgRet.seedArr[0] = #seedBaseCfg
  171. for idx, seedCfg in ipairs(seedBaseCfg) do
  172. msgRet.seedArr[idx].seedIdx = idx
  173. msgRet.seedArr[idx].seedIcon = seedCfg.seedIcon
  174. if seedData and seedData[idx] then
  175. msgRet.seedArr[idx].seedLv = seedData[idx]
  176. else
  177. msgRet.seedArr[idx].seedLv = 0
  178. end
  179. msgRet.seedArr[idx].seedName = seedCfg.name
  180. -- 红点标识
  181. msgRet.seedArr[idx].redDotTag = 0
  182. local seedNowLv = msgRet.seedArr[idx].seedLv
  183. if seedNowLv < seedCfg.maxLv then
  184. local itemCnt = getUpGradeCostCnt(seedNowLv+1)
  185. if itemCnt and BagLogic.getItemCnt(human, seedCfg.itemId) >= itemCnt then
  186. msgRet.seedArr[idx].redDotTag = 1
  187. end
  188. end
  189. end
  190. Msg.send(msgRet, human.fd)
  191. end
  192. -- 查询单个种子详细信息
  193. function HeroSeed_Query_Single(human, heroID, heroIndex, seedIdx)
  194. local targetCfg = HeroSeedCfg.base[seedIdx]
  195. if not targetCfg then
  196. return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  197. end
  198. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  199. if not heroGrid then
  200. return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
  201. end
  202. if heroGrid.star < HAVE_SEED_HERO_MIN_STAR then
  203. return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
  204. end
  205. local seedNowLv = 0
  206. local seedData = heroGrid.seedData
  207. if seedData then
  208. seedNowLv = seedData[seedIdx] or 0
  209. end
  210. local attrMul = getAttrMulFromTalisman(human)
  211. attrMul = 1 + attrMul
  212. local msgRet = Msg.gc.GC_HEROSEED_QUERY_SINGLE
  213. msgRet.seedIdx = seedIdx
  214. msgRet.seedIcon = targetCfg.seedIcon
  215. msgRet.seedLv = seedNowLv
  216. msgRet.seedMaxLv = targetCfg.maxLv
  217. msgRet.seedName = targetCfg.name
  218. msgRet.seedLvAttr[0] = 0
  219. for idx, attrTb in ipairs(targetCfg.attr) do
  220. msgRet.seedLvAttr[0] = idx
  221. msgRet.seedLvAttr[idx].key = attrTb[1]
  222. msgRet.seedLvAttr[idx].value = attrTb[2] * attrMul
  223. end
  224. local itemCnt = seedNowLv >= targetCfg.maxLv and 0 or getUpGradeCostCnt(seedNowLv+1)
  225. Grid.makeItem(msgRet.seedUpGradeCost, targetCfg.itemId, itemCnt)
  226. Msg.send(msgRet, human.fd)
  227. end
  228. -- 种子升级
  229. function HeroSeed_UpGrade(human, heroID, heroIndex, seedIdx, opType)
  230. local targetCfg = HeroSeedCfg.base[seedIdx]
  231. if not targetCfg then
  232. return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  233. end
  234. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  235. if not heroGrid then
  236. return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
  237. end
  238. if heroGrid.star < HAVE_SEED_HERO_MIN_STAR then
  239. return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
  240. end
  241. local seedNowLv = 0
  242. if heroGrid.seedData and heroGrid.seedData[seedIdx] then
  243. seedNowLv = heroGrid.seedData[seedIdx]
  244. end
  245. if seedNowLv >= targetCfg.maxLv then
  246. return Broadcast.sendErr(human, Lang.COMMON_MAXLEVEL)
  247. end
  248. local itemId, itemCnt, addLv = targetCfg.itemId, 0, 0
  249. local itemAllCnt = BagLogic.getItemCnt(human, itemId)
  250. if opType == 1 then --升级一次
  251. itemCnt = getUpGradeCostCnt(seedNowLv+1)
  252. if not itemCnt then
  253. return Broadcast.sendErr(human, Lang.DATA_ERR)
  254. end
  255. if itemAllCnt < itemCnt then
  256. return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
  257. end
  258. addLv = 1
  259. elseif opType == 2 then -- 一键升级
  260. if itemAllCnt <= 0 then
  261. return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
  262. end
  263. addLv, itemCnt = calcUpGrade(seedNowLv, itemAllCnt)
  264. if addLv <= 0 or itemAllCnt < itemCnt then --再验证一次道具数量
  265. return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
  266. end
  267. else
  268. return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  269. end
  270. -- 扣除道具
  271. BagLogic.delItem(human, itemId, itemCnt, LOGTAG)
  272. -- 更新等级
  273. heroGrid.seedData = heroGrid.seedData or {}
  274. heroGrid.seedData[seedIdx] = (heroGrid.seedData[seedIdx] or 0) + addLv
  275. -- 推送最新数据给客户端
  276. HeroSeed_Query_All(human, heroID, heroIndex)
  277. HeroSeed_Query_Single(human, heroID, heroIndex, seedIdx)
  278. --重算战力和红点
  279. RoleAttr.cleanHeroAttrCache(human)
  280. RoleAttr.doCalc(human)
  281. HeroLogic.sendHeroBagDynamic(human, heroID, heroIndex)
  282. ObjHuman.sendAttr(human, RoleDefine.ZHANDOULI)
  283. HeroLogic.refreshDot(human, heroGrid.uuid)
  284. -- 弹窗礼包
  285. GiftLogic = GiftLogic or require("topup.GiftLogic")
  286. GiftLogic.trigger(human, GiftLogic.GIFT_HEROSEED_UPGRADE_STAR, {currentVal = heroGrid.seedData[seedIdx]}, GiftLogic.GIFT_SEC_TYPE3)
  287. end