non-turreted AutoTarget is sensible now

This commit is contained in:
Chris Forbes
2009-12-28 12:08:56 +13:00
parent 73864861e5
commit d3767f2d99
7 changed files with 31 additions and 18 deletions

View File

@@ -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<Unit>();
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; } }

View File

@@ -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<Actor> 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<int2> FindTilesInCircle(int2 a, int r)

View File

@@ -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);

View File

@@ -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<AttackBase>().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)

View File

@@ -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;

View File

@@ -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

View File

@@ -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