wired up so it actually works

This commit is contained in:
Chris Forbes
2009-12-29 21:08:23 +13:00
parent 8fc8d0d9c7
commit f061c82f4c
4 changed files with 91 additions and 2 deletions

View File

@@ -114,6 +114,7 @@
<Compile Include="Traits\Activities\Demolish.cs" />
<Compile Include="Traits\Activities\Fly.cs" />
<Compile Include="Traits\Activities\FlyTimed.cs" />
<Compile Include="Traits\Activities\HeliAttack.cs" />
<Compile Include="Traits\Activities\HeliFly.cs" />
<Compile Include="Traits\Activities\HeliLand.cs" />
<Compile Include="Traits\Activities\IActivity.cs" />
@@ -175,6 +176,7 @@
<Compile Include="Traits\APMine.cs" />
<Compile Include="Traits\ATMine.cs" />
<Compile Include="Traits\AttackBase.cs" />
<Compile Include="Traits\AttackHeli.cs" />
<Compile Include="Traits\AttackInfo.cs" />
<Compile Include="Traits\AttackTurreted.cs" />
<Compile Include="Traits\AutoHeal.cs" />

View File

@@ -0,0 +1,52 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace OpenRa.Game.Traits.Activities
{
class HeliAttack : IActivity
{
Actor target;
const int CruiseAltitude = 20;
public HeliAttack( Actor target ) { this.target = target; }
public IActivity NextActivity { get; set; }
public IActivity Tick(Actor self)
{
if (target == null || target.IsDead)
return NextActivity;
var limitedAmmo = self.traits.GetOrDefault<LimitedAmmo>();
if (limitedAmmo != null && !limitedAmmo.HasAmmo())
return NextActivity;
var unit = self.traits.Get<Unit>();
if (unit.Altitude != CruiseAltitude)
{
unit.Altitude += Math.Sign(CruiseAltitude - unit.Altitude);
return this;
}
var range = Rules.WeaponInfo[ self.Info.Primary ].Range;
var dist = target.CenterLocation - self.CenterLocation;
var desiredFacing = Util.GetFacing(dist, unit.Facing);
Util.TickFacing(ref unit.Facing, desiredFacing, self.Info.ROT);
if (!float2.WithinEpsilon(float2.Zero, dist, range * Game.CellSize))
{
var rawSpeed = .2f * Util.GetEffectiveSpeed(self);
self.CenterLocation += (rawSpeed / dist.Length) * dist;
self.Location = ((1 / 24f) * self.CenterLocation).ToInt2();
}
/* todo: maintain seperation wrt other helis */
return this;
}
public void Cancel(Actor self) { target = null; NextActivity = null; }
}
}

View File

@@ -0,0 +1,35 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OpenRa.Game.Traits.Activities;
namespace OpenRa.Game.Traits
{
class AttackHeli : AttackBase
{
public AttackHeli(Actor self) : base(self) { }
const int facingTolerance = 20;
public override void Tick(Actor self)
{
base.Tick(self);
if (target == null) return;
var unit = self.traits.Get<Unit>();
var facingToTarget = Util.GetFacing(target.CenterLocation - self.CenterLocation, unit.Facing);
if (Math.Abs(facingToTarget - unit.Facing) % 256 < facingTolerance)
DoAttack(self);
}
protected override void QueueAttack(Actor self, Order order)
{
self.CancelActivity();
self.QueueActivity(new HeliAttack(order.TargetActor));
target = order.TargetActor;
// todo: fly home
}
}
}

View File

@@ -185,14 +185,14 @@ LongDesc=Fast Infantry Transport Helicopter.\n Unarmed
[HELI]
Description=Longbow
BuiltAt=hpad
Traits=Unit, Helicopter, RenderUnitRotor, WithShadow, LimitedAmmo
Traits=Unit, AttackHeli, Helicopter, RenderUnitRotor, WithShadow, LimitedAmmo
PrimaryOffset=0,0,0,-2
InitialFacing=20
LongDesc=Helicopter Gunship with AG Missiles.\n Strong vs Buildings, Tanks\n Weak vs Infantry
[HIND]
Description=Hind
BuiltAt=hpad
Traits=Unit, Helicopter, RenderUnitRotor, WithShadow, LimitedAmmo
Traits=Unit, AttackHeli, Helicopter, RenderUnitRotor, WithShadow, LimitedAmmo
InitialFacing=20
LongDesc=Helicopter Gunship with Chainguns.\n Strong vs Infantry, Light Vehicles.\n Weak vs Tanks