TalismanLogic.lua 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. --秘宝系统
  2. --[=[
  3. db
  4. human.db.talismanData =
  5. {
  6. [ID1] = level,
  7. [ID2] = level,
  8. }
  9. ]=]--
  10. local Msg = require("core.Msg")
  11. local Grid = require("bag.Grid")
  12. local BagLogic = require("bag.BagLogic")
  13. local Lang = require("common.Lang")
  14. local RoleAttr = require("role.RoleAttr")
  15. local RoleDefine = require("role.RoleDefine")
  16. local ObjHuman = require("core.ObjHuman")
  17. local Broadcast = require("broadcast.Broadcast")
  18. local talismanConfig = require("excel.talisman").talisman
  19. local HeroConfig = require("excel.hero").hero
  20. local HuanJingTowerLogic = require("huanjingTower.HuanjingTowerLogic")
  21. local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
  22. local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
  23. local LOGTYPE = "talisman"
  24. local COND_TOWER_LEVEL = 100 --开启本系统需要通关恶魔之塔的层数
  25. --秘宝对挂机钻石/情报等其他方面加成标识
  26. OTHER_EFFECT_TBL = {
  27. ["GJ_QB"] = "GJ_QB", --挂机情报类型
  28. ["GJ_ZS"] = "GJ_ZS", --挂机钻石类型
  29. ["GJ_HERO_EXP"] = "GJ_HERO_EXP", --挂机英雄经验类型
  30. ["GJ_SD_FREE_CNT"] = "GJ_SD_FREE_CNT", --每日扫荡次数类型
  31. ["DJ"] = "DJ", --点金
  32. ["NW_JB"] = "NW_JB", --女巫森林金币类型
  33. ["NW_HERO_EXP"] = "NW_HERO_EXP", --女巫森林英雄经验类型
  34. ["DRILL_JINBI"] = "DRILL_JINBI", --勇者试炼金币类型
  35. }
  36. --是否开启本系统
  37. local function isOpen(human)
  38. local towerLevel = HuanJingTowerLogic.getTowerLevel(human)
  39. if towerLevel >= COND_TOWER_LEVEL then
  40. return true
  41. end
  42. return false
  43. end
  44. --取对应类型的秘宝配置
  45. local function generateCfgByType(type_m)
  46. local tbl = {}
  47. for id, cfg in pairs(talismanConfig) do
  48. if cfg.type == type_m then
  49. tbl[id] = cfg
  50. tbl[id].id = id
  51. end
  52. end
  53. if not next(tbl) then
  54. return nil
  55. end
  56. return tbl
  57. end
  58. --填充协议的数据
  59. local function populateMsg(config, msgTb, nLevel)
  60. msgTb.id = config.id
  61. msgTb.name = config.name
  62. msgTb.iconId = config.iconId
  63. msgTb.level = nLevel
  64. local descVec = msgTb.descVec
  65. local effectDescCfg = config.effectDesc
  66. descVec[0] = #effectDescCfg
  67. for idx, desc in ipairs(effectDescCfg) do
  68. local singleDesc = descVec[idx]
  69. singleDesc.desc = desc
  70. singleDesc.isActivate = nLevel >= idx and 1 or 0
  71. end
  72. if nLevel < config.maxLevel then
  73. nLevel = nLevel + 1
  74. nLevel = math.ceil(nLevel/3)
  75. else
  76. nLevel = 0
  77. end
  78. Grid.makeItem(msgTb.upGradeCost, config.costItemId, nLevel)
  79. end
  80. -- local function send(human, type_m)
  81. -- local cfg = generateCfgByType(type_m)
  82. -- if not cfg then
  83. -- return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  84. -- end
  85. -- local msgRet = Msg.gc.GC_TALISMAN_QUERY
  86. -- msgRet.type = type_m
  87. -- local talismanVec = msgRet.talismanVec
  88. -- talismanVec[0] = #cfg
  89. -- local talismanData
  90. -- if human.db.talismanData and human.db.talismanData[type_m] then
  91. -- talismanData = human.db.talismanData[type_m]
  92. -- end
  93. -- local mathCeil = math.ceil
  94. -- for i = 1, #cfg do
  95. -- local singleCfg = cfg[i]
  96. -- local singleTalisman = talismanVec[i]
  97. -- singleTalisman.id = singleCfg.id
  98. -- singleTalisman.name = singleCfg.name
  99. -- singleTalisman.iconId = singleCfg.iconId
  100. -- local nLevel = 0
  101. -- if talismanData and talismanData[singleCfg.id] then
  102. -- nLevel = talismanData[singleCfg.id]
  103. -- end
  104. -- singleTalisman.level = nLevel
  105. -- local descList = singleTalisman.descList
  106. -- local effectDescCfg = singleCfg.effectDesc
  107. -- descList[0] = #effectDescCfg
  108. -- for j = 1, #effectDescCfg do
  109. -- local singleDesc = descList[j]
  110. -- singleDesc.desc = effectDescCfg[j]
  111. -- singleDesc.isActivate = nLevel >= j and 1 or 0
  112. -- end
  113. -- if nLevel < singleCfg.maxLevel then
  114. -- nLevel = nLevel + 1
  115. -- nLevel = mathCeil(nLevel/3)
  116. -- else
  117. -- nLevel = 0
  118. -- end
  119. -- Grid.makeItem(singleTalisman.upGradeCost, singleCfg.costItemId, nLevel)
  120. -- end
  121. -- Msg.send(msgRet, human.fd)
  122. -- end
  123. --红点判断
  124. local function dotJudgment(human, cfgHtbl)
  125. local talismanData = human.db.talismanData
  126. for id, cfg in pairs(cfgHtbl) do
  127. local nLevel = 0
  128. if talismanData and talismanData[id] then
  129. nLevel = talismanData[id]
  130. end
  131. if nLevel < cfg.maxLevel then
  132. nLevel = nLevel + 1
  133. local costItemCnt = math.ceil(nLevel/3)
  134. if BagLogic.getItemCnt(human, cfg.costItemId) >= costItemCnt then
  135. return true
  136. end
  137. end
  138. end
  139. return false
  140. end
  141. --GM命令, 设置秘宝等级
  142. function GmSetlevel(human, id, level)
  143. local config = talismanConfig[id]
  144. if not config then
  145. return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  146. end
  147. if level > config.maxLevel then
  148. level = config.maxLevel
  149. end
  150. if level < 0 then
  151. level = 0
  152. end
  153. human.db.talismanData = human.db.talismanData or {}
  154. human.db.talismanData[id] = level
  155. end
  156. --秘宝对英雄属性加成
  157. function doCalcHero(human, heroGrid, addAttrs)
  158. if not human or not heroGrid then
  159. return
  160. end
  161. local talismanData = human.db.talismanData
  162. if not talismanData then
  163. return
  164. end
  165. local heroCfg = HeroConfig[heroGrid.id]
  166. for id, level in pairs(talismanData) do
  167. local attrs = talismanConfig[id].attrs
  168. for i=1, level do
  169. local singleAttr = attrs[i]
  170. if #singleAttr == 2 and type(singleAttr[1]) == "number" then --给所有英雄加属性
  171. RoleAttr.updateValue(singleAttr[1], singleAttr[2], addAttrs)
  172. elseif #singleAttr == 3 then --只给某个种族的英雄加属性
  173. if singleAttr[1] == heroCfg.camp then
  174. RoleAttr.updateValue(singleAttr[2], singleAttr[3], addAttrs)
  175. end
  176. end
  177. end
  178. end
  179. end
  180. --红点
  181. function isDot(human, dotConfig)
  182. if not isOpen(human) then
  183. return false
  184. end
  185. --入口处的红点判断
  186. if dotConfig.id == RoleSystemDefine.ROLE_SYS_ID_2006 then
  187. return dotJudgment(human, talismanConfig)
  188. else
  189. --单个分页的红点
  190. local talismanType = 0
  191. if dotConfig.id == RoleSystemDefine.ROLE_SYS_ID_2007 then
  192. talismanType = 1
  193. elseif dotConfig.id == RoleSystemDefine.ROLE_SYS_ID_2008 then
  194. talismanType = 2
  195. elseif dotConfig.id == RoleSystemDefine.ROLE_SYS_ID_2009 then
  196. talismanType = 3
  197. else
  198. talismanType = 4
  199. end
  200. local cfgHtbl = generateCfgByType(talismanType)
  201. if not cfgHtbl then
  202. return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  203. end
  204. return dotJudgment(human, cfgHtbl)
  205. end
  206. end
  207. --秘宝对其他方面的加成, 如:挂机钻石
  208. function getTalismanAdd(human, type_m)
  209. local addValue = 0
  210. local talismanData = human.db.talismanData
  211. if not talismanData or not type_m then
  212. return addValue
  213. end
  214. for id, level in pairs(talismanData) do
  215. local cfg = talismanConfig[id]
  216. local attrs = cfg.attrs
  217. for i=1,#attrs do
  218. local singleAttr = attrs[i]
  219. local addType = singleAttr[1]
  220. if type(addType) == "string" and level >= i and type_m == addType then
  221. addValue = addValue + singleAttr[2]
  222. end
  223. end
  224. end
  225. return addValue
  226. end
  227. --查询
  228. function Query(human, type_m)
  229. if not type_m then
  230. return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  231. end
  232. if not isOpen(human) then
  233. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  234. end
  235. local cfgHtbl = generateCfgByType(type_m)
  236. if not cfgHtbl then
  237. return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  238. end
  239. local msgRet = Msg.gc.GC_TALISMAN_QUERY
  240. msgRet.type = type_m
  241. local talismanVec = msgRet.talismanVec
  242. local len = 0
  243. local talismanData = human.db.talismanData
  244. for id, cfg in pairs(cfgHtbl) do
  245. len = len + 1
  246. local nLevel = 0
  247. if talismanData and talismanData[id] then
  248. nLevel = talismanData[id]
  249. end
  250. populateMsg(cfg, talismanVec[len], nLevel)
  251. end
  252. talismanVec[0] = len
  253. Msg.send(msgRet, human.fd)
  254. end
  255. --升级
  256. function UpGrade(human, id)
  257. if not isOpen(human) then
  258. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  259. end
  260. local singleCfg = talismanConfig[id]
  261. if not singleCfg then
  262. return Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
  263. end
  264. local nLevel = 0
  265. local type = singleCfg.type
  266. --等级判断
  267. if human.db.talismanData and human.db.talismanData[id] then
  268. nLevel = human.db.talismanData[id]
  269. end
  270. if nLevel >= singleCfg.maxLevel then
  271. return Broadcast.sendErr(human, Lang.COMMON_MAXLEVEL)
  272. end
  273. --道具判断
  274. nLevel = nLevel + 1
  275. local costItemId = singleCfg.costItemId
  276. local costItemCnt = math.ceil(nLevel/3)
  277. if BagLogic.getItemCnt(human, costItemId) < costItemCnt then
  278. return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
  279. end
  280. BagLogic.delItem(human, costItemId, costItemCnt, LOGTYPE)
  281. --更新数据
  282. human.db.talismanData = human.db.talismanData or {}
  283. human.db.talismanData[id] = nLevel
  284. --下发数据
  285. local msgRet = Msg.gc.GC_TALISMAN_UPGRADE
  286. msgRet.type = type
  287. populateMsg(singleCfg, msgRet.talismanInfo, nLevel)
  288. Msg.send(msgRet, human.fd)
  289. --重算战力
  290. RoleAttr.cleanHeroAttrCache(human)
  291. RoleAttr.doCalc(human)
  292. ObjHuman.sendAttr(human, RoleDefine.ZHANDOULI)
  293. --刷新红点
  294. nLevel = nLevel + 1
  295. costItemCnt = math.ceil(nLevel/3)
  296. if nLevel >= singleCfg.maxLevel or BagLogic.getItemCnt(human, costItemId) < costItemCnt then
  297. local dotID = 0
  298. if type == 1 then
  299. dotID = RoleSystemDefine.ROLE_SYS_ID_2007
  300. elseif type == 2 then
  301. dotID = RoleSystemDefine.ROLE_SYS_ID_2008
  302. elseif type == 3 then
  303. dotID = RoleSystemDefine.ROLE_SYS_ID_2009
  304. else
  305. dotID = RoleSystemDefine.ROLE_SYS_ID_2010
  306. end
  307. --刷新单页
  308. RoleSystemLogic.onDot(human, dotID)
  309. --刷新入口处
  310. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_2006)
  311. end
  312. end