implement INudge on Mobile

This commit is contained in:
Chris Forbes
2010-07-21 19:37:24 +12:00
parent 8006e20dd3
commit 3a7bec1eef

View File

@@ -11,6 +11,8 @@
using System;
using System.Collections.Generic;
using System.Linq;
using OpenRA.Traits.Activities;
using OpenRA.FileFormats;
namespace OpenRA.Traits
{
@@ -225,7 +227,7 @@ namespace OpenRA.Traits
public IEnumerable<float2> GetCurrentPath(Actor self)
{
var move = self.GetCurrentActivity() as Activities.Move;
var move = self.GetCurrentActivity() as Move;
if (move == null || move.path == null) return new float2[] { };
return Enumerable.Reverse(move.path).Select( c => Util.CenterOfCell(c) );
@@ -243,11 +245,38 @@ namespace OpenRA.Traits
public void OnNudge(Actor self, Actor nudger)
{
/* initial fairly braindead implementation. */
if (self.Owner.Stances[nudger.Owner] != Stance.Ally)
return; /* don't allow ourselves to be pushed around
* by the enemy! */
if (self.GetCurrentActivity() is Move)
return; /* we're *already* moving; nudging isn't going to help */
// pick an adjacent available cell.
var availCells = new List<int2>();
var notStupidCells = new List<int2>();
for( var i = -1; i < 2; i++ )
for (var j = -1; j < 2; j++)
{
var p = self.Location + new int2(i, j);
if (CanEnterCell(p))
availCells.Add(p);
else
if (p != nudger.Location && p != self.Location)
notStupidCells.Add(p);
}
var moveTo = availCells.Any() ? availCells.Random(self.World.SharedRandom) :
notStupidCells.Any() ? notStupidCells.Random(self.World.SharedRandom) : (int2?)null;
if (moveTo.HasValue)
{
self.CancelActivity();
self.QueueActivity(new Move(moveTo.Value, 0));
}
}
}
}