/* * @Author: 白哉 * @Description: * @Date: 2025年09月05日 星期五 15:09:09 * @Modify: */ using System; using System.Collections.Generic; using Logic.CrashSight; using MemoryPack; using RuntimeData; namespace TH1_Logic.MatchConfig { public enum PlayerSettlementType { None = 0, AllSuccessOrFailure = 1, OneSuccessOrFailure = 2, } [MemoryPackable] public partial class PlayerSettlementGroup { public bool IsWin; public bool IsSettlement; public List Settlements; [MemoryPackConstructor] public PlayerSettlementGroup() { Settlements = new List(); } public void Init(List settlements) { Settlements ??= new List(); Settlements.Clear(); foreach (var settlement in settlements) { var newSettlement = new PlayerSettlementInfo(settlement); newSettlement.Init(settlement); Settlements.Add(newSettlement); } } public PlayerSettlementGroup(PlayerSettlementGroup copyData) { IsSettlement = copyData.IsSettlement; IsWin = copyData.IsWin; Settlements = new List(); for (int i = 0; i < copyData.Settlements.Count; i++) { Settlements.Add(new PlayerSettlementInfo(copyData.Settlements[i])); } } public void DeepCopy(PlayerSettlementGroup copyData) { IsSettlement = copyData.IsSettlement; IsWin = copyData.IsWin; Settlements ??= new List(); Settlements.Clear(); for (int i = 0; i < copyData.Settlements.Count; i++) { Settlements.Add(new PlayerSettlementInfo(copyData.Settlements[i])); } } public static void RefreshPlayerSettlementGroup(MapData map, PlayerData player, PlayerSettlementGroup info) { if (info.IsSettlement) return; foreach (var settlement in info.Settlements) { PlayerSettlementLogicFactory.RefreshPlayerSettlementInfo(map, player, settlement); if (!settlement.IsSettlement) continue; info.IsSettlement = true; info.IsWin = settlement.IsWin; return; } } } [MemoryPackable] public partial class PlayerSettlementInfo { public PlayerSettlementType SettlementType; public bool IsSettlement; public bool IsWin; public List Tasks; [MemoryPackConstructor] public PlayerSettlementInfo() { Tasks = new List(); IsSettlement = false; IsWin = false; } public void Init(PlayerSettlementInfo settlement) { SettlementType = settlement.SettlementType; IsSettlement = false; IsWin = false; Tasks ??= new List(); Tasks.Clear(); foreach (var task in settlement.Tasks) { var newTask = new PlayerTaskInfo(); newTask.Init(task); Tasks.Add(newTask); } } public PlayerSettlementInfo(PlayerSettlementInfo copyData) { SettlementType = copyData.SettlementType; IsSettlement = copyData.IsSettlement; IsWin = copyData.IsWin; Tasks = new List(copyData.Tasks); for (int i = 0; i < copyData.Tasks.Count; i++) { Tasks.Add(new PlayerTaskInfo(copyData.Tasks[i])); } } public void DeepCopy(PlayerSettlementInfo copyData) { SettlementType = copyData.SettlementType; IsSettlement = copyData.IsSettlement; IsWin = copyData.IsWin; for (int i = 0; i < copyData.Tasks.Count; i++) { var copyTask = copyData.Tasks[i]; if (i >= Tasks.Count) { var task = new PlayerTaskInfo(copyTask); Tasks.Add(task); } else Tasks[i].DeepCopy(copyTask); } for (int i = Tasks.Count - 1; i >= copyData.Tasks.Count; i--) { Tasks.RemoveAt(i); } } } public class PlayerSettlementLogicFactory { private static Dictionary _logicDict = new Dictionary() { { PlayerSettlementType.AllSuccessOrFailure, new AllSuccessOrFailureSettlement() }, { PlayerSettlementType.OneSuccessOrFailure, new OneSuccessOrFailureSettlement() }, }; public static void RefreshPlayerSettlementInfo(MapData map, PlayerData player, PlayerSettlementInfo info) { if (!_logicDict.TryGetValue(info.SettlementType, out var logic)) { LogSystem.LogError($"RefreshPlayerSettlementInfo Error TaskType:{info.SettlementType} No Logic"); return; } foreach (var task in info.Tasks) { PlayerTaskLogicFactory.RefreshPlayerTaskInfo(map, player, task); } logic.Refresh(map, player, info); } } public abstract class IPlayerSettlement { public abstract PlayerSettlementType GetSettlementType(); public abstract void Refresh(MapData map, PlayerData player, PlayerSettlementInfo info); } public class AllSuccessOrFailureSettlement : IPlayerSettlement { public override PlayerSettlementType GetSettlementType() { return PlayerSettlementType.AllSuccessOrFailure; } public override void Refresh(MapData map, PlayerData player, PlayerSettlementInfo info) { if (info.IsSettlement) return; foreach (var task in info.Tasks) PlayerTaskLogicFactory.RefreshPlayerTaskInfo(map, player, task); bool allSettlement = true; bool oneFailure = false; foreach (var task in info.Tasks) { if (!task.IsSettlement) allSettlement = false; if (task.IsSettlement && !task.IsSuccess) oneFailure = true; } info.IsSettlement = oneFailure || allSettlement; info.IsWin = !oneFailure; } } public class OneSuccessOrFailureSettlement : IPlayerSettlement { public override PlayerSettlementType GetSettlementType() { return PlayerSettlementType.OneSuccessOrFailure; } public override void Refresh(MapData map, PlayerData player, PlayerSettlementInfo info) { if (info.IsSettlement) return; foreach (var task in info.Tasks) PlayerTaskLogicFactory.RefreshPlayerTaskInfo(map, player, task); bool allSettlement = true; bool oneSuccess = false; foreach (var task in info.Tasks) { if (!task.IsSettlement) allSettlement = false; if (task.IsSettlement && task.IsSuccess) oneSuccess = true; } info.IsSettlement = oneSuccess || allSettlement; info.IsWin = oneSuccess; } } }