TalismanLogic.lua 10 KB

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