BattleGift.lua 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. -- 闯关礼金
  2. --db
  3. --[=[
  4. human.db.battleGift = {
  5. dailyStoreVal = nil, -- 每日获得的存储礼金
  6. dailyGetVal = nil, -- 每日已领取的礼金
  7. buyIdList = nil, -- 充值过的购买项Id列表
  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 Broadcast = require("broadcast.Broadcast")
  15. local BattleExcel = require("excel.battle")
  16. local BattleExcel_Elite = require("excel.battle_elite")
  17. local BattleExcel_Hard = require("excel.battle_hard")
  18. local BattleLogic = require("battle.BattleLogic")
  19. local EliteDefine = require("battle.EliteDefine")
  20. local Util = require("common.Util")
  21. local BuyLogic = require("topup.BuyLogic")
  22. local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
  23. local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
  24. local LOGTYPE = "BattleGift"
  25. local function initData(human)
  26. human.db.battleGift = { dailyStoreVal = 0, dailyGetVal = 0 }
  27. end
  28. local function getData(human)
  29. return human.db.battleGift
  30. end
  31. local function addDailyStoreVal(human, val)
  32. local battleGiftData = getData(human)
  33. if not battleGiftData then
  34. initData(human)
  35. battleGiftData = getData(human)
  36. end
  37. battleGiftData.dailyStoreVal = battleGiftData.dailyStoreVal + val
  38. end
  39. local function addDailyGetVal(human, val)
  40. local battleGiftData = getData(human)
  41. if not battleGiftData then
  42. initData(human)
  43. battleGiftData = getData(human)
  44. end
  45. battleGiftData.dailyGetVal = battleGiftData.dailyGetVal + val
  46. end
  47. local function insertBuyIdList(human, buyId)
  48. local battleGiftData = getData(human)
  49. if not battleGiftData then
  50. initData(human)
  51. battleGiftData = getData(human)
  52. end
  53. battleGiftData.buyIdList = battleGiftData.buyIdList or {}
  54. table.insert(battleGiftData.buyIdList, buyId)
  55. end
  56. local function resetData(human)
  57. local battleGiftData = getData(human)
  58. if not battleGiftData then
  59. return
  60. end
  61. battleGiftData.dailyStoreVal = 0
  62. battleGiftData.dailyGetVal = 0
  63. end
  64. -- 获取本关卡能获得的礼金数量
  65. local function getStageVal(stageType, stageIdx)
  66. local conf
  67. if stageType == EliteDefine.COPY_LEVEL_ELITE then
  68. conf = BattleExcel_Elite.node
  69. elseif stageType == EliteDefine.COPY_LEVEL_ELITE then
  70. conf = BattleExcel_Hard.node
  71. else
  72. conf = BattleExcel.node
  73. end
  74. local stageCfg = conf[stageIdx]
  75. if stageCfg and stageCfg.giftStoreVal then
  76. return stageCfg.giftStoreVal
  77. end
  78. return 0
  79. end
  80. -- 计算当前关卡一共能获得的礼金
  81. local function calcCurrentStageVal(stageType, stageVal)
  82. local val = 0
  83. for i=1, stageVal do
  84. val = val + getStageVal(stageType, i)
  85. end
  86. return val
  87. end
  88. -- 处理老号, 把老号之前已经通关的关卡应该获得的礼金算上
  89. local function calcBeforeVal(human)
  90. local totalVal = 0
  91. for i=EliteDefine.COPY_ELITE_NORMAL, EliteDefine.COPY_ELITE_DIFFICULTY do
  92. local stage = BattleLogic.GetBattleIdByType(human, i)
  93. if stage and stage > 0 then
  94. totalVal = totalVal + calcCurrentStageVal(i, stage)
  95. end
  96. end
  97. addDailyStoreVal(human, totalVal)
  98. end
  99. -- 计算当前关卡一共增加的"每日可领取上限"
  100. local function calcStageDailyGeteVal(human)
  101. local val = 0
  102. local stage = BattleLogic.GetBattleIdByType(human, EliteDefine.COPY_ELITE_NORMAL)
  103. for k,v in ipairs(BattleExcel.node) do
  104. if k > stage then
  105. break
  106. end
  107. if v.dailyLimitVal and v.dailyLimitVal > 0 then
  108. val = val + v.dailyLimitVal
  109. end
  110. end
  111. return val
  112. end
  113. -- 计算每天可领礼金的最大值
  114. local function calclDailyMaxGetVal(human)
  115. local val = EliteDefine.BATTLEGIFT_FREE_LIMIT
  116. local battleGiftData = getData(human)
  117. if battleGiftData and battleGiftData.buyIdList then
  118. for _, buyId in ipairs(battleGiftData.buyIdList) do
  119. val = val + (EliteDefine.BATTLEGIFT_BUYID_2_LIMIT[buyId] or 0)
  120. end
  121. end
  122. val = val + calcStageDailyGeteVal(human)
  123. return val
  124. end
  125. -- 红点刷新
  126. local function updateRedDot(human)
  127. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_1106)
  128. end
  129. -- 外部调用,跨天处理
  130. function updateDaily(human)
  131. local battleGiftData = getData(human)
  132. if not battleGiftData then
  133. calcBeforeVal(human)
  134. updateRedDot(human)
  135. return
  136. end
  137. resetData(human)
  138. updateRedDot(human)
  139. end
  140. -- 外部调用, 登录处理
  141. function onLogin(human)
  142. local battleGiftData = getData(human)
  143. if not battleGiftData then
  144. calcBeforeVal(human)
  145. updateRedDot(human)
  146. end
  147. end
  148. -- 外部调用, 通关新的关卡
  149. function StageClearHandle(human, currentStage, stageType)
  150. local val = getStageVal(stageType, currentStage)
  151. if val > 0 then
  152. addDailyStoreVal(human, val)
  153. updateRedDot(human)
  154. end
  155. end
  156. -- 外部调用, 入口处是否有红点
  157. function isDot(human)
  158. local battleGiftData = getData(human)
  159. if not battleGiftData then
  160. return false
  161. end
  162. local dailyStoreVal = battleGiftData.dailyStoreVal or 0
  163. if dailyStoreVal <= 0 then
  164. return false
  165. end
  166. -- local dailyGetVal = battleGiftData.dailyGetVal or 0
  167. -- local dailyMaxVal = calclDailyMaxGetVal(human)
  168. -- if dailyGetVal >= dailyMaxVal then
  169. -- return false
  170. -- end
  171. return true
  172. end
  173. -- 外部调用, 充值处理接口
  174. function charge(human, nAllPrice, buyID)
  175. if not table.find(EliteDefine.BATTLEGIFT_BUYID_LIST, buyID) then
  176. return
  177. end
  178. local battleGiftData = getData(human)
  179. if battleGiftData and battleGiftData.buyIdList and table.find(battleGiftData.buyIdList, buyID) then
  180. return
  181. end
  182. insertBuyIdList(human, buyID)
  183. updateRedDot(human)
  184. BattleGift_Query(human)
  185. end
  186. -- 查询
  187. function BattleGift_Query(human)
  188. local msgRet = Msg.gc.GC_BATTLEGIFT_QUERY
  189. msgRet.leftTime = 0
  190. msgRet.dailyStoreVal = 0
  191. msgRet.dailyGetVal = 0
  192. msgRet.dailyMaxVal = 0
  193. local now = os.time()
  194. local toDayStartTime = Util.getDayStartTime(now)
  195. msgRet.leftTime = toDayStartTime + 86400 - now
  196. local battleGiftData = getData(human)
  197. msgRet.dailyStoreVal = battleGiftData and battleGiftData.dailyStoreVal or 0
  198. msgRet.dailyGetVal = battleGiftData and battleGiftData.dailyGetVal or 0
  199. msgRet.dailyMaxVal = calclDailyMaxGetVal(human)
  200. msgRet.dailyLimitVal = 0
  201. local targetBuyId = 0
  202. for _, buyId in ipairs(EliteDefine.BATTLEGIFT_BUYID_LIST) do
  203. if not battleGiftData or not battleGiftData.buyIdList or not table.find(battleGiftData.buyIdList, buyId) then
  204. targetBuyId = buyId
  205. break
  206. end
  207. end
  208. msgRet.dailyLimitVal = EliteDefine.BATTLEGIFT_BUYID_2_LIMIT[targetBuyId] or 0
  209. BuyLogic.fontBuyItem(human, msgRet.buyItem, targetBuyId)
  210. Msg.send(msgRet, human.fd)
  211. end
  212. -- 领取
  213. function BattleGift_Get(human)
  214. local battleGiftData = getData(human)
  215. if not battleGiftData then
  216. return Broadcast.sendErr(human, Lang.BATTLEGIFT_NOT_ENOUGH)
  217. end
  218. local dailyStoreVal = battleGiftData.dailyStoreVal or 0
  219. if dailyStoreVal <= 0 then
  220. return Broadcast.sendErr(human, Lang.BATTLEGIFT_NOT_ENOUGH)
  221. end
  222. local dailyGetVal = battleGiftData.dailyGetVal or 0
  223. local dailyMaxVal = calclDailyMaxGetVal(human)
  224. if dailyGetVal >= dailyMaxVal then
  225. return Broadcast.sendErr(human, Lang.BATTLEGIFT_DAILY_CAN_GET_MAX)
  226. end
  227. local getVal = math.min(dailyStoreVal, dailyMaxVal - dailyGetVal)
  228. if getVal < 100 then
  229. return Broadcast.sendErr(human, Lang.BATTLEGIFT_DAILY_CAN_GET_MAX)
  230. end
  231. addDailyStoreVal(human, -getVal)
  232. addDailyGetVal(human, getVal)
  233. local itemId = EliteDefine.BATTLEGIFT_2_ITEMID
  234. local itemCnt = math.floor(getVal / 100)
  235. BagLogic.addItemList(human, { {itemId, itemCnt} }, LOGTYPE)
  236. BattleGift_Query(human)
  237. updateRedDot(human)
  238. end