using System.Collections.Generic; using GeometryTD.CustomUtility; using GeometryTD.Definition; using GeometryTD.UI; namespace GeometryTD.Procedure { public sealed class ProcedureMainParticipantTowerCleanupResult { public List 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 removedTowerIds = new HashSet(); 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; } } }