protected void Patrol()
        {
            if (CurrentPatrolRoute is null || !CurrentPatrolRoute.Any())
            {
                CurrentPatrolRoute = new Stack <Vector2i>(PatrolRoute);
            }

            if (TargetPosition.IsInvalid() || TargetPosition.Equals(Owner.Coords))
            {
                TargetPosition = CurrentPatrolRoute.Pop();
            }

            if (!TargetPosition.IsInvalid())
            {
                if (Path != null && !Path.Any())
                {
                    Path = null;
                }

                Path ??= GeneratePath(Owner.CurrentRegion.GetNodesInRegion(), Owner.CurrentRegion.ConvertMapCoordsToRegionFieldCoords(Owner.Coords), Owner.CurrentRegion.ConvertMapCoordsToRegionFieldCoords(TargetPosition));

                NextAction = Path == null ? null : GetActionFromNextCoords(Path.Pop().Position + Owner.CurrentRegion.Coords * Owner.CurrentRegion.FieldsInLine);
            }
            else
            {
                NextAction = null;
            }
        }
        protected override void DecideOnNextAction()
        {
            if (CanDoAction() && Owner.CurrentRegion != null)
            {
                if (CanSeePlayerInUnobstructedLine || (CanSeeActivityInUnobstructedLine && Owner.CurrentRegion != null && Owner.CurrentRegion.HasDestructibleActivity))
                {
                    NextAction = KeyActionType.Shoot;
                }
                else
                {
                    Vector2i currentPlayerPosition = GamestateManager.Instance.Player.Coords;

                    if (LastPlayerPosition != currentPlayerPosition || !GamestateManager.Instance.Map.GetFieldFromRegion(TargetPosition).IsTraversible())
                    {
                        LastPlayerPosition = currentPlayerPosition;
                        TargetPosition     = GetValidStandGroundPosition();
                        Path = null;
                    }

                    if (!IsPlayerWithinChaseRadius() && !TargetPosition.Equals(HomePosition))
                    {
                        NextAction = null;
                    }
                    else
                    {
                        if (!TargetPosition.IsInvalid())
                        {
                            if (Path != null && Path.Count == 0)
                            {
                                Path = null;
                            }

                            Path ??= GeneratePath(GamestateManager.Instance.Map.GetNodesInRadius(Owner.Coords, SightDistance), new Vector2i(SightDistance, SightDistance), new Vector2i(SightDistance, SightDistance) + TargetPosition - Owner.Coords);

                            NextAction = Path == null ? null : GetActionFromNextCoords(Path.Pop().Position + Owner.Coords - new Vector2i(SightDistance, SightDistance));
                        }
                        else
                        {
                            NextAction = null;
                        }
                    }
                }
            }
            else
            {
                NextAction = null;
            }
        }
Пример #3
0
        protected override void DecideOnNextAction()
        {
            if (CanDoAction() && Owner.CurrentRegion != null)
            {
                PatrolRoute ??= Owner.CurrentRegion.GetNodesInRegion().SelectMany(node => node).ToList().FindAll(node => node.Walkable).Select(node => node.Position).OrderBy(node => Guid.NewGuid()).ToList();

                if (CanSeePlayerInUnobstructedLine || (CanSeeActivityInUnobstructedLine && Owner.CurrentRegion.HasDestructibleActivity))
                {
                    NextAction = KeyActionType.Shoot;
                }
                else
                {
                    if (CurrentPatrolRoute is null || CurrentPatrolRoute.Count == 0)
                    {
                        CurrentPatrolRoute = new Stack <Vector2i>(PatrolRoute);
                    }

                    if (Path != null && !Path.Any())
                    {
                        Path = null;
                    }

                    if (CurrentPatrolRoute != null && CurrentPatrolRoute.Any() && (Path == null || TargetPosition.IsInvalid() || TargetPosition.Equals(Owner.CurrentRegion.ConvertMapCoordsToRegionFieldCoords(Owner.Coords))))
                    {
                        SetCooldown(0.05);
                        TargetPosition = CurrentPatrolRoute.Pop();
                        Path ??= GeneratePath(Owner.CurrentRegion.GetNodesInRegion(), Owner.CurrentRegion.ConvertMapCoordsToRegionFieldCoords(Owner.Coords), TargetPosition);
                    }

                    NextAction = Path == null ? null : GetActionFromNextCoords(Path.Pop().Position + Owner.CurrentRegion.Coords * Owner.CurrentRegion.FieldsInLine);
                }
            }
            else
            {
                NextAction = null;
            }
        }