lots of heli fixes

This commit is contained in:
Chris Forbes
2009-12-31 11:17:28 +13:00
parent d52c7fba0b
commit 0edadeb7af
5 changed files with 43 additions and 20 deletions

View File

@@ -31,8 +31,12 @@ namespace OpenRa.Game.Traits.Activities
}
var dist = Dest - self.CenterLocation;
if (float2.WithinEpsilon(float2.Zero, dist, 10))
if (float2.WithinEpsilon(float2.Zero, dist, 2))
{
self.CenterLocation = Dest;
self.Location = ((1 / 24f) * self.CenterLocation).ToInt2();
return NextActivity;
}
var desiredFacing = Util.GetFacing(dist, unit.Facing);
Util.TickFacing(ref unit.Facing, desiredFacing, self.Info.ROT);

View File

@@ -16,18 +16,12 @@ namespace OpenRa.Game.Traits.Activities
float2 w1, w2, w3; /* tangent points to turn circles */
float2 landPoint;
static bool IsReserved(Actor a)
{
var res = a.traits.GetOrDefault<Reservable>();
return res != null && res.IsReserved;
}
Actor ChooseAirfield(Actor self)
{
var airfield = Game.world.Actors
.Where(a => a.Info == Rules.UnitInfo["AFLD"] /* todo: generalize this */
&& a.Owner == self.Owner
&& !IsReserved(a))
&& !Reservable.IsReserved(a))
.FirstOrDefault();
if (airfield == null)

View File

@@ -1,9 +1,11 @@
using OpenRa.Game.Traits.Activities;
using System;
namespace OpenRa.Game.Traits
{
class Helicopter : IOrder, IMovement
{
public IDisposable reservation;
public Helicopter(Actor self) {}
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor)
@@ -13,17 +15,43 @@ namespace OpenRa.Game.Traits
if (underCursor == null)
return new Order("Move", self, null, xy, null);
if (underCursor.Info == Rules.UnitInfo["HPAD"]
&& underCursor.Owner == self.Owner
&& !Reservable.IsReserved(underCursor))
return new Order("Enter", self, underCursor, int2.Zero, null);
return null;
}
public void ResolveOrder( Actor self, Order order )
{
if (reservation != null)
{
reservation.Dispose();
reservation = null;
}
if (order.OrderString == "Move")
{
self.CancelActivity();
self.QueueActivity(new HeliFly(Util.CenterOfCell(order.TargetLocation)));
self.QueueActivity(new Turn(self.Info.InitialFacing));
self.QueueActivity(new HeliLand(true));
}
if (order.OrderString == "Enter")
{
if (Reservable.IsReserved(order.TargetActor)) return;
var res = order.TargetActor.traits.GetOrDefault<Reservable>();
if (res != null)
reservation = res.Reserve(self);
self.CancelActivity();
self.QueueActivity(new HeliFly(order.TargetActor.CenterLocation));
self.QueueActivity(new Turn(self.Info.InitialFacing));
self.QueueActivity(new HeliLand(false));
self.QueueActivity(new Rearm());
}
}
public UnitMovementType GetMovementType() { return UnitMovementType.Fly; }

View File

@@ -19,14 +19,9 @@ namespace OpenRa.Game.Traits
return new Order("Move", self, null, xy, null);
if (underCursor.Info == Rules.UnitInfo["AFLD"]
&& underCursor.Owner == self.Owner)
{
var res = underCursor.traits.GetOrDefault<Reservable>();
if (res != null && res.IsReserved)
return null;
&& underCursor.Owner == self.Owner
&& !Reservable.IsReserved(underCursor))
return new Order("Enter", self, underCursor, int2.Zero, null);
}
return null;
}
@@ -49,12 +44,10 @@ namespace OpenRa.Game.Traits
if (order.OrderString == "Enter")
{
if (Reservable.IsReserved(order.TargetActor)) return;
var res = order.TargetActor.traits.GetOrDefault<Reservable>();
if (res != null)
{
if (res.IsReserved) return;
reservation = res.Reserve(self);
}
self.CancelActivity();
self.QueueActivity(new ReturnToBase(self, order.TargetActor));

View File

@@ -7,8 +7,6 @@ namespace OpenRa.Game.Traits
public Reservable(Actor self) { }
Actor reservedFor;
public bool IsReserved { get { return reservedFor != null; } }
public void Tick(Actor self)
{
if (reservedFor == null)
@@ -22,5 +20,11 @@ namespace OpenRa.Game.Traits
reservedFor = forActor;
return new DisposableAction(() => reservedFor = null);
}
public static bool IsReserved(Actor a)
{
var res = a.traits.GetOrDefault<Reservable>();
return res != null && res.reservedFor != null;
}
}
}