TalismanLogic.lua 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  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 TriggerDefine = require("trigger.TriggerDefine")
  24. local TriggerLogic = require("trigger.TriggerLogic")
  25. local ChengjiuLogic = require("chengjiu.ChengjiuLogic")
  26. local GiftLogic
  27. local LOGTYPE = "talisman"
  28. local COND_TOWER_LEVEL = 100 --开启本系统需要通关恶魔之塔的层数
  29. local TALISMAN_2_CHENGJIU_TASKID = 404 -- 秘宝系统对应的成就任务Id
  30. --秘宝对挂机钻石/情报等其他方面增益标识
  31. OTHER_EFFECT_TBL = {
  32. ["GJ_QB"] = "GJ_QB", --挂机情报类型
  33. ["GJ_ZS"] = "GJ_ZS", --挂机钻石类型
  34. ["GJ_HERO_EXP"] = "GJ_HERO_EXP", --挂机英雄经验类型
  35. ["GJ_HANG_HOURS"] = "GJ_HANG_HOURS", --挂机最大时间类型
  36. ["GJ_SD_FREE_CNT"] = "GJ_SD_FREE_CNT", --每日扫荡次数类型
  37. ["DJ"] = "DJ", --点金
  38. ["NW_JB"] = "NW_JB", --女巫森林金币类型
  39. ["NW_HERO_EXP"] = "NW_HERO_EXP", --女巫森林英雄经验类型
  40. ["NW_LHS"] = "NW_LHS", --女巫森林龙魂石
  41. ["DRILL_HERO_EXP"] = "DRILL_HERO_EXP", --勇者试炼英雄经验
  42. ["ZHANBU_MAX_POINTS"] = "ZHANBU_MAX_POINTS", --占卜最大积分类型
  43. ["JYZH_LOTTERY10"] = "JYZH_LOTTERY10", --精英召唤10连类型
  44. ["NW_FWJH"] = "NW_FWJH", --女巫森林符文精华
  45. ["NW_CHALLENGE_TIMES"] = "NW_CHALLENGE_TIMES", --女巫森林所有类型挑战次数
  46. ["XUANSHANG_QB_MAX"] = "XUANSHANG_QB_MAX", --悬赏情报上限
  47. ["ZHANBU_POS6"] = "ZHANBU_POS6", --占卜解锁格子6
  48. ["ZHANBU_POS7"] = "ZHANBU_POS7", --占卜解锁格子7
  49. ["ZHANBU_FRAGMENT"] = "ZHANBU_FRAGMENT", --占卜获得碎片加成
  50. ["BATTLE_ISQUICKTIME"] = "BATTLE_ISQUICKTIME", --主线闯关跳过战斗
  51. ["YJ_DAILY_SD"] = "YJ_DAILY_SD", -- 遗迹探险每日额外扫荡次数
  52. ["HJ_DAILY_Free"] = "HJ_DAILY_Free", -- 恶魔之塔每日额外免费次数
  53. ["HeroSeed_Attr_Mul"] = "HeroSeed_Attr_Mul", -- 英雄种子系统加成
  54. ["RoleReal_Attr_Mul"] = "RoleReal_Attr_Mul", -- 境界系统加成
  55. ["WinnerRelic_Attr_Mul"] = "WinnerRelic_Attr_Mul", -- 圣遗物系统通用属性加成
  56. ["Elf_Attr_Mul"] = "Elf_Attr_Mul", -- 精灵系统通用属性加成
  57. ["Moshou_LvAttr_Mul"] = "Moshou_LvAttr_Mul", -- 守护凤凰系统等级加成属性的加成
  58. ["HeroExclusiveWeapon_Attr_Mul"] = "HeroExclusiveWeapon_Attr_Mul", -- 英雄专属武器系统加成
  59. ["HeroTianYuan_Attr_Mul"] = "HeroTianYuan_Attr_Mul", -- 英雄天元系统加成
  60. ["HeroArtifacts_LvAttr_Mul"] = "HeroArtifacts_LvAttr_Mul", -- 英雄神威灵装系统加成
  61. ["HeroPubLogic_Attr_Mul"] = "HeroPubLogic_Attr_Mul", -- 英雄酒馆系统加成
  62. }
  63. --是否开启本系统
  64. local function isOpen(human)
  65. local state = ChengjiuLogic.GetTaskState(human, TALISMAN_2_CHENGJIU_TASKID)
  66. if state == 2 then
  67. return true
  68. end
  69. return false
  70. end
  71. --取对应类型的秘宝配置
  72. local function generateCfgByType(type_m)
  73. local tbl = {}
  74. for id, cfg in pairs(talismanConfig) do
  75. if cfg.type == type_m then
  76. tbl[id] = cfg
  77. tbl[id].id = id
  78. end
  79. end
  80. if not next(tbl) then
  81. return nil
  82. end
  83. return tbl
  84. end
  85. --填充协议的数据
  86. local function populateMsg(config, msgTb, nLevel)
  87. msgTb.id = config.id
  88. msgTb.name = config.name
  89. msgTb.iconId = config.iconId
  90. msgTb.level = nLevel
  91. local descVec = msgTb.descVec
  92. local effectDescCfg = config.effectDesc
  93. descVec[0] = #effectDescCfg
  94. for idx, desc in ipairs(effectDescCfg) do
  95. local singleDesc = descVec[idx]
  96. singleDesc.desc = desc
  97. singleDesc.isActivate = nLevel >= idx and 1 or 0
  98. end
  99. if nLevel < config.maxLevel then
  100. nLevel = nLevel + 1
  101. -- nLevel = math.ceil(nLevel/3)
  102. else
  103. nLevel = 0
  104. end
  105. Grid.makeItem(msgTb.upGradeCost, config.costItemId, nLevel)
  106. end
  107. --红点判断
  108. local function dotJudgment(human, cfgHtbl)
  109. local talismanData = human.db.talismanData
  110. for id, cfg in pairs(cfgHtbl) do
  111. local nLevel = 0
  112. if talismanData and talismanData[id] then
  113. nLevel = talismanData[id]
  114. end
  115. if nLevel < cfg.maxLevel then
  116. nLevel = nLevel + 1
  117. -- local costItemCnt = math.ceil(nLevel/3)
  118. local costItemCnt = nLevel
  119. if BagLogic.getItemCnt(human, cfg.costItemId) >= costItemCnt then
  120. return true
  121. end
  122. end
  123. end
  124. return false
  125. end
  126. -- 获取秘宝总星数
  127. local function talismanLogic_GetAllStar(human)
  128. local nAllStar = 0
  129. if not human.db.talismanData then
  130. return nAllStar
  131. end
  132. for id, _ in pairs(talismanConfig) do
  133. if human.db.talismanData[id] then
  134. nAllStar = nAllStar + human.db.talismanData[id]
  135. end
  136. end
  137. return nAllStar
  138. end
  139. --GM命令, 设置秘宝等级
  140. function GmSetlevel(human, id, level)
  141. local config = talismanConfig[id]
  142. if not config then
  143. return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  144. end
  145. if level > config.maxLevel then
  146. level = config.maxLevel
  147. end
  148. if level < 0 then
  149. level = 0
  150. end
  151. human.db.talismanData = human.db.talismanData or {}
  152. human.db.talismanData[id] = level
  153. end
  154. --秘宝对英雄属性加成
  155. function doCalcHero(human, heroGrid, addAttrs)
  156. if not human or not heroGrid then
  157. return
  158. end
  159. local talismanData = human.db.talismanData
  160. if not talismanData then
  161. return
  162. end
  163. local heroCfg = HeroConfig[heroGrid.id]
  164. for id, level in pairs(talismanData) do
  165. local attrs = talismanConfig[id].attrs
  166. for i=1, level do
  167. local singleAttr = attrs[i]
  168. if #singleAttr == 2 and type(singleAttr[1]) == "number" then --给所有英雄加属性
  169. RoleAttr.updateValue(singleAttr[1], singleAttr[2], addAttrs)
  170. elseif #singleAttr == 3 then --只给某个种族的英雄加属性
  171. if singleAttr[1] == heroCfg.camp then
  172. RoleAttr.updateValue(singleAttr[2], singleAttr[3], addAttrs)
  173. end
  174. elseif #singleAttr == 4 then
  175. local bl = false
  176. local tp = singleAttr[1]
  177. if tp == 1 then -- 职业
  178. if heroCfg.job == singleAttr[2] then
  179. bl = true
  180. end
  181. end
  182. if bl then
  183. RoleAttr.updateValue(singleAttr[3], singleAttr[4], addAttrs)
  184. end
  185. end
  186. end
  187. end
  188. end
  189. --红点
  190. function isDot(human, dotConfig)
  191. if not isOpen(human) then
  192. return false
  193. end
  194. --入口处的红点判断
  195. if dotConfig.id == RoleSystemDefine.ROLE_SYS_ID_2006 then
  196. return dotJudgment(human, talismanConfig)
  197. else
  198. --单个分页的红点
  199. local talismanType = 0
  200. if dotConfig.id == RoleSystemDefine.ROLE_SYS_ID_2007 then
  201. talismanType = 1
  202. elseif dotConfig.id == RoleSystemDefine.ROLE_SYS_ID_2008 then
  203. talismanType = 2
  204. elseif dotConfig.id == RoleSystemDefine.ROLE_SYS_ID_2009 then
  205. talismanType = 3
  206. elseif dotConfig.id == RoleSystemDefine.ROLE_SYS_ID_2010 then
  207. talismanType = 4
  208. else
  209. talismanType = 5
  210. end
  211. local cfgHtbl = generateCfgByType(talismanType)
  212. if not cfgHtbl then
  213. return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  214. end
  215. return dotJudgment(human, cfgHtbl)
  216. end
  217. end
  218. -- 外部调用, 本系统是否开启
  219. function ModuleisOpen(human)
  220. local towerLevel = HuanJingTowerLogic.getTowerLevel(human)
  221. if towerLevel >= COND_TOWER_LEVEL then
  222. return true
  223. end
  224. return false
  225. end
  226. --秘宝对其他方面的加成, 如:挂机钻石
  227. function getTalismanAdd(human, effectType)
  228. local addValue = 0
  229. if not human or not human.db then
  230. return addValue
  231. end
  232. local talismanData = human.db.talismanData
  233. if not talismanData or not effectType then
  234. return addValue
  235. end
  236. for id, level in pairs(talismanData) do
  237. local cfg = talismanConfig[id]
  238. local attrs = cfg.attrs
  239. for i=1,#attrs do
  240. local singleAttr = attrs[i]
  241. local addType = singleAttr[1]
  242. local value = singleAttr[2]
  243. if type(addType) == "string" and level >= i and effectType == addType then
  244. if type(value) == "number" then
  245. addValue = addValue + value
  246. else
  247. addValue = value
  248. end
  249. end
  250. end
  251. end
  252. return addValue
  253. end
  254. --查询
  255. function Query(human, type_m)
  256. if not type_m then
  257. return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  258. end
  259. if not isOpen(human) then
  260. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  261. end
  262. local cfgHtbl = generateCfgByType(type_m)
  263. if not cfgHtbl then
  264. return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  265. end
  266. local msgRet = Msg.gc.GC_TALISMAN_QUERY
  267. msgRet.nAllStar = talismanLogic_GetAllStar(human)
  268. msgRet.type = type_m
  269. local talismanVec = msgRet.talismanVec
  270. local len = 0
  271. local talismanData = human.db.talismanData
  272. for id, cfg in pairs(cfgHtbl) do
  273. len = len + 1
  274. local nLevel = 0
  275. if talismanData and talismanData[id] then
  276. nLevel = talismanData[id]
  277. end
  278. populateMsg(cfg, talismanVec[len], nLevel)
  279. end
  280. talismanVec[0] = len
  281. Msg.send(msgRet, human.fd)
  282. end
  283. --升级
  284. function UpGrade(human, id)
  285. if not isOpen(human) then
  286. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  287. end
  288. local singleCfg = talismanConfig[id]
  289. if not singleCfg then
  290. return Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
  291. end
  292. local nLevel = 0
  293. local type = singleCfg.type
  294. --等级判断
  295. if human.db.talismanData and human.db.talismanData[id] then
  296. nLevel = human.db.talismanData[id]
  297. end
  298. if nLevel >= singleCfg.maxLevel then
  299. return Broadcast.sendErr(human, Lang.COMMON_MAXLEVEL)
  300. end
  301. --道具判断
  302. nLevel = nLevel + 1
  303. local costItemId = singleCfg.costItemId
  304. local costItemCnt = nLevel --math.ceil(nLevel/3)
  305. if BagLogic.getItemCnt(human, costItemId) < costItemCnt then
  306. return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
  307. end
  308. BagLogic.delItem(human, costItemId, costItemCnt, LOGTYPE)
  309. --更新数据
  310. human.db.talismanData = human.db.talismanData or {}
  311. human.db.talismanData[id] = nLevel
  312. --下发数据
  313. local msgRet = Msg.gc.GC_TALISMAN_UPGRADE
  314. msgRet.type = type
  315. populateMsg(singleCfg, msgRet.talismanInfo, nLevel)
  316. Msg.send(msgRet, human.fd)
  317. --重算战力
  318. RoleAttr.cleanHeroAttrCache(human)
  319. RoleAttr.doCalc(human)
  320. ObjHuman.sendAttr(human, RoleDefine.ZHANDOULI)
  321. if nLevel == 1 then
  322. -- 激活
  323. TriggerLogic.PublishEvent(TriggerDefine.MIBAO_ACTIVATE, human.db._id, id, 1)
  324. end
  325. -- 总星数
  326. TriggerLogic.PublishEvent(TriggerDefine.MIBAO_ALLSTAR, human.db._id, 1)
  327. local allStar = talismanLogic_GetAllStar(human)
  328. GiftLogic = GiftLogic or require("topup.GiftLogic")
  329. GiftLogic.trigger(human, GiftLogic.GIFT_TALISMAN_UPGRADE_STAR, {currentVal = allStar}, GiftLogic.GIFT_SEC_TYPE3)
  330. --刷新红点
  331. nLevel = nLevel + 1
  332. costItemCnt = nLevel -- math.ceil(nLevel/3)
  333. if nLevel >= singleCfg.maxLevel or BagLogic.getItemCnt(human, costItemId) < costItemCnt then
  334. local dotID = 0
  335. if type == 1 then
  336. dotID = RoleSystemDefine.ROLE_SYS_ID_2007
  337. elseif type == 2 then
  338. dotID = RoleSystemDefine.ROLE_SYS_ID_2008
  339. elseif type == 3 then
  340. dotID = RoleSystemDefine.ROLE_SYS_ID_2009
  341. elseif type == 4 then
  342. dotID = RoleSystemDefine.ROLE_SYS_ID_2010
  343. else
  344. dotID = RoleSystemDefine.ROLE_SYS_ID_2011
  345. end
  346. --刷新单页
  347. RoleSystemLogic.onDot(human, dotID)
  348. --刷新入口处
  349. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_2006)
  350. end
  351. Query(human, type)
  352. end