124 lines
4.5 KiB
C#
124 lines
4.5 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(CombatParticipantTowerValidationText.GetFailureReasonMessage(result.FailureReason));
|
|
}
|
|
|
|
return builder.ToString();
|
|
}
|
|
}
|
|
}
|