using System; using UnityEngine; using Sirenix.OdinInspector; using UnityEngine.Serialization; using System.Collections.Generic; using System.Runtime.Serialization; namespace Gameplay.Level { [Serializable] public class LevelData { [Serializable] public class Stage { [LabelText("名称")] private string name; [LabelText("描述")] private string desc; [FormerlySerializedAs("goal")] [LabelText("胜利条件")] public ConditionModifier successCondition = new(ConditionUtil.LevelSuccessConditionFilter); [LabelText("失败条件")] [ListDrawerSettings(CustomAddFunction = "OnAddFailCondition")] public List failConditions = new(); private void OnAddFailCondition() { ConditionModifier conditionModifier = new(); conditionModifier.SetFilterTypes(ConditionUtil.LevelFailConditionFilter); failConditions.Add(conditionModifier); } [OnDeserialized] public void OnAfterDeserialize(System.Runtime.Serialization.StreamingContext context) { successCondition.SetFilterTypes(ConditionUtil.LevelSuccessConditionFilter); foreach (var failCondition in failConditions) { failCondition.SetFilterTypes(ConditionUtil.LevelFailConditionFilter); } } } [Serializable] public class ProtectUnit { [HorizontalGroup("Protect")] public int id; [HorizontalGroup("Protect")] [LabelText("护送起点")] public int protectStartPoint; [HorizontalGroup("Protect")] [LabelText("护送终点")] public int protectTargetPoint; } [Serializable] public class NPCInfo { [Sirenix.OdinInspector.ReadOnly] public int id; [Sirenix.OdinInspector.ReadOnly] public int level; [Sirenix.OdinInspector.ReadOnly] public Vector2Int position; [LabelText("AI类型")] public AIType aIType; [LabelText("特殊触发AI")] public AttachAIType attachAIType; [LabelText("朝向")] public CharacterToward npcToward; [LabelText("巡逻信息")] public List patrolInfos = new List(4); [LabelText("编组")] public List groups = new List(4); } [Serializable] public class PatrolInfo { [HorizontalGroup("PatrolInfo")] [LabelText("巡逻点位")] public Vector2Int patrolPoint; [HorizontalGroup("PatrolInfo")] [LabelText("等待时间")] public float waitTime = 0f; } public enum CharacterToward { TopLeft, TopRight, Right, BottomRight, BottomLeft, Left, } public enum AIType { BasicAI, FallBackAI, FallBackIntensifyAI, OutflankAI, } public enum AttachAIType { None, ChainAI, ProvokeAI, SpecialBehaviorAI, } public LevelData() { } [LabelText("占领进度")] [HideInInspector] public int captureProgress; [LabelText("扛旗终点区")] [HideInInspector] public int flagTargetRegionId; [LabelText("出战区")] [HideInInspector] public int preparingRegionId; [LabelText("出战区朝向")] [HideInInspector] public CharacterToward preparingRegionToward; [LabelText("撤退区")] [HideInInspector] public int fallbackRegionId; [LabelText("敌方撤退区")] [HideInInspector] public int enemyFallbackRegionId; [LabelText("PVP防守区")] [HideInInspector] public int pvpDefendRegionId; [LabelText("PVP防守方朝向")] [HideInInspector] public CharacterToward pvpDefendToward; [LabelText("阶段")] public List stages = new List(8); [LabelText("设置该关卡为评分关卡")] public bool scoreLevel = false; [LabelText("星级目标"), HideIf("scoreLevel")] [ListDrawerSettings(HideAddButton = true, HideRemoveButton = true)] public List starTarget = new() { new ConditionModifier(ConditionUtil.LevelStarConditionFilter), new ConditionModifier(ConditionUtil.LevelStarConditionFilter), new ConditionModifier(ConditionUtil.LevelStarConditionFilter) }; [LabelText("评分目标"), ShowIf("scoreLevel")] [ListDrawerSettings(CustomAddFunction = "OnAddScoreCondition")] public List scoreTarget = new List(15); private void OnAddScoreCondition() { ConditionModifier conditionModifier = new(); conditionModifier.SetFilterTypes(ConditionUtil.LevelScoreConditionFilter, true); scoreTarget.Add(conditionModifier); } [HideInInspector] public List npcInfos = new List(16); [HideInInspector] public List protectUnitInfos = new List(4); [OnDeserialized] public void OnAfterDeserialize(StreamingContext context) { if (starTarget.Count != 3) { starTarget.Clear(); starTarget.Add(new ConditionModifier()); starTarget.Add(new ConditionModifier()); starTarget.Add(new ConditionModifier()); } foreach (var starCondition in starTarget) { starCondition.SetFilterTypes(ConditionUtil.LevelStarConditionFilter); } foreach (var scoreCondition in scoreTarget) { scoreCondition.SetFilterTypes(ConditionUtil.LevelScoreConditionFilter, scoreLevel); } } } }