TrunWheelDataMgr.lua 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522
  1. local TrunWheelDataMgr = class("TrunWheelDataMgr",require("DataBase"))
  2. local TrunWheelData = require("SeasonTurnWheel/TrunWheelData")
  3. function TrunWheelDataMgr:ctor()
  4. self.tbPrizeInfoList = {}
  5. self.nNextStopIndex = 0 --停止位置
  6. self.nCurState = 1 --当前转盘状态
  7. self.tbLog = {}
  8. self.MaxLogNum = 20
  9. self.State =
  10. {
  11. ["ReadyTurn"] = 1, --刷新奖励 开始本轮
  12. ["StartTurn"] = 2, --转1次 转8次
  13. ["RunOnceTrun"] = 3, --转1次 结束本轮
  14. ["RunAllTrun"] = 4, --结束本轮
  15. ["FinishedTrun"] = 5, --结束本轮
  16. }
  17. end
  18. function TrunWheelDataMgr:Clear()
  19. self.refreshNum = 0
  20. end
  21. function TrunWheelDataMgr:RegisterNetEvents()
  22. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_DAO_CHANG100_WHEEL_ACK,self.OnOpenAck, self)
  23. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_DAO_CHANG100_WHEEL_LOG_ACK,self.OnLogPrizeInfoAck, self)
  24. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_DAO_CHANG100_WHEEL_LOG_NTF,self.OnAddPrizeInfoNTF, self)
  25. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_DAO_CHANG100_WHEEL_REFRESH_ACK,self.OnRefreshAck, self)
  26. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_DAO_CHANG100_WHEEL_OPEN_REWARD_ACK,self.OnOpenRewardAck, self)
  27. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_DAO_CHANG100_WHEEL_REWARD_ACK,self.OnRewardAck, self)
  28. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_DAO_CHANG100_WHEEL_CLOSE_REWARD_ACK,self.OnCloseRewardAck, self)
  29. end
  30. -------------------------------------sever
  31. --收svr到获奖日志
  32. function TrunWheelDataMgr:OnLogPrizeInfoAck(data)
  33. --LogError("OnLogPrizeLogInfoAck" .. Inspect(data))
  34. --添加根据数量获取 下一条
  35. if data then
  36. self:SetLogData(data)
  37. end
  38. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.TRUNWHELL_EVENT_LOG_ACK,data)
  39. end
  40. --添加获奖信息
  41. function TrunWheelDataMgr:OnAddPrizeInfoNTF(data)
  42. --LogError("OnLogPrizeLogInfoNTF" .. Inspect(data))
  43. if data then
  44. self:AddLogData(data)
  45. end
  46. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.TRUNWHELL_EVENT_LOG_NTF,data)
  47. end
  48. --收到刷新道具
  49. function TrunWheelDataMgr:OnRefreshAck(data)
  50. --LogError("OnRefreshAck" .. Inspect(data))
  51. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.TRUNWHELL_EVENT_REFRESH_ACK,data)
  52. end
  53. --收到本轮开始
  54. function TrunWheelDataMgr:OnOpenRewardAck(data)
  55. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.TRUNWHELL_EVENT_OPEN_REWARD_ACK,data)
  56. end
  57. --收到奖励
  58. function TrunWheelDataMgr:OnRewardAck(data)
  59. --LogError("OnRewardAck"..Inspect(data))
  60. if data.error == Enum.NetErrorCode.ERROR_OK then
  61. self:SetReceivePrizeInfo(data)
  62. end
  63. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.TRUNWHELL_EVENT_REWARD_ACK,data)
  64. end
  65. --收到关闭本轮
  66. function TrunWheelDataMgr:OnCloseRewardAck(data)
  67. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.TRUNWHELL_EVENT_CLOSE_REWARD,data)
  68. end
  69. --------------------------------------------
  70. function TrunWheelDataMgr:UnRegisterNetEvents()
  71. --ManagerContainer.NetManager:UnRegisterPbIdCallback(ProtoMsgId.SC_CLIMBING_TOWER_INFO_ACK)
  72. end
  73. function TrunWheelDataMgr:GetData(nIndex)
  74. return self.tbPrizeInfoList[nIndex]
  75. end
  76. function TrunWheelDataMgr:GetAutoNextStopItem()
  77. local nStopIndex = self:GetNextStopItem() + 2;
  78. nStopIndex = (nStopIndex + 8) % 8
  79. if nStopIndex == 0 then
  80. nStopIndex = 8
  81. end
  82. return nStopIndex
  83. end
  84. function TrunWheelDataMgr:SetStopItem(nIndex)
  85. self.StopIndex = nIndex
  86. end
  87. function TrunWheelDataMgr:GetNextStopItem()
  88. return self.StopIndex
  89. end
  90. --设置获取到奖品
  91. function TrunWheelDataMgr:SetReceivePrizeInfo(Info)
  92. self.reward_list = Info.reward_list
  93. end
  94. --获取大奖下一个索引开始
  95. function TrunWheelDataMgr:GetBigPreizeNextIdx()
  96. for i=1, #self.reward_list do
  97. if self.reward_list[i].reward_type == 4 then
  98. local nStopIndex = i + 1
  99. nStopIndex = (nStopIndex + 8) % 8
  100. if nStopIndex == 0 then
  101. nStopIndex = 8
  102. end
  103. return nStopIndex
  104. end
  105. end
  106. end
  107. function TrunWheelDataMgr:ReceivePrizeInfo(nIndex)
  108. self.tbPrizeInfoList[nIndex].hasReceive = true
  109. end
  110. --是否全部领取完毕
  111. function TrunWheelDataMgr:IsReceiverOver()
  112. if self:GetReceivePrizeInfoCount() >= 8 then
  113. return true
  114. end
  115. return false
  116. end
  117. function TrunWheelDataMgr:SetState(strState)
  118. self.nCurState = self.State[strState]
  119. end
  120. function TrunWheelDataMgr:IsState(strState)
  121. return self.nCurState == self.State[strState]
  122. end
  123. function TrunWheelDataMgr:GetCurState()
  124. return self.nCurState
  125. end
  126. --获取本轮领奖次数
  127. function TrunWheelDataMgr:GetReceivePrizeInfoCount()
  128. --return self.wheel_num
  129. local nCount = 0
  130. for i=1, #self.tbPrizeInfoList do
  131. if self.tbPrizeInfoList[i].hasReceive then
  132. nCount = nCount +1
  133. end
  134. end
  135. return nCount
  136. end
  137. function TrunWheelDataMgr:GetRefreshCount()
  138. return self.refreshNum
  139. end
  140. function TrunWheelDataMgr:FindItemIdx(nIdx)
  141. for i=1,#self.tbPrizeInfoList do
  142. if self.tbPrizeInfoList[i].nIndex == nIdx then
  143. return i
  144. end
  145. end
  146. return 0
  147. end
  148. function TrunWheelDataMgr:OnResetState()
  149. if not self.IsOpen then
  150. self:SetState("ReadyTurn") --准备阶段
  151. else
  152. self:SetState("StartTurn") --开始阶段
  153. end
  154. end
  155. function TrunWheelDataMgr:GetLastWhellAngle()
  156. if self.wheel_idx <= 0 then
  157. return 0
  158. end
  159. local nIndex = self:FindItemIdx(self.wheel_idx)
  160. local Angle = 360 / 8 * (nIndex-1)
  161. return -Angle
  162. end
  163. function TrunWheelDataMgr:OnDataChangeNtf(data)
  164. if ManagerContainer.NetManager:IsErrorData(data) then
  165. return
  166. end
  167. local wheeldata = data
  168. if data then
  169. if data.ntf_data then
  170. wheeldata = data.ntf_data
  171. end
  172. end
  173. if wheeldata then
  174. self.itemlist = wheeldata.wheel_reward_item_list --奖励物品
  175. self.IsOpen = wheeldata.wheel_open --是否开启本轮,false表示关闭
  176. self.refreshNum = wheeldata.wheel_refresh_num --每轮的第几次刷新
  177. self.templateidx = wheeldata.template_idx --模板id
  178. self.wheel_num = wheeldata.wheel_num --抽取次数
  179. self.wheel_idx = wheeldata.wheel_idx --指针停止位置
  180. --self:OnResetState()
  181. if self.itemlist then
  182. self.tbPrizeInfoList = {}
  183. for i = 1, #self.itemlist do
  184. local item = self.itemlist[i]
  185. if item then
  186. local TrunWheelInfo = TrunWheelData:new()
  187. TrunWheelInfo.nIndex = item.item_idx
  188. TrunWheelInfo.nItemId = item.item_id
  189. TrunWheelInfo.nItemNum = item.item_num
  190. TrunWheelInfo.bIsGrandPrize = item.reward_type == 4
  191. TrunWheelInfo.hasReceive = item.has_reward
  192. local itemCfgData = ManagerContainer.CfgMgr:GetItemById(TrunWheelInfo.nItemId)
  193. if not itemCfgData then
  194. LogError(tostring(TrunWheelInfo.nItemId) .. " 道具ID不存在")
  195. else
  196. TrunWheelInfo.strItemIcon = itemCfgData.Icon
  197. self.tbPrizeInfoList[#self.tbPrizeInfoList+1] = TrunWheelInfo
  198. end
  199. end
  200. end
  201. end
  202. end
  203. end
  204. --请求打开界面
  205. function TrunWheelDataMgr:SendOpenREQ()
  206. ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_DAO_CHANG100_WHEEL_REQ)
  207. end
  208. --收到打开界面
  209. function TrunWheelDataMgr:OnOpenAck(data)
  210. ManagerContainer.LuaUIMgr:Open(Enum.UIPageName.UITurnWheelTips)
  211. end
  212. function TrunWheelDataMgr:GetLogCount()
  213. return #self.tbLog
  214. end
  215. function TrunWheelDataMgr:GetLogData(nCount)
  216. if #self.tbLog > self.MaxLogNum then --保留最后最大条数
  217. local nDelCount = #self.tbLog - self.MaxLogNum
  218. for i = 1,nDelCount do
  219. table.remove(self.tbLog,1)
  220. end
  221. end
  222. local nIndex = (#self.tbLog + nCount) % #self.tbLog
  223. if nIndex == 0 then
  224. nIndex = #self.tbLog
  225. end
  226. return self.tbLog[nIndex]
  227. end
  228. function TrunWheelDataMgr:AddLogData(data)
  229. if nil == data.log_list then
  230. return
  231. end
  232. for i = 1, #data.log_list do
  233. local itemlist = data.log_list[i].item_list
  234. if itemlist then
  235. for j = 1, #itemlist do
  236. local itemCfgData = ManagerContainer.CfgMgr:GetItemById(itemlist[j].key)
  237. if not itemCfgData then
  238. LogError(tostring(itemlist[j].key) .. " 道具ID不存在")
  239. else
  240. local strName = data.log_list[i].nick_name
  241. local nickName = CommonUtil.GetVaildNickName(strName)
  242. local Info = string.formatbykey('PrizeWheelBroad', nickName,itemCfgData.Name.." x "..tostring(itemlist[j].value))
  243. self.tbLog[#self.tbLog+1] = Info
  244. end
  245. end
  246. end
  247. end
  248. end
  249. function TrunWheelDataMgr:SetLogData(data)
  250. self.tbLog = {}
  251. self:AddLogData(data)
  252. end
  253. --获取刷新所需金币
  254. function TrunWheelDataMgr:GetRefreshCostGold()
  255. local refreshNum = self:GetRefreshCount() + 1
  256. local CostGold = self:GetRefreshPrizeWheelGold(1,refreshNum)
  257. return CostGold
  258. end
  259. --金币是否可以刷新
  260. function TrunWheelDataMgr:IsRefreshCostGold()
  261. local refreshNum = self:GetRefreshCount() + 1
  262. local CostGold = self:GetRefreshPrizeWheelGold(1,refreshNum)
  263. local Goldcount = CommonUtil.GetOwnResCountByItemId(Enum.ItemType.Diamond)
  264. if Goldcount >= CostGold then
  265. return true
  266. end
  267. return false
  268. end
  269. --获取单次抽奖道具
  270. function TrunWheelDataMgr:GetUseItemTrun(Once)
  271. if self:IsReceiverOver() then
  272. return 0
  273. end
  274. local nWheelCount = self:GetReceivePrizeInfoCount()+1
  275. local CostGold = self:GetPrizeWheelItem(1,nWheelCount)
  276. if not Once then
  277. CostGold = self:GetAllPrizeWheelItem(1)
  278. end
  279. return CostGold
  280. end
  281. --获取单次抽奖金币
  282. function TrunWheelDataMgr:GetUseGoldTrun(Once)
  283. if self:IsReceiverOver() then
  284. return 0
  285. end
  286. local nWheelCount = self:GetReceivePrizeInfoCount()+1
  287. local CostGold = self:GetPrizeWheelGold(1,nWheelCount) --单次消耗金币
  288. if not Once then
  289. CostGold = self:GetAllPrizeWheelGold(1)
  290. end
  291. return CostGold
  292. end
  293. --是否可以用道具抽奖
  294. function TrunWheelDataMgr:IsCanUseItemTrun(Once)
  295. if self:IsReceiverOver() then
  296. return false
  297. end
  298. local nWheelCount = self:GetReceivePrizeInfoCount()+1
  299. local Goldcount = CommonUtil.GetOwnResCountByItemId(Enum.ItemType.LootingPrizeItem)
  300. local CostGold = self:GetPrizeWheelItem(1,nWheelCount)
  301. if not Once then
  302. CostGold = self:GetAllPrizeWheelItem(1)
  303. end
  304. if tonumber(Goldcount) >= tonumber(CostGold) then
  305. return true
  306. end
  307. return false
  308. end
  309. --是否可以用金币抽奖
  310. function TrunWheelDataMgr:IsCanUseGoldTrun(Once)
  311. if self:IsReceiverOver() then
  312. return false
  313. end
  314. local nWheelCount = self:GetReceivePrizeInfoCount()+1
  315. local Goldcount = CommonUtil.GetOwnResCountByItemId(Enum.ItemType.Diamond)
  316. local CostGold = self:GetPrizeWheelGold(1,nWheelCount) --单次消耗金币
  317. if not Once then
  318. CostGold = self:GetAllPrizeWheelGold(1)
  319. end
  320. if tonumber(Goldcount) >= CostGold then
  321. return true
  322. end
  323. return false
  324. end
  325. --本轮剩余刷新次数
  326. function TrunWheelDataMgr:GetOverRefreshCount()
  327. local refreshNum = self:GetRefreshCount()
  328. local refreshAllNum = self:GetRefreshPrizeWheelGoldCount(1) --总刷新次数
  329. local CostNum = refreshAllNum - refreshNum
  330. if CostNum < 0 then
  331. CostNum = 0
  332. end
  333. return CostNum
  334. end
  335. --金币转钱
  336. function TrunWheelDataMgr:GoldToItem(goldNum)
  337. local ratio = self:GetChangeItemToGoldNum(1)
  338. return goldNum / ratio
  339. end
  340. --获取抽一次 差价金币
  341. function TrunWheelDataMgr:CalNeedGold()
  342. local Info = {}
  343. Info.CostItemNum = -1
  344. Info.CosGoldmNum = -1
  345. local ratio = self:GetChangeItemToGoldNum(1)
  346. if self:IsReceiverOver() then
  347. return Info
  348. end
  349. --当前道具
  350. local Itemcount = CommonUtil.GetOwnResCountByItemId(Enum.ItemType.LootingPrizeItem)
  351. --当前需要花费道具
  352. local NeeddItem = self:GetUseItemTrun(true)
  353. --计算花费
  354. if Itemcount >= NeeddItem then
  355. Info.CostItemNum = NeeddItem
  356. Info.CosGoldmNum = 0
  357. return Info
  358. else--不足
  359. local costItem = NeeddItem - Itemcount
  360. local costgold = costItem * ratio
  361. Info.CostItemNum = Itemcount
  362. Info.CosGoldmNum = costgold
  363. return Info
  364. end
  365. end
  366. --获取抽多次 是否可以使用道具(多次 不转换 道具不足用金币)
  367. function TrunWheelDataMgr:CalNeedAllGold()
  368. local Info = {}
  369. Info.CostItemNum = -1
  370. Info.CosGoldmNum = -1
  371. local ratio = self:GetChangeItemToGoldNum(1)
  372. if self:IsReceiverOver() then --本轮结束
  373. return Info
  374. end
  375. --当前道具
  376. local Itemcount = CommonUtil.GetOwnResCountByItemId(Enum.ItemType.LootingPrizeItem)
  377. --当前金币
  378. local Goldcount = CommonUtil.GetOwnResCountByItemId(Enum.ItemType.Diamond)
  379. --当前需要花费道具
  380. local NeeddItem = self:GetUseItemTrun(false)
  381. local NeddGold = self:GetUseGoldTrun(false)
  382. --计算花费
  383. if Itemcount >= NeeddItem then
  384. Info.CostItemNum = NeeddItem
  385. Info.CosGoldmNum = 0
  386. return Info
  387. else --不足
  388. Info.CostItemNum = 0
  389. Info.CosGoldmNum = NeddGold
  390. return Info
  391. end
  392. end
  393. --结束回合 剩余数
  394. function TrunWheelDataMgr:GetOverTrunCount()
  395. local nCount = self:GetReceivePrizeInfoCount()
  396. local MaxCount = self:GetMaxOverWheelCount(1)
  397. local costCount = MaxCount - nCount
  398. if costCount < 0 then
  399. costCount = 0
  400. end
  401. return costCount
  402. end
  403. --获取道具币名字
  404. function TrunWheelDataMgr:GetCostItemName()
  405. local nWheelCount = self:GetReceivePrizeInfoCount()+1
  406. local CostItemId = self:GetPrizeWheelItemGoldId(1,nWheelCount)
  407. local itemCfgData = ManagerContainer.CfgMgr:GetItemById(CostItemId)
  408. if itemCfgData then
  409. return itemCfgData.Name
  410. end
  411. return ""
  412. end
  413. ---------------转盘抽奖表------ID 数据都取第1行
  414. --抽奖单次消耗金币
  415. function TrunWheelDataMgr:GetPrizeWheelGold(id,nCount)
  416. local Cfg = ManagerContainer.CfgMgr:GetCompetitionPrizeWheelCfgById(id)
  417. return Cfg.RewardOneGold[nCount]
  418. end
  419. --抽奖单次消耗道具
  420. function TrunWheelDataMgr:GetPrizeWheelItem(id,nCount)
  421. local Cfg = ManagerContainer.CfgMgr:GetCompetitionPrizeWheelCfgById(id)
  422. if Cfg.RewardOneItem[nCount] then
  423. return Cfg.RewardOneItem[nCount][2]
  424. end
  425. end
  426. --抽奖全部消耗金币
  427. function TrunWheelDataMgr:GetAllPrizeWheelGold(id)
  428. local Cfg = ManagerContainer.CfgMgr:GetCompetitionPrizeWheelCfgById(id)
  429. return Cfg.RewardAdllGold
  430. end
  431. --抽奖全部消耗道具
  432. function TrunWheelDataMgr:GetAllPrizeWheelItem(id)
  433. local Cfg = ManagerContainer.CfgMgr:GetCompetitionPrizeWheelCfgById(id)
  434. return Cfg.RewardAllItem[1][2]
  435. end
  436. --获取道具币ID
  437. function TrunWheelDataMgr:GetPrizeWheelItemGoldId(id,nCount)
  438. local Cfg = ManagerContainer.CfgMgr:GetCompetitionPrizeWheelCfgById(id)
  439. return Cfg.RewardOneItem[nCount][1]
  440. end
  441. --刷新金币
  442. function TrunWheelDataMgr:GetRefreshPrizeWheelGold(id,nCount)
  443. local Cfg = ManagerContainer.CfgMgr:GetCompetitionPrizeWheelCfgById(id)
  444. return Cfg.RefreshPrice[nCount]
  445. end
  446. --刷新次数
  447. function TrunWheelDataMgr:GetRefreshPrizeWheelGoldCount(id)
  448. local Cfg = ManagerContainer.CfgMgr:GetCompetitionPrizeWheelCfgById(id)
  449. return #Cfg.RefreshPrice
  450. end
  451. --抽一次送积分
  452. function TrunWheelDataMgr:GetPrizeWheelPoint(id,nCount)
  453. local Cfg = ManagerContainer.CfgMgr:GetCompetitionPrizeWheelCfgById(id)
  454. return Cfg.RewardOnePoint[nCount]
  455. end
  456. --抽全部送积分
  457. function TrunWheelDataMgr:GetAllPrizeWheelPoint(id)
  458. local Cfg = ManagerContainer.CfgMgr:GetCompetitionPrizeWheelCfgById(id)
  459. return Cfg.RewardAllPoint
  460. end
  461. --最大可结束本轮次数
  462. function TrunWheelDataMgr:GetMaxOverWheelCount(id)
  463. local Cfg = ManagerContainer.CfgMgr:GetCompetitionPrizeWheelCfgById(id)
  464. return Cfg.NoRewardNum
  465. end
  466. --金币转道具数量
  467. function TrunWheelDataMgr:GetChangeItemToGoldNum(id)
  468. local Cfg = ManagerContainer.CfgMgr:GetCompetitionPrizeWheelCfgById(id)
  469. return Cfg.ItemPrice
  470. end
  471. --------------
  472. return TrunWheelDataMgr