qstbak/Questionable/Questionable.Controller.Steps/TaskQueue.cs
2026-08-17 20:27:25 +10:00

186 lines
3.9 KiB
C#

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<ITask> _completedTasks = new List<ITask>();
private readonly List<ITask> _tasks = new List<ITask>();
private int _levelingTaskCount;
public ITaskExecutor? CurrentTaskExecutor { get; set; }
public IEnumerable<ITask> 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<ITask> 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<ITask> interruptionTasks)
{
List<ITask> list = new List<ITask>();
list.AddRange(interruptionTasks);
list.AddRange(_completedTasks.Where((ITask x) => x != CurrentTaskExecutor?.CurrentTask).ToList());
list.Add(CurrentTaskExecutor?.CurrentTask);
list.AddRange(_tasks);
List<ITask> source = list;
Reset();
_tasks.AddRange(source.Where((ITask x) => x != null).Cast<ITask>());
_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;
}
}
}
}