diff --git a/OpenRa.Game/Actor.cs b/OpenRa.Game/Actor.cs index 781b65b96f..1091e3a71a 100755 --- a/OpenRa.Game/Actor.cs +++ b/OpenRa.Game/Actor.cs @@ -106,19 +106,18 @@ namespace OpenRa.Game .FirstOrDefault( x => x != null ); } - public RectangleF Bounds + public RectangleF GetBounds(bool useAltitude) { - get + var size = SelectedSize; + var loc = CenterLocation - 0.5f * size; + + if (useAltitude) { - var size = SelectedSize; - var loc = CenterLocation - 0.5f * size; var unit = traits.GetOrDefault(); - - if (unit != null) - loc -= new float2(0, unit.Altitude); - - return new RectangleF(loc.X, loc.Y, size.X, size.Y); + if (unit != null) loc -= new float2(0, unit.Altitude); } + + return new RectangleF(loc.X, loc.Y, size.X, size.Y); } public bool IsDead { get { return Health <= 0; } } diff --git a/OpenRa.Game/Game.cs b/OpenRa.Game/Game.cs index fc88c0922a..7be0cad8fd 100644 --- a/OpenRa.Game/Game.cs +++ b/OpenRa.Game/Game.cs @@ -269,13 +269,19 @@ namespace OpenRa.Game var rect = new RectangleF(min.X, min.Y, max.X - min.X, max.Y - min.Y); return world.Actors - .Where(x => x.Bounds.IntersectsWith(rect)); + .Where(x => x.GetBounds(true).IntersectsWith(rect)); } public static IEnumerable FindUnitsInCircle(float2 a, float r) { - return FindUnits(a - new float2(r, r), a + new float2(r, r)) - .Where(x => (x.CenterLocation - a).LengthSquared < r * r); + var min = a - new float2(r, r); + var max = a + new float2(r, r); + + var rect = new RectangleF(min.X, min.Y, max.X - min.X, max.Y - min.Y); + + var inBox = world.Actors.Where(x => x.GetBounds(false).IntersectsWith(rect)); + + return inBox.Where(x => (x.CenterLocation - a).LengthSquared < r * r); } public static IEnumerable FindTilesInCircle(int2 a, int r) diff --git a/OpenRa.Game/Graphics/WorldRenderer.cs b/OpenRa.Game/Graphics/WorldRenderer.cs index e155bbf7c4..65032fcacb 100644 --- a/OpenRa.Game/Graphics/WorldRenderer.cs +++ b/OpenRa.Game/Graphics/WorldRenderer.cs @@ -111,7 +111,7 @@ namespace OpenRa.Game.Graphics public void DrawSelectionBox(Actor selectedUnit, Color c, bool drawHealthBar) { - var bounds = selectedUnit.Bounds; + var bounds = selectedUnit.GetBounds(true); var xy = new float2(bounds.Left, bounds.Top); var Xy = new float2(bounds.Right, bounds.Top); diff --git a/OpenRa.Game/Traits/AutoTarget.cs b/OpenRa.Game/Traits/AutoTarget.cs index 77ad306377..2f84497eb5 100644 --- a/OpenRa.Game/Traits/AutoTarget.cs +++ b/OpenRa.Game/Traits/AutoTarget.cs @@ -16,16 +16,23 @@ namespace OpenRa.Game.Traits attack.ResolveOrder(self, new Order("Attack", self, target, int2.Zero, null)); } + float GetMaximumRange(Actor self) + { + return new[] { self.Info.Primary, self.Info.Secondary } + .Where(w => w != null) + .Max(w => Rules.WeaponInfo[w].Range); + } + public void Tick(Actor self) { if (!self.IsIdle) return; var attack = self.traits.WithInterface().First(); - var range = Rules.WeaponInfo[self.Info.Primary].Range; + var range = GetMaximumRange(self); if (attack.target == null || (attack.target.Location - self.Location).LengthSquared > range * range + 2) - attack.target = ChooseTarget(self, range); + AttackTarget(self, ChooseTarget(self, range)); } Actor ChooseTarget(Actor self, float range) diff --git a/OpenRa.Game/Traits/RenderBuildingWarFactory.cs b/OpenRa.Game/Traits/RenderBuildingWarFactory.cs index 40ccaf25e9..3b34f837d7 100644 --- a/OpenRa.Game/Traits/RenderBuildingWarFactory.cs +++ b/OpenRa.Game/Traits/RenderBuildingWarFactory.cs @@ -35,7 +35,7 @@ namespace OpenRa.Game.Traits { if (doneBuilding) roof.Tick(); - var b = self.Bounds; + var b = self.GetBounds(false); if (isOpen && !Game.UnitInfluence.GetUnitsAt(((1/24f) * self.CenterLocation).ToInt2()).Any()) { isOpen = false; diff --git a/doc/progress.txt b/doc/progress.txt index be4e61b168..6397443e03 100644 --- a/doc/progress.txt +++ b/doc/progress.txt @@ -8,7 +8,7 @@ E3 AA weapon doesn't work. E4 Flamer origin is wrong E6 Capture action missing, repair action missing E7 C4 action missing -MEDI Heal doesn't work +MEDI Heal targeting is wrong SPY Infiltrate action missing THF Steal action missing C1,C2,Einstein,Kosygin Not implemented diff --git a/session.ini b/session.ini index ac2d39b77d..520eedf061 100644 --- a/session.ini +++ b/session.ini @@ -6,5 +6,6 @@ [UNITS] s0=Multi0,mcv,600,2841,0,Guard,None s1=Multi2,mcv,600,12445,0,Guard,None -s2=Multi1,mcv,600,12505,0,Guard,None +;s2=Multi1,mcv,600,12505,0,Guard,None +s2=Multi1,e3,600,12505,0,Guard,None s3=Multi3,mcv,600,2910,0,Guard,None \ No newline at end of file