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