split ITeleportable off as a base interface from IMove; Crate no longer pretends to be moveable.

This commit is contained in:
Chris Forbes
2010-07-29 18:15:40 +12:00
parent 2be6cf35ac
commit e325b5954c
5 changed files with 20 additions and 22 deletions

View File

@@ -121,7 +121,7 @@ namespace OpenRA.Traits
{
if (order.OrderString == "Move")
{
if (self.traits.GetOrDefault<IMove>().CanEnterCell(order.TargetLocation))
if (CanEnterCell(order.TargetLocation))
{
if (self.Owner == self.World.LocalPlayer)
self.World.AddFrameEndTask(w =>

View File

@@ -99,13 +99,18 @@ namespace OpenRA.Traits
public interface IPaletteModifier { void AdjustPalette(Bitmap b); }
public interface IPips { IEnumerable<PipType> GetPips(Actor self); }
public interface ITags { IEnumerable<TagType> GetTags(); }
public interface IMove
public interface ITeleportable /* crap name! */
{
bool CanEnterCell(int2 location);
void SetPosition(Actor self, int2 cell);
}
public interface IMove : ITeleportable
{
float MovementCostForCell(Actor self, int2 cell);
float MovementSpeedForCell(Actor self, int2 cell);
IEnumerable<float2> GetCurrentPath(Actor self);
void SetPosition(Actor self, int2 cell);
}
public interface IOffsetCenterLocation { float2 CenterOffset { get; } }

View File

@@ -31,12 +31,12 @@ namespace OpenRA.Mods.RA
class CrateInfo : ITraitInfo, ITraitPrerequisite<RenderSimpleInfo>
{
public readonly int Lifetime = 5; // Seconds
public readonly string[] TerrainTypes = {};
public readonly string[] TerrainTypes = { };
public object Create(ActorInitializer init) { return new Crate(init, this); }
}
// IMove is required for paradrop
class Crate : ITick, IOccupySpace, IMove
// ITeleportable is required for paradrop
class Crate : ITick, IOccupySpace, ITeleportable
{
readonly Actor self;
[Sync]
@@ -81,30 +81,23 @@ namespace OpenRA.Mods.RA
}
if (++ticks >= self.Info.Traits.Get<CrateInfo>().Lifetime * 25)
self.World.AddFrameEndTask(w => w.Remove(self));
self.World.AddFrameEndTask(w => w.Remove(self));
var seq = self.World.GetTerrainInfo(cell).IsWater ? "water" : "idle";
if (seq != self.traits.Get<RenderSimple>().anim.CurrentSequence.Name)
self.traits.Get<RenderSimple>().anim.PlayRepeating(seq);
}
public int2 TopLeft {get { return Location; }}
public int2 TopLeft { get { return Location; } }
int2[] noCells = new int2[] { };
public IEnumerable<int2> OccupiedCells() { return noCells; }
public bool CanEnterCell(int2 cell) { return MovementCostForCell(self, cell) < float.PositiveInfinity; }
public float MovementCostForCell(Actor self, int2 cell)
public bool CanEnterCell(int2 cell)
{
if (!self.World.Map.IsInMap(cell.X,cell.Y))
return float.PositiveInfinity;
if (!self.World.Map.IsInMap(cell.X, cell.Y)) return false;
var type = self.World.GetTerrainType(cell);
return Info.TerrainTypes.Contains(type) ? 0f : float.PositiveInfinity;
return Info.TerrainTypes.Contains(type);
}
public float MovementSpeedForCell(Actor self, int2 cell) { return 1; }
public IEnumerable<float2> GetCurrentPath(Actor self) { return new float2[] {}; }
public void SetPosition(Actor self, int2 cell)
{

View File

@@ -59,7 +59,7 @@ namespace OpenRA.Mods.RA.Effects
var loc = Traits.Util.CellContaining(location);
cargo.CancelActivity();
var mobile = cargo.traits.WithInterface<IMove>().FirstOrDefault();
var mobile = cargo.traits.GetOrDefault<ITeleportable>();
if (mobile != null)
mobile.SetPosition(cargo, loc);

View File

@@ -67,9 +67,9 @@ namespace OpenRA.Mods.RA
}
}
bool IsSuitableCell(Actor self, int2 p)
bool IsSuitableCell(Actor actorToDrop, int2 p)
{
return self.traits.WithInterface<IMove>().FirstOrDefault().CanEnterCell(p);
return actorToDrop.traits.Get<ITeleportable>().CanEnterCell(p);
}
void FinishedDropping(Actor self)