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 Validate(Quest quest) { if (quest.Id.Value == 5149) { yield break; } foreach (QuestSequence sequence in quest.AllSequences()) { List 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; } } } }