99 lines
3.1 KiB
C#
99 lines
3.1 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Runtime.InteropServices;
|
|
using Questionable.Model;
|
|
using Questionable.Model.Questing;
|
|
|
|
namespace Questionable.Validation.Validators;
|
|
|
|
internal sealed class UniqueStartStopValidator : IQuestValidator
|
|
{
|
|
public IEnumerable<ValidationIssue> Validate(Quest quest)
|
|
{
|
|
ElementId id = quest.Id;
|
|
if ((id is SatisfactionSupplyNpcId || id is AlliedSocietyDailyId) ? true : false)
|
|
{
|
|
yield break;
|
|
}
|
|
int num = 1;
|
|
List<EInteractionType> list = new List<EInteractionType>(num);
|
|
CollectionsMarshal.SetCount(list, num);
|
|
Span<EInteractionType> span = CollectionsMarshal.AsSpan(list);
|
|
int index = 0;
|
|
span[index] = EInteractionType.AcceptQuest;
|
|
List<(QuestSequence Sequence, int StepId, QuestStep Step)> questAccepts = (from x in FindQuestStepsWithInteractionType(quest, list)
|
|
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 (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"
|
|
};
|
|
}
|
|
index = 1;
|
|
List<EInteractionType> list2 = new List<EInteractionType>(index);
|
|
CollectionsMarshal.SetCount(list2, index);
|
|
span = CollectionsMarshal.AsSpan(list2);
|
|
num = 0;
|
|
span[num] = EInteractionType.CompleteQuest;
|
|
List<(QuestSequence Sequence, int StepId, QuestStep Step)> questCompletes = (from x in FindQuestStepsWithInteractionType(quest, list2)
|
|
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 (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;
|
|
}
|
|
}
|