107 lines
4.1 KiB
C#
107 lines
4.1 KiB
C#
using System.Collections.Generic;
|
|
using GeometryTD.CustomUtility;
|
|
using GeometryTD.Definition;
|
|
using GeometryTD.UI;
|
|
|
|
namespace GeometryTD.Procedure
|
|
{
|
|
public sealed class ProcedureMainParticipantTowerCleanupResult
|
|
{
|
|
public List<CombatParticipantTowerValidationResult> RemovedResults { get; } = new();
|
|
|
|
public bool HasAnyRemovedTower => RemovedResults.Count > 0;
|
|
}
|
|
|
|
public static class ProcedureMainParticipantTowerCleanupService
|
|
{
|
|
public static ProcedureMainParticipantTowerCleanupResult RemoveBrokenParticipantTowers(
|
|
BackpackInventoryData inventory,
|
|
int maxParticipantCount)
|
|
{
|
|
ProcedureMainParticipantTowerCleanupResult result = new ProcedureMainParticipantTowerCleanupResult();
|
|
if (inventory == null)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
CombatParticipantTowerValidationSummary summary =
|
|
CombatParticipantTowerValidationService.ValidateParticipantTowers(inventory);
|
|
if (summary.InvalidResults == null || summary.InvalidResults.Count <= 0)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
HashSet<long> removedTowerIds = new HashSet<long>();
|
|
for (int i = 0; i < summary.InvalidResults.Count; i++)
|
|
{
|
|
CombatParticipantTowerValidationResult invalidResult = summary.InvalidResults[i];
|
|
if (invalidResult == null ||
|
|
invalidResult.TowerInstanceId <= 0 ||
|
|
!IsBrokenFailureReason(invalidResult.FailureReason) ||
|
|
!removedTowerIds.Add(invalidResult.TowerInstanceId))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if (InventoryParticipantUtility.TryRemoveParticipantTower(
|
|
inventory,
|
|
invalidResult.TowerInstanceId,
|
|
maxParticipantCount))
|
|
{
|
|
result.RemovedResults.Add(invalidResult);
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
public static DialogFormRawData BuildRemovedTowerDialogRawData(
|
|
ProcedureMainParticipantTowerCleanupResult cleanupResult)
|
|
{
|
|
return new DialogFormRawData
|
|
{
|
|
Mode = 1,
|
|
Title = "出战塔已损坏",
|
|
Message = BuildRemovedTowerDialogMessage(cleanupResult),
|
|
PauseGame = false,
|
|
ConfirmText = "知道了"
|
|
};
|
|
}
|
|
|
|
private static string BuildRemovedTowerDialogMessage(
|
|
ProcedureMainParticipantTowerCleanupResult cleanupResult)
|
|
{
|
|
if (cleanupResult == null || !cleanupResult.HasAnyRemovedTower)
|
|
{
|
|
return "当前没有需要移出参战区的损坏防御塔。";
|
|
}
|
|
|
|
System.Text.StringBuilder builder = new System.Text.StringBuilder();
|
|
builder.Append("以下防御塔已损坏,已自动移出参战区:");
|
|
for (int i = 0; i < cleanupResult.RemovedResults.Count; i++)
|
|
{
|
|
CombatParticipantTowerValidationResult removedResult = cleanupResult.RemovedResults[i];
|
|
if (removedResult == null)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
builder.Append('\n');
|
|
builder.Append("塔 #");
|
|
builder.Append(removedResult.TowerInstanceId);
|
|
builder.Append(' ');
|
|
builder.Append(CombatParticipantTowerValidationText.GetFailureReasonMessage(removedResult.FailureReason));
|
|
}
|
|
|
|
return builder.ToString();
|
|
}
|
|
|
|
private static bool IsBrokenFailureReason(CombatParticipantTowerValidationFailureReason failureReason)
|
|
{
|
|
return failureReason == CombatParticipantTowerValidationFailureReason.BrokenMuzzleComponent ||
|
|
failureReason == CombatParticipantTowerValidationFailureReason.BrokenBearingComponent ||
|
|
failureReason == CombatParticipantTowerValidationFailureReason.BrokenBaseComponent;
|
|
}
|
|
}
|
|
}
|