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