diff --git a/OpenRA.Mods.RA/AttackTesla.cs b/OpenRA.Mods.RA/AttackTesla.cs index 11d5b33250..e42a9805a5 100644 --- a/OpenRA.Mods.RA/AttackTesla.cs +++ b/OpenRA.Mods.RA/AttackTesla.cs @@ -11,6 +11,7 @@ using System; using OpenRA.Mods.RA.Render; using OpenRA.Traits; +using OpenRA.Mods.RA.Activities; namespace OpenRA.Mods.RA { @@ -32,44 +33,58 @@ namespace OpenRA.Mods.RA charges = self.Info.Traits.Get().MaxCharges; } - protected override bool CanAttack( Actor self, Target target ) - { - return base.CanAttack( self, target ) && ( charges > 0 ); - } - public override void Tick( Actor self ) { if( --timeToRecharge <= 0 ) charges = self.Info.Traits.Get().MaxCharges; - if( charges <= 0 ) - { - foreach( var w in Weapons ) - w.FireDelay = Math.Max( w.FireDelay, timeToRecharge ); - previousTarget = null; - } base.Tick( self ); } - Actor previousTarget; - - public override int FireDelay( Actor self, Target target, AttackBaseInfo info ) - { - return target.Actor == previousTarget ? 3 : base.FireDelay(self, target, info); - } - public void Attacking(Actor self, Target target) { - foreach (var w in Weapons) - w.FireDelay = 8; - - timeToRecharge = self.Info.Traits.Get().ReloadTime; --charges; + timeToRecharge = self.Info.Traits.Get().ReloadTime; + } - if (target.Actor != previousTarget) + protected override IActivity GetAttackActivity( Actor self, Target newTarget, bool allowMove ) + { + return new TeslaAttack( newTarget ); + } + + class TeslaAttack : CancelableActivity + { + readonly Target target; + public TeslaAttack( Target target ) { this.target = target; } + + public override IActivity Tick( Actor self ) { - previousTarget = target.Actor; + if( IsCanceled || !target.IsValid ) return NextActivity; + + var attack = self.Trait(); + if( attack.charges == 0 || !attack.CanAttack( self, target ) ) + return this; + self.Trait().PlayCharge(self); + return Util.SequenceActivities( new Wait( 8 ), new TeslaZap( target ), this ); + } + } + + class TeslaZap : CancelableActivity + { + readonly Target target; + public TeslaZap( Target target ) { this.target = target; } + + public override IActivity Tick( Actor self ) + { + if( IsCanceled || !target.IsValid ) return NextActivity; + + var attack = self.Trait(); + if( attack.charges == 0 ) return NextActivity; + + attack.DoAttack( self, target ); + + return Util.SequenceActivities( new Wait( 3 ), this ); } } } diff --git a/mods/ra/rules/structures.yaml b/mods/ra/rules/structures.yaml index ba9d739440..955a551555 100755 --- a/mods/ra/rules/structures.yaml +++ b/mods/ra/rules/structures.yaml @@ -253,7 +253,6 @@ TSLA: RenderBuildingCharge: AttackTesla: PrimaryWeapon: TeslaZap - FireDelay: 8 ReloadTime: 120 AutoTarget: IronCurtainable: