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 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; private set; } /// /// 关卡名 /// 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 (-1 == chapterIndex) { if (Cfg.Id < 100000) { DebugUtil.LogError("关卡id为{0}的关卡id没到6位", Cfg.Id); return 0; } string resultStr = Cfg.Id.ToString().Substring(1, 2); chapterIndex = int.Parse(resultStr); } return chapterIndex; } } /// /// 关卡序号 /// public int LevelIndex { get { if (-1 == levelIndex) { if (Cfg.Id < 100000) { DebugUtil.LogError("关卡id为{0}的关卡id没到6位", Cfg.Id); return 0; } string resultStr = Cfg.Id.ToString().Substring(3, 3); levelIndex = int.Parse(resultStr); } return levelIndex; } } /// /// 索引名 /// public string IndexName { get { return $"{ChapterIndex}-{LevelIndex}"; } } #endregion #region Data /// /// 所属关卡组信息 /// public LevelGroupInfo GroupInfo { get { if (LevelManager.Instance.TryGetLevelGroupInfoByID(Cfg.LevelGroupID, out LevelGroupInfo levelGroupInfo)) return levelGroupInfo; return null; } } /// /// 所属章节信息 /// public ChapterInfo ChapterInfo { get { return GroupInfo?.ChapterInfo; } } /// /// 环境类型 /// 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 服务器数据 /// /// 完成的星级或分数 /// public int Score { get { if (null == serverData) return 0; return ChapterInfo.Cfg.Type switch { E_ChapterType.War => serverData.Score, _ => serverData.StarCount, }; } } /// /// 最大星级或者分数 /// public int ScoreMax { get { switch (ChapterInfo.Cfg.Type) { case E_ChapterType.War: { int total = 0; if (null == levelData) return total; foreach (ConditionModifier conditionModifier in levelData.scoreTarget) { total += conditionModifier.score; } return total; } default: return (int)NLDPB.GlobalDefine.MaxLevelStar; } } } /// /// 关卡评级 /// public E_WarRating WarRating { get { return LevelUtils.GetWarLevelRatingByLevelInfo(this); } } /// /// 星级达成结果 /// public bool[] StarResult { get { if (null == serverData) return new bool[(int)NLDPB.GlobalDefine.MaxLevelStar]; 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); } #region API /// /// 获取解锁条件文本 /// /// public string GetUnlockLocalizationText() { if (Cfg.Unlock.Length > 0) return ConditionManager.Instance.GetConditionLocalization(Cfg.Unlock[0]); else return null; } /// /// 获得星级目标的文本 /// /// /// public string GetStarTargetLocalizationText(int targetIndex) { List starTarget = LevelData.starTarget; if (targetIndex < 0 || targetIndex >= starTarget.Count) return null; return starTarget[targetIndex].GetConditionLocalization(); } /// /// 刷新服务器数据 /// /// public void RefreshServerData(bool isReset) { serverData = Actor.Instance.Level.GetLevelInfo((uint)Cfg.Id); if (isReset) { IsLock = true; AddLockConditionReaction(); } } #endregion #region 私有方法 /// /// 体力是否足够 /// /// private bool IsConstEnough() { if (null == Cfg.CostItems || Cfg.CostItems.Count <= 0) return true; bool result = true; foreach (cfg.item.ItemCounts costItem in Cfg.CostItems) { int currCount = (int)Actor.Instance.Item.GetItemCount(costItem.Id); result &= currCount >= costItem.Count; if (!result) { Debug.LogError($"关卡消耗品不足,level id:{Cfg.Id}"); break; } } return result; } /// /// 构造红点树 /// /// public void ConstructRedPointTree(RedPointNode parent) { RedPoint = RedPointManager.Instance.AddDynamicNode(NodeType.Level, parent, Cfg.Id); } /// /// 添加注册解锁条件 /// 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($"关卡未解锁,id:{Cfg.Id}"); EventManager.Instance.Send(EventManager.EventName.LevelUnlock, Cfg.Id); ConditionReactor.Instance.RemoveReaction(reactionID); } } public void ConstructRedPointTree(int parentID) { throw new NotImplementedException(); } #endregion } /// /// 战役评级 /// public enum E_WarRating { C = 0, B = 1, A = 2, S = 3 }