StoryMgr.lua 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. local StoryMgr = class("StoryMgr")
  2. local ExecuteSequenceData = require('ExecuteSequenceData')
  3. local isStorying
  4. local curStoryChapterId
  5. local executeSequenceData = nil
  6. function StoryMgr:ctor()
  7. isStorying = false
  8. end
  9. function StoryMgr:Destroy()
  10. isStorying = nil
  11. curStoryChapterId = nil
  12. executeSequenceData = nil
  13. end
  14. function StoryMgr:IsStorying()
  15. return isStorying
  16. end
  17. function StoryMgr:HasPreStoryChapter()
  18. local storyChapterId = ManagerContainer.LuaGameMgr:GetCurStoryId()
  19. if not storyChapterId then
  20. return false
  21. end
  22. local storyChapterCfgData = ManagerContainer.CfgMgr:GetStoryChapterById(storyChapterId)
  23. if not storyChapterCfgData then return false end
  24. local state = ManagerContainer.DataMgr.StoryData:GetStateStoryChapterId(storyChapterId)
  25. if state == Enum.StoryChapterState.End then
  26. return false
  27. end
  28. return true
  29. end
  30. function StoryMgr:StartStoryChapterById(storyChapterId)
  31. if isStorying then return false end
  32. if not storyChapterId then return end
  33. local state = ManagerContainer.DataMgr.StoryData:GetStateStoryChapterId(storyChapterId)
  34. if state == Enum.StoryChapterState.End then
  35. return false
  36. end
  37. local storyChapterCfgData = ManagerContainer.CfgMgr:GetStoryChapterById(storyChapterId)
  38. if not storyChapterCfgData then return false end
  39. isStorying = true
  40. curStoryChapterId = storyChapterId
  41. -- 根据配置生成执行队列
  42. local luaUIMgr = ManagerContainer.LuaUIMgr
  43. local uiStoryMgr = ManagerContainer.UIStoryMgr
  44. executeSequenceData = ExecuteSequenceData:new()
  45. executeSequenceData:AppendFrameInterval(1)
  46. executeSequenceData:AppendFunc(true, self, self._StartStoryChapter)
  47. if state == Enum.StoryChapterState.NotStart then
  48. -- 发送服务器故事章节开始, 并开始剧情引导
  49. executeSequenceData:AppendFrameInterval(1)
  50. executeSequenceData:AppendFunc(true, self, self._SendStoryChapterState, curStoryChapterId, Enum.StoryChapterState.Start)
  51. end
  52. executeSequenceData:AppendFrameInterval(1)
  53. executeSequenceData:AppendFunc(false, uiStoryMgr, uiStoryMgr.MapStartStoryByStoryId, storyChapterCfgData.DlgId)
  54. executeSequenceData:AppendUIListener(Enum.UIPageName.UIStory, UIEventNames.UI_PAGE_OUT_END_NTF)
  55. executeSequenceData:AppendFrameInterval(1)
  56. executeSequenceData:AppendFunc(false, self, self._CheckUIBattle)
  57. executeSequenceData:AppendFunc(false, luaUIMgr, luaUIMgr.Open, Enum.UIPageName.UIBigMap, {enterType = Enum.BigMapEnterType.DropPoint})
  58. if storyChapterCfgData.CanSkip then
  59. executeSequenceData:AppendUIListener(Enum.UIPageName.UIBigMap, UIEventNames.UI_PAGE_IN_END_NTF)
  60. executeSequenceData:AppendFrameInterval(1)
  61. executeSequenceData:AppendFunc(false, luaUIMgr, luaUIMgr.Open, Enum.UIPageName.UIStorySkip)
  62. end
  63. executeSequenceData:AppendUIListener(Enum.UIPageName.UIBigMap, UIEventNames.UI_CLOSE_COMPELETED)
  64. executeSequenceData:AppendFrameInterval(1)
  65. executeSequenceData:AppendFunc(false, self, self._EndBigMapStoryChapter)
  66. executeSequenceData:AppendUIListener(Enum.UIPageName.UIBigMap, UIEventNames.UI_PAGE_OUT_END_NTF)
  67. executeSequenceData:AppendFrameInterval(1)
  68. executeSequenceData:AppendFunc(false, luaUIMgr, luaUIMgr.Open, Enum.UIPageName.UIChapter, curStoryChapterId)
  69. executeSequenceData:AppendUIListener(Enum.UIPageName.UIChapter, UIEventNames.UI_PAGE_OUT_END_NTF)
  70. executeSequenceData:AppendFrameInterval(1)
  71. if state ~= Enum.StoryChapterState.End then
  72. executeSequenceData:AppendFunc(false, self, self._SendStoryChapterState, curStoryChapterId, Enum.StoryChapterState.End)
  73. end
  74. executeSequenceData:AppendFunc(true, self, self._EndStoryChapter)
  75. executeSequenceData:AppendFunc(true, self, self._StartForceGuide, storyChapterCfgData.ForceGuide)
  76. ManagerContainer.ExecuteSequenceMgr:Execute(executeSequenceData)
  77. return true
  78. end
  79. function StoryMgr:SkipCurStoryChapter()
  80. if not isStorying then return end
  81. if not curStoryChapterId then return end
  82. local state = ManagerContainer.DataMgr.StoryData:GetStateStoryChapterId(curStoryChapterId)
  83. if state == Enum.StoryChapterState.End then
  84. return
  85. end
  86. if not executeSequenceData then return end
  87. local step = executeSequenceData:FindUIListener(Enum.UIPageName.UIBigMap, UIEventNames.UI_CLOSE_COMPELETED)
  88. ManagerContainer.ExecuteSequenceMgr:SkipToStep(executeSequenceData, step)
  89. local uibase = ManagerContainer.LuaUIMgr:GetPage(Enum.UIPageName.UIBigMap)
  90. if uibase then
  91. local luaTable = uibase.MLuaTable
  92. if luaTable then
  93. luaTable:UIClose()
  94. end
  95. end
  96. end
  97. function StoryMgr:ExpectedStopCurStoryChapter()
  98. if executeSequenceData then
  99. executeSequenceData:ClearDatas()
  100. ManagerContainer.ExecuteSequenceMgr:Exit(executeSequenceData)
  101. end
  102. if not isStorying then return end
  103. isStorying = false
  104. curStoryChapterId = nil
  105. executeSequenceData = nil
  106. ManagerContainer.LuaUIMgr:CloseInputMask()
  107. end
  108. function StoryMgr:_EndBigMapStoryChapter()
  109. local luaUIMgr = ManagerContainer.LuaUIMgr
  110. luaUIMgr:ClosePage(Enum.UIPageName.UIStorySkip)
  111. ManagerContainer.UIStoryMgr:Dispose()
  112. ManagerContainer.LuaGameMgr:StopStory(Enum.StoryType.EnterNewMap)
  113. luaUIMgr:ClosePage(Enum.UIPageName.UIStory)
  114. end
  115. function StoryMgr:_StartStoryChapter()
  116. local luaUIMgr = ManagerContainer.LuaUIMgr
  117. luaUIMgr:OpenInputMask(Enum.UISibling[Enum.UIType.Story] - 1)
  118. luaUIMgr:ClosePageByMUIType(Enum.UIType.TotalWin)
  119. luaUIMgr:ClosePageByMUIType(Enum.UIType.Tips)
  120. luaUIMgr:ClosePageByMUIType(Enum.UIType.Normal)
  121. end
  122. function StoryMgr:_EndStoryChapter()
  123. isStorying = false
  124. curStoryChapterId = nil
  125. executeSequenceData = nil
  126. local luaUIMgr = ManagerContainer.LuaUIMgr
  127. luaUIMgr:ClosePage(Enum.UIPageName.UIBigMap)
  128. luaUIMgr:ClosePage(Enum.UIPageName.UIStorySkip)
  129. luaUIMgr:ClosePage(Enum.UIPageName.UIStory)
  130. luaUIMgr:CloseInputMask()
  131. ManagerContainer.UIStoryMgr:Dispose()
  132. ManagerContainer.LuaGameMgr:StopStory(Enum.StoryType.EnterNewMap)
  133. if not luaUIMgr:HasOpenPage(Enum.UIPageName.UIBattle) then
  134. luaUIMgr:Open(Enum.UIPageName.UIBattle)
  135. end
  136. end
  137. function StoryMgr:_SendStoryChapterState(storyChapterId, state)
  138. local data = {}
  139. data.map_cart = {key = storyChapterId, value = state}
  140. ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_NEW_MAP_CARTOON_REQ, data)
  141. end
  142. function StoryMgr:_CheckUIBattle()
  143. local luaUIMgr = ManagerContainer.LuaUIMgr
  144. if not luaUIMgr:HasOpenPage(Enum.UIPageName.UIBattle) then
  145. luaUIMgr:Open(Enum.UIPageName.UIBattle)
  146. if executeSequenceData then
  147. executeSequenceData:InsertNextUIListener(Enum.UIPageName.UIBattle, UIEventNames.UI_PAGE_IN_END_NTF)
  148. end
  149. end
  150. end
  151. function StoryMgr:_StartForceGuide(forceGuideId)
  152. if not forceGuideId or forceGuideId <= 0 then
  153. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.UI_FORCE_GUIDE_OVER)
  154. return
  155. end
  156. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.UI_FORCE_GUIDE_TRIGGER, Enum.ForceGuideTriggerEnum.FGGroupId, forceGuideId, false)
  157. end
  158. function StoryMgr:StartStorySection(storySection, pos)
  159. local storySectionData = ManagerContainer.CfgMgr:GetStorySectionById(storySection)
  160. local hasNext = false
  161. if storySectionData then
  162. local storySectionType = storySectionData.Type
  163. if storySectionType == Enum.StorySectionEventType.UnlockFunc then
  164. if storySectionData.TriggerDlgId and storySectionData.TriggerDlgId > 0 then
  165. local data = ExecuteSequenceData:new()
  166. data:AppendFunc(false, ManagerContainer.UIStoryMgr, ManagerContainer.UIStoryMgr.MapStartStoryByStoryId, storySectionData.TriggerDlgId)
  167. data:AppendUIListener(Enum.UIPageName.UIStory, UIEventNames.UI_FILLCONTENT_COMPELETED, 5)
  168. data:AppendUIListener(Enum.UIPageName.UIStory, UIEventNames.UI_PAGE_OUT_END_NTF)
  169. data:AppendFunc(true, self, self._ExecuteFuncLock)
  170. data:AppendFunc(true, self, self._ExecuteFuncLockView)
  171. ManagerContainer.ExecuteSequenceMgr:Execute(data)
  172. hasNext = true
  173. end
  174. elseif storySectionType == Enum.StorySectionEventType.UnlockHangBox then
  175. local data = ExecuteSequenceData:new()
  176. data:AppendFunc(false, ManagerContainer.LuaUIMgr, ManagerContainer.LuaUIMgr.Open, Enum.UIPageName.UIPopGotSingle, {id=storySection, startPos=pos})
  177. data:AppendUIListener(Enum.UIPageName.UIPopGotSingle, UIEventNames.UI_PAGE_OUT_END_NTF)
  178. data:AppendFunc(true, self, self._ExecuteFuncLock)
  179. if storySectionData.TriggerDlgId and storySectionData.TriggerDlgId > 0 then
  180. data:AppendFunc(false, ManagerContainer.UIStoryMgr, ManagerContainer.UIStoryMgr.MapStartStoryByStoryId, storySectionData.TriggerDlgId)
  181. data:AppendUIListener(Enum.UIPageName.UIStory, UIEventNames.UI_FILLCONTENT_COMPELETED, 5)
  182. data:AppendUIListener(Enum.UIPageName.UIStory, UIEventNames.UI_PAGE_OUT_END_NTF)
  183. end
  184. data:AppendFunc(true, self, self._ExecuteFuncLockView)
  185. ManagerContainer.ExecuteSequenceMgr:Execute(data)
  186. hasNext = true
  187. elseif storySectionType == Enum.StorySectionEventType.GotItem then
  188. local data = ExecuteSequenceData:new()
  189. data:AppendFunc(false, ManagerContainer.LuaUIMgr, ManagerContainer.LuaUIMgr.Open, Enum.UIPageName.UIPopGotSingle, {id=storySection, startPos=pos})
  190. data:AppendUIListener(Enum.UIPageName.UIPopGotSingle, UIEventNames.UI_PAGE_OUT_END_NTF)
  191. data:AppendFunc(true, self, self._ExecuteFuncLock)
  192. if storySectionData.TriggerDlgId and storySectionData.TriggerDlgId > 0 then
  193. data:AppendFunc(false, ManagerContainer.UIStoryMgr, ManagerContainer.UIStoryMgr.MapStartStoryByStoryId, storySectionData.TriggerDlgId)
  194. data:AppendUIListener(Enum.UIPageName.UIStory, UIEventNames.UI_FILLCONTENT_COMPELETED, 5)
  195. data:AppendUIListener(Enum.UIPageName.UIStory, UIEventNames.UI_PAGE_OUT_END_NTF)
  196. end
  197. data:AppendFunc(true, self, self._ExecuteFuncLockView)
  198. ManagerContainer.ExecuteSequenceMgr:Execute(data)
  199. hasNext = true
  200. elseif storySectionType == Enum.StorySectionEventType.PlayAnim then
  201. local data = ExecuteSequenceData:new()
  202. if storySectionData.Content then
  203. local videoPath = storySectionData.Content[1]
  204. data:AppendFunc(false, ManagerContainer.LuaUIMgr, ManagerContainer.LuaUIMgr.Open, Enum.UIPageName.UIStoryPlayVideo, videoPath)
  205. data:AppendUIListener(Enum.UIPageName.UIStoryPlayVideo, UIEventNames.UI_PAGE_OUT_END_NTF)
  206. end
  207. data:AppendFunc(true, self, self._ExecuteFuncLock)
  208. data:AppendFunc(true, self, self._ExecuteFuncLockView)
  209. ManagerContainer.ExecuteSequenceMgr:Execute(data)
  210. elseif storySectionType == Enum.StorySectionEventType.GuardBoss then
  211. if storySectionData.TriggerDlgId and storySectionData.TriggerDlgId > 0 then
  212. local data = ExecuteSequenceData:new()
  213. data:AppendFunc(false, ManagerContainer.UIStoryMgr, ManagerContainer.UIStoryMgr.MapStartStoryByStoryId, storySectionData.TriggerDlgId)
  214. data:AppendUIListener(Enum.UIPageName.UIStory, UIEventNames.UI_FILLCONTENT_COMPELETED, 5)
  215. data:AppendUIListener(Enum.UIPageName.UIStory, UIEventNames.UI_PAGE_OUT_END_NTF)
  216. data:AppendFunc(true, self, self._ExecuteFuncLock)
  217. data:AppendFunc(true, self, self._ExecuteFuncLockView)
  218. ManagerContainer.ExecuteSequenceMgr:Execute(data)
  219. hasNext = true
  220. end
  221. elseif storySectionType == Enum.StorySectionEventType.UnlockTask then
  222. local data = ExecuteSequenceData:new()
  223. data:AppendFunc(false, ManagerContainer.LuaUIMgr, ManagerContainer.LuaUIMgr.Open, Enum.UIPageName.UIPopGotSingle, {id=storySection, startPos=pos})
  224. data:AppendUIListener(Enum.UIPageName.UIPopGotSingle, UIEventNames.UI_PAGE_OUT_END_NTF)
  225. data:AppendFunc(true, self, self._ExecuteFuncLock)
  226. if storySectionData.TriggerDlgId and storySectionData.TriggerDlgId > 0 then
  227. data:AppendFunc(false, ManagerContainer.UIStoryMgr, ManagerContainer.UIStoryMgr.MapStartStoryByStoryId, storySectionData.TriggerDlgId)
  228. data:AppendUIListener(Enum.UIPageName.UIStory, UIEventNames.UI_FILLCONTENT_COMPELETED, 5)
  229. data:AppendUIListener(Enum.UIPageName.UIStory, UIEventNames.UI_PAGE_OUT_END_NTF)
  230. end
  231. data:AppendFunc(true, self, self._ExecuteFuncLockView)
  232. ManagerContainer.ExecuteSequenceMgr:Execute(data)
  233. hasNext = true
  234. else
  235. -- 变态需求,避免程序疯狂修改,让策划自己玩去
  236. if storySectionData.TriggerDlgId and storySectionData.TriggerDlgId > 0 then
  237. local data = ExecuteSequenceData:new()
  238. data:AppendFunc(false, ManagerContainer.UIStoryMgr, ManagerContainer.UIStoryMgr.MapStartStoryByStoryId, storySectionData.TriggerDlgId)
  239. data:AppendUIListener(Enum.UIPageName.UIStory, UIEventNames.UI_FILLCONTENT_COMPELETED, 5)
  240. data:AppendUIListener(Enum.UIPageName.UIStory, UIEventNames.UI_PAGE_OUT_END_NTF)
  241. data:AppendFunc(true, self, self._ExecuteFuncLock)
  242. data:AppendFunc(true, self, self._ExecuteFuncLockView)
  243. ManagerContainer.ExecuteSequenceMgr:Execute(data)
  244. hasNext = true
  245. end
  246. end
  247. end
  248. if not hasNext then
  249. self:_ExecuteFuncLock()
  250. self:_ExecuteFuncLockView()
  251. end
  252. return hasNext
  253. end
  254. function StoryMgr:_ExecuteFuncLock()
  255. if ManagerContainer.UIFuncUnlockMgr:NeedOpenFuncCurLevelStart(ManagerContainer.LuaBattleMgr:GetCurLevelUniqueId()) then
  256. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.UI_FUNCLOCK_OPEN_NTF)
  257. end
  258. end
  259. function StoryMgr:_ExecuteFuncLockView()
  260. local levelId = ManagerContainer.LuaBattleMgr:GetCurLevelUniqueId()
  261. local newFuncs, _ = ManagerContainer.UIFuncUnlockMgr:GetNewFuncAndNearFuncByLevelId(levelId)
  262. if newFuncs[1] ~= nil then
  263. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.UI_BATTLE_FUNC_OPEN_NTF)
  264. else
  265. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.UI_FORCE_GUIDE_TRIGGER, Enum.ForceGuideTriggerEnum.BattleWin)
  266. end
  267. end
  268. return StoryMgr