using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; using Questionable.Controller.Steps.Interactions; namespace Questionable.Controller.Steps; internal sealed class TaskQueue { private readonly List _completedTasks = new List(); private readonly List _tasks = new List(); private int _levelingTaskCount; public ITaskExecutor? CurrentTaskExecutor { get; set; } public IEnumerable RemainingTasks => _tasks; public bool AllTasksComplete { get { int num = ((CurrentTaskExecutor != null) ? (-477523234) : (-477523233)); while (true) { int num2 = num; int num3 = -477523234; int num4 = num2; int num5 = num4 + num3; int num6 = num4 & num3; switch (num5 - (num6 + num6)) { case 2: goto IL_0048; case 1: return _tasks.Count == 0; case 0: return false; } continue; IL_0048: num = -477523233; } } } public bool HasLevelingTasks => _levelingTaskCount > 0; public void Enqueue(ITask task) { _tasks.Add(task); int num = ((!IsLevelingTask(task)) ? 171339134 : 171339133); while (true) { int num2 = num; int num3 = 171339135; int num4 = num2; switch ((num4 | num3) - (num4 & num3)) { case 1: return; case 2: { int levelingTaskCount = _levelingTaskCount; num3 = 1; num4 = levelingTaskCount; _levelingTaskCount = (num4 | num3) + (num4 & num3); num = 171339134; break; } case 0: num = 171339133; break; } } } public void EnqueueAll(IEnumerable tasks) { _tasks.InsertRange(0, tasks); _levelingTaskCount = _tasks.Count(IsLevelingTask); } public bool TryDequeue([NotNullWhen(true)] out ITask? task) { task = _tasks.FirstOrDefault(); int num = ((task != null) ? (-2044560893) : (-2044560894)); while (true) { int num2 = num; int num3 = -2044560889; int num4 = num2; int num5 = num4 + num3; int num6 = num4 & num3; switch (num5 - (num6 + num6)) { case 2: num = -2044560894; break; case 1: { int levelingTaskCount = _levelingTaskCount; num3 = 1; num4 = levelingTaskCount; _levelingTaskCount = ~(~num4 + num3); num = -2044560895; break; } case 5: return false; case 3: _completedTasks.Add(task); num = -2044560889; break; case 0: _tasks.RemoveAt(0); num = ((!IsLevelingTask(task)) ? (-2044560895) : (-2044560890)); break; case 4: num = ((!task.ShouldRedoOnInterrupt()) ? (-2044560889) : (-2044560892)); break; case 6: return true; } } } public bool TryPeek([NotNullWhen(true)] out ITask? task) { task = _tasks.FirstOrDefault(); return task != null; } public void Reset() { _tasks.Clear(); _completedTasks.Clear(); CurrentTaskExecutor = null; _levelingTaskCount = 0; } public void InterruptWith(List interruptionTasks) { List list = new List(); list.AddRange(interruptionTasks); list.AddRange(_completedTasks.Where((ITask x) => x != CurrentTaskExecutor?.CurrentTask).ToList()); list.Add(CurrentTaskExecutor?.CurrentTask); list.AddRange(_tasks); List source = list; Reset(); _tasks.AddRange(source.Where((ITask x) => x != null).Cast()); _levelingTaskCount = _tasks.Count(IsLevelingTask); } private static bool IsLevelingTask(ITask task) { int num = ((task is Duty.StartLevelingModeTask) ? (-425833563) : (-425833568)); bool result = default(bool); while (true) { int num2 = num; int num3 = -425833564; int num4 = num2; switch ((num4 | num3) - (num4 & num3)) { case 1: result = true; num = -425833562; break; case 2: return result; case 3: result = false; num = -425833562; break; case 0: num = -425833568; break; case 4: num = ((!(task is Duty.WaitLevelingModeTask)) ? (-425833561) : (-425833563)); break; } } } }