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); } } } }
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); } } }
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); }
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); } }