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 Validate(Quest quest) { List 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 foundSequences = sequences.Where((QuestSequence x) => x.Sequence == i).ToList(); ValidationIssue validationIssue = ValidateSequences(quest, i, foundSequences); if (validationIssue != null) { yield return validationIssue; } } List 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 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; } }