HeroSeed.lua 9.0 KB

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