using Framework; using System.Collections.Generic; using System.Linq; namespace Gameplay.Level { public partial class LevelManager { private Dictionary _levelDic = new(); private Dictionary _levelGroupDic = new(); private Dictionary _chapterInfoDic = new(); private readonly int[] _levelGroupTypeRedPointIDArray = new[] { 101, 102, 103 }; private void InitData() { RegisterEventData(); } private void ReleaseData() { UnregisterEventData(); DisposeRedPointTree(); _levelDic = null; _levelGroupDic = null; _chapterInfoDic = null; } private void RegisterEventData() { EventManager.Instance.Register(EventManager.EventName.AllConfigLoad, OnAllConfigLoad); EventManager.Instance.Register(EventManager.EventName.NewLevelServerData, OnNewLevelServerData); } private void UnregisterEventData() { EventManager.Instance.Unregister(EventManager.EventName.AllConfigLoad, OnAllConfigLoad); EventManager.Instance.Unregister(EventManager.EventName.NewLevelServerData, OnNewLevelServerData); } private void OnAllConfigLoad() { LoadAllLevel(); LoadAllChapter(); LoadAllLevelGroup(); ConstructRedPointTree(); } private void LoadAllLevel() { _levelDic.Clear(); var allLevelConfig = TableManager.Instance.Tables.Level.DataMap; foreach (var config in allLevelConfig.Values) { var levelInfo = new LevelInfo(config); _levelDic.Add(levelInfo.ID, levelInfo); } } private void LoadAllChapter() { _chapterInfoDic.Clear(); foreach (var levelInfo in _levelDic.Values) { var chapterID = levelInfo.ChapterID; ChapterInfo chapterInfo = null; if (!_chapterInfoDic.TryGetValue(chapterID, out chapterInfo)) { var config = TableManager.Instance.Tables.Chapter.Get(chapterID); if (config != null) { chapterInfo = new ChapterInfo(config); _chapterInfoDic.Add(chapterID, chapterInfo); } else { DebugUtil.LogError($"cant find chapter config,{chapterID}"); } } if (chapterInfo != null) chapterInfo.AddLevel(levelInfo); } } private void LoadAllLevelGroup() { _levelGroupDic.Clear(); foreach (var chapterInfo in _chapterInfoDic.Values) { var levelGroupID = chapterInfo.GroupID; LevelGroupInfo levelGroupInfo = null; if (!_levelGroupDic.TryGetValue(levelGroupID, out levelGroupInfo)) { var config = TableManager.Instance.Tables.LevelGroupConfig.Get(levelGroupID); if (config != null) { levelGroupInfo = new LevelGroupInfo(config); _levelGroupDic.Add(levelGroupID, levelGroupInfo); } else { DebugUtil.LogError($"cant find LevelGroup config,{levelGroupID}"); } } if (levelGroupInfo != null) levelGroupInfo.AddChapter(chapterInfo); } } private void ConstructRedPointTree() { foreach (var levelGroupInfo in _levelGroupDic.Values) { var index = (int)levelGroupInfo.GroupType; if (index < 0 || index > _levelGroupTypeRedPointIDArray.Length) { DebugUtil.LogError($"index is out of range!index:{index}"); continue; } var redPointParentID = _levelGroupTypeRedPointIDArray[index]; levelGroupInfo.ConstructRedPointTree(redPointParentID); } } private void DisposeRedPointTree() { foreach (var levelGroupInfo in _levelGroupDic.Values) { if (levelGroupInfo.RedPointNode != null) { RedPointManager.Instance.RemoveDynamicNode(levelGroupInfo.RedPointNode); } } } private void OnNewLevelServerData(int levelID) { var levelInfo = GetLevelInfoByID(levelID); if (levelInfo != null) { levelInfo.RefreshServerData(); } } #region API public LevelInfo GetLevelInfoByID(int id) { if (!_levelDic.TryGetValue(id, out var levelInfo)) { DebugUtil.LogError($"找不到levelInfo,id:{id}"); } return levelInfo; } public ChapterInfo GetChapterInfoByID(int id) { if (!_chapterInfoDic.TryGetValue(id, out var chapterInfo)) { DebugUtil.LogError($"找不到chapterInfo,id:{id}"); } return chapterInfo; } public LevelGroupInfo GetLevelGroupInfoByID(int id) { if (!_levelGroupDic.TryGetValue(id, out var levelGroupInfo)) { DebugUtil.LogError($"找不到levelGroupInfo,id:{id}"); } return levelGroupInfo; } public List GetAllLevelGroupInfo() { return _levelGroupDic.Values.ToList(); } public List GetAllLevelInfo() { return _levelDic.Values.ToList(); } public List GetAllChapterInfo() { return _chapterInfoDic.Values.ToList(); } #endregion } }