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

438 lines
16 KiB
C#

using System;
using UnityEngine;
using Sirenix.OdinInspector;
using System.Collections.Generic;
using System.Runtime.Serialization;
using cfg.LevelCfg;
namespace Gameplay.Level
{
[Serializable]
public class LevelData
{
[Serializable]
public class NPCInfo
{
[HideInInspector] public int index; // LocalID
[HideInInspector] public int id; // 怪物ID
[ReadOnly] [LabelText("位置")] public Vector2Int position;
[LabelText("初始护盾")] public float shield;
[LabelText("初始血量")] public float ph;
[LabelText("初始士气")] public float morale;
[LabelText("Buff")] public List<int> buff = new List<int>();
[LabelText("DeBuff")] public List<int> deBuff = new List<int>();
[HideInInspector] public CharacterToward npcToward;
[LabelText("编组")] public List<int> groups = new List<int>(4);
[LabelText("防守距离")] public int defensiveDistance;
[HideInInspector] public string configName;
[HideInInspector] public int aiTypeID;
[LabelText("是否为中途生成AI")] public bool isHideOnLoad;
[LabelText("所属波数")] public int waveIndex;
[LabelText("刷新时间(s)")] public int refreshTime;
[LabelText("指定路线ID")] public int specifyRoadID = -1;
[LabelText("显示路径")] public bool showRoadLine;
[LabelText("指定区域ID")] public int specifyRegionID = -1;
[LabelText("预设路径id")] public int presetPathId = -1;
[LabelText("阵营ID")] public int troopId;
[LabelText("是否开启侦察")] public bool isOpenInvestigate = true;
}
[Serializable]
public class BuildInfo
{
[HideInInspector] public int index; // LocalID
[HideInInspector] public int id; // 建筑ID
[ReadOnly][LabelText("位置")] public Vector2Int position;
[LabelText("初始护盾")] public float shield;
[LabelText("初始血量")] public float ph;
[LabelText("初始士气")] public float morale;
[LabelText("Buff")] public List<int> buff = new List<int>();
[LabelText("DeBuff")] public List<int> deBuff = new List<int>();
[HideInInspector] public CharacterToward buildToward;
[LabelText("编组")] public List<int> groups = new List<int>(4);
[HideInInspector] public string configName;
[HideInInspector] public int aiTypeID;
}
[Serializable]
public class PatrolInfo
{
[HorizontalGroup("PatrolInfo")]
[LabelText("巡逻点位")]
public int cellIndex;
[HideInInspector]
public Vector2Int patrolPoint;
[HorizontalGroup("PatrolInfo")] [LabelText("等待时间")]
public float waitTime = 0f;
}
[Serializable]
public class PatrolData
{
[HorizontalGroup("PatrolData")] [ReadOnly]
public int id;
[HorizontalGroup("PatrolData")] [LabelText("巡逻点位数据")]
public List<PatrolInfo> patrolInfos = new();
}
/// <summary>
/// 巡逻路径
/// </summary>
public List<PatrolData> patrolRoadData = new();
/// <summary>
/// 巡逻区域
/// </summary>
public List<PatrolData> patrolRegionData = new();
[Serializable]
public class SpawnMonsterData
{
[LabelText("波次ID")] public int waveIndex;
[LabelText("刷新方式")] public ELevelUnitGenType refreshType = ELevelUnitGenType.Default;
[LabelText("间隔时间")] [ShowIf("@refreshType==ELevelUnitGenType.TimeLoop")]
public int refreshInterval;
[LabelText("最大次数 (-1无限循环), 如果为跳转则表示跳转ID")]
public int maxCount;
}
[Serializable]
public class LevelTriggerData
{
[LabelText("触发类型")] public ELevelTriggerType levelTriggerType = ELevelTriggerType.Default;
[LabelText("参数 (时间/区域ID)")] public int triggerTime = 0;
[LabelText("刷怪波次")] public int wave;
[LabelText("任务ID")] [ShowIf("@levelTriggerType==ELevelTriggerType.TaskComplete")]
public int taskID;
[LabelText("触发Effect类型")] public ELevelTriggerEffectType effectType = ELevelTriggerEffectType.StartGenUnit;
[LabelText("怪物波次IDs")] [ShowIf("@effectType==ELevelTriggerEffectType.ForceKillUnits")]
public List<int> waveList = new List<int>();
}
#region LevelGuide
/// <summary>
/// 波次横幅显示
/// </summary>
[Serializable]
public class WaveInfoData
{
[ReadOnly] [LabelText("ID")] public int localID;
[LabelText("触发波次ID")] public int waveID = -1;
[LabelText("第几次循环")] public int loopCount = 1;
[LabelText("是否显示横幅")] public bool showWaveInfo;
}
/// <summary>
/// 关卡进度引导
/// </summary>
[Serializable]
public class ProgressGuideData
{
[LabelText("关卡进度参数:类型")] public ELevelGuideProgressType progressType;
[LabelText("触发条件")] public ConditionModifier triggerCondition;
[LabelText("完成条件")] public ConditionModifier finishCondition;
public ProgressGuideData(ProgressGuideData data)
{
progressType = data.progressType;
triggerCondition = data.triggerCondition;
finishCondition = data.finishCondition;
}
public ProgressGuideData()
{
progressType = ELevelGuideProgressType.SuccessProgress;
triggerCondition = new ConditionModifier(ConditionUtil.LevelGuideConditionFilter);
finishCondition = new ConditionModifier(ConditionUtil.LevelGuideEndConditionFilter);
}
[OnDeserialized]
public void OnAfterDeserialize(StreamingContext context)
{
triggerCondition.SetFilterTypes(ConditionUtil.LevelGuideConditionFilter);
finishCondition.SetFilterTypes(ConditionUtil.LevelGuideEndConditionFilter);
}
}
/// <summary>
/// 关卡立标引导
/// </summary>
[Serializable]
public class SetFlagGuideData
{
[LabelText("立标类型")] public ELevelGuideSetFlagType setFlagType;
[LabelText("选择单位类型")] [ShowIf("@setFlagType==ELevelGuideSetFlagType.Unit")]
public ESetFlagUnitType unitType;
[LabelText("对应ID")] public int setFlagID;
[HorizontalGroup("1")] [LabelText("立标提示内容")]
public string setFlagKey;
[HorizontalGroup("1")] [LabelText("备注")]
public string note; // 策划使用备注
[HideInInspector] [LabelText("立标配置ID")]
public int guideTagID; // 编辑器使用
[HideInInspector] [LabelText("立标路径")] public string guideTagPath;
[LabelText("触发条件")] public ConditionModifier triggerCondition;
[LabelText("完成条件")] public ConditionModifier finishCondition;
public SetFlagGuideData(SetFlagGuideData data)
{
setFlagType = data.setFlagType;
unitType = data.unitType;
setFlagID = data.setFlagID;
setFlagKey = data.setFlagKey;
guideTagID = data.guideTagID;
guideTagPath = data.guideTagPath;
triggerCondition = data.triggerCondition;
finishCondition = data.finishCondition;
}
public SetFlagGuideData()
{
setFlagType = ELevelGuideSetFlagType.CellIndex;
unitType = ESetFlagUnitType.Self;
setFlagID = -1;
triggerCondition = new ConditionModifier(ConditionUtil.LevelGuideConditionFilter);
finishCondition = new ConditionModifier(ConditionUtil.LevelGuideEndConditionFilter);
}
[OnDeserialized]
public void OnAfterDeserialize(StreamingContext context)
{
triggerCondition.SetFilterTypes(ConditionUtil.LevelGuideConditionFilter);
finishCondition.SetFilterTypes(ConditionUtil.LevelGuideEndConditionFilter);
}
}
/// <summary>
/// 关卡信息面板引导
/// </summary>
[Serializable]
public class InfoPanelGuideData
{
[HorizontalGroup("1")] [LabelText("标题ID")]
public string titleKey;
[HorizontalGroup("1")] [LabelText("备注")]
public string noteTitle; // 策划使用备注
[HorizontalGroup("2")] [LabelText("内容ID")]
public string contentKey;
[HorizontalGroup("2")] [LabelText("备注")]
public string noteContent; // 策划使用备注
[LabelText("触发条件")] public ConditionModifier triggerCondition;
[LabelText("完成条件")] public ConditionModifier finishCondition;
public InfoPanelGuideData(InfoPanelGuideData data)
{
titleKey = data.titleKey;
contentKey = data.contentKey;
triggerCondition = data.triggerCondition;
finishCondition = data.finishCondition;
}
public InfoPanelGuideData()
{
triggerCondition = new ConditionModifier(ConditionUtil.LevelGuideConditionFilter);
finishCondition = new ConditionModifier(ConditionUtil.LevelGuideEndConditionFilter);
}
[OnDeserialized]
public void OnAfterDeserialize(StreamingContext context)
{
triggerCondition.SetFilterTypes(ConditionUtil.LevelGuideConditionFilter);
finishCondition.SetFilterTypes(ConditionUtil.LevelGuideEndConditionFilter);
}
}
#endregion
public enum CharacterToward
{
TopLeft,
TopRight,
Right,
BottomRight,
BottomLeft,
Left,
}
// TODO 删除 PVP行为树还在使用
public enum AIType
{
BasicAI,
FallBackAI,
FallBackIntensifyAI,
OutflankAI,
DefendAI,
StupidDefendAI,
None,
}
// TODO 删除 PVP行为树还在使用
public enum AttachAIType
{
None,
ChainAI,
ProvokeAI,
SpecialBehaviorAI,
AttackProtectUnitAI,
}
public LevelData()
{
}
[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;
[BoxGroup("支线")] [LabelText("设置该关卡为评分关卡")]
public bool scoreLevel = false;
[BoxGroup("支线")]
[LabelText("星级目标"), HideIf("scoreLevel")]
[ListDrawerSettings(HideAddButton = true, HideRemoveButton = true)]
public List<ConditionModifier> starTarget = new()
{
new ConditionModifier(ConditionUtil.LevelStarConditionFilter),
new ConditionModifier(ConditionUtil.LevelStarConditionFilter),
new ConditionModifier(ConditionUtil.LevelStarConditionFilter)
};
[BoxGroup("支线")]
[LabelText("评分目标"), ShowIf("scoreLevel")]
[ListDrawerSettings(CustomAddFunction = "OnAddScoreCondition")]
public List<ConditionModifier> scoreTarget = new List<ConditionModifier>(15);
private void OnAddScoreCondition()
{
ConditionModifier conditionModifier = new();
conditionModifier.SetFilterTypes(ConditionUtil.LevelScoreConditionFilter, true);
scoreTarget.Add(conditionModifier);
}
[BoxGroup("防守相关设置")] [LabelText("防守关卡数据")]
public List<SpawnMonsterData> spawnMonsterDatas;
[BoxGroup("防守相关设置")] [LabelText("波次横幅显示数据")] [ListDrawerSettings(CustomAddFunction = "OnAddWaveInfoData")]
public List<WaveInfoData> waveInfoDatas = new();
private void OnAddWaveInfoData()
{
var waveInfoData = new WaveInfoData
{
localID = waveInfoDatas.Count + 1
};
waveInfoDatas.Add(waveInfoData);
}
[BoxGroup("触发器")] [LabelText("关卡触发器")] public List<LevelTriggerData> levelTriggerDatas;
[BoxGroup("特殊需求")] [LabelText("初始生命百分值")]
public float initialHealthPercent = 1.0f;
[BoxGroup("特殊需求")] [LabelText("初始护盾百分值")]
public float initialShieldPercent = 1.0f;
#region 关卡引导
[HideInInspector] [LabelText("关卡进度")] public List<ProgressGuideData> progressGuideDatas = new();
[HideInInspector] [LabelText("立标数据")] public List<SetFlagGuideData> setFlagGuideDatas = new();
[HideInInspector] [LabelText("信息板数据")] public List<InfoPanelGuideData> infoPanelGuideDatas = new();
#endregion
/// <summary>
/// 刷新生成点位
/// </summary>
[HideInInspector] public List<int> refreshPoints = new List<int>();
[HideInInspector] public List<NPCInfo> npcInfos = new();
[HideInInspector] public List<NPCInfo> midNpcInfos = new();
[HideInInspector] public List<NPCInfo> selfNpcInfos = new();
[HideInInspector] public Dictionary<int, List<int>> npcGroupInfos = new();
[Serializable]
public class CaptureInfo
{
[LabelText("占领点位")] public int CapturePoint;
[LabelText("占领时间")] public int CaptureProgress = 0;
}
[HideInInspector] public List<CaptureInfo> CapturePoints = new(8);
[HideInInspector] public List<int> flagStartPoints = new List<int>();
[HideInInspector] public List<int> flagEndPoints = new List<int>();
[HideInInspector] public List<int> fallbackSinglePoints = new List<int>();
[HideInInspector] public List<int> fallbackReusablePoints = new List<int>();
[HideInInspector] public int fallBackCount;
[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);
}
}
}
}