using cfg.LevelCfg; using Gameplay; using Gameplay.Level; using Gameplay.Net; using System.Collections.Generic; using UnityEngine; using static Gameplay.Level.LevelData; using static MapData; using Debug = DebugUtil; public class LevelInfo { private DataLevel _config; private LevelData _levelData; private MapData _mapData; private Gameplay.Net.LevelInfo _serverData; #region config public int ID => _config.Id; public int Index => _config.Index; public int ChapterID => _config.ChapterID; //解锁条件 public int[] UnLockCondition => _config.Unlock; //消耗 public List CostItems => _config.CostItems; public int[] NomralRewardID => _config.NormalRewardID; public int[] FirstRewardID => _config.FristRewardID; //一星奖励 public int[] StarRewardID_1 => _config.StarRewardID1; //二星奖励 public int[] StarRewardID_2 => _config.StarRewardID2; //三星奖励 public int[] StarRewardID_3 => _config.StarRewardID3; public int SettleExp => _config.SettleExp; public int SettleLikability => _config.SettleLikability; public string FileName => _config.FileName; public string Name => _config.Name; public string Desc => _config.Desc; #endregion #region Data public WeatherType WeatherType => _levelData.weatherType; public DayNightType DayNightType => _levelData.dayNightType; public EnvironmentType EnvironmentType => _mapData.environmentType; public bool Lock => IsLock(); public bool CostEnough => IsConstEnough(); public bool CanEnter => !Lock && CostEnough; #endregion #region Server Data public int StarCount => (int)(_serverData == null ? 0 : _serverData.star); public bool HasPass => _serverData == null ? false : _serverData.isPassed; #endregion public LevelInfo(DataLevel config) { _config = config; Load(); } private async void Load() { RefreshServerData(); _levelData = await LevelUtils.LoadLevelData(ID); _mapData = await MapUtils.LoadMapData(_levelData.mapName); } private bool IsLock() { if (UnLockCondition == null || UnLockCondition.Length == 0) { return false; } var allConditionPass = true; foreach (var unlockID in UnLockCondition) { var conditionResult = Actor.Instance.Unlock.IsUnlock((uint)unlockID) == (uint)NLDPB.OpResult.Ok; allConditionPass = allConditionPass && conditionResult; if (!allConditionPass) { Debug.LogError($"关卡进入条件不满足,level id:{ID}"); break; } } return !allConditionPass; } private bool IsConstEnough() { bool result = true; if (CostItems == null || CostItems.Count == 0) return result; foreach (var costItem in CostItems) { var currCount = Actor.Instance.Item.GetItemCount(costItem.Id); result = result && currCount >= costItem.Count; if (!result) { Debug.LogError($"关卡消耗品不足,level id:{ID}"); break; } } return result; } public void RefreshServerData() { _serverData = Actor.Instance.Level.GetLevelInfo((uint)ID); } }