Files
Endfield-Data/LuaScripts/UI/Panels/Cinematic/CinematicCtrl.lua
2025-12-02 20:37:18 +07:00

228 lines
5.5 KiB
Lua

local uiCtrl = require_ex('UI/Panels/Base/UICtrl')
local PANEL_ID = PanelId.Cinematic
CinematicCtrl = HL.Class('CinematicCtrl', uiCtrl.UICtrl)
CinematicCtrl.s_messages = HL.StaticField(HL.Table) << {
[MessageConst.ON_LOAD_NEW_CUTSCENE] = 'OnLoadNewCinematic',
}
CinematicCtrl.m_timelineHandle = HL.Field(HL.Userdata)
CinematicCtrl.m_debugSkipCounter = HL.Field(HL.Number) << 0
CinematicCtrl.m_fmvNodeMap = HL.Field(HL.Table)
CinematicCtrl.OnLoadNewCinematic = HL.Method(HL.Any) << function(self, arg)
if arg == nil then
logger.error("CinematicCtrl.OnLoadNewCinematic handle is nil")
return
end
self.m_timelineHandle = unpack(arg)
self:OnShow()
end
CinematicCtrl.OnCreate = HL.Override(HL.Any) << function(self, arg)
local handle = unpack(arg)
self.m_timelineHandle = handle
self.m_fmvNodeMap = {}
self.view.exUINode.view.button.onClick:RemoveAllListeners()
self.view.exUINode.view.button.onClick:AddListener(function()
self:OnBtnSkipClick()
end)
self:_InitBorderMask()
end
CinematicCtrl._InitBorderMask = HL.Method() << function(self, arg)
local screenWidth = Screen.width
local screenHeight = Screen.height
local maxScreenWidth = FMVUtils.MAX_FMV_ASPECT_RATIO * screenHeight
local borderSize = (screenWidth - maxScreenWidth) / 2
local ratio = self.view.transform.rect.width / Screen.width
self.view.leftBorder.transform.sizeDelta = Vector2(borderSize, screenHeight) * ratio
self.view.rightBorder.transform.sizeDelta = Vector2(borderSize, screenHeight) * ratio
end
CinematicCtrl.OnShow = HL.Override() << function(self)
self:_ShowCinematic()
self.view.debugNode.gameObject:SetActive(false)
if NarrativeUtils.ShouldShowNarrativeDebugNode() then
local curCutsceneData = GameWorld.cutsceneManager.curMainTimelineData
self.view.debugNode.gameObject:SetActive(true)
self.view.textCutsceneId.text = curCutsceneData.cutsceneName
end
if UNITY_EDITOR and BEYOND_DEBUG then
GameWorld.cutsceneManager:BindDebugFramingInfo(self.view.textCutsceneFrame)
end
local canSkip = Utils.checkCinematicCanSkip(self.m_timelineHandle.data)
self.view.exUINode.view.button.gameObject:SetActive(canSkip)
if canSkip then
self.view.exUINode:InitCinematicExUI()
end
end
CinematicCtrl.OnHide = HL.Override() << function(self)
self.view.exUINode:Clear()
end
CinematicCtrl.OnClose = HL.Override() << function(self)
self.view.exUINode.view.button.onClick:RemoveAllListeners()
self.view.exUINode:Clear()
self:ClearFMV()
end
CinematicCtrl._ShowCinematic = HL.Method() << function(self)
local cinematicMgr = GameWorld.cutsceneManager
local hasSubtitle = cinematicMgr:BindSubtitle(self.m_timelineHandle, self.view.subtitlePanel)
for fmvId, fmvPath in pairs(self.m_timelineHandle.loadedPanelFmv) do
local node = self:GetLoadedFMVNode(fmvId, fmvPath)
cinematicMgr:BindPanelFMVNode(self.m_timelineHandle, fmvId, node.view.movieController)
end
if self.m_timelineHandle.loadedPanelFmv.Count > 0 then
self.view.fmvGroup.gameObject:SetActive(true)
else
self.view.fmvGroup.gameObject:SetActive(false)
end
self.view.subtitlePanel.gameObject:SetActive(hasSubtitle)
cinematicMgr:BindLeftSubtitle(self.m_timelineHandle, self.view.leftSubtitlePanel)
local hasMask = cinematicMgr:BindMask(self.m_timelineHandle, self.view.mask)
self.view.mask.gameObject:SetActive(hasMask)
end
CinematicCtrl.OnBtnSkipClick = HL.Method() << function(self)
local cinematicMgr = GameWorld.cutsceneManager
self.view.exUINode:SetPause(true)
cinematicMgr:PauseTimelineByUI(true)
cinematicMgr:PauseTimeByTimeline(true)
self:Notify(MessageConst.SHOW_POP_UP, {
content = Language.LUA_CONFIRM_SKIP_DIALOG,
onConfirm = function()
cinematicMgr:PauseTimelineByUI(false)
cinematicMgr:PauseTimeByTimeline(false)
cinematicMgr:SkipTimeline(self.m_timelineHandle)
end,
onCancel = function()
self.view.exUINode:SetPause(true)
cinematicMgr:PauseTimelineByUI(false)
cinematicMgr:PauseTimeByTimeline(false)
end
})
end
CinematicCtrl.StopFMV = HL.Method(HL.String) << function(self, fmvId)
local fmvNode = self.m_fmvNodeMap[fmvId]
if not fmvNode then
return
end
fmvNode:StopVideo(true)
fmvNode.gameObject:SetActive(false)
self.m_fmvNodeMap[fmvId] = nil
if next(self.m_fmvNodeMap) == nil then
self.view.fmvGroup.gameObject:SetActive(false)
end
end
CinematicCtrl.ClearFMV = HL.Method() << function(self)
lume.each(lume.keys(self.m_fmvNodeMap), function(fmvId) self:StopFMV(fmvId) end)
end
CinematicCtrl.GetLoadedFMVNode = HL.Method(HL.String, HL.String).Return(HL.Any) << function(self, fmvId, fmvPath)
if self.m_fmvNodeMap[fmvId] then
return self.m_fmvNodeMap[fmvId]
end
local isOpen, preloader = UIManager:IsOpen(PanelId.VideoPreloader)
local node = nil
if isOpen then
node = preloader:MovePreloadedVideoNode(fmvId, self.view.fmvGroup)
end
if node == nil then
local rawNode = UIUtils.addChild(self.view.fmvGroup, self.view.fmvTemplate)
node = Utils.wrapLuaNode(rawNode)
node.gameObject:SetActive(true)
node:PreloadVideo(fmvPath)
logger.error("FMV node not preloaded!!! gen new node for fmvId: ", fmvId)
end
self.m_fmvNodeMap[fmvId] = node
return node
end
HL.Commit(CinematicCtrl)