From 4201f40f6b5e08df1c6146a61237bc3108a1208a Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Sat, 31 Oct 2009 14:46:04 +1300 Subject: [PATCH] multiple turrets; turret offsets --- OpenRa.Game/Actor.cs | 2 +- OpenRa.Game/Explosion.cs | 3 ++- OpenRa.Game/GameRules/UnitInfo.cs | 2 ++ OpenRa.Game/MainWindow.cs | 1 + OpenRa.Game/Traits/AttackTurreted.cs | 9 +++++---- OpenRa.Game/Traits/RenderUnitTurreted.cs | 7 ++++++- OpenRa.Game/Traits/Util.cs | 21 +++++++++++++++++++++ units.ini | 4 +++- 8 files changed, 41 insertions(+), 8 deletions(-) diff --git a/OpenRa.Game/Actor.cs b/OpenRa.Game/Actor.cs index 0f3441d29b..9d998a2280 100755 --- a/OpenRa.Game/Actor.cs +++ b/OpenRa.Game/Actor.cs @@ -57,7 +57,7 @@ namespace OpenRa.Game } public float2 CenterLocation; - public float2 SelectedSize { get { return Render().LastOrDefault().First.size; } } + public float2 SelectedSize { get { return Render().First().First.size; } } public IEnumerable> Render() { diff --git a/OpenRa.Game/Explosion.cs b/OpenRa.Game/Explosion.cs index 223d8efa23..dd954f7999 100644 --- a/OpenRa.Game/Explosion.cs +++ b/OpenRa.Game/Explosion.cs @@ -19,7 +19,8 @@ namespace OpenRa.Game anim = new Animation("explosion"); if (style != 0) - anim.PlayThen(style.ToString(), () => Game.world.AddFrameEndTask(w => w.Remove(this))); + anim.PlayThen(style.ToString(), + () => Game.world.AddFrameEndTask(w => w.Remove(this))); else Game.world.AddFrameEndTask(w => w.Remove(this)); } diff --git a/OpenRa.Game/GameRules/UnitInfo.cs b/OpenRa.Game/GameRules/UnitInfo.cs index ac944efdd2..10125f4007 100755 --- a/OpenRa.Game/GameRules/UnitInfo.cs +++ b/OpenRa.Game/GameRules/UnitInfo.cs @@ -47,6 +47,8 @@ namespace OpenRa.Game.GameRules public readonly int TechLevel = -1; public readonly bool WaterBound = false; public readonly string[] BuiltAt = { }; + public readonly int[] PrimaryOffset = { 0, 0 }; + public readonly int[] SecondaryOffset = null; public UnitInfo(string name) { Name = name; } diff --git a/OpenRa.Game/MainWindow.cs b/OpenRa.Game/MainWindow.cs index 5ef3e4bc74..63772bb59c 100755 --- a/OpenRa.Game/MainWindow.cs +++ b/OpenRa.Game/MainWindow.cs @@ -63,6 +63,7 @@ namespace OpenRa.Game Game.world.Add( new Actor( "mcv", Game.map.Offset + new int2( 9, 5 ), Game.players[ 0 ] ) ); Game.world.Add( new Actor( "jeep", Game.map.Offset + new int2( 9, 15 ), Game.players[ 1 ] ) ); Game.world.Add( new Actor( "3tnk", Game.map.Offset + new int2( 12, 7 ), Game.players[ 1 ] ) ); + Game.world.Add(new Actor("ca", Game.map.Offset + new int2(40, 7), Game.players[1])); sidebar = new Sidebar(renderer, Game.LocalPlayer); diff --git a/OpenRa.Game/Traits/AttackTurreted.cs b/OpenRa.Game/Traits/AttackTurreted.cs index bae3f1e05c..663da9c315 100755 --- a/OpenRa.Game/Traits/AttackTurreted.cs +++ b/OpenRa.Game/Traits/AttackTurreted.cs @@ -26,16 +26,17 @@ namespace OpenRa.Game.Traits protected void DoAttack( Actor self ) { - if( self.unitInfo.Primary != null && CheckFire( self, self.unitInfo.Primary, ref primaryFireDelay ) ) + if( self.unitInfo.Primary != null && CheckFire( self, self.unitInfo.Primary, ref primaryFireDelay, self.unitInfo.PrimaryOffset ) ) { 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, + self.unitInfo.SecondaryOffset ?? self.unitInfo.PrimaryOffset) ) return; } - bool CheckFire( Actor self, string weaponName, ref int fireDelay ) + bool CheckFire( Actor self, string weaponName, ref int fireDelay, int[] offset ) { if( fireDelay > 0 ) return false; var weapon = Rules.WeaponInfo[ weaponName ]; @@ -44,7 +45,7 @@ namespace OpenRa.Game.Traits fireDelay = weapon.ROF; Game.world.Add( new Bullet( weaponName, self.Owner, self, - self.CenterLocation.ToInt2(), + self.CenterLocation.ToInt2() + Util.GetTurretPosition( self, offset ), target.CenterLocation.ToInt2() ) ); return true; diff --git a/OpenRa.Game/Traits/RenderUnitTurreted.cs b/OpenRa.Game/Traits/RenderUnitTurreted.cs index b1b562ebf2..242df6f3e6 100644 --- a/OpenRa.Game/Traits/RenderUnitTurreted.cs +++ b/OpenRa.Game/Traits/RenderUnitTurreted.cs @@ -21,8 +21,13 @@ namespace OpenRa.Game.Traits public override IEnumerable> Render(Actor self) { var mobile = self.traits.Get(); + yield return Centered(anim.Image, self.CenterLocation); - yield return Centered(turretAnim.Image, self.CenterLocation); + yield return Centered(turretAnim.Image, self.CenterLocation + + Util.GetTurretPosition(self, self.unitInfo.PrimaryOffset).ToFloat2()); + if (self.unitInfo.SecondaryOffset != null) + yield return Centered(turretAnim.Image, self.CenterLocation + + Util.GetTurretPosition(self, self.unitInfo.SecondaryOffset).ToFloat2()); } public override void Tick(Actor self) diff --git a/OpenRa.Game/Traits/Util.cs b/OpenRa.Game/Traits/Util.cs index 32e1c5a843..e163db9cb4 100755 --- a/OpenRa.Game/Traits/Util.cs +++ b/OpenRa.Game/Traits/Util.cs @@ -53,5 +53,26 @@ namespace OpenRa.Game.Traits return facing + turn; } + + public static int2 GetTurretPosition(Actor self, int[] offset) + { + var ru = self.traits.WithInterface().FirstOrDefault(); + if (ru == null) return int2.Zero; /* things that don't have a rotating base don't need the turrets repositioned */ + + var bodyFacing = self.traits.Get().facing; + var quantizedFacing = bodyFacing - bodyFacing % ru.anim.CurrentSequence.Length; + + var angle = (quantizedFacing / 256f) * (2 * (float)Math.PI); + var sinAngle = Math.Sin(angle); + var cosAngle = Math.Cos(angle); + + var pos = new int2( + (int)(cosAngle * offset[0] + sinAngle * offset[1]), + (int)(cosAngle * offset[1] - sinAngle * offset[0])); + + pos.Y = (int)(.7f * pos.Y); + return pos; + } + } } diff --git a/units.ini b/units.ini index 35c1626bf6..dade7333aa 100755 --- a/units.ini +++ b/units.ini @@ -78,7 +78,9 @@ Traits=Mobile, RenderUnit Description=Cruiser WaterBound=yes BuiltAt=syrd -Traits=Mobile, RenderUnit +Traits=Mobile, Turreted, RenderUnitTurreted, AttackTurreted +PrimaryOffset=0,17 +SecondaryOffset=0,-17 [LST] Description=Transport WaterBound=yes