forked from aly/qstbak
186 lines
3.9 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
}
|