local uiCtrl = require_ex('UI/Panels/Base/UICtrl') local PANEL_ID = PanelId.MissionCompletePop local ChapterType = CS.Beyond.Gameplay.ChapterType local MissionState = CS.Beyond.Gameplay.MissionSystem.MissionState local CHAPTER_ICON_PATH = "Mission/ChapterIconNew" local CHAPTER_BG_ICON_PATH = "Mission/ChapterBgIconNew" local ChapterConfig = { [ChapterType.Main] = { icon = "chapter_main_icon_01", bgIcon = "chapter_main_bg_icon_01", deco = "main_mission_icon_gray", }, [ChapterType.Other] = { icon = "", bgIcon = "", deco = "", }, } local STATE_CHAPTER_START = 0 local STATE_CHAPTER_FINISH = 1 MissionCompletePopCtrl = HL.Class('MissionCompletePopCtrl', uiCtrl.UICtrl) MissionCompletePopCtrl.s_messages = HL.StaticField(HL.Table) << { } MissionCompletePopCtrl.m_chapterEffectList = HL.Field(HL.Table) MissionCompletePopCtrl.m_itemCells = HL.Field(HL.Forward("UIListCache")) MissionCompletePopCtrl.OnCreate = HL.Override(HL.Any) << function(self, arg) Notify(MessageConst.COMMON_START_BLOCK_MAIN_HUD_ACTION_QUEUE) self.m_chapterEffectList = {} local chapterId, state, tbc = unpack(arg) self:PushChapter(chapterId, state) self.view.main.gameObject:SetActive(false) self:_StartCoroutine(function() while #self.m_chapterEffectList > 0 do coroutine.step() while UIManager:IsOpen(PanelId.CommonTaskTrackToast) do coroutine.step() end local chapterEffect = table.remove(self.m_chapterEffectList,1) self.view.main.gameObject:SetActive(true) local length = self:_Refresh(chapterEffect.chapterId, chapterEffect.state, tbc) coroutine.wait(length) CS.Beyond.Gameplay.Actions.ShowChapterPanelWaitForFinish.OnChapterPanelFinish(chapterEffect.chapterId, chapterEffect.state) self.view.main.gameObject:SetActive(false) end self:Close() end) end MissionCompletePopCtrl._Refresh = HL.Method(HL.String, HL.Number, HL.Boolean).Return(HL.Number) << function(self, chapterId, state, tbc) local missionSystem = GameInstance.player.mission local chapterInfo = missionSystem:GetChapterInfo(chapterId) if chapterInfo then local length = 0 if chapterInfo.type == ChapterType.Main then length = self:_RefreshMainChapter(chapterInfo, state, tbc) elseif chapterInfo.type == ChapterType.Other then length = self:_RefreshCharacterChapter(chapterInfo, state) end return length end return 0 end MissionCompletePopCtrl._RefreshMainChapter = HL.Method(HL.Any, HL.Number, HL.Boolean).Return(HL.Number) << function(self, chapterInfo, state, tbc) if state == STATE_CHAPTER_START then local audioKey = chapterInfo.beginAudioKey AudioManager.PostEvent(audioKey) else local audioKey = chapterInfo.endAudioKey AudioManager.PostEvent(audioKey) end local chapterMain = self.view.chapterMain local chapterCharacter = self.view.chapterCharacter chapterMain.gameObject:SetActive(true) chapterCharacter.gameObject:SetActive(false) chapterMain.episodeName:SetAndResolveTextStyle(chapterInfo.episodeName:GetText()) local chapterNumTxt = chapterInfo.chapterNum:GetText() local episodeNumTxt = chapterInfo.episodeNum:GetText() local separator = "" if not string.isEmpty(chapterNumTxt) and not string.isEmpty(episodeNumTxt) then separator = " - " end chapterMain.chapterNumAndEpisodeNum:SetAndResolveTextStyle(chapterNumTxt .. separator .. episodeNumTxt) local chapterConfig = ChapterConfig[chapterInfo.type] if not string.isEmpty(chapterInfo.icon) then chapterMain.icon.gameObject:SetActive(true) chapterMain.icon:LoadSprite(CHAPTER_ICON_PATH, chapterInfo.icon .. "_long") elseif not string.isEmpty(chapterConfig.icon) then chapterMain.icon.gameObject:SetActive(true) chapterMain.icon:LoadSprite(CHAPTER_ICON_PATH, chapterConfig.icon .. "_long") else chapterMain.icon.gameObject:SetActive(false) chapterMain.icon.sprite = nil end if not string.isEmpty(chapterInfo.bgIcon) then chapterMain.bgIcon.gameObject:SetActive(true) chapterMain.bgIcon:LoadSprite(CHAPTER_BG_ICON_PATH, chapterInfo.bgIcon .. "_long") elseif not string.isEmpty(chapterConfig.icon) then chapterMain.bgIcon.gameObject:SetActive(true) chapterMain.bgIcon:LoadSprite(CHAPTER_BG_ICON_PATH, chapterConfig.bgIcon .. "_long") else chapterMain.bgIcon.gameObject:SetActive(false) chapterMain.bgIcon.sprite = nil end if not string.isEmpty(chapterConfig.deco) then chapterMain.deco.gameObject:SetActive(true) chapterMain.deco:LoadSprite(UIConst.UI_SPRITE_MISSION_TYPE_ICON, chapterConfig.deco) else chapterMain.deco.gameObject:SetActive(false) chapterMain.deco.sprite = nil end chapterMain.chapterStartLabel.gameObject:SetActive(state == STATE_CHAPTER_START) chapterMain.chapterCompleteLabel.gameObject:SetActive(state == STATE_CHAPTER_FINISH) chapterMain.finishTitle.gameObject:SetActive(state == STATE_CHAPTER_FINISH) if tbc then self.view.tbcRoot.gameObject:SetActive(true) self.view.tbcText1:SetAndResolveTextStyle(chapterNumTxt .. separator .. episodeNumTxt) self.view.tbcText2:SetAndResolveTextStyle(chapterInfo.episodeName:GetText()) self.view.tbcIcon:LoadSprite(CHAPTER_ICON_PATH, chapterInfo.icon .. "_long") chapterMain.gameObject:SetActive(false) local animWrapper = self.animationWrapper animWrapper:PlayWithTween(self.view.config.CHAPTER_COMPLETE_TBC_ANIM) local length = animWrapper:GetClipLength(self.view.config.CHAPTER_COMPLETE_TBC_ANIM) return length else self.view.tbcRoot.gameObject:SetActive(false) end local animWrapper = self.animationWrapper if state == STATE_CHAPTER_START then animWrapper:PlayWithTween(self.view.config.CHAPTER_MAIN_START_ANIM) local length = animWrapper:GetClipLength(self.view.config.CHAPTER_MAIN_START_ANIM) return length else animWrapper:PlayWithTween(self.view.config.CHAPTER_MAIN_FINISH_ANIM) local length = animWrapper:GetClipLength(self.view.config.CHAPTER_MAIN_FINISH_ANIM) return length end end MissionCompletePopCtrl._RefreshCharacterChapter = HL.Method(HL.Any, HL.Number).Return(HL.Number) << function(self, chapterInfo, state) if state == STATE_CHAPTER_START then local audioKey = chapterInfo.beginAudioKey AudioManager.PostEvent(audioKey) else local audioKey = chapterInfo.endAudioKey AudioManager.PostEvent(audioKey) end local chapterMain = self.view.chapterMain local chapterCharacter = self.view.chapterCharacter chapterMain.gameObject:SetActive(false) chapterCharacter.gameObject:SetActive(true) chapterCharacter.episodeName:SetAndResolveTextStyle(chapterInfo.episodeName:GetText()) local chapterNumTxt = chapterInfo.chapterNum:GetText() local episodeNumTxt = chapterInfo.episodeNum:GetText() local separator = "" if not string.isEmpty(chapterNumTxt) and not string.isEmpty(episodeNumTxt) then separator = " - " end chapterCharacter.chapterNumAndEpisodeNum:SetAndResolveTextStyle(chapterNumTxt .. separator .. episodeNumTxt) if not string.isEmpty(chapterInfo.icon) then chapterCharacter.charIcon.gameObject:SetActive(true) chapterCharacter.charIcon:LoadSprite("CharInfo", chapterInfo.icon) else chapterCharacter.charIcon.gameObject:SetActive(false) chapterCharacter.charIcon.sprite = nil end chapterCharacter.startText.gameObject:SetActive(state == STATE_CHAPTER_START) chapterCharacter.finishText.gameObject:SetActive(state == STATE_CHAPTER_FINISH) chapterCharacter.finishDeco.gameObject:SetActive(state == STATE_CHAPTER_FINISH) local animWrapper = self.animationWrapper if state == STATE_CHAPTER_START then animWrapper:PlayWithTween(self.view.config.CHAPTER_CHARACTER_START_ANIM) local length = animWrapper:GetClipLength(self.view.config.CHAPTER_CHARACTER_START_ANIM) return length else animWrapper:PlayWithTween(self.view.config.CHAPTER_CHARACTER_FINISH_ANIM) local length = animWrapper:GetClipLength(self.view.config.CHAPTER_CHARACTER_FINISH_ANIM) return length end end MissionCompletePopCtrl.PushChapter = HL.Method(HL.String, HL.Number, HL.boolean) << function(self, chapterId, state, tbc) table.insert(self.m_chapterEffectList, {state = state, chapterId = chapterId, tbc = tbc}) end MissionCompletePopCtrl.IsOpen = HL.StaticMethod().Return(HL.Boolean) << function() local isOpen, ctrl = UIManager:IsOpen(PANEL_ID) return isOpen end MissionCompletePopCtrl.OnChapterStart = HL.StaticMethod(HL.Table) << function(arg) local chapterId = unpack(arg) local isOpen, ctrl = UIManager:IsOpen(PANEL_ID) if isOpen then ctrl:PushChapter(chapterId, STATE_CHAPTER_START, false) else UIManager:Open(PANEL_ID, {chapterId, STATE_CHAPTER_START, false}) end end MissionCompletePopCtrl.OnChapterCompleted = HL.StaticMethod(HL.Table) << function(arg) local chapterId, tbc = unpack(arg) local isOpen, ctrl = UIManager:IsOpen(PANEL_ID) if isOpen then ctrl:PushChapter(chapterId, STATE_CHAPTER_FINISH, tbc) else UIManager:Open(PANEL_ID, {chapterId, STATE_CHAPTER_FINISH, tbc}) end end MissionCompletePopCtrl.OnShowPanelDirectly = HL.StaticMethod(HL.Table) << function(arg) local chapterId, effectType, tbc = unpack(arg) LuaSystemManager.mainHudActionQueue:AddRequest("ChapterPanelWithoutMissionHud", function() if effectType == STATE_CHAPTER_START then UIManager:Open(PANEL_ID, {chapterId, STATE_CHAPTER_START, false}) end if effectType == STATE_CHAPTER_FINISH then UIManager:Open(PANEL_ID, {chapterId, STATE_CHAPTER_FINISH, tbc}) end end) end MissionCompletePopCtrl.OnClose = HL.Override() << function(self) Notify(MessageConst.COMMON_END_BLOCK_MAIN_HUD_ACTION_QUEUE) end HL.Commit(MissionCompletePopCtrl)