a pile of plane simplifications

This commit is contained in:
Chris Forbes
2010-03-27 10:40:14 +13:00
parent d2ad90aa5b
commit 2f02b5c453
9 changed files with 32 additions and 23 deletions

View File

@@ -20,6 +20,7 @@
using System; using System;
using OpenRA.Traits.Activities; using OpenRA.Traits.Activities;
using System.Drawing;
namespace OpenRA.Traits.AI namespace OpenRA.Traits.AI
{ {
@@ -34,8 +35,17 @@ namespace OpenRA.Traits.AI
var altitude = self.traits.Get<Unit>().Altitude; var altitude = self.traits.Get<Unit>().Altitude;
if (altitude == 0) return; // we're on the ground, let's stay there. if (altitude == 0) return; // we're on the ground, let's stay there.
self.QueueActivity(new ReturnToBase(self, null)); var airfield = ReturnToBase.ChooseAirfield(self);
self.QueueActivity(new Rearm()); if (airfield != null)
{
self.QueueActivity(new ReturnToBase(self, airfield));
self.QueueActivity(new Rearm());
}
else
{
Game.chat.AddLine(Color.White, "Debug", "Plane has nowhere to land; flying away");
self.QueueActivity(new FlyOffMap());
}
} }
} }
} }

View File

@@ -38,7 +38,7 @@ namespace OpenRA.Traits.Activities
return Util.SequenceActivities( return Util.SequenceActivities(
new Fly(Target.CenterLocation), new Fly(Target.CenterLocation),
new FlyTimed(50, 20), new FlyTimed(50),
this); this);
} }
@@ -60,7 +60,7 @@ namespace OpenRA.Traits.Activities
return Util.SequenceActivities( return Util.SequenceActivities(
new Fly(Util.CenterOfCell(Target)), new Fly(Util.CenterOfCell(Target)),
new FlyTimed(50, 20), new FlyTimed(50),
this); this);
} }

View File

@@ -26,12 +26,12 @@ namespace OpenRA.Traits.Activities
{ {
public IActivity NextActivity { get; set; } public IActivity NextActivity { get; set; }
int remainingTicks; int remainingTicks;
int targetAltitude;
public FlyTimed(int ticks, int targetAltitude) { remainingTicks = ticks; this.targetAltitude = targetAltitude; } public FlyTimed(int ticks) { remainingTicks = ticks; }
public IActivity Tick(Actor self) public IActivity Tick(Actor self)
{ {
var targetAltitude = self.Info.Traits.Get<PlaneInfo>().CruiseAltitude;
if (remainingTicks-- == 0) return NextActivity; if (remainingTicks-- == 0) return NextActivity;
FlyUtil.Fly(self, targetAltitude); FlyUtil.Fly(self, targetAltitude);
return this; return this;
@@ -43,19 +43,25 @@ namespace OpenRA.Traits.Activities
public class FlyOffMap : IActivity public class FlyOffMap : IActivity
{ {
public IActivity NextActivity { get; set; } public IActivity NextActivity { get; set; }
readonly int targetAltitude;
bool isCanceled; bool isCanceled;
public bool Interruptible = true;
public FlyOffMap(int targetAltitude) { this.targetAltitude = targetAltitude; }
public IActivity Tick(Actor self) public IActivity Tick(Actor self)
{ {
var targetAltitude = self.Info.Traits.Get<PlaneInfo>().CruiseAltitude;
if (isCanceled || !self.World.Map.IsInMap(self.Location)) return NextActivity; if (isCanceled || !self.World.Map.IsInMap(self.Location)) return NextActivity;
FlyUtil.Fly(self, targetAltitude); FlyUtil.Fly(self, targetAltitude);
return this; return this;
} }
public void Cancel(Actor self) { isCanceled = true; NextActivity = null; } public void Cancel(Actor self)
{
if (Interruptible)
{
isCanceled = true;
NextActivity = null;
}
}
} }
} }

View File

@@ -34,17 +34,12 @@ namespace OpenRA.Traits.Activities
float2 w1, w2, w3; /* tangent points to turn circles */ float2 w1, w2, w3; /* tangent points to turn circles */
float2 landPoint; float2 landPoint;
Actor ChooseAirfield(Actor self) public static Actor ChooseAirfield(Actor self)
{ {
var airfield = self.World.Queries.OwnedBy[self.Owner] return self.World.Queries.OwnedBy[self.Owner]
.Where(a => a.Info.Name == "afld" .Where(a => a.Info.Name == "afld"
&& !Reservable.IsReserved(a)) && !Reservable.IsReserved(a))
.FirstOrDefault(); .FirstOrDefault();
if (airfield == null)
throw new NotImplementedException("nowhere to land; what to do?");
return airfield;
} }
void Calculate(Actor self) void Calculate(Actor self)

View File

@@ -35,8 +35,6 @@ namespace OpenRA.Traits
{ {
target = order.TargetActor; target = order.TargetActor;
self.QueueActivity(new FlyAttack(order.TargetActor)); self.QueueActivity(new FlyAttack(order.TargetActor));
self.QueueActivity(new ReturnToBase(self, null));
self.QueueActivity(new Rearm());
} }
} }
} }

View File

@@ -73,8 +73,6 @@ namespace OpenRA.Traits
{ {
self.CancelActivity(); self.CancelActivity();
self.QueueActivity(new Fly(Util.CenterOfCell(order.TargetLocation))); self.QueueActivity(new Fly(Util.CenterOfCell(order.TargetLocation)));
self.QueueActivity(new ReturnToBase(self, null));
self.QueueActivity(new Rearm());
} }
if (order.OrderString == "Enter") if (order.OrderString == "Enter")

View File

@@ -74,7 +74,7 @@ namespace OpenRA.Mods.RA
void FinishedDropping(Actor self) void FinishedDropping(Actor self)
{ {
self.CancelActivity(); self.CancelActivity();
self.QueueActivity(new FlyOffMap(20)); self.QueueActivity(new FlyOffMap { Interruptible = false });
self.QueueActivity(new RemoveSelf()); self.QueueActivity(new RemoveSelf());
} }
} }

View File

@@ -60,7 +60,7 @@ namespace OpenRA.Mods.RA
plane.QueueActivity(new CallFunc( plane.QueueActivity(new CallFunc(
() => Owner.Shroud.Explore(Owner.World, order.TargetLocation, () => Owner.Shroud.Explore(Owner.World, order.TargetLocation,
(Info as SpyPlanePowerInfo).Range))); (Info as SpyPlanePowerInfo).Range)));
plane.QueueActivity(new FlyOffMap(20)); plane.QueueActivity(new FlyOffMap { Interruptible = false });
plane.QueueActivity(new RemoveSelf()); plane.QueueActivity(new RemoveSelf());
} }
} }

View File

@@ -1149,6 +1149,7 @@ MIG:
LimitedAmmo: LimitedAmmo:
Ammo: 3 Ammo: 3
IronCurtainable: IronCurtainable:
ReturnOnIdle:
YAK: YAK:
Inherits: ^Plane Inherits: ^Plane
@@ -1177,6 +1178,7 @@ YAK:
LimitedAmmo: LimitedAmmo:
Ammo: 15 Ammo: 15
IronCurtainable: IronCurtainable:
ReturnOnIdle:
TRAN: TRAN:
Inherits: ^Plane Inherits: ^Plane