Exemple #1
0
        private IActorTask HandlePersuitMode()
        {
            var isAttackAllowed = CheckAttackAvailability(_targetIntruder);

            if (isAttackAllowed)
            {
                var attackTask = new AttackTask(Actor, _targetIntruder, _actService);
                return(attackTask);
            }
            else
            {
                // Маршрут до цели обновляем каждые 3 хода.
                // Для оптимизации.
                // Эффект потери цели.

                if (_pursuitCounter > 0 && _moveTask != null && _moveTask.CanExecute())
                {
                    _pursuitCounter--;
                    return(_moveTask);
                }
                else
                {
                    RefreshPursuitCounter();
                    _moveTask = new MoveTask(Actor, _targetIntruder.Node, Map);
                    return(_moveTask);
                }
            }
        }
        public override IActorTask GetTask(IActor actor, ILogicStrategyData strategyData)
        {
            if (!strategyData.ExitNodes.Any())
            {
                Complete = true;
                return(null);
            }

            if (_moveTask == null || _moveTask.IsComplete || !_moveTask.CanExecute())
            {
                var nearbyExitNode = strategyData.ExitNodes
                                     .OrderBy(x => _map.DistanceBetween(actor.Node, x))
                                     .First();

                _moveTask = CreateMoveTask(actor, nearbyExitNode);

                if (_moveTask == null)
                {
                    Complete = true;
                    return(null);
                }

                return(_moveTask);
            }
            else
            {
                return(_moveTask);
            }
        }
        public override IActorTask GetTask(IActor actor, ISectorTaskSourceContext context,
                                           ILogicStrategyData strategyData)
        {
            var triggerTarget = strategyData.TriggerIntuder;

            if (triggerTarget == null)
            {
                throw new InvalidOperationException(
                          $"Assign {nameof(strategyData.TriggerIntuder)} with not null valie in related trigger.");
            }

            var targetCanBeDamaged = triggerTarget.CanBeDamaged();

            if (!targetCanBeDamaged)
            {
                Complete = true;
                return(null);
            }

            var attackParams = CheckAttackAvailability(actor, triggerTarget, context.Sector.Map);

            if (attackParams.IsAvailable)
            {
                var act = attackParams.CombatAct;

                var taskContext = new ActorTaskContext(context.Sector);

                var attackTask = new AttackTask(actor, taskContext, triggerTarget, act, _actService);
                return(attackTask);
            }

            // Маршрут до цели обновляем каждые 3 хода.
            // Для оптимизации.
            // Эффект потери цели.
            if (_refreshCounter > 0 && _moveTask?.CanExecute() == true)
            {
                _refreshCounter--;
                return(_moveTask);
            }

            var map = context.Sector.Map;

            _refreshCounter = REFRESH_COUNTER_VALUE;
            var targetIsOnLine = map.TargetIsOnLine(actor.Node, triggerTarget.Node);

            if (targetIsOnLine)
            {
                var taskContext = new ActorTaskContext(context.Sector);
                var moveModule  = actor.Person.GetModule <IMovingModule>();
                var moveCost    = moveModule.CalculateCost();

                _moveTask = new MoveTask(actor, taskContext, triggerTarget.Node, map, moveCost);
                return(_moveTask);
            }

            // Цел за пределами видимости. Считается потерянной.
            return(null);
        }
        public override IActorTask GetTask(IActor actor, ILogicStrategyData strategyData)
        {
            if (_target == null)
            {
                _target = GetTarget(actor);
            }

            var targetCanBeDamaged = _target.CanBeDamaged();

            if (!targetCanBeDamaged)
            {
                Complete = true;
                return(null);
            }

            var isAttackAllowed = CheckAttackAvailability(actor, _target);

            if (isAttackAllowed)
            {
                var attackTask = new AttackTask(actor, _target, _actService);
                return(attackTask);
            }
            else
            {
                // Маршрут до цели обновляем каждые 3 хода.
                // Для оптимизации.
                // Эффект потери цели.

                if (_refreshCounter > 0 && _moveTask?.CanExecute() == true)
                {
                    _refreshCounter--;
                    return(_moveTask);
                }
                else
                {
                    _refreshCounter = REFRESH_COUNTER_VALUE;
                    var targetIsOnLine = _map.TargetIsOnLine(actor.Node, _target.Node);

                    if (targetIsOnLine)
                    {
                        _moveTask = new MoveTask(actor, _target.Node, _map);
                        return(_moveTask);
                    }
                    else
                    {
                        // Цел за пределами видимости. Считается потерянной.
                        return(null);
                    }
                }
            }
        }
