240 lines
7.6 KiB
C#
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;
|
|
}
|
|
}
|
|
} |