Added int subCell = -1 to IMove.MoveIntoWorld & IPositionable.SetPosition(Actor self, CPos cell)

This commit is contained in:
atlimit8
2014-07-29 14:40:22 -05:00
parent 921d77f825
commit fe57417aa8
8 changed files with 24 additions and 11 deletions

View File

@@ -182,7 +182,7 @@ namespace OpenRA.Traits
{ {
bool CanEnterCell(CPos location); bool CanEnterCell(CPos location);
bool CanEnterCell(CPos location, Actor ignoreActor, bool checkTransientActors); bool CanEnterCell(CPos location, Actor ignoreActor, bool checkTransientActors);
void SetPosition(Actor self, CPos cell); void SetPosition(Actor self, CPos cell, int subCell = -1);
void SetPosition(Actor self, WPos pos); void SetPosition(Actor self, WPos pos);
void SetVisualPosition(Actor self, WPos pos); void SetVisualPosition(Actor self, WPos pos);
} }
@@ -195,7 +195,7 @@ namespace OpenRA.Traits
Activity MoveWithinRange(Target target, WRange range); Activity MoveWithinRange(Target target, WRange range);
Activity MoveWithinRange(Target target, WRange minRange, WRange maxRange); Activity MoveWithinRange(Target target, WRange minRange, WRange maxRange);
Activity MoveFollow(Actor self, Target target, WRange minRange, WRange maxRange); Activity MoveFollow(Actor self, Target target, WRange minRange, WRange maxRange);
Activity MoveIntoWorld(Actor self, CPos cell); Activity MoveIntoWorld(Actor self, CPos cell, int subCell = -1);
Activity VisualMove(Actor self, WPos fromPos, WPos toPos); Activity VisualMove(Actor self, WPos fromPos, WPos toPos);
CPos NearestMoveableCell(CPos target); CPos NearestMoveableCell(CPos target);
bool IsMoving { get; set; } bool IsMoving { get; set; }

View File

@@ -88,8 +88,11 @@ namespace OpenRA.Traits
return FreeSubCell(a) >= 0; return FreeSubCell(a) >= 0;
} }
public int FreeSubCell(CPos a) public int FreeSubCell(CPos a, int preferredSubCell = -1)
{ {
if (preferredSubCell >= 0 && !AnyUnitsAt(a, preferredSubCell))
return preferredSubCell;
if (!AnyUnitsAt(a)) if (!AnyUnitsAt(a))
return map.SubCellDefaultIndex; return map.SubCellDefaultIndex;

View File

@@ -170,7 +170,10 @@ namespace OpenRA.Mods.RA.Air
} }
// Changes position, but not altitude // Changes position, but not altitude
public void SetPosition(Actor self, CPos cell) { SetPosition(self, self.World.Map.CenterOfCell(cell) + new WVec(0, 0, CenterPosition.Z)); } public void SetPosition(Actor self, CPos cell, int subCell = -1)
{
SetPosition(self, self.World.Map.CenterOfCell(cell) + new WVec(0, 0, CenterPosition.Z));
}
public void SetVisualPosition(Actor self, WPos pos) { SetPosition(self, pos); } public void SetVisualPosition(Actor self, WPos pos) { SetPosition(self, pos); }
public void AddedToWorld(Actor self) public void AddedToWorld(Actor self)

View File

@@ -148,7 +148,7 @@ namespace OpenRA.Mods.RA.Air
public Activity MoveFollow(Actor self, Target target, WRange minRange, WRange maxRange) { return new Follow(self, target, minRange, maxRange); } public Activity MoveFollow(Actor self, Target target, WRange minRange, WRange maxRange) { return new Follow(self, target, minRange, maxRange); }
public CPos NearestMoveableCell(CPos cell) { return cell; } public CPos NearestMoveableCell(CPos cell) { return cell; }
public Activity MoveIntoWorld(Actor self, CPos cell) public Activity MoveIntoWorld(Actor self, CPos cell, int subCell = -1)
{ {
return new HeliFly(self, Target.FromCell(self.World, cell)); return new HeliFly(self, Target.FromCell(self.World, cell));
} }

View File

