BreakThroughTheme.lua 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425
  1. -- 闯关主题
  2. --db
  3. --[=[
  4. human.db.breakThroughData = {
  5. breakThroughGetList = { -- 闯关奖励领取记录列表
  6. [cfgIdx1] = true,
  7. [cfgIdx2] = true,
  8. },
  9. advanceRewardGetList = { --进阶奖励领取记录表
  10. [day1] = true,
  11. [day2] = true,
  12. },
  13. isBuy = nil, -- 购买指定项后,值为true
  14. loginDays = nil, 购买指定项后才统计的登录天数
  15. }
  16. ]=]--
  17. local Msg = require("core.Msg")
  18. local Grid = require("bag.Grid")
  19. local BagLogic = require("bag.BagLogic")
  20. local Lang = require("common.Lang")
  21. local Broadcast = require("broadcast.Broadcast")
  22. local HeroGrid = require("hero.HeroGrid")
  23. local BreakThroughThemeConfig = require("excel.breakThroughTheme")
  24. local BattleLogic = require("battle.BattleLogic")
  25. local EliteDefine = require("battle.EliteDefine")
  26. local BuyLogic = require("topup.BuyLogic")
  27. local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
  28. local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
  29. local LOGTYPE = "BreakThroughTheme"
  30. local function getData(human)
  31. return human.db.breakThroughData
  32. end
  33. local function updateBreakThroughGetList(human, getIdx)
  34. human.db.breakThroughData = human.db.breakThroughData or {}
  35. human.db.breakThroughData.breakThroughGetList = human.db.breakThroughData.breakThroughGetList or {}
  36. human.db.breakThroughData.breakThroughGetList[getIdx] = true
  37. end
  38. local function updateAdvanceRewardGetList(human, getIdx)
  39. human.db.breakThroughData = human.db.breakThroughData or {}
  40. human.db.breakThroughData.advanceRewardGetList = human.db.breakThroughData.advanceRewardGetList or {}
  41. human.db.breakThroughData.advanceRewardGetList[getIdx] = true
  42. end
  43. local function updateBuyState(human, state)
  44. human.db.breakThroughData = human.db.breakThroughData or {}
  45. human.db.breakThroughData.isBuy = state
  46. end
  47. local function addLoginDays(human)
  48. human.db.breakThroughData = human.db.breakThroughData or {}
  49. human.db.breakThroughData.loginDays = (human.db.breakThroughData.loginDays or 0) + 1
  50. end
  51. local function isBuy(human)
  52. local breakThroughData = getData(human)
  53. if breakThroughData and breakThroughData.isBuy then
  54. return true
  55. end
  56. return false
  57. end
  58. -- 获取所有闯关奖励
  59. local function getAllBreakThroughReward(human)
  60. if not isBuy(human) then
  61. return
  62. end
  63. local breakThroughData = getData(human)
  64. local breakThroughGetList = breakThroughData and breakThroughData.breakThroughGetList
  65. local passStageId = BattleLogic.GetBattleIdByType(human, EliteDefine.COPY_ELITE_NORMAL)
  66. local itemList, getIdArr
  67. for k,v in ipairs(BreakThroughThemeConfig.breakThroughReward) do
  68. if v.rewardCondStage <= passStageId and (not breakThroughGetList or not breakThroughGetList[k]) then
  69. getIdArr = getIdArr or {}
  70. getIdArr[#getIdArr+1] = k
  71. itemList = itemList or {}
  72. for _, itemInfo in ipairs(v.reward) do
  73. local itemId, itemCnt = itemInfo[1], itemInfo[2]
  74. itemList[itemId] = (itemList[itemId] or 0) + itemCnt
  75. end
  76. end
  77. end
  78. return itemList, getIdArr
  79. end
  80. -- 取所有进阶奖励
  81. local function getAllAdvancedReward(human)
  82. if not isBuy(human) then
  83. return
  84. end
  85. local breakThroughData = getData(human)
  86. local advanceRewardGetList = breakThroughData.advanceRewardGetList
  87. local loginDays = breakThroughData.loginDays or 0
  88. local itemList, getIdArr
  89. for k,v in ipairs(BreakThroughThemeConfig.advancedReward) do
  90. if v.condDay <= loginDays and (not advanceRewardGetList or not advanceRewardGetList[k]) then
  91. getIdArr = getIdArr or {}
  92. getIdArr[#getIdArr+1] = k
  93. itemList = itemList or {}
  94. local itemId, itemCnt = v.reward[1], v.reward[2]
  95. itemList[itemId] = (itemList[itemId] or 0) + itemCnt
  96. end
  97. end
  98. return itemList, getIdArr
  99. end
  100. -- 填充推荐阵容协议数据
  101. local function populateLineupMsg(net, heroArr)
  102. if not net or not heroArr then
  103. return
  104. end
  105. local grid = { id = 0}
  106. net[0] = #heroArr
  107. for i, heroId in ipairs(heroArr) do
  108. grid.id = heroId
  109. HeroGrid.makeHeroSimple(net[i], grid)
  110. end
  111. end
  112. -- 入口红点刷新
  113. function EntranceRedDotUpdate(human)
  114. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_112)
  115. end
  116. -- 标签红点刷新
  117. local function lableRedDotUpdate(human)
  118. local msgRet = Msg.gc.GC_BREATHROUGHTHEME_REDDOT
  119. msgRet.page1RedDotState = 0
  120. msgRet.page2RedDotState = 0
  121. if isBuy(human) then
  122. local itemList = getAllBreakThroughReward(human)
  123. if itemList then
  124. msgRet.page1RedDotState = 1
  125. end
  126. itemList = getAllAdvancedReward(human)
  127. if itemList then
  128. msgRet.page2RedDotState = 1
  129. end
  130. end
  131. Msg.send(msgRet, human.fd)
  132. end
  133. -- 所有红点刷新
  134. local function redDotUpdate(human)
  135. EntranceRedDotUpdate(human)
  136. lableRedDotUpdate(human)
  137. end
  138. -- 入口关闭检查
  139. local function entranceCloseCheck(human)
  140. RoleSystemLogic.isClose(human, RoleSystemDefine.ROLE_SYS_ID_112)
  141. end
  142. -- 领取所有闯关奖励
  143. local function getBreakThroughReward(human)
  144. local itemList, getIdArr = getAllBreakThroughReward(human)
  145. if not itemList then
  146. return Broadcast.sendErr(human, Lang.SHARE_GROUP_GET_ERR_CNT)
  147. end
  148. for _, getIdx in ipairs(getIdArr or {}) do
  149. updateBreakThroughGetList(human, getIdx)
  150. end
  151. BagLogic.addItemList(human, itemList, LOGTYPE)
  152. redDotUpdate(human)
  153. entranceCloseCheck(human)
  154. end
  155. -- 领取所有进阶奖励
  156. local function getAdvancedReward(human)
  157. local itemList, getIdArr = getAllAdvancedReward(human)
  158. if not itemList then
  159. return Broadcast.sendErr(human, Lang.SHARE_GROUP_GET_ERR_CNT)
  160. end
  161. for _, getIdx in ipairs(getIdArr or {}) do
  162. updateAdvanceRewardGetList(human, getIdx)
  163. end
  164. BagLogic.addItemList(human, itemList, LOGTYPE)
  165. redDotUpdate(human)
  166. entranceCloseCheck(human)
  167. end
  168. -- 外部调用, 是否显示入口, 领取完所有免费/付费奖励, 入口才关闭
  169. function ModuleisOpen(human)
  170. local breakThroughData = getData(human)
  171. if not breakThroughData or not breakThroughData.isBuy then
  172. return true
  173. end
  174. if not breakThroughData.breakThroughGetList or not breakThroughData.advanceRewardGetList then
  175. return true
  176. end
  177. local breakThroughGetList = breakThroughData.breakThroughGetList
  178. for k in ipairs(BreakThroughThemeConfig.breakThroughReward) do
  179. if not breakThroughGetList[k] then
  180. return true
  181. end
  182. end
  183. local advanceRewardGetList = breakThroughData.breakThroughGetList
  184. for k in ipairs(BreakThroughThemeConfig.advancedReward) do
  185. if not advanceRewardGetList[k] then
  186. return true
  187. end
  188. end
  189. return false
  190. end
  191. -- 外部调用, 入口处是否有红点
  192. function isDot(human)
  193. if not isBuy(human) then
  194. return false
  195. end
  196. local itemList = getAllBreakThroughReward(human)
  197. if itemList then
  198. return true
  199. end
  200. itemList = getAllAdvancedReward(human)
  201. if itemList then
  202. return true
  203. end
  204. return false
  205. end
  206. -- 外部调用,跨天
  207. function updateDaily(human)
  208. if not isBuy(human) then
  209. return
  210. end
  211. addLoginDays(human)
  212. -- 刷新红点
  213. if ModuleisOpen(human) then
  214. redDotUpdate(human)
  215. end
  216. end
  217. -- 外部调用,充值
  218. function charge(human, nAllPrice, buyID)
  219. local var = BreakThroughThemeConfig.var[1]
  220. if var.buyId ~= buyID then
  221. return
  222. end
  223. if isBuy(human) then
  224. return
  225. end
  226. updateBuyState(human, true)
  227. addLoginDays(human)
  228. -- 红点
  229. redDotUpdate(human)
  230. end
  231. -- 通关新的关卡了
  232. function StageUpdate(human)
  233. if not isBuy(human) then
  234. return
  235. end
  236. local itemList = getAllBreakThroughReward(human)
  237. if not itemList then
  238. return
  239. end
  240. -- 红点刷新
  241. redDotUpdate(human)
  242. end
  243. -- 闯关阵容查询
  244. function BreakThrough_Lineup_Query(human)
  245. local msgRet = Msg.gc.GC_BREATHROUGHTHEME_LINEUP_QUERY
  246. local lineupCfg1 = BreakThroughThemeConfig.recommendedLineup[1]
  247. populateLineupMsg(msgRet.lineup1, lineupCfg1.heroIdArr)
  248. local lineupCfg2 = BreakThroughThemeConfig.recommendedLineup[2]
  249. populateLineupMsg(msgRet.lineup2, lineupCfg2.heroIdArr)
  250. local lineupCfg3 = BreakThroughThemeConfig.recommendedLineup[3]
  251. populateLineupMsg(msgRet.lineup3, lineupCfg3.heroIdArr)
  252. Msg.send(msgRet, human.fd)
  253. lableRedDotUpdate(human)
  254. end
  255. -- 闯关奖励查询
  256. function BreakThrough_BreakThroughReward_Query(human)
  257. local msgRet = Msg.gc.GC_BREATHROUGHTHEME_BREAKTHROUGHREWARD_QUERY
  258. msgRet.list[0] = 0
  259. msgRet.isEnd = 0
  260. msgRet.buyState = isBuy(human) and 1 or 0
  261. local breakThroughData = getData(human)
  262. local breakThroughGetList = breakThroughData and breakThroughData.breakThroughGetList
  263. local passStageId = BattleLogic.GetBattleIdByType(human, EliteDefine.COPY_ELITE_NORMAL)
  264. local len = 0
  265. local msgOnceLen = 5
  266. local rewardCnt = #BreakThroughThemeConfig.breakThroughReward
  267. for k,v in ipairs(BreakThroughThemeConfig.breakThroughReward) do
  268. len = len + 1
  269. msgRet.list[0] = len
  270. msgRet.list[len].condStage = v.rewardCondStage
  271. msgRet.list[len].reallyIdx = k
  272. msgRet.list[len].rewardStage = 0
  273. msgRet.list[len].rewardArr[0] = 0
  274. if breakThroughGetList and breakThroughGetList[k] then
  275. msgRet.list[len].rewardStage = 2
  276. else
  277. if breakThroughData and breakThroughData.isBuy and passStageId >= v.rewardCondStage then
  278. msgRet.list[len].rewardStage = 1
  279. end
  280. end
  281. msgRet.list[len].rewardArr[0] = #v.reward
  282. for i, itemInfo in ipairs(v.reward) do
  283. Grid.makeItem(msgRet.list[len].rewardArr[i], itemInfo[1], itemInfo[2])
  284. end
  285. if len >= msgOnceLen then
  286. rewardCnt = rewardCnt - len
  287. if rewardCnt <= 0 then
  288. msgRet.isEnd = 1
  289. return Msg.send(msgRet, human.fd)
  290. end
  291. Msg.send(msgRet, human.fd)
  292. len = 0
  293. end
  294. end
  295. if len >= 0 then
  296. msgRet.isEnd = 1
  297. Msg.send(msgRet, human.fd)
  298. end
  299. end
  300. -- 进阶奖励查询
  301. function BreakThrough_AdvancedReward_Query(human)
  302. local var = BreakThroughThemeConfig.var[1]
  303. local advancedRewardCfg = BreakThroughThemeConfig.advancedReward
  304. local msgRet = Msg.gc.GC_BREATHROUGHTHEME_BREAKTHROUGHREWARD_QUERY
  305. msgRet.list[0] = 0
  306. BuyLogic.fontBuyItem(human, msgRet.buyItem, var.buyId)
  307. msgRet.buyState = 0
  308. local breakThroughData = getData(human)
  309. local advanceRewardGetList = breakThroughData and breakThroughData.advanceRewardGetList
  310. if breakThroughData and breakThroughData.isBuy then
  311. msgRet.buyState = 1
  312. end
  313. msgRet.list[0] = #advancedRewardCfg
  314. for k, v in ipairs(advancedRewardCfg) do
  315. msgRet.list[k].rewardStage = 0
  316. msgRet.list[k].condDays = v.condDay
  317. Grid.makeItem(msgRet.list[k].reward, v.reward[1], v.reward[2])
  318. if advanceRewardGetList and advanceRewardGetList.getList[k] then
  319. msgRet.list[k].rewardStage = 2
  320. else
  321. if msgRet.buyState == 1 and (breakThroughData and breakThroughData.loginDays or 0) >= v.condDay then
  322. msgRet.list[k].rewardStage = 1
  323. end
  324. end
  325. end
  326. Msg.send(msgRet, human.fd)
  327. end
  328. -- 领奖
  329. function BreakThrough_GetReward(human, rewardType)
  330. if rewardType == 1 then
  331. getBreakThroughReward(human)
  332. elseif rewardType == 2 then
  333. getAdvancedReward(human)
  334. end
  335. end