prep in pathfinder for multi-source pathing

This commit is contained in:
Chris Forbes
2009-10-22 22:34:06 +13:00
parent 4382a10568
commit 1effd85d50
2 changed files with 16 additions and 13 deletions

View File

@@ -33,12 +33,13 @@ namespace OpenRa.Game
foreach( var traitName in unitInfo.Traits ) foreach( var traitName in unitInfo.Traits )
{ {
var type = typeof( Traits.Mobile ).Assembly.GetType( typeof( Traits.Mobile ).Namespace + "." + traitName, true, false ); var type = typeof( Traits.Mobile ).Assembly.GetType( typeof( Traits.Mobile ).Namespace + "." + traitName, true, false );
var ctor = type.GetConstructor( new Type[] { typeof( Actor ) } ); var ctor = type.GetConstructor( new[] { typeof( Actor ) } );
traits.Add( type, ctor.Invoke( new object[] { this } ) ); traits.Add( type, ctor.Invoke( new object[] { this } ) );
} }
} }
else else
throw new InvalidOperationException( "No Actor traits for " + unitInfo.Name + "; add Traits= to units.ini for appropriate unit" ); throw new InvalidOperationException( "No Actor traits for " + unitInfo.Name
+ "; add Traits= to units.ini for appropriate unit" );
} }
public Actor( TreeReference tree, TreeCache treeRenderer, int2 mapOffset ) public Actor( TreeReference tree, TreeCache treeRenderer, int2 mapOffset )
@@ -65,8 +66,7 @@ namespace OpenRa.Game
{ {
return traits.WithInterface<Traits.IOrder>() return traits.WithInterface<Traits.IOrder>()
.Select( x => x.Order( this, xy ) ) .Select( x => x.Order( this, xy ) )
.Where( x => x != null ) .FirstOrDefault( x => x != null );
.FirstOrDefault();
} }
public RectangleF Bounds public RectangleF Bounds
@@ -83,9 +83,9 @@ namespace OpenRa.Game
{ {
/* todo: auto-retaliate, etc */ /* todo: auto-retaliate, etc */
/* todo: death sequence for infantry based on inflictor */ /* todo: death sequence for infantry based on inflictor */
/* todo: start smoking if < conditionYellow and took damage, and not already smoking /* todo: start smoking if < conditionYellow and took damage, and not already smoking */
if (Health <= 0) return; /* overkill! */ if (Health <= 0) return; /* overkill! don't count extra hits as more kills! */
Health -= damage; Health -= damage;
if (Health <= 0) if (Health <= 0)

View File

@@ -26,23 +26,26 @@ namespace OpenRa.Game
public List<int2> FindUnitPath( int2 unitLocation, Func<int2,double> estimator ) public List<int2> FindUnitPath( int2 unitLocation, Func<int2,double> estimator )
{ {
int2 startLocation = unitLocation + map.Offset; var startLocation = unitLocation + map.Offset;
CellInfo[ , ] cellInfo = new CellInfo[ 128, 128 ]; var cellInfo = new CellInfo[ 128, 128 ];
for( int x = 0 ; x < 128 ; x++ ) for( int x = 0 ; x < 128 ; x++ )
for( int y = 0 ; y < 128 ; y++ ) for( int y = 0 ; y < 128 ; y++ )
cellInfo[ x, y ] = new CellInfo( double.PositiveInfinity, new int2( x, y ), false ); cellInfo[ x, y ] = new CellInfo( double.PositiveInfinity, new int2( x, y ), false );
return FindUnitPath( startLocation, estimator, map.Offset, cellInfo ); return FindUnitPath( new[] {startLocation}, estimator, map.Offset, cellInfo );
} }
List<int2> FindUnitPath(int2 startLocation, Func<int2, double> estimator, int2 offset, CellInfo[,] cellInfo) List<int2> FindUnitPath(IEnumerable<int2> startLocations, Func<int2, double> estimator, int2 offset, CellInfo[,] cellInfo)
{ {
PriorityQueue<PathDistance> queue = new PriorityQueue<PathDistance>(); var queue = new PriorityQueue<PathDistance>();
queue.Add( new PathDistance( estimator( startLocation - offset ), startLocation ) ); foreach (var sl in startLocations)
cellInfo[ startLocation.X, startLocation.Y ].MinCost = 0; {
queue.Add(new PathDistance(estimator(sl - offset), sl));
cellInfo[sl.X, sl.Y].MinCost = 0;
}
while( !queue.Empty ) while( !queue.Empty )
{ {