move ROT, InitialFacing and Speed to Mobile and Aircraft.

This commit is contained in:
alzeih
2010-07-31 02:05:54 +12:00
parent dd7008d7ee
commit 33b6f590e9
21 changed files with 144 additions and 82 deletions

View File

@@ -39,7 +39,7 @@ namespace OpenRA.Mods.RA.Activities
var desiredFacing = Util.GetFacing(d, unit.Facing);
if (unit.Altitude == cruiseAltitude)
Util.TickFacing(ref unit.Facing, desiredFacing,
self.Info.Traits.Get<UnitInfo>().ROT);
self.Info.Traits.Get<AircraftInfo>().ROT);
if (unit.Altitude < cruiseAltitude)
++unit.Altitude;

View File

@@ -44,7 +44,7 @@ namespace OpenRA.Mods.RA.Activities
var dist = target.CenterLocation - self.CenterLocation;
var desiredFacing = Util.GetFacing(dist, unit.Facing);
Util.TickFacing(ref unit.Facing, desiredFacing, self.Info.Traits.Get<UnitInfo>().ROT);
Util.TickFacing(ref unit.Facing, desiredFacing, self.Info.Traits.Get<AircraftInfo>().ROT);
var mobile = self.traits.WithInterface<IMove>().FirstOrDefault();
var rawSpeed = .2f * mobile.MovementSpeedForCell(self, self.Location);

View File

@@ -50,7 +50,7 @@ namespace OpenRA.Mods.RA.Activities
var desiredFacing = Util.GetFacing(dist, unit.Facing);
Util.TickFacing(ref unit.Facing, desiredFacing,
self.Info.Traits.Get<UnitInfo>().ROT);
self.Info.Traits.Get<AircraftInfo>().ROT);
var mobile = self.traits.WithInterface<IMove>().FirstOrDefault();
var rawSpeed = .2f * mobile.MovementSpeedForCell(self, self.Location);

View File

