HeroSeed.lua 9.9 KB

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