using Gameplay; using Gameplay.Level; using Gameplay.Net; using System.Collections.Generic; using System.Linq; using cfg.RedPoint; using Cysharp.Threading.Tasks; using Framework; using Framework.Condition; using Debug = DebugUtil; using System; using cfg.LevelCfg; using static MapData; /// /// 关卡信息 /// public class LevelInfo : IRedPointTreeNode { #region 私有字段 /// /// 关卡配置信息 /// private readonly DataLevel cfg; /// /// 关卡数据 /// private LevelData levelData; /// /// 地图数据 /// private MapData mapData; /// /// 服务器关卡数据 /// private Gameplay.Net.LevelInfo serverData; /// /// 章节索引 /// private int _chapterIndex = -1; /// /// 关卡索引 /// private int _levelIndex = -1; /// /// 解锁条件id /// private int unLockConditionId; #endregion #region config /// /// 配置数据 /// public DataLevel Cfg { get { return cfg; } } /// /// 所属关卡组信息 /// public LevelGroupInfo GroupInfo { get { return LevelManager.Instance.GetLevelGroupInfoByID(cfg.LevelGroupID); } } /// /// 所属章节信息 /// public ChapterInfo ChapterInfo { get { return GroupInfo?.ChapterInfo; } } /// /// 关卡名 /// public string Name { get { return StringManager.Instance.GetLocalizeTextByKey(cfg.Name); } } /// /// 关卡描述 /// public string Desc { get { return StringManager.Instance.GetLocalizeTextByKey(cfg.Desc); } } //章节序号 public int ChapterIndex { get { if (_chapterIndex == -1) { if (cfg.Id < 100000) { DebugUtil.LogError("关卡id为{0}的关卡id没到6位", cfg.Id); return 0; } var resultStr = cfg.Id.ToString().Substring(1, 2); _chapterIndex = int.Parse(resultStr); } return _chapterIndex; } } //关卡序号 public int LevelIndex { get { if (_levelIndex == -1) { if (cfg.Id < 100000) { DebugUtil.LogError("关卡id为{0}的关卡id没到6位", cfg.Id); return 0; } var resultStr = cfg.Id.ToString().Substring(3, 3); _levelIndex = int.Parse(resultStr); } return _levelIndex; } } #endregion #region Data /// /// 环境类型 /// public EnvironmentType Environment { get { if (null == MapData) return EnvironmentType.Desert; return mapData.environmentType; } } /// /// 是否锁住 /// public bool IsLock { get; private set; } = true; /// /// 能否进入 /// public bool CanEnter { get { return !IsLock && IsConstEnough(); } } /// /// 地图数据 /// public MapData MapData { get { return mapData ??= MapUtils.LoadMapData(cfg.MapData); } } /// /// 关卡数据 /// public LevelData LevelData { get { return levelData ??= LevelUtils.LoadLevelData(cfg.Id); } } /// /// 是否剧情 /// public bool IsStory { get { return !string.IsNullOrWhiteSpace(cfg.StoryID); } } /// /// 环境buff描述 /// public string EnvironmentBuffString { get { return CommonUtils.GetLocalizeText(TableManager.Instance.Tables.EnviormentConfig.Get((int)Environment).DescLocal); } } #endregion #region Server Data /// /// 星级数量 /// public int StarCount { get { if (null == serverData) return 0; return (int)serverData.StarCount; } } /// /// 星级达成结果 /// public bool[] StarResult { get { if (null == serverData) return new bool[StarCount]; return serverData.star.Select(s => s > 0).ToArray(); } } /// /// 是否通关 /// public bool IsPass { get { if (null == serverData) return false; return serverData.isPassed; } } /// /// 红点 /// public RedPointNode RedPoint { get; private set; } #endregion public LevelInfo(DataLevel config) { cfg = config; IsLock = true; RefreshServerData(true); } private bool IsConstEnough() { bool result = true; if (cfg.CostItems == null || cfg.CostItems.Count == 0) return result; foreach (var costItem in cfg.CostItems) { var currCount = Actor.Instance.Item.GetItemCount(costItem.Id); result = result && currCount >= costItem.Count; if (!result) { Debug.LogError($"关卡消耗品不足,level id:{cfg.Id}"); break; } } return result; } public void RefreshServerData(bool isReset) { serverData = Actor.Instance.Level.GetLevelInfo((uint)cfg.Id); if (isReset) { IsLock = true; AddLockConditionReaction(); } } public void ConstructRedPointTree(RedPointNode parent) { RedPoint = RedPointManager.Instance.AddDynamicNode(NodeType.Level, parent, cfg.Id); } //获得星级目标的文本 public string GetStarTargetLocalizationText(int targetIndex) { var starTarget = LevelData.starTarget; if (targetIndex < 0 || targetIndex >= starTarget.Count) return null; return starTarget[targetIndex].GetConditionLocalization(); } private void AddLockConditionReaction() { ConditionReactor.Instance.RemoveReaction(unLockConditionId); unLockConditionId = ConditionReactor.Instance.AddReaction(cfg.Unlock, OnUnlockConditionChanged); } private void OnUnlockConditionChanged(bool result, object callBackParam, int reactionID) { if (result) { IsLock = false; DebugUtil.Log($"[Level] level unlock,id:{cfg.Id}"); EventManager.Instance.Send(EventManager.EventName.LevelUnlock, cfg.Id); ConditionReactor.Instance.RemoveReaction(reactionID); } } public void ConstructRedPointTree(int parentID) { throw new NotImplementedException(); } }