TH1/Unity/Assets/Scripts/TH1_Logic/MatchConfig/PlayerSettlementInfo.cs
2026-01-26 11:48:08 +08:00

240 lines
7.6 KiB
C#

/*
* @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<PlayerSettlementInfo> Settlements;
[MemoryPackConstructor]
public PlayerSettlementGroup()
{
Settlements = new List<PlayerSettlementInfo>();
}
public void Init(List<PlayerSettlementInfo> settlements)
{
Settlements ??= new List<PlayerSettlementInfo>();
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<PlayerSettlementInfo>();
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<PlayerSettlementInfo>();
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<PlayerTaskInfo> Tasks;
[MemoryPackConstructor]
public PlayerSettlementInfo()
{
Tasks = new List<PlayerTaskInfo>();
IsSettlement = false;
IsWin = false;
}
public void Init(PlayerSettlementInfo settlement)
{
SettlementType = settlement.SettlementType;
IsSettlement = false;
IsWin = false;
Tasks ??= new List<PlayerTaskInfo>();
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<PlayerTaskInfo>(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<PlayerSettlementType, IPlayerSettlement> _logicDict = new Dictionary<PlayerSettlementType, IPlayerSettlement>()
{
{ 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;
}
}
}