diff --git a/OpenRa.DataStructures/int2.cs b/OpenRa.DataStructures/int2.cs index cedec2e842..8cf08c2444 100644 --- a/OpenRa.DataStructures/int2.cs +++ b/OpenRa.DataStructures/int2.cs @@ -23,7 +23,8 @@ namespace OpenRa public int2 Sign() { return new int2(Math.Sign(X), Math.Sign(Y)); } public int2 Abs() { return new int2( Math.Abs( X ), Math.Abs( Y ) ); } - public int Length { get { return (int)Math.Sqrt(X * X + Y * Y); } } + public int LengthSquared { get { return X * X + Y * Y; } } + public int Length { get { return (int)Math.Sqrt(LengthSquared); } } public override int GetHashCode() { return X.GetHashCode() ^ Y.GetHashCode(); } public override bool Equals(object obj) diff --git a/OpenRa.Game/Traits/AttackTurreted.cs b/OpenRa.Game/Traits/AttackTurreted.cs index ac31c6e3a9..24d0a488ba 100755 --- a/OpenRa.Game/Traits/AttackTurreted.cs +++ b/OpenRa.Game/Traits/AttackTurreted.cs @@ -13,49 +13,35 @@ namespace OpenRa.Game.Traits int primaryFireDelay = 0; int secondaryFireDelay = 0; - public AttackTurreted( Actor self ) + public AttackTurreted( Actor self ) { self.traits.Get(); } + + public void Tick(Actor self) { - self.traits.Get(); - } + if (primaryFireDelay > 0) --primaryFireDelay; + if (secondaryFireDelay > 0) --secondaryFireDelay; - public void Tick( Actor self ) - { - if( primaryFireDelay > 0 ) - --primaryFireDelay; - if( secondaryFireDelay > 0 ) - --secondaryFireDelay; - - if( target == null ) - return; - - if (target.IsDead) /* stop firing on targets after we've killed them */ - { - target = null; - return; - } + if (target != null && target.IsDead) target = null; /* he's dead, jim. */ + if (target == null) return; var turreted = self.traits.Get(); - turreted.desiredFacing = Util.GetFacing( target.CenterLocation - self.CenterLocation, turreted.turretFacing ); - if( turreted.desiredFacing != turreted.turretFacing ) + turreted.desiredFacing = Util.GetFacing(target.CenterLocation - self.CenterLocation, turreted.turretFacing); + if (turreted.desiredFacing != turreted.turretFacing) return; - if( self.unitInfo.Primary != null && CheckFire( self, self.unitInfo.Primary, ref primaryFireDelay ) ) + if (self.unitInfo.Primary != null && CheckFire(self, self.unitInfo.Primary, ref primaryFireDelay)) { - secondaryFireDelay = Math.Max( 4, secondaryFireDelay ); + secondaryFireDelay = Math.Max(4, secondaryFireDelay); return; } - if( self.unitInfo.Secondary != null && CheckFire( self, self.unitInfo.Secondary, ref secondaryFireDelay ) ) + if (self.unitInfo.Secondary != null && CheckFire(self, self.unitInfo.Secondary, ref secondaryFireDelay)) return; } bool CheckFire( Actor self, string weaponName, ref int fireDelay ) { - if( fireDelay > 0 ) - return false; + if( fireDelay > 0 ) return false; var weapon = Rules.WeaponInfo[ weaponName ]; - var d = target.Location - self.Location; - if( weapon.Range * weapon.Range < d.X * d.X + d.Y * d.Y ) - return false; + if( weapon.Range * weapon.Range < (target.Location - self.Location).LengthSquared ) return false; // FIXME: rules specifies ROF in 1/15 sec units; ticks are 1/25 sec fireDelay = weapon.ROF;