ElfLogic.lua 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519
  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 populateMsgAttr(attrNet, attrCfg, attrId, elfLv, isMax)
  101. attrNet.nowAttr.key = attrId
  102. attrNet.nowAttr.value = attrCfg[1] * elfLv + attrCfg[2]
  103. attrNet.addAtrr.key = attrId
  104. attrNet.addAtrr.value = attrCfg[1]
  105. if isMax then
  106. attrNet.addAtrr.value = 0
  107. end
  108. end
  109. local function populateMsgAttr2(attrNet, attrId, attrVal, elfStar, isMax)
  110. attrNet.nowAttr.key = attrId
  111. attrNet.nowAttr.value = attrVal * elfStar
  112. attrNet.addAtrr.key = attrId
  113. attrNet.addAtrr.value = attrVal
  114. if isMax then
  115. attrNet.addAtrr.value = 0
  116. end
  117. end
  118. --是否开启本系统
  119. local function isOpen(human)
  120. local towerLevel = HuanJingTowerLogic.getTowerLevel(human)
  121. if towerLevel >= ELF_COND_TOWER_LEVEL then
  122. return true
  123. end
  124. return false
  125. end
  126. -- 重算战力
  127. local function updatePower(human)
  128. RoleAttr.cleanHeroAttrCache(human)
  129. RoleAttr.doCalc(human)
  130. ObjHuman.sendAttr(human, RoleDefine.ZHANDOULI)
  131. end
  132. --红点判断
  133. local function dotJudgment(human, cfgHtbl)
  134. local elfData = getElfData(human)
  135. for id, cfg in pairs(cfgHtbl) do
  136. local nowLevel, nowStar = 0, 0
  137. if elfData and elfData[id] then
  138. nowLevel = elfData[id].level
  139. nowStar = elfData[id].star
  140. end
  141. if nowLevel < cfg.elfMaxLv then
  142. nowLevel = nowLevel + 1
  143. local costItemCnt = nowLevel * 3 + 2
  144. if BagLogic.getItemCnt(human, cfg.upGradeLvItemId) >= costItemCnt then
  145. return true
  146. end
  147. end
  148. if nowStar < cfg.elfMaxStar then
  149. local upGradeStarCostCnt = getNextStarCostCnt(nowStar+1)
  150. if BagLogic.getItemCnt(human, cfg.upGradeStarItemId) >= upGradeStarCostCnt then
  151. return true
  152. end
  153. end
  154. end
  155. return false
  156. end
  157. -- 红点更新
  158. local function updateDot(human, targetQuality)
  159. local cfgHtbl = generateCfgByQuality(targetQuality)
  160. -- 该品质的所有精灵不能升星和升级了
  161. if not dotJudgment(human, cfgHtbl) then
  162. local dotID = 0
  163. if type == 1 then
  164. dotID = RoleSystemDefine.ROLE_SYS_ID_2032
  165. elseif type == 2 then
  166. dotID = RoleSystemDefine.ROLE_SYS_ID_2033
  167. elseif type == 3 then
  168. dotID = RoleSystemDefine.ROLE_SYS_ID_2034
  169. else
  170. dotID = RoleSystemDefine.ROLE_SYS_ID_2035
  171. end
  172. --刷新单页
  173. RoleSystemLogic.onDot(human, dotID)
  174. --刷新入口处
  175. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_2031)
  176. end
  177. end
  178. -- 精灵加成
  179. function doCalcHero(human, addAttrs)
  180. local elfData = getElfData(human)
  181. if not elfData then
  182. return
  183. end
  184. for elfId, singleElfData in pairs(elfData) do
  185. local elfCfg = getElfCfgById(elfId)
  186. if elfCfg then
  187. -- 等级加成
  188. if singleElfData.level > 0 then
  189. local atkVal = singleElfData.level * elfCfg.nAttack1[1] + elfCfg.nAttack1[2]
  190. local hpVal = singleElfData.level * elfCfg.nLife1[1] + elfCfg.nLife1[2]
  191. RoleAttr.updateValue(RoleDefine.ATK, atkVal, addAttrs)
  192. RoleAttr.updateValue(RoleDefine.HP, hpVal, addAttrs)
  193. end
  194. -- 星级加成
  195. RoleAttr.updateValue(RoleDefine.ATK, elfCfg.nAttack2 * singleElfData.star, addAttrs)
  196. RoleAttr.updateValue(RoleDefine.HP, elfCfg.nLife2 * singleElfData.star, addAttrs)
  197. RoleAttr.updateValue(RoleDefine.DEF, elfCfg.nDefense2 * singleElfData.star, addAttrs)
  198. RoleAttr.updateValue(RoleDefine.SPEED, elfCfg.nSpeed2 * singleElfData.star, addAttrs)
  199. end
  200. end
  201. end
  202. function isDot(human, dotConfig)
  203. if not isOpen(human) then
  204. return false
  205. end
  206. --入口处的红点判断
  207. if dotConfig.id == RoleSystemDefine.ROLE_SYS_ID_2031 then
  208. return dotJudgment(human, ElfConfig.Elf)
  209. else
  210. --单个分页的红点
  211. local elfQuality = 0
  212. if dotConfig.id == RoleSystemDefine.ROLE_SYS_ID_2032 then
  213. elfQuality = 1
  214. elseif dotConfig.id == RoleSystemDefine.ROLE_SYS_ID_2033 then
  215. elfQuality = 2
  216. elseif dotConfig.id == RoleSystemDefine.ROLE_SYS_ID_2034 then
  217. elfQuality = 3
  218. else
  219. elfQuality = 4
  220. end
  221. local cfgHtbl = generateCfgByQuality(elfQuality)
  222. if not cfgHtbl then
  223. return false
  224. end
  225. return dotJudgment(human, cfgHtbl)
  226. end
  227. end
  228. -- 是否激活了精灵
  229. function IsActivateElf(human, elfId)
  230. if not isOpen(human) then
  231. return false
  232. end
  233. local elfData = getElfData(human)
  234. if not elfData or not elfData[elfId] then
  235. return false
  236. end
  237. return true
  238. end
  239. -- 获取精灵当前技能
  240. function GetElfSkill(human, elfId)
  241. if not isOpen(human) then
  242. return
  243. end
  244. local elfData = getElfData(human)
  245. if not elfData or not elfData[elfId] then
  246. return
  247. end
  248. local elfNowStar = elfData[elfId].star
  249. local elfCfg = getElfCfgById(elfId)
  250. if not elfCfg then
  251. return
  252. end
  253. return elfCfg.skillArr[elfNowStar]
  254. end
  255. -- 请求某个品质的所有精灵的简单数据
  256. function Elf_SimpleData_Query(human, targetElfQuality)
  257. if not isOpen(human) then
  258. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  259. end
  260. local msgRet = Msg.gc.GC_ELF_SIMPLEDATA_QUERY
  261. local elfArr = msgRet.elfArr
  262. elfArr[0] = 0
  263. local len = 0
  264. local elfData = getElfData(human) or {}
  265. for _, elfCfg in ipairs(ElfConfig.Elf) do
  266. if elfCfg.elfQuality == targetElfQuality then
  267. local elfId = elfCfg.elfId
  268. local itemCfg = ItemConfig[elfId]
  269. if itemCfg then
  270. len = len + 1
  271. populateMsgSimpleData(elfArr[len], elfCfg, itemCfg, elfData[elfId])
  272. end
  273. end
  274. end
  275. elfArr[0] = len
  276. Msg.send(msgRet, human.fd)
  277. end
  278. -- 请求某个精灵的详细数据
  279. function Elf_SingleElf_Query(human, elfId)
  280. if not isOpen(human) then
  281. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  282. end
  283. local itemCfg = ItemConfig[elfId]
  284. local elfCfg = getElfCfgById(elfId)
  285. if not itemCfg or not elfCfg then
  286. return Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
  287. end
  288. local elfData = getElfData(human) or {}
  289. local targetElfData = elfData[elfId]
  290. local msgRet = Msg.gc.GC_ELF_SINGLE_QUERY
  291. populateMsgSimpleData(msgRet.elfSimpleData, elfCfg, itemCfg, targetElfData)
  292. local elfNowLv = targetElfData and targetElfData.level or 0
  293. local elfNowStar = targetElfData and targetElfData.star or 0
  294. local isMaxLv, isMaxStar = false, false
  295. if elfNowLv >= elfCfg.elfMaxLv then
  296. isMaxLv = true
  297. end
  298. if elfNowStar >= elfCfg.elfMaxStar then
  299. isMaxStar = true
  300. end
  301. local elfSkillDataMsg = msgRet.elfSkillData
  302. elfSkillDataMsg.nowSkillDesc = ""
  303. local elfNowSkillId = elfCfg.skillArr[elfNowStar]
  304. local nowSkillCfg = Skill.GetSkillConfig(elfNowSkillId)
  305. if nowSkillCfg then
  306. elfSkillDataMsg.nowSkillDesc = nowSkillCfg.desc
  307. end
  308. elfSkillDataMsg.nextSkillDesc = ""
  309. local elfNextSkillId = isMaxStar and elfCfg.skillArr[#elfCfg.skillArr] or elfCfg.skillArr[elfNowStar+1]
  310. local nextSkillCfg = Skill.GetSkillConfig(elfNextSkillId)
  311. if nextSkillCfg then
  312. elfSkillDataMsg.nextSkillDesc = nextSkillCfg.desc
  313. end
  314. elfSkillDataMsg.maxSkillDesc = ""
  315. local elfMaxSkillId = elfCfg.skillArr[#elfCfg.skillArr]
  316. local maxSkillCfg = Skill.GetSkillConfig(elfMaxSkillId)
  317. if maxSkillCfg then
  318. elfSkillDataMsg.maxSkillDesc = maxSkillCfg.desc
  319. end
  320. msgRet.elfLvAttrInfo[0] = 2
  321. populateMsgAttr(msgRet.elfLvAttrInfo[1], elfCfg.nAttack1, RoleDefine.ATK, elfNowLv, isMaxLv)
  322. populateMsgAttr(msgRet.elfLvAttrInfo[2], elfCfg.nLife1, RoleDefine.HP, elfNowLv, isMaxLv)
  323. msgRet.elfStarAttrInfo[0] = 4
  324. populateMsgAttr2(msgRet.elfStarAttrInfo[1], RoleDefine.HP, elfCfg.nLife2, elfNowStar, isMaxStar)
  325. populateMsgAttr2(msgRet.elfStarAttrInfo[2], RoleDefine.ATK, elfCfg.nAttack2, elfNowStar, isMaxStar)
  326. populateMsgAttr2(msgRet.elfStarAttrInfo[3], RoleDefine.DEF, elfCfg.nDefense2, elfNowStar, isMaxStar)
  327. populateMsgAttr2(msgRet.elfStarAttrInfo[4], RoleDefine.SPEED, elfCfg.nSpeed2, elfNowStar, isMaxStar)
  328. Msg.send(msgRet, human.fd)
  329. end
  330. -- 精灵升级
  331. function Elf_UpGradeLv(human, elfId)
  332. if not isOpen(human) then
  333. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  334. end
  335. local elfCfg = getElfCfgById(elfId)
  336. if not elfCfg then
  337. return Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
  338. end
  339. local elfData = getElfData(human) or {}
  340. local elfNowLv = elfData[elfId] and elfData[elfId].level or 0
  341. if elfNowLv >= elfCfg.elfMaxLv then
  342. return Broadcast.sendErr(human, Lang.COMMON_MAXLEVEL)
  343. end
  344. local upGradeLvItemId = elfCfg.upGradeLvItemId
  345. local upGradeLvItemCnt = (elfNowLv + 1) * 3 + 2
  346. if BagLogic.getItemCnt(human, upGradeLvItemId) < upGradeLvItemCnt then
  347. return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
  348. end
  349. BagLogic.delItem(human, upGradeLvItemId, upGradeLvItemCnt, ELF_UPGRADELV_LOG_TAG)
  350. updateElfData(human, elfId, elfNowLv+1)
  351. Elf_SingleElf_Query(human, elfId)
  352. updatePower(human)
  353. -- 红点刷新
  354. updateDot(human, elfCfg.elfQuality)
  355. end
  356. -- 精灵升星
  357. function Elf_UpGradeStar(human, elfId)
  358. if not isOpen(human) then
  359. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  360. end
  361. local elfCfg = getElfCfgById(elfId)
  362. if not elfCfg then
  363. return Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
  364. end
  365. local elfData = getElfData(human) or {}
  366. local elfNowStar = elfData[elfId] and elfData[elfId].star or 0
  367. if elfNowStar >= elfCfg.elfMaxStar then
  368. return Broadcast.sendErr(human, Lang.COMMON_MAXLEVEL)
  369. end
  370. local nextStar = elfNowStar+1
  371. local upGradeStarItemId = elfCfg.upGradeStarItemId
  372. local upGradeStarItemCnt = getNextStarCostCnt(nextStar)
  373. if upGradeStarItemCnt == 0 then
  374. return Broadcast.sendErr(human, Lang.ELF_MAX_STAR)
  375. end
  376. if BagLogic.getItemCnt(human, upGradeStarItemId) < upGradeStarItemCnt then
  377. return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
  378. end
  379. BagLogic.delItem(human, upGradeStarItemId, upGradeStarItemCnt, ELF_UPGRADESTAR_LOG_TAG)
  380. updateElfData(human, elfId, nil, nextStar)
  381. Elf_SingleElf_Query(human, elfId)
  382. updatePower(human)
  383. -- 红点刷新
  384. updateDot(human, elfCfg.elfQuality)
  385. end
  386. -- 布阵界面, 请求精灵数据
  387. function Elf_GetElfData_FromPosPage(human, targetElfQuality)
  388. local msgRet = Msg.gc.GC_ELF_POS_QUERY
  389. local elfArr = msgRet.elfArr
  390. elfArr[0] = 0
  391. local len = 0
  392. local elfData = getElfData(human) or {}
  393. for _, elfCfg in ipairs(ElfConfig.Elf) do
  394. if elfCfg.elfQuality == targetElfQuality then
  395. local elfId = elfCfg.elfId
  396. local itemCfg = ItemConfig[elfId]
  397. if itemCfg then
  398. len = len + 1
  399. local elfNowLv = elfData and elfData.level or 0
  400. local elfNowStar = elfData[elfId] and elfData[elfId].star or 0
  401. elfArr[len].elfId = elfId
  402. elfArr[len].elfName = itemCfg.name
  403. elfArr[len].elfIcon = itemCfg.icon
  404. elfArr[len].elfLv = elfNowLv
  405. elfArr[len].elfStar = elfNowStar
  406. elfArr[len].elfQuality = targetElfQuality
  407. elfArr[len].nowSkillDesc = ""
  408. elfArr[len].nowSkillIcon = ""
  409. local elfNowSkillId = elfCfg.skillArr[elfNowStar]
  410. local nowSkillCfg = Skill.GetSkillConfig(elfNowSkillId)
  411. if nowSkillCfg then
  412. elfArr[len].nowSkillDesc = nowSkillCfg.desc
  413. elfArr[len].nowSkillIcon = nowSkillCfg.icon
  414. end
  415. end
  416. end
  417. end
  418. elfArr[0] = len
  419. Msg.send(msgRet, human.fd)
  420. end