157 lines
7.2 KiB
C#
157 lines
7.2 KiB
C#
using Unity.Collections;
|
|
using Unity.Mathematics;
|
|
|
|
namespace DanieleMarotta.RiversongCodeShowcase
|
|
{
|
|
public struct IntentQueue
|
|
{
|
|
private FixedList512Bytes<AgentIntent> _intentQueue;
|
|
|
|
public int Count => _intentQueue.Length;
|
|
|
|
public void EnqueueIntent(in AgentIntent intent)
|
|
{
|
|
_intentQueue.Add(intent);
|
|
}
|
|
|
|
public bool TryDequeueIntent(out AgentIntent intent)
|
|
{
|
|
if (_intentQueue.Length > 0)
|
|
{
|
|
intent = _intentQueue[0];
|
|
_intentQueue.RemoveAt(0);
|
|
return true;
|
|
}
|
|
intent = AgentIntent.None;
|
|
return false;
|
|
}
|
|
|
|
public bool TryPeekIntent(out AgentIntent intent)
|
|
{
|
|
if (_intentQueue.Length > 0)
|
|
{
|
|
intent = _intentQueue[0];
|
|
return true;
|
|
}
|
|
intent = AgentIntent.None;
|
|
return false;
|
|
}
|
|
|
|
public void Clear()
|
|
{
|
|
_intentQueue.Clear();
|
|
}
|
|
|
|
public static void Fetch(ref IntentQueue intentQueue,
|
|
TileRect sourceRect,
|
|
int sourceId,
|
|
TileRect destinationRect,
|
|
int destinationId,
|
|
int productHandle,
|
|
int amount,
|
|
PathTraversalRules traversalRules)
|
|
{
|
|
intentQueue.EnqueueIntent(AgentIntent.FindPath(destinationRect, destinationId, traversalRules));
|
|
intentQueue.EnqueueIntent(AgentIntent.MakeLive());
|
|
intentQueue.EnqueueIntent(AgentIntent.FollowPath());
|
|
intentQueue.EnqueueIntent(AgentIntent.Take(destinationId, productHandle, amount));
|
|
intentQueue.EnqueueIntent(AgentIntent.FindPath(sourceRect, sourceId, traversalRules));
|
|
intentQueue.EnqueueIntent(AgentIntent.FollowPath());
|
|
intentQueue.EnqueueIntent(AgentIntent.Put(sourceId, productHandle, amount));
|
|
}
|
|
|
|
public static void Deliver(ref IntentQueue intentQueue,
|
|
TileRect sourceRect,
|
|
int sourceId,
|
|
TileRect destinationRect,
|
|
int destinationId,
|
|
int productHandle,
|
|
int amount,
|
|
PathTraversalRules traversalRules)
|
|
{
|
|
intentQueue.EnqueueIntent(AgentIntent.FindPath(destinationRect, destinationId, traversalRules));
|
|
intentQueue.EnqueueIntent(AgentIntent.MakeLive());
|
|
intentQueue.EnqueueIntent(AgentIntent.Take(sourceId, productHandle, amount));
|
|
intentQueue.EnqueueIntent(AgentIntent.FollowPath());
|
|
intentQueue.EnqueueIntent(AgentIntent.Put(destinationId, productHandle, amount));
|
|
intentQueue.EnqueueIntent(AgentIntent.FindPath(sourceRect, sourceId, traversalRules));
|
|
intentQueue.EnqueueIntent(AgentIntent.FollowPath());
|
|
}
|
|
|
|
public static void MoveProduct(ref IntentQueue intentQueue,
|
|
TileRect sourceRect,
|
|
int sourceId,
|
|
TileRect fetchRect,
|
|
int fetchId,
|
|
TileRect deliverRect,
|
|
int deliverId,
|
|
int productHandle,
|
|
int amount,
|
|
PathTraversalRules traversalRules)
|
|
{
|
|
intentQueue.EnqueueIntent(AgentIntent.FindPath(fetchRect, fetchId, traversalRules));
|
|
intentQueue.EnqueueIntent(AgentIntent.MakeLive());
|
|
intentQueue.EnqueueIntent(AgentIntent.FollowPath());
|
|
intentQueue.EnqueueIntent(AgentIntent.Take(fetchId, productHandle, amount));
|
|
intentQueue.EnqueueIntent(AgentIntent.FindPath(deliverRect, deliverId, traversalRules));
|
|
intentQueue.EnqueueIntent(AgentIntent.FollowPath());
|
|
intentQueue.EnqueueIntent(AgentIntent.Put(deliverId, productHandle, amount));
|
|
intentQueue.EnqueueIntent(AgentIntent.FindPath(sourceRect, sourceId, traversalRules));
|
|
intentQueue.EnqueueIntent(AgentIntent.FollowPath());
|
|
}
|
|
|
|
public static void Harvest(ref IntentQueue intentQueue, TileRect sourceRect, int sourceId, ResourceNodeDefinition resource, int maxDistance)
|
|
{
|
|
intentQueue.EnqueueIntent(AgentIntent.SearchResourceNode(resource.RuntimeId, PathTraversalRules.GenericAgent, maxDistance));
|
|
intentQueue.EnqueueIntent(AgentIntent.MakeLive());
|
|
intentQueue.EnqueueIntent(AgentIntent.FollowPath(1));
|
|
intentQueue.EnqueueIntent(AgentIntent.MoveToHarvestPosition(resource.HarvestPositionOffset));
|
|
intentQueue.EnqueueIntent(AgentIntent.PlayAnimation(resource.HarvestAnimation));
|
|
intentQueue.EnqueueIntent(AgentIntent.HarvestResource());
|
|
intentQueue.EnqueueIntent(AgentIntent.WaitSeconds(1.5f));
|
|
intentQueue.EnqueueIntent(AgentIntent.FindPath(sourceRect, sourceId));
|
|
intentQueue.EnqueueIntent(AgentIntent.FollowPath());
|
|
}
|
|
|
|
public static void SeekPrey(ref IntentQueue intentQueue, int critterDefinitionId, int maxDistance)
|
|
{
|
|
intentQueue.EnqueueIntent(AgentIntent.SearchCritter(critterDefinitionId, PathTraversalRules.GenericAgent, maxDistance));
|
|
intentQueue.EnqueueIntent(AgentIntent.MakeLive());
|
|
intentQueue.EnqueueIntent(AgentIntent.FollowPath());
|
|
}
|
|
|
|
public static void FireAtPreyAndReturnHome(ref IntentQueue intentQueue, TileRect homeRect, int homeId, int2 critterTile, int critterId, float projectileTravelTime)
|
|
{
|
|
intentQueue.EnqueueIntent(AgentIntent.LookAt(critterTile));
|
|
intentQueue.EnqueueIntent(AgentIntent.PlayAnimation(AgentAnimation.FireProjectile));
|
|
intentQueue.EnqueueIntent(AgentIntent.FireProjectile(critterId));
|
|
intentQueue.EnqueueIntent(AgentIntent.WaitSeconds(projectileTravelTime + 1));
|
|
intentQueue.EnqueueIntent(AgentIntent.FindPath(homeRect, homeId));
|
|
intentQueue.EnqueueIntent(AgentIntent.FollowPath());
|
|
}
|
|
|
|
public static void WorkFertileTile(ref IntentQueue intentQueue, TileRect sourceRect, int sourceId, int agentId, int maxDistance)
|
|
{
|
|
intentQueue.EnqueueIntent(AgentIntent.SearchFertileTile(PathTraversalRules.GenericAgent | PathTraversalRules.FertileTilesOnly, maxDistance));
|
|
intentQueue.EnqueueIntent(AgentIntent.SetFertileTileLockState(agentId));
|
|
intentQueue.EnqueueIntent(AgentIntent.MakeLive());
|
|
intentQueue.EnqueueIntent(AgentIntent.FollowPath());
|
|
intentQueue.EnqueueIntent(AgentIntent.PlayAnimation(AgentAnimation.Farming));
|
|
intentQueue.EnqueueIntent(AgentIntent.HarvestFertileTile());
|
|
intentQueue.EnqueueIntent(AgentIntent.WaitSeconds(2.5f));
|
|
intentQueue.EnqueueIntent(AgentIntent.SetFertileTileLockState(Entity.InvalidId));
|
|
intentQueue.EnqueueIntent(AgentIntent.FindPath(sourceRect, sourceId));
|
|
intentQueue.EnqueueIntent(AgentIntent.FollowPath());
|
|
}
|
|
|
|
public static void LoopWandering(ref IntentQueue intentQueue, float idleTime)
|
|
{
|
|
intentQueue.EnqueueIntent(AgentIntent.WaitSeconds(idleTime));
|
|
intentQueue.EnqueueIntent(AgentIntent.Wander());
|
|
intentQueue.EnqueueIntent(AgentIntent.FollowPath());
|
|
intentQueue.EnqueueIntent(AgentIntent.LoopWandering());
|
|
}
|
|
|
|
}
|
|
}
|