Exemple #5
0
        public override IActorTask GetTask(IActor actor, ILogicStrategyData strategyData)
        {
            if (MoveTask == null)
            {
                MoveTask = CreateBypassMoveTask(actor, strategyData);

                if (MoveTask != null)
                {
                    return(MoveTask);
                }
                else
                {
                    // Это может произойти, если актёр не выбрал следующий узел.
                    // Тогда переводим актёра в режим ожидания.

                    IdleTask = new IdleTask(actor, DecisionSource);
                    return(IdleTask);
                }
            }
            else
            {
                if (!MoveTask.IsComplete)
                {
                    // Если команда на перемещение к целевой точке патруля не закончена,
                    // тогда продолжаем её.
                    // Предварительно проверяем, не мешает ли что-либо её продолжить выполнять.
                    if (!MoveTask.CanExecute())
                    {
                        MoveTask = CreateBypassMoveTask(actor, strategyData);
                    }

                    if (MoveTask != null)
                    {
                        return(MoveTask);
                    }

                    IdleTask = new IdleTask(actor, DecisionSource);
                    return(IdleTask);
                }
                else
                {
                    Complete = true;
                    return(null);
                }
            }
        }
Exemple #6
0
        public override IActorTask GetTask(IActor actor, ISectorTaskSourceContext context,
                                           ILogicStrategyData strategyData)
        {
            var sector = context.Sector;
            var map    = sector.Map;

            if (!strategyData.ExitNodes.Any())
            {
                Complete = true;
                return(null);
            }

            var actorNode = actor.Node;

            if (map.Transitions.TryGetValue(actorNode, out var currentTransition))
            {
                var taskContext    = new ActorTaskContext(sector);
                var transitionTask = new SectorTransitTask(actor, taskContext);
                Complete = true;
                return(transitionTask);
            }

            if (_moveTask == null || _moveTask.IsComplete || !_moveTask.CanExecute())
            {
                var nearbyExitNode = strategyData.ExitNodes
                                     .OrderBy(x => map.DistanceBetween(actor.Node, x))
                                     .First();

                _moveTask = CreateMoveTask(actor, nearbyExitNode, sector, map);

                if (_moveTask == null)
                {
                    Complete = true;
                    return(null);
                }

                return(_moveTask);
            }

            return(_moveTask);
        }
Exemple #7
0
        public override IActorTask GetTask(IActor actor, ILogicStrategyData strategyData)
        {
            if (!strategyData.ExitNodes.Any())
            {
                Complete = true;
                return(null);
            }

            var actorNode = actor.Node;

            if (_map.Transitions.TryGetValue(actorNode, out var currentTransition))
            {
                _sector.UseTransition(currentTransition);
                Complete = true;
                return(null);
            }

            if (_moveTask == null || _moveTask.IsComplete || !_moveTask.CanExecute())
            {
                var nearbyExitNode = strategyData.ExitNodes
                                     .OrderBy(x => _map.DistanceBetween(actor.Node, x))
                                     .First();

                _moveTask = CreateMoveTask(actor, nearbyExitNode);

                if (_moveTask == null)
                {
                    Complete = true;
                    return(null);
                }

                return(_moveTask);
            }
            else
            {
                return(_moveTask);
            }
        }