147 lines
5.8 KiB
C#
147 lines
5.8 KiB
C#
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(GetFailureReasonMessage(result.FailureReason));
|
||
}
|
||
|
||
return builder.ToString();
|
||
}
|
||
|
||
private static string GetFailureReasonMessage(CombatParticipantTowerValidationFailureReason failureReason)
|
||
{
|
||
switch (failureReason)
|
||
{
|
||
case CombatParticipantTowerValidationFailureReason.TowerMissing:
|
||
return "已不存在,无法参战。";
|
||
case CombatParticipantTowerValidationFailureReason.MissingMuzzleComponent:
|
||
return "缺少枪口组件。";
|
||
case CombatParticipantTowerValidationFailureReason.MissingBearingComponent:
|
||
return "缺少轴承组件。";
|
||
case CombatParticipantTowerValidationFailureReason.MissingBaseComponent:
|
||
return "缺少底座组件。";
|
||
case CombatParticipantTowerValidationFailureReason.BrokenMuzzleComponent:
|
||
return "枪口组件耐久为 0,无法参战。";
|
||
case CombatParticipantTowerValidationFailureReason.BrokenBearingComponent:
|
||
return "轴承组件耐久为 0,无法参战。";
|
||
case CombatParticipantTowerValidationFailureReason.BrokenBaseComponent:
|
||
return "底座组件耐久为 0,无法参战。";
|
||
default:
|
||
return "不满足当前参战条件。";
|
||
}
|
||
}
|
||
}
|
||
}
|