From c5358f7c82435c02f67755f8ac9a4ea7e1fcbb88 Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 24 Oct 2010 01:28:37 +1300 Subject: [PATCH] call DoAttack from activities instead of from Tick in AttackPlane/AttackHeli --- OpenRA.Mods.RA/Activities/FlyAttack.cs | 37 +++++++++++++++++-------- OpenRA.Mods.RA/Activities/HeliAttack.cs | 5 +++- OpenRA.Mods.RA/AttackFrontal.cs | 13 +++++---- 3 files changed, 37 insertions(+), 18 deletions(-) diff --git a/OpenRA.Mods.RA/Activities/FlyAttack.cs b/OpenRA.Mods.RA/Activities/FlyAttack.cs index 1e6e772c45..d48e208795 100644 --- a/OpenRA.Mods.RA/Activities/FlyAttack.cs +++ b/OpenRA.Mods.RA/Activities/FlyAttack.cs @@ -14,24 +14,39 @@ namespace OpenRA.Mods.RA.Activities { public class FlyAttack : CancelableActivity { - Target Target; + readonly Target Target; + IActivity inner; public FlyAttack(Target target) { Target = target; } public override IActivity Tick(Actor self) { - if (IsCanceled) return NextActivity; - if (!Target.IsValid) - return NextActivity; - + if( !Target.IsValid ) + Cancel( self ); var limitedAmmo = self.TraitOrDefault(); - if (limitedAmmo != null && !limitedAmmo.HasAmmo()) - return NextActivity; + if( limitedAmmo != null && !limitedAmmo.HasAmmo() ) + Cancel( self ); - return Util.SequenceActivities( - Fly.ToPx(Target.CenterLocation), - new FlyTimed(50), - this); + self.Trait().DoAttack( self ); + + if( IsCanceled && inner == null ) return NextActivity; + + if( inner == null ) + { + inner = Util.SequenceActivities( + Fly.ToPx(Target.CenterLocation), + new FlyTimed(50)); + } + inner = inner.Tick( self ); + + return this; + } + + protected override bool OnCancel( Actor self ) + { + if( inner != null ) + inner.Cancel( self ); + return base.OnCancel( self ); } } diff --git a/OpenRA.Mods.RA/Activities/HeliAttack.cs b/OpenRA.Mods.RA/Activities/HeliAttack.cs index 82def3f317..ef3c88a608 100644 --- a/OpenRA.Mods.RA/Activities/HeliAttack.cs +++ b/OpenRA.Mods.RA/Activities/HeliAttack.cs @@ -39,7 +39,8 @@ namespace OpenRA.Mods.RA.Activities return this; } - var range = self.Trait().GetMaximumRange() - 1; + var attack = self.Trait(); + var range = attack.GetMaximumRange() - 1; var dist = target.CenterLocation - self.CenterLocation; var desiredFacing = Util.GetFacing(dist, aircraft.Facing); @@ -49,6 +50,8 @@ namespace OpenRA.Mods.RA.Activities if (!float2.WithinEpsilon(float2.Zero, dist, range * Game.CellSize)) aircraft.center += (rawSpeed / dist.Length) * dist; + attack.DoAttack( self ); + return this; } } diff --git a/OpenRA.Mods.RA/AttackFrontal.cs b/OpenRA.Mods.RA/AttackFrontal.cs index 997cc3b2d2..2bc160ef28 100644 --- a/OpenRA.Mods.RA/AttackFrontal.cs +++ b/OpenRA.Mods.RA/AttackFrontal.cs @@ -20,17 +20,18 @@ namespace OpenRA.Mods.RA readonly int FacingTolerance; - public override void Tick(Actor self) + protected override bool CanAttack( Actor self ) { - base.Tick(self); - - if (!target.IsValid) return; + if( !base.CanAttack( self ) ) + return false; var facing = self.Trait().Facing; var facingToTarget = Util.GetFacing(target.CenterLocation - self.CenterLocation, facing); - if (Math.Abs(facingToTarget - facing) % 256 < FacingTolerance) - DoAttack(self); + if( Math.Abs( facingToTarget - facing ) % 256 >= FacingTolerance ) + return false; + + return true; } } }