using Framework; using System.Collections.Generic; using cfg.LevelCfg; using UnityEngine; namespace Gameplay.Level { /// /// 关卡管理器 /// public partial class LevelManager { private const string LAST_FIGHT_LEVEL_PREFIX = "last_fight_level_"; /// /// 关卡信息字典 /// private Dictionary dicLevelInfo = new(); /// /// 章节信息字典 /// private Dictionary dicChapterInfo = new(); /// /// 关卡组信息字典,key:关卡组id,value:关卡组信息 /// private Dictionary dicLevelGroupInfo = new(); /// /// 关卡组红点id /// private readonly int[] levelGroupRedPointIDs = new[] { 101, 102, 103, 104 }; /// /// 章节类型字典 /// private Dictionary> dicChapterType = new(); private void InitData() { EventManager.Instance.Register(EventManager.EventName.AllConfigLoad, OnAllConfigLoad); EventManager.Instance.Register(EventManager.EventName.NewLevelServerData, OnNewLevelServerData); } private void ReleaseData() { EventManager.Instance.Unregister(EventManager.EventName.NewLevelServerData, OnNewLevelServerData); EventManager.Instance.Unregister(EventManager.EventName.AllConfigLoad, OnAllConfigLoad); DisposeRedPointTree(); dicLevelInfo = null; dicChapterInfo = null; dicLevelGroupInfo = null; } #region API /// /// 刷新所有关卡信息 /// public void RefreshAllLevelInfo() { foreach (LevelInfo levelInfo in dicLevelInfo.Values) { levelInfo?.RefreshServerData(true); } } /// /// 通关关卡id获取关卡信息 /// /// /// public bool TryGetLevelInfoByID(int id, out LevelInfo levelInfo) { if (!dicLevelInfo.TryGetValue(id, out levelInfo)) { DebugUtil.LogError($"找不到levelInfo,id:{id}"); return false; } return true; } /// /// 通过关卡组id获取关卡组信息 /// /// /// public bool TryGetLevelGroupInfoByID(int id, out LevelGroupInfo levelGroupInfo) { if (!dicLevelGroupInfo.TryGetValue(id, out levelGroupInfo)) { DebugUtil.LogError($"找不到LevelGroupInfo,id:{id}"); return false; } return true; } /// /// 通过章节id获取章节信息 /// /// /// public bool TryGetChapterInfoByID(int id, out ChapterInfo chapterInfo) { if (!dicChapterInfo.TryGetValue(id, out chapterInfo)) { DebugUtil.LogError($"找不到levelGroupInfo,id:{id}"); return false; } return true; } /// /// 根据章节类型获取章节信息 /// /// /// public bool TryGetChapterInfosByType(E_ChapterType type, out List listChapterInfo) { if (dicChapterType.TryGetValue(type, out listChapterInfo) && null != listChapterInfo) return true; return false; } /// /// 获取某种关卡类型上一次战斗的关卡 /// /// /// public LevelInfo GetLastFightLevelInfo(E_ChapterType type) { string key = GetChapterTypeSaveKey(type); if (!PlayerPrefs.HasKey(key)) return null; int levelID = PlayerPrefs.GetInt(key); TryGetLevelInfoByID(levelID, out LevelInfo levelInfo); return levelInfo; } /// /// 通过id判断关卡是否解锁 /// /// /// public bool CheckLevelUnlock(int levelID) { if(!TryGetLevelInfoByID(levelID, out LevelInfo levelInfo)) { DebugUtil.LogError($"cant find levelInfo,id:{levelID}"); return false; } return !levelInfo.IsLock; } /// /// 通过关卡id转数字 /// /// /// public string LevelIDToNum(int levelID) { if(!TryGetLevelInfoByID(levelID, out LevelInfo levelInfo)) { DebugUtil.LogError($"cant find levelInfo,id:{levelID}"); return string.Empty; } return levelInfo.FullNumebr; } /// /// 通过关卡id转名字 /// /// /// public string LevelIDToName(int levelID) { if(!TryGetLevelInfoByID(levelID, out LevelInfo levelInfo)) { DebugUtil.LogError($"cant find levelInfo,id:{levelID}"); return string.Empty; } return levelInfo.Name; } #endregion #region 私有方法 /// /// 加载配置 /// private void OnAllConfigLoad() { LoadAllLevelInfo(); LoadAllLevelGroup(); LoadAllChapter(); ConstructRedPointTree(); } /// /// 加载所有关卡信息 /// private void LoadAllLevelInfo() { dicLevelInfo.Clear(); List listAllLevelConfig = TableManager.Instance.Tables.Level.DataList; foreach (DataLevel config in listAllLevelConfig) { dicLevelInfo.Add(config.Id, new LevelInfo(config)); } } /// /// 加载所有关卡组信息 /// private void LoadAllLevelGroup() { dicLevelGroupInfo.Clear(); foreach (LevelInfo levelInfo in dicLevelInfo.Values) { int levelGroupID = levelInfo.Cfg.LevelGroupID; if (0 == levelGroupID) continue; if (!dicLevelGroupInfo.TryGetValue(levelGroupID, out LevelGroupInfo levelGroupInfo)) { DataLevelGroup config = TableManager.Instance.Tables.LevelGroupConfig.Get(levelGroupID); if (null != config) { levelGroupInfo = new LevelGroupInfo(config); dicLevelGroupInfo.Add(levelGroupID, levelGroupInfo); } else DebugUtil.LogError($"找不到关卡组配置, id: {levelGroupID}"); } levelGroupInfo?.AddLevel(levelInfo); } } /// /// 加载所有章节 /// private void LoadAllChapter() { dicChapterInfo.Clear(); foreach (LevelGroupInfo levelGroupInfo in dicLevelGroupInfo.Values) { int chapterID = levelGroupInfo.Cfg.ChapterID; if (!dicChapterInfo.TryGetValue(chapterID, out ChapterInfo chapterInfo)) { DataChapter config = TableManager.Instance.Tables.Chapter.Get(chapterID); if (null != config) { chapterInfo = new ChapterInfo(config); dicChapterInfo.Add(chapterID, chapterInfo); } else DebugUtil.LogError($"找不到章节配置,id:{chapterID}"); } chapterInfo?.AddLevelGroupInfo(levelGroupInfo); } foreach (ChapterInfo chapterInfo in dicChapterInfo.Values) { E_ChapterType chapterType = chapterInfo.Cfg.Type; if (!dicChapterType.TryGetValue(chapterType, out List list)) { list = new(); dicChapterType.Add(chapterType, list); } list.Add(chapterInfo); } } private void ConstructRedPointTree() { foreach (ChapterInfo chapterInfo in dicChapterInfo.Values) { int index = (int)chapterInfo.Cfg.Type; if (index < 0 || index > levelGroupRedPointIDs.Length) { DebugUtil.LogError($"index is out of range!index:{index}"); continue; } int redPointParentID = levelGroupRedPointIDs[index]; chapterInfo.ConstructRedPointTree(redPointParentID); } } private void DisposeRedPointTree() { foreach (ChapterInfo chapterInfo in dicChapterInfo.Values) { if (null != chapterInfo.RedPoint) RedPointManager.Instance.RemoveDynamicNode(chapterInfo.RedPoint); } } /// /// 新的关卡服务器数据 /// /// private void OnNewLevelServerData(int levelID) { if (TryGetLevelInfoByID(levelID, out LevelInfo levelInfo)) levelInfo.RefreshServerData(false); } /// /// 保存战斗关卡 /// /// private void SaveFightLevel(LevelInfo levelInfo) { if(null == levelInfo) return; LevelGroupInfo levelGroupInfo = levelInfo.GroupInfo; if(null == levelGroupInfo) return; ChapterInfo chapterInfo = levelGroupInfo.ChapterInfo; if(null == chapterInfo) return; PlayerPrefs.SetInt(GetChapterTypeSaveKey(chapterInfo.Cfg.Type), levelInfo.Cfg.Id); } private string GetChapterTypeSaveKey(E_ChapterType chapterType) => LAST_FIGHT_LEVEL_PREFIX + chapterType; #endregion } }