using System; using System.Collections.Generic; using System.Linq; using Dalamud.Plugin.Services; using Questionable.Data; using Questionable.Model; using Questionable.Model.Questing; namespace Questionable.Validation.Validators; internal sealed class GameSequenceCoverageValidator : IQuestValidator { private readonly IDataManager _dataManager; public GameSequenceCoverageValidator(IDataManager dataManager) { _dataManager = dataManager; } public IEnumerable Validate(Quest quest) { if (!(quest.Id is QuestId questId)) { yield break; } HashSet authored = ((IEnumerable)quest.Root.QuestSequence).Select((Func)((QuestSequence x) => x.Sequence)).ToHashSet(); IEnumerable enumerable = from seq in GameQuestSequences.GetCompletionSequences(_dataManager, questId) where !authored.Contains(seq) select seq; foreach (int item in enumerable) { yield return new ValidationIssue { PathType = EPathType.Quest, Id = quest.Id.ToString(), Location = SchemaValidationHelper.FormatQuestLocation((byte)item, null), Type = EIssueType.MissingPostInstanceSequence, Severity = EIssueSeverity.Warning, Description = $"The game uses sequence {item}, but the quest path doesn't define it. Add an empty " + "placeholder sequence (or steps, if the sequence requires player action)." }; } } }