public override void Evaluate() { var obstacles = Options.Source.GetObstacles(); var candidates = Options.TargetsEval(); var target = candidates .Where(z => { var sb = Options.SourceBounds; var angle = sb.Center().CalculateAngleTo(z.Center()); var delta = Options.Source.Angle.DiffAngle(angle); if (delta >= AngularVisibility) { return(false); } var prediction = HitDetection.PredictHit(new HitDetectionOptions() { Angle = angle, MovingObject = sb, Obstacles = obstacles.Where(o => o is WeaponElement == false), Visibility = 3 * SpaceTime.CurrentSpaceTime.Bounds.Hypotenous(), Precision = .5f, }); var elementHit = prediction.ObstacleHit as SpacialElement; if (elementHit == z) { return(true); } else if (elementHit != null && z is IHaveMassBounds && (z as IHaveMassBounds).IsPartOfMass(elementHit)) { return(true); } else { return(false); } }) .OrderBy(z => Geometry.CalculateNormalizedDistanceTo(Options.Source.Element, z)) .FirstOrDefault(); if (target != lastTarget) { TargetChanged.Fire(target); lastTarget = target; } }
private void Evaluate() { var obstacles = Options.Source.GetObstacles().Where(o => o is SpacialElement && o is WeaponElement == false).ToArray(); SpacialElement target = null; float winningCandidateProximity = float.MaxValue; targets.Clear(); foreach (var element in SpaceTime.CurrentSpaceTime.Elements) { if (element.ZIndex != Options.Source.Element.ZIndex) { continue; } if (element.HasSimpleTag(Options.TargetTag) == false) { continue; } if (element is Character && (element as Character).IsVisible == false) { continue; } var sb = Options.SourceBounds; var angle = sb.Center().CalculateAngleTo(element.Center()); var delta = Options.Source.Angle.DiffAngle(angle); if (delta >= Options.AngularVisibility) { continue; } var prediction = HitDetection.PredictHit(new HitDetectionOptions() { Angle = angle, MovingObject = sb, Obstacles = obstacles, Visibility = 3 * SpaceTime.CurrentSpaceTime.Bounds.Hypotenous(), Mode = CastingMode.Rough, }); var elementHit = prediction.ObstacleHit as SpacialElement; if (elementHit == element) { targets.Add(elementHit); var d = Geometry.CalculateNormalizedDistanceTo(Options.Source.Element, element); if (d < winningCandidateProximity) { target = elementHit; winningCandidateProximity = d; } } else if (elementHit != null && element is IHaveMassBounds && (element as IHaveMassBounds).IsPartOfMass(elementHit)) { targets.Add(elementHit); var d = Geometry.CalculateNormalizedDistanceTo(Options.Source.Element, element); if (d < winningCandidateProximity) { target = elementHit; winningCandidateProximity = d; } } } if (Options.Source.Element is Character && (Options.Source.Element as Character).IsVisible == false) { target = null; } if (target != lastTarget) { TargetChanged.Fire(target); lastTarget = target; } }