46 lines
1.5 KiB
C#
46 lines
1.5 KiB
C#
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Numerics;
|
|
using Questionable.Controller.Utils;
|
|
using Questionable.Model;
|
|
using Questionable.Model.Questing;
|
|
|
|
namespace Questionable.Validation.Validators;
|
|
|
|
internal sealed class CompletionFlagsValidator : IQuestValidator
|
|
{
|
|
public IEnumerable<ValidationIssue> Validate(Quest quest)
|
|
{
|
|
if (quest.Id.Value == 5149)
|
|
{
|
|
yield break;
|
|
}
|
|
foreach (QuestSequence sequence in quest.AllSequences())
|
|
{
|
|
List<long> mappedCompletionFlags = sequence.Steps.Select((QuestStep x) => QuestWorkUtils.HasCompletionFlags(x.CompletionQuestVariablesFlags) ? Enumerable.Range(0, 6).Select(delegate(int y)
|
|
{
|
|
QuestWorkValue questWorkValue = x.CompletionQuestVariablesFlags[y];
|
|
return (long)((questWorkValue == null) ? 0 : BitOperations.RotateLeft((ulong)(questWorkValue.High.GetValueOrDefault() * 16 + questWorkValue.Low.GetValueOrDefault()), 8 * y));
|
|
}).Sum() : 0).ToList();
|
|
int i = 0;
|
|
while (i < sequence.Steps.Count)
|
|
{
|
|
long flags = mappedCompletionFlags[i];
|
|
if (flags != 0L && mappedCompletionFlags.Count((long x) => x == flags) >= 2)
|
|
{
|
|
yield return new ValidationIssue
|
|
{
|
|
ElementId = quest.Id,
|
|
Sequence = sequence.Sequence,
|
|
Step = i,
|
|
Type = EIssueType.DuplicateCompletionFlags,
|
|
Severity = EIssueSeverity.Error,
|
|
Description = "Duplicate completion flags: " + string.Join(", ", sequence.Steps[i].CompletionQuestVariablesFlags)
|
|
};
|
|
}
|
|
int num = i + 1;
|
|
i = num;
|
|
}
|
|
}
|
|
}
|
|
}
|