public UseAbilityOnTargetHandler(IEventSystem eventSystem, GameConfiguration gameConfiguration, Level level, MovementAdvisor movementAdvisor, IAbilityHandlerRepository abilityHandlerRepository)
 {
     EventSystem              = eventSystem;
     GameConfiguration        = gameConfiguration;
     Level                    = level;
     MovementAdvisor          = movementAdvisor;
     AbilityHandlerRepository = abilityHandlerRepository;
 }
        public void MoveTowards(Unit unit, Unit target)
        {
            var bestMovement  = MovementAdvisor.GetBestMovementTowardsTarget(unit, target);
            var newDirection  = unit.Position - bestMovement;
            var directionType = newDirection.GetDirection();

            var oldPosition  = unit.Position;
            var oldDirection = unit.FacingDirection;

            unit.Position        = bestMovement;
            unit.FacingDirection = directionType;
            EventSystem.Publish(new UnitMovingEvent(unit, oldPosition, oldDirection));
        }
        public object GetBestLocation(IHasDataId context, IUtilityVariables variables)
        {
            var ownerUnit     = (context as Unit);
            var targetUtility = variables
                                .GetRelatedUtilities(UtilityVariableTypes.IsADanger)
                                .OrderByDescending(x => x.Value)
                                .FirstOrDefault();

            if (targetUtility.Key.UtilityId == 0)
            {
                return(MovementAdvisor.GetBestMovementAwayFromLocation(ownerUnit, ownerUnit.Position));
            }

            var targetUnit = Level.GameUnits.FirstOrDefault(x => x.Agent.OwnerContext.Id == targetUtility.Key.RelatedId);

            if (targetUnit == null)
            {
                return(MovementAdvisor.GetBestMovementAwayFromLocation(ownerUnit, ownerUnit.Position));
            }

            return(MovementAdvisor.GetBestMovementAwayFromTarget(ownerUnit, targetUnit.Unit));
        }
 public ShouldEscapeAdviceApplicator(IRequirementChecker <Unit> requirementChecker, MovementAdvisor movementAdvisor, Level level) : base(requirementChecker)
 {
     MovementAdvisor = movementAdvisor;
     Level           = level;
 }