using System.Text; using GeometryTD.Definition; using GeometryTD.UI; namespace GeometryTD.Procedure { public static class ProcedureMainCombatEntryValidationService { public static ProcedureMainCombatEntryValidationResult Validate(BackpackInventoryData inventory) { if (inventory == null) { return new ProcedureMainCombatEntryValidationResult { BlockReason = ProcedureMainCombatEntryBlockReason.InventoryUnavailable, ValidationSummary = new CombatParticipantTowerValidationSummary() }; } CombatParticipantTowerValidationSummary summary = CombatParticipantTowerValidationService.ValidateParticipantTowers(inventory); return new ProcedureMainCombatEntryValidationResult { BlockReason = summary.HasAnyValidParticipantTower ? ProcedureMainCombatEntryBlockReason.None : ProcedureMainCombatEntryBlockReason.NoValidParticipantTower, ValidationSummary = summary }; } public static string BuildInvalidParticipantTowerLog( CombatParticipantTowerValidationSummary summary) { if (summary?.InvalidResults == null || summary.InvalidResults.Count <= 0) { return "none"; } StringBuilder builder = new StringBuilder(); for (int i = 0; i < summary.InvalidResults.Count; i++) { CombatParticipantTowerValidationResult result = summary.InvalidResults[i]; if (result == null) { continue; } if (builder.Length > 0) { builder.Append(", "); } builder.Append('#'); builder.Append(result.TowerInstanceId); builder.Append(':'); builder.Append(result.FailureReason); } return builder.Length > 0 ? builder.ToString() : "none"; } public static DialogFormRawData BuildBlockedCombatDialogRawData( ProcedureMainCombatEntryValidationResult validationResult) { return new DialogFormRawData { Mode = 1, Title = "无法进入战斗", Message = BuildBlockedCombatDialogMessage(validationResult), PauseGame = false, ConfirmText = "知道了" }; } private static string BuildBlockedCombatDialogMessage( ProcedureMainCombatEntryValidationResult validationResult) { if (validationResult == null) { return "当前无法确认出战信息,请稍后重试。"; } switch (validationResult.BlockReason) { case ProcedureMainCombatEntryBlockReason.InventoryUnavailable: return "当前无法读取库存快照,暂时不能进入战斗。请重新进入本轮流程后再试。"; case ProcedureMainCombatEntryBlockReason.NoValidParticipantTower: return BuildNoValidParticipantTowerMessage(validationResult.ValidationSummary); default: return "当前出战校验未通过,暂时不能进入战斗。"; } } private static string BuildNoValidParticipantTowerMessage( CombatParticipantTowerValidationSummary summary) { if (summary?.InvalidResults == null || summary.InvalidResults.Count <= 0) { return "参战区至少需要 1 座完整装配了枪口、轴承、底座的塔,才能进入战斗。"; } StringBuilder builder = new StringBuilder(); builder.Append("参战区没有可出战的完整塔。"); for (int i = 0; i < summary.InvalidResults.Count; i++) { CombatParticipantTowerValidationResult result = summary.InvalidResults[i]; if (result == null) { continue; } builder.Append('\n'); builder.Append("塔 #"); builder.Append(result.TowerInstanceId); builder.Append(' '); builder.Append(CombatParticipantTowerValidationText.GetFailureReasonMessage(result.FailureReason)); } return builder.ToString(); } } }