HeroSeed.lua 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  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 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 not 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 pairs(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. -- 红点标识
  171. msgRet.seedArr[idx].redDotTag = 0
  172. local seedNowLv = msgRet.seedArr[idx].seedLv
  173. if seedNowLv < seedCfg.maxLv then
  174. local itemCnt = getUpGradeCostCnt(seedNowLv+1)
  175. if itemCnt and BagLogic.getItemCnt(human, seedCfg.itemId) >= itemCnt then
  176. msgRet.seedArr[idx].redDotTag = 1
  177. end
  178. end
  179. end
  180. Msg.send(msgRet, human.fd)
  181. end
  182. -- 查询单个种子详细信息
  183. function HeroSeed_Query_Single(human, heroID, heroIndex, seedIdx)
  184. local targetCfg = HeroSeedCfg.base[seedIdx]
  185. if not targetCfg then
  186. return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  187. end
  188. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  189. if not heroGrid then
  190. return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
  191. end
  192. if heroGrid.star < HAVE_SEED_HERO_MIN_STAR then
  193. return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
  194. end
  195. local seedNowLv = 0
  196. local seedData = heroGrid.seedData
  197. if seedData then
  198. seedNowLv = seedData[seedIdx] or 0
  199. end
  200. local msgRet = Msg.gc.GC_HEROSEED_QUERY_SINGLE
  201. msgRet.seedIdx = seedIdx
  202. msgRet.seedIcon = targetCfg.seedIcon
  203. msgRet.seedLv = seedNowLv
  204. msgRet.seedMaxLv = targetCfg.maxLv
  205. msgRet.seedName = targetCfg.name
  206. msgRet.seedLvAttr[0] = 0
  207. for idx, attrTb in ipairs(targetCfg.attr) do
  208. msgRet.seedLvAttr[0] = idx
  209. msgRet.seedLvAttr[idx].key = attrTb[1]
  210. msgRet.seedLvAttr[idx].value = attrTb[2]
  211. end
  212. local itemCnt = seedNowLv >= targetCfg.maxLv and 0 or getUpGradeCostCnt(seedNowLv+1)
  213. Grid.makeItem(msgRet.seedUpGradeCost, targetCfg.itemId, itemCnt)
  214. Msg.send(msgRet, human.fd)
  215. end
  216. -- 种子升级
  217. function HeroSeed_UpGrade(human, heroID, heroIndex, seedIdx, opType)
  218. local targetCfg = HeroSeedCfg.base[seedIdx]
  219. if not targetCfg then
  220. return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  221. end
  222. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  223. if not heroGrid then
  224. return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
  225. end
  226. if heroGrid.star < HAVE_SEED_HERO_MIN_STAR then
  227. return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
  228. end
  229. local seedNowLv = 0
  230. if heroGrid.seedData and heroGrid.seedData[seedIdx] then
  231. seedNowLv = heroGrid.seedData[seedIdx]
  232. end
  233. if seedNowLv >= targetCfg.maxLv then
  234. return Broadcast.sendErr(human, Lang.COMMON_MAXLEVEL)
  235. end
  236. local itemId, itemCnt, addLv = targetCfg.itemId, 0, 0
  237. local itemAllCnt = BagLogic.getItemCnt(human, itemId)
  238. if opType == 1 then --升级一次
  239. itemCnt = getUpGradeCostCnt(seedNowLv+1)
  240. if not itemCnt then
  241. return Broadcast.sendErr(human, Lang.DATA_ERR)
  242. end
  243. if itemAllCnt < itemCnt then
  244. return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
  245. end
  246. addLv = 1
  247. elseif opType == 2 then -- 一键升级
  248. if itemAllCnt <= 0 then
  249. return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
  250. end
  251. addLv, itemCnt = calcUpGrade(seedNowLv, itemAllCnt)
  252. if addLv <= 0 or itemAllCnt < itemCnt then --再验证一次道具数量
  253. return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
  254. end
  255. else
  256. return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  257. end
  258. -- 扣除道具
  259. BagLogic.delItem(human, itemId, itemCnt, LOGTAG)
  260. -- 更新等级
  261. heroGrid.seedData = heroGrid.seedData or {}
  262. heroGrid.seedData[seedIdx] = (heroGrid.seedData[seedIdx] or 0) + addLv
  263. -- 推送最新数据给客户端
  264. HeroSeed_Query_All(human, heroID, heroIndex)
  265. HeroSeed_Query_Single(human, heroID, heroIndex, seedIdx)
  266. --重算战力和红点
  267. RoleAttr.cleanHeroAttrCache(human)
  268. RoleAttr.doCalc(human)
  269. HeroLogic.sendHeroBagDynamic(human, heroID, heroIndex)
  270. ObjHuman.sendAttr(human, RoleDefine.ZHANDOULI)
  271. HeroLogic.refreshDot(human, heroGrid.uuid)
  272. end