예제 #1
0
        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;
            }
        }
예제 #2
0
        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;
            }
        }