Files
OpenRA/OpenRa.Game/GameRules/Footprint.cs
Bob 9ba0a632e2 Some parts of some buildings are pathable.
- not handling WEAP/FIX yet; that's special-case logic.
2009-10-13 19:11:32 +13:00

76 lines
1.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using OpenRa.Game.Graphics;
namespace OpenRa.Game.GameRules
{
class Footprint
{
Dictionary<string, string[]> buildingFootprints;
public string[] GetFootprint(string name)
{
string[] val;
if (!buildingFootprints.TryGetValue(name, out val))
buildingFootprints.TryGetValue("*", out val);
return val;
}
public Footprint(Stream s)
{
var lines = Util.ReadAllLines(s).Where(a => !a.StartsWith("#"));
Func<string,string[]> words =
b => b.Split( new[] { ' ', '\t' },
StringSplitOptions.RemoveEmptyEntries );
var buildings = lines
.Select(a => a.Split(':'))
.SelectMany(a => words(a[1])
.Select( b => new { Name=b, Pat=words(a[0]) } ));
buildingFootprints = buildings
.ToDictionary(a => a.Name, a => a.Pat);
}
public static IEnumerable<int2> Tiles(string name, int2 position)
{
var footprint = Rules.Footprint.GetFootprint(name);
var j = 0;
foreach (var row in footprint)
{
var i = 0;
foreach (var c in row)
{
if (c != '_')
yield return position + new int2(i, j);
++i;
}
++j;
}
}
public static IEnumerable<int2> UnpathableTiles( string name, int2 position )
{
var footprint = Rules.Footprint.GetFootprint( name );
var j = 0;
foreach( var row in footprint )
{
var i = 0;
foreach( var c in row )
{
if( c == 'x' )
yield return position + new int2( i, j );
++i;
}
++j;
}
}
}
}