@@ -127,7 +127,7 @@ namespace OpenRA.Mods.RA.Air
public Activity MoveFollow(Actor self, Target target, WRange minRange, WRange maxRange) { return new FlyFollow(self, target, minRange, maxRange); } public Activity MoveFollow(Actor self, Target target, WRange minRange, WRange maxRange) { return new FlyFollow(self, target, minRange, maxRange); }
public CPos NearestMoveableCell(CPos cell) { return cell; } public CPos NearestMoveableCell(CPos cell) { return cell; }
public Activity MoveIntoWorld(Actor self, CPos cell) { return new Fly(self, Target.FromCell(self.World, cell)); } public Activity MoveIntoWorld(Actor self, CPos cell, int subCell = -1) { return new Fly(self, Target.FromCell(self.World, cell)); }
public Activity VisualMove(Actor self, WPos fromPos, WPos toPos) { return Util.SequenceActivities(new CallFunc(() => SetVisualPosition(self, fromPos)), new Fly(self, Target.FromPos(toPos))); } public Activity VisualMove(Actor self, WPos fromPos, WPos toPos) { return Util.SequenceActivities(new CallFunc(() => SetVisualPosition(self, fromPos)), new Fly(self, Target.FromPos(toPos))); }
} }
} }

View File

@@ -116,7 +116,7 @@ namespace OpenRA.Mods.RA
public bool CanEnterCell(CPos cell) { return CanEnterCell(cell, null, true); } public bool CanEnterCell(CPos cell) { return CanEnterCell(cell, null, true); }
public void SetPosition(Actor self, CPos cell) public void SetPosition(Actor self, CPos cell, int subCell = -1)
{ {
self.World.ActorMap.RemoveInfluence(self, this); self.World.ActorMap.RemoveInfluence(self, this);
Location = cell; Location = cell;

View File

@@ -70,7 +70,7 @@ namespace OpenRA.Mods.RA
} }
public bool CanEnterCell(CPos cell) { return CanEnterCell(cell, null, true); } public bool CanEnterCell(CPos cell) { return CanEnterCell(cell, null, true); }
public void SetPosition(Actor self, CPos cell) { SetPosition(self, self.World.Map.CenterOfCell(cell)); } public void SetPosition(Actor self, CPos cell, int subCell = -1) { SetPosition(self, self.World.Map.CenterOfCell(cell)); }
public void SetVisualPosition(Actor self, WPos pos) public void SetVisualPosition(Actor self, WPos pos)
{ {

View File

@@ -258,10 +258,11 @@ namespace OpenRA.Mods.RA.Move
SetVisualPosition(self, init.Get<CenterPositionInit, WPos>()); SetVisualPosition(self, init.Get<CenterPositionInit, WPos>());
} }
public void SetPosition(Actor self, CPos cell) public void SetPosition(Actor self, CPos cell, int subCell = -1)
{ {
SetLocation(cell, fromSubCell, cell, fromSubCell); SetLocation(cell, fromSubCell, cell, fromSubCell);
SetVisualPosition(self, self.World.Map.CenterOfCell(fromCell) + self.World.Map.SubCellOffsets[fromSubCell]); SetVisualPosition(self, self.World.Map.CenterOfCell(fromCell)
+ self.World.Map.SubCellOffsets[subCell >= 0 ? subCell : fromSubCell]);
FinishedMoving(self); FinishedMoving(self);
} }
@@ -603,10 +604,16 @@ namespace OpenRA.Mods.RA.Move
Nudge(self, blocking, true); Nudge(self, blocking, true);
} }
public Activity MoveIntoWorld(Actor self, CPos cell) public Activity MoveIntoWorld(Actor self, CPos cell, int subCell = -1)
{ {
var pos = self.CenterPosition; var pos = self.CenterPosition;
subCell = self.World.ActorMap.FreeSubCell(cell, subCell);
// TODO: solve/reduce cell is full problem
if (subCell < 0)
subCell = self.World.Map.SubCellDefaultIndex;
// Reserve the exit cell // Reserve the exit cell
SetPosition(self, cell); SetPosition(self, cell);
SetVisualPosition(self, pos); SetVisualPosition(self, pos);