public override void DoAttack(Actor self, Target target) { if (target.Type != TargetType.Actor || !CanAttack(self, target)) return; var a = ChooseArmamentForTarget(target); if (a == null) return; if (!target.IsInRange(self.CenterPosition, a.Weapon.Range)) return; self.CancelActivity(); self.QueueActivity(new Leap(self, target.Actor, a.Weapon, info.Speed, info.Angle)); }
public override void DoAttack(Actor self, Target target, IEnumerable<Armament> armaments = null) { if (target.Type != TargetType.Actor || !CanAttack(self, target)) return; var a = ChooseArmamentsForTarget(target, true).FirstOrDefault(); if (a == null) return; if (!target.IsInRange(self.CenterPosition, a.MaxRange())) return; self.CancelActivity(); self.QueueActivity(new Leap(self, target.Actor, a.Weapon, info.Speed, info.Angle)); }
public override void DoAttack(Actor self, Target target) { if (!CanAttack(self, target)) return; var arm = Armaments.FirstOrDefault(); if (arm == null) return; if (!target.IsInRange(self.CenterPosition, arm.Weapon.Range)) return; foreach (var a in Armaments) a.CheckFire(self, facing.Value, target); if (target.Actor != null) target.Actor.ChangeOwner(self.Owner); }
public override void DoAttack(Actor self, Target target, IEnumerable<Armament> armaments = null) { // This is so that the worm does not launch an attack against a target that has reached solid rock if (target.Type != TargetType.Actor || !CanAttack(self, target)) { self.CancelActivity(); return; } var a = ChooseArmamentsForTarget(target, true).FirstOrDefault(); if (a == null) return; if (!target.IsInRange(self.CenterPosition, a.MaxRange())) return; self.CancelActivity(); self.QueueActivity(new SwallowActor(self, target, a.Weapon)); }
public override void DoAttack(Actor self, Target target) { if (!CanAttack(self, target)) return; var arm = Armaments.FirstOrDefault(); if (arm == null) return; // TODO: Define weapon ranges as WRange var range = new WRange((int)(1024*arm.Weapon.Range)); if (!target.IsInRange(self.CenterPosition, range)) return; var facing = self.TraitOrDefault<IFacing>(); foreach (var a in Armaments) a.CheckFire(self, this, facing, target); if (target.Actor != null) target.Actor.ChangeOwner(self.Owner); }
bool CanTargetActor(Actor self, Target target, TargetModifiers modifiers, ref string cursor) { IsQueued = modifiers.HasModifier(TargetModifiers.ForceQueue); var a = ab.ChooseArmamentForTarget(target); cursor = a != null && !target.IsInRange(self.CenterPosition, a.Weapon.Range) ? ab.info.OutsideRangeCursor : ab.info.Cursor; if (target.Type == TargetType.Actor && target.Actor == self) return false; if (!ab.HasAnyValidWeapons(target)) return false; if (modifiers.HasModifier(TargetModifiers.ForceAttack)) return true; if (modifiers.HasModifier(TargetModifiers.ForceMove)) return false; if (target.RequiresForceFire) return false; var targetableRelationship = negativeDamage ? Stance.Ally : Stance.Enemy; var owner = target.Type == TargetType.FrozenActor ? target.FrozenActor.Owner : target.Actor.Owner; return self.Owner.Stances[owner] == targetableRelationship; }
public bool IsReachableTarget(Target target, bool allowMove) { return HasAnyValidWeapons(target) && (target.IsInRange(self.CenterPosition, GetMaximumRange()) || (allowMove && self.HasTrait<IMove>())); }