local uiCtrl = require_ex('UI/Panels/Base/UICtrl') local PANEL_ID = PanelId.CheckIn local PHASE_ID = PhaseId.CheckIn CheckInCtrl = HL.Class('CheckInCtrl', uiCtrl.UICtrl) CheckInCtrl.s_messages = HL.StaticField(HL.Table) << { } local CHECK_IN_PANEL_STATE_NAME = { PART_ONE = "PartOne", PART_TWO = "PartTwo", } local CHECK_IN_COLLECT_STATE_NAME = { LOCKED = "Locked", CAN_COLLECT = "CanCollect", COLLECTED = "Collected", } local CHECK_IN_RARE_STATE_NAME = { NORMAL = "Normal", SPECIAL = "Special", } local CHECK_IN_PANEL_ANIM_NAME = { SWITCH_TO_PART_ONE = "checkin_changeone", SWITCH_TO_PART_TWO = "checkin_changetwo" } local CHECK_IN_BTN_ANIM_NAME = { CAN_COLLECT = "checkinitem_receive", COLLECTED = "checkinitem_done", SP_CAN_COLLECT = "checkinitemsp_receive", SP_COLLECTED = "checkinitemsp_done", } CheckInCtrl.m_unlockedDays = HL.Field(HL.Number) << -1 CheckInCtrl.m_unlockedDaysOld = HL.Field(HL.Number) << -1 CheckInCtrl.m_rewardedDays = HL.Field(HL.Number) << -1 CheckInCtrl.m_rewardedDaysOld = HL.Field(HL.Number) << -1 CheckInCtrl.m_maxCheckInDay = HL.Field(HL.Number) << -1 CheckInCtrl.m_showingSecondPart = HL.Field(HL.Boolean) << false CheckInCtrl.m_checkInBtnCellGenFun1 = HL.Field(HL.Function) CheckInCtrl.m_checkInBtnCellGenFun2 = HL.Field(HL.Function) CheckInCtrl.m_previewCharInfo = HL.Field(CS.Beyond.Gameplay.CharInfo) CheckInCtrl.m_enableEmptyRewardNode = HL.Field(HL.Boolean) << true CheckInCtrl.m_audioBlocker = HL.Field(HL.Boolean) << false CheckInCtrl.OnCreate = HL.Override(HL.Any) << function(self, args) self.m_enableEmptyRewardNode = self.view.config.ENABLE_EMPTY_REWARD_NODE CheckInCtrl.s_performCloseCallback = true if args and not CheckInCtrl.s_loginArgs then CheckInCtrl.s_loginArgs = args end self.view.btnClose.onClick:AddListener(function() if CheckInCtrl.s_performCloseCallback and CheckInCtrl.s_loginArgs and CheckInCtrl.s_loginArgs.closeCallback then PhaseManager:PopPhase(PHASE_ID, function() CheckInCtrl.s_loginArgs.closeCallback() CheckInCtrl.s_performCloseCallback = false CheckInCtrl.s_loginArgs = nil end) else PhaseManager:PopPhase(PHASE_ID) end end) local activitySystem = GameInstance.player.activitySystem; self.m_activity = activitySystem:GetActivity(UIConst.CHECK_IN_CONST.CBT2_CHECK_IN_ID) self.m_unlockedDays = self.m_activity.loginDays self.m_unlockedDaysOld = self.m_unlockedDays self.m_rewardedDays = self.m_activity.rewardDays self.m_rewardedDaysOld = self.m_rewardedDays self.m_maxCheckInDay = #Tables.checkInRewardTable local checkInList1 = self.view.checkInList1 local checkInList2 = self.view.checkInList2 self.m_checkInBtnCellGenFun1 = UIUtils.genCachedCellFunction(checkInList1) self.m_checkInBtnCellGenFun2 = UIUtils.genCachedCellFunction(checkInList2) checkInList1.onUpdateCell:AddListener(function(obj, csIndex) local cell = self.m_checkInBtnCellGenFun1(obj) if self.m_showingSecondPart then return end self:UpdateCheckInBtn(self.m_showingSecondPart, cell, csIndex) end) checkInList2.onUpdateCell:AddListener(function(obj, csIndex) local cell = self.m_checkInBtnCellGenFun2(obj) if not self.m_showingSecondPart then return end self:UpdateCheckInBtn(self.m_showingSecondPart, cell, csIndex) end) local initSelectSecond = self.m_rewardedDays >= UIConst.CHECK_IN_CONST.PART_SPLIT_NUM self:SwitchPart(initSelectSecond, true, false, true) local partToggle1 = self.view.tabCell01.toggle local partToggleRedDot1 = self.view.tabCell01.redDot local partToggle2 = self.view.tabCell02.toggle local partToggleRedDot2 = self.view.tabCell02.redDot local activeToggle = initSelectSecond and partToggle2 or partToggle1 activeToggle.isOn = true activeToggle.interactable = false partToggle1.onValueChanged:AddListener(function(isOn) if isOn then self:SwitchPart(false) partToggle1.interactable = false partToggle2.interactable = true end end) partToggle2.onValueChanged:AddListener(function(isOn) if isOn then self:SwitchPart(true) partToggle1.interactable = true partToggle2.interactable = false end end) local tabRedDotArgs1 = { checkInActivity = self.m_activity, firstDay = 1, lastDay = UIConst.CHECK_IN_CONST.PART_SPLIT_NUM } local tabRedDotArgs2 = { checkInActivity = self.m_activity, firstDay = UIConst.CHECK_IN_CONST.PART_SPLIT_NUM + 1, lastDay = self.m_maxCheckInDay } partToggleRedDot1:InitRedDot("CheckInTab", tabRedDotArgs1) partToggleRedDot2:InitRedDot("CheckInTab", tabRedDotArgs2) self.view.charRewardDayText.text = tostring(Tables.activityConst.CheckInRewardCharDay) local charId = Tables.activityConst.CheckInRewardCharId self.m_previewCharInfo = GameInstance.player.charBag:CreateClientPerfectGachaPoolCharInfo(charId) self.view.previewBtn.onClick:AddListener(function() CharInfoUtils.openCharInfoBestWay({ initCharInfo = { instId = self.m_previewCharInfo.instId, templateId = self.m_previewCharInfo.templateId, isSingleChar = true, isTrail = false, } }) end) if args then if LuaSystemManager.loginCheckSystem.m_isInterrupted then self:_StartCoroutine(function() coroutine.step() if LuaSystemManager.loginCheckSystem.m_isInterrupted then self:Hide() end end) end end end CheckInCtrl.SwitchPart = HL.Method(HL.Boolean, HL.Opt(HL.Boolean, HL.Boolean, HL.Boolean, HL.Boolean)) << function(self, showSecondPart, skipSwitchAnim, skipGradually, isInit, noScrolling) if self.m_lastPerformingBtn ~= nil then self.m_lastPerformingBtn = nil self:_PostCollectPerformance() return end if isInit == true then self.view.simpleStateController:SetState(showSecondPart and CHECK_IN_PANEL_STATE_NAME.PART_TWO or CHECK_IN_PANEL_STATE_NAME.PART_ONE) else self:_SwitchPanelView(showSecondPart and true or false, skipSwitchAnim and true or false) end self.m_showingSecondPart = showSecondPart local activeList = showSecondPart and self.view.checkInList2 or self.view.checkInList1; if not showSecondPart then self:UpdateCheckInBtn(false, self.view.specialCheckInBtn, CSIndex(UIConst.CHECK_IN_CONST.PART_SPLIT_NUM)) self.view.recruitTxt.text = self.m_activity.rewardDays >= Tables.activityConst.CheckInRewardCharDay and Language.LUA_CHECK_IN_CHAR_COLLECTED or Language.LUA_CHECK_IN_CHAR_NOT_COLLECTED end local btnCntCurPart = showSecondPart and self.m_maxCheckInDay - UIConst.CHECK_IN_CONST.PART_SPLIT_NUM or UIConst.CHECK_IN_CONST.PART_SPLIT_NUM local btnListCntCurPart = showSecondPart and btnCntCurPart or btnCntCurPart - 1 if not skipGradually then self.m_rewardedDaysOld = self.m_rewardedDays self.m_unlockedDaysOld = self.m_unlockedDays end local targetIndex = 0 local indexBaseCurPart = showSecondPart and UIConst.CHECK_IN_CONST.PART_SPLIT_NUM or 0 if not noScrolling then local lastCollectedBtnIndex = self.m_activity.rewardDays - indexBaseCurPart if lastCollectedBtnIndex > 0 then targetIndex = math.min(lastCollectedBtnIndex + 1, btnListCntCurPart) else targetIndex = 1 end end self.m_audioBlocker = false if skipSwitchAnim and not isInit then activeList:UpdateCount(btnListCntCurPart, false, false, false, skipGradually and true or false) if targetIndex ~= 0 then activeList:ScrollToIndex(CSIndex(targetIndex)) end else local alignType = targetIndex == btnListCntCurPart and CS.Beyond.UI.UIScrollList.ScrollAlignType.Bottom or CS.Beyond.UI.UIScrollList.ScrollAlignType.Top activeList:UpdateCount(btnListCntCurPart, CSIndex(targetIndex), false, false, skipGradually and true or false, alignType) end if self.m_rewardedDaysOld ~= self.m_rewardedDays and (self.m_rewardedDays <= indexBaseCurPart or self.m_rewardedDaysOld >= btnListCntCurPart + btnCntCurPart) then self:_PostCollectPerformance() end self.m_rewardedDaysOld = self.m_rewardedDays self.m_unlockedDaysOld = self.m_unlockedDays local activeLayoutTime = self.m_showingSecondPart and self.view.layoutTime02 or self.view.layoutTime01 local endTime = self.m_activity.endTime local curServerTime = DateTimeUtils.GetCurrentTimestampBySeconds() activeLayoutTime.remainingTime.text = string.format(Language.LUA_CHECK_IN_REMAINING_DAYS, math.ceil((endTime - curServerTime) / (3600 * 24))) activeLayoutTime.endTime.text = Utils.appendUTC(Utils.timestampToDateYMDHM(endTime)) end CheckInCtrl._SwitchPanelView = HL.Method(HL.Boolean, HL.Boolean) << function(self, switchToSecondPart, skipAnim) local animationWrapper = self.view.stateAnimationWrapper local clipName = switchToSecondPart and CHECK_IN_PANEL_ANIM_NAME.SWITCH_TO_PART_TWO or CHECK_IN_PANEL_ANIM_NAME.SWITCH_TO_PART_ONE if skipAnim then animationWrapper:SampleClipAtPercent(clipName, 1) else animationWrapper:Play(clipName) end end CheckInCtrl.UpdateCheckInBtn = HL.Method(HL.Boolean, HL.Table, HL.Number) << function(self, isSecondPart, cell, csIndex) local dayLuaIndex = LuaIndex(csIndex) + (isSecondPart and UIConst.CHECK_IN_CONST.PART_SPLIT_NUM or 0) local dayStr = tostring(dayLuaIndex) cell.nameDayTxt.text = dayStr if cell.nameDayTxtCollected then cell.nameDayTxtCollected.text = dayStr end local hasValue, rewardData = Tables.checkInRewardTable:TryGetValue(dayLuaIndex) cell.button.interactable = false if not hasValue then return end if dayLuaIndex ~= UIConst.CHECK_IN_CONST.PART_SPLIT_NUM then if not isSecondPart then if rewardData.isKeyReward then cell.rareStateController:SetState(CHECK_IN_RARE_STATE_NAME.SPECIAL) else cell.rareStateController:SetState(CHECK_IN_RARE_STATE_NAME.NORMAL) end end end local oldItemState = CheckInCtrl._GetItemState(dayLuaIndex, self.m_unlockedDaysOld, self.m_rewardedDaysOld); local itemState = CheckInCtrl._GetItemState(dayLuaIndex, self.m_unlockedDays, self.m_rewardedDays); local rewardItems = UIUtils.getRewardItems(rewardData.rewardId) local displayItems = { [1] = cell.reward01, [2] = cell.reward02, [3] = cell.reward03 } for key, displayItem in pairs(displayItems) do local item = displayItem.rewardItem local itemBundle = rewardItems[key] if self.m_enableEmptyRewardNode then displayItem.gameObject:SetActive(true) end if not itemBundle then if self.m_enableEmptyRewardNode then item.gameObject:SetActive(false) displayItem.emptyState.gameObject:SetActive(true) else displayItem.gameObject:SetActive(false) end else item.gameObject:SetActive(true) displayItem.emptyState.gameObject:SetActive(false) item:InitItem(itemBundle, true) item.view.rewardedCover.gameObject:SetActive(itemState == 2) end end local unlockAnim = (isSecondPart and rewardData.isKeyReward) and CHECK_IN_BTN_ANIM_NAME.SP_CAN_COLLECT or CHECK_IN_BTN_ANIM_NAME.CAN_COLLECT local collectAnim = (isSecondPart and rewardData.isKeyReward) and CHECK_IN_BTN_ANIM_NAME.SP_COLLECTED or CHECK_IN_BTN_ANIM_NAME.COLLECTED cell.button.interactable = itemState == 1 cell.animationWrapper:ClearTween() if oldItemState == itemState then if itemState == 0 then cell.animationWrapper:SampleClipAtPercent(unlockAnim, 0) elseif itemState == 1 then cell.animationWrapper:SampleClipAtPercent(unlockAnim, 1) else cell.animationWrapper:SampleClipAtPercent(collectAnim, 1) end else if itemState == 1 then cell.animationWrapper:Play(unlockAnim) else self.m_lastPerformingBtn = cell if self.m_audioBlocker == false then self.m_audioBlocker = true AudioManager.PostEvent("Au_UI_Event_CheckInPanel_Receive") end cell.animationWrapper:Play(collectAnim, function() if self.m_lastPerformingBtn == cell then self.m_lastPerformingBtn = nil self:_PostCollectPerformance() end end) end end cell.button.onClick:RemoveAllListeners() cell.button.onClick:AddListener(function() self:CollectReward() end) end CheckInCtrl._GetItemState = HL.StaticMethod(HL.Number, HL.Number, HL.Number).Return(HL.Number) << function(dayLuaIndex, unlockDays, rewardedDays) if dayLuaIndex > unlockDays then return 0 end if dayLuaIndex <= rewardedDays then return 2 end return 1 end CheckInCtrl.m_waitingShowReward = HL.Field(HL.Boolean) << false CheckInCtrl.m_waitingReward = HL.Field(HL.Table) CheckInCtrl.m_lastPerformingBtn = HL.Field(HL.Table) CheckInCtrl.CollectReward = HL.Method() << function(self) self.m_activity:GainCheckInReward() end CheckInCtrl.OnActivityUpdated = HL.Method(HL.Table) << function(self, args) local id = unpack(args) if id ~= UIConst.CHECK_IN_CONST.CBT2_CHECK_IN_ID then return end if self.m_rewardedDays < self.m_activity.rewardDays then if self.m_waitingReward ~= nil then self:_DoCollectPerformance() else self.m_waitingShowReward = true end else self.m_unlockedDaysOld = self.m_unlockedDays self.m_rewardedDaysOld = self.m_rewardedDays self.m_unlockedDays = self.m_activity.loginDays self.m_rewardedDays = self.m_activity.rewardDays self:SwitchPart(self.m_showingSecondPart, true, true) end end CheckInCtrl._DoCollectPerformance = HL.Method() << function(self) self.view.btnClose.interactable = false self.m_unlockedDaysOld = self.m_unlockedDays self.m_rewardedDaysOld = self.m_rewardedDays self.m_unlockedDays = self.m_activity.loginDays self.m_rewardedDays = self.m_activity.rewardDays self:SwitchPart(self.m_showingSecondPart, true, true, false, true) end CheckInCtrl._PostCollectPerformance = HL.Method() << function(self) self.m_waitingReward.onComplete = function() self.view.btnClose.interactable = true Notify(MessageConst.ON_CHECK_IN_UPDATED) if self.m_rewardedDays >= UIConst.CHECK_IN_CONST.PART_SPLIT_NUM then if self.view.tabCell02.toggle.isOn then self:SwitchPart(true, true, true) else self.view.tabCell02.toggle.isOn = true end else if self.view.tabCell01.toggle.isOn then self:SwitchPart(false, true, true) else self.view.tabCell01.toggle.isOn = true end end end Notify(MessageConst.SHOW_SYSTEM_REWARDS, self.m_waitingReward) self.m_waitingReward = nil end CheckInCtrl.OnRewardInfo = HL.Method(HL.Table) << function(self, args) local rewardPack = unpack(args) self.m_waitingReward = { items = rewardPack.itemBundleList, chars = rewardPack.chars } if self.m_waitingShowReward then self.m_waitingShowReward = false self:_DoCollectPerformance() end end CheckInCtrl.s_loginArgs = HL.StaticField(HL.Table) CheckInCtrl.s_performCloseCallback = HL.StaticField(HL.Boolean) << false CheckInCtrl.OnInterrupt = HL.StaticMethod(HL.String) << function(loginStepKey) if loginStepKey ~= LoginCheckConst.LOGIN_CHECK_STEP_KEY.CHECK_IN then return end if PhaseManager:IsOpen(PHASE_ID) then CheckInCtrl.s_performCloseCallback = false PhaseManager:ExitPhaseFast(PHASE_ID) end end CheckInCtrl.OnResume = HL.StaticMethod(HL.String) << function(loginStepKey) if loginStepKey ~= LoginCheckConst.LOGIN_CHECK_STEP_KEY.CHECK_IN then return end if not PhaseManager:IsPhaseRepeated(PHASE_ID) then PhaseManager:OpenPhaseFast(PHASE_ID) end end CheckInCtrl.OnClose = HL.Override() << function(self) GameInstance.player.charBag:ClearAllClientCharAndItemData() end HL.Commit(CheckInCtrl)