Files
riversong-code-showcase/Source/Riversong/Game/World/Agents/Intents/IntentQueue.cs
2026-05-21 16:04:49 +02:00

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());
}
}
}