using Unity.Collections; using Unity.Mathematics; namespace DanieleMarotta.RiversongCodeShowcase { public struct IntentQueue { private FixedList512Bytes _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()); } } }