qstbak/Questionable/Questionable.Validation.Validators/UniqueStartStopValidator.cs
2025-10-10 10:13:06 +10:00

88 lines
2.8 KiB
C#

using System.Collections.Generic;
using System.Linq;
using Questionable.Model;
using Questionable.Model.Questing;
namespace Questionable.Validation.Validators;
internal sealed class UniqueStartStopValidator : IQuestValidator
{
public IEnumerable<ValidationIssue> Validate(Quest quest)
{
bool flag = !(quest.Id is QuestId);
if (!flag)
{
ElementId id = quest.Id;
bool flag2 = ((id is SatisfactionSupplyNpcId || id is AlliedSocietyDailyId) ? true : false);
flag = flag2;
}
bool skipMissingStartStop = flag;
List<(QuestSequence Sequence, int StepId, QuestStep Step)> questAccepts = (from x in FindQuestStepsWithInteractionType(quest, new List<EInteractionType> { EInteractionType.AcceptQuest })
where x.Step.PickUpQuestId == null
select x).ToList();
foreach (var item in questAccepts)
{
if (item.Sequence.Sequence != 0 || item.StepId != quest.FindSequence(0).Steps.Count - 1)
{
yield return new ValidationIssue
{
ElementId = quest.Id,
Sequence = item.Sequence.Sequence,
Step = item.StepId,
Type = EIssueType.UnexpectedAcceptQuestStep,
Severity = EIssueSeverity.Error,
Description = "Unexpected AcceptQuest step"
};
}
}
if (!skipMissingStartStop && quest.FindSequence(0) != null && questAccepts.Count == 0)
{
yield return new ValidationIssue
{
ElementId = quest.Id,
Sequence = 0,
Step = null,
Type = EIssueType.MissingQuestAccept,
Severity = EIssueSeverity.Error,
Description = "No AcceptQuest step"
};
}
List<(QuestSequence Sequence, int StepId, QuestStep Step)> questCompletes = (from x in FindQuestStepsWithInteractionType(quest, new List<EInteractionType> { EInteractionType.CompleteQuest })
where x.Step.TurnInQuestId == null
select x).ToList();
foreach (var item2 in questCompletes)
{
if (item2.Sequence.Sequence != byte.MaxValue || item2.StepId != quest.FindSequence(byte.MaxValue).Steps.Count - 1)
{
yield return new ValidationIssue
{
ElementId = quest.Id,
Sequence = item2.Sequence.Sequence,
Step = item2.StepId,
Type = EIssueType.UnexpectedCompleteQuestStep,
Severity = EIssueSeverity.Error,
Description = "Unexpected CompleteQuest step"
};
}
}
if (!skipMissingStartStop && quest.FindSequence(byte.MaxValue) != null && questCompletes.Count == 0)
{
yield return new ValidationIssue
{
ElementId = quest.Id,
Sequence = (byte)byte.MaxValue,
Step = null,
Type = EIssueType.MissingQuestComplete,
Severity = EIssueSeverity.Error,
Description = "No CompleteQuest step"
};
}
}
private static IEnumerable<(QuestSequence Sequence, int StepId, QuestStep Step)> FindQuestStepsWithInteractionType(Quest quest, List<EInteractionType> interactionType)
{
return from x in quest.AllSteps()
where interactionType.Contains(x.Step.InteractionType)
select x;
}
}