TalismanLogic.lua 9.9 KB

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