using System; using Cysharp.Threading.Tasks; using UnityEngine; namespace DanieleMarotta.RiversongCodeShowcase { public class PlayAnimationIntentExecutionLogic : IntentExecutionLogic { private static readonly int ChopTree = Animator.StringToHash("ChopTree"); private static readonly int Farming = Animator.StringToHash("Farming"); private static readonly int FireProjectile = Animator.StringToHash("FireProjectile"); private IAgentVisualizationCollection _agentVisualizationCollection; public override UniTask InitializeAsync(IServiceLocator serviceLocator) { _agentVisualizationCollection = serviceLocator.GetService(); return UniTask.CompletedTask; } public override IntentExecutionResult OnStartingIntent(Agent agent, in AgentIntent intent) { if (!_agentVisualizationCollection.TryGetVisualization(agent.Id, out var visualization)) return IntentExecutionResult.Failure; var triggerID = GetAnimatorTriggerID((AgentAnimation)intent.TargetId); visualization.SetAnimatorTrigger(triggerID); return IntentExecutionResult.Success; } public override IntentExecutionResult Execute(Agent agent, in AgentIntent intent) { if (!_agentVisualizationCollection.TryGetVisualization(agent.Id, out var visualization)) return IntentExecutionResult.Failure; return !visualization.WaitAnimationCompleted() ? IntentExecutionResult.InProgress : IntentExecutionResult.Success; } private int GetAnimatorTriggerID(AgentAnimation animation) { return animation switch { AgentAnimation.ChopTree => ChopTree, AgentAnimation.Farming => Farming, AgentAnimation.FireProjectile => FireProjectile, _ => throw new ArgumentOutOfRangeException() }; } } }