unit movement debug overlay + working blocking. still needs repath in some cases.
This commit is contained in:
@@ -48,7 +48,9 @@ namespace OpenRa.Game
|
|||||||
|
|
||||||
bool windowed = !settings.GetValue("fullscreen", false);
|
bool windowed = !settings.GetValue("fullscreen", false);
|
||||||
renderer = new Renderer(this, GetResolution(settings), windowed);
|
renderer = new Renderer(this, GetResolution(settings), windowed);
|
||||||
SheetBuilder.Initialize(renderer);
|
SheetBuilder.Initialize(renderer);
|
||||||
|
|
||||||
|
UiOverlay.ShowUnitDebug = settings.GetValue("udebug", false);
|
||||||
|
|
||||||
Game.Initialize(settings.GetValue("map", "scg11eb.ini"), renderer, new int2(ClientSize),
|
Game.Initialize(settings.GetValue("map", "scg11eb.ini"), renderer, new int2(ClientSize),
|
||||||
settings.GetValue("player", 1));
|
settings.GetValue("player", 1));
|
||||||
|
|||||||
@@ -125,7 +125,7 @@ namespace OpenRa.Game.Traits
|
|||||||
float2 from, to;
|
float2 from, to;
|
||||||
int fromFacing, toFacing;
|
int fromFacing, toFacing;
|
||||||
|
|
||||||
Action<Actor, Mobile> OnComplete;
|
Func<Actor, Mobile, bool> OnComplete;
|
||||||
|
|
||||||
public MoveTo( int2 destination )
|
public MoveTo( int2 destination )
|
||||||
{
|
{
|
||||||
@@ -185,19 +185,28 @@ namespace OpenRa.Game.Traits
|
|||||||
}
|
}
|
||||||
|
|
||||||
void TickMove( Actor self, Mobile mobile )
|
void TickMove( Actor self, Mobile mobile )
|
||||||
{
|
{
|
||||||
|
var oldFraction = moveFraction;
|
||||||
|
var oldTotal = moveFractionTotal;
|
||||||
|
|
||||||
moveFraction += ( self.unitInfo as UnitInfo.MobileInfo ).Speed;
|
moveFraction += ( self.unitInfo as UnitInfo.MobileInfo ).Speed;
|
||||||
UpdateCenterLocation( self, mobile, (float)moveFraction / moveFractionTotal );
|
UpdateCenterLocation( self, mobile );
|
||||||
if( moveFraction >= moveFractionTotal )
|
if( moveFraction >= moveFractionTotal )
|
||||||
{
|
{
|
||||||
moveFraction -= moveFractionTotal;
|
moveFraction -= moveFractionTotal;
|
||||||
OnComplete( self, mobile );
|
if (!OnComplete(self, mobile))
|
||||||
|
{
|
||||||
|
moveFraction = oldFraction;
|
||||||
|
moveFractionTotal = oldTotal;
|
||||||
|
UpdateCenterLocation(self, mobile );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdateCenterLocation( Actor self, Mobile mobile, float frac )
|
void UpdateCenterLocation( Actor self, Mobile mobile )
|
||||||
{
|
{
|
||||||
|
var frac = (float)moveFraction / moveFractionTotal;
|
||||||
|
|
||||||
self.CenterLocation = float2.Lerp( from, to, frac );
|
self.CenterLocation = float2.Lerp( from, to, frac );
|
||||||
if( moveFraction >= moveFractionTotal )
|
if( moveFraction >= moveFractionTotal )
|
||||||
mobile.facing = toFacing & 0xFF;
|
mobile.facing = toFacing & 0xFF;
|
||||||
@@ -221,13 +230,16 @@ namespace OpenRa.Game.Traits
|
|||||||
return 0.5f * ( CenterOfCell( from ) + CenterOfCell( to ) );
|
return 0.5f * ( CenterOfCell( from ) + CenterOfCell( to ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnCompleteFirstHalf( Actor self, Mobile mobile )
|
bool OnCompleteFirstHalf( Actor self, Mobile mobile )
|
||||||
{
|
{
|
||||||
if( path.Count > 0 )
|
if( path.Count > 0 )
|
||||||
{
|
{
|
||||||
var nextCell = path[ path.Count - 1 ];
|
var nextCell = path[ path.Count - 1 ];
|
||||||
if( ( nextCell - mobile.toCell ) != ( mobile.toCell - mobile.fromCell ) )
|
if( ( nextCell - mobile.toCell ) != ( mobile.toCell - mobile.fromCell ) )
|
||||||
{
|
{
|
||||||
|
if (!CanEnterCell(nextCell, self))
|
||||||
|
return false;
|
||||||
|
|
||||||
path.RemoveAt( path.Count - 1 );
|
path.RemoveAt( path.Count - 1 );
|
||||||
from = BetweenCells( mobile.fromCell, mobile.toCell );
|
from = BetweenCells( mobile.fromCell, mobile.toCell );
|
||||||
to = BetweenCells( mobile.toCell, nextCell );
|
to = BetweenCells( mobile.toCell, nextCell );
|
||||||
@@ -237,8 +249,9 @@ namespace OpenRa.Game.Traits
|
|||||||
fromFacing = mobile.facing;
|
fromFacing = mobile.facing;
|
||||||
toFacing = Util.GetNearestFacing( fromFacing,
|
toFacing = Util.GetNearestFacing( fromFacing,
|
||||||
Util.GetFacing( mobile.toCell-mobile.fromCell, fromFacing ) );
|
Util.GetFacing( mobile.toCell-mobile.fromCell, fromFacing ) );
|
||||||
OnComplete = OnCompleteFirstHalf;
|
OnComplete = OnCompleteFirstHalf;
|
||||||
return;
|
Game.UnitInfluence.Update(mobile);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
from = BetweenCells( mobile.fromCell, mobile.toCell );
|
from = BetweenCells( mobile.fromCell, mobile.toCell );
|
||||||
@@ -246,15 +259,17 @@ namespace OpenRa.Game.Traits
|
|||||||
CalculateMoveFraction();
|
CalculateMoveFraction();
|
||||||
fromFacing = toFacing = mobile.facing;
|
fromFacing = toFacing = mobile.facing;
|
||||||
OnComplete = OnCompleteSecondHalf;
|
OnComplete = OnCompleteSecondHalf;
|
||||||
mobile.fromCell = mobile.toCell;
|
mobile.fromCell = mobile.toCell;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnCompleteSecondHalf( Actor self, Mobile mobile )
|
bool OnCompleteSecondHalf( Actor self, Mobile mobile )
|
||||||
{
|
{
|
||||||
moveFractionTotal = 0;
|
moveFractionTotal = 0;
|
||||||
self.CenterLocation = CenterOfCell( mobile.toCell );
|
self.CenterLocation = CenterOfCell( mobile.toCell );
|
||||||
OnComplete = null;
|
OnComplete = null;
|
||||||
mobile.fromCell = mobile.toCell;
|
mobile.fromCell = mobile.toCell;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Cancel( Actor self, Mobile mobile )
|
public void Cancel( Actor self, Mobile mobile )
|
||||||
|
|||||||
@@ -9,15 +9,17 @@ namespace OpenRa.Game
|
|||||||
class UiOverlay
|
class UiOverlay
|
||||||
{
|
{
|
||||||
SpriteRenderer spriteRenderer;
|
SpriteRenderer spriteRenderer;
|
||||||
Sprite buildOk;
|
Sprite buildOk, buildBlocked, unitDebug;
|
||||||
Sprite buildBlocked;
|
|
||||||
|
public static bool ShowUnitDebug = false;
|
||||||
|
|
||||||
public UiOverlay(SpriteRenderer spriteRenderer)
|
public UiOverlay(SpriteRenderer spriteRenderer)
|
||||||
{
|
{
|
||||||
this.spriteRenderer = spriteRenderer;
|
this.spriteRenderer = spriteRenderer;
|
||||||
|
|
||||||
buildOk = SynthesizeTile(0x80);
|
buildOk = SynthesizeTile(0x80);
|
||||||
buildBlocked = SynthesizeTile(0xe6);
|
buildBlocked = SynthesizeTile(0xe6);
|
||||||
|
unitDebug = SynthesizeTile(0x7c);
|
||||||
}
|
}
|
||||||
|
|
||||||
static Sprite SynthesizeTile(byte paletteIndex)
|
static Sprite SynthesizeTile(byte paletteIndex)
|
||||||
@@ -32,7 +34,13 @@ namespace OpenRa.Game
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void Draw()
|
public void Draw()
|
||||||
{
|
{
|
||||||
|
if (ShowUnitDebug)
|
||||||
|
for (var j = 0; j < 128; j++)
|
||||||
|
for (var i = 0; i < 128; i++)
|
||||||
|
if (Game.UnitInfluence.GetUnitAt(new int2(i, j)) != null)
|
||||||
|
spriteRenderer.DrawSprite(unitDebug, Game.CellSize * new float2(i, j), 0);
|
||||||
|
|
||||||
if (!hasOverlay) return;
|
if (!hasOverlay) return;
|
||||||
|
|
||||||
var bi = (UnitInfo.BuildingInfo)Rules.UnitInfo[name];
|
var bi = (UnitInfo.BuildingInfo)Rules.UnitInfo[name];
|
||||||
|
|||||||
@@ -9,7 +9,12 @@ namespace OpenRa.Game
|
|||||||
class UnitInfluenceMap
|
class UnitInfluenceMap
|
||||||
{
|
{
|
||||||
Actor[,] influence = new Actor[128, 128];
|
Actor[,] influence = new Actor[128, 128];
|
||||||
readonly int2 searchDistance = new int2(1, 1);
|
readonly int2 searchDistance = new int2(2,2);
|
||||||
|
|
||||||
|
public UnitInfluenceMap()
|
||||||
|
{
|
||||||
|
Game.world.ActorRemoved += a => Remove(a.traits.GetOrDefault<Mobile>());
|
||||||
|
}
|
||||||
|
|
||||||
public void Tick()
|
public void Tick()
|
||||||
{
|
{
|
||||||
@@ -30,6 +35,8 @@ namespace OpenRa.Game
|
|||||||
|
|
||||||
public void Remove(Mobile a)
|
public void Remove(Mobile a)
|
||||||
{
|
{
|
||||||
|
if (a == null) return;
|
||||||
|
|
||||||
var min = int2.Max(new int2(0, 0), a.self.Location - searchDistance);
|
var min = int2.Max(new int2(0, 0), a.self.Location - searchDistance);
|
||||||
var max = int2.Min(new int2(128, 128), a.self.Location + searchDistance);
|
var max = int2.Min(new int2(128, 128), a.self.Location + searchDistance);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user