ro-webgl/Assets/Lua/Managers/StoryMgr.lua
2021-12-21 09:40:39 +08:00

288 lines
15 KiB
Lua

local StoryMgr = class("StoryMgr")
local ExecuteSequenceData = require('ExecuteSequenceData')
local isStorying
local curStoryChapterId
local executeSequenceData = nil
function StoryMgr:ctor()
isStorying = false
end
function StoryMgr:Destroy()
isStorying = nil
curStoryChapterId = nil
executeSequenceData = nil
end
function StoryMgr:IsStorying()
return isStorying
end
function StoryMgr:HasPreStoryChapter()
local storyChapterId = ManagerContainer.LuaGameMgr:GetCurStoryId()
if not storyChapterId then
return false
end
local storyChapterCfgData = ManagerContainer.CfgMgr:GetStoryChapterById(storyChapterId)
if not storyChapterCfgData then return false end
local state = ManagerContainer.DataMgr.StoryData:GetStateStoryChapterId(storyChapterId)
if state == Enum.StoryChapterState.End then
return false
end
return true
end
function StoryMgr:StartStoryChapterById(storyChapterId)
if isStorying then return false end
if not storyChapterId then return end
local state = ManagerContainer.DataMgr.StoryData:GetStateStoryChapterId(storyChapterId)
if state == Enum.StoryChapterState.End then
return false
end
local storyChapterCfgData = ManagerContainer.CfgMgr:GetStoryChapterById(storyChapterId)
if not storyChapterCfgData then return false end
isStorying = true
curStoryChapterId = storyChapterId
-- 根据配置生成执行队列
local luaUIMgr = ManagerContainer.LuaUIMgr
local uiStoryMgr = ManagerContainer.UIStoryMgr
executeSequenceData = ExecuteSequenceData:new()
executeSequenceData:AppendFrameInterval(1)
executeSequenceData:AppendFunc(true, self, self._StartStoryChapter)
if state == Enum.StoryChapterState.NotStart then
-- 发送服务器故事章节开始, 并开始剧情引导
executeSequenceData:AppendFrameInterval(1)
executeSequenceData:AppendFunc(true, self, self._SendStoryChapterState, curStoryChapterId, Enum.StoryChapterState.Start)
end
executeSequenceData:AppendFrameInterval(1)
executeSequenceData:AppendFunc(false, uiStoryMgr, uiStoryMgr.MapStartStoryByStoryId, storyChapterCfgData.DlgId)
executeSequenceData:AppendUIListener(Enum.UIPageName.UIStory, UIEventNames.UI_PAGE_OUT_END_NTF)
executeSequenceData:AppendFrameInterval(1)
executeSequenceData:AppendFunc(false, self, self._CheckUIBattle)
executeSequenceData:AppendFunc(false, luaUIMgr, luaUIMgr.Open, Enum.UIPageName.UIBigMap, {enterType = Enum.BigMapEnterType.DropPoint})
if storyChapterCfgData.CanSkip then
executeSequenceData:AppendUIListener(Enum.UIPageName.UIBigMap, UIEventNames.UI_PAGE_IN_END_NTF)
executeSequenceData:AppendFrameInterval(1)
executeSequenceData:AppendFunc(false, luaUIMgr, luaUIMgr.Open, Enum.UIPageName.UIStorySkip)
end
executeSequenceData:AppendUIListener(Enum.UIPageName.UIBigMap, UIEventNames.UI_CLOSE_COMPELETED)
executeSequenceData:AppendFrameInterval(1)
executeSequenceData:AppendFunc(false, self, self._EndBigMapStoryChapter)
executeSequenceData:AppendUIListener(Enum.UIPageName.UIBigMap, UIEventNames.UI_PAGE_OUT_END_NTF)
executeSequenceData:AppendFrameInterval(1)
executeSequenceData:AppendFunc(false, luaUIMgr, luaUIMgr.Open, Enum.UIPageName.UIChapter, curStoryChapterId)
executeSequenceData:AppendUIListener(Enum.UIPageName.UIChapter, UIEventNames.UI_PAGE_OUT_END_NTF)
executeSequenceData:AppendFrameInterval(1)
if state ~= Enum.StoryChapterState.End then
executeSequenceData:AppendFunc(false, self, self._SendStoryChapterState, curStoryChapterId, Enum.StoryChapterState.End)
end
executeSequenceData:AppendFunc(true, self, self._EndStoryChapter)
executeSequenceData:AppendFunc(true, self, self._StartForceGuide, storyChapterCfgData.ForceGuide)
ManagerContainer.ExecuteSequenceMgr:Execute(executeSequenceData)
return true
end
function StoryMgr:SkipCurStoryChapter()
if not isStorying then return end
if not curStoryChapterId then return end
local state = ManagerContainer.DataMgr.StoryData:GetStateStoryChapterId(curStoryChapterId)
if state == Enum.StoryChapterState.End then
return
end
if not executeSequenceData then return end
local step = executeSequenceData:FindUIListener(Enum.UIPageName.UIBigMap, UIEventNames.UI_CLOSE_COMPELETED)
ManagerContainer.ExecuteSequenceMgr:SkipToStep(executeSequenceData, step)
local uibase = ManagerContainer.LuaUIMgr:GetPage(Enum.UIPageName.UIBigMap)
if uibase then
local luaTable = uibase.MLuaTable
if luaTable then
luaTable:UIClose()
end
end
end
function StoryMgr:ExpectedStopCurStoryChapter()
if executeSequenceData then
executeSequenceData:ClearDatas()
ManagerContainer.ExecuteSequenceMgr:Exit(executeSequenceData)
end
if not isStorying then return end
isStorying = false
curStoryChapterId = nil
executeSequenceData = nil
ManagerContainer.LuaUIMgr:CloseInputMask()
end
function StoryMgr:_EndBigMapStoryChapter()
local luaUIMgr = ManagerContainer.LuaUIMgr
luaUIMgr:ClosePage(Enum.UIPageName.UIStorySkip)
ManagerContainer.UIStoryMgr:Dispose()
ManagerContainer.LuaGameMgr:StopStory(Enum.StoryType.EnterNewMap)
luaUIMgr:ClosePage(Enum.UIPageName.UIStory)
end
function StoryMgr:_StartStoryChapter()
local luaUIMgr = ManagerContainer.LuaUIMgr
luaUIMgr:OpenInputMask(Enum.UISibling[Enum.UIType.Story] - 1)
luaUIMgr:ClosePageByMUIType(Enum.UIType.TotalWin)
luaUIMgr:ClosePageByMUIType(Enum.UIType.Tips)
luaUIMgr:ClosePageByMUIType(Enum.UIType.Normal)
end
function StoryMgr:_EndStoryChapter()
isStorying = false
curStoryChapterId = nil
executeSequenceData = nil
local luaUIMgr = ManagerContainer.LuaUIMgr
luaUIMgr:ClosePage(Enum.UIPageName.UIBigMap)
luaUIMgr:ClosePage(Enum.UIPageName.UIStorySkip)
luaUIMgr:ClosePage(Enum.UIPageName.UIStory)
luaUIMgr:CloseInputMask()
ManagerContainer.UIStoryMgr:Dispose()
ManagerContainer.LuaGameMgr:StopStory(Enum.StoryType.EnterNewMap)
if not luaUIMgr:HasOpenPage(Enum.UIPageName.UIBattle) then
luaUIMgr:Open(Enum.UIPageName.UIBattle)
end
end
function StoryMgr:_SendStoryChapterState(storyChapterId, state)
local data = {}
data.map_cart = {key = storyChapterId, value = state}
ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_NEW_MAP_CARTOON_REQ, data)
end
function StoryMgr:_CheckUIBattle()
local luaUIMgr = ManagerContainer.LuaUIMgr
if not luaUIMgr:HasOpenPage(Enum.UIPageName.UIBattle) then
luaUIMgr:Open(Enum.UIPageName.UIBattle)
if executeSequenceData then
executeSequenceData:InsertNextUIListener(Enum.UIPageName.UIBattle, UIEventNames.UI_PAGE_IN_END_NTF)
end
end
end
function StoryMgr:_StartForceGuide(forceGuideId)
if not forceGuideId or forceGuideId <= 0 then
ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.UI_FORCE_GUIDE_OVER)
return
end
ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.UI_FORCE_GUIDE_TRIGGER, Enum.ForceGuideTriggerEnum.FGGroupId, forceGuideId, false)
end
function StoryMgr:StartStorySection(storySection, pos)
local storySectionData = ManagerContainer.CfgMgr:GetStorySectionById(storySection)
local hasNext = false
if storySectionData then
local storySectionType = storySectionData.Type
if storySectionType == Enum.StorySectionEventType.UnlockFunc then
if storySectionData.TriggerDlgId and storySectionData.TriggerDlgId > 0 then
local data = ExecuteSequenceData:new()
data:AppendFunc(false, ManagerContainer.UIStoryMgr, ManagerContainer.UIStoryMgr.MapStartStoryByStoryId, storySectionData.TriggerDlgId)
data:AppendUIListener(Enum.UIPageName.UIStory, UIEventNames.UI_FILLCONTENT_COMPELETED, 5)
data:AppendUIListener(Enum.UIPageName.UIStory, UIEventNames.UI_PAGE_OUT_END_NTF)
data:AppendFunc(true, self, self._ExecuteFuncLock)
data:AppendFunc(true, self, self._ExecuteFuncLockView)
ManagerContainer.ExecuteSequenceMgr:Execute(data)
hasNext = true
end
elseif storySectionType == Enum.StorySectionEventType.UnlockHangBox then
local data = ExecuteSequenceData:new()
data:AppendFunc(false, ManagerContainer.LuaUIMgr, ManagerContainer.LuaUIMgr.Open, Enum.UIPageName.UIPopGotSingle, {id=storySection, startPos=pos})
data:AppendUIListener(Enum.UIPageName.UIPopGotSingle, UIEventNames.UI_PAGE_OUT_END_NTF)
data:AppendFunc(true, self, self._ExecuteFuncLock)
if storySectionData.TriggerDlgId and storySectionData.TriggerDlgId > 0 then
data:AppendFunc(false, ManagerContainer.UIStoryMgr, ManagerContainer.UIStoryMgr.MapStartStoryByStoryId, storySectionData.TriggerDlgId)
data:AppendUIListener(Enum.UIPageName.UIStory, UIEventNames.UI_FILLCONTENT_COMPELETED, 5)
data:AppendUIListener(Enum.UIPageName.UIStory, UIEventNames.UI_PAGE_OUT_END_NTF)
end
data:AppendFunc(true, self, self._ExecuteFuncLockView)
ManagerContainer.ExecuteSequenceMgr:Execute(data)
hasNext = true
elseif storySectionType == Enum.StorySectionEventType.GotItem then
local data = ExecuteSequenceData:new()
data:AppendFunc(false, ManagerContainer.LuaUIMgr, ManagerContainer.LuaUIMgr.Open, Enum.UIPageName.UIPopGotSingle, {id=storySection, startPos=pos})
data:AppendUIListener(Enum.UIPageName.UIPopGotSingle, UIEventNames.UI_PAGE_OUT_END_NTF)
data:AppendFunc(true, self, self._ExecuteFuncLock)
if storySectionData.TriggerDlgId and storySectionData.TriggerDlgId > 0 then
data:AppendFunc(false, ManagerContainer.UIStoryMgr, ManagerContainer.UIStoryMgr.MapStartStoryByStoryId, storySectionData.TriggerDlgId)
data:AppendUIListener(Enum.UIPageName.UIStory, UIEventNames.UI_FILLCONTENT_COMPELETED, 5)
data:AppendUIListener(Enum.UIPageName.UIStory, UIEventNames.UI_PAGE_OUT_END_NTF)
end
data:AppendFunc(true, self, self._ExecuteFuncLockView)
ManagerContainer.ExecuteSequenceMgr:Execute(data)
hasNext = true
elseif storySectionType == Enum.StorySectionEventType.PlayAnim then
local data = ExecuteSequenceData:new()
if storySectionData.Content then
local videoPath = storySectionData.Content[1]
data:AppendFunc(false, ManagerContainer.LuaUIMgr, ManagerContainer.LuaUIMgr.Open, Enum.UIPageName.UIStoryPlayVideo, videoPath)
data:AppendUIListener(Enum.UIPageName.UIStoryPlayVideo, UIEventNames.UI_PAGE_OUT_END_NTF)
end
data:AppendFunc(true, self, self._ExecuteFuncLock)
data:AppendFunc(true, self, self._ExecuteFuncLockView)
ManagerContainer.ExecuteSequenceMgr:Execute(data)
elseif storySectionType == Enum.StorySectionEventType.GuardBoss then
if storySectionData.TriggerDlgId and storySectionData.TriggerDlgId > 0 then
local data = ExecuteSequenceData:new()
data:AppendFunc(false, ManagerContainer.UIStoryMgr, ManagerContainer.UIStoryMgr.MapStartStoryByStoryId, storySectionData.TriggerDlgId)
data:AppendUIListener(Enum.UIPageName.UIStory, UIEventNames.UI_FILLCONTENT_COMPELETED, 5)
data:AppendUIListener(Enum.UIPageName.UIStory, UIEventNames.UI_PAGE_OUT_END_NTF)
data:AppendFunc(true, self, self._ExecuteFuncLock)
data:AppendFunc(true, self, self._ExecuteFuncLockView)
ManagerContainer.ExecuteSequenceMgr:Execute(data)
hasNext = true
end
elseif storySectionType == Enum.StorySectionEventType.UnlockTask then
local data = ExecuteSequenceData:new()
data:AppendFunc(false, ManagerContainer.LuaUIMgr, ManagerContainer.LuaUIMgr.Open, Enum.UIPageName.UIPopGotSingle, {id=storySection, startPos=pos})
data:AppendUIListener(Enum.UIPageName.UIPopGotSingle, UIEventNames.UI_PAGE_OUT_END_NTF)
data:AppendFunc(true, self, self._ExecuteFuncLock)
if storySectionData.TriggerDlgId and storySectionData.TriggerDlgId > 0 then
data:AppendFunc(false, ManagerContainer.UIStoryMgr, ManagerContainer.UIStoryMgr.MapStartStoryByStoryId, storySectionData.TriggerDlgId)
data:AppendUIListener(Enum.UIPageName.UIStory, UIEventNames.UI_FILLCONTENT_COMPELETED, 5)
data:AppendUIListener(Enum.UIPageName.UIStory, UIEventNames.UI_PAGE_OUT_END_NTF)
end
data:AppendFunc(true, self, self._ExecuteFuncLockView)
ManagerContainer.ExecuteSequenceMgr:Execute(data)
hasNext = true
else
-- 变态需求,避免程序疯狂修改,让策划自己玩去
if storySectionData.TriggerDlgId and storySectionData.TriggerDlgId > 0 then
local data = ExecuteSequenceData:new()
data:AppendFunc(false, ManagerContainer.UIStoryMgr, ManagerContainer.UIStoryMgr.MapStartStoryByStoryId, storySectionData.TriggerDlgId)
data:AppendUIListener(Enum.UIPageName.UIStory, UIEventNames.UI_FILLCONTENT_COMPELETED, 5)
data:AppendUIListener(Enum.UIPageName.UIStory, UIEventNames.UI_PAGE_OUT_END_NTF)
data:AppendFunc(true, self, self._ExecuteFuncLock)
data:AppendFunc(true, self, self._ExecuteFuncLockView)
ManagerContainer.ExecuteSequenceMgr:Execute(data)
hasNext = true
end
end
end
if not hasNext then
self:_ExecuteFuncLock()
self:_ExecuteFuncLockView()
end
return hasNext
end
function StoryMgr:_ExecuteFuncLock()
if ManagerContainer.UIFuncUnlockMgr:NeedOpenFuncCurLevelStart(ManagerContainer.LuaBattleMgr:GetCurLevelUniqueId()) then
ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.UI_FUNCLOCK_OPEN_NTF)
end
end
function StoryMgr:_ExecuteFuncLockView()
local levelId = ManagerContainer.LuaBattleMgr:GetCurLevelUniqueId()
local newFuncs, _ = ManagerContainer.UIFuncUnlockMgr:GetNewFuncAndNearFuncByLevelId(levelId)
if newFuncs[1] ~= nil then
ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.UI_BATTLE_FUNC_OPEN_NTF)
else
ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.UI_FORCE_GUIDE_TRIGGER, Enum.ForceGuideTriggerEnum.BattleWin)
end
end
return StoryMgr