forked from aly/qstbak
43 lines
1.4 KiB
C#
43 lines
1.4 KiB
C#
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<ValidationIssue> Validate(Quest quest)
|
|
{
|
|
if (!(quest.Id is QuestId questId))
|
|
{
|
|
yield break;
|
|
}
|
|
HashSet<int> authored = ((IEnumerable<QuestSequence>)quest.Root.QuestSequence).Select((Func<QuestSequence, int>)((QuestSequence x) => x.Sequence)).ToHashSet();
|
|
IEnumerable<int> 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)."
|
|
};
|
|
}
|
|
}
|
|
}
|