riversong code showcase
This commit is contained in:
156
Source/Riversong/Game/World/Agents/Intents/IntentQueue.cs
Normal file
156
Source/Riversong/Game/World/Agents/Intents/IntentQueue.cs
Normal file
@@ -0,0 +1,156 @@
|
||||
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());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user