git-svn-id: svn://svn.ijw.co.nz/svn/OpenRa@1309 993157c7-ee19-0410-b2c4-bb4e9862e678

This commit is contained in:
(no author)
2007-07-19 04:23:52 +00:00
parent 5f8d9557a4
commit df4e71e89e
3 changed files with 69 additions and 23 deletions

View File

@@ -70,6 +70,7 @@
<Compile Include="Sprite.cs" /> <Compile Include="Sprite.cs" />
<Compile Include="SpriteRenderer.cs" /> <Compile Include="SpriteRenderer.cs" />
<Compile Include="SpriteSheetBuilder.cs" /> <Compile Include="SpriteSheetBuilder.cs" />
<Compile Include="TerrainCosts.cs" />
<Compile Include="TerrainRenderer.cs" /> <Compile Include="TerrainRenderer.cs" />
<Compile Include="Tree.cs" /> <Compile Include="Tree.cs" />
<Compile Include="TreeCache.cs" /> <Compile Include="TreeCache.cs" />

View File

@@ -11,34 +11,19 @@ namespace OpenRa.Game
{ {
public static PathFinder Instance; public static PathFinder Instance;
bool[ , ] passable = new bool[ 128, 128 ]; double[ , ] passableCost = new double[ 128, 128 ];
Map map; Map map;
static bool IsPassable(int terrainType)
{
switch (terrainType)
{
case 0:
case 2:
case 6:
case 8:
case 9:
return true;
default:
return false;
}
}
public PathFinder(Map map, TileSet tileSet) public PathFinder(Map map, TileSet tileSet)
{ {
this.map = map; this.map = map;
//todo: speed hax for roads
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++ )
passable[x, y] = map.IsInMap(x, y) &&
IsPassable(tileSet.GetWalkability(map.MapTiles[x, y])); passableCost[ x, y ] = ( map.IsInMap( x, y ) )
? TerrainCosts.Cost( UnitMovementType.Wheel, tileSet.GetWalkability( map.MapTiles[ x, y ] ) )
: double.PositiveInfinity;
} }
public List<int2> FindUnitPath( World world, Unit unit, int2 destination ) public List<int2> FindUnitPath( World world, Unit unit, int2 destination )
@@ -83,13 +68,14 @@ namespace OpenRa.Game
++seenCount; ++seenCount;
continue; continue;
} }
if( !passable[ newHere.X, newHere.Y ] ) if( passableCost[ newHere.X, newHere.Y ] == double.PositiveInfinity )
{ {
++impassableCount; ++impassableCount;
continue; continue;
} }
double newCost = cellInfo[ here.X, here.Y ].MinCost + ( ( d.X * d.Y != 0 ) ? 1.414213563 : 1.0 ); double cellCost = ( ( d.X * d.Y != 0 ) ? 1.414213563 : 1.0 ) * passableCost[ newHere.X, newHere.Y ];
double newCost = cellInfo[ here.X, here.Y ].MinCost + cellCost;
if( newCost >= cellInfo[ newHere.X, newHere.Y ].MinCost ) if( newCost >= cellInfo[ newHere.X, newHere.Y ].MinCost )
continue; continue;

View File

@@ -0,0 +1,59 @@
using System;
using System.Collections.Generic;
using System.Text;
using OpenRa.FileFormats;
using System.IO;
namespace OpenRa.Game
{
enum UnitMovementType : byte
{
Foot = 0,
Track = 1,
Wheel = 2,
Float = 3,
}
enum TerrainMovementType : byte
{
Clear = 0,
Water = 1,
Road = 2,
Rock = 3,
//Tree = 4,
River = 5,
Rough = 6,
Wall = 7,
Beach = 8,
Ore = 9,
}
static class TerrainCosts
{
static double[][] costs = Util.MakeArray<double[]>( 4,
delegate { return Util.MakeArray<double>( 10,
delegate { return double.PositiveInfinity; } ); } );
static TerrainCosts()
{
IniFile file = new IniFile( File.OpenRead( "../../../rules.ini" ) );
for( int i = 0 ; i < 10 ; i++ )
{
if( i == 4 )
continue;
IniSection section = file.GetSection( ( (TerrainMovementType)i ).ToString() );
for( int j = 0 ; j < 4 ; j++ )
{
string val = section.GetValue( ( (UnitMovementType)j ).ToString(), "0%" );
costs[ j ][ i ] = 100.0 / double.Parse( val.Substring( 0, val.Length - 1 ) );
}
}
}
public static double Cost( UnitMovementType unitMovementType, int r )
{
return costs[ (byte)unitMovementType ][ r ];
}
}
}