geometry-tower-defense-base/src-ref/Procedure/ProcedureMain/ProcedureMainParticipantTow...

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;
}
}
}