예제 #1
0
            public override Activity Tick(Actor self)
            {
                if (IsCanceled || !target.IsValidFor(self))
                {
                    return(NextActivity);
                }

                if (self.IsDisabled())
                {
                    return(this);
                }

                var weapon = attack.ChooseArmamentForTarget(target);

                if (weapon != null)
                {
                    var targetIsMobile = (target.Type == TargetType.Actor && target.Actor.HasTrait <IMove>()) ||
                                         (target.Type == TargetType.FrozenActor && target.FrozenActor.Info.Traits.Contains <IMove>());

                    // Try and sit at least one cell closer than the max range to give some leeway if the target starts moving.
                    var maxRange = targetIsMobile ? new WRange(Math.Max(weapon.Weapon.MinRange.Range, weapon.Weapon.Range.Range - 1024))
                                                : weapon.Weapon.Range;

                    attack.Target = target;

                    if (move != null)
                    {
                        return(Util.SequenceActivities(move.MoveFollow(self, target, weapon.Weapon.MinRange, maxRange), this));
                    }
                }

                return(NextActivity);
            }
예제 #2
0
            public override Activity Tick(Actor self)
            {
                if (IsCanceled || !target.IsValidFor(self))
                {
                    return(NextActivity);
                }

                if (self.IsDisabled())
                {
                    return(this);
                }

                const int RangeTolerance = 1;                   /* how far inside our maximum range we should try to sit */
                var       weapon         = attack.ChooseArmamentForTarget(target);

                if (weapon != null)
                {
                    var range = WRange.FromCells(Math.Max(0, weapon.Weapon.Range.Range / 1024 - RangeTolerance));

                    attack.Target = target;

                    if (move != null)
                    {
                        return(Util.SequenceActivities(move.MoveFollow(self, target, range), this));
                    }
                }

                return(NextActivity);
            }