using Godot;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using GodotComponentTest.entities;
using Object = Godot.Object;
public class TaskQueueComponent : Component
{
[Signal]
delegate void StartInteraction(Entity entity, Entity targetEntity);
public abstract class Task : Object
{
///
/// Executes a Task on the specified entity.
///
/// true when the Task is complete, false otherwise
public abstract bool PerformTask(Entity entity, float delta);
}
public class NavigationTask : Task
{
public NavigationComponent.NavigationPoint NavigationPoint;
public bool PlanningComplete = false;
public NavigationTask(NavigationComponent.NavigationPoint navigationPoint)
{
NavigationPoint = navigationPoint;
}
public override bool PerformTask(Entity entity, float delta)
{
return NavigationPoint.IsReached(entity.GlobalTransform);
}
}
public class InteractionTask : Task
{
public Entity TargetEntity;
public InteractionTask(Entity entity)
{
TargetEntity = entity;
}
public override bool PerformTask(Entity entity, float delta)
{
return true;
}
}
public Queue Queue;
public TaskQueueComponent()
{
Queue = new Queue();
Reset();
}
public void Reset()
{
Queue.Clear();
}
public void Process(Entity entity, float delta)
{
if (Queue.Count == 0)
{
return;
}
do
{
Task currentTask = Queue.Peek();
InteractionTask interactionTask = currentTask as InteractionTask;
if (interactionTask != null)
{
EmitSignal("StartInteraction", entity, interactionTask.TargetEntity);
}
if (currentTask.PerformTask(entity, delta))
{
Queue.Dequeue();
}
else
{
break;
}
} while (Queue.Count > 0);
}
}