local Cutscene_Controller = {} local private = {} local EventSystem = require "Event/EventSystem" local LuaFuncEntry = require("Main/LuaFuncEntry") private.isTimelinePause = false local LocalSaveTimeLineSkipData = "LocalSaveTimeLineSkipData" local reviewPlayer = { _playSequenceIDs = nil, --过场ID的播放队列 _curCutsceneData = nil, --当前过场的播放数据 _playBeginEvent = nil, _playEndEvent = nil, _finishCallback = nil } function Cutscene_Controller.OnStartup() private.SetupEntryFunc(true) private._curTimelineRewardQueue = {} private.canOnCutsceneListEnd = true EventSystem.Regist(EventID.OnBackButtonPressed_Event, private.OnClickBackBtnEvent) EventSystem.Regist(EventID.BeginLuaStateShutdown, private.DealwithCutsceneListEnd) EventSystem.Regist(EventID.Event_OnTimelinePause, Cutscene_Controller.OnPauseTimeline) end function private.SetupEntryFunc(isRegist) LuaFuncEntry.SetupMainEntryFunc(isRegist, LuaFuncEntry.FuncType.OnBIEventTimelineSkip, private.UploadTimelineSkipBI, LuaFuncEntry.FuncType.OnTimelinePause, private.OnTimelinePause, LuaFuncEntry.FuncType.OnClickSkipTimeline, private.OnClickSkipTimeline ) end function Cutscene_Controller.OnShutdown() private.SetupEntryFunc(false) end function private.OnTimelinePause(...) EventSystem.Dispatch(EventID.Event_OnTimelinePause, ...) end function private.OnClickSkipTimeline(...) if private.ShowTimelineRewardTip(...) then EventSystem.Dispatch(EventID.Event_OnTimelinePause, true) end end function private.OnClickBackBtnEvent() if GameAppInfo.IsChinesePackage() or GameAppInfo.IsJapanesePackage() or (GameAppInfo.IsOverseaPackage() and GameAppInfo.IsVersionGreaterThan15000()) then if AuxUtil.InTimeline() then AuxUtil.PauseTimeline(not CTL.Cutscene.IsTimelinePausing()) end end end function private.DealwithCutsceneListEnd() private.canOnCutsceneListEnd = false end function Cutscene_Controller.IsTimelinePausing() return private.isTimelinePausing end function Cutscene_Controller.OnPlayTimeline(timelinePath) private.isTimelinePausing = false local id = Cutscene_Controller.GetIDByTimelinePath(timelinePath) local isSuccess, rewardData = DataSheetManager.TimeLineReward:TryGetDataByID(id) if isSuccess then table.insert(private._curTimelineRewardQueue, rewardData) end return true end function Cutscene_Controller.OnPauseTimeline(isPause) private.isTimelinePausing = isPause EventSystem.Dispatch(EventID.Timeline_OnPause, isPause) end function Cutscene_Controller.OnEndTimeline(timelinePath, requestReward) local rewardData = private._curTimelineRewardQueue[1] local id = Cutscene_Controller.GetIDByTimelinePath(timelinePath) if rewardData and id == rewardData.ID then table.remove(private._curTimelineRewardQueue, 1) end end function private.ShowTimelineRewardTip(rewardID, callback) local rewardData = private._curTimelineRewardQueue[1] if rewardData and GameAppInfo.IsVersionGreaterThan120601() then local localSaveTimeLineSkipData = PersistentData.DeviceData:Get(LocalSaveTimeLineSkipData, {}) if not localSaveTimeLineSkipData[rewardData.TimeLineGroup] then local context = {RewardData = rewardData, Callback = callback} UIManager.OpenSpecialView(Const_UI_Lua.UIEnum.UITimeLineQuickSkip, context) return true else callback:Call(true) return false end else callback:Call(true) return false end end function Cutscene_Controller.SetLocalTimeLineSkip(timeLineGroupId) local localSaveTimeLineSkipData = PersistentData.DeviceData:Get(LocalSaveTimeLineSkipData, {}) localSaveTimeLineSkipData[timeLineGroupId] = true PersistentData.DeviceData:Set(LocalSaveTimeLineSkipData, localSaveTimeLineSkipData, true) end function private.UploadTimelineSkipBI(timelineID, clipIndex, isSkip, isSenior, playTime, duration, realDuration) EventSystem.Dispatch(EventID.BI_LevelHigh, BIManager.BIType.CutsceneSkip, timelineID .. '-' .. tostring(clipIndex), isSkip, isSenior, playTime, duration, realDuration) if not MDL.PlayerGuide.IsFinishTutorial() and isSkip then EventSystem.Dispatch(EventID.BI_ViewClick, BIManager.ViewBIEvent.CutScene_TimeLine_Skip) end end function Cutscene_Controller.UploadMovieSkipBI(movieID, isSkip, playTime, duration) EventSystem.Dispatch(EventID.BI_LevelHigh, BIManager.BIType.CutsceneSkip, movieID, isSkip, false, playTime, duration, playTime) if not MDL.PlayerGuide.IsFinishTutorial() and isSkip then EventSystem.Dispatch(EventID.BI_ViewClick, BIManager.ViewBIEvent.CutScene_Movie_Skip) end end ---@public 开始播放过场列表 ---@param list 过场列表_数组格式 ---@param playBeginEvent 每一条过场开始播放时的回调 ---@param playEndEvent 每一条过场结束播放时的回调 ---@param callback 过场列表播放结束时的回调 function Cutscene_Controller.PlayCutsceneList(list, playBeginEvent, playEndEvent, callback) reviewPlayer.PlayCutsceneList(list, playBeginEvent, playEndEvent, callback) end ---@public 停止播放过场列表 function Cutscene_Controller.StopCutsceneList() reviewPlayer.StopCutsceneList() end function Cutscene_Controller.GetIDByTimelinePath(path) local s,t,str = string.find(path, ".+/([^/^.]*)") return str end function reviewPlayer.PlayCutsceneList(list, playBeginEvent, playEndEvent, callback) reviewPlayer._playSequenceIDs = {} for i, v in ipairs(list) do table.insert(reviewPlayer._playSequenceIDs, v) end reviewPlayer._playBeginEvent = playBeginEvent reviewPlayer._playEndEvent = playEndEvent reviewPlayer._finishCallback = callback reviewPlayer.PlayCutsceneBySequence() end function reviewPlayer.StopCutsceneList() AuxUtil.StopAllTimeline() UIManager.CloseView(Const_UI_Lua.UIEnum.UIMoviePanel) reviewPlayer.OnCutsceneListEnd() end function reviewPlayer.PlayCutsceneBySequence() local id = table.remove(reviewPlayer._playSequenceIDs, 1) if id then --如果出队的id存在,则根据数据播放相应的过场 local data = DataSheetManager.CutsceneList:GetDataByID(id) if data then local lastScene = nil if reviewPlayer._curCutsceneData then lastScene = reviewPlayer._curCutsceneData.ScenePath end reviewPlayer._curCutsceneData = data if string.isNilOrEmpty(data.ScenePath) then -- ScenePath为空表示播放的是视频 reviewPlayer.PlayCurrentMovie() else -- ScenePath不为空表示播放的是Timeline if lastScene == data.ScenePath then reviewPlayer.PlayCurrentTimeline() else EventSystem.Regist(EventID.Level_BeginLevel, reviewPlayer.OnDummyLevelBegin) NotSyncBattleSetter.SwitchDummyLevel(data.ScenePath, true) end end else logging.error(LTAG.ERROR, "[Cutscene Review]","过场ID没有找到对应的数据", id) reviewPlayer.PlayCutsceneBySequence() end else --如果出队的id不存在,则代表所有过场播放结束 reviewPlayer.OnCutsceneListEnd() end end function reviewPlayer.PlayCurrentMovie() if not reviewPlayer._curCutsceneData then return end local context = { movieID = reviewPlayer._curCutsceneData.CutsceneID, autoPassTime = -1, callback = reviewPlayer.OnCutsceneEnd } if reviewPlayer._playBeginEvent then reviewPlayer._playBeginEvent(reviewPlayer._curCutsceneData.CutsceneID) end if UIManager.IsViewOpened(Const_UI_Lua.UIEnum.UIMoviePanel) then EventSystem.Dispatch(EventID.UI_MoviePanel_OpenInit, context) else UIManager.OpenView(Const_UI_Lua.UIEnum.UIMoviePanel, context) end end function reviewPlayer.PlayCurrentTimeline() if not reviewPlayer._curCutsceneData then return end local timelineID = reviewPlayer._curCutsceneData.CutsceneID local path = string.find(timelineID,"StagePlay") and string.format(ConstAssetPathConfig.TIMELINE_PATH, timelineID) or string.format(ConstAssetPathConfig.Path4, timelineID) if reviewPlayer._playBeginEvent then reviewPlayer._playBeginEvent(reviewPlayer._curCutsceneData.CutsceneID) end AuxUtil.StartTimeline(path, false, -1, true, reviewPlayer.OnCutsceneEnd, 0, 0) AuxUtil.SwitchWeather(reviewPlayer._curCutsceneData.ParamID, 0) if not string.isNilOrEmpty(reviewPlayer._curCutsceneData.LevelSound) then CTL.Sound.PlayGameSound(reviewPlayer._curCutsceneData.LevelSound) end end function reviewPlayer.OnDummyLevelBegin() EventSystem.UnRegist(EventID.Level_BeginLevel, reviewPlayer.OnDummyLevelBegin) reviewPlayer.PlayCurrentTimeline() end function reviewPlayer.OnCutsceneEnd() if not reviewPlayer._curCutsceneData then return end if not string.isNilOrEmpty(reviewPlayer._curCutsceneData.LevelSound) then CTL.Sound.StopGameSound(reviewPlayer._curCutsceneData.LevelSound) end if reviewPlayer._playEndEvent then reviewPlayer._playEndEvent(reviewPlayer._curCutsceneData.CutsceneID) end reviewPlayer.PlayCutsceneBySequence() end function reviewPlayer.OnCutsceneListEnd() if private.canOnCutsceneListEnd then if reviewPlayer._finishCallback then reviewPlayer._finishCallback() end reviewPlayer._playSequenceIDs = nil reviewPlayer._curCutsceneData = nil reviewPlayer._playBeginEvent = nil reviewPlayer._playEndEvent = nil reviewPlayer._finishCallback = nil NotSyncBattleSetter.RecoverLevel() end end return Cutscene_Controller