88 lines
2.8 KiB
C#
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;
|
|
}
|
|
}
|