local SignIn_Controller = {} local private = {} local EventSystem = require('Event/EventSystem') local Const_Notice_Key = "SignIn_Trigger_Notice" function SignIn_Controller.OnStartup() EventSystem.Regist(EventID.UI_OperationActivity_InfoChanged, private.RefreshSignInRewardRedPoint) EventSystem.Regist(EventID.UI_LevelSelect_LevelFinished, private.RefreshSignInRewardRedPoint) EventSystem.Regist(EventID.TeamLevelUpdate, private.RefreshSignInRewardRedPoint) EventSystem.Regist(EventID.AfterTownLevelBegin, private.TriggerOpenSignIn) EventSystem.Regist(EventID.FunctionUnlockUpdate, private.TriggerOpenSignIn) private.ActivityType = MDL.OperationActivity.ActivityType.StageSignIn end function private.RefreshSignInRewardRedPoint() if SignIn_Controller.IsSignInTypeHasRewardToCollect() then CTL.RedPoint.AddRedPoint(CTL.RedPoint.RedPointKey.SignInReward) else CTL.RedPoint.RemoveRedPoint(CTL.RedPoint.RedPointKey.SignInReward) end end function SignIn_Controller.IsShowSecondDayHint() local typeInfoList = MDL.OperationActivity.GetOperationActivityInfo(private.ActivityType) if typeInfoList then local index, table = next(typeInfoList) if table then local activityId = table.activityId local signInServerInfo = MDL.SignIn.GetSignInDataByActivityId(activityId) if signInServerInfo then local curStageId = signInServerInfo.curStageID --最后一天不显示预告 local cfgCount = MDL.OperationActivity.StageSignIn:GetDataLengthByActivityID(activityId) if curStageId == cfgCount then return false end if curStageId < cfgCount then local curStageCfg = MDL.OperationActivity.StageSignIn:GetDataByActivityID_StageID(activityId, curStageId) local pairSplits = string.split(curStageCfg.DisplayTextPath,"|") if #pairSplits > 1 then --ids|stageId(用来读显示在城镇的预告icon-UITownHome) local stageId = tonumber(pairSplits[2]) local cfg = MDL.OperationActivity.StageSignIn:GetDataByActivityID_StageID(activityId, stageId) local time if curStageId == stageId - 1 then time = UTL.Time.GetServerIntervalTimeToRefresh(1) else time = UTL.Time.GetServerIntervalTimeToRefresh(1) + (stageId - curStageId) * UTL.Time.TotalSecondsOneDay end return true, time, cfg.DisplayIconPath end local displayIconPath local isCanCollect, leftDays = SignIn_Controller.IsStageSignInCanCollectReward(activityId, curStageId) if not isCanCollect and leftDays == 1 then displayIconPath = curStageCfg.DisplayIconPath else displayIconPath = MDL.OperationActivity.StageSignIn:GetDataByActivityID_StageID(activityId, curStageId + 1).DisplayIconPath end return true, UTL.Time.GetServerIntervalTimeToRefresh(1), displayIconPath end end end end return false end function SignIn_Controller.IsSignInTypeHasRewardToCollect() local typeInfoList = MDL.OperationActivity.GetOperationActivityInfo(private.ActivityType) if typeInfoList then for key, value in pairs(typeInfoList) do if SignIn_Controller.IsHasRewardNotCollect(value.activityId) then return true, value.activityId end end end return false, nil end function SignIn_Controller.IsSignInStillGoing(activityId) local stageSignInInfo = MDL.SignIn.GetSignInDataByActivityId(activityId) if not stageSignInInfo then return false end local rewards = stageSignInInfo.rewardInfo local maxStage = MDL.OperationActivity.StageSignIn:GetDataLengthByActivityID(activityId) for i = 1, maxStage do if not table.containValue(rewards, i) then return true end end return false end --定义一期活动有多长。比如两期活动会配成一期活动,长度28天,进行到1-14天的时候隐藏后14天,15天起隐藏前14天 function SignIn_Controller.DayCountPerSegment() return 14 end function SignIn_Controller.IsHasRewardNotCollect(activityId) local stageSignInInfo = MDL.SignIn.GetSignInDataByActivityId(activityId) if not stageSignInInfo then logging.log(LTAG.LOG, "运营动态信息中没有找到activityId:", activityId, "的数据。") return false end local curStageId = stageSignInInfo.curStageID if not MDL.OperationActivity.StageSignIn then logging.log(LTAG.LOG, "运营静态表数据中没有表hot2StageSignIn的数据,但是包含activityId:", activityId, "的功能信息。请策划和服务器检查!!!") return false end for i, v in MDL.OperationActivity.StageSignIn:GetEnumeratorByActivityID(activityId) do if v.StageID > curStageId then break end if SignIn_Controller.IsStageSignInCanCollectReward(activityId, v.StageID) then return true end end return false end function SignIn_Controller.IsStageSignInRewardCollected(activityId, stageId) local stageSignInInfo = MDL.SignIn.GetSignInDataByActivityId(activityId) if stageSignInInfo then for i, v in ipairs(stageSignInInfo.rewardInfo) do if v == stageId then return true end end end return false end function SignIn_Controller.IsStageSignInCanCollectReward(activityId, stageId) local isCollected = SignIn_Controller.IsStageSignInRewardCollected(activityId, stageId) local curStageId = MDL.SignIn.GetSignInDataByActivityId(activityId).curStageID return (curStageId >= stageId and not isCollected), stageId - curStageId end function SignIn_Controller.IsShowStageSignInRedPoint() if CTL.OperationActivity.IsOperationActivityTypeOpen(private.ActivityType) and CTL.OperationActivity.IsOperationActivityTypeUnlock(private.ActivityType) then local typeInfoList = MDL.OperationActivity.GetOperationActivityInfo(private.ActivityType) if typeInfoList == nil then return false end local index, table = next(typeInfoList) if table == nil then return false end for i, v in MDL.OperationActivity.StageSignIn:GetEnumeratorByActivityID(table.activityId) do if SignIn_Controller.IsStageSignInCanCollectReward(v.ActivityID, v.StageID) then return true end end end return false end function SignIn_Controller.GetCurrentShowStageId(activityId) local maxStage = MDL.OperationActivity.StageSignIn:GetDataLengthByActivityID(activityId) local signInData = MDL.SignIn.GetSignInDataByActivityId(activityId) local rewardList = signInData.rewardInfo --已领取的奖励,比如前三天我第二天没领,数组就是{1,3} local curStageId = signInData.curStageID --进行到第几天,和已领取状态无关 if curStageId == #rewardList then --奖励都领了,返回明天或后一天。注意curStageId就是今天,今天5点就可以领今天的奖励 return math.min(curStageId + 1, maxStage) end for i = 1, #rewardList do if not table.containValue(rewardList, i) then return i --中间有一天没领,返回没领的那天,引导去领 end end return math.min(#rewardList + 1, maxStage) end function SignIn_Controller.RecordNoticeState() PersistentData.PlayerData:Set(Const_Notice_Key, true) end function private.TriggerOpenSignIn() if PersistentData.PlayerData:Get(Const_Notice_Key) ~= nil then return end if SignIn_Controller.IsShowSecondDayHint() == false then return end local list = DataSheetManager.ConstData:GetDataByID("LoginActivityFirstOpen").IntListValue local triggerType, level = list[1], list[2] if MDL.Unlock.IsComplete(triggerType, level) == true then private.TryOpenSignInPanel() end end function private.TryOpenSignInPanel() if UIManager.IsViewOpened(Const_UI_Lua.UIEnum.UIWelfareBasePanel) then return end if private.hasTriggerOpen then return end private.hasTriggerOpen = true CTL.HomeMain.AddTownHomeDelayView(Const_UI_Lua.UIEnum.UIWelfareBasePanel, { welfareId = CTL.Welfare.WelfareType.SignInGift }) end return SignIn_Controller