NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Level/LevelData.cs

212 lines
6.2 KiB
C#

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<ConditionModifier> 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);
}
}
}
public enum WeatherType
{
[LabelText("晴天")]
Sunny,
[LabelText("沙尘暴")]
SandStorm,
[LabelText("雨天")]
Rain,
[LabelText("雪天")]
Snow,
[LabelText("雾天")]
Fog,
}
public enum DayNightType
{
[LabelText("白天")]
Day,
[LabelText("晚上")]
Night,
}
[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;
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<PatrolInfo> patrolInfos = new List<PatrolInfo>(4);
[LabelText("编组")] public List<int> groups = new List<int>(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 WeatherType weatherType = WeatherType.Sunny;
[LabelText("昼夜")]
public DayNightType dayNightType = DayNightType.Day;
[LabelText("阶段")]
public List<Stage> stages = new List<Stage>(8);
[LabelText("星级目标")]
[ListDrawerSettings(HideAddButton = true,HideRemoveButton = true)]
public List<ConditionModifier> starTarget = new()
{
new ConditionModifier(ConditionUtil.LevelStarConditionFilter),
new ConditionModifier(ConditionUtil.LevelStarConditionFilter),
new ConditionModifier(ConditionUtil.LevelStarConditionFilter)
};
[HideInInspector]
public List<NPCInfo> npcInfos = new List<NPCInfo>(16);
[HideInInspector]
public List<ProtectUnit> protectUnitInfos = new List<ProtectUnit>(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);
}
}
}
}