local SceneQuiz_Model = {} local private = {} local EventSystem = require('Event/EventSystem') local scene_quiz_pb = require('Proto.scene_quiz_pb') local scene_quiz_opt_pb = require('Proto.scene_quiz_opt_pb') local isFinalsBulletOpen = false --决赛是否打开弹幕 默认关闭 local correctContent = nil SceneQuiz_Model.ScheduleStage = { None = -1, --今天没比赛(客户端使用) PreCompetition = scene_quiz_pb.PreCompetition, --赛前阶段(今天有比赛并且没到初赛) Preliminary = scene_quiz_pb.Preliminary, --初赛阶段 Bet = scene_quiz_pb.Bet, --押注阶段(初赛和决赛中间) Finals = scene_quiz_pb.Finals, --决赛阶段 FinalsExtraTime = scene_quiz_pb.FinalsExtraTime, --决赛加时赛阶段 AfterCompetition = scene_quiz_pb.AfterCompetition, --赛后阶段(今天有比赛并且加时结束) } SceneQuiz_Model.StageState = { Prepare = scene_quiz_pb.Prepare, Doing = scene_quiz_pb.Doing, } function SceneQuiz_Model.OnStartup() NetManager.RegisterMsgCB(MessageEnums.MessageSceneQuizAnswerQuiz, private.AnswerQuizResp) NetManager.RegisterMsgCB(MessageEnums.MessageSceneQuizGetBetInfo, private.GetBetInfoResp) NetManager.RegisterMsgCB(MessageEnums.MessageSceneQuizBet, private.BetResp) NetManager.RegisterMsgCB(MessageEnums.MessageSceneQuizGetAnswerRank, private.OnSceneQuizGetAnswerRankResp) NetManager.RegisterMsgCB(MessageEnums.MessageSceneQuizWatchReward, private.OnSceneQuizWatchRewardResp) NetManager.RegisterMsgCB(MessageEnums.MessageSceneQuizGetInfo, private.OnSceneQuizGetInfoResp) NetManager.RegisterMsgCB(MessageEnums.MessageSceneQuizEnterScene, private.OnSceneQuizEnterSceneResp) NetManager.RegisterMsgCB(MessageEnums.MessageG2CPushSceneQuizModuleInfo, private.G2CPushSceneQuizModuleInfo) NetManager.RegisterMsgCB(MessageEnums.MessageG2CPushSceneQuizFinalsPromotionInfo, private.G2CPushSceneQuizFinalsPromotionInfo) NetManager.RegisterMsgCB(MessageEnums.MessageS2CPushSceneQuizExtraTimeCircleChange, private.OnS2CPushSceneQuizExtraTimeCircleChange) SceneQuiz_Model.ResetSceneData() private.curStage = SceneQuiz_Model.ScheduleStage.None private.stageState = nil private.isFinal = nil private.preliminaryScore = 0 private.betAcid = {} private.occupyDict = {} private.occupyEmptyTimes = 0 private.isOccupyingCircleId = 0 SceneQuiz_Model.CurActivityID = 0 end function SceneQuiz_Model.ResetSceneData() private.isFailInFinals = false --是否在决赛(加时赛)淘汰 private.hasGetWatchRewardId = 0 --观赛者已领取的奖励id private.hasGetWatchRewardQuizIndex = 0 --淘汰者已领取的观战题数 private.victoryPlayer = nil private.preliminaryQuizIndex = 0 end function SceneQuiz_Model.GetCurStage() return private.curStage end function SceneQuiz_Model.GetStageState() return private.stageState end function SceneQuiz_Model.GetTempStageEndTime() return private.tempStageEndTime end function SceneQuiz_Model.GetIsFinal() return private.isFinal end function SceneQuiz_Model.GetBetPerson() return private.betAcid end function SceneQuiz_Model.SetBasicInfo(info) local simpleInfo = info.simpleInfo private.SetCurStage(simpleInfo.activityId, simpleInfo.curStage) private.SetMyInfo(info.myInfo) if info.isInFail == true then private.isFailInFinals = true end end function SceneQuiz_Model.GetPreliminaryScore() return private.preliminaryScore end function private.SetMyInfo(myInfo) private.isFinal = myInfo.isFinal private.preliminaryScore = myInfo.score private.betAcid = {} for i, v in ipairs(myInfo.betAcid) do private.betAcid[v] = true end private.hasGetWatchRewardId = myInfo.watchReward EventSystem.Dispatch(EventID.UI_SceneQuiz_MyInfoRefresh) end function SceneQuiz_Model.GetHasWatchRewardId() return private.hasGetWatchRewardId end function SceneQuiz_Model.GetHasWatchRewardQuizIndex() return private.hasGetWatchRewardQuizIndex end function private.SetCurStage(activityId, stage) local newStage if activityId and activityId > 0 then newStage = stage else newStage = SceneQuiz_Model.ScheduleStage.None end local isStageChange = private.curStage ~= newStage private.curStage = newStage if private.curStage ~= SceneQuiz_Model.ScheduleStage.Preliminary then --不在初赛阶段,退出答题频道 MDL.ChannelChat.ExitChannelByChannelType(MDL.ChannelChat.ChannelCfgId.SceneQuiz) SceneQuiz_Model.SetPreliminaryQuizIndex(0) end if isStageChange then EventSystem.Dispatch(EventID.UI_SceneQuiz_StageChange, stage) if private.curStage == SceneQuiz_Model.ScheduleStage.Preliminary or stage == SceneQuiz_Model.ScheduleStage.Finals then CTL.HomeMain.AddTownHomeDelayFunc(private.OpenSceneQuizRemind) end end end function private.OpenSceneQuizRemind() local stage = SceneQuiz_Model.GetCurStage() if stage == SceneQuiz_Model.ScheduleStage.Preliminary then UIManager.OpenView(Const_UI_Lua.UIEnum.UIActivitiesRemind, {LuaConst.ActivityType.SceneQuizPreliminary}) elseif stage == SceneQuiz_Model.ScheduleStage.Finals then UIManager.OpenView(Const_UI_Lua.UIEnum.UIActivitiesRemind, {LuaConst.ActivityType.SceneQuizFinal}) end end function SceneQuiz_Model.AnswerQuizReq() if private.curStageQuizInfo == nil then logging.error(LTAG.ERROR, "curStageQuizInfo nil") return end local msg = scene_quiz_opt_pb.SceneQuizAnswerQuizReq() msg.quizIndex = private.curStageQuizInfo.quizIndex NetManager.SendMessage(MessageEnums.MessageSceneQuizAnswerQuiz, msg) end function private.AnswerQuizResp(msgResp) if msgResp.Resp.Code == 0 then if private.curStageQuizInfo then if private.curStageQuizInfo.quizIndex ~= msgResp.quizIndex then logging.error(LTAG.ERROR, "AnswerQuizResp quizIndex not match", private.curStageQuizInfo.quizIndex, msgResp.quizIndex) end if not string.isNilOrEmpty(correctContent) then MDL.ChannelChat.SendSceneQuizPreliminaryMsg(correctContent, 1, msgResp.rightIndex) end private.SetMyInfo(msgResp.myInfo) end end end function SceneQuiz_Model.GetBetInfoReq() local msg = scene_quiz_opt_pb.SceneQuizGetBetInfoReq() NetManager.SendMessage(MessageEnums.MessageSceneQuizGetBetInfo, msg) end function private.GetBetInfoResp(msgResp) if msgResp.Resp.Code == 0 then private.SetMyInfo(msgResp.myInfo) EventSystem.Dispatch(EventID.UI_SceneQuiz_BetInfoRefresh, msgResp.betInfos) end end function SceneQuiz_Model.BetReq(acid, optType) local msg = scene_quiz_opt_pb.SceneQuizBetReq() msg.acid = acid msg.optType = optType NetManager.SendMessage(MessageEnums.MessageSceneQuizBet, msg) end function private.BetResp(msgResp) if msgResp.Resp.Code == 0 then if msgResp.optType then CTL.Tips.AddTipsMsg(Const_IDS.IDS_SceneQuiz_BetHint_1) else CTL.Tips.AddTipsMsg(Const_IDS.IDS_SceneQuiz_BetHint_3) end private.SetMyInfo(msgResp.myInfo) EventSystem.Dispatch(EventID.UI_SceneQuiz_BetInfoRefresh, msgResp.betInfos) end end function private.G2CPushSceneQuizModuleInfo(msg) private.SetSceneQuizModuleInfo(msg.info) end function private.SetSceneQuizModuleInfo(info) local activityId = info.activityId if activityId > 0 then SceneQuiz_Model.CurActivityID = activityId end private.SetCurStage(activityId, info.curStage) private.stageState = info.stageState private.tempStageEndTime = info.stageEndTime private.curStageQuizInfo = info --题目刷新,清除占圈缓存 table.clear(private.occupyDict) private.isOccupyingCircleId = 0 private.occupyEmptyTimes = 0 EventSystem.Dispatch(EventID.UI_SceneQuiz_QuizModuleInfoRefresh) EventSystem.Dispatch(EventID.UI_SceneQuiz_ReopenBattleInfoView) end function private.G2CPushSceneQuizFinalsPromotionInfo(msg) local info = msg.info CTL.SceneQuiz.ProcessQuizPlayers(info.fail, info.isLastQuiz) local isSelfFail = false for i, acid in ipairs(info.fail) do if acid == BattleDataGetter.GetAcID() then isSelfFail = true break end end if isSelfFail then private.isFailInFinals = true if private.curStageQuizInfo then private.hasGetWatchRewardQuizIndex = private.curStageQuizInfo.quizIndex else private.hasGetWatchRewardQuizIndex = 0 end --失败了要自动打开弹幕 if SceneQuiz_Model.GetIsFinalsBulletOpen() == false then SceneQuiz_Model.SetIsFinalsBulletOpen(true) end end end function SceneQuiz_Model.ClearIsFailInFinals() private.isFailInFinals = false end function SceneQuiz_Model.GetIsFailInFinals() if private.curStage == SceneQuiz_Model.ScheduleStage.Finals or private.curStage == SceneQuiz_Model.ScheduleStage.FinalsExtraTime then return private.isFailInFinals end return false end function SceneQuiz_Model.SceneQuizGetAnswerRankReq(rankType) local msg = scene_quiz_opt_pb.SceneQuizGetAnswerRankReq() msg.rankType = rankType NetManager.SendMessage(MessageEnums.MessageSceneQuizGetAnswerRank, msg) end function private.OnSceneQuizGetAnswerRankResp(msgResp) if msgResp.Resp.Code == 0 then if LevelManager.IsSceneQuizTown() then --信任服务器的排序 private.victoryPlayer = msgResp.rankInfo.records[1] CTL.SceneQuiz.ProcessQuizResult(SceneQuiz_Model.CurActivityID) end EventSystem.Dispatch(EventID.UI_SceneQuiz_AnswerRank, msgResp.rankInfo.records, msgResp.rankInfo.myIndex, msgResp.rankType) end end function SceneQuiz_Model.SceneQuizWatchRewardReq() local msg = scene_quiz_opt_pb.SceneQuizWatchRewardReq() NetManager.SendMessage(MessageEnums.MessageSceneQuizWatchReward, msg) end function private.OnSceneQuizWatchRewardResp(msgResp) if msgResp.Resp.Code == 0 then if private.isFailInFinals then --更新失败者的已领奖题数 if private.curStageQuizInfo then private.hasGetWatchRewardQuizIndex = private.curStageQuizInfo.quizIndex - 1 else private.hasGetWatchRewardQuizIndex = 0 end end private.SetMyInfo(msgResp.myInfo) end end function SceneQuiz_Model.SceneQuizGetInfoReq() local msg = scene_quiz_opt_pb.SceneQuizGetInfoReq() NetManager.SendMessage(MessageEnums.MessageSceneQuizGetInfo, msg) end function private.OnSceneQuizGetInfoResp(msgResp) if msgResp.Resp.Code == 0 then private.SetSceneQuizModuleInfo(msgResp.info) private.SetMyInfo(msgResp.myInfo) end end function SceneQuiz_Model.SceneQuizEnterSceneReq() local msg = scene_quiz_opt_pb.SceneQuizEnterSceneReq() NetManager.SendMessage(MessageEnums.MessageSceneQuizEnterScene, msg) end function private.OnSceneQuizEnterSceneResp(msgResp) if msgResp.Resp.Code == 0 then --do nothing end end function SceneQuiz_Model.GetCurStageQuizInfo() return private.curStageQuizInfo end function SceneQuiz_Model.SetIsFinalsBulletOpen(value) isFinalsBulletOpen = value if value == true then CTL.BulletScreen.Show() else CTL.BulletScreen.Hide() end end function SceneQuiz_Model.GetIsFinalsBulletOpen() return isFinalsBulletOpen end function SceneQuiz_Model.GetVictoryAcid() if private.victoryPlayer then return private.victoryPlayer.acid end return nil end function SceneQuiz_Model.GetVictoryPlayer() return private.victoryPlayer end function SceneQuiz_Model.SetPreliminaryQuizIndex(quizIndex) private.preliminaryQuizIndex = quizIndex end function SceneQuiz_Model.GetPreliminaryQuizIndex() return private.preliminaryQuizIndex end function SceneQuiz_Model.C2SGetSceneQuizExtraTimeCircleOccupy(circleId) private.occupyEmptyTimes = private.occupyEmptyTimes + 1 local msg = NetManager.GetPB("scene_quiz_scene_opt_pb").C2SGetSceneQuizExtraTimeCircleOccupy() msg.circleId = circleId NetManager.SendMessage(MessageEnums.MessageC2SGetSceneQuizExtraTimeCircleOccupy, msg) end function private.OnS2CPushSceneQuizExtraTimeCircleChange(msg) if MDL.SceneQuiz.GetCurStage() == MDL.SceneQuiz.ScheduleStage.FinalsExtraTime then private.occupyDict[msg.circleId] = msg.acid if msg.circleId == private.isOccupyingCircleId then SceneQuiz_Model.ProcessCircleOccupy(msg.circleId) end end end function SceneQuiz_Model.ProcessCircleOccupy(circleId) private.isOccupyingCircleId = circleId if circleId == 0 then EventSystem.Dispatch(EventID.UI_SceneQuiz_UpdateOccupyState, false) else local acid = private.occupyDict[circleId] if string.isNilOrEmpty(acid) then --当我站在圈内,请求了5次服务器返回还是无人在圈内,没必要继续请求了 if private.occupyEmptyTimes == 5 then logging.error(LTAG.ERROR, "[一站到底]我站在圈内请求5次依旧无人在圈", circleId) --给个被人占领的提示 EventSystem.Dispatch(EventID.UI_SceneQuiz_UpdateOccupyState, true, true) return end --圈内无人 SceneQuiz_Model.C2SGetSceneQuizExtraTimeCircleOccupy(circleId) else private.occupyEmptyTimes = 0 if acid == BattleDataGetter.GetAcID() then EventSystem.Dispatch(EventID.UI_SceneQuiz_UpdateOccupyState, true, false) else EventSystem.Dispatch(EventID.UI_SceneQuiz_UpdateOccupyState, true, true) end end end end function SceneQuiz_Model.SetCorrectContent(content) correctContent = content end return SceneQuiz_Model