attack if in range of any cell of a building

This commit is contained in:
Bob
2010-11-03 21:06:55 +13:00
committed by Chris Forbes
parent c3fc7b98f3
commit 50b1ba3acc
8 changed files with 56 additions and 7 deletions

View File

@@ -10,7 +10,8 @@
using System.Drawing; using System.Drawing;
using OpenRA.Graphics; using OpenRA.Graphics;
using System.Linq; using System.Linq;
using System.Collections.Generic;
namespace OpenRA.Traits namespace OpenRA.Traits
{ {
@@ -31,6 +32,11 @@ namespace OpenRA.Traits
public virtual string[] TargetTypes public virtual string[] TargetTypes
{ {
get { return Info.TargetTypes;} get { return Info.TargetTypes;}
}
public virtual IEnumerable<int2> TargetableSquares( Actor self )
{
yield return self.Location;
} }
} }
} }

View File

@@ -45,7 +45,7 @@ namespace OpenRA.Mods.RA.Activities
var mobile = self.Trait<Mobile>(); var mobile = self.Trait<Mobile>();
var targetCell = Util.CellContaining(Target.CenterLocation); var targetCell = Util.CellContaining(Target.CenterLocation);
if ((targetCell - self.Location).LengthSquared >= Range * Range) if (!Combat.IsInRange( self.CenterLocation, Range, Util.CenterOfCell(targetCell)))
return Util.SequenceActivities( mobile.MoveTo( Target, Range ), this ); return Util.SequenceActivities( mobile.MoveTo( Target, Range ), this );
var desiredFacing = Util.GetFacing((targetCell - self.Location).ToFloat2(), 0); var desiredFacing = Util.GetFacing((targetCell - self.Location).ToFloat2(), 0);

View File

@@ -32,8 +32,7 @@ namespace OpenRA.Mods.RA
if (IsLeaping) return; if (IsLeaping) return;
var weapon = self.Trait<AttackBase>().Weapons[0].Info; var weapon = self.Trait<AttackBase>().Weapons[0].Info;
if (weapon.Range * Game.CellSize * weapon.Range * Game.CellSize if( !Combat.IsInRange( self.CenterLocation, weapon.Range, target.Actor ) ) return;
< (target.CenterLocation - self.CenterLocation).LengthSquared) return;
self.CancelActivity(); self.CancelActivity();
self.QueueActivity(new Leap(self, target)); self.QueueActivity(new Leap(self, target));

View File

@@ -219,5 +219,20 @@ namespace OpenRA.Mods.RA
return Util.RotateVectorByFacing(barrel.Position, turretFacing, .7f); return Util.RotateVectorByFacing(barrel.Position, turretFacing, .7f);
} }
public static bool IsInRange( float2 attackOrigin, float range, Actor target )
{
var rsq = range * range * Game.CellSize * Game.CellSize;
foreach( var cell in target.Trait<Targetable>().TargetableSquares( target ) )
if( ( attackOrigin - cell * Game.CellSize ).LengthSquared < rsq )
return true;
return false;
}
public static bool IsInRange( float2 attackOrigin, float range, float2 targetLocation )
{
var rsq = range * range * Game.CellSize * Game.CellSize;
return ( attackOrigin - targetLocation ).LengthSquared < rsq;
}
} }
} }

View File

@@ -221,6 +221,7 @@
<Compile Include="SupportPowers\SupportPower.cs" /> <Compile Include="SupportPowers\SupportPower.cs" />
<Compile Include="TakeCover.cs" /> <Compile Include="TakeCover.cs" />
<Compile Include="TargetableAircraft.cs" /> <Compile Include="TargetableAircraft.cs" />
<Compile Include="TargetableBuilding.cs" />
<Compile Include="TeslaInstantKills.cs" /> <Compile Include="TeslaInstantKills.cs" />
<Compile Include="Crates\ResetRadarCrateAction.cs" /> <Compile Include="Crates\ResetRadarCrateAction.cs" />
<Compile Include="ThrowsParticles.cs" /> <Compile Include="ThrowsParticles.cs" />

View File

@@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OpenRA.Traits;
namespace OpenRA.Mods.RA
{
class TargetableBuildingInfo : TargetableInfo, ITraitPrerequisite<BuildingInfo>
{
public override object Create( ActorInitializer init ) { return new TargetableBuilding( this ); }
}
class TargetableBuilding : Targetable
{
public TargetableBuilding( TargetableBuildingInfo info )
: base( info )
{
}
public override IEnumerable<int2> TargetableSquares( Actor self )
{
return self.Trait<Building>().OccupiedCells();
}
}
}

View File

@@ -102,8 +102,10 @@ namespace OpenRA.Mods.RA
if (limitedAmmo != null && !limitedAmmo.HasAmmo()) if (limitedAmmo != null && !limitedAmmo.HasAmmo())
return; return;
if (Info.Range * Info.Range * Game.CellSize * Game.CellSize if( target.IsActor && !Combat.IsInRange( self.CenterLocation, Info.Range, target.Actor ) )
< (target.CenterLocation - self.CenterLocation).LengthSquared) return; return;
else if( !target.IsActor && !Combat.IsInRange( self.CenterLocation, Info.Range, target.CenterLocation ) )
return;
if (Info.MinRange * Info.MinRange * Game.CellSize * Game.CellSize > if (Info.MinRange * Info.MinRange * Game.CellSize * Game.CellSize >
(target.CenterLocation - self.CenterLocation).LengthSquared) return; (target.CenterLocation - self.CenterLocation).LengthSquared) return;

View File

@@ -125,7 +125,7 @@
AppearsOnRadar: AppearsOnRadar:
Selectable: Selectable:
Priority: 3 Priority: 3
Targetable: TargetableBuilding:
TargetTypes: Ground TargetTypes: Ground
Building: Building:
Dimensions: 1,1 Dimensions: 1,1