@@ -32,7 +32,7 @@ namespace OpenRA.Mods.RA.Activities
if (isCanceled) return NextActivity;
var dest = ChooseHelipad(self);
var initialFacing = self.Info.Traits.Get<UnitInfo>().InitialFacing;
var initialFacing = self.Info.Traits.Get<AircraftInfo>().InitialFacing;
if (dest == null)
return Util.SequenceActivities(

View File

@@ -46,7 +46,7 @@ namespace OpenRA.Mods.RA.Activities
--unit.Altitude;
var desiredFacing = Util.GetFacing(d, unit.Facing);
Util.TickFacing(ref unit.Facing, desiredFacing, self.Info.Traits.Get<UnitInfo>().ROT);
Util.TickFacing(ref unit.Facing, desiredFacing, self.Info.Traits.Get<AircraftInfo>().ROT);
var mobile = self.traits.WithInterface<IMove>().FirstOrDefault();
var speed = .2f * mobile.MovementSpeedForCell(self, self.Location);
var angle = unit.Facing / 128f * Math.PI;

View File

@@ -46,7 +46,7 @@ namespace OpenRA.Mods.RA.Activities
var speed = .2f * mobile.MovementSpeedForCell(self, self.Location);
var approachStart = landPos - new float2(unit.Altitude * speed, 0);
var turnRadius = (128f / self.Info.Traits.Get<UnitInfo>().ROT) * speed / (float)Math.PI;
var turnRadius = (128f / self.Info.Traits.Get<AircraftInfo>().ROT) * speed / (float)Math.PI;
/* work out the center points */
var fwd = -float2.FromAngle(unit.Facing / 128f * (float)Math.PI);

View File

@@ -21,24 +21,33 @@ namespace OpenRA.Mods.RA
public readonly string[] RepairBuildings = { "fix" };
[ActorReference]
public readonly string[] RearmBuildings = { "hpad", "afld" };
public readonly int InitialFacing = 128;
public readonly int ROT = 255;
public readonly int Speed = 1;
public virtual object Create( ActorInitializer init ) { return new Aircraft( init ); }
public virtual object Create( ActorInitializer init ) { return new Aircraft( init , this ); }
}
public class Aircraft : IMove, IOccupySpace
{
[Sync]
public int2 Location;
AircraftInfo Info;
public Aircraft( ActorInitializer init )
public Aircraft( ActorInitializer init , AircraftInfo info)
{
this.Location = init.location;
Info = info;
}
public int2 TopLeft
{
get { return Location; }
}
public int ROT(Actor self){ return Info.ROT; }
public int InitialFacing(Actor self){ return Info.InitialFacing; }
public void SetPosition(Actor self, int2 cell)
{
@@ -48,9 +57,8 @@ namespace OpenRA.Mods.RA
public bool AircraftCanEnter(Actor self, Actor a)
{
var aircraft = self.Info.Traits.Get<AircraftInfo>();
return aircraft.RearmBuildings.Contains( a.Info.Name )
|| aircraft.RepairBuildings.Contains( a.Info.Name );
return Info.RearmBuildings.Contains( a.Info.Name )
|| Info.RepairBuildings.Contains( a.Info.Name );
}
public virtual IEnumerable<float2> GetCurrentPath(Actor self)
@@ -67,15 +75,11 @@ namespace OpenRA.Mods.RA
public float MovementSpeedForCell(Actor self, int2 cell)
{
var unitInfo = self.Info.Traits.GetOrDefault<UnitInfo>();
if( unitInfo == null)
return 0f;
var modifier = self.traits
.WithInterface<ISpeedModifier>()
.Select(t => t.GetSpeedModifier())
.Product();
return unitInfo.Speed * modifier;
return Info.Speed * modifier;
}
int2[] noCells = new int2[] { };

View File

@@ -26,14 +26,18 @@ namespace OpenRA.Mods.RA
public readonly int IdealSeparation = 40;
public readonly bool LandWhenIdle = true;
public override object Create( ActorInitializer init ) { return new Helicopter( init ); }
public override object Create( ActorInitializer init ) { return new Helicopter( init, this); }
}
class Helicopter : Aircraft, ITick, IIssueOrder, IResolveOrder, IOrderCursor, IOrderVoice
{
public IDisposable reservation;
HelicopterInfo Info;
public Helicopter( ActorInitializer init ) : base( init ) { }
public Helicopter( ActorInitializer init, HelicopterInfo info) : base( init, info )
{
Info = info;
}
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
@@ -86,9 +90,9 @@ namespace OpenRA.Mods.RA
self.CancelActivity();
self.QueueActivity(new HeliFly(Util.CenterOfCell(order.TargetLocation)));
if (self.Info.Traits.Get<HelicopterInfo>().LandWhenIdle)
if (Info.LandWhenIdle)
{
self.QueueActivity(new Turn(self.Info.Traits.GetOrDefault<UnitInfo>().InitialFacing));
self.QueueActivity(new Turn(Info.InitialFacing));
self.QueueActivity(new HeliLand(true));
}
}
@@ -115,9 +119,9 @@ namespace OpenRA.Mods.RA
self.CancelActivity();
self.QueueActivity(new HeliFly(order.TargetActor.CenterLocation + offsetVec));
self.QueueActivity(new Turn(self.Info.Traits.GetOrDefault<UnitInfo>().InitialFacing));
self.QueueActivity(new Turn(Info.InitialFacing));
self.QueueActivity(new HeliLand(false));
self.QueueActivity(self.Info.Traits.Get<HelicopterInfo>().RearmBuildings.Contains(order.TargetActor.Info.Name)
self.QueueActivity(Info.RearmBuildings.Contains(order.TargetActor.Info.Name)
? (IActivity)new Rearm() : new Repair(order.TargetActor));
}
}
@@ -129,7 +133,6 @@ namespace OpenRA.Mods.RA
if (unit.Altitude <= 0)
return;
var Info = self.Info.Traits.Get<HelicopterInfo>();
var mobile = self.traits.WithInterface<IMove>().FirstOrDefault();
var rawSpeed = .2f * mobile.MovementSpeedForCell(self, self.Location);
var otherHelis = self.World.FindUnitsInCircle(self.CenterLocation, Info.IdealSeparation)
@@ -158,7 +161,7 @@ namespace OpenRA.Mods.RA
return float2.Zero;
var d = self.CenterLocation - h.CenterLocation;
if (d.Length > self.Info.Traits.Get<HelicopterInfo>().IdealSeparation)
if (d.Length > Info.IdealSeparation)
return float2.Zero;
if (d.LengthSquared < Epsilon)

View File

@@ -19,14 +19,14 @@ namespace OpenRA.Mods.RA
{
public class PlaneInfo : AircraftInfo
{
public override object Create( ActorInitializer init ) { return new Plane( init ); }
public override object Create( ActorInitializer init ) { return new Plane( init, this ); }
}
public class Plane : Aircraft, IIssueOrder, IResolveOrder, IOrderCursor, IOrderVoice, ITick
{
public IDisposable reservation;
public Plane( ActorInitializer init ) : base( init ) { }
public Plane( ActorInitializer init, PlaneInfo info ) : base( init, info ) { }
bool firstTick = true;
public void Tick(Actor self)