ElfLogic.lua 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525
  1. -- 精灵系统
  2. --db
  3. --[=[
  4. human.db.elfData = {
  5. [elfId1] = {
  6. level = 0,
  7. star = 0,
  8. },
  9. [elfId2] = {
  10. level = 0,
  11. star = 0,
  12. },
  13. }
  14. ]=]--
  15. local Msg = require("core.Msg")
  16. local Lang = require("common.Lang")
  17. local Broadcast = require("broadcast.Broadcast")
  18. local ElfConfig = require("excel.elf")
  19. local ItemConfig = require("excel.item").item
  20. local Grid = require("bag.Grid")
  21. local BagLogic = require("bag.BagLogic")
  22. local Skill = require("combat.Skill")
  23. local RoleAttr = require("role.RoleAttr")
  24. local RoleDefine = require("role.RoleDefine")
  25. local ObjHuman = require("core.ObjHuman")
  26. local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
  27. local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
  28. local HuanJingTowerLogic = require("huanjingTower.HuanjingTowerLogic")
  29. local ELF_UPGRADELV_LOG_TAG = "elfUpGradeLv"
  30. local ELF_UPGRADESTAR_LOG_TAG = "elfUpGradeStar"
  31. local ELF_COND_TOWER_LEVEL = 600
  32. local function initElfData(human)
  33. human.db.elfData = {}
  34. end
  35. local function getElfData(human)
  36. return human.db.elfData
  37. end
  38. local function updateElfData(human, elfId, newLevel, newStar)
  39. local elfData = getElfData(human)
  40. if not elfData then
  41. initElfData(human)
  42. elfData = getElfData(human)
  43. end
  44. elfData[elfId] = elfData[elfId] or {level = 0, star = 0}
  45. if newLevel then
  46. elfData[elfId].level = newLevel
  47. end
  48. if newStar then
  49. elfData[elfId].star = newStar
  50. end
  51. end
  52. local function getNextStarCostCnt(nextStar)
  53. for _, starCfg in ipairs(ElfConfig.UpGradeStar) do
  54. if nextStar == starCfg.star then
  55. return starCfg.itemCnt
  56. end
  57. end
  58. return 0
  59. end
  60. local function generateCfgByQuality(targetQuality)
  61. local tbl = {}
  62. for id, cfg in ipairs(ElfConfig.Elf) do
  63. if cfg.elfQuality == targetQuality then
  64. tbl[id] = cfg
  65. end
  66. end
  67. if not next(tbl) then
  68. return nil
  69. end
  70. return tbl
  71. end
  72. local function getElfCfgById(targetElfId)
  73. for _, elfCfg in ipairs(ElfConfig.Elf) do
  74. if elfCfg.elfId == targetElfId then
  75. return elfCfg
  76. end
  77. end
  78. end
  79. local function populateMsgSimpleData(net, elfCfg, itemCfg, elfData)
  80. if not net or not elfCfg or not itemCfg then
  81. return
  82. end
  83. local elfNowLv = elfData and elfData.level or 0
  84. local elfNowStar = elfData and elfData.star or 0
  85. net.elfId = elfCfg.elfId
  86. net.elfName = itemCfg.name
  87. net.elfIcon = itemCfg.icon
  88. net.elfLv = elfNowLv
  89. net.elfStar = elfNowStar
  90. net.elfQuality = elfCfg.elfQuality
  91. net.maxLv = elfCfg.elfMaxLv
  92. net.maxStar = elfCfg.elfMaxStar
  93. local upGradeLvItemId = elfCfg.upGradeLvItemId
  94. local upGradeLvItemCnt = elfNowLv >= elfCfg.elfMaxLv and 0 or (elfNowLv + 1) * 3 + 2
  95. Grid.makeItem(net.elfUpGradeLvCost, upGradeLvItemId, upGradeLvItemCnt)
  96. local upGradeStarItemId = elfCfg.upGradeStarItemId
  97. local upGradeStarItemCnt = elfNowStar >= elfCfg.elfMaxStar and 0 or getNextStarCostCnt(elfNowStar+1)
  98. Grid.makeItem(net.elfUpGradeStarCost, upGradeStarItemId, upGradeStarItemCnt)
  99. end
  100. local function populateMsgSkill(skillDesc, taretSkillId)
  101. local skillCfg = Skill.GetSkillConfig(taretSkillId)
  102. skillDesc = skillCfg.desc
  103. end
  104. local function populateMsgAttr(attrNet, attrCfg, attrId, elfLv, isMax)
  105. attrNet.nowAttr.key = attrId
  106. attrNet.nowAttr.value = attrCfg[1] * elfLv + attrCfg[2]
  107. attrNet.addAtrr.key = attrId
  108. attrNet.addAtrr.value = attrCfg[1]
  109. if isMax then
  110. attrNet.addAtrr.value = 0
  111. end
  112. end
  113. local function populateMsgAttr2(attrNet, attrId, attrVal, elfStar, isMax)
  114. attrNet.nowAttr.key = attrId
  115. attrNet.nowAttr.value = attrVal * elfStar
  116. attrNet.addAtrr.key = attrId
  117. attrNet.addAtrr.value = attrVal
  118. if isMax then
  119. attrNet.addAtrr.value = 0
  120. end
  121. end
  122. --是否开启本系统
  123. local function isOpen(human)
  124. local towerLevel = HuanJingTowerLogic.getTowerLevel(human)
  125. if towerLevel >= ELF_COND_TOWER_LEVEL then
  126. return true
  127. end
  128. return false
  129. end
  130. -- 重算战力
  131. local function updatePower(human)
  132. RoleAttr.cleanHeroAttrCache(human)
  133. RoleAttr.doCalc(human)
  134. ObjHuman.sendAttr(human, RoleDefine.ZHANDOULI)
  135. end
  136. --红点判断
  137. local function dotJudgment(human, cfgHtbl)
  138. local elfData = getElfData(human)
  139. for id, cfg in pairs(cfgHtbl) do
  140. local nowLevel, nowStar = 0, 0
  141. if elfData and elfData[id] then
  142. nowLevel = elfData[id].level
  143. nowStar = elfData[id].star
  144. end
  145. if nowLevel < cfg.elfMaxLv then
  146. nowLevel = nowLevel + 1
  147. local costItemCnt = nowLevel * 3 + 2
  148. if BagLogic.getItemCnt(human, cfg.upGradeLvItemId) >= costItemCnt then
  149. return true
  150. end
  151. end
  152. if nowStar < cfg.elfMaxStar then
  153. local upGradeStarCostCnt = getNextStarCostCnt(nowStar+1)
  154. if BagLogic.getItemCnt(human, cfg.upGradeStarItemId) >= upGradeStarCostCnt then
  155. return true
  156. end
  157. end
  158. end
  159. return false
  160. end
  161. -- 红点更新
  162. local function updateDot(human, targetQuality)
  163. local cfgHtbl = generateCfgByQuality(targetQuality)
  164. -- 该品质的所有精灵不能升星和升级了
  165. if not dotJudgment(human, cfgHtbl) then
  166. local dotID = 0
  167. if type == 1 then
  168. dotID = RoleSystemDefine.ROLE_SYS_ID_2032
  169. elseif type == 2 then
  170. dotID = RoleSystemDefine.ROLE_SYS_ID_2033
  171. elseif type == 3 then
  172. dotID = RoleSystemDefine.ROLE_SYS_ID_2034
  173. else
  174. dotID = RoleSystemDefine.ROLE_SYS_ID_2035
  175. end
  176. --刷新单页
  177. RoleSystemLogic.onDot(human, dotID)
  178. --刷新入口处
  179. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_2031)
  180. end
  181. end
  182. -- 精灵加成
  183. function doCalcHero(human, addAttrs)
  184. local elfData = getElfData(human)
  185. if not elfData then
  186. return
  187. end
  188. for elfId, singleElfData in pairs(elfData) do
  189. local elfCfg = getElfCfgById(elfId)
  190. if elfCfg then
  191. -- 等级加成
  192. if singleElfData.level > 0 then
  193. local atkVal = singleElfData.level * elfCfg.nAttack1[1] + elfCfg.nAttack1[2]
  194. local hpVal = singleElfData.level * elfCfg.nLife1[1] + elfCfg.nLife1[2]
  195. RoleAttr.updateValue(RoleDefine.ATK, atkVal, addAttrs)
  196. RoleAttr.updateValue(RoleDefine.HP, hpVal, addAttrs)
  197. end
  198. -- 星级加成
  199. RoleAttr.updateValue(RoleDefine.ATK, elfCfg.nAttack2 * singleElfData.star, addAttrs)
  200. RoleAttr.updateValue(RoleDefine.HP, elfCfg.nLife2 * singleElfData.star, addAttrs)
  201. RoleAttr.updateValue(RoleDefine.DEF, elfCfg.nDefense2 * singleElfData.star, addAttrs)
  202. RoleAttr.updateValue(RoleDefine.SPEED, elfCfg.nSpeed2 * singleElfData.star, addAttrs)
  203. end
  204. end
  205. end
  206. function isDot(human, dotConfig)
  207. if not isOpen(human) then
  208. return false
  209. end
  210. --入口处的红点判断
  211. if dotConfig.id == RoleSystemDefine.ROLE_SYS_ID_2031 then
  212. return dotJudgment(human, ElfConfig.Elf)
  213. else
  214. --单个分页的红点
  215. local elfQuality = 0
  216. if dotConfig.id == RoleSystemDefine.ROLE_SYS_ID_2032 then
  217. elfQuality = 1
  218. elseif dotConfig.id == RoleSystemDefine.ROLE_SYS_ID_2033 then
  219. elfQuality = 2
  220. elseif dotConfig.id == RoleSystemDefine.ROLE_SYS_ID_2034 then
  221. elfQuality = 3
  222. else
  223. elfQuality = 4
  224. end
  225. local cfgHtbl = generateCfgByQuality(elfQuality)
  226. if not cfgHtbl then
  227. return false
  228. end
  229. return dotJudgment(human, cfgHtbl)
  230. end
  231. end
  232. -- 是否激活了精灵
  233. function IsActivateElf(human, elfId)
  234. if not isOpen(human) then
  235. return false
  236. end
  237. local elfData = getElfData(human)
  238. if not elfData or not elfData[elfId] then
  239. return false
  240. end
  241. return true
  242. end
  243. -- 获取精灵当前技能
  244. function GetElfSkill(human, elfId)
  245. if not isOpen(human) then
  246. return
  247. end
  248. local elfData = getElfData(human)
  249. if not elfData or not elfData[elfId] then
  250. return
  251. end
  252. local elfNowStar = elfData[elfId].star
  253. local elfCfg = getElfCfgById(elfId)
  254. if not elfCfg then
  255. return
  256. end
  257. return elfCfg.skillArr[elfNowStar]
  258. end
  259. -- 请求某个品质的所有精灵的简单数据
  260. function Elf_SimpleData_Query(human, targetElfQuality)
  261. if not isOpen(human) then
  262. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  263. end
  264. local msgRet = Msg.gc.GC_ELF_SIMPLEDATA_QUERY
  265. local elfArr = msgRet.elfArr
  266. elfArr[0] = 0
  267. local len = 0
  268. local elfData = getElfData(human) or {}
  269. for _, elfCfg in ipairs(ElfConfig.Elf) do
  270. if elfCfg.elfQuality == targetElfQuality then
  271. local elfId = elfCfg.elfId
  272. local itemCfg = ItemConfig[elfId]
  273. if itemCfg then
  274. len = len + 1
  275. populateMsgSimpleData(elfArr[len], elfCfg, itemCfg, elfData[elfId])
  276. end
  277. end
  278. end
  279. elfArr[0] = len
  280. Msg.send(msgRet, human.fd)
  281. end
  282. -- 请求某个精灵的详细数据
  283. function Elf_SingleElf_Query(human, elfId)
  284. if not isOpen(human) then
  285. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  286. end
  287. local itemCfg = ItemConfig[elfId]
  288. local elfCfg = getElfCfgById(elfId)
  289. if not itemCfg or not elfCfg then
  290. return Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
  291. end
  292. local elfData = getElfData(human) or {}
  293. local targetElfData = elfData[elfId]
  294. local msgRet = Msg.gc.GC_ELF_SINGLE_QUERY
  295. populateMsgSimpleData(msgRet.elfSimpleData, elfCfg, itemCfg, targetElfData)
  296. local elfNowLv = targetElfData and targetElfData.level or 0
  297. local elfNowStar = targetElfData and targetElfData.star or 0
  298. local elfSkillDataMsg = msgRet.elfSkillData
  299. elfSkillDataMsg.nowSkillDesc = ""
  300. local elfNowSkillId = elfCfg.skillArr[elfNowStar]
  301. local nowSkillCfg = Skill.GetSkillConfig(elfNowSkillId)
  302. if nowSkillCfg then
  303. elfSkillDataMsg.nowSkillDesc = nowSkillCfg.desc
  304. end
  305. elfSkillDataMsg.nextSkillDesc = ""
  306. local elfNextSkillId = elfCfg.skillArr[elfNowStar+1]
  307. local nextSkillCfg = Skill.GetSkillConfig(elfNextSkillId)
  308. if nextSkillCfg then
  309. elfSkillDataMsg.nextSkillDesc = nextSkillCfg.desc
  310. end
  311. elfSkillDataMsg.maxSkillDesc = ""
  312. local elfMaxSkillId = elfCfg.skillArr[#elfCfg.skillArr]
  313. local maxSkillCfg = Skill.GetSkillConfig(elfMaxSkillId)
  314. if maxSkillCfg then
  315. elfSkillDataMsg.maxSkillDesc = maxSkillCfg.desc
  316. end
  317. local isMaxLv, isMaxStar = false, false
  318. if elfNowLv >= elfCfg.elfMaxLv then
  319. isMaxLv = true
  320. end
  321. if elfNowStar >= elfCfg.elfMaxStar then
  322. isMaxStar = true
  323. end
  324. msgRet.elfLvAttrInfo[0] = 2
  325. populateMsgAttr(msgRet.elfLvAttrInfo[1], elfCfg.nAttack1, RoleDefine.ATK, elfNowLv, isMaxLv)
  326. populateMsgAttr(msgRet.elfLvAttrInfo[2], elfCfg.nLife1, RoleDefine.HP, elfNowLv, isMaxLv)
  327. msgRet.elfStarAttrInfo[0] = 4
  328. populateMsgAttr2(msgRet.elfStarAttrInfo[1], RoleDefine.HP, elfCfg.nLife2, elfNowStar, isMaxStar)
  329. populateMsgAttr2(msgRet.elfStarAttrInfo[2], RoleDefine.ATK, elfCfg.nAttack2, elfNowStar, isMaxStar)
  330. populateMsgAttr2(msgRet.elfStarAttrInfo[3], RoleDefine.DEF, elfCfg.nDefense2, elfNowStar, isMaxStar)
  331. populateMsgAttr2(msgRet.elfStarAttrInfo[4], RoleDefine.SPEED, elfCfg.nSpeed2, elfNowStar, isMaxStar)
  332. Msg.send(msgRet, human.fd)
  333. end
  334. -- 精灵升级
  335. function Elf_UpGradeLv(human, elfId)
  336. if not isOpen(human) then
  337. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  338. end
  339. local elfCfg = getElfCfgById(elfId)
  340. if not elfCfg then
  341. return Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
  342. end
  343. local elfData = getElfData(human) or {}
  344. local elfNowLv = elfData[elfId] and elfData[elfId].level or 0
  345. if elfNowLv >= elfCfg.elfMaxLv then
  346. return Broadcast.sendErr(human, Lang.COMMON_MAXLEVEL)
  347. end
  348. local upGradeLvItemId = elfCfg.upGradeLvItemId
  349. local upGradeLvItemCnt = elfNowLv == elfCfg.elfMaxLv and 0 or (elfNowLv + 1) * 3 + 2
  350. if BagLogic.getItemCnt(human, upGradeLvItemId) < upGradeLvItemCnt then
  351. return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
  352. end
  353. BagLogic.delItem(human, upGradeLvItemId, upGradeLvItemCnt, ELF_UPGRADELV_LOG_TAG)
  354. updateElfData(human, elfId, elfNowLv+1)
  355. Elf_SingleElf_Query(human, elfId)
  356. updatePower(human)
  357. -- 红点刷新
  358. updateDot(human, elfCfg.elfQuality)
  359. end
  360. -- 精灵升星
  361. function Elf_UpGradeStar(human, elfId)
  362. if not isOpen(human) then
  363. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  364. end
  365. local elfCfg = getElfCfgById(elfId)
  366. if not elfCfg then
  367. return Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
  368. end
  369. local elfData = getElfData(human) or {}
  370. local elfNowStar = elfData[elfId] and elfData[elfId].star or 0
  371. if elfNowStar >= elfCfg.elfMaxStar then
  372. return Broadcast.sendErr(human, Lang.COMMON_MAXLEVEL)
  373. end
  374. local nextStar = elfNowStar+1
  375. local upGradeStarItemId = elfCfg.upGradeStarItemId
  376. local upGradeStarItemCnt = getNextStarCostCnt(nextStar)
  377. if upGradeStarItemCnt == 0 then
  378. return Broadcast.sendErr(human, Lang.ELF_MAX_STAR)
  379. end
  380. if BagLogic.getItemCnt(human, upGradeStarItemId) < upGradeStarItemCnt then
  381. return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
  382. end
  383. BagLogic.delItem(human, upGradeStarItemId, upGradeStarItemCnt, ELF_UPGRADESTAR_LOG_TAG)
  384. updateElfData(human, elfId, nil, nextStar)
  385. Elf_SingleElf_Query(human, elfId)
  386. updatePower(human)
  387. -- 红点刷新
  388. updateDot(human, elfCfg.elfQuality)
  389. end
  390. -- 布阵界面, 请求精灵数据
  391. function Elf_GetElfData_FromPosPage(human, targetElfQuality)
  392. local msgRet = Msg.gc.GC_ELF_POS_QUERY
  393. local elfArr = msgRet.elfArr
  394. elfArr[0] = 0
  395. local len = 0
  396. local elfData = getElfData(human) or {}
  397. for _, elfCfg in ipairs(ElfConfig.Elf) do
  398. if elfCfg.elfQuality == targetElfQuality then
  399. local elfId = elfCfg.elfId
  400. local itemCfg = ItemConfig[elfId]
  401. if itemCfg then
  402. len = len + 1
  403. local elfNowLv = elfData and elfData.level or 0
  404. local elfNowStar = elfData[elfId] and elfData[elfId].star or 0
  405. elfArr[len].elfId = elfId
  406. elfArr[len].elfName = itemCfg.name
  407. elfArr[len].elfIcon = itemCfg.icon
  408. elfArr[len].elfLv = elfNowLv
  409. elfArr[len].elfStar = elfNowStar
  410. elfArr[len].elfQuality = targetElfQuality
  411. elfArr[len].nowSkillDesc = ""
  412. elfArr[len].nowSkillIcon = ""
  413. local elfNowSkillId = elfCfg.skillArr[elfNowStar]
  414. local nowSkillCfg = Skill.GetSkillConfig(elfNowSkillId)
  415. if nowSkillCfg then
  416. elfArr[len].nowSkillDesc = nowSkillCfg.desc
  417. elfArr[len].nowSkillIcon = nowSkillCfg.icon
  418. end
  419. end
  420. end
  421. end
  422. elfArr[0] = len
  423. Msg.send(msgRet, human.fd)
  424. end