Advertisement
Pro_Unit

Neutral

Feb 18th, 2022
923
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.78 KB | None | 0 0
  1. using System;
  2.  
  3. using AnimalSimulator.Animals.Behaviours.States;
  4. using AnimalSimulator.Animals.Mods.EventsObservers;
  5. using AnimalSimulator.Infrastructure.TickableStateMachineWithTransitions;
  6. using UnityEngine;
  7.  
  8. namespace AnimalSimulator.Animals.Behaviours
  9. {
  10.     public class Neutral : IBehaviour, IAnimalDamagedListener, IAttackModeEndListener, IDamageModeEndListener
  11.     {
  12.         private readonly StateMachine _stateMachine;
  13.         private readonly Patrol _patrol;
  14.         private readonly Chase _chase;
  15.         private readonly Search _search;
  16.         private readonly CombatDecide _decide;
  17.         private readonly Attack _attack;
  18.         private readonly Triggers _triggers;
  19.         private readonly TargetOwner _targetOwner;
  20.         private readonly Toggle _toggle = new();
  21.  
  22.         public Neutral
  23.         (
  24.             StateMachine stateMachine,
  25.             Patrol patrol,
  26.             Search search,
  27.             CombatDecide decide,
  28.             Chase chase,
  29.             Attack attack,
  30.             Triggers triggers,
  31.             TargetOwner targetOwner
  32.         )
  33.         {
  34.             _stateMachine = stateMachine;
  35.             _patrol = patrol;
  36.             _chase = chase;
  37.             _search = search;
  38.             _decide = decide;
  39.             _attack = attack;
  40.             _triggers = triggers;
  41.             _targetOwner = targetOwner;
  42.         }
  43.  
  44.         public void Enable()
  45.         {
  46.             _toggle.Enable();
  47.            
  48.             DoTransition(_search, _decide, HasTarget);
  49.             DoTransition(_decide, _attack, _triggers.CanAttack);
  50.             DoTransition(_decide, _chase, _triggers.NeedChase);
  51.             DoTransition(_attack, _decide, _triggers.AttackEnd);
  52.             DoTransition(_chase, _decide, _triggers.TargetArrived);
  53.             DoTransition(_patrol, _decide, _triggers.PatrolTargetArrived);
  54.             DoTransition(_decide, _search, _triggers.LostTarget);
  55.             DoTransition(_search, _patrol, _triggers.NoFoundTarget);
  56.  
  57.             DoTransitionFromAnyState(_search, _triggers.Damaged);
  58.  
  59.             _stateMachine.SetState(_patrol);
  60.         }
  61.  
  62.         private bool HasTarget() =>
  63.             _targetOwner.Target != null;
  64.  
  65.         private void DoTransitionFromAnyState(IState to, Func<bool> when)
  66.         {
  67.             var transition = new Transition(to, when);
  68.             _stateMachine.AddAnyTransition(transition);
  69.         }
  70.  
  71.         private void DoTransition(IState @from, IState to, Func<bool> @when) =>
  72.             _stateMachine.AddTransition(@from, new Transition(to, when));
  73.  
  74.         public void Tick() =>
  75.             _stateMachine.Tick();
  76.  
  77.         public void Disable() =>
  78.             _toggle.Disable();
  79.  
  80.         public void OnAnimalDamaged(DamageContext context)
  81.         {
  82.             if (_toggle.Disabled)
  83.                 return;
  84.            
  85.             GameObject owner = context.Owner;
  86.  
  87.             if (owner == null)
  88.                 return;
  89.                
  90.             var animalReferences = owner.GetComponent<AnimalReferences>();
  91.  
  92.             Animal animal = animalReferences.Animal;
  93.             _targetOwner.Target = animal;
  94.         }
  95.  
  96.         public void OnDamageModeEnded(int ability)
  97.         {
  98.             if (_toggle.Enabled)
  99.                 _triggers.Damaged.Set();
  100.         }
  101.  
  102.         public void OnAttackModeEnded(int ability)
  103.         {
  104.             if (_toggle.Enabled)
  105.                 _triggers.AttackEnd.Set();
  106.         }
  107.     }
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement