internal void PreloadStoryInstance(int storyId) { ScriptInstanceInfo info = NewStoryInstance(storyId, false); if (null != info) { RecycleStorylInstance(info); } }
internal void SendMessage(string msgId, params object[] args) { int ct = m_StoryLogicInfos.Count; for (int ix = ct - 1; ix >= 0; --ix) { ScriptInstanceInfo info = m_StoryLogicInfos[ix]; info.m_StoryInstance.SendMessage(msgId, args); } }
internal void StartStory(int storyId) { ScriptInstanceInfo inst = NewStoryInstance(storyId); if (null != inst) { m_StoryLogicInfos.Add(inst); inst.m_StoryInstance.Context = WorldSystem.Instance; inst.m_StoryInstance.Start(); LogSystem.Info("StartStory {0}", storyId); } }
internal void StopStory(int storyId) { int count = m_StoryLogicInfos.Count; for (int index = count - 1; index >= 0; --index) { ScriptInstanceInfo info = m_StoryLogicInfos[index]; if (info.m_StoryId == storyId) { RecycleStorylInstance(info); m_StoryLogicInfos.RemoveAt(index); } } }
private ScriptInstanceInfo NewStoryInstance(int storyId, bool logIfNotFound) { ScriptInstanceInfo instInfo = GetUnusedStoryInstanceInfoFromPool(storyId); if (null == instInfo) { Data_SceneConfig cfg = SceneConfigProvider.Instance.GetSceneConfigById(WorldSystem.Instance.GetCurSceneId()); if (null != cfg) { int ct = cfg.m_StoryDslFile.Count; string[] filePath = new string[ct]; for (int i = 0; i < ct; i++) { filePath[i] = HomePath.GetAbsolutePath(FilePathDefine_Client.C_RootPath + cfg.m_StoryDslFile[i]); filePath[i] = filePath[i].Replace('\\', '/'); } StoryConfigManager.Instance.LoadStoryIfNotExist(storyId, 0, filePath); StoryInstance inst = StoryConfigManager.Instance.NewStoryInstance(storyId, 0); if (inst == null) { if (logIfNotFound) { LogSystem.Error("Can't load story config, story:{0} scene:{1} !", storyId, WorldSystem.Instance.GetCurSceneId()); } return(null); } ScriptInstanceInfo res = new ScriptInstanceInfo(); res.m_StoryId = storyId; res.m_StoryInstance = inst; res.m_IsUsed = true; AddStoryInstanceInfoToPool(storyId, res); return(res); } else { if (logIfNotFound) { LogSystem.Error("Can't find story config, story:{0} scene:{1} !", storyId, WorldSystem.Instance.GetCurSceneId()); } return(null); } } else { instInfo.m_IsUsed = true; return(instInfo); } }
private void AddStoryInstanceInfoToPool(int storyId, ScriptInstanceInfo info) { List <ScriptInstanceInfo> infos; if (m_StoryInstancePool.TryGetValue(storyId, out infos)) { infos.Add(info); } else { infos = new List <ScriptInstanceInfo>(); infos.Add(info); m_StoryInstancePool.Add(storyId, infos); } }
internal void Reset() { int count = m_StoryLogicInfos.Count; for (int index = count - 1; index >= 0; --index) { ScriptInstanceInfo info = m_StoryLogicInfos[index]; if (null != info) { RecycleStorylInstance(info); m_StoryLogicInfos.RemoveAt(index); } } m_StoryLogicInfos.Clear(); }
internal void Tick() { long time = TimeUtility.GetLocalMilliseconds(); int ct = m_StoryLogicInfos.Count; for (int ix = ct - 1; ix >= 0; --ix) { ScriptInstanceInfo info = m_StoryLogicInfos[ix]; info.m_StoryInstance.Tick(time); if (info.m_StoryInstance.IsTerminated) { RecycleStorylInstance(info); m_StoryLogicInfos.RemoveAt(ix); } } }
private ScriptInstanceInfo GetUnusedStoryInstanceInfoFromPool(int storyId) { ScriptInstanceInfo info = null; List <ScriptInstanceInfo> infos; if (m_StoryInstancePool.TryGetValue(storyId, out infos)) { int ct = infos.Count; for (int ix = 0; ix < ct; ++ix) { if (!infos[ix].m_IsUsed) { info = infos[ix]; break; } } } return(info); }
private void RecycleStorylInstance(ScriptInstanceInfo info) { info.m_IsUsed = false; }