RuneShopRewardsBaseData.lua 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. local RuneShopRewardsBaseData = class('RuneShopRewardsBaseData')
  2. --local RuneShopRewardsBaseData = require('RuneShop/RuneShopGoodsData')
  3. local RuneShopRewardsData = require('RuneShop/RuneShopRewardsData')
  4. local BitUtil = require("BitUtil")
  5. local function CompValidTimeData(a, b)
  6. if a and a > 0 then
  7. if not b or b > a then
  8. b = a
  9. end
  10. end
  11. return b
  12. end
  13. function RuneShopRewardsBaseData:ctor()
  14. self.runeShopType = nil
  15. self.runeShopSubType = nil
  16. self.endTime = nil
  17. self.goodsDataMap = nil
  18. self.needRefreshTime = nil
  19. self.needRefreshDataTime = nil
  20. self.showGoodsDatas = nil
  21. self.hasFreeCanBuy = nil
  22. self.curRewardsRound = nil
  23. self.curRewardsLv = nil
  24. self.totalRewardsExp = nil
  25. self.maxRewardNum = 0
  26. self.missionExp = nil
  27. end
  28. function RuneShopRewardsBaseData:Dispose()
  29. self.endTime = nil
  30. self.goodsDataMap = nil
  31. self.needRefreshTime = nil
  32. self.needRefreshDataTime = nil
  33. self.showGoodsDatas = nil
  34. self.hasFreeCanBuy = nil
  35. self.curRewardsRound = nil
  36. self.curRewardsLv = nil
  37. self.totalRewardsExp = nil
  38. self.maxRewardNum = nil
  39. self.missionExp = nil
  40. end
  41. function RuneShopRewardsBaseData:SetRewardData(data)
  42. local goodsData = nil
  43. local goodsDataMap = {}
  44. self.normalTotalExp = 0
  45. self.curRewardsRound = data.curRoune
  46. self.curRewardsLv = data.level
  47. self.totalRewardsExp = data.total_exp
  48. self.curRewardsExp = self.totalRewardsExp
  49. if data.bUnlock then
  50. self.isCash = 1
  51. else
  52. self.isCash = 0
  53. end
  54. self.endTime = data.endTime
  55. self.startTime = data.startTime
  56. self.nextStartTime = data.nextStartTime
  57. self.maxRewardNum = 0
  58. self.missionExp = data.missionExp
  59. self.isMax = data.fullAward
  60. self.drawRewar = data.draw_rewar
  61. if self.endTime == 0 then
  62. return
  63. end
  64. local cfg = ManagerContainer.CfgMgr:GetRShopRewardsCfgByRound(self.curRewardsRound)
  65. if not cfg then
  66. return
  67. end
  68. local stateData = {}
  69. for i=1 , #cfg do
  70. local goods = cfg[i]
  71. goodsData = nil
  72. if not goodsData then
  73. goodsData = RuneShopRewardsData:new()
  74. end
  75. self.normalTotalExp = self.normalTotalExp + goods.Exp
  76. if i < self.curRewardsLv or i == self.curRewardsLv then
  77. if self.isCash == 1 then
  78. stateData[i] = {2,2}
  79. else
  80. stateData[i] = {2,0}
  81. end
  82. local nor
  83. local cash
  84. if #self.drawRewar ~= 0 then
  85. if i < 32 or i == 32 then
  86. if BitUtil.RshiftNumBandOne(self.drawRewar[1].key ,i -1 ) == 1 then
  87. nor = 1
  88. end
  89. if BitUtil.RshiftNumBandOne(self.drawRewar[1].value ,i-1 ) == 1 then
  90. cash = 1
  91. end
  92. else
  93. local n = 1
  94. while(i>32)
  95. do
  96. i = i -32
  97. n = n +1
  98. end
  99. if BitUtil.RshiftNumBandOne(self.drawRewar[n].key ,i-1 ) == 1 then
  100. nor = 1
  101. end
  102. if BitUtil.RshiftNumBandOne(self.drawRewar[n].value ,i-1 ) == 1 then
  103. cash = 1
  104. end
  105. end
  106. end
  107. if nor then
  108. stateData[i] = {nor ,stateData[i][2] }
  109. end
  110. if cash then
  111. stateData[i] = {stateData[i][1] , cash}
  112. end
  113. if stateData[i][1] == 2 or stateData[i][2] == 2 then
  114. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.RED_POINT_MGR_NOTICE, Enum.RPNotifyType.RuneShopRewards, true)
  115. end
  116. if self.curRewardsLv ~= 0 then
  117. self.curRewardsExp = self.curRewardsExp - goods.Exp
  118. end
  119. end
  120. goodsData:SetData(stateData[i],cfg[i])
  121. goodsDataMap[i] = goodsData
  122. end
  123. self.goodsDataMap = goodsDataMap
  124. if self.curRewardsLv == #cfg then
  125. local ne = (self.totalRewardsExp - self.normalTotalExp)/ManagerContainer.CfgMgr:GetRuneShopExploreCfgByRound(self.curRewardsRound).ExpCost
  126. self.maxRewardNum = self:Toint(ne)
  127. end
  128. self:RefreshShowRewardsData()
  129. end
  130. function RuneShopRewardsBaseData:SetRecRewardData(data)
  131. local goodData = self:GetGoodsDataByIdx(data.level)
  132. local da = goodData:GetData()
  133. local cfg = goodData:GetCfgData()
  134. if data.type == 1 then
  135. da = {1 ,da[2]}
  136. elseif data.type == 2 then
  137. da = {da[1] ,1}
  138. end
  139. goodData:SetData(da, cfg)
  140. self.goodsDataMap[data.level] = goodData
  141. self:RefreshShowRewardsData()
  142. end
  143. function RuneShopRewardsBaseData:SetRecExtraRewardData(data)
  144. self.missionExp = data.missionExp
  145. self.curRewardsExp = self.curRewardsExp - (self.totalRewardsExp - data.total_exp)
  146. self.totalRewardsExp =data.total_exp
  147. local ne = (self.totalRewardsExp - self.normalTotalExp)/ManagerContainer.CfgMgr:GetRuneShopExploreCfgByRound(self.curRewardsRound).ExpCost
  148. self.maxRewardNum = self:Toint(ne)
  149. end
  150. function RuneShopRewardsBaseData:Toint(n)
  151. local s = tostring(n)
  152. local i,j = s:find('%.')
  153. if i then
  154. return tonumber(s:sub(1,i-1))
  155. else
  156. return n
  157. end
  158. end
  159. function RuneShopRewardsBaseData:SetExpChangeData(data)
  160. if not self.curRewardsLv then
  161. return
  162. end
  163. if data.level > self.curRewardsLv then
  164. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.RED_POINT_MGR_NOTICE, Enum.RPNotifyType.RuneShopRewards, true)
  165. end
  166. self.curRewardsLv = data.level
  167. self.totalRewardsExp =data.total_exp
  168. self.missionExp = data.missionExp
  169. end
  170. function RuneShopRewardsBaseData:RefreshShowRewardsData()
  171. local showGoodsDatas = {}
  172. local needRefreshTime = nil
  173. local needRefreshDataTime = nil
  174. self.showRewardsData = {}
  175. for _, goodsData in pairs(self.goodsDataMap) do
  176. local isShow, refreshTime, refreshDataTime = goodsData:GetShowInfo()
  177. showGoodsDatas[#showGoodsDatas+1] = goodsData
  178. needRefreshTime = CompValidTimeData(refreshTime, needRefreshTime)
  179. needRefreshDataTime = CompValidTimeData(refreshDataTime, needRefreshDataTime)
  180. end
  181. self.showRewardsData = showGoodsDatas
  182. self.needRefreshDataTime = needRefreshDataTime
  183. self.needRefreshTime = needRefreshTime
  184. end
  185. function RuneShopRewardsBaseData:SortShowData()
  186. if not self.showGoodsDatas then return end
  187. table.sort(self.showGoodsDatas, function (a, b)
  188. local isSoldOutA = a:IsSoldout()
  189. local isSoldOutB = b:IsSoldout()
  190. if isSoldOutA == isSoldOutB then
  191. return a:GetSortId() < b:GetSortId()
  192. else
  193. return not isSoldOutA
  194. end
  195. end)
  196. end
  197. function RuneShopRewardsBaseData:GetGoodsDataByIdx(idx)
  198. return self.goodsDataMap[idx]
  199. end
  200. function RuneShopRewardsBaseData:GetShowGoodsDatas()
  201. return self.showGoodsDatas
  202. end
  203. function RuneShopRewardsBaseData:GetShowRewardsData()
  204. return self.showRewardsData
  205. end
  206. function RuneShopRewardsBaseData:GetShowRewardsRoundData()
  207. return self.curRewardsRound
  208. end
  209. function RuneShopRewardsBaseData:GetShowRewardsCurLv()
  210. return self.curRewardsLv
  211. end
  212. function RuneShopRewardsBaseData:GetRewardsCurRoundCfg()
  213. return ManagerContainer.CfgMgr:GetRuneShopExploreCfgByRound(self.curRewardsRound)
  214. end
  215. function RuneShopRewardsBaseData:GetShowRewaradsTotalExp()
  216. return self.totalRewardsExp
  217. end
  218. function RuneShopRewardsBaseData:GetShowRewardsCurExp()
  219. return self.curRewardsExp
  220. end
  221. function RuneShopRewardsBaseData:GetRewardsIsCash()
  222. return self.isCash
  223. end
  224. function RuneShopRewardsBaseData:GetMaxRewardsNum()
  225. return self.maxRewardNum
  226. end
  227. function RuneShopRewardsBaseData:GetRewardsGoldExp()
  228. return self.goldExp
  229. end
  230. function RuneShopRewardsBaseData:GetRewardsMissionExp()
  231. return self.missionExp
  232. end
  233. function RuneShopRewardsBaseData:GetRewardsIsMax()
  234. return self.isMax
  235. end
  236. function RuneShopRewardsBaseData:GetRewardsMaxRewardsNum()
  237. return self.maxRewardsNum
  238. end
  239. function RuneShopRewardsBaseData:GetShowReardsNearMinCashReward(min)
  240. if min == nil or min < 0 or min == 0 then return nil end
  241. local goods
  242. for i = min , 1 ,-1 do
  243. goods = self:GetGoodsDataByIdx(i)
  244. if goods then
  245. if goods.cfgData.RewardSign > 0 then
  246. if goods.cfgData.RewardSign == 1 then
  247. if goods.isReward then
  248. if goods.isReward ~= 1 then
  249. return i
  250. end
  251. else
  252. return i
  253. end
  254. elseif goods.cfgData.RewardSign == 2 then
  255. if goods.isCashReward then
  256. if goods.isCashReward ~= 1 then
  257. return i
  258. end
  259. else
  260. return i
  261. end
  262. end
  263. end
  264. end
  265. end
  266. return nil
  267. end
  268. function RuneShopRewardsBaseData:GetShowReardsNearMaxCashReward(max)
  269. if max == nil or max > #self:GetShowRewardsData() then return nil end
  270. local goods
  271. for i=max , #self:GetShowRewardsData() do
  272. goods = self:GetGoodsDataByIdx(i)
  273. if goods then
  274. if goods.cfgData.RewardSign > 0 then
  275. if goods.cfgData.RewardSign == 1 then
  276. if goods.isReward then
  277. if goods.isReward ~= 1 then
  278. return i
  279. end
  280. else
  281. return i
  282. end
  283. elseif goods.cfgData.RewardSign == 2 then
  284. if goods.isCashReward then
  285. if goods.isCashReward ~= 1 then
  286. return i
  287. end
  288. else
  289. return i
  290. end
  291. end
  292. end
  293. end
  294. end
  295. return nil
  296. end
  297. function RuneShopRewardsBaseData:IsValidShow()
  298. if not self.needRefreshTime then
  299. return true
  300. end
  301. local remainTime = ManagerContainer.LuaTimerMgr:GetRemainSecondsWithUInt64(self.needRefreshTime)
  302. return remainTime >= 0
  303. end
  304. function RuneShopRewardsBaseData:IsValidData()
  305. if not self.needRefreshDataTime then
  306. return true
  307. end
  308. local remainTime = ManagerContainer.LuaTimerMgr:GetRemainSecondsWithUInt64(self.needRefreshDataTime)
  309. return remainTime >= 0
  310. end
  311. function RuneShopRewardsBaseData:RefreshRemainTime()
  312. if not self.needRefreshDataTime then
  313. return nil
  314. end
  315. return ManagerContainer.LuaTimerMgr:GetRemainSecondsWithUInt64(self.needRefreshDataTime)
  316. end
  317. function RuneShopRewardsBaseData:RefreshRewaradsRemainTime()
  318. return ManagerContainer.LuaTimerMgr:GetRemainSecondsWithUInt64(self.endTime)
  319. end
  320. return RuneShopRewardsBaseData