qstbak/Questionable/Questionable.Validation.Validators/BasicSequenceValidator.cs
2025-10-09 07:47:19 +10:00

101 lines
2.6 KiB
C#

using System.Collections.Generic;
using System.Linq;
using Questionable.Model;
using Questionable.Model.Questing;
namespace Questionable.Validation.Validators;
internal sealed class BasicSequenceValidator : IQuestValidator
{
public IEnumerable<ValidationIssue> Validate(Quest quest)
{
List<QuestSequence> sequences = quest.Root.QuestSequence;
QuestSequence foundStart = sequences.FirstOrDefault((QuestSequence x) => x.Sequence == 0);
if (foundStart == null)
{
yield return new ValidationIssue
{
ElementId = quest.Id,
Sequence = 0,
Step = null,
Type = EIssueType.MissingSequence0,
Severity = EIssueSeverity.Error,
Description = "Missing quest start"
};
}
else if (quest.Info is QuestInfo { CompletesInstantly: not false })
{
foreach (QuestSequence item in sequences)
{
if (item != foundStart)
{
yield return new ValidationIssue
{
ElementId = quest.Id,
Sequence = item.Sequence,
Step = null,
Type = EIssueType.InstantQuestWithMultipleSteps,
Severity = EIssueSeverity.Error,
Description = "Instant quest should not have any sequences after the start"
};
}
}
}
else
{
if (!(quest.Info is QuestInfo))
{
yield break;
}
int maxSequence = (from x in sequences
select x.Sequence into x
where x != byte.MaxValue
select x).Max();
int i;
for (i = 0; i < maxSequence; i++)
{
List<QuestSequence> foundSequences = sequences.Where((QuestSequence x) => x.Sequence == i).ToList();
ValidationIssue validationIssue = ValidateSequences(quest, i, foundSequences);
if (validationIssue != null)
{
yield return validationIssue;
}
}
List<QuestSequence> foundSequences2 = sequences.Where((QuestSequence x) => x.Sequence == byte.MaxValue).ToList();
ValidationIssue validationIssue2 = ValidateSequences(quest, 255, foundSequences2);
if (validationIssue2 != null)
{
yield return validationIssue2;
}
}
}
private static ValidationIssue? ValidateSequences(Quest quest, int sequenceNo, List<QuestSequence> foundSequences)
{
if (foundSequences.Count == 0)
{
return new ValidationIssue
{
ElementId = quest.Id,
Sequence = (byte)sequenceNo,
Step = null,
Type = EIssueType.MissingSequence,
Severity = EIssueSeverity.Error,
Description = "Missing sequence"
};
}
if (foundSequences.Count == 2)
{
return new ValidationIssue
{
ElementId = quest.Id,
Sequence = (byte)sequenceNo,
Step = null,
Type = EIssueType.DuplicateSequence,
Severity = EIssueSeverity.Error,
Description = "Duplicate sequence"
};
}
return null;
